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

This CL implements {,Logging}DelayVariationCalculator, whose purpose is to calculate simple inter-arrival metrics for a sequence of RTP frames. Uses could include RtcEventLog analysis and ad hoc testing. Want lgtm: asapersson Bug: webrtc:15213 Change-Id: I3f9d13a2c4fa66b6f1229c1b6fcd66a6911070de Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/306741 Commit-Queue: Rasmus Brandt <brandtr@webrtc.org> Reviewed-by: Åsa Persson <asapersson@webrtc.org> Reviewed-by: Jeremy Leconte <jleconte@webrtc.org> Cr-Commit-Position: refs/heads/main@{#40247}
108 lines
3.9 KiB
C++
108 lines
3.9 KiB
C++
/*
|
|
* Copyright 2023 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 "test/jitter/delay_variation_calculator.h"
|
|
|
|
#include "api/numerics/samples_stats_counter.h"
|
|
#include "api/units/timestamp.h"
|
|
#include "test/gmock.h"
|
|
#include "test/gtest.h"
|
|
|
|
namespace webrtc {
|
|
namespace test {
|
|
|
|
MATCHER_P(HasLength, s, "") {
|
|
bool c1 = arg.rtp_timestamps.NumSamples() == s;
|
|
bool c2 = arg.arrival_times_ms.NumSamples() == s;
|
|
bool c3 = arg.sizes_bytes.NumSamples() == s;
|
|
bool c4 = arg.inter_departure_times_ms.NumSamples() == s;
|
|
bool c5 = arg.inter_arrival_times_ms.NumSamples() == s;
|
|
bool c6 = arg.inter_delay_variations_ms.NumSamples() == s;
|
|
bool c7 = arg.inter_size_variations_bytes.NumSamples() == s;
|
|
*result_listener << "c: " << c1 << c2 << c3 << c4 << c5 << c6 << c7;
|
|
return c1 && c2 && c3 && c4 && c5 && c6 && c7;
|
|
}
|
|
|
|
TEST(DelayVariationCalculatorTest, NoTimeSeriesWithoutFrame) {
|
|
DelayVariationCalculator calc;
|
|
|
|
EXPECT_THAT(calc.time_series(), HasLength(0));
|
|
}
|
|
|
|
TEST(DelayVariationCalculatorTest, PartialTimeSeriesWithOneFrame) {
|
|
DelayVariationCalculator calc;
|
|
|
|
calc.Insert(3000, Timestamp::Millis(33), DataSize::Bytes(100));
|
|
|
|
DelayVariationCalculator::TimeSeries ts = calc.time_series();
|
|
ASSERT_THAT(ts, HasLength(1));
|
|
auto v0 = [](const SamplesStatsCounter& c) {
|
|
return c.GetTimedSamples()[0].value;
|
|
};
|
|
EXPECT_EQ(v0(ts.rtp_timestamps), 3000);
|
|
EXPECT_EQ(v0(ts.arrival_times_ms), 33);
|
|
EXPECT_EQ(v0(ts.sizes_bytes), 100);
|
|
EXPECT_EQ(v0(ts.inter_departure_times_ms), 0);
|
|
EXPECT_EQ(v0(ts.inter_arrival_times_ms), 0);
|
|
EXPECT_EQ(v0(ts.inter_delay_variations_ms), 0);
|
|
EXPECT_EQ(v0(ts.inter_size_variations_bytes), 0);
|
|
}
|
|
|
|
TEST(DelayVariationCalculatorTest, TimeSeriesWithTwoFrames) {
|
|
DelayVariationCalculator calc;
|
|
|
|
calc.Insert(3000, Timestamp::Millis(33), DataSize::Bytes(100));
|
|
calc.Insert(6000, Timestamp::Millis(66), DataSize::Bytes(100));
|
|
|
|
DelayVariationCalculator::TimeSeries ts = calc.time_series();
|
|
ASSERT_THAT(ts, HasLength(2));
|
|
auto v1 = [](const SamplesStatsCounter& c) {
|
|
return c.GetTimedSamples()[1].value;
|
|
};
|
|
EXPECT_EQ(v1(ts.rtp_timestamps), 6000);
|
|
EXPECT_EQ(v1(ts.arrival_times_ms), 66);
|
|
EXPECT_EQ(v1(ts.sizes_bytes), 100);
|
|
EXPECT_EQ(v1(ts.inter_departure_times_ms), 33.333);
|
|
EXPECT_EQ(v1(ts.inter_arrival_times_ms), 33);
|
|
EXPECT_EQ(v1(ts.inter_delay_variations_ms), -0.333);
|
|
EXPECT_EQ(v1(ts.inter_size_variations_bytes), 0);
|
|
}
|
|
|
|
TEST(DelayVariationCalculatorTest, MetadataRecordedForAllTimeSeriesAndFrames) {
|
|
DelayVariationCalculator calc;
|
|
|
|
calc.Insert(3000, Timestamp::Millis(33), DataSize::Bytes(100), /*sl=*/0,
|
|
/*tl=*/0, VideoFrameType::kVideoFrameKey);
|
|
calc.Insert(6000, Timestamp::Millis(66), DataSize::Bytes(100), /*sl=*/0,
|
|
/*tl=*/1, VideoFrameType::kVideoFrameDelta);
|
|
|
|
DelayVariationCalculator::TimeSeries ts = calc.time_series();
|
|
ASSERT_THAT(ts, HasLength(2));
|
|
auto v = [](const SamplesStatsCounter* c, int n, std::string key) {
|
|
return c->GetTimedSamples()[n].metadata.at(key);
|
|
};
|
|
for (const auto* c :
|
|
{&ts.rtp_timestamps, &ts.arrival_times_ms, &ts.sizes_bytes,
|
|
&ts.inter_departure_times_ms, &ts.inter_arrival_times_ms,
|
|
&ts.inter_delay_variations_ms, &ts.inter_size_variations_bytes}) {
|
|
EXPECT_EQ(v(c, 0, "sl"), "0");
|
|
EXPECT_EQ(v(c, 0, "tl"), "0");
|
|
EXPECT_EQ(v(c, 0, "frame_type"), "key");
|
|
EXPECT_EQ(v(c, 1, "sl_prev"), "0");
|
|
EXPECT_EQ(v(c, 1, "tl_prev"), "0");
|
|
EXPECT_EQ(v(c, 1, "frame_type_prev"), "key");
|
|
EXPECT_EQ(v(c, 1, "sl"), "0");
|
|
EXPECT_EQ(v(c, 1, "tl"), "1");
|
|
EXPECT_EQ(v(c, 1, "frame_type"), "delta");
|
|
}
|
|
}
|
|
|
|
} // namespace test
|
|
} // namespace webrtc
|