| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * libjingle | 2  * libjingle | 
| 3  * Copyright 2004 Google Inc. | 3  * Copyright 2004 Google Inc. | 
| 4  * | 4  * | 
| 5  * Redistribution and use in source and binary forms, with or without | 5  * Redistribution and use in source and binary forms, with or without | 
| 6  * modification, are permitted provided that the following conditions are met: | 6  * modification, are permitted provided that the following conditions are met: | 
| 7  * | 7  * | 
| 8  *  1. Redistributions of source code must retain the above copyright notice, | 8  *  1. Redistributions of source code must retain the above copyright notice, | 
| 9  *     this list of conditions and the following disclaimer. | 9  *     this list of conditions and the following disclaimer. | 
| 10  *  2. Redistributions in binary form must reproduce the above copyright notice, | 10  *  2. Redistributions in binary form must reproduce the above copyright notice, | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 45 #include "talk/session/media/mediamonitor.h" | 45 #include "talk/session/media/mediamonitor.h" | 
| 46 #include "talk/session/media/mediasession.h" | 46 #include "talk/session/media/mediasession.h" | 
| 47 #include "talk/session/media/rtcpmuxfilter.h" | 47 #include "talk/session/media/rtcpmuxfilter.h" | 
| 48 #include "talk/session/media/srtpfilter.h" | 48 #include "talk/session/media/srtpfilter.h" | 
| 49 #include "webrtc/base/asyncudpsocket.h" | 49 #include "webrtc/base/asyncudpsocket.h" | 
| 50 #include "webrtc/base/criticalsection.h" | 50 #include "webrtc/base/criticalsection.h" | 
| 51 #include "webrtc/base/network.h" | 51 #include "webrtc/base/network.h" | 
| 52 #include "webrtc/base/sigslot.h" | 52 #include "webrtc/base/sigslot.h" | 
| 53 #include "webrtc/base/window.h" | 53 #include "webrtc/base/window.h" | 
| 54 | 54 | 
|  | 55 namespace webrtc { | 
|  | 56 class MediaControllerInterface; | 
|  | 57 }  // namespace webrtc | 
|  | 58 | 
| 55 namespace cricket { | 59 namespace cricket { | 
| 56 | 60 | 
| 57 struct CryptoParams; | 61 struct CryptoParams; | 
| 58 class MediaContentDescription; | 62 class MediaContentDescription; | 
| 59 struct ViewRequest; | 63 struct ViewRequest; | 
| 60 | 64 | 
| 61 enum SinkType { | 65 enum SinkType { | 
| 62   SINK_PRE_CRYPTO,  // Sink packets before encryption or after decryption. | 66   SINK_PRE_CRYPTO,  // Sink packets before encryption or after decryption. | 
| 63   SINK_POST_CRYPTO  // Sink packets after encryption or before decryption. | 67   SINK_POST_CRYPTO  // Sink packets after encryption or before decryption. | 
| 64 }; | 68 }; | 
| 65 | 69 | 
| 66 // BaseChannel contains logic common to voice and video, including | 70 // BaseChannel contains logic common to voice and video, including | 
| 67 // enable, marshaling calls to a worker thread, and | 71 // enable, marshaling calls to a worker thread, and | 
| 68 // connection and media monitors. | 72 // connection and media monitors. | 
| 69 // | 73 // | 
| 70 // WARNING! SUBCLASSES MUST CALL Deinit() IN THEIR DESTRUCTORS! | 74 // WARNING! SUBCLASSES MUST CALL Deinit() IN THEIR DESTRUCTORS! | 
| 71 // This is required to avoid a data race between the destructor modifying the | 75 // This is required to avoid a data race between the destructor modifying the | 
| 72 // vtable, and the media channel's thread using BaseChannel as the | 76 // vtable, and the media channel's thread using BaseChannel as the | 
| 73 // NetworkInterface. | 77 // NetworkInterface. | 
| 74 | 78 | 
| 75 class BaseChannel | 79 class BaseChannel | 
| 76     : public rtc::MessageHandler, public sigslot::has_slots<>, | 80     : public rtc::MessageHandler, public sigslot::has_slots<>, | 
| 77       public MediaChannel::NetworkInterface, | 81       public MediaChannel::NetworkInterface, | 
| 78       public ConnectionStatsGetter { | 82       public ConnectionStatsGetter { | 
| 79  public: | 83  public: | 
| 80   BaseChannel(rtc::Thread* thread, | 84   BaseChannel(rtc::Thread* thread, | 
| 81               MediaChannel* channel, | 85               MediaChannel* channel, | 
|  | 86               webrtc::MediaControllerInterface* media_controller, | 
| 82               TransportController* transport_controller, | 87               TransportController* transport_controller, | 
| 83               const std::string& content_name, | 88               const std::string& content_name, | 
| 84               bool rtcp); | 89               bool rtcp); | 
| 85   virtual ~BaseChannel(); | 90   virtual ~BaseChannel(); | 
| 86   bool Init(); | 91   bool Init(); | 
| 87   // Deinit may be called multiple times and is simply ignored if it's alreay | 92   // Deinit may be called multiple times and is simply ignored if it's alreay | 
| 88   // done. | 93   // done. | 
| 89   void Deinit(); | 94   void Deinit(); | 
| 90 | 95 | 
| 91   rtc::Thread* worker_thread() const { return worker_thread_; } | 96   rtc::Thread* worker_thread() const { return worker_thread_; } | 
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 192   } | 197   } | 
| 193   bool rtcp_transport_enabled() const { return rtcp_transport_enabled_; } | 198   bool rtcp_transport_enabled() const { return rtcp_transport_enabled_; } | 
| 194 | 199 | 
| 195   void ConnectToTransportChannel(TransportChannel* tc); | 200   void ConnectToTransportChannel(TransportChannel* tc); | 
| 196   void DisconnectFromTransportChannel(TransportChannel* tc); | 201   void DisconnectFromTransportChannel(TransportChannel* tc); | 
| 197 | 202 | 
| 198   void FlushRtcpMessages(); | 203   void FlushRtcpMessages(); | 
| 199 | 204 | 
| 200   // NetworkInterface implementation, called by MediaEngine | 205   // NetworkInterface implementation, called by MediaEngine | 
| 201   virtual bool SendPacket(rtc::Buffer* packet, | 206   virtual bool SendPacket(rtc::Buffer* packet, | 
| 202                           rtc::DiffServCodePoint dscp); | 207                           const rtc::PacketOptions& options); | 
| 203   virtual bool SendRtcp(rtc::Buffer* packet, | 208   virtual bool SendRtcp(rtc::Buffer* packet, const rtc::PacketOptions& options); | 
| 204                         rtc::DiffServCodePoint dscp); |  | 
| 205 | 209 | 
| 206   // From TransportChannel | 210   // From TransportChannel | 
| 207   void OnWritableState(TransportChannel* channel); | 211   void OnWritableState(TransportChannel* channel); | 
| 208   virtual void OnChannelRead(TransportChannel* channel, | 212   virtual void OnChannelRead(TransportChannel* channel, | 
| 209                              const char* data, | 213                              const char* data, | 
| 210                              size_t len, | 214                              size_t len, | 
| 211                              const rtc::PacketTime& packet_time, | 215                              const rtc::PacketTime& packet_time, | 
| 212                              int flags); | 216                              int flags); | 
| 213   void OnReadyToSend(TransportChannel* channel); | 217   void OnReadyToSend(TransportChannel* channel); | 
| 214 | 218 | 
| 215   bool PacketIsRtcp(const TransportChannel* channel, const char* data, | 219   bool PacketIsRtcp(const TransportChannel* channel, const char* data, | 
| 216                     size_t len); | 220                     size_t len); | 
| 217   bool SendPacket(bool rtcp, rtc::Buffer* packet, | 221   bool SendPacket(bool rtcp, | 
| 218                   rtc::DiffServCodePoint dscp); | 222                   rtc::Buffer* packet, | 
|  | 223                   const rtc::PacketOptions& options); | 
| 219   virtual bool WantsPacket(bool rtcp, rtc::Buffer* packet); | 224   virtual bool WantsPacket(bool rtcp, rtc::Buffer* packet); | 
| 220   void HandlePacket(bool rtcp, rtc::Buffer* packet, | 225   void HandlePacket(bool rtcp, rtc::Buffer* packet, | 
| 221                     const rtc::PacketTime& packet_time); | 226                     const rtc::PacketTime& packet_time); | 
| 222 | 227 | 
| 223   void EnableMedia_w(); | 228   void EnableMedia_w(); | 
| 224   void DisableMedia_w(); | 229   void DisableMedia_w(); | 
| 225   void UpdateWritableState_w(); | 230   void UpdateWritableState_w(); | 
| 226   void ChannelWritable_w(); | 231   void ChannelWritable_w(); | 
| 227   void ChannelNotWritable_w(); | 232   void ChannelNotWritable_w(); | 
| 228   bool AddRecvStream_w(const StreamParams& sp); | 233   bool AddRecvStream_w(const StreamParams& sp); | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 254                                   ContentAction action, | 259                                   ContentAction action, | 
| 255                                   std::string* error_desc) = 0; | 260                                   std::string* error_desc) = 0; | 
| 256   bool SetRtpTransportParameters_w(const MediaContentDescription* content, | 261   bool SetRtpTransportParameters_w(const MediaContentDescription* content, | 
| 257                                    ContentAction action, | 262                                    ContentAction action, | 
| 258                                    ContentSource src, | 263                                    ContentSource src, | 
| 259                                    std::string* error_desc); | 264                                    std::string* error_desc); | 
| 260 | 265 | 
| 261   // Helper method to get RTP Absoulute SendTime extension header id if | 266   // Helper method to get RTP Absoulute SendTime extension header id if | 
| 262   // present in remote supported extensions list. | 267   // present in remote supported extensions list. | 
| 263   void MaybeCacheRtpAbsSendTimeHeaderExtension( | 268   void MaybeCacheRtpAbsSendTimeHeaderExtension( | 
| 264     const std::vector<RtpHeaderExtension>& extensions); | 269       const std::vector<RtpHeaderExtension>& extensions); | 
| 265 | 270 | 
| 266   bool CheckSrtpConfig(const std::vector<CryptoParams>& cryptos, | 271   bool CheckSrtpConfig(const std::vector<CryptoParams>& cryptos, | 
| 267                        bool* dtls, | 272                        bool* dtls, | 
| 268                        std::string* error_desc); | 273                        std::string* error_desc); | 
| 269   bool SetSrtp_w(const std::vector<CryptoParams>& params, | 274   bool SetSrtp_w(const std::vector<CryptoParams>& params, | 
| 270                  ContentAction action, | 275                  ContentAction action, | 
| 271                  ContentSource src, | 276                  ContentSource src, | 
| 272                  std::string* error_desc); | 277                  std::string* error_desc); | 
| 273   void ActivateRtcpMux_w(); | 278   void ActivateRtcpMux_w(); | 
| 274   bool SetRtcpMux_w(bool enable, | 279   bool SetRtcpMux_w(bool enable, | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 289   // Helper function for invoking bool-returning methods on the worker thread. | 294   // Helper function for invoking bool-returning methods on the worker thread. | 
| 290   template <class FunctorT> | 295   template <class FunctorT> | 
| 291   bool InvokeOnWorker(const FunctorT& functor) { | 296   bool InvokeOnWorker(const FunctorT& functor) { | 
| 292     return worker_thread_->Invoke<bool>(functor); | 297     return worker_thread_->Invoke<bool>(functor); | 
| 293   } | 298   } | 
| 294 | 299 | 
| 295  private: | 300  private: | 
| 296   rtc::Thread* worker_thread_; | 301   rtc::Thread* worker_thread_; | 
| 297   TransportController* transport_controller_; | 302   TransportController* transport_controller_; | 
| 298   MediaChannel* media_channel_; | 303   MediaChannel* media_channel_; | 
|  | 304   webrtc::MediaControllerInterface* const media_controller_; | 
| 299   std::vector<StreamParams> local_streams_; | 305   std::vector<StreamParams> local_streams_; | 
| 300   std::vector<StreamParams> remote_streams_; | 306   std::vector<StreamParams> remote_streams_; | 
| 301 | 307 | 
| 302   const std::string content_name_; | 308   const std::string content_name_; | 
| 303   std::string transport_name_; | 309   std::string transport_name_; | 
| 304   bool rtcp_transport_enabled_; | 310   bool rtcp_transport_enabled_; | 
| 305   TransportChannel* transport_channel_; | 311   TransportChannel* transport_channel_; | 
| 306   std::vector<std::pair<rtc::Socket::Option, int> > socket_options_; | 312   std::vector<std::pair<rtc::Socket::Option, int> > socket_options_; | 
| 307   TransportChannel* rtcp_transport_channel_; | 313   TransportChannel* rtcp_transport_channel_; | 
| 308   std::vector<std::pair<rtc::Socket::Option, int> > rtcp_socket_options_; | 314   std::vector<std::pair<rtc::Socket::Option, int> > rtcp_socket_options_; | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 323   int rtp_abs_sendtime_extn_id_; | 329   int rtp_abs_sendtime_extn_id_; | 
| 324 }; | 330 }; | 
| 325 | 331 | 
| 326 // VoiceChannel is a specialization that adds support for early media, DTMF, | 332 // VoiceChannel is a specialization that adds support for early media, DTMF, | 
| 327 // and input/output level monitoring. | 333 // and input/output level monitoring. | 
| 328 class VoiceChannel : public BaseChannel { | 334 class VoiceChannel : public BaseChannel { | 
| 329  public: | 335  public: | 
| 330   VoiceChannel(rtc::Thread* thread, | 336   VoiceChannel(rtc::Thread* thread, | 
| 331                MediaEngineInterface* media_engine, | 337                MediaEngineInterface* media_engine, | 
| 332                VoiceMediaChannel* channel, | 338                VoiceMediaChannel* channel, | 
|  | 339                webrtc::MediaControllerInterface* media_controller, | 
| 333                TransportController* transport_controller, | 340                TransportController* transport_controller, | 
| 334                const std::string& content_name, | 341                const std::string& content_name, | 
| 335                bool rtcp); | 342                bool rtcp); | 
| 336   ~VoiceChannel(); | 343   ~VoiceChannel(); | 
| 337   bool Init(); | 344   bool Init(); | 
| 338   bool SetRemoteRenderer(uint32 ssrc, AudioRenderer* renderer); | 345   bool SetRemoteRenderer(uint32 ssrc, AudioRenderer* renderer); | 
| 339 | 346 | 
| 340   // Configure sending media on the stream with SSRC |ssrc| | 347   // Configure sending media on the stream with SSRC |ssrc| | 
| 341   // If there is only one sending stream SSRC 0 can be used. | 348   // If there is only one sending stream SSRC 0 can be used. | 
| 342   bool SetAudioSend(uint32 ssrc, | 349   bool SetAudioSend(uint32 ssrc, | 
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 425   // Last AudioRecvParameters sent down to the media_channel() via | 432   // Last AudioRecvParameters sent down to the media_channel() via | 
| 426   // SetRecvParameters. | 433   // SetRecvParameters. | 
| 427   AudioRecvParameters last_recv_params_; | 434   AudioRecvParameters last_recv_params_; | 
| 428 }; | 435 }; | 
| 429 | 436 | 
| 430 // VideoChannel is a specialization for video. | 437 // VideoChannel is a specialization for video. | 
| 431 class VideoChannel : public BaseChannel { | 438 class VideoChannel : public BaseChannel { | 
| 432  public: | 439  public: | 
| 433   VideoChannel(rtc::Thread* thread, | 440   VideoChannel(rtc::Thread* thread, | 
| 434                VideoMediaChannel* channel, | 441                VideoMediaChannel* channel, | 
|  | 442                webrtc::MediaControllerInterface* media_controller, | 
| 435                TransportController* transport_controller, | 443                TransportController* transport_controller, | 
| 436                const std::string& content_name, | 444                const std::string& content_name, | 
| 437                bool rtcp); | 445                bool rtcp); | 
| 438   ~VideoChannel(); | 446   ~VideoChannel(); | 
| 439   bool Init(); | 447   bool Init(); | 
| 440 | 448 | 
| 441   // downcasts a MediaChannel | 449   // downcasts a MediaChannel | 
| 442   virtual VideoMediaChannel* media_channel() const { | 450   virtual VideoMediaChannel* media_channel() const { | 
| 443     return static_cast<VideoMediaChannel*>(BaseChannel::media_channel()); | 451     return static_cast<VideoMediaChannel*>(BaseChannel::media_channel()); | 
| 444   } | 452   } | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 464       SignalConnectionMonitor; | 472       SignalConnectionMonitor; | 
| 465 | 473 | 
| 466   void StartMediaMonitor(int cms); | 474   void StartMediaMonitor(int cms); | 
| 467   void StopMediaMonitor(); | 475   void StopMediaMonitor(); | 
| 468   sigslot::signal2<VideoChannel*, const VideoMediaInfo&> SignalMediaMonitor; | 476   sigslot::signal2<VideoChannel*, const VideoMediaInfo&> SignalMediaMonitor; | 
| 469   sigslot::signal2<uint32, rtc::WindowEvent> SignalScreencastWindowEvent; | 477   sigslot::signal2<uint32, rtc::WindowEvent> SignalScreencastWindowEvent; | 
| 470 | 478 | 
| 471   bool SendIntraFrame(); | 479   bool SendIntraFrame(); | 
| 472   bool RequestIntraFrame(); | 480   bool RequestIntraFrame(); | 
| 473 | 481 | 
| 474   // Configure sending media on the stream with SSRC |ssrc| |  | 
| 475   // If there is only one sending stream SSRC 0 can be used. |  | 
| 476   bool SetVideoSend(uint32 ssrc, bool enable, const VideoOptions* options); | 482   bool SetVideoSend(uint32 ssrc, bool enable, const VideoOptions* options); | 
| 477 | 483 | 
| 478  private: | 484  private: | 
| 479   typedef std::map<uint32, VideoCapturer*> ScreencastMap; | 485   typedef std::map<uint32, VideoCapturer*> ScreencastMap; | 
| 480   struct ScreencastDetailsData; | 486   struct ScreencastDetailsData; | 
| 481 | 487 | 
| 482   // overrides from BaseChannel | 488   // overrides from BaseChannel | 
| 483   virtual void ChangeState(); | 489   virtual void ChangeState(); | 
| 484   virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); | 490   virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); | 
| 485   virtual bool SetLocalContent_w(const MediaContentDescription* content, | 491   virtual bool SetLocalContent_w(const MediaContentDescription* content, | 
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 640   // SetSendParameters. | 646   // SetSendParameters. | 
| 641   DataSendParameters last_send_params_; | 647   DataSendParameters last_send_params_; | 
| 642   // Last DataRecvParameters sent down to the media_channel() via | 648   // Last DataRecvParameters sent down to the media_channel() via | 
| 643   // SetRecvParameters. | 649   // SetRecvParameters. | 
| 644   DataRecvParameters last_recv_params_; | 650   DataRecvParameters last_recv_params_; | 
| 645 }; | 651 }; | 
| 646 | 652 | 
| 647 }  // namespace cricket | 653 }  // namespace cricket | 
| 648 | 654 | 
| 649 #endif  // TALK_SESSION_MEDIA_CHANNEL_H_ | 655 #endif  // TALK_SESSION_MEDIA_CHANNEL_H_ | 
| OLD | NEW | 
|---|