OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <math.h> | 11 #include <math.h> |
12 #include <string.h> | 12 #include <string.h> |
13 | 13 |
14 #include <memory> | 14 #include <memory> |
15 | 15 |
16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
17 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 17 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" |
| 18 #include "webrtc/test/frame_utils.h" |
18 #include "webrtc/test/testsupport/fileutils.h" | 19 #include "webrtc/test/testsupport/fileutils.h" |
19 #include "webrtc/video_frame.h" | 20 #include "webrtc/video_frame.h" |
20 | 21 |
21 namespace webrtc { | 22 namespace webrtc { |
22 | 23 |
23 namespace { | 24 namespace { |
24 void Calc16ByteAlignedStride(int width, int* stride_y, int* stride_uv) { | 25 void Calc16ByteAlignedStride(int width, int* stride_y, int* stride_uv) { |
25 *stride_y = 16 * ((width + 15) / 16); | 26 *stride_y = 16 * ((width + 15) / 16); |
26 *stride_uv = 16 * ((width + 31) / 32); | 27 *stride_uv = 16 * ((width + 31) / 32); |
27 } | 28 } |
28 | 29 |
29 } // Anonymous namespace | 30 } // Anonymous namespace |
30 | 31 |
31 class TestLibYuv : public ::testing::Test { | 32 class TestLibYuv : public ::testing::Test { |
32 protected: | 33 protected: |
33 TestLibYuv(); | 34 TestLibYuv(); |
34 virtual void SetUp(); | 35 virtual void SetUp(); |
35 virtual void TearDown(); | 36 virtual void TearDown(); |
36 | 37 |
37 FILE* source_file_; | 38 FILE* source_file_; |
38 VideoFrame orig_frame_; | 39 std::unique_ptr<VideoFrame> orig_frame_; |
39 std::unique_ptr<uint8_t[]> orig_buffer_; | |
40 const int width_; | 40 const int width_; |
41 const int height_; | 41 const int height_; |
42 const int size_y_; | 42 const int size_y_; |
43 const int size_uv_; | 43 const int size_uv_; |
44 const size_t frame_length_; | 44 const size_t frame_length_; |
45 }; | 45 }; |
46 | 46 |
47 TestLibYuv::TestLibYuv() | 47 TestLibYuv::TestLibYuv() |
48 : source_file_(NULL), | 48 : source_file_(NULL), |
49 orig_frame_(), | 49 orig_frame_(), |
50 width_(352), | 50 width_(352), |
51 height_(288), | 51 height_(288), |
52 size_y_(width_ * height_), | 52 size_y_(width_ * height_), |
53 size_uv_(((width_ + 1) / 2) * ((height_ + 1) / 2)), | 53 size_uv_(((width_ + 1) / 2) * ((height_ + 1) / 2)), |
54 frame_length_(CalcBufferSize(kI420, 352, 288)) { | 54 frame_length_(CalcBufferSize(kI420, 352, 288)) {} |
55 orig_buffer_.reset(new uint8_t[frame_length_]); | |
56 } | |
57 | 55 |
58 void TestLibYuv::SetUp() { | 56 void TestLibYuv::SetUp() { |
59 const std::string input_file_name = webrtc::test::ResourcePath("foreman_cif", | 57 const std::string input_file_name = webrtc::test::ResourcePath("foreman_cif", |
60 "yuv"); | 58 "yuv"); |
61 source_file_ = fopen(input_file_name.c_str(), "rb"); | 59 source_file_ = fopen(input_file_name.c_str(), "rb"); |
62 ASSERT_TRUE(source_file_ != NULL) << "Cannot read file: "<< | 60 ASSERT_TRUE(source_file_ != NULL) << "Cannot read file: "<< |
63 input_file_name << "\n"; | 61 input_file_name << "\n"; |
64 | 62 |
65 EXPECT_EQ(frame_length_, | 63 rtc::scoped_refptr<VideoFrameBuffer> buffer( |
66 fread(orig_buffer_.get(), 1, frame_length_, source_file_)); | 64 test::ReadI420Buffer(width_, height_, source_file_)); |
67 orig_frame_.CreateFrame(orig_buffer_.get(), | 65 |
68 orig_buffer_.get() + size_y_, | 66 orig_frame_.reset(new VideoFrame(buffer, kVideoRotation_0, 0)); |
69 orig_buffer_.get() + | |
70 size_y_ + size_uv_, | |
71 width_, height_, | |
72 width_, (width_ + 1) / 2, | |
73 (width_ + 1) / 2, | |
74 kVideoRotation_0); | |
75 } | 67 } |
76 | 68 |
77 void TestLibYuv::TearDown() { | 69 void TestLibYuv::TearDown() { |
78 if (source_file_ != NULL) { | 70 if (source_file_ != NULL) { |
79 ASSERT_EQ(0, fclose(source_file_)); | 71 ASSERT_EQ(0, fclose(source_file_)); |
80 } | 72 } |
81 source_file_ = NULL; | 73 source_file_ = NULL; |
82 } | 74 } |
83 | 75 |
84 TEST_F(TestLibYuv, ConvertSanityTest) { | 76 TEST_F(TestLibYuv, ConvertSanityTest) { |
85 // TODO(mikhal) | 77 // TODO(mikhal) |
86 } | 78 } |
87 | 79 |
88 TEST_F(TestLibYuv, ConvertTest) { | 80 TEST_F(TestLibYuv, ConvertTest) { |
89 // Reading YUV frame - testing on the first frame of the foreman sequence | 81 // Reading YUV frame - testing on the first frame of the foreman sequence |
90 int j = 0; | 82 int j = 0; |
91 std::string output_file_name = webrtc::test::OutputPath() + | 83 std::string output_file_name = webrtc::test::OutputPath() + |
92 "LibYuvTest_conversion.yuv"; | 84 "LibYuvTest_conversion.yuv"; |
93 FILE* output_file = fopen(output_file_name.c_str(), "wb"); | 85 FILE* output_file = fopen(output_file_name.c_str(), "wb"); |
94 ASSERT_TRUE(output_file != NULL); | 86 ASSERT_TRUE(output_file != NULL); |
95 | 87 |
96 double psnr = 0.0; | 88 double psnr = 0.0; |
97 | 89 |
98 rtc::scoped_refptr<I420Buffer> res_i420_buffer = I420Buffer::Create( | 90 rtc::scoped_refptr<I420Buffer> res_i420_buffer = I420Buffer::Create( |
99 width_, height_, width_, (width_ + 1) / 2, (width_ + 1) / 2); | 91 width_, height_, width_, (width_ + 1) / 2, (width_ + 1) / 2); |
100 | 92 |
101 printf("\nConvert #%d I420 <-> I420 \n", j); | 93 printf("\nConvert #%d I420 <-> I420 \n", j); |
102 std::unique_ptr<uint8_t[]> out_i420_buffer(new uint8_t[frame_length_]); | 94 std::unique_ptr<uint8_t[]> out_i420_buffer(new uint8_t[frame_length_]); |
103 EXPECT_EQ(0, ConvertFromI420(orig_frame_, kI420, 0, out_i420_buffer.get())); | 95 EXPECT_EQ(0, ConvertFromI420(*orig_frame_, kI420, 0, out_i420_buffer.get())); |
104 EXPECT_EQ(0, ConvertToI420(kI420, out_i420_buffer.get(), 0, 0, width_, | 96 EXPECT_EQ(0, ConvertToI420(kI420, out_i420_buffer.get(), 0, 0, width_, |
105 height_, 0, kVideoRotation_0, | 97 height_, 0, kVideoRotation_0, |
106 res_i420_buffer.get())); | 98 res_i420_buffer.get())); |
107 | 99 |
108 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { | 100 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { |
109 return; | 101 return; |
110 } | 102 } |
111 psnr = I420PSNR(*orig_frame_.video_frame_buffer(), *res_i420_buffer); | 103 psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer); |
112 EXPECT_EQ(48.0, psnr); | 104 EXPECT_EQ(48.0, psnr); |
113 j++; | 105 j++; |
114 | 106 |
115 printf("\nConvert #%d I420 <-> RGB24\n", j); | 107 printf("\nConvert #%d I420 <-> RGB24\n", j); |
116 std::unique_ptr<uint8_t[]> res_rgb_buffer2(new uint8_t[width_ * height_ * 3]); | 108 std::unique_ptr<uint8_t[]> res_rgb_buffer2(new uint8_t[width_ * height_ * 3]); |
117 // Align the stride values for the output frame. | 109 // Align the stride values for the output frame. |
118 int stride_y = 0; | 110 int stride_y = 0; |
119 int stride_uv = 0; | 111 int stride_uv = 0; |
120 Calc16ByteAlignedStride(width_, &stride_y, &stride_uv); | 112 Calc16ByteAlignedStride(width_, &stride_y, &stride_uv); |
121 res_i420_buffer = | 113 res_i420_buffer = |
122 I420Buffer::Create(width_, height_, stride_y, stride_uv, stride_uv); | 114 I420Buffer::Create(width_, height_, stride_y, stride_uv, stride_uv); |
123 EXPECT_EQ(0, ConvertFromI420(orig_frame_, kRGB24, 0, res_rgb_buffer2.get())); | 115 EXPECT_EQ(0, ConvertFromI420(*orig_frame_, kRGB24, 0, res_rgb_buffer2.get())); |
124 | 116 |
125 EXPECT_EQ(0, ConvertToI420(kRGB24, res_rgb_buffer2.get(), 0, 0, width_, | 117 EXPECT_EQ(0, ConvertToI420(kRGB24, res_rgb_buffer2.get(), 0, 0, width_, |
126 height_, 0, kVideoRotation_0, | 118 height_, 0, kVideoRotation_0, |
127 res_i420_buffer.get())); | 119 res_i420_buffer.get())); |
128 | 120 |
129 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { | 121 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { |
130 return; | 122 return; |
131 } | 123 } |
132 psnr = I420PSNR(*orig_frame_.video_frame_buffer(), *res_i420_buffer); | 124 psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer); |
133 | 125 |
134 // Optimization Speed- quality trade-off => 45 dB only (platform dependant). | 126 // Optimization Speed- quality trade-off => 45 dB only (platform dependant). |
135 EXPECT_GT(ceil(psnr), 44); | 127 EXPECT_GT(ceil(psnr), 44); |
136 j++; | 128 j++; |
137 | 129 |
138 printf("\nConvert #%d I420 <-> UYVY\n", j); | 130 printf("\nConvert #%d I420 <-> UYVY\n", j); |
139 std::unique_ptr<uint8_t[]> out_uyvy_buffer(new uint8_t[width_ * height_ * 2]); | 131 std::unique_ptr<uint8_t[]> out_uyvy_buffer(new uint8_t[width_ * height_ * 2]); |
140 EXPECT_EQ(0, ConvertFromI420(orig_frame_, kUYVY, 0, out_uyvy_buffer.get())); | 132 EXPECT_EQ(0, ConvertFromI420(*orig_frame_, kUYVY, 0, out_uyvy_buffer.get())); |
141 EXPECT_EQ(0, ConvertToI420(kUYVY, out_uyvy_buffer.get(), 0, 0, width_, | 133 EXPECT_EQ(0, ConvertToI420(kUYVY, out_uyvy_buffer.get(), 0, 0, width_, |
142 height_, 0, kVideoRotation_0, | 134 height_, 0, kVideoRotation_0, |
143 res_i420_buffer.get())); | 135 res_i420_buffer.get())); |
144 psnr = I420PSNR(*orig_frame_.video_frame_buffer(), *res_i420_buffer); | 136 psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer); |
145 EXPECT_EQ(48.0, psnr); | 137 EXPECT_EQ(48.0, psnr); |
146 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { | 138 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { |
147 return; | 139 return; |
148 } | 140 } |
149 j++; | 141 j++; |
150 | 142 |
151 printf("\nConvert #%d I420 <-> YUY2\n", j); | 143 printf("\nConvert #%d I420 <-> YUY2\n", j); |
152 std::unique_ptr<uint8_t[]> out_yuy2_buffer(new uint8_t[width_ * height_ * 2]); | 144 std::unique_ptr<uint8_t[]> out_yuy2_buffer(new uint8_t[width_ * height_ * 2]); |
153 EXPECT_EQ(0, ConvertFromI420(orig_frame_, kYUY2, 0, out_yuy2_buffer.get())); | 145 EXPECT_EQ(0, ConvertFromI420(*orig_frame_, kYUY2, 0, out_yuy2_buffer.get())); |
154 | 146 |
155 EXPECT_EQ(0, ConvertToI420(kYUY2, out_yuy2_buffer.get(), 0, 0, width_, | 147 EXPECT_EQ(0, ConvertToI420(kYUY2, out_yuy2_buffer.get(), 0, 0, width_, |
156 height_, 0, | 148 height_, 0, |
157 kVideoRotation_0, res_i420_buffer.get())); | 149 kVideoRotation_0, res_i420_buffer.get())); |
158 | 150 |
159 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { | 151 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { |
160 return; | 152 return; |
161 } | 153 } |
162 | 154 |
163 psnr = I420PSNR(*orig_frame_.video_frame_buffer(), *res_i420_buffer); | 155 psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer); |
164 EXPECT_EQ(48.0, psnr); | 156 EXPECT_EQ(48.0, psnr); |
165 | 157 |
166 printf("\nConvert #%d I420 <-> RGB565\n", j); | 158 printf("\nConvert #%d I420 <-> RGB565\n", j); |
167 std::unique_ptr<uint8_t[]> out_rgb565_buffer( | 159 std::unique_ptr<uint8_t[]> out_rgb565_buffer( |
168 new uint8_t[width_ * height_ * 2]); | 160 new uint8_t[width_ * height_ * 2]); |
169 EXPECT_EQ(0, | 161 EXPECT_EQ(0, |
170 ConvertFromI420(orig_frame_, kRGB565, 0, out_rgb565_buffer.get())); | 162 ConvertFromI420(*orig_frame_, kRGB565, 0, out_rgb565_buffer.get())); |
171 | 163 |
172 EXPECT_EQ(0, ConvertToI420(kRGB565, out_rgb565_buffer.get(), 0, 0, width_, | 164 EXPECT_EQ(0, ConvertToI420(kRGB565, out_rgb565_buffer.get(), 0, 0, width_, |
173 height_, 0, | 165 height_, 0, |
174 kVideoRotation_0, res_i420_buffer.get())); | 166 kVideoRotation_0, res_i420_buffer.get())); |
175 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { | 167 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { |
176 return; | 168 return; |
177 } | 169 } |
178 j++; | 170 j++; |
179 | 171 |
180 psnr = I420PSNR(*orig_frame_.video_frame_buffer(), *res_i420_buffer); | 172 psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer); |
181 // TODO(leozwang) Investigate the right psnr should be set for I420ToRGB565, | 173 // TODO(leozwang) Investigate the right psnr should be set for I420ToRGB565, |
182 // Another example is I420ToRGB24, the psnr is 44 | 174 // Another example is I420ToRGB24, the psnr is 44 |
183 // TODO(mikhal): Add psnr for RGB565, 1555, 4444, convert to ARGB. | 175 // TODO(mikhal): Add psnr for RGB565, 1555, 4444, convert to ARGB. |
184 EXPECT_GT(ceil(psnr), 40); | 176 EXPECT_GT(ceil(psnr), 40); |
185 | 177 |
186 printf("\nConvert #%d I420 <-> ARGB8888\n", j); | 178 printf("\nConvert #%d I420 <-> ARGB8888\n", j); |
187 std::unique_ptr<uint8_t[]> out_argb8888_buffer( | 179 std::unique_ptr<uint8_t[]> out_argb8888_buffer( |
188 new uint8_t[width_ * height_ * 4]); | 180 new uint8_t[width_ * height_ * 4]); |
189 EXPECT_EQ(0, | 181 EXPECT_EQ(0, |
190 ConvertFromI420(orig_frame_, kARGB, 0, out_argb8888_buffer.get())); | 182 ConvertFromI420(*orig_frame_, kARGB, 0, out_argb8888_buffer.get())); |
191 | 183 |
192 EXPECT_EQ(0, ConvertToI420(kARGB, out_argb8888_buffer.get(), 0, 0, width_, | 184 EXPECT_EQ(0, ConvertToI420(kARGB, out_argb8888_buffer.get(), 0, 0, width_, |
193 height_, 0, kVideoRotation_0, | 185 height_, 0, kVideoRotation_0, |
194 res_i420_buffer.get())); | 186 res_i420_buffer.get())); |
195 | 187 |
196 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { | 188 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { |
197 return; | 189 return; |
198 } | 190 } |
199 | 191 |
200 psnr = I420PSNR(*orig_frame_.video_frame_buffer(), *res_i420_buffer); | 192 psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer); |
201 // TODO(leozwang) Investigate the right psnr should be set for | 193 // TODO(leozwang) Investigate the right psnr should be set for |
202 // I420ToARGB8888, | 194 // I420ToARGB8888, |
203 EXPECT_GT(ceil(psnr), 42); | 195 EXPECT_GT(ceil(psnr), 42); |
204 | 196 |
205 ASSERT_EQ(0, fclose(output_file)); | 197 ASSERT_EQ(0, fclose(output_file)); |
206 } | 198 } |
207 | 199 |
208 TEST_F(TestLibYuv, ConvertAlignedFrame) { | 200 TEST_F(TestLibYuv, ConvertAlignedFrame) { |
209 // Reading YUV frame - testing on the first frame of the foreman sequence | 201 // Reading YUV frame - testing on the first frame of the foreman sequence |
210 std::string output_file_name = webrtc::test::OutputPath() + | 202 std::string output_file_name = webrtc::test::OutputPath() + |
211 "LibYuvTest_conversion.yuv"; | 203 "LibYuvTest_conversion.yuv"; |
212 FILE* output_file = fopen(output_file_name.c_str(), "wb"); | 204 FILE* output_file = fopen(output_file_name.c_str(), "wb"); |
213 ASSERT_TRUE(output_file != NULL); | 205 ASSERT_TRUE(output_file != NULL); |
214 | 206 |
215 double psnr = 0.0; | 207 double psnr = 0.0; |
216 | 208 |
217 int stride_y = 0; | 209 int stride_y = 0; |
218 int stride_uv = 0; | 210 int stride_uv = 0; |
219 Calc16ByteAlignedStride(width_, &stride_y, &stride_uv); | 211 Calc16ByteAlignedStride(width_, &stride_y, &stride_uv); |
220 | 212 |
221 rtc::scoped_refptr<I420Buffer> res_i420_buffer = | 213 rtc::scoped_refptr<I420Buffer> res_i420_buffer = |
222 I420Buffer::Create(width_, height_, stride_y, stride_uv, stride_uv); | 214 I420Buffer::Create(width_, height_, stride_y, stride_uv, stride_uv); |
223 std::unique_ptr<uint8_t[]> out_i420_buffer(new uint8_t[frame_length_]); | 215 std::unique_ptr<uint8_t[]> out_i420_buffer(new uint8_t[frame_length_]); |
224 EXPECT_EQ(0, ConvertFromI420(orig_frame_, kI420, 0, | 216 EXPECT_EQ(0, ConvertFromI420(*orig_frame_, kI420, 0, |
225 out_i420_buffer.get())); | 217 out_i420_buffer.get())); |
226 EXPECT_EQ(0, ConvertToI420(kI420, out_i420_buffer.get(), 0, 0, width_, | 218 EXPECT_EQ(0, ConvertToI420(kI420, out_i420_buffer.get(), 0, 0, width_, |
227 height_, 0, kVideoRotation_0, | 219 height_, 0, kVideoRotation_0, |
228 res_i420_buffer.get())); | 220 res_i420_buffer.get())); |
229 | 221 |
230 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { | 222 if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) { |
231 return; | 223 return; |
232 } | 224 } |
233 psnr = I420PSNR(*orig_frame_.video_frame_buffer(), *res_i420_buffer); | 225 psnr = I420PSNR(*orig_frame_->video_frame_buffer(), *res_i420_buffer); |
234 EXPECT_EQ(48.0, psnr); | 226 EXPECT_EQ(48.0, psnr); |
235 } | 227 } |
236 | 228 |
237 | |
238 TEST_F(TestLibYuv, RotateTest) { | 229 TEST_F(TestLibYuv, RotateTest) { |
239 // Use ConvertToI420 for multiple rotations - see that nothing breaks, all | 230 // Use ConvertToI420 for multiple rotations - see that nothing breaks, all |
240 // memory is properly allocated and end result is equal to the starting point. | 231 // memory is properly allocated and end result is equal to the starting point. |
241 int rotated_width = height_; | 232 int rotated_width = height_; |
242 int rotated_height = width_; | 233 int rotated_height = width_; |
243 int stride_y; | 234 int stride_y; |
244 int stride_uv; | 235 int stride_uv; |
| 236 |
| 237 // Assume compact layout, no padding. |
| 238 const uint8_t *orig_buffer = orig_frame_->video_frame_buffer()->DataY(); |
| 239 |
245 Calc16ByteAlignedStride(rotated_width, &stride_y, &stride_uv); | 240 Calc16ByteAlignedStride(rotated_width, &stride_y, &stride_uv); |
246 rtc::scoped_refptr<I420Buffer> rotated_res_i420_buffer = I420Buffer::Create( | 241 rtc::scoped_refptr<I420Buffer> rotated_res_i420_buffer = I420Buffer::Create( |
247 rotated_width, rotated_height, stride_y, stride_uv, stride_uv); | 242 rotated_width, rotated_height, stride_y, stride_uv, stride_uv); |
248 EXPECT_EQ(0, ConvertToI420(kI420, orig_buffer_.get(), 0, 0, width_, height_, | 243 EXPECT_EQ(0, ConvertToI420(kI420, orig_buffer, 0, 0, width_, height_, |
249 0, kVideoRotation_90, | 244 0, kVideoRotation_90, |
250 rotated_res_i420_buffer.get())); | 245 rotated_res_i420_buffer.get())); |
251 EXPECT_EQ(0, ConvertToI420(kI420, orig_buffer_.get(), 0, 0, width_, height_, | 246 EXPECT_EQ(0, ConvertToI420(kI420, orig_buffer, 0, 0, width_, height_, |
252 0, kVideoRotation_270, | 247 0, kVideoRotation_270, |
253 rotated_res_i420_buffer.get())); | 248 rotated_res_i420_buffer.get())); |
254 rotated_res_i420_buffer = I420Buffer::Create( | 249 rotated_res_i420_buffer = I420Buffer::Create( |
255 width_, height_, width_, (width_ + 1) / 2, (width_ + 1) / 2); | 250 width_, height_, width_, (width_ + 1) / 2, (width_ + 1) / 2); |
256 EXPECT_EQ(0, ConvertToI420(kI420, orig_buffer_.get(), 0, 0, width_, height_, | 251 EXPECT_EQ(0, ConvertToI420(kI420, orig_buffer, 0, 0, width_, height_, |
257 0, kVideoRotation_180, | 252 0, kVideoRotation_180, |
258 rotated_res_i420_buffer.get())); | 253 rotated_res_i420_buffer.get())); |
259 } | 254 } |
260 | 255 |
261 } // namespace webrtc | 256 } // namespace webrtc |
OLD | NEW |