Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4349 | Serge | 1 | /* |
2 | * software YUV to RGB converter |
||
3 | * |
||
4 | * Copyright (C) 2009 Konstantin Shishkov |
||
5 | * |
||
6 | * 1,4,8bpp support and context / deglobalize stuff |
||
7 | * by Michael Niedermayer (michaelni@gmx.at) |
||
8 | * |
||
9 | * This file is part of FFmpeg. |
||
10 | * |
||
11 | * FFmpeg is free software; you can redistribute it and/or |
||
12 | * modify it under the terms of the GNU Lesser General Public |
||
13 | * License as published by the Free Software Foundation; either |
||
14 | * version 2.1 of the License, or (at your option) any later version. |
||
15 | * |
||
16 | * FFmpeg is distributed in the hope that it will be useful, |
||
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||
19 | * Lesser General Public License for more details. |
||
20 | * |
||
21 | * You should have received a copy of the GNU Lesser General Public |
||
22 | * License along with FFmpeg; if not, write to the Free Software |
||
23 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||
24 | */ |
||
25 | |||
26 | #include |
||
27 | #include |
||
28 | #include |
||
29 | |||
30 | #include "libavutil/cpu.h" |
||
31 | #include "libavutil/bswap.h" |
||
32 | #include "config.h" |
||
33 | #include "rgb2rgb.h" |
||
34 | #include "swscale.h" |
||
35 | #include "swscale_internal.h" |
||
36 | #include "libavutil/pixdesc.h" |
||
37 | |||
38 | const int32_t ff_yuv2rgb_coeffs[8][4] = { |
||
39 | { 117504, 138453, 13954, 34903 }, /* no sequence_display_extension */ |
||
40 | { 117504, 138453, 13954, 34903 }, /* ITU-R Rec. 709 (1990) */ |
||
41 | { 104597, 132201, 25675, 53279 }, /* unspecified */ |
||
42 | { 104597, 132201, 25675, 53279 }, /* reserved */ |
||
43 | { 104448, 132798, 24759, 53109 }, /* FCC */ |
||
44 | { 104597, 132201, 25675, 53279 }, /* ITU-R Rec. 624-4 System B, G */ |
||
45 | { 104597, 132201, 25675, 53279 }, /* SMPTE 170M */ |
||
46 | { 117579, 136230, 16907, 35559 } /* SMPTE 240M (1987) */ |
||
47 | }; |
||
48 | |||
49 | const int *sws_getCoefficients(int colorspace) |
||
50 | { |
||
51 | if (colorspace > 7 || colorspace < 0) |
||
52 | colorspace = SWS_CS_DEFAULT; |
||
53 | return ff_yuv2rgb_coeffs[colorspace]; |
||
54 | } |
||
55 | |||
56 | #define LOADCHROMA(i) \ |
||
57 | U = pu[i]; \ |
||
58 | V = pv[i]; \ |
||
59 | r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \ |
||
60 | g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \ |
||
61 | b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; |
||
62 | |||
63 | #define PUTRGB(dst, src, i) \ |
||
64 | Y = src[2 * i]; \ |
||
65 | dst[2 * i] = r[Y] + g[Y] + b[Y]; \ |
||
66 | Y = src[2 * i + 1]; \ |
||
67 | dst[2 * i + 1] = r[Y] + g[Y] + b[Y]; |
||
68 | |||
69 | #define PUTRGB24(dst, src, i) \ |
||
70 | Y = src[2 * i]; \ |
||
71 | dst[6 * i + 0] = r[Y]; \ |
||
72 | dst[6 * i + 1] = g[Y]; \ |
||
73 | dst[6 * i + 2] = b[Y]; \ |
||
74 | Y = src[2 * i + 1]; \ |
||
75 | dst[6 * i + 3] = r[Y]; \ |
||
76 | dst[6 * i + 4] = g[Y]; \ |
||
77 | dst[6 * i + 5] = b[Y]; |
||
78 | |||
79 | #define PUTBGR24(dst, src, i) \ |
||
80 | Y = src[2 * i]; \ |
||
81 | dst[6 * i + 0] = b[Y]; \ |
||
82 | dst[6 * i + 1] = g[Y]; \ |
||
83 | dst[6 * i + 2] = r[Y]; \ |
||
84 | Y = src[2 * i + 1]; \ |
||
85 | dst[6 * i + 3] = b[Y]; \ |
||
86 | dst[6 * i + 4] = g[Y]; \ |
||
87 | dst[6 * i + 5] = r[Y]; |
||
88 | |||
89 | #define PUTRGBA(dst, ysrc, asrc, i, s) \ |
||
90 | Y = ysrc[2 * i]; \ |
||
91 | dst[2 * i] = r[Y] + g[Y] + b[Y] + (asrc[2 * i] << s); \ |
||
92 | Y = ysrc[2 * i + 1]; \ |
||
93 | dst[2 * i + 1] = r[Y] + g[Y] + b[Y] + (asrc[2 * i + 1] << s); |
||
94 | |||
95 | #define PUTRGB48(dst, src, i) \ |
||
96 | Y = src[ 2 * i]; \ |
||
97 | dst[12 * i + 0] = dst[12 * i + 1] = r[Y]; \ |
||
98 | dst[12 * i + 2] = dst[12 * i + 3] = g[Y]; \ |
||
99 | dst[12 * i + 4] = dst[12 * i + 5] = b[Y]; \ |
||
100 | Y = src[ 2 * i + 1]; \ |
||
101 | dst[12 * i + 6] = dst[12 * i + 7] = r[Y]; \ |
||
102 | dst[12 * i + 8] = dst[12 * i + 9] = g[Y]; \ |
||
103 | dst[12 * i + 10] = dst[12 * i + 11] = b[Y]; |
||
104 | |||
105 | #define PUTBGR48(dst, src, i) \ |
||
106 | Y = src[2 * i]; \ |
||
107 | dst[12 * i + 0] = dst[12 * i + 1] = b[Y]; \ |
||
108 | dst[12 * i + 2] = dst[12 * i + 3] = g[Y]; \ |
||
109 | dst[12 * i + 4] = dst[12 * i + 5] = r[Y]; \ |
||
110 | Y = src[2 * i + 1]; \ |
||
111 | dst[12 * i + 6] = dst[12 * i + 7] = b[Y]; \ |
||
112 | dst[12 * i + 8] = dst[12 * i + 9] = g[Y]; \ |
||
113 | dst[12 * i + 10] = dst[12 * i + 11] = r[Y]; |
||
114 | |||
115 | #define YUV2RGBFUNC(func_name, dst_type, alpha) \ |
||
116 | static int func_name(SwsContext *c, const uint8_t *src[], \ |
||
117 | int srcStride[], int srcSliceY, int srcSliceH, \ |
||
118 | uint8_t *dst[], int dstStride[]) \ |
||
119 | { \ |
||
120 | int y; \ |
||
121 | \ |
||
122 | if (!alpha && c->srcFormat == AV_PIX_FMT_YUV422P) { \ |
||
123 | srcStride[1] *= 2; \ |
||
124 | srcStride[2] *= 2; \ |
||
125 | } \ |
||
126 | for (y = 0; y < srcSliceH; y += 2) { \ |
||
127 | dst_type *dst_1 = \ |
||
128 | (dst_type *)(dst[0] + (y + srcSliceY) * dstStride[0]); \ |
||
129 | dst_type *dst_2 = \ |
||
130 | (dst_type *)(dst[0] + (y + srcSliceY + 1) * dstStride[0]); \ |
||
131 | dst_type av_unused *r, *g, *b; \ |
||
132 | const uint8_t *py_1 = src[0] + y * srcStride[0]; \ |
||
133 | const uint8_t *py_2 = py_1 + srcStride[0]; \ |
||
134 | const uint8_t *pu = src[1] + (y >> 1) * srcStride[1]; \ |
||
135 | const uint8_t *pv = src[2] + (y >> 1) * srcStride[2]; \ |
||
136 | const uint8_t av_unused *pa_1, *pa_2; \ |
||
137 | unsigned int h_size = c->dstW >> 3; \ |
||
138 | if (alpha) { \ |
||
139 | pa_1 = src[3] + y * srcStride[3]; \ |
||
140 | pa_2 = pa_1 + srcStride[3]; \ |
||
141 | } \ |
||
142 | while (h_size--) { \ |
||
143 | int av_unused U, V, Y; \ |
||
144 | |||
145 | #define ENDYUV2RGBLINE(dst_delta, ss) \ |
||
146 | pu += 4 >> ss; \ |
||
147 | pv += 4 >> ss; \ |
||
148 | py_1 += 8 >> ss; \ |
||
149 | py_2 += 8 >> ss; \ |
||
150 | dst_1 += dst_delta >> ss; \ |
||
151 | dst_2 += dst_delta >> ss; \ |
||
152 | } \ |
||
153 | if (c->dstW & (4 >> ss)) { \ |
||
154 | int av_unused Y, U, V; \ |
||
155 | |||
156 | #define ENDYUV2RGBFUNC() \ |
||
157 | } \ |
||
158 | } \ |
||
159 | return srcSliceH; \ |
||
160 | } |
||
161 | |||
162 | #define CLOSEYUV2RGBFUNC(dst_delta) \ |
||
163 | ENDYUV2RGBLINE(dst_delta, 0) \ |
||
164 | ENDYUV2RGBFUNC() |
||
165 | |||
166 | YUV2RGBFUNC(yuv2rgb_c_48, uint8_t, 0) |
||
167 | LOADCHROMA(0); |
||
168 | PUTRGB48(dst_1, py_1, 0); |
||
169 | PUTRGB48(dst_2, py_2, 0); |
||
170 | |||
171 | LOADCHROMA(1); |
||
172 | PUTRGB48(dst_2, py_2, 1); |
||
173 | PUTRGB48(dst_1, py_1, 1); |
||
174 | |||
175 | LOADCHROMA(2); |
||
176 | PUTRGB48(dst_1, py_1, 2); |
||
177 | PUTRGB48(dst_2, py_2, 2); |
||
178 | |||
179 | LOADCHROMA(3); |
||
180 | PUTRGB48(dst_2, py_2, 3); |
||
181 | PUTRGB48(dst_1, py_1, 3); |
||
182 | ENDYUV2RGBLINE(48, 0) |
||
183 | LOADCHROMA(0); |
||
184 | PUTRGB48(dst_1, py_1, 0); |
||
185 | PUTRGB48(dst_2, py_2, 0); |
||
186 | |||
187 | LOADCHROMA(1); |
||
188 | PUTRGB48(dst_2, py_2, 1); |
||
189 | PUTRGB48(dst_1, py_1, 1); |
||
190 | ENDYUV2RGBLINE(48, 1) |
||
191 | LOADCHROMA(0); |
||
192 | PUTRGB48(dst_1, py_1, 0); |
||
193 | PUTRGB48(dst_2, py_2, 0); |
||
194 | ENDYUV2RGBFUNC() |
||
195 | |||
196 | YUV2RGBFUNC(yuv2rgb_c_bgr48, uint8_t, 0) |
||
197 | LOADCHROMA(0); |
||
198 | PUTBGR48(dst_1, py_1, 0); |
||
199 | PUTBGR48(dst_2, py_2, 0); |
||
200 | |||
201 | LOADCHROMA(1); |
||
202 | PUTBGR48(dst_2, py_2, 1); |
||
203 | PUTBGR48(dst_1, py_1, 1); |
||
204 | |||
205 | LOADCHROMA(2); |
||
206 | PUTBGR48(dst_1, py_1, 2); |
||
207 | PUTBGR48(dst_2, py_2, 2); |
||
208 | |||
209 | LOADCHROMA(3); |
||
210 | PUTBGR48(dst_2, py_2, 3); |
||
211 | PUTBGR48(dst_1, py_1, 3); |
||
212 | ENDYUV2RGBLINE(48, 0) |
||
213 | LOADCHROMA(0); |
||
214 | PUTBGR48(dst_1, py_1, 0); |
||
215 | PUTBGR48(dst_2, py_2, 0); |
||
216 | |||
217 | LOADCHROMA(1); |
||
218 | PUTBGR48(dst_2, py_2, 1); |
||
219 | PUTBGR48(dst_1, py_1, 1); |
||
220 | ENDYUV2RGBLINE(48, 1) |
||
221 | LOADCHROMA(0); |
||
222 | PUTBGR48(dst_1, py_1, 0); |
||
223 | PUTBGR48(dst_2, py_2, 0); |
||
224 | ENDYUV2RGBFUNC() |
||
225 | |||
226 | YUV2RGBFUNC(yuv2rgb_c_32, uint32_t, 0) |
||
227 | LOADCHROMA(0); |
||
228 | PUTRGB(dst_1, py_1, 0); |
||
229 | PUTRGB(dst_2, py_2, 0); |
||
230 | |||
231 | LOADCHROMA(1); |
||
232 | PUTRGB(dst_2, py_2, 1); |
||
233 | PUTRGB(dst_1, py_1, 1); |
||
234 | |||
235 | LOADCHROMA(2); |
||
236 | PUTRGB(dst_1, py_1, 2); |
||
237 | PUTRGB(dst_2, py_2, 2); |
||
238 | |||
239 | LOADCHROMA(3); |
||
240 | PUTRGB(dst_2, py_2, 3); |
||
241 | PUTRGB(dst_1, py_1, 3); |
||
242 | ENDYUV2RGBLINE(8, 0) |
||
243 | LOADCHROMA(0); |
||
244 | PUTRGB(dst_1, py_1, 0); |
||
245 | PUTRGB(dst_2, py_2, 0); |
||
246 | |||
247 | LOADCHROMA(1); |
||
248 | PUTRGB(dst_2, py_2, 1); |
||
249 | PUTRGB(dst_1, py_1, 1); |
||
250 | ENDYUV2RGBLINE(8, 1) |
||
251 | LOADCHROMA(0); |
||
252 | PUTRGB(dst_1, py_1, 0); |
||
253 | PUTRGB(dst_2, py_2, 0); |
||
254 | ENDYUV2RGBFUNC() |
||
255 | |||
256 | YUV2RGBFUNC(yuva2rgba_c, uint32_t, 1) |
||
257 | LOADCHROMA(0); |
||
258 | PUTRGBA(dst_1, py_1, pa_1, 0, 24); |
||
259 | PUTRGBA(dst_2, py_2, pa_2, 0, 24); |
||
260 | |||
261 | LOADCHROMA(1); |
||
262 | PUTRGBA(dst_2, py_2, pa_2, 1, 24); |
||
263 | PUTRGBA(dst_1, py_1, pa_1, 1, 24); |
||
264 | |||
265 | LOADCHROMA(2); |
||
266 | PUTRGBA(dst_1, py_1, pa_1, 2, 24); |
||
267 | PUTRGBA(dst_2, py_2, pa_2, 2, 24); |
||
268 | |||
269 | LOADCHROMA(3); |
||
270 | PUTRGBA(dst_2, py_2, pa_2, 3, 24); |
||
271 | PUTRGBA(dst_1, py_1, pa_1, 3, 24); |
||
272 | pa_1 += 8; |
||
273 | pa_2 += 8; |
||
274 | ENDYUV2RGBLINE(8, 0) |
||
275 | LOADCHROMA(0); |
||
276 | PUTRGBA(dst_1, py_1, pa_1, 0, 24); |
||
277 | PUTRGBA(dst_2, py_2, pa_2, 0, 24); |
||
278 | |||
279 | LOADCHROMA(1); |
||
280 | PUTRGBA(dst_2, py_2, pa_2, 1, 24); |
||
281 | PUTRGBA(dst_1, py_1, pa_1, 1, 24); |
||
282 | pa_1 += 4; |
||
283 | pa_2 += 4; |
||
284 | ENDYUV2RGBLINE(8, 1) |
||
285 | LOADCHROMA(0); |
||
286 | PUTRGBA(dst_1, py_1, pa_1, 0, 24); |
||
287 | PUTRGBA(dst_2, py_2, pa_2, 0, 24); |
||
288 | ENDYUV2RGBFUNC() |
||
289 | |||
290 | YUV2RGBFUNC(yuva2argb_c, uint32_t, 1) |
||
291 | LOADCHROMA(0); |
||
292 | PUTRGBA(dst_1, py_1, pa_1, 0, 0); |
||
293 | PUTRGBA(dst_2, py_2, pa_2, 0, 0); |
||
294 | |||
295 | LOADCHROMA(1); |
||
296 | PUTRGBA(dst_2, py_2, pa_2, 1, 0); |
||
297 | PUTRGBA(dst_1, py_1, pa_1, 1, 0); |
||
298 | |||
299 | LOADCHROMA(2); |
||
300 | PUTRGBA(dst_1, py_1, pa_1, 2, 0); |
||
301 | PUTRGBA(dst_2, py_2, pa_2, 2, 0); |
||
302 | |||
303 | LOADCHROMA(3); |
||
304 | PUTRGBA(dst_2, py_2, pa_2, 3, 0); |
||
305 | PUTRGBA(dst_1, py_1, pa_1, 3, 0); |
||
306 | pa_1 += 8; |
||
307 | pa_2 += 8; |
||
308 | ENDYUV2RGBLINE(8, 0) |
||
309 | LOADCHROMA(0); |
||
310 | PUTRGBA(dst_1, py_1, pa_1, 0, 0); |
||
311 | PUTRGBA(dst_2, py_2, pa_2, 0, 0); |
||
312 | |||
313 | LOADCHROMA(1); |
||
314 | PUTRGBA(dst_2, py_2, pa_2, 1, 0); |
||
315 | PUTRGBA(dst_1, py_1, pa_1, 1, 0); |
||
316 | pa_1 += 4; |
||
317 | pa_2 += 4; |
||
318 | ENDYUV2RGBLINE(8, 1) |
||
319 | LOADCHROMA(0); |
||
320 | PUTRGBA(dst_1, py_1, pa_1, 0, 0); |
||
321 | PUTRGBA(dst_2, py_2, pa_2, 0, 0); |
||
322 | ENDYUV2RGBFUNC() |
||
323 | |||
324 | YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, 0) |
||
325 | LOADCHROMA(0); |
||
326 | PUTRGB24(dst_1, py_1, 0); |
||
327 | PUTRGB24(dst_2, py_2, 0); |
||
328 | |||
329 | LOADCHROMA(1); |
||
330 | PUTRGB24(dst_2, py_2, 1); |
||
331 | PUTRGB24(dst_1, py_1, 1); |
||
332 | |||
333 | LOADCHROMA(2); |
||
334 | PUTRGB24(dst_1, py_1, 2); |
||
335 | PUTRGB24(dst_2, py_2, 2); |
||
336 | |||
337 | LOADCHROMA(3); |
||
338 | PUTRGB24(dst_2, py_2, 3); |
||
339 | PUTRGB24(dst_1, py_1, 3); |
||
340 | ENDYUV2RGBLINE(24, 0) |
||
341 | LOADCHROMA(0); |
||
342 | PUTRGB24(dst_1, py_1, 0); |
||
343 | PUTRGB24(dst_2, py_2, 0); |
||
344 | |||
345 | LOADCHROMA(1); |
||
346 | PUTRGB24(dst_2, py_2, 1); |
||
347 | PUTRGB24(dst_1, py_1, 1); |
||
348 | ENDYUV2RGBLINE(24, 1) |
||
349 | LOADCHROMA(0); |
||
350 | PUTRGB24(dst_1, py_1, 0); |
||
351 | PUTRGB24(dst_2, py_2, 0); |
||
352 | ENDYUV2RGBFUNC() |
||
353 | |||
354 | // only trivial mods from yuv2rgb_c_24_rgb |
||
355 | YUV2RGBFUNC(yuv2rgb_c_24_bgr, uint8_t, 0) |
||
356 | LOADCHROMA(0); |
||
357 | PUTBGR24(dst_1, py_1, 0); |
||
358 | PUTBGR24(dst_2, py_2, 0); |
||
359 | |||
360 | LOADCHROMA(1); |
||
361 | PUTBGR24(dst_2, py_2, 1); |
||
362 | PUTBGR24(dst_1, py_1, 1); |
||
363 | |||
364 | LOADCHROMA(2); |
||
365 | PUTBGR24(dst_1, py_1, 2); |
||
366 | PUTBGR24(dst_2, py_2, 2); |
||
367 | |||
368 | LOADCHROMA(3); |
||
369 | PUTBGR24(dst_2, py_2, 3); |
||
370 | PUTBGR24(dst_1, py_1, 3); |
||
371 | ENDYUV2RGBLINE(24, 0) |
||
372 | LOADCHROMA(0); |
||
373 | PUTBGR24(dst_1, py_1, 0); |
||
374 | PUTBGR24(dst_2, py_2, 0); |
||
375 | |||
376 | LOADCHROMA(1); |
||
377 | PUTBGR24(dst_2, py_2, 1); |
||
378 | PUTBGR24(dst_1, py_1, 1); |
||
379 | ENDYUV2RGBLINE(24, 1) |
||
380 | LOADCHROMA(0); |
||
381 | PUTBGR24(dst_1, py_1, 0); |
||
382 | PUTBGR24(dst_2, py_2, 0); |
||
383 | ENDYUV2RGBFUNC() |
||
384 | |||
385 | YUV2RGBFUNC(yuv2rgb_c_16_ordered_dither, uint16_t, 0) |
||
386 | const uint8_t *d16 = ff_dither_2x2_8[y & 1]; |
||
387 | const uint8_t *e16 = ff_dither_2x2_4[y & 1]; |
||
388 | const uint8_t *f16 = ff_dither_2x2_8[(y & 1)^1]; |
||
389 | |||
390 | #define PUTRGB16(dst, src, i, o) \ |
||
391 | Y = src[2 * i]; \ |
||
392 | dst[2 * i] = r[Y + d16[0 + o]] + \ |
||
393 | g[Y + e16[0 + o]] + \ |
||
394 | b[Y + f16[0 + o]]; \ |
||
395 | Y = src[2 * i + 1]; \ |
||
396 | dst[2 * i + 1] = r[Y + d16[1 + o]] + \ |
||
397 | g[Y + e16[1 + o]] + \ |
||
398 | b[Y + f16[1 + o]]; |
||
399 | LOADCHROMA(0); |
||
400 | PUTRGB16(dst_1, py_1, 0, 0); |
||
401 | PUTRGB16(dst_2, py_2, 0, 0 + 8); |
||
402 | |||
403 | LOADCHROMA(1); |
||
404 | PUTRGB16(dst_2, py_2, 1, 2 + 8); |
||
405 | PUTRGB16(dst_1, py_1, 1, 2); |
||
406 | |||
407 | LOADCHROMA(2); |
||
408 | PUTRGB16(dst_1, py_1, 2, 4); |
||
409 | PUTRGB16(dst_2, py_2, 2, 4 + 8); |
||
410 | |||
411 | LOADCHROMA(3); |
||
412 | PUTRGB16(dst_2, py_2, 3, 6 + 8); |
||
413 | PUTRGB16(dst_1, py_1, 3, 6); |
||
414 | CLOSEYUV2RGBFUNC(8) |
||
415 | |||
416 | YUV2RGBFUNC(yuv2rgb_c_15_ordered_dither, uint16_t, 0) |
||
417 | const uint8_t *d16 = ff_dither_2x2_8[y & 1]; |
||
418 | const uint8_t *e16 = ff_dither_2x2_8[(y & 1)^1]; |
||
419 | |||
420 | #define PUTRGB15(dst, src, i, o) \ |
||
421 | Y = src[2 * i]; \ |
||
422 | dst[2 * i] = r[Y + d16[0 + o]] + \ |
||
423 | g[Y + d16[1 + o]] + \ |
||
424 | b[Y + e16[0 + o]]; \ |
||
425 | Y = src[2 * i + 1]; \ |
||
426 | dst[2 * i + 1] = r[Y + d16[1 + o]] + \ |
||
427 | g[Y + d16[0 + o]] + \ |
||
428 | b[Y + e16[1 + o]]; |
||
429 | LOADCHROMA(0); |
||
430 | PUTRGB15(dst_1, py_1, 0, 0); |
||
431 | PUTRGB15(dst_2, py_2, 0, 0 + 8); |
||
432 | |||
433 | LOADCHROMA(1); |
||
434 | PUTRGB15(dst_2, py_2, 1, 2 + 8); |
||
435 | PUTRGB15(dst_1, py_1, 1, 2); |
||
436 | |||
437 | LOADCHROMA(2); |
||
438 | PUTRGB15(dst_1, py_1, 2, 4); |
||
439 | PUTRGB15(dst_2, py_2, 2, 4 + 8); |
||
440 | |||
441 | LOADCHROMA(3); |
||
442 | PUTRGB15(dst_2, py_2, 3, 6 + 8); |
||
443 | PUTRGB15(dst_1, py_1, 3, 6); |
||
444 | CLOSEYUV2RGBFUNC(8) |
||
445 | |||
446 | // r, g, b, dst_1, dst_2 |
||
447 | YUV2RGBFUNC(yuv2rgb_c_12_ordered_dither, uint16_t, 0) |
||
448 | const uint8_t *d16 = ff_dither_4x4_16[y & 3]; |
||
449 | |||
450 | #define PUTRGB12(dst, src, i, o) \ |
||
451 | Y = src[2 * i]; \ |
||
452 | dst[2 * i] = r[Y + d16[0 + o]] + \ |
||
453 | g[Y + d16[0 + o]] + \ |
||
454 | b[Y + d16[0 + o]]; \ |
||
455 | Y = src[2 * i + 1]; \ |
||
456 | dst[2 * i + 1] = r[Y + d16[1 + o]] + \ |
||
457 | g[Y + d16[1 + o]] + \ |
||
458 | b[Y + d16[1 + o]]; |
||
459 | |||
460 | LOADCHROMA(0); |
||
461 | PUTRGB12(dst_1, py_1, 0, 0); |
||
462 | PUTRGB12(dst_2, py_2, 0, 0 + 8); |
||
463 | |||
464 | LOADCHROMA(1); |
||
465 | PUTRGB12(dst_2, py_2, 1, 2 + 8); |
||
466 | PUTRGB12(dst_1, py_1, 1, 2); |
||
467 | |||
468 | LOADCHROMA(2); |
||
469 | PUTRGB12(dst_1, py_1, 2, 4); |
||
470 | PUTRGB12(dst_2, py_2, 2, 4 + 8); |
||
471 | |||
472 | LOADCHROMA(3); |
||
473 | PUTRGB12(dst_2, py_2, 3, 6 + 8); |
||
474 | PUTRGB12(dst_1, py_1, 3, 6); |
||
475 | CLOSEYUV2RGBFUNC(8) |
||
476 | |||
477 | // r, g, b, dst_1, dst_2 |
||
478 | YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t, 0) |
||
479 | const uint8_t *d32 = ff_dither_8x8_32[y & 7]; |
||
480 | const uint8_t *d64 = ff_dither_8x8_73[y & 7]; |
||
481 | |||
482 | #define PUTRGB8(dst, src, i, o) \ |
||
483 | Y = src[2 * i]; \ |
||
484 | dst[2 * i] = r[Y + d32[0 + o]] + \ |
||
485 | g[Y + d32[0 + o]] + \ |
||
486 | b[Y + d64[0 + o]]; \ |
||
487 | Y = src[2 * i + 1]; \ |
||
488 | dst[2 * i + 1] = r[Y + d32[1 + o]] + \ |
||
489 | g[Y + d32[1 + o]] + \ |
||
490 | b[Y + d64[1 + o]]; |
||
491 | |||
492 | LOADCHROMA(0); |
||
493 | PUTRGB8(dst_1, py_1, 0, 0); |
||
494 | PUTRGB8(dst_2, py_2, 0, 0 + 8); |
||
495 | |||
496 | LOADCHROMA(1); |
||
497 | PUTRGB8(dst_2, py_2, 1, 2 + 8); |
||
498 | PUTRGB8(dst_1, py_1, 1, 2); |
||
499 | |||
500 | LOADCHROMA(2); |
||
501 | PUTRGB8(dst_1, py_1, 2, 4); |
||
502 | PUTRGB8(dst_2, py_2, 2, 4 + 8); |
||
503 | |||
504 | LOADCHROMA(3); |
||
505 | PUTRGB8(dst_2, py_2, 3, 6 + 8); |
||
506 | PUTRGB8(dst_1, py_1, 3, 6); |
||
507 | CLOSEYUV2RGBFUNC(8) |
||
508 | |||
509 | YUV2RGBFUNC(yuv2rgb_c_4_ordered_dither, uint8_t, 0) |
||
510 | const uint8_t * d64 = ff_dither_8x8_73[y & 7]; |
||
511 | const uint8_t *d128 = ff_dither_8x8_220[y & 7]; |
||
512 | int acc; |
||
513 | |||
514 | #define PUTRGB4D(dst, src, i, o) \ |
||
515 | Y = src[2 * i]; \ |
||
516 | acc = r[Y + d128[0 + o]] + \ |
||
517 | g[Y + d64[0 + o]] + \ |
||
518 | b[Y + d128[0 + o]]; \ |
||
519 | Y = src[2 * i + 1]; \ |
||
520 | acc |= (r[Y + d128[1 + o]] + \ |
||
521 | g[Y + d64[1 + o]] + \ |
||
522 | b[Y + d128[1 + o]]) << 4; \ |
||
523 | dst[i] = acc; |
||
524 | |||
525 | LOADCHROMA(0); |
||
526 | PUTRGB4D(dst_1, py_1, 0, 0); |
||
527 | PUTRGB4D(dst_2, py_2, 0, 0 + 8); |
||
528 | |||
529 | LOADCHROMA(1); |
||
530 | PUTRGB4D(dst_2, py_2, 1, 2 + 8); |
||
531 | PUTRGB4D(dst_1, py_1, 1, 2); |
||
532 | |||
533 | LOADCHROMA(2); |
||
534 | PUTRGB4D(dst_1, py_1, 2, 4); |
||
535 | PUTRGB4D(dst_2, py_2, 2, 4 + 8); |
||
536 | |||
537 | LOADCHROMA(3); |
||
538 | PUTRGB4D(dst_2, py_2, 3, 6 + 8); |
||
539 | PUTRGB4D(dst_1, py_1, 3, 6); |
||
540 | CLOSEYUV2RGBFUNC(4) |
||
541 | |||
542 | YUV2RGBFUNC(yuv2rgb_c_4b_ordered_dither, uint8_t, 0) |
||
543 | const uint8_t *d64 = ff_dither_8x8_73[y & 7]; |
||
544 | const uint8_t *d128 = ff_dither_8x8_220[y & 7]; |
||
545 | |||
546 | #define PUTRGB4DB(dst, src, i, o) \ |
||
547 | Y = src[2 * i]; \ |
||
548 | dst[2 * i] = r[Y + d128[0 + o]] + \ |
||
549 | g[Y + d64[0 + o]] + \ |
||
550 | b[Y + d128[0 + o]]; \ |
||
551 | Y = src[2 * i + 1]; \ |
||
552 | dst[2 * i + 1] = r[Y + d128[1 + o]] + \ |
||
553 | g[Y + d64[1 + o]] + \ |
||
554 | b[Y + d128[1 + o]]; |
||
555 | |||
556 | LOADCHROMA(0); |
||
557 | PUTRGB4DB(dst_1, py_1, 0, 0); |
||
558 | PUTRGB4DB(dst_2, py_2, 0, 0 + 8); |
||
559 | |||
560 | LOADCHROMA(1); |
||
561 | PUTRGB4DB(dst_2, py_2, 1, 2 + 8); |
||
562 | PUTRGB4DB(dst_1, py_1, 1, 2); |
||
563 | |||
564 | LOADCHROMA(2); |
||
565 | PUTRGB4DB(dst_1, py_1, 2, 4); |
||
566 | PUTRGB4DB(dst_2, py_2, 2, 4 + 8); |
||
567 | |||
568 | LOADCHROMA(3); |
||
569 | PUTRGB4DB(dst_2, py_2, 3, 6 + 8); |
||
570 | PUTRGB4DB(dst_1, py_1, 3, 6); |
||
571 | CLOSEYUV2RGBFUNC(8) |
||
572 | |||
573 | YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0) |
||
574 | const uint8_t *d128 = ff_dither_8x8_220[y & 7]; |
||
575 | char out_1 = 0, out_2 = 0; |
||
576 | g = c->table_gU[128 + YUVRGB_TABLE_HEADROOM] + c->table_gV[128 + YUVRGB_TABLE_HEADROOM]; |
||
577 | |||
578 | #define PUTRGB1(out, src, i, o) \ |
||
579 | Y = src[2 * i]; \ |
||
580 | out += out + g[Y + d128[0 + o]]; \ |
||
581 | Y = src[2 * i + 1]; \ |
||
582 | out += out + g[Y + d128[1 + o]]; |
||
583 | |||
584 | PUTRGB1(out_1, py_1, 0, 0); |
||
585 | PUTRGB1(out_2, py_2, 0, 0 + 8); |
||
586 | |||
587 | PUTRGB1(out_2, py_2, 1, 2 + 8); |
||
588 | PUTRGB1(out_1, py_1, 1, 2); |
||
589 | |||
590 | PUTRGB1(out_1, py_1, 2, 4); |
||
591 | PUTRGB1(out_2, py_2, 2, 4 + 8); |
||
592 | |||
593 | PUTRGB1(out_2, py_2, 3, 6 + 8); |
||
594 | PUTRGB1(out_1, py_1, 3, 6); |
||
595 | |||
596 | dst_1[0] = out_1; |
||
597 | dst_2[0] = out_2; |
||
598 | CLOSEYUV2RGBFUNC(1) |
||
599 | |||
600 | SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c) |
||
601 | { |
||
602 | SwsFunc t = NULL; |
||
603 | |||
604 | if (ARCH_BFIN) |
||
605 | t = ff_yuv2rgb_init_bfin(c); |
||
606 | if (ARCH_PPC) |
||
607 | t = ff_yuv2rgb_init_ppc(c); |
||
608 | if (HAVE_VIS) |
||
609 | t = ff_yuv2rgb_init_vis(c); |
||
610 | if (ARCH_X86) |
||
611 | t = ff_yuv2rgb_init_x86(c); |
||
612 | |||
613 | if (t) |
||
614 | return t; |
||
615 | |||
616 | av_log(c, AV_LOG_WARNING, |
||
617 | "No accelerated colorspace conversion found from %s to %s.\n", |
||
618 | av_get_pix_fmt_name(c->srcFormat), av_get_pix_fmt_name(c->dstFormat)); |
||
619 | |||
620 | switch (c->dstFormat) { |
||
621 | case AV_PIX_FMT_BGR48BE: |
||
622 | case AV_PIX_FMT_BGR48LE: |
||
623 | return yuv2rgb_c_bgr48; |
||
624 | case AV_PIX_FMT_RGB48BE: |
||
625 | case AV_PIX_FMT_RGB48LE: |
||
626 | return yuv2rgb_c_48; |
||
627 | case AV_PIX_FMT_ARGB: |
||
628 | case AV_PIX_FMT_ABGR: |
||
629 | if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) |
||
630 | return yuva2argb_c; |
||
631 | case AV_PIX_FMT_RGBA: |
||
632 | case AV_PIX_FMT_BGRA: |
||
633 | return (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) ? yuva2rgba_c : yuv2rgb_c_32; |
||
634 | case AV_PIX_FMT_RGB24: |
||
635 | return yuv2rgb_c_24_rgb; |
||
636 | case AV_PIX_FMT_BGR24: |
||
637 | return yuv2rgb_c_24_bgr; |
||
638 | case AV_PIX_FMT_RGB565: |
||
639 | case AV_PIX_FMT_BGR565: |
||
640 | return yuv2rgb_c_16_ordered_dither; |
||
641 | case AV_PIX_FMT_RGB555: |
||
642 | case AV_PIX_FMT_BGR555: |
||
643 | return yuv2rgb_c_15_ordered_dither; |
||
644 | case AV_PIX_FMT_RGB444: |
||
645 | case AV_PIX_FMT_BGR444: |
||
646 | return yuv2rgb_c_12_ordered_dither; |
||
647 | case AV_PIX_FMT_RGB8: |
||
648 | case AV_PIX_FMT_BGR8: |
||
649 | return yuv2rgb_c_8_ordered_dither; |
||
650 | case AV_PIX_FMT_RGB4: |
||
651 | case AV_PIX_FMT_BGR4: |
||
652 | return yuv2rgb_c_4_ordered_dither; |
||
653 | case AV_PIX_FMT_RGB4_BYTE: |
||
654 | case AV_PIX_FMT_BGR4_BYTE: |
||
655 | return yuv2rgb_c_4b_ordered_dither; |
||
656 | case AV_PIX_FMT_MONOBLACK: |
||
657 | return yuv2rgb_c_1_ordered_dither; |
||
658 | } |
||
659 | return NULL; |
||
660 | } |
||
661 | |||
662 | static void fill_table(uint8_t* table[256 + 2*YUVRGB_TABLE_HEADROOM], const int elemsize, |
||
663 | const int64_t inc, void *y_tab) |
||
664 | { |
||
665 | int i; |
||
666 | uint8_t *y_table = y_tab; |
||
667 | |||
668 | y_table -= elemsize * (inc >> 9); |
||
669 | |||
670 | for (i = 0; i < 256 + 2*YUVRGB_TABLE_HEADROOM; i++) { |
||
671 | int64_t cb = av_clip(i-YUVRGB_TABLE_HEADROOM, 0, 255)*inc; |
||
672 | table[i] = y_table + elemsize * (cb >> 16); |
||
673 | } |
||
674 | } |
||
675 | |||
676 | static void fill_gv_table(int table[256 + 2*YUVRGB_TABLE_HEADROOM], const int elemsize, const int64_t inc) |
||
677 | { |
||
678 | int i; |
||
679 | int off = -(inc >> 9); |
||
680 | |||
681 | for (i = 0; i < 256 + 2*YUVRGB_TABLE_HEADROOM; i++) { |
||
682 | int64_t cb = av_clip(i-YUVRGB_TABLE_HEADROOM, 0, 255)*inc; |
||
683 | table[i] = elemsize * (off + (cb >> 16)); |
||
684 | } |
||
685 | } |
||
686 | |||
687 | static uint16_t roundToInt16(int64_t f) |
||
688 | { |
||
689 | int r = (f + (1 << 15)) >> 16; |
||
690 | |||
691 | if (r < -0x7FFF) |
||
692 | return 0x8000; |
||
693 | else if (r > 0x7FFF) |
||
694 | return 0x7FFF; |
||
695 | else |
||
696 | return r; |
||
697 | } |
||
698 | |||
699 | av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], |
||
700 | int fullRange, int brightness, |
||
701 | int contrast, int saturation) |
||
702 | { |
||
703 | const int isRgb = c->dstFormat == AV_PIX_FMT_RGB32 || |
||
704 | c->dstFormat == AV_PIX_FMT_RGB32_1 || |
||
705 | c->dstFormat == AV_PIX_FMT_BGR24 || |
||
706 | c->dstFormat == AV_PIX_FMT_RGB565BE || |
||
707 | c->dstFormat == AV_PIX_FMT_RGB565LE || |
||
708 | c->dstFormat == AV_PIX_FMT_RGB555BE || |
||
709 | c->dstFormat == AV_PIX_FMT_RGB555LE || |
||
710 | c->dstFormat == AV_PIX_FMT_RGB444BE || |
||
711 | c->dstFormat == AV_PIX_FMT_RGB444LE || |
||
712 | c->dstFormat == AV_PIX_FMT_RGB8 || |
||
713 | c->dstFormat == AV_PIX_FMT_RGB4 || |
||
714 | c->dstFormat == AV_PIX_FMT_RGB4_BYTE || |
||
715 | c->dstFormat == AV_PIX_FMT_MONOBLACK; |
||
716 | const int isNotNe = c->dstFormat == AV_PIX_FMT_NE(RGB565LE, RGB565BE) || |
||
717 | c->dstFormat == AV_PIX_FMT_NE(RGB555LE, RGB555BE) || |
||
718 | c->dstFormat == AV_PIX_FMT_NE(RGB444LE, RGB444BE) || |
||
719 | c->dstFormat == AV_PIX_FMT_NE(BGR565LE, BGR565BE) || |
||
720 | c->dstFormat == AV_PIX_FMT_NE(BGR555LE, BGR555BE) || |
||
721 | c->dstFormat == AV_PIX_FMT_NE(BGR444LE, BGR444BE); |
||
722 | const int bpp = c->dstFormatBpp; |
||
723 | uint8_t *y_table; |
||
724 | uint16_t *y_table16; |
||
725 | uint32_t *y_table32; |
||
726 | int i, base, rbase, gbase, bbase, av_uninit(abase), needAlpha; |
||
727 | const int yoffs = fullRange ? 384 : 326; |
||
728 | |||
729 | int64_t crv = inv_table[0]; |
||
730 | int64_t cbu = inv_table[1]; |
||
731 | int64_t cgu = -inv_table[2]; |
||
732 | int64_t cgv = -inv_table[3]; |
||
733 | int64_t cy = 1 << 16; |
||
734 | int64_t oy = 0; |
||
735 | int64_t yb = 0; |
||
736 | |||
737 | if (!fullRange) { |
||
738 | cy = (cy * 255) / 219; |
||
739 | oy = 16 << 16; |
||
740 | } else { |
||
741 | crv = (crv * 224) / 255; |
||
742 | cbu = (cbu * 224) / 255; |
||
743 | cgu = (cgu * 224) / 255; |
||
744 | cgv = (cgv * 224) / 255; |
||
745 | } |
||
746 | |||
747 | cy = (cy * contrast) >> 16; |
||
748 | crv = (crv * contrast * saturation) >> 32; |
||
749 | cbu = (cbu * contrast * saturation) >> 32; |
||
750 | cgu = (cgu * contrast * saturation) >> 32; |
||
751 | cgv = (cgv * contrast * saturation) >> 32; |
||
752 | oy -= 256 * brightness; |
||
753 | |||
754 | c->uOffset = 0x0400040004000400LL; |
||
755 | c->vOffset = 0x0400040004000400LL; |
||
756 | c->yCoeff = roundToInt16(cy * 8192) * 0x0001000100010001ULL; |
||
757 | c->vrCoeff = roundToInt16(crv * 8192) * 0x0001000100010001ULL; |
||
758 | c->ubCoeff = roundToInt16(cbu * 8192) * 0x0001000100010001ULL; |
||
759 | c->vgCoeff = roundToInt16(cgv * 8192) * 0x0001000100010001ULL; |
||
760 | c->ugCoeff = roundToInt16(cgu * 8192) * 0x0001000100010001ULL; |
||
761 | c->yOffset = roundToInt16(oy * 8) * 0x0001000100010001ULL; |
||
762 | |||
763 | c->yuv2rgb_y_coeff = (int16_t)roundToInt16(cy << 13); |
||
764 | c->yuv2rgb_y_offset = (int16_t)roundToInt16(oy << 9); |
||
765 | c->yuv2rgb_v2r_coeff = (int16_t)roundToInt16(crv << 13); |
||
766 | c->yuv2rgb_v2g_coeff = (int16_t)roundToInt16(cgv << 13); |
||
767 | c->yuv2rgb_u2g_coeff = (int16_t)roundToInt16(cgu << 13); |
||
768 | c->yuv2rgb_u2b_coeff = (int16_t)roundToInt16(cbu << 13); |
||
769 | |||
770 | //scale coefficients by cy |
||
771 | crv = ((crv << 16) + 0x8000) / FFMAX(cy, 1); |
||
772 | cbu = ((cbu << 16) + 0x8000) / FFMAX(cy, 1); |
||
773 | cgu = ((cgu << 16) + 0x8000) / FFMAX(cy, 1); |
||
774 | cgv = ((cgv << 16) + 0x8000) / FFMAX(cy, 1); |
||
775 | |||
776 | av_freep(&c->yuvTable); |
||
777 | |||
778 | switch (bpp) { |
||
779 | case 1: |
||
780 | c->yuvTable = av_malloc(1024); |
||
781 | y_table = c->yuvTable; |
||
782 | yb = -(384 << 16) - oy; |
||
783 | for (i = 0; i < 1024 - 110; i++) { |
||
784 | y_table[i + 110] = av_clip_uint8((yb + 0x8000) >> 16) >> 7; |
||
785 | yb += cy; |
||
786 | } |
||
787 | fill_table(c->table_gU, 1, cgu, y_table + yoffs); |
||
788 | fill_gv_table(c->table_gV, 1, cgv); |
||
789 | break; |
||
790 | case 4: |
||
791 | case 4 | 128: |
||
792 | rbase = isRgb ? 3 : 0; |
||
793 | gbase = 1; |
||
794 | bbase = isRgb ? 0 : 3; |
||
795 | c->yuvTable = av_malloc(1024 * 3); |
||
796 | y_table = c->yuvTable; |
||
797 | yb = -(384 << 16) - oy; |
||
798 | for (i = 0; i < 1024 - 110; i++) { |
||
799 | int yval = av_clip_uint8((yb + 0x8000) >> 16); |
||
800 | y_table[i + 110] = (yval >> 7) << rbase; |
||
801 | y_table[i + 37 + 1024] = ((yval + 43) / 85) << gbase; |
||
802 | y_table[i + 110 + 2048] = (yval >> 7) << bbase; |
||
803 | yb += cy; |
||
804 | } |
||
805 | fill_table(c->table_rV, 1, crv, y_table + yoffs); |
||
806 | fill_table(c->table_gU, 1, cgu, y_table + yoffs + 1024); |
||
807 | fill_table(c->table_bU, 1, cbu, y_table + yoffs + 2048); |
||
808 | fill_gv_table(c->table_gV, 1, cgv); |
||
809 | break; |
||
810 | case 8: |
||
811 | rbase = isRgb ? 5 : 0; |
||
812 | gbase = isRgb ? 2 : 3; |
||
813 | bbase = isRgb ? 0 : 6; |
||
814 | c->yuvTable = av_malloc(1024 * 3); |
||
815 | y_table = c->yuvTable; |
||
816 | yb = -(384 << 16) - oy; |
||
817 | for (i = 0; i < 1024 - 38; i++) { |
||
818 | int yval = av_clip_uint8((yb + 0x8000) >> 16); |
||
819 | y_table[i + 16] = ((yval + 18) / 36) << rbase; |
||
820 | y_table[i + 16 + 1024] = ((yval + 18) / 36) << gbase; |
||
821 | y_table[i + 37 + 2048] = ((yval + 43) / 85) << bbase; |
||
822 | yb += cy; |
||
823 | } |
||
824 | fill_table(c->table_rV, 1, crv, y_table + yoffs); |
||
825 | fill_table(c->table_gU, 1, cgu, y_table + yoffs + 1024); |
||
826 | fill_table(c->table_bU, 1, cbu, y_table + yoffs + 2048); |
||
827 | fill_gv_table(c->table_gV, 1, cgv); |
||
828 | break; |
||
829 | case 12: |
||
830 | rbase = isRgb ? 8 : 0; |
||
831 | gbase = 4; |
||
832 | bbase = isRgb ? 0 : 8; |
||
833 | c->yuvTable = av_malloc(1024 * 3 * 2); |
||
834 | y_table16 = c->yuvTable; |
||
835 | yb = -(384 << 16) - oy; |
||
836 | for (i = 0; i < 1024; i++) { |
||
837 | uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16); |
||
838 | y_table16[i] = (yval >> 4) << rbase; |
||
839 | y_table16[i + 1024] = (yval >> 4) << gbase; |
||
840 | y_table16[i + 2048] = (yval >> 4) << bbase; |
||
841 | yb += cy; |
||
842 | } |
||
843 | if (isNotNe) |
||
844 | for (i = 0; i < 1024 * 3; i++) |
||
845 | y_table16[i] = av_bswap16(y_table16[i]); |
||
846 | fill_table(c->table_rV, 2, crv, y_table16 + yoffs); |
||
847 | fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + 1024); |
||
848 | fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2048); |
||
849 | fill_gv_table(c->table_gV, 2, cgv); |
||
850 | break; |
||
851 | case 15: |
||
852 | case 16: |
||
853 | rbase = isRgb ? bpp - 5 : 0; |
||
854 | gbase = 5; |
||
855 | bbase = isRgb ? 0 : (bpp - 5); |
||
856 | c->yuvTable = av_malloc(1024 * 3 * 2); |
||
857 | y_table16 = c->yuvTable; |
||
858 | yb = -(384 << 16) - oy; |
||
859 | for (i = 0; i < 1024; i++) { |
||
860 | uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16); |
||
861 | y_table16[i] = (yval >> 3) << rbase; |
||
862 | y_table16[i + 1024] = (yval >> (18 - bpp)) << gbase; |
||
863 | y_table16[i + 2048] = (yval >> 3) << bbase; |
||
864 | yb += cy; |
||
865 | } |
||
866 | if (isNotNe) |
||
867 | for (i = 0; i < 1024 * 3; i++) |
||
868 | y_table16[i] = av_bswap16(y_table16[i]); |
||
869 | fill_table(c->table_rV, 2, crv, y_table16 + yoffs); |
||
870 | fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + 1024); |
||
871 | fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2048); |
||
872 | fill_gv_table(c->table_gV, 2, cgv); |
||
873 | break; |
||
874 | case 24: |
||
875 | case 48: |
||
876 | c->yuvTable = av_malloc(1024); |
||
877 | y_table = c->yuvTable; |
||
878 | yb = -(384 << 16) - oy; |
||
879 | for (i = 0; i < 1024; i++) { |
||
880 | y_table[i] = av_clip_uint8((yb + 0x8000) >> 16); |
||
881 | yb += cy; |
||
882 | } |
||
883 | fill_table(c->table_rV, 1, crv, y_table + yoffs); |
||
884 | fill_table(c->table_gU, 1, cgu, y_table + yoffs); |
||
885 | fill_table(c->table_bU, 1, cbu, y_table + yoffs); |
||
886 | fill_gv_table(c->table_gV, 1, cgv); |
||
887 | break; |
||
888 | case 32: |
||
889 | case 64: |
||
890 | base = (c->dstFormat == AV_PIX_FMT_RGB32_1 || |
||
891 | c->dstFormat == AV_PIX_FMT_BGR32_1) ? 8 : 0; |
||
892 | rbase = base + (isRgb ? 16 : 0); |
||
893 | gbase = base + 8; |
||
894 | bbase = base + (isRgb ? 0 : 16); |
||
895 | needAlpha = CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat); |
||
896 | if (!needAlpha) |
||
897 | abase = (base + 24) & 31; |
||
898 | c->yuvTable = av_malloc(1024 * 3 * 4); |
||
899 | y_table32 = c->yuvTable; |
||
900 | yb = -(384 << 16) - oy; |
||
901 | for (i = 0; i < 1024; i++) { |
||
902 | unsigned yval = av_clip_uint8((yb + 0x8000) >> 16); |
||
903 | y_table32[i] = (yval << rbase) + |
||
904 | (needAlpha ? 0 : (255u << abase)); |
||
905 | y_table32[i + 1024] = yval << gbase; |
||
906 | y_table32[i + 2048] = yval << bbase; |
||
907 | yb += cy; |
||
908 | } |
||
909 | fill_table(c->table_rV, 4, crv, y_table32 + yoffs); |
||
910 | fill_table(c->table_gU, 4, cgu, y_table32 + yoffs + 1024); |
||
911 | fill_table(c->table_bU, 4, cbu, y_table32 + yoffs + 2048); |
||
912 | fill_gv_table(c->table_gV, 4, cgv); |
||
913 | break; |
||
914 | default: |
||
915 | if(!isPlanar(c->dstFormat) || bpp <= 24) |
||
916 | av_log(c, AV_LOG_ERROR, "%ibpp not supported by yuv2rgb\n", bpp); |
||
917 | return -1; |
||
918 | } |
||
919 | return 0; |
||
920 | }=>><>><>><>><>>><>>><>>><>><>><>>><>>><>><>><>>><>><>><>><>>><>><>><>><>>><>>><>><>><>><>><>><>><>><>><>><>><>><>><>>><>>>><>>><>><>> |