xref: /aosp_15_r20/external/webrtc/test/testsupport/y4m_frame_reader_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include <stdint.h>
12 #include <stdio.h>
13 
14 #include <memory>
15 #include <string>
16 
17 #include "absl/strings/string_view.h"
18 #include "api/scoped_refptr.h"
19 #include "api/video/i420_buffer.h"
20 #include "api/video/video_frame_buffer.h"
21 #include "test/gtest.h"
22 #include "test/testsupport/file_utils.h"
23 #include "test/testsupport/frame_reader.h"
24 
25 namespace webrtc {
26 namespace test {
27 namespace {
28 
29 const absl::string_view kFileHeader = "YUV4MPEG2 W2 H2 F30:1 C420\n";
30 const absl::string_view kFrameHeader = "FRAME\n";
31 const absl::string_view kInputVideoContents = "abcdef";
32 
33 const size_t kFrameWidth = 2;
34 const size_t kFrameHeight = 2;
35 const size_t kFrameLength = 3 * kFrameWidth * kFrameHeight / 2;  // I420.
36 
37 }  // namespace
38 
39 class Y4mFrameReaderTest : public ::testing::Test {
40  protected:
41   Y4mFrameReaderTest() = default;
42   ~Y4mFrameReaderTest() override = default;
43 
SetUp()44   void SetUp() override {
45     temp_filename_ = webrtc::test::TempFilename(webrtc::test::OutputPath(),
46                                                 "y4m_frame_reader_unittest");
47     FILE* dummy = fopen(temp_filename_.c_str(), "wb");
48     fprintf(dummy, "%s",
49             (std::string(kFileHeader) + std::string(kFrameHeader) +
50              std::string(kInputVideoContents))
51                 .c_str());
52     fclose(dummy);
53 
54     frame_reader_.reset(
55         new Y4mFrameReaderImpl(temp_filename_, kFrameWidth, kFrameHeight));
56     ASSERT_TRUE(frame_reader_->Init());
57   }
58 
TearDown()59   void TearDown() override { remove(temp_filename_.c_str()); }
60 
61   std::unique_ptr<FrameReader> frame_reader_;
62   std::string temp_filename_;
63 };
64 
TEST_F(Y4mFrameReaderTest,InitSuccess)65 TEST_F(Y4mFrameReaderTest, InitSuccess) {}
66 
TEST_F(Y4mFrameReaderTest,FrameLength)67 TEST_F(Y4mFrameReaderTest, FrameLength) {
68   EXPECT_EQ(kFrameHeader.size() + kFrameLength, frame_reader_->FrameLength());
69 }
70 
TEST_F(Y4mFrameReaderTest,NumberOfFrames)71 TEST_F(Y4mFrameReaderTest, NumberOfFrames) {
72   EXPECT_EQ(1, frame_reader_->NumberOfFrames());
73 }
74 
TEST_F(Y4mFrameReaderTest,ReadFrame)75 TEST_F(Y4mFrameReaderTest, ReadFrame) {
76   rtc::scoped_refptr<I420BufferInterface> buffer = frame_reader_->ReadFrame();
77   ASSERT_TRUE(buffer);
78   // Expect I420 packed as YUV.
79   EXPECT_EQ(kInputVideoContents[0], buffer->DataY()[0]);
80   EXPECT_EQ(kInputVideoContents[1], buffer->DataY()[1]);
81   EXPECT_EQ(kInputVideoContents[2], buffer->DataY()[2]);
82   EXPECT_EQ(kInputVideoContents[3], buffer->DataY()[3]);
83   EXPECT_EQ(kInputVideoContents[4], buffer->DataU()[0]);
84   EXPECT_EQ(kInputVideoContents[5], buffer->DataV()[0]);
85   EXPECT_FALSE(frame_reader_->ReadFrame());  // End of file.
86 }
87 
TEST_F(Y4mFrameReaderTest,ReadFrameUninitialized)88 TEST_F(Y4mFrameReaderTest, ReadFrameUninitialized) {
89   Y4mFrameReaderImpl file_reader(temp_filename_, kFrameWidth, kFrameHeight);
90   EXPECT_FALSE(file_reader.ReadFrame());
91 }
92 
TEST_F(Y4mFrameReaderTest,ReadFrameDifferentWidth)93 TEST_F(Y4mFrameReaderTest, ReadFrameDifferentWidth) {
94   Y4mFrameReaderImpl file_reader(temp_filename_, kFrameWidth + 1, kFrameHeight);
95   EXPECT_FALSE(file_reader.Init());
96 }
97 
TEST_F(Y4mFrameReaderTest,ReadFrameDifferentHeight)98 TEST_F(Y4mFrameReaderTest, ReadFrameDifferentHeight) {
99   Y4mFrameReaderImpl file_reader(temp_filename_, kFrameWidth, kFrameHeight + 1);
100   EXPECT_FALSE(file_reader.Init());
101 }
102 
103 }  // namespace test
104 }  // namespace webrtc
105