OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/base_paths.h" | 5 #include "base/base_paths.h" |
6 #include "base/cpu.h" | 6 #include "base/cpu.h" |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
10 #include "media/base/djb2.h" | 10 #include "media/base/djb2.h" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
69 } | 69 } |
70 | 70 |
71 static void ReadRGB24Data(scoped_ptr<uint8[]>* data) { | 71 static void ReadRGB24Data(scoped_ptr<uint8[]>* data) { |
72 ReadData(FILE_PATH_LITERAL("bali_640x360_RGB24.rgb"), kRGB24Size, data); | 72 ReadData(FILE_PATH_LITERAL("bali_640x360_RGB24.rgb"), kRGB24Size, data); |
73 } | 73 } |
74 | 74 |
75 static void ReadYUY2Data(scoped_ptr<uint8[]>* data) { | 75 static void ReadYUY2Data(scoped_ptr<uint8[]>* data) { |
76 ReadData(FILE_PATH_LITERAL("bali_640x360_YUY2.yuv"), kYUY2Size, data); | 76 ReadData(FILE_PATH_LITERAL("bali_640x360_YUY2.yuv"), kYUY2Size, data); |
77 } | 77 } |
78 | 78 |
79 // Helper for converting image format from BGRA to RGBA. | |
80 static void ConvertBGRAToRGBA(unsigned char* pixels, size_t buffer_size) { | |
scherkus (not reviewing)
2013/06/20 00:28:08
wait ... isn't this backwards?
your comment in me
hkuang1
2013/06/20 03:45:33
Yes, my bad. Should be RGBA to BGRA. "SwapRedAndBl
| |
81 // Swizzle red and blue channels. | |
82 for (size_t i = 0; i < buffer_size; i += 4) { | |
83 std::swap(pixels[i], pixels[i + 2]); | |
84 } | |
85 } | |
86 | |
79 namespace media { | 87 namespace media { |
80 | 88 |
81 TEST(YUVConvertTest, YV12) { | 89 TEST(YUVConvertTest, YV12) { |
82 // Allocate all surfaces. | 90 // Allocate all surfaces. |
83 scoped_ptr<uint8[]> yuv_bytes; | 91 scoped_ptr<uint8[]> yuv_bytes; |
84 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]); | 92 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]); |
85 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSizeConverted]); | 93 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSizeConverted]); |
86 | 94 |
87 // Read YUV reference data from file. | 95 // Read YUV reference data from file. |
88 ReadYV12Data(&yuv_bytes); | 96 ReadYV12Data(&yuv_bytes); |
89 | 97 |
90 // Convert a frame of YUV to 32 bit ARGB. | 98 // Convert a frame of YUV to 32 bit ARGB. |
91 media::ConvertYUVToRGB32(yuv_bytes.get(), | 99 media::ConvertYUVToRGB32(yuv_bytes.get(), |
92 yuv_bytes.get() + kSourceUOffset, | 100 yuv_bytes.get() + kSourceUOffset, |
93 yuv_bytes.get() + kSourceVOffset, | 101 yuv_bytes.get() + kSourceVOffset, |
94 rgb_converted_bytes.get(), // RGB output | 102 rgb_converted_bytes.get(), // RGB output |
95 kSourceWidth, kSourceHeight, // Dimensions | 103 kSourceWidth, kSourceHeight, // Dimensions |
96 kSourceWidth, // YStride | 104 kSourceWidth, // YStride |
97 kSourceWidth / 2, // UVStride | 105 kSourceWidth / 2, // UVStride |
98 kSourceWidth * kBpp, // RGBStride | 106 kSourceWidth * kBpp, // RGBStride |
99 media::YV12); | 107 media::YV12); |
100 | 108 |
109 #if defined(OS_ANDROID) | |
110 ConvertBGRAToRGBA(rgb_converted_bytes.get(), kRGBSizeConverted); | |
111 #endif | |
112 | |
101 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted, | 113 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted, |
102 kDJB2HashSeed); | 114 kDJB2HashSeed); |
103 EXPECT_EQ(2413171226u, rgb_hash); | 115 EXPECT_EQ(2413171226u, rgb_hash); |
104 } | 116 } |
105 | 117 |
106 TEST(YUVConvertTest, YV16) { | 118 TEST(YUVConvertTest, YV16) { |
107 // Allocate all surfaces. | 119 // Allocate all surfaces. |
108 scoped_ptr<uint8[]> yuv_bytes; | 120 scoped_ptr<uint8[]> yuv_bytes; |
109 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]); | 121 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]); |
110 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSizeConverted]); | 122 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSizeConverted]); |
111 | 123 |
112 // Read YUV reference data from file. | 124 // Read YUV reference data from file. |
113 ReadYV16Data(&yuv_bytes); | 125 ReadYV16Data(&yuv_bytes); |
114 | 126 |
115 // Convert a frame of YUV to 32 bit ARGB. | 127 // Convert a frame of YUV to 32 bit ARGB. |
116 media::ConvertYUVToRGB32(yuv_bytes.get(), // Y | 128 media::ConvertYUVToRGB32(yuv_bytes.get(), // Y |
117 yuv_bytes.get() + kSourceUOffset, // U | 129 yuv_bytes.get() + kSourceUOffset, // U |
118 yuv_bytes.get() + kSourceYSize * 3 / 2, // V | 130 yuv_bytes.get() + kSourceYSize * 3 / 2, // V |
119 rgb_converted_bytes.get(), // RGB output | 131 rgb_converted_bytes.get(), // RGB output |
120 kSourceWidth, kSourceHeight, // Dimensions | 132 kSourceWidth, kSourceHeight, // Dimensions |
121 kSourceWidth, // YStride | 133 kSourceWidth, // YStride |
122 kSourceWidth / 2, // UVStride | 134 kSourceWidth / 2, // UVStride |
123 kSourceWidth * kBpp, // RGBStride | 135 kSourceWidth * kBpp, // RGBStride |
124 media::YV16); | 136 media::YV16); |
125 | 137 |
138 #if defined(OS_ANDROID) | |
139 ConvertBGRAToRGBA(rgb_converted_bytes.get(), kRGBSizeConverted); | |
140 #endif | |
141 | |
126 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted, | 142 uint32 rgb_hash = DJB2Hash(rgb_converted_bytes.get(), kRGBSizeConverted, |
127 kDJB2HashSeed); | 143 kDJB2HashSeed); |
128 EXPECT_EQ(4222342047u, rgb_hash); | 144 EXPECT_EQ(4222342047u, rgb_hash); |
129 } | 145 } |
130 | 146 |
131 struct YUVScaleTestData { | 147 struct YUVScaleTestData { |
132 YUVScaleTestData(media::YUVType y, media::ScaleFilter s, uint32 r) | 148 YUVScaleTestData(media::YUVType y, media::ScaleFilter s, uint32 r) |
133 : yuv_type(y), | 149 : yuv_type(y), |
134 scale_filter(s), | 150 scale_filter(s), |
135 rgb_hash(r) { | 151 rgb_hash(r) { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
210 rgb_bytes_.get(), // RGB output | 226 rgb_bytes_.get(), // RGB output |
211 kSourceWidth, kSourceHeight, // Dimensions | 227 kSourceWidth, kSourceHeight, // Dimensions |
212 kScaledWidth, kScaledHeight, // Dimensions | 228 kScaledWidth, kScaledHeight, // Dimensions |
213 kSourceWidth, // YStride | 229 kSourceWidth, // YStride |
214 kSourceWidth / 2, // UvStride | 230 kSourceWidth / 2, // UvStride |
215 kScaledWidth * kBpp, // RgbStride | 231 kScaledWidth * kBpp, // RgbStride |
216 GetParam().yuv_type, | 232 GetParam().yuv_type, |
217 media::ROTATE_0, | 233 media::ROTATE_0, |
218 GetParam().scale_filter); | 234 GetParam().scale_filter); |
219 | 235 |
236 #if defined(OS_ANDROID) | |
237 ConvertBGRAToRGBA(rgb_bytes_.get(), kRGBSizeScaled); | |
238 #endif | |
239 | |
220 uint32 rgb_hash = DJB2Hash(rgb_bytes_.get(), kRGBSizeScaled, kDJB2HashSeed); | 240 uint32 rgb_hash = DJB2Hash(rgb_bytes_.get(), kRGBSizeScaled, kDJB2HashSeed); |
221 EXPECT_EQ(GetParam().rgb_hash, rgb_hash); | 241 EXPECT_EQ(GetParam().rgb_hash, rgb_hash); |
222 } | 242 } |
223 | 243 |
224 TEST_P(YUVScaleTest, ZeroSourceSize) { | 244 TEST_P(YUVScaleTest, ZeroSourceSize) { |
225 media::ScaleYUVToRGB32(y_plane(), // Y | 245 media::ScaleYUVToRGB32(y_plane(), // Y |
226 u_plane(), // U | 246 u_plane(), // U |
227 v_plane(), // V | 247 v_plane(), // V |
228 rgb_bytes_.get(), // RGB output | 248 rgb_bytes_.get(), // RGB output |
229 0, 0, // Dimensions | 249 0, 0, // Dimensions |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
297 media::ConvertYUVToRGB32(&y, // Y | 317 media::ConvertYUVToRGB32(&y, // Y |
298 &u, // U | 318 &u, // U |
299 &v, // V | 319 &v, // V |
300 &rgb[0], // RGB output | 320 &rgb[0], // RGB output |
301 1, 1, // Dimensions | 321 1, 1, // Dimensions |
302 0, // YStride | 322 0, // YStride |
303 0, // UVStride | 323 0, // UVStride |
304 0, // RGBStride | 324 0, // RGBStride |
305 media::YV12); | 325 media::YV12); |
306 | 326 |
327 #if defined(OS_ANDROID) | |
328 ConvertBGRAToRGBA(rgb, kBpp); | |
329 #endif | |
330 | |
307 int expected_test = memcmp(rgb, expected, sizeof(expected)); | 331 int expected_test = memcmp(rgb, expected, sizeof(expected)); |
308 EXPECT_EQ(0, expected_test); | 332 EXPECT_EQ(0, expected_test); |
309 } | 333 } |
310 | 334 |
311 TEST(YUVConvertTest, RGB24ToYUV) { | 335 TEST(YUVConvertTest, RGB24ToYUV) { |
312 // Allocate all surfaces. | 336 // Allocate all surfaces. |
313 scoped_ptr<uint8[]> rgb_bytes; | 337 scoped_ptr<uint8[]> rgb_bytes; |
314 scoped_ptr<uint8[]> yuv_converted_bytes(new uint8[kYUV12Size]); | 338 scoped_ptr<uint8[]> yuv_converted_bytes(new uint8[kYUV12Size]); |
315 | 339 |
316 // Read RGB24 reference data from file. | 340 // Read RGB24 reference data from file. |
317 ReadRGB24Data(&rgb_bytes); | 341 ReadRGB24Data(&rgb_bytes); |
318 | 342 |
319 // Convert to I420. | 343 // Convert to I420. |
320 media::ConvertRGB24ToYUV(rgb_bytes.get(), | 344 media::ConvertRGB24ToYUV(rgb_bytes.get(), |
321 yuv_converted_bytes.get(), | 345 yuv_converted_bytes.get(), |
322 yuv_converted_bytes.get() + kSourceUOffset, | 346 yuv_converted_bytes.get() + kSourceUOffset, |
323 yuv_converted_bytes.get() + kSourceVOffset, | 347 yuv_converted_bytes.get() + kSourceVOffset, |
324 kSourceWidth, kSourceHeight, // Dimensions | 348 kSourceWidth, kSourceHeight, // Dimensions |
325 kSourceWidth * 3, // RGBStride | 349 kSourceWidth * 3, // RGBStride |
326 kSourceWidth, // YStride | 350 kSourceWidth, // YStride |
327 kSourceWidth / 2); // UVStride | 351 kSourceWidth / 2); // UVStride |
328 | 352 |
329 uint32 rgb_hash = DJB2Hash(yuv_converted_bytes.get(), kYUV12Size, | 353 uint32 rgb_hash = DJB2Hash(yuv_converted_bytes.get(), kYUV12Size, |
330 kDJB2HashSeed); | 354 kDJB2HashSeed); |
355 | |
scherkus (not reviewing)
2013/06/20 00:28:08
remove extra line that snuck in
hkuang1
2013/06/20 03:45:33
Done.
| |
331 EXPECT_EQ(320824432u, rgb_hash); | 356 EXPECT_EQ(320824432u, rgb_hash); |
332 } | 357 } |
333 | 358 |
334 TEST(YUVConvertTest, RGB32ToYUV) { | 359 TEST(YUVConvertTest, RGB32ToYUV) { |
335 // Allocate all surfaces. | 360 // Allocate all surfaces. |
336 scoped_ptr<uint8[]> yuv_bytes(new uint8[kYUV12Size]); | 361 scoped_ptr<uint8[]> yuv_bytes(new uint8[kYUV12Size]); |
337 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]); | 362 scoped_ptr<uint8[]> rgb_bytes(new uint8[kRGBSize]); |
338 scoped_ptr<uint8[]> yuv_converted_bytes(new uint8[kYUV12Size]); | 363 scoped_ptr<uint8[]> yuv_converted_bytes(new uint8[kYUV12Size]); |
339 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSize]); | 364 scoped_ptr<uint8[]> rgb_converted_bytes(new uint8[kRGBSize]); |
340 | 365 |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
936 EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(), | 961 EXPECT_EQ(0, memcmp(rgb_bytes_reference.get(), |
937 rgb_bytes_converted.get(), | 962 rgb_bytes_converted.get(), |
938 kWidth * kBpp)); | 963 kWidth * kBpp)); |
939 } | 964 } |
940 | 965 |
941 #endif // defined(ARCH_CPU_X86_64) | 966 #endif // defined(ARCH_CPU_X86_64) |
942 | 967 |
943 #endif // defined(ARCH_CPU_X86_FAMILY) | 968 #endif // defined(ARCH_CPU_X86_FAMILY) |
944 | 969 |
945 } // namespace media | 970 } // namespace media |
OLD | NEW |