• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * libjingle
3  * Copyright 2004 Google Inc.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  *  1. Redistributions of source code must retain the above copyright notice,
9  *     this list of conditions and the following disclaimer.
10  *  2. Redistributions in binary form must reproduce the above copyright notice,
11  *     this list of conditions and the following disclaimer in the documentation
12  *     and/or other materials provided with the distribution.
13  *  3. The name of the author may not be used to endorse or promote products
14  *     derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #include "talk/session/media/channel.h"
29 
30 #include "talk/base/bind.h"
31 #include "talk/base/buffer.h"
32 #include "talk/base/byteorder.h"
33 #include "talk/base/common.h"
34 #include "talk/base/dscp.h"
35 #include "talk/base/logging.h"
36 #include "talk/media/base/constants.h"
37 #include "talk/media/base/rtputils.h"
38 #include "talk/p2p/base/transportchannel.h"
39 #include "talk/session/media/channelmanager.h"
40 #include "talk/session/media/mediamessages.h"
41 #include "talk/session/media/typingmonitor.h"
42 
43 
44 namespace cricket {
45 
46 using talk_base::Bind;
47 
48 enum {
49   MSG_EARLYMEDIATIMEOUT = 1,
50   MSG_SCREENCASTWINDOWEVENT,
51   MSG_RTPPACKET,
52   MSG_RTCPPACKET,
53   MSG_CHANNEL_ERROR,
54   MSG_READYTOSENDDATA,
55   MSG_DATARECEIVED,
56   MSG_FIRSTPACKETRECEIVED,
57   MSG_STREAMCLOSEDREMOTELY,
58 };
59 
60 // Value specified in RFC 5764.
61 static const char kDtlsSrtpExporterLabel[] = "EXTRACTOR-dtls_srtp";
62 
63 static const int kAgcMinus10db = -10;
64 
SetSessionError(BaseSession * session,BaseSession::Error error,const std::string & error_desc)65 static void SetSessionError(BaseSession* session, BaseSession::Error error,
66                             const std::string& error_desc) {
67   session->SetError(error, error_desc);
68 }
69 
SafeSetError(const std::string & message,std::string * error_desc)70 static void SafeSetError(const std::string& message, std::string* error_desc) {
71   if (error_desc) {
72     *error_desc = message;
73   }
74 }
75 
76 // TODO(hellner): use the device manager for creation of screen capturers when
77 // the cl enabling it has landed.
78 class NullScreenCapturerFactory : public VideoChannel::ScreenCapturerFactory {
79  public:
CreateScreenCapturer(const ScreencastId & window)80   VideoCapturer* CreateScreenCapturer(const ScreencastId& window) {
81     return NULL;
82   }
83 };
84 
85 
CreateScreenCapturerFactory()86 VideoChannel::ScreenCapturerFactory* CreateScreenCapturerFactory() {
87   return new NullScreenCapturerFactory();
88 }
89 
90 struct PacketMessageData : public talk_base::MessageData {
91   talk_base::Buffer packet;
92   talk_base::DiffServCodePoint dscp;
93 };
94 
95 struct ScreencastEventMessageData : public talk_base::MessageData {
ScreencastEventMessageDatacricket::ScreencastEventMessageData96   ScreencastEventMessageData(uint32 s, talk_base::WindowEvent we)
97       : ssrc(s),
98         event(we) {
99   }
100   uint32 ssrc;
101   talk_base::WindowEvent event;
102 };
103 
104 struct VoiceChannelErrorMessageData : public talk_base::MessageData {
VoiceChannelErrorMessageDatacricket::VoiceChannelErrorMessageData105   VoiceChannelErrorMessageData(uint32 in_ssrc,
106                                VoiceMediaChannel::Error in_error)
107       : ssrc(in_ssrc),
108         error(in_error) {
109   }
110   uint32 ssrc;
111   VoiceMediaChannel::Error error;
112 };
113 
114 struct VideoChannelErrorMessageData : public talk_base::MessageData {
VideoChannelErrorMessageDatacricket::VideoChannelErrorMessageData115   VideoChannelErrorMessageData(uint32 in_ssrc,
116                                VideoMediaChannel::Error in_error)
117       : ssrc(in_ssrc),
118         error(in_error) {
119   }
120   uint32 ssrc;
121   VideoMediaChannel::Error error;
122 };
123 
124 struct DataChannelErrorMessageData : public talk_base::MessageData {
DataChannelErrorMessageDatacricket::DataChannelErrorMessageData125   DataChannelErrorMessageData(uint32 in_ssrc,
126                               DataMediaChannel::Error in_error)
127       : ssrc(in_ssrc),
128         error(in_error) {}
129   uint32 ssrc;
130   DataMediaChannel::Error error;
131 };
132 
133 
134 struct VideoChannel::ScreencastDetailsData {
ScreencastDetailsDatacricket::VideoChannel::ScreencastDetailsData135   explicit ScreencastDetailsData(uint32 s)
136       : ssrc(s), fps(0), screencast_max_pixels(0) {
137   }
138   uint32 ssrc;
139   int fps;
140   int screencast_max_pixels;
141 };
142 
PacketType(bool rtcp)143 static const char* PacketType(bool rtcp) {
144   return (!rtcp) ? "RTP" : "RTCP";
145 }
146 
ValidPacket(bool rtcp,const talk_base::Buffer * packet)147 static bool ValidPacket(bool rtcp, const talk_base::Buffer* packet) {
148   // Check the packet size. We could check the header too if needed.
149   return (packet &&
150       packet->length() >= (!rtcp ? kMinRtpPacketLen : kMinRtcpPacketLen) &&
151       packet->length() <= kMaxRtpPacketLen);
152 }
153 
IsReceiveContentDirection(MediaContentDirection direction)154 static bool IsReceiveContentDirection(MediaContentDirection direction) {
155   return direction == MD_SENDRECV || direction == MD_RECVONLY;
156 }
157 
IsSendContentDirection(MediaContentDirection direction)158 static bool IsSendContentDirection(MediaContentDirection direction) {
159   return direction == MD_SENDRECV || direction == MD_SENDONLY;
160 }
161 
GetContentDescription(const ContentInfo * cinfo)162 static const MediaContentDescription* GetContentDescription(
163     const ContentInfo* cinfo) {
164   if (cinfo == NULL)
165     return NULL;
166   return static_cast<const MediaContentDescription*>(cinfo->description);
167 }
168 
BaseChannel(talk_base::Thread * thread,MediaEngineInterface * media_engine,MediaChannel * media_channel,BaseSession * session,const std::string & content_name,bool rtcp)169 BaseChannel::BaseChannel(talk_base::Thread* thread,
170                          MediaEngineInterface* media_engine,
171                          MediaChannel* media_channel, BaseSession* session,
172                          const std::string& content_name, bool rtcp)
173     : worker_thread_(thread),
174       media_engine_(media_engine),
175       session_(session),
176       media_channel_(media_channel),
177       content_name_(content_name),
178       rtcp_(rtcp),
179       transport_channel_(NULL),
180       rtcp_transport_channel_(NULL),
181       enabled_(false),
182       writable_(false),
183       rtp_ready_to_send_(false),
184       rtcp_ready_to_send_(false),
185       was_ever_writable_(false),
186       local_content_direction_(MD_INACTIVE),
187       remote_content_direction_(MD_INACTIVE),
188       has_received_packet_(false),
189       dtls_keyed_(false),
190       secure_required_(false),
191       rtp_abs_sendtime_extn_id_(-1) {
192   ASSERT(worker_thread_ == talk_base::Thread::Current());
193   LOG(LS_INFO) << "Created channel for " << content_name;
194 }
195 
~BaseChannel()196 BaseChannel::~BaseChannel() {
197   ASSERT(worker_thread_ == talk_base::Thread::Current());
198   Deinit();
199   StopConnectionMonitor();
200   FlushRtcpMessages();  // Send any outstanding RTCP packets.
201   worker_thread_->Clear(this);  // eats any outstanding messages or packets
202   // We must destroy the media channel before the transport channel, otherwise
203   // the media channel may try to send on the dead transport channel. NULLing
204   // is not an effective strategy since the sends will come on another thread.
205   delete media_channel_;
206   set_rtcp_transport_channel(NULL);
207   if (transport_channel_ != NULL)
208     session_->DestroyChannel(content_name_, transport_channel_->component());
209   LOG(LS_INFO) << "Destroyed channel";
210 }
211 
Init(TransportChannel * transport_channel,TransportChannel * rtcp_transport_channel)212 bool BaseChannel::Init(TransportChannel* transport_channel,
213                        TransportChannel* rtcp_transport_channel) {
214   if (transport_channel == NULL) {
215     return false;
216   }
217   if (rtcp() && rtcp_transport_channel == NULL) {
218     return false;
219   }
220   transport_channel_ = transport_channel;
221 
222   if (!SetDtlsSrtpCiphers(transport_channel_, false)) {
223     return false;
224   }
225 
226   transport_channel_->SignalWritableState.connect(
227       this, &BaseChannel::OnWritableState);
228   transport_channel_->SignalReadPacket.connect(
229       this, &BaseChannel::OnChannelRead);
230   transport_channel_->SignalReadyToSend.connect(
231       this, &BaseChannel::OnReadyToSend);
232 
233   session_->SignalNewLocalDescription.connect(
234       this, &BaseChannel::OnNewLocalDescription);
235   session_->SignalNewRemoteDescription.connect(
236       this, &BaseChannel::OnNewRemoteDescription);
237 
238   set_rtcp_transport_channel(rtcp_transport_channel);
239   // Both RTP and RTCP channels are set, we can call SetInterface on
240   // media channel and it can set network options.
241   media_channel_->SetInterface(this);
242   return true;
243 }
244 
Deinit()245 void BaseChannel::Deinit() {
246   media_channel_->SetInterface(NULL);
247 }
248 
Enable(bool enable)249 bool BaseChannel::Enable(bool enable) {
250   worker_thread_->Invoke<void>(Bind(
251       enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w,
252       this));
253   return true;
254 }
255 
MuteStream(uint32 ssrc,bool mute)256 bool BaseChannel::MuteStream(uint32 ssrc, bool mute) {
257   return InvokeOnWorker(Bind(&BaseChannel::MuteStream_w, this, ssrc, mute));
258 }
259 
IsStreamMuted(uint32 ssrc)260 bool BaseChannel::IsStreamMuted(uint32 ssrc) {
261   return InvokeOnWorker(Bind(&BaseChannel::IsStreamMuted_w, this, ssrc));
262 }
263 
AddRecvStream(const StreamParams & sp)264 bool BaseChannel::AddRecvStream(const StreamParams& sp) {
265   return InvokeOnWorker(Bind(&BaseChannel::AddRecvStream_w, this, sp));
266 }
267 
RemoveRecvStream(uint32 ssrc)268 bool BaseChannel::RemoveRecvStream(uint32 ssrc) {
269   return InvokeOnWorker(Bind(&BaseChannel::RemoveRecvStream_w, this, ssrc));
270 }
271 
AddSendStream(const StreamParams & sp)272 bool BaseChannel::AddSendStream(const StreamParams& sp) {
273   return InvokeOnWorker(
274       Bind(&MediaChannel::AddSendStream, media_channel(), sp));
275 }
276 
RemoveSendStream(uint32 ssrc)277 bool BaseChannel::RemoveSendStream(uint32 ssrc) {
278   return InvokeOnWorker(
279       Bind(&MediaChannel::RemoveSendStream, media_channel(), ssrc));
280 }
281 
SetLocalContent(const MediaContentDescription * content,ContentAction action,std::string * error_desc)282 bool BaseChannel::SetLocalContent(const MediaContentDescription* content,
283                                   ContentAction action,
284                                   std::string* error_desc) {
285   return InvokeOnWorker(Bind(&BaseChannel::SetLocalContent_w,
286                              this, content, action, error_desc));
287 }
288 
SetRemoteContent(const MediaContentDescription * content,ContentAction action,std::string * error_desc)289 bool BaseChannel::SetRemoteContent(const MediaContentDescription* content,
290                                    ContentAction action,
291                                    std::string* error_desc) {
292   return InvokeOnWorker(Bind(&BaseChannel::SetRemoteContent_w,
293                              this, content, action, error_desc));
294 }
295 
StartConnectionMonitor(int cms)296 void BaseChannel::StartConnectionMonitor(int cms) {
297   socket_monitor_.reset(new SocketMonitor(transport_channel_,
298                                           worker_thread(),
299                                           talk_base::Thread::Current()));
300   socket_monitor_->SignalUpdate.connect(
301       this, &BaseChannel::OnConnectionMonitorUpdate);
302   socket_monitor_->Start(cms);
303 }
304 
StopConnectionMonitor()305 void BaseChannel::StopConnectionMonitor() {
306   if (socket_monitor_) {
307     socket_monitor_->Stop();
308     socket_monitor_.reset();
309   }
310 }
311 
set_rtcp_transport_channel(TransportChannel * channel)312 void BaseChannel::set_rtcp_transport_channel(TransportChannel* channel) {
313   if (rtcp_transport_channel_ != channel) {
314     if (rtcp_transport_channel_) {
315       session_->DestroyChannel(
316           content_name_, rtcp_transport_channel_->component());
317     }
318     rtcp_transport_channel_ = channel;
319     if (rtcp_transport_channel_) {
320       // TODO(juberti): Propagate this error code
321       VERIFY(SetDtlsSrtpCiphers(rtcp_transport_channel_, true));
322       rtcp_transport_channel_->SignalWritableState.connect(
323           this, &BaseChannel::OnWritableState);
324       rtcp_transport_channel_->SignalReadPacket.connect(
325           this, &BaseChannel::OnChannelRead);
326       rtcp_transport_channel_->SignalReadyToSend.connect(
327           this, &BaseChannel::OnReadyToSend);
328     }
329   }
330 }
331 
IsReadyToReceive() const332 bool BaseChannel::IsReadyToReceive() const {
333   // Receive data if we are enabled and have local content,
334   return enabled() && IsReceiveContentDirection(local_content_direction_);
335 }
336 
IsReadyToSend() const337 bool BaseChannel::IsReadyToSend() const {
338   // Send outgoing data if we are enabled, have local and remote content,
339   // and we have had some form of connectivity.
340   return enabled() &&
341          IsReceiveContentDirection(remote_content_direction_) &&
342          IsSendContentDirection(local_content_direction_) &&
343          was_ever_writable();
344 }
345 
SendPacket(talk_base::Buffer * packet,talk_base::DiffServCodePoint dscp)346 bool BaseChannel::SendPacket(talk_base::Buffer* packet,
347                              talk_base::DiffServCodePoint dscp) {
348   return SendPacket(false, packet, dscp);
349 }
350 
SendRtcp(talk_base::Buffer * packet,talk_base::DiffServCodePoint dscp)351 bool BaseChannel::SendRtcp(talk_base::Buffer* packet,
352                            talk_base::DiffServCodePoint dscp) {
353   return SendPacket(true, packet, dscp);
354 }
355 
SetOption(SocketType type,talk_base::Socket::Option opt,int value)356 int BaseChannel::SetOption(SocketType type, talk_base::Socket::Option opt,
357                            int value) {
358   TransportChannel* channel = NULL;
359   switch (type) {
360     case ST_RTP:
361       channel = transport_channel_;
362       break;
363     case ST_RTCP:
364       channel = rtcp_transport_channel_;
365       break;
366   }
367   return channel ? channel->SetOption(opt, value) : -1;
368 }
369 
OnWritableState(TransportChannel * channel)370 void BaseChannel::OnWritableState(TransportChannel* channel) {
371   ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_);
372   if (transport_channel_->writable()
373       && (!rtcp_transport_channel_ || rtcp_transport_channel_->writable())) {
374     ChannelWritable_w();
375   } else {
376     ChannelNotWritable_w();
377   }
378 }
379 
OnChannelRead(TransportChannel * channel,const char * data,size_t len,const talk_base::PacketTime & packet_time,int flags)380 void BaseChannel::OnChannelRead(TransportChannel* channel,
381                                 const char* data, size_t len,
382                                 const talk_base::PacketTime& packet_time,
383                                 int flags) {
384   // OnChannelRead gets called from P2PSocket; now pass data to MediaEngine
385   ASSERT(worker_thread_ == talk_base::Thread::Current());
386 
387   // When using RTCP multiplexing we might get RTCP packets on the RTP
388   // transport. We feed RTP traffic into the demuxer to determine if it is RTCP.
389   bool rtcp = PacketIsRtcp(channel, data, len);
390   talk_base::Buffer packet(data, len);
391   HandlePacket(rtcp, &packet, packet_time);
392 }
393 
OnReadyToSend(TransportChannel * channel)394 void BaseChannel::OnReadyToSend(TransportChannel* channel) {
395   SetReadyToSend(channel, true);
396 }
397 
SetReadyToSend(TransportChannel * channel,bool ready)398 void BaseChannel::SetReadyToSend(TransportChannel* channel, bool ready) {
399   ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_);
400   if (channel == transport_channel_) {
401     rtp_ready_to_send_ = ready;
402   }
403   if (channel == rtcp_transport_channel_) {
404     rtcp_ready_to_send_ = ready;
405   }
406 
407   if (!ready) {
408     // Notify the MediaChannel when either rtp or rtcp channel can't send.
409     media_channel_->OnReadyToSend(false);
410   } else if (rtp_ready_to_send_ &&
411              // In the case of rtcp mux |rtcp_transport_channel_| will be null.
412              (rtcp_ready_to_send_ || !rtcp_transport_channel_)) {
413     // Notify the MediaChannel when both rtp and rtcp channel can send.
414     media_channel_->OnReadyToSend(true);
415   }
416 }
417 
PacketIsRtcp(const TransportChannel * channel,const char * data,size_t len)418 bool BaseChannel::PacketIsRtcp(const TransportChannel* channel,
419                                const char* data, size_t len) {
420   return (channel == rtcp_transport_channel_ ||
421           rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len)));
422 }
423 
SendPacket(bool rtcp,talk_base::Buffer * packet,talk_base::DiffServCodePoint dscp)424 bool BaseChannel::SendPacket(bool rtcp, talk_base::Buffer* packet,
425                              talk_base::DiffServCodePoint dscp) {
426   // SendPacket gets called from MediaEngine, typically on an encoder thread.
427   // If the thread is not our worker thread, we will post to our worker
428   // so that the real work happens on our worker. This avoids us having to
429   // synchronize access to all the pieces of the send path, including
430   // SRTP and the inner workings of the transport channels.
431   // The only downside is that we can't return a proper failure code if
432   // needed. Since UDP is unreliable anyway, this should be a non-issue.
433   if (talk_base::Thread::Current() != worker_thread_) {
434     // Avoid a copy by transferring the ownership of the packet data.
435     int message_id = (!rtcp) ? MSG_RTPPACKET : MSG_RTCPPACKET;
436     PacketMessageData* data = new PacketMessageData;
437     packet->TransferTo(&data->packet);
438     data->dscp = dscp;
439     worker_thread_->Post(this, message_id, data);
440     return true;
441   }
442 
443   // Now that we are on the correct thread, ensure we have a place to send this
444   // packet before doing anything. (We might get RTCP packets that we don't
445   // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP
446   // transport.
447   TransportChannel* channel = (!rtcp || rtcp_mux_filter_.IsActive()) ?
448       transport_channel_ : rtcp_transport_channel_;
449   if (!channel || !channel->writable()) {
450     return false;
451   }
452 
453   // Protect ourselves against crazy data.
454   if (!ValidPacket(rtcp, packet)) {
455     LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " "
456                   << PacketType(rtcp) << " packet: wrong size="
457                   << packet->length();
458     return false;
459   }
460 
461   // Signal to the media sink before protecting the packet.
462   {
463     talk_base::CritScope cs(&signal_send_packet_cs_);
464     SignalSendPacketPreCrypto(packet->data(), packet->length(), rtcp);
465   }
466 
467   talk_base::PacketOptions options(dscp);
468   // Protect if needed.
469   if (srtp_filter_.IsActive()) {
470     bool res;
471     char* data = packet->data();
472     int len = static_cast<int>(packet->length());
473     if (!rtcp) {
474     // If ENABLE_EXTERNAL_AUTH flag is on then packet authentication is not done
475     // inside libsrtp for a RTP packet. A external HMAC module will be writing
476     // a fake HMAC value. This is ONLY done for a RTP packet.
477     // Socket layer will update rtp sendtime extension header if present in
478     // packet with current time before updating the HMAC.
479 #if !defined(ENABLE_EXTERNAL_AUTH)
480       res = srtp_filter_.ProtectRtp(
481           data, len, static_cast<int>(packet->capacity()), &len);
482 #else
483       options.packet_time_params.rtp_sendtime_extension_id =
484           rtp_abs_sendtime_extn_id_;
485       res = srtp_filter_.ProtectRtp(
486           data, len, static_cast<int>(packet->capacity()), &len,
487           &options.packet_time_params.srtp_packet_index);
488       // If protection succeeds, let's get auth params from srtp.
489       if (res) {
490         uint8* auth_key = NULL;
491         int key_len;
492         res = srtp_filter_.GetRtpAuthParams(
493             &auth_key, &key_len, &options.packet_time_params.srtp_auth_tag_len);
494         if (res) {
495           options.packet_time_params.srtp_auth_key.resize(key_len);
496           options.packet_time_params.srtp_auth_key.assign(auth_key,
497                                                           auth_key + key_len);
498         }
499       }
500 #endif
501       if (!res) {
502         int seq_num = -1;
503         uint32 ssrc = 0;
504         GetRtpSeqNum(data, len, &seq_num);
505         GetRtpSsrc(data, len, &ssrc);
506         LOG(LS_ERROR) << "Failed to protect " << content_name_
507                       << " RTP packet: size=" << len
508                       << ", seqnum=" << seq_num << ", SSRC=" << ssrc;
509         return false;
510       }
511     } else {
512       res = srtp_filter_.ProtectRtcp(data, len,
513                                      static_cast<int>(packet->capacity()),
514                                      &len);
515       if (!res) {
516         int type = -1;
517         GetRtcpType(data, len, &type);
518         LOG(LS_ERROR) << "Failed to protect " << content_name_
519                       << " RTCP packet: size=" << len << ", type=" << type;
520         return false;
521       }
522     }
523 
524     // Update the length of the packet now that we've added the auth tag.
525     packet->SetLength(len);
526   } else if (secure_required_) {
527     // This is a double check for something that supposedly can't happen.
528     LOG(LS_ERROR) << "Can't send outgoing " << PacketType(rtcp)
529                   << " packet when SRTP is inactive and crypto is required";
530 
531     ASSERT(false);
532     return false;
533   }
534 
535   // Signal to the media sink after protecting the packet.
536   {
537     talk_base::CritScope cs(&signal_send_packet_cs_);
538     SignalSendPacketPostCrypto(packet->data(), packet->length(), rtcp);
539   }
540 
541   // Bon voyage.
542   int ret = channel->SendPacket(packet->data(), packet->length(), options,
543       (secure() && secure_dtls()) ? PF_SRTP_BYPASS : 0);
544   if (ret != static_cast<int>(packet->length())) {
545     if (channel->GetError() == EWOULDBLOCK) {
546       LOG(LS_WARNING) << "Got EWOULDBLOCK from socket.";
547       SetReadyToSend(channel, false);
548     }
549     return false;
550   }
551   return true;
552 }
553 
WantsPacket(bool rtcp,talk_base::Buffer * packet)554 bool BaseChannel::WantsPacket(bool rtcp, talk_base::Buffer* packet) {
555   // Protect ourselves against crazy data.
556   if (!ValidPacket(rtcp, packet)) {
557     LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " "
558                   << PacketType(rtcp) << " packet: wrong size="
559                   << packet->length();
560     return false;
561   }
562 
563   // Bundle filter handles both rtp and rtcp packets.
564   return bundle_filter_.DemuxPacket(packet->data(), packet->length(), rtcp);
565 }
566 
HandlePacket(bool rtcp,talk_base::Buffer * packet,const talk_base::PacketTime & packet_time)567 void BaseChannel::HandlePacket(bool rtcp, talk_base::Buffer* packet,
568                                const talk_base::PacketTime& packet_time) {
569   if (!WantsPacket(rtcp, packet)) {
570     return;
571   }
572 
573   if (!has_received_packet_) {
574     has_received_packet_ = true;
575     signaling_thread()->Post(this, MSG_FIRSTPACKETRECEIVED);
576   }
577 
578   // Signal to the media sink before unprotecting the packet.
579   {
580     talk_base::CritScope cs(&signal_recv_packet_cs_);
581     SignalRecvPacketPostCrypto(packet->data(), packet->length(), rtcp);
582   }
583 
584   // Unprotect the packet, if needed.
585   if (srtp_filter_.IsActive()) {
586     char* data = packet->data();
587     int len = static_cast<int>(packet->length());
588     bool res;
589     if (!rtcp) {
590       res = srtp_filter_.UnprotectRtp(data, len, &len);
591       if (!res) {
592         int seq_num = -1;
593         uint32 ssrc = 0;
594         GetRtpSeqNum(data, len, &seq_num);
595         GetRtpSsrc(data, len, &ssrc);
596         LOG(LS_ERROR) << "Failed to unprotect " << content_name_
597                       << " RTP packet: size=" << len
598                       << ", seqnum=" << seq_num << ", SSRC=" << ssrc;
599         return;
600       }
601     } else {
602       res = srtp_filter_.UnprotectRtcp(data, len, &len);
603       if (!res) {
604         int type = -1;
605         GetRtcpType(data, len, &type);
606         LOG(LS_ERROR) << "Failed to unprotect " << content_name_
607                       << " RTCP packet: size=" << len << ", type=" << type;
608         return;
609       }
610     }
611 
612     packet->SetLength(len);
613   } else if (secure_required_) {
614     // Our session description indicates that SRTP is required, but we got a
615     // packet before our SRTP filter is active. This means either that
616     // a) we got SRTP packets before we received the SDES keys, in which case
617     //    we can't decrypt it anyway, or
618     // b) we got SRTP packets before DTLS completed on both the RTP and RTCP
619     //    channels, so we haven't yet extracted keys, even if DTLS did complete
620     //    on the channel that the packets are being sent on. It's really good
621     //    practice to wait for both RTP and RTCP to be good to go before sending
622     //    media, to prevent weird failure modes, so it's fine for us to just eat
623     //    packets here. This is all sidestepped if RTCP mux is used anyway.
624     LOG(LS_WARNING) << "Can't process incoming " << PacketType(rtcp)
625                     << " packet when SRTP is inactive and crypto is required";
626     return;
627   }
628 
629   // Signal to the media sink after unprotecting the packet.
630   {
631     talk_base::CritScope cs(&signal_recv_packet_cs_);
632     SignalRecvPacketPreCrypto(packet->data(), packet->length(), rtcp);
633   }
634 
635   // Push it down to the media channel.
636   if (!rtcp) {
637     media_channel_->OnPacketReceived(packet, packet_time);
638   } else {
639     media_channel_->OnRtcpReceived(packet, packet_time);
640   }
641 }
642 
OnNewLocalDescription(BaseSession * session,ContentAction action)643 void BaseChannel::OnNewLocalDescription(
644     BaseSession* session, ContentAction action) {
645   const ContentInfo* content_info =
646       GetFirstContent(session->local_description());
647   const MediaContentDescription* content_desc =
648       GetContentDescription(content_info);
649   std::string error_desc;
650   if (content_desc && content_info && !content_info->rejected &&
651       !SetLocalContent(content_desc, action, &error_desc)) {
652     SetSessionError(session_, BaseSession::ERROR_CONTENT, error_desc);
653     LOG(LS_ERROR) << "Failure in SetLocalContent with action " << action;
654   }
655 }
656 
OnNewRemoteDescription(BaseSession * session,ContentAction action)657 void BaseChannel::OnNewRemoteDescription(
658     BaseSession* session, ContentAction action) {
659   const ContentInfo* content_info =
660       GetFirstContent(session->remote_description());
661   const MediaContentDescription* content_desc =
662       GetContentDescription(content_info);
663   std::string error_desc;
664   if (content_desc && content_info && !content_info->rejected &&
665       !SetRemoteContent(content_desc, action, &error_desc)) {
666     SetSessionError(session_, BaseSession::ERROR_CONTENT, error_desc);
667     LOG(LS_ERROR) << "Failure in SetRemoteContent with action " << action;
668   }
669 }
670 
EnableMedia_w()671 void BaseChannel::EnableMedia_w() {
672   ASSERT(worker_thread_ == talk_base::Thread::Current());
673   if (enabled_)
674     return;
675 
676   LOG(LS_INFO) << "Channel enabled";
677   enabled_ = true;
678   ChangeState();
679 }
680 
DisableMedia_w()681 void BaseChannel::DisableMedia_w() {
682   ASSERT(worker_thread_ == talk_base::Thread::Current());
683   if (!enabled_)
684     return;
685 
686   LOG(LS_INFO) << "Channel disabled";
687   enabled_ = false;
688   ChangeState();
689 }
690 
MuteStream_w(uint32 ssrc,bool mute)691 bool BaseChannel::MuteStream_w(uint32 ssrc, bool mute) {
692   ASSERT(worker_thread_ == talk_base::Thread::Current());
693   bool ret = media_channel()->MuteStream(ssrc, mute);
694   if (ret) {
695     if (mute)
696       muted_streams_.insert(ssrc);
697     else
698       muted_streams_.erase(ssrc);
699   }
700   return ret;
701 }
702 
IsStreamMuted_w(uint32 ssrc)703 bool BaseChannel::IsStreamMuted_w(uint32 ssrc) {
704   ASSERT(worker_thread_ == talk_base::Thread::Current());
705   return muted_streams_.find(ssrc) != muted_streams_.end();
706 }
707 
ChannelWritable_w()708 void BaseChannel::ChannelWritable_w() {
709   ASSERT(worker_thread_ == talk_base::Thread::Current());
710   if (writable_)
711     return;
712 
713   LOG(LS_INFO) << "Channel socket writable ("
714                << transport_channel_->content_name() << ", "
715                << transport_channel_->component() << ")"
716                << (was_ever_writable_ ? "" : " for the first time");
717 
718   std::vector<ConnectionInfo> infos;
719   transport_channel_->GetStats(&infos);
720   for (std::vector<ConnectionInfo>::const_iterator it = infos.begin();
721        it != infos.end(); ++it) {
722     if (it->best_connection) {
723       LOG(LS_INFO) << "Using " << it->local_candidate.ToSensitiveString()
724                    << "->" << it->remote_candidate.ToSensitiveString();
725       break;
726     }
727   }
728 
729   // If we're doing DTLS-SRTP, now is the time.
730   if (!was_ever_writable_ && ShouldSetupDtlsSrtp()) {
731     if (!SetupDtlsSrtp(false)) {
732       const std::string error_desc =
733           "Couldn't set up DTLS-SRTP on RTP channel.";
734       // Sent synchronously.
735       signaling_thread()->Invoke<void>(Bind(
736           &SetSessionError,
737           session_,
738           BaseSession::ERROR_TRANSPORT,
739           error_desc));
740       return;
741     }
742 
743     if (rtcp_transport_channel_) {
744       if (!SetupDtlsSrtp(true)) {
745         const std::string error_desc =
746             "Couldn't set up DTLS-SRTP on RTCP channel";
747         // Sent synchronously.
748         signaling_thread()->Invoke<void>(Bind(
749             &SetSessionError,
750             session_,
751             BaseSession::ERROR_TRANSPORT,
752             error_desc));
753         return;
754       }
755     }
756   }
757 
758   was_ever_writable_ = true;
759   writable_ = true;
760   ChangeState();
761 }
762 
SetDtlsSrtpCiphers(TransportChannel * tc,bool rtcp)763 bool BaseChannel::SetDtlsSrtpCiphers(TransportChannel *tc, bool rtcp) {
764   std::vector<std::string> ciphers;
765   // We always use the default SRTP ciphers for RTCP, but we may use different
766   // ciphers for RTP depending on the media type.
767   if (!rtcp) {
768     GetSrtpCiphers(&ciphers);
769   } else {
770     GetSupportedDefaultCryptoSuites(&ciphers);
771   }
772   return tc->SetSrtpCiphers(ciphers);
773 }
774 
ShouldSetupDtlsSrtp() const775 bool BaseChannel::ShouldSetupDtlsSrtp() const {
776   return true;
777 }
778 
779 // This function returns true if either DTLS-SRTP is not in use
780 // *or* DTLS-SRTP is successfully set up.
SetupDtlsSrtp(bool rtcp_channel)781 bool BaseChannel::SetupDtlsSrtp(bool rtcp_channel) {
782   bool ret = false;
783 
784   TransportChannel *channel = rtcp_channel ?
785       rtcp_transport_channel_ : transport_channel_;
786 
787   // No DTLS
788   if (!channel->IsDtlsActive())
789     return true;
790 
791   std::string selected_cipher;
792 
793   if (!channel->GetSrtpCipher(&selected_cipher)) {
794     LOG(LS_ERROR) << "No DTLS-SRTP selected cipher";
795     return false;
796   }
797 
798   LOG(LS_INFO) << "Installing keys from DTLS-SRTP on "
799                << content_name() << " "
800                << PacketType(rtcp_channel);
801 
802   // OK, we're now doing DTLS (RFC 5764)
803   std::vector<unsigned char> dtls_buffer(SRTP_MASTER_KEY_KEY_LEN * 2 +
804                                          SRTP_MASTER_KEY_SALT_LEN * 2);
805 
806   // RFC 5705 exporter using the RFC 5764 parameters
807   if (!channel->ExportKeyingMaterial(
808           kDtlsSrtpExporterLabel,
809           NULL, 0, false,
810           &dtls_buffer[0], dtls_buffer.size())) {
811     LOG(LS_WARNING) << "DTLS-SRTP key export failed";
812     ASSERT(false);  // This should never happen
813     return false;
814   }
815 
816   // Sync up the keys with the DTLS-SRTP interface
817   std::vector<unsigned char> client_write_key(SRTP_MASTER_KEY_KEY_LEN +
818     SRTP_MASTER_KEY_SALT_LEN);
819   std::vector<unsigned char> server_write_key(SRTP_MASTER_KEY_KEY_LEN +
820     SRTP_MASTER_KEY_SALT_LEN);
821   size_t offset = 0;
822   memcpy(&client_write_key[0], &dtls_buffer[offset],
823     SRTP_MASTER_KEY_KEY_LEN);
824   offset += SRTP_MASTER_KEY_KEY_LEN;
825   memcpy(&server_write_key[0], &dtls_buffer[offset],
826     SRTP_MASTER_KEY_KEY_LEN);
827   offset += SRTP_MASTER_KEY_KEY_LEN;
828   memcpy(&client_write_key[SRTP_MASTER_KEY_KEY_LEN],
829     &dtls_buffer[offset], SRTP_MASTER_KEY_SALT_LEN);
830   offset += SRTP_MASTER_KEY_SALT_LEN;
831   memcpy(&server_write_key[SRTP_MASTER_KEY_KEY_LEN],
832     &dtls_buffer[offset], SRTP_MASTER_KEY_SALT_LEN);
833 
834   std::vector<unsigned char> *send_key, *recv_key;
835   talk_base::SSLRole role;
836   if (!channel->GetSslRole(&role)) {
837     LOG(LS_WARNING) << "GetSslRole failed";
838     return false;
839   }
840 
841   if (role == talk_base::SSL_SERVER) {
842     send_key = &server_write_key;
843     recv_key = &client_write_key;
844   } else {
845     send_key = &client_write_key;
846     recv_key = &server_write_key;
847   }
848 
849   if (rtcp_channel) {
850     ret = srtp_filter_.SetRtcpParams(
851         selected_cipher,
852         &(*send_key)[0],
853         static_cast<int>(send_key->size()),
854         selected_cipher,
855         &(*recv_key)[0],
856         static_cast<int>(recv_key->size()));
857   } else {
858     ret = srtp_filter_.SetRtpParams(
859         selected_cipher,
860         &(*send_key)[0],
861         static_cast<int>(send_key->size()),
862         selected_cipher,
863         &(*recv_key)[0],
864         static_cast<int>(recv_key->size()));
865   }
866 
867   if (!ret)
868     LOG(LS_WARNING) << "DTLS-SRTP key installation failed";
869   else
870     dtls_keyed_ = true;
871 
872   return ret;
873 }
874 
ChannelNotWritable_w()875 void BaseChannel::ChannelNotWritable_w() {
876   ASSERT(worker_thread_ == talk_base::Thread::Current());
877   if (!writable_)
878     return;
879 
880   LOG(LS_INFO) << "Channel socket not writable ("
881                << transport_channel_->content_name() << ", "
882                << transport_channel_->component() << ")";
883   writable_ = false;
884   ChangeState();
885 }
886 
887 // |dtls| will be set to true if DTLS is active for transport channel and
888 // crypto is empty.
CheckSrtpConfig(const std::vector<CryptoParams> & cryptos,bool * dtls,std::string * error_desc)889 bool BaseChannel::CheckSrtpConfig(const std::vector<CryptoParams>& cryptos,
890                                   bool* dtls,
891                                   std::string* error_desc) {
892   *dtls = transport_channel_->IsDtlsActive();
893   if (*dtls && !cryptos.empty()) {
894     SafeSetError("Cryptos must be empty when DTLS is active.",
895                  error_desc);
896     return false;
897   }
898   return true;
899 }
900 
SetSrtp_w(const std::vector<CryptoParams> & cryptos,ContentAction action,ContentSource src,std::string * error_desc)901 bool BaseChannel::SetSrtp_w(const std::vector<CryptoParams>& cryptos,
902                             ContentAction action,
903                             ContentSource src,
904                             std::string* error_desc) {
905   if (action == CA_UPDATE) {
906     // no crypto params.
907     return true;
908   }
909   bool ret = false;
910   bool dtls = false;
911   ret = CheckSrtpConfig(cryptos, &dtls, error_desc);
912   if (!ret) {
913     return false;
914   }
915   switch (action) {
916     case CA_OFFER:
917       // If DTLS is already active on the channel, we could be renegotiating
918       // here. We don't update the srtp filter.
919       if (!dtls) {
920         ret = srtp_filter_.SetOffer(cryptos, src);
921       }
922       break;
923     case CA_PRANSWER:
924       // If we're doing DTLS-SRTP, we don't want to update the filter
925       // with an answer, because we already have SRTP parameters.
926       if (!dtls) {
927         ret = srtp_filter_.SetProvisionalAnswer(cryptos, src);
928       }
929       break;
930     case CA_ANSWER:
931       // If we're doing DTLS-SRTP, we don't want to update the filter
932       // with an answer, because we already have SRTP parameters.
933       if (!dtls) {
934         ret = srtp_filter_.SetAnswer(cryptos, src);
935       }
936       break;
937     default:
938       break;
939   }
940   if (!ret) {
941     SafeSetError("Failed to setup SRTP filter.", error_desc);
942     return false;
943   }
944   return true;
945 }
946 
SetRtcpMux_w(bool enable,ContentAction action,ContentSource src,std::string * error_desc)947 bool BaseChannel::SetRtcpMux_w(bool enable, ContentAction action,
948                                ContentSource src,
949                                std::string* error_desc) {
950   bool ret = false;
951   switch (action) {
952     case CA_OFFER:
953       ret = rtcp_mux_filter_.SetOffer(enable, src);
954       break;
955     case CA_PRANSWER:
956       ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src);
957       break;
958     case CA_ANSWER:
959       ret = rtcp_mux_filter_.SetAnswer(enable, src);
960       if (ret && rtcp_mux_filter_.IsActive()) {
961         // We activated RTCP mux, close down the RTCP transport.
962         set_rtcp_transport_channel(NULL);
963       }
964       break;
965     case CA_UPDATE:
966       // No RTCP mux info.
967       ret = true;
968     default:
969       break;
970   }
971   if (!ret) {
972     SafeSetError("Failed to setup RTCP mux filter.", error_desc);
973     return false;
974   }
975   // |rtcp_mux_filter_| can be active if |action| is CA_PRANSWER or
976   // CA_ANSWER, but we only want to tear down the RTCP transport channel if we
977   // received a final answer.
978   if (rtcp_mux_filter_.IsActive()) {
979     // If the RTP transport is already writable, then so are we.
980     if (transport_channel_->writable()) {
981       ChannelWritable_w();
982     }
983   }
984 
985   return true;
986 }
987 
AddRecvStream_w(const StreamParams & sp)988 bool BaseChannel::AddRecvStream_w(const StreamParams& sp) {
989   ASSERT(worker_thread() == talk_base::Thread::Current());
990   if (!media_channel()->AddRecvStream(sp))
991     return false;
992 
993   return bundle_filter_.AddStream(sp);
994 }
995 
RemoveRecvStream_w(uint32 ssrc)996 bool BaseChannel::RemoveRecvStream_w(uint32 ssrc) {
997   ASSERT(worker_thread() == talk_base::Thread::Current());
998   bundle_filter_.RemoveStream(ssrc);
999   return media_channel()->RemoveRecvStream(ssrc);
1000 }
1001 
UpdateLocalStreams_w(const std::vector<StreamParams> & streams,ContentAction action,std::string * error_desc)1002 bool BaseChannel::UpdateLocalStreams_w(const std::vector<StreamParams>& streams,
1003                                        ContentAction action,
1004                                        std::string* error_desc) {
1005   if (!VERIFY(action == CA_OFFER || action == CA_ANSWER ||
1006               action == CA_PRANSWER || action == CA_UPDATE))
1007     return false;
1008 
1009   // If this is an update, streams only contain streams that have changed.
1010   if (action == CA_UPDATE) {
1011     for (StreamParamsVec::const_iterator it = streams.begin();
1012          it != streams.end(); ++it) {
1013       StreamParams existing_stream;
1014       bool stream_exist = GetStreamByIds(local_streams_, it->groupid,
1015                                          it->id, &existing_stream);
1016       if (!stream_exist && it->has_ssrcs()) {
1017         if (media_channel()->AddSendStream(*it)) {
1018           local_streams_.push_back(*it);
1019           LOG(LS_INFO) << "Add send stream ssrc: " << it->first_ssrc();
1020         } else {
1021           std::ostringstream desc;
1022           desc << "Failed to add send stream ssrc: " << it->first_ssrc();
1023           SafeSetError(desc.str(), error_desc);
1024           return false;
1025         }
1026       } else if (stream_exist && !it->has_ssrcs()) {
1027         if (!media_channel()->RemoveSendStream(existing_stream.first_ssrc())) {
1028           std::ostringstream desc;
1029           desc << "Failed to remove send stream with ssrc "
1030                << it->first_ssrc() << ".";
1031           SafeSetError(desc.str(), error_desc);
1032           return false;
1033         }
1034         RemoveStreamBySsrc(&local_streams_, existing_stream.first_ssrc());
1035       } else {
1036         LOG(LS_WARNING) << "Ignore unsupported stream update";
1037       }
1038     }
1039     return true;
1040   }
1041   // Else streams are all the streams we want to send.
1042 
1043   // Check for streams that have been removed.
1044   bool ret = true;
1045   for (StreamParamsVec::const_iterator it = local_streams_.begin();
1046        it != local_streams_.end(); ++it) {
1047     if (!GetStreamBySsrc(streams, it->first_ssrc(), NULL)) {
1048       if (!media_channel()->RemoveSendStream(it->first_ssrc())) {
1049         std::ostringstream desc;
1050         desc << "Failed to remove send stream with ssrc "
1051              << it->first_ssrc() << ".";
1052         SafeSetError(desc.str(), error_desc);
1053         ret = false;
1054       }
1055     }
1056   }
1057   // Check for new streams.
1058   for (StreamParamsVec::const_iterator it = streams.begin();
1059        it != streams.end(); ++it) {
1060     if (!GetStreamBySsrc(local_streams_, it->first_ssrc(), NULL)) {
1061       if (media_channel()->AddSendStream(*it)) {
1062         LOG(LS_INFO) << "Add send ssrc: " << it->ssrcs[0];
1063       } else {
1064         std::ostringstream desc;
1065         desc << "Failed to add send stream ssrc: " << it->first_ssrc();
1066         SafeSetError(desc.str(), error_desc);
1067         ret = false;
1068       }
1069     }
1070   }
1071   local_streams_ = streams;
1072   return ret;
1073 }
1074 
UpdateRemoteStreams_w(const std::vector<StreamParams> & streams,ContentAction action,std::string * error_desc)1075 bool BaseChannel::UpdateRemoteStreams_w(
1076     const std::vector<StreamParams>& streams,
1077     ContentAction action,
1078     std::string* error_desc) {
1079   if (!VERIFY(action == CA_OFFER || action == CA_ANSWER ||
1080               action == CA_PRANSWER || action == CA_UPDATE))
1081     return false;
1082 
1083   // If this is an update, streams only contain streams that have changed.
1084   if (action == CA_UPDATE) {
1085     for (StreamParamsVec::const_iterator it = streams.begin();
1086          it != streams.end(); ++it) {
1087       StreamParams existing_stream;
1088       bool stream_exists = GetStreamByIds(remote_streams_, it->groupid,
1089                                           it->id, &existing_stream);
1090       if (!stream_exists && it->has_ssrcs()) {
1091         if (AddRecvStream_w(*it)) {
1092           remote_streams_.push_back(*it);
1093           LOG(LS_INFO) << "Add remote stream ssrc: " << it->first_ssrc();
1094         } else {
1095           std::ostringstream desc;
1096           desc << "Failed to add remote stream ssrc: " << it->first_ssrc();
1097           SafeSetError(desc.str(), error_desc);
1098           return false;
1099         }
1100       } else if (stream_exists && !it->has_ssrcs()) {
1101         if (!RemoveRecvStream_w(existing_stream.first_ssrc())) {
1102           std::ostringstream desc;
1103           desc << "Failed to remove remote stream with ssrc "
1104                << it->first_ssrc() << ".";
1105           SafeSetError(desc.str(), error_desc);
1106           return false;
1107         }
1108         RemoveStreamBySsrc(&remote_streams_, existing_stream.first_ssrc());
1109       } else {
1110         LOG(LS_WARNING) << "Ignore unsupported stream update."
1111                         << " Stream exists? " << stream_exists
1112                         << " existing stream = " << existing_stream.ToString()
1113                         << " new stream = " << it->ToString();
1114       }
1115     }
1116     return true;
1117   }
1118   // Else streams are all the streams we want to receive.
1119 
1120   // Check for streams that have been removed.
1121   bool ret = true;
1122   for (StreamParamsVec::const_iterator it = remote_streams_.begin();
1123        it != remote_streams_.end(); ++it) {
1124     if (!GetStreamBySsrc(streams, it->first_ssrc(), NULL)) {
1125       if (!RemoveRecvStream_w(it->first_ssrc())) {
1126         std::ostringstream desc;
1127         desc << "Failed to remove remote stream with ssrc "
1128              << it->first_ssrc() << ".";
1129         SafeSetError(desc.str(), error_desc);
1130         ret = false;
1131       }
1132     }
1133   }
1134   // Check for new streams.
1135   for (StreamParamsVec::const_iterator it = streams.begin();
1136       it != streams.end(); ++it) {
1137     if (!GetStreamBySsrc(remote_streams_, it->first_ssrc(), NULL)) {
1138       if (AddRecvStream_w(*it)) {
1139         LOG(LS_INFO) << "Add remote ssrc: " << it->ssrcs[0];
1140       } else {
1141         std::ostringstream desc;
1142         desc << "Failed to add remote stream ssrc: " << it->first_ssrc();
1143         SafeSetError(desc.str(), error_desc);
1144         ret = false;
1145       }
1146     }
1147   }
1148   remote_streams_ = streams;
1149   return ret;
1150 }
1151 
SetBaseLocalContent_w(const MediaContentDescription * content,ContentAction action,std::string * error_desc)1152 bool BaseChannel::SetBaseLocalContent_w(const MediaContentDescription* content,
1153                                         ContentAction action,
1154                                         std::string* error_desc) {
1155   // Cache secure_required_ for belt and suspenders check on SendPacket
1156   secure_required_ = content->crypto_required() != CT_NONE;
1157   bool ret = UpdateLocalStreams_w(content->streams(), action, error_desc);
1158   // Set local SRTP parameters (what we will encrypt with).
1159   ret &= SetSrtp_w(content->cryptos(), action, CS_LOCAL, error_desc);
1160   // Set local RTCP mux parameters.
1161   ret &= SetRtcpMux_w(content->rtcp_mux(), action, CS_LOCAL, error_desc);
1162   // Set local RTP header extensions.
1163   if (content->rtp_header_extensions_set()) {
1164     if (!media_channel()->SetRecvRtpHeaderExtensions(
1165             content->rtp_header_extensions())) {
1166       std::ostringstream desc;
1167       desc << "Failed to set receive rtp header extensions for "
1168            << MediaTypeToString(content->type()) << " content.";
1169       SafeSetError(desc.str(), error_desc);
1170       ret = false;
1171     }
1172   }
1173   set_local_content_direction(content->direction());
1174   return ret;
1175 }
1176 
SetBaseRemoteContent_w(const MediaContentDescription * content,ContentAction action,std::string * error_desc)1177 bool BaseChannel::SetBaseRemoteContent_w(const MediaContentDescription* content,
1178                                          ContentAction action,
1179                                          std::string* error_desc) {
1180   bool ret = UpdateRemoteStreams_w(content->streams(), action, error_desc);
1181   // Set remote SRTP parameters (what the other side will encrypt with).
1182   ret &= SetSrtp_w(content->cryptos(), action, CS_REMOTE, error_desc);
1183   // Set remote RTCP mux parameters.
1184   ret &= SetRtcpMux_w(content->rtcp_mux(), action, CS_REMOTE, error_desc);
1185   // Set remote RTP header extensions.
1186   if (content->rtp_header_extensions_set()) {
1187     if (!media_channel()->SetSendRtpHeaderExtensions(
1188             content->rtp_header_extensions())) {
1189       std::ostringstream desc;
1190       desc << "Failed to set send rtp header extensions for "
1191            << MediaTypeToString(content->type()) << " content.";
1192       SafeSetError(desc.str(), error_desc);
1193       ret = false;
1194     } else {
1195       MaybeCacheRtpAbsSendTimeHeaderExtension(content->rtp_header_extensions());
1196     }
1197   }
1198 
1199   if (!media_channel()->SetMaxSendBandwidth(content->bandwidth())) {
1200     std::ostringstream desc;
1201     desc << "Failed to set max send bandwidth for "
1202          << MediaTypeToString(content->type()) << " content.";
1203     SafeSetError(desc.str(), error_desc);
1204     ret = false;
1205   }
1206   set_remote_content_direction(content->direction());
1207   return ret;
1208 }
1209 
MaybeCacheRtpAbsSendTimeHeaderExtension(const std::vector<RtpHeaderExtension> & extensions)1210 void BaseChannel::MaybeCacheRtpAbsSendTimeHeaderExtension(
1211     const std::vector<RtpHeaderExtension>& extensions) {
1212   const RtpHeaderExtension* send_time_extension =
1213       FindHeaderExtension(extensions, kRtpAbsoluteSenderTimeHeaderExtension);
1214   rtp_abs_sendtime_extn_id_ =
1215       send_time_extension ? send_time_extension->id : -1;
1216 }
1217 
OnMessage(talk_base::Message * pmsg)1218 void BaseChannel::OnMessage(talk_base::Message *pmsg) {
1219   switch (pmsg->message_id) {
1220     case MSG_RTPPACKET:
1221     case MSG_RTCPPACKET: {
1222       PacketMessageData* data = static_cast<PacketMessageData*>(pmsg->pdata);
1223       SendPacket(pmsg->message_id == MSG_RTCPPACKET, &data->packet, data->dscp);
1224       delete data;  // because it is Posted
1225       break;
1226     }
1227     case MSG_FIRSTPACKETRECEIVED: {
1228       SignalFirstPacketReceived(this);
1229       break;
1230     }
1231   }
1232 }
1233 
FlushRtcpMessages()1234 void BaseChannel::FlushRtcpMessages() {
1235   // Flush all remaining RTCP messages. This should only be called in
1236   // destructor.
1237   ASSERT(talk_base::Thread::Current() == worker_thread_);
1238   talk_base::MessageList rtcp_messages;
1239   worker_thread_->Clear(this, MSG_RTCPPACKET, &rtcp_messages);
1240   for (talk_base::MessageList::iterator it = rtcp_messages.begin();
1241        it != rtcp_messages.end(); ++it) {
1242     worker_thread_->Send(this, MSG_RTCPPACKET, it->pdata);
1243   }
1244 }
1245 
VoiceChannel(talk_base::Thread * thread,MediaEngineInterface * media_engine,VoiceMediaChannel * media_channel,BaseSession * session,const std::string & content_name,bool rtcp)1246 VoiceChannel::VoiceChannel(talk_base::Thread* thread,
1247                            MediaEngineInterface* media_engine,
1248                            VoiceMediaChannel* media_channel,
1249                            BaseSession* session,
1250                            const std::string& content_name,
1251                            bool rtcp)
1252     : BaseChannel(thread, media_engine, media_channel, session, content_name,
1253                   rtcp),
1254       received_media_(false) {
1255 }
1256 
~VoiceChannel()1257 VoiceChannel::~VoiceChannel() {
1258   StopAudioMonitor();
1259   StopMediaMonitor();
1260   // this can't be done in the base class, since it calls a virtual
1261   DisableMedia_w();
1262   Deinit();
1263 }
1264 
Init()1265 bool VoiceChannel::Init() {
1266   TransportChannel* rtcp_channel = rtcp() ? session()->CreateChannel(
1267       content_name(), "rtcp", ICE_CANDIDATE_COMPONENT_RTCP) : NULL;
1268   if (!BaseChannel::Init(session()->CreateChannel(
1269           content_name(), "rtp", ICE_CANDIDATE_COMPONENT_RTP),
1270           rtcp_channel)) {
1271     return false;
1272   }
1273   media_channel()->SignalMediaError.connect(
1274       this, &VoiceChannel::OnVoiceChannelError);
1275   srtp_filter()->SignalSrtpError.connect(
1276       this, &VoiceChannel::OnSrtpError);
1277   return true;
1278 }
1279 
SetRemoteRenderer(uint32 ssrc,AudioRenderer * renderer)1280 bool VoiceChannel::SetRemoteRenderer(uint32 ssrc, AudioRenderer* renderer) {
1281   return InvokeOnWorker(Bind(&VoiceMediaChannel::SetRemoteRenderer,
1282                              media_channel(), ssrc, renderer));
1283 }
1284 
SetLocalRenderer(uint32 ssrc,AudioRenderer * renderer)1285 bool VoiceChannel::SetLocalRenderer(uint32 ssrc, AudioRenderer* renderer) {
1286   return InvokeOnWorker(Bind(&VoiceMediaChannel::SetLocalRenderer,
1287                              media_channel(), ssrc, renderer));
1288 }
1289 
SetRingbackTone(const void * buf,int len)1290 bool VoiceChannel::SetRingbackTone(const void* buf, int len) {
1291   return InvokeOnWorker(Bind(&VoiceChannel::SetRingbackTone_w, this, buf, len));
1292 }
1293 
1294 // TODO(juberti): Handle early media the right way. We should get an explicit
1295 // ringing message telling us to start playing local ringback, which we cancel
1296 // if any early media actually arrives. For now, we do the opposite, which is
1297 // to wait 1 second for early media, and start playing local ringback if none
1298 // arrives.
SetEarlyMedia(bool enable)1299 void VoiceChannel::SetEarlyMedia(bool enable) {
1300   if (enable) {
1301     // Start the early media timeout
1302     worker_thread()->PostDelayed(kEarlyMediaTimeout, this,
1303                                 MSG_EARLYMEDIATIMEOUT);
1304   } else {
1305     // Stop the timeout if currently going.
1306     worker_thread()->Clear(this, MSG_EARLYMEDIATIMEOUT);
1307   }
1308 }
1309 
PlayRingbackTone(uint32 ssrc,bool play,bool loop)1310 bool VoiceChannel::PlayRingbackTone(uint32 ssrc, bool play, bool loop) {
1311   return InvokeOnWorker(Bind(&VoiceChannel::PlayRingbackTone_w,
1312                              this, ssrc, play, loop));
1313 }
1314 
PressDTMF(int digit,bool playout)1315 bool VoiceChannel::PressDTMF(int digit, bool playout) {
1316   int flags = DF_SEND;
1317   if (playout) {
1318     flags |= DF_PLAY;
1319   }
1320   int duration_ms = 160;
1321   return InsertDtmf(0, digit, duration_ms, flags);
1322 }
1323 
CanInsertDtmf()1324 bool VoiceChannel::CanInsertDtmf() {
1325   return InvokeOnWorker(Bind(&VoiceMediaChannel::CanInsertDtmf,
1326                              media_channel()));
1327 }
1328 
InsertDtmf(uint32 ssrc,int event_code,int duration,int flags)1329 bool VoiceChannel::InsertDtmf(uint32 ssrc, int event_code, int duration,
1330                               int flags) {
1331   return InvokeOnWorker(Bind(&VoiceChannel::InsertDtmf_w, this,
1332                              ssrc, event_code, duration, flags));
1333 }
1334 
SetOutputScaling(uint32 ssrc,double left,double right)1335 bool VoiceChannel::SetOutputScaling(uint32 ssrc, double left, double right) {
1336   return InvokeOnWorker(Bind(&VoiceMediaChannel::SetOutputScaling,
1337                              media_channel(), ssrc, left, right));
1338 }
1339 
GetStats(VoiceMediaInfo * stats)1340 bool VoiceChannel::GetStats(VoiceMediaInfo* stats) {
1341   return InvokeOnWorker(Bind(&VoiceMediaChannel::GetStats,
1342                              media_channel(), stats));
1343 }
1344 
StartMediaMonitor(int cms)1345 void VoiceChannel::StartMediaMonitor(int cms) {
1346   media_monitor_.reset(new VoiceMediaMonitor(media_channel(), worker_thread(),
1347       talk_base::Thread::Current()));
1348   media_monitor_->SignalUpdate.connect(
1349       this, &VoiceChannel::OnMediaMonitorUpdate);
1350   media_monitor_->Start(cms);
1351 }
1352 
StopMediaMonitor()1353 void VoiceChannel::StopMediaMonitor() {
1354   if (media_monitor_) {
1355     media_monitor_->Stop();
1356     media_monitor_->SignalUpdate.disconnect(this);
1357     media_monitor_.reset();
1358   }
1359 }
1360 
StartAudioMonitor(int cms)1361 void VoiceChannel::StartAudioMonitor(int cms) {
1362   audio_monitor_.reset(new AudioMonitor(this, talk_base::Thread::Current()));
1363   audio_monitor_
1364     ->SignalUpdate.connect(this, &VoiceChannel::OnAudioMonitorUpdate);
1365   audio_monitor_->Start(cms);
1366 }
1367 
StopAudioMonitor()1368 void VoiceChannel::StopAudioMonitor() {
1369   if (audio_monitor_) {
1370     audio_monitor_->Stop();
1371     audio_monitor_.reset();
1372   }
1373 }
1374 
IsAudioMonitorRunning() const1375 bool VoiceChannel::IsAudioMonitorRunning() const {
1376   return (audio_monitor_.get() != NULL);
1377 }
1378 
StartTypingMonitor(const TypingMonitorOptions & settings)1379 void VoiceChannel::StartTypingMonitor(const TypingMonitorOptions& settings) {
1380   typing_monitor_.reset(new TypingMonitor(this, worker_thread(), settings));
1381   SignalAutoMuted.repeat(typing_monitor_->SignalMuted);
1382 }
1383 
StopTypingMonitor()1384 void VoiceChannel::StopTypingMonitor() {
1385   typing_monitor_.reset();
1386 }
1387 
IsTypingMonitorRunning() const1388 bool VoiceChannel::IsTypingMonitorRunning() const {
1389   return typing_monitor_;
1390 }
1391 
MuteStream_w(uint32 ssrc,bool mute)1392 bool VoiceChannel::MuteStream_w(uint32 ssrc, bool mute) {
1393   bool ret = BaseChannel::MuteStream_w(ssrc, mute);
1394   if (typing_monitor_ && mute)
1395     typing_monitor_->OnChannelMuted();
1396   return ret;
1397 }
1398 
GetInputLevel_w()1399 int VoiceChannel::GetInputLevel_w() {
1400   return media_engine()->GetInputLevel();
1401 }
1402 
GetOutputLevel_w()1403 int VoiceChannel::GetOutputLevel_w() {
1404   return media_channel()->GetOutputLevel();
1405 }
1406 
GetActiveStreams_w(AudioInfo::StreamList * actives)1407 void VoiceChannel::GetActiveStreams_w(AudioInfo::StreamList* actives) {
1408   media_channel()->GetActiveStreams(actives);
1409 }
1410 
OnChannelRead(TransportChannel * channel,const char * data,size_t len,const talk_base::PacketTime & packet_time,int flags)1411 void VoiceChannel::OnChannelRead(TransportChannel* channel,
1412                                  const char* data, size_t len,
1413                                  const talk_base::PacketTime& packet_time,
1414                                 int flags) {
1415   BaseChannel::OnChannelRead(channel, data, len, packet_time, flags);
1416 
1417   // Set a flag when we've received an RTP packet. If we're waiting for early
1418   // media, this will disable the timeout.
1419   if (!received_media_ && !PacketIsRtcp(channel, data, len)) {
1420     received_media_ = true;
1421   }
1422 }
1423 
ChangeState()1424 void VoiceChannel::ChangeState() {
1425   // Render incoming data if we're the active call, and we have the local
1426   // content. We receive data on the default channel and multiplexed streams.
1427   bool recv = IsReadyToReceive();
1428   if (!media_channel()->SetPlayout(recv)) {
1429     SendLastMediaError();
1430   }
1431 
1432   // Send outgoing data if we're the active call, we have the remote content,
1433   // and we have had some form of connectivity.
1434   bool send = IsReadyToSend();
1435   SendFlags send_flag = send ? SEND_MICROPHONE : SEND_NOTHING;
1436   if (!media_channel()->SetSend(send_flag)) {
1437     LOG(LS_ERROR) << "Failed to SetSend " << send_flag << " on voice channel";
1438     SendLastMediaError();
1439   }
1440 
1441   LOG(LS_INFO) << "Changing voice state, recv=" << recv << " send=" << send;
1442 }
1443 
GetFirstContent(const SessionDescription * sdesc)1444 const ContentInfo* VoiceChannel::GetFirstContent(
1445     const SessionDescription* sdesc) {
1446   return GetFirstAudioContent(sdesc);
1447 }
1448 
SetLocalContent_w(const MediaContentDescription * content,ContentAction action,std::string * error_desc)1449 bool VoiceChannel::SetLocalContent_w(const MediaContentDescription* content,
1450                                      ContentAction action,
1451                                      std::string* error_desc) {
1452   ASSERT(worker_thread() == talk_base::Thread::Current());
1453   LOG(LS_INFO) << "Setting local voice description";
1454 
1455   const AudioContentDescription* audio =
1456       static_cast<const AudioContentDescription*>(content);
1457   ASSERT(audio != NULL);
1458   if (!audio) {
1459     SafeSetError("Can't find audio content in local description.", error_desc);
1460     return false;
1461   }
1462 
1463   bool ret = SetBaseLocalContent_w(content, action, error_desc);
1464   // Set local audio codecs (what we want to receive).
1465   // TODO(whyuan): Change action != CA_UPDATE to !audio->partial() when partial
1466   // is set properly.
1467   if (action != CA_UPDATE || audio->has_codecs()) {
1468     if (!media_channel()->SetRecvCodecs(audio->codecs())) {
1469       SafeSetError("Failed to set audio receive codecs.", error_desc);
1470       ret = false;
1471     }
1472   }
1473 
1474   // If everything worked, see if we can start receiving.
1475   if (ret) {
1476     std::vector<AudioCodec>::const_iterator it = audio->codecs().begin();
1477     for (; it != audio->codecs().end(); ++it) {
1478       bundle_filter()->AddPayloadType(it->id);
1479     }
1480     ChangeState();
1481   } else {
1482     LOG(LS_WARNING) << "Failed to set local voice description";
1483   }
1484   return ret;
1485 }
1486 
SetRemoteContent_w(const MediaContentDescription * content,ContentAction action,std::string * error_desc)1487 bool VoiceChannel::SetRemoteContent_w(const MediaContentDescription* content,
1488                                       ContentAction action,
1489                                       std::string* error_desc) {
1490   ASSERT(worker_thread() == talk_base::Thread::Current());
1491   LOG(LS_INFO) << "Setting remote voice description";
1492 
1493   const AudioContentDescription* audio =
1494       static_cast<const AudioContentDescription*>(content);
1495   ASSERT(audio != NULL);
1496   if (!audio) {
1497     SafeSetError("Can't find audio content in remote description.", error_desc);
1498     return false;
1499   }
1500 
1501   bool ret = true;
1502   // Set remote video codecs (what the other side wants to receive).
1503   if (action != CA_UPDATE || audio->has_codecs()) {
1504     if (!media_channel()->SetSendCodecs(audio->codecs())) {
1505       SafeSetError("Failed to set audio send codecs.", error_desc);
1506       ret = false;
1507     }
1508   }
1509 
1510   ret &= SetBaseRemoteContent_w(content, action, error_desc);
1511 
1512   if (action != CA_UPDATE) {
1513     // Tweak our audio processing settings, if needed.
1514     AudioOptions audio_options;
1515     if (!media_channel()->GetOptions(&audio_options)) {
1516       LOG(LS_WARNING) << "Can not set audio options from on remote content.";
1517     } else {
1518       if (audio->conference_mode()) {
1519         audio_options.conference_mode.Set(true);
1520       }
1521       if (audio->agc_minus_10db()) {
1522         audio_options.adjust_agc_delta.Set(kAgcMinus10db);
1523       }
1524       if (!media_channel()->SetOptions(audio_options)) {
1525         // Log an error on failure, but don't abort the call.
1526         LOG(LS_ERROR) << "Failed to set voice channel options";
1527       }
1528     }
1529   }
1530 
1531   // If everything worked, see if we can start sending.
1532   if (ret) {
1533     ChangeState();
1534   } else {
1535     LOG(LS_WARNING) << "Failed to set remote voice description";
1536   }
1537   return ret;
1538 }
1539 
SetRingbackTone_w(const void * buf,int len)1540 bool VoiceChannel::SetRingbackTone_w(const void* buf, int len) {
1541   ASSERT(worker_thread() == talk_base::Thread::Current());
1542   return media_channel()->SetRingbackTone(static_cast<const char*>(buf), len);
1543 }
1544 
PlayRingbackTone_w(uint32 ssrc,bool play,bool loop)1545 bool VoiceChannel::PlayRingbackTone_w(uint32 ssrc, bool play, bool loop) {
1546   ASSERT(worker_thread() == talk_base::Thread::Current());
1547   if (play) {
1548     LOG(LS_INFO) << "Playing ringback tone, loop=" << loop;
1549   } else {
1550     LOG(LS_INFO) << "Stopping ringback tone";
1551   }
1552   return media_channel()->PlayRingbackTone(ssrc, play, loop);
1553 }
1554 
HandleEarlyMediaTimeout()1555 void VoiceChannel::HandleEarlyMediaTimeout() {
1556   // This occurs on the main thread, not the worker thread.
1557   if (!received_media_) {
1558     LOG(LS_INFO) << "No early media received before timeout";
1559     SignalEarlyMediaTimeout(this);
1560   }
1561 }
1562 
InsertDtmf_w(uint32 ssrc,int event,int duration,int flags)1563 bool VoiceChannel::InsertDtmf_w(uint32 ssrc, int event, int duration,
1564                                 int flags) {
1565   if (!enabled()) {
1566     return false;
1567   }
1568 
1569   return media_channel()->InsertDtmf(ssrc, event, duration, flags);
1570 }
1571 
SetChannelOptions(const AudioOptions & options)1572 bool VoiceChannel::SetChannelOptions(const AudioOptions& options) {
1573   return InvokeOnWorker(Bind(&VoiceMediaChannel::SetOptions,
1574                              media_channel(), options));
1575 }
1576 
OnMessage(talk_base::Message * pmsg)1577 void VoiceChannel::OnMessage(talk_base::Message *pmsg) {
1578   switch (pmsg->message_id) {
1579     case MSG_EARLYMEDIATIMEOUT:
1580       HandleEarlyMediaTimeout();
1581       break;
1582     case MSG_CHANNEL_ERROR: {
1583       VoiceChannelErrorMessageData* data =
1584           static_cast<VoiceChannelErrorMessageData*>(pmsg->pdata);
1585       SignalMediaError(this, data->ssrc, data->error);
1586       delete data;
1587       break;
1588     }
1589     default:
1590       BaseChannel::OnMessage(pmsg);
1591       break;
1592   }
1593 }
1594 
OnConnectionMonitorUpdate(SocketMonitor * monitor,const std::vector<ConnectionInfo> & infos)1595 void VoiceChannel::OnConnectionMonitorUpdate(
1596     SocketMonitor* monitor, const std::vector<ConnectionInfo>& infos) {
1597   SignalConnectionMonitor(this, infos);
1598 }
1599 
OnMediaMonitorUpdate(VoiceMediaChannel * media_channel,const VoiceMediaInfo & info)1600 void VoiceChannel::OnMediaMonitorUpdate(
1601     VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) {
1602   ASSERT(media_channel == this->media_channel());
1603   SignalMediaMonitor(this, info);
1604 }
1605 
OnAudioMonitorUpdate(AudioMonitor * monitor,const AudioInfo & info)1606 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor,
1607                                         const AudioInfo& info) {
1608   SignalAudioMonitor(this, info);
1609 }
1610 
OnVoiceChannelError(uint32 ssrc,VoiceMediaChannel::Error err)1611 void VoiceChannel::OnVoiceChannelError(
1612     uint32 ssrc, VoiceMediaChannel::Error err) {
1613   VoiceChannelErrorMessageData* data = new VoiceChannelErrorMessageData(
1614       ssrc, err);
1615   signaling_thread()->Post(this, MSG_CHANNEL_ERROR, data);
1616 }
1617 
OnSrtpError(uint32 ssrc,SrtpFilter::Mode mode,SrtpFilter::Error error)1618 void VoiceChannel::OnSrtpError(uint32 ssrc, SrtpFilter::Mode mode,
1619                                SrtpFilter::Error error) {
1620   switch (error) {
1621     case SrtpFilter::ERROR_FAIL:
1622       OnVoiceChannelError(ssrc, (mode == SrtpFilter::PROTECT) ?
1623                           VoiceMediaChannel::ERROR_REC_SRTP_ERROR :
1624                           VoiceMediaChannel::ERROR_PLAY_SRTP_ERROR);
1625       break;
1626     case SrtpFilter::ERROR_AUTH:
1627       OnVoiceChannelError(ssrc, (mode == SrtpFilter::PROTECT) ?
1628                           VoiceMediaChannel::ERROR_REC_SRTP_AUTH_FAILED :
1629                           VoiceMediaChannel::ERROR_PLAY_SRTP_AUTH_FAILED);
1630       break;
1631     case SrtpFilter::ERROR_REPLAY:
1632       // Only receving channel should have this error.
1633       ASSERT(mode == SrtpFilter::UNPROTECT);
1634       OnVoiceChannelError(ssrc, VoiceMediaChannel::ERROR_PLAY_SRTP_REPLAY);
1635       break;
1636     default:
1637       break;
1638   }
1639 }
1640 
GetSrtpCiphers(std::vector<std::string> * ciphers) const1641 void VoiceChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const {
1642   GetSupportedAudioCryptoSuites(ciphers);
1643 }
1644 
VideoChannel(talk_base::Thread * thread,MediaEngineInterface * media_engine,VideoMediaChannel * media_channel,BaseSession * session,const std::string & content_name,bool rtcp,VoiceChannel * voice_channel)1645 VideoChannel::VideoChannel(talk_base::Thread* thread,
1646                            MediaEngineInterface* media_engine,
1647                            VideoMediaChannel* media_channel,
1648                            BaseSession* session,
1649                            const std::string& content_name,
1650                            bool rtcp,
1651                            VoiceChannel* voice_channel)
1652     : BaseChannel(thread, media_engine, media_channel, session, content_name,
1653                   rtcp),
1654       voice_channel_(voice_channel),
1655       renderer_(NULL),
1656       screencapture_factory_(CreateScreenCapturerFactory()),
1657       previous_we_(talk_base::WE_CLOSE) {
1658 }
1659 
Init()1660 bool VideoChannel::Init() {
1661   TransportChannel* rtcp_channel = rtcp() ? session()->CreateChannel(
1662       content_name(), "video_rtcp", ICE_CANDIDATE_COMPONENT_RTCP) : NULL;
1663   if (!BaseChannel::Init(session()->CreateChannel(
1664           content_name(), "video_rtp", ICE_CANDIDATE_COMPONENT_RTP),
1665           rtcp_channel)) {
1666     return false;
1667   }
1668   media_channel()->SignalMediaError.connect(
1669       this, &VideoChannel::OnVideoChannelError);
1670   srtp_filter()->SignalSrtpError.connect(
1671       this, &VideoChannel::OnSrtpError);
1672   return true;
1673 }
1674 
SendLastMediaError()1675 void VoiceChannel::SendLastMediaError() {
1676   uint32 ssrc;
1677   VoiceMediaChannel::Error error;
1678   media_channel()->GetLastMediaError(&ssrc, &error);
1679   SignalMediaError(this, ssrc, error);
1680 }
1681 
~VideoChannel()1682 VideoChannel::~VideoChannel() {
1683   std::vector<uint32> screencast_ssrcs;
1684   ScreencastMap::iterator iter;
1685   while (!screencast_capturers_.empty()) {
1686     if (!RemoveScreencast(screencast_capturers_.begin()->first)) {
1687       LOG(LS_ERROR) << "Unable to delete screencast with ssrc "
1688                     << screencast_capturers_.begin()->first;
1689       ASSERT(false);
1690       break;
1691     }
1692   }
1693 
1694   StopMediaMonitor();
1695   // this can't be done in the base class, since it calls a virtual
1696   DisableMedia_w();
1697 
1698   Deinit();
1699 }
1700 
SetRenderer(uint32 ssrc,VideoRenderer * renderer)1701 bool VideoChannel::SetRenderer(uint32 ssrc, VideoRenderer* renderer) {
1702   worker_thread()->Invoke<void>(Bind(
1703       &VideoMediaChannel::SetRenderer, media_channel(), ssrc, renderer));
1704   return true;
1705 }
1706 
ApplyViewRequest(const ViewRequest & request)1707 bool VideoChannel::ApplyViewRequest(const ViewRequest& request) {
1708   return InvokeOnWorker(Bind(&VideoChannel::ApplyViewRequest_w, this, request));
1709 }
1710 
AddScreencast(uint32 ssrc,const ScreencastId & id)1711 VideoCapturer* VideoChannel::AddScreencast(
1712     uint32 ssrc, const ScreencastId& id) {
1713   return worker_thread()->Invoke<VideoCapturer*>(Bind(
1714       &VideoChannel::AddScreencast_w, this, ssrc, id));
1715 }
1716 
SetCapturer(uint32 ssrc,VideoCapturer * capturer)1717 bool VideoChannel::SetCapturer(uint32 ssrc, VideoCapturer* capturer) {
1718   return InvokeOnWorker(Bind(&VideoMediaChannel::SetCapturer,
1719                              media_channel(), ssrc, capturer));
1720 }
1721 
RemoveScreencast(uint32 ssrc)1722 bool VideoChannel::RemoveScreencast(uint32 ssrc) {
1723   return InvokeOnWorker(Bind(&VideoChannel::RemoveScreencast_w, this, ssrc));
1724 }
1725 
IsScreencasting()1726 bool VideoChannel::IsScreencasting() {
1727   return InvokeOnWorker(Bind(&VideoChannel::IsScreencasting_w, this));
1728 }
1729 
GetScreencastFps(uint32 ssrc)1730 int VideoChannel::GetScreencastFps(uint32 ssrc) {
1731   ScreencastDetailsData data(ssrc);
1732   worker_thread()->Invoke<void>(Bind(
1733       &VideoChannel::GetScreencastDetails_w, this, &data));
1734   return data.fps;
1735 }
1736 
GetScreencastMaxPixels(uint32 ssrc)1737 int VideoChannel::GetScreencastMaxPixels(uint32 ssrc) {
1738   ScreencastDetailsData data(ssrc);
1739   worker_thread()->Invoke<void>(Bind(
1740       &VideoChannel::GetScreencastDetails_w, this, &data));
1741   return data.screencast_max_pixels;
1742 }
1743 
SendIntraFrame()1744 bool VideoChannel::SendIntraFrame() {
1745   worker_thread()->Invoke<void>(Bind(
1746       &VideoMediaChannel::SendIntraFrame, media_channel()));
1747   return true;
1748 }
1749 
RequestIntraFrame()1750 bool VideoChannel::RequestIntraFrame() {
1751   worker_thread()->Invoke<void>(Bind(
1752       &VideoMediaChannel::RequestIntraFrame, media_channel()));
1753   return true;
1754 }
1755 
SetScreenCaptureFactory(ScreenCapturerFactory * screencapture_factory)1756 void VideoChannel::SetScreenCaptureFactory(
1757     ScreenCapturerFactory* screencapture_factory) {
1758   worker_thread()->Invoke<void>(Bind(
1759       &VideoChannel::SetScreenCaptureFactory_w,
1760       this, screencapture_factory));
1761 }
1762 
ChangeState()1763 void VideoChannel::ChangeState() {
1764   // Render incoming data if we're the active call, and we have the local
1765   // content. We receive data on the default channel and multiplexed streams.
1766   bool recv = IsReadyToReceive();
1767   if (!media_channel()->SetRender(recv)) {
1768     LOG(LS_ERROR) << "Failed to SetRender on video channel";
1769     // TODO(gangji): Report error back to server.
1770   }
1771 
1772   // Send outgoing data if we're the active call, we have the remote content,
1773   // and we have had some form of connectivity.
1774   bool send = IsReadyToSend();
1775   if (!media_channel()->SetSend(send)) {
1776     LOG(LS_ERROR) << "Failed to SetSend on video channel";
1777     // TODO(gangji): Report error back to server.
1778   }
1779 
1780   LOG(LS_INFO) << "Changing video state, recv=" << recv << " send=" << send;
1781 }
1782 
GetStats(const StatsOptions & options,VideoMediaInfo * stats)1783 bool VideoChannel::GetStats(
1784     const StatsOptions& options, VideoMediaInfo* stats) {
1785   return InvokeOnWorker(Bind(&VideoMediaChannel::GetStats,
1786                              media_channel(), options, stats));
1787 }
1788 
StartMediaMonitor(int cms)1789 void VideoChannel::StartMediaMonitor(int cms) {
1790   media_monitor_.reset(new VideoMediaMonitor(media_channel(), worker_thread(),
1791       talk_base::Thread::Current()));
1792   media_monitor_->SignalUpdate.connect(
1793       this, &VideoChannel::OnMediaMonitorUpdate);
1794   media_monitor_->Start(cms);
1795 }
1796 
StopMediaMonitor()1797 void VideoChannel::StopMediaMonitor() {
1798   if (media_monitor_) {
1799     media_monitor_->Stop();
1800     media_monitor_.reset();
1801   }
1802 }
1803 
GetFirstContent(const SessionDescription * sdesc)1804 const ContentInfo* VideoChannel::GetFirstContent(
1805     const SessionDescription* sdesc) {
1806   return GetFirstVideoContent(sdesc);
1807 }
1808 
SetLocalContent_w(const MediaContentDescription * content,ContentAction action,std::string * error_desc)1809 bool VideoChannel::SetLocalContent_w(const MediaContentDescription* content,
1810                                      ContentAction action,
1811                                      std::string* error_desc) {
1812   ASSERT(worker_thread() == talk_base::Thread::Current());
1813   LOG(LS_INFO) << "Setting local video description";
1814 
1815   const VideoContentDescription* video =
1816       static_cast<const VideoContentDescription*>(content);
1817   ASSERT(video != NULL);
1818   if (!video) {
1819     SafeSetError("Can't find video content in local description.", error_desc);
1820     return false;
1821   }
1822 
1823   bool ret = SetBaseLocalContent_w(content, action, error_desc);
1824   // Set local video codecs (what we want to receive).
1825   if (action != CA_UPDATE || video->has_codecs()) {
1826     if (!media_channel()->SetRecvCodecs(video->codecs())) {
1827       SafeSetError("Failed to set video receive codecs.", error_desc);
1828       ret = false;
1829     }
1830   }
1831 
1832   if (action != CA_UPDATE) {
1833     VideoOptions video_options;
1834     media_channel()->GetOptions(&video_options);
1835     video_options.buffered_mode_latency.Set(video->buffered_mode_latency());
1836 
1837     if (!media_channel()->SetOptions(video_options)) {
1838       // Log an error on failure, but don't abort the call.
1839       LOG(LS_ERROR) << "Failed to set video channel options";
1840     }
1841   }
1842 
1843   // If everything worked, see if we can start receiving.
1844   if (ret) {
1845     std::vector<VideoCodec>::const_iterator it = video->codecs().begin();
1846     for (; it != video->codecs().end(); ++it) {
1847       bundle_filter()->AddPayloadType(it->id);
1848     }
1849     ChangeState();
1850   } else {
1851     LOG(LS_WARNING) << "Failed to set local video description";
1852   }
1853   return ret;
1854 }
1855 
SetRemoteContent_w(const MediaContentDescription * content,ContentAction action,std::string * error_desc)1856 bool VideoChannel::SetRemoteContent_w(const MediaContentDescription* content,
1857                                       ContentAction action,
1858                                       std::string* error_desc) {
1859   ASSERT(worker_thread() == talk_base::Thread::Current());
1860   LOG(LS_INFO) << "Setting remote video description";
1861 
1862   const VideoContentDescription* video =
1863       static_cast<const VideoContentDescription*>(content);
1864   ASSERT(video != NULL);
1865   if (!video) {
1866     SafeSetError("Can't find video content in remote description.", error_desc);
1867     return false;
1868   }
1869 
1870   bool ret = true;
1871   // Set remote video codecs (what the other side wants to receive).
1872   if (action != CA_UPDATE || video->has_codecs()) {
1873     if (!media_channel()->SetSendCodecs(video->codecs())) {
1874       SafeSetError("Failed to set video send codecs.", error_desc);
1875       ret = false;
1876     }
1877   }
1878 
1879   ret &= SetBaseRemoteContent_w(content, action, error_desc);
1880 
1881   if (action != CA_UPDATE) {
1882     // Tweak our video processing settings, if needed.
1883     VideoOptions video_options;
1884     media_channel()->GetOptions(&video_options);
1885     if (video->conference_mode()) {
1886       video_options.conference_mode.Set(true);
1887     }
1888     video_options.buffered_mode_latency.Set(video->buffered_mode_latency());
1889 
1890     if (!media_channel()->SetOptions(video_options)) {
1891       // Log an error on failure, but don't abort the call.
1892       LOG(LS_ERROR) << "Failed to set video channel options";
1893     }
1894   }
1895 
1896   // If everything worked, see if we can start sending.
1897   if (ret) {
1898     ChangeState();
1899   } else {
1900     LOG(LS_WARNING) << "Failed to set remote video description";
1901   }
1902   return ret;
1903 }
1904 
ApplyViewRequest_w(const ViewRequest & request)1905 bool VideoChannel::ApplyViewRequest_w(const ViewRequest& request) {
1906   bool ret = true;
1907   // Set the send format for each of the local streams. If the view request
1908   // does not contain a local stream, set its send format to 0x0, which will
1909   // drop all frames.
1910   for (std::vector<StreamParams>::const_iterator it = local_streams().begin();
1911       it != local_streams().end(); ++it) {
1912     VideoFormat format(0, 0, 0, cricket::FOURCC_I420);
1913     StaticVideoViews::const_iterator view;
1914     for (view = request.static_video_views.begin();
1915          view != request.static_video_views.end(); ++view) {
1916       if (view->selector.Matches(*it)) {
1917         format.width = view->width;
1918         format.height = view->height;
1919         format.interval = cricket::VideoFormat::FpsToInterval(view->framerate);
1920         break;
1921       }
1922     }
1923 
1924     ret &= media_channel()->SetSendStreamFormat(it->first_ssrc(), format);
1925   }
1926 
1927   // Check if the view request has invalid streams.
1928   for (StaticVideoViews::const_iterator it = request.static_video_views.begin();
1929       it != request.static_video_views.end(); ++it) {
1930     if (!GetStream(local_streams(), it->selector, NULL)) {
1931       LOG(LS_WARNING) << "View request for ("
1932                       << it->selector.ssrc << ", '"
1933                       << it->selector.groupid << "', '"
1934                       << it->selector.streamid << "'"
1935                       << ") is not in the local streams.";
1936     }
1937   }
1938 
1939   return ret;
1940 }
1941 
AddScreencast_w(uint32 ssrc,const ScreencastId & id)1942 VideoCapturer* VideoChannel::AddScreencast_w(
1943     uint32 ssrc, const ScreencastId& id) {
1944   if (screencast_capturers_.find(ssrc) != screencast_capturers_.end()) {
1945     return NULL;
1946   }
1947   VideoCapturer* screen_capturer =
1948       screencapture_factory_->CreateScreenCapturer(id);
1949   if (!screen_capturer) {
1950     return NULL;
1951   }
1952   screen_capturer->SignalStateChange.connect(this,
1953                                              &VideoChannel::OnStateChange);
1954   screencast_capturers_[ssrc] = screen_capturer;
1955   return screen_capturer;
1956 }
1957 
RemoveScreencast_w(uint32 ssrc)1958 bool VideoChannel::RemoveScreencast_w(uint32 ssrc) {
1959   ScreencastMap::iterator iter = screencast_capturers_.find(ssrc);
1960   if (iter  == screencast_capturers_.end()) {
1961     return false;
1962   }
1963   // Clean up VideoCapturer.
1964   delete iter->second;
1965   screencast_capturers_.erase(iter);
1966   return true;
1967 }
1968 
IsScreencasting_w() const1969 bool VideoChannel::IsScreencasting_w() const {
1970   return !screencast_capturers_.empty();
1971 }
1972 
GetScreencastDetails_w(ScreencastDetailsData * data) const1973 void VideoChannel::GetScreencastDetails_w(
1974     ScreencastDetailsData* data) const {
1975   ScreencastMap::const_iterator iter = screencast_capturers_.find(data->ssrc);
1976   if (iter == screencast_capturers_.end()) {
1977     return;
1978   }
1979   VideoCapturer* capturer = iter->second;
1980   const VideoFormat* video_format = capturer->GetCaptureFormat();
1981   data->fps = VideoFormat::IntervalToFps(video_format->interval);
1982   data->screencast_max_pixels = capturer->screencast_max_pixels();
1983 }
1984 
SetScreenCaptureFactory_w(ScreenCapturerFactory * screencapture_factory)1985 void VideoChannel::SetScreenCaptureFactory_w(
1986     ScreenCapturerFactory* screencapture_factory) {
1987   if (screencapture_factory == NULL) {
1988     screencapture_factory_.reset(CreateScreenCapturerFactory());
1989   } else {
1990     screencapture_factory_.reset(screencapture_factory);
1991   }
1992 }
1993 
OnScreencastWindowEvent_s(uint32 ssrc,talk_base::WindowEvent we)1994 void VideoChannel::OnScreencastWindowEvent_s(uint32 ssrc,
1995                                              talk_base::WindowEvent we) {
1996   ASSERT(signaling_thread() == talk_base::Thread::Current());
1997   SignalScreencastWindowEvent(ssrc, we);
1998 }
1999 
SetChannelOptions(const VideoOptions & options)2000 bool VideoChannel::SetChannelOptions(const VideoOptions &options) {
2001   return InvokeOnWorker(Bind(&VideoMediaChannel::SetOptions,
2002                              media_channel(), options));
2003 }
2004 
OnMessage(talk_base::Message * pmsg)2005 void VideoChannel::OnMessage(talk_base::Message *pmsg) {
2006   switch (pmsg->message_id) {
2007     case MSG_SCREENCASTWINDOWEVENT: {
2008       const ScreencastEventMessageData* data =
2009           static_cast<ScreencastEventMessageData*>(pmsg->pdata);
2010       OnScreencastWindowEvent_s(data->ssrc, data->event);
2011       delete data;
2012       break;
2013     }
2014     case MSG_CHANNEL_ERROR: {
2015       const VideoChannelErrorMessageData* data =
2016           static_cast<VideoChannelErrorMessageData*>(pmsg->pdata);
2017       SignalMediaError(this, data->ssrc, data->error);
2018       delete data;
2019       break;
2020     }
2021     default:
2022       BaseChannel::OnMessage(pmsg);
2023       break;
2024   }
2025 }
2026 
OnConnectionMonitorUpdate(SocketMonitor * monitor,const std::vector<ConnectionInfo> & infos)2027 void VideoChannel::OnConnectionMonitorUpdate(
2028     SocketMonitor *monitor, const std::vector<ConnectionInfo> &infos) {
2029   SignalConnectionMonitor(this, infos);
2030 }
2031 
2032 // TODO(pthatcher): Look into removing duplicate code between
2033 // audio, video, and data, perhaps by using templates.
OnMediaMonitorUpdate(VideoMediaChannel * media_channel,const VideoMediaInfo & info)2034 void VideoChannel::OnMediaMonitorUpdate(
2035     VideoMediaChannel* media_channel, const VideoMediaInfo &info) {
2036   ASSERT(media_channel == this->media_channel());
2037   SignalMediaMonitor(this, info);
2038 }
2039 
OnScreencastWindowEvent(uint32 ssrc,talk_base::WindowEvent event)2040 void VideoChannel::OnScreencastWindowEvent(uint32 ssrc,
2041                                            talk_base::WindowEvent event) {
2042   ScreencastEventMessageData* pdata =
2043       new ScreencastEventMessageData(ssrc, event);
2044   signaling_thread()->Post(this, MSG_SCREENCASTWINDOWEVENT, pdata);
2045 }
2046 
OnStateChange(VideoCapturer * capturer,CaptureState ev)2047 void VideoChannel::OnStateChange(VideoCapturer* capturer, CaptureState ev) {
2048   // Map capturer events to window events. In the future we may want to simply
2049   // pass these events up directly.
2050   talk_base::WindowEvent we;
2051   if (ev == CS_STOPPED) {
2052     we = talk_base::WE_CLOSE;
2053   } else if (ev == CS_PAUSED) {
2054     we = talk_base::WE_MINIMIZE;
2055   } else if (ev == CS_RUNNING && previous_we_ == talk_base::WE_MINIMIZE) {
2056     we = talk_base::WE_RESTORE;
2057   } else {
2058     return;
2059   }
2060   previous_we_ = we;
2061 
2062   uint32 ssrc = 0;
2063   if (!GetLocalSsrc(capturer, &ssrc)) {
2064     return;
2065   }
2066 
2067   OnScreencastWindowEvent(ssrc, we);
2068 }
2069 
GetLocalSsrc(const VideoCapturer * capturer,uint32 * ssrc)2070 bool VideoChannel::GetLocalSsrc(const VideoCapturer* capturer, uint32* ssrc) {
2071   *ssrc = 0;
2072   for (ScreencastMap::iterator iter = screencast_capturers_.begin();
2073        iter != screencast_capturers_.end(); ++iter) {
2074     if (iter->second == capturer) {
2075       *ssrc = iter->first;
2076       return true;
2077     }
2078   }
2079   return false;
2080 }
2081 
OnVideoChannelError(uint32 ssrc,VideoMediaChannel::Error error)2082 void VideoChannel::OnVideoChannelError(uint32 ssrc,
2083                                        VideoMediaChannel::Error error) {
2084   VideoChannelErrorMessageData* data = new VideoChannelErrorMessageData(
2085       ssrc, error);
2086   signaling_thread()->Post(this, MSG_CHANNEL_ERROR, data);
2087 }
2088 
OnSrtpError(uint32 ssrc,SrtpFilter::Mode mode,SrtpFilter::Error error)2089 void VideoChannel::OnSrtpError(uint32 ssrc, SrtpFilter::Mode mode,
2090                                SrtpFilter::Error error) {
2091   switch (error) {
2092     case SrtpFilter::ERROR_FAIL:
2093       OnVideoChannelError(ssrc, (mode == SrtpFilter::PROTECT) ?
2094                           VideoMediaChannel::ERROR_REC_SRTP_ERROR :
2095                           VideoMediaChannel::ERROR_PLAY_SRTP_ERROR);
2096       break;
2097     case SrtpFilter::ERROR_AUTH:
2098       OnVideoChannelError(ssrc, (mode == SrtpFilter::PROTECT) ?
2099                           VideoMediaChannel::ERROR_REC_SRTP_AUTH_FAILED :
2100                           VideoMediaChannel::ERROR_PLAY_SRTP_AUTH_FAILED);
2101       break;
2102     case SrtpFilter::ERROR_REPLAY:
2103       // Only receving channel should have this error.
2104       ASSERT(mode == SrtpFilter::UNPROTECT);
2105       // TODO(gangji): Turn on the signaling of replay error once we have
2106       // switched to the new mechanism for doing video retransmissions.
2107       // OnVideoChannelError(ssrc, VideoMediaChannel::ERROR_PLAY_SRTP_REPLAY);
2108       break;
2109     default:
2110       break;
2111   }
2112 }
2113 
2114 
GetSrtpCiphers(std::vector<std::string> * ciphers) const2115 void VideoChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const {
2116   GetSupportedVideoCryptoSuites(ciphers);
2117 }
2118 
DataChannel(talk_base::Thread * thread,DataMediaChannel * media_channel,BaseSession * session,const std::string & content_name,bool rtcp)2119 DataChannel::DataChannel(talk_base::Thread* thread,
2120                          DataMediaChannel* media_channel,
2121                          BaseSession* session,
2122                          const std::string& content_name,
2123                          bool rtcp)
2124     // MediaEngine is NULL
2125     : BaseChannel(thread, NULL, media_channel, session, content_name, rtcp),
2126       data_channel_type_(cricket::DCT_NONE),
2127       ready_to_send_data_(false) {
2128 }
2129 
~DataChannel()2130 DataChannel::~DataChannel() {
2131   StopMediaMonitor();
2132   // this can't be done in the base class, since it calls a virtual
2133   DisableMedia_w();
2134 
2135   Deinit();
2136 }
2137 
Init()2138 bool DataChannel::Init() {
2139   TransportChannel* rtcp_channel = rtcp() ? session()->CreateChannel(
2140       content_name(), "data_rtcp", ICE_CANDIDATE_COMPONENT_RTCP) : NULL;
2141   if (!BaseChannel::Init(session()->CreateChannel(
2142           content_name(), "data_rtp", ICE_CANDIDATE_COMPONENT_RTP),
2143           rtcp_channel)) {
2144     return false;
2145   }
2146   media_channel()->SignalDataReceived.connect(
2147       this, &DataChannel::OnDataReceived);
2148   media_channel()->SignalMediaError.connect(
2149       this, &DataChannel::OnDataChannelError);
2150   media_channel()->SignalReadyToSend.connect(
2151       this, &DataChannel::OnDataChannelReadyToSend);
2152   media_channel()->SignalStreamClosedRemotely.connect(
2153       this, &DataChannel::OnStreamClosedRemotely);
2154   srtp_filter()->SignalSrtpError.connect(
2155       this, &DataChannel::OnSrtpError);
2156   return true;
2157 }
2158 
SendData(const SendDataParams & params,const talk_base::Buffer & payload,SendDataResult * result)2159 bool DataChannel::SendData(const SendDataParams& params,
2160                            const talk_base::Buffer& payload,
2161                            SendDataResult* result) {
2162   return InvokeOnWorker(Bind(&DataMediaChannel::SendData,
2163                              media_channel(), params, payload, result));
2164 }
2165 
GetFirstContent(const SessionDescription * sdesc)2166 const ContentInfo* DataChannel::GetFirstContent(
2167     const SessionDescription* sdesc) {
2168   return GetFirstDataContent(sdesc);
2169 }
2170 
2171 
IsRtpPacket(const talk_base::Buffer * packet)2172 static bool IsRtpPacket(const talk_base::Buffer* packet) {
2173   int version;
2174   if (!GetRtpVersion(packet->data(), packet->length(), &version)) {
2175     return false;
2176   }
2177 
2178   return version == 2;
2179 }
2180 
WantsPacket(bool rtcp,talk_base::Buffer * packet)2181 bool DataChannel::WantsPacket(bool rtcp, talk_base::Buffer* packet) {
2182   if (data_channel_type_ == DCT_SCTP) {
2183     // TODO(pthatcher): Do this in a more robust way by checking for
2184     // SCTP or DTLS.
2185     return !IsRtpPacket(packet);
2186   } else if (data_channel_type_ == DCT_RTP) {
2187     return BaseChannel::WantsPacket(rtcp, packet);
2188   }
2189   return false;
2190 }
2191 
SetDataChannelType(DataChannelType new_data_channel_type,std::string * error_desc)2192 bool DataChannel::SetDataChannelType(DataChannelType new_data_channel_type,
2193                                      std::string* error_desc) {
2194   // It hasn't been set before, so set it now.
2195   if (data_channel_type_ == DCT_NONE) {
2196     data_channel_type_ = new_data_channel_type;
2197     return true;
2198   }
2199 
2200   // It's been set before, but doesn't match.  That's bad.
2201   if (data_channel_type_ != new_data_channel_type) {
2202     std::ostringstream desc;
2203     desc << "Data channel type mismatch."
2204          << " Expected " << data_channel_type_
2205          << " Got " << new_data_channel_type;
2206     SafeSetError(desc.str(), error_desc);
2207     return false;
2208   }
2209 
2210   // It's hasn't changed.  Nothing to do.
2211   return true;
2212 }
2213 
SetDataChannelTypeFromContent(const DataContentDescription * content,std::string * error_desc)2214 bool DataChannel::SetDataChannelTypeFromContent(
2215     const DataContentDescription* content,
2216     std::string* error_desc) {
2217   bool is_sctp = ((content->protocol() == kMediaProtocolSctp) ||
2218                   (content->protocol() == kMediaProtocolDtlsSctp));
2219   DataChannelType data_channel_type = is_sctp ? DCT_SCTP : DCT_RTP;
2220   return SetDataChannelType(data_channel_type, error_desc);
2221 }
2222 
SetLocalContent_w(const MediaContentDescription * content,ContentAction action,std::string * error_desc)2223 bool DataChannel::SetLocalContent_w(const MediaContentDescription* content,
2224                                     ContentAction action,
2225                                     std::string* error_desc) {
2226   ASSERT(worker_thread() == talk_base::Thread::Current());
2227   LOG(LS_INFO) << "Setting local data description";
2228 
2229   const DataContentDescription* data =
2230       static_cast<const DataContentDescription*>(content);
2231   ASSERT(data != NULL);
2232   if (!data) {
2233     SafeSetError("Can't find data content in local description.", error_desc);
2234     return false;
2235   }
2236 
2237   bool ret = false;
2238   if (!SetDataChannelTypeFromContent(data, error_desc)) {
2239     return false;
2240   }
2241 
2242   if (data_channel_type_ == DCT_SCTP) {
2243     // SCTP data channels don't need the rest of the stuff.
2244     ret = UpdateLocalStreams_w(data->streams(), action, error_desc);
2245     if (ret) {
2246       set_local_content_direction(content->direction());
2247       // As in SetRemoteContent_w, make sure we set the local SCTP port
2248       // number as specified in our DataContentDescription.
2249       if (!media_channel()->SetRecvCodecs(data->codecs())) {
2250         SafeSetError("Failed to set data receive codecs.", error_desc);
2251         ret = false;
2252       }
2253     }
2254   } else {
2255     ret = SetBaseLocalContent_w(content, action, error_desc);
2256     if (action != CA_UPDATE || data->has_codecs()) {
2257       if (!media_channel()->SetRecvCodecs(data->codecs())) {
2258         SafeSetError("Failed to set data receive codecs.", error_desc);
2259         ret = false;
2260       }
2261     }
2262   }
2263 
2264   // If everything worked, see if we can start receiving.
2265   if (ret) {
2266     std::vector<DataCodec>::const_iterator it = data->codecs().begin();
2267     for (; it != data->codecs().end(); ++it) {
2268       bundle_filter()->AddPayloadType(it->id);
2269     }
2270     ChangeState();
2271   } else {
2272     LOG(LS_WARNING) << "Failed to set local data description";
2273   }
2274   return ret;
2275 }
2276 
SetRemoteContent_w(const MediaContentDescription * content,ContentAction action,std::string * error_desc)2277 bool DataChannel::SetRemoteContent_w(const MediaContentDescription* content,
2278                                      ContentAction action,
2279                                      std::string* error_desc) {
2280   ASSERT(worker_thread() == talk_base::Thread::Current());
2281 
2282   const DataContentDescription* data =
2283       static_cast<const DataContentDescription*>(content);
2284   ASSERT(data != NULL);
2285   if (!data) {
2286     SafeSetError("Can't find data content in remote description.", error_desc);
2287     return false;
2288   }
2289 
2290   bool ret = true;
2291   if (!SetDataChannelTypeFromContent(data, error_desc)) {
2292     return false;
2293   }
2294 
2295   if (data_channel_type_ == DCT_SCTP) {
2296     LOG(LS_INFO) << "Setting SCTP remote data description";
2297     // SCTP data channels don't need the rest of the stuff.
2298     ret = UpdateRemoteStreams_w(content->streams(), action, error_desc);
2299     if (ret) {
2300       set_remote_content_direction(content->direction());
2301       // We send the SCTP port number (not to be confused with the underlying
2302       // UDP port number) as a codec parameter.  Make sure it gets there.
2303       if (!media_channel()->SetSendCodecs(data->codecs())) {
2304         SafeSetError("Failed to set data send codecs.", error_desc);
2305         ret = false;
2306       }
2307     }
2308   } else {
2309     // If the remote data doesn't have codecs and isn't an update, it
2310     // must be empty, so ignore it.
2311     if (action != CA_UPDATE && !data->has_codecs()) {
2312       return true;
2313     }
2314     LOG(LS_INFO) << "Setting remote data description";
2315 
2316     // Set remote video codecs (what the other side wants to receive).
2317     if (action != CA_UPDATE || data->has_codecs()) {
2318       if (!media_channel()->SetSendCodecs(data->codecs())) {
2319         SafeSetError("Failed to set data send codecs.", error_desc);
2320         ret = false;
2321       }
2322     }
2323 
2324     if (ret) {
2325       ret &= SetBaseRemoteContent_w(content, action, error_desc);
2326     }
2327 
2328     if (action != CA_UPDATE) {
2329       int bandwidth_bps = data->bandwidth();
2330       if (!media_channel()->SetMaxSendBandwidth(bandwidth_bps)) {
2331         std::ostringstream desc;
2332         desc << "Failed to set max send bandwidth for data content.";
2333         SafeSetError(desc.str(), error_desc);
2334         ret = false;
2335       }
2336     }
2337   }
2338 
2339   // If everything worked, see if we can start sending.
2340   if (ret) {
2341     ChangeState();
2342   } else {
2343     LOG(LS_WARNING) << "Failed to set remote data description";
2344   }
2345   return ret;
2346 }
2347 
ChangeState()2348 void DataChannel::ChangeState() {
2349   // Render incoming data if we're the active call, and we have the local
2350   // content. We receive data on the default channel and multiplexed streams.
2351   bool recv = IsReadyToReceive();
2352   if (!media_channel()->SetReceive(recv)) {
2353     LOG(LS_ERROR) << "Failed to SetReceive on data channel";
2354   }
2355 
2356   // Send outgoing data if we're the active call, we have the remote content,
2357   // and we have had some form of connectivity.
2358   bool send = IsReadyToSend();
2359   if (!media_channel()->SetSend(send)) {
2360     LOG(LS_ERROR) << "Failed to SetSend on data channel";
2361   }
2362 
2363   // Trigger SignalReadyToSendData asynchronously.
2364   OnDataChannelReadyToSend(send);
2365 
2366   LOG(LS_INFO) << "Changing data state, recv=" << recv << " send=" << send;
2367 }
2368 
OnMessage(talk_base::Message * pmsg)2369 void DataChannel::OnMessage(talk_base::Message *pmsg) {
2370   switch (pmsg->message_id) {
2371     case MSG_READYTOSENDDATA: {
2372       DataChannelReadyToSendMessageData* data =
2373           static_cast<DataChannelReadyToSendMessageData*>(pmsg->pdata);
2374       ready_to_send_data_ = data->data();
2375       SignalReadyToSendData(ready_to_send_data_);
2376       delete data;
2377       break;
2378     }
2379     case MSG_DATARECEIVED: {
2380       DataReceivedMessageData* data =
2381           static_cast<DataReceivedMessageData*>(pmsg->pdata);
2382       SignalDataReceived(this, data->params, data->payload);
2383       delete data;
2384       break;
2385     }
2386     case MSG_CHANNEL_ERROR: {
2387       const DataChannelErrorMessageData* data =
2388           static_cast<DataChannelErrorMessageData*>(pmsg->pdata);
2389       SignalMediaError(this, data->ssrc, data->error);
2390       delete data;
2391       break;
2392     }
2393     case MSG_STREAMCLOSEDREMOTELY: {
2394       talk_base::TypedMessageData<uint32>* data =
2395           static_cast<talk_base::TypedMessageData<uint32>*>(pmsg->pdata);
2396       SignalStreamClosedRemotely(data->data());
2397       delete data;
2398       break;
2399     }
2400     default:
2401       BaseChannel::OnMessage(pmsg);
2402       break;
2403   }
2404 }
2405 
OnConnectionMonitorUpdate(SocketMonitor * monitor,const std::vector<ConnectionInfo> & infos)2406 void DataChannel::OnConnectionMonitorUpdate(
2407     SocketMonitor* monitor, const std::vector<ConnectionInfo>& infos) {
2408   SignalConnectionMonitor(this, infos);
2409 }
2410 
StartMediaMonitor(int cms)2411 void DataChannel::StartMediaMonitor(int cms) {
2412   media_monitor_.reset(new DataMediaMonitor(media_channel(), worker_thread(),
2413       talk_base::Thread::Current()));
2414   media_monitor_->SignalUpdate.connect(
2415       this, &DataChannel::OnMediaMonitorUpdate);
2416   media_monitor_->Start(cms);
2417 }
2418 
StopMediaMonitor()2419 void DataChannel::StopMediaMonitor() {
2420   if (media_monitor_) {
2421     media_monitor_->Stop();
2422     media_monitor_->SignalUpdate.disconnect(this);
2423     media_monitor_.reset();
2424   }
2425 }
2426 
OnMediaMonitorUpdate(DataMediaChannel * media_channel,const DataMediaInfo & info)2427 void DataChannel::OnMediaMonitorUpdate(
2428     DataMediaChannel* media_channel, const DataMediaInfo& info) {
2429   ASSERT(media_channel == this->media_channel());
2430   SignalMediaMonitor(this, info);
2431 }
2432 
OnDataReceived(const ReceiveDataParams & params,const char * data,size_t len)2433 void DataChannel::OnDataReceived(
2434     const ReceiveDataParams& params, const char* data, size_t len) {
2435   DataReceivedMessageData* msg = new DataReceivedMessageData(
2436       params, data, len);
2437   signaling_thread()->Post(this, MSG_DATARECEIVED, msg);
2438 }
2439 
OnDataChannelError(uint32 ssrc,DataMediaChannel::Error err)2440 void DataChannel::OnDataChannelError(
2441     uint32 ssrc, DataMediaChannel::Error err) {
2442   DataChannelErrorMessageData* data = new DataChannelErrorMessageData(
2443       ssrc, err);
2444   signaling_thread()->Post(this, MSG_CHANNEL_ERROR, data);
2445 }
2446 
OnDataChannelReadyToSend(bool writable)2447 void DataChannel::OnDataChannelReadyToSend(bool writable) {
2448   // This is usded for congestion control to indicate that the stream is ready
2449   // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates
2450   // that the transport channel is ready.
2451   signaling_thread()->Post(this, MSG_READYTOSENDDATA,
2452                            new DataChannelReadyToSendMessageData(writable));
2453 }
2454 
OnSrtpError(uint32 ssrc,SrtpFilter::Mode mode,SrtpFilter::Error error)2455 void DataChannel::OnSrtpError(uint32 ssrc, SrtpFilter::Mode mode,
2456                               SrtpFilter::Error error) {
2457   switch (error) {
2458     case SrtpFilter::ERROR_FAIL:
2459       OnDataChannelError(ssrc, (mode == SrtpFilter::PROTECT) ?
2460                          DataMediaChannel::ERROR_SEND_SRTP_ERROR :
2461                          DataMediaChannel::ERROR_RECV_SRTP_ERROR);
2462       break;
2463     case SrtpFilter::ERROR_AUTH:
2464       OnDataChannelError(ssrc, (mode == SrtpFilter::PROTECT) ?
2465                          DataMediaChannel::ERROR_SEND_SRTP_AUTH_FAILED :
2466                          DataMediaChannel::ERROR_RECV_SRTP_AUTH_FAILED);
2467       break;
2468     case SrtpFilter::ERROR_REPLAY:
2469       // Only receving channel should have this error.
2470       ASSERT(mode == SrtpFilter::UNPROTECT);
2471       OnDataChannelError(ssrc, DataMediaChannel::ERROR_RECV_SRTP_REPLAY);
2472       break;
2473     default:
2474       break;
2475   }
2476 }
2477 
GetSrtpCiphers(std::vector<std::string> * ciphers) const2478 void DataChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const {
2479   GetSupportedDataCryptoSuites(ciphers);
2480 }
2481 
ShouldSetupDtlsSrtp() const2482 bool DataChannel::ShouldSetupDtlsSrtp() const {
2483   return (data_channel_type_ == DCT_RTP);
2484 }
2485 
OnStreamClosedRemotely(uint32 sid)2486 void DataChannel::OnStreamClosedRemotely(uint32 sid) {
2487   talk_base::TypedMessageData<uint32>* message =
2488       new talk_base::TypedMessageData<uint32>(sid);
2489   signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message);
2490 }
2491 
2492 }  // namespace cricket
2493