| OLD | NEW |
| (Empty) |
| 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 #ifndef TALK_SESSION_MEDIA_CHANNEL_H_ | |
| 29 #define TALK_SESSION_MEDIA_CHANNEL_H_ | |
| 30 | |
| 31 #include <map> | |
| 32 #include <set> | |
| 33 #include <string> | |
| 34 #include <utility> | |
| 35 #include <vector> | |
| 36 | |
| 37 #include "talk/session/media/audiomonitor.h" | |
| 38 #include "talk/session/media/bundlefilter.h" | |
| 39 #include "talk/session/media/mediamonitor.h" | |
| 40 #include "talk/session/media/mediasession.h" | |
| 41 #include "talk/session/media/rtcpmuxfilter.h" | |
| 42 #include "talk/session/media/srtpfilter.h" | |
| 43 #include "webrtc/audio/audio_sink.h" | |
| 44 #include "webrtc/base/asyncudpsocket.h" | |
| 45 #include "webrtc/base/criticalsection.h" | |
| 46 #include "webrtc/base/network.h" | |
| 47 #include "webrtc/base/sigslot.h" | |
| 48 #include "webrtc/base/window.h" | |
| 49 #include "webrtc/media/base/mediachannel.h" | |
| 50 #include "webrtc/media/base/mediaengine.h" | |
| 51 #include "webrtc/media/base/streamparams.h" | |
| 52 #include "webrtc/media/base/videocapturer.h" | |
| 53 #include "webrtc/media/base/videosinkinterface.h" | |
| 54 #include "webrtc/p2p/base/transportcontroller.h" | |
| 55 #include "webrtc/p2p/client/socketmonitor.h" | |
| 56 | |
| 57 namespace webrtc { | |
| 58 class AudioSinkInterface; | |
| 59 } // namespace webrtc | |
| 60 | |
| 61 namespace cricket { | |
| 62 | |
| 63 struct CryptoParams; | |
| 64 class MediaContentDescription; | |
| 65 | |
| 66 enum SinkType { | |
| 67 SINK_PRE_CRYPTO, // Sink packets before encryption or after decryption. | |
| 68 SINK_POST_CRYPTO // Sink packets after encryption or before decryption. | |
| 69 }; | |
| 70 | |
| 71 // BaseChannel contains logic common to voice and video, including | |
| 72 // enable, marshaling calls to a worker thread, and | |
| 73 // connection and media monitors. | |
| 74 // | |
| 75 // WARNING! SUBCLASSES MUST CALL Deinit() IN THEIR DESTRUCTORS! | |
| 76 // This is required to avoid a data race between the destructor modifying the | |
| 77 // vtable, and the media channel's thread using BaseChannel as the | |
| 78 // NetworkInterface. | |
| 79 | |
| 80 class BaseChannel | |
| 81 : public rtc::MessageHandler, public sigslot::has_slots<>, | |
| 82 public MediaChannel::NetworkInterface, | |
| 83 public ConnectionStatsGetter { | |
| 84 public: | |
| 85 BaseChannel(rtc::Thread* thread, | |
| 86 MediaChannel* channel, | |
| 87 TransportController* transport_controller, | |
| 88 const std::string& content_name, | |
| 89 bool rtcp); | |
| 90 virtual ~BaseChannel(); | |
| 91 bool Init(); | |
| 92 // Deinit may be called multiple times and is simply ignored if it's alreay | |
| 93 // done. | |
| 94 void Deinit(); | |
| 95 | |
| 96 rtc::Thread* worker_thread() const { return worker_thread_; } | |
| 97 const std::string& content_name() const { return content_name_; } | |
| 98 const std::string& transport_name() const { return transport_name_; } | |
| 99 TransportChannel* transport_channel() const { | |
| 100 return transport_channel_; | |
| 101 } | |
| 102 TransportChannel* rtcp_transport_channel() const { | |
| 103 return rtcp_transport_channel_; | |
| 104 } | |
| 105 bool enabled() const { return enabled_; } | |
| 106 | |
| 107 // This function returns true if we are using SRTP. | |
| 108 bool secure() const { return srtp_filter_.IsActive(); } | |
| 109 // The following function returns true if we are using | |
| 110 // DTLS-based keying. If you turned off SRTP later, however | |
| 111 // you could have secure() == false and dtls_secure() == true. | |
| 112 bool secure_dtls() const { return dtls_keyed_; } | |
| 113 // This function returns true if we require secure channel for call setup. | |
| 114 bool secure_required() const { return secure_required_; } | |
| 115 | |
| 116 bool writable() const { return writable_; } | |
| 117 | |
| 118 // Activate RTCP mux, regardless of the state so far. Once | |
| 119 // activated, it can not be deactivated, and if the remote | |
| 120 // description doesn't support RTCP mux, setting the remote | |
| 121 // description will fail. | |
| 122 void ActivateRtcpMux(); | |
| 123 bool SetTransport(const std::string& transport_name); | |
| 124 bool PushdownLocalDescription(const SessionDescription* local_desc, | |
| 125 ContentAction action, | |
| 126 std::string* error_desc); | |
| 127 bool PushdownRemoteDescription(const SessionDescription* remote_desc, | |
| 128 ContentAction action, | |
| 129 std::string* error_desc); | |
| 130 // Channel control | |
| 131 bool SetLocalContent(const MediaContentDescription* content, | |
| 132 ContentAction action, | |
| 133 std::string* error_desc); | |
| 134 bool SetRemoteContent(const MediaContentDescription* content, | |
| 135 ContentAction action, | |
| 136 std::string* error_desc); | |
| 137 | |
| 138 bool Enable(bool enable); | |
| 139 | |
| 140 // Multiplexing | |
| 141 bool AddRecvStream(const StreamParams& sp); | |
| 142 bool RemoveRecvStream(uint32_t ssrc); | |
| 143 bool AddSendStream(const StreamParams& sp); | |
| 144 bool RemoveSendStream(uint32_t ssrc); | |
| 145 | |
| 146 // Monitoring | |
| 147 void StartConnectionMonitor(int cms); | |
| 148 void StopConnectionMonitor(); | |
| 149 // For ConnectionStatsGetter, used by ConnectionMonitor | |
| 150 bool GetConnectionStats(ConnectionInfos* infos) override; | |
| 151 | |
| 152 BundleFilter* bundle_filter() { return &bundle_filter_; } | |
| 153 | |
| 154 const std::vector<StreamParams>& local_streams() const { | |
| 155 return local_streams_; | |
| 156 } | |
| 157 const std::vector<StreamParams>& remote_streams() const { | |
| 158 return remote_streams_; | |
| 159 } | |
| 160 | |
| 161 sigslot::signal2<BaseChannel*, bool> SignalDtlsSetupFailure; | |
| 162 void SignalDtlsSetupFailure_w(bool rtcp); | |
| 163 void SignalDtlsSetupFailure_s(bool rtcp); | |
| 164 | |
| 165 // Used for latency measurements. | |
| 166 sigslot::signal1<BaseChannel*> SignalFirstPacketReceived; | |
| 167 | |
| 168 // Made public for easier testing. | |
| 169 void SetReadyToSend(bool rtcp, bool ready); | |
| 170 | |
| 171 // Only public for unit tests. Otherwise, consider protected. | |
| 172 int SetOption(SocketType type, rtc::Socket::Option o, int val) | |
| 173 override; | |
| 174 | |
| 175 SrtpFilter* srtp_filter() { return &srtp_filter_; } | |
| 176 | |
| 177 protected: | |
| 178 virtual MediaChannel* media_channel() const { return media_channel_; } | |
| 179 // Sets the |transport_channel_| (and |rtcp_transport_channel_|, if |rtcp_| is | |
| 180 // true). Gets the transport channels from |transport_controller_|. | |
| 181 bool SetTransport_w(const std::string& transport_name); | |
| 182 | |
| 183 void set_transport_channel(TransportChannel* transport); | |
| 184 void set_rtcp_transport_channel(TransportChannel* transport, | |
| 185 bool update_writablity); | |
| 186 | |
| 187 bool was_ever_writable() const { return was_ever_writable_; } | |
| 188 void set_local_content_direction(MediaContentDirection direction) { | |
| 189 local_content_direction_ = direction; | |
| 190 } | |
| 191 void set_remote_content_direction(MediaContentDirection direction) { | |
| 192 remote_content_direction_ = direction; | |
| 193 } | |
| 194 void set_secure_required(bool secure_required) { | |
| 195 secure_required_ = secure_required; | |
| 196 } | |
| 197 bool IsReadyToReceive() const; | |
| 198 bool IsReadyToSend() const; | |
| 199 rtc::Thread* signaling_thread() { | |
| 200 return transport_controller_->signaling_thread(); | |
| 201 } | |
| 202 bool rtcp_transport_enabled() const { return rtcp_transport_enabled_; } | |
| 203 | |
| 204 void ConnectToTransportChannel(TransportChannel* tc); | |
| 205 void DisconnectFromTransportChannel(TransportChannel* tc); | |
| 206 | |
| 207 void FlushRtcpMessages(); | |
| 208 | |
| 209 // NetworkInterface implementation, called by MediaEngine | |
| 210 bool SendPacket(rtc::Buffer* packet, | |
| 211 const rtc::PacketOptions& options) override; | |
| 212 bool SendRtcp(rtc::Buffer* packet, const rtc::PacketOptions& options) | |
| 213 override; | |
| 214 | |
| 215 // From TransportChannel | |
| 216 void OnWritableState(TransportChannel* channel); | |
| 217 virtual void OnChannelRead(TransportChannel* channel, | |
| 218 const char* data, | |
| 219 size_t len, | |
| 220 const rtc::PacketTime& packet_time, | |
| 221 int flags); | |
| 222 void OnReadyToSend(TransportChannel* channel); | |
| 223 | |
| 224 void OnDtlsState(TransportChannel* channel, DtlsTransportState state); | |
| 225 | |
| 226 bool PacketIsRtcp(const TransportChannel* channel, const char* data, | |
| 227 size_t len); | |
| 228 bool SendPacket(bool rtcp, | |
| 229 rtc::Buffer* packet, | |
| 230 const rtc::PacketOptions& options); | |
| 231 virtual bool WantsPacket(bool rtcp, rtc::Buffer* packet); | |
| 232 void HandlePacket(bool rtcp, rtc::Buffer* packet, | |
| 233 const rtc::PacketTime& packet_time); | |
| 234 | |
| 235 void EnableMedia_w(); | |
| 236 void DisableMedia_w(); | |
| 237 void UpdateWritableState_w(); | |
| 238 void ChannelWritable_w(); | |
| 239 void ChannelNotWritable_w(); | |
| 240 bool AddRecvStream_w(const StreamParams& sp); | |
| 241 bool RemoveRecvStream_w(uint32_t ssrc); | |
| 242 bool AddSendStream_w(const StreamParams& sp); | |
| 243 bool RemoveSendStream_w(uint32_t ssrc); | |
| 244 virtual bool ShouldSetupDtlsSrtp() const; | |
| 245 // Do the DTLS key expansion and impose it on the SRTP/SRTCP filters. | |
| 246 // |rtcp_channel| indicates whether to set up the RTP or RTCP filter. | |
| 247 bool SetupDtlsSrtp(bool rtcp_channel); | |
| 248 void MaybeSetupDtlsSrtp_w(); | |
| 249 // Set the DTLS-SRTP cipher policy on this channel as appropriate. | |
| 250 bool SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp); | |
| 251 | |
| 252 virtual void ChangeState() = 0; | |
| 253 | |
| 254 // Gets the content info appropriate to the channel (audio or video). | |
| 255 virtual const ContentInfo* GetFirstContent( | |
| 256 const SessionDescription* sdesc) = 0; | |
| 257 bool UpdateLocalStreams_w(const std::vector<StreamParams>& streams, | |
| 258 ContentAction action, | |
| 259 std::string* error_desc); | |
| 260 bool UpdateRemoteStreams_w(const std::vector<StreamParams>& streams, | |
| 261 ContentAction action, | |
| 262 std::string* error_desc); | |
| 263 virtual bool SetLocalContent_w(const MediaContentDescription* content, | |
| 264 ContentAction action, | |
| 265 std::string* error_desc) = 0; | |
| 266 virtual bool SetRemoteContent_w(const MediaContentDescription* content, | |
| 267 ContentAction action, | |
| 268 std::string* error_desc) = 0; | |
| 269 bool SetRtpTransportParameters_w(const MediaContentDescription* content, | |
| 270 ContentAction action, | |
| 271 ContentSource src, | |
| 272 std::string* error_desc); | |
| 273 | |
| 274 // Helper method to get RTP Absoulute SendTime extension header id if | |
| 275 // present in remote supported extensions list. | |
| 276 void MaybeCacheRtpAbsSendTimeHeaderExtension( | |
| 277 const std::vector<RtpHeaderExtension>& extensions); | |
| 278 | |
| 279 bool CheckSrtpConfig(const std::vector<CryptoParams>& cryptos, | |
| 280 bool* dtls, | |
| 281 std::string* error_desc); | |
| 282 bool SetSrtp_w(const std::vector<CryptoParams>& params, | |
| 283 ContentAction action, | |
| 284 ContentSource src, | |
| 285 std::string* error_desc); | |
| 286 void ActivateRtcpMux_w(); | |
| 287 bool SetRtcpMux_w(bool enable, | |
| 288 ContentAction action, | |
| 289 ContentSource src, | |
| 290 std::string* error_desc); | |
| 291 | |
| 292 // From MessageHandler | |
| 293 void OnMessage(rtc::Message* pmsg) override; | |
| 294 | |
| 295 // Handled in derived classes | |
| 296 // Get the SRTP crypto suites to use for RTP media | |
| 297 virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const = 0; | |
| 298 virtual void OnConnectionMonitorUpdate(ConnectionMonitor* monitor, | |
| 299 const std::vector<ConnectionInfo>& infos) = 0; | |
| 300 | |
| 301 // Helper function for invoking bool-returning methods on the worker thread. | |
| 302 template <class FunctorT> | |
| 303 bool InvokeOnWorker(const FunctorT& functor) { | |
| 304 return worker_thread_->Invoke<bool>(functor); | |
| 305 } | |
| 306 | |
| 307 private: | |
| 308 rtc::Thread* worker_thread_; | |
| 309 TransportController* transport_controller_; | |
| 310 MediaChannel* media_channel_; | |
| 311 std::vector<StreamParams> local_streams_; | |
| 312 std::vector<StreamParams> remote_streams_; | |
| 313 | |
| 314 const std::string content_name_; | |
| 315 std::string transport_name_; | |
| 316 bool rtcp_transport_enabled_; | |
| 317 TransportChannel* transport_channel_; | |
| 318 std::vector<std::pair<rtc::Socket::Option, int> > socket_options_; | |
| 319 TransportChannel* rtcp_transport_channel_; | |
| 320 std::vector<std::pair<rtc::Socket::Option, int> > rtcp_socket_options_; | |
| 321 SrtpFilter srtp_filter_; | |
| 322 RtcpMuxFilter rtcp_mux_filter_; | |
| 323 BundleFilter bundle_filter_; | |
| 324 rtc::scoped_ptr<ConnectionMonitor> connection_monitor_; | |
| 325 bool enabled_; | |
| 326 bool writable_; | |
| 327 bool rtp_ready_to_send_; | |
| 328 bool rtcp_ready_to_send_; | |
| 329 bool was_ever_writable_; | |
| 330 MediaContentDirection local_content_direction_; | |
| 331 MediaContentDirection remote_content_direction_; | |
| 332 bool has_received_packet_; | |
| 333 bool dtls_keyed_; | |
| 334 bool secure_required_; | |
| 335 int rtp_abs_sendtime_extn_id_; | |
| 336 }; | |
| 337 | |
| 338 // VoiceChannel is a specialization that adds support for early media, DTMF, | |
| 339 // and input/output level monitoring. | |
| 340 class VoiceChannel : public BaseChannel { | |
| 341 public: | |
| 342 VoiceChannel(rtc::Thread* thread, | |
| 343 MediaEngineInterface* media_engine, | |
| 344 VoiceMediaChannel* channel, | |
| 345 TransportController* transport_controller, | |
| 346 const std::string& content_name, | |
| 347 bool rtcp); | |
| 348 ~VoiceChannel(); | |
| 349 bool Init(); | |
| 350 | |
| 351 // Configure sending media on the stream with SSRC |ssrc| | |
| 352 // If there is only one sending stream SSRC 0 can be used. | |
| 353 bool SetAudioSend(uint32_t ssrc, | |
| 354 bool enable, | |
| 355 const AudioOptions* options, | |
| 356 AudioRenderer* renderer); | |
| 357 | |
| 358 // downcasts a MediaChannel | |
| 359 virtual VoiceMediaChannel* media_channel() const { | |
| 360 return static_cast<VoiceMediaChannel*>(BaseChannel::media_channel()); | |
| 361 } | |
| 362 | |
| 363 void SetEarlyMedia(bool enable); | |
| 364 // This signal is emitted when we have gone a period of time without | |
| 365 // receiving early media. When received, a UI should start playing its | |
| 366 // own ringing sound | |
| 367 sigslot::signal1<VoiceChannel*> SignalEarlyMediaTimeout; | |
| 368 | |
| 369 // Returns if the telephone-event has been negotiated. | |
| 370 bool CanInsertDtmf(); | |
| 371 // Send and/or play a DTMF |event| according to the |flags|. | |
| 372 // The DTMF out-of-band signal will be used on sending. | |
| 373 // The |ssrc| should be either 0 or a valid send stream ssrc. | |
| 374 // The valid value for the |event| are 0 which corresponding to DTMF | |
| 375 // event 0-9, *, #, A-D. | |
| 376 bool InsertDtmf(uint32_t ssrc, int event_code, int duration); | |
| 377 bool SetOutputVolume(uint32_t ssrc, double volume); | |
| 378 void SetRawAudioSink(uint32_t ssrc, | |
| 379 rtc::scoped_ptr<webrtc::AudioSinkInterface> sink); | |
| 380 | |
| 381 // Get statistics about the current media session. | |
| 382 bool GetStats(VoiceMediaInfo* stats); | |
| 383 | |
| 384 // Monitoring functions | |
| 385 sigslot::signal2<VoiceChannel*, const std::vector<ConnectionInfo>&> | |
| 386 SignalConnectionMonitor; | |
| 387 | |
| 388 void StartMediaMonitor(int cms); | |
| 389 void StopMediaMonitor(); | |
| 390 sigslot::signal2<VoiceChannel*, const VoiceMediaInfo&> SignalMediaMonitor; | |
| 391 | |
| 392 void StartAudioMonitor(int cms); | |
| 393 void StopAudioMonitor(); | |
| 394 bool IsAudioMonitorRunning() const; | |
| 395 sigslot::signal2<VoiceChannel*, const AudioInfo&> SignalAudioMonitor; | |
| 396 | |
| 397 int GetInputLevel_w(); | |
| 398 int GetOutputLevel_w(); | |
| 399 void GetActiveStreams_w(AudioInfo::StreamList* actives); | |
| 400 | |
| 401 private: | |
| 402 // overrides from BaseChannel | |
| 403 virtual void OnChannelRead(TransportChannel* channel, | |
| 404 const char* data, size_t len, | |
| 405 const rtc::PacketTime& packet_time, | |
| 406 int flags); | |
| 407 virtual void ChangeState(); | |
| 408 virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); | |
| 409 virtual bool SetLocalContent_w(const MediaContentDescription* content, | |
| 410 ContentAction action, | |
| 411 std::string* error_desc); | |
| 412 virtual bool SetRemoteContent_w(const MediaContentDescription* content, | |
| 413 ContentAction action, | |
| 414 std::string* error_desc); | |
| 415 void HandleEarlyMediaTimeout(); | |
| 416 bool InsertDtmf_w(uint32_t ssrc, int event, int duration); | |
| 417 bool SetOutputVolume_w(uint32_t ssrc, double volume); | |
| 418 bool GetStats_w(VoiceMediaInfo* stats); | |
| 419 | |
| 420 virtual void OnMessage(rtc::Message* pmsg); | |
| 421 virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const; | |
| 422 virtual void OnConnectionMonitorUpdate( | |
| 423 ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos); | |
| 424 virtual void OnMediaMonitorUpdate( | |
| 425 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info); | |
| 426 void OnAudioMonitorUpdate(AudioMonitor* monitor, const AudioInfo& info); | |
| 427 | |
| 428 static const int kEarlyMediaTimeout = 1000; | |
| 429 MediaEngineInterface* media_engine_; | |
| 430 bool received_media_; | |
| 431 rtc::scoped_ptr<VoiceMediaMonitor> media_monitor_; | |
| 432 rtc::scoped_ptr<AudioMonitor> audio_monitor_; | |
| 433 | |
| 434 // Last AudioSendParameters sent down to the media_channel() via | |
| 435 // SetSendParameters. | |
| 436 AudioSendParameters last_send_params_; | |
| 437 // Last AudioRecvParameters sent down to the media_channel() via | |
| 438 // SetRecvParameters. | |
| 439 AudioRecvParameters last_recv_params_; | |
| 440 }; | |
| 441 | |
| 442 // VideoChannel is a specialization for video. | |
| 443 class VideoChannel : public BaseChannel { | |
| 444 public: | |
| 445 VideoChannel(rtc::Thread* thread, | |
| 446 VideoMediaChannel* channel, | |
| 447 TransportController* transport_controller, | |
| 448 const std::string& content_name, | |
| 449 bool rtcp); | |
| 450 ~VideoChannel(); | |
| 451 bool Init(); | |
| 452 | |
| 453 // downcasts a MediaChannel | |
| 454 virtual VideoMediaChannel* media_channel() const { | |
| 455 return static_cast<VideoMediaChannel*>(BaseChannel::media_channel()); | |
| 456 } | |
| 457 | |
| 458 bool SetSink(uint32_t ssrc, rtc::VideoSinkInterface<VideoFrame>* sink); | |
| 459 | |
| 460 // TODO(pthatcher): Refactor to use a "capture id" instead of an | |
| 461 // ssrc here as the "key". | |
| 462 // Passes ownership of the capturer to the channel. | |
| 463 bool AddScreencast(uint32_t ssrc, VideoCapturer* capturer); | |
| 464 bool SetCapturer(uint32_t ssrc, VideoCapturer* capturer); | |
| 465 bool RemoveScreencast(uint32_t ssrc); | |
| 466 // True if we've added a screencast. Doesn't matter if the capturer | |
| 467 // has been started or not. | |
| 468 bool IsScreencasting(); | |
| 469 // Get statistics about the current media session. | |
| 470 bool GetStats(VideoMediaInfo* stats); | |
| 471 | |
| 472 sigslot::signal2<VideoChannel*, const std::vector<ConnectionInfo>&> | |
| 473 SignalConnectionMonitor; | |
| 474 | |
| 475 void StartMediaMonitor(int cms); | |
| 476 void StopMediaMonitor(); | |
| 477 sigslot::signal2<VideoChannel*, const VideoMediaInfo&> SignalMediaMonitor; | |
| 478 sigslot::signal2<uint32_t, rtc::WindowEvent> SignalScreencastWindowEvent; | |
| 479 | |
| 480 bool SetVideoSend(uint32_t ssrc, bool enable, const VideoOptions* options); | |
| 481 | |
| 482 private: | |
| 483 typedef std::map<uint32_t, VideoCapturer*> ScreencastMap; | |
| 484 | |
| 485 // overrides from BaseChannel | |
| 486 virtual void ChangeState(); | |
| 487 virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); | |
| 488 virtual bool SetLocalContent_w(const MediaContentDescription* content, | |
| 489 ContentAction action, | |
| 490 std::string* error_desc); | |
| 491 virtual bool SetRemoteContent_w(const MediaContentDescription* content, | |
| 492 ContentAction action, | |
| 493 std::string* error_desc); | |
| 494 | |
| 495 bool AddScreencast_w(uint32_t ssrc, VideoCapturer* capturer); | |
| 496 bool RemoveScreencast_w(uint32_t ssrc); | |
| 497 void OnScreencastWindowEvent_s(uint32_t ssrc, rtc::WindowEvent we); | |
| 498 bool IsScreencasting_w() const; | |
| 499 bool GetStats_w(VideoMediaInfo* stats); | |
| 500 | |
| 501 virtual void OnMessage(rtc::Message* pmsg); | |
| 502 virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const; | |
| 503 virtual void OnConnectionMonitorUpdate( | |
| 504 ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos); | |
| 505 virtual void OnMediaMonitorUpdate( | |
| 506 VideoMediaChannel* media_channel, const VideoMediaInfo& info); | |
| 507 virtual void OnScreencastWindowEvent(uint32_t ssrc, rtc::WindowEvent event); | |
| 508 virtual void OnStateChange(VideoCapturer* capturer, CaptureState ev); | |
| 509 bool GetLocalSsrc(const VideoCapturer* capturer, uint32_t* ssrc); | |
| 510 | |
| 511 ScreencastMap screencast_capturers_; | |
| 512 rtc::scoped_ptr<VideoMediaMonitor> media_monitor_; | |
| 513 | |
| 514 rtc::WindowEvent previous_we_; | |
| 515 | |
| 516 // Last VideoSendParameters sent down to the media_channel() via | |
| 517 // SetSendParameters. | |
| 518 VideoSendParameters last_send_params_; | |
| 519 // Last VideoRecvParameters sent down to the media_channel() via | |
| 520 // SetRecvParameters. | |
| 521 VideoRecvParameters last_recv_params_; | |
| 522 }; | |
| 523 | |
| 524 // DataChannel is a specialization for data. | |
| 525 class DataChannel : public BaseChannel { | |
| 526 public: | |
| 527 DataChannel(rtc::Thread* thread, | |
| 528 DataMediaChannel* media_channel, | |
| 529 TransportController* transport_controller, | |
| 530 const std::string& content_name, | |
| 531 bool rtcp); | |
| 532 ~DataChannel(); | |
| 533 bool Init(); | |
| 534 | |
| 535 virtual bool SendData(const SendDataParams& params, | |
| 536 const rtc::Buffer& payload, | |
| 537 SendDataResult* result); | |
| 538 | |
| 539 void StartMediaMonitor(int cms); | |
| 540 void StopMediaMonitor(); | |
| 541 | |
| 542 // Should be called on the signaling thread only. | |
| 543 bool ready_to_send_data() const { | |
| 544 return ready_to_send_data_; | |
| 545 } | |
| 546 | |
| 547 sigslot::signal2<DataChannel*, const DataMediaInfo&> SignalMediaMonitor; | |
| 548 sigslot::signal2<DataChannel*, const std::vector<ConnectionInfo>&> | |
| 549 SignalConnectionMonitor; | |
| 550 sigslot::signal3<DataChannel*, const ReceiveDataParams&, const rtc::Buffer&> | |
| 551 SignalDataReceived; | |
| 552 // Signal for notifying when the channel becomes ready to send data. | |
| 553 // That occurs when the channel is enabled, the transport is writable, | |
| 554 // both local and remote descriptions are set, and the channel is unblocked. | |
| 555 sigslot::signal1<bool> SignalReadyToSendData; | |
| 556 // Signal for notifying that the remote side has closed the DataChannel. | |
| 557 sigslot::signal1<uint32_t> SignalStreamClosedRemotely; | |
| 558 | |
| 559 protected: | |
| 560 // downcasts a MediaChannel. | |
| 561 virtual DataMediaChannel* media_channel() const { | |
| 562 return static_cast<DataMediaChannel*>(BaseChannel::media_channel()); | |
| 563 } | |
| 564 | |
| 565 private: | |
| 566 struct SendDataMessageData : public rtc::MessageData { | |
| 567 SendDataMessageData(const SendDataParams& params, | |
| 568 const rtc::Buffer* payload, | |
| 569 SendDataResult* result) | |
| 570 : params(params), | |
| 571 payload(payload), | |
| 572 result(result), | |
| 573 succeeded(false) { | |
| 574 } | |
| 575 | |
| 576 const SendDataParams& params; | |
| 577 const rtc::Buffer* payload; | |
| 578 SendDataResult* result; | |
| 579 bool succeeded; | |
| 580 }; | |
| 581 | |
| 582 struct DataReceivedMessageData : public rtc::MessageData { | |
| 583 // We copy the data because the data will become invalid after we | |
| 584 // handle DataMediaChannel::SignalDataReceived but before we fire | |
| 585 // SignalDataReceived. | |
| 586 DataReceivedMessageData( | |
| 587 const ReceiveDataParams& params, const char* data, size_t len) | |
| 588 : params(params), | |
| 589 payload(data, len) { | |
| 590 } | |
| 591 const ReceiveDataParams params; | |
| 592 const rtc::Buffer payload; | |
| 593 }; | |
| 594 | |
| 595 typedef rtc::TypedMessageData<bool> DataChannelReadyToSendMessageData; | |
| 596 | |
| 597 // overrides from BaseChannel | |
| 598 virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); | |
| 599 // If data_channel_type_ is DCT_NONE, set it. Otherwise, check that | |
| 600 // it's the same as what was set previously. Returns false if it's | |
| 601 // set to one type one type and changed to another type later. | |
| 602 bool SetDataChannelType(DataChannelType new_data_channel_type, | |
| 603 std::string* error_desc); | |
| 604 // Same as SetDataChannelType, but extracts the type from the | |
| 605 // DataContentDescription. | |
| 606 bool SetDataChannelTypeFromContent(const DataContentDescription* content, | |
| 607 std::string* error_desc); | |
| 608 virtual bool SetLocalContent_w(const MediaContentDescription* content, | |
| 609 ContentAction action, | |
| 610 std::string* error_desc); | |
| 611 virtual bool SetRemoteContent_w(const MediaContentDescription* content, | |
| 612 ContentAction action, | |
| 613 std::string* error_desc); | |
| 614 virtual void ChangeState(); | |
| 615 virtual bool WantsPacket(bool rtcp, rtc::Buffer* packet); | |
| 616 | |
| 617 virtual void OnMessage(rtc::Message* pmsg); | |
| 618 virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const; | |
| 619 virtual void OnConnectionMonitorUpdate( | |
| 620 ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos); | |
| 621 virtual void OnMediaMonitorUpdate( | |
| 622 DataMediaChannel* media_channel, const DataMediaInfo& info); | |
| 623 virtual bool ShouldSetupDtlsSrtp() const; | |
| 624 void OnDataReceived( | |
| 625 const ReceiveDataParams& params, const char* data, size_t len); | |
| 626 void OnDataChannelError(uint32_t ssrc, DataMediaChannel::Error error); | |
| 627 void OnDataChannelReadyToSend(bool writable); | |
| 628 void OnStreamClosedRemotely(uint32_t sid); | |
| 629 | |
| 630 rtc::scoped_ptr<DataMediaMonitor> media_monitor_; | |
| 631 // TODO(pthatcher): Make a separate SctpDataChannel and | |
| 632 // RtpDataChannel instead of using this. | |
| 633 DataChannelType data_channel_type_; | |
| 634 bool ready_to_send_data_; | |
| 635 | |
| 636 // Last DataSendParameters sent down to the media_channel() via | |
| 637 // SetSendParameters. | |
| 638 DataSendParameters last_send_params_; | |
| 639 // Last DataRecvParameters sent down to the media_channel() via | |
| 640 // SetRecvParameters. | |
| 641 DataRecvParameters last_recv_params_; | |
| 642 }; | |
| 643 | |
| 644 } // namespace cricket | |
| 645 | |
| 646 #endif // TALK_SESSION_MEDIA_CHANNEL_H_ | |
| OLD | NEW |