diff --git a/README.chromium b/README.chromium index 577591410..98c9ec143 100644 --- a/README.chromium +++ b/README.chromium @@ -1,6 +1,6 @@ Name: libyuv URL: http://code.google.com/p/libyuv/ -Version: 354 +Version: 355 License: BSD License File: LICENSE diff --git a/include/libyuv/convert.h b/include/libyuv/convert.h index 8eb5eb476..c492bd52d 100644 --- a/include/libyuv/convert.h +++ b/include/libyuv/convert.h @@ -133,7 +133,7 @@ int ABGRToI420(const uint8* src_frame, int src_stride_frame, uint8* dst_v, int dst_stride_v, int width, int height); -// RGBA little endian (rgba in memory) to I420. +// RGBA little endian (abgr in memory) to I420. int RGBAToI420(const uint8* src_frame, int src_stride_frame, uint8* dst_y, int dst_stride_y, uint8* dst_u, int dst_stride_u, diff --git a/include/libyuv/version.h b/include/libyuv/version.h index 93bd54156..49943598a 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 354 +#define LIBYUV_VERSION 355 #endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT diff --git a/source/convert.cc b/source/convert.cc index baab99cc4..e1d83d7fd 100644 --- a/source/convert.cc +++ b/source/convert.cc @@ -1095,6 +1095,63 @@ int ABGRToI420(const uint8* src_abgr, int src_stride_abgr, return 0; } +int RGBAToI420(const uint8* src_rgba, int src_stride_rgba, + 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_rgba || + !dst_y || !dst_u || !dst_v || + width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + src_rgba = src_rgba + (height - 1) * src_stride_rgba; + src_stride_rgba = -src_stride_rgba; + } + void (*RGBAToYRow)(const uint8* src_rgba, uint8* dst_y, int pix); + void (*RGBAToUVRow)(const uint8* src_rgba0, int src_stride_rgba, + uint8* dst_u, uint8* dst_v, int width); + + RGBAToYRow = RGBAToYRow_C; + RGBAToUVRow = RGBAToUVRow_C; +#if defined(HAS_RGBATOYROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + if (width > 16) { + RGBAToUVRow = RGBAToUVRow_Any_SSSE3; + RGBAToYRow = RGBAToYRow_Any_SSSE3; + } + if (IS_ALIGNED(width, 16)) { + RGBAToUVRow = RGBAToUVRow_Unaligned_SSSE3; + RGBAToYRow = RGBAToYRow_Unaligned_SSSE3; + if (IS_ALIGNED(src_rgba, 16) && IS_ALIGNED(src_stride_rgba, 16)) { + RGBAToUVRow = RGBAToUVRow_SSSE3; + if (IS_ALIGNED(dst_y, 16) && IS_ALIGNED(dst_stride_y, 16)) { + RGBAToYRow = RGBAToYRow_SSSE3; + } + } + } + } +#endif + + for (int y = 0; y < height - 1; y += 2) { + RGBAToUVRow(src_rgba, src_stride_rgba, dst_u, dst_v, width); + RGBAToYRow(src_rgba, dst_y, width); + RGBAToYRow(src_rgba + src_stride_rgba, dst_y + dst_stride_y, width); + src_rgba += src_stride_rgba * 2; + dst_y += dst_stride_y * 2; + dst_u += dst_stride_u; + dst_v += dst_stride_v; + } + if (height & 1) { + RGBAToUVRow(src_rgba, 0, dst_u, dst_v, width); + RGBAToYRow(src_rgba, dst_y, width); + } + return 0; +} + int RGB24ToI420(const uint8* src_rgb24, int src_stride_rgb24, uint8* dst_y, int dst_stride_y, uint8* dst_u, int dst_stride_u, @@ -1763,6 +1820,14 @@ int ConvertToI420(const uint8* sample, size_t sample_size, v, v_stride, dst_width, inv_dst_height); break; + case FOURCC_RGBA: + src = sample + (src_width * crop_y + crop_x) * 4; + r = RGBAToI420(src, src_width * 4, + y, y_stride, + u, u_stride, + v, v_stride, + dst_width, inv_dst_height); + break; case FOURCC_RGBP: src = sample + (src_width * crop_y + crop_x) * 2; r = RGB565ToI420(src, src_width * 2, diff --git a/source/convert_argb.cc b/source/convert_argb.cc index 04f78b9c3..a6a302542 100644 --- a/source/convert_argb.cc +++ b/source/convert_argb.cc @@ -252,38 +252,6 @@ int I400ToARGB(const uint8* src_y, int src_stride_y, return 0; } -int ABGRToARGB(const uint8* src_abgr, int src_stride_abgr, - uint8* dst_argb, int dst_stride_argb, - int width, int height) { - if (!src_abgr || !dst_argb || - width <= 0 || height == 0) { - return -1; - } - // Negative height means invert the image. - if (height < 0) { - height = -height; - src_abgr = src_abgr + (height - 1) * src_stride_abgr; - src_stride_abgr = -src_stride_abgr; - } - void (*ABGRToARGBRow)(const uint8* src_abgr, uint8* dst_argb, int pix) = - ABGRToARGBRow_C; -#if defined(HAS_ABGRTOARGBROW_SSSE3) - if (TestCpuFlag(kCpuHasSSSE3) && - IS_ALIGNED(width, 4) && - IS_ALIGNED(src_abgr, 16) && IS_ALIGNED(src_stride_abgr, 16) && - IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) { - ABGRToARGBRow = ABGRToARGBRow_SSSE3; - } -#endif - - for (int y = 0; y < height; ++y) { - ABGRToARGBRow(src_abgr, dst_argb, width); - src_abgr += src_stride_abgr; - dst_argb += dst_stride_argb; - } - return 0; -} - // Convert BGRA to ARGB. int BGRAToARGB(const uint8* src_bgra, int src_stride_bgra, uint8* dst_argb, int dst_stride_argb, @@ -317,6 +285,39 @@ int BGRAToARGB(const uint8* src_bgra, int src_stride_bgra, return 0; } +// Convert ABGR to ARGB. +int ABGRToARGB(const uint8* src_abgr, int src_stride_abgr, + uint8* dst_argb, int dst_stride_argb, + int width, int height) { + if (!src_abgr || !dst_argb || + width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + src_abgr = src_abgr + (height - 1) * src_stride_abgr; + src_stride_abgr = -src_stride_abgr; + } + void (*ABGRToARGBRow)(const uint8* src_abgr, uint8* dst_argb, int pix) = + ABGRToARGBRow_C; +#if defined(HAS_ABGRTOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3) && + IS_ALIGNED(width, 4) && + IS_ALIGNED(src_abgr, 16) && IS_ALIGNED(src_stride_abgr, 16) && + IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) { + ABGRToARGBRow = ABGRToARGBRow_SSSE3; + } +#endif + + for (int y = 0; y < height; ++y) { + ABGRToARGBRow(src_abgr, dst_argb, width); + src_abgr += src_stride_abgr; + dst_argb += dst_stride_argb; + } + return 0; +} + // Convert RGBA to ARGB. int RGBAToARGB(const uint8* src_rgba, int src_stride_rgba, uint8* dst_argb, int dst_stride_argb, diff --git a/source/convert_from.cc b/source/convert_from.cc index 38ed40fbc..138516d71 100644 --- a/source/convert_from.cc +++ b/source/convert_from.cc @@ -828,6 +828,59 @@ int I420ToABGR(const uint8* src_y, int src_stride_y, return 0; } +// Convert I420 to RGBA. +int I420ToRGBA(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_rgba, int dst_stride_rgba, + int width, int height) { + if (!src_y || !src_u || !src_v || + !dst_rgba || + width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_rgba = dst_rgba + (height - 1) * dst_stride_rgba; + dst_stride_rgba = -dst_stride_rgba; + } + void (*I422ToRGBARow)(const uint8* y_buf, + const uint8* u_buf, + const uint8* v_buf, + uint8* rgb_buf, + int width) = I422ToRGBARow_C; +#if defined(HAS_I422TORGBAROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + I422ToRGBARow = I422ToRGBARow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + I422ToRGBARow = I422ToRGBARow_NEON; + } + } +#elif defined(HAS_I422TORGBAROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) { + I422ToRGBARow = I422ToRGBARow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + I422ToRGBARow = I422ToRGBARow_Unaligned_SSSE3; + if (IS_ALIGNED(dst_rgba, 16) && IS_ALIGNED(dst_stride_rgba, 16)) { + I422ToRGBARow = I422ToRGBARow_SSSE3; + } + } + } +#endif + + for (int y = 0; y < height; ++y) { + I422ToRGBARow(src_y, src_u, src_v, dst_rgba, width); + dst_rgba += dst_stride_rgba; + src_y += src_stride_y; + if (y & 1) { + src_u += src_stride_u; + src_v += src_stride_v; + } + } + return 0; +} + // Convert I420 to RGB24. int I420ToRGB24(const uint8* src_y, int src_stride_y, const uint8* src_u, int src_stride_u, @@ -1228,6 +1281,14 @@ int ConvertFromI420(const uint8* y, int y_stride, dst_sample_stride ? dst_sample_stride : width * 4, width, height); break; + case FOURCC_RGBA: + r = I420ToRGBA(y, y_stride, + u, u_stride, + v, v_stride, + dst_sample, + dst_sample_stride ? dst_sample_stride : width * 4, + width, height); + break; case FOURCC_BGGR: r = I420ToBayerBGGR(y, y_stride, u, u_stride, diff --git a/source/row.h b/source/row.h index 186a6fa88..dcd8b26e2 100644 --- a/source/row.h +++ b/source/row.h @@ -37,7 +37,9 @@ extern "C" { #define HAS_ABGRTOARGBROW_SSSE3 #define HAS_ABGRTOUVROW_SSSE3 #define HAS_ABGRTOYROW_SSSE3 -#define HAS_RGBATOARGBROW_SSSE3 +// TODO: #define HAS_RGBATOARGBROW_SSSE3 +// TODO: #define HAS_RGBATOUVROW_SSSE3 +// TODO: #define HAS_RGBATOYROW_SSSE3 #define HAS_ARGBTORGBAROW_SSSE3 #define HAS_ARGB1555TOARGBROW_SSE2 #define HAS_ARGB4444TOARGBROW_SSE2 @@ -56,11 +58,12 @@ extern "C" { #define HAS_BGRATOYROW_SSSE3 #define HAS_COPYROW_SSE2 #define HAS_COPYROW_X86 -#define HAS_I444TOARGBROW_SSSE3 #define HAS_I422TOARGBROW_SSSE3 -#define HAS_I411TOARGBROW_SSSE3 #define HAS_I422TOBGRAROW_SSSE3 #define HAS_I422TOABGRROW_SSSE3 +// TODO: #define HAS_I422TORGBAROW_SSSE3 +#define HAS_I444TOARGBROW_SSSE3 +#define HAS_I411TOARGBROW_SSSE3 #define HAS_I400TOARGBROW_SSE2 #define HAS_MIRRORROW_SSSE3 #define HAS_MIRRORROWUV_SSSE3 @@ -112,6 +115,7 @@ extern "C" { #define HAS_I422TOARGBROW_NEON #define HAS_I422TOBGRAROW_NEON #define HAS_I422TOABGRROW_NEON +// TODO: #define HAS_I422TORGBAROW_NEON #endif #if defined(_MSC_VER) && !defined(__CLR_VER) @@ -161,13 +165,20 @@ void I422ToABGRRow_NEON(const uint8* y_buf, const uint8* v_buf, uint8* rgb_buf, int width); +void I422ToRGBARow_NEON(const uint8* y_buf, + const uint8* u_buf, + const uint8* v_buf, + uint8* rgb_buf, + int width); void ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); void BGRAToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); void ABGRToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); +void RGBAToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); void ARGBToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); void BGRAToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); void ABGRToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); +void RGBAToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); void ARGBToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); @@ -175,12 +186,16 @@ void BGRAToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); void ABGRToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); +void RGBAToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, + uint8* dst_u, uint8* dst_v, int width); void ARGBToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); void BGRAToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); void ABGRToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); +void RGBAToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb, + uint8* dst_u, uint8* dst_v, int width); void MirrorRow_SSSE3(const uint8* src, uint8* dst, int width); void MirrorRow_SSE2(const uint8* src, uint8* dst, int width); @@ -206,6 +221,7 @@ void CopyRow_C(const uint8* src, uint8* dst, int count); void ARGBToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); void BGRAToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); void ABGRToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); +void RGBAToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); void ARGBToUVRow_C(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); @@ -213,19 +229,21 @@ void BGRAToUVRow_C(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); void ABGRToUVRow_C(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); +void RGBAToUVRow_C(const uint8* src_argb0, int src_stride_argb, + uint8* dst_u, uint8* dst_v, int width); -void ABGRToARGBRow_SSSE3(const uint8* src_abgr, uint8* dst_argb, int pix); void BGRAToARGBRow_SSSE3(const uint8* src_bgra, uint8* dst_argb, int pix); -void RGBAToARGBRow_SSSE3(const uint8* src_abgr, uint8* dst_argb, int pix); +void ABGRToARGBRow_SSSE3(const uint8* src_abgr, uint8* dst_argb, int pix); +void RGBAToARGBRow_SSSE3(const uint8* src_rgba, uint8* dst_argb, int pix); void RGB24ToARGBRow_SSSE3(const uint8* src_rgb24, uint8* dst_argb, int pix); void RAWToARGBRow_SSSE3(const uint8* src_rgb24, uint8* dst_argb, int pix); void ARGB1555ToARGBRow_SSE2(const uint8* src_argb, uint8* dst_argb, int pix); void RGB565ToARGBRow_SSE2(const uint8* src_argb, uint8* dst_argb, int pix); void ARGB4444ToARGBRow_SSE2(const uint8* src_argb, uint8* dst_argb, int pix); -void ABGRToARGBRow_C(const uint8* src_abgr, uint8* dst_argb, int pix); void BGRAToARGBRow_C(const uint8* src_bgra, uint8* dst_argb, int pix); -void RGBAToARGBRow_C(const uint8* src_abgr, uint8* dst_argb, int pix); +void ABGRToARGBRow_C(const uint8* src_abgr, uint8* dst_argb, int pix); +void RGBAToARGBRow_C(const uint8* src_rgba, uint8* dst_argb, int pix); void RGB24ToARGBRow_C(const uint8* src_rgb24, uint8* dst_argb, int pix); void RAWToARGBRow_C(const uint8* src_rgb24, uint8* dst_argb, int pix); void RGB565ToARGBRow_C(const uint8* src_rgb, uint8* dst_argb, int pix); @@ -289,6 +307,12 @@ void I422ToABGRRow_C(const uint8* y_buf, uint8* abgr_buf, int width); +void I422ToRGBARow_C(const uint8* y_buf, + const uint8* u_buf, + const uint8* v_buf, + uint8* rgba_buf, + int width); + void YToARGBRow_C(const uint8* y_buf, uint8* rgb_buf, int width); @@ -333,6 +357,12 @@ void I422ToABGRRow_SSSE3(const uint8* y_buf, uint8* abgr_buf, int width); +void I422ToRGBARow_SSSE3(const uint8* y_buf, + const uint8* u_buf, + const uint8* v_buf, + uint8* rgba_buf, + int width); + void I444ToARGBRow_Unaligned_SSSE3(const uint8* y_buf, const uint8* u_buf, const uint8* v_buf, @@ -373,6 +403,12 @@ void I422ToABGRRow_Unaligned_SSSE3(const uint8* y_buf, uint8* abgr_buf, int width); +void I422ToRGBARow_Unaligned_SSSE3(const uint8* y_buf, + const uint8* u_buf, + const uint8* v_buf, + uint8* rgba_buf, + int width); + void I444ToARGBRow_Any_SSSE3(const uint8* y_buf, const uint8* u_buf, const uint8* v_buf, @@ -413,6 +449,12 @@ void I422ToABGRRow_Any_SSSE3(const uint8* y_buf, uint8* abgr_buf, int width); +void I422ToRGBARow_Any_SSSE3(const uint8* y_buf, + const uint8* u_buf, + const uint8* v_buf, + uint8* rgba_buf, + int width); + void YToARGBRow_SSE2(const uint8* y_buf, uint8* argb_buf, int width); @@ -434,12 +476,15 @@ void ARGBToARGB4444Row_Any_SSE2(const uint8* src_argb, uint8* dst_rgb, int pix); void ARGBToYRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); void BGRAToYRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); void ABGRToYRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); +void RGBAToYRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); void ARGBToUVRow_Any_SSSE3(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); void BGRAToUVRow_Any_SSSE3(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); void ABGRToUVRow_Any_SSSE3(const uint8* src_argb0, int src_stride_argb, uint8* dst_u, uint8* dst_v, int width); +void RGBAToUVRow_Any_SSSE3(const uint8* src_argb0, int src_stride_argb, + uint8* dst_u, uint8* dst_v, int width); void I422ToARGBRow_Any_NEON(const uint8* y_buf, const uint8* u_buf, @@ -459,6 +504,12 @@ void I422ToABGRRow_Any_NEON(const uint8* y_buf, uint8* rgb_buf, int width); +void I422ToRGBARow_Any_NEON(const uint8* y_buf, + const uint8* u_buf, + const uint8* v_buf, + uint8* rgb_buf, + int width); + void YUY2ToYRow_SSE2(const uint8* src_yuy2, uint8* dst_y, int pix); void YUY2ToUVRow_SSE2(const uint8* src_yuy2, int stride_yuy2, uint8* dst_u, uint8* dst_v, int pix); diff --git a/source/row_common.cc b/source/row_common.cc index e737495e7..2c04bd3a9 100644 --- a/source/row_common.cc +++ b/source/row_common.cc @@ -19,22 +19,6 @@ namespace libyuv { extern "C" { #endif -void ABGRToARGBRow_C(const uint8* src_abgr, uint8* dst_argb, int width) { - for (int x = 0; x < width; ++x) { - // To support in-place conversion. - uint8 r = src_abgr[0]; - uint8 g = src_abgr[1]; - uint8 b = src_abgr[2]; - uint8 a = src_abgr[3]; - dst_argb[0] = b; - dst_argb[1] = g; - dst_argb[2] = r; - dst_argb[3] = a; - dst_argb += 4; - src_abgr += 4; - } -} - void BGRAToARGBRow_C(const uint8* src_bgra, uint8* dst_argb, int width) { for (int x = 0; x < width; ++x) { // To support in-place conversion. @@ -51,6 +35,22 @@ void BGRAToARGBRow_C(const uint8* src_bgra, uint8* dst_argb, int width) { } } +void ABGRToARGBRow_C(const uint8* src_abgr, uint8* dst_argb, int width) { + for (int x = 0; x < width; ++x) { + // To support in-place conversion. + uint8 r = src_abgr[0]; + uint8 g = src_abgr[1]; + uint8 b = src_abgr[2]; + uint8 a = src_abgr[3]; + dst_argb[0] = b; + dst_argb[1] = g; + dst_argb[2] = r; + dst_argb[3] = a; + dst_argb += 4; + src_abgr += 4; + } +} + void RGBAToARGBRow_C(const uint8* src_abgr, uint8* dst_argb, int width) { for (int x = 0; x < width; ++x) { // To support in-place conversion. @@ -302,6 +302,7 @@ void NAME ## ToUVRow_C(const uint8* src_rgb0, int src_stride_rgb, \ MAKEROWY(ARGB, 2, 1, 0) MAKEROWY(BGRA, 1, 2, 3) MAKEROWY(ABGR, 0, 1, 2) +MAKEROWY(RGBA, 3, 2, 1) // http://en.wikipedia.org/wiki/Grayscale. // 0.11 * B + 0.59 * G + 0.30 * R @@ -574,7 +575,7 @@ void I422ToABGRRow_C(const uint8* y_buf, int width) { for (int x = 0; x < width - 1; x += 2) { YuvPixel(y_buf[0], u_buf[0], v_buf[0], rgb_buf + 0, 24, 0, 8, 16); - YuvPixel(y_buf[1], u_buf[0], v_buf[0], rgb_buf + 4, 24, 0, 8, 16); + YuvPixel(y_buf[1], u_buf[0], v_buf[0], rgb_buf + 4, 0, 8, 16, 24); y_buf += 2; u_buf += 1; v_buf += 1; @@ -585,6 +586,24 @@ void I422ToABGRRow_C(const uint8* y_buf, } } +void I422ToRGBARow_C(const uint8* y_buf, + const uint8* u_buf, + const uint8* v_buf, + uint8* rgb_buf, + int width) { + for (int x = 0; x < width - 1; x += 2) { + YuvPixel(y_buf[0], u_buf[0], v_buf[0], rgb_buf + 0, 0, 24, 16, 8); + YuvPixel(y_buf[1], u_buf[0], v_buf[0], rgb_buf + 4, 0, 24, 16, 8); + y_buf += 2; + u_buf += 1; + v_buf += 1; + rgb_buf += 8; // Advance 2 pixels. + } + if (width & 1) { + YuvPixel(y_buf[0], u_buf[0], v_buf[0], rgb_buf + 0, 0, 24, 16, 8); + } +} + void YToARGBRow_C(const uint8* y_buf, uint8* rgb_buf, int width) { for (int x = 0; x < width; ++x) { YuvPixel(y_buf[0], 128, 128, rgb_buf, 24, 16, 8, 0); @@ -930,11 +949,13 @@ Y2NY(NV12ToARGBRow_Any_SSSE3, NV12ToARGBRow_Unaligned_SSSE3, NV12ToARGBRow_C, 0) Y2NY(NV21ToARGBRow_Any_SSSE3, NV21ToARGBRow_Unaligned_SSSE3, NV21ToARGBRow_C, 0) YANY(I422ToBGRARow_Any_SSSE3, I422ToBGRARow_Unaligned_SSSE3, I422ToBGRARow_C, 1) YANY(I422ToABGRRow_Any_SSSE3, I422ToABGRRow_Unaligned_SSSE3, I422ToABGRRow_C, 1) +// TODO: YANY(I422ToRGBARow_Any_SSSE3, I422ToRGBARow_Unaligned_SSSE3, I422ToRGBARow_C, 1) #endif #if defined(HAS_I422TOARGBROW_NEON) YANY(I422ToARGBRow_Any_NEON, I422ToARGBRow_NEON, I422ToARGBRow_C, 1) YANY(I422ToBGRARow_Any_NEON, I422ToBGRARow_NEON, I422ToBGRARow_C, 1) YANY(I422ToABGRRow_Any_NEON, I422ToABGRRow_NEON, I422ToABGRRow_C, 1) +// TODO: YANY(I422ToRGBARow_Any_NEON, I422ToRGBARow_NEON, I422ToRGBARow_C, 1) #endif #undef YANY @@ -966,6 +987,7 @@ RGBANY(ARGBToARGB4444Row_Any_SSE2, ARGBToARGB4444Row_SSE2, 2) YANY(ARGBToYRow_Any_SSSE3, ARGBToYRow_Unaligned_SSSE3, 4) YANY(BGRAToYRow_Any_SSSE3, BGRAToYRow_Unaligned_SSSE3, 4) YANY(ABGRToYRow_Any_SSSE3, ABGRToYRow_Unaligned_SSSE3, 4) +// TODO: YANY(RGBAToYRow_Any_SSSE3, RGBAToYRow_Unaligned_SSSE3, 4) YANY(YUY2ToYRow_Any_SSE2, YUY2ToYRow_Unaligned_SSE2, 2) YANY(UYVYToYRow_Any_SSE2, UYVYToYRow_Unaligned_SSE2, 2) #undef YANY @@ -984,6 +1006,7 @@ YANY(UYVYToYRow_Any_SSE2, UYVYToYRow_Unaligned_SSE2, 2) UVANY(ARGBToUVRow_Any_SSSE3, ARGBToUVRow_Unaligned_SSSE3, ARGBToUVRow_C, 4) UVANY(BGRAToUVRow_Any_SSSE3, BGRAToUVRow_Unaligned_SSSE3, BGRAToUVRow_C, 4) UVANY(ABGRToUVRow_Any_SSSE3, ABGRToUVRow_Unaligned_SSSE3, ABGRToUVRow_C, 4) +// TODO: UVANY(RGBAToUVRow_Any_SSSE3, RGBAToUVRow_Unaligned_SSSE3, RGBAToUVRow_C, 4) UVANY(YUY2ToUVRow_Any_SSE2, YUY2ToUVRow_Unaligned_SSE2, YUY2ToUVRow_C, 2) UVANY(UYVYToUVRow_Any_SSE2, UYVYToUVRow_Unaligned_SSE2, UYVYToUVRow_C, 2) #undef UVANY diff --git a/unit_test/planar_test.cc b/unit_test/planar_test.cc index 109b9803f..30c3a6be7 100644 --- a/unit_test/planar_test.cc +++ b/unit_test/planar_test.cc @@ -86,6 +86,7 @@ TEST_F(libyuvTest, FMT_PLANAR##To##FMT_B##N##_OptVsC) { \ TESTPLANARTOB(I420, 2, 2, ARGB, 4) TESTPLANARTOB(I420, 2, 2, BGRA, 4) TESTPLANARTOB(I420, 2, 2, ABGR, 4) +TESTPLANARTOB(I420, 2, 2, RGBA, 4) TESTPLANARTOB(I420, 2, 2, RAW, 3) TESTPLANARTOB(I420, 2, 2, RGB24, 3) TESTPLANARTOB(I420, 2, 2, RGB565, 2) @@ -239,6 +240,7 @@ TEST_F(libyuvTest, FMT_A##To##FMT_PLANAR##N##_OptVsC) { \ TESTATOPLANAR(ARGB, 4, I420, 2, 2) TESTATOPLANAR(BGRA, 4, I420, 2, 2) TESTATOPLANAR(ABGR, 4, I420, 2, 2) +TESTATOPLANAR(RGBA, 4, I420, 2, 2) TESTATOPLANAR(RAW, 3, I420, 2, 2) TESTATOPLANAR(RGB24, 3, I420, 2, 2) TESTATOPLANAR(RGB565, 2, I420, 2, 2) diff --git a/unit_test/unit_test.cc b/unit_test/unit_test.cc index e590fa4d4..880a4f4ce 100644 --- a/unit_test/unit_test.cc +++ b/unit_test/unit_test.cc @@ -10,10 +10,10 @@ #include "unit_test/unit_test.h" -#include - #include // For getenv() +#include + // Change this to 1000 for benchmarking. // TODO(fbarchard): Add command line parsing to pass this as option. #define BENCHMARK_ITERATIONS 1 @@ -23,7 +23,7 @@ libyuvTest::libyuvTest() : rotate_max_w_(128), rotate_max_h_(128), benchmark_height_(720) { const char* repeat = getenv("LIBYUV_REPEAT"); if (repeat) { - benchmark_iterations_ = atoi(repeat); + benchmark_iterations_ = atoi(repeat); // NOLINT } }