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

Side by Side Diff: media/base/simd/convert_yuv_to_rgb_c.cc

Issue 17043007: Fix the WebRTC color bug. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing Andrew's comments. Created 7 years, 6 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 | « media/base/simd/convert_rgb_to_yuv_c.cc ('k') | media/base/yuv_convert_unittest.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 // 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
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
OLDNEW
« no previous file with comments | « media/base/simd/convert_rgb_to_yuv_c.cc ('k') | media/base/yuv_convert_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698