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

Side by Side Diff: source/row_common.cc

Issue 1384323002: Pass yuvconstants to YUV conversions for neon 64 bit (Closed) Base URL: https://chromium.googlesource.com/libyuv/libyuv@master
Patch Set: bump version 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 unified diff | Download patch
« no previous file with comments | « include/libyuv/version.h ('k') | source/row_neon64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. 2 * Copyright 2011 The LibYuv Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 996 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 #define UB -128 /* max(-128, round(-2.018 * 64)) */ 1007 #define UB -128 /* max(-128, round(-2.018 * 64)) */
1008 #define UG 25 /* round(0.391 * 64) */ 1008 #define UG 25 /* round(0.391 * 64) */
1009 #define VG 52 /* round(0.813 * 64) */ 1009 #define VG 52 /* round(0.813 * 64) */
1010 #define VR -102 /* round(-1.596 * 64) */ 1010 #define VR -102 /* round(-1.596 * 64) */
1011 1011
1012 // Bias values to subtract 16 from Y and 128 from U and V. 1012 // Bias values to subtract 16 from Y and 128 from U and V.
1013 #define BB (UB * 128 + YGB) 1013 #define BB (UB * 128 + YGB)
1014 #define BG (UG * 128 + VG * 128 + YGB) 1014 #define BG (UG * 128 + VG * 128 + YGB)
1015 #define BR (VR * 128 + YGB) 1015 #define BR (VR * 128 + YGB)
1016 1016
1017 #if defined(__arm__) || defined(__aarch64__) 1017 #if defined(__aarch64__)
1018 YuvConstants SIMD_ALIGNED(kYuvConstants) = {
1019 { -UB, 0, -UB, 0, -UB, 0, -UB, 0, -VR, 0, -VR, 0, -VR, 0, -VR, 0 },
1020 { UG, 0, UG, 0, UG, 0, UG, 0, VG, 0, VG, 0, VG, 0, VG, 0 },
1021 { BB, BG, BR, 0, 0, 0, 0, 0 },
1022 { 0x0101 * YG, 0, 0, 0 }
1023 };
1024
1025 #elif defined(__arm__)
1018 YuvConstants SIMD_ALIGNED(kYuvConstants) = { 1026 YuvConstants SIMD_ALIGNED(kYuvConstants) = {
1019 { -UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0 }, 1027 { -UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0 },
1020 { UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0 }, 1028 { UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0 },
1021 { BB, BG, BR, 0, 0, 0, 0, 0 }, 1029 { BB, BG, BR, 0, 0, 0, 0, 0 },
1022 { 0x0101 * YG, 0, 0, 0 } 1030 { 0x0101 * YG, 0, 0, 0 }
1023 }; 1031 };
1024
1025 YuvConstants SIMD_ALIGNED(kYvuConstants) = {
1026 { -VR, -VR, -VR, -VR, -UB, -UB, -UB, -UB, 0, 0, 0, 0, 0, 0, 0, 0 },
1027 { VG, VG, VG, VG, UG, UG, UG, UG, 0, 0, 0, 0, 0, 0, 0, 0 },
1028 { BB, BG, BR, 0, 0, 0, 0, 0 },
1029 { 0x0101 * YG, 0, 0, 0 }
1030 };
1031
1032 #else 1032 #else
1033 // BT601 constants for YUV to RGB. 1033 // BT601 constants for YUV to RGB.
1034 YuvConstants SIMD_ALIGNED(kYuvConstants) = { 1034 YuvConstants SIMD_ALIGNED(kYuvConstants) = {
1035 { UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, 1035 { UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0,
1036 UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0 }, 1036 UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0 },
1037 { UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, 1037 { UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG,
1038 UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG }, 1038 UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG },
1039 { 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 1039 { 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR,
1040 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR }, 1040 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR },
1041 { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB }, 1041 { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB },
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1074 #undef UB 1074 #undef UB
1075 #undef UG 1075 #undef UG
1076 #undef VG 1076 #undef VG
1077 #undef VR 1077 #undef VR
1078 #undef YG 1078 #undef YG
1079 1079
1080 // C reference code that mimics the YUV assembly. 1080 // C reference code that mimics the YUV assembly.
1081 static __inline void YuvPixel(uint8 y, uint8 u, uint8 v, 1081 static __inline void YuvPixel(uint8 y, uint8 u, uint8 v,
1082 uint8* b, uint8* g, uint8* r, 1082 uint8* b, uint8* g, uint8* r,
1083 struct YuvConstants* yuvconstants) { 1083 struct YuvConstants* yuvconstants) {
1084 #if defined(__arm__) || defined(__aarch64__) 1084 #if defined(__aarch64__)
1085
1086 int UB = -yuvconstants->kUVToRB[0]; 1085 int UB = -yuvconstants->kUVToRB[0];
1087 int VB = 0; 1086 int UG = yuvconstants->kUVToG[0];
1087 int VG = yuvconstants->kUVToG[8];
1088 int VR = -yuvconstants->kUVToRB[8];
1089 int BB = yuvconstants->kUVBiasBGR[0];
1090 int BG = yuvconstants->kUVBiasBGR[1];
1091 int BR = yuvconstants->kUVBiasBGR[2];
1092 int YG = yuvconstants->kYToRgb[0];
1093 #elif defined(__arm__)
1094 int UB = -yuvconstants->kUVToRB[0];
1088 int UG = yuvconstants->kUVToG[0]; 1095 int UG = yuvconstants->kUVToG[0];
1089 int VG = yuvconstants->kUVToG[4]; 1096 int VG = yuvconstants->kUVToG[4];
1090 int UR = 0;
1091 int VR = -yuvconstants->kUVToRB[4]; 1097 int VR = -yuvconstants->kUVToRB[4];
1092 int BB = yuvconstants->kUVBiasBGR[0]; 1098 int BB = yuvconstants->kUVBiasBGR[0];
1093 int BG = yuvconstants->kUVBiasBGR[1]; 1099 int BG = yuvconstants->kUVBiasBGR[1];
1094 int BR = yuvconstants->kUVBiasBGR[2]; 1100 int BR = yuvconstants->kUVBiasBGR[2];
1095 int YG = yuvconstants->kYToRgb[0]; 1101 int YG = yuvconstants->kYToRgb[0];
1096 #else 1102 #else
1097 int UB = yuvconstants->kUVToB[0]; 1103 int UB = yuvconstants->kUVToB[0];
1098 int VB = yuvconstants->kUVToB[1]; // usually 0
1099 int UG = yuvconstants->kUVToG[0]; 1104 int UG = yuvconstants->kUVToG[0];
1100 int VG = yuvconstants->kUVToG[1]; 1105 int VG = yuvconstants->kUVToG[1];
1101 int UR = yuvconstants->kUVToR[0]; // usually 0
1102 int VR = yuvconstants->kUVToR[1]; 1106 int VR = yuvconstants->kUVToR[1];
1103 int BB = yuvconstants->kUVBiasB[0]; 1107 int BB = yuvconstants->kUVBiasB[0];
1104 int BG = yuvconstants->kUVBiasG[0]; 1108 int BG = yuvconstants->kUVBiasG[0];
1105 int BR = yuvconstants->kUVBiasR[0]; 1109 int BR = yuvconstants->kUVBiasR[0];
1106 int YG = yuvconstants->kYToRgb[0]; 1110 int YG = yuvconstants->kYToRgb[0];
1107 #endif 1111 #endif
1108 uint32 y1 = (uint32)(y * 0x0101 * YG) >> 16; 1112 uint32 y1 = (uint32)(y * 0x0101 * YG) >> 16;
1109 *b = Clamp((int32)(-(u * UB + v * VB) + y1 + BB) >> 6); 1113 *b = Clamp((int32)(-(u * UB ) + y1 + BB) >> 6);
1110 *g = Clamp((int32)(-(u * UG + v * VG) + y1 + BG) >> 6); 1114 *g = Clamp((int32)(-(u * UG + v * VG) + y1 + BG) >> 6);
1111 *r = Clamp((int32)(-(u * UR + v * VR) + y1 + BR) >> 6); 1115 *r = Clamp((int32)(-( v * VR) + y1 + BR) >> 6);
1112 } 1116 }
1113 1117
1114 // JPEG YUV to RGB reference 1118 // JPEG YUV to RGB reference
1115 // * R = Y - V * -1.40200 1119 // * R = Y - V * -1.40200
1116 // * G = Y - U * 0.34414 - V * 0.71414 1120 // * G = Y - U * 0.34414 - V * 0.71414
1117 // * B = Y - U * -1.77200 1121 // * B = Y - U * -1.77200
1118 1122
1119 // Y contribution to R,G,B. Scale and bias. 1123 // Y contribution to R,G,B. Scale and bias.
1120 #define YGJ 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ 1124 #define YGJ 16320 /* round(1.000 * 64 * 256 * 256 / 257) */
1121 #define YGBJ 32 /* 64 / 2 */ 1125 #define YGBJ 32 /* 64 / 2 */
(...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after
2684 dst_rgb565 += twidth * 2; 2688 dst_rgb565 += twidth * 2;
2685 width -= twidth; 2689 width -= twidth;
2686 } 2690 }
2687 } 2691 }
2688 #endif 2692 #endif
2689 2693
2690 #ifdef __cplusplus 2694 #ifdef __cplusplus
2691 } // extern "C" 2695 } // extern "C"
2692 } // namespace libyuv 2696 } // namespace libyuv
2693 #endif 2697 #endif
OLDNEW
« no previous file with comments | « include/libyuv/version.h ('k') | source/row_neon64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698