| Index: webrtc/pc/channel.h | 
| diff --git a/webrtc/pc/channel.h b/webrtc/pc/channel.h | 
| index eea1d7f0da0508ced02ff24d3c01ef3171bd25e0..2a5d3a55ec42f68111a3b79ca90d296b8eb2514e 100644 | 
| --- a/webrtc/pc/channel.h | 
| +++ b/webrtc/pc/channel.h | 
| @@ -160,7 +160,15 @@ class BaseChannel | 
| } | 
|  | 
| // Made public for easier testing. | 
| -  void SetReadyToSend(bool rtcp, bool ready); | 
| +  // | 
| +  // Updates "ready to send" for an individual channel, and informs the media | 
| +  // channel that the transport is ready to send if each channel (in use) is | 
| +  // ready to send. This is more specific than just "writable"; it means the | 
| +  // last send didn't return ENOTCONN. | 
| +  // | 
| +  // This should be called whenever a channel's ready-to-send state changes, | 
| +  // or when RTCP muxing becomes active/inactive. | 
| +  void SetTransportChannelReadyToSend(bool rtcp, bool ready); | 
|  | 
| // Only public for unit tests.  Otherwise, consider protected. | 
| int SetOption(SocketType type, rtc::Socket::Option o, int val) | 
| @@ -175,8 +183,10 @@ class BaseChannel | 
|  | 
| protected: | 
| 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_|. | 
| + | 
| +  // Sets the |transport_channel_| (and |rtcp_transport_channel_|, if | 
| +  // |rtcp_enabled_| is true). Gets the transport channels from | 
| +  // |transport_controller_|. | 
| bool SetTransport_n(const std::string& transport_name); | 
|  | 
| void SetTransportChannel_n(TransportChannel* transport); | 
| @@ -193,8 +203,18 @@ class BaseChannel | 
| void set_secure_required(bool secure_required) { | 
| secure_required_ = secure_required; | 
| } | 
| -  bool IsReadyToReceive_w() const; | 
| -  bool IsReadyToSend_w() const; | 
| +  // These methods verify that: | 
| +  // * The required content description directions have been set. | 
| +  // * The channel is enabled. | 
| +  // * And for sending: | 
| +  //   - The SRTP filter is active if it's needed. | 
| +  //   - The transport has been writable before, meaning it should be at least | 
| +  //     possible to succeed in sending a packet. | 
| +  // | 
| +  // When any of these properties change, UpdateMediaSendRecvState_w should be | 
| +  // called. | 
| +  bool IsReadyToReceiveMedia_w() const; | 
| +  bool IsReadyToSendMedia_w() const; | 
| rtc::Thread* signaling_thread() { | 
| return transport_controller_->signaling_thread(); | 
| } | 
| @@ -242,9 +262,14 @@ class BaseChannel | 
|  | 
| void EnableMedia_w(); | 
| void DisableMedia_w(); | 
| + | 
| +  // Performs actions if the RTP/RTCP writable state changed. This should | 
| +  // be called whenever a channel's writable state changes or when RTCP muxing | 
| +  // becomes active/inactive. | 
| 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); | 
| @@ -257,8 +282,11 @@ class BaseChannel | 
| // Set the DTLS-SRTP cipher policy on this channel as appropriate. | 
| bool SetDtlsSrtpCryptoSuites_n(TransportChannel* tc, bool rtcp); | 
|  | 
| -  void ChangeState(); | 
| -  virtual void ChangeState_w() = 0; | 
| +  // Should be called whenever the conditions for | 
| +  // IsReadyToReceiveMedia/IsReadyToSendMedia are satisfied (or unsatisfied). | 
| +  // Updates the send/recv state of the media channel. | 
| +  void UpdateMediaSendRecvState(); | 
| +  virtual void UpdateMediaSendRecvState_w() = 0; | 
|  | 
| // Gets the content info appropriate to the channel (audio or video). | 
| virtual const ContentInfo* GetFirstContent( | 
| @@ -329,7 +357,7 @@ class BaseChannel | 
| void SignalSentPacket_n(TransportChannel* channel, | 
| const rtc::SentPacket& sent_packet); | 
| void SignalSentPacket_w(const rtc::SentPacket& sent_packet); | 
| -  bool IsTransportReadyToSend_n() const; | 
| +  bool IsReadyToSendMedia_n() const; | 
| void CacheRtpAbsSendTimeHeaderExtension_n(int rtp_abs_sendtime_extn_id); | 
|  | 
| rtc::Thread* const worker_thread_; | 
| @@ -363,11 +391,12 @@ class BaseChannel | 
| rtc::CryptoOptions crypto_options_; | 
| int rtp_abs_sendtime_extn_id_ = -1; | 
|  | 
| -  // MediaChannel related members that should be access from worker thread. | 
| +  // MediaChannel related members that should be accessed from the 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. | 
| +  // Currently the |enabled_| flag is accessed from the signaling thread as | 
| +  // well, but it can be changed only when signaling thread does a synchronous | 
| +  // call to the worker thread, so it should be safe. | 
| bool enabled_ = false; | 
| std::vector<StreamParams> local_streams_; | 
| std::vector<StreamParams> remote_streams_; | 
| @@ -458,7 +487,7 @@ class VoiceChannel : public BaseChannel { | 
| size_t len, | 
| const rtc::PacketTime& packet_time, | 
| int flags) override; | 
| -  void ChangeState_w() override; | 
| +  void UpdateMediaSendRecvState_w() override; | 
| const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; | 
| bool SetLocalContent_w(const MediaContentDescription* content, | 
| ContentAction action, | 
| @@ -538,7 +567,7 @@ class VideoChannel : public BaseChannel { | 
|  | 
| private: | 
| // overrides from BaseChannel | 
| -  void ChangeState_w() override; | 
| +  void UpdateMediaSendRecvState_w() override; | 
| const ContentInfo* GetFirstContent(const SessionDescription* sdesc) override; | 
| bool SetLocalContent_w(const MediaContentDescription* content, | 
| ContentAction action, | 
| @@ -663,7 +692,7 @@ class DataChannel : public BaseChannel { | 
| bool SetRemoteContent_w(const MediaContentDescription* content, | 
| ContentAction action, | 
| std::string* error_desc) override; | 
| -  void ChangeState_w() override; | 
| +  void UpdateMediaSendRecvState_w() override; | 
| bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) override; | 
|  | 
| void OnMessage(rtc::Message* pmsg) override; | 
|  |