| /* |
| * Copyright (c) 2021 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. |
| */ |
| |
| #include "modules/audio_coding/neteq/relative_arrival_delay_tracker.h" |
| |
| #include "test/gtest.h" |
| |
| namespace webrtc { |
| |
| namespace { |
| constexpr int kMaxHistoryMs = 2000; |
| constexpr int kFs = 8000; |
| constexpr int kFrameSizeMs = 20; |
| constexpr int kTsIncrement = kFrameSizeMs * kFs / 1000; |
| constexpr uint32_t kTs = 0x12345678; |
| } // namespace |
| |
| TEST(RelativeArrivalDelayTrackerTest, RelativeArrivalDelay) { |
| TickTimer tick_timer; |
| RelativeArrivalDelayTracker tracker(&tick_timer, kMaxHistoryMs); |
| |
| EXPECT_FALSE(tracker.Update(kTs, kFs)); |
| |
| tick_timer.Increment(kFrameSizeMs / tick_timer.ms_per_tick()); |
| EXPECT_EQ(tracker.Update(kTs + kTsIncrement, kFs), 0); |
| |
| tick_timer.Increment(2 * kFrameSizeMs / tick_timer.ms_per_tick()); |
| EXPECT_EQ(tracker.Update(kTs + 2 * kTsIncrement, kFs), 20); |
| |
| EXPECT_EQ(tracker.Update(kTs, kFs), 60); // Reordered, 60ms delayed. |
| |
| tick_timer.Increment(2 * kFrameSizeMs / tick_timer.ms_per_tick()); |
| EXPECT_EQ(tracker.Update(kTs + 3 * kTsIncrement, kFs), 40); |
| } |
| |
| TEST(RelativeArrivalDelayTrackerTest, ReorderedPackets) { |
| TickTimer tick_timer; |
| RelativeArrivalDelayTracker tracker(&tick_timer, kMaxHistoryMs); |
| |
| // Insert first packet. |
| EXPECT_FALSE(tracker.Update(kTs, kFs)); |
| |
| // Insert reordered packet. |
| EXPECT_EQ(tracker.Update(kTs - 4 * kTsIncrement, kFs), 80); |
| EXPECT_EQ(tracker.newest_timestamp(), kTs); |
| |
| // Insert another reordered packet. |
| EXPECT_EQ(tracker.Update(kTs - kTsIncrement, kFs), 20); |
| EXPECT_EQ(tracker.newest_timestamp(), kTs); |
| |
| // Insert the next packet in order and verify that the relative delay is |
| // estimated based on the first inserted packet. |
| tick_timer.Increment(4 * kFrameSizeMs / tick_timer.ms_per_tick()); |
| EXPECT_EQ(tracker.Update(kTs + kTsIncrement, kFs), 60); |
| EXPECT_EQ(tracker.newest_timestamp(), kTs + kTsIncrement); |
| } |
| |
| TEST(RelativeArrivalDelayTrackerTest, MaxDelayHistory) { |
| TickTimer tick_timer; |
| RelativeArrivalDelayTracker tracker(&tick_timer, kMaxHistoryMs); |
| |
| EXPECT_FALSE(tracker.Update(kTs, kFs)); |
| |
| // Insert 20 ms iat delay in the delay history. |
| tick_timer.Increment(2 * kFrameSizeMs / tick_timer.ms_per_tick()); |
| EXPECT_EQ(tracker.Update(kTs + kTsIncrement, kFs), 20); |
| |
| // Insert next packet with a timestamp difference larger than maximum history |
| // size. This removes the previously inserted iat delay from the history. |
| tick_timer.Increment((kMaxHistoryMs + kFrameSizeMs) / |
| tick_timer.ms_per_tick()); |
| EXPECT_EQ( |
| tracker.Update(kTs + 2 * kTsIncrement + kFs * kMaxHistoryMs / 1000, kFs), |
| 0); |
| } |
| |
| } // namespace webrtc |