xref: /aosp_15_r20/external/webrtc/media/base/media_channel.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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