OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 // Forward TransportChannel SignalSentPacket to worker thread. | 153 // Forward TransportChannel SignalSentPacket to worker thread. |
154 sigslot::signal1<const rtc::SentPacket&> SignalSentPacket; | 154 sigslot::signal1<const rtc::SentPacket&> SignalSentPacket; |
155 | 155 |
156 // Only public for unit tests. Otherwise, consider private. | 156 // Only public for unit tests. Otherwise, consider private. |
157 TransportChannel* transport_channel() const { return transport_channel_; } | 157 TransportChannel* transport_channel() const { return transport_channel_; } |
158 TransportChannel* rtcp_transport_channel() const { | 158 TransportChannel* rtcp_transport_channel() const { |
159 return rtcp_transport_channel_; | 159 return rtcp_transport_channel_; |
160 } | 160 } |
161 | 161 |
162 // Made public for easier testing. | 162 // Made public for easier testing. |
163 void SetReadyToSend(bool rtcp, bool ready); | 163 // |
| 164 // Updates "ready to send" for an individual channel, and informs the media |
| 165 // channel that the transport is ready to send if each channel (in use) is |
| 166 // ready to send. This is more specific than just "writable"; it means the |
| 167 // last send didn't return ENOTCONN. |
| 168 // |
| 169 // This should be called whenever a channel's ready-to-send state changes, |
| 170 // or when RTCP muxing becomes active/inactive. |
| 171 void SetTransportChannelReadyToSend(bool rtcp, bool ready); |
164 | 172 |
165 // Only public for unit tests. Otherwise, consider protected. | 173 // Only public for unit tests. Otherwise, consider protected. |
166 int SetOption(SocketType type, rtc::Socket::Option o, int val) | 174 int SetOption(SocketType type, rtc::Socket::Option o, int val) |
167 override; | 175 override; |
168 int SetOption_n(SocketType type, rtc::Socket::Option o, int val); | 176 int SetOption_n(SocketType type, rtc::Socket::Option o, int val); |
169 | 177 |
170 SrtpFilter* srtp_filter() { return &srtp_filter_; } | 178 SrtpFilter* srtp_filter() { return &srtp_filter_; } |
171 | 179 |
172 virtual cricket::MediaType media_type() = 0; | 180 virtual cricket::MediaType media_type() = 0; |
173 | 181 |
174 bool SetCryptoOptions(const rtc::CryptoOptions& crypto_options); | 182 bool SetCryptoOptions(const rtc::CryptoOptions& crypto_options); |
175 | 183 |
176 protected: | 184 protected: |
177 virtual MediaChannel* media_channel() const { return media_channel_; } | 185 virtual MediaChannel* media_channel() const { return media_channel_; } |
178 // Sets the |transport_channel_| (and |rtcp_transport_channel_|, if |rtcp_| is | 186 |
179 // true). Gets the transport channels from |transport_controller_|. | 187 // Sets the |transport_channel_| (and |rtcp_transport_channel_|, if |
| 188 // |rtcp_enabled_| is true). Gets the transport channels from |
| 189 // |transport_controller_|. |
180 bool SetTransport_n(const std::string& transport_name); | 190 bool SetTransport_n(const std::string& transport_name); |
181 | 191 |
182 void SetTransportChannel_n(TransportChannel* transport); | 192 void SetTransportChannel_n(TransportChannel* transport); |
183 void SetRtcpTransportChannel_n(TransportChannel* transport, | 193 void SetRtcpTransportChannel_n(TransportChannel* transport, |
184 bool update_writablity); | 194 bool update_writablity); |
185 | 195 |
186 bool was_ever_writable() const { return was_ever_writable_; } | 196 bool was_ever_writable() const { return was_ever_writable_; } |
187 void set_local_content_direction(MediaContentDirection direction) { | 197 void set_local_content_direction(MediaContentDirection direction) { |
188 local_content_direction_ = direction; | 198 local_content_direction_ = direction; |
189 } | 199 } |
190 void set_remote_content_direction(MediaContentDirection direction) { | 200 void set_remote_content_direction(MediaContentDirection direction) { |
191 remote_content_direction_ = direction; | 201 remote_content_direction_ = direction; |
192 } | 202 } |
193 void set_secure_required(bool secure_required) { | 203 void set_secure_required(bool secure_required) { |
194 secure_required_ = secure_required; | 204 secure_required_ = secure_required; |
195 } | 205 } |
196 bool IsReadyToReceive_w() const; | 206 // These methods verify that: |
197 bool IsReadyToSend_w() const; | 207 // * The required content description directions have been set. |
| 208 // * The channel is enabled. |
| 209 // * And for sending: |
| 210 // - The SRTP filter is active if it's needed. |
| 211 // - The transport has been writable before, meaning it should be at least |
| 212 // possible to succeed in sending a packet. |
| 213 // |
| 214 // When any of these properties change, UpdateMediaSendRecvState_w should be |
| 215 // called. |
| 216 bool IsReadyToReceiveMedia_w() const; |
| 217 bool IsReadyToSendMedia_w() const; |
198 rtc::Thread* signaling_thread() { | 218 rtc::Thread* signaling_thread() { |
199 return transport_controller_->signaling_thread(); | 219 return transport_controller_->signaling_thread(); |
200 } | 220 } |
201 | 221 |
202 void ConnectToTransportChannel(TransportChannel* tc); | 222 void ConnectToTransportChannel(TransportChannel* tc); |
203 void DisconnectFromTransportChannel(TransportChannel* tc); | 223 void DisconnectFromTransportChannel(TransportChannel* tc); |
204 | 224 |
205 void FlushRtcpMessages_n(); | 225 void FlushRtcpMessages_n(); |
206 | 226 |
207 // NetworkInterface implementation, called by MediaEngine | 227 // NetworkInterface implementation, called by MediaEngine |
(...skipping 27 matching lines...) Expand all Loading... |
235 | 255 |
236 virtual bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet); | 256 virtual bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet); |
237 void HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet, | 257 void HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet, |
238 const rtc::PacketTime& packet_time); | 258 const rtc::PacketTime& packet_time); |
239 void OnPacketReceived(bool rtcp, | 259 void OnPacketReceived(bool rtcp, |
240 const rtc::CopyOnWriteBuffer& packet, | 260 const rtc::CopyOnWriteBuffer& packet, |
241 const rtc::PacketTime& packet_time); | 261 const rtc::PacketTime& packet_time); |
242 | 262 |
243 void EnableMedia_w(); | 263 void EnableMedia_w(); |
244 void DisableMedia_w(); | 264 void DisableMedia_w(); |
| 265 |
| 266 // Performs actions if the RTP/RTCP writable state changed. This should |
| 267 // be called whenever a channel's writable state changes or when RTCP muxing |
| 268 // becomes active/inactive. |
245 void UpdateWritableState_n(); | 269 void UpdateWritableState_n(); |
246 void ChannelWritable_n(); | 270 void ChannelWritable_n(); |
247 void ChannelNotWritable_n(); | 271 void ChannelNotWritable_n(); |
| 272 |
248 bool AddRecvStream_w(const StreamParams& sp); | 273 bool AddRecvStream_w(const StreamParams& sp); |
249 bool RemoveRecvStream_w(uint32_t ssrc); | 274 bool RemoveRecvStream_w(uint32_t ssrc); |
250 bool AddSendStream_w(const StreamParams& sp); | 275 bool AddSendStream_w(const StreamParams& sp); |
251 bool RemoveSendStream_w(uint32_t ssrc); | 276 bool RemoveSendStream_w(uint32_t ssrc); |
252 virtual bool ShouldSetupDtlsSrtp_n() const; | 277 virtual bool ShouldSetupDtlsSrtp_n() const; |
253 // Do the DTLS key expansion and impose it on the SRTP/SRTCP filters. | 278 // Do the DTLS key expansion and impose it on the SRTP/SRTCP filters. |
254 // |rtcp_channel| indicates whether to set up the RTP or RTCP filter. | 279 // |rtcp_channel| indicates whether to set up the RTP or RTCP filter. |
255 bool SetupDtlsSrtp_n(bool rtcp_channel); | 280 bool SetupDtlsSrtp_n(bool rtcp_channel); |
256 void MaybeSetupDtlsSrtp_n(); | 281 void MaybeSetupDtlsSrtp_n(); |
257 // Set the DTLS-SRTP cipher policy on this channel as appropriate. | 282 // Set the DTLS-SRTP cipher policy on this channel as appropriate. |
258 bool SetDtlsSrtpCryptoSuites_n(TransportChannel* tc, bool rtcp); | 283 bool SetDtlsSrtpCryptoSuites_n(TransportChannel* tc, bool rtcp); |
259 | 284 |
260 void ChangeState(); | 285 // Should be called whenever the conditions for |
261 virtual void ChangeState_w() = 0; | 286 // IsReadyToReceiveMedia/IsReadyToSendMedia are satisfied (or unsatisfied). |
| 287 // Updates the send/recv state of the media channel. |
| 288 void UpdateMediaSendRecvState(); |
| 289 virtual void UpdateMediaSendRecvState_w() = 0; |
262 | 290 |
263 // Gets the content info appropriate to the channel (audio or video). | 291 // Gets the content info appropriate to the channel (audio or video). |
264 virtual const ContentInfo* GetFirstContent( | 292 virtual const ContentInfo* GetFirstContent( |
265 const SessionDescription* sdesc) = 0; | 293 const SessionDescription* sdesc) = 0; |
266 bool UpdateLocalStreams_w(const std::vector<StreamParams>& streams, | 294 bool UpdateLocalStreams_w(const std::vector<StreamParams>& streams, |
267 ContentAction action, | 295 ContentAction action, |
268 std::string* error_desc); | 296 std::string* error_desc); |
269 bool UpdateRemoteStreams_w(const std::vector<StreamParams>& streams, | 297 bool UpdateRemoteStreams_w(const std::vector<StreamParams>& streams, |
270 ContentAction action, | 298 ContentAction action, |
271 std::string* error_desc); | 299 std::string* error_desc); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 return worker_thread_->Invoke<bool>(posted_from, functor); | 350 return worker_thread_->Invoke<bool>(posted_from, functor); |
323 } | 351 } |
324 | 352 |
325 private: | 353 private: |
326 bool InitNetwork_n(const std::string* bundle_transport_name); | 354 bool InitNetwork_n(const std::string* bundle_transport_name); |
327 void DisconnectTransportChannels_n(); | 355 void DisconnectTransportChannels_n(); |
328 void DestroyTransportChannels_n(); | 356 void DestroyTransportChannels_n(); |
329 void SignalSentPacket_n(TransportChannel* channel, | 357 void SignalSentPacket_n(TransportChannel* channel, |
330 const rtc::SentPacket& sent_packet); | 358 const rtc::SentPacket& sent_packet); |
331 void SignalSentPacket_w(const rtc::SentPacket& sent_packet); | 359 void SignalSentPacket_w(const rtc::SentPacket& sent_packet); |
332 bool IsTransportReadyToSend_n() const; | 360 bool IsReadyToSendMedia_n() const; |
333 void CacheRtpAbsSendTimeHeaderExtension_n(int rtp_abs_sendtime_extn_id); | 361 void CacheRtpAbsSendTimeHeaderExtension_n(int rtp_abs_sendtime_extn_id); |
334 | 362 |
335 rtc::Thread* const worker_thread_; | 363 rtc::Thread* const worker_thread_; |
336 rtc::Thread* const network_thread_; | 364 rtc::Thread* const network_thread_; |
337 rtc::AsyncInvoker invoker_; | 365 rtc::AsyncInvoker invoker_; |
338 | 366 |
339 const std::string content_name_; | 367 const std::string content_name_; |
340 std::unique_ptr<ConnectionMonitor> connection_monitor_; | 368 std::unique_ptr<ConnectionMonitor> connection_monitor_; |
341 | 369 |
342 // Transport related members that should be accessed from network thread. | 370 // Transport related members that should be accessed from network thread. |
(...skipping 13 matching lines...) Expand all Loading... |
356 bool rtp_ready_to_send_ = false; | 384 bool rtp_ready_to_send_ = false; |
357 bool rtcp_ready_to_send_ = false; | 385 bool rtcp_ready_to_send_ = false; |
358 bool writable_ = false; | 386 bool writable_ = false; |
359 bool was_ever_writable_ = false; | 387 bool was_ever_writable_ = false; |
360 bool has_received_packet_ = false; | 388 bool has_received_packet_ = false; |
361 bool dtls_keyed_ = false; | 389 bool dtls_keyed_ = false; |
362 bool secure_required_ = false; | 390 bool secure_required_ = false; |
363 rtc::CryptoOptions crypto_options_; | 391 rtc::CryptoOptions crypto_options_; |
364 int rtp_abs_sendtime_extn_id_ = -1; | 392 int rtp_abs_sendtime_extn_id_ = -1; |
365 | 393 |
366 // MediaChannel related members that should be access from worker thread. | 394 // MediaChannel related members that should be accessed from the worker |
| 395 // thread. |
367 MediaChannel* const media_channel_; | 396 MediaChannel* const media_channel_; |
368 // Currently enabled_ flag accessed from signaling thread too, but it can | 397 // Currently the |enabled_| flag is accessed from the signaling thread as |
369 // be changed only when signaling thread does sunchronious call to worker | 398 // well, but it can be changed only when signaling thread does a synchronous |
370 // thread, so it should be safe. | 399 // call to the worker thread, so it should be safe. |
371 bool enabled_ = false; | 400 bool enabled_ = false; |
372 std::vector<StreamParams> local_streams_; | 401 std::vector<StreamParams> local_streams_; |
373 std::vector<StreamParams> remote_streams_; | 402 std::vector<StreamParams> remote_streams_; |
374 MediaContentDirection local_content_direction_ = MD_INACTIVE; | 403 MediaContentDirection local_content_direction_ = MD_INACTIVE; |
375 MediaContentDirection remote_content_direction_ = MD_INACTIVE; | 404 MediaContentDirection remote_content_direction_ = MD_INACTIVE; |
376 }; | 405 }; |
377 | 406 |
378 // VoiceChannel is a specialization that adds support for early media, DTMF, | 407 // VoiceChannel is a specialization that adds support for early media, DTMF, |
379 // and input/output level monitoring. | 408 // and input/output level monitoring. |
380 class VoiceChannel : public BaseChannel { | 409 class VoiceChannel : public BaseChannel { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 webrtc::RtpParameters parameters); | 480 webrtc::RtpParameters parameters); |
452 cricket::MediaType media_type() override { return cricket::MEDIA_TYPE_AUDIO; } | 481 cricket::MediaType media_type() override { return cricket::MEDIA_TYPE_AUDIO; } |
453 | 482 |
454 private: | 483 private: |
455 // overrides from BaseChannel | 484 // overrides from BaseChannel |
456 void OnChannelRead(TransportChannel* channel, | 485 void OnChannelRead(TransportChannel* channel, |
457 const char* data, | 486 const char* data, |
458 size_t len, | 487 size_t len, |
459 const rtc::PacketTime& packet_time, | 488 const rtc::PacketTime& packet_time, |
460 int flags) override; | 489 int flags) override; |
461 void ChangeState_w() override; | 490 void UpdateMediaSendRecvState_w() override; |
462 const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; | 491 const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; |
463 bool SetLocalContent_w(const MediaContentDescription* content, | 492 bool SetLocalContent_w(const MediaContentDescription* content, |
464 ContentAction action, | 493 ContentAction action, |
465 std::string* error_desc) override; | 494 std::string* error_desc) override; |
466 bool SetRemoteContent_w(const MediaContentDescription* content, | 495 bool SetRemoteContent_w(const MediaContentDescription* content, |
467 ContentAction action, | 496 ContentAction action, |
468 std::string* error_desc) override; | 497 std::string* error_desc) override; |
469 void HandleEarlyMediaTimeout(); | 498 void HandleEarlyMediaTimeout(); |
470 bool InsertDtmf_w(uint32_t ssrc, int event, int duration); | 499 bool InsertDtmf_w(uint32_t ssrc, int event, int duration); |
471 bool SetOutputVolume_w(uint32_t ssrc, double volume); | 500 bool SetOutputVolume_w(uint32_t ssrc, double volume); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const; | 560 webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const; |
532 bool SetRtpSendParameters(uint32_t ssrc, | 561 bool SetRtpSendParameters(uint32_t ssrc, |
533 const webrtc::RtpParameters& parameters); | 562 const webrtc::RtpParameters& parameters); |
534 webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const; | 563 webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const; |
535 bool SetRtpReceiveParameters(uint32_t ssrc, | 564 bool SetRtpReceiveParameters(uint32_t ssrc, |
536 const webrtc::RtpParameters& parameters); | 565 const webrtc::RtpParameters& parameters); |
537 cricket::MediaType media_type() override { return cricket::MEDIA_TYPE_VIDEO; } | 566 cricket::MediaType media_type() override { return cricket::MEDIA_TYPE_VIDEO; } |
538 | 567 |
539 private: | 568 private: |
540 // overrides from BaseChannel | 569 // overrides from BaseChannel |
541 void ChangeState_w() override; | 570 void UpdateMediaSendRecvState_w() override; |
542 const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; | 571 const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; |
543 bool SetLocalContent_w(const MediaContentDescription* content, | 572 bool SetLocalContent_w(const MediaContentDescription* content, |
544 ContentAction action, | 573 ContentAction action, |
545 std::string* error_desc) override; | 574 std::string* error_desc) override; |
546 bool SetRemoteContent_w(const MediaContentDescription* content, | 575 bool SetRemoteContent_w(const MediaContentDescription* content, |
547 ContentAction action, | 576 ContentAction action, |
548 std::string* error_desc) override; | 577 std::string* error_desc) override; |
549 bool GetStats_w(VideoMediaInfo* stats); | 578 bool GetStats_w(VideoMediaInfo* stats); |
550 webrtc::RtpParameters GetRtpSendParameters_w(uint32_t ssrc) const; | 579 webrtc::RtpParameters GetRtpSendParameters_w(uint32_t ssrc) const; |
551 bool SetRtpSendParameters_w(uint32_t ssrc, webrtc::RtpParameters parameters); | 580 bool SetRtpSendParameters_w(uint32_t ssrc, webrtc::RtpParameters parameters); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
656 // Same as SetDataChannelType, but extracts the type from the | 685 // Same as SetDataChannelType, but extracts the type from the |
657 // DataContentDescription. | 686 // DataContentDescription. |
658 bool SetDataChannelTypeFromContent(const DataContentDescription* content, | 687 bool SetDataChannelTypeFromContent(const DataContentDescription* content, |
659 std::string* error_desc); | 688 std::string* error_desc); |
660 bool SetLocalContent_w(const MediaContentDescription* content, | 689 bool SetLocalContent_w(const MediaContentDescription* content, |
661 ContentAction action, | 690 ContentAction action, |
662 std::string* error_desc) override; | 691 std::string* error_desc) override; |
663 bool SetRemoteContent_w(const MediaContentDescription* content, | 692 bool SetRemoteContent_w(const MediaContentDescription* content, |
664 ContentAction action, | 693 ContentAction action, |
665 std::string* error_desc) override; | 694 std::string* error_desc) override; |
666 void ChangeState_w() override; | 695 void UpdateMediaSendRecvState_w() override; |
667 bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) override; | 696 bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) override; |
668 | 697 |
669 void OnMessage(rtc::Message* pmsg) override; | 698 void OnMessage(rtc::Message* pmsg) override; |
670 void GetSrtpCryptoSuites_n(std::vector<int>* crypto_suites) const override; | 699 void GetSrtpCryptoSuites_n(std::vector<int>* crypto_suites) const override; |
671 void OnConnectionMonitorUpdate( | 700 void OnConnectionMonitorUpdate( |
672 ConnectionMonitor* monitor, | 701 ConnectionMonitor* monitor, |
673 const std::vector<ConnectionInfo>& infos) override; | 702 const std::vector<ConnectionInfo>& infos) override; |
674 void OnMediaMonitorUpdate(DataMediaChannel* media_channel, | 703 void OnMediaMonitorUpdate(DataMediaChannel* media_channel, |
675 const DataMediaInfo& info); | 704 const DataMediaInfo& info); |
676 bool ShouldSetupDtlsSrtp_n() const override; | 705 bool ShouldSetupDtlsSrtp_n() const override; |
(...skipping 13 matching lines...) Expand all Loading... |
690 // SetSendParameters. | 719 // SetSendParameters. |
691 DataSendParameters last_send_params_; | 720 DataSendParameters last_send_params_; |
692 // Last DataRecvParameters sent down to the media_channel() via | 721 // Last DataRecvParameters sent down to the media_channel() via |
693 // SetRecvParameters. | 722 // SetRecvParameters. |
694 DataRecvParameters last_recv_params_; | 723 DataRecvParameters last_recv_params_; |
695 }; | 724 }; |
696 | 725 |
697 } // namespace cricket | 726 } // namespace cricket |
698 | 727 |
699 #endif // WEBRTC_PC_CHANNEL_H_ | 728 #endif // WEBRTC_PC_CHANNEL_H_ |
OLD | NEW |