From 9780dd4e817f3a80d4e43e3bcf97a2710635dfd3 Mon Sep 17 00:00:00 2001 From: "fbarchard@google.com" Date: Fri, 11 Jan 2013 23:42:00 +0000 Subject: [PATCH] Remove V210. Quality of this code is insufficient for libyuv. Unable to make V210 pass valgrind. Would require effort to add missing support and optimization. BUG=91 TEST=valgrind Review URL: https://webrtc-codereview.appspot.com/1021009 git-svn-id: http://libyuv.googlecode.com/svn/trunk@536 16f28f9a-4ce2-e073-06de-1de4eb20be90 --- include/libyuv/convert.h | 8 --- include/libyuv/convert_argb.h | 8 +-- include/libyuv/convert_from.h | 7 -- include/libyuv/planar_functions.h | 6 -- include/libyuv/row.h | 3 - include/libyuv/version.h | 2 +- include/libyuv/video_common.h | 4 +- source/convert.cc | 106 ------------------------------ source/convert_argb.cc | 9 --- source/convert_from.cc | 46 ------------- source/planar_functions.cc | 26 -------- source/row_common.cc | 59 +---------------- unit_test/convert_test.cc | 4 +- unit_test/video_common_test.cc | 1 - 14 files changed, 5 insertions(+), 284 deletions(-) diff --git a/include/libyuv/convert.h b/include/libyuv/convert.h index da1a7e6e9..7c1928f56 100644 --- a/include/libyuv/convert.h +++ b/include/libyuv/convert.h @@ -122,14 +122,6 @@ int Q420ToI420(const uint8* src_y, int src_stride_y, uint8* dst_v, int dst_stride_v, int width, int height); -// Convert V210 to I420. -LIBYUV_API -int V210ToI420(const uint8* src_uyvy, int src_stride_uyvy, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height); - // ARGB little endian (bgra in memory) to I420. LIBYUV_API int ARGBToI420(const uint8* src_frame, int src_stride_frame, diff --git a/include/libyuv/convert_argb.h b/include/libyuv/convert_argb.h index 19b439442..888d96adf 100644 --- a/include/libyuv/convert_argb.h +++ b/include/libyuv/convert_argb.h @@ -18,7 +18,7 @@ #include "libyuv/rotate.h" // TODO(fbarchard): This set of functions should exactly match convert.h -// Add missing V210 and Q420. +// Add missing Q420. // TODO(fbarchard): Add tests. Create random content of right size and convert // with C vs Opt and or to I420 and compare. // TODO(fbarchard): Some of these functions lack parameter setting. @@ -123,12 +123,6 @@ int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy, uint8* dst_argb, int dst_stride_argb, int width, int height); -// TODO(fbarchard): Convert V210 to ARGB. -// LIBYUV_API -// int V210ToARGB(const uint8* src_uyvy, int src_stride_uyvy, -// uint8* dst_argb, int dst_stride_argb, -// int width, int height); - // BGRA little endian (argb in memory) to ARGB. LIBYUV_API int BGRAToARGB(const uint8* src_frame, int src_stride_frame, diff --git a/include/libyuv/convert_from.h b/include/libyuv/convert_from.h index 44ff4d98f..014da40dd 100644 --- a/include/libyuv/convert_from.h +++ b/include/libyuv/convert_from.h @@ -89,13 +89,6 @@ int I420ToUYVY(const uint8* src_y, int src_stride_y, uint8* dst_frame, int dst_stride_frame, int width, int height); -LIBYUV_API -int I420ToV210(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_frame, int dst_stride_frame, - int width, int height); - LIBYUV_API int I420ToARGB(const uint8* src_y, int src_stride_y, const uint8* src_u, int src_stride_u, diff --git a/include/libyuv/planar_functions.h b/include/libyuv/planar_functions.h index fe7bf6604..688bef5dc 100644 --- a/include/libyuv/planar_functions.h +++ b/include/libyuv/planar_functions.h @@ -295,12 +295,6 @@ void ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride, #define HAS_ARGBAFFINEROW_SSE2 #endif -// Convert V210 to UYVY. -LIBYUV_API -int V210ToUYVY(const uint8* src_v210, int src_stride_v210, - uint8* dst_uyvy, int dst_stride_uyvy, - int width, int height); - #ifdef __cplusplus } // extern "C" } // namespace libyuv diff --git a/include/libyuv/row.h b/include/libyuv/row.h index b9a0abcbc..f62d37687 100644 --- a/include/libyuv/row.h +++ b/include/libyuv/row.h @@ -1279,9 +1279,6 @@ void ARGBInterpolateRow_NEON(uint8* dst_argb, const uint8* src_argb, ptrdiff_t src_stride_argb, int dst_width, int source_y_fraction); -void UYVYToV210Row_C(const uint8* src_uyvy, uint8* dst_v210, int width); -void V210ToUYVYRow_C(const uint8* src_v210, uint8* dst_uyvy, int width); - #ifdef __cplusplus } // extern "C" } // namespace libyuv diff --git a/include/libyuv/version.h b/include/libyuv/version.h index 08c033fc9..2e0086e06 100644 --- a/include/libyuv/version.h +++ b/include/libyuv/version.h @@ -11,6 +11,6 @@ #ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT #define INCLUDE_LIBYUV_VERSION_H_ -#define LIBYUV_VERSION 535 +#define LIBYUV_VERSION 536 #endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT diff --git a/include/libyuv/video_common.h b/include/libyuv/video_common.h index 3e5d635ee..791c0c069 100644 --- a/include/libyuv/video_common.h +++ b/include/libyuv/video_common.h @@ -54,10 +54,9 @@ enum FourCC { FOURCC_YUY2 = FOURCC('Y', 'U', 'Y', '2'), FOURCC_UYVY = FOURCC('U', 'Y', 'V', 'Y'), - // 3 Secondary YUV formats: 2 row biplanar, 1 packed. + // 2 Secondary YUV formats: row biplanar. FOURCC_M420 = FOURCC('M', '4', '2', '0'), FOURCC_Q420 = FOURCC('Q', '4', '2', '0'), - FOURCC_V210 = FOURCC('V', '2', '1', '0'), // 9 Primary RGB formats: 4 32 bpp, 2 24 bpp, 3 16 bpp. FOURCC_ARGB = FOURCC('A', 'R', 'G', 'B'), @@ -119,7 +118,6 @@ enum FourCCBpp { FOURCC_BPP_UYVY = 16, FOURCC_BPP_M420 = 12, FOURCC_BPP_Q420 = 12, - FOURCC_BPP_V210 = 22, // 128 / 6 actually. FOURCC_BPP_ARGB = 32, FOURCC_BPP_BGRA = 32, FOURCC_BPP_ABGR = 32, diff --git a/source/convert.cc b/source/convert.cc index ff7445d10..574b53661 100644 --- a/source/convert.cc +++ b/source/convert.cc @@ -692,101 +692,6 @@ int UYVYToI420(const uint8* src_uyvy, int src_stride_uyvy, return 0; } -// Convert V210 to I420. -// V210 is 10 bit version of UYVY. 16 bytes to store 6 pixels. -// Width is multiple of 48 pixels = 128 bytes. -LIBYUV_API -int V210ToI420(const uint8* src_v210, int src_stride_v210, - uint8* dst_y, int dst_stride_y, - uint8* dst_u, int dst_stride_u, - uint8* dst_v, int dst_stride_v, - int width, int height) { - if (!src_v210 || !dst_y || !dst_u || !dst_v || - width <= 0 || height == 0 || - width * 2 * 2 > kMaxStride) { - return -1; - } - // Negative height means invert the image. - if (height < 0) { - height = -height; - src_v210 = src_v210 + (height - 1) * src_stride_v210; - src_stride_v210 = -src_stride_v210; - } - SIMD_ALIGNED(uint8 row[kMaxStride * 2]); - void (*V210ToUYVYRow)(const uint8* src_v210, uint8* dst_uyvy, int pix); - V210ToUYVYRow = V210ToUYVYRow_C; - - void (*UYVYToUVRow)(const uint8* src_uyvy, int src_stride_uyvy, - uint8* dst_u, uint8* dst_v, int pix); - void (*UYVYToYRow)(const uint8* src_uyvy, - uint8* dst_y, int pix); - UYVYToYRow = UYVYToYRow_C; - UYVYToUVRow = UYVYToUVRow_C; -#if defined(HAS_UYVYTOYROW_SSE2) - if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(width, 16)) { - UYVYToUVRow = UYVYToUVRow_SSE2; - UYVYToYRow = UYVYToYRow_Unaligned_SSE2; - if (IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) { - UYVYToYRow = UYVYToYRow_SSE2; - } - } -#elif defined(HAS_UYVYTOYROW_NEON) - if (TestCpuFlag(kCpuHasNEON) && width >= 8) { - UYVYToYRow = UYVYToYRow_Any_NEON; - if (width >= 16) { - UYVYToUVRow = UYVYToUVRow_Any_NEON; - } - if (IS_ALIGNED(width, 16)) { - UYVYToYRow = UYVYToYRow_NEON; - UYVYToUVRow = UYVYToUVRow_NEON; - } - } -#endif - -#if defined(HAS_UYVYTOYROW_SSE2) - if (TestCpuFlag(kCpuHasSSE2) && width >= 16) { - UYVYToUVRow = UYVYToUVRow_Any_SSE2; - UYVYToYRow = UYVYToYRow_Any_SSE2; - if (IS_ALIGNED(width, 16)) { - UYVYToYRow = UYVYToYRow_Unaligned_SSE2; - UYVYToUVRow = UYVYToUVRow_SSE2; - if (IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) { - UYVYToYRow = UYVYToYRow_SSE2; - } - } - } -#elif defined(HAS_UYVYTOYROW_NEON) - if (TestCpuFlag(kCpuHasNEON) && width >= 8) { - UYVYToYRow = UYVYToYRow_Any_NEON; - if (width >= 16) { - UYVYToUVRow = UYVYToUVRow_Any_NEON; - } - if (IS_ALIGNED(width, 16)) { - UYVYToYRow = UYVYToYRow_NEON; - UYVYToUVRow = UYVYToUVRow_NEON; - } - } -#endif - - for (int y = 0; y < height - 1; y += 2) { - V210ToUYVYRow(src_v210, row, width); - V210ToUYVYRow(src_v210 + src_stride_v210, row + kMaxStride, width); - UYVYToUVRow(row, kMaxStride, dst_u, dst_v, width); - UYVYToYRow(row, dst_y, width); - UYVYToYRow(row + kMaxStride, dst_y + dst_stride_y, width); - src_v210 += src_stride_v210 * 2; - dst_y += dst_stride_y * 2; - dst_u += dst_stride_u; - dst_v += dst_stride_v; - } - if (height & 1) { - V210ToUYVYRow(src_v210, row, width); - UYVYToUVRow(row, 0, dst_u, dst_v, width); - UYVYToYRow(row, dst_y, width); - } - return 0; -} - // Convert ARGB to I420. LIBYUV_API int ARGBToI420(const uint8* src_argb, int src_stride_argb, @@ -1865,17 +1770,6 @@ int ConvertToI420(const uint8* sample, v, v_stride, dst_width, inv_dst_height); break; - case FOURCC_V210: - // stride is multiple of 48 pixels (128 bytes). - // pixels come in groups of 6 = 16 bytes - src = sample + (aligned_src_width + 47) / 48 * 128 * crop_y + - crop_x / 6 * 16; - r = V210ToI420(src, (aligned_src_width + 47) / 48 * 128, - y, y_stride, - u, u_stride, - v, v_stride, - dst_width, inv_dst_height); - break; case FOURCC_24BG: src = sample + (src_width * crop_y + crop_x) * 3; r = RGB24ToI420(src, src_width * 3, diff --git a/source/convert_argb.cc b/source/convert_argb.cc index fccbc175f..0155ceb38 100644 --- a/source/convert_argb.cc +++ b/source/convert_argb.cc @@ -1084,15 +1084,6 @@ int ConvertToARGB(const uint8* sample, size_t sample_size, dst_argb, argb_stride, dst_width, inv_dst_height); break; -// case FOURCC_V210: - // stride is multiple of 48 pixels (128 bytes). - // pixels come in groups of 6 = 16 bytes -// src = sample + (aligned_src_width + 47) / 48 * 128 * crop_y + -// crop_x / 6 * 16; -// r = V210ToARGB(src, (aligned_src_width + 47) / 48 * 128, -// dst_argb, argb_stride, -// dst_width, inv_dst_height); -// break; case FOURCC_24BG: src = sample + (src_width * crop_y + crop_x) * 3; r = RGB24ToARGB(src, src_width * 3, diff --git a/source/convert_from.cc b/source/convert_from.cc index 33c9fed63..807d6167d 100644 --- a/source/convert_from.cc +++ b/source/convert_from.cc @@ -408,43 +408,6 @@ int I420ToUYVY(const uint8* src_y, int src_stride_y, return 0; } -LIBYUV_API -int I420ToV210(const uint8* src_y, int src_stride_y, - const uint8* src_u, int src_stride_u, - const uint8* src_v, int src_stride_v, - uint8* dst_v210, int dst_stride_v210, - int width, int height) { - if (width * 16 / 6 > kMaxStride || - !src_y || !src_u || !src_v || !dst_v210 || - width <= 0 || height == 0) { - return -1; - } - // Negative height means invert the image. - if (height < 0) { - height = -height; - dst_v210 = dst_v210 + (height - 1) * dst_stride_v210; - dst_stride_v210 = -dst_stride_v210; - } - - SIMD_ALIGNED(uint8 row[kMaxStride]); - - for (int y = 0; y < height - 1; y += 2) { - I422ToUYVYRow_C(src_y, src_u, src_v, row, width); - UYVYToV210Row_C(row, dst_v210, width); - I422ToUYVYRow_C(src_y + src_stride_y, src_u, src_v, row, width); - UYVYToV210Row_C(row, dst_v210 + dst_stride_v210, width); - src_y += src_stride_y * 2; - src_u += src_stride_u; - src_v += src_stride_v; - dst_v210 += dst_stride_v210 * 2; - } - if (height & 1) { - I422ToUYVYRow_C(src_y, src_u, src_v, row, width); - UYVYToV210Row_C(row, dst_v210, width); - } - return 0; -} - LIBYUV_API int I420ToNV12(const uint8* src_y, int src_stride_y, const uint8* src_u, int src_stride_u, @@ -1046,15 +1009,6 @@ int ConvertFromI420(const uint8* y, int y_stride, dst_sample_stride ? dst_sample_stride : width * 2, width, height); break; - case FOURCC_V210: - r = I420ToV210(y, y_stride, - u, u_stride, - v, v_stride, - dst_sample, - dst_sample_stride ? dst_sample_stride : - (width + 47) / 48 * 128, - width, height); - break; case FOURCC_RGBP: r = I420ToRGB565(y, y_stride, u, u_stride, diff --git a/source/planar_functions.cc b/source/planar_functions.cc index 0f8221f71..7d4e0f949 100644 --- a/source/planar_functions.cc +++ b/source/planar_functions.cc @@ -1207,32 +1207,6 @@ int ARGBInterpolate(const uint8* src_argb0, int src_stride_argb0, return 0; } -// Convert V210 to UYVY. -LIBYUV_API -int V210ToUYVY(const uint8* src_v210, int src_stride_v210, - uint8* dst_uyvy, int dst_stride_uyvy, - int width, int height) { - if (!src_v210 || !dst_uyvy || - width <= 0 || height == 0) { - return -1; - } - // Negative height means invert the image. - if (height < 0) { - height = -height; - src_v210 = src_v210 + (height - 1) * src_stride_v210; - src_stride_v210 = -src_stride_v210; - } - void (*V210ToUYVYRow)(const uint8* src_v210, uint8* dst_uyvy, int pix) = - V210ToUYVYRow_C; - - for (int y = 0; y < height; ++y) { - V210ToUYVYRow(src_v210, dst_uyvy, width); - src_v210 += src_stride_v210; - dst_uyvy += dst_stride_uyvy; - } - return 0; -} - #ifdef __cplusplus } // extern "C" } // namespace libyuv diff --git a/source/row_common.cc b/source/row_common.cc index 19e2e112b..8758c8ee4 100644 --- a/source/row_common.cc +++ b/source/row_common.cc @@ -20,15 +20,8 @@ extern "C" { #endif #ifdef LIBYUV_LITTLE_ENDIAN -#define READWORD(p) (*reinterpret_cast(p)) #define WRITEWORD(p, v) *reinterpret_cast(p) = v #else -static inline uint32 READWORD(const uint8* p) { - return static_cast(p[0]) | - (static_cast(p[1]) << 8) | - (static_cast(p[2]) << 16) | - (static_cast(p[3]) << 24); -} static inline void WRITEWORD(uint8* p, uint32 v) { p[0] = (uint8)(v & 255); p[1] = (uint8)((v >> 8) & 255); @@ -37,27 +30,6 @@ static inline void WRITEWORD(uint8* p, uint32 v) { } #endif -#define EIGHTTOTEN(x) (x << 2 | x >> 6) -void UYVYToV210Row_C(const uint8* src_uyvy, uint8* dst_v210, int width) { - for (int x = 0; x < width; x += 6) { - WRITEWORD(dst_v210 + 0, (EIGHTTOTEN(src_uyvy[0])) | - (EIGHTTOTEN(src_uyvy[1]) << 10) | - (EIGHTTOTEN(src_uyvy[2]) << 20)); - WRITEWORD(dst_v210 + 4, (EIGHTTOTEN(src_uyvy[3])) | - (EIGHTTOTEN(src_uyvy[4]) << 10) | - (EIGHTTOTEN(src_uyvy[5]) << 20)); - WRITEWORD(dst_v210 + 8, (EIGHTTOTEN(src_uyvy[6])) | - (EIGHTTOTEN(src_uyvy[7]) << 10) | - (EIGHTTOTEN(src_uyvy[8]) << 20)); - WRITEWORD(dst_v210 + 12, (EIGHTTOTEN(src_uyvy[9])) | - (EIGHTTOTEN(src_uyvy[10]) << 10) | - (EIGHTTOTEN(src_uyvy[11]) << 20)); - src_uyvy += 12; - dst_v210 += 16; - } -} -#undef EIGHTTOTEN - void BGRAToARGBRow_C(const uint8* src_bgra, uint8* dst_argb, int width) { for (int x = 0; x < width; ++x) { // To support in-place conversion. @@ -230,7 +202,7 @@ void ARGBToRGB565Row_C(const uint8* src_argb, uint8* dst_rgb, int width) { uint8 g1 = src_argb[5] >> 2; uint8 r1 = src_argb[6] >> 3; WRITEWORD(dst_rgb, b0 | (g0 << 5) | (r0 << 11) | - (b1 << 16) | (g1 << 21) | (r1 << 27)); + (b1 << 16) | (g1 << 21) | (r1 << 27)); dst_rgb += 4; src_argb += 8; } @@ -1789,35 +1761,6 @@ void UYVYToARGBRow_Unaligned_SSSE3(const uint8* src_uyvy, #endif // defined(_M_IX86) || defined(__x86_64__) || defined(__i386__) #endif // !defined(YUV_DISABLE_ASM) -// Must be multiple of 6 pixels. Will over convert to handle remainder. -// https://developer.apple.com/quicktime/icefloe/dispatch019.html#v210 -void V210ToUYVYRow_C(const uint8* src_v210, uint8* dst_uyvy, int width) { - for (int x = 0; x < width; x += 6) { - uint32 w = READWORD(src_v210 + 0); - dst_uyvy[0] = (w >> 2) & 0xff; - dst_uyvy[1] = (w >> 12) & 0xff; - dst_uyvy[2] = (w >> 22) & 0xff; - - w = READWORD(src_v210 + 4); - dst_uyvy[3] = (w >> 2) & 0xff; - dst_uyvy[4] = (w >> 12) & 0xff; - dst_uyvy[5] = (w >> 22) & 0xff; - - w = READWORD(src_v210 + 8); - dst_uyvy[6] = (w >> 2) & 0xff; - dst_uyvy[7] = (w >> 12) & 0xff; - dst_uyvy[8] = (w >> 22) & 0xff; - - w = READWORD(src_v210 + 12); - dst_uyvy[9] = (w >> 2) & 0xff; - dst_uyvy[10] = (w >> 12) & 0xff; - dst_uyvy[11] = (w >> 22) & 0xff; - - src_v210 += 16; - dst_uyvy += 12; - } -} - #ifdef __cplusplus } // extern "C" } // namespace libyuv diff --git a/unit_test/convert_test.cc b/unit_test/convert_test.cc index c18058cb3..36aeaf640 100644 --- a/unit_test/convert_test.cc +++ b/unit_test/convert_test.cc @@ -417,7 +417,7 @@ TEST_F(libyuvTest, FMT_PLANAR##To##FMT_B##N) { \ TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ benchmark_width_, DIFF, _Invert, -, 0, FMT_C, BPP_C) \ TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ - benchmark_width_, DIFF, _Opt, +, 0, FMT_C, BPP_C) + benchmark_width_, DIFF, _Opt, +, 0, FMT_C, BPP_C) TESTPLANARTOB(I420, 2, 2, ARGB, 4, 4, 2, ARGB, 4) TESTPLANARTOB(I420, 2, 2, BGRA, 4, 4, 2, ARGB, 4) @@ -434,7 +434,6 @@ TESTPLANARTOB(I422, 2, 1, ABGR, 4, 4, 2, ARGB, 4) TESTPLANARTOB(I422, 2, 1, RGBA, 4, 4, 2, ARGB, 4) TESTPLANARTOB(I411, 4, 1, ARGB, 4, 4, 2, ARGB, 4) TESTPLANARTOB(I444, 1, 1, ARGB, 4, 4, 2, ARGB, 4) -TESTPLANARTOB(I420, 2, 2, V210, 16 / 6, 128, 2, UYVY, 2) TESTPLANARTOB(I420, 2, 2, YUY2, 2, 4, 1, ARGB, 4) TESTPLANARTOB(I420, 2, 2, UYVY, 2, 4, 1, ARGB, 4) TESTPLANARTOB(I422, 2, 1, YUY2, 2, 4, 0, ARGB, 4) @@ -624,7 +623,6 @@ TESTATOPLANAR(ARGB4444, 2, I420, 2, 2, 17) TESTATOPLANAR(ARGB, 4, I411, 4, 1, 4) TESTATOPLANAR(ARGB, 4, I422, 2, 1, 2) TESTATOPLANAR(ARGB, 4, I444, 1, 1, 2) -TESTATOPLANAR(V210, 16 / 6, I420, 2, 2, 2) TESTATOPLANAR(YUY2, 2, I420, 2, 2, 2) TESTATOPLANAR(UYVY, 2, I420, 2, 2, 2) TESTATOPLANAR(YUY2, 2, I422, 2, 1, 2) diff --git a/unit_test/video_common_test.cc b/unit_test/video_common_test.cc index 6e841bdc1..dd482b40f 100644 --- a/unit_test/video_common_test.cc +++ b/unit_test/video_common_test.cc @@ -69,7 +69,6 @@ TEST_F(libyuvTest, TestFourCC) { EXPECT_TRUE(TestValidFourCC(FOURCC_UYVY, FOURCC_BPP_UYVY)); EXPECT_TRUE(TestValidFourCC(FOURCC_M420, FOURCC_BPP_M420)); EXPECT_TRUE(TestValidFourCC(FOURCC_Q420, FOURCC_BPP_Q420)); - EXPECT_TRUE(TestValidFourCC(FOURCC_V210, FOURCC_BPP_V210)); EXPECT_TRUE(TestValidFourCC(FOURCC_ARGB, FOURCC_BPP_ARGB)); EXPECT_TRUE(TestValidFourCC(FOURCC_BGRA, FOURCC_BPP_BGRA)); EXPECT_TRUE(TestValidFourCC(FOURCC_ABGR, FOURCC_BPP_ABGR));