Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Unified Diff: webrtc/media/engine/webrtcvideoengine2.cc

Issue 2906893002: Avoid toggling default receive streams in WebRtcVideoChannel2. (Closed)
Patch Set: sprang comments 1. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine2.h ('k') | webrtc/media/engine/webrtcvideoengine2_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/media/engine/webrtcvideoengine2.cc
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
index 4980153490860bcf26117be084fd8800c682508f..abb35843c00009d154ea874eedbf5619aa1a2f70 100644
--- a/webrtc/media/engine/webrtcvideoengine2.cc
+++ b/webrtc/media/engine/webrtcvideoengine2.cc
@@ -428,14 +428,18 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::ConfigureVideoEncoderSettings(
}
DefaultUnsignalledSsrcHandler::DefaultUnsignalledSsrcHandler()
- : default_recv_ssrc_(0), default_sink_(NULL) {}
+ : default_sink_(nullptr) {}
UnsignalledSsrcHandler::Action DefaultUnsignalledSsrcHandler::OnUnsignalledSsrc(
WebRtcVideoChannel2* channel,
uint32_t ssrc) {
- if (default_recv_ssrc_ != 0) { // Already one default stream, so replace it.
- channel->RemoveRecvStream(default_recv_ssrc_);
- default_recv_ssrc_ = 0;
+ rtc::Optional<uint32_t> default_recv_ssrc =
+ channel->GetDefaultReceiveStreamSsrc();
+
+ if (default_recv_ssrc) {
+ LOG(LS_INFO) << "Destroying old default receive stream for SSRC=" << ssrc
+ << ".";
+ channel->RemoveRecvStream(*default_recv_ssrc);
}
StreamParams sp;
@@ -446,7 +450,6 @@ UnsignalledSsrcHandler::Action DefaultUnsignalledSsrcHandler::OnUnsignalledSsrc(
}
channel->SetSink(ssrc, default_sink_);
- default_recv_ssrc_ = ssrc;
return kDeliverPacket;
}
@@ -456,11 +459,13 @@ DefaultUnsignalledSsrcHandler::GetDefaultSink() const {
}
void DefaultUnsignalledSsrcHandler::SetDefaultSink(
- VideoMediaChannel* channel,
+ WebRtcVideoChannel2* channel,
rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
default_sink_ = sink;
- if (default_recv_ssrc_ != 0) {
- channel->SetSink(default_recv_ssrc_, default_sink_);
+ rtc::Optional<uint32_t> default_recv_ssrc =
+ channel->GetDefaultReceiveStreamSsrc();
+ if (default_recv_ssrc) {
+ channel->SetSink(*default_recv_ssrc, default_sink_);
}
}
@@ -1321,6 +1326,8 @@ bool WebRtcVideoChannel2::SetSink(
LOG(LS_INFO) << "SetSink: ssrc:" << ssrc << " "
<< (sink ? "(ptr)" : "nullptr");
if (ssrc == 0) {
+ // Do not hold |stream_crit_| here, since SetDefaultSink will call
+ // WebRtcVideoChannel2::GetDefaultReceiveStreamSsrc().
default_unsignalled_ssrc_handler_.SetDefaultSink(this, sink);
return true;
}
@@ -1529,6 +1536,18 @@ void WebRtcVideoChannel2::SetInterface(NetworkInterface* iface) {
kVideoRtpBufferSize);
}
+rtc::Optional<uint32_t> WebRtcVideoChannel2::GetDefaultReceiveStreamSsrc() {
+ rtc::CritScope stream_lock(&stream_crit_);
+ rtc::Optional<uint32_t> ssrc;
+ for (auto it = receive_streams_.begin(); it != receive_streams_.end(); ++it) {
+ if (it->second->IsDefaultStream()) {
+ ssrc.emplace(it->first);
+ break;
+ }
+ }
+ return ssrc;
+}
+
bool WebRtcVideoChannel2::SendRtp(const uint8_t* data,
size_t len,
const webrtc::PacketOptions& options) {
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine2.h ('k') | webrtc/media/engine/webrtcvideoengine2_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698