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); | 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). | 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 | 16 // Ideally, android should not use the functions here due to performance issue |
17 // (http://crbug.com/249980). | 17 // (http://crbug.com/249980). |
18 #if defined(OS_ANDROID) | 18 #if defined(OS_ANDROID) |
19 #define SK_R32_SHIFT 0 | 19 #define SK_R32_SHIFT 0 |
20 #define SK_G32_SHIFT 8 | 20 #define SK_G32_SHIFT 8 |
21 #define SK_B32_SHIFT 16 | 21 #define SK_B32_SHIFT 16 |
22 #define SK_A32_SHIFT 24 | 22 #define SK_A32_SHIFT 24 |
| 23 #define R_INDEX 0 |
| 24 #define G_INDEX 1 |
| 25 #define B_INDEX 2 |
| 26 #define A_INDEX 3 |
23 #else | 27 #else |
24 #define SK_B32_SHIFT 0 | 28 #define SK_B32_SHIFT 0 |
25 #define SK_G32_SHIFT 8 | 29 #define SK_G32_SHIFT 8 |
26 #define SK_R32_SHIFT 16 | 30 #define SK_R32_SHIFT 16 |
27 #define SK_A32_SHIFT 24 | 31 #define SK_A32_SHIFT 24 |
| 32 #define B_INDEX 0 |
| 33 #define G_INDEX 1 |
| 34 #define R_INDEX 2 |
| 35 #define A_INDEX 3 |
28 #endif | 36 #endif |
29 | 37 |
30 static inline void ConvertYUVToRGB32_C(uint8 y, | 38 static inline void ConvertYUVToRGB32_C(uint8 y, |
31 uint8 u, | 39 uint8 u, |
32 uint8 v, | 40 uint8 v, |
33 uint8* rgb_buf) { | 41 uint8* rgb_buf) { |
34 int b = kCoefficientsRgbY[256+u][0]; | 42 int b = kCoefficientsRgbY[256+u][B_INDEX]; |
35 int g = kCoefficientsRgbY[256+u][1]; | 43 int g = kCoefficientsRgbY[256+u][G_INDEX]; |
36 int r = kCoefficientsRgbY[256+u][2]; | 44 int r = kCoefficientsRgbY[256+u][R_INDEX]; |
37 int a = kCoefficientsRgbY[256+u][3]; | 45 int a = kCoefficientsRgbY[256+u][A_INDEX]; |
38 | 46 |
39 b = paddsw(b, kCoefficientsRgbY[512+v][0]); | 47 b = paddsw(b, kCoefficientsRgbY[512+v][B_INDEX]); |
40 g = paddsw(g, kCoefficientsRgbY[512+v][1]); | 48 g = paddsw(g, kCoefficientsRgbY[512+v][G_INDEX]); |
41 r = paddsw(r, kCoefficientsRgbY[512+v][2]); | 49 r = paddsw(r, kCoefficientsRgbY[512+v][R_INDEX]); |
42 a = paddsw(a, kCoefficientsRgbY[512+v][3]); | 50 a = paddsw(a, kCoefficientsRgbY[512+v][A_INDEX]); |
43 | 51 |
44 b = paddsw(b, kCoefficientsRgbY[y][0]); | 52 b = paddsw(b, kCoefficientsRgbY[y][B_INDEX]); |
45 g = paddsw(g, kCoefficientsRgbY[y][1]); | 53 g = paddsw(g, kCoefficientsRgbY[y][G_INDEX]); |
46 r = paddsw(r, kCoefficientsRgbY[y][2]); | 54 r = paddsw(r, kCoefficientsRgbY[y][R_INDEX]); |
47 a = paddsw(a, kCoefficientsRgbY[y][3]); | 55 a = paddsw(a, kCoefficientsRgbY[y][A_INDEX]); |
48 | 56 |
49 b >>= 6; | 57 b >>= 6; |
50 g >>= 6; | 58 g >>= 6; |
51 r >>= 6; | 59 r >>= 6; |
52 a >>= 6; | 60 a >>= 6; |
53 | 61 |
54 *reinterpret_cast<uint32*>(rgb_buf) = (packuswb(b) << SK_B32_SHIFT) | | 62 *reinterpret_cast<uint32*>(rgb_buf) = (packuswb(b) << SK_B32_SHIFT) | |
55 (packuswb(g) << SK_G32_SHIFT) | | 63 (packuswb(g) << SK_G32_SHIFT) | |
56 (packuswb(r) << SK_R32_SHIFT) | | 64 (packuswb(r) << SK_R32_SHIFT) | |
57 (packuswb(a) << SK_A32_SHIFT); | 65 (packuswb(a) << SK_A32_SHIFT); |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 ConvertYUVAToARGBRow_C(y_ptr, | 256 ConvertYUVAToARGBRow_C(y_ptr, |
249 u_ptr, | 257 u_ptr, |
250 v_ptr, | 258 v_ptr, |
251 a_ptr, | 259 a_ptr, |
252 rgba_row, | 260 rgba_row, |
253 width); | 261 width); |
254 } | 262 } |
255 } | 263 } |
256 | 264 |
257 } // namespace media | 265 } // namespace media |
OLD | NEW |