blob: 62ab740f5ec73c903ca8063fd9f5e3f1194ef981 [file] [log] [blame]
brykt@google.comf5568902012-12-20 11:42:45 +00001/*
2 * Copyright (c) 2012 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>
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000012#include <stdlib.h>
brykt@google.comf5568902012-12-20 11:42:45 +000013
kjellander@webrtc.org81266022013-01-22 22:45:59 +000014#include <fstream>
brykt@google.comf5568902012-12-20 11:42:45 +000015
pbos@webrtc.orgba7f6a82013-06-04 08:14:10 +000016#include "testing/gtest/include/gtest/gtest.h"
brykt@google.comf5568902012-12-20 11:42:45 +000017#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
18#include "webrtc/system_wrappers/interface/scoped_ptr.h"
19#include "webrtc/test/testsupport/fileutils.h"
20#include "webrtc/tools/frame_editing/frame_editing_lib.h"
21
22namespace webrtc {
23namespace test {
24
25const int kWidth = 352;
26const int kHeight = 288;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000027const size_t kFrameSize = CalcBufferSize(kI420, kWidth, kHeight);
brykt@google.comf5568902012-12-20 11:42:45 +000028
29class FrameEditingTest : public ::testing::Test {
30 protected:
31 virtual void SetUp() {
kjellander@webrtc.org3de31462013-03-11 15:30:33 +000032 reference_video_ = ResourcePath("foreman_cif", "yuv");
kjellander@webrtc.orge794c362014-09-29 11:47:28 +000033 test_video_ = webrtc::test::TempFilename(webrtc::test::OutputPath(),
34 "frame_editing_unittest.yuv");
kjellander@webrtc.org3de31462013-03-11 15:30:33 +000035
36 original_fid_ = fopen(reference_video_.c_str(), "rb");
brykt@google.comf5568902012-12-20 11:42:45 +000037 ASSERT_TRUE(original_fid_ != NULL);
kjellander@webrtc.org81266022013-01-22 22:45:59 +000038
39 // Ensure the output file exists on disk.
kjellander@webrtc.org3de31462013-03-11 15:30:33 +000040 std::ofstream(test_video_.c_str(), std::ios::out);
kjellander@webrtc.org81266022013-01-22 22:45:59 +000041 // Open the output file for reading.
42 // TODO(holmer): Figure out why this file has to be opened here (test fails
43 // if it's opened after the write operation performed in EditFrames).
kjellander@webrtc.org3de31462013-03-11 15:30:33 +000044 edited_fid_ = fopen(test_video_.c_str(), "rb");
brykt@google.comf5568902012-12-20 11:42:45 +000045 ASSERT_TRUE(edited_fid_ != NULL);
kjellander@webrtc.org81266022013-01-22 22:45:59 +000046
brykt@google.comf5568902012-12-20 11:42:45 +000047 original_buffer_.reset(new int[kFrameSize]);
48 edited_buffer_.reset(new int[kFrameSize]);
49 num_frames_read_ = 0;
50 }
51 virtual void TearDown() {
52 fclose(original_fid_);
53 fclose(edited_fid_);
kjellander@webrtc.orge794c362014-09-29 11:47:28 +000054 remove(test_video_.c_str());
brykt@google.comf5568902012-12-20 11:42:45 +000055 }
56 // Compares the frames in both streams to the end of one of the streams.
57 void CompareToTheEnd(FILE* test_video_fid, FILE* ref_video_fid,
andrew@webrtc.org8f693302014-04-25 23:10:28 +000058 scoped_ptr<int[]>* ref_buffer,
59 scoped_ptr<int[]>* test_buffer) {
brykt@google.comf5568902012-12-20 11:42:45 +000060 while (!feof(test_video_fid) && !feof(ref_video_fid)) {
61 num_bytes_read_ = fread(ref_buffer->get(), 1, kFrameSize, ref_video_fid);
62 if (!feof(ref_video_fid)) {
63 EXPECT_EQ(kFrameSize, num_bytes_read_);
64 }
65 num_bytes_read_ = fread(test_buffer->get(), 1, kFrameSize,
66 test_video_fid);
67 if (!feof(test_video_fid)) {
68 EXPECT_EQ(kFrameSize, num_bytes_read_);
69 }
70 if (!feof(test_video_fid) && !feof(test_video_fid)) {
71 EXPECT_EQ(0, memcmp(ref_buffer->get(), test_buffer->get(),
72 kFrameSize));
73 }
74 }
75 // There should not be anything left in either stream.
76 EXPECT_EQ(!feof(test_video_fid), !feof(ref_video_fid));
77 }
kjellander@webrtc.org3de31462013-03-11 15:30:33 +000078 std::string reference_video_;
79 std::string test_video_;
brykt@google.comf5568902012-12-20 11:42:45 +000080 FILE* original_fid_;
81 FILE* edited_fid_;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000082 size_t num_bytes_read_;
andrew@webrtc.org8f693302014-04-25 23:10:28 +000083 scoped_ptr<int[]> original_buffer_;
84 scoped_ptr<int[]> edited_buffer_;
brykt@google.comf5568902012-12-20 11:42:45 +000085 int num_frames_read_;
86};
87
88TEST_F(FrameEditingTest, ValidInPath) {
89 const int kFirstFrameToProcess = 160;
90 const int kInterval = -1;
91 const int kLastFrameToProcess = 240;
92
kjellander@webrtc.org3de31462013-03-11 15:30:33 +000093 int result = EditFrames(reference_video_, kWidth, kHeight,
94 kFirstFrameToProcess, kInterval, kLastFrameToProcess,
95 test_video_);
brykt@google.comf5568902012-12-20 11:42:45 +000096 EXPECT_EQ(0, result);
97
98 for (int i = 1; i < kFirstFrameToProcess; ++i) {
99 num_bytes_read_ = fread(original_buffer_.get(), 1, kFrameSize,
100 original_fid_);
101 EXPECT_EQ(kFrameSize, num_bytes_read_);
102
103 num_bytes_read_ = fread(edited_buffer_.get(), 1, kFrameSize, edited_fid_);
104 EXPECT_EQ(kFrameSize, num_bytes_read_);
105
106 EXPECT_EQ(0, memcmp(original_buffer_.get(), edited_buffer_.get(),
107 kFrameSize));
108 }
109 // Do not compare the frames that have been cut.
110 for (int i = kFirstFrameToProcess; i <= kLastFrameToProcess; ++i) {
111 num_bytes_read_ = fread(original_buffer_.get(), 1, kFrameSize,
112 original_fid_);
113 EXPECT_EQ(kFrameSize, num_bytes_read_);
114 }
115 CompareToTheEnd(edited_fid_, original_fid_, &original_buffer_,
116 &edited_buffer_);
117}
118
119TEST_F(FrameEditingTest, EmptySetToCut) {
120 const int kFirstFrameToProcess = 2;
121 const int kInterval = -1;
122 const int kLastFrameToProcess = 1;
123
kjellander@webrtc.org3de31462013-03-11 15:30:33 +0000124 int result = EditFrames(reference_video_, kWidth, kHeight,
125 kFirstFrameToProcess, kInterval, kLastFrameToProcess,
126 test_video_);
brykt@google.comf5568902012-12-20 11:42:45 +0000127 EXPECT_EQ(-10, result);
128}
129
130TEST_F(FrameEditingTest, InValidInPath) {
kjellander@webrtc.org3de31462013-03-11 15:30:33 +0000131 const std::string kRefVideo_ = "PATH/THAT/DOES/NOT/EXIST";
brykt@google.comf5568902012-12-20 11:42:45 +0000132
133 const int kFirstFrameToProcess = 30;
134 const int kInterval = 1;
135 const int kLastFrameToProcess = 120;
136
kjellander@webrtc.org3de31462013-03-11 15:30:33 +0000137 int result = EditFrames(kRefVideo_, kWidth, kHeight, kFirstFrameToProcess,
138 kInterval, kLastFrameToProcess, test_video_);
brykt@google.comf5568902012-12-20 11:42:45 +0000139 EXPECT_EQ(-11, result);
140}
141
142TEST_F(FrameEditingTest, DeletingEverySecondFrame) {
143 const int kFirstFrameToProcess = 1;
144 const int kInterval = -2;
145 const int kLastFrameToProcess = 10000;
146 // Set kLastFrameToProcess to a large value so that all frame are processed.
kjellander@webrtc.org3de31462013-03-11 15:30:33 +0000147 int result = EditFrames(reference_video_, kWidth, kHeight,
148 kFirstFrameToProcess, kInterval, kLastFrameToProcess,
149 test_video_);
brykt@google.comf5568902012-12-20 11:42:45 +0000150 EXPECT_EQ(0, result);
151
152 while (!feof(original_fid_) && !feof(edited_fid_)) {
153 num_bytes_read_ =
154 fread(original_buffer_.get(), 1, kFrameSize, original_fid_);
155 if (!feof(original_fid_)) {
156 EXPECT_EQ(kFrameSize, num_bytes_read_);
157 num_frames_read_++;
158 }
159 // We want to compare every second frame of the original to the edited.
160 // kInterval=-2 and (num_frames_read_ - 1) % kInterval will be -1 for
161 // every second frame.
162 // num_frames_read_ - 1 because we have deleted frame number 2, 4 , 6 etc.
163 if ((num_frames_read_ - 1) % kInterval == -1) {
164 num_bytes_read_ = fread(edited_buffer_.get(), 1, kFrameSize,
165 edited_fid_);
166 if (!feof(edited_fid_)) {
167 EXPECT_EQ(kFrameSize, num_bytes_read_);
168 }
169 if (!feof(original_fid_) && !feof(edited_fid_)) {
170 EXPECT_EQ(0, memcmp(original_buffer_.get(),
171 edited_buffer_.get(), kFrameSize));
172 }
173 }
174 }
175}
176
177TEST_F(FrameEditingTest, RepeatFrames) {
178 const int kFirstFrameToProcess = 160;
179 const int kInterval = 2;
180 const int kLastFrameToProcess = 240;
181
kjellander@webrtc.org3de31462013-03-11 15:30:33 +0000182 int result = EditFrames(reference_video_, kWidth, kHeight,
183 kFirstFrameToProcess, kInterval, kLastFrameToProcess,
184 test_video_);
brykt@google.comf5568902012-12-20 11:42:45 +0000185 EXPECT_EQ(0, result);
186
187 for (int i = 1; i < kFirstFrameToProcess; ++i) {
188 num_bytes_read_ = fread(original_buffer_.get(), 1, kFrameSize,
189 original_fid_);
190 EXPECT_EQ(kFrameSize, num_bytes_read_);
191
192 num_bytes_read_ = fread(edited_buffer_.get(), 1, kFrameSize, edited_fid_);
193 EXPECT_EQ(kFrameSize, num_bytes_read_);
194
195 EXPECT_EQ(0, memcmp(original_buffer_.get(), edited_buffer_.get(),
196 kFrameSize));
197 }
198 // Do not compare the frames that have been repeated.
199 for (int i = kFirstFrameToProcess; i <= kLastFrameToProcess; ++i) {
200 num_bytes_read_ = fread(original_buffer_.get(), 1, kFrameSize,
201 original_fid_);
202 EXPECT_EQ(kFrameSize, num_bytes_read_);
203 for (int i = 1; i <= kInterval; ++i) {
204 num_bytes_read_ = fread(edited_buffer_.get(), 1, kFrameSize,
205 edited_fid_);
206 EXPECT_EQ(kFrameSize, num_bytes_read_);
207 EXPECT_EQ(0, memcmp(original_buffer_.get(), edited_buffer_.get(),
208 kFrameSize));
209 }
210 }
211 CompareToTheEnd(edited_fid_, original_fid_, &original_buffer_,
212 &edited_buffer_);
213}
214} // namespace test
215} // namespace webrtc