Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Unified Diff: source/row_common.cc

Issue 1398623002: fix jpeg and bt.709 yuvconstants for neon64. (Closed) Base URL: https://chromium.googlesource.com/libyuv/libyuv@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « source/row_any.cc ('k') | source/row_gcc.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: source/row_common.cc
diff --git a/source/row_common.cc b/source/row_common.cc
index 24cd5c3a9b59614524f300166c1e031452c87d3d..eefe994922028e0967b40ac74df68018d42fb20c 100644
--- a/source/row_common.cc
+++ b/source/row_common.cc
@@ -1014,8 +1014,11 @@ void J400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int width) {
#define BG (UG * 128 + VG * 128 + YGB)
#define BR (VR * 128 + YGB)
+// BT.601 constants for YUV to RGB.
+// TODO(fbarchard): Unify these structures to be platform independent.
+// TODO(fbarchard): Generate SIMD structures from float matrix.
#if defined(__aarch64__)
-YuvConstants SIMD_ALIGNED(kYuvConstants) = {
+const YuvConstants SIMD_ALIGNED(kYuvIConstants) = {
{ -UB, 0, -UB, 0, -UB, 0, -UB, 0, -VR, 0, -VR, 0, -VR, 0, -VR, 0 },
{ UG, 0, UG, 0, UG, 0, UG, 0, VG, 0, VG, 0, VG, 0, VG, 0 },
{ BB, BG, BR, 0, 0, 0, 0, 0 },
@@ -1023,15 +1026,14 @@ YuvConstants SIMD_ALIGNED(kYuvConstants) = {
};
#elif defined(__arm__)
-YuvConstants SIMD_ALIGNED(kYuvConstants) = {
+const YuvConstants SIMD_ALIGNED(kYuvIConstants) = {
{ -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 }
};
#else
-// BT601 constants for YUV to RGB.
-YuvConstants SIMD_ALIGNED(kYuvConstants) = {
+const YuvConstants SIMD_ALIGNED(kYuvIConstants) = {
{ 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,
@@ -1043,20 +1045,6 @@ YuvConstants SIMD_ALIGNED(kYuvConstants) = {
{ 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 }
-};
#endif
// C reference code that mimics the YUV assembly.
@@ -1080,7 +1068,7 @@ static __inline void YPixel(uint8 y, uint8* b, uint8* g, uint8* r) {
// C reference code that mimics the YUV assembly.
static __inline void YuvPixel(uint8 y, uint8 u, uint8 v,
uint8* b, uint8* g, uint8* r,
- struct YuvConstants* yuvconstants) {
+ const struct YuvConstants* yuvconstants) {
#if defined(__aarch64__)
int UB = -yuvconstants->kUVToRB[0];
int UG = yuvconstants->kUVToG[0];
@@ -1135,17 +1123,24 @@ static __inline void YuvPixel(uint8 y, uint8 u, uint8 v,
#define BGJ (UGJ * 128 + VGJ * 128 + YGBJ)
#define BRJ (VRJ * 128 + YGBJ)
-#if defined(__arm__) || defined(__aarch64__)
// JPEG constants for YUV to RGB.
-YuvConstants SIMD_ALIGNED(kYuvJConstants) = {
+#if defined(__aarch64__)
+const YuvConstants SIMD_ALIGNED(kYuvJConstants) = {
+ { -UBJ, 0, -UBJ, 0, -UBJ, 0, -UBJ, 0, -VRJ, 0, -VRJ, 0, -VRJ, 0, -VRJ, 0 },
+ { UGJ, 0, UGJ, 0, UGJ, 0, UGJ, 0, VGJ, 0, VGJ, 0, VGJ, 0, VGJ, 0 },
+ { BBJ, BGJ, BRJ, 0, 0, 0, 0, 0 },
+ { 0x0101 * YGJ, 0, 0, 0 }
+ };
+
+#elif defined(__arm__)
+const YuvConstants SIMD_ALIGNED(kYuvJConstants) = {
{ -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 }
};
#else
-// JPEG constants for YUV to RGB.
-YuvConstants SIMD_ALIGNED(kYuvJConstants) = {
+const 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,
@@ -1184,6 +1179,7 @@ YuvConstants SIMD_ALIGNED(kYuvJConstants) = {
#define YGH 16320 /* round(1.000 * 64 * 256 * 256 / 257) */
#define YGBH 32 /* 64 / 2 */
+// TODO(fbarchard): Find way to express 2.12 instead of 2.0.
// U and V contributions to R,G,B.
#define UBH -128 /* max(-128, round(-2.12798 * 64)) */
#define UGH 14 /* round(0.21482 * 64) */
@@ -1195,17 +1191,24 @@ YuvConstants SIMD_ALIGNED(kYuvJConstants) = {
#define BGH (UGH * 128 + VGH * 128 + YGBH)
#define BRH (VRH * 128 + YGBH)
-#if defined(__arm__) || defined(__aarch64__)
// BT.709 constants for YUV to RGB.
-YuvConstants SIMD_ALIGNED(kYuvHConstants) = {
+#if defined(__aarch64__)
+const YuvConstants SIMD_ALIGNED(kYuvHConstants) = {
+ { -UBH, 0, -UBH, 0, -UBH, 0, -UBH, 0, -VRH, 0, -VRH, 0, -VRH, 0, -VRH, 0 },
+ { UGH, 0, UGH, 0, UGH, 0, UGH, 0, VGH, 0, VGH, 0, VGH, 0, VGH, 0 },
+ { BBH, BGH, BRH, 0, 0, 0, 0, 0 },
+ { 0x0101 * YGH, 0, 0, 0 }
+ };
+
+#elif defined(__arm__)
+const YuvConstants SIMD_ALIGNED(kYuvHConstants) = {
{ -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 }
};
#else
-// BT.709 constants for YUV to RGB.
-YuvConstants SIMD_ALIGNED(kYuvHConstants) = {
+const 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,
@@ -1243,7 +1246,7 @@ void I444ToARGBRow_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1270,7 +1273,7 @@ void I444ToABGRRow_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1297,7 +1300,7 @@ void I444ToARGBRow_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width; ++x) {
@@ -1315,7 +1318,7 @@ void I444ToABGRRow_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width; ++x) {
@@ -1335,7 +1338,7 @@ void I422ToARGBRow_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1362,7 +1365,7 @@ void I422AlphaToARGBRow_C(const uint8* src_y,
const uint8* src_v,
const uint8* src_a,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1389,7 +1392,7 @@ void I422ToABGRRow_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1416,7 +1419,7 @@ void I422AlphaToABGRRow_C(const uint8* src_y,
const uint8* src_v,
const uint8* src_a,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1443,7 +1446,7 @@ void I422ToRGB24Row_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1466,7 +1469,7 @@ void I422ToRAWRow_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1489,7 +1492,7 @@ void I422ToARGB4444Row_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_argb4444,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
uint8 b0;
uint8 g0;
@@ -1528,7 +1531,7 @@ void I422ToARGB1555Row_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_argb1555,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
uint8 b0;
uint8 g0;
@@ -1567,7 +1570,7 @@ void I422ToRGB565Row_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_rgb565,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
uint8 b0;
uint8 g0;
@@ -1605,7 +1608,7 @@ void I411ToARGBRow_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 3; x += 4) {
@@ -1646,7 +1649,7 @@ void I411ToARGBRow_C(const uint8* src_y,
void NV12ToARGBRow_C(const uint8* src_y,
const uint8* src_uv,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1670,7 +1673,7 @@ void NV12ToARGBRow_C(const uint8* src_y,
void NV21ToARGBRow_C(const uint8* src_y,
const uint8* src_vu,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1694,7 +1697,7 @@ void NV21ToARGBRow_C(const uint8* src_y,
void NV12ToRGB565Row_C(const uint8* src_y,
const uint8* src_uv,
uint8* dst_rgb565,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
uint8 b0;
uint8 g0;
@@ -1729,7 +1732,7 @@ void NV12ToRGB565Row_C(const uint8* src_y,
void YUY2ToARGBRow_C(const uint8* src_yuy2,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1751,7 +1754,7 @@ void YUY2ToARGBRow_C(const uint8* src_yuy2,
void UYVYToARGBRow_C(const uint8* src_uyvy,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1775,7 +1778,7 @@ void I422ToBGRARow_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -1801,7 +1804,7 @@ void I422ToRGBARow_C(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* rgb_buf,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
int x;
for (x = 0; x < width - 1; x += 2) {
@@ -2480,7 +2483,7 @@ void I422ToRGB565Row_SSSE3(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_rgb565,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]);
while (width > 0) {
@@ -2501,7 +2504,7 @@ void I422ToARGB1555Row_SSSE3(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_argb1555,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
// Row buffer for intermediate ARGB pixels.
SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]);
@@ -2523,7 +2526,7 @@ void I422ToARGB4444Row_SSSE3(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_argb4444,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
// Row buffer for intermediate ARGB pixels.
SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]);
@@ -2544,7 +2547,7 @@ void I422ToARGB4444Row_SSSE3(const uint8* src_y,
void NV12ToRGB565Row_SSSE3(const uint8* src_y,
const uint8* src_uv,
uint8* dst_rgb565,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
// Row buffer for intermediate ARGB pixels.
SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]);
@@ -2565,7 +2568,7 @@ void I422ToRGB565Row_AVX2(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_rgb565,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
while (width > 0) {
@@ -2586,7 +2589,7 @@ void I422ToARGB1555Row_AVX2(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_argb1555,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
// Row buffer for intermediate ARGB pixels.
SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
@@ -2608,7 +2611,7 @@ void I422ToARGB4444Row_AVX2(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_argb4444,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
// Row buffer for intermediate ARGB pixels.
SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
@@ -2630,7 +2633,7 @@ void I422ToRGB24Row_AVX2(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_rgb24,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
// Row buffer for intermediate ARGB pixels.
SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
@@ -2653,7 +2656,7 @@ void I422ToRAWRow_AVX2(const uint8* src_y,
const uint8* src_u,
const uint8* src_v,
uint8* dst_raw,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
// Row buffer for intermediate ARGB pixels.
SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
@@ -2675,7 +2678,7 @@ void I422ToRAWRow_AVX2(const uint8* src_y,
void NV12ToRGB565Row_AVX2(const uint8* src_y,
const uint8* src_uv,
uint8* dst_rgb565,
- struct YuvConstants* yuvconstants,
+ const struct YuvConstants* yuvconstants,
int width) {
// Row buffer for intermediate ARGB pixels.
SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
« no previous file with comments | « source/row_any.cc ('k') | source/row_gcc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698