1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "media/base/media_channel.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include "media/base/rtp_utils.h"
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
16*d9f75844SAndroid Build Coastguard Worker
InvokeSetParametersCallback(SetParametersCallback & callback,RTCError error)17*d9f75844SAndroid Build Coastguard Worker webrtc::RTCError InvokeSetParametersCallback(SetParametersCallback& callback,
18*d9f75844SAndroid Build Coastguard Worker RTCError error) {
19*d9f75844SAndroid Build Coastguard Worker if (callback) {
20*d9f75844SAndroid Build Coastguard Worker std::move(callback)(error);
21*d9f75844SAndroid Build Coastguard Worker callback = nullptr;
22*d9f75844SAndroid Build Coastguard Worker }
23*d9f75844SAndroid Build Coastguard Worker return error;
24*d9f75844SAndroid Build Coastguard Worker }
25*d9f75844SAndroid Build Coastguard Worker
26*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard Worker namespace cricket {
29*d9f75844SAndroid Build Coastguard Worker using webrtc::FrameDecryptorInterface;
30*d9f75844SAndroid Build Coastguard Worker using webrtc::FrameEncryptorInterface;
31*d9f75844SAndroid Build Coastguard Worker using webrtc::FrameTransformerInterface;
32*d9f75844SAndroid Build Coastguard Worker using webrtc::PendingTaskSafetyFlag;
33*d9f75844SAndroid Build Coastguard Worker using webrtc::SafeTask;
34*d9f75844SAndroid Build Coastguard Worker using webrtc::TaskQueueBase;
35*d9f75844SAndroid Build Coastguard Worker using webrtc::VideoTrackInterface;
36*d9f75844SAndroid Build Coastguard Worker
VideoOptions()37*d9f75844SAndroid Build Coastguard Worker VideoOptions::VideoOptions()
38*d9f75844SAndroid Build Coastguard Worker : content_hint(VideoTrackInterface::ContentHint::kNone) {}
39*d9f75844SAndroid Build Coastguard Worker VideoOptions::~VideoOptions() = default;
40*d9f75844SAndroid Build Coastguard Worker
MediaChannel(TaskQueueBase * network_thread,bool enable_dscp)41*d9f75844SAndroid Build Coastguard Worker MediaChannel::MediaChannel(TaskQueueBase* network_thread, bool enable_dscp)
42*d9f75844SAndroid Build Coastguard Worker : enable_dscp_(enable_dscp),
43*d9f75844SAndroid Build Coastguard Worker network_safety_(PendingTaskSafetyFlag::CreateDetachedInactive()),
44*d9f75844SAndroid Build Coastguard Worker network_thread_(network_thread) {}
45*d9f75844SAndroid Build Coastguard Worker
~MediaChannel()46*d9f75844SAndroid Build Coastguard Worker MediaChannel::~MediaChannel() {
47*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(!network_interface_);
48*d9f75844SAndroid Build Coastguard Worker }
49*d9f75844SAndroid Build Coastguard Worker
SetInterface(NetworkInterface * iface)50*d9f75844SAndroid Build Coastguard Worker void MediaChannel::SetInterface(NetworkInterface* iface) {
51*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_thread_);
52*d9f75844SAndroid Build Coastguard Worker iface ? network_safety_->SetAlive() : network_safety_->SetNotAlive();
53*d9f75844SAndroid Build Coastguard Worker network_interface_ = iface;
54*d9f75844SAndroid Build Coastguard Worker UpdateDscp();
55*d9f75844SAndroid Build Coastguard Worker }
56*d9f75844SAndroid Build Coastguard Worker
GetRtpSendTimeExtnId() const57*d9f75844SAndroid Build Coastguard Worker int MediaChannel::GetRtpSendTimeExtnId() const {
58*d9f75844SAndroid Build Coastguard Worker return -1;
59*d9f75844SAndroid Build Coastguard Worker }
60*d9f75844SAndroid Build Coastguard Worker
SetFrameEncryptor(uint32_t ssrc,rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor)61*d9f75844SAndroid Build Coastguard Worker void MediaChannel::SetFrameEncryptor(
62*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc,
63*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
64*d9f75844SAndroid Build Coastguard Worker // Placeholder should be pure virtual once internal supports it.
65*d9f75844SAndroid Build Coastguard Worker }
66*d9f75844SAndroid Build Coastguard Worker
SetFrameDecryptor(uint32_t ssrc,rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor)67*d9f75844SAndroid Build Coastguard Worker void MediaChannel::SetFrameDecryptor(
68*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc,
69*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) {
70*d9f75844SAndroid Build Coastguard Worker // Placeholder should be pure virtual once internal supports it.
71*d9f75844SAndroid Build Coastguard Worker }
72*d9f75844SAndroid Build Coastguard Worker
SetVideoCodecSwitchingEnabled(bool enabled)73*d9f75844SAndroid Build Coastguard Worker void MediaChannel::SetVideoCodecSwitchingEnabled(bool enabled) {}
74*d9f75844SAndroid Build Coastguard Worker
SendPacket(rtc::CopyOnWriteBuffer * packet,const rtc::PacketOptions & options)75*d9f75844SAndroid Build Coastguard Worker bool MediaChannel::SendPacket(rtc::CopyOnWriteBuffer* packet,
76*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions& options) {
77*d9f75844SAndroid Build Coastguard Worker return DoSendPacket(packet, false, options);
78*d9f75844SAndroid Build Coastguard Worker }
79*d9f75844SAndroid Build Coastguard Worker
SendRtcp(rtc::CopyOnWriteBuffer * packet,const rtc::PacketOptions & options)80*d9f75844SAndroid Build Coastguard Worker bool MediaChannel::SendRtcp(rtc::CopyOnWriteBuffer* packet,
81*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions& options) {
82*d9f75844SAndroid Build Coastguard Worker return DoSendPacket(packet, true, options);
83*d9f75844SAndroid Build Coastguard Worker }
84*d9f75844SAndroid Build Coastguard Worker
SetOption(NetworkInterface::SocketType type,rtc::Socket::Option opt,int option)85*d9f75844SAndroid Build Coastguard Worker int MediaChannel::SetOption(NetworkInterface::SocketType type,
86*d9f75844SAndroid Build Coastguard Worker rtc::Socket::Option opt,
87*d9f75844SAndroid Build Coastguard Worker int option) {
88*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_thread_);
89*d9f75844SAndroid Build Coastguard Worker return SetOptionLocked(type, opt, option);
90*d9f75844SAndroid Build Coastguard Worker }
91*d9f75844SAndroid Build Coastguard Worker
92*d9f75844SAndroid Build Coastguard Worker // Corresponds to the SDP attribute extmap-allow-mixed, see RFC8285.
93*d9f75844SAndroid Build Coastguard Worker // Set to true if it's allowed to mix one- and two-byte RTP header extensions
94*d9f75844SAndroid Build Coastguard Worker // in the same stream. The setter and getter must only be called from
95*d9f75844SAndroid Build Coastguard Worker // worker_thread.
SetExtmapAllowMixed(bool extmap_allow_mixed)96*d9f75844SAndroid Build Coastguard Worker void MediaChannel::SetExtmapAllowMixed(bool extmap_allow_mixed) {
97*d9f75844SAndroid Build Coastguard Worker extmap_allow_mixed_ = extmap_allow_mixed;
98*d9f75844SAndroid Build Coastguard Worker }
99*d9f75844SAndroid Build Coastguard Worker
ExtmapAllowMixed() const100*d9f75844SAndroid Build Coastguard Worker bool MediaChannel::ExtmapAllowMixed() const {
101*d9f75844SAndroid Build Coastguard Worker return extmap_allow_mixed_;
102*d9f75844SAndroid Build Coastguard Worker }
103*d9f75844SAndroid Build Coastguard Worker
HasNetworkInterface() const104*d9f75844SAndroid Build Coastguard Worker bool MediaChannel::HasNetworkInterface() const {
105*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_thread_);
106*d9f75844SAndroid Build Coastguard Worker return network_interface_ != nullptr;
107*d9f75844SAndroid Build Coastguard Worker }
108*d9f75844SAndroid Build Coastguard Worker
SetEncoderToPacketizerFrameTransformer(uint32_t ssrc,rtc::scoped_refptr<FrameTransformerInterface> frame_transformer)109*d9f75844SAndroid Build Coastguard Worker void MediaChannel::SetEncoderToPacketizerFrameTransformer(
110*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc,
111*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {}
112*d9f75844SAndroid Build Coastguard Worker
SetDepacketizerToDecoderFrameTransformer(uint32_t ssrc,rtc::scoped_refptr<FrameTransformerInterface> frame_transformer)113*d9f75844SAndroid Build Coastguard Worker void MediaChannel::SetDepacketizerToDecoderFrameTransformer(
114*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc,
115*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {}
116*d9f75844SAndroid Build Coastguard Worker
SetOptionLocked(NetworkInterface::SocketType type,rtc::Socket::Option opt,int option)117*d9f75844SAndroid Build Coastguard Worker int MediaChannel::SetOptionLocked(NetworkInterface::SocketType type,
118*d9f75844SAndroid Build Coastguard Worker rtc::Socket::Option opt,
119*d9f75844SAndroid Build Coastguard Worker int option) {
120*d9f75844SAndroid Build Coastguard Worker if (!network_interface_)
121*d9f75844SAndroid Build Coastguard Worker return -1;
122*d9f75844SAndroid Build Coastguard Worker return network_interface_->SetOption(type, opt, option);
123*d9f75844SAndroid Build Coastguard Worker }
124*d9f75844SAndroid Build Coastguard Worker
DscpEnabled() const125*d9f75844SAndroid Build Coastguard Worker bool MediaChannel::DscpEnabled() const {
126*d9f75844SAndroid Build Coastguard Worker return enable_dscp_;
127*d9f75844SAndroid Build Coastguard Worker }
128*d9f75844SAndroid Build Coastguard Worker
129*d9f75844SAndroid Build Coastguard Worker // This is the DSCP value used for both RTP and RTCP channels if DSCP is
130*d9f75844SAndroid Build Coastguard Worker // enabled. It can be changed at any time via `SetPreferredDscp`.
PreferredDscp() const131*d9f75844SAndroid Build Coastguard Worker rtc::DiffServCodePoint MediaChannel::PreferredDscp() const {
132*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_thread_);
133*d9f75844SAndroid Build Coastguard Worker return preferred_dscp_;
134*d9f75844SAndroid Build Coastguard Worker }
135*d9f75844SAndroid Build Coastguard Worker
SetPreferredDscp(rtc::DiffServCodePoint new_dscp)136*d9f75844SAndroid Build Coastguard Worker void MediaChannel::SetPreferredDscp(rtc::DiffServCodePoint new_dscp) {
137*d9f75844SAndroid Build Coastguard Worker if (!network_thread_->IsCurrent()) {
138*d9f75844SAndroid Build Coastguard Worker // This is currently the common path as the derived channel classes
139*d9f75844SAndroid Build Coastguard Worker // get called on the worker thread. There are still some tests though
140*d9f75844SAndroid Build Coastguard Worker // that call directly on the network thread.
141*d9f75844SAndroid Build Coastguard Worker network_thread_->PostTask(SafeTask(
142*d9f75844SAndroid Build Coastguard Worker network_safety_, [this, new_dscp]() { SetPreferredDscp(new_dscp); }));
143*d9f75844SAndroid Build Coastguard Worker return;
144*d9f75844SAndroid Build Coastguard Worker }
145*d9f75844SAndroid Build Coastguard Worker
146*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_thread_);
147*d9f75844SAndroid Build Coastguard Worker if (new_dscp == preferred_dscp_)
148*d9f75844SAndroid Build Coastguard Worker return;
149*d9f75844SAndroid Build Coastguard Worker
150*d9f75844SAndroid Build Coastguard Worker preferred_dscp_ = new_dscp;
151*d9f75844SAndroid Build Coastguard Worker UpdateDscp();
152*d9f75844SAndroid Build Coastguard Worker }
153*d9f75844SAndroid Build Coastguard Worker
network_safety()154*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<PendingTaskSafetyFlag> MediaChannel::network_safety() {
155*d9f75844SAndroid Build Coastguard Worker return network_safety_;
156*d9f75844SAndroid Build Coastguard Worker }
157*d9f75844SAndroid Build Coastguard Worker
UpdateDscp()158*d9f75844SAndroid Build Coastguard Worker void MediaChannel::UpdateDscp() {
159*d9f75844SAndroid Build Coastguard Worker rtc::DiffServCodePoint value =
160*d9f75844SAndroid Build Coastguard Worker enable_dscp_ ? preferred_dscp_ : rtc::DSCP_DEFAULT;
161*d9f75844SAndroid Build Coastguard Worker int ret =
162*d9f75844SAndroid Build Coastguard Worker SetOptionLocked(NetworkInterface::ST_RTP, rtc::Socket::OPT_DSCP, value);
163*d9f75844SAndroid Build Coastguard Worker if (ret == 0)
164*d9f75844SAndroid Build Coastguard Worker SetOptionLocked(NetworkInterface::ST_RTCP, rtc::Socket::OPT_DSCP, value);
165*d9f75844SAndroid Build Coastguard Worker }
166*d9f75844SAndroid Build Coastguard Worker
DoSendPacket(rtc::CopyOnWriteBuffer * packet,bool rtcp,const rtc::PacketOptions & options)167*d9f75844SAndroid Build Coastguard Worker bool MediaChannel::DoSendPacket(rtc::CopyOnWriteBuffer* packet,
168*d9f75844SAndroid Build Coastguard Worker bool rtcp,
169*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions& options) {
170*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(network_thread_);
171*d9f75844SAndroid Build Coastguard Worker if (!network_interface_)
172*d9f75844SAndroid Build Coastguard Worker return false;
173*d9f75844SAndroid Build Coastguard Worker
174*d9f75844SAndroid Build Coastguard Worker return (!rtcp) ? network_interface_->SendPacket(packet, options)
175*d9f75844SAndroid Build Coastguard Worker : network_interface_->SendRtcp(packet, options);
176*d9f75844SAndroid Build Coastguard Worker }
177*d9f75844SAndroid Build Coastguard Worker
SendRtp(const uint8_t * data,size_t len,const webrtc::PacketOptions & options)178*d9f75844SAndroid Build Coastguard Worker void MediaChannel::SendRtp(const uint8_t* data,
179*d9f75844SAndroid Build Coastguard Worker size_t len,
180*d9f75844SAndroid Build Coastguard Worker const webrtc::PacketOptions& options) {
181*d9f75844SAndroid Build Coastguard Worker auto send =
182*d9f75844SAndroid Build Coastguard Worker [this, packet_id = options.packet_id,
183*d9f75844SAndroid Build Coastguard Worker included_in_feedback = options.included_in_feedback,
184*d9f75844SAndroid Build Coastguard Worker included_in_allocation = options.included_in_allocation,
185*d9f75844SAndroid Build Coastguard Worker packet = rtc::CopyOnWriteBuffer(data, len, kMaxRtpPacketLen)]() mutable {
186*d9f75844SAndroid Build Coastguard Worker rtc::PacketOptions rtc_options;
187*d9f75844SAndroid Build Coastguard Worker rtc_options.packet_id = packet_id;
188*d9f75844SAndroid Build Coastguard Worker if (DscpEnabled()) {
189*d9f75844SAndroid Build Coastguard Worker rtc_options.dscp = PreferredDscp();
190*d9f75844SAndroid Build Coastguard Worker }
191*d9f75844SAndroid Build Coastguard Worker rtc_options.info_signaled_after_sent.included_in_feedback =
192*d9f75844SAndroid Build Coastguard Worker included_in_feedback;
193*d9f75844SAndroid Build Coastguard Worker rtc_options.info_signaled_after_sent.included_in_allocation =
194*d9f75844SAndroid Build Coastguard Worker included_in_allocation;
195*d9f75844SAndroid Build Coastguard Worker SendPacket(&packet, rtc_options);
196*d9f75844SAndroid Build Coastguard Worker };
197*d9f75844SAndroid Build Coastguard Worker
198*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/11993): ModuleRtpRtcpImpl2 and related classes (e.g.
199*d9f75844SAndroid Build Coastguard Worker // RTCPSender) aren't aware of the network thread and may trigger calls to
200*d9f75844SAndroid Build Coastguard Worker // this function from different threads. Update those classes to keep
201*d9f75844SAndroid Build Coastguard Worker // network traffic on the network thread.
202*d9f75844SAndroid Build Coastguard Worker if (network_thread_->IsCurrent()) {
203*d9f75844SAndroid Build Coastguard Worker send();
204*d9f75844SAndroid Build Coastguard Worker } else {
205*d9f75844SAndroid Build Coastguard Worker network_thread_->PostTask(SafeTask(network_safety_, std::move(send)));
206*d9f75844SAndroid Build Coastguard Worker }
207*d9f75844SAndroid Build Coastguard Worker }
208*d9f75844SAndroid Build Coastguard Worker
SendRtcp(const uint8_t * data,size_t len)209*d9f75844SAndroid Build Coastguard Worker void MediaChannel::SendRtcp(const uint8_t* data, size_t len) {
210*d9f75844SAndroid Build Coastguard Worker auto send = [this, packet = rtc::CopyOnWriteBuffer(
211*d9f75844SAndroid Build Coastguard Worker data, len, kMaxRtpPacketLen)]() mutable {
212*d9f75844SAndroid Build Coastguard Worker rtc::PacketOptions rtc_options;
213*d9f75844SAndroid Build Coastguard Worker if (DscpEnabled()) {
214*d9f75844SAndroid Build Coastguard Worker rtc_options.dscp = PreferredDscp();
215*d9f75844SAndroid Build Coastguard Worker }
216*d9f75844SAndroid Build Coastguard Worker SendRtcp(&packet, rtc_options);
217*d9f75844SAndroid Build Coastguard Worker };
218*d9f75844SAndroid Build Coastguard Worker
219*d9f75844SAndroid Build Coastguard Worker if (network_thread_->IsCurrent()) {
220*d9f75844SAndroid Build Coastguard Worker send();
221*d9f75844SAndroid Build Coastguard Worker } else {
222*d9f75844SAndroid Build Coastguard Worker network_thread_->PostTask(SafeTask(network_safety_, std::move(send)));
223*d9f75844SAndroid Build Coastguard Worker }
224*d9f75844SAndroid Build Coastguard Worker }
225*d9f75844SAndroid Build Coastguard Worker
226*d9f75844SAndroid Build Coastguard Worker MediaSenderInfo::MediaSenderInfo() = default;
227*d9f75844SAndroid Build Coastguard Worker MediaSenderInfo::~MediaSenderInfo() = default;
228*d9f75844SAndroid Build Coastguard Worker
229*d9f75844SAndroid Build Coastguard Worker MediaReceiverInfo::MediaReceiverInfo() = default;
230*d9f75844SAndroid Build Coastguard Worker MediaReceiverInfo::~MediaReceiverInfo() = default;
231*d9f75844SAndroid Build Coastguard Worker
232*d9f75844SAndroid Build Coastguard Worker VoiceSenderInfo::VoiceSenderInfo() = default;
233*d9f75844SAndroid Build Coastguard Worker VoiceSenderInfo::~VoiceSenderInfo() = default;
234*d9f75844SAndroid Build Coastguard Worker
235*d9f75844SAndroid Build Coastguard Worker VoiceReceiverInfo::VoiceReceiverInfo() = default;
236*d9f75844SAndroid Build Coastguard Worker VoiceReceiverInfo::~VoiceReceiverInfo() = default;
237*d9f75844SAndroid Build Coastguard Worker
238*d9f75844SAndroid Build Coastguard Worker VideoSenderInfo::VideoSenderInfo() = default;
239*d9f75844SAndroid Build Coastguard Worker VideoSenderInfo::~VideoSenderInfo() = default;
240*d9f75844SAndroid Build Coastguard Worker
241*d9f75844SAndroid Build Coastguard Worker VideoReceiverInfo::VideoReceiverInfo() = default;
242*d9f75844SAndroid Build Coastguard Worker VideoReceiverInfo::~VideoReceiverInfo() = default;
243*d9f75844SAndroid Build Coastguard Worker
244*d9f75844SAndroid Build Coastguard Worker VoiceMediaInfo::VoiceMediaInfo() = default;
245*d9f75844SAndroid Build Coastguard Worker VoiceMediaInfo::~VoiceMediaInfo() = default;
246*d9f75844SAndroid Build Coastguard Worker
247*d9f75844SAndroid Build Coastguard Worker VideoMediaInfo::VideoMediaInfo() = default;
248*d9f75844SAndroid Build Coastguard Worker VideoMediaInfo::~VideoMediaInfo() = default;
249*d9f75844SAndroid Build Coastguard Worker
250*d9f75844SAndroid Build Coastguard Worker AudioSendParameters::AudioSendParameters() = default;
251*d9f75844SAndroid Build Coastguard Worker AudioSendParameters::~AudioSendParameters() = default;
252*d9f75844SAndroid Build Coastguard Worker
ToStringMap() const253*d9f75844SAndroid Build Coastguard Worker std::map<std::string, std::string> AudioSendParameters::ToStringMap() const {
254*d9f75844SAndroid Build Coastguard Worker auto params = RtpSendParameters<AudioCodec>::ToStringMap();
255*d9f75844SAndroid Build Coastguard Worker params["options"] = options.ToString();
256*d9f75844SAndroid Build Coastguard Worker return params;
257*d9f75844SAndroid Build Coastguard Worker }
258*d9f75844SAndroid Build Coastguard Worker
media_type() const259*d9f75844SAndroid Build Coastguard Worker cricket::MediaType VoiceMediaChannel::media_type() const {
260*d9f75844SAndroid Build Coastguard Worker return cricket::MediaType::MEDIA_TYPE_AUDIO;
261*d9f75844SAndroid Build Coastguard Worker }
262*d9f75844SAndroid Build Coastguard Worker
263*d9f75844SAndroid Build Coastguard Worker VideoSendParameters::VideoSendParameters() = default;
264*d9f75844SAndroid Build Coastguard Worker VideoSendParameters::~VideoSendParameters() = default;
265*d9f75844SAndroid Build Coastguard Worker
ToStringMap() const266*d9f75844SAndroid Build Coastguard Worker std::map<std::string, std::string> VideoSendParameters::ToStringMap() const {
267*d9f75844SAndroid Build Coastguard Worker auto params = RtpSendParameters<VideoCodec>::ToStringMap();
268*d9f75844SAndroid Build Coastguard Worker params["conference_mode"] = (conference_mode ? "yes" : "no");
269*d9f75844SAndroid Build Coastguard Worker return params;
270*d9f75844SAndroid Build Coastguard Worker }
271*d9f75844SAndroid Build Coastguard Worker
media_type() const272*d9f75844SAndroid Build Coastguard Worker cricket::MediaType VideoMediaChannel::media_type() const {
273*d9f75844SAndroid Build Coastguard Worker return cricket::MediaType::MEDIA_TYPE_VIDEO;
274*d9f75844SAndroid Build Coastguard Worker }
275*d9f75844SAndroid Build Coastguard Worker
276*d9f75844SAndroid Build Coastguard Worker } // namespace cricket
277