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

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

Issue 263723004: Revert of Add correct support for videos with YUVJ420P color format, in the software conversion path. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@yuvnopic
Patch Set: Created 6 years, 7 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_yuv_to_rgb.h ('k') | media/base/simd/convert_yuv_to_rgb_mmx.asm » ('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)))
(...skipping 20 matching lines...) Expand all
31 #define SK_A32_SHIFT 24 31 #define SK_A32_SHIFT 24
32 #define B_INDEX 0 32 #define B_INDEX 0
33 #define G_INDEX 1 33 #define G_INDEX 1
34 #define R_INDEX 2 34 #define R_INDEX 2
35 #define A_INDEX 3 35 #define A_INDEX 3
36 #endif 36 #endif
37 37
38 static inline void ConvertYUVToRGB32_C(uint8 y, 38 static inline void ConvertYUVToRGB32_C(uint8 y,
39 uint8 u, 39 uint8 u,
40 uint8 v, 40 uint8 v,
41 uint8* rgb_buf, 41 uint8* rgb_buf) {
42 const int16 convert_table[1024][4]) { 42 int b = kCoefficientsRgbY[256+u][B_INDEX];
43 int b = convert_table[256+u][B_INDEX]; 43 int g = kCoefficientsRgbY[256+u][G_INDEX];
44 int g = convert_table[256+u][G_INDEX]; 44 int r = kCoefficientsRgbY[256+u][R_INDEX];
45 int r = convert_table[256+u][R_INDEX]; 45 int a = kCoefficientsRgbY[256+u][A_INDEX];
46 int a = convert_table[256+u][A_INDEX];
47 46
48 b = paddsw(b, convert_table[512+v][B_INDEX]); 47 b = paddsw(b, kCoefficientsRgbY[512+v][B_INDEX]);
49 g = paddsw(g, convert_table[512+v][G_INDEX]); 48 g = paddsw(g, kCoefficientsRgbY[512+v][G_INDEX]);
50 r = paddsw(r, convert_table[512+v][R_INDEX]); 49 r = paddsw(r, kCoefficientsRgbY[512+v][R_INDEX]);
51 a = paddsw(a, convert_table[512+v][A_INDEX]); 50 a = paddsw(a, kCoefficientsRgbY[512+v][A_INDEX]);
52 51
53 b = paddsw(b, convert_table[y][B_INDEX]); 52 b = paddsw(b, kCoefficientsRgbY[y][B_INDEX]);
54 g = paddsw(g, convert_table[y][G_INDEX]); 53 g = paddsw(g, kCoefficientsRgbY[y][G_INDEX]);
55 r = paddsw(r, convert_table[y][R_INDEX]); 54 r = paddsw(r, kCoefficientsRgbY[y][R_INDEX]);
56 a = paddsw(a, convert_table[y][A_INDEX]); 55 a = paddsw(a, kCoefficientsRgbY[y][A_INDEX]);
57 56
58 b >>= 6; 57 b >>= 6;
59 g >>= 6; 58 g >>= 6;
60 r >>= 6; 59 r >>= 6;
61 a >>= 6; 60 a >>= 6;
62 61
63 *reinterpret_cast<uint32*>(rgb_buf) = (packuswb(b) << SK_B32_SHIFT) | 62 *reinterpret_cast<uint32*>(rgb_buf) = (packuswb(b) << SK_B32_SHIFT) |
64 (packuswb(g) << SK_G32_SHIFT) | 63 (packuswb(g) << SK_G32_SHIFT) |
65 (packuswb(r) << SK_R32_SHIFT) | 64 (packuswb(r) << SK_R32_SHIFT) |
66 (packuswb(a) << SK_A32_SHIFT); 65 (packuswb(a) << SK_A32_SHIFT);
67 } 66 }
68 67
69 static inline void ConvertYUVAToARGB_C(uint8 y, 68 static inline void ConvertYUVAToARGB_C(uint8 y,
70 uint8 u, 69 uint8 u,
71 uint8 v, 70 uint8 v,
72 uint8 a, 71 uint8 a,
73 uint8* rgb_buf, 72 uint8* rgb_buf) {
74 const int16 convert_table[1024][4]) { 73 int b = kCoefficientsRgbY[256+u][0];
75 int b = convert_table[256+u][0]; 74 int g = kCoefficientsRgbY[256+u][1];
76 int g = convert_table[256+u][1]; 75 int r = kCoefficientsRgbY[256+u][2];
77 int r = convert_table[256+u][2];
78 76
79 b = paddsw(b, convert_table[512+v][0]); 77 b = paddsw(b, kCoefficientsRgbY[512+v][0]);
80 g = paddsw(g, convert_table[512+v][1]); 78 g = paddsw(g, kCoefficientsRgbY[512+v][1]);
81 r = paddsw(r, convert_table[512+v][2]); 79 r = paddsw(r, kCoefficientsRgbY[512+v][2]);
82 80
83 b = paddsw(b, convert_table[y][0]); 81 b = paddsw(b, kCoefficientsRgbY[y][0]);
84 g = paddsw(g, convert_table[y][1]); 82 g = paddsw(g, kCoefficientsRgbY[y][1]);
85 r = paddsw(r, convert_table[y][2]); 83 r = paddsw(r, kCoefficientsRgbY[y][2]);
86 84
87 b >>= 6; 85 b >>= 6;
88 g >>= 6; 86 g >>= 6;
89 r >>= 6; 87 r >>= 6;
90 88
91 b = packuswb(b) * a >> 8; 89 b = packuswb(b) * a >> 8;
92 g = packuswb(g) * a >> 8; 90 g = packuswb(g) * a >> 8;
93 r = packuswb(r) * a >> 8; 91 r = packuswb(r) * a >> 8;
94 92
95 *reinterpret_cast<uint32*>(rgb_buf) = (b << SK_B32_SHIFT) | 93 *reinterpret_cast<uint32*>(rgb_buf) = (b << SK_B32_SHIFT) |
96 (g << SK_G32_SHIFT) | 94 (g << SK_G32_SHIFT) |
97 (r << SK_R32_SHIFT) | 95 (r << SK_R32_SHIFT) |
98 (a << SK_A32_SHIFT); 96 (a << SK_A32_SHIFT);
99 } 97 }
100 98
101 void ConvertYUVToRGB32Row_C(const uint8* y_buf, 99 void ConvertYUVToRGB32Row_C(const uint8* y_buf,
102 const uint8* u_buf, 100 const uint8* u_buf,
103 const uint8* v_buf, 101 const uint8* v_buf,
104 uint8* rgb_buf, 102 uint8* rgb_buf,
105 ptrdiff_t width, 103 ptrdiff_t width) {
106 const int16 convert_table[1024][4]) {
107 for (int x = 0; x < width; x += 2) { 104 for (int x = 0; x < width; x += 2) {
108 uint8 u = u_buf[x >> 1]; 105 uint8 u = u_buf[x >> 1];
109 uint8 v = v_buf[x >> 1]; 106 uint8 v = v_buf[x >> 1];
110 uint8 y0 = y_buf[x]; 107 uint8 y0 = y_buf[x];
111 ConvertYUVToRGB32_C(y0, u, v, rgb_buf, convert_table); 108 ConvertYUVToRGB32_C(y0, u, v, rgb_buf);
112 if ((x + 1) < width) { 109 if ((x + 1) < width) {
113 uint8 y1 = y_buf[x + 1]; 110 uint8 y1 = y_buf[x + 1];
114 ConvertYUVToRGB32_C(y1, u, v, rgb_buf + 4, convert_table); 111 ConvertYUVToRGB32_C(y1, u, v, rgb_buf + 4);
115 } 112 }
116 rgb_buf += 8; // Advance 2 pixels. 113 rgb_buf += 8; // Advance 2 pixels.
117 } 114 }
118 } 115 }
119 116
120 void ConvertYUVAToARGBRow_C(const uint8* y_buf, 117 void ConvertYUVAToARGBRow_C(const uint8* y_buf,
121 const uint8* u_buf, 118 const uint8* u_buf,
122 const uint8* v_buf, 119 const uint8* v_buf,
123 const uint8* a_buf, 120 const uint8* a_buf,
124 uint8* rgba_buf, 121 uint8* rgba_buf,
125 ptrdiff_t width, 122 ptrdiff_t width) {
126 const int16 convert_table[1024][4]) {
127 for (int x = 0; x < width; x += 2) { 123 for (int x = 0; x < width; x += 2) {
128 uint8 u = u_buf[x >> 1]; 124 uint8 u = u_buf[x >> 1];
129 uint8 v = v_buf[x >> 1]; 125 uint8 v = v_buf[x >> 1];
130 uint8 y0 = y_buf[x]; 126 uint8 y0 = y_buf[x];
131 uint8 a0 = a_buf[x]; 127 uint8 a0 = a_buf[x];
132 ConvertYUVAToARGB_C(y0, u, v, a0, rgba_buf, convert_table); 128 ConvertYUVAToARGB_C(y0, u, v, a0, rgba_buf);
133 if ((x + 1) < width) { 129 if ((x + 1) < width) {
134 uint8 y1 = y_buf[x + 1]; 130 uint8 y1 = y_buf[x + 1];
135 uint8 a1 = a_buf[x + 1]; 131 uint8 a1 = a_buf[x + 1];
136 ConvertYUVAToARGB_C(y1, u, v, a1, rgba_buf + 4, convert_table); 132 ConvertYUVAToARGB_C(y1, u, v, a1, rgba_buf + 4);
137 } 133 }
138 rgba_buf += 8; // Advance 2 pixels. 134 rgba_buf += 8; // Advance 2 pixels.
139 } 135 }
140 } 136 }
141 137
142 // 16.16 fixed point is used. A shift by 16 isolates the integer. 138 // 16.16 fixed point is used. A shift by 16 isolates the integer.
143 // A shift by 17 is used to further subsample the chrominence channels. 139 // A shift by 17 is used to further subsample the chrominence channels.
144 // & 0xffff isolates the fixed point fraction. >> 2 to get the upper 2 bits, 140 // & 0xffff isolates the fixed point fraction. >> 2 to get the upper 2 bits,
145 // for 1/65536 pixel accurate interpolation. 141 // for 1/65536 pixel accurate interpolation.
146 void ScaleYUVToRGB32Row_C(const uint8* y_buf, 142 void ScaleYUVToRGB32Row_C(const uint8* y_buf,
147 const uint8* u_buf, 143 const uint8* u_buf,
148 const uint8* v_buf, 144 const uint8* v_buf,
149 uint8* rgb_buf, 145 uint8* rgb_buf,
150 ptrdiff_t width, 146 ptrdiff_t width,
151 ptrdiff_t source_dx, 147 ptrdiff_t source_dx) {
152 const int16 convert_table[1024][4]) {
153 int x = 0; 148 int x = 0;
154 for (int i = 0; i < width; i += 2) { 149 for (int i = 0; i < width; i += 2) {
155 int y = y_buf[x >> 16]; 150 int y = y_buf[x >> 16];
156 int u = u_buf[(x >> 17)]; 151 int u = u_buf[(x >> 17)];
157 int v = v_buf[(x >> 17)]; 152 int v = v_buf[(x >> 17)];
158 ConvertYUVToRGB32_C(y, u, v, rgb_buf, convert_table); 153 ConvertYUVToRGB32_C(y, u, v, rgb_buf);
159 x += source_dx; 154 x += source_dx;
160 if ((i + 1) < width) { 155 if ((i + 1) < width) {
161 y = y_buf[x >> 16]; 156 y = y_buf[x >> 16];
162 ConvertYUVToRGB32_C(y, u, v, rgb_buf+4, convert_table); 157 ConvertYUVToRGB32_C(y, u, v, rgb_buf+4);
163 x += source_dx; 158 x += source_dx;
164 } 159 }
165 rgb_buf += 8; 160 rgb_buf += 8;
166 } 161 }
167 } 162 }
168 163
169 void LinearScaleYUVToRGB32Row_C(const uint8* y_buf, 164 void LinearScaleYUVToRGB32Row_C(const uint8* y_buf,
170 const uint8* u_buf, 165 const uint8* u_buf,
171 const uint8* v_buf, 166 const uint8* v_buf,
172 uint8* rgb_buf, 167 uint8* rgb_buf,
173 ptrdiff_t width, 168 ptrdiff_t width,
174 ptrdiff_t source_dx, 169 ptrdiff_t source_dx) {
175 const int16 convert_table[1024][4]) {
176 // Avoid point-sampling for down-scaling by > 2:1. 170 // Avoid point-sampling for down-scaling by > 2:1.
177 int source_x = 0; 171 int source_x = 0;
178 if (source_dx >= 0x20000) 172 if (source_dx >= 0x20000)
179 source_x += 0x8000; 173 source_x += 0x8000;
180 LinearScaleYUVToRGB32RowWithRange_C(y_buf, u_buf, v_buf, rgb_buf, width, 174 LinearScaleYUVToRGB32RowWithRange_C(y_buf, u_buf, v_buf, rgb_buf, width,
181 source_x, source_dx, convert_table); 175 source_x, source_dx);
182 } 176 }
183 177
184 void LinearScaleYUVToRGB32RowWithRange_C(const uint8* y_buf, 178 void LinearScaleYUVToRGB32RowWithRange_C(const uint8* y_buf,
185 const uint8* u_buf, 179 const uint8* u_buf,
186 const uint8* v_buf, 180 const uint8* v_buf,
187 uint8* rgb_buf, 181 uint8* rgb_buf,
188 int dest_width, 182 int dest_width,
189 int x, 183 int x,
190 int source_dx, 184 int source_dx) {
191 const int16 convert_table[1024][4]) {
192 for (int i = 0; i < dest_width; i += 2) { 185 for (int i = 0; i < dest_width; i += 2) {
193 int y0 = y_buf[x >> 16]; 186 int y0 = y_buf[x >> 16];
194 int y1 = y_buf[(x >> 16) + 1]; 187 int y1 = y_buf[(x >> 16) + 1];
195 int u0 = u_buf[(x >> 17)]; 188 int u0 = u_buf[(x >> 17)];
196 int u1 = u_buf[(x >> 17) + 1]; 189 int u1 = u_buf[(x >> 17) + 1];
197 int v0 = v_buf[(x >> 17)]; 190 int v0 = v_buf[(x >> 17)];
198 int v1 = v_buf[(x >> 17) + 1]; 191 int v1 = v_buf[(x >> 17) + 1];
199 int y_frac = (x & 65535); 192 int y_frac = (x & 65535);
200 int uv_frac = ((x >> 1) & 65535); 193 int uv_frac = ((x >> 1) & 65535);
201 int y = (y_frac * y1 + (y_frac ^ 65535) * y0) >> 16; 194 int y = (y_frac * y1 + (y_frac ^ 65535) * y0) >> 16;
202 int u = (uv_frac * u1 + (uv_frac ^ 65535) * u0) >> 16; 195 int u = (uv_frac * u1 + (uv_frac ^ 65535) * u0) >> 16;
203 int v = (uv_frac * v1 + (uv_frac ^ 65535) * v0) >> 16; 196 int v = (uv_frac * v1 + (uv_frac ^ 65535) * v0) >> 16;
204 ConvertYUVToRGB32_C(y, u, v, rgb_buf, convert_table); 197 ConvertYUVToRGB32_C(y, u, v, rgb_buf);
205 x += source_dx; 198 x += source_dx;
206 if ((i + 1) < dest_width) { 199 if ((i + 1) < dest_width) {
207 y0 = y_buf[x >> 16]; 200 y0 = y_buf[x >> 16];
208 y1 = y_buf[(x >> 16) + 1]; 201 y1 = y_buf[(x >> 16) + 1];
209 y_frac = (x & 65535); 202 y_frac = (x & 65535);
210 y = (y_frac * y1 + (y_frac ^ 65535) * y0) >> 16; 203 y = (y_frac * y1 + (y_frac ^ 65535) * y0) >> 16;
211 ConvertYUVToRGB32_C(y, u, v, rgb_buf+4, convert_table); 204 ConvertYUVToRGB32_C(y, u, v, rgb_buf+4);
212 x += source_dx; 205 x += source_dx;
213 } 206 }
214 rgb_buf += 8; 207 rgb_buf += 8;
215 } 208 }
216 } 209 }
217 210
218 void ConvertYUVToRGB32_C(const uint8* yplane, 211 void ConvertYUVToRGB32_C(const uint8* yplane,
219 const uint8* uplane, 212 const uint8* uplane,
220 const uint8* vplane, 213 const uint8* vplane,
221 uint8* rgbframe, 214 uint8* rgbframe,
222 int width, 215 int width,
223 int height, 216 int height,
224 int ystride, 217 int ystride,
225 int uvstride, 218 int uvstride,
226 int rgbstride, 219 int rgbstride,
227 YUVType yuv_type) { 220 YUVType yuv_type) {
228 unsigned int y_shift = GetVerticalShift(yuv_type); 221 unsigned int y_shift = yuv_type;
229 for (int y = 0; y < height; ++y) { 222 for (int y = 0; y < height; ++y) {
230 uint8* rgb_row = rgbframe + y * rgbstride; 223 uint8* rgb_row = rgbframe + y * rgbstride;
231 const uint8* y_ptr = yplane + y * ystride; 224 const uint8* y_ptr = yplane + y * ystride;
232 const uint8* u_ptr = uplane + (y >> y_shift) * uvstride; 225 const uint8* u_ptr = uplane + (y >> y_shift) * uvstride;
233 const uint8* v_ptr = vplane + (y >> y_shift) * uvstride; 226 const uint8* v_ptr = vplane + (y >> y_shift) * uvstride;
234 227
235 ConvertYUVToRGB32Row_C(y_ptr, 228 ConvertYUVToRGB32Row_C(y_ptr,
236 u_ptr, 229 u_ptr,
237 v_ptr, 230 v_ptr,
238 rgb_row, 231 rgb_row,
239 width, 232 width);
240 GetLookupTable(yuv_type));
241 } 233 }
242 } 234 }
243 235
244 void ConvertYUVAToARGB_C(const uint8* yplane, 236 void ConvertYUVAToARGB_C(const uint8* yplane,
245 const uint8* uplane, 237 const uint8* uplane,
246 const uint8* vplane, 238 const uint8* vplane,
247 const uint8* aplane, 239 const uint8* aplane,
248 uint8* rgbaframe, 240 uint8* rgbaframe,
249 int width, 241 int width,
250 int height, 242 int height,
251 int ystride, 243 int ystride,
252 int uvstride, 244 int uvstride,
253 int astride, 245 int astride,
254 int rgbastride, 246 int rgbastride,
255 YUVType yuv_type) { 247 YUVType yuv_type) {
256 unsigned int y_shift = yuv_type; 248 unsigned int y_shift = yuv_type;
257 for (int y = 0; y < height; y++) { 249 for (int y = 0; y < height; y++) {
258 uint8* rgba_row = rgbaframe + y * rgbastride; 250 uint8* rgba_row = rgbaframe + y * rgbastride;
259 const uint8* y_ptr = yplane + y * ystride; 251 const uint8* y_ptr = yplane + y * ystride;
260 const uint8* u_ptr = uplane + (y >> y_shift) * uvstride; 252 const uint8* u_ptr = uplane + (y >> y_shift) * uvstride;
261 const uint8* v_ptr = vplane + (y >> y_shift) * uvstride; 253 const uint8* v_ptr = vplane + (y >> y_shift) * uvstride;
262 const uint8* a_ptr = aplane + y * astride; 254 const uint8* a_ptr = aplane + y * astride;
263 255
264 ConvertYUVAToARGBRow_C(y_ptr, 256 ConvertYUVAToARGBRow_C(y_ptr,
265 u_ptr, 257 u_ptr,
266 v_ptr, 258 v_ptr,
267 a_ptr, 259 a_ptr,
268 rgba_row, 260 rgba_row,
269 width, 261 width);
270 GetLookupTable(yuv_type));
271 } 262 }
272 } 263 }
273 264
274 } // namespace media 265 } // namespace media
OLDNEW
« no previous file with comments | « media/base/simd/convert_yuv_to_rgb.h ('k') | media/base/simd/convert_yuv_to_rgb_mmx.asm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698