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