blob: 10acd461652bfd9984989e167493e78656e20323 [file] [log] [blame]
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +00001/*
2 * Copyright (c) 2015 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 <stdio.h>
kwibergbfefb032016-05-01 14:53:46 -070012
13#include <memory>
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +000014#include <string>
15
16#include "testing/gtest/include/gtest/gtest.h"
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +000017#include "webrtc/test/frame_generator.h"
18#include "webrtc/test/testsupport/fileutils.h"
19
20namespace webrtc {
21namespace test {
22
23static const int kFrameWidth = 4;
24static const int kFrameHeight = 4;
25
26class FrameGeneratorTest : public ::testing::Test {
27 public:
28 void SetUp() override {
29 two_frame_filename_ =
30 test::TempFilename(test::OutputPath(), "2_frame_yuv_file");
31 one_frame_filename_ =
32 test::TempFilename(test::OutputPath(), "1_frame_yuv_file");
33
34 FILE* file = fopen(two_frame_filename_.c_str(), "wb");
35 WriteYuvFile(file, 0, 0, 0);
36 WriteYuvFile(file, 127, 127, 127);
37 fclose(file);
38 file = fopen(one_frame_filename_.c_str(), "wb");
39 WriteYuvFile(file, 255, 255, 255);
40 fclose(file);
41 }
42 void TearDown() override {
43 remove(one_frame_filename_.c_str());
44 remove(two_frame_filename_.c_str());
45 }
46
47 protected:
48 void WriteYuvFile(FILE* file, uint8_t y, uint8_t u, uint8_t v) {
49 assert(file);
kwibergbfefb032016-05-01 14:53:46 -070050 std::unique_ptr<uint8_t[]> plane_buffer(new uint8_t[y_size]);
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +000051 memset(plane_buffer.get(), y, y_size);
52 fwrite(plane_buffer.get(), 1, y_size, file);
53 memset(plane_buffer.get(), u, uv_size);
54 fwrite(plane_buffer.get(), 1, uv_size, file);
55 memset(plane_buffer.get(), v, uv_size);
56 fwrite(plane_buffer.get(), 1, uv_size, file);
57 }
58
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070059 void CheckFrameAndMutate(VideoFrame* frame, uint8_t y, uint8_t u, uint8_t v) {
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +000060 // Check that frame is valid, has the correct color and timestamp are clean.
61 ASSERT_NE(nullptr, frame);
nisse5b3c4432016-04-29 02:39:24 -070062 uint8_t* buffer;
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +000063 ASSERT_EQ(y_size, frame->allocated_size(PlaneType::kYPlane));
nisse5b3c4432016-04-29 02:39:24 -070064 buffer = frame->buffer(PlaneType::kYPlane);
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +000065 for (int i = 0; i < y_size; ++i)
66 ASSERT_EQ(y, buffer[i]);
67 ASSERT_EQ(uv_size, frame->allocated_size(PlaneType::kUPlane));
nisse5b3c4432016-04-29 02:39:24 -070068 buffer = frame->buffer(PlaneType::kUPlane);
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +000069 for (int i = 0; i < uv_size; ++i)
70 ASSERT_EQ(u, buffer[i]);
71 ASSERT_EQ(uv_size, frame->allocated_size(PlaneType::kVPlane));
nisse5b3c4432016-04-29 02:39:24 -070072 buffer = frame->buffer(PlaneType::kVPlane);
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +000073 for (int i = 0; i < uv_size; ++i)
74 ASSERT_EQ(v, buffer[i]);
75 EXPECT_EQ(0, frame->ntp_time_ms());
76 EXPECT_EQ(0, frame->render_time_ms());
77 EXPECT_EQ(0u, frame->timestamp());
78
79 // Mutate to something arbitrary non-zero.
80 frame->set_ntp_time_ms(11);
81 frame->set_render_time_ms(12);
82 frame->set_timestamp(13);
83 }
84
85 std::string two_frame_filename_;
86 std::string one_frame_filename_;
87 const int y_size = kFrameWidth * kFrameHeight;
88 const int uv_size = ((kFrameHeight + 1) / 2) * ((kFrameWidth + 1) / 2);
89};
90
91TEST_F(FrameGeneratorTest, SingleFrameFile) {
kwibergbfefb032016-05-01 14:53:46 -070092 std::unique_ptr<FrameGenerator> generator(FrameGenerator::CreateFromYuvFile(
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +000093 std::vector<std::string>(1, one_frame_filename_), kFrameWidth,
94 kFrameHeight, 1));
95 CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
96 CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
97}
98
99TEST_F(FrameGeneratorTest, TwoFrameFile) {
kwibergbfefb032016-05-01 14:53:46 -0700100 std::unique_ptr<FrameGenerator> generator(FrameGenerator::CreateFromYuvFile(
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +0000101 std::vector<std::string>(1, two_frame_filename_), kFrameWidth,
102 kFrameHeight, 1));
103 CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
104 CheckFrameAndMutate(generator->NextFrame(), 127, 127, 127);
105 CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
106}
107
108TEST_F(FrameGeneratorTest, MultipleFrameFiles) {
109 std::vector<std::string> files;
110 files.push_back(two_frame_filename_);
111 files.push_back(one_frame_filename_);
112
kwibergbfefb032016-05-01 14:53:46 -0700113 std::unique_ptr<FrameGenerator> generator(
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +0000114 FrameGenerator::CreateFromYuvFile(files, kFrameWidth, kFrameHeight, 1));
115 CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
116 CheckFrameAndMutate(generator->NextFrame(), 127, 127, 127);
117 CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
118 CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
119}
120
121TEST_F(FrameGeneratorTest, TwoFrameFileWithRepeat) {
122 const int kRepeatCount = 3;
kwibergbfefb032016-05-01 14:53:46 -0700123 std::unique_ptr<FrameGenerator> generator(FrameGenerator::CreateFromYuvFile(
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +0000124 std::vector<std::string>(1, two_frame_filename_), kFrameWidth,
125 kFrameHeight, kRepeatCount));
126 for (int i = 0; i < kRepeatCount; ++i)
127 CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
128 for (int i = 0; i < kRepeatCount; ++i)
129 CheckFrameAndMutate(generator->NextFrame(), 127, 127, 127);
130 CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
131}
132
133TEST_F(FrameGeneratorTest, MultipleFrameFilesWithRepeat) {
134 const int kRepeatCount = 3;
135 std::vector<std::string> files;
136 files.push_back(two_frame_filename_);
137 files.push_back(one_frame_filename_);
kwibergbfefb032016-05-01 14:53:46 -0700138 std::unique_ptr<FrameGenerator> generator(FrameGenerator::CreateFromYuvFile(
sprang@webrtc.org25dd1db2015-03-02 11:55:45 +0000139 files, kFrameWidth, kFrameHeight, kRepeatCount));
140 for (int i = 0; i < kRepeatCount; ++i)
141 CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
142 for (int i = 0; i < kRepeatCount; ++i)
143 CheckFrameAndMutate(generator->NextFrame(), 127, 127, 127);
144 for (int i = 0; i < kRepeatCount; ++i)
145 CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
146 CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
147}
148
149} // namespace test
150} // namespace webrtc