Line | Branch | Exec | Source |
---|---|---|---|
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 <stddef.h> | ||
27 | #include <stdint.h> | ||
28 | |||
29 | #include "libavutil/bswap.h" | ||
30 | #include "libavutil/mem.h" | ||
31 | #include "config.h" | ||
32 | #include "swscale.h" | ||
33 | #include "swscale_internal.h" | ||
34 | #include "libavutil/pixdesc.h" | ||
35 | |||
36 | /* Color space conversion coefficients for YCbCr -> RGB mapping. | ||
37 | * | ||
38 | * Entries are {crv, cbu, cgu, cgv} | ||
39 | * | ||
40 | * crv = (255 / 224) * 65536 * (1 - cr) / 0.5 | ||
41 | * cbu = (255 / 224) * 65536 * (1 - cb) / 0.5 | ||
42 | * cgu = (255 / 224) * 65536 * (cb / cg) * (1 - cb) / 0.5 | ||
43 | * cgv = (255 / 224) * 65536 * (cr / cg) * (1 - cr) / 0.5 | ||
44 | * | ||
45 | * where Y = cr * R + cg * G + cb * B and cr + cg + cb = 1. | ||
46 | */ | ||
47 | const int32_t ff_yuv2rgb_coeffs[11][4] = { | ||
48 | { 104597, 132201, 25675, 53279 }, /* no sequence_display_extension */ | ||
49 | { 117489, 138438, 13975, 34925 }, /* ITU-R Rec. 709 (1990) */ | ||
50 | { 104597, 132201, 25675, 53279 }, /* unspecified */ | ||
51 | { 104597, 132201, 25675, 53279 }, /* reserved */ | ||
52 | { 104448, 132798, 24759, 53109 }, /* FCC */ | ||
53 | { 104597, 132201, 25675, 53279 }, /* ITU-R Rec. 624-4 System B, G */ | ||
54 | { 104597, 132201, 25675, 53279 }, /* SMPTE 170M */ | ||
55 | { 117579, 136230, 16907, 35559 }, /* SMPTE 240M (1987) */ | ||
56 | { 0 }, /* YCgCo */ | ||
57 | { 110013, 140363, 12277, 42626 }, /* Bt-2020-NCL */ | ||
58 | { 110013, 140363, 12277, 42626 }, /* Bt-2020-CL */ | ||
59 | }; | ||
60 | |||
61 | 7564 | const int *sws_getCoefficients(int colorspace) | |
62 | { | ||
63 |
3/6✓ Branch 0 taken 7564 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7564 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 7564 times.
|
7564 | if (colorspace > 10 || colorspace < 0 || colorspace == 8) |
64 | ✗ | colorspace = SWS_CS_DEFAULT; | |
65 | 7564 | return ff_yuv2rgb_coeffs[colorspace]; | |
66 | } | ||
67 | |||
68 | #define LOADCHROMA(l, i) \ | ||
69 | U = pu_##l[i]; \ | ||
70 | V = pv_##l[i]; \ | ||
71 | r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \ | ||
72 | g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \ | ||
73 | b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; | ||
74 | |||
75 | #define PUTRGB(l, i, abase) \ | ||
76 | Y = py_##l[2 * i]; \ | ||
77 | dst_##l[2 * i] = r[Y] + g[Y] + b[Y]; \ | ||
78 | Y = py_##l[2 * i + 1]; \ | ||
79 | dst_##l[2 * i + 1] = r[Y] + g[Y] + b[Y]; | ||
80 | |||
81 | #define PUTRGB24(l, i, abase) \ | ||
82 | Y = py_##l[2 * i]; \ | ||
83 | dst_##l[6 * i + 0] = r[Y]; \ | ||
84 | dst_##l[6 * i + 1] = g[Y]; \ | ||
85 | dst_##l[6 * i + 2] = b[Y]; \ | ||
86 | Y = py_##l[2 * i + 1]; \ | ||
87 | dst_##l[6 * i + 3] = r[Y]; \ | ||
88 | dst_##l[6 * i + 4] = g[Y]; \ | ||
89 | dst_##l[6 * i + 5] = b[Y]; | ||
90 | |||
91 | #define PUTBGR24(l, i, abase) \ | ||
92 | Y = py_##l[2 * i]; \ | ||
93 | dst_##l[6 * i + 0] = b[Y]; \ | ||
94 | dst_##l[6 * i + 1] = g[Y]; \ | ||
95 | dst_##l[6 * i + 2] = r[Y]; \ | ||
96 | Y = py_##l[2 * i + 1]; \ | ||
97 | dst_##l[6 * i + 3] = b[Y]; \ | ||
98 | dst_##l[6 * i + 4] = g[Y]; \ | ||
99 | dst_##l[6 * i + 5] = r[Y]; | ||
100 | |||
101 | #define PUTRGBA(l, i, abase) \ | ||
102 | Y = py_##l[2 * i]; \ | ||
103 | dst_##l[2 * i] = r[Y] + g[Y] + b[Y] + ((uint32_t)(pa_##l[2 * i]) << abase); \ | ||
104 | Y = py_##l[2 * i + 1]; \ | ||
105 | dst_##l[2 * i + 1] = r[Y] + g[Y] + b[Y] + ((uint32_t)(pa_##l[2 * i + 1]) << abase); | ||
106 | |||
107 | #define PUTRGB48(l, i, abase) \ | ||
108 | Y = py_##l[ 2 * i]; \ | ||
109 | dst_##l[12 * i + 0] = dst_##l[12 * i + 1] = r[Y]; \ | ||
110 | dst_##l[12 * i + 2] = dst_##l[12 * i + 3] = g[Y]; \ | ||
111 | dst_##l[12 * i + 4] = dst_##l[12 * i + 5] = b[Y]; \ | ||
112 | Y = py_##l[ 2 * i + 1]; \ | ||
113 | dst_##l[12 * i + 6] = dst_##l[12 * i + 7] = r[Y]; \ | ||
114 | dst_##l[12 * i + 8] = dst_##l[12 * i + 9] = g[Y]; \ | ||
115 | dst_##l[12 * i + 10] = dst_##l[12 * i + 11] = b[Y]; | ||
116 | |||
117 | #define PUTBGR48(l, i, abase) \ | ||
118 | Y = py_##l[2 * i]; \ | ||
119 | dst_##l[12 * i + 0] = dst_##l[12 * i + 1] = b[Y]; \ | ||
120 | dst_##l[12 * i + 2] = dst_##l[12 * i + 3] = g[Y]; \ | ||
121 | dst_##l[12 * i + 4] = dst_##l[12 * i + 5] = r[Y]; \ | ||
122 | Y = py_##l[2 * i + 1]; \ | ||
123 | dst_##l[12 * i + 6] = dst_##l[12 * i + 7] = b[Y]; \ | ||
124 | dst_##l[12 * i + 8] = dst_##l[12 * i + 9] = g[Y]; \ | ||
125 | dst_##l[12 * i + 10] = dst_##l[12 * i + 11] = r[Y]; | ||
126 | |||
127 | #define PUTGBRP(l, i, abase) \ | ||
128 | Y = py_##l[2 * i]; \ | ||
129 | dst_##l [2 * i + 0] = g[Y]; \ | ||
130 | dst1_##l[2 * i + 0] = b[Y]; \ | ||
131 | dst2_##l[2 * i + 0] = r[Y]; \ | ||
132 | Y = py_##l[2 * i + 1]; \ | ||
133 | dst_##l [2 * i + 1] = g[Y]; \ | ||
134 | dst1_##l[2 * i + 1] = b[Y]; \ | ||
135 | dst2_##l[2 * i + 1] = r[Y]; | ||
136 | |||
137 | #define YUV2RGBFUNC(func_name, dst_type, alpha, yuv422, nb_dst_planes) \ | ||
138 | static int func_name(SwsInternal *c, const uint8_t *const src[], \ | ||
139 | const int srcStride[], int srcSliceY, int srcSliceH, \ | ||
140 | uint8_t *const dst[], const int dstStride[]) \ | ||
141 | { \ | ||
142 | int y; \ | ||
143 | \ | ||
144 | for (y = 0; y < srcSliceH; y += 2) { \ | ||
145 | int yd = y + srcSliceY; \ | ||
146 | dst_type *dst_1 = \ | ||
147 | (dst_type *)(dst[0] + (yd) * dstStride[0]); \ | ||
148 | dst_type *dst_2 = \ | ||
149 | (dst_type *)(dst[0] + (yd + 1) * dstStride[0]); \ | ||
150 | dst_type av_unused *dst1_1, *dst1_2, *dst2_1, *dst2_2; \ | ||
151 | dst_type av_unused *r, *g, *b; \ | ||
152 | const uint8_t *py_1 = src[0] + y * srcStride[0]; \ | ||
153 | const uint8_t *py_2 = py_1 + srcStride[0]; \ | ||
154 | const uint8_t av_unused *pu_1 = src[1] + (y >> !yuv422) * srcStride[1]; \ | ||
155 | const uint8_t av_unused *pv_1 = src[2] + (y >> !yuv422) * srcStride[2]; \ | ||
156 | const uint8_t av_unused *pu_2, *pv_2; \ | ||
157 | const uint8_t av_unused *pa_1, *pa_2; \ | ||
158 | unsigned int h_size = c->dstW >> 3; \ | ||
159 | if (nb_dst_planes > 1) { \ | ||
160 | dst1_1 = (dst_type *)(dst[1] + (yd) * dstStride[1]); \ | ||
161 | dst1_2 = (dst_type *)(dst[1] + (yd + 1) * dstStride[1]); \ | ||
162 | dst2_1 = (dst_type *)(dst[2] + (yd) * dstStride[2]); \ | ||
163 | dst2_2 = (dst_type *)(dst[2] + (yd + 1) * dstStride[2]); \ | ||
164 | } \ | ||
165 | if (yuv422) { \ | ||
166 | pu_2 = pu_1 + srcStride[1]; \ | ||
167 | pv_2 = pv_1 + srcStride[2]; \ | ||
168 | } \ | ||
169 | if (alpha) { \ | ||
170 | pa_1 = src[3] + y * srcStride[3]; \ | ||
171 | pa_2 = pa_1 + srcStride[3]; \ | ||
172 | } \ | ||
173 | while (h_size--) { \ | ||
174 | int av_unused U, V, Y; \ | ||
175 | |||
176 | #define ENDYUV2RGBLINE(dst_delta, ss, alpha, yuv422, nb_dst_planes) \ | ||
177 | pu_1 += 4 >> ss; \ | ||
178 | pv_1 += 4 >> ss; \ | ||
179 | if (yuv422) { \ | ||
180 | pu_2 += 4 >> ss; \ | ||
181 | pv_2 += 4 >> ss; \ | ||
182 | } \ | ||
183 | py_1 += 8 >> ss; \ | ||
184 | py_2 += 8 >> ss; \ | ||
185 | if (alpha) { \ | ||
186 | pa_1 += 8 >> ss; \ | ||
187 | pa_2 += 8 >> ss; \ | ||
188 | } \ | ||
189 | dst_1 += dst_delta >> ss; \ | ||
190 | dst_2 += dst_delta >> ss; \ | ||
191 | if (nb_dst_planes > 1) { \ | ||
192 | dst1_1 += dst_delta >> ss; \ | ||
193 | dst1_2 += dst_delta >> ss; \ | ||
194 | dst2_1 += dst_delta >> ss; \ | ||
195 | dst2_2 += dst_delta >> ss; \ | ||
196 | } \ | ||
197 | } \ | ||
198 | if (c->dstW & (4 >> ss)) { \ | ||
199 | int av_unused Y, U, V; \ | ||
200 | |||
201 | #define ENDYUV2RGBFUNC() \ | ||
202 | } \ | ||
203 | } \ | ||
204 | return srcSliceH; \ | ||
205 | } | ||
206 | |||
207 | #define YUV420FUNC(func_name, dst_type, alpha, abase, PUTFUNC, dst_delta, nb_dst_planes) \ | ||
208 | YUV2RGBFUNC(func_name, dst_type, alpha, 0, nb_dst_planes) \ | ||
209 | LOADCHROMA(1, 0); \ | ||
210 | PUTFUNC(1, 0, abase); \ | ||
211 | PUTFUNC(2, 0, abase); \ | ||
212 | \ | ||
213 | LOADCHROMA(1, 1); \ | ||
214 | PUTFUNC(2, 1, abase); \ | ||
215 | PUTFUNC(1, 1, abase); \ | ||
216 | \ | ||
217 | LOADCHROMA(1, 2); \ | ||
218 | PUTFUNC(1, 2, abase); \ | ||
219 | PUTFUNC(2, 2, abase); \ | ||
220 | \ | ||
221 | LOADCHROMA(1, 3); \ | ||
222 | PUTFUNC(2, 3, abase); \ | ||
223 | PUTFUNC(1, 3, abase); \ | ||
224 | ENDYUV2RGBLINE(dst_delta, 0, alpha, 0, nb_dst_planes) \ | ||
225 | LOADCHROMA(1, 0); \ | ||
226 | PUTFUNC(1, 0, abase); \ | ||
227 | PUTFUNC(2, 0, abase); \ | ||
228 | \ | ||
229 | LOADCHROMA(1, 1); \ | ||
230 | PUTFUNC(2, 1, abase); \ | ||
231 | PUTFUNC(1, 1, abase); \ | ||
232 | ENDYUV2RGBLINE(dst_delta, 1, alpha, 0, nb_dst_planes) \ | ||
233 | LOADCHROMA(1, 0); \ | ||
234 | PUTFUNC(1, 0, abase); \ | ||
235 | PUTFUNC(2, 0, abase); \ | ||
236 | ENDYUV2RGBFUNC() | ||
237 | |||
238 | #define YUV422FUNC(func_name, dst_type, alpha, abase, PUTFUNC, dst_delta, nb_dst_planes) \ | ||
239 | YUV2RGBFUNC(func_name, dst_type, alpha, 1, nb_dst_planes) \ | ||
240 | LOADCHROMA(1, 0); \ | ||
241 | PUTFUNC(1, 0, abase); \ | ||
242 | \ | ||
243 | LOADCHROMA(2, 0); \ | ||
244 | PUTFUNC(2, 0, abase); \ | ||
245 | \ | ||
246 | LOADCHROMA(2, 1); \ | ||
247 | PUTFUNC(2, 1, abase); \ | ||
248 | \ | ||
249 | LOADCHROMA(1, 1); \ | ||
250 | PUTFUNC(1, 1, abase); \ | ||
251 | \ | ||
252 | LOADCHROMA(1, 2); \ | ||
253 | PUTFUNC(1, 2, abase); \ | ||
254 | \ | ||
255 | LOADCHROMA(2, 2); \ | ||
256 | PUTFUNC(2, 2, abase); \ | ||
257 | \ | ||
258 | LOADCHROMA(2, 3); \ | ||
259 | PUTFUNC(2, 3, abase); \ | ||
260 | \ | ||
261 | LOADCHROMA(1, 3); \ | ||
262 | PUTFUNC(1, 3, abase); \ | ||
263 | ENDYUV2RGBLINE(dst_delta, 0, alpha, 1, nb_dst_planes) \ | ||
264 | LOADCHROMA(1, 0); \ | ||
265 | PUTFUNC(1, 0, abase); \ | ||
266 | \ | ||
267 | LOADCHROMA(2, 0); \ | ||
268 | PUTFUNC(2, 0, abase); \ | ||
269 | \ | ||
270 | LOADCHROMA(2, 1); \ | ||
271 | PUTFUNC(2, 1, abase); \ | ||
272 | \ | ||
273 | LOADCHROMA(1, 1); \ | ||
274 | PUTFUNC(1, 1, abase); \ | ||
275 | ENDYUV2RGBLINE(dst_delta, 1, alpha, 1, nb_dst_planes) \ | ||
276 | LOADCHROMA(1, 0); \ | ||
277 | PUTFUNC(1, 0, abase); \ | ||
278 | \ | ||
279 | LOADCHROMA(2, 0); \ | ||
280 | PUTFUNC(2, 0, abase); \ | ||
281 | ENDYUV2RGBFUNC() | ||
282 | |||
283 | #define YUV420FUNC_DITHER(func_name, dst_type, LOADDITHER, PUTFUNC, dst_delta) \ | ||
284 | YUV2RGBFUNC(func_name, dst_type, 0, 0, 1) \ | ||
285 | LOADDITHER \ | ||
286 | \ | ||
287 | LOADCHROMA(1, 0); \ | ||
288 | PUTFUNC(1, 0, 0); \ | ||
289 | PUTFUNC(2, 0, 0 + 8); \ | ||
290 | \ | ||
291 | LOADCHROMA(1, 1); \ | ||
292 | PUTFUNC(2, 1, 2 + 8); \ | ||
293 | PUTFUNC(1, 1, 2); \ | ||
294 | \ | ||
295 | LOADCHROMA(1, 2); \ | ||
296 | PUTFUNC(1, 2, 4); \ | ||
297 | PUTFUNC(2, 2, 4 + 8); \ | ||
298 | \ | ||
299 | LOADCHROMA(1, 3); \ | ||
300 | PUTFUNC(2, 3, 6 + 8); \ | ||
301 | PUTFUNC(1, 3, 6); \ | ||
302 | ENDYUV2RGBLINE(dst_delta, 0, 0, 0, 1) \ | ||
303 | LOADDITHER \ | ||
304 | \ | ||
305 | LOADCHROMA(1, 0); \ | ||
306 | PUTFUNC(1, 0, 0); \ | ||
307 | PUTFUNC(2, 0, 0 + 8); \ | ||
308 | \ | ||
309 | LOADCHROMA(1, 1); \ | ||
310 | PUTFUNC(2, 1, 2 + 8); \ | ||
311 | PUTFUNC(1, 1, 2); \ | ||
312 | ENDYUV2RGBLINE(dst_delta, 1, 0, 0, 1) \ | ||
313 | LOADDITHER \ | ||
314 | \ | ||
315 | LOADCHROMA(1, 0); \ | ||
316 | PUTFUNC(1, 0, 0); \ | ||
317 | PUTFUNC(2, 0, 0 + 8); \ | ||
318 | ENDYUV2RGBFUNC() | ||
319 | |||
320 | #define YUV422FUNC_DITHER(func_name, dst_type, LOADDITHER, PUTFUNC, dst_delta) \ | ||
321 | YUV2RGBFUNC(func_name, dst_type, 0, 1, 1) \ | ||
322 | LOADDITHER \ | ||
323 | \ | ||
324 | LOADCHROMA(1, 0); \ | ||
325 | PUTFUNC(1, 0, 0); \ | ||
326 | \ | ||
327 | LOADCHROMA(2, 0); \ | ||
328 | PUTFUNC(2, 0, 0 + 8); \ | ||
329 | \ | ||
330 | LOADCHROMA(2, 1); \ | ||
331 | PUTFUNC(2, 1, 2 + 8); \ | ||
332 | \ | ||
333 | LOADCHROMA(1, 1); \ | ||
334 | PUTFUNC(1, 1, 2); \ | ||
335 | \ | ||
336 | LOADCHROMA(1, 2); \ | ||
337 | PUTFUNC(1, 2, 4); \ | ||
338 | \ | ||
339 | LOADCHROMA(2, 2); \ | ||
340 | PUTFUNC(2, 2, 4 + 8); \ | ||
341 | \ | ||
342 | LOADCHROMA(2, 3); \ | ||
343 | PUTFUNC(2, 3, 6 + 8); \ | ||
344 | \ | ||
345 | LOADCHROMA(1, 3); \ | ||
346 | PUTFUNC(1, 3, 6); \ | ||
347 | ENDYUV2RGBLINE(dst_delta, 0, 0, 1, 1) \ | ||
348 | LOADDITHER \ | ||
349 | \ | ||
350 | LOADCHROMA(1, 0); \ | ||
351 | PUTFUNC(1, 0, 0); \ | ||
352 | \ | ||
353 | LOADCHROMA(2, 0); \ | ||
354 | PUTFUNC(2, 0, 0 + 8); \ | ||
355 | \ | ||
356 | LOADCHROMA(2, 1); \ | ||
357 | PUTFUNC(2, 1, 2 + 8); \ | ||
358 | \ | ||
359 | LOADCHROMA(1, 1); \ | ||
360 | PUTFUNC(1, 1, 2); \ | ||
361 | ENDYUV2RGBLINE(dst_delta, 1, 0, 1, 1) \ | ||
362 | LOADDITHER \ | ||
363 | \ | ||
364 | LOADCHROMA(1, 0); \ | ||
365 | PUTFUNC(1, 0, 0); \ | ||
366 | \ | ||
367 | LOADCHROMA(2, 0); \ | ||
368 | PUTFUNC(2, 0, 0 + 8); \ | ||
369 | ENDYUV2RGBFUNC() | ||
370 | |||
371 | #define LOADDITHER16 \ | ||
372 | const uint8_t *d16 = ff_dither_2x2_8[y & 1]; \ | ||
373 | const uint8_t *e16 = ff_dither_2x2_4[y & 1]; \ | ||
374 | const uint8_t *f16 = ff_dither_2x2_8[(y & 1)^1]; | ||
375 | |||
376 | #define PUTRGB16(l, i, o) \ | ||
377 | Y = py_##l[2 * i]; \ | ||
378 | dst_##l[2 * i] = r[Y + d16[0 + o]] + \ | ||
379 | g[Y + e16[0 + o]] + \ | ||
380 | b[Y + f16[0 + o]]; \ | ||
381 | Y = py_##l[2 * i + 1]; \ | ||
382 | dst_##l[2 * i + 1] = r[Y + d16[1 + o]] + \ | ||
383 | g[Y + e16[1 + o]] + \ | ||
384 | b[Y + f16[1 + o]]; | ||
385 | |||
386 | #define LOADDITHER15 \ | ||
387 | const uint8_t *d16 = ff_dither_2x2_8[y & 1]; \ | ||
388 | const uint8_t *e16 = ff_dither_2x2_8[(y & 1)^1]; | ||
389 | |||
390 | #define PUTRGB15(l, i, o) \ | ||
391 | Y = py_##l[2 * i]; \ | ||
392 | dst_##l[2 * i] = r[Y + d16[0 + o]] + \ | ||
393 | g[Y + d16[1 + o]] + \ | ||
394 | b[Y + e16[0 + o]]; \ | ||
395 | Y = py_##l[2 * i + 1]; \ | ||
396 | dst_##l[2 * i + 1] = r[Y + d16[1 + o]] + \ | ||
397 | g[Y + d16[0 + o]] + \ | ||
398 | b[Y + e16[1 + o]]; | ||
399 | |||
400 | #define LOADDITHER12 \ | ||
401 | const uint8_t *d16 = ff_dither_4x4_16[y & 3]; | ||
402 | |||
403 | #define PUTRGB12(l, i, o) \ | ||
404 | Y = py_##l[2 * i]; \ | ||
405 | dst_##l[2 * i] = r[Y + d16[0 + o]] + \ | ||
406 | g[Y + d16[0 + o]] + \ | ||
407 | b[Y + d16[0 + o]]; \ | ||
408 | Y = py_##l[2 * i + 1]; \ | ||
409 | dst_##l[2 * i + 1] = r[Y + d16[1 + o]] + \ | ||
410 | g[Y + d16[1 + o]] + \ | ||
411 | b[Y + d16[1 + o]]; | ||
412 | |||
413 | #define LOADDITHER8 \ | ||
414 | const uint8_t *d32 = ff_dither_8x8_32[yd & 7]; \ | ||
415 | const uint8_t *d64 = ff_dither_8x8_73[yd & 7]; | ||
416 | |||
417 | #define PUTRGB8(l, i, o) \ | ||
418 | Y = py_##l[2 * i]; \ | ||
419 | dst_##l[2 * i] = r[Y + d32[0 + o]] + \ | ||
420 | g[Y + d32[0 + o]] + \ | ||
421 | b[Y + d64[0 + o]]; \ | ||
422 | Y = py_##l[2 * i + 1]; \ | ||
423 | dst_##l[2 * i + 1] = r[Y + d32[1 + o]] + \ | ||
424 | g[Y + d32[1 + o]] + \ | ||
425 | b[Y + d64[1 + o]]; | ||
426 | |||
427 | #define LOADDITHER4D \ | ||
428 | const uint8_t * d64 = ff_dither_8x8_73[yd & 7]; \ | ||
429 | const uint8_t *d128 = ff_dither_8x8_220[yd & 7]; \ | ||
430 | int acc; | ||
431 | |||
432 | #define PUTRGB4D(l, i, o) \ | ||
433 | Y = py_##l[2 * i]; \ | ||
434 | acc = r[Y + d128[0 + o]] + \ | ||
435 | g[Y + d64[0 + o]] + \ | ||
436 | b[Y + d128[0 + o]]; \ | ||
437 | Y = py_##l[2 * i + 1]; \ | ||
438 | acc |= (r[Y + d128[1 + o]] + \ | ||
439 | g[Y + d64[1 + o]] + \ | ||
440 | b[Y + d128[1 + o]]) << 4; \ | ||
441 | dst_##l[i] = acc; | ||
442 | |||
443 | #define LOADDITHER4DB \ | ||
444 | const uint8_t *d64 = ff_dither_8x8_73[yd & 7]; \ | ||
445 | const uint8_t *d128 = ff_dither_8x8_220[yd & 7]; | ||
446 | |||
447 | #define PUTRGB4DB(l, i, o) \ | ||
448 | Y = py_##l[2 * i]; \ | ||
449 | dst_##l[2 * i] = r[Y + d128[0 + o]] + \ | ||
450 | g[Y + d64[0 + o]] + \ | ||
451 | b[Y + d128[0 + o]]; \ | ||
452 | Y = py_##l[2 * i + 1]; \ | ||
453 | dst_##l[2 * i + 1] = r[Y + d128[1 + o]] + \ | ||
454 | g[Y + d64[1 + o]] + \ | ||
455 | b[Y + d128[1 + o]]; | ||
456 | |||
457 | ✗ | YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0, 0, 1) | |
458 | ✗ | const uint8_t *d128 = ff_dither_8x8_220[yd & 7]; | |
459 | ✗ | char out_1 = 0, out_2 = 0; | |
460 | ✗ | g = c->table_gU[128 + YUVRGB_TABLE_HEADROOM] + c->table_gV[128 + YUVRGB_TABLE_HEADROOM]; | |
461 | |||
462 | #define PUTRGB1(out, src, i, o) \ | ||
463 | Y = src[2 * i]; \ | ||
464 | out += out + g[Y + d128[0 + o]]; \ | ||
465 | Y = src[2 * i + 1]; \ | ||
466 | out += out + g[Y + d128[1 + o]]; | ||
467 | |||
468 | ✗ | PUTRGB1(out_1, py_1, 0, 0); | |
469 | ✗ | PUTRGB1(out_2, py_2, 0, 0 + 8); | |
470 | |||
471 | ✗ | PUTRGB1(out_2, py_2, 1, 2 + 8); | |
472 | ✗ | PUTRGB1(out_1, py_1, 1, 2); | |
473 | |||
474 | ✗ | PUTRGB1(out_1, py_1, 2, 4); | |
475 | ✗ | PUTRGB1(out_2, py_2, 2, 4 + 8); | |
476 | |||
477 | ✗ | PUTRGB1(out_2, py_2, 3, 6 + 8); | |
478 | ✗ | PUTRGB1(out_1, py_1, 3, 6); | |
479 | |||
480 | ✗ | dst_1[0] = out_1; | |
481 | ✗ | dst_2[0] = out_2; | |
482 | |||
483 | ✗ | py_1 += 8; | |
484 | ✗ | py_2 += 8; | |
485 | ✗ | dst_1 += 1; | |
486 | ✗ | dst_2 += 1; | |
487 | } | ||
488 | ✗ | if (c->dstW & 7) { | |
489 | int av_unused Y, U, V; | ||
490 | ✗ | int pixels_left = c->dstW & 7; | |
491 | ✗ | const uint8_t *d128 = ff_dither_8x8_220[yd & 7]; | |
492 | ✗ | char out_1 = 0, out_2 = 0; | |
493 | ✗ | g = c->table_gU[128 + YUVRGB_TABLE_HEADROOM] + c->table_gV[128 + YUVRGB_TABLE_HEADROOM]; | |
494 | |||
495 | #define PUTRGB1_OR00(out, src, i, o) \ | ||
496 | if (pixels_left) { \ | ||
497 | PUTRGB1(out, src, i, o) \ | ||
498 | pixels_left--; \ | ||
499 | } else { \ | ||
500 | out <<= 2; \ | ||
501 | } | ||
502 | |||
503 | ✗ | PUTRGB1_OR00(out_1, py_1, 0, 0); | |
504 | ✗ | PUTRGB1_OR00(out_2, py_2, 0, 0 + 8); | |
505 | |||
506 | ✗ | PUTRGB1_OR00(out_2, py_2, 1, 2 + 8); | |
507 | ✗ | PUTRGB1_OR00(out_1, py_1, 1, 2); | |
508 | |||
509 | ✗ | PUTRGB1_OR00(out_1, py_1, 2, 4); | |
510 | ✗ | PUTRGB1_OR00(out_2, py_2, 2, 4 + 8); | |
511 | |||
512 | ✗ | PUTRGB1_OR00(out_2, py_2, 3, 6 + 8); | |
513 | ✗ | PUTRGB1_OR00(out_1, py_1, 3, 6); | |
514 | |||
515 | ✗ | dst_1[0] = out_1; | |
516 | ✗ | dst_2[0] = out_2; | |
517 | ✗ | ENDYUV2RGBFUNC() | |
518 | |||
519 | // YUV420 | ||
520 | ✗ | YUV420FUNC(yuv2rgb_c_48, uint8_t, 0, 0, PUTRGB48, 48, 1) | |
521 | ✗ | YUV420FUNC(yuv2rgb_c_bgr48, uint8_t, 0, 0, PUTBGR48, 48, 1) | |
522 |
6/8✓ Branch 0 taken 3920 times.
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 40 times.
✓ Branch 6 taken 40 times.
✓ Branch 7 taken 40 times.
|
4000 | YUV420FUNC(yuv2rgb_c_32, uint32_t, 0, 0, PUTRGB, 8, 1) |
523 | #if HAVE_BIGENDIAN | ||
524 | YUV420FUNC(yuva2argb_c, uint32_t, 1, 24, PUTRGBA, 8, 1) | ||
525 | YUV420FUNC(yuva2rgba_c, uint32_t, 1, 0, PUTRGBA, 8, 1) | ||
526 | #else | ||
527 |
6/8✓ Branch 0 taken 2352 times.
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 24 times.
✓ Branch 6 taken 24 times.
✓ Branch 7 taken 24 times.
|
2400 | YUV420FUNC(yuva2rgba_c, uint32_t, 1, 24, PUTRGBA, 8, 1) |
528 |
6/8✓ Branch 0 taken 1568 times.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 16 times.
|
1600 | YUV420FUNC(yuva2argb_c, uint32_t, 1, 0, PUTRGBA, 8, 1) |
529 | #endif | ||
530 |
6/8✓ Branch 0 taken 2352 times.
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 24 times.
✓ Branch 6 taken 24 times.
✓ Branch 7 taken 24 times.
|
2400 | YUV420FUNC(yuv2rgb_c_24_rgb, uint8_t, 0, 0, PUTRGB24, 24, 1) |
531 |
6/8✓ Branch 0 taken 2352 times.
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 24 times.
✓ Branch 6 taken 24 times.
✓ Branch 7 taken 24 times.
|
2400 | YUV420FUNC(yuv2rgb_c_24_bgr, uint8_t, 0, 0, PUTBGR24, 24, 1) |
532 |
6/8✓ Branch 0 taken 2352 times.
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 24 times.
✓ Branch 6 taken 24 times.
✓ Branch 7 taken 24 times.
|
2400 | YUV420FUNC(yuv420p_gbrp_c, uint8_t, 0, 0, PUTGBRP, 8, 3) |
533 |
6/8✓ Branch 0 taken 3920 times.
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 40 times.
✓ Branch 6 taken 40 times.
✓ Branch 7 taken 40 times.
|
4000 | YUV420FUNC_DITHER(yuv2rgb_c_16_ordered_dither, uint16_t, LOADDITHER16, PUTRGB16, 8) |
534 |
6/8✓ Branch 0 taken 3920 times.
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 40 times.
✓ Branch 6 taken 40 times.
✓ Branch 7 taken 40 times.
|
4000 | YUV420FUNC_DITHER(yuv2rgb_c_15_ordered_dither, uint16_t, LOADDITHER15, PUTRGB15, 8) |
535 | ✗ | YUV420FUNC_DITHER(yuv2rgb_c_12_ordered_dither, uint16_t, LOADDITHER12, PUTRGB12, 8) | |
536 | ✗ | YUV420FUNC_DITHER(yuv2rgb_c_8_ordered_dither, uint8_t, LOADDITHER8, PUTRGB8, 8) | |
537 | ✗ | YUV420FUNC_DITHER(yuv2rgb_c_4_ordered_dither, uint8_t, LOADDITHER4D, PUTRGB4D, 4) | |
538 | ✗ | YUV420FUNC_DITHER(yuv2rgb_c_4b_ordered_dither, uint8_t, LOADDITHER4DB, PUTRGB4DB, 8) | |
539 | |||
540 | // YUV422 | ||
541 | ✗ | YUV422FUNC(yuv422p_rgb48_c, uint8_t, 0, 0, PUTRGB48, 48, 1) | |
542 | ✗ | YUV422FUNC(yuv422p_bgr48_c, uint8_t, 0, 0, PUTBGR48, 48, 1) | |
543 |
6/8✓ Branch 0 taken 3920 times.
✓ Branch 1 taken 40 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 40 times.
✓ Branch 6 taken 40 times.
✓ Branch 7 taken 40 times.
|
4000 | YUV422FUNC(yuv422p_rgb32_c, uint32_t, 0, 0, PUTRGB, 8, 1) |
544 | #if HAVE_BIGENDIAN | ||
545 | YUV422FUNC(yuva422p_argb_c, uint32_t, 1, 24, PUTRGBA, 8, 1) | ||
546 | YUV422FUNC(yuva422p_rgba_c, uint32_t, 1, 0, PUTRGBA, 8, 1) | ||
547 | #else | ||
548 | ✗ | YUV422FUNC(yuva422p_rgba_c, uint32_t, 1, 24, PUTRGBA, 8, 1) | |
549 | ✗ | YUV422FUNC(yuva422p_argb_c, uint32_t, 1, 0, PUTRGBA, 8, 1) | |
550 | #endif | ||
551 |
6/8✓ Branch 0 taken 1176 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 12 times.
|
1200 | YUV422FUNC(yuv422p_rgb24_c, uint8_t, 0, 0, PUTRGB24, 24, 1) |
552 |
6/8✓ Branch 0 taken 1176 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 12 times.
|
1200 | YUV422FUNC(yuv422p_bgr24_c, uint8_t, 0, 0, PUTBGR24, 24, 1) |
553 |
6/8✓ Branch 0 taken 1176 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 12 times.
|
1200 | YUV422FUNC(yuv422p_gbrp_c, uint8_t, 0, 0, PUTGBRP, 8, 3) |
554 |
6/8✓ Branch 0 taken 1960 times.
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 20 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 20 times.
✓ Branch 6 taken 20 times.
✓ Branch 7 taken 20 times.
|
2000 | YUV422FUNC_DITHER(yuv422p_bgr16, uint16_t, LOADDITHER16, PUTRGB16, 8) |
555 |
6/8✓ Branch 0 taken 1960 times.
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 20 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 20 times.
✓ Branch 6 taken 20 times.
✓ Branch 7 taken 20 times.
|
2000 | YUV422FUNC_DITHER(yuv422p_bgr15, uint16_t, LOADDITHER15, PUTRGB15, 8) |
556 | ✗ | YUV422FUNC_DITHER(yuv422p_bgr12, uint16_t, LOADDITHER12, PUTRGB12, 8) | |
557 | ✗ | YUV422FUNC_DITHER(yuv422p_bgr8, uint8_t, LOADDITHER8, PUTRGB8, 8) | |
558 | ✗ | YUV422FUNC_DITHER(yuv422p_bgr4, uint8_t, LOADDITHER4D, PUTRGB4D, 4) | |
559 | ✗ | YUV422FUNC_DITHER(yuv422p_bgr4_byte, uint8_t, LOADDITHER4DB, PUTRGB4DB, 8) | |
560 | |||
561 | 1716 | SwsFunc ff_yuv2rgb_get_func_ptr(SwsInternal *c) | |
562 | { | ||
563 | 1716 | SwsFunc t = NULL; | |
564 | |||
565 | #if ARCH_PPC | ||
566 | t = ff_yuv2rgb_init_ppc(c); | ||
567 | #elif ARCH_X86 | ||
568 | 1716 | t = ff_yuv2rgb_init_x86(c); | |
569 | #elif ARCH_LOONGARCH64 | ||
570 | t = ff_yuv2rgb_init_loongarch(c); | ||
571 | #endif | ||
572 | |||
573 |
2/2✓ Branch 0 taken 588 times.
✓ Branch 1 taken 1128 times.
|
1716 | if (t) |
574 | 588 | return t; | |
575 | |||
576 | 1128 | av_log(c, AV_LOG_WARNING, | |
577 | "No accelerated colorspace conversion found from %s to %s.\n", | ||
578 | av_get_pix_fmt_name(c->srcFormat), av_get_pix_fmt_name(c->dstFormat)); | ||
579 | |||
580 |
2/2✓ Branch 0 taken 376 times.
✓ Branch 1 taken 752 times.
|
1128 | if (c->srcFormat == AV_PIX_FMT_YUV422P) { |
581 |
7/15✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 104 times.
✓ Branch 3 taken 48 times.
✓ Branch 4 taken 24 times.
✓ Branch 5 taken 24 times.
✓ Branch 6 taken 76 times.
✓ Branch 7 taken 76 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 24 times.
✗ Branch 14 not taken.
|
376 | switch (c->dstFormat) { |
582 | ✗ | case AV_PIX_FMT_BGR48BE: | |
583 | case AV_PIX_FMT_BGR48LE: | ||
584 | ✗ | return yuv422p_bgr48_c; | |
585 | ✗ | case AV_PIX_FMT_RGB48BE: | |
586 | case AV_PIX_FMT_RGB48LE: | ||
587 | ✗ | return yuv422p_rgb48_c; | |
588 | 104 | case AV_PIX_FMT_ARGB: | |
589 | case AV_PIX_FMT_ABGR: | ||
590 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 104 times.
|
104 | if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) |
591 | ✗ | return yuva422p_argb_c; | |
592 | case AV_PIX_FMT_RGBA: | ||
593 | case AV_PIX_FMT_BGRA: | ||
594 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 152 times.
|
152 | return (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) ? yuva422p_rgba_c : yuv422p_rgb32_c; |
595 | 24 | case AV_PIX_FMT_RGB24: | |
596 | 24 | return yuv422p_rgb24_c; | |
597 | 24 | case AV_PIX_FMT_BGR24: | |
598 | 24 | return yuv422p_bgr24_c; | |
599 | 76 | case AV_PIX_FMT_RGB565: | |
600 | case AV_PIX_FMT_BGR565: | ||
601 | 76 | return yuv422p_bgr16; | |
602 | 76 | case AV_PIX_FMT_RGB555: | |
603 | case AV_PIX_FMT_BGR555: | ||
604 | 76 | return yuv422p_bgr15; | |
605 | ✗ | case AV_PIX_FMT_RGB444: | |
606 | case AV_PIX_FMT_BGR444: | ||
607 | ✗ | return yuv422p_bgr12; | |
608 | ✗ | case AV_PIX_FMT_RGB8: | |
609 | case AV_PIX_FMT_BGR8: | ||
610 | ✗ | return yuv422p_bgr8; | |
611 | ✗ | case AV_PIX_FMT_RGB4: | |
612 | case AV_PIX_FMT_BGR4: | ||
613 | ✗ | return yuv422p_bgr4; | |
614 | ✗ | case AV_PIX_FMT_RGB4_BYTE: | |
615 | case AV_PIX_FMT_BGR4_BYTE: | ||
616 | ✗ | return yuv422p_bgr4_byte; | |
617 | ✗ | case AV_PIX_FMT_MONOBLACK: | |
618 | ✗ | return yuv2rgb_c_1_ordered_dither; | |
619 | 24 | case AV_PIX_FMT_GBRP: | |
620 | 24 | return yuv422p_gbrp_c; | |
621 | } | ||
622 | } else { | ||
623 |
7/15✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 208 times.
✓ Branch 3 taken 96 times.
✓ Branch 4 taken 48 times.
✓ Branch 5 taken 48 times.
✓ Branch 6 taken 152 times.
✓ Branch 7 taken 152 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 48 times.
✗ Branch 14 not taken.
|
752 | switch (c->dstFormat) { |
624 | ✗ | case AV_PIX_FMT_BGR48BE: | |
625 | case AV_PIX_FMT_BGR48LE: | ||
626 | ✗ | return yuv2rgb_c_bgr48; | |
627 | ✗ | case AV_PIX_FMT_RGB48BE: | |
628 | case AV_PIX_FMT_RGB48LE: | ||
629 | ✗ | return yuv2rgb_c_48; | |
630 | 208 | case AV_PIX_FMT_ARGB: | |
631 | case AV_PIX_FMT_ABGR: | ||
632 |
2/2✓ Branch 1 taken 104 times.
✓ Branch 2 taken 104 times.
|
208 | if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) |
633 | 104 | return yuva2argb_c; | |
634 | case AV_PIX_FMT_RGBA: | ||
635 | case AV_PIX_FMT_BGRA: | ||
636 |
2/2✓ Branch 1 taken 48 times.
✓ Branch 2 taken 152 times.
|
200 | return (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) ? yuva2rgba_c : yuv2rgb_c_32; |
637 | 48 | case AV_PIX_FMT_RGB24: | |
638 | 48 | return yuv2rgb_c_24_rgb; | |
639 | 48 | case AV_PIX_FMT_BGR24: | |
640 | 48 | return yuv2rgb_c_24_bgr; | |
641 | 152 | case AV_PIX_FMT_RGB565: | |
642 | case AV_PIX_FMT_BGR565: | ||
643 | 152 | return yuv2rgb_c_16_ordered_dither; | |
644 | 152 | case AV_PIX_FMT_RGB555: | |
645 | case AV_PIX_FMT_BGR555: | ||
646 | 152 | return yuv2rgb_c_15_ordered_dither; | |
647 | ✗ | case AV_PIX_FMT_RGB444: | |
648 | case AV_PIX_FMT_BGR444: | ||
649 | ✗ | return yuv2rgb_c_12_ordered_dither; | |
650 | ✗ | case AV_PIX_FMT_RGB8: | |
651 | case AV_PIX_FMT_BGR8: | ||
652 | ✗ | return yuv2rgb_c_8_ordered_dither; | |
653 | ✗ | case AV_PIX_FMT_RGB4: | |
654 | case AV_PIX_FMT_BGR4: | ||
655 | ✗ | return yuv2rgb_c_4_ordered_dither; | |
656 | ✗ | case AV_PIX_FMT_RGB4_BYTE: | |
657 | case AV_PIX_FMT_BGR4_BYTE: | ||
658 | ✗ | return yuv2rgb_c_4b_ordered_dither; | |
659 | ✗ | case AV_PIX_FMT_MONOBLACK: | |
660 | ✗ | return yuv2rgb_c_1_ordered_dither; | |
661 | 48 | case AV_PIX_FMT_GBRP: | |
662 | 48 | return yuv420p_gbrp_c; | |
663 | } | ||
664 | } | ||
665 | ✗ | return NULL; | |
666 | } | ||
667 | |||
668 | 27661 | static void fill_table(uint8_t* table[256 + 2*YUVRGB_TABLE_HEADROOM], const int elemsize, | |
669 | const int64_t inc, void *y_tab) | ||
670 | { | ||
671 | int i; | ||
672 | 27661 | uint8_t *y_table = y_tab; | |
673 | |||
674 | 27661 | y_table -= elemsize * (inc >> 9); | |
675 | |||
676 |
2/2✓ Branch 0 taken 35406080 times.
✓ Branch 1 taken 27661 times.
|
35433741 | for (i = 0; i < 256 + 2*YUVRGB_TABLE_HEADROOM; i++) { |
677 | 35406080 | int64_t cb = av_clip_uint8(i-YUVRGB_TABLE_HEADROOM)*inc; | |
678 | 35406080 | table[i] = y_table + elemsize * (cb >> 16); | |
679 | } | ||
680 | 27661 | } | |
681 | |||
682 | 9339 | static void fill_gv_table(int table[256 + 2*YUVRGB_TABLE_HEADROOM], const int elemsize, const int64_t inc) | |
683 | { | ||
684 | int i; | ||
685 | 9339 | int off = -(inc >> 9); | |
686 | |||
687 |
2/2✓ Branch 0 taken 11953920 times.
✓ Branch 1 taken 9339 times.
|
11963259 | for (i = 0; i < 256 + 2*YUVRGB_TABLE_HEADROOM; i++) { |
688 | 11953920 | int64_t cb = av_clip_uint8(i-YUVRGB_TABLE_HEADROOM)*inc; | |
689 | 11953920 | table[i] = elemsize * (off + (cb >> 16)); | |
690 | } | ||
691 | 9339 | } | |
692 | |||
693 | 126300 | static uint16_t roundToInt16(int64_t f) | |
694 | { | ||
695 | 126300 | int r = (f + (1 << 15)) >> 16; | |
696 | |||
697 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 126300 times.
|
126300 | if (r < -0x7FFF) |
698 | ✗ | return 0x8000; | |
699 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 126300 times.
|
126300 | else if (r > 0x7FFF) |
700 | ✗ | return 0x7FFF; | |
701 | else | ||
702 | 126300 | return r; | |
703 | } | ||
704 | |||
705 | 10525 | av_cold int ff_yuv2rgb_c_init_tables(SwsInternal *c, const int inv_table[4], | |
706 | int fullRange, int brightness, | ||
707 | int contrast, int saturation) | ||
708 | { | ||
709 | 30789 | const int isRgb = c->dstFormat == AV_PIX_FMT_RGB32 || | |
710 |
2/2✓ Branch 0 taken 9547 times.
✓ Branch 1 taken 192 times.
|
9739 | c->dstFormat == AV_PIX_FMT_RGB32_1 || |
711 |
2/2✓ Branch 0 taken 9238 times.
✓ Branch 1 taken 309 times.
|
9547 | c->dstFormat == AV_PIX_FMT_BGR24 || |
712 |
2/2✓ Branch 0 taken 9223 times.
✓ Branch 1 taken 15 times.
|
9238 | c->dstFormat == AV_PIX_FMT_RGB565BE || |
713 |
2/2✓ Branch 0 taken 8976 times.
✓ Branch 1 taken 247 times.
|
9223 | c->dstFormat == AV_PIX_FMT_RGB565LE || |
714 |
2/2✓ Branch 0 taken 8961 times.
✓ Branch 1 taken 15 times.
|
8976 | c->dstFormat == AV_PIX_FMT_RGB555BE || |
715 |
2/2✓ Branch 0 taken 8707 times.
✓ Branch 1 taken 254 times.
|
8961 | c->dstFormat == AV_PIX_FMT_RGB555LE || |
716 |
2/2✓ Branch 0 taken 8694 times.
✓ Branch 1 taken 13 times.
|
8707 | c->dstFormat == AV_PIX_FMT_RGB444BE || |
717 |
2/2✓ Branch 0 taken 8681 times.
✓ Branch 1 taken 13 times.
|
8694 | c->dstFormat == AV_PIX_FMT_RGB444LE || |
718 |
1/2✓ Branch 0 taken 8681 times.
✗ Branch 1 not taken.
|
8681 | c->dstFormat == AV_PIX_FMT_X2RGB10BE || |
719 |
2/2✓ Branch 0 taken 8596 times.
✓ Branch 1 taken 85 times.
|
8681 | c->dstFormat == AV_PIX_FMT_X2RGB10LE || |
720 |
2/2✓ Branch 0 taken 8579 times.
✓ Branch 1 taken 17 times.
|
8596 | c->dstFormat == AV_PIX_FMT_RGB8 || |
721 |
1/2✓ Branch 0 taken 8579 times.
✗ Branch 1 not taken.
|
8579 | c->dstFormat == AV_PIX_FMT_RGB4 || |
722 |
4/4✓ Branch 0 taken 9739 times.
✓ Branch 1 taken 786 times.
✓ Branch 2 taken 8564 times.
✓ Branch 3 taken 15 times.
|
28828 | c->dstFormat == AV_PIX_FMT_RGB4_BYTE || |
723 |
2/2✓ Branch 0 taken 84 times.
✓ Branch 1 taken 8480 times.
|
8564 | c->dstFormat == AV_PIX_FMT_MONOBLACK; |
724 | 31560 | const int isNotNe = c->dstFormat == AV_PIX_FMT_NE(RGB565LE, RGB565BE) || | |
725 |
2/2✓ Branch 0 taken 10495 times.
✓ Branch 1 taken 15 times.
|
10510 | c->dstFormat == AV_PIX_FMT_NE(RGB555LE, RGB555BE) || |
726 |
2/2✓ Branch 0 taken 10482 times.
✓ Branch 1 taken 13 times.
|
10495 | c->dstFormat == AV_PIX_FMT_NE(RGB444LE, RGB444BE) || |
727 |
2/2✓ Branch 0 taken 10468 times.
✓ Branch 1 taken 14 times.
|
10482 | c->dstFormat == AV_PIX_FMT_NE(BGR565LE, BGR565BE) || |
728 |
2/2✓ Branch 0 taken 10454 times.
✓ Branch 1 taken 14 times.
|
10468 | c->dstFormat == AV_PIX_FMT_NE(BGR555LE, BGR555BE) || |
729 |
2/2✓ Branch 0 taken 10441 times.
✓ Branch 1 taken 13 times.
|
10454 | c->dstFormat == AV_PIX_FMT_NE(BGR444LE, BGR444BE) || |
730 |
3/4✓ Branch 0 taken 10510 times.
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 10441 times.
✗ Branch 3 not taken.
|
31476 | c->dstFormat == AV_PIX_FMT_NE(X2RGB10LE, X2RGB10BE) || |
731 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10441 times.
|
10441 | c->dstFormat == AV_PIX_FMT_NE(X2BGR10LE, X2BGR10BE); |
732 | 10525 | const int bpp = c->dstFormatBpp; | |
733 | uint8_t *y_table; | ||
734 | uint16_t *y_table16; | ||
735 | uint32_t *y_table32; | ||
736 | 10525 | int i, base, rbase, gbase, bbase, av_uninit(abase), needAlpha; | |
737 |
2/2✓ Branch 0 taken 700 times.
✓ Branch 1 taken 9825 times.
|
10525 | const int yoffs = (fullRange ? 384 : 326) + YUVRGB_TABLE_LUMA_HEADROOM; |
738 | 10525 | const int table_plane_size = 1024 + 2*YUVRGB_TABLE_LUMA_HEADROOM; | |
739 | |||
740 | 10525 | int64_t crv = inv_table[0]; | |
741 | 10525 | int64_t cbu = inv_table[1]; | |
742 | 10525 | int64_t cgu = -inv_table[2]; | |
743 | 10525 | int64_t cgv = -inv_table[3]; | |
744 | 10525 | int64_t cy = 1 << 16; | |
745 | 10525 | int64_t oy = 0; | |
746 | 10525 | int64_t yb = 0; | |
747 | |||
748 |
2/2✓ Branch 0 taken 9825 times.
✓ Branch 1 taken 700 times.
|
10525 | if (!fullRange) { |
749 | 9825 | cy = (cy * 255) / 219; | |
750 | 9825 | oy = 16 << 16; | |
751 | } else { | ||
752 | 700 | crv = (crv * 224) / 255; | |
753 | 700 | cbu = (cbu * 224) / 255; | |
754 | 700 | cgu = (cgu * 224) / 255; | |
755 | 700 | cgv = (cgv * 224) / 255; | |
756 | } | ||
757 | |||
758 | 10525 | cy = (cy * contrast) >> 16; | |
759 | 10525 | crv = (crv * contrast * saturation) >> 32; | |
760 | 10525 | cbu = (cbu * contrast * saturation) >> 32; | |
761 | 10525 | cgu = (cgu * contrast * saturation) >> 32; | |
762 | 10525 | cgv = (cgv * contrast * saturation) >> 32; | |
763 | 10525 | oy -= 256LL * brightness; | |
764 | |||
765 | 10525 | c->uOffset = 0x0400040004000400LL; | |
766 | 10525 | c->vOffset = 0x0400040004000400LL; | |
767 | 10525 | c->yCoeff = roundToInt16(cy * (1 << 13)) * 0x0001000100010001ULL; | |
768 | 10525 | c->vrCoeff = roundToInt16(crv * (1 << 13)) * 0x0001000100010001ULL; | |
769 | 10525 | c->ubCoeff = roundToInt16(cbu * (1 << 13)) * 0x0001000100010001ULL; | |
770 | 10525 | c->vgCoeff = roundToInt16(cgv * (1 << 13)) * 0x0001000100010001ULL; | |
771 | 10525 | c->ugCoeff = roundToInt16(cgu * (1 << 13)) * 0x0001000100010001ULL; | |
772 | 10525 | c->yOffset = roundToInt16(oy * (1 << 3)) * 0x0001000100010001ULL; | |
773 | |||
774 | 10525 | c->yuv2rgb_y_coeff = (int16_t)roundToInt16(cy * (1 << 13)); | |
775 | 10525 | c->yuv2rgb_y_offset = (int16_t)roundToInt16(oy * (1 << 9)); | |
776 | 10525 | c->yuv2rgb_v2r_coeff = (int16_t)roundToInt16(crv * (1 << 13)); | |
777 | 10525 | c->yuv2rgb_v2g_coeff = (int16_t)roundToInt16(cgv * (1 << 13)); | |
778 | 10525 | c->yuv2rgb_u2g_coeff = (int16_t)roundToInt16(cgu * (1 << 13)); | |
779 | 10525 | c->yuv2rgb_u2b_coeff = (int16_t)roundToInt16(cbu * (1 << 13)); | |
780 | |||
781 | //scale coefficients by cy | ||
782 | 10525 | crv = ((crv * (1 << 16)) + 0x8000) / FFMAX(cy, 1); | |
783 | 10525 | cbu = ((cbu * (1 << 16)) + 0x8000) / FFMAX(cy, 1); | |
784 | 10525 | cgu = ((cgu * (1 << 16)) + 0x8000) / FFMAX(cy, 1); | |
785 | 10525 | cgv = ((cgv * (1 << 16)) + 0x8000) / FFMAX(cy, 1); | |
786 | |||
787 | 10525 | av_freep(&c->yuvTable); | |
788 | |||
789 | #define ALLOC_YUV_TABLE(x) \ | ||
790 | c->yuvTable = av_malloc(x); \ | ||
791 | if (!c->yuvTable) \ | ||
792 | return AVERROR(ENOMEM); | ||
793 |
9/9✓ Branch 0 taken 178 times.
✓ Branch 1 taken 29 times.
✓ Branch 2 taken 48 times.
✓ Branch 3 taken 52 times.
✓ Branch 4 taken 903 times.
✓ Branch 5 taken 5301 times.
✓ Branch 6 taken 1149 times.
✓ Branch 7 taken 1679 times.
✓ Branch 8 taken 1186 times.
|
10525 | switch (bpp) { |
794 | 178 | case 1: | |
795 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 178 times.
|
178 | ALLOC_YUV_TABLE(table_plane_size); |
796 | 178 | y_table = c->yuvTable; | |
797 | 178 | yb = -(384 << 16) - YUVRGB_TABLE_LUMA_HEADROOM*cy - oy; | |
798 |
2/2✓ Branch 0 taken 344964 times.
✓ Branch 1 taken 178 times.
|
345142 | for (i = 0; i < table_plane_size - 110; i++) { |
799 | 344964 | y_table[i + 110] = av_clip_uint8((yb + 0x8000) >> 16) >> 7; | |
800 | 344964 | yb += cy; | |
801 | } | ||
802 | 178 | fill_table(c->table_gU, 1, cgu, y_table + yoffs); | |
803 | 178 | fill_gv_table(c->table_gV, 1, cgv); | |
804 | 178 | break; | |
805 | 29 | case 4: | |
806 | case 4 | 128: | ||
807 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 14 times.
|
29 | rbase = isRgb ? 3 : 0; |
808 | 29 | gbase = 1; | |
809 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 14 times.
|
29 | bbase = isRgb ? 0 : 3; |
810 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 29 times.
|
29 | ALLOC_YUV_TABLE(table_plane_size * 3); |
811 | 29 | y_table = c->yuvTable; | |
812 | 29 | yb = -(384 << 16) - YUVRGB_TABLE_LUMA_HEADROOM*cy - oy; | |
813 |
2/2✓ Branch 0 taken 56202 times.
✓ Branch 1 taken 29 times.
|
56231 | for (i = 0; i < table_plane_size - 110; i++) { |
814 | 56202 | int yval = av_clip_uint8((yb + 0x8000) >> 16); | |
815 | 56202 | y_table[i + 110] = (yval >> 7) << rbase; | |
816 | 56202 | y_table[i + 37 + table_plane_size] = ((yval + 43) / 85) << gbase; | |
817 | 56202 | y_table[i + 110 + 2*table_plane_size] = (yval >> 7) << bbase; | |
818 | 56202 | yb += cy; | |
819 | } | ||
820 | 29 | fill_table(c->table_rV, 1, crv, y_table + yoffs); | |
821 | 29 | fill_table(c->table_gU, 1, cgu, y_table + yoffs + table_plane_size); | |
822 | 29 | fill_table(c->table_bU, 1, cbu, y_table + yoffs + 2*table_plane_size); | |
823 | 29 | fill_gv_table(c->table_gV, 1, cgv); | |
824 | 29 | break; | |
825 | 48 | case 8: | |
826 |
2/2✓ Branch 0 taken 17 times.
✓ Branch 1 taken 31 times.
|
48 | rbase = isRgb ? 5 : 0; |
827 |
2/2✓ Branch 0 taken 17 times.
✓ Branch 1 taken 31 times.
|
48 | gbase = isRgb ? 2 : 3; |
828 |
2/2✓ Branch 0 taken 17 times.
✓ Branch 1 taken 31 times.
|
48 | bbase = isRgb ? 0 : 6; |
829 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 48 times.
|
48 | ALLOC_YUV_TABLE(table_plane_size * 3); |
830 | 48 | y_table = c->yuvTable; | |
831 | 48 | yb = -(384 << 16) - YUVRGB_TABLE_LUMA_HEADROOM*cy - oy; | |
832 |
2/2✓ Branch 0 taken 96480 times.
✓ Branch 1 taken 48 times.
|
96528 | for (i = 0; i < table_plane_size - 38; i++) { |
833 | 96480 | int yval = av_clip_uint8((yb + 0x8000) >> 16); | |
834 | 96480 | y_table[i + 16] = ((yval + 18) / 36) << rbase; | |
835 | 96480 | y_table[i + 16 + table_plane_size] = ((yval + 18) / 36) << gbase; | |
836 | 96480 | y_table[i + 37 + 2*table_plane_size] = ((yval + 43) / 85) << bbase; | |
837 | 96480 | yb += cy; | |
838 | } | ||
839 | 48 | fill_table(c->table_rV, 1, crv, y_table + yoffs); | |
840 | 48 | fill_table(c->table_gU, 1, cgu, y_table + yoffs + table_plane_size); | |
841 | 48 | fill_table(c->table_bU, 1, cbu, y_table + yoffs + 2*table_plane_size); | |
842 | 48 | fill_gv_table(c->table_gV, 1, cgv); | |
843 | 48 | break; | |
844 | 52 | case 12: | |
845 |
2/2✓ Branch 0 taken 26 times.
✓ Branch 1 taken 26 times.
|
52 | rbase = isRgb ? 8 : 0; |
846 | 52 | gbase = 4; | |
847 |
2/2✓ Branch 0 taken 26 times.
✓ Branch 1 taken 26 times.
|
52 | bbase = isRgb ? 0 : 8; |
848 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 52 times.
|
52 | ALLOC_YUV_TABLE(table_plane_size * 3 * 2); |
849 | 52 | y_table16 = c->yuvTable; | |
850 | 52 | yb = -(384 << 16) - YUVRGB_TABLE_LUMA_HEADROOM*cy - oy; | |
851 |
2/2✓ Branch 0 taken 106496 times.
✓ Branch 1 taken 52 times.
|
106548 | for (i = 0; i < table_plane_size; i++) { |
852 | 106496 | uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16); | |
853 | 106496 | y_table16[i] = (yval >> 4) << rbase; | |
854 | 106496 | y_table16[i + table_plane_size] = (yval >> 4) << gbase; | |
855 | 106496 | y_table16[i + 2*table_plane_size] = (yval >> 4) << bbase; | |
856 | 106496 | yb += cy; | |
857 | } | ||
858 |
2/2✓ Branch 0 taken 26 times.
✓ Branch 1 taken 26 times.
|
52 | if (isNotNe) |
859 |
2/2✓ Branch 0 taken 159744 times.
✓ Branch 1 taken 26 times.
|
159770 | for (i = 0; i < table_plane_size * 3; i++) |
860 | 159744 | y_table16[i] = av_bswap16(y_table16[i]); | |
861 | 52 | fill_table(c->table_rV, 2, crv, y_table16 + yoffs); | |
862 | 52 | fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + table_plane_size); | |
863 | 52 | fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2*table_plane_size); | |
864 | 52 | fill_gv_table(c->table_gV, 2, cgv); | |
865 | 52 | break; | |
866 | 903 | case 15: | |
867 | case 16: | ||
868 |
2/2✓ Branch 0 taken 531 times.
✓ Branch 1 taken 372 times.
|
903 | rbase = isRgb ? bpp - 5 : 0; |
869 | 903 | gbase = 5; | |
870 |
2/2✓ Branch 0 taken 372 times.
✓ Branch 1 taken 531 times.
|
903 | bbase = isRgb ? 0 : (bpp - 5); |
871 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 903 times.
|
903 | ALLOC_YUV_TABLE(table_plane_size * 3 * 2); |
872 | 903 | y_table16 = c->yuvTable; | |
873 | 903 | yb = -(384 << 16) - YUVRGB_TABLE_LUMA_HEADROOM*cy - oy; | |
874 |
2/2✓ Branch 0 taken 1849344 times.
✓ Branch 1 taken 903 times.
|
1850247 | for (i = 0; i < table_plane_size; i++) { |
875 | 1849344 | uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16); | |
876 | 1849344 | y_table16[i] = (yval >> 3) << rbase; | |
877 | 1849344 | y_table16[i + table_plane_size] = (yval >> (18 - bpp)) << gbase; | |
878 | 1849344 | y_table16[i + 2*table_plane_size] = (yval >> 3) << bbase; | |
879 | 1849344 | yb += cy; | |
880 | } | ||
881 |
2/2✓ Branch 0 taken 58 times.
✓ Branch 1 taken 845 times.
|
903 | if (isNotNe) |
882 |
2/2✓ Branch 0 taken 356352 times.
✓ Branch 1 taken 58 times.
|
356410 | for (i = 0; i < table_plane_size * 3; i++) |
883 | 356352 | y_table16[i] = av_bswap16(y_table16[i]); | |
884 | 903 | fill_table(c->table_rV, 2, crv, y_table16 + yoffs); | |
885 | 903 | fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + table_plane_size); | |
886 | 903 | fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2*table_plane_size); | |
887 | 903 | fill_gv_table(c->table_gV, 2, cgv); | |
888 | 903 | break; | |
889 | 5301 | case 24: | |
890 | case 48: | ||
891 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 5301 times.
|
5301 | ALLOC_YUV_TABLE(table_plane_size); |
892 | 5301 | y_table = c->yuvTable; | |
893 | 5301 | yb = -(384 << 16) - YUVRGB_TABLE_LUMA_HEADROOM*cy - oy; | |
894 |
2/2✓ Branch 0 taken 10856448 times.
✓ Branch 1 taken 5301 times.
|
10861749 | for (i = 0; i < table_plane_size; i++) { |
895 | 10856448 | y_table[i] = av_clip_uint8((yb + 0x8000) >> 16); | |
896 | 10856448 | yb += cy; | |
897 | } | ||
898 | 5301 | fill_table(c->table_rV, 1, crv, y_table + yoffs); | |
899 | 5301 | fill_table(c->table_gU, 1, cgu, y_table + yoffs); | |
900 | 5301 | fill_table(c->table_bU, 1, cbu, y_table + yoffs); | |
901 | 5301 | fill_gv_table(c->table_gV, 1, cgv); | |
902 | 5301 | break; | |
903 | 1149 | case 30: | |
904 |
2/2✓ Branch 0 taken 85 times.
✓ Branch 1 taken 1064 times.
|
1149 | rbase = isRgb ? 20 : 0; |
905 | 1149 | gbase = 10; | |
906 |
2/2✓ Branch 0 taken 85 times.
✓ Branch 1 taken 1064 times.
|
1149 | bbase = isRgb ? 0 : 20; |
907 | 1149 | needAlpha = CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat); | |
908 |
2/2✓ Branch 0 taken 1140 times.
✓ Branch 1 taken 9 times.
|
1149 | if (!needAlpha) |
909 | 1140 | abase = 30; | |
910 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1149 times.
|
1149 | ALLOC_YUV_TABLE(table_plane_size * 3 * 4); |
911 | 1149 | y_table32 = c->yuvTable; | |
912 | 1149 | yb = -(384 << 16) - YUVRGB_TABLE_LUMA_HEADROOM*cy - oy; | |
913 |
2/2✓ Branch 0 taken 2353152 times.
✓ Branch 1 taken 1149 times.
|
2354301 | for (i = 0; i < table_plane_size; i++) { |
914 | 2353152 | unsigned yval = av_clip_uintp2((yb + 0x8000) >> 14, 10); | |
915 |
2/2✓ Branch 0 taken 2334720 times.
✓ Branch 1 taken 18432 times.
|
2353152 | y_table32[i]= (yval << rbase) + (needAlpha ? 0 : (255u << abase)); |
916 | 2353152 | y_table32[i + table_plane_size] = yval << gbase; | |
917 | 2353152 | y_table32[i + 2 * table_plane_size] = yval << bbase; | |
918 | 2353152 | yb += cy; | |
919 | } | ||
920 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1149 times.
|
1149 | if (isNotNe) { |
921 | ✗ | for (i = 0; i < table_plane_size * 3; i++) | |
922 | ✗ | y_table32[i] = av_bswap32(y_table32[i]); | |
923 | } | ||
924 | 1149 | fill_table(c->table_rV, 4, crv, y_table32 + yoffs); | |
925 | 1149 | fill_table(c->table_gU, 4, cgu, y_table32 + yoffs + table_plane_size); | |
926 | 1149 | fill_table(c->table_bU, 4, cbu, y_table32 + yoffs + 2 * table_plane_size); | |
927 | 1149 | fill_gv_table(c->table_gV, 4, cgv); | |
928 | 1149 | break; | |
929 | 1679 | case 32: | |
930 | case 64: | ||
931 | 4845 | base = (c->dstFormat == AV_PIX_FMT_RGB32_1 || | |
932 |
4/4✓ Branch 0 taken 1487 times.
✓ Branch 1 taken 192 times.
✓ Branch 2 taken 210 times.
✓ Branch 3 taken 1277 times.
|
1679 | c->dstFormat == AV_PIX_FMT_BGR32_1) ? 8 : 0; |
933 |
2/2✓ Branch 0 taken 978 times.
✓ Branch 1 taken 701 times.
|
1679 | rbase = base + (isRgb ? 16 : 0); |
934 | 1679 | gbase = base + 8; | |
935 |
2/2✓ Branch 0 taken 978 times.
✓ Branch 1 taken 701 times.
|
1679 | bbase = base + (isRgb ? 0 : 16); |
936 | 1679 | needAlpha = CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat); | |
937 |
2/2✓ Branch 0 taken 940 times.
✓ Branch 1 taken 739 times.
|
1679 | if (!needAlpha) |
938 | 940 | abase = (base + 24) & 31; | |
939 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1679 times.
|
1679 | ALLOC_YUV_TABLE(table_plane_size * 3 * 4); |
940 | 1679 | y_table32 = c->yuvTable; | |
941 | 1679 | yb = -(384 << 16) - YUVRGB_TABLE_LUMA_HEADROOM*cy - oy; | |
942 |
2/2✓ Branch 0 taken 3438592 times.
✓ Branch 1 taken 1679 times.
|
3440271 | for (i = 0; i < table_plane_size; i++) { |
943 | 3438592 | unsigned yval = av_clip_uint8((yb + 0x8000) >> 16); | |
944 | 6877184 | y_table32[i] = (yval << rbase) + | |
945 |
2/2✓ Branch 0 taken 1925120 times.
✓ Branch 1 taken 1513472 times.
|
3438592 | (needAlpha ? 0 : (255u << abase)); |
946 | 3438592 | y_table32[i + table_plane_size] = yval << gbase; | |
947 | 3438592 | y_table32[i + 2*table_plane_size] = yval << bbase; | |
948 | 3438592 | yb += cy; | |
949 | } | ||
950 | 1679 | fill_table(c->table_rV, 4, crv, y_table32 + yoffs); | |
951 | 1679 | fill_table(c->table_gU, 4, cgu, y_table32 + yoffs + table_plane_size); | |
952 | 1679 | fill_table(c->table_bU, 4, cbu, y_table32 + yoffs + 2*table_plane_size); | |
953 | 1679 | fill_gv_table(c->table_gV, 4, cgv); | |
954 | 1679 | break; | |
955 | 1186 | default: | |
956 |
2/4✓ Branch 1 taken 1186 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1186 times.
|
1186 | if(!isPlanar(c->dstFormat) || bpp <= 24) |
957 | ✗ | av_log(c, AV_LOG_ERROR, "%ibpp not supported by yuv2rgb\n", bpp); | |
958 | 1186 | return AVERROR(EINVAL); | |
959 | } | ||
960 | 9339 | return 0; | |
961 | } | ||
962 |