mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 22:00:47 +01:00

Currently, if the last packet was reordered (e.g. due to retransmission) then the next packet's inter-arrival time will be estimated incorrectly due to the jump in sequence numbers. This change prevents that by not resetting the stopwatch on reordered packets. This will also better estimate inter-arrival times when we have multiple reordered packets in a burst. Currently we would only measure the iat of the first reordered packet correctly and not the ones coming after it. There is a slight risk introducing this: If we would receive an out of order packet far into the future (in sequence numbers) and then continue getting packets in the normal order, then we would not update the current sequence number for these and incorrectly estimate their inter-arrival times since they would all be considered reordered. Change-Id: Ic938a37cbddf1cb9c30b610218f56794568d3d01 Bug: webrtc:10178 Reviewed-on: https://webrtc-review.googlesource.com/c/119949 Reviewed-by: Minyue Li <minyue@webrtc.org> Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org> Commit-Queue: Jakob Ivarsson <jakobi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26572}
100 lines
4.2 KiB
C++
100 lines
4.2 KiB
C++
/*
|
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
// Unit tests for DecisionLogic class and derived classes.
|
|
|
|
#include "modules/audio_coding/neteq/decision_logic.h"
|
|
#include "modules/audio_coding/neteq/buffer_level_filter.h"
|
|
#include "modules/audio_coding/neteq/decoder_database.h"
|
|
#include "modules/audio_coding/neteq/delay_manager.h"
|
|
#include "modules/audio_coding/neteq/delay_peak_detector.h"
|
|
#include "modules/audio_coding/neteq/packet_buffer.h"
|
|
#include "modules/audio_coding/neteq/tick_timer.h"
|
|
#include "test/field_trial.h"
|
|
#include "test/gtest.h"
|
|
#include "test/mock_audio_decoder_factory.h"
|
|
|
|
namespace webrtc {
|
|
|
|
TEST(DecisionLogic, CreateAndDestroy) {
|
|
int fs_hz = 8000;
|
|
int output_size_samples = fs_hz / 100; // Samples per 10 ms.
|
|
DecoderDatabase decoder_database(
|
|
new rtc::RefCountedObject<MockAudioDecoderFactory>, absl::nullopt);
|
|
TickTimer tick_timer;
|
|
PacketBuffer packet_buffer(10, &tick_timer);
|
|
DelayPeakDetector delay_peak_detector(&tick_timer, false);
|
|
DelayManager delay_manager(240, 0, false, &delay_peak_detector, &tick_timer);
|
|
BufferLevelFilter buffer_level_filter;
|
|
DecisionLogic* logic = DecisionLogic::Create(
|
|
fs_hz, output_size_samples, false, &decoder_database, packet_buffer,
|
|
&delay_manager, &buffer_level_filter, &tick_timer);
|
|
delete logic;
|
|
}
|
|
|
|
TEST(DecisionLogic, PostponeDecodingAfterExpansionSettings) {
|
|
constexpr int kDefaultPostponeDecodingLevel = 50;
|
|
constexpr int kFsHz = 8000;
|
|
constexpr int kOutputSizeSamples = kFsHz / 100; // Samples per 10 ms.
|
|
DecoderDatabase decoder_database(
|
|
new rtc::RefCountedObject<MockAudioDecoderFactory>, absl::nullopt);
|
|
TickTimer tick_timer;
|
|
PacketBuffer packet_buffer(10, &tick_timer);
|
|
DelayPeakDetector delay_peak_detector(&tick_timer, false);
|
|
DelayManager delay_manager(240, 0, false, &delay_peak_detector, &tick_timer);
|
|
BufferLevelFilter buffer_level_filter;
|
|
{
|
|
test::ScopedFieldTrials field_trial(
|
|
"WebRTC-Audio-NetEqPostponeDecodingAfterExpand/Enabled/");
|
|
DecisionLogic logic(kFsHz, kOutputSizeSamples, false, &decoder_database,
|
|
packet_buffer, &delay_manager, &buffer_level_filter,
|
|
&tick_timer);
|
|
EXPECT_EQ(kDefaultPostponeDecodingLevel,
|
|
logic.postpone_decoding_level_for_test());
|
|
}
|
|
{
|
|
test::ScopedFieldTrials field_trial(
|
|
"WebRTC-Audio-NetEqPostponeDecodingAfterExpand/Enabled-65/");
|
|
DecisionLogic logic(kFsHz, kOutputSizeSamples, false, &decoder_database,
|
|
packet_buffer, &delay_manager, &buffer_level_filter,
|
|
&tick_timer);
|
|
EXPECT_EQ(65, logic.postpone_decoding_level_for_test());
|
|
}
|
|
{
|
|
test::ScopedFieldTrials field_trial(
|
|
"WebRTC-Audio-NetEqPostponeDecodingAfterExpand/Disabled/");
|
|
DecisionLogic logic(kFsHz, kOutputSizeSamples, false, &decoder_database,
|
|
packet_buffer, &delay_manager, &buffer_level_filter,
|
|
&tick_timer);
|
|
EXPECT_EQ(0, logic.postpone_decoding_level_for_test());
|
|
}
|
|
{
|
|
test::ScopedFieldTrials field_trial(
|
|
"WebRTC-Audio-NetEqPostponeDecodingAfterExpand/Enabled--1/");
|
|
DecisionLogic logic(kFsHz, kOutputSizeSamples, false, &decoder_database,
|
|
packet_buffer, &delay_manager, &buffer_level_filter,
|
|
&tick_timer);
|
|
EXPECT_EQ(kDefaultPostponeDecodingLevel,
|
|
logic.postpone_decoding_level_for_test());
|
|
}
|
|
{
|
|
test::ScopedFieldTrials field_trial(
|
|
"WebRTC-Audio-NetEqPostponeDecodingAfterExpand/Enabled-101/");
|
|
DecisionLogic logic(kFsHz, kOutputSizeSamples, false, &decoder_database,
|
|
packet_buffer, &delay_manager, &buffer_level_filter,
|
|
&tick_timer);
|
|
EXPECT_EQ(kDefaultPostponeDecodingLevel,
|
|
logic.postpone_decoding_level_for_test());
|
|
}
|
|
}
|
|
|
|
// TODO(hlundin): Write more tests.
|
|
|
|
} // namespace webrtc
|