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 |