| Index: webrtc/p2p/base/p2ptransportchannel.cc
|
| diff --git a/webrtc/p2p/base/p2ptransportchannel.cc b/webrtc/p2p/base/p2ptransportchannel.cc
|
| index 83bcf840ee4350e39ad550738e676d1641f5dabd..1484d17158545bb90fd6e0cee82fda43c5ed7ad2 100644
|
| --- a/webrtc/p2p/base/p2ptransportchannel.cc
|
| +++ b/webrtc/p2p/base/p2ptransportchannel.cc
|
| @@ -25,6 +25,7 @@ namespace {
|
| enum {
|
| MSG_SORT = 1,
|
| MSG_PING,
|
| + MSG_CHECK_RECEIVING
|
| };
|
|
|
| // When the socket is unwritable, we will use 10 Kbps (ignoring IP+UDP headers)
|
| @@ -40,6 +41,8 @@ static const uint32 UNWRITABLE_DELAY = 1000 * PING_PACKET_SIZE / 10000; // 50ms
|
| // make sure it is pinged at this rate.
|
| static const uint32 MAX_CURRENT_WRITABLE_DELAY = 900; // 2*WRITABLE_DELAY - bit
|
|
|
| +static const int MIN_CHECK_RECEIVING_DELAY = 50; // ms
|
| +
|
| // The minimum improvement in RTT that justifies a switch.
|
| static const double kMinImprovement = 10;
|
|
|
| @@ -193,7 +196,9 @@ P2PTransportChannel::P2PTransportChannel(const std::string& content_name,
|
| remote_ice_mode_(ICEMODE_FULL),
|
| ice_role_(ICEROLE_UNKNOWN),
|
| tiebreaker_(0),
|
| - remote_candidate_generation_(0) {
|
| + remote_candidate_generation_(0),
|
| + check_receiving_delay_(MIN_CHECK_RECEIVING_DELAY * 5),
|
| + receiving_timeout_(MIN_CHECK_RECEIVING_DELAY * 50) {
|
| }
|
|
|
| P2PTransportChannel::~P2PTransportChannel() {
|
| @@ -354,6 +359,12 @@ void P2PTransportChannel::SetRemoteIceMode(IceMode mode) {
|
| remote_ice_mode_ = mode;
|
| }
|
|
|
| +void P2PTransportChannel::set_receiving_timeout(int receiving_timeout_ms) {
|
| + receiving_timeout_ = receiving_timeout_ms;
|
| + check_receiving_delay_ =
|
| + std::max(MIN_CHECK_RECEIVING_DELAY, receiving_timeout_ / 10);
|
| +}
|
| +
|
| // Go into the state of processing candidates, and running in general
|
| void P2PTransportChannel::Connect() {
|
| ASSERT(worker_thread_ == rtc::Thread::Current());
|
| @@ -369,6 +380,9 @@ void P2PTransportChannel::Connect() {
|
|
|
| // Start pinging as the ports come in.
|
| thread()->Post(this, MSG_PING);
|
| +
|
| + thread()->PostDelayed(
|
| + check_receiving_delay_, this, MSG_CHECK_RECEIVING);
|
| }
|
|
|
| // A new port is available, attempt to make connections for it
|
| @@ -1067,6 +1081,8 @@ void P2PTransportChannel::SwitchBestConnectionTo(Connection* conn) {
|
| LOG_J(LS_INFO, this) << "New best connection: "
|
| << best_connection_->ToString();
|
| SignalRouteChange(this, best_connection_->remote_candidate());
|
| + // When it just switched to a best connection, set receiving to true.
|
| + set_receiving(true);
|
| } else {
|
| LOG_J(LS_INFO, this) << "No best connection";
|
| }
|
| @@ -1148,6 +1164,9 @@ void P2PTransportChannel::OnMessage(rtc::Message *pmsg) {
|
| case MSG_PING:
|
| OnPing();
|
| break;
|
| + case MSG_CHECK_RECEIVING:
|
| + OnCheckReceiving();
|
| + break;
|
| default:
|
| ASSERT(false);
|
| break;
|
| @@ -1176,6 +1195,19 @@ void P2PTransportChannel::OnPing() {
|
| thread()->PostDelayed(delay, this, MSG_PING);
|
| }
|
|
|
| +void P2PTransportChannel::OnCheckReceiving() {
|
| + // Check receiving only if the best connection has received data packets
|
| + // because we want to detect not receiving any packets only after the media
|
| + // have started flowing.
|
| + if (best_connection_ && best_connection_->recv_total_bytes() > 0) {
|
| + bool receiving = rtc::Time() <=
|
| + best_connection_->last_received() + receiving_timeout_;
|
| + set_receiving(receiving);
|
| + }
|
| +
|
| + thread()->PostDelayed(check_receiving_delay_, this, MSG_CHECK_RECEIVING);
|
| +}
|
| +
|
| // Is the connection in a state for us to even consider pinging the other side?
|
| // We consider a connection pingable even if it's not connected because that's
|
| // how a TCP connection is kicked into reconnecting on the active side.
|
|
|