summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/test/pc/e2e/analyzer/video/dvqa/frames_storage_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/test/pc/e2e/analyzer/video/dvqa/frames_storage_test.cc')
-rw-r--r--third_party/libwebrtc/test/pc/e2e/analyzer/video/dvqa/frames_storage_test.cc158
1 files changed, 158 insertions, 0 deletions
diff --git a/third_party/libwebrtc/test/pc/e2e/analyzer/video/dvqa/frames_storage_test.cc b/third_party/libwebrtc/test/pc/e2e/analyzer/video/dvqa/frames_storage_test.cc
new file mode 100644
index 0000000000..88a172eeda
--- /dev/null
+++ b/third_party/libwebrtc/test/pc/e2e/analyzer/video/dvqa/frames_storage_test.cc
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 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/pc/e2e/analyzer/video/dvqa/frames_storage.h"
+
+#include <cstdint>
+#include <memory>
+
+#include "api/scoped_refptr.h"
+#include "api/test/time_controller.h"
+#include "api/units/time_delta.h"
+#include "api/units/timestamp.h"
+#include "api/video/i420_buffer.h"
+#include "api/video/video_frame.h"
+#include "system_wrappers/include/clock.h"
+#include "test/gtest.h"
+#include "test/time_controller/simulated_time_controller.h"
+
+namespace webrtc {
+namespace {
+
+VideoFrame Create2x2Frame(uint16_t frame_id) {
+ rtc::scoped_refptr<I420Buffer> buffer =
+ I420Buffer::Create(/*width=*/2, /*height=*/2);
+ memset(buffer->MutableDataY(), static_cast<uint8_t>(frame_id), 4);
+ memset(buffer->MutableDataU(), static_cast<uint8_t>(frame_id + 1), 1);
+ memset(buffer->MutableDataV(), static_cast<uint8_t>(frame_id + 2), 1);
+ return VideoFrame::Builder()
+ .set_id(frame_id)
+ .set_video_frame_buffer(buffer)
+ .set_timestamp_us(1)
+ .build();
+}
+
+void AssertHasFrame(FramesStorage& storage, uint16_t frame_id) {
+ absl::optional<VideoFrame> frame = storage.Get(frame_id);
+ ASSERT_TRUE(frame.has_value()) << "Frame " << frame_id << " wasn't found";
+ EXPECT_EQ(frame->id(), frame_id);
+}
+
+class FramesStorageTest : public testing::Test {
+ protected:
+ FramesStorageTest()
+ : time_controller_(std::make_unique<GlobalSimulatedTimeController>(
+ Timestamp::Seconds(1000))) {}
+
+ Timestamp NowPlusSeconds(int seconds) {
+ return time_controller_->GetClock()->CurrentTime() +
+ TimeDelta::Seconds(seconds);
+ }
+
+ Clock* GetClock() { return time_controller_->GetClock(); }
+
+ void AdvanceTime(TimeDelta time) { time_controller_->AdvanceTime(time); }
+
+ private:
+ std::unique_ptr<TimeController> time_controller_;
+};
+
+TEST_F(FramesStorageTest, CanGetAllAddedFrames) {
+ VideoFrame frame1 = Create2x2Frame(/*frame_id=*/1);
+ VideoFrame frame2 = Create2x2Frame(/*frame_id=*/2);
+ VideoFrame frame3 = Create2x2Frame(/*frame_id=*/3);
+ VideoFrame frame4 = Create2x2Frame(/*frame_id=*/4);
+ VideoFrame frame5 = Create2x2Frame(/*frame_id=*/5);
+
+ FramesStorage storage(TimeDelta::Seconds(1), GetClock());
+
+ storage.Add(frame1, /*captured_time=*/NowPlusSeconds(1));
+ storage.Add(frame2, /*captured_time=*/NowPlusSeconds(2));
+ storage.Add(frame3, /*captured_time=*/NowPlusSeconds(3));
+ storage.Add(frame4, /*captured_time=*/NowPlusSeconds(2));
+ storage.Add(frame5, /*captured_time=*/NowPlusSeconds(1));
+
+ AssertHasFrame(storage, /*frame_id=*/1);
+ AssertHasFrame(storage, /*frame_id=*/2);
+ AssertHasFrame(storage, /*frame_id=*/3);
+ AssertHasFrame(storage, /*frame_id=*/4);
+ AssertHasFrame(storage, /*frame_id=*/5);
+}
+
+TEST_F(FramesStorageTest, CanGetRemainingAddedFramesAfterRemove) {
+ VideoFrame frame1 = Create2x2Frame(/*frame_id=*/1);
+ VideoFrame frame2 = Create2x2Frame(/*frame_id=*/2);
+ VideoFrame frame3 = Create2x2Frame(/*frame_id=*/3);
+ VideoFrame frame4 = Create2x2Frame(/*frame_id=*/4);
+ VideoFrame frame5 = Create2x2Frame(/*frame_id=*/5);
+
+ FramesStorage storage(TimeDelta::Seconds(1), GetClock());
+
+ storage.Add(frame1, /*captured_time=*/NowPlusSeconds(1));
+ storage.Add(frame2, /*captured_time=*/NowPlusSeconds(2));
+ storage.Add(frame3, /*captured_time=*/NowPlusSeconds(3));
+ storage.Add(frame4, /*captured_time=*/NowPlusSeconds(2));
+ storage.Add(frame5, /*captured_time=*/NowPlusSeconds(1));
+
+ storage.Remove(frame1.id());
+ storage.Remove(frame2.id());
+ storage.Remove(frame3.id());
+
+ AssertHasFrame(storage, /*frame_id=*/4);
+ AssertHasFrame(storage, /*frame_id=*/5);
+}
+
+TEST_F(FramesStorageTest, AutoCleanupRemovesOnlyOldFrames) {
+ VideoFrame frame1 = Create2x2Frame(/*frame_id=*/1);
+ VideoFrame frame2 = Create2x2Frame(/*frame_id=*/2);
+ VideoFrame frame3 = Create2x2Frame(/*frame_id=*/3);
+ VideoFrame frame4 = Create2x2Frame(/*frame_id=*/4);
+ VideoFrame frame5 = Create2x2Frame(/*frame_id=*/5);
+ VideoFrame frame6 = Create2x2Frame(/*frame_id=*/6);
+
+ FramesStorage storage(TimeDelta::Seconds(1), GetClock());
+
+ storage.Add(frame1, /*captured_time=*/NowPlusSeconds(0));
+ storage.Add(frame2, /*captured_time=*/NowPlusSeconds(1));
+ storage.Add(frame3, /*captured_time=*/NowPlusSeconds(2));
+ storage.Add(frame4, /*captured_time=*/NowPlusSeconds(1));
+ storage.Add(frame5, /*captured_time=*/NowPlusSeconds(0));
+
+ AdvanceTime(TimeDelta::Millis(1001));
+ storage.Add(frame6, /*captured_time=*/NowPlusSeconds(3));
+
+ AssertHasFrame(storage, /*frame_id=*/2);
+ AssertHasFrame(storage, /*frame_id=*/3);
+ AssertHasFrame(storage, /*frame_id=*/4);
+ EXPECT_FALSE(storage.Get(/*frame_id=*/1).has_value());
+ EXPECT_FALSE(storage.Get(/*frame_id=*/5).has_value());
+}
+
+TEST_F(FramesStorageTest, AllFramesAutoCleaned) {
+ VideoFrame frame1 = Create2x2Frame(/*frame_id=*/1);
+ VideoFrame frame2 = Create2x2Frame(/*frame_id=*/2);
+ VideoFrame frame3 = Create2x2Frame(/*frame_id=*/3);
+
+ FramesStorage storage(TimeDelta::Seconds(1), GetClock());
+
+ storage.Add(frame1, /*captured_time=*/NowPlusSeconds(0));
+ storage.Add(frame2, /*captured_time=*/NowPlusSeconds(0));
+ storage.Add(frame3, /*captured_time=*/NowPlusSeconds(0));
+
+ AdvanceTime(TimeDelta::Millis(1001));
+ storage.Remove(/*frame_id=*/3);
+
+ EXPECT_FALSE(storage.Get(/*frame_id=*/1).has_value());
+ EXPECT_FALSE(storage.Get(/*frame_id=*/2).has_value());
+ EXPECT_FALSE(storage.Get(/*frame_id=*/3).has_value());
+}
+
+} // namespace
+} // namespace webrtc