Chromium Code Reviews| Index: webrtc/media/engine/webrtcvoiceengine.cc |
| diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc |
| index eec9340640493e4b90afa6dac79108267062563f..b8a0db6ac6cf3bb1a3b774b7928b389be3d5fc7d 100644 |
| --- a/webrtc/media/engine/webrtcvoiceengine.cc |
| +++ b/webrtc/media/engine/webrtcvoiceengine.cc |
| @@ -1467,14 +1467,15 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { |
| RTC_DCHECK_GE(ch, 0); |
| RTC_DCHECK(call); |
| config_.rtp.remote_ssrc = remote_ssrc; |
| + config_.rtp.local_ssrc = local_ssrc; |
| + config_.rtp.transport_cc = use_transport_cc; |
| + config_.rtp.nack.rtp_history_ms = use_nack ? kNackRtpHistoryMs : 0; |
| + config_.rtp.extensions = extensions; |
| config_.rtcp_send_transport = rtcp_send_transport; |
| config_.voe_channel_id = ch; |
| config_.sync_group = sync_group; |
| config_.decoder_factory = decoder_factory; |
| - RecreateAudioReceiveStream(local_ssrc, |
| - use_transport_cc, |
| - use_nack, |
| - extensions); |
| + RecreateAudioReceiveStream(); |
| } |
| ~WebRtcAudioReceiveStream() { |
| @@ -1484,27 +1485,38 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { |
| void RecreateAudioReceiveStream(uint32_t local_ssrc) { |
| RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| - RecreateAudioReceiveStream(local_ssrc, |
| - config_.rtp.transport_cc, |
| - config_.rtp.nack.rtp_history_ms != 0, |
| - config_.rtp.extensions); |
| + config_.rtp.local_ssrc = local_ssrc; |
| + RecreateAudioReceiveStream(); |
| } |
| void RecreateAudioReceiveStream(bool use_transport_cc, bool use_nack) { |
| RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| - RecreateAudioReceiveStream(config_.rtp.local_ssrc, |
| - use_transport_cc, |
| - use_nack, |
| - config_.rtp.extensions); |
| + config_.rtp.transport_cc = use_transport_cc; |
| + config_.rtp.nack.rtp_history_ms = use_nack ? kNackRtpHistoryMs : 0; |
| + RecreateAudioReceiveStream(); |
| } |
| void RecreateAudioReceiveStream( |
| - const std::vector<webrtc::RtpExtension>& extensions) { |
| + std::vector<webrtc::RtpExtension>&& extensions) { |
| + RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| + config_.rtp.extensions = std::move(extensions); |
| + RecreateAudioReceiveStream(); |
| + } |
| + |
| + // Set a new payload type -> decoder map. The new map must be a superset of |
| + // the old one. |
| + bool RecreateAudioReceiveStream( |
| + std::map<int, webrtc::SdpAudioFormat>&& decoder_map) { |
| RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| - RecreateAudioReceiveStream(config_.rtp.local_ssrc, |
| - config_.rtp.transport_cc, |
| - config_.rtp.nack.rtp_history_ms != 0, |
| - extensions); |
| + for (const auto& item : config_.decoder_map) { |
|
the sun
2016/12/08 10:53:52
This is a good check, but it has (or *should* have
kwiberg-webrtc
2016/12/09 02:39:01
Done. Also changed return type to void.
|
| + auto it = decoder_map.find(item.first); |
| + if (it == decoder_map.end() || *it != item) { |
| + return false; // The old map isn't a subset of the new map. |
| + } |
| + } |
| + config_.decoder_map = std::move(decoder_map); |
| + RecreateAudioReceiveStream(); |
| + return true; |
| } |
| webrtc::AudioReceiveStream::Stats GetStats() const { |
| @@ -1542,21 +1554,11 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { |
| } |
| private: |
| - void RecreateAudioReceiveStream( |
| - uint32_t local_ssrc, |
| - bool use_transport_cc, |
| - bool use_nack, |
| - const std::vector<webrtc::RtpExtension>& extensions) { |
| + void RecreateAudioReceiveStream() { |
| RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| if (stream_) { |
| call_->DestroyAudioReceiveStream(stream_); |
| - stream_ = nullptr; |
| } |
| - config_.rtp.local_ssrc = local_ssrc; |
| - config_.rtp.transport_cc = use_transport_cc; |
| - config_.rtp.nack.rtp_history_ms = use_nack ? kNackRtpHistoryMs : 0; |
| - config_.rtp.extensions = extensions; |
| - RTC_DCHECK(!stream_); |
| stream_ = call_->CreateAudioReceiveStream(config_); |
| RTC_CHECK(stream_); |
| SetPlayout(playout_); |
| @@ -1665,7 +1667,8 @@ bool WebRtcVoiceMediaChannel::SetRecvParameters( |
| if (recv_rtp_extensions_ != filtered_extensions) { |
| recv_rtp_extensions_.swap(filtered_extensions); |
| for (auto& it : recv_streams_) { |
| - it.second->RecreateAudioReceiveStream(recv_rtp_extensions_); |
| + auto ext = recv_rtp_extensions_; // Make a copy. |
|
the sun
2016/12/08 10:53:52
To me, the fact that you need to write a comment i
kwiberg-webrtc
2016/12/09 02:39:01
I declared RecreateAudioReceiveStreamn to take an
the sun
2016/12/09 12:29:49
I think it's a little unnecessary. Sometimes we ne
ossu
2016/12/09 13:23:39
I think I agree with solenberg here. This map isn'
kwiberg-webrtc
2016/12/11 11:24:55
Not sure. We may be, but I guess it doesn't matter
|
| + it.second->RecreateAudioReceiveStream(std::move(ext)); |
| } |
| } |
| return true; |
| @@ -1847,29 +1850,17 @@ bool WebRtcVoiceMediaChannel::SetRecvCodecs( |
| ChangePlayout(false); |
| } |
| - bool result = true; |
| - for (const AudioCodec& codec : new_codecs) { |
| - webrtc::CodecInst voe_codec = {0}; |
| - if (WebRtcVoiceEngine::ToCodecInst(codec, &voe_codec)) { |
| - LOG(LS_INFO) << ToString(codec); |
| - voe_codec.pltype = codec.id; |
| - for (const auto& ch : recv_streams_) { |
| - if (engine()->voe()->codec()->SetRecPayloadType( |
| - ch.second->channel(), voe_codec) == -1) { |
| - LOG_RTCERR2(SetRecPayloadType, ch.second->channel(), |
| - ToString(voe_codec)); |
| - result = false; |
| - } |
| - } |
| - } else { |
| - LOG(LS_WARNING) << "Unknown codec " << ToString(codec); |
| - result = false; |
| - break; |
| - } |
| + std::map<int, webrtc::SdpAudioFormat> decoder_map; |
| + for (const AudioCodec& codec : codecs) { |
| + LOG(LS_INFO) << ToString(codec); |
| + decoder_map.insert({codec.id, AudioCodecToSdp(codec)}); |
| } |
| - if (result) { |
| - recv_codecs_ = codecs; |
| + bool result = true; |
| + for (auto& it : recv_streams_) { |
|
the sun
2016/12/08 10:53:52
nit: it -> kv
kwiberg-webrtc
2016/12/09 02:39:01
Done.
|
| + auto dm = decoder_map; // Make a copy. |
|
the sun
2016/12/08 10:53:52
Same comment as on line 1670
|
| + result = it.second->RecreateAudioReceiveStream(std::move(dm)) && result; |
| } |
| + recv_codecs_ = codecs; |
| if (desired_playout_ && !playout_) { |
| ChangePlayout(desired_playout_); |