Reland "Change buffer level filter to store current level in number of samples."
This is a reland of 87977dd06e702ed517f26235c12e37bd927527c7 Original change's description: > Change buffer level filter to store current level in number of samples. > > The buffer level should not be converted back and forth between samples and packets in case of variable packet lengths. > > Bug: webrtc:10736 > Change-Id: Ia08dcfac3d8104dc79fbad0704a5f6f12a050a01 > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/142178 > Reviewed-by: Minyue Li <minyue@webrtc.org> > Commit-Queue: Jakob Ivarsson <jakobi@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#28368} Bug: webrtc:10736 Change-Id: I1ff603e65cdd31c7429f36b035dcc00a17b68f3b Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/143787 Commit-Queue: Minyue Li <minyue@webrtc.org> Reviewed-by: Minyue Li <minyue@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28393}
This commit is contained in:
committed by
Commit Bot
parent
4d6951669c
commit
0ded32d5a3
@ -113,11 +113,9 @@ Operations DecisionLogic::GetDecision(const SyncBuffer& sync_buffer,
|
||||
cng_state_ = kCngInternalOn;
|
||||
}
|
||||
|
||||
const size_t samples_left =
|
||||
sync_buffer.FutureLength() - expand.overlap_length();
|
||||
// TODO(jakobi): Use buffer span instead of num samples.
|
||||
const size_t cur_size_samples =
|
||||
samples_left + packet_buffer_.NumSamplesInBuffer(decoder_frame_length);
|
||||
packet_buffer_.NumSamplesInBuffer(decoder_frame_length);
|
||||
|
||||
prev_time_scale_ =
|
||||
prev_time_scale_ && (prev_mode == kModeAccelerateSuccess ||
|
||||
@ -175,8 +173,7 @@ Operations DecisionLogic::GetDecision(const SyncBuffer& sync_buffer,
|
||||
// if the mute factor is low enough (otherwise the expansion was short enough
|
||||
// to not be noticable).
|
||||
// Note that the MuteFactor is in Q14, so a value of 16384 corresponds to 1.
|
||||
size_t current_span =
|
||||
samples_left + packet_buffer_.GetSpanSamples(decoder_frame_length);
|
||||
size_t current_span = packet_buffer_.GetSpanSamples(decoder_frame_length);
|
||||
if ((prev_mode == kModeExpand || prev_mode == kModeCodecPlc) &&
|
||||
expand.MuteFactor(0) < 16384 / 2 &&
|
||||
current_span < static_cast<size_t>(delay_manager_->TargetLevel() *
|
||||
@ -193,9 +190,9 @@ Operations DecisionLogic::GetDecision(const SyncBuffer& sync_buffer,
|
||||
return ExpectedPacketAvailable(prev_mode, play_dtmf);
|
||||
} else if (!PacketBuffer::IsObsoleteTimestamp(
|
||||
available_timestamp, target_timestamp, five_seconds_samples)) {
|
||||
return FuturePacketAvailable(
|
||||
sync_buffer, expand, decoder_frame_length, prev_mode, target_timestamp,
|
||||
available_timestamp, play_dtmf, generated_noise_samples);
|
||||
return FuturePacketAvailable(decoder_frame_length, prev_mode,
|
||||
target_timestamp, available_timestamp,
|
||||
play_dtmf, generated_noise_samples);
|
||||
} else {
|
||||
// This implies that available_timestamp < target_timestamp, which can
|
||||
// happen when a new stream or codec is received. Signal for a reset.
|
||||
@ -215,19 +212,13 @@ void DecisionLogic::FilterBufferLevel(size_t buffer_size_samples) {
|
||||
buffer_level_filter_->SetTargetBufferLevel(
|
||||
delay_manager_->base_target_level());
|
||||
|
||||
size_t buffer_size_packets = 0;
|
||||
if (packet_length_samples_ > 0) {
|
||||
// Calculate size in packets.
|
||||
buffer_size_packets = buffer_size_samples / packet_length_samples_;
|
||||
}
|
||||
int sample_memory_local = 0;
|
||||
if (prev_time_scale_) {
|
||||
sample_memory_local = sample_memory_;
|
||||
timescale_countdown_ = tick_timer_->GetNewCountdown(kMinTimescaleInterval);
|
||||
}
|
||||
|
||||
buffer_level_filter_->Update(buffer_size_packets, sample_memory_local,
|
||||
packet_length_samples_);
|
||||
buffer_level_filter_->Update(buffer_size_samples, sample_memory_local);
|
||||
prev_time_scale_ = false;
|
||||
}
|
||||
|
||||
@ -283,15 +274,22 @@ Operations DecisionLogic::NoPacket(bool play_dtmf) {
|
||||
Operations DecisionLogic::ExpectedPacketAvailable(Modes prev_mode,
|
||||
bool play_dtmf) {
|
||||
if (!disallow_time_stretching_ && prev_mode != kModeExpand && !play_dtmf) {
|
||||
// Check criterion for time-stretching.
|
||||
// Check criterion for time-stretching. The values are in number of packets
|
||||
// in Q8.
|
||||
int low_limit, high_limit;
|
||||
delay_manager_->BufferLimits(&low_limit, &high_limit);
|
||||
if (buffer_level_filter_->filtered_current_level() >= high_limit << 2)
|
||||
int buffer_level_packets = 0;
|
||||
if (packet_length_samples_ > 0) {
|
||||
buffer_level_packets =
|
||||
((1 << 8) * buffer_level_filter_->filtered_current_level()) /
|
||||
packet_length_samples_;
|
||||
}
|
||||
if (buffer_level_packets >= high_limit << 2)
|
||||
return kFastAccelerate;
|
||||
if (TimescaleAllowed()) {
|
||||
if (buffer_level_filter_->filtered_current_level() >= high_limit)
|
||||
if (buffer_level_packets >= high_limit)
|
||||
return kAccelerate;
|
||||
if (buffer_level_filter_->filtered_current_level() < low_limit)
|
||||
if (buffer_level_packets < low_limit)
|
||||
return kPreemptiveExpand;
|
||||
}
|
||||
}
|
||||
@ -299,8 +297,6 @@ Operations DecisionLogic::ExpectedPacketAvailable(Modes prev_mode,
|
||||
}
|
||||
|
||||
Operations DecisionLogic::FuturePacketAvailable(
|
||||
const SyncBuffer& sync_buffer,
|
||||
const Expand& expand,
|
||||
size_t decoder_frame_length,
|
||||
Modes prev_mode,
|
||||
uint32_t target_timestamp,
|
||||
@ -327,10 +323,8 @@ Operations DecisionLogic::FuturePacketAvailable(
|
||||
return kNormal;
|
||||
}
|
||||
|
||||
const size_t samples_left =
|
||||
sync_buffer.FutureLength() - expand.overlap_length();
|
||||
const size_t cur_size_samples =
|
||||
samples_left + packet_buffer_.NumPacketsInBuffer() * decoder_frame_length;
|
||||
packet_buffer_.NumPacketsInBuffer() * decoder_frame_length;
|
||||
|
||||
// If previous was comfort noise, then no merge is needed.
|
||||
if (prev_mode == kModeRfc3389Cng || prev_mode == kModeCodecInternalCng) {
|
||||
@ -365,8 +359,13 @@ Operations DecisionLogic::FuturePacketAvailable(
|
||||
}
|
||||
|
||||
bool DecisionLogic::UnderTargetLevel() const {
|
||||
return buffer_level_filter_->filtered_current_level() <=
|
||||
delay_manager_->TargetLevel();
|
||||
int buffer_level_packets = 0;
|
||||
if (packet_length_samples_ > 0) {
|
||||
buffer_level_packets =
|
||||
((1 << 8) * buffer_level_filter_->filtered_current_level()) /
|
||||
packet_length_samples_;
|
||||
}
|
||||
return buffer_level_packets <= delay_manager_->TargetLevel();
|
||||
}
|
||||
|
||||
bool DecisionLogic::ReinitAfterExpands(uint32_t timestamp_leap) const {
|
||||
|
||||
Reference in New Issue
Block a user