Index: call/call.cc |
diff --git a/call/call.cc b/call/call.cc |
index 1bfde2e69239641c52001c2fac7401aad24e6ca0..e8cfa12131f7d284244dbedc3f9d02795dbe2ab1 100644 |
--- a/call/call.cc |
+++ b/call/call.cc |
@@ -62,11 +62,7 @@ namespace webrtc { |
namespace { |
-// TODO(nisse): This really begs for a shared context struct. |
-bool UseSendSideBwe(const std::vector<RtpExtension>& extensions, |
- bool transport_cc) { |
- if (!transport_cc) |
- return false; |
+bool UseTransportSeqno(const std::vector<RtpExtension>& extensions) { |
for (const auto& extension : extensions) { |
if (extension.uri == RtpExtension::kTransportSequenceNumberUri) |
return true; |
@@ -74,18 +70,15 @@ bool UseSendSideBwe(const std::vector<RtpExtension>& extensions, |
return false; |
} |
-bool UseSendSideBwe(const VideoReceiveStream::Config& config) { |
- return UseSendSideBwe(config.rtp.extensions, config.rtp.transport_cc); |
+bool UseSendSideBwe(const std::vector<RtpExtension>& extensions, |
+ bool transport_cc) { |
+ return transport_cc && UseTransportSeqno(extensions); |
} |
bool UseSendSideBwe(const AudioReceiveStream::Config& config) { |
return UseSendSideBwe(config.rtp.extensions, config.rtp.transport_cc); |
} |
-bool UseSendSideBwe(const FlexfecReceiveStream::Config& config) { |
- return UseSendSideBwe(config.rtp_header_extensions, config.transport_cc); |
-} |
- |
const int* FindKeyByValue(const std::map<int, int>& m, int v) { |
for (const auto& kv : m) { |
if (kv.second == v) |
@@ -102,8 +95,9 @@ std::unique_ptr<rtclog::StreamConfig> CreateRtcLogStreamConfig( |
rtclog_config->rtx_ssrc = config.rtp.rtx_ssrc; |
rtclog_config->rtcp_mode = config.rtp.rtcp_mode; |
rtclog_config->remb = config.rtp.remb; |
+#if 0 |
rtclog_config->rtp_extensions = config.rtp.extensions; |
- |
+#endif |
for (const auto& d : config.decoders) { |
const int* search = |
FindKeyByValue(config.rtp.rtx_associated_payload_types, d.payload_type); |
@@ -168,6 +162,9 @@ class Call : public webrtc::Call, |
// Implements webrtc::Call. |
PacketReceiver* Receiver() override; |
+ void SetVideoReceiveRtpHeaderExtensions( |
+ const std::vector<RtpExtension>& extensions) override; |
+ |
webrtc::AudioSendStream* CreateAudioSendStream( |
const webrtc::AudioSendStream::Config& config) override; |
void DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) override; |
@@ -287,6 +284,9 @@ class Call : public webrtc::Call, |
RtpStreamReceiverController audio_receiver_controller_; |
RtpStreamReceiverController video_receiver_controller_; |
+ std::vector<RtpExtension> video_rtp_header_extensions_ |
+ RTC_GUARDED_BY(receive_crit_); |
+ |
// This extra map is used for receive processing which is |
// independent of media type. |
@@ -605,6 +605,12 @@ PacketReceiver* Call::Receiver() { |
return this; |
} |
+void Call::SetVideoReceiveRtpHeaderExtensions( |
+ const std::vector<RtpExtension>& extensions) { |
+ WriteLockScoped write_lock(*receive_crit_); |
+ video_rtp_header_extensions_ = extensions; |
+} |
+ |
webrtc::AudioSendStream* Call::CreateAudioSendStream( |
const webrtc::AudioSendStream::Config& config) { |
TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream"); |
@@ -809,10 +815,12 @@ webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream( |
module_process_thread_.get(), call_stats_.get()); |
const webrtc::VideoReceiveStream::Config& config = receive_stream->config(); |
- ReceiveRtpConfig receive_config(config.rtp.extensions, |
- UseSendSideBwe(config)); |
{ |
WriteLockScoped write_lock(*receive_crit_); |
+ ReceiveRtpConfig receive_config( |
+ video_rtp_header_extensions_, |
+ UseSendSideBwe(video_rtp_header_extensions_, |
+ configuration.rtp.transport_cc)); |
if (config.rtp.rtx_ssrc) { |
// We record identical config for the rtx stream as for the main |
// stream. Since the transport_send_cc negotiation is per payload |
@@ -838,8 +846,12 @@ void Call::DestroyVideoReceiveStream( |
VideoReceiveStream* receive_stream_impl = |
static_cast<VideoReceiveStream*>(receive_stream); |
const VideoReceiveStream::Config& config = receive_stream_impl->config(); |
+ |
{ |
WriteLockScoped write_lock(*receive_crit_); |
+ receive_side_cc_.GetRemoteBitrateEstimator( |
+ receive_rtp_config_[config.rtp.remote_ssrc].use_send_side_bwe) |
+ ->RemoveStream(config.rtp.remote_ssrc); |
// Remove all ssrcs pointing to a receive stream. As RTX retransmits on a |
// separate SSRC there can be either one or two. |
receive_rtp_config_.erase(config.rtp.remote_ssrc); |
@@ -850,9 +862,6 @@ void Call::DestroyVideoReceiveStream( |
ConfigureSync(config.sync_group); |
} |
- receive_side_cc_.GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
- ->RemoveStream(config.rtp.remote_ssrc); |
- |
UpdateAggregateNetworkState(); |
delete receive_stream_impl; |
} |
@@ -883,7 +892,9 @@ FlexfecReceiveStream* Call::CreateFlexfecReceiveStream( |
RTC_DCHECK(receive_rtp_config_.find(config.remote_ssrc) == |
receive_rtp_config_.end()); |
receive_rtp_config_[config.remote_ssrc] = |
- ReceiveRtpConfig(config.rtp_header_extensions, UseSendSideBwe(config)); |
+ ReceiveRtpConfig(video_rtp_header_extensions_, |
+ config.transport_cc && |
+ UseTransportSeqno(video_rtp_header_extensions_)); |
} |
// TODO(brandtr): Store config in RtcEventLog here. |
@@ -901,12 +912,10 @@ void Call::DestroyFlexfecReceiveStream(FlexfecReceiveStream* receive_stream) { |
const FlexfecReceiveStream::Config& config = receive_stream->GetConfig(); |
uint32_t ssrc = config.remote_ssrc; |
- receive_rtp_config_.erase(ssrc); |
- |
- // Remove all SSRCs pointing to the FlexfecReceiveStreamImpl to be |
- // destroyed. |
- receive_side_cc_.GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
+ receive_side_cc_.GetRemoteBitrateEstimator( |
+ receive_rtp_config_[ssrc].use_send_side_bwe) |
->RemoveStream(ssrc); |
+ receive_rtp_config_.erase(ssrc); |
} |
delete receive_stream; |