| Index: webrtc/audio/audio_receive_stream.cc
|
| diff --git a/webrtc/audio/audio_receive_stream.cc b/webrtc/audio/audio_receive_stream.cc
|
| index dfad79f9d76420460267f2fdd0e1265a928b8786..64d008326d2691e068bd3d7c405dfd11a5fc9044 100644
|
| --- a/webrtc/audio/audio_receive_stream.cc
|
| +++ b/webrtc/audio/audio_receive_stream.cc
|
| @@ -18,6 +18,7 @@
|
| #include "webrtc/audio/conversion.h"
|
| #include "webrtc/base/checks.h"
|
| #include "webrtc/base/logging.h"
|
| +#include "webrtc/call/congestion_controller.h"
|
| #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
|
| #include "webrtc/system_wrappers/include/tick_util.h"
|
| #include "webrtc/voice_engine/channel_proxy.h"
|
| @@ -30,6 +31,21 @@
|
| #include "webrtc/voice_engine/voice_engine_impl.h"
|
|
|
| namespace webrtc {
|
| +namespace {
|
| +
|
| +bool UseSendSideBwe(const webrtc::AudioReceiveStream::Config& config) {
|
| + if (!config.rtp.transport_cc) {
|
| + return false;
|
| + }
|
| + for (const auto& extension : config.rtp.extensions) {
|
| + if (extension.name == RtpExtension::kTransportSequenceNumber) {
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +} // namespace
|
| +
|
| std::string AudioReceiveStream::Config::Rtp::ToString() const {
|
| std::stringstream ss;
|
| ss << "{remote_ssrc: " << remote_ssrc;
|
| @@ -65,17 +81,16 @@ std::string AudioReceiveStream::Config::ToString() const {
|
|
|
| namespace internal {
|
| AudioReceiveStream::AudioReceiveStream(
|
| - RemoteBitrateEstimator* remote_bitrate_estimator,
|
| + CongestionController* congestion_controller,
|
| const webrtc::AudioReceiveStream::Config& config,
|
| const rtc::scoped_refptr<webrtc::AudioState>& audio_state)
|
| - : remote_bitrate_estimator_(remote_bitrate_estimator),
|
| - config_(config),
|
| + : config_(config),
|
| audio_state_(audio_state),
|
| rtp_header_parser_(RtpHeaderParser::Create()) {
|
| LOG(LS_INFO) << "AudioReceiveStream: " << config_.ToString();
|
| RTC_DCHECK_NE(config_.voe_channel_id, -1);
|
| - RTC_DCHECK(remote_bitrate_estimator_);
|
| RTC_DCHECK(audio_state_.get());
|
| + RTC_DCHECK(congestion_controller);
|
| RTC_DCHECK(rtp_header_parser_);
|
|
|
| VoiceEngineImpl* voe_impl = static_cast<VoiceEngineImpl*>(voice_engine());
|
| @@ -93,8 +108,6 @@ AudioReceiveStream::AudioReceiveStream(
|
| kRtpExtensionAbsoluteSendTime, extension.id);
|
| RTC_DCHECK(registered);
|
| } else if (extension.name == RtpExtension::kTransportSequenceNumber) {
|
| - // TODO(holmer): Need to do something here or in DeliverRtp() to actually
|
| - // handle audio packets with this header extension.
|
| bool registered = rtp_header_parser_->RegisterRtpHeaderExtension(
|
| kRtpExtensionTransportSequenceNumber, extension.id);
|
| RTC_DCHECK(registered);
|
| @@ -102,11 +115,28 @@ AudioReceiveStream::AudioReceiveStream(
|
| RTC_NOTREACHED() << "Unsupported RTP extension.";
|
| }
|
| }
|
| + // Configure bandwidth estimation.
|
| + channel_proxy_->SetCongestionControlObjects(
|
| + nullptr, nullptr, congestion_controller->packet_router());
|
| + if (config.combined_audio_video_bwe) {
|
| + if (UseSendSideBwe(config)) {
|
| + remote_bitrate_estimator_ =
|
| + congestion_controller->GetRemoteBitrateEstimator(true);
|
| + } else {
|
| + remote_bitrate_estimator_ =
|
| + congestion_controller->GetRemoteBitrateEstimator(false);
|
| + }
|
| + RTC_DCHECK(remote_bitrate_estimator_);
|
| + }
|
| }
|
|
|
| AudioReceiveStream::~AudioReceiveStream() {
|
| RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| LOG(LS_INFO) << "~AudioReceiveStream: " << config_.ToString();
|
| + channel_proxy_->SetCongestionControlObjects(nullptr, nullptr, nullptr);
|
| + if (remote_bitrate_estimator_) {
|
| + remote_bitrate_estimator_->RemoveStream(config_.rtp.remote_ssrc);
|
| + }
|
| }
|
|
|
| void AudioReceiveStream::Start() {
|
| @@ -141,10 +171,12 @@ bool AudioReceiveStream::DeliverRtp(const uint8_t* packet,
|
| return false;
|
| }
|
|
|
| - // Only forward if the parsed header has absolute sender time. RTP timestamps
|
| - // may have different rates for audio and video and shouldn't be mixed.
|
| - if (config_.combined_audio_video_bwe &&
|
| - header.extension.hasAbsoluteSendTime) {
|
| + // Only forward if the parsed header has one of the headers necessary for
|
| + // bandwidth estimation. RTP timestamps has different rates for audio and
|
| + // video and shouldn't be mixed.
|
| + if (remote_bitrate_estimator_ &&
|
| + (header.extension.hasAbsoluteSendTime ||
|
| + header.extension.hasTransportSequenceNumber)) {
|
| int64_t arrival_time_ms = TickTime::MillisecondTimestamp();
|
| if (packet_time.timestamp >= 0)
|
| arrival_time_ms = (packet_time.timestamp + 500) / 1000;
|
|
|