summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/rtc_tools/frame_analyzer/video_geometry_aligner_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/rtc_tools/frame_analyzer/video_geometry_aligner_unittest.cc')
-rw-r--r--third_party/libwebrtc/rtc_tools/frame_analyzer/video_geometry_aligner_unittest.cc153
1 files changed, 153 insertions, 0 deletions
diff --git a/third_party/libwebrtc/rtc_tools/frame_analyzer/video_geometry_aligner_unittest.cc b/third_party/libwebrtc/rtc_tools/frame_analyzer/video_geometry_aligner_unittest.cc
new file mode 100644
index 0000000000..a86b8c5f4c
--- /dev/null
+++ b/third_party/libwebrtc/rtc_tools/frame_analyzer/video_geometry_aligner_unittest.cc
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2018 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 "rtc_tools/frame_analyzer/video_geometry_aligner.h"
+
+#include <vector>
+
+#include "api/video/i420_buffer.h"
+#include "rtc_tools/frame_analyzer/video_quality_analysis.h"
+#include "rtc_tools/video_file_reader.h"
+#include "test/gtest.h"
+#include "test/testsupport/file_utils.h"
+
+namespace webrtc {
+namespace test {
+
+class VideoGeometryAlignerTest : public ::testing::Test {
+ protected:
+ void SetUp() {
+ reference_video_ =
+ OpenYuvFile(ResourcePath("foreman_128x96", "yuv"), 128, 96);
+ ASSERT_TRUE(reference_video_);
+
+ // Very simple 4x4 frame used for verying CropAndZoom.
+ const uint8_t data_y[] = {0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15};
+ const uint8_t data_u[] = {0, 1, 2, 3};
+ const uint8_t data_v[] = {0, 1, 2, 3};
+ test_frame_ = I420Buffer::Copy(
+ /* width= */ 4, /* height= */ 4, data_y, /* stride_y= */ 4, data_u,
+ /* stride_u= */ 2, data_v, /* stride_v= */ 2);
+ }
+
+ rtc::scoped_refptr<Video> reference_video_;
+ rtc::scoped_refptr<I420BufferInterface> test_frame_;
+};
+
+// Teach gtest how to compare CropRegions.
+bool operator==(const CropRegion& a, const CropRegion& b) {
+ return a.left == b.left && a.top == b.top && a.right == b.right &&
+ a.bottom == b.bottom;
+}
+
+TEST_F(VideoGeometryAlignerTest, CropAndZoomIdentity) {
+ const rtc::scoped_refptr<I420BufferInterface> frame =
+ reference_video_->GetFrame(0);
+
+ // Assume perfect match, i.e. SSIM == 1.
+ CropRegion identity_region;
+ EXPECT_EQ(1.0, Ssim(frame, CropAndZoom(identity_region, frame)));
+}
+
+TEST_F(VideoGeometryAlignerTest, CropAndZoomLeft) {
+ CropRegion region;
+ region.left = 2;
+ const rtc::scoped_refptr<I420BufferInterface> cropped_frame =
+ CropAndZoom(region, test_frame_);
+ EXPECT_EQ(std::vector<uint8_t>(
+ {2, 2, 3, 3, 6, 6, 7, 7, 10, 10, 11, 11, 14, 14, 15, 15}),
+ std::vector<uint8_t>(cropped_frame->DataY(),
+ cropped_frame->DataY() + 16));
+ EXPECT_EQ(
+ std::vector<uint8_t>({1, 1, 3, 3}),
+ std::vector<uint8_t>(cropped_frame->DataU(), cropped_frame->DataU() + 4));
+ EXPECT_EQ(
+ std::vector<uint8_t>({1, 1, 3, 3}),
+ std::vector<uint8_t>(cropped_frame->DataV(), cropped_frame->DataV() + 4));
+}
+
+// TODO(magjed): Re-enable when libyuv filtering is updated.
+TEST_F(VideoGeometryAlignerTest, DISABLED_CropAndZoomTop) {
+ CropRegion region;
+ region.top = 2;
+ const rtc::scoped_refptr<I420BufferInterface> cropped_frame =
+ CropAndZoom(region, test_frame_);
+ EXPECT_EQ(std::vector<uint8_t>(
+ {8, 9, 10, 11, 10, 11, 12, 13, 12, 13, 14, 15, 12, 13, 14, 15}),
+ std::vector<uint8_t>(cropped_frame->DataY(),
+ cropped_frame->DataY() + 16));
+ EXPECT_EQ(
+ std::vector<uint8_t>({2, 3, 2, 3}),
+ std::vector<uint8_t>(cropped_frame->DataU(), cropped_frame->DataU() + 4));
+ EXPECT_EQ(
+ std::vector<uint8_t>({2, 3, 2, 3}),
+ std::vector<uint8_t>(cropped_frame->DataV(), cropped_frame->DataV() + 4));
+}
+
+TEST_F(VideoGeometryAlignerTest, CropAndZoomRight) {
+ CropRegion region;
+ region.right = 2;
+ const rtc::scoped_refptr<I420BufferInterface> cropped_frame =
+ CropAndZoom(region, test_frame_);
+ EXPECT_EQ(std::vector<uint8_t>(
+ {0, 0, 1, 1, 4, 4, 5, 5, 8, 8, 9, 9, 12, 12, 13, 13}),
+ std::vector<uint8_t>(cropped_frame->DataY(),
+ cropped_frame->DataY() + 16));
+ EXPECT_EQ(
+ std::vector<uint8_t>({0, 0, 2, 2}),
+ std::vector<uint8_t>(cropped_frame->DataU(), cropped_frame->DataU() + 4));
+ EXPECT_EQ(
+ std::vector<uint8_t>({0, 0, 2, 2}),
+ std::vector<uint8_t>(cropped_frame->DataV(), cropped_frame->DataV() + 4));
+}
+
+// TODO(magjed): Re-enable when libyuv filtering is updated.
+TEST_F(VideoGeometryAlignerTest, DISABLED_CropAndZoomBottom) {
+ CropRegion region;
+ region.bottom = 2;
+ const rtc::scoped_refptr<I420BufferInterface> cropped_frame =
+ CropAndZoom(region, test_frame_);
+ EXPECT_EQ(
+ std::vector<uint8_t>({0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 4, 5, 6, 7}),
+ std::vector<uint8_t>(cropped_frame->DataY(),
+ cropped_frame->DataY() + 16));
+ EXPECT_EQ(
+ std::vector<uint8_t>({0, 1, 0, 1}),
+ std::vector<uint8_t>(cropped_frame->DataU(), cropped_frame->DataU() + 4));
+ EXPECT_EQ(
+ std::vector<uint8_t>({0, 1, 0, 1}),
+ std::vector<uint8_t>(cropped_frame->DataV(), cropped_frame->DataV() + 4));
+}
+
+TEST_F(VideoGeometryAlignerTest, CalculateCropRegionIdentity) {
+ const rtc::scoped_refptr<I420BufferInterface> frame =
+ reference_video_->GetFrame(0);
+ CropRegion identity_region;
+ EXPECT_EQ(identity_region, CalculateCropRegion(frame, frame));
+}
+
+TEST_F(VideoGeometryAlignerTest, CalculateCropRegionArbitrary) {
+ // Arbitrary crop region.
+ CropRegion crop_region;
+ crop_region.left = 2;
+ crop_region.top = 4;
+ crop_region.right = 5;
+ crop_region.bottom = 3;
+
+ const rtc::scoped_refptr<I420BufferInterface> frame =
+ reference_video_->GetFrame(0);
+
+ EXPECT_EQ(crop_region,
+ CalculateCropRegion(frame, CropAndZoom(crop_region, frame)));
+}
+
+} // namespace test
+} // namespace webrtc