| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/base/simd/convert_yuv_to_rgb.h" | 5 #include "media/base/simd/convert_yuv_to_rgb.h" |
| 6 #include "media/base/simd/yuv_to_rgb_table.h" | 6 #include "media/base/simd/yuv_to_rgb_table.h" |
| 7 | 7 |
| 8 namespace media { | 8 namespace media { |
| 9 | 9 |
| 10 #define packuswb(x) ((x) < 0 ? 0 : ((x) > 255 ? 255 : (x))) | 10 #define packuswb(x) ((x) < 0 ? 0 : ((x) > 255 ? 255 : (x))) |
| 11 #define paddsw(x, y) (((x) + (y)) < -32768 ? -32768 : \ | 11 #define paddsw(x, y) (((x) + (y)) < -32768 ? -32768 : \ |
| 12 (((x) + (y)) > 32767 ? 32767 : ((x) + (y)))) | 12 (((x) + (y)) > 32767 ? 32767 : ((x) + (y)))) |
| 13 | 13 |
| 14 // On Android, pixel layout is RGBA (see skia/include/core/SkColorPriv.h); |
| 15 // however, other Chrome platforms use BGRA (see skia/config/SkUserConfig.h). |
| 16 // Ideally, android should not use the functions here due to performance issue |
| 17 // (http://crbug.com/249980). |
| 18 #if defined(OS_ANDROID) |
| 19 #define SK_R32_SHIFT 0 |
| 20 #define SK_G32_SHIFT 8 |
| 21 #define SK_B32_SHIFT 16 |
| 22 #define SK_A32_SHIFT 24 |
| 23 #else |
| 24 #define SK_B32_SHIFT 0 |
| 25 #define SK_G32_SHIFT 8 |
| 26 #define SK_R32_SHIFT 16 |
| 27 #define SK_A32_SHIFT 24 |
| 28 #endif |
| 29 |
| 14 static inline void ConvertYUVToRGB32_C(uint8 y, | 30 static inline void ConvertYUVToRGB32_C(uint8 y, |
| 15 uint8 u, | 31 uint8 u, |
| 16 uint8 v, | 32 uint8 v, |
| 17 uint8* rgb_buf) { | 33 uint8* rgb_buf) { |
| 18 int b = kCoefficientsRgbY[256+u][0]; | 34 int b = kCoefficientsRgbY[256+u][0]; |
| 19 int g = kCoefficientsRgbY[256+u][1]; | 35 int g = kCoefficientsRgbY[256+u][1]; |
| 20 int r = kCoefficientsRgbY[256+u][2]; | 36 int r = kCoefficientsRgbY[256+u][2]; |
| 21 int a = kCoefficientsRgbY[256+u][3]; | 37 int a = kCoefficientsRgbY[256+u][3]; |
| 22 | 38 |
| 23 b = paddsw(b, kCoefficientsRgbY[512+v][0]); | 39 b = paddsw(b, kCoefficientsRgbY[512+v][0]); |
| 24 g = paddsw(g, kCoefficientsRgbY[512+v][1]); | 40 g = paddsw(g, kCoefficientsRgbY[512+v][1]); |
| 25 r = paddsw(r, kCoefficientsRgbY[512+v][2]); | 41 r = paddsw(r, kCoefficientsRgbY[512+v][2]); |
| 26 a = paddsw(a, kCoefficientsRgbY[512+v][3]); | 42 a = paddsw(a, kCoefficientsRgbY[512+v][3]); |
| 27 | 43 |
| 28 b = paddsw(b, kCoefficientsRgbY[y][0]); | 44 b = paddsw(b, kCoefficientsRgbY[y][0]); |
| 29 g = paddsw(g, kCoefficientsRgbY[y][1]); | 45 g = paddsw(g, kCoefficientsRgbY[y][1]); |
| 30 r = paddsw(r, kCoefficientsRgbY[y][2]); | 46 r = paddsw(r, kCoefficientsRgbY[y][2]); |
| 31 a = paddsw(a, kCoefficientsRgbY[y][3]); | 47 a = paddsw(a, kCoefficientsRgbY[y][3]); |
| 32 | 48 |
| 33 b >>= 6; | 49 b >>= 6; |
| 34 g >>= 6; | 50 g >>= 6; |
| 35 r >>= 6; | 51 r >>= 6; |
| 36 a >>= 6; | 52 a >>= 6; |
| 37 | 53 |
| 38 *reinterpret_cast<uint32*>(rgb_buf) = (packuswb(b)) | | 54 *reinterpret_cast<uint32*>(rgb_buf) = (packuswb(b) << SK_B32_SHIFT) | |
| 39 (packuswb(g) << 8) | | 55 (packuswb(g) << SK_G32_SHIFT) | |
| 40 (packuswb(r) << 16) | | 56 (packuswb(r) << SK_R32_SHIFT) | |
| 41 (packuswb(a) << 24); | 57 (packuswb(a) << SK_A32_SHIFT); |
| 42 } | 58 } |
| 43 | 59 |
| 44 static inline void ConvertYUVAToARGB_C(uint8 y, | 60 static inline void ConvertYUVAToARGB_C(uint8 y, |
| 45 uint8 u, | 61 uint8 u, |
| 46 uint8 v, | 62 uint8 v, |
| 47 uint8 a, | 63 uint8 a, |
| 48 uint8* rgb_buf) { | 64 uint8* rgb_buf) { |
| 49 int b = kCoefficientsRgbY[256+u][0]; | 65 int b = kCoefficientsRgbY[256+u][0]; |
| 50 int g = kCoefficientsRgbY[256+u][1]; | 66 int g = kCoefficientsRgbY[256+u][1]; |
| 51 int r = kCoefficientsRgbY[256+u][2]; | 67 int r = kCoefficientsRgbY[256+u][2]; |
| 52 | 68 |
| 53 b = paddsw(b, kCoefficientsRgbY[512+v][0]); | 69 b = paddsw(b, kCoefficientsRgbY[512+v][0]); |
| 54 g = paddsw(g, kCoefficientsRgbY[512+v][1]); | 70 g = paddsw(g, kCoefficientsRgbY[512+v][1]); |
| 55 r = paddsw(r, kCoefficientsRgbY[512+v][2]); | 71 r = paddsw(r, kCoefficientsRgbY[512+v][2]); |
| 56 | 72 |
| 57 b = paddsw(b, kCoefficientsRgbY[y][0]); | 73 b = paddsw(b, kCoefficientsRgbY[y][0]); |
| 58 g = paddsw(g, kCoefficientsRgbY[y][1]); | 74 g = paddsw(g, kCoefficientsRgbY[y][1]); |
| 59 r = paddsw(r, kCoefficientsRgbY[y][2]); | 75 r = paddsw(r, kCoefficientsRgbY[y][2]); |
| 60 | 76 |
| 61 b >>= 6; | 77 b >>= 6; |
| 62 g >>= 6; | 78 g >>= 6; |
| 63 r >>= 6; | 79 r >>= 6; |
| 64 | 80 |
| 65 b = packuswb(b) * a >> 8; | 81 b = packuswb(b) * a >> 8; |
| 66 g = packuswb(g) * a >> 8; | 82 g = packuswb(g) * a >> 8; |
| 67 r = packuswb(r) * a >> 8; | 83 r = packuswb(r) * a >> 8; |
| 68 | 84 |
| 69 *reinterpret_cast<uint32*>(rgb_buf) = b | (g << 8) | (r << 16) | (a << 24); | 85 *reinterpret_cast<uint32*>(rgb_buf) = (b << SK_B32_SHIFT) | |
| 86 (g << SK_G32_SHIFT) | |
| 87 (r << SK_R32_SHIFT) | |
| 88 (a << SK_A32_SHIFT); |
| 70 } | 89 } |
| 71 | 90 |
| 72 void ConvertYUVToRGB32Row_C(const uint8* y_buf, | 91 void ConvertYUVToRGB32Row_C(const uint8* y_buf, |
| 73 const uint8* u_buf, | 92 const uint8* u_buf, |
| 74 const uint8* v_buf, | 93 const uint8* v_buf, |
| 75 uint8* rgb_buf, | 94 uint8* rgb_buf, |
| 76 ptrdiff_t width) { | 95 ptrdiff_t width) { |
| 77 for (int x = 0; x < width; x += 2) { | 96 for (int x = 0; x < width; x += 2) { |
| 78 uint8 u = u_buf[x >> 1]; | 97 uint8 u = u_buf[x >> 1]; |
| 79 uint8 v = v_buf[x >> 1]; | 98 uint8 v = v_buf[x >> 1]; |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 ConvertYUVAToARGBRow_C(y_ptr, | 248 ConvertYUVAToARGBRow_C(y_ptr, |
| 230 u_ptr, | 249 u_ptr, |
| 231 v_ptr, | 250 v_ptr, |
| 232 a_ptr, | 251 a_ptr, |
| 233 rgba_row, | 252 rgba_row, |
| 234 width); | 253 width); |
| 235 } | 254 } |
| 236 } | 255 } |
| 237 | 256 |
| 238 } // namespace media | 257 } // namespace media |
| OLD | NEW |