From 357ca1db929fea753dfe346f1ed985ab434428d1 Mon Sep 17 00:00:00 2001 From: "Byron Campen [:bwc]" Date: Wed, 29 Nov 2017 13:36:41 -0600 Subject: [PATCH] Bug 1400363 - Part 2: Unmute webrtc receive tracks when RTP is received. r=drno MozReview-Commit-ID: IQrCOzBQmqu --HG-- extra : rebase_source : 2db6b0ca785ffb13dd6345a6e201c13766d0b742 --- .../src/mediapipeline/MediaPipeline.cpp | 40 ++++++++++++++++++- .../src/mediapipeline/MediaPipeline.h | 5 +++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp b/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp index 46fb495f38d9..d95a8b267466 100644 --- a/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp +++ b/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp @@ -1101,6 +1101,7 @@ void MediaPipeline::RtpPacketReceived(TransportLayer *layer, } CSFLogDebug(LOGTAG, "%s received RTP packet.", description_.c_str()); increment_rtp_packets_received(out_len); + OnRtpPacketReceived(); RtpLogger::LogPacket(inner_data.get(), out_len, true, true, header.headerLength, description_); @@ -1896,7 +1897,8 @@ class GenericReceiveListener : public MediaStreamListener played_ticks_(0), last_log_(0), principal_handle_(PRINCIPAL_HANDLE_NONE), - listening_(false) + listening_(false), + maybe_track_needs_unmute_(true) { MOZ_ASSERT(track->GetInputStream()->AsSourceStream()); } @@ -1912,6 +1914,7 @@ class GenericReceiveListener : public MediaStreamListener if (!listening_) { listening_ = true; track_->GetInputStream()->AddListener(this); + maybe_track_needs_unmute_ = true; } } @@ -1923,6 +1926,24 @@ class GenericReceiveListener : public MediaStreamListener } } + void OnRtpReceived() + { + if (maybe_track_needs_unmute_) { + maybe_track_needs_unmute_ = false; + NS_DispatchToMainThread(NewRunnableMethod( + "GenericReceiveListener::OnRtpReceived_m", + this, + &GenericReceiveListener::OnRtpReceived_m)); + } + } + + void OnRtpReceived_m() + { + if (listening_ && track_->Muted()) { + track_->MutedChanged(false); + } + } + void EndTrack() { CSFLogDebug(LOGTAG, "GenericReceiveListener ending track"); @@ -1984,6 +2005,7 @@ class GenericReceiveListener : public MediaStreamListener TrackTicks last_log_; // played_ticks_ when we last logged PrincipalHandle principal_handle_; bool listening_; + Atomic maybe_track_needs_unmute_; }; MediaPipelineReceive::MediaPipelineReceive( @@ -2169,6 +2191,14 @@ MediaPipelineReceiveAudio::Stop() conduit_->StopReceiving(); } +void +MediaPipelineReceiveAudio::OnRtpPacketReceived() +{ + if (listener_) { + listener_->OnRtpReceived(); + } +} + class MediaPipelineReceiveVideo::PipelineListener : public GenericReceiveListener { public: @@ -2353,6 +2383,14 @@ MediaPipelineReceiveVideo::Stop() conduit_->StopReceiving(); } +void +MediaPipelineReceiveVideo::OnRtpPacketReceived() +{ + if (listener_) { + listener_->OnRtpReceived(); + } +} + DOMHighResTimeStamp MediaPipeline::GetNow() { return webrtc::Clock::GetRealTimeClock()->TimeInMilliseconds(); } diff --git a/media/webrtc/signaling/src/mediapipeline/MediaPipeline.h b/media/webrtc/signaling/src/mediapipeline/MediaPipeline.h index 186956c7df8b..dd1458ec97c3 100644 --- a/media/webrtc/signaling/src/mediapipeline/MediaPipeline.h +++ b/media/webrtc/signaling/src/mediapipeline/MediaPipeline.h @@ -241,6 +241,7 @@ class MediaPipeline : public sigslot::has_slots<> { void increment_rtp_packets_sent(int bytes); void increment_rtcp_packets_sent(); void increment_rtp_packets_received(int bytes); + virtual void OnRtpPacketReceived() {}; void increment_rtcp_packets_received(); virtual nsresult SendPacket(TransportFlow *flow, const void *data, int len); @@ -416,6 +417,8 @@ class MediaPipelineReceiveAudio : public MediaPipelineReceive { void Start() override; void Stop() override; + void OnRtpPacketReceived() override; + private: // Separate class to allow ref counting class PipelineListener; @@ -444,6 +447,8 @@ class MediaPipelineReceiveVideo : public MediaPipelineReceive { void Start() override; void Stop() override; + void OnRtpPacketReceived() override; + private: class PipelineRenderer; friend class PipelineRenderer;