Correcting the use of externally reported delay in AEC3

Externally reported delay affects internal delay of the render delay buffer.

Bug: webrtc:9241,chromium:839860
Change-Id: Ia4e67eaea739e732dd6dcfec343dd7ee37ef883f
Reviewed-on: https://webrtc-review.googlesource.com/74704
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Reviewed-by: Per Åhgren <peah@webrtc.org>
Commit-Queue: Gustaf Ullberg <gustaf@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23144}
This commit is contained in:
Gustaf Ullberg 2018-05-07 13:36:07 +02:00 committed by Commit Bot
parent c56ff11984
commit 623d281792

View File

@ -203,7 +203,7 @@ void RenderDelayBufferImpl::Reset() {
// Check for any external audio buffer delay and whether it is feasible.
if (external_audio_buffer_delay_) {
constexpr size_t kHeadroom = 1;
constexpr size_t kHeadroom = 2;
size_t external_delay_to_set = 0;
if (*external_audio_buffer_delay_ < kHeadroom) {
external_delay_to_set = 0;
@ -211,13 +211,14 @@ void RenderDelayBufferImpl::Reset() {
external_delay_to_set = *external_audio_buffer_delay_ - kHeadroom;
}
constexpr size_t kMaxExternalDelay = 170 / 4;
external_delay_to_set = std::min(external_delay_to_set, kMaxExternalDelay);
external_delay_to_set = std::min(external_delay_to_set, MaxDelay());
// When an external delay estimate is available, use that delay as the
// initial render buffer delay. Avoid verifying the set delay.
external_delay_verified_after_reset_ = true;
SetDelay(external_delay_to_set);
// initial render buffer delay.
internal_delay_ = external_delay_to_set;
ApplyDelay(*internal_delay_);
delay_ = MapInternalDelayToExternalDelay();
external_delay_verified_after_reset_ = false;
} else {
// If an external delay estimate is not available, use that delay as the
@ -330,7 +331,12 @@ RenderDelayBufferImpl::PrepareCaptureProcessing() {
// Sets the delay and returns a bool indicating whether the delay was changed.
bool RenderDelayBufferImpl::SetDelay(size_t delay) {
if (!external_delay_verified_after_reset_ && external_audio_buffer_delay_) {
if (!external_delay_verified_after_reset_ && external_audio_buffer_delay_ &&
delay_) {
int difference = static_cast<int>(delay) - static_cast<int>(*delay_);
RTC_LOG(LS_WARNING) << "Mismatch between first estimated delay after reset "
"and external delay: "
<< difference << " blocks";
external_delay_verified_after_reset_ = true;
}
if (delay_ && *delay_ == delay) {
@ -365,6 +371,8 @@ void RenderDelayBufferImpl::SetAudioBufferDelay(size_t delay_ms) {
<< "Receiving a first reported externally buffer delay of " << delay_ms
<< " ms.";
}
// Convert delay from milliseconds to blocks (rounded down).
external_audio_buffer_delay_ = delay_ms / 4;
}