Add PeerConnection option to configure minimum audio jitter buffer delay.
Note that this value will override the minimum delay that is used for audio/video sync. Bug: webrtc:10053 Change-Id: Ia129f6c9ee9da5d00a3d955afaaa6e8f0c2bee33 Reviewed-on: https://webrtc-review.googlesource.com/c/112121 Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Reviewed-by: Ivo Creusen <ivoc@webrtc.org> Commit-Queue: Jakob Ivarsson <jakobi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25805}
This commit is contained in:
committed by
Commit Bot
parent
c7f1a0af92
commit
10403ae87c
@ -31,7 +31,7 @@ TEST(DecisionLogic, CreateAndDestroy) {
|
||||
TickTimer tick_timer;
|
||||
PacketBuffer packet_buffer(10, &tick_timer);
|
||||
DelayPeakDetector delay_peak_detector(&tick_timer);
|
||||
DelayManager delay_manager(240, &delay_peak_detector, &tick_timer);
|
||||
DelayManager delay_manager(240, 0, &delay_peak_detector, &tick_timer);
|
||||
BufferLevelFilter buffer_level_filter;
|
||||
DecisionLogic* logic = DecisionLogic::Create(
|
||||
fs_hz, output_size_samples, false, &decoder_database, packet_buffer,
|
||||
@ -48,7 +48,7 @@ TEST(DecisionLogic, PostponeDecodingAfterExpansionSettings) {
|
||||
TickTimer tick_timer;
|
||||
PacketBuffer packet_buffer(10, &tick_timer);
|
||||
DelayPeakDetector delay_peak_detector(&tick_timer);
|
||||
DelayManager delay_manager(240, &delay_peak_detector, &tick_timer);
|
||||
DelayManager delay_manager(240, 0, &delay_peak_detector, &tick_timer);
|
||||
BufferLevelFilter buffer_level_filter;
|
||||
{
|
||||
test::ScopedFieldTrials field_trial(
|
||||
|
||||
@ -62,6 +62,7 @@ absl::optional<int> GetForcedLimitProbability() {
|
||||
namespace webrtc {
|
||||
|
||||
DelayManager::DelayManager(size_t max_packets_in_buffer,
|
||||
int base_min_target_delay_ms,
|
||||
DelayPeakDetector* peak_detector,
|
||||
const TickTimer* tick_timer)
|
||||
: first_packet_received_(false),
|
||||
@ -69,13 +70,14 @@ DelayManager::DelayManager(size_t max_packets_in_buffer,
|
||||
iat_vector_(kMaxIat + 1, 0),
|
||||
iat_factor_(0),
|
||||
tick_timer_(tick_timer),
|
||||
base_min_target_delay_ms_(base_min_target_delay_ms),
|
||||
base_target_level_(4), // In Q0 domain.
|
||||
target_level_(base_target_level_ << 8), // In Q8 domain.
|
||||
packet_len_ms_(0),
|
||||
streaming_mode_(false),
|
||||
last_seq_no_(0),
|
||||
last_timestamp_(0),
|
||||
minimum_delay_ms_(0),
|
||||
minimum_delay_ms_(base_min_target_delay_ms_),
|
||||
maximum_delay_ms_(target_level_),
|
||||
iat_cumulative_sum_(0),
|
||||
max_iat_cumulative_sum_(0),
|
||||
@ -85,6 +87,8 @@ DelayManager::DelayManager(size_t max_packets_in_buffer,
|
||||
field_trial::IsEnabled("WebRTC-Audio-NetEqFramelengthExperiment")),
|
||||
forced_limit_probability_(GetForcedLimitProbability()) {
|
||||
assert(peak_detector); // Should never be NULL.
|
||||
RTC_DCHECK_GE(base_min_target_delay_ms_, 0);
|
||||
RTC_DCHECK_LE(minimum_delay_ms_, maximum_delay_ms_);
|
||||
|
||||
Reset();
|
||||
}
|
||||
@ -485,7 +489,7 @@ bool DelayManager::SetMinimumDelay(int delay_ms) {
|
||||
static_cast<int>(3 * max_packets_in_buffer_ * packet_len_ms_ / 4))) {
|
||||
return false;
|
||||
}
|
||||
minimum_delay_ms_ = delay_ms;
|
||||
minimum_delay_ms_ = std::max(delay_ms, base_min_target_delay_ms_);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -31,9 +31,11 @@ class DelayManager {
|
||||
|
||||
// Create a DelayManager object. Notify the delay manager that the packet
|
||||
// buffer can hold no more than |max_packets_in_buffer| packets (i.e., this
|
||||
// is the number of packet slots in the buffer). Supply a PeakDetector
|
||||
// object to the DelayManager.
|
||||
// is the number of packet slots in the buffer) and that the target delay
|
||||
// should be greater than or equal to |base_min_target_delay_ms|. Supply a
|
||||
// PeakDetector object to the DelayManager.
|
||||
DelayManager(size_t max_packets_in_buffer,
|
||||
int base_min_target_delay_ms,
|
||||
DelayPeakDetector* peak_detector,
|
||||
const TickTimer* tick_timer);
|
||||
|
||||
@ -144,6 +146,8 @@ class DelayManager {
|
||||
IATVector iat_vector_; // Histogram of inter-arrival times.
|
||||
int iat_factor_; // Forgetting factor for updating the IAT histogram (Q15).
|
||||
const TickTimer* tick_timer_;
|
||||
const int base_min_target_delay_ms_; // Lower bound for target_level_ and
|
||||
// minimum_delay_ms_.
|
||||
// Time elapsed since last packet.
|
||||
std::unique_ptr<TickTimer::Stopwatch> packet_iat_stopwatch_;
|
||||
int base_target_level_; // Currently preferred buffer level before peak
|
||||
|
||||
@ -27,6 +27,7 @@ using ::testing::_;
|
||||
class DelayManagerTest : public ::testing::Test {
|
||||
protected:
|
||||
static const int kMaxNumberOfPackets = 240;
|
||||
static const int kMinDelayMs = 0;
|
||||
static const int kTimeStepMs = 10;
|
||||
static const int kFs = 8000;
|
||||
static const int kFrameSizeMs = 20;
|
||||
@ -56,7 +57,8 @@ void DelayManagerTest::SetUp() {
|
||||
|
||||
void DelayManagerTest::RecreateDelayManager() {
|
||||
EXPECT_CALL(detector_, Reset()).Times(1);
|
||||
dm_.reset(new DelayManager(kMaxNumberOfPackets, &detector_, &tick_timer_));
|
||||
dm_.reset(new DelayManager(kMaxNumberOfPackets, kMinDelayMs, &detector_,
|
||||
&tick_timer_));
|
||||
}
|
||||
|
||||
void DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
|
||||
|
||||
@ -113,6 +113,7 @@ class NetEq {
|
||||
bool enable_post_decode_vad = false;
|
||||
size_t max_packets_in_buffer = 50;
|
||||
int max_delay_ms = 2000;
|
||||
int min_delay_ms = 0;
|
||||
bool enable_fast_accelerate = false;
|
||||
bool enable_muted_state = false;
|
||||
absl::optional<AudioCodecPairId> codec_pair_id;
|
||||
|
||||
@ -20,9 +20,13 @@ namespace webrtc {
|
||||
class MockDelayManager : public DelayManager {
|
||||
public:
|
||||
MockDelayManager(size_t max_packets_in_buffer,
|
||||
int base_min_target_delay_ms,
|
||||
DelayPeakDetector* peak_detector,
|
||||
const TickTimer* tick_timer)
|
||||
: DelayManager(max_packets_in_buffer, peak_detector, tick_timer) {}
|
||||
: DelayManager(max_packets_in_buffer,
|
||||
base_min_target_delay_ms,
|
||||
peak_detector,
|
||||
tick_timer) {}
|
||||
virtual ~MockDelayManager() { Die(); }
|
||||
MOCK_METHOD0(Die, void());
|
||||
MOCK_CONST_METHOD0(iat_vector, const IATVector&());
|
||||
|
||||
@ -63,6 +63,7 @@ NetEqImpl::Dependencies::Dependencies(
|
||||
new DecoderDatabase(decoder_factory, config.codec_pair_id)),
|
||||
delay_peak_detector(new DelayPeakDetector(tick_timer.get())),
|
||||
delay_manager(new DelayManager(config.max_packets_in_buffer,
|
||||
config.min_delay_ms,
|
||||
delay_peak_detector.get(),
|
||||
tick_timer.get())),
|
||||
dtmf_buffer(new DtmfBuffer(config.sample_rate_hz)),
|
||||
|
||||
@ -92,7 +92,8 @@ class NetEqImplTest : public ::testing::Test {
|
||||
|
||||
if (use_mock_delay_manager_) {
|
||||
std::unique_ptr<MockDelayManager> mock(new MockDelayManager(
|
||||
config_.max_packets_in_buffer, delay_peak_detector_, tick_timer_));
|
||||
config_.max_packets_in_buffer, config_.min_delay_ms,
|
||||
delay_peak_detector_, tick_timer_));
|
||||
mock_delay_manager_ = mock.get();
|
||||
EXPECT_CALL(*mock_delay_manager_, set_streaming_mode(false)).Times(1);
|
||||
deps.delay_manager = std::move(mock);
|
||||
|
||||
Reference in New Issue
Block a user