Chromium Code Reviews| Index: webrtc/media/engine/webrtcvideoengine2.cc |
| diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc |
| index 4980153490860bcf26117be084fd8800c682508f..5d4816fe9bc827ebda5311a2b6ab0cd471be2079 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,19 @@ 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()) { |
| + // There should be at most a single default stream. |
| + RTC_DCHECK(!ssrc); |
| + ssrc = rtc::Optional<uint32_t>(it->first); |
|
sprang_webrtc
2017/05/26 15:00:19
nit: ssrc.emplace(it->first);
...any maybe break;
brandtr
2017/05/29 13:56:26
Nah, it's probably fine. It's nicer to check this
|
| + } |
| + } |
| + return ssrc; |
| +} |
| + |
| bool WebRtcVideoChannel2::SendRtp(const uint8_t* data, |
| size_t len, |
| const webrtc::PacketOptions& options) { |