diff --git a/README.chromium b/README.chromium index ad1b91ef0..3d9883403 100644 --- a/README.chromium +++ b/README.chromium @@ -1,6 +1,6 @@ Name: libyuv URL: http://code.google.com/p/libyuv/ -Version: 1486 +Version: 1487 License: BSD License File: LICENSE diff --git a/include/libyuv/row.h b/include/libyuv/row.h index d5e7eacdc..66c4a649d 100644 --- a/include/libyuv/row.h +++ b/include/libyuv/row.h @@ -456,6 +456,15 @@ struct YuvConstants { lvec16 kYToRgb; }; +// Offsets into YuvConstants structure +#define KUVTOB 0 +#define KUVTOG 32 +#define KUVTOR 64 +#define KUVBIASB 96 +#define KUVBIASG 128 +#define KUVBIASR 160 +#define KYTORGB 192 + struct YuvConstantsNEON { uvec8 kUVToRB; uvec8 kUVToG; @@ -463,6 +472,14 @@ struct YuvConstantsNEON { vec32 kYToRgb; }; +extern struct YuvConstants kYuvConstants; +extern struct YuvConstants kYvuConstants; +extern struct YuvConstants kYuvJConstants; +extern struct YuvConstants kYuvHConstants; +extern struct YuvConstantsNEON kYuvConstantsNEON; +extern struct YuvConstantsNEON kYuvJConstantsNEON; +extern struct YuvConstantsNEON kYuvHConstantsNEON; + #if defined(__APPLE__) || defined(__x86_64__) || defined(__llvm__) #define OMITFP #else diff --git a/include/libyuv/version.h b/include/libyuv/version.h index d9ce19bb0..79bb5439d 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 1486 +#define LIBYUV_VERSION 1487 #endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT diff --git a/source/row_common.cc b/source/row_common.cc index 13195684c..0a4520f71 100644 --- a/source/row_common.cc +++ b/source/row_common.cc @@ -1000,7 +1000,6 @@ void J400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int width) { // B = (Y - 16) * 1.164 - U * -2.018 // Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. #define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */ #define YGB -1160 /* 1.164 * 64 * -16 + 64 / 2 */ @@ -1010,10 +1009,45 @@ void J400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int width) { #define VG 52 /* round(0.813 * 64) */ #define VR -102 /* round(-1.596 * 64) */ -// Bias values to subtract 16 from Y and 128 from U and V, with rounding. -#define BB (UB * 128 + YGB) +// Bias values to subtract 16 from Y and 128 from U and V. +#define BB (UB * 128 + YGB) #define BG (UG * 128 + VG * 128 + YGB) -#define BR (VR * 128 + YGB) +#define BR (VR * 128 + YGB) + +// BT601 constants for YUV to RGB. +YuvConstants SIMD_ALIGNED(kYuvConstants) = { + { UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, + UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0 }, + { UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, + UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG }, + { 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, + 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR }, + { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB }, + { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG }, + { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR }, + { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG } +}; + +// BT601 constants for NV21 where chroma plane is VU instead of UV. +YuvConstants SIMD_ALIGNED(kYvuConstants) = { + { 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, + 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB }, + { VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, + VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG }, + { VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, + VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0 }, + { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB }, + { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG }, + { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR }, + { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG } +}; + +YuvConstantsNEON SIMD_ALIGNED(kYuvConstantsNEON) = { + { -UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0 }, + { UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0 }, + { BB, BG, BR, 0, 0, 0, 0, 0 }, + { 0x0101 * YG, 0, 0, 0 } +}; // C reference code that mimics the YUV assembly. static __inline void YuvPixel(uint8 y, uint8 u, uint8 v, @@ -1031,7 +1065,6 @@ static __inline void YPixel(uint8 y, uint8* b, uint8* g, uint8* r) { *g = Clamp((int32)(y1 + YGB) >> 6); *r = Clamp((int32)(y1 + YGB) >> 6); } - #undef YG #undef YGB #undef UB @@ -1048,7 +1081,6 @@ static __inline void YPixel(uint8 y, uint8* b, uint8* g, uint8* r) { // * B = Y - U * -1.77200 // Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. #define YGJ 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ #define YGBJ 32 /* 64 / 2 */ @@ -1058,10 +1090,38 @@ static __inline void YPixel(uint8 y, uint8* b, uint8* g, uint8* r) { #define VGJ 46 /* round(0.71414 * 64) */ #define VRJ -90 /* round(-1.40200 * 64) */ -// Bias values to round Y and subtract 128 from U and V. -#define BBJ (UBJ * 128 + YGBJ) +// Bias values to round, and subtract 128 from U and V. +#define BBJ (UBJ * 128 + YGBJ) #define BGJ (UGJ * 128 + VGJ * 128 + YGBJ) -#define BRJ (VRJ * 128 + YGBJ) +#define BRJ (VRJ * 128 + YGBJ) + +// JPEG constants for YUV to RGB. +YuvConstants SIMD_ALIGNED(kYuvJConstants) = { + { UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, + UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0 }, + { UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, + UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, + UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, + UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ }, + { 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, + 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ }, + { BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, + BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ }, + { BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, + BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ }, + { BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, + BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ }, + { YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, + YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ } +}; + +// JPEG constants for YUV to RGB. +YuvConstantsNEON SIMD_ALIGNED(kYuvJConstantsNEON) = { + { -UBJ, -UBJ, -UBJ, -UBJ, -VRJ, -VRJ, -VRJ, -VRJ, 0, 0, 0, 0, 0, 0, 0, 0 }, + { UGJ, UGJ, UGJ, UGJ, VGJ, VGJ, VGJ, VGJ, 0, 0, 0, 0, 0, 0, 0, 0 }, + { BBJ, BGJ, BRJ, 0, 0, 0, 0, 0 }, + { 0x0101 * YGJ, 0, 0, 0 } +}; // C reference code that mimics the YUV assembly. static __inline void YuvJPixel(uint8 y, uint8 u, uint8 v, @@ -1088,7 +1148,6 @@ static __inline void YuvJPixel(uint8 y, uint8 u, uint8 v, // * B = Y - U * -2.12798 // Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. #define YGH 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ #define YGBH 32 /* 64 / 2 */ @@ -1103,6 +1162,34 @@ static __inline void YuvJPixel(uint8 y, uint8 u, uint8 v, #define BGH (UGH * 128 + VGH * 128 + YGBH) #define BRH (VRH * 128 + YGBH) +// BT.709 constants for YUV to RGB. +YuvConstants SIMD_ALIGNED(kYuvHConstants) = { + { UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, + UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0 }, + { UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, + UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, + UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, + UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH }, + { 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, + 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH }, + { BBH, BBH, BBH, BBH, BBH, BBH, BBH, BBH, + BBH, BBH, BBH, BBH, BBH, BBH, BBH, BBH }, + { BGH, BGH, BGH, BGH, BGH, BGH, BGH, BGH, + BGH, BGH, BGH, BGH, BGH, BGH, BGH, BGH }, + { BRH, BRH, BRH, BRH, BRH, BRH, BRH, BRH, + BRH, BRH, BRH, BRH, BRH, BRH, BRH, BRH }, + { YGH, YGH, YGH, YGH, YGH, YGH, YGH, YGH, + YGH, YGH, YGH, YGH, YGH, YGH, YGH, YGH } +}; + +// BT.709 constants for YUV to RGB. +YuvConstantsNEON SIMD_ALIGNED(kYuvHConstantsNEON) = { + { -UBH, -UBH, -UBH, -UBH, -VRH, -VRH, -VRH, -VRH, 0, 0, 0, 0, 0, 0, 0, 0 }, + { UGH, UGH, UGH, UGH, VGH, VGH, VGH, VGH, 0, 0, 0, 0, 0, 0, 0, 0 }, + { BBH, BGH, BRH, 0, 0, 0, 0, 0 }, + { 0x0101 * YGH, 0, 0, 0 } +}; + // C reference code that mimics the YUV assembly. static __inline void YuvHPixel(uint8 y, uint8 u, uint8 v, uint8* b, uint8* g, uint8* r) { @@ -2314,13 +2401,6 @@ void I422ToUYVYRow_C(const uint8* src_y, } } -extern struct YuvConstants kYuvConstants; -extern struct YuvConstants kYuvJConstants; -extern struct YuvConstants kYuvHConstants; -extern struct YuvConstantsNEON kYuvConstantsNEON; -extern struct YuvConstantsNEON kYuvJConstantsNEON; -extern struct YuvConstantsNEON kYuvHConstantsNEON; - #define ANYYUV(NAMEANY, ANY_SIMD, YUVCONSTANTS) \ void NAMEANY(const uint8* y_buf, \ const uint8* u_buf, \ diff --git a/source/row_gcc.cc b/source/row_gcc.cc index 52046645e..949750321 100644 --- a/source/row_gcc.cc +++ b/source/row_gcc.cc @@ -1319,167 +1319,6 @@ void RGBAToUVRow_SSSE3(const uint8* src_rgba0, int src_stride_rgba, #if defined(HAS_I422TOARGBROW_SSSE3) || defined(HAS_I422TOARGBROW_AVX2) -// BT.601 YUV to RGB reference -// R = (Y - 16) * 1.164 - V * -1.596 -// G = (Y - 16) * 1.164 - U * 0.391 - V * 0.813 -// B = (Y - 16) * 1.164 - U * -2.018 - -// Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. -#define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */ -#define YGB -1160 /* 1.164 * 64 * -16 + 64 / 2 */ - -// U and V contributions to R,G,B. -#define UB -128 /* max(-128, round(-2.018 * 64)) */ -#define UG 25 /* round(0.391 * 64) */ -#define VG 52 /* round(0.813 * 64) */ -#define VR -102 /* round(-1.596 * 64) */ - -// Bias values to subtract 16 from Y and 128 from U and V. -#define BB (UB * 128 + YGB) -#define BG (UG * 128 + VG * 128 + YGB) -#define BR (VR * 128 + YGB) - -// BT601 constants for YUV to RGB. -YuvConstants SIMD_ALIGNED(kYuvConstants) = { - { UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, - UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0 }, - { UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, - UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG }, - { 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, - 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR }, - { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB }, - { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG }, - { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR }, - { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG } -}; - -// BT601 constants for NV21 where chroma plane is VU instead of UV. -YuvConstants SIMD_ALIGNED(kYvuConstants) = { - { 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, - 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB }, - { VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, - VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG }, - { VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, - VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0 }, - { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB }, - { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG }, - { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR }, - { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG } -}; - -#undef YG -#undef YGB -#undef UB -#undef UG -#undef VG -#undef VR -#undef BB -#undef BG -#undef BR - -// JPEG YUV to RGB reference -// * R = Y - V * -1.40200 -// * G = Y - U * 0.34414 - V * 0.71414 -// * B = Y - U * -1.77200 - -// Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. -#define YGJ 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ -#define YGBJ 32 /* 64 / 2 */ - -// U and V contributions to R,G,B. -#define UBJ -113 /* round(-1.77200 * 64) */ -#define UGJ 22 /* round(0.34414 * 64) */ -#define VGJ 46 /* round(0.71414 * 64) */ -#define VRJ -90 /* round(-1.40200 * 64) */ - -// Bias values to subtract 16 from Y and 128 from U and V. -#define BBJ (UBJ * 128 + YGBJ) -#define BGJ (UGJ * 128 + VGJ * 128 + YGBJ) -#define BRJ (VRJ * 128 + YGBJ) - -// JPEG constants for YUV to RGB. -YuvConstants SIMD_ALIGNED(kYuvJConstants) = { - { UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, - UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0 }, - { UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, - UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, - UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, - UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ }, - { 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, - 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ }, - { BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, - BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ }, - { BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, - BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ }, - { BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, - BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ }, - { YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, - YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ } -}; - -#undef YGJ -#undef YGBJ -#undef UBJ -#undef UGJ -#undef VGJ -#undef VRJ -#undef BBJ -#undef BGJ -#undef BRJ - -// BT.709 YUV to RGB reference -// * R = Y - V * -1.28033 -// * G = Y - U * 0.21482 - V * 0.38059 -// * B = Y - U * -2.12798 - -// Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. -#define YGH 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ -#define YGBH 32 /* 64 / 2 */ - -// U and V contributions to R,G,B. -#define UBH -128 /* max(-128, round(-2.12798 * 64)) */ -#define UGH 14 /* round(0.21482 * 64) */ -#define VGH 24 /* round(0.38059 * 64) */ -#define VRH -82 /* round(-1.28033 * 64) */ - -// Bias values to round, and subtract 128 from U and V. -#define BBH (UBH * 128 + YGBH) -#define BGH (UGH * 128 + VGH * 128 + YGBH) -#define BRH (VRH * 128 + YGBH) - -// BT.709 constants for YUV to RGB. -YuvConstants SIMD_ALIGNED(kYuvHConstants) = { - { UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, - UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0 }, - { UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, - UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, - UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, - UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH }, - { 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, - 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH }, - { BBH, BBH, BBH, BBH, BBH, BBH, BBH, BBH, - BBH, BBH, BBH, BBH, BBH, BBH, BBH, BBH }, - { BGH, BGH, BGH, BGH, BGH, BGH, BGH, BGH, - BGH, BGH, BGH, BGH, BGH, BGH, BGH, BGH }, - { BRH, BRH, BRH, BRH, BRH, BRH, BRH, BRH, - BRH, BRH, BRH, BRH, BRH, BRH, BRH, BRH }, - { YGH, YGH, YGH, YGH, YGH, YGH, YGH, YGH, - YGH, YGH, YGH, YGH, YGH, YGH, YGH, YGH } -}; - -#undef YGH -#undef YGBH -#undef UBH -#undef UGH -#undef VGH -#undef VRH -#undef BBH -#undef BGH -#undef BRH - // Read 8 UV from 411 #define READYUV444 \ "movq " MEMACCESS([u_buf]) ",%%xmm0 \n" \ diff --git a/source/row_neon.cc b/source/row_neon.cc index b4742ef5d..f7e6ba1dc 100644 --- a/source/row_neon.cc +++ b/source/row_neon.cc @@ -134,122 +134,6 @@ extern "C" { "vqshrun.s16 d22, q9, #6 \n" /* R */ \ "vqshrun.s16 d21, q0, #6 \n" /* G */ -// BT.601 YUV to RGB reference -// R = (Y - 16) * 1.164 - V * -1.596 -// G = (Y - 16) * 1.164 - U * 0.391 - V * 0.813 -// B = (Y - 16) * 1.164 - U * -2.018 - -// Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. -#define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */ -#define YGB -1160 /* 1.164 * 64 * -16 + 64 / 2 */ - -// U and V contributions to R,G,B. -#define UB -128 /* max(-128, round(-2.018 * 64)) */ -#define UG 25 /* round(0.391 * 64) */ -#define VG 52 /* round(0.813 * 64) */ -#define VR -102 /* round(-1.596 * 64) */ - -// Bias values to subtract 16 from Y and 128 from U and V. -#define BB (UB * 128 + YGB) -#define BG (UG * 128 + VG * 128 + YGB) -#define BR (VR * 128 + YGB) - -YuvConstantsNEON SIMD_ALIGNED(kYuvConstantsNEON) = { - { -UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0 }, - { UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0 }, - { BB, BG, BR, 0, 0, 0, 0, 0 }, - { 0x0101 * YG, 0, 0, 0 } -}; - -#undef YG -#undef YGB -#undef UB -#undef UG -#undef VG -#undef VR -#undef BB -#undef BG -#undef BR - -// JPEG YUV to RGB reference -// * R = Y - V * -1.40200 -// * G = Y - U * 0.34414 - V * 0.71414 -// * B = Y - U * -1.77200 - -// Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. -#define YGJ 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ -#define YGBJ 32 /* 64 / 2 */ - -// U and V contributions to R,G,B. -#define UBJ -113 /* round(-1.77200 * 64) */ -#define UGJ 22 /* round(0.34414 * 64) */ -#define VGJ 46 /* round(0.71414 * 64) */ -#define VRJ -90 /* round(-1.40200 * 64) */ - -// Bias values to subtract 16 from Y and 128 from U and V. -#define BBJ (UBJ * 128 + YGBJ) -#define BGJ (UGJ * 128 + VGJ * 128 + YGBJ) -#define BRJ (VRJ * 128 + YGBJ) - -// JPEG constants for YUV to RGB. -YuvConstantsNEON SIMD_ALIGNED(kYuvJConstantsNEON) = { - { -UBJ, -UBJ, -UBJ, -UBJ, -VRJ, -VRJ, -VRJ, -VRJ, 0, 0, 0, 0, 0, 0, 0, 0 }, - { UGJ, UGJ, UGJ, UGJ, VGJ, VGJ, VGJ, VGJ, 0, 0, 0, 0, 0, 0, 0, 0 }, - { BBJ, BGJ, BRJ, 0, 0, 0, 0, 0 }, - { 0x0101 * YGJ, 0, 0, 0 } -}; - -#undef YGJ -#undef YGBJ -#undef UBJ -#undef UGJ -#undef VGJ -#undef VRJ -#undef BBJ -#undef BGJ -#undef BRJ - -// BT.709 YUV to RGB reference -// * R = Y - V * -1.28033 -// * G = Y - U * 0.21482 - V * 0.38059 -// * B = Y - U * -2.12798 - -// Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. -#define YGH 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ -#define YGBH 32 /* 64 / 2 */ - -// U and V contributions to R,G,B. -#define UBH -128 /* max(-128, round(-2.12798 * 64)) */ -#define UGH 14 /* round(0.21482 * 64) */ -#define VGH 24 /* round(0.38059 * 64) */ -#define VRH -82 /* round(-1.28033 * 64) */ - -// Bias values to round, and subtract 128 from U and V. -#define BBH (UBH * 128 + YGBH) -#define BGH (UGH * 128 + VGH * 128 + YGBH) -#define BRH (VRH * 128 + YGBH) - -// BT.709 constants for YUV to RGB. -YuvConstantsNEON SIMD_ALIGNED(kYuvHConstantsNEON) = { - { -UBH, -UBH, -UBH, -UBH, -VRH, -VRH, -VRH, -VRH, 0, 0, 0, 0, 0, 0, 0, 0 }, - { UGH, UGH, UGH, UGH, VGH, VGH, VGH, VGH, 0, 0, 0, 0, 0, 0, 0, 0 }, - { BBH, BGH, BRH, 0, 0, 0, 0, 0 }, - { 0x0101 * YGH, 0, 0, 0 } -}; - -#undef YGH -#undef YGBH -#undef UBH -#undef UGH -#undef VGH -#undef VRH -#undef BBH -#undef BGH -#undef BRH - void I444ToARGBRow_NEON(const uint8* src_y, const uint8* src_u, const uint8* src_v, diff --git a/source/row_neon64.cc b/source/row_neon64.cc index ab74c792d..668baef77 100644 --- a/source/row_neon64.cc +++ b/source/row_neon64.cc @@ -129,44 +129,6 @@ extern "C" { "sqshrun " #vG ".8b, " #vG ".8h, #6 \n" /* G */ \ "sqshrun " #vR ".8b, " #vR ".8h, #6 \n" /* R */ \ -// BT.601 YUV to RGB reference -// R = (Y - 16) * 1.164 - V * -1.596 -// G = (Y - 16) * 1.164 - U * 0.391 - V * 0.813 -// B = (Y - 16) * 1.164 - U * -2.018 - -// Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. -#define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */ -#define YGB -1160 /* 1.164 * 64 * -16 + 64 / 2 */ - -// U and V contributions to R,G,B. -#define UB -128 /* max(-128, round(-2.018 * 64)) */ -#define UG 25 /* round(0.391 * 64) */ -#define VG 52 /* round(0.813 * 64) */ -#define VR -102 /* round(-1.596 * 64) */ - -// Bias values to subtract 16 from Y and 128 from U and V. -#define BB (UB * 128 + YGB) -#define BG (UG * 128 + VG * 128 + YGB) -#define BR (VR * 128 + YGB) - -YuvConstantsNEON SIMD_ALIGNED(kYuvConstantsNEON) = { - { -UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0 }, - { UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0 }, - { BB, BG, BR, 0, 0, 0, 0, 0 }, - { 0x0101 * YG, 0, 0, 0 } -}; - -#undef YG -#undef YGB -#undef UB -#undef UG -#undef VG -#undef VR -#undef BB -#undef BG -#undef BR - // TODO(fbarchard): Use structure for constants like 32 bit code. #define RGBTOUV_SETUP_REG \ "movi v20.8h, #56, lsl #0 \n" /* UB/VR coefficient (0.875) / 2 */ \ diff --git a/source/row_win.cc b/source/row_win.cc index 62beb1c9b..f7a310520 100644 --- a/source/row_win.cc +++ b/source/row_win.cc @@ -25,175 +25,6 @@ extern "C" { #if !defined(LIBYUV_DISABLE_X86) && \ (defined(_M_IX86) || (defined(_M_X64) && !defined(__clang__))) -#define KUVTOB 0 -#define KUVTOG 32 -#define KUVTOR 64 -#define KUVBIASB 96 -#define KUVBIASG 128 -#define KUVBIASR 160 -#define KYTORGB 192 - -// BT.601 YUV to RGB reference -// R = (Y - 16) * 1.164 - V * -1.596 -// G = (Y - 16) * 1.164 - U * 0.391 - V * 0.813 -// B = (Y - 16) * 1.164 - U * -2.018 - -// Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. -#define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */ -#define YGB -1160 /* 1.164 * 64 * -16 + 64 / 2 */ - -// U and V contributions to R,G,B. -#define UB -128 /* max(-128, round(-2.018 * 64)) */ -#define UG 25 /* round(0.391 * 64) */ -#define VG 52 /* round(0.813 * 64) */ -#define VR -102 /* round(-1.596 * 64) */ - -// Bias values to subtract 16 from Y and 128 from U and V. -#define BB (UB * 128 + YGB) -#define BG (UG * 128 + VG * 128 + YGB) -#define BR (VR * 128 + YGB) - -// BT601 constants for YUV to RGB. -YuvConstants SIMD_ALIGNED(kYuvConstants) = { - { UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, - UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0 }, - { UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, - UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG }, - { 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, - 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR }, - { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB }, - { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG }, - { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR }, - { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG } -}; - -// BT601 constants for NV21 where chroma plane is VU instead of UV. -YuvConstants SIMD_ALIGNED(kYvuConstants) = { - { 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, - 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB }, - { VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, - VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG }, - { VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, - VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0 }, - { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB }, - { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG }, - { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR }, - { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG } -}; - -#undef YG -#undef YGB -#undef UB -#undef UG -#undef VG -#undef VR -#undef BB -#undef BG -#undef BR - -// JPEG YUV to RGB reference -// * R = Y - V * -1.40200 -// * G = Y - U * 0.34414 - V * 0.71414 -// * B = Y - U * -1.77200 - -// Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. -#define YGJ 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ -#define YGBJ 32 /* 64 / 2 */ - -// U and V contributions to R,G,B. -#define UBJ -113 /* round(-1.77200 * 64) */ -#define UGJ 22 /* round(0.34414 * 64) */ -#define VGJ 46 /* round(0.71414 * 64) */ -#define VRJ -90 /* round(-1.40200 * 64) */ - -// Bias values to subtract 16 from Y and 128 from U and V. -#define BBJ (UBJ * 128 + YGBJ) -#define BGJ (UGJ * 128 + VGJ * 128 + YGBJ) -#define BRJ (VRJ * 128 + YGBJ) - -// JPEG constants for YUV to RGB. -YuvConstants SIMD_ALIGNED(kYuvJConstants) = { - { UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, - UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0 }, - { UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, - UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, - UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, - UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ }, - { 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, - 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ }, - { BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, - BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ }, - { BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, - BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ }, - { BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, - BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ }, - { YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, - YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ } -}; - -#undef YGJ -#undef YGBJ -#undef UBJ -#undef UGJ -#undef VGJ -#undef VRJ -#undef BBJ -#undef BGJ -#undef BRJ - -// BT.709 YUV to RGB reference -// * R = Y - V * -1.28033 -// * G = Y - U * 0.21482 - V * 0.38059 -// * B = Y - U * -2.12798 - -// Y contribution to R,G,B. Scale and bias. -// TODO(fbarchard): Consider moving constants into a common header. -#define YGH 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ -#define YGBH 32 /* 64 / 2 */ - -// U and V contributions to R,G,B. -#define UBH -128 /* max(-128, round(-2.12798 * 64)) */ -#define UGH 14 /* round(0.21482 * 64) */ -#define VGH 24 /* round(0.38059 * 64) */ -#define VRH -82 /* round(-1.28033 * 64) */ - -// Bias values to round, and subtract 128 from U and V. -#define BBH (UBH * 128 + YGBH) -#define BGH (UGH * 128 + VGH * 128 + YGBH) -#define BRH (VRH * 128 + YGBH) - -// BT.709 constants for YUV to RGB. -YuvConstants SIMD_ALIGNED(kYuvHConstants) = { - { UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, - UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0 }, - { UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, - UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, - UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, - UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH }, - { 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, - 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH }, - { BBH, BBH, BBH, BBH, BBH, BBH, BBH, BBH, - BBH, BBH, BBH, BBH, BBH, BBH, BBH, BBH }, - { BGH, BGH, BGH, BGH, BGH, BGH, BGH, BGH, - BGH, BGH, BGH, BGH, BGH, BGH, BGH, BGH }, - { BRH, BRH, BRH, BRH, BRH, BRH, BRH, BRH, - BRH, BRH, BRH, BRH, BRH, BRH, BRH, BRH }, - { YGH, YGH, YGH, YGH, YGH, YGH, YGH, YGH, - YGH, YGH, YGH, YGH, YGH, YGH, YGH, YGH } -}; - -#undef YGH -#undef YGBH -#undef UBH -#undef UGH -#undef VGH -#undef VRH -#undef BBH -#undef BGH -#undef BRH - // 64 bit #if defined(_M_X64)