Index: webrtc/pc/channel.h |
diff --git a/webrtc/pc/channel.h b/webrtc/pc/channel.h |
index 4518301d3b65e9e6fdf89586d258b519e42a4677..c8e13f7cb16b6bad92de98a7190aa94d88ac19ca 100644 |
--- a/webrtc/pc/channel.h |
+++ b/webrtc/pc/channel.h |
@@ -19,6 +19,7 @@ |
#include <vector> |
#include "webrtc/audio_sink.h" |
+#include "webrtc/base/asyncinvoker.h" |
#include "webrtc/base/asyncudpsocket.h" |
#include "webrtc/base/criticalsection.h" |
#include "webrtc/base/network.h" |
@@ -47,14 +48,16 @@ namespace cricket { |
struct CryptoParams; |
class MediaContentDescription; |
-enum SinkType { |
- SINK_PRE_CRYPTO, // Sink packets before encryption or after decryption. |
- SINK_POST_CRYPTO // Sink packets after encryption or before decryption. |
-}; |
- |
// BaseChannel contains logic common to voice and video, including |
-// enable, marshaling calls to a worker thread, and |
+// enable, marshaling calls to a worker and network threads, and |
// connection and media monitors. |
+// BaseChannel assumes signaling and other threads allowed to make synchronius |
stefan-webrtc
2016/05/11 13:10:26
"...are allowed to make synchronous calls to the w
danilchap
2016/05/11 14:15:30
Thank you!
|
+// calls to worker thread, worker thread make synchronius calls only |
+// to network thread, and network thread can't be blocked by other threads. |
+// All methods with _n suffix must be called on network thread, |
+// methods with _w suffix - on worker thread |
+// and methods with _s suffix on signaling thread. |
+// Network and worker threads may be the same thread. |
// |
// WARNING! SUBCLASSES MUST CALL Deinit() IN THEIR DESTRUCTORS! |
// This is required to avoid a data race between the destructor modifying the |
@@ -66,26 +69,22 @@ class BaseChannel |
public MediaChannel::NetworkInterface, |
public ConnectionStatsGetter { |
public: |
- BaseChannel(rtc::Thread* thread, |
+ BaseChannel(rtc::Thread* worker_thread, |
+ rtc::Thread* network_thread, |
MediaChannel* channel, |
TransportController* transport_controller, |
const std::string& content_name, |
bool rtcp); |
virtual ~BaseChannel(); |
- bool Init(); |
- // Deinit may be called multiple times and is simply ignored if it's alreay |
+ bool Init_w(); |
+ // Deinit may be called multiple times and is simply ignored if it's already |
// done. |
void Deinit(); |
rtc::Thread* worker_thread() const { return worker_thread_; } |
+ rtc::Thread* network_thread() const { return network_thread_; } |
const std::string& content_name() const { return content_name_; } |
const std::string& transport_name() const { return transport_name_; } |
- TransportChannel* transport_channel() const { |
- return transport_channel_; |
- } |
- TransportChannel* rtcp_transport_channel() const { |
- return rtcp_transport_channel_; |
- } |
bool enabled() const { return enabled_; } |
// This function returns true if we are using SRTP. |
@@ -143,18 +142,28 @@ class BaseChannel |
} |
sigslot::signal2<BaseChannel*, bool> SignalDtlsSetupFailure; |
- void SignalDtlsSetupFailure_w(bool rtcp); |
+ void SignalDtlsSetupFailure_n(bool rtcp); |
void SignalDtlsSetupFailure_s(bool rtcp); |
// Used for latency measurements. |
sigslot::signal1<BaseChannel*> SignalFirstPacketReceived; |
+ // Forward TransportChannel SignalSentPacket to worker thread. |
+ sigslot::signal1<const rtc::SentPacket&> SignalSentPacket; |
+ |
+ // Only public for unit tests. Otherwise, consider private. |
+ TransportChannel* transport_channel() const { return transport_channel_; } |
+ TransportChannel* rtcp_transport_channel() const { |
+ return rtcp_transport_channel_; |
+ } |
+ |
// Made public for easier testing. |
void SetReadyToSend(bool rtcp, bool ready); |
// Only public for unit tests. Otherwise, consider protected. |
int SetOption(SocketType type, rtc::Socket::Option o, int val) |
override; |
+ int SetOption_n(SocketType type, rtc::Socket::Option o, int val); |
SrtpFilter* srtp_filter() { return &srtp_filter_; } |
@@ -162,11 +171,11 @@ class BaseChannel |
virtual MediaChannel* media_channel() const { return media_channel_; } |
// Sets the |transport_channel_| (and |rtcp_transport_channel_|, if |rtcp_| is |
// true). Gets the transport channels from |transport_controller_|. |
- bool SetTransport_w(const std::string& transport_name); |
+ bool SetTransport_n(const std::string& transport_name); |
- void set_transport_channel(TransportChannel* transport); |
- void set_rtcp_transport_channel(TransportChannel* transport, |
- bool update_writablity); |
+ void SetTransportChannel_n(TransportChannel* transport); |
+ void SetRtcpTransportChannel_n(TransportChannel* transport, |
+ bool update_writablity); |
bool was_ever_writable() const { return was_ever_writable_; } |
void set_local_content_direction(MediaContentDirection direction) { |
@@ -178,8 +187,8 @@ class BaseChannel |
void set_secure_required(bool secure_required) { |
secure_required_ = secure_required; |
} |
- bool IsReadyToReceive() const; |
- bool IsReadyToSend() const; |
+ bool IsReadyToReceive_w() const; |
+ bool IsReadyToSend_w() const; |
rtc::Thread* signaling_thread() { |
return transport_controller_->signaling_thread(); |
} |
@@ -188,7 +197,7 @@ class BaseChannel |
void ConnectToTransportChannel(TransportChannel* tc); |
void DisconnectFromTransportChannel(TransportChannel* tc); |
- void FlushRtcpMessages(); |
+ void FlushRtcpMessages_n(); |
// NetworkInterface implementation, called by MediaEngine |
bool SendPacket(rtc::CopyOnWriteBuffer* packet, |
@@ -217,28 +226,33 @@ class BaseChannel |
bool SendPacket(bool rtcp, |
rtc::CopyOnWriteBuffer* packet, |
const rtc::PacketOptions& options); |
+ |
virtual bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet); |
void HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet, |
const rtc::PacketTime& packet_time); |
+ void OnPacketReceived(bool rtcp, |
+ const rtc::CopyOnWriteBuffer& packet, |
+ const rtc::PacketTime& packet_time); |
void EnableMedia_w(); |
void DisableMedia_w(); |
- void UpdateWritableState_w(); |
- void ChannelWritable_w(); |
- void ChannelNotWritable_w(); |
+ void UpdateWritableState_n(); |
+ void ChannelWritable_n(); |
+ void ChannelNotWritable_n(); |
bool AddRecvStream_w(const StreamParams& sp); |
bool RemoveRecvStream_w(uint32_t ssrc); |
bool AddSendStream_w(const StreamParams& sp); |
bool RemoveSendStream_w(uint32_t ssrc); |
- virtual bool ShouldSetupDtlsSrtp() const; |
+ virtual bool ShouldSetupDtlsSrtp_n() const; |
// Do the DTLS key expansion and impose it on the SRTP/SRTCP filters. |
// |rtcp_channel| indicates whether to set up the RTP or RTCP filter. |
- bool SetupDtlsSrtp(bool rtcp_channel); |
- void MaybeSetupDtlsSrtp_w(); |
+ bool SetupDtlsSrtp_n(bool rtcp_channel); |
+ void MaybeSetupDtlsSrtp_n(); |
// Set the DTLS-SRTP cipher policy on this channel as appropriate. |
- bool SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp); |
+ bool SetDtlsSrtpCryptoSuites_n(TransportChannel* tc, bool rtcp); |
- virtual void ChangeState() = 0; |
+ void ChangeState(); |
+ virtual void ChangeState_w() = 0; |
// Gets the content info appropriate to the channel (audio or video). |
virtual const ContentInfo* GetFirstContent( |
@@ -255,25 +269,29 @@ class BaseChannel |
virtual bool SetRemoteContent_w(const MediaContentDescription* content, |
ContentAction action, |
std::string* error_desc) = 0; |
- bool SetRtpTransportParameters_w(const MediaContentDescription* content, |
+ bool SetRtpTransportParameters(const MediaContentDescription* content, |
+ ContentAction action, |
+ ContentSource src, |
+ std::string* error_desc); |
+ bool SetRtpTransportParameters_n(const MediaContentDescription* content, |
ContentAction action, |
ContentSource src, |
std::string* error_desc); |
// Helper method to get RTP Absoulute SendTime extension header id if |
// present in remote supported extensions list. |
- void MaybeCacheRtpAbsSendTimeHeaderExtension( |
+ void MaybeCacheRtpAbsSendTimeHeaderExtension_w( |
const std::vector<RtpHeaderExtension>& extensions); |
- bool CheckSrtpConfig(const std::vector<CryptoParams>& cryptos, |
- bool* dtls, |
- std::string* error_desc); |
- bool SetSrtp_w(const std::vector<CryptoParams>& params, |
+ bool CheckSrtpConfig_n(const std::vector<CryptoParams>& cryptos, |
+ bool* dtls, |
+ std::string* error_desc); |
+ bool SetSrtp_n(const std::vector<CryptoParams>& params, |
ContentAction action, |
ContentSource src, |
std::string* error_desc); |
- void ActivateRtcpMux_w(); |
- bool SetRtcpMux_w(bool enable, |
+ void ActivateRtcpMux_n(); |
+ bool SetRtcpMux_n(bool enable, |
ContentAction action, |
ContentSource src, |
std::string* error_desc); |
@@ -283,7 +301,7 @@ class BaseChannel |
// Handled in derived classes |
// Get the SRTP crypto suites to use for RTP media |
- virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const = 0; |
+ virtual void GetSrtpCryptoSuites_n(std::vector<int>* crypto_suites) const = 0; |
virtual void OnConnectionMonitorUpdate(ConnectionMonitor* monitor, |
const std::vector<ConnectionInfo>& infos) = 0; |
@@ -294,13 +312,23 @@ class BaseChannel |
} |
private: |
- rtc::Thread* worker_thread_; |
- TransportController* transport_controller_; |
- MediaChannel* media_channel_; |
- std::vector<StreamParams> local_streams_; |
- std::vector<StreamParams> remote_streams_; |
+ bool InitNetwork_n(); |
+ void DeinitNetwork_n(); |
+ void SignalSentPacket_n(TransportChannel* channel, |
+ const rtc::SentPacket& sent_packet); |
+ void SignalSentPacket_w(const rtc::SentPacket& sent_packet); |
+ bool IsTransportReadyToSend_n() const; |
+ void CacheRtpAbsSendTimeHeaderExtension_n(int rtp_abs_sendtime_extn_id); |
+ |
+ rtc::Thread* const worker_thread_; |
+ rtc::Thread* const network_thread_; |
+ rtc::AsyncInvoker invoker_; |
const std::string content_name_; |
+ std::unique_ptr<ConnectionMonitor> connection_monitor_; |
+ |
+ // Transport related members that should be accessed from network thread. |
+ TransportController* const transport_controller_; |
std::string transport_name_; |
bool rtcp_transport_enabled_; |
TransportChannel* transport_channel_; |
@@ -310,32 +338,40 @@ class BaseChannel |
SrtpFilter srtp_filter_; |
RtcpMuxFilter rtcp_mux_filter_; |
BundleFilter bundle_filter_; |
- std::unique_ptr<ConnectionMonitor> connection_monitor_; |
- bool enabled_; |
- bool writable_; |
bool rtp_ready_to_send_; |
bool rtcp_ready_to_send_; |
+ bool writable_; |
bool was_ever_writable_; |
- MediaContentDirection local_content_direction_; |
- MediaContentDirection remote_content_direction_; |
bool has_received_packet_; |
bool dtls_keyed_; |
bool secure_required_; |
int rtp_abs_sendtime_extn_id_; |
+ |
+ // MediaChannel related members that should be access from worker thread. |
+ MediaChannel* const media_channel_; |
+ // Currently enabled_ flag accessed from signaling thread too, but it can |
+ // be changed only when signaling thread does sunchronious call to worker |
+ // thread, so it should be safe. |
+ bool enabled_; |
+ std::vector<StreamParams> local_streams_; |
+ std::vector<StreamParams> remote_streams_; |
+ MediaContentDirection local_content_direction_; |
+ MediaContentDirection remote_content_direction_; |
}; |
// VoiceChannel is a specialization that adds support for early media, DTMF, |
// and input/output level monitoring. |
class VoiceChannel : public BaseChannel { |
public: |
- VoiceChannel(rtc::Thread* thread, |
+ VoiceChannel(rtc::Thread* worker_thread, |
+ rtc::Thread* network_thread, |
MediaEngineInterface* media_engine, |
VoiceMediaChannel* channel, |
TransportController* transport_controller, |
const std::string& content_name, |
bool rtcp); |
~VoiceChannel(); |
- bool Init(); |
+ bool Init_w(); |
// Configure sending media on the stream with SSRC |ssrc| |
// If there is only one sending stream SSRC 0 can be used. |
@@ -345,7 +381,7 @@ class VoiceChannel : public BaseChannel { |
AudioSource* source); |
// downcasts a MediaChannel |
- virtual VoiceMediaChannel* media_channel() const { |
+ VoiceMediaChannel* media_channel() const override { |
return static_cast<VoiceMediaChannel*>(BaseChannel::media_channel()); |
} |
@@ -393,29 +429,31 @@ class VoiceChannel : public BaseChannel { |
private: |
// overrides from BaseChannel |
- virtual void OnChannelRead(TransportChannel* channel, |
- const char* data, size_t len, |
- const rtc::PacketTime& packet_time, |
- int flags); |
- virtual void ChangeState(); |
- virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); |
- virtual bool SetLocalContent_w(const MediaContentDescription* content, |
- ContentAction action, |
- std::string* error_desc); |
- virtual bool SetRemoteContent_w(const MediaContentDescription* content, |
- ContentAction action, |
- std::string* error_desc); |
+ void OnChannelRead(TransportChannel* channel, |
+ const char* data, |
+ size_t len, |
+ const rtc::PacketTime& packet_time, |
+ int flags) override; |
+ void ChangeState_w() override; |
+ const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; |
+ bool SetLocalContent_w(const MediaContentDescription* content, |
+ ContentAction action, |
+ std::string* error_desc) override; |
+ bool SetRemoteContent_w(const MediaContentDescription* content, |
+ ContentAction action, |
+ std::string* error_desc) override; |
void HandleEarlyMediaTimeout(); |
bool InsertDtmf_w(uint32_t ssrc, int event, int duration); |
bool SetOutputVolume_w(uint32_t ssrc, double volume); |
bool GetStats_w(VoiceMediaInfo* stats); |
- virtual void OnMessage(rtc::Message* pmsg); |
- virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const; |
- virtual void OnConnectionMonitorUpdate( |
- ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos); |
- virtual void OnMediaMonitorUpdate( |
- VoiceMediaChannel* media_channel, const VoiceMediaInfo& info); |
+ void OnMessage(rtc::Message* pmsg) override; |
+ void GetSrtpCryptoSuites_n(std::vector<int>* crypto_suites) const override; |
+ void OnConnectionMonitorUpdate( |
+ ConnectionMonitor* monitor, |
+ const std::vector<ConnectionInfo>& infos) override; |
+ void OnMediaMonitorUpdate(VoiceMediaChannel* media_channel, |
+ const VoiceMediaInfo& info); |
void OnAudioMonitorUpdate(AudioMonitor* monitor, const AudioInfo& info); |
static const int kEarlyMediaTimeout = 1000; |
@@ -435,16 +473,17 @@ class VoiceChannel : public BaseChannel { |
// VideoChannel is a specialization for video. |
class VideoChannel : public BaseChannel { |
public: |
- VideoChannel(rtc::Thread* thread, |
+ VideoChannel(rtc::Thread* worker_thread, |
+ rtc::Thread* netwokr_thread, |
VideoMediaChannel* channel, |
TransportController* transport_controller, |
const std::string& content_name, |
bool rtcp); |
~VideoChannel(); |
- bool Init(); |
+ bool Init_w(); |
// downcasts a MediaChannel |
- virtual VideoMediaChannel* media_channel() const { |
+ VideoMediaChannel* media_channel() const override { |
return static_cast<VideoMediaChannel*>(BaseChannel::media_channel()); |
} |
@@ -469,24 +508,25 @@ class VideoChannel : public BaseChannel { |
private: |
// overrides from BaseChannel |
- virtual void ChangeState(); |
- virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); |
- virtual bool SetLocalContent_w(const MediaContentDescription* content, |
- ContentAction action, |
- std::string* error_desc); |
- virtual bool SetRemoteContent_w(const MediaContentDescription* content, |
- ContentAction action, |
- std::string* error_desc); |
+ void ChangeState_w() override; |
+ const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; |
+ bool SetLocalContent_w(const MediaContentDescription* content, |
+ ContentAction action, |
+ std::string* error_desc) override; |
+ bool SetRemoteContent_w(const MediaContentDescription* content, |
+ ContentAction action, |
+ std::string* error_desc) override; |
bool GetStats_w(VideoMediaInfo* stats); |
webrtc::RtpParameters GetRtpParameters_w(uint32_t ssrc) const; |
bool SetRtpParameters_w(uint32_t ssrc, webrtc::RtpParameters parameters); |
- virtual void OnMessage(rtc::Message* pmsg); |
- virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const; |
- virtual void OnConnectionMonitorUpdate( |
- ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos); |
- virtual void OnMediaMonitorUpdate( |
- VideoMediaChannel* media_channel, const VideoMediaInfo& info); |
+ void OnMessage(rtc::Message* pmsg) override; |
+ void GetSrtpCryptoSuites_n(std::vector<int>* crypto_suites) const override; |
+ void OnConnectionMonitorUpdate( |
+ ConnectionMonitor* monitor, |
+ const std::vector<ConnectionInfo>& infos) override; |
+ void OnMediaMonitorUpdate(VideoMediaChannel* media_channel, |
+ const VideoMediaInfo& info); |
std::unique_ptr<VideoMediaMonitor> media_monitor_; |
@@ -501,13 +541,14 @@ class VideoChannel : public BaseChannel { |
// DataChannel is a specialization for data. |
class DataChannel : public BaseChannel { |
public: |
- DataChannel(rtc::Thread* thread, |
+ DataChannel(rtc::Thread* worker_thread, |
+ rtc::Thread* network_thread, |
DataMediaChannel* media_channel, |
TransportController* transport_controller, |
const std::string& content_name, |
bool rtcp); |
~DataChannel(); |
- bool Init(); |
+ bool Init_w(); |
virtual bool SendData(const SendDataParams& params, |
const rtc::CopyOnWriteBuffer& payload, |
@@ -535,7 +576,7 @@ class DataChannel : public BaseChannel { |
protected: |
// downcasts a MediaChannel. |
- virtual DataMediaChannel* media_channel() const { |
+ DataMediaChannel* media_channel() const override { |
return static_cast<DataMediaChannel*>(BaseChannel::media_channel()); |
} |
@@ -572,7 +613,7 @@ class DataChannel : public BaseChannel { |
typedef rtc::TypedMessageData<bool> DataChannelReadyToSendMessageData; |
// overrides from BaseChannel |
- virtual const ContentInfo* GetFirstContent(const SessionDescription* sdesc); |
+ const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; |
// If data_channel_type_ is DCT_NONE, set it. Otherwise, check that |
// it's the same as what was set previously. Returns false if it's |
// set to one type one type and changed to another type later. |
@@ -582,22 +623,23 @@ class DataChannel : public BaseChannel { |
// DataContentDescription. |
bool SetDataChannelTypeFromContent(const DataContentDescription* content, |
std::string* error_desc); |
- virtual bool SetLocalContent_w(const MediaContentDescription* content, |
- ContentAction action, |
- std::string* error_desc); |
- virtual bool SetRemoteContent_w(const MediaContentDescription* content, |
- ContentAction action, |
- std::string* error_desc); |
- virtual void ChangeState(); |
- virtual bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet); |
+ bool SetLocalContent_w(const MediaContentDescription* content, |
+ ContentAction action, |
+ std::string* error_desc) override; |
+ bool SetRemoteContent_w(const MediaContentDescription* content, |
+ ContentAction action, |
+ std::string* error_desc) override; |
+ void ChangeState_w() override; |
+ bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) override; |
- virtual void OnMessage(rtc::Message* pmsg); |
- virtual void GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const; |
- virtual void OnConnectionMonitorUpdate( |
- ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos); |
- virtual void OnMediaMonitorUpdate( |
- DataMediaChannel* media_channel, const DataMediaInfo& info); |
- virtual bool ShouldSetupDtlsSrtp() const; |
+ void OnMessage(rtc::Message* pmsg) override; |
+ void GetSrtpCryptoSuites_n(std::vector<int>* crypto_suites) const override; |
+ void OnConnectionMonitorUpdate( |
+ ConnectionMonitor* monitor, |
+ const std::vector<ConnectionInfo>& infos) override; |
+ void OnMediaMonitorUpdate(DataMediaChannel* media_channel, |
+ const DataMediaInfo& info); |
+ bool ShouldSetupDtlsSrtp_n() const override; |
void OnDataReceived( |
const ReceiveDataParams& params, const char* data, size_t len); |
void OnDataChannelError(uint32_t ssrc, DataMediaChannel::Error error); |