FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libswscale/output.c
Date: 2026-09-29 23:02:14
Exec Total Coverage
Lines: 1596 2034 78.5%
Functions: 234 312 75.0%
Branches: 1173 1676 70.0%

Line Branch Exec Source
1 /*
2 * Copyright (C) 2001-2012 Michael Niedermayer <michaelni@gmx.at>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include <math.h>
22 #include <stddef.h>
23 #include <stdint.h>
24 #include <string.h>
25
26 #include "libavutil/attributes.h"
27 #include "libavutil/avutil.h"
28 #include "libavutil/avassert.h"
29 #include "libavutil/bswap.h"
30 #include "libavutil/intfloat.h"
31 #include "libavutil/intreadwrite.h"
32 #include "libavutil/mathematics.h"
33 #include "libavutil/mem_internal.h"
34 #include "libavutil/pixdesc.h"
35 #include "config.h"
36 #include "rgb2rgb.h"
37 #include "swscale.h"
38 #include "swscale_internal.h"
39
40 DECLARE_ALIGNED(8, const uint8_t, ff_dither_2x2_4)[][8] = {
41 { 1, 3, 1, 3, 1, 3, 1, 3, },
42 { 2, 0, 2, 0, 2, 0, 2, 0, },
43 { 1, 3, 1, 3, 1, 3, 1, 3, },
44 };
45
46 DECLARE_ALIGNED(8, const uint8_t, ff_dither_2x2_8)[][8] = {
47 { 6, 2, 6, 2, 6, 2, 6, 2, },
48 { 0, 4, 0, 4, 0, 4, 0, 4, },
49 { 6, 2, 6, 2, 6, 2, 6, 2, },
50 };
51
52 DECLARE_ALIGNED(8, const uint8_t, ff_dither_4x4_16)[][8] = {
53 { 8, 4, 11, 7, 8, 4, 11, 7, },
54 { 2, 14, 1, 13, 2, 14, 1, 13, },
55 { 10, 6, 9, 5, 10, 6, 9, 5, },
56 { 0, 12, 3, 15, 0, 12, 3, 15, },
57 { 8, 4, 11, 7, 8, 4, 11, 7, },
58 };
59
60 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_32)[][8] = {
61 { 17, 9, 23, 15, 16, 8, 22, 14, },
62 { 5, 29, 3, 27, 4, 28, 2, 26, },
63 { 21, 13, 19, 11, 20, 12, 18, 10, },
64 { 0, 24, 6, 30, 1, 25, 7, 31, },
65 { 16, 8, 22, 14, 17, 9, 23, 15, },
66 { 4, 28, 2, 26, 5, 29, 3, 27, },
67 { 20, 12, 18, 10, 21, 13, 19, 11, },
68 { 1, 25, 7, 31, 0, 24, 6, 30, },
69 { 17, 9, 23, 15, 16, 8, 22, 14, },
70 };
71
72 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_73)[][8] = {
73 { 0, 55, 14, 68, 3, 58, 17, 72, },
74 { 37, 18, 50, 32, 40, 22, 54, 35, },
75 { 9, 64, 5, 59, 13, 67, 8, 63, },
76 { 46, 27, 41, 23, 49, 31, 44, 26, },
77 { 2, 57, 16, 71, 1, 56, 15, 70, },
78 { 39, 21, 52, 34, 38, 19, 51, 33, },
79 { 11, 66, 7, 62, 10, 65, 6, 60, },
80 { 48, 30, 43, 25, 47, 29, 42, 24, },
81 { 0, 55, 14, 68, 3, 58, 17, 72, },
82 };
83
84 #if 1
85 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
86 {117, 62, 158, 103, 113, 58, 155, 100, },
87 { 34, 199, 21, 186, 31, 196, 17, 182, },
88 {144, 89, 131, 76, 141, 86, 127, 72, },
89 { 0, 165, 41, 206, 10, 175, 52, 217, },
90 {110, 55, 151, 96, 120, 65, 162, 107, },
91 { 28, 193, 14, 179, 38, 203, 24, 189, },
92 {138, 83, 124, 69, 148, 93, 134, 79, },
93 { 7, 172, 48, 213, 3, 168, 45, 210, },
94 {117, 62, 158, 103, 113, 58, 155, 100, },
95 };
96 #elif 1
97 // tries to correct a gamma of 1.5
98 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
99 { 0, 143, 18, 200, 2, 156, 25, 215, },
100 { 78, 28, 125, 64, 89, 36, 138, 74, },
101 { 10, 180, 3, 161, 16, 195, 8, 175, },
102 {109, 51, 93, 38, 121, 60, 105, 47, },
103 { 1, 152, 23, 210, 0, 147, 20, 205, },
104 { 85, 33, 134, 71, 81, 30, 130, 67, },
105 { 14, 190, 6, 171, 12, 185, 5, 166, },
106 {117, 57, 101, 44, 113, 54, 97, 41, },
107 { 0, 143, 18, 200, 2, 156, 25, 215, },
108 };
109 #elif 1
110 // tries to correct a gamma of 2.0
111 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
112 { 0, 124, 8, 193, 0, 140, 12, 213, },
113 { 55, 14, 104, 42, 66, 19, 119, 52, },
114 { 3, 168, 1, 145, 6, 187, 3, 162, },
115 { 86, 31, 70, 21, 99, 39, 82, 28, },
116 { 0, 134, 11, 206, 0, 129, 9, 200, },
117 { 62, 17, 114, 48, 58, 16, 109, 45, },
118 { 5, 181, 2, 157, 4, 175, 1, 151, },
119 { 95, 36, 78, 26, 90, 34, 74, 24, },
120 { 0, 124, 8, 193, 0, 140, 12, 213, },
121 };
122 #else
123 // tries to correct a gamma of 2.5
124 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
125 { 0, 107, 3, 187, 0, 125, 6, 212, },
126 { 39, 7, 86, 28, 49, 11, 102, 36, },
127 { 1, 158, 0, 131, 3, 180, 1, 151, },
128 { 68, 19, 52, 12, 81, 25, 64, 17, },
129 { 0, 119, 5, 203, 0, 113, 4, 195, },
130 { 45, 9, 96, 33, 42, 8, 91, 30, },
131 { 2, 172, 1, 144, 2, 165, 0, 137, },
132 { 77, 23, 60, 15, 72, 21, 56, 14, },
133 { 0, 107, 3, 187, 0, 125, 6, 212, },
134 };
135 #endif
136
137 #define IS_BE_LE 0
138 #define IS_BE_BE 1
139 /* ENDIAN_IDENTIFIER needs to be "BE" or "LE". */
140 #define IS_BE(ENDIAN_IDENTIFIER) IS_BE_ ## ENDIAN_IDENTIFIER
141
142 #define output_pixel(pos, val, bias, signedness) \
143 if (big_endian) { \
144 AV_WB16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
145 } else { \
146 AV_WL16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
147 }
148
149 static av_always_inline void
150 2934190 yuv2plane1_16_c_template(const int32_t *src, uint16_t *dest, int dstW,
151 int big_endian, int output_bits)
152 {
153 int i;
154 2934190 int shift = 3;
155
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2934190 times.
2934190 av_assert0(output_bits == 16);
156
157
2/2
✓ Branch 0 taken 955983304 times.
✓ Branch 1 taken 2934190 times.
958917494 for (i = 0; i < dstW; i++) {
158 955983304 int val = src[i] + (1 << (shift - 1));
159
2/2
✓ Branch 0 taken 358331040 times.
✓ Branch 1 taken 597652264 times.
955983304 output_pixel(&dest[i], val, 0, uint);
160 }
161 2934190 }
162
163 static av_always_inline void
164 621952 yuv2planeX_16_c_template(const int16_t *filter, int filterSize,
165 const int32_t **src, uint16_t *dest, int dstW,
166 int big_endian, int output_bits)
167 {
168 int i;
169 621952 int shift = 15;
170
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 621952 times.
621952 av_assert0(output_bits == 16);
171
172
2/2
✓ Branch 0 taken 164438304 times.
✓ Branch 1 taken 621952 times.
165060256 for (i = 0; i < dstW; i++) {
173 164438304 int val = 1 << (shift - 1);
174 int j;
175
176 /* range of val is [0,0x7FFFFFFF], so 31 bits, but with lanczos/spline
177 * filters (or anything with negative coeffs, the range can be slightly
178 * wider in both directions. To account for this overflow, we subtract
179 * a constant so it always fits in the signed range (assuming a
180 * reasonable filterSize), and re-add that at the end. */
181 164438304 val -= 0x40000000;
182
2/2
✓ Branch 0 taken 818156672 times.
✓ Branch 1 taken 164438304 times.
982594976 for (j = 0; j < filterSize; j++)
183 818156672 val += src[j][i] * (unsigned)filter[j];
184
185
2/2
✓ Branch 0 taken 39525632 times.
✓ Branch 1 taken 124912672 times.
164438304 output_pixel(&dest[i], val, 0x8000, int);
186 }
187 621952 }
188
189 static av_always_inline void
190 641224 yuv2nv12cX_16_c_template(int big_endian, const uint8_t *chrDither,
191 const int16_t *chrFilter, int chrFilterSize,
192 const int16_t **chrUSrc, const int16_t **chrVSrc,
193 uint8_t *dest8, int chrDstW, int output_bits)
194 {
195 641224 uint16_t *dest = (uint16_t*)dest8;
196 641224 const int32_t **uSrc = (const int32_t **)chrUSrc;
197 641224 const int32_t **vSrc = (const int32_t **)chrVSrc;
198 641224 int shift = 15;
199 int i, j;
200
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 641224 times.
641224 av_assert0(output_bits == 16);
201
202
2/2
✓ Branch 0 taken 166244576 times.
✓ Branch 1 taken 641224 times.
166885800 for (i = 0; i < chrDstW; i++) {
203 166244576 int u = 1 << (shift - 1);
204 166244576 int v = 1 << (shift - 1);
205
206 /* See yuv2planeX_16_c_template for details. */
207 166244576 u -= 0x40000000;
208 166244576 v -= 0x40000000;
209
2/2
✓ Branch 0 taken 358067328 times.
✓ Branch 1 taken 166244576 times.
524311904 for (j = 0; j < chrFilterSize; j++) {
210 358067328 u += uSrc[j][i] * (unsigned)chrFilter[j];
211 358067328 v += vSrc[j][i] * (unsigned)chrFilter[j];
212 }
213
214
2/2
✓ Branch 0 taken 59628400 times.
✓ Branch 1 taken 106616176 times.
166244576 output_pixel(&dest[2*i] , u, 0x8000, int);
215
2/2
✓ Branch 0 taken 59628400 times.
✓ Branch 1 taken 106616176 times.
166244576 output_pixel(&dest[2*i+1], v, 0x8000, int);
216 }
217 641224 }
218
219 static av_always_inline void
220 29392 yuv2plane1_float_c_template(const int32_t *src, float *dest, int dstW)
221 {
222 static const int big_endian = HAVE_BIGENDIAN;
223 static const int shift = 3;
224 static const float float_mult = 1.0f / 65535.0f;
225 int i, val;
226 uint16_t val_uint;
227
228
2/2
✓ Branch 0 taken 10340544 times.
✓ Branch 1 taken 29392 times.
10369936 for (i = 0; i < dstW; ++i){
229 10340544 val = src[i] + (1 << (shift - 1));
230
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10340544 times.
10340544 output_pixel(&val_uint, val, 0, uint);
231 10340544 dest[i] = float_mult * (float)val_uint;
232 }
233 29392 }
234
235 static av_always_inline void
236 13248 yuv2plane1_float_bswap_c_template(const int32_t *src, uint32_t *dest, int dstW)
237 {
238 static const int big_endian = HAVE_BIGENDIAN;
239 static const int shift = 3;
240 static const float float_mult = 1.0f / 65535.0f;
241 int i, val;
242 uint16_t val_uint;
243
244
2/2
✓ Branch 0 taken 4663296 times.
✓ Branch 1 taken 13248 times.
4676544 for (i = 0; i < dstW; ++i){
245 4663296 val = src[i] + (1 << (shift - 1));
246
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4663296 times.
4663296 output_pixel(&val_uint, val, 0, uint);
247 4663296 dest[i] = av_bswap32(av_float2int(float_mult * (float)val_uint));
248 }
249 13248 }
250
251 static av_always_inline void
252 200 yuv2planeX_float_c_template(const int16_t *filter, int filterSize, const int32_t **src,
253 float *dest, int dstW)
254 {
255 static const int big_endian = HAVE_BIGENDIAN;
256 static const int shift = 15;
257 static const float float_mult = 1.0f / 65535.0f;
258 int i, j, val;
259 uint16_t val_uint;
260
261
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 200 times.
40200 for (i = 0; i < dstW; ++i){
262 40000 val = (1 << (shift - 1)) - 0x40000000;
263
2/2
✓ Branch 0 taken 480000 times.
✓ Branch 1 taken 40000 times.
520000 for (j = 0; j < filterSize; ++j){
264 480000 val += src[j][i] * (unsigned)filter[j];
265 }
266
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 40000 times.
40000 output_pixel(&val_uint, val, 0x8000, int);
267 40000 dest[i] = float_mult * (float)val_uint;
268 }
269 200 }
270
271 static av_always_inline void
272 200 yuv2planeX_float_bswap_c_template(const int16_t *filter, int filterSize, const int32_t **src,
273 uint32_t *dest, int dstW)
274 {
275 static const int big_endian = HAVE_BIGENDIAN;
276 static const int shift = 15;
277 static const float float_mult = 1.0f / 65535.0f;
278 int i, j, val;
279 uint16_t val_uint;
280
281
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 200 times.
40200 for (i = 0; i < dstW; ++i){
282 40000 val = (1 << (shift - 1)) - 0x40000000;
283
2/2
✓ Branch 0 taken 480000 times.
✓ Branch 1 taken 40000 times.
520000 for (j = 0; j < filterSize; ++j){
284 480000 val += src[j][i] * (unsigned)filter[j];
285 }
286
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 40000 times.
40000 output_pixel(&val_uint, val, 0x8000, int);
287 40000 dest[i] = av_bswap32(av_float2int(float_mult * (float)val_uint));
288 }
289 200 }
290
291 #define yuv2plane1_float(template, dest_type, BE_LE) \
292 static void yuv2plane1_float ## BE_LE ## _c(const int16_t *src, uint8_t *dest, int dstW, \
293 const uint8_t *dither, int offset) \
294 { \
295 template((const int32_t *)src, (dest_type *)dest, dstW); \
296 }
297
298 #define yuv2planeX_float(template, dest_type, BE_LE) \
299 static void yuv2planeX_float ## BE_LE ## _c(const int16_t *filter, int filterSize, \
300 const int16_t **src, uint8_t *dest, int dstW, \
301 const uint8_t *dither, int offset) \
302 { \
303 template(filter, filterSize, (const int32_t **)src, (dest_type *)dest, dstW); \
304 }
305
306 #if HAVE_BIGENDIAN
307 yuv2plane1_float(yuv2plane1_float_c_template, float, BE)
308 yuv2plane1_float(yuv2plane1_float_bswap_c_template, uint32_t, LE)
309 yuv2planeX_float(yuv2planeX_float_c_template, float, BE)
310 yuv2planeX_float(yuv2planeX_float_bswap_c_template, uint32_t, LE)
311 #else
312 29392 yuv2plane1_float(yuv2plane1_float_c_template, float, LE)
313 13248 yuv2plane1_float(yuv2plane1_float_bswap_c_template, uint32_t, BE)
314 200 yuv2planeX_float(yuv2planeX_float_c_template, float, LE)
315 200 yuv2planeX_float(yuv2planeX_float_bswap_c_template, uint32_t, BE)
316 #endif
317
318 #undef output_pixel
319
320 #define output_pixel(pos, val) \
321 if (big_endian) { \
322 AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits)); \
323 } else { \
324 AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits)); \
325 }
326
327 static av_always_inline void
328 7151276 yuv2plane1_10_c_template(const int16_t *src, uint16_t *dest, int dstW,
329 int big_endian, int output_bits)
330 {
331 int i;
332 7151276 int shift = 15 - output_bits;
333
334
2/2
✓ Branch 0 taken 2337549224 times.
✓ Branch 1 taken 7151276 times.
2344700500 for (i = 0; i < dstW; i++) {
335 2337549224 int val = src[i] + (1 << (shift - 1));
336
2/2
✓ Branch 0 taken 488650752 times.
✓ Branch 1 taken 1848898472 times.
2337549224 output_pixel(&dest[i], val);
337 }
338 7151276 }
339
340 static av_always_inline void
341 3183768 yuv2planeX_10_c_template(const int16_t *filter, int filterSize,
342 const int16_t **src, uint16_t *dest, int dstW,
343 int big_endian, int output_bits)
344 {
345 int i;
346 3183768 int shift = 11 + 16 - output_bits;
347
348
2/2
✓ Branch 0 taken 990480776 times.
✓ Branch 1 taken 3183768 times.
993664544 for (i = 0; i < dstW; i++) {
349 990480776 int val = 1 << (shift - 1);
350 int j;
351
352
2/2
✓ Branch 0 taken 4717519584 times.
✓ Branch 1 taken 990480776 times.
5708000360 for (j = 0; j < filterSize; j++)
353 4717519584 val += src[j][i] * filter[j];
354
355
2/2
✓ Branch 0 taken 160650496 times.
✓ Branch 1 taken 829830280 times.
990480776 output_pixel(&dest[i], val);
356 }
357 3183768 }
358
359 #undef output_pixel
360
361 #define yuv2NBPS(bits, BE_LE, is_be, template_size, typeX_t) \
362 static void yuv2plane1_ ## bits ## BE_LE ## _c(const int16_t *src, \
363 uint8_t *dest, int dstW, \
364 const uint8_t *dither, int offset)\
365 { \
366 yuv2plane1_ ## template_size ## _c_template((const typeX_t *) src, \
367 (uint16_t *) dest, dstW, is_be, bits); \
368 }\
369 static void yuv2planeX_ ## bits ## BE_LE ## _c(const int16_t *filter, int filterSize, \
370 const int16_t **src, uint8_t *dest, int dstW, \
371 const uint8_t *dither, int offset)\
372 { \
373 yuv2planeX_## template_size ## _c_template(filter, \
374 filterSize, (const typeX_t **) src, \
375 (uint16_t *) dest, dstW, is_be, bits); \
376 }
377
378 256352 yuv2NBPS( 9, BE, 1, 10, int16_t)
379 286620 yuv2NBPS( 9, LE, 0, 10, int16_t)
380 1969024 yuv2NBPS(10, BE, 1, 10, int16_t)
381 10006796 yuv2NBPS(10, LE, 0, 10, int16_t)
382 1967824 yuv2NBPS(12, BE, 1, 10, int16_t)
383 5890960 yuv2NBPS(12, LE, 0, 10, int16_t)
384 137904 yuv2NBPS(14, BE, 1, 10, int16_t)
385 154608 yuv2NBPS(14, LE, 0, 10, int16_t)
386 2617688 yuv2NBPS(16, BE, 1, 16, int32_t)
387 4494596 yuv2NBPS(16, LE, 0, 16, int32_t)
388
389 #define output_pixel(pos, val) \
390 if (big_endian) { \
391 AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits) << (16 - output_bits)); \
392 } else { \
393 AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits) << (16 - output_bits)); \
394 }
395
396 static av_always_inline void
397 757440 yuv2msbplane1_10_c_template(const int16_t *src, uint16_t *dest, int dstW,
398 int big_endian, int output_bits)
399 {
400 int i;
401 757440 int shift = 15 - output_bits;
402
403
2/2
✓ Branch 0 taken 266471424 times.
✓ Branch 1 taken 757440 times.
267228864 for (i = 0; i < dstW; i++) {
404 266471424 int val = src[i] + (1 << (shift - 1));
405
2/2
✓ Branch 0 taken 133005312 times.
✓ Branch 1 taken 133466112 times.
266471424 output_pixel(&dest[i], val);
406 }
407 757440 }
408
409 static av_always_inline void
410 78432 yuv2msbplaneX_10_c_template(const int16_t *filter, int filterSize,
411 const int16_t **src, uint16_t *dest, int dstW,
412 int big_endian, int output_bits)
413 {
414 int i;
415 78432 int shift = 11 + 16 - output_bits;
416
417
2/2
✓ Branch 0 taken 27243264 times.
✓ Branch 1 taken 78432 times.
27321696 for (i = 0; i < dstW; i++) {
418 27243264 int val = 1 << (shift - 1);
419 int j;
420
421
2/2
✓ Branch 0 taken 112813056 times.
✓ Branch 1 taken 27243264 times.
140056320 for (j = 0; j < filterSize; j++)
422 112813056 val += src[j][i] * filter[j];
423
424
2/2
✓ Branch 0 taken 13216128 times.
✓ Branch 1 taken 14027136 times.
27243264 output_pixel(&dest[i], val);
425 }
426 78432 }
427
428 #define yuv2MSBNBPS(bits, BE_LE, is_be, template_size, typeX_t) \
429 static void yuv2msbplane1_ ## bits ## BE_LE ## _c(const int16_t *src, \
430 uint8_t *dest, int dstW, \
431 const uint8_t *dither, int offset)\
432 { \
433 yuv2msbplane1_ ## template_size ## _c_template((const typeX_t *) src, \
434 (uint16_t *) dest, dstW, is_be, bits); \
435 }\
436 static void yuv2msbplaneX_ ## bits ## BE_LE ## _c(const int16_t *filter, int filterSize, \
437 const int16_t **src, uint8_t *dest, int dstW, \
438 const uint8_t *dither, int offset)\
439 { \
440 yuv2msbplaneX_## template_size ## _c_template(filter, \
441 filterSize, (const typeX_t **) src, \
442 (uint16_t *) dest, dstW, is_be, bits); \
443 }
444
445 415920 yuv2MSBNBPS(10, BE, 1, 10, int16_t)
446 419952 yuv2MSBNBPS(10, LE, 0, 10, int16_t)
447 415920 yuv2MSBNBPS(12, BE, 1, 10, int16_t)
448 419952 yuv2MSBNBPS(12, LE, 0, 10, int16_t)
449
450 #undef output_pixel
451
452 386420 static void yuv2nv12cX_16LE_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
453 const int16_t *chrFilter, int chrFilterSize,
454 const int16_t **chrUSrc, const int16_t **chrVSrc,
455 uint8_t *dest8, int chrDstW)
456 {
457 386420 yuv2nv12cX_16_c_template(0, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, dest8, chrDstW, 16);
458 386420 }
459
460 254804 static void yuv2nv12cX_16BE_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
461 const int16_t *chrFilter, int chrFilterSize,
462 const int16_t **chrUSrc, const int16_t **chrVSrc,
463 uint8_t *dest8, int chrDstW)
464 {
465 254804 yuv2nv12cX_16_c_template(1, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, dest8, chrDstW, 16);
466 254804 }
467
468 11854360 static void yuv2planeX_8_c(const int16_t *filter, int filterSize,
469 const int16_t **src, uint8_t *dest, int dstW,
470 const uint8_t *dither, int offset)
471 {
472 int i;
473
2/2
✓ Branch 0 taken 7065895076 times.
✓ Branch 1 taken 11854360 times.
7077749436 for (i=0; i<dstW; i++) {
474 7065895076 int val = dither[(i + offset) & 7] << 12;
475 int j;
476
2/2
✓ Branch 0 taken 23385631036 times.
✓ Branch 1 taken 7065895076 times.
30451526112 for (j=0; j<filterSize; j++) {
477 23385631036 val += (unsigned)(src[j][i] * filter[j]);
478
479 }
480
481 7065895076 dest[i]= av_clip_uint8(val>>19);
482 }
483 11854360 }
484
485 22273792 static void yuv2plane1_8_c(const int16_t *src, uint8_t *dest, int dstW,
486 const uint8_t *dither, int offset)
487 {
488 int i;
489
2/2
✓ Branch 0 taken 5243545953 times.
✓ Branch 1 taken 22273792 times.
5265819745 for (i=0; i<dstW; i++) {
490 5243545953 int val = (src[i] + dither[(i + offset) & 7]) >> 7;
491 5243545953 dest[i]= av_clip_uint8(val);
492 }
493 22273792 }
494
495 858306 static void yuv2nv12cX_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
496 const int16_t *chrFilter, int chrFilterSize,
497 const int16_t **chrUSrc, const int16_t **chrVSrc,
498 uint8_t *dest, int chrDstW)
499 {
500 int i;
501
502
2/2
✓ Branch 1 taken 848214 times.
✓ Branch 2 taken 10092 times.
858306 if (!isSwappedChroma(dstFormat))
503
2/2
✓ Branch 0 taken 274976592 times.
✓ Branch 1 taken 848214 times.
275824806 for (i=0; i<chrDstW; i++) {
504 274976592 int u = chrDither[i & 7] << 12;
505 274976592 int v = chrDither[(i + 3) & 7] << 12;
506 int j;
507
2/2
✓ Branch 0 taken 516731488 times.
✓ Branch 1 taken 274976592 times.
791708080 for (j=0; j<chrFilterSize; j++) {
508 516731488 u += chrUSrc[j][i] * (unsigned)chrFilter[j];
509 516731488 v += chrVSrc[j][i] * (unsigned)chrFilter[j];
510 }
511
512 274976592 dest[2*i]= av_clip_uint8(u>>19);
513 274976592 dest[2*i+1]= av_clip_uint8(v>>19);
514 }
515 else
516
2/2
✓ Branch 0 taken 3496784 times.
✓ Branch 1 taken 10092 times.
3506876 for (i=0; i<chrDstW; i++) {
517 3496784 int u = chrDither[i & 7] << 12;
518 3496784 int v = chrDither[(i + 3) & 7] << 12;
519 int j;
520
2/2
✓ Branch 0 taken 14387136 times.
✓ Branch 1 taken 3496784 times.
17883920 for (j=0; j<chrFilterSize; j++) {
521 14387136 u += chrUSrc[j][i] * (unsigned)chrFilter[j];
522 14387136 v += chrVSrc[j][i] * (unsigned)chrFilter[j];
523 }
524
525 3496784 dest[2*i]= av_clip_uint8(v>>19);
526 3496784 dest[2*i+1]= av_clip_uint8(u>>19);
527 }
528 858306 }
529
530
531 #define output_pixel(pos, val) \
532 if (big_endian) { \
533 AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits) << output_shift); \
534 } else { \
535 AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits) << output_shift); \
536 }
537
538 2334528 static void yuv2p01xl1_c(const int16_t *src,
539 uint16_t *dest, int dstW,
540 int big_endian, int output_bits, int output_shift)
541 {
542 int i;
543 2334528 int shift = 15 - output_bits;
544
545
2/2
✓ Branch 0 taken 821753856 times.
✓ Branch 1 taken 2334528 times.
824088384 for (i = 0; i < dstW; i++) {
546 821753856 int val = src[i] + (1 << (shift - 1));
547
2/2
✓ Branch 0 taken 179841024 times.
✓ Branch 1 taken 641912832 times.
821753856 output_pixel(&dest[i], val);
548 }
549 2334528 }
550
551 2800 static void yuv2p01xlX_c(const int16_t *filter, int filterSize,
552 const int16_t **src, uint16_t *dest, int dstW,
553 int big_endian, int output_bits, int output_shift)
554 {
555 int i, j;
556 2800 int shift = 11 + 16 - output_bits;
557
558
2/2
✓ Branch 0 taken 560000 times.
✓ Branch 1 taken 2800 times.
562800 for (i = 0; i < dstW; i++) {
559 560000 int val = 1 << (shift - 1);
560
561
2/2
✓ Branch 0 taken 6720000 times.
✓ Branch 1 taken 560000 times.
7280000 for (j = 0; j < filterSize; j++)
562 6720000 val += src[j][i] * filter[j];
563
564
2/2
✓ Branch 0 taken 280000 times.
✓ Branch 1 taken 280000 times.
560000 output_pixel(&dest[i], val);
565 }
566 2800 }
567
568 2158944 static void yuv2p01xcX_c(int big_endian, const uint8_t *chrDither,
569 const int16_t *chrFilter, int chrFilterSize,
570 const int16_t **chrUSrc, const int16_t **chrVSrc,
571 uint8_t *dest8, int chrDstW, int output_bits, int output_shift)
572 {
573 2158944 uint16_t *dest = (uint16_t*)dest8;
574 int i, j;
575 2158944 int shift = 11 + 16 - output_bits;
576
577
2/2
✓ Branch 0 taken 660683264 times.
✓ Branch 1 taken 2158944 times.
662842208 for (i = 0; i < chrDstW; i++) {
578 660683264 int u = 1 << (shift - 1);
579 660683264 int v = 1 << (shift - 1);
580
581
2/2
✓ Branch 0 taken 1283509248 times.
✓ Branch 1 taken 660683264 times.
1944192512 for (j = 0; j < chrFilterSize; j++) {
582 1283509248 u += chrUSrc[j][i] * (unsigned)chrFilter[j];
583 1283509248 v += chrVSrc[j][i] * (unsigned)chrFilter[j];
584 }
585
586
2/2
✓ Branch 0 taken 98393344 times.
✓ Branch 1 taken 562289920 times.
660683264 output_pixel(&dest[2*i] , u);
587
2/2
✓ Branch 0 taken 98393344 times.
✓ Branch 1 taken 562289920 times.
660683264 output_pixel(&dest[2*i+1], v);
588 }
589 2158944 }
590
591 #undef output_pixel
592
593 #define yuv2p01x_wrapper(fmt, bits, shift) \
594 static void yuv2 ## fmt ## l1_LE_c(const int16_t *src, \
595 uint8_t *dest, int dstW, \
596 const uint8_t *dither, int offset) \
597 { \
598 yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 0, bits, shift); \
599 } \
600 \
601 static void yuv2 ## fmt ## l1_BE_c(const int16_t *src, \
602 uint8_t *dest, int dstW, \
603 const uint8_t *dither, int offset) \
604 { \
605 yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 1, bits, shift); \
606 } \
607 \
608 static void yuv2 ## fmt ## lX_LE_c(const int16_t *filter, \
609 int filterSize, const int16_t **src, \
610 uint8_t *dest, int dstW, \
611 const uint8_t *dither, int offset) \
612 { \
613 yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 0, \
614 bits, shift); \
615 } \
616 \
617 static void yuv2 ## fmt ## lX_BE_c(const int16_t *filter, \
618 int filterSize, const int16_t **src, \
619 uint8_t *dest, int dstW, \
620 const uint8_t *dither, int offset) \
621 { \
622 yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 1, \
623 bits, shift); \
624 } \
625 \
626 static void yuv2 ## fmt ## cX_LE_c(enum AVPixelFormat dstFormat, \
627 const uint8_t *chrDither, \
628 const int16_t *chrFilter, \
629 int chrFilterSize, \
630 const int16_t **chrUSrc, \
631 const int16_t **chrVSrc, \
632 uint8_t *dest8, int chrDstW) \
633 { \
634 yuv2p01xcX_c(0, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, \
635 dest8, chrDstW, bits, shift); \
636 } \
637 \
638 static void yuv2 ## fmt ## cX_BE_c(enum AVPixelFormat dstFormat, \
639 const uint8_t *chrDither, \
640 const int16_t *chrFilter, \
641 int chrFilterSize, \
642 const int16_t **chrUSrc, \
643 const int16_t **chrVSrc, \
644 uint8_t *dest8, int chrDstW) \
645 { \
646 yuv2p01xcX_c(1, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, \
647 dest8, chrDstW, bits, shift); \
648 }
649
650 4445936 yuv2p01x_wrapper(p010, 10, 6)
651 4473584 yuv2p01x_wrapper(p012, 12, 4)
652 73024 yuv2p01x_wrapper(nv20, 10, 0)
653
654 #define accumulate_bit(acc, val) \
655 acc <<= 1; \
656 acc |= (val) >= 234
657 #define output_pixel(pos, acc) \
658 if (target == AV_PIX_FMT_MONOBLACK) { \
659 pos = acc; \
660 } else { \
661 pos = ~acc; \
662 }
663
664 static av_always_inline void
665 93684 yuv2mono_X_c_template(SwsInternal *c, const int16_t *lumFilter,
666 const int16_t **lumSrc, int lumFilterSize,
667 const int16_t *chrFilter, const int16_t **chrUSrc,
668 const int16_t **chrVSrc, int chrFilterSize,
669 const int16_t **alpSrc, uint8_t *dest, int dstW,
670 int y, enum AVPixelFormat target)
671 {
672 93684 const uint8_t * const d128 = ff_dither_8x8_220[y&7];
673 int i;
674 93684 unsigned acc = 0;
675 93684 int err = 0;
676
677
2/2
✓ Branch 0 taken 16187684 times.
✓ Branch 1 taken 93684 times.
16281368 for (i = 0; i < dstW; i += 2) {
678 int j;
679 16187684 int Y1 = 1 << 18;
680 16187684 int Y2 = 1 << 18;
681
682
2/2
✓ Branch 0 taken 16627684 times.
✓ Branch 1 taken 16187684 times.
32815368 for (j = 0; j < lumFilterSize; j++) {
683 16627684 Y1 += lumSrc[j][i] * (unsigned)lumFilter[j];
684 16627684 Y2 += lumSrc[j][i+1] * (unsigned)lumFilter[j];
685 }
686 16187684 Y1 >>= 19;
687 16187684 Y2 >>= 19;
688
2/2
✓ Branch 0 taken 734 times.
✓ Branch 1 taken 16186950 times.
16187684 if ((Y1 | Y2) & 0x100) {
689 734 Y1 = av_clip_uint8(Y1);
690 734 Y2 = av_clip_uint8(Y2);
691 }
692
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16187684 times.
16187684 if (c->opts.dither == SWS_DITHER_ED) {
693 ✗ Y1 += (7*err + 1*c->dither_error[0][i] + 5*c->dither_error[0][i+1] + 3*c->dither_error[0][i+2] + 8 - 256)>>4;
694 ✗ c->dither_error[0][i] = err;
695 ✗ acc = 2*acc + (Y1 >= 128);
696 ✗ Y1 -= 220*(acc&1);
697
698 ✗ err = Y2 + ((7*Y1 + 1*c->dither_error[0][i+1] + 5*c->dither_error[0][i+2] + 3*c->dither_error[0][i+3] + 8 - 256)>>4);
699 ✗ c->dither_error[0][i+1] = Y1;
700 ✗ acc = 2*acc + (err >= 128);
701 ✗ err -= 220*(acc&1);
702 } else {
703 16187684 accumulate_bit(acc, Y1 + d128[(i + 0) & 7]);
704 16187684 accumulate_bit(acc, Y2 + d128[(i + 1) & 7]);
705 }
706
2/2
✓ Branch 0 taken 4046496 times.
✓ Branch 1 taken 12141188 times.
16187684 if ((i & 7) == 6) {
707
2/2
✓ Branch 0 taken 790664 times.
✓ Branch 1 taken 3255832 times.
4046496 output_pixel(*dest++, acc);
708 }
709 }
710 93684 c->dither_error[0][i] = err;
711
712
2/2
✓ Branch 0 taken 1700 times.
✓ Branch 1 taken 91984 times.
93684 if (i & 6) {
713
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1700 times.
1700 output_pixel(*dest, acc);
714 }
715 93684 }
716
717 static av_always_inline void
718 ✗ yuv2mono_2_c_template(SwsInternal *c, const int16_t *buf[2],
719 const int16_t *ubuf[2], const int16_t *vbuf[2],
720 const int16_t *abuf[2], uint8_t *dest, int dstW,
721 int yalpha, int uvalpha, int y,
722 enum AVPixelFormat target)
723 {
724 ✗ const int16_t *buf0 = buf[0], *buf1 = buf[1];
725 ✗ const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
726 ✗ int yalpha1 = 4096 - yalpha;
727 int i;
728 av_assert2(yalpha <= 4096U);
729
730 ✗ if (c->opts.dither == SWS_DITHER_ED) {
731 ✗ int err = 0;
732 ✗ unsigned acc = 0;
733 ✗ for (i = 0; i < dstW; i +=2) {
734 int Y;
735
736 ✗ Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
737 ✗ Y += (7*err + 1*c->dither_error[0][i] + 5*c->dither_error[0][i+1] + 3*c->dither_error[0][i+2] + 8 - 256)>>4;
738 ✗ c->dither_error[0][i] = err;
739 ✗ acc = 2*acc + (Y >= 128);
740 ✗ Y -= 220*(acc&1);
741
742 ✗ err = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
743 ✗ err += (7*Y + 1*c->dither_error[0][i+1] + 5*c->dither_error[0][i+2] + 3*c->dither_error[0][i+3] + 8 - 256)>>4;
744 ✗ c->dither_error[0][i+1] = Y;
745 ✗ acc = 2*acc + (err >= 128);
746 ✗ err -= 220*(acc&1);
747
748 ✗ if ((i & 7) == 6)
749 ✗ output_pixel(*dest++, acc);
750 }
751 ✗ c->dither_error[0][i] = err;
752 } else {
753 ✗ for (i = 0; i < dstW; i += 8) {
754 int Y;
755 ✗ unsigned acc = 0;
756
757 ✗ Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
758 ✗ accumulate_bit(acc, Y + d128[0]);
759 ✗ Y = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
760 ✗ accumulate_bit(acc, Y + d128[1]);
761 ✗ Y = (buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19;
762 ✗ accumulate_bit(acc, Y + d128[2]);
763 ✗ Y = (buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19;
764 ✗ accumulate_bit(acc, Y + d128[3]);
765 ✗ Y = (buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19;
766 ✗ accumulate_bit(acc, Y + d128[4]);
767 ✗ Y = (buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19;
768 ✗ accumulate_bit(acc, Y + d128[5]);
769 ✗ Y = (buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19;
770 ✗ accumulate_bit(acc, Y + d128[6]);
771 ✗ Y = (buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19;
772 ✗ accumulate_bit(acc, Y + d128[7]);
773
774 ✗ output_pixel(*dest++, acc);
775 }
776 }
777 ✗ }
778
779 static av_always_inline void
780 175488 yuv2mono_1_c_template(SwsInternal *c, const int16_t *buf0,
781 const int16_t *ubuf[2], const int16_t *vbuf[2],
782 const int16_t *abuf0, uint8_t *dest, int dstW,
783 int uvalpha, int y, enum AVPixelFormat target)
784 {
785 175488 const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
786 int i;
787
788
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 175488 times.
175488 if (c->opts.dither == SWS_DITHER_ED) {
789 ✗ int err = 0;
790 ✗ unsigned acc = 0;
791 ✗ for (i = 0; i < dstW; i +=2) {
792 int Y;
793
794 ✗ Y = ((buf0[i + 0] + 64) >> 7);
795 ✗ Y += (7*err + 1*c->dither_error[0][i] + 5*c->dither_error[0][i+1] + 3*c->dither_error[0][i+2] + 8 - 256)>>4;
796 ✗ c->dither_error[0][i] = err;
797 ✗ acc = 2*acc + (Y >= 128);
798 ✗ Y -= 220*(acc&1);
799
800 ✗ err = ((buf0[i + 1] + 64) >> 7);
801 ✗ err += (7*Y + 1*c->dither_error[0][i+1] + 5*c->dither_error[0][i+2] + 3*c->dither_error[0][i+3] + 8 - 256)>>4;
802 ✗ c->dither_error[0][i+1] = Y;
803 ✗ acc = 2*acc + (err >= 128);
804 ✗ err -= 220*(acc&1);
805
806 ✗ if ((i & 7) == 6)
807 ✗ output_pixel(*dest++, acc);
808 }
809 ✗ c->dither_error[0][i] = err;
810 } else {
811
2/2
✓ Branch 0 taken 7319808 times.
✓ Branch 1 taken 175488 times.
7495296 for (i = 0; i < dstW; i += 8) {
812 7319808 unsigned acc = 0;
813 7319808 accumulate_bit(acc, ((buf0[i + 0] + 64) >> 7) + d128[0]);
814 7319808 accumulate_bit(acc, ((buf0[i + 1] + 64) >> 7) + d128[1]);
815 7319808 accumulate_bit(acc, ((buf0[i + 2] + 64) >> 7) + d128[2]);
816 7319808 accumulate_bit(acc, ((buf0[i + 3] + 64) >> 7) + d128[3]);
817 7319808 accumulate_bit(acc, ((buf0[i + 4] + 64) >> 7) + d128[4]);
818 7319808 accumulate_bit(acc, ((buf0[i + 5] + 64) >> 7) + d128[5]);
819 7319808 accumulate_bit(acc, ((buf0[i + 6] + 64) >> 7) + d128[6]);
820 7319808 accumulate_bit(acc, ((buf0[i + 7] + 64) >> 7) + d128[7]);
821
822
2/2
✓ Branch 0 taken 3631104 times.
✓ Branch 1 taken 3688704 times.
7319808 output_pixel(*dest++, acc);
823 }
824 }
825 175488 }
826
827 #undef output_pixel
828 #undef accumulate_bit
829
830 #define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
831 static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
832 const int16_t **lumSrc, int lumFilterSize, \
833 const int16_t *chrFilter, const int16_t **chrUSrc, \
834 const int16_t **chrVSrc, int chrFilterSize, \
835 const int16_t **alpSrc, uint8_t *dest, int dstW, \
836 int y) \
837 { \
838 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
839 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
840 alpSrc, dest, dstW, y, fmt); \
841 } \
842 \
843 static void name ## ext ## _2_c(SwsInternal *c, const int16_t *buf[2], \
844 const int16_t *ubuf[2], const int16_t *vbuf[2], \
845 const int16_t *abuf[2], uint8_t *dest, int dstW, \
846 int yalpha, int uvalpha, int y) \
847 { \
848 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
849 dest, dstW, yalpha, uvalpha, y, fmt); \
850 } \
851 \
852 static void name ## ext ## _1_c(SwsInternal *c, const int16_t *buf0, \
853 const int16_t *ubuf[2], const int16_t *vbuf[2], \
854 const int16_t *abuf0, uint8_t *dest, int dstW, \
855 int uvalpha, int y) \
856 { \
857 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, \
858 abuf0, dest, dstW, uvalpha, \
859 y, fmt); \
860 }
861
862 336344 YUV2PACKEDWRAPPER(yuv2mono,, white, AV_PIX_FMT_MONOWHITE)
863 202000 YUV2PACKEDWRAPPER(yuv2mono,, black, AV_PIX_FMT_MONOBLACK)
864
865 #define output_pixels(pos, Y1, U, Y2, V) \
866 if (target == AV_PIX_FMT_YUYV422) { \
867 dest[pos + 0] = Y1; \
868 dest[pos + 1] = U; \
869 dest[pos + 2] = Y2; \
870 dest[pos + 3] = V; \
871 } else if (target == AV_PIX_FMT_YVYU422) { \
872 dest[pos + 0] = Y1; \
873 dest[pos + 1] = V; \
874 dest[pos + 2] = Y2; \
875 dest[pos + 3] = U; \
876 } else { /* AV_PIX_FMT_UYVY422 */ \
877 dest[pos + 0] = U; \
878 dest[pos + 1] = Y1; \
879 dest[pos + 2] = V; \
880 dest[pos + 3] = Y2; \
881 }
882
883 static av_always_inline void
884 32280 yuv2422_X_c_template(SwsInternal *c, const int16_t *lumFilter,
885 const int16_t **lumSrc, int lumFilterSize,
886 const int16_t *chrFilter, const int16_t **chrUSrc,
887 const int16_t **chrVSrc, int chrFilterSize,
888 const int16_t **alpSrc, uint8_t *dest, int dstW,
889 int y, enum AVPixelFormat target)
890 {
891 int i;
892
893
2/2
✓ Branch 0 taken 5635680 times.
✓ Branch 1 taken 32280 times.
5667960 for (i = 0; i < ((dstW + 1) >> 1); i++) {
894 int j;
895 5635680 int Y1 = 1 << 18;
896 5635680 int Y2 = 1 << 18;
897 5635680 int U = 1 << 18;
898 5635680 int V = 1 << 18;
899
900
2/2
✓ Branch 0 taken 6295680 times.
✓ Branch 1 taken 5635680 times.
11931360 for (j = 0; j < lumFilterSize; j++) {
901 6295680 Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j];
902 6295680 Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
903 }
904
2/2
✓ Branch 0 taken 23022720 times.
✓ Branch 1 taken 5635680 times.
28658400 for (j = 0; j < chrFilterSize; j++) {
905 23022720 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
906 23022720 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
907 }
908 5635680 Y1 >>= 19;
909 5635680 Y2 >>= 19;
910 5635680 U >>= 19;
911 5635680 V >>= 19;
912
2/2
✓ Branch 0 taken 35 times.
✓ Branch 1 taken 5635645 times.
5635680 if ((Y1 | Y2 | U | V) & 0x100) {
913 35 Y1 = av_clip_uint8(Y1);
914 35 Y2 = av_clip_uint8(Y2);
915 35 U = av_clip_uint8(U);
916 35 V = av_clip_uint8(V);
917 }
918
4/4
✓ Branch 0 taken 2757152 times.
✓ Branch 1 taken 2878528 times.
✓ Branch 2 taken 1439264 times.
✓ Branch 3 taken 1439264 times.
5635680 output_pixels(4*i, Y1, U, Y2, V);
919 }
920 32280 }
921
922 static av_always_inline void
923 ✗ yuv2422_2_c_template(SwsInternal *c, const int16_t *buf[2],
924 const int16_t *ubuf[2], const int16_t *vbuf[2],
925 const int16_t *abuf[2], uint8_t *dest, int dstW,
926 int yalpha, int uvalpha, int y,
927 enum AVPixelFormat target)
928 {
929 ✗ const int16_t *buf0 = buf[0], *buf1 = buf[1],
930 ✗ *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
931 ✗ *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
932 ✗ int yalpha1 = 4096 - yalpha;
933 ✗ int uvalpha1 = 4096 - uvalpha;
934 int i;
935 av_assert2(yalpha <= 4096U);
936 av_assert2(uvalpha <= 4096U);
937
938 ✗ for (i = 0; i < ((dstW + 1) >> 1); i++) {
939 ✗ int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
940 ✗ int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
941 ✗ int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
942 ✗ int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
943
944 ✗ if ((Y1 | Y2 | U | V) & 0x100) {
945 ✗ Y1 = av_clip_uint8(Y1);
946 ✗ Y2 = av_clip_uint8(Y2);
947 ✗ U = av_clip_uint8(U);
948 ✗ V = av_clip_uint8(V);
949 }
950
951 ✗ output_pixels(i * 4, Y1, U, Y2, V);
952 }
953 ✗ }
954
955 static av_always_inline void
956 333504 yuv2422_1_c_template(SwsInternal *c, const int16_t *buf0,
957 const int16_t *ubuf[2], const int16_t *vbuf[2],
958 const int16_t *abuf0, uint8_t *dest, int dstW,
959 int uvalpha, int y, enum AVPixelFormat target)
960 {
961 333504 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
962 int i;
963
964
1/2
✓ Branch 0 taken 333504 times.
✗ Branch 1 not taken.
333504 if (uvalpha < 2048) {
965
2/2
✓ Branch 0 taken 74594304 times.
✓ Branch 1 taken 333504 times.
74927808 for (i = 0; i < ((dstW + 1) >> 1); i++) {
966 74594304 int Y1 = (buf0[i * 2 ]+64) >> 7;
967 74594304 int Y2 = (buf0[i * 2 + 1]+64) >> 7;
968 74594304 int U = (ubuf0[i] +64) >> 7;
969 74594304 int V = (vbuf0[i] +64) >> 7;
970
971
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 74594304 times.
74594304 if ((Y1 | Y2 | U | V) & 0x100) {
972 ✗ Y1 = av_clip_uint8(Y1);
973 ✗ Y2 = av_clip_uint8(Y2);
974 ✗ U = av_clip_uint8(U);
975 ✗ V = av_clip_uint8(V);
976 }
977
978
4/4
✓ Branch 0 taken 14496768 times.
✓ Branch 1 taken 60097536 times.
✓ Branch 2 taken 14496768 times.
✓ Branch 3 taken 45600768 times.
74594304 output_pixels(i * 4, Y1, U, Y2, V);
979 }
980 } else {
981 ✗ const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
982 ✗ for (i = 0; i < ((dstW + 1) >> 1); i++) {
983 ✗ int Y1 = (buf0[i * 2 ] + 64) >> 7;
984 ✗ int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
985 ✗ int U = (ubuf0[i] + ubuf1[i]+128) >> 8;
986 ✗ int V = (vbuf0[i] + vbuf1[i]+128) >> 8;
987
988 ✗ if ((Y1 | Y2 | U | V) & 0x100) {
989 ✗ Y1 = av_clip_uint8(Y1);
990 ✗ Y2 = av_clip_uint8(Y2);
991 ✗ U = av_clip_uint8(U);
992 ✗ V = av_clip_uint8(V);
993 }
994
995 ✗ output_pixels(i * 4, Y1, U, Y2, V);
996 }
997 }
998 333504 }
999
1000 #undef output_pixels
1001
1002 196240 YUV2PACKEDWRAPPER(yuv2, 422, yuyv422, AV_PIX_FMT_YUYV422)
1003 181264 YUV2PACKEDWRAPPER(yuv2, 422, yvyu422, AV_PIX_FMT_YVYU422)
1004 354064 YUV2PACKEDWRAPPER(yuv2, 422, uyvy422, AV_PIX_FMT_UYVY422)
1005
1006 #define R_B ((target == AV_PIX_FMT_RGB48LE || target == AV_PIX_FMT_RGB48BE || target == AV_PIX_FMT_RGBA64LE || target == AV_PIX_FMT_RGBA64BE) ? R : B)
1007 #define B_R ((target == AV_PIX_FMT_RGB48LE || target == AV_PIX_FMT_RGB48BE || target == AV_PIX_FMT_RGBA64LE || target == AV_PIX_FMT_RGBA64BE) ? B : R)
1008 #define output_pixel(pos, val) \
1009 if (is_be) { \
1010 AV_WB16(pos, val); \
1011 } else { \
1012 AV_WL16(pos, val); \
1013 }
1014
1015 static av_always_inline void
1016 19408 yuv2ya16_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1017 const int32_t **lumSrc, int lumFilterSize,
1018 const int16_t *chrFilter, const int32_t **unused_chrUSrc,
1019 const int32_t **unused_chrVSrc, int unused_chrFilterSize,
1020 const int32_t **alpSrc, uint16_t *dest, int dstW,
1021 int y, enum AVPixelFormat target,
1022 int unused_hasAlpha, int unused_eightbytes, int is_be)
1023 {
1024 19408 int hasAlpha = !!alpSrc;
1025 int i;
1026
1027
2/2
✓ Branch 0 taken 6770816 times.
✓ Branch 1 taken 19408 times.
6790224 for (i = 0; i < dstW; i++) {
1028 int j;
1029 6770816 int Y = -0x40000000;
1030 6770816 int A = 0xffff;
1031
1032
2/2
✓ Branch 0 taken 7650816 times.
✓ Branch 1 taken 6770816 times.
14421632 for (j = 0; j < lumFilterSize; j++)
1033 7650816 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
1034
1035 6770816 Y >>= 15;
1036 6770816 Y += (1<<3) + 0x8000;
1037 6770816 Y = av_clip_uint16(Y);
1038
1039
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 6690816 times.
6770816 if (hasAlpha) {
1040 80000 A = -0x40000000 + (1<<14);
1041
2/2
✓ Branch 0 taken 960000 times.
✓ Branch 1 taken 80000 times.
1040000 for (j = 0; j < lumFilterSize; j++)
1042 960000 A += alpSrc[j][i] * (unsigned)lumFilter[j];
1043
1044 80000 A >>= 15;
1045 80000 A += 0x8000;
1046 80000 A = av_clip_uint16(A);
1047 }
1048
1049
2/2
✓ Branch 0 taken 3284032 times.
✓ Branch 1 taken 3486784 times.
6770816 output_pixel(&dest[2 * i ], Y);
1050
2/2
✓ Branch 0 taken 3284032 times.
✓ Branch 1 taken 3486784 times.
6770816 output_pixel(&dest[2 * i + 1], A);
1051 }
1052 19408 }
1053
1054 static av_always_inline void
1055 ✗ yuv2ya16_2_c_template(SwsInternal *c, const int32_t *buf[2],
1056 const int32_t *unused_ubuf[2], const int32_t *unused_vbuf[2],
1057 const int32_t *abuf[2], uint16_t *dest, int dstW,
1058 int yalpha_param, int unused_uvalpha, int y,
1059 enum AVPixelFormat target, int unused_hasAlpha,
1060 int unused_eightbytes, int is_be)
1061 {
1062 ✗ unsigned yalpha = yalpha_param;
1063 ✗ int hasAlpha = abuf && abuf[0] && abuf[1];
1064 ✗ const int32_t *buf0 = buf[0], *buf1 = buf[1],
1065 ✗ *abuf0 = hasAlpha ? abuf[0] : NULL,
1066 ✗ *abuf1 = hasAlpha ? abuf[1] : NULL;
1067 ✗ unsigned yalpha1 = 4096 - yalpha;
1068 int i;
1069
1070 av_assert2(yalpha <= 4096U);
1071
1072 ✗ for (i = 0; i < dstW; i++) {
1073 ✗ int Y = (int)(buf0[i] * yalpha1 + buf1[i] * yalpha) >> 15;
1074 int A;
1075
1076 ✗ Y = av_clip_uint16(Y);
1077
1078 ✗ if (hasAlpha) {
1079 ✗ A = (int)(abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 15;
1080 ✗ A = av_clip_uint16(A);
1081 }
1082
1083 ✗ output_pixel(&dest[2 * i ], Y);
1084 ✗ output_pixel(&dest[2 * i + 1], hasAlpha ? A : 65535);
1085 }
1086 ✗ }
1087
1088 static av_always_inline void
1089 1152 yuv2ya16_1_c_template(SwsInternal *c, const int32_t *buf0,
1090 const int32_t *unused_ubuf[2], const int32_t *unused_vbuf[2],
1091 const int32_t *abuf0, uint16_t *dest, int dstW,
1092 int unused_uvalpha, int y, enum AVPixelFormat target,
1093 int unused_hasAlpha, int unused_eightbytes, int is_be)
1094 {
1095 1152 int hasAlpha = !!abuf0;
1096 int i;
1097
1098
2/2
✓ Branch 0 taken 110592 times.
✓ Branch 1 taken 1152 times.
111744 for (i = 0; i < dstW; i++) {
1099 110592 int Y = buf0[i] >> 3;/* 19 - 16 */
1100 int A;
1101
1102 110592 Y = av_clip_uint16(Y);
1103
1104
1/2
✓ Branch 0 taken 110592 times.
✗ Branch 1 not taken.
110592 if (hasAlpha) {
1105 110592 A = abuf0[i] >> 3;
1106
2/2
✓ Branch 0 taken 56628 times.
✓ Branch 1 taken 53964 times.
110592 if (A & 0x100)
1107 56628 A = av_clip_uint16(A);
1108 }
1109
1110
2/2
✓ Branch 0 taken 55296 times.
✓ Branch 1 taken 55296 times.
110592 output_pixel(&dest[2 * i ], Y);
1111
4/6
✓ Branch 0 taken 55296 times.
✓ Branch 1 taken 55296 times.
✓ Branch 2 taken 55296 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 55296 times.
✗ Branch 5 not taken.
110592 output_pixel(&dest[2 * i + 1], hasAlpha ? A : 65535);
1112 }
1113 1152 }
1114
1115 static av_always_inline void
1116 297536 yuv2rgba64_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1117 const int32_t **lumSrc, int lumFilterSize,
1118 const int16_t *chrFilter, const int32_t **chrUSrc,
1119 const int32_t **chrVSrc, int chrFilterSize,
1120 const int32_t **alpSrc, uint16_t *dest, int dstW,
1121 int y, enum AVPixelFormat target, int hasAlpha, int eightbytes,
1122 int is_be)
1123 {
1124 int i;
1125 297536 int A1 = 0xffff<<14, A2 = 0xffff<<14;
1126
1127
2/2
✓ Branch 0 taken 52168176 times.
✓ Branch 1 taken 297536 times.
52465712 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1128 int j;
1129 52168176 unsigned Y1 = -0x40000000;
1130 52168176 unsigned Y2 = -0x40000000;
1131 52168176 unsigned U = -(128 << 23); // 19
1132 52168176 unsigned V = -(128 << 23);
1133 int R, G, B;
1134
1135
2/2
✓ Branch 0 taken 52716480 times.
✓ Branch 1 taken 52168176 times.
104884656 for (j = 0; j < lumFilterSize; j++) {
1136 52716480 Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j];
1137 52716480 Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1138 }
1139
2/2
✓ Branch 0 taken 208734144 times.
✓ Branch 1 taken 52168176 times.
260902320 for (j = 0; j < chrFilterSize; j++) {;
1140 208734144 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
1141 208734144 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
1142 }
1143
1144
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 52168176 times.
52168176 if (hasAlpha) {
1145 ✗ A1 = -0x40000000;
1146 ✗ A2 = -0x40000000;
1147 ✗ for (j = 0; j < lumFilterSize; j++) {
1148 ✗ A1 += alpSrc[j][i * 2] * (unsigned)lumFilter[j];
1149 ✗ A2 += alpSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1150 }
1151 ✗ A1 >>= 1;
1152 ✗ A1 += 0x20002000;
1153 ✗ A2 >>= 1;
1154 ✗ A2 += 0x20002000;
1155 }
1156
1157 // 8 bits: 12+15=27; 16 bits: 12+19=31
1158 52168176 Y1 = (int)Y1 >> 14; // 10
1159 52168176 Y1 += 0x10000;
1160 52168176 Y2 = (int)Y2 >> 14;
1161 52168176 Y2 += 0x10000;
1162 52168176 U = (int)U >> 14;
1163 52168176 V = (int)V >> 14;
1164
1165 // 8 bits: 27 -> 17 bits, 16 bits: 31 - 14 = 17 bits
1166 52168176 Y1 -= c->yuv2rgb_y_offset;
1167 52168176 Y2 -= c->yuv2rgb_y_offset;
1168 52168176 Y1 *= c->yuv2rgb_y_coeff;
1169 52168176 Y2 *= c->yuv2rgb_y_coeff;
1170 52168176 Y1 += (1 << 13) - (1 << 29); // 21
1171 52168176 Y2 += (1 << 13) - (1 << 29);
1172 // 8 bits: 17 + 13 bits = 30 bits, 16 bits: 17 + 13 bits = 30 bits
1173
1174 52168176 R = V * c->yuv2rgb_v2r_coeff;
1175 52168176 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1176 52168176 B = U * c->yuv2rgb_u2b_coeff;
1177
1178 // 8 bits: 30 - 22 = 8 bits, 16 bits: 30 bits - 14 = 16 bits
1179
14/18
✓ Branch 0 taken 9535488 times.
✓ Branch 1 taken 42632688 times.
✓ Branch 2 taken 9535488 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4870656 times.
✓ Branch 5 taken 4664832 times.
✓ Branch 6 taken 4870656 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1623552 times.
✓ Branch 9 taken 3247104 times.
✓ Branch 10 taken 5985792 times.
✓ Branch 11 taken 36646896 times.
✓ Branch 12 taken 5985792 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3348480 times.
✓ Branch 15 taken 2637312 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3348480 times.
52168176 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1180
2/2
✓ Branch 0 taken 9535488 times.
✓ Branch 1 taken 42632688 times.
52168176 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y1) >> 14) + (1<<15), 16));
1181
14/18
✓ Branch 0 taken 9535488 times.
✓ Branch 1 taken 42632688 times.
✓ Branch 2 taken 9535488 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4870656 times.
✓ Branch 5 taken 4664832 times.
✓ Branch 6 taken 4870656 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1623552 times.
✓ Branch 9 taken 3247104 times.
✓ Branch 10 taken 5985792 times.
✓ Branch 11 taken 36646896 times.
✓ Branch 12 taken 5985792 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3348480 times.
✓ Branch 15 taken 2637312 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3348480 times.
52168176 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1182
2/2
✓ Branch 0 taken 7507968 times.
✓ Branch 1 taken 44660208 times.
52168176 if (eightbytes) {
1183
2/2
✓ Branch 0 taken 3247104 times.
✓ Branch 1 taken 4260864 times.
7507968 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1184
12/18
✓ Branch 0 taken 3247104 times.
✓ Branch 1 taken 4260864 times.
✓ Branch 2 taken 3247104 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3247104 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3247104 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1623552 times.
✓ Branch 9 taken 1623552 times.
✓ Branch 10 taken 4260864 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4260864 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1623552 times.
✓ Branch 15 taken 2637312 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1623552 times.
7507968 output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1185
2/2
✓ Branch 0 taken 3247104 times.
✓ Branch 1 taken 4260864 times.
7507968 output_pixel(&dest[5], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1186
12/18
✓ Branch 0 taken 3247104 times.
✓ Branch 1 taken 4260864 times.
✓ Branch 2 taken 3247104 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3247104 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3247104 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1623552 times.
✓ Branch 9 taken 1623552 times.
✓ Branch 10 taken 4260864 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4260864 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1623552 times.
✓ Branch 15 taken 2637312 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1623552 times.
7507968 output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1187
2/2
✓ Branch 0 taken 3247104 times.
✓ Branch 1 taken 4260864 times.
7507968 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1188 7507968 dest += 8;
1189 } else {
1190
12/18
✓ Branch 0 taken 6288384 times.
✓ Branch 1 taken 38371824 times.
✓ Branch 2 taken 6288384 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1623552 times.
✓ Branch 5 taken 4664832 times.
✓ Branch 6 taken 1623552 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1623552 times.
✓ Branch 10 taken 1724928 times.
✓ Branch 11 taken 36646896 times.
✓ Branch 12 taken 1724928 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1724928 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1724928 times.
44660208 output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1191
2/2
✓ Branch 0 taken 6288384 times.
✓ Branch 1 taken 38371824 times.
44660208 output_pixel(&dest[4], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1192
12/18
✓ Branch 0 taken 6288384 times.
✓ Branch 1 taken 38371824 times.
✓ Branch 2 taken 6288384 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1623552 times.
✓ Branch 5 taken 4664832 times.
✓ Branch 6 taken 1623552 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1623552 times.
✓ Branch 10 taken 1724928 times.
✓ Branch 11 taken 36646896 times.
✓ Branch 12 taken 1724928 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1724928 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1724928 times.
44660208 output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1193 44660208 dest += 6;
1194 }
1195 }
1196 297536 }
1197
1198 static av_always_inline void
1199 72 yuv2rgba64_2_c_template(SwsInternal *c, const int32_t *buf[2],
1200 const int32_t *ubuf[2], const int32_t *vbuf[2],
1201 const int32_t *abuf[2], uint16_t *dest, int dstW,
1202 int yalpha_param, int uvalpha_param, int y,
1203 enum AVPixelFormat target, int hasAlpha, int eightbytes,
1204 int is_be)
1205 {
1206 72 unsigned yalpha = yalpha_param;
1207 72 unsigned uvalpha = uvalpha_param;
1208 72 const int32_t *buf0 = buf[0], *buf1 = buf[1],
1209 72 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1210 72 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1211
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 72 times.
72 *abuf0 = hasAlpha ? abuf[0] : NULL,
1212
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 72 times.
72 *abuf1 = hasAlpha ? abuf[1] : NULL;
1213 72 unsigned yalpha1 = 4096 - yalpha;
1214 72 unsigned uvalpha1 = 4096 - uvalpha;
1215 int i;
1216 72 int A1 = 0xffff<<14, A2 = 0xffff<<14;
1217
1218 av_assert2(yalpha <= 4096U);
1219 av_assert2(uvalpha <= 4096U);
1220
1221
2/2
✓ Branch 0 taken 18432 times.
✓ Branch 1 taken 72 times.
18504 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1222 18432 unsigned Y1 = (int)(buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 14;
1223 18432 unsigned Y2 = (int)(buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 14;
1224 18432 int U = (int)(ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1225 18432 int V = (int)(vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1226 int R, G, B;
1227
1228 18432 Y1 -= c->yuv2rgb_y_offset;
1229 18432 Y2 -= c->yuv2rgb_y_offset;
1230 18432 Y1 *= c->yuv2rgb_y_coeff;
1231 18432 Y2 *= c->yuv2rgb_y_coeff;
1232 18432 Y1 += (1 << 13) - (1 << 29);
1233 18432 Y2 += (1 << 13) - (1 << 29);
1234
1235 18432 R = (SUINT)V * c->yuv2rgb_v2r_coeff;
1236 18432 G = (SUINT)V * c->yuv2rgb_v2g_coeff + (SUINT)U * c->yuv2rgb_u2g_coeff;
1237 18432 B = (SUINT)U * c->yuv2rgb_u2b_coeff;
1238
1239
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18432 times.
18432 if (hasAlpha) {
1240 ✗ A1 = (int)(abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 1;
1241 ✗ A2 = (int)(abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 1;
1242
1243 ✗ A1 += 1 << 13;
1244 ✗ A2 += 1 << 13;
1245 }
1246
1247
14/18
✓ Branch 0 taken 9216 times.
✓ Branch 1 taken 9216 times.
✓ Branch 2 taken 9216 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6912 times.
✓ Branch 5 taken 2304 times.
✓ Branch 6 taken 6912 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2304 times.
✓ Branch 9 taken 4608 times.
✓ Branch 10 taken 6912 times.
✓ Branch 11 taken 2304 times.
✓ Branch 12 taken 6912 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4608 times.
✓ Branch 15 taken 2304 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 4608 times.
18432 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1248
2/2
✓ Branch 0 taken 9216 times.
✓ Branch 1 taken 9216 times.
18432 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y1) >> 14) + (1<<15), 16));
1249
14/18
✓ Branch 0 taken 9216 times.
✓ Branch 1 taken 9216 times.
✓ Branch 2 taken 9216 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6912 times.
✓ Branch 5 taken 2304 times.
✓ Branch 6 taken 6912 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2304 times.
✓ Branch 9 taken 4608 times.
✓ Branch 10 taken 6912 times.
✓ Branch 11 taken 2304 times.
✓ Branch 12 taken 6912 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4608 times.
✓ Branch 15 taken 2304 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 4608 times.
18432 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1250
2/2
✓ Branch 0 taken 9216 times.
✓ Branch 1 taken 9216 times.
18432 if (eightbytes) {
1251
2/2
✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 4608 times.
9216 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1252
12/18
✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 4608 times.
✓ Branch 2 taken 4608 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4608 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4608 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2304 times.
✓ Branch 9 taken 2304 times.
✓ Branch 10 taken 4608 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4608 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2304 times.
✓ Branch 15 taken 2304 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2304 times.
9216 output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1253
2/2
✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 4608 times.
9216 output_pixel(&dest[5], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1254
12/18
✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 4608 times.
✓ Branch 2 taken 4608 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4608 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4608 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2304 times.
✓ Branch 9 taken 2304 times.
✓ Branch 10 taken 4608 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4608 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2304 times.
✓ Branch 15 taken 2304 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2304 times.
9216 output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1255
2/2
✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 4608 times.
9216 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1256 9216 dest += 8;
1257 } else {
1258
12/18
✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 4608 times.
✓ Branch 2 taken 4608 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2304 times.
✓ Branch 5 taken 2304 times.
✓ Branch 6 taken 2304 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2304 times.
✓ Branch 10 taken 2304 times.
✓ Branch 11 taken 2304 times.
✓ Branch 12 taken 2304 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2304 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2304 times.
9216 output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1259
2/2
✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 4608 times.
9216 output_pixel(&dest[4], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1260
12/18
✓ Branch 0 taken 4608 times.
✓ Branch 1 taken 4608 times.
✓ Branch 2 taken 4608 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2304 times.
✓ Branch 5 taken 2304 times.
✓ Branch 6 taken 2304 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2304 times.
✓ Branch 10 taken 2304 times.
✓ Branch 11 taken 2304 times.
✓ Branch 12 taken 2304 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2304 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2304 times.
9216 output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1261 9216 dest += 6;
1262 }
1263 }
1264 72 }
1265
1266 static av_always_inline void
1267 209708 yuv2rgba64_1_c_template(SwsInternal *c, const int32_t *buf0,
1268 const int32_t *ubuf[2], const int32_t *vbuf[2],
1269 const int32_t *abuf0, uint16_t *dest, int dstW,
1270 int uvalpha, int y, enum AVPixelFormat target,
1271 int hasAlpha, int eightbytes, int is_be)
1272 {
1273 209708 const int32_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1274 int i;
1275 209708 SUINT A1 = 0xffff<<14, A2= 0xffff<<14;
1276
1277
2/2
✓ Branch 0 taken 209660 times.
✓ Branch 1 taken 48 times.
209708 if (uvalpha == 0) {
1278
2/2
✓ Branch 0 taken 36631780 times.
✓ Branch 1 taken 209660 times.
36841440 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1279 36631780 SUINT Y1 = (buf0[i * 2] ) >> 2;
1280 36631780 SUINT Y2 = (buf0[i * 2 + 1]) >> 2;
1281 36631780 SUINT U = (ubuf0[i] - (128 << 11)) >> 2;
1282 36631780 SUINT V = (vbuf0[i] - (128 << 11)) >> 2;
1283 int R, G, B;
1284
1285 36631780 Y1 -= c->yuv2rgb_y_offset;
1286 36631780 Y2 -= c->yuv2rgb_y_offset;
1287 36631780 Y1 *= c->yuv2rgb_y_coeff;
1288 36631780 Y2 *= c->yuv2rgb_y_coeff;
1289 36631780 Y1 += (1 << 13) - (1 << 29);
1290 36631780 Y2 += (1 << 13) - (1 << 29);
1291
1292
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36631780 times.
36631780 if (hasAlpha) {
1293 ✗ A1 = abuf0[i * 2 ] * (SUINT)(1 << 11);
1294 ✗ A2 = abuf0[i * 2 + 1] * (SUINT)(1 << 11);
1295
1296 ✗ A1 += 1 << 13;
1297 ✗ A2 += 1 << 13;
1298 }
1299
1300 36631780 R = V * c->yuv2rgb_v2r_coeff;
1301 36631780 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1302 36631780 B = U * c->yuv2rgb_u2b_coeff;
1303
1304
14/18
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 36628708 times.
✓ Branch 2 taken 3072 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2304 times.
✓ Branch 5 taken 768 times.
✓ Branch 6 taken 2304 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 768 times.
✓ Branch 9 taken 1536 times.
✓ Branch 10 taken 2304 times.
✓ Branch 11 taken 36626404 times.
✓ Branch 12 taken 2304 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1536 times.
✓ Branch 15 taken 768 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1536 times.
36631780 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1305
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 36628708 times.
36631780 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y1) >> 14) + (1<<15), 16));
1306
14/18
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 36628708 times.
✓ Branch 2 taken 3072 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2304 times.
✓ Branch 5 taken 768 times.
✓ Branch 6 taken 2304 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 768 times.
✓ Branch 9 taken 1536 times.
✓ Branch 10 taken 2304 times.
✓ Branch 11 taken 36626404 times.
✓ Branch 12 taken 2304 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1536 times.
✓ Branch 15 taken 768 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1536 times.
36631780 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1307
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 36628708 times.
36631780 if (eightbytes) {
1308
2/2
✓ Branch 0 taken 1536 times.
✓ Branch 1 taken 1536 times.
3072 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1309
12/18
✓ Branch 0 taken 1536 times.
✓ Branch 1 taken 1536 times.
✓ Branch 2 taken 1536 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1536 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1536 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 768 times.
✓ Branch 9 taken 768 times.
✓ Branch 10 taken 1536 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1536 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 768 times.
✓ Branch 15 taken 768 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 768 times.
3072 output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1310
2/2
✓ Branch 0 taken 1536 times.
✓ Branch 1 taken 1536 times.
3072 output_pixel(&dest[5], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1311
12/18
✓ Branch 0 taken 1536 times.
✓ Branch 1 taken 1536 times.
✓ Branch 2 taken 1536 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1536 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1536 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 768 times.
✓ Branch 9 taken 768 times.
✓ Branch 10 taken 1536 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1536 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 768 times.
✓ Branch 15 taken 768 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 768 times.
3072 output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1312
2/2
✓ Branch 0 taken 1536 times.
✓ Branch 1 taken 1536 times.
3072 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1313 3072 dest += 8;
1314 } else {
1315
12/18
✓ Branch 0 taken 1536 times.
✓ Branch 1 taken 36627172 times.
✓ Branch 2 taken 1536 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 768 times.
✓ Branch 5 taken 768 times.
✓ Branch 6 taken 768 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 768 times.
✓ Branch 10 taken 768 times.
✓ Branch 11 taken 36626404 times.
✓ Branch 12 taken 768 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 768 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 768 times.
36628708 output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1316
2/2
✓ Branch 0 taken 1536 times.
✓ Branch 1 taken 36627172 times.
36628708 output_pixel(&dest[4], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1317
12/18
✓ Branch 0 taken 1536 times.
✓ Branch 1 taken 36627172 times.
✓ Branch 2 taken 1536 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 768 times.
✓ Branch 5 taken 768 times.
✓ Branch 6 taken 768 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 768 times.
✓ Branch 10 taken 768 times.
✓ Branch 11 taken 36626404 times.
✓ Branch 12 taken 768 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 768 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 768 times.
36628708 output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1318 36628708 dest += 6;
1319 }
1320 }
1321 } else {
1322 48 const int32_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1323 48 SUINT A1 = 0xffff<<14, A2 = 0xffff<<14;
1324 48 unsigned uvalpha1 = 4096 - uvalpha;
1325 av_assert2(uvalpha <= 4096U);
1326
1327
2/2
✓ Branch 0 taken 12288 times.
✓ Branch 1 taken 48 times.
12336 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1328 12288 SUINT Y1 = (buf0[i * 2] ) >> 2;
1329 12288 SUINT Y2 = (buf0[i * 2 + 1]) >> 2;
1330 12288 SUINT U = (int)((SUINT)ubuf0[i] * uvalpha1 + (SUINT)ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1331 12288 SUINT V = (int)((SUINT)vbuf0[i] * uvalpha1 + (SUINT)vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1332 int R, G, B;
1333
1334 12288 Y1 -= c->yuv2rgb_y_offset;
1335 12288 Y2 -= c->yuv2rgb_y_offset;
1336 12288 Y1 *= c->yuv2rgb_y_coeff;
1337 12288 Y2 *= c->yuv2rgb_y_coeff;
1338 12288 Y1 += (1 << 13) - (1 << 29);
1339 12288 Y2 += (1 << 13) - (1 << 29);
1340
1341
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12288 times.
12288 if (hasAlpha) {
1342 ✗ A1 = abuf0[i * 2 ] * (SUINT)(1 << 11);
1343 ✗ A2 = abuf0[i * 2 + 1] * (SUINT)(1 << 11);
1344
1345 ✗ A1 += 1 << 13;
1346 ✗ A2 += 1 << 13;
1347 }
1348
1349 12288 R = V * c->yuv2rgb_v2r_coeff;
1350 12288 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1351 12288 B = U * c->yuv2rgb_u2b_coeff;
1352
1353
14/18
✓ Branch 0 taken 6144 times.
✓ Branch 1 taken 6144 times.
✓ Branch 2 taken 6144 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4608 times.
✓ Branch 5 taken 1536 times.
✓ Branch 6 taken 4608 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1536 times.
✓ Branch 9 taken 3072 times.
✓ Branch 10 taken 4608 times.
✓ Branch 11 taken 1536 times.
✓ Branch 12 taken 4608 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3072 times.
✓ Branch 15 taken 1536 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3072 times.
12288 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1354
2/2
✓ Branch 0 taken 6144 times.
✓ Branch 1 taken 6144 times.
12288 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y1) >> 14) + (1<<15), 16));
1355
14/18
✓ Branch 0 taken 6144 times.
✓ Branch 1 taken 6144 times.
✓ Branch 2 taken 6144 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4608 times.
✓ Branch 5 taken 1536 times.
✓ Branch 6 taken 4608 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1536 times.
✓ Branch 9 taken 3072 times.
✓ Branch 10 taken 4608 times.
✓ Branch 11 taken 1536 times.
✓ Branch 12 taken 4608 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3072 times.
✓ Branch 15 taken 1536 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3072 times.
12288 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1356
2/2
✓ Branch 0 taken 6144 times.
✓ Branch 1 taken 6144 times.
12288 if (eightbytes) {
1357
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
6144 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1358
12/18
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3072 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3072 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1536 times.
✓ Branch 9 taken 1536 times.
✓ Branch 10 taken 3072 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3072 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1536 times.
✓ Branch 15 taken 1536 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1536 times.
6144 output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1359
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
6144 output_pixel(&dest[5], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1360
12/18
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3072 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3072 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1536 times.
✓ Branch 9 taken 1536 times.
✓ Branch 10 taken 3072 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3072 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1536 times.
✓ Branch 15 taken 1536 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1536 times.
6144 output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1361
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
6144 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1362 6144 dest += 8;
1363 } else {
1364
12/18
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1536 times.
✓ Branch 5 taken 1536 times.
✓ Branch 6 taken 1536 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1536 times.
✓ Branch 10 taken 1536 times.
✓ Branch 11 taken 1536 times.
✓ Branch 12 taken 1536 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1536 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1536 times.
6144 output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1365
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
6144 output_pixel(&dest[4], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1366
12/18
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
✓ Branch 2 taken 3072 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1536 times.
✓ Branch 5 taken 1536 times.
✓ Branch 6 taken 1536 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1536 times.
✓ Branch 10 taken 1536 times.
✓ Branch 11 taken 1536 times.
✓ Branch 12 taken 1536 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1536 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1536 times.
6144 output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1367 6144 dest += 6;
1368 }
1369 }
1370 }
1371 209708 }
1372
1373 static av_always_inline void
1374 2000 yuv2rgba64_full_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1375 const int32_t **lumSrc, int lumFilterSize,
1376 const int16_t *chrFilter, const int32_t **chrUSrc,
1377 const int32_t **chrVSrc, int chrFilterSize,
1378 const int32_t **alpSrc, uint16_t *dest, int dstW,
1379 int y, enum AVPixelFormat target, int hasAlpha,
1380 int eightbytes, int is_be)
1381 {
1382 int i;
1383 2000 int A = 0xffff<<14;
1384
1385
2/2
✓ Branch 0 taken 400000 times.
✓ Branch 1 taken 2000 times.
402000 for (i = 0; i < dstW; i++) {
1386 int j;
1387 400000 int Y = -0x40000000;
1388 400000 int U = -(128 << 23); // 19
1389 400000 int V = -(128 << 23);
1390 int R, G, B;
1391
1392
2/2
✓ Branch 0 taken 4800000 times.
✓ Branch 1 taken 400000 times.
5200000 for (j = 0; j < lumFilterSize; j++) {
1393 4800000 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
1394 }
1395
2/2
✓ Branch 0 taken 4800000 times.
✓ Branch 1 taken 400000 times.
5200000 for (j = 0; j < chrFilterSize; j++) {;
1396 4800000 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
1397 4800000 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
1398 }
1399
1400
2/2
✓ Branch 0 taken 160000 times.
✓ Branch 1 taken 240000 times.
400000 if (hasAlpha) {
1401 160000 A = -0x40000000;
1402
2/2
✓ Branch 0 taken 1920000 times.
✓ Branch 1 taken 160000 times.
2080000 for (j = 0; j < lumFilterSize; j++) {
1403 1920000 A += alpSrc[j][i] * (unsigned)lumFilter[j];
1404 }
1405 160000 A >>= 1;
1406 160000 A += 0x20002000;
1407 }
1408
1409 // 8bit: 12+15=27; 16-bit: 12+19=31
1410 400000 Y >>= 14; // 10
1411 400000 Y += 0x10000;
1412 400000 U >>= 14;
1413 400000 V >>= 14;
1414
1415 // 8bit: 27 -> 17bit, 16bit: 31 - 14 = 17bit
1416 400000 Y -= c->yuv2rgb_y_offset;
1417 400000 Y *= c->yuv2rgb_y_coeff;
1418 400000 Y += (1 << 13) - (1<<29); // 21
1419 // 8bit: 17 + 13bit = 30bit, 16bit: 17 + 13bit = 30bit
1420
1421 400000 R = (unsigned)V * c->yuv2rgb_v2r_coeff;
1422 400000 G = (unsigned)V * c->yuv2rgb_v2g_coeff + (unsigned)U * c->yuv2rgb_u2g_coeff;
1423 400000 B = (unsigned)U * c->yuv2rgb_u2b_coeff;
1424
1425 // 8bit: 30 - 22 = 8bit, 16bit: 30bit - 14 = 16bit
1426
14/18
✓ Branch 0 taken 200000 times.
✓ Branch 1 taken 200000 times.
✓ Branch 2 taken 200000 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 120000 times.
✓ Branch 5 taken 80000 times.
✓ Branch 6 taken 120000 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 40000 times.
✓ Branch 9 taken 80000 times.
✓ Branch 10 taken 120000 times.
✓ Branch 11 taken 80000 times.
✓ Branch 12 taken 120000 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 80000 times.
✓ Branch 15 taken 40000 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 80000 times.
400000 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + (unsigned)Y)>>14) + (1<<15), 16));
1427
2/2
✓ Branch 0 taken 200000 times.
✓ Branch 1 taken 200000 times.
400000 output_pixel(&dest[1], av_clip_uintp2(((int)( G + (unsigned)Y)>>14) + (1<<15), 16));
1428
14/18
✓ Branch 0 taken 200000 times.
✓ Branch 1 taken 200000 times.
✓ Branch 2 taken 200000 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 120000 times.
✓ Branch 5 taken 80000 times.
✓ Branch 6 taken 120000 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 40000 times.
✓ Branch 9 taken 80000 times.
✓ Branch 10 taken 120000 times.
✓ Branch 11 taken 80000 times.
✓ Branch 12 taken 120000 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 80000 times.
✓ Branch 15 taken 40000 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 80000 times.
400000 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + (unsigned)Y)>>14) + (1<<15), 16));
1429
2/2
✓ Branch 0 taken 160000 times.
✓ Branch 1 taken 240000 times.
400000 if (eightbytes) {
1430
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 80000 times.
160000 output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1431 160000 dest += 4;
1432 } else {
1433 240000 dest += 3;
1434 }
1435 }
1436 2000 }
1437
1438 static av_always_inline void
1439 ✗ yuv2rgba64_full_2_c_template(SwsInternal *c, const int32_t *buf[2],
1440 const int32_t *ubuf[2], const int32_t *vbuf[2],
1441 const int32_t *abuf[2], uint16_t *dest, int dstW,
1442 int yalpha_param, int uvalpha_param, int y,
1443 enum AVPixelFormat target, int hasAlpha, int eightbytes,
1444 int is_be)
1445 {
1446 ✗ unsigned yalpha = yalpha_param;
1447 ✗ unsigned uvalpha = uvalpha_param;
1448 ✗ const int32_t *buf0 = buf[0], *buf1 = buf[1],
1449 ✗ *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1450 ✗ *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1451 ✗ *abuf0 = hasAlpha ? abuf[0] : NULL,
1452 ✗ *abuf1 = hasAlpha ? abuf[1] : NULL;
1453 ✗ unsigned yalpha1 = 4096 - yalpha;
1454 ✗ unsigned uvalpha1 = 4096 - uvalpha;
1455 int i;
1456 ✗ int A = 0xffff<<14;
1457
1458 av_assert2(yalpha <= 4096U);
1459 av_assert2(uvalpha <= 4096U);
1460
1461 ✗ for (i = 0; i < dstW; i++) {
1462 ✗ unsigned Y = (int)(buf0[i] * yalpha1 + buf1[i] * yalpha) >> 14;
1463 ✗ unsigned U = (int)(ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1464 ✗ unsigned V = (int)(vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1465 int R, G, B;
1466
1467 ✗ Y -= c->yuv2rgb_y_offset;
1468 ✗ Y *= c->yuv2rgb_y_coeff;
1469 ✗ Y += (1 << 13) - (1 << 29);
1470
1471 ✗ R = V * c->yuv2rgb_v2r_coeff;
1472 ✗ G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1473 ✗ B = U * c->yuv2rgb_u2b_coeff;
1474
1475 ✗ if (hasAlpha) {
1476 ✗ A = (int)(abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 1;
1477
1478 ✗ A += 1 << 13;
1479 }
1480
1481 ✗ output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y) >> 14) + (1<<15), 16));
1482 ✗ output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y) >> 14) + (1<<15), 16));
1483 ✗ output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y) >> 14) + (1<<15), 16));
1484 ✗ if (eightbytes) {
1485 ✗ output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1486 ✗ dest += 4;
1487 } else {
1488 ✗ dest += 3;
1489 }
1490 }
1491 ✗ }
1492
1493 static av_always_inline void
1494 446784 yuv2rgba64_full_1_c_template(SwsInternal *c, const int32_t *buf0,
1495 const int32_t *ubuf[2], const int32_t *vbuf[2],
1496 const int32_t *abuf0, uint16_t *dest, int dstW,
1497 int uvalpha, int y, enum AVPixelFormat target,
1498 int hasAlpha, int eightbytes, int is_be)
1499 {
1500 446784 const int32_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1501 int i;
1502 446784 SUINT A = 0xffff<<14;
1503
1504
1/2
✓ Branch 0 taken 446784 times.
✗ Branch 1 not taken.
446784 if (uvalpha == 0) {
1505
2/2
✓ Branch 0 taken 155990016 times.
✓ Branch 1 taken 446784 times.
156436800 for (i = 0; i < dstW; i++) {
1506 155990016 SUINT Y = (buf0[i]) >> 2;
1507 155990016 SUINT U = (ubuf0[i] - (128 << 11)) >> 2;
1508 155990016 SUINT V = (vbuf0[i] - (128 << 11)) >> 2;
1509 int R, G, B;
1510
1511 155990016 Y -= c->yuv2rgb_y_offset;
1512 155990016 Y *= c->yuv2rgb_y_coeff;
1513 155990016 Y += (1 << 13) - (1 << 29);
1514
1515
2/2
✓ Branch 0 taken 221184 times.
✓ Branch 1 taken 155768832 times.
155990016 if (hasAlpha) {
1516 221184 A = abuf0[i] * (SUINT)(1 << 11);
1517
1518 221184 A += 1 << 13;
1519 }
1520
1521 155990016 R = V * c->yuv2rgb_v2r_coeff;
1522 155990016 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1523 155990016 B = U * c->yuv2rgb_u2b_coeff;
1524
1525
14/18
✓ Branch 0 taken 221184 times.
✓ Branch 1 taken 155768832 times.
✓ Branch 2 taken 221184 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 165888 times.
✓ Branch 5 taken 55296 times.
✓ Branch 6 taken 165888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 55296 times.
✓ Branch 9 taken 110592 times.
✓ Branch 10 taken 193536 times.
✓ Branch 11 taken 155575296 times.
✓ Branch 12 taken 193536 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 129024 times.
✓ Branch 15 taken 64512 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 129024 times.
155990016 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y) >> 14) + (1<<15), 16));
1526
2/2
✓ Branch 0 taken 221184 times.
✓ Branch 1 taken 155768832 times.
155990016 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y) >> 14) + (1<<15), 16));
1527
14/18
✓ Branch 0 taken 221184 times.
✓ Branch 1 taken 155768832 times.
✓ Branch 2 taken 221184 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 165888 times.
✓ Branch 5 taken 55296 times.
✓ Branch 6 taken 165888 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 55296 times.
✓ Branch 9 taken 110592 times.
✓ Branch 10 taken 193536 times.
✓ Branch 11 taken 155575296 times.
✓ Branch 12 taken 193536 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 129024 times.
✓ Branch 15 taken 64512 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 129024 times.
155990016 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y) >> 14) + (1<<15), 16));
1528
2/2
✓ Branch 0 taken 239616 times.
✓ Branch 1 taken 155750400 times.
155990016 if (eightbytes) {
1529
2/2
✓ Branch 0 taken 110592 times.
✓ Branch 1 taken 129024 times.
239616 output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1530 239616 dest += 4;
1531 } else {
1532 155750400 dest += 3;
1533 }
1534 }
1535 } else {
1536 ✗ const int32_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1537 ✗ unsigned uvalpha1 = 4096 - uvalpha;
1538 ✗ SUINT A = 0xffff<<14;
1539 av_assert2(uvalpha <= 4096U);
1540
1541 ✗ for (i = 0; i < dstW; i++) {
1542 ✗ SUINT Y = (buf0[i] ) >> 2;
1543 ✗ SUINT U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1544 ✗ SUINT V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1545 int R, G, B;
1546
1547 ✗ Y -= c->yuv2rgb_y_offset;
1548 ✗ Y *= c->yuv2rgb_y_coeff;
1549 ✗ Y += (1 << 13) - (1 << 29);
1550
1551 ✗ if (hasAlpha) {
1552 ✗ A = abuf0[i] * (SUINT)(1 << 11);
1553
1554 ✗ A += 1 << 13;
1555 }
1556
1557 ✗ R = V * c->yuv2rgb_v2r_coeff;
1558 ✗ G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1559 ✗ B = U * c->yuv2rgb_u2b_coeff;
1560
1561 ✗ output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y) >> 14) + (1<<15), 16));
1562 ✗ output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y) >> 14) + (1<<15), 16));
1563 ✗ output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y) >> 14) + (1<<15), 16));
1564 ✗ if (eightbytes) {
1565 ✗ output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1566 ✗ dest += 4;
1567 } else {
1568 ✗ dest += 3;
1569 }
1570 }
1571 }
1572 446784 }
1573
1574 #undef output_pixel
1575 #undef r_b
1576 #undef b_r
1577
1578 #define YUV2PACKED16WRAPPER_EXT(name, base, ext, fmt, is_be, hasAlpha, eightbytes) \
1579 static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
1580 const int16_t **_lumSrc, int lumFilterSize, \
1581 const int16_t *chrFilter, const int16_t **_chrUSrc, \
1582 const int16_t **_chrVSrc, int chrFilterSize, \
1583 const int16_t **_alpSrc, uint8_t *_dest, int dstW, \
1584 int y) \
1585 { \
1586 const int32_t **lumSrc = (const int32_t **) _lumSrc, \
1587 **chrUSrc = (const int32_t **) _chrUSrc, \
1588 **chrVSrc = (const int32_t **) _chrVSrc, \
1589 **alpSrc = (const int32_t **) _alpSrc; \
1590 uint16_t *dest = (uint16_t *) _dest; \
1591 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
1592 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
1593 alpSrc, dest, dstW, y, fmt, hasAlpha, eightbytes, is_be); \
1594 } \
1595 \
1596 static void name ## ext ## _2_c(SwsInternal *c, const int16_t *_buf[2], \
1597 const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
1598 const int16_t *_abuf[2], uint8_t *_dest, int dstW, \
1599 int yalpha, int uvalpha, int y) \
1600 { \
1601 const int32_t **buf = (const int32_t **) _buf, \
1602 **ubuf = (const int32_t **) _ubuf, \
1603 **vbuf = (const int32_t **) _vbuf, \
1604 **abuf = (const int32_t **) _abuf; \
1605 uint16_t *dest = (uint16_t *) _dest; \
1606 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
1607 dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha, eightbytes, is_be); \
1608 } \
1609 \
1610 static void name ## ext ## _1_c(SwsInternal *c, const int16_t *_buf0, \
1611 const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
1612 const int16_t *_abuf0, uint8_t *_dest, int dstW, \
1613 int uvalpha, int y) \
1614 { \
1615 const int32_t *buf0 = (const int32_t *) _buf0, \
1616 **ubuf = (const int32_t **) _ubuf, \
1617 **vbuf = (const int32_t **) _vbuf, \
1618 *abuf0 = (const int32_t *) _abuf0; \
1619 uint16_t *dest = (uint16_t *) _dest; \
1620 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
1621 dstW, uvalpha, y, fmt, hasAlpha, eightbytes, is_be); \
1622 }
1623 #define YUV2PACKED16WRAPPER(name, base, ext, base_fmt, endianness, hasAlpha, eightbytes) \
1624 YUV2PACKED16WRAPPER_EXT(name, base, ext, base_fmt ## endianness, IS_BE(endianness), hasAlpha, eightbytes)
1625
1626 53040 YUV2PACKED16WRAPPER(yuv2, rgba64, rgb48be, AV_PIX_FMT_RGB48, BE, 0, 0)
1627 838040 YUV2PACKED16WRAPPER(yuv2, rgba64, rgb48le, AV_PIX_FMT_RGB48, LE, 0, 0)
1628 18480 YUV2PACKED16WRAPPER(yuv2, rgba64, bgr48be, AV_PIX_FMT_BGR48, BE, 0, 0)
1629 19632 YUV2PACKED16WRAPPER(yuv2, rgba64, bgr48le, AV_PIX_FMT_BGR48, LE, 0, 0)
1630 ✗ YUV2PACKED16WRAPPER(yuv2, rgba64, rgba64be, AV_PIX_FMT_RGBA64, BE, 1, 1)
1631 ✗ YUV2PACKED16WRAPPER(yuv2, rgba64, rgba64le, AV_PIX_FMT_RGBA64, LE, 1, 1)
1632 18480 YUV2PACKED16WRAPPER(yuv2, rgba64, rgbx64be, AV_PIX_FMT_RGBA64, BE, 0, 1)
1633 30000 YUV2PACKED16WRAPPER(yuv2, rgba64, rgbx64le, AV_PIX_FMT_RGBA64, LE, 0, 1)
1634 ✗ YUV2PACKED16WRAPPER(yuv2, rgba64, bgra64be, AV_PIX_FMT_BGRA64, BE, 1, 1)
1635 ✗ YUV2PACKED16WRAPPER(yuv2, rgba64, bgra64le, AV_PIX_FMT_BGRA64, LE, 1, 1)
1636 18480 YUV2PACKED16WRAPPER(yuv2, rgba64, bgrx64be, AV_PIX_FMT_BGRA64, BE, 0, 1)
1637 18480 YUV2PACKED16WRAPPER(yuv2, rgba64, bgrx64le, AV_PIX_FMT_BGRA64, LE, 0, 1)
1638 19984 YUV2PACKED16WRAPPER(yuv2, ya16, ya16be, AV_PIX_FMT_YA16, BE, 1, 0)
1639 21136 YUV2PACKED16WRAPPER(yuv2, ya16, ya16le, AV_PIX_FMT_YA16, LE, 1, 0)
1640
1641 1952 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgb48be_full, AV_PIX_FMT_RGB48, BE, 0, 0)
1642 885728 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgb48le_full, AV_PIX_FMT_RGB48, LE, 0, 0)
1643 1552 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgr48be_full, AV_PIX_FMT_BGR48, BE, 0, 0)
1644 1744 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgr48le_full, AV_PIX_FMT_BGR48, LE, 0, 0)
1645 1552 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgba64be_full, AV_PIX_FMT_RGBA64, BE, 1, 1)
1646 1552 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgba64le_full, AV_PIX_FMT_RGBA64, LE, 1, 1)
1647 ✗ YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgbx64be_full, AV_PIX_FMT_RGBA64, BE, 0, 1)
1648 192 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgbx64le_full, AV_PIX_FMT_RGBA64, LE, 0, 1)
1649 1552 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgra64be_full, AV_PIX_FMT_BGRA64, BE, 1, 1)
1650 1552 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgra64le_full, AV_PIX_FMT_BGRA64, LE, 1, 1)
1651 ✗ YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgrx64be_full, AV_PIX_FMT_BGRA64, BE, 0, 1)
1652 192 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgrx64le_full, AV_PIX_FMT_BGRA64, LE, 0, 1)
1653
1654 /*
1655 * Write out 2 RGB pixels in the target pixel format. This function takes a
1656 * R/G/B LUT as generated by ff_yuv2rgb_c_init_tables(), which takes care of
1657 * things like endianness conversion and shifting. The caller takes care of
1658 * setting the correct offset in these tables from the chroma (U/V) values.
1659 * This function then uses the luminance (Y1/Y2) values to write out the
1660 * correct RGB values into the destination buffer.
1661 */
1662 static av_always_inline void
1663 307925108 yuv2rgb_write(uint8_t *_dest, int i, int Y1, int Y2,
1664 unsigned A1, unsigned A2,
1665 const void *_r, const void *_g, const void *_b, int y,
1666 enum AVPixelFormat target, int hasAlpha)
1667 {
1668
4/6
✓ Branch 0 taken 307925108 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 307925108 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 299847092 times.
✓ Branch 5 taken 8078016 times.
307925108 if (target == AV_PIX_FMT_ARGB || target == AV_PIX_FMT_RGBA ||
1669
2/2
✓ Branch 0 taken 28556744 times.
✓ Branch 1 taken 271290348 times.
336481852 target == AV_PIX_FMT_ABGR || target == AV_PIX_FMT_BGRA) {
1670 36634760 uint32_t *dest = (uint32_t *) _dest;
1671 36634760 const uint32_t *r = (const uint32_t *) _r;
1672 36634760 const uint32_t *g = (const uint32_t *) _g;
1673 36634760 const uint32_t *b = (const uint32_t *) _b;
1674
1675 #if CONFIG_SMALL
1676 int sh = hasAlpha ? ((target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24) : 0;
1677
1678 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (hasAlpha ? A1 << sh : 0);
1679 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (hasAlpha ? A2 << sh : 0);
1680 #else
1681
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36634760 times.
36634760 if (hasAlpha) {
1682 ✗ int sh = (target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24;
1683
1684 av_assert2((((r[Y1] + g[Y1] + b[Y1]) >> sh) & 0xFF) == 0);
1685 ✗ dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (A1 << sh);
1686 ✗ dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (A2 << sh);
1687 } else {
1688 #if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1
1689 int sh = (target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24;
1690
1691 av_assert2((((r[Y1] + g[Y1] + b[Y1]) >> sh) & 0xFF) == 0xFF);
1692 #endif
1693 36634760 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
1694 36634760 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
1695 }
1696 #endif
1697
4/4
✓ Branch 0 taken 145525958 times.
✓ Branch 1 taken 125764390 times.
✓ Branch 2 taken 27322862 times.
✓ Branch 3 taken 118203096 times.
271290348 } else if (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) {
1698 153087252 uint8_t *dest = (uint8_t *) _dest;
1699 153087252 const uint8_t *r = (const uint8_t *) _r;
1700 153087252 const uint8_t *g = (const uint8_t *) _g;
1701 153087252 const uint8_t *b = (const uint8_t *) _b;
1702
1703 #define r_b ((target == AV_PIX_FMT_RGB24) ? r : b)
1704 #define b_r ((target == AV_PIX_FMT_RGB24) ? b : r)
1705
1706
2/2
✓ Branch 0 taken 125764390 times.
✓ Branch 1 taken 27322862 times.
153087252 dest[i * 6 + 0] = r_b[Y1];
1707 153087252 dest[i * 6 + 1] = g[Y1];
1708
2/2
✓ Branch 0 taken 125764390 times.
✓ Branch 1 taken 27322862 times.
153087252 dest[i * 6 + 2] = b_r[Y1];
1709
2/2
✓ Branch 0 taken 125764390 times.
✓ Branch 1 taken 27322862 times.
153087252 dest[i * 6 + 3] = r_b[Y2];
1710 153087252 dest[i * 6 + 4] = g[Y2];
1711
2/2
✓ Branch 0 taken 125764390 times.
✓ Branch 1 taken 27322862 times.
153087252 dest[i * 6 + 5] = b_r[Y2];
1712 #undef r_b
1713 #undef b_r
1714
5/6
✓ Branch 0 taken 88154484 times.
✓ Branch 1 taken 30048612 times.
✓ Branch 2 taken 88154484 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 35238472 times.
✓ Branch 5 taken 52916012 times.
118203096 } else if (target == AV_PIX_FMT_RGB565 || target == AV_PIX_FMT_BGR565 ||
1715
3/4
✓ Branch 0 taken 35238472 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 28535240 times.
✓ Branch 3 taken 6703232 times.
35238472 target == AV_PIX_FMT_RGB555 || target == AV_PIX_FMT_BGR555 ||
1716
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28535240 times.
28535240 target == AV_PIX_FMT_RGB444 || target == AV_PIX_FMT_BGR444) {
1717 89667856 uint16_t *dest = (uint16_t *) _dest;
1718 89667856 const uint16_t *r = (const uint16_t *) _r;
1719 89667856 const uint16_t *g = (const uint16_t *) _g;
1720 89667856 const uint16_t *b = (const uint16_t *) _b;
1721 int dr1, dg1, db1, dr2, dg2, db2;
1722
1723
3/4
✓ Branch 0 taken 59619244 times.
✓ Branch 1 taken 30048612 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 59619244 times.
89667856 if (target == AV_PIX_FMT_RGB565 || target == AV_PIX_FMT_BGR565) {
1724 30048612 dr1 = ff_dither_2x2_8[ y & 1 ][0];
1725 30048612 dg1 = ff_dither_2x2_4[ y & 1 ][0];
1726 30048612 db1 = ff_dither_2x2_8[(y & 1) ^ 1][0];
1727 30048612 dr2 = ff_dither_2x2_8[ y & 1 ][1];
1728 30048612 dg2 = ff_dither_2x2_4[ y & 1 ][1];
1729 30048612 db2 = ff_dither_2x2_8[(y & 1) ^ 1][1];
1730
3/4
✓ Branch 0 taken 6703232 times.
✓ Branch 1 taken 52916012 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6703232 times.
59619244 } else if (target == AV_PIX_FMT_RGB555 || target == AV_PIX_FMT_BGR555) {
1731 52916012 dr1 = ff_dither_2x2_8[ y & 1 ][0];
1732 52916012 dg1 = ff_dither_2x2_8[ y & 1 ][1];
1733 52916012 db1 = ff_dither_2x2_8[(y & 1) ^ 1][0];
1734 52916012 dr2 = ff_dither_2x2_8[ y & 1 ][1];
1735 52916012 dg2 = ff_dither_2x2_8[ y & 1 ][0];
1736 52916012 db2 = ff_dither_2x2_8[(y & 1) ^ 1][1];
1737 } else {
1738 6703232 dr1 = ff_dither_4x4_16[ y & 3 ][0];
1739 6703232 dg1 = ff_dither_4x4_16[ y & 3 ][1];
1740 6703232 db1 = ff_dither_4x4_16[(y & 3) ^ 3][0];
1741 6703232 dr2 = ff_dither_4x4_16[ y & 3 ][1];
1742 6703232 dg2 = ff_dither_4x4_16[ y & 3 ][0];
1743 6703232 db2 = ff_dither_4x4_16[(y & 3) ^ 3][1];
1744 }
1745
1746 89667856 dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
1747 89667856 dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
1748
4/4
✓ Branch 0 taken 26913224 times.
✓ Branch 1 taken 1622016 times.
✓ Branch 2 taken 1622016 times.
✓ Branch 3 taken 25291208 times.
28535240 } else if (target == AV_PIX_FMT_X2RGB10 || target == AV_PIX_FMT_X2BGR10) {
1749 3244032 uint32_t *dest = (uint32_t *) _dest;
1750 3244032 const uint32_t *r = (const uint32_t *) _r;
1751 3244032 const uint32_t *g = (const uint32_t *) _g;
1752 3244032 const uint32_t *b = (const uint32_t *) _b;
1753 3244032 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
1754 3244032 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
1755 } else /* 8/4 bits */ {
1756 25291208 uint8_t *dest = (uint8_t *) _dest;
1757 25291208 const uint8_t *r = (const uint8_t *) _r;
1758 25291208 const uint8_t *g = (const uint8_t *) _g;
1759 25291208 const uint8_t *b = (const uint8_t *) _b;
1760 int dr1, dg1, db1, dr2, dg2, db2;
1761
1762
3/4
✓ Branch 0 taken 4033536 times.
✓ Branch 1 taken 21257672 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4033536 times.
25291208 if (target == AV_PIX_FMT_RGB8 || target == AV_PIX_FMT_BGR8) {
1763 21257672 const uint8_t * const d64 = ff_dither_8x8_73[y & 7];
1764 21257672 const uint8_t * const d32 = ff_dither_8x8_32[y & 7];
1765 21257672 dr1 = dg1 = d32[(i * 2 + 0) & 7];
1766 21257672 db1 = d64[(i * 2 + 0) & 7];
1767 21257672 dr2 = dg2 = d32[(i * 2 + 1) & 7];
1768 21257672 db2 = d64[(i * 2 + 1) & 7];
1769 } else {
1770 4033536 const uint8_t * const d64 = ff_dither_8x8_73 [y & 7];
1771 4033536 const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
1772 4033536 dr1 = db1 = d128[(i * 2 + 0) & 7];
1773 4033536 dg1 = d64[(i * 2 + 0) & 7];
1774 4033536 dr2 = db2 = d128[(i * 2 + 1) & 7];
1775 4033536 dg2 = d64[(i * 2 + 1) & 7];
1776 }
1777
1778
3/4
✓ Branch 0 taken 25223624 times.
✓ Branch 1 taken 67584 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 25223624 times.
25291208 if (target == AV_PIX_FMT_RGB4 || target == AV_PIX_FMT_BGR4) {
1779 67584 dest[i] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1] +
1780 67584 ((r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2]) << 4);
1781 } else {
1782 25223624 dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
1783 25223624 dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
1784 }
1785 }
1786 307925108 }
1787
1788 static av_always_inline void
1789 1317372 yuv2rgb_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1790 const int16_t **lumSrc, int lumFilterSize,
1791 const int16_t *chrFilter, const int16_t **chrUSrc,
1792 const int16_t **chrVSrc, int chrFilterSize,
1793 const int16_t **alpSrc, uint8_t *dest, int dstW,
1794 int y, enum AVPixelFormat target, int hasAlpha)
1795 {
1796 int i;
1797
1798
2/2
✓ Branch 0 taken 226544072 times.
✓ Branch 1 taken 1317372 times.
227861444 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1799 int j, A1, A2;
1800 226544072 int Y1 = 1 << 18;
1801 226544072 int Y2 = 1 << 18;
1802 226544072 int U = 1 << 18;
1803 226544072 int V = 1 << 18;
1804 const void *r, *g, *b;
1805
1806
2/2
✓ Branch 0 taken 241070984 times.
✓ Branch 1 taken 226544072 times.
467615056 for (j = 0; j < lumFilterSize; j++) {
1807 241070984 Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j];
1808 241070984 Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1809 }
1810
2/2
✓ Branch 0 taken 910757408 times.
✓ Branch 1 taken 226544072 times.
1137301480 for (j = 0; j < chrFilterSize; j++) {
1811 910757408 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
1812 910757408 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
1813 }
1814 226544072 Y1 >>= 19;
1815 226544072 Y2 >>= 19;
1816 226544072 U >>= 19;
1817 226544072 V >>= 19;
1818
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 226544072 times.
226544072 if (hasAlpha) {
1819 ✗ A1 = 1 << 18;
1820 ✗ A2 = 1 << 18;
1821 ✗ for (j = 0; j < lumFilterSize; j++) {
1822 ✗ A1 += alpSrc[j][i * 2 ] * (unsigned)lumFilter[j];
1823 ✗ A2 += alpSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1824 }
1825 ✗ A1 >>= 19;
1826 ✗ A2 >>= 19;
1827 ✗ if ((A1 | A2) & 0x100) {
1828 ✗ A1 = av_clip_uint8(A1);
1829 ✗ A2 = av_clip_uint8(A2);
1830 }
1831 }
1832
1833 226544072 r = c->table_rV[V + YUVRGB_TABLE_HEADROOM];
1834 226544072 g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]);
1835 226544072 b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1836
1837
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 226544072 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 226544072 times.
226544072 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1838 r, g, b, y, target, hasAlpha);
1839 }
1840 1317372 }
1841
1842 static av_always_inline void
1843 216 yuv2rgb_2_c_template(SwsInternal *c, const int16_t *buf[2],
1844 const int16_t *ubuf[2], const int16_t *vbuf[2],
1845 const int16_t *abuf[2], uint8_t *dest, int dstW,
1846 int yalpha, int uvalpha, int y,
1847 enum AVPixelFormat target, int hasAlpha)
1848 {
1849 216 const int16_t *buf0 = buf[0], *buf1 = buf[1],
1850 216 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1851 216 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1852
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 216 times.
216 *abuf0 = hasAlpha ? abuf[0] : NULL,
1853
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 216 times.
216 *abuf1 = hasAlpha ? abuf[1] : NULL;
1854 216 int yalpha1 = 4096 - yalpha;
1855 216 int uvalpha1 = 4096 - uvalpha;
1856 int i;
1857 av_assert2(yalpha <= 4096U);
1858 av_assert2(uvalpha <= 4096U);
1859
1860
2/2
✓ Branch 0 taken 55296 times.
✓ Branch 1 taken 216 times.
55512 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1861 55296 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
1862 55296 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
1863 55296 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
1864 55296 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
1865 int A1, A2;
1866 55296 const void *r = c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1867 55296 *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1868 55296 *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1869
1870
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 55296 times.
55296 if (hasAlpha) {
1871 ✗ A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 19;
1872 ✗ A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 19;
1873 ✗ A1 = av_clip_uint8(A1);
1874 ✗ A2 = av_clip_uint8(A2);
1875 }
1876
1877
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 55296 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 55296 times.
55296 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1878 r, g, b, y, target, hasAlpha);
1879 }
1880 216 }
1881
1882 static av_always_inline void
1883 472452 yuv2rgb_1_c_template(SwsInternal *c, const int16_t *buf0,
1884 const int16_t *ubuf[2], const int16_t *vbuf[2],
1885 const int16_t *abuf0, uint8_t *dest, int dstW,
1886 int uvalpha, int y, enum AVPixelFormat target,
1887 int hasAlpha)
1888 {
1889 472452 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1890 int i;
1891
1892
2/2
✓ Branch 0 taken 472308 times.
✓ Branch 1 taken 144 times.
472452 if (uvalpha == 0) {
1893
2/2
✓ Branch 0 taken 81288876 times.
✓ Branch 1 taken 472308 times.
81761184 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1894 81288876 int Y1 = (buf0[i * 2 ] + 64) >> 7;
1895 81288876 int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
1896 81288876 int U = (ubuf0[i] + 64) >> 7;
1897 81288876 int V = (vbuf0[i] + 64) >> 7;
1898 int A1, A2;
1899 81288876 const void *r = c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1900 81288876 *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1901 81288876 *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1902
1903
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 81288876 times.
81288876 if (hasAlpha) {
1904 ✗ A1 = abuf0[i * 2 ] * 255 + 16384 >> 15;
1905 ✗ A2 = abuf0[i * 2 + 1] * 255 + 16384 >> 15;
1906 ✗ A1 = av_clip_uint8(A1);
1907 ✗ A2 = av_clip_uint8(A2);
1908 }
1909
1910
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 81288876 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 81288876 times.
81288876 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1911 r, g, b, y, target, hasAlpha);
1912 }
1913 } else {
1914 144 const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1915 144 int uvalpha1 = 4096 - uvalpha;
1916 av_assert2(uvalpha <= 4096U);
1917
1918
2/2
✓ Branch 0 taken 36864 times.
✓ Branch 1 taken 144 times.
37008 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1919 36864 int Y1 = (buf0[i * 2 ] + 64) >> 7;
1920 36864 int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
1921 36864 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha + (128 << 11)) >> 19;
1922 36864 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha + (128 << 11)) >> 19;
1923 int A1, A2;
1924 36864 const void *r = c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1925 36864 *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1926 36864 *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1927
1928
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36864 times.
36864 if (hasAlpha) {
1929 ✗ A1 = (abuf0[i * 2 ] + 64) >> 7;
1930 ✗ A2 = (abuf0[i * 2 + 1] + 64) >> 7;
1931 ✗ A1 = av_clip_uint8(A1);
1932 ✗ A2 = av_clip_uint8(A2);
1933 }
1934
1935
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36864 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36864 times.
36864 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1936 r, g, b, y, target, hasAlpha);
1937 }
1938 }
1939 472452 }
1940
1941 #define YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1942 static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
1943 const int16_t **lumSrc, int lumFilterSize, \
1944 const int16_t *chrFilter, const int16_t **chrUSrc, \
1945 const int16_t **chrVSrc, int chrFilterSize, \
1946 const int16_t **alpSrc, uint8_t *dest, int dstW, \
1947 int y) \
1948 { \
1949 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
1950 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
1951 alpSrc, dest, dstW, y, fmt, hasAlpha); \
1952 }
1953
1954 #define YUV2RGBWRAPPERX2(name, base, ext, fmt, hasAlpha) \
1955 YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1956 static void name ## ext ## _2_c(SwsInternal *c, const int16_t *buf[2], \
1957 const int16_t *ubuf[2], const int16_t *vbuf[2], \
1958 const int16_t *abuf[2], uint8_t *dest, int dstW, \
1959 int yalpha, int uvalpha, int y) \
1960 { \
1961 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
1962 dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha); \
1963 }
1964
1965 #define YUV2RGBWRAPPER(name, base, ext, fmt, hasAlpha) \
1966 YUV2RGBWRAPPERX2(name, base, ext, fmt, hasAlpha) \
1967 static void name ## ext ## _1_c(SwsInternal *c, const int16_t *buf0, \
1968 const int16_t *ubuf[2], const int16_t *vbuf[2], \
1969 const int16_t *abuf0, uint8_t *dest, int dstW, \
1970 int uvalpha, int y) \
1971 { \
1972 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
1973 dstW, uvalpha, y, fmt, hasAlpha); \
1974 }
1975
1976 #if CONFIG_SMALL
1977 YUV2RGBWRAPPER(yuv2rgb,, 32_1, AV_PIX_FMT_RGB32_1, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1978 YUV2RGBWRAPPER(yuv2rgb,, 32, AV_PIX_FMT_RGB32, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1979 #else
1980 #if CONFIG_SWSCALE_ALPHA
1981 ✗ YUV2RGBWRAPPER(yuv2rgb,, a32_1, AV_PIX_FMT_RGB32_1, 1)
1982 ✗ YUV2RGBWRAPPER(yuv2rgb,, a32, AV_PIX_FMT_RGB32, 1)
1983 #endif
1984 97152 YUV2RGBWRAPPER(yuv2rgb,, x32_1, AV_PIX_FMT_RGB32_1, 0)
1985 330608 YUV2RGBWRAPPER(yuv2rgb,, x32, AV_PIX_FMT_RGB32, 0)
1986 #endif
1987 1457580 YUV2RGBWRAPPER(yuv2, rgb, rgb24, AV_PIX_FMT_RGB24, 0)
1988 319684 YUV2RGBWRAPPER(yuv2, rgb, bgr24, AV_PIX_FMT_BGR24, 0)
1989 348488 YUV2RGBWRAPPER(yuv2rgb,, 16, AV_PIX_FMT_RGB565, 0)
1990 614488 YUV2RGBWRAPPER(yuv2rgb,, 15, AV_PIX_FMT_RGB555, 0)
1991 80128 YUV2RGBWRAPPER(yuv2rgb,, 12, AV_PIX_FMT_RGB444, 0)
1992 247664 YUV2RGBWRAPPER(yuv2rgb,, 8, AV_PIX_FMT_RGB8, 0)
1993 2400 YUV2RGBWRAPPER(yuv2rgb,, 4, AV_PIX_FMT_RGB4, 0)
1994 45024 YUV2RGBWRAPPER(yuv2rgb,, 4b, AV_PIX_FMT_RGB4_BYTE, 0)
1995 18432 YUV2RGBWRAPPER(yuv2, rgb, x2rgb10, AV_PIX_FMT_X2RGB10, 0)
1996 18432 YUV2RGBWRAPPER(yuv2, rgb, x2bgr10, AV_PIX_FMT_X2BGR10, 0)
1997
1998 359817413 static av_always_inline void yuv2rgb_write_full(SwsInternal *c,
1999 uint8_t *dest, int i, int Y, int A, int U, int V,
2000 int y, enum AVPixelFormat target, int hasAlpha, int err[4])
2001 {
2002 int R, G, B;
2003
4/4
✓ Branch 0 taken 343389323 times.
✓ Branch 1 taken 16428090 times.
✓ Branch 2 taken 10776093 times.
✓ Branch 3 taken 332613230 times.
359817413 int isrgb8 = target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8;
2004
2005 359817413 Y -= c->yuv2rgb_y_offset;
2006 359817413 Y *= (unsigned)c->yuv2rgb_y_coeff;
2007 359817413 Y += 1U << 21;
2008 359817413 R = (unsigned)Y + V*(unsigned)c->yuv2rgb_v2r_coeff;
2009 359817413 G = (unsigned)Y + V*(unsigned)c->yuv2rgb_v2g_coeff + U*(unsigned)c->yuv2rgb_u2g_coeff;
2010 359817413 B = (unsigned)Y + U*(unsigned)c->yuv2rgb_u2b_coeff;
2011
2/2
✓ Branch 0 taken 48142299 times.
✓ Branch 1 taken 311675114 times.
359817413 if ((R | G | B) & 0xC0000000) {
2012 48142299 R = av_clip_uintp2(R, 30);
2013 48142299 G = av_clip_uintp2(G, 30);
2014 48142299 B = av_clip_uintp2(B, 30);
2015 }
2016
2017
9/10
✓ Branch 0 taken 209024 times.
✓ Branch 1 taken 158273641 times.
✓ Branch 2 taken 209024 times.
✓ Branch 3 taken 209024 times.
✓ Branch 4 taken 54598180 times.
✓ Branch 5 taken 54996391 times.
✓ Branch 6 taken 23817280 times.
✓ Branch 7 taken 23817280 times.
✓ Branch 8 taken 43687569 times.
✗ Branch 9 not taken.
359817413 switch(target) {
2018 209024 case AV_PIX_FMT_ARGB:
2019
2/2
✓ Branch 0 taken 190592 times.
✓ Branch 1 taken 18432 times.
209024 dest[0] = hasAlpha ? A : 255;
2020 209024 dest[1] = R >> 22;
2021 209024 dest[2] = G >> 22;
2022 209024 dest[3] = B >> 22;
2023 209024 break;
2024 158273641 case AV_PIX_FMT_RGB24:
2025 158273641 dest[0] = R >> 22;
2026 158273641 dest[1] = G >> 22;
2027 158273641 dest[2] = B >> 22;
2028 158273641 break;
2029 209024 case AV_PIX_FMT_RGBA:
2030 209024 dest[0] = R >> 22;
2031 209024 dest[1] = G >> 22;
2032 209024 dest[2] = B >> 22;
2033
2/2
✓ Branch 0 taken 190592 times.
✓ Branch 1 taken 18432 times.
209024 dest[3] = hasAlpha ? A : 255;
2034 209024 break;
2035 209024 case AV_PIX_FMT_ABGR:
2036
2/2
✓ Branch 0 taken 190592 times.
✓ Branch 1 taken 18432 times.
209024 dest[0] = hasAlpha ? A : 255;
2037 209024 dest[1] = B >> 22;
2038 209024 dest[2] = G >> 22;
2039 209024 dest[3] = R >> 22;
2040 209024 break;
2041 54598180 case AV_PIX_FMT_BGR24:
2042 54598180 dest[0] = B >> 22;
2043 54598180 dest[1] = G >> 22;
2044 54598180 dest[2] = R >> 22;
2045 54598180 break;
2046 54996391 case AV_PIX_FMT_BGRA:
2047 54996391 dest[0] = B >> 22;
2048 54996391 dest[1] = G >> 22;
2049 54996391 dest[2] = R >> 22;
2050
2/2
✓ Branch 0 taken 4082599 times.
✓ Branch 1 taken 50913792 times.
54996391 dest[3] = hasAlpha ? A : 255;
2051 54996391 break;
2052 23817280 case AV_PIX_FMT_X2RGB10LE:
2053 23817280 R >>= 20;
2054 23817280 G >>= 20;
2055 23817280 B >>= 20;
2056 23817280 AV_WL32(dest, (3U << 30) + (R << 20) + (G << 10) + B);
2057 23817280 break;
2058 23817280 case AV_PIX_FMT_X2BGR10LE:
2059 23817280 R >>= 20;
2060 23817280 G >>= 20;
2061 23817280 B >>= 20;
2062 23817280 AV_WL32(dest, (3U << 30) + (B << 20) + (G << 10) + R);
2063 23817280 break;
2064 43687569 case AV_PIX_FMT_BGR4_BYTE:
2065 case AV_PIX_FMT_RGB4_BYTE:
2066 case AV_PIX_FMT_BGR8:
2067 case AV_PIX_FMT_RGB8:
2068 {
2069 int r,g,b;
2070
2071
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 43687569 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
43687569 switch (c->opts.dither) {
2072 ✗ case SWS_DITHER_NONE:
2073 ✗ if (isrgb8) {
2074 ✗ r = av_clip_uintp2(R >> 27, 3);
2075 ✗ g = av_clip_uintp2(G >> 27, 3);
2076 ✗ b = av_clip_uintp2(B >> 28, 2);
2077 } else {
2078 ✗ r = av_clip_uintp2(R >> 29, 1);
2079 ✗ g = av_clip_uintp2(G >> 28, 2);
2080 ✗ b = av_clip_uintp2(B >> 29, 1);
2081 }
2082 ✗ break;
2083 43687569 default:
2084 case SWS_DITHER_AUTO:
2085 case SWS_DITHER_ED:
2086 43687569 R >>= 22;
2087 43687569 G >>= 22;
2088 43687569 B >>= 22;
2089 43687569 R += (7*err[0] + 1*c->dither_error[0][i] + 5*c->dither_error[0][i+1] + 3*c->dither_error[0][i+2])>>4;
2090 43687569 G += (7*err[1] + 1*c->dither_error[1][i] + 5*c->dither_error[1][i+1] + 3*c->dither_error[1][i+2])>>4;
2091 43687569 B += (7*err[2] + 1*c->dither_error[2][i] + 5*c->dither_error[2][i+1] + 3*c->dither_error[2][i+2])>>4;
2092 43687569 c->dither_error[0][i] = err[0];
2093 43687569 c->dither_error[1][i] = err[1];
2094 43687569 c->dither_error[2][i] = err[2];
2095
2/2
✓ Branch 0 taken 27204183 times.
✓ Branch 1 taken 16483386 times.
43687569 r = R >> (isrgb8 ? 5 : 7);
2096
2/2
✓ Branch 0 taken 27204183 times.
✓ Branch 1 taken 16483386 times.
43687569 g = G >> (isrgb8 ? 5 : 6);
2097
2/2
✓ Branch 0 taken 27204183 times.
✓ Branch 1 taken 16483386 times.
43687569 b = B >> (isrgb8 ? 6 : 7);
2098
2/2
✓ Branch 0 taken 27204183 times.
✓ Branch 1 taken 16483386 times.
43687569 r = av_clip(r, 0, isrgb8 ? 7 : 1);
2099
2/2
✓ Branch 0 taken 27204183 times.
✓ Branch 1 taken 16483386 times.
43687569 g = av_clip(g, 0, isrgb8 ? 7 : 3);
2100
2/2
✓ Branch 0 taken 27204183 times.
✓ Branch 1 taken 16483386 times.
43687569 b = av_clip(b, 0, isrgb8 ? 3 : 1);
2101
2/2
✓ Branch 0 taken 27204183 times.
✓ Branch 1 taken 16483386 times.
43687569 err[0] = R - r*(isrgb8 ? 36 : 255);
2102
2/2
✓ Branch 0 taken 27204183 times.
✓ Branch 1 taken 16483386 times.
43687569 err[1] = G - g*(isrgb8 ? 36 : 85);
2103
2/2
✓ Branch 0 taken 27204183 times.
✓ Branch 1 taken 16483386 times.
43687569 err[2] = B - b*(isrgb8 ? 85 : 255);
2104 43687569 break;
2105 ✗ case SWS_DITHER_A_DITHER:
2106 ✗ if (isrgb8) {
2107 /* see http://pippin.gimp.org/a_dither/ for details/origin */
2108 #define A_DITHER(u,v) (((((u)+((v)*236))*119)&0xff))
2109 ✗ r = (((R >> 19) + A_DITHER(i,y) -96)>>8);
2110 ✗ g = (((G >> 19) + A_DITHER(i + 17,y) - 96)>>8);
2111 ✗ b = (((B >> 20) + A_DITHER(i + 17*2,y) -96)>>8);
2112 ✗ r = av_clip_uintp2(r, 3);
2113 ✗ g = av_clip_uintp2(g, 3);
2114 ✗ b = av_clip_uintp2(b, 2);
2115 } else {
2116 ✗ r = (((R >> 21) + A_DITHER(i,y)-256)>>8);
2117 ✗ g = (((G >> 19) + A_DITHER(i + 17,y)-256)>>8);
2118 ✗ b = (((B >> 21) + A_DITHER(i + 17*2,y)-256)>>8);
2119 ✗ r = av_clip_uintp2(r, 1);
2120 ✗ g = av_clip_uintp2(g, 2);
2121 ✗ b = av_clip_uintp2(b, 1);
2122 }
2123 ✗ break;
2124 ✗ case SWS_DITHER_X_DITHER:
2125 ✗ if (isrgb8) {
2126 /* see http://pippin.gimp.org/a_dither/ for details/origin */
2127 #define X_DITHER(u,v) (((((u)^((v)*237))*181)&0x1ff)/2)
2128 ✗ r = (((R >> 19) + X_DITHER(i,y) - 96)>>8);
2129 ✗ g = (((G >> 19) + X_DITHER(i + 17,y) - 96)>>8);
2130 ✗ b = (((B >> 20) + X_DITHER(i + 17*2,y) - 96)>>8);
2131 ✗ r = av_clip_uintp2(r, 3);
2132 ✗ g = av_clip_uintp2(g, 3);
2133 ✗ b = av_clip_uintp2(b, 2);
2134 } else {
2135 ✗ r = (((R >> 21) + X_DITHER(i,y)-256)>>8);
2136 ✗ g = (((G >> 19) + X_DITHER(i + 17,y)-256)>>8);
2137 ✗ b = (((B >> 21) + X_DITHER(i + 17*2,y)-256)>>8);
2138 ✗ r = av_clip_uintp2(r, 1);
2139 ✗ g = av_clip_uintp2(g, 2);
2140 ✗ b = av_clip_uintp2(b, 1);
2141 }
2142
2143 ✗ break;
2144 }
2145
2146
2/2
✓ Branch 0 taken 8241693 times.
✓ Branch 1 taken 35445876 times.
43687569 if(target == AV_PIX_FMT_BGR4_BYTE) {
2147 8241693 dest[0] = r + 2*g + 8*b;
2148
2/2
✓ Branch 0 taken 8241693 times.
✓ Branch 1 taken 27204183 times.
35445876 } else if(target == AV_PIX_FMT_RGB4_BYTE) {
2149 8241693 dest[0] = b + 2*g + 8*r;
2150
2/2
✓ Branch 0 taken 16428090 times.
✓ Branch 1 taken 10776093 times.
27204183 } else if(target == AV_PIX_FMT_BGR8) {
2151 16428090 dest[0] = r + 8*g + 64*b;
2152
1/2
✓ Branch 0 taken 10776093 times.
✗ Branch 1 not taken.
10776093 } else if(target == AV_PIX_FMT_RGB8) {
2153 10776093 dest[0] = b + 4*g + 32*r;
2154 } else
2155 av_assert2(0);
2156 43687569 break;}
2157 }
2158 359817413 }
2159
2160 static av_always_inline void
2161 12356 yuv2rgb_full_X_c_template(SwsInternal *c, const int16_t *lumFilter,
2162 const int16_t **lumSrc, int lumFilterSize,
2163 const int16_t *chrFilter, const int16_t **chrUSrc,
2164 const int16_t **chrVSrc, int chrFilterSize,
2165 const int16_t **alpSrc, uint8_t *dest,
2166 int dstW, int y, enum AVPixelFormat target, int hasAlpha)
2167 {
2168 int i;
2169
4/4
✓ Branch 0 taken 10423 times.
✓ Branch 1 taken 1933 times.
✓ Branch 2 taken 822 times.
✓ Branch 3 taken 9601 times.
12356 int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2170 12356 int err[4] = {0};
2171 12356 int A = 0; //init to silence warning
2172
2173
4/4
✓ Branch 0 taken 12156 times.
✓ Branch 1 taken 200 times.
✓ Branch 2 taken 11956 times.
✓ Branch 3 taken 200 times.
12356 if( target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2174
4/4
✓ Branch 0 taken 11556 times.
✓ Branch 1 taken 400 times.
✓ Branch 2 taken 200 times.
✓ Branch 3 taken 11356 times.
11956 || target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8)
2175 1000 step = 1;
2176
2177
2/2
✓ Branch 0 taken 5224476 times.
✓ Branch 1 taken 12356 times.
5236832 for (i = 0; i < dstW; i++) {
2178 int j;
2179 5224476 int Y = 1<<9;
2180 5224476 int U = (1<<9)-(128 << 19);
2181 5224476 int V = (1<<9)-(128 << 19);
2182
2183
2/2
✓ Branch 0 taken 25372922 times.
✓ Branch 1 taken 5224476 times.
30597398 for (j = 0; j < lumFilterSize; j++) {
2184 25372922 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2185 }
2186
2/2
✓ Branch 0 taken 26832626 times.
✓ Branch 1 taken 5224476 times.
32057102 for (j = 0; j < chrFilterSize; j++) {
2187 26832626 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2188 26832626 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2189 }
2190 5224476 Y >>= 10;
2191 5224476 U >>= 10;
2192 5224476 V >>= 10;
2193
2/2
✓ Branch 0 taken 4212007 times.
✓ Branch 1 taken 1012469 times.
5224476 if (hasAlpha) {
2194 4212007 A = 1 << 18;
2195
2/2
✓ Branch 0 taken 19408028 times.
✓ Branch 1 taken 4212007 times.
23620035 for (j = 0; j < lumFilterSize; j++) {
2196 19408028 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2197 }
2198 4212007 A >>= 19;
2199
1/2
✓ Branch 0 taken 4212007 times.
✗ Branch 1 not taken.
4212007 if (A & 0x100)
2200 4212007 A = av_clip_uint8(A);
2201 }
2202 5224476 yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2203 5224476 dest += step;
2204 }
2205 12356 c->dither_error[0][i] = err[0];
2206 12356 c->dither_error[1][i] = err[1];
2207 12356 c->dither_error[2][i] = err[2];
2208 12356 }
2209
2210 static av_always_inline void
2211 ✗ yuv2rgb_full_2_c_template(SwsInternal *c, const int16_t *buf[2],
2212 const int16_t *ubuf[2], const int16_t *vbuf[2],
2213 const int16_t *abuf[2], uint8_t *dest, int dstW,
2214 int yalpha, int uvalpha, int y,
2215 enum AVPixelFormat target, int hasAlpha)
2216 {
2217 ✗ const int16_t *buf0 = buf[0], *buf1 = buf[1],
2218 ✗ *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
2219 ✗ *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
2220 ✗ *abuf0 = hasAlpha ? abuf[0] : NULL,
2221 ✗ *abuf1 = hasAlpha ? abuf[1] : NULL;
2222 ✗ int yalpha1 = 4096 - yalpha;
2223 ✗ int uvalpha1 = 4096 - uvalpha;
2224 int i;
2225 ✗ int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2226 ✗ int err[4] = {0};
2227 ✗ int A = 0; // init to silcene warning
2228
2229 av_assert2(yalpha <= 4096U);
2230 av_assert2(uvalpha <= 4096U);
2231
2232 ✗ if( target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2233 ✗ || target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8)
2234 ✗ step = 1;
2235
2236 ✗ for (i = 0; i < dstW; i++) {
2237 ✗ int Y = ( buf0[i] * yalpha1 + buf1[i] * yalpha ) >> 10; //FIXME rounding
2238 ✗ int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha-(128 << 19)) >> 10;
2239 ✗ int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha-(128 << 19)) >> 10;
2240
2241 ✗ if (hasAlpha) {
2242 ✗ A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha + (1<<18)) >> 19;
2243 ✗ if (A & 0x100)
2244 ✗ A = av_clip_uint8(A);
2245 }
2246
2247 ✗ yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2248 ✗ dest += step;
2249 }
2250 ✗ c->dither_error[0][i] = err[0];
2251 ✗ c->dither_error[1][i] = err[1];
2252 ✗ c->dither_error[2][i] = err[2];
2253 ✗ }
2254
2255 static av_always_inline void
2256 1099149 yuv2rgb_full_1_c_template(SwsInternal *c, const int16_t *buf0,
2257 const int16_t *ubuf[2], const int16_t *vbuf[2],
2258 const int16_t *abuf0, uint8_t *dest, int dstW,
2259 int uvalpha, int y, enum AVPixelFormat target,
2260 int hasAlpha)
2261 {
2262 1099149 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
2263 int i;
2264
4/4
✓ Branch 0 taken 647945 times.
✓ Branch 1 taken 451204 times.
✓ Branch 2 taken 157864 times.
✓ Branch 3 taken 490081 times.
1099149 int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2265 1099149 int err[4] = {0};
2266
2267
4/4
✓ Branch 0 taken 1061032 times.
✓ Branch 1 taken 38117 times.
✓ Branch 2 taken 1022915 times.
✓ Branch 3 taken 38117 times.
1099149 if( target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2268
4/4
✓ Branch 0 taken 947257 times.
✓ Branch 1 taken 75658 times.
✓ Branch 2 taken 45317 times.
✓ Branch 3 taken 901940 times.
1022915 || target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8)
2269 197209 step = 1;
2270
2271
1/2
✓ Branch 0 taken 1099149 times.
✗ Branch 1 not taken.
1099149 if (uvalpha == 0) {
2272 1099149 int A = 0; //init to silence warning
2273
2/2
✓ Branch 0 taken 354592937 times.
✓ Branch 1 taken 1099149 times.
355692086 for (i = 0; i < dstW; i++) {
2274 354592937 int Y = buf0[i] * 4;
2275 354592937 int U = (ubuf0[i] - (128<<7)) * 4;
2276 354592937 int V = (vbuf0[i] - (128<<7)) * 4;
2277
2278
2/2
✓ Branch 0 taken 442368 times.
✓ Branch 1 taken 354150569 times.
354592937 if (hasAlpha) {
2279 442368 A = (abuf0[i] + 64) >> 7;
2280
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 442368 times.
442368 if (A & 0x100)
2281 ✗ A = av_clip_uint8(A);
2282 }
2283
2284 354592937 yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2285 354592937 dest += step;
2286 }
2287 } else {
2288 ✗ const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
2289 ✗ int A = 0; //init to silence warning
2290 ✗ int uvalpha1 = 4096 - uvalpha;
2291 av_assert2(uvalpha <= 4096U);
2292
2293 ✗ for (i = 0; i < dstW; i++) {
2294 ✗ int Y = buf0[i] * 4;
2295 ✗ int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 19)) >> 10;
2296 ✗ int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 19)) >> 10;
2297
2298 ✗ if (hasAlpha) {
2299 ✗ A = (abuf0[i] + 64) >> 7;
2300 ✗ if (A & 0x100)
2301 ✗ A = av_clip_uint8(A);
2302 }
2303
2304 ✗ yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2305 ✗ dest += step;
2306 }
2307 }
2308
2309 1099149 c->dither_error[0][i] = err[0];
2310 1099149 c->dither_error[1][i] = err[1];
2311 1099149 c->dither_error[2][i] = err[2];
2312 1099149 }
2313
2314 #if CONFIG_SMALL
2315 YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2316 YUV2RGBWRAPPER(yuv2, rgb_full, abgr32_full, AV_PIX_FMT_ABGR, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2317 YUV2RGBWRAPPER(yuv2, rgb_full, rgba32_full, AV_PIX_FMT_RGBA, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2318 YUV2RGBWRAPPER(yuv2, rgb_full, argb32_full, AV_PIX_FMT_ARGB, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2319 #else
2320 #if CONFIG_SWSCALE_ALPHA
2321 16306 YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA, 1)
2322 3104 YUV2RGBWRAPPER(yuv2, rgb_full, abgr32_full, AV_PIX_FMT_ABGR, 1)
2323 3104 YUV2RGBWRAPPER(yuv2, rgb_full, rgba32_full, AV_PIX_FMT_RGBA, 1)
2324 3104 YUV2RGBWRAPPER(yuv2, rgb_full, argb32_full, AV_PIX_FMT_ARGB, 1)
2325 #endif
2326 303504 YUV2RGBWRAPPER(yuv2, rgb_full, bgrx32_full, AV_PIX_FMT_BGRA, 0)
2327 384 YUV2RGBWRAPPER(yuv2, rgb_full, xbgr32_full, AV_PIX_FMT_ABGR, 0)
2328 384 YUV2RGBWRAPPER(yuv2, rgb_full, rgbx32_full, AV_PIX_FMT_RGBA, 0)
2329 384 YUV2RGBWRAPPER(yuv2, rgb_full, xrgb32_full, AV_PIX_FMT_ARGB, 0)
2330 #endif
2331 317372 YUV2RGBWRAPPER(yuv2, rgb_full, bgr24_full, AV_PIX_FMT_BGR24, 0)
2332 906274 YUV2RGBWRAPPER(yuv2, rgb_full, rgb24_full, AV_PIX_FMT_RGB24, 0)
2333
2334 76634 YUV2RGBWRAPPER(yuv2, rgb_full, bgr4_byte_full, AV_PIX_FMT_BGR4_BYTE, 0)
2335 76634 YUV2RGBWRAPPER(yuv2, rgb_full, rgb4_byte_full, AV_PIX_FMT_RGB4_BYTE, 0)
2336 152116 YUV2RGBWRAPPER(yuv2, rgb_full, bgr8_full, AV_PIX_FMT_BGR8, 0)
2337 91034 YUV2RGBWRAPPER(yuv2, rgb_full, rgb8_full, AV_PIX_FMT_RGB8, 0)
2338
2339 136336 YUV2RGBWRAPPER(yuv2, rgb_full, x2rgb10_full, AV_PIX_FMT_X2RGB10LE, 0)
2340 136336 YUV2RGBWRAPPER(yuv2, rgb_full, x2bgr10_full, AV_PIX_FMT_X2BGR10LE, 0)
2341
2342 static void
2343 2711424 yuv2gbrp_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2344 const int16_t **lumSrc, int lumFilterSize,
2345 const int16_t *chrFilter, const int16_t **chrUSrc,
2346 const int16_t **chrVSrc, int chrFilterSize,
2347 const int16_t **alpSrc, uint8_t **dest,
2348 int dstW, int y)
2349 {
2350 2711424 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2351 int i;
2352
4/4
✓ Branch 0 taken 125210 times.
✓ Branch 1 taken 2586214 times.
✓ Branch 2 taken 3092 times.
✓ Branch 3 taken 122118 times.
2711424 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrc;
2353 2711424 uint16_t **dest16 = (uint16_t**)dest;
2354 2711424 int SH = 22 + 8 - desc->comp[0].depth;
2355 2711424 int A = 0; // init to silence warning
2356
2357
2/2
✓ Branch 0 taken 951518096 times.
✓ Branch 1 taken 2711424 times.
954229520 for (i = 0; i < dstW; i++) {
2358 int j;
2359 951518096 int Y = 1 << 9;
2360 951518096 int U = (1 << 9) - (128 << 19);
2361 951518096 int V = (1 << 9) - (128 << 19);
2362 int R, G, B;
2363
2364
2/2
✓ Branch 0 taken 961818896 times.
✓ Branch 1 taken 951518096 times.
1913336992 for (j = 0; j < lumFilterSize; j++)
2365 961818896 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2366
2367
2/2
✓ Branch 0 taken 1907091392 times.
✓ Branch 1 taken 951518096 times.
2858609488 for (j = 0; j < chrFilterSize; j++) {
2368 1907091392 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2369 1907091392 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2370 }
2371
2372 951518096 Y >>= 10;
2373 951518096 U >>= 10;
2374 951518096 V >>= 10;
2375
2376
2/2
✓ Branch 0 taken 482112 times.
✓ Branch 1 taken 951035984 times.
951518096 if (hasAlpha) {
2377 482112 A = 1 << 18;
2378
2379
2/2
✓ Branch 0 taken 4098112 times.
✓ Branch 1 taken 482112 times.
4580224 for (j = 0; j < lumFilterSize; j++)
2380 4098112 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2381
2382
2/2
✓ Branch 0 taken 320720 times.
✓ Branch 1 taken 161392 times.
482112 if (A & 0xF8000000)
2383 320720 A = av_clip_uintp2(A, 27);
2384 }
2385
2386 951518096 Y -= c->yuv2rgb_y_offset;
2387 951518096 Y *= c->yuv2rgb_y_coeff;
2388 951518096 Y += 1 << (SH-1);
2389 951518096 R = Y + V * (unsigned)c->yuv2rgb_v2r_coeff;
2390 951518096 G = Y + V * (unsigned)c->yuv2rgb_v2g_coeff + U * (unsigned)c->yuv2rgb_u2g_coeff;
2391 951518096 B = Y + U * (unsigned)c->yuv2rgb_u2b_coeff;
2392
2393
2/2
✓ Branch 0 taken 289474290 times.
✓ Branch 1 taken 662043806 times.
951518096 if ((R | G | B) & 0xC0000000) {
2394 289474290 R = av_clip_uintp2(R, 30);
2395 289474290 G = av_clip_uintp2(G, 30);
2396 289474290 B = av_clip_uintp2(B, 30);
2397 }
2398
2399
2/2
✓ Branch 0 taken 660147856 times.
✓ Branch 1 taken 291370240 times.
951518096 if (SH != 22) {
2400 660147856 dest16[0][i] = G >> SH;
2401 660147856 dest16[1][i] = B >> SH;
2402 660147856 dest16[2][i] = R >> SH;
2403
2/2
✓ Branch 0 taken 423808 times.
✓ Branch 1 taken 659724048 times.
660147856 if (hasAlpha)
2404 423808 dest16[3][i] = A >> (SH - 3);
2405 } else {
2406 291370240 dest[0][i] = G >> 22;
2407 291370240 dest[1][i] = B >> 22;
2408 291370240 dest[2][i] = R >> 22;
2409
2/2
✓ Branch 0 taken 58304 times.
✓ Branch 1 taken 291311936 times.
291370240 if (hasAlpha)
2410 58304 dest[3][i] = A >> 19;
2411 }
2412 }
2413
4/4
✓ Branch 0 taken 1883380 times.
✓ Branch 1 taken 828044 times.
✓ Branch 3 taken 221904 times.
✓ Branch 4 taken 1661476 times.
2711424 if (SH != 22 && (!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2414
2/2
✓ Branch 0 taken 77275968 times.
✓ Branch 1 taken 221904 times.
77497872 for (i = 0; i < dstW; i++) {
2415 77275968 dest16[0][i] = av_bswap16(dest16[0][i]);
2416 77275968 dest16[1][i] = av_bswap16(dest16[1][i]);
2417 77275968 dest16[2][i] = av_bswap16(dest16[2][i]);
2418
2/2
✓ Branch 0 taken 211904 times.
✓ Branch 1 taken 77064064 times.
77275968 if (hasAlpha)
2419 211904 dest16[3][i] = av_bswap16(dest16[3][i]);
2420 }
2421 }
2422 2711424 }
2423
2424 static void
2425 41312 yuv2gbrpmsb_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2426 const int16_t **lumSrc, int lumFilterSize,
2427 const int16_t *chrFilter, const int16_t **chrUSrc,
2428 const int16_t **chrVSrc, int chrFilterSize,
2429 const int16_t **alpSrc, uint8_t **dest,
2430 int dstW, int y)
2431 {
2432 41312 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2433
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 41312 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
41312 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrc;
2434 41312 uint16_t **dest16 = (uint16_t**)dest;
2435 41312 int shift = 16 - desc->comp[0].depth;
2436 int i;
2437
2438 41312 yuv2gbrp_full_X_c(c, lumFilter, lumSrc, lumFilterSize,
2439 chrFilter, chrUSrc, chrVSrc, chrFilterSize,
2440 alpSrc, dest, dstW, y);
2441
2442
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 41312 times.
41312 if (desc->comp[0].depth <= 8)
2443 ✗ return;
2444
2445
2/2
✓ Branch 1 taken 19984 times.
✓ Branch 2 taken 21328 times.
41312 if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2446
2/2
✓ Branch 0 taken 6678656 times.
✓ Branch 1 taken 19984 times.
6698640 for (i = 0; i < dstW; i++) {
2447 6678656 dest16[0][i] = av_bswap16(av_bswap16(dest16[0][i]) << shift);
2448 6678656 dest16[1][i] = av_bswap16(av_bswap16(dest16[1][i]) << shift);
2449 6678656 dest16[2][i] = av_bswap16(av_bswap16(dest16[2][i]) << shift);
2450
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6678656 times.
6678656 if (hasAlpha)
2451 ✗ dest16[3][i] = av_bswap16(av_bswap16(dest16[3][i]) << shift);
2452 }
2453 } else {
2454
2/2
✓ Branch 0 taken 7102592 times.
✓ Branch 1 taken 21328 times.
7123920 for (i = 0; i < dstW; i++) {
2455 7102592 dest16[0][i] = dest16[0][i] << shift;
2456 7102592 dest16[1][i] = dest16[1][i] << shift;
2457 7102592 dest16[2][i] = dest16[2][i] << shift;
2458
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7102592 times.
7102592 if (hasAlpha)
2459 ✗ dest16[3][i] = dest16[3][i] << shift;
2460 }
2461 }
2462 }
2463
2464 static void
2465 362748 yuv2gbrp16_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2466 const int16_t **lumSrcx, int lumFilterSize,
2467 const int16_t *chrFilter, const int16_t **chrUSrcx,
2468 const int16_t **chrVSrcx, int chrFilterSize,
2469 const int16_t **alpSrcx, uint8_t **dest,
2470 int dstW, int y)
2471 {
2472 362748 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2473 int i;
2474
4/4
✓ Branch 0 taken 27870 times.
✓ Branch 1 taken 334878 times.
✓ Branch 2 taken 796 times.
✓ Branch 3 taken 27074 times.
362748 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrcx;
2475 362748 uint16_t **dest16 = (uint16_t**)dest;
2476 362748 const int32_t **lumSrc = (const int32_t**)lumSrcx;
2477 362748 const int32_t **chrUSrc = (const int32_t**)chrUSrcx;
2478 362748 const int32_t **chrVSrc = (const int32_t**)chrVSrcx;
2479 362748 const int32_t **alpSrc = (const int32_t**)alpSrcx;
2480
2481
2/2
✓ Branch 0 taken 127385024 times.
✓ Branch 1 taken 362748 times.
127747772 for (i = 0; i < dstW; i++) {
2482 int j;
2483 127385024 int Y = -0x40000000;
2484 127385024 int U = -(128 << 23);
2485 127385024 int V = -(128 << 23);
2486 int R, G, B, A;
2487
2488
2/2
✓ Branch 0 taken 129573824 times.
✓ Branch 1 taken 127385024 times.
256958848 for (j = 0; j < lumFilterSize; j++)
2489 129573824 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2490
2491
2/2
✓ Branch 0 taken 218379200 times.
✓ Branch 1 taken 127385024 times.
345764224 for (j = 0; j < chrFilterSize; j++) {
2492 218379200 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2493 218379200 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2494 }
2495
2496 127385024 Y >>= 14;
2497 127385024 Y += 0x10000;
2498 127385024 U >>= 14;
2499 127385024 V >>= 14;
2500
2501
2/2
✓ Branch 0 taken 129568 times.
✓ Branch 1 taken 127255456 times.
127385024 if (hasAlpha) {
2502 129568 A = -0x40000000;
2503
2504
2/2
✓ Branch 0 taken 1223968 times.
✓ Branch 1 taken 129568 times.
1353536 for (j = 0; j < lumFilterSize; j++)
2505 1223968 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2506
2507 129568 A >>= 1;
2508 129568 A += 0x20002000;
2509 }
2510
2511 127385024 Y -= c->yuv2rgb_y_offset;
2512 127385024 Y *= c->yuv2rgb_y_coeff;
2513 127385024 Y += (1 << 13) - (1 << 29);
2514 127385024 R = V * c->yuv2rgb_v2r_coeff;
2515 127385024 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
2516 127385024 B = U * c->yuv2rgb_u2b_coeff;
2517
2518 127385024 dest16[2][i] = av_clip_uintp2(((Y + (int64_t)R) >> 14) + (1<<15), 16);
2519 127385024 dest16[0][i] = av_clip_uintp2(((Y + (int64_t)G) >> 14) + (1<<15), 16);
2520 127385024 dest16[1][i] = av_clip_uintp2(((Y + (int64_t)B) >> 14) + (1<<15), 16);
2521
2522
2/2
✓ Branch 0 taken 129568 times.
✓ Branch 1 taken 127255456 times.
127385024 if (hasAlpha)
2523 129568 dest16[3][i] = av_clip_uintp2(A, 30) >> 14;
2524 }
2525
2/2
✓ Branch 1 taken 124240 times.
✓ Branch 2 taken 238508 times.
362748 if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2526
2/2
✓ Branch 0 taken 43531456 times.
✓ Branch 1 taken 124240 times.
43655696 for (i = 0; i < dstW; i++) {
2527 43531456 dest16[0][i] = av_bswap16(dest16[0][i]);
2528 43531456 dest16[1][i] = av_bswap16(dest16[1][i]);
2529 43531456 dest16[2][i] = av_bswap16(dest16[2][i]);
2530
2/2
✓ Branch 0 taken 71264 times.
✓ Branch 1 taken 43460192 times.
43531456 if (hasAlpha)
2531 71264 dest16[3][i] = av_bswap16(dest16[3][i]);
2532 }
2533 }
2534 362748 }
2535
2536 static void
2537 84787 yuv2gbrpf32_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2538 const int16_t **lumSrcx, int lumFilterSize,
2539 const int16_t *chrFilter, const int16_t **chrUSrcx,
2540 const int16_t **chrVSrcx, int chrFilterSize,
2541 const int16_t **alpSrcx, uint8_t **dest,
2542 int dstW, int y)
2543 {
2544 84787 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2545 int i;
2546
4/4
✓ Branch 0 taken 38193 times.
✓ Branch 1 taken 46594 times.
✓ Branch 2 taken 3633 times.
✓ Branch 3 taken 34560 times.
84787 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrcx;
2547 84787 uint32_t **dest32 = (uint32_t**)dest;
2548 84787 const int32_t **lumSrc = (const int32_t**)lumSrcx;
2549 84787 const int32_t **chrUSrc = (const int32_t**)chrUSrcx;
2550 84787 const int32_t **chrVSrc = (const int32_t**)chrVSrcx;
2551 84787 const int32_t **alpSrc = (const int32_t**)alpSrcx;
2552 static const float float_mult = 1.0f / 65535.0f;
2553
2554
2/2
✓ Branch 0 taken 30865206 times.
✓ Branch 1 taken 84787 times.
30949993 for (i = 0; i < dstW; i++) {
2555 int j;
2556 30865206 int Y = -0x40000000;
2557 30865206 int U = -(128 << 23);
2558 30865206 int V = -(128 << 23);
2559 int R, G, B, A;
2560
2561
2/2
✓ Branch 0 taken 33054006 times.
✓ Branch 1 taken 30865206 times.
63919212 for (j = 0; j < lumFilterSize; j++)
2562 33054006 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2563
2564
2/2
✓ Branch 0 taken 114560310 times.
✓ Branch 1 taken 30865206 times.
145425516 for (j = 0; j < chrFilterSize; j++) {
2565 114560310 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2566 114560310 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2567 }
2568
2569 30865206 Y >>= 14;
2570 30865206 Y += 0x10000;
2571 30865206 U >>= 14;
2572 30865206 V >>= 14;
2573
2574
2/2
✓ Branch 0 taken 1935115 times.
✓ Branch 1 taken 28930091 times.
30865206 if (hasAlpha) {
2575 1935115 A = -0x40000000;
2576
2577
2/2
✓ Branch 0 taken 3029515 times.
✓ Branch 1 taken 1935115 times.
4964630 for (j = 0; j < lumFilterSize; j++)
2578 3029515 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2579
2580 1935115 A >>= 1;
2581 1935115 A += 0x20002000;
2582 }
2583
2584 30865206 Y -= c->yuv2rgb_y_offset;
2585 30865206 Y *= c->yuv2rgb_y_coeff;
2586 30865206 Y += (1 << 13) - (1 << 29);
2587 30865206 R = V * c->yuv2rgb_v2r_coeff;
2588 30865206 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
2589 30865206 B = U * c->yuv2rgb_u2b_coeff;
2590
2591 30865206 R = av_clip_uintp2(((Y + R) >> 14) + (1<<15), 16);
2592 30865206 G = av_clip_uintp2(((Y + G) >> 14) + (1<<15), 16);
2593 30865206 B = av_clip_uintp2(((Y + B) >> 14) + (1<<15), 16);
2594
2595 30865206 dest32[0][i] = av_float2int(float_mult * (float)G);
2596 30865206 dest32[1][i] = av_float2int(float_mult * (float)B);
2597 30865206 dest32[2][i] = av_float2int(float_mult * (float)R);
2598
2/2
✓ Branch 0 taken 1935115 times.
✓ Branch 1 taken 28930091 times.
30865206 if (hasAlpha)
2599 1935115 dest32[3][i] = av_float2int(float_mult * (float)(av_clip_uintp2(A, 30) >> 14));
2600 }
2601
2/2
✓ Branch 1 taken 23056 times.
✓ Branch 2 taken 61731 times.
84787 if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2602
2/2
✓ Branch 0 taken 8021632 times.
✓ Branch 1 taken 23056 times.
8044688 for (i = 0; i < dstW; i++) {
2603 8021632 dest32[0][i] = av_bswap32(dest32[0][i]);
2604 8021632 dest32[1][i] = av_bswap32(dest32[1][i]);
2605 8021632 dest32[2][i] = av_bswap32(dest32[2][i]);
2606
2/2
✓ Branch 0 taken 57152 times.
✓ Branch 1 taken 7964480 times.
8021632 if (hasAlpha)
2607 57152 dest32[3][i] = av_bswap32(dest32[3][i]);
2608 }
2609 }
2610 84787 }
2611
2612 static void
2613 576 yuv2ya8_1_c(SwsInternal *c, const int16_t *buf0,
2614 const int16_t *ubuf[2], const int16_t *vbuf[2],
2615 const int16_t *abuf0, uint8_t *dest, int dstW,
2616 int uvalpha, int y)
2617 {
2618 576 int hasAlpha = !!abuf0;
2619 int i;
2620
2621
2/2
✓ Branch 0 taken 55296 times.
✓ Branch 1 taken 576 times.
55872 for (i = 0; i < dstW; i++) {
2622 55296 int Y = (buf0[i] + 64) >> 7;
2623 int A;
2624
2625 55296 Y = av_clip_uint8(Y);
2626
2627
1/2
✓ Branch 0 taken 55296 times.
✗ Branch 1 not taken.
55296 if (hasAlpha) {
2628 55296 A = (abuf0[i] + 64) >> 7;
2629
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 55296 times.
55296 if (A & 0x100)
2630 ✗ A = av_clip_uint8(A);
2631 }
2632
2633 55296 dest[i * 2 ] = Y;
2634
1/2
✓ Branch 0 taken 55296 times.
✗ Branch 1 not taken.
55296 dest[i * 2 + 1] = hasAlpha ? A : 255;
2635 }
2636 576 }
2637
2638 static void
2639 ✗ yuv2ya8_2_c(SwsInternal *c, const int16_t *buf[2],
2640 const int16_t *ubuf[2], const int16_t *vbuf[2],
2641 const int16_t *abuf[2], uint8_t *dest, int dstW,
2642 int yalpha, int uvalpha, int y)
2643 {
2644 ✗ int hasAlpha = abuf && abuf[0] && abuf[1];
2645 ✗ const int16_t *buf0 = buf[0], *buf1 = buf[1],
2646 ✗ *abuf0 = hasAlpha ? abuf[0] : NULL,
2647 ✗ *abuf1 = hasAlpha ? abuf[1] : NULL;
2648 ✗ int yalpha1 = 4096 - yalpha;
2649 int i;
2650
2651 av_assert2(yalpha <= 4096U);
2652
2653 ✗ for (i = 0; i < dstW; i++) {
2654 ✗ int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 19;
2655 int A;
2656
2657 ✗ Y = av_clip_uint8(Y);
2658
2659 ✗ if (hasAlpha) {
2660 ✗ A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 19;
2661 ✗ A = av_clip_uint8(A);
2662 }
2663
2664 ✗ dest[i * 2 ] = Y;
2665 ✗ dest[i * 2 + 1] = hasAlpha ? A : 255;
2666 }
2667 ✗ }
2668
2669 static void
2670 9992 yuv2ya8_X_c(SwsInternal *c, const int16_t *lumFilter,
2671 const int16_t **lumSrc, int lumFilterSize,
2672 const int16_t *chrFilter, const int16_t **chrUSrc,
2673 const int16_t **chrVSrc, int chrFilterSize,
2674 const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
2675 {
2676 9992 int hasAlpha = !!alpSrc;
2677 int i;
2678
2679
2/2
✓ Branch 0 taken 3486784 times.
✓ Branch 1 taken 9992 times.
3496776 for (i = 0; i < dstW; i++) {
2680 int j;
2681 3486784 int Y = 1 << 18, A = 1 << 18;
2682
2683
2/2
✓ Branch 0 taken 3926784 times.
✓ Branch 1 taken 3486784 times.
7413568 for (j = 0; j < lumFilterSize; j++)
2684 3926784 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2685
2686 3486784 Y >>= 19;
2687
2/2
✓ Branch 0 taken 19122 times.
✓ Branch 1 taken 3467662 times.
3486784 if (Y & 0x100)
2688 19122 Y = av_clip_uint8(Y);
2689
2690
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 3446784 times.
3486784 if (hasAlpha) {
2691
2/2
✓ Branch 0 taken 480000 times.
✓ Branch 1 taken 40000 times.
520000 for (j = 0; j < lumFilterSize; j++)
2692 480000 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2693
2694 40000 A >>= 19;
2695
2696
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 40000 times.
40000 if (A & 0x100)
2697 ✗ A = av_clip_uint8(A);
2698 }
2699
2700 3486784 dest[2 * i ] = Y;
2701
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 3446784 times.
3486784 dest[2 * i + 1] = hasAlpha ? A : 255;
2702 }
2703 9992 }
2704
2705 #define output_pixels(pos, val) \
2706 if (is_be) { \
2707 AV_WB16(pos, val); \
2708 } else { \
2709 AV_WL16(pos, val); \
2710 }
2711
2712 static av_always_inline void
2713 249632 yuv2ayuv64_X_c(SwsInternal *c, const int16_t *lumFilter,
2714 const int16_t **_lumSrc, int lumFilterSize,
2715 const int16_t *chrFilter, const int16_t **_chrUSrc,
2716 const int16_t **_chrVSrc, int chrFilterSize,
2717 const int16_t **_alpSrc, uint8_t *dest, int dstW, int y,
2718 int A_offset, int Y_offset, int U_offset, int V_offset, int is_be)
2719 {
2720 249632 const int32_t **lumSrc = (const int32_t **) _lumSrc,
2721 249632 **chrUSrc = (const int32_t **) _chrUSrc,
2722 249632 **chrVSrc = (const int32_t **) _chrVSrc,
2723 249632 **alpSrc = (const int32_t **) _alpSrc;
2724 249632 int hasAlpha = !!alpSrc;
2725 int i;
2726
2727
2/2
✓ Branch 0 taken 87159040 times.
✓ Branch 1 taken 249632 times.
87408672 for (i = 0; i < dstW; i++) {
2728 87159040 int Y = 1 << 14, U = 1 << 14;
2729 87159040 int V = 1 << 14, A = 1 << 14;
2730 int j;
2731
2732 87159040 Y -= 0x40000000;
2733 87159040 U -= 0x40000000;
2734 87159040 V -= 0x40000000;
2735 87159040 A -= 0x40000000;
2736
2737
2/2
✓ Branch 0 taken 88919040 times.
✓ Branch 1 taken 87159040 times.
176078080 for (j = 0; j < lumFilterSize; j++)
2738 88919040 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2739
2740
2/2
✓ Branch 0 taken 127847424 times.
✓ Branch 1 taken 87159040 times.
215006464 for (j = 0; j < chrFilterSize; j++)
2741 127847424 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2742
2743
2/2
✓ Branch 0 taken 127847424 times.
✓ Branch 1 taken 87159040 times.
215006464 for (j = 0; j < chrFilterSize; j++)
2744 127847424 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2745
2746
2/2
✓ Branch 0 taken 190592 times.
✓ Branch 1 taken 86968448 times.
87159040 if (hasAlpha)
2747
2/2
✓ Branch 0 taken 1070592 times.
✓ Branch 1 taken 190592 times.
1261184 for (j = 0; j < lumFilterSize; j++)
2748 1070592 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2749
2750 87159040 Y = 0x8000 + av_clip_int16(Y >> 15);
2751 87159040 U = 0x8000 + av_clip_int16(U >> 15);
2752 87159040 V = 0x8000 + av_clip_int16(V >> 15);
2753
2/2
✓ Branch 0 taken 190592 times.
✓ Branch 1 taken 86968448 times.
87159040 if (hasAlpha)
2754 190592 A = 0x8000 + av_clip_int16(A >> 15);
2755
2756
6/6
✓ Branch 0 taken 43579520 times.
✓ Branch 1 taken 43579520 times.
✓ Branch 2 taken 95296 times.
✓ Branch 3 taken 43484224 times.
✓ Branch 4 taken 95296 times.
✓ Branch 5 taken 43484224 times.
87159040 output_pixels(dest + 8 * i + A_offset, hasAlpha ? A : 65535);
2757
2/2
✓ Branch 0 taken 43579520 times.
✓ Branch 1 taken 43579520 times.
87159040 output_pixels(dest + 8 * i + Y_offset, Y);
2758
2/2
✓ Branch 0 taken 43579520 times.
✓ Branch 1 taken 43579520 times.
87159040 output_pixels(dest + 8 * i + U_offset, U);
2759
2/2
✓ Branch 0 taken 43579520 times.
✓ Branch 1 taken 43579520 times.
87159040 output_pixels(dest + 8 * i + V_offset, V);
2760 }
2761 249632 }
2762
2763 #define YUV2AYUV64(pixfmt, BE_LE, A, Y, U, V, is_be) \
2764 static void \
2765 yuv2 ## pixfmt ## BE_LE ##_X_c(SwsInternal *c, const int16_t *lumFilter, \
2766 const int16_t **lumSrc, int lumFilterSize, \
2767 const int16_t *chrFilter, const int16_t **chrUSrc, \
2768 const int16_t **chrVSrc, int chrFilterSize, \
2769 const int16_t **alpSrc, uint8_t *dest, int dstW, int y) \
2770 { \
2771 yuv2ayuv64_X_c(c, lumFilter, lumSrc, lumFilterSize, \
2772 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2773 alpSrc, dest, dstW, y, A, Y, U, V, is_be); \
2774 }
2775
2776 9992 YUV2AYUV64(ayuv64, le, 0, 2, 4, 6, 0)
2777 9992 YUV2AYUV64(ayuv64, be, 0, 2, 4, 6, 1)
2778
2779 114824 YUV2AYUV64(xv48, le, 6, 2, 0, 4, 0)
2780 114824 YUV2AYUV64(xv48, be, 6, 2, 0, 4, 1)
2781
2782 #undef output_pixels
2783
2784 static av_always_inline void
2785 244020 yuv2v30_X_c_template(SwsInternal *c, const int16_t *lumFilter,
2786 const int16_t **lumSrc, int lumFilterSize,
2787 const int16_t *chrFilter, const int16_t **chrUSrc,
2788 const int16_t **chrVSrc, int chrFilterSize,
2789 const int16_t **alpSrc, uint8_t *dest, int dstW, int y,
2790 int shift)
2791 {
2792 int i;
2793
2/2
✓ Branch 0 taken 84998728 times.
✓ Branch 1 taken 244020 times.
85242748 for (i = 0; i < dstW; i++) {
2794 84998728 int Y = 1 << 16, U = 1 << 16, V = 1 << 16, A = 0x3;
2795 int j;
2796
2797
2/2
✓ Branch 0 taken 85878728 times.
✓ Branch 1 taken 84998728 times.
170877456 for (j = 0; j < lumFilterSize; j++)
2798 85878728 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2799
2800
2/2
✓ Branch 0 taken 120549320 times.
✓ Branch 1 taken 84998728 times.
205548048 for (j = 0; j < chrFilterSize; j++) {
2801 120549320 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2802 120549320 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2803 }
2804
2805 84998728 Y = av_clip_uintp2(Y >> 17, 10);
2806 84998728 U = av_clip_uintp2(U >> 17, 10);
2807 84998728 V = av_clip_uintp2(V >> 17, 10);
2808
2809
2/2
✓ Branch 0 taken 52665864 times.
✓ Branch 1 taken 32332864 times.
84998728 AV_WL32(dest + 4 * i, U << (shift + 0) |
2810 Y << (shift + 10) |
2811 (unsigned)V << (shift + 20) |
2812 (unsigned)A << (shift ? 0 : 30 /* xv30le = 30, v30xle = 0 */));
2813 }
2814 244020 }
2815
2816 #define V30LE_WRAPPER(name, shift) \
2817 static void yuv2 ## name ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
2818 const int16_t **lumSrc, int lumFilterSize, \
2819 const int16_t *chrFilter, const int16_t **chrUSrc, \
2820 const int16_t **chrVSrc, int chrFilterSize, \
2821 const int16_t **alpSrc, uint8_t *dest, int dstW, \
2822 int y) \
2823 { \
2824 yuv2v30_X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
2825 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2826 alpSrc, dest, dstW, y, shift); \
2827 }
2828
2829 92360 V30LE_WRAPPER(xv30le, 0)
2830 151660 V30LE_WRAPPER(v30xle, 2)
2831
2832 #define output_pixels(pos, val, shift, bits, output_shift) \
2833 if (is_be) { \
2834 AV_WB16(pos, av_clip_uintp2(val >> shift, bits) << output_shift); \
2835 } else { \
2836 AV_WL16(pos, av_clip_uintp2(val >> shift, bits) << output_shift); \
2837 }
2838
2839 static void
2840 184720 yuv2xv36_X_c(SwsInternal *c, const int16_t *lumFilter,
2841 const int16_t **lumSrc, int lumFilterSize,
2842 const int16_t *chrFilter, const int16_t **chrUSrc,
2843 const int16_t **chrVSrc, int chrFilterSize,
2844 const int16_t **alpSrc, uint8_t *dest, int dstW, int y, int is_be)
2845 {
2846 int i;
2847
2/2
✓ Branch 0 taken 64665728 times.
✓ Branch 1 taken 184720 times.
64850448 for (i = 0; i < dstW; i++) {
2848 64665728 int Y = 1 << 14, U = 1 << 14, V = 1 << 14, A = 65535;
2849 int j;
2850
2851
2/2
✓ Branch 0 taken 65545728 times.
✓ Branch 1 taken 64665728 times.
130211456 for (j = 0; j < lumFilterSize; j++)
2852 65545728 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2853
2854
2/2
✓ Branch 0 taken 85009920 times.
✓ Branch 1 taken 64665728 times.
149675648 for (j = 0; j < chrFilterSize; j++) {
2855 85009920 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2856 85009920 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2857 }
2858
2859
2/2
✓ Branch 0 taken 32332864 times.
✓ Branch 1 taken 32332864 times.
64665728 output_pixels(dest + 8 * i + 2, Y, 15, 12, 4)
2860
2/2
✓ Branch 0 taken 32332864 times.
✓ Branch 1 taken 32332864 times.
64665728 output_pixels(dest + 8 * i + 0, U, 15, 12, 4)
2861
2/2
✓ Branch 0 taken 32332864 times.
✓ Branch 1 taken 32332864 times.
64665728 output_pixels(dest + 8 * i + 4, V, 15, 12, 4)
2862
2/2
✓ Branch 0 taken 32332864 times.
✓ Branch 1 taken 32332864 times.
64665728 output_pixels(dest + 8 * i + 6, A, 0, 12, 4);
2863 }
2864 184720 }
2865
2866 #undef output_pixels
2867
2868 #define YUV2XV36(BE_LE, is_be) \
2869 static void \
2870 yuv2xv36 ## BE_LE ##_X_c(SwsInternal *c, const int16_t *lumFilter, \
2871 const int16_t **lumSrc, int lumFilterSize, \
2872 const int16_t *chrFilter, const int16_t **chrUSrc, \
2873 const int16_t **chrVSrc, int chrFilterSize, \
2874 const int16_t **alpSrc, uint8_t *dest, int dstW, int y) \
2875 { \
2876 yuv2xv36_X_c(c, lumFilter, lumSrc, lumFilterSize, \
2877 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2878 alpSrc, dest, dstW, y, is_be); \
2879 }
2880
2881 92360 YUV2XV36(le, 0)
2882 92360 YUV2XV36(be, 1)
2883
2884 #define output_pixels(pos, A, Y, U, V) \
2885 if (target == AV_PIX_FMT_AYUV) { \
2886 dest[pos + 0] = A; \
2887 dest[pos + 1] = Y; \
2888 dest[pos + 2] = U; \
2889 dest[pos + 3] = V; \
2890 } else if (target == AV_PIX_FMT_UYVA) { \
2891 dest[pos + 0] = U; \
2892 dest[pos + 1] = Y; \
2893 dest[pos + 2] = V; \
2894 dest[pos + 3] = A; \
2895 } else { /* AV_PIX_FMT_VUYA || AV_PIX_FMT_VUYX */ \
2896 dest[pos + 0] = V; \
2897 dest[pos + 1] = U; \
2898 dest[pos + 2] = Y; \
2899 dest[pos + 3] = A; \
2900 }
2901
2902 static av_always_inline void
2903 129572 yuv2ayuv_1_c_template(SwsInternal *c, const int16_t *buf0,
2904 const int16_t *ubuf[2], const int16_t *vbuf[2],
2905 const int16_t *abuf0, uint8_t *dest, int dstW,
2906 int uvalpha, int y, enum AVPixelFormat target)
2907 {
2908 129572 int hasAlpha = !!abuf0;
2909 int i;
2910
2911
1/2
✓ Branch 0 taken 129572 times.
✗ Branch 1 not taken.
129572 if (uvalpha < 2048) {
2912
2/2
✓ Branch 0 taken 44478920 times.
✓ Branch 1 taken 129572 times.
44608492 for (i = 0; i < dstW; i++) {
2913 44478920 int Y = (buf0[i] + 64) >> 7;
2914 44478920 int U = (ubuf[0][i] + 64) >> 7;
2915 44478920 int V = (vbuf[0][i] + 64) >> 7;
2916 44478920 int A = 255;
2917
2918
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44478920 times.
44478920 if (Y & 0x100)
2919 ✗ Y = av_clip_uint8(Y);
2920
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44478920 times.
44478920 if (U & 0x100)
2921 ✗ U = av_clip_uint8(U);
2922
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44478920 times.
44478920 if (V & 0x100)
2923 ✗ V = av_clip_uint8(V);
2924
2925
2/2
✓ Branch 0 taken 165888 times.
✓ Branch 1 taken 44313032 times.
44478920 if (hasAlpha) {
2926 165888 A = (abuf0[i] + 64) >> 7;
2927
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 165888 times.
165888 if (A & 0x100)
2928 ✗ A = av_clip_uint8(A);
2929 }
2930
2931
4/4
✓ Branch 0 taken 55296 times.
✓ Branch 1 taken 44423624 times.
✓ Branch 2 taken 15319496 times.
✓ Branch 3 taken 29104128 times.
44478920 output_pixels(i * 4, A, Y, U, V)
2932 }
2933 } else {
2934 ✗ for (i = 0; i < dstW; i++) {
2935 ✗ int Y = (buf0[i] + 64) >> 7;
2936 ✗ int U = (ubuf[0][i] + ubuf[1][i] + 128) >> 8;
2937 ✗ int V = (vbuf[0][i] + vbuf[1][i] + 128) >> 8;
2938 ✗ int A = 255;
2939
2940 ✗ if (Y & 0x100)
2941 ✗ Y = av_clip_uint8(Y);
2942 ✗ if (U & 0x100)
2943 ✗ U = av_clip_uint8(U);
2944 ✗ if (V & 0x100)
2945 ✗ V = av_clip_uint8(V);
2946
2947 ✗ if (hasAlpha) {
2948 ✗ A = (abuf0[i] + 64) >> 7;
2949 ✗ if (A & 0x100)
2950 ✗ A = av_clip_uint8(A);
2951 }
2952
2953 ✗ output_pixels(i * 4, A, Y, U, V)
2954 }
2955 }
2956 129572 }
2957
2958 static av_always_inline void
2959 ✗ yuv2ayuv_2_c_template(SwsInternal *c, const int16_t *buf[2],
2960 const int16_t *ubuf[2], const int16_t *vbuf[2],
2961 const int16_t *abuf[2], uint8_t *dest, int dstW,
2962 int yalpha, int uvalpha, int y,
2963 enum AVPixelFormat target)
2964 {
2965 ✗ int hasAlpha = abuf && abuf[0] && abuf[1];
2966 ✗ const int16_t *buf0 = buf[0], *buf1 = buf[1],
2967 ✗ *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
2968 ✗ *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
2969 ✗ *abuf0 = hasAlpha ? abuf[0] : NULL,
2970 ✗ *abuf1 = hasAlpha ? abuf[1] : NULL;
2971 ✗ int yalpha1 = 4096 - yalpha;
2972 ✗ int uvalpha1 = 4096 - uvalpha;
2973 int i;
2974
2975 av_assert2(yalpha <= 4096U);
2976 av_assert2(uvalpha <= 4096U);
2977
2978 ✗ for (i = 0; i < dstW; i++) {
2979 ✗ int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 19;
2980 ✗ int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
2981 ✗ int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
2982 ✗ int A = 255;
2983
2984 ✗ if (Y & 0x100)
2985 ✗ Y = av_clip_uint8(Y);
2986 ✗ if (U & 0x100)
2987 ✗ U = av_clip_uint8(U);
2988 ✗ if (V & 0x100)
2989 ✗ V = av_clip_uint8(V);
2990
2991 ✗ if (hasAlpha) {
2992 ✗ A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 19;
2993 ✗ A = av_clip_uint8(A);
2994 }
2995
2996 ✗ output_pixels(i * 4, A, Y, U, V)
2997 }
2998 ✗ }
2999
3000 static av_always_inline void
3001 40544 yuv2ayuv_X_c_template(SwsInternal *c, const int16_t *lumFilter,
3002 const int16_t **lumSrc, int lumFilterSize,
3003 const int16_t *chrFilter, const int16_t **chrUSrc,
3004 const int16_t **chrVSrc, int chrFilterSize,
3005 const int16_t **alpSrc, uint8_t *dest, int dstW,
3006 int y, enum AVPixelFormat target)
3007 {
3008 int i;
3009
3010
2/2
✓ Branch 0 taken 14149888 times.
✓ Branch 1 taken 40544 times.
14190432 for (i = 0; i < dstW; i++) {
3011 int j;
3012 14149888 int Y = 1 << 18, U = 1 << 18;
3013 14149888 int V = 1 << 18, A = 255;
3014
3015
2/2
✓ Branch 0 taken 15909888 times.
✓ Branch 1 taken 14149888 times.
30059776 for (j = 0; j < lumFilterSize; j++)
3016 15909888 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
3017
3018
2/2
✓ Branch 0 taken 57879552 times.
✓ Branch 1 taken 14149888 times.
72029440 for (j = 0; j < chrFilterSize; j++)
3019 57879552 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
3020
3021
2/2
✓ Branch 0 taken 57879552 times.
✓ Branch 1 taken 14149888 times.
72029440 for (j = 0; j < chrFilterSize; j++)
3022 57879552 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
3023
3024 14149888 Y >>= 19;
3025 14149888 U >>= 19;
3026 14149888 V >>= 19;
3027
3028
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14149888 times.
14149888 if (Y & 0x100)
3029 ✗ Y = av_clip_uint8(Y);
3030
2/2
✓ Branch 0 taken 560 times.
✓ Branch 1 taken 14149328 times.
14149888 if (U & 0x100)
3031 560 U = av_clip_uint8(U);
3032
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 14149880 times.
14149888 if (V & 0x100)
3033 8 V = av_clip_uint8(V);
3034
3035
2/2
✓ Branch 0 taken 120000 times.
✓ Branch 1 taken 14029888 times.
14149888 if (alpSrc) {
3036 120000 A = 1 << 18;
3037
3038
2/2
✓ Branch 0 taken 1440000 times.
✓ Branch 1 taken 120000 times.
1560000 for (j = 0; j < lumFilterSize; j++)
3039 1440000 A += alpSrc[j][i] * (unsigned)lumFilter[j];
3040
3041 120000 A >>= 19;
3042
3043
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 120000 times.
120000 if (A & 0x100)
3044 ✗ A = av_clip_uint8(A);
3045 }
3046
3047
4/4
✓ Branch 0 taken 3486784 times.
✓ Branch 1 taken 10663104 times.
✓ Branch 2 taken 3486784 times.
✓ Branch 3 taken 7176320 times.
14149888 output_pixels(i * 4, A, Y, U, V)
3048 }
3049 40544 }
3050
3051 #undef output_pixels
3052
3053 #define AYUVPACKEDWRAPPER(name, fmt) \
3054 static void yuv2 ## name ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
3055 const int16_t **lumSrc, int lumFilterSize, \
3056 const int16_t *chrFilter, const int16_t **chrUSrc, \
3057 const int16_t **chrVSrc, int chrFilterSize, \
3058 const int16_t **alpSrc, uint8_t *dest, int dstW, \
3059 int y) \
3060 { \
3061 yuv2ayuv_X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
3062 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
3063 alpSrc, dest, dstW, y, fmt); \
3064 } \
3065 \
3066 static void yuv2 ## name ## _2_c(SwsInternal *c, const int16_t *buf[2], \
3067 const int16_t *ubuf[2], const int16_t *vbuf[2], \
3068 const int16_t *abuf[2], uint8_t *dest, int dstW, \
3069 int yalpha, int uvalpha, int y) \
3070 { \
3071 yuv2ayuv_2_c_template(c, buf, ubuf, vbuf, abuf, \
3072 dest, dstW, yalpha, uvalpha, y, fmt); \
3073 } \
3074 \
3075 static void yuv2 ## name ## _1_c(SwsInternal *c, const int16_t *buf0, \
3076 const int16_t *ubuf[2], const int16_t *vbuf[2], \
3077 const int16_t *abuf0, uint8_t *dest, int dstW, \
3078 int uvalpha, int y) \
3079 { \
3080 yuv2ayuv_1_c_template(c, buf0, ubuf, vbuf, \
3081 abuf0, dest, dstW, uvalpha, \
3082 y, fmt); \
3083 }
3084
3085 208160 AYUVPACKEDWRAPPER(vuyX, AV_PIX_FMT_VUYX)
3086 21136 AYUVPACKEDWRAPPER(ayuv, AV_PIX_FMT_AYUV)
3087 110936 AYUVPACKEDWRAPPER(uyva, AV_PIX_FMT_UYVA)
3088
3089 #define output_pixel(pos, val, bits) \
3090 AV_WL16(pos, av_clip_uintp2(val >> shift, bits) << output_shift);
3091
3092 #define yuv2y2xx_wrapper(bits) \
3093 static void \
3094 yuv2y2 ## bits ## le_X_c(SwsInternal *c, const int16_t *lumFilter, \
3095 const int16_t **lumSrc, int lumFilterSize, \
3096 const int16_t *chrFilter, \
3097 const int16_t **chrUSrc, \
3098 const int16_t **chrVSrc, int chrFilterSize, \
3099 const int16_t **alpSrc, \
3100 uint8_t *dest, int dstW, int y) \
3101 { \
3102 int i, j; \
3103 int shift = 11 + 16 - bits; \
3104 int output_shift = 16 - bits; \
3105 for (i = 0; i < ((dstW + 1) >> 1); i++) { \
3106 int Y1 = 1 << (shift - 1), Y2 = 1 << (shift - 1); \
3107 int U = 1 << (shift - 1), V = 1 << (shift - 1); \
3108 \
3109 for (j = 0; j < lumFilterSize; j++) { \
3110 Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j]; \
3111 Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j]; \
3112 } \
3113 \
3114 for (j = 0; j < chrFilterSize; j++) { \
3115 U += chrUSrc[j][i] * (unsigned)chrFilter[j]; \
3116 V += chrVSrc[j][i] * (unsigned)chrFilter[j]; \
3117 } \
3118 \
3119 output_pixel(dest + 8 * i + 0, Y1, bits); \
3120 output_pixel(dest + 8 * i + 2, U, bits); \
3121 output_pixel(dest + 8 * i + 4, Y2, bits); \
3122 output_pixel(dest + 8 * i + 6, V, bits); \
3123 } \
3124 }
3125
3126
6/6
✓ Branch 0 taken 16054656 times.
✓ Branch 1 taken 15834656 times.
✓ Branch 2 taken 20008320 times.
✓ Branch 3 taken 15834656 times.
✓ Branch 4 taken 15834656 times.
✓ Branch 5 taken 90056 times.
51987688 yuv2y2xx_wrapper(10)
3127
6/6
✓ Branch 0 taken 16054656 times.
✓ Branch 1 taken 15834656 times.
✓ Branch 2 taken 20008320 times.
✓ Branch 3 taken 15834656 times.
✓ Branch 4 taken 15834656 times.
✓ Branch 5 taken 90056 times.
51987688 yuv2y2xx_wrapper(12)
3128
3129 static void
3130 112520 yuv2y216le_X_c(SwsInternal *c, const int16_t *lumFilter,
3131 const int16_t **_lumSrc, int lumFilterSize,
3132 const int16_t *chrFilter,
3133 const int16_t **_chrUSrc,
3134 const int16_t **_chrVSrc, int chrFilterSize,
3135 const int16_t **_alpSrc,
3136 uint8_t *dest, int dstW, int y)
3137 {
3138 112520 const int32_t **lumSrc = (const int32_t **)_lumSrc;
3139 112520 const int32_t **chrUSrc = (const int32_t **)_chrUSrc;
3140 112520 const int32_t **chrVSrc = (const int32_t **)_chrVSrc;
3141 112520 int shift = 15;
3142
3143
2/2
✓ Branch 0 taken 19788320 times.
✓ Branch 1 taken 112520 times.
19900840 for (int i = 0; i < ((dstW + 1) >> 1); i++) {
3144 19788320 int Y1 = 1 << (shift - 1), Y2 = 1 << (shift - 1);
3145 19788320 int U = 1 << (shift - 1), V = 1 << (shift - 1);
3146
3147 /* See yuv2planeX_16_c_template for details. */
3148 19788320 Y1 -= 0x40000000;
3149 19788320 U -= 0x40000000;
3150 19788320 Y2 -= 0x40000000;
3151 19788320 V -= 0x40000000;
3152
3153
2/2
✓ Branch 0 taken 20008320 times.
✓ Branch 1 taken 19788320 times.
39796640 for (int j = 0; j < lumFilterSize; j++) {
3154 20008320 Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j];
3155 20008320 Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
3156 }
3157
3158
2/2
✓ Branch 0 taken 23961984 times.
✓ Branch 1 taken 19788320 times.
43750304 for (int j = 0; j < chrFilterSize; j++) {
3159 23961984 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
3160 23961984 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
3161 }
3162
3163 19788320 AV_WL16(dest + 8 * i + 0, 0x8000 + av_clip_int16(Y1 >> shift));
3164 19788320 AV_WL16(dest + 8 * i + 2, 0x8000 + av_clip_int16(U >> shift));
3165 19788320 AV_WL16(dest + 8 * i + 4, 0x8000 + av_clip_int16(Y2 >> shift));
3166 19788320 AV_WL16(dest + 8 * i + 6, 0x8000 + av_clip_int16(V >> shift));
3167 }
3168 112520 }
3169
3170 static void
3171 127844 yuv2vyu444_1_c(SwsInternal *c, const int16_t *buf0,
3172 const int16_t *ubuf[2], const int16_t *vbuf[2],
3173 const int16_t *abuf0, uint8_t *dest, int dstW,
3174 int uvalpha, int y)
3175 {
3176 int i;
3177
3178
1/2
✓ Branch 0 taken 127844 times.
✗ Branch 1 not taken.
127844 if (uvalpha < 2048) {
3179
2/2
✓ Branch 0 taken 44313032 times.
✓ Branch 1 taken 127844 times.
44440876 for (i = 0; i < dstW; i++) {
3180 44313032 int Y = (buf0[i] + 64) >> 7;
3181 44313032 int U = (ubuf[0][i] + 64) >> 7;
3182 44313032 int V = (vbuf[0][i] + 64) >> 7;
3183
3184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44313032 times.
44313032 if (Y & 0x100)
3185 ✗ Y = av_clip_uint8(Y);
3186
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44313032 times.
44313032 if (U & 0x100)
3187 ✗ U = av_clip_uint8(U);
3188
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44313032 times.
44313032 if (V & 0x100)
3189 ✗ V = av_clip_uint8(V);
3190
3191 44313032 dest[3 * i ] = V;
3192 44313032 dest[3 * i + 1] = Y;
3193 44313032 dest[3 * i + 2] = U;
3194 }
3195 } else {
3196 ✗ for (i = 0; i < dstW; i++) {
3197 ✗ int Y = (buf0[i] + 64) >> 7;
3198 ✗ int U = (ubuf[0][i] + ubuf[1][i] + 128) >> 8;
3199 ✗ int V = (vbuf[0][i] + vbuf[1][i] + 128) >> 8;
3200
3201 ✗ if (Y & 0x100)
3202 ✗ Y = av_clip_uint8(Y);
3203 ✗ if (U & 0x100)
3204 ✗ U = av_clip_uint8(U);
3205 ✗ if (V & 0x100)
3206 ✗ V = av_clip_uint8(V);
3207
3208 ✗ dest[3 * i ] = V;
3209 ✗ dest[3 * i + 1] = Y;
3210 ✗ dest[3 * i + 2] = U;
3211 }
3212 }
3213 127844 }
3214
3215 static void
3216 ✗ yuv2vyu444_2_c(SwsInternal *c, const int16_t *buf[2],
3217 const int16_t *ubuf[2], const int16_t *vbuf[2],
3218 const int16_t *abuf[2], uint8_t *dest, int dstW,
3219 int yalpha, int uvalpha, int y)
3220 {
3221 ✗ const int16_t *buf0 = buf[0], *buf1 = buf[1],
3222 ✗ *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
3223 ✗ *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
3224 ✗ int yalpha1 = 4096 - yalpha;
3225 ✗ int uvalpha1 = 4096 - uvalpha;
3226 int i;
3227
3228 av_assert2(yalpha <= 4096U);
3229 av_assert2(uvalpha <= 4096U);
3230
3231 ✗ for (i = 0; i < dstW; i++) {
3232 ✗ int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 19;
3233 ✗ int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
3234 ✗ int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
3235
3236 ✗ if (Y & 0x100)
3237 ✗ Y = av_clip_uint8(Y);
3238 ✗ if (U & 0x100)
3239 ✗ U = av_clip_uint8(U);
3240 ✗ if (V & 0x100)
3241 ✗ V = av_clip_uint8(V);
3242
3243 ✗ dest[3 * i ] = V;
3244 ✗ dest[3 * i + 1] = Y;
3245 ✗ dest[3 * i + 2] = U;
3246 }
3247 ✗ }
3248
3249 static void
3250 10568 yuv2vyu444_X_c(SwsInternal *c, const int16_t *lumFilter,
3251 const int16_t **lumSrc, int lumFilterSize,
3252 const int16_t *chrFilter, const int16_t **chrUSrc,
3253 const int16_t **chrVSrc, int chrFilterSize,
3254 const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
3255 {
3256 int i;
3257
3258
2/2
✓ Branch 0 taken 3689536 times.
✓ Branch 1 taken 10568 times.
3700104 for (i = 0; i < dstW; i++) {
3259 int j;
3260 3689536 int Y = 1 << 18, U = 1 << 18;
3261 3689536 int V = 1 << 18;
3262
3263
2/2
✓ Branch 0 taken 4129536 times.
✓ Branch 1 taken 3689536 times.
7819072 for (j = 0; j < lumFilterSize; j++)
3264 4129536 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
3265
3266
2/2
✓ Branch 0 taken 15078144 times.
✓ Branch 1 taken 3689536 times.
18767680 for (j = 0; j < chrFilterSize; j++)
3267 15078144 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
3268
3269
2/2
✓ Branch 0 taken 15078144 times.
✓ Branch 1 taken 3689536 times.
18767680 for (j = 0; j < chrFilterSize; j++)
3270 15078144 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
3271
3272 3689536 Y >>= 19;
3273 3689536 U >>= 19;
3274 3689536 V >>= 19;
3275
3276
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3689536 times.
3689536 if (Y & 0x100)
3277 ✗ Y = av_clip_uint8(Y);
3278
2/2
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 3689390 times.
3689536 if (U & 0x100)
3279 146 U = av_clip_uint8(U);
3280
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3689534 times.
3689536 if (V & 0x100)
3281 2 V = av_clip_uint8(V);
3282
3283 3689536 dest[3 * i ] = V;
3284 3689536 dest[3 * i + 1] = Y;
3285 3689536 dest[3 * i + 2] = U;
3286 }
3287 10568 }
3288
3289 #undef output_pixel
3290
3291 415458 av_cold void ff_sws_init_output_funcs(SwsInternal *c,
3292 yuv2planar1_fn *yuv2plane1,
3293 yuv2planarX_fn *yuv2planeX,
3294 yuv2interleavedX_fn *yuv2nv12cX,
3295 yuv2packed1_fn *yuv2packed1,
3296 yuv2packed2_fn *yuv2packed2,
3297 yuv2packedX_fn *yuv2packedX,
3298 yuv2anyX_fn *yuv2anyX)
3299 {
3300 415458 enum AVPixelFormat dstFormat = c->opts.dst_format;
3301 415458 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(dstFormat);
3302
3303
4/4
✓ Branch 1 taken 33126 times.
✓ Branch 2 taken 382332 times.
✓ Branch 4 taken 19238 times.
✓ Branch 5 taken 13888 times.
415458 if (isSemiPlanarYUV(dstFormat) && isDataInHighBits(dstFormat)) {
3304
2/2
✓ Branch 0 taken 9581 times.
✓ Branch 1 taken 9657 times.
19238 if (desc->comp[0].depth == 10) {
3305
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7488 times.
9581 *yuv2plane1 = isBE(dstFormat) ? yuv2p010l1_BE_c : yuv2p010l1_LE_c;
3306
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7488 times.
9581 *yuv2planeX = isBE(dstFormat) ? yuv2p010lX_BE_c : yuv2p010lX_LE_c;
3307
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7488 times.
9581 *yuv2nv12cX = isBE(dstFormat) ? yuv2p010cX_BE_c : yuv2p010cX_LE_c;
3308
1/2
✓ Branch 0 taken 9657 times.
✗ Branch 1 not taken.
9657 } else if (desc->comp[0].depth == 12) {
3309
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7564 times.
9657 *yuv2plane1 = isBE(dstFormat) ? yuv2p012l1_BE_c : yuv2p012l1_LE_c;
3310
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7564 times.
9657 *yuv2planeX = isBE(dstFormat) ? yuv2p012lX_BE_c : yuv2p012lX_LE_c;
3311
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7564 times.
9657 *yuv2nv12cX = isBE(dstFormat) ? yuv2p012cX_BE_c : yuv2p012cX_LE_c;
3312 } else
3313 ✗ av_assert0(0);
3314
4/4
✓ Branch 1 taken 13888 times.
✓ Branch 2 taken 382332 times.
✓ Branch 4 taken 157 times.
✓ Branch 5 taken 13731 times.
396220 } else if (isSemiPlanarYUV(dstFormat) && isNBPS(dstFormat)) {
3315
1/2
✓ Branch 0 taken 157 times.
✗ Branch 1 not taken.
157 if (desc->comp[0].depth == 10) {
3316
2/2
✓ Branch 1 taken 76 times.
✓ Branch 2 taken 81 times.
157 *yuv2plane1 = isBE(dstFormat) ? yuv2nv20l1_BE_c : yuv2nv20l1_LE_c;
3317
2/2
✓ Branch 1 taken 76 times.
✓ Branch 2 taken 81 times.
157 *yuv2planeX = isBE(dstFormat) ? yuv2nv20lX_BE_c : yuv2nv20lX_LE_c;
3318
2/2
✓ Branch 1 taken 76 times.
✓ Branch 2 taken 81 times.
157 *yuv2nv12cX = isBE(dstFormat) ? yuv2nv20cX_BE_c : yuv2nv20cX_LE_c;
3319 } else
3320 ✗ av_assert0(0);
3321
2/2
✓ Branch 1 taken 36751 times.
✓ Branch 2 taken 359312 times.
396063 } else if (is16BPS(dstFormat)) {
3322
2/2
✓ Branch 1 taken 10015 times.
✓ Branch 2 taken 26736 times.
36751 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_16BE_c : yuv2planeX_16LE_c;
3323
2/2
✓ Branch 1 taken 10015 times.
✓ Branch 2 taken 26736 times.
36751 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_16BE_c : yuv2plane1_16LE_c;
3324
2/2
✓ Branch 1 taken 6233 times.
✓ Branch 2 taken 30518 times.
36751 if (isSemiPlanarYUV(dstFormat)) {
3325
2/2
✓ Branch 1 taken 2589 times.
✓ Branch 2 taken 3644 times.
6233 *yuv2nv12cX = isBE(dstFormat) ? yuv2nv12cX_16BE_c : yuv2nv12cX_16LE_c;
3326 }
3327
3/4
✓ Branch 1 taken 5794 times.
✓ Branch 2 taken 353518 times.
✓ Branch 4 taken 5794 times.
✗ Branch 5 not taken.
359312 } else if (isDataInHighBits(dstFormat) && isNBPS(dstFormat)) {
3328
2/2
✓ Branch 0 taken 2116 times.
✓ Branch 1 taken 3678 times.
5794 if (desc->comp[0].depth == 10) {
3329
2/2
✓ Branch 1 taken 676 times.
✓ Branch 2 taken 1440 times.
2116 *yuv2planeX = isBE(dstFormat) ? yuv2msbplaneX_10BE_c : yuv2msbplaneX_10LE_c;
3330
2/2
✓ Branch 1 taken 676 times.
✓ Branch 2 taken 1440 times.
2116 *yuv2plane1 = isBE(dstFormat) ? yuv2msbplane1_10BE_c : yuv2msbplane1_10LE_c;
3331
1/2
✓ Branch 0 taken 3678 times.
✗ Branch 1 not taken.
3678 } else if (desc->comp[0].depth == 12) {
3332
2/2
✓ Branch 1 taken 1457 times.
✓ Branch 2 taken 2221 times.
3678 *yuv2planeX = isBE(dstFormat) ? yuv2msbplaneX_12BE_c : yuv2msbplaneX_12LE_c;
3333
2/2
✓ Branch 1 taken 1457 times.
✓ Branch 2 taken 2221 times.
3678 *yuv2plane1 = isBE(dstFormat) ? yuv2msbplane1_12BE_c : yuv2msbplane1_12LE_c;
3334 } else
3335 ✗ av_assert0(0);
3336
2/2
✓ Branch 1 taken 56820 times.
✓ Branch 2 taken 296698 times.
353518 } else if (isNBPS(dstFormat)) {
3337
2/2
✓ Branch 0 taken 1934 times.
✓ Branch 1 taken 54886 times.
56820 if (desc->comp[0].depth == 9) {
3338
2/2
✓ Branch 1 taken 906 times.
✓ Branch 2 taken 1028 times.
1934 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_9BE_c : yuv2planeX_9LE_c;
3339
2/2
✓ Branch 1 taken 906 times.
✓ Branch 2 taken 1028 times.
1934 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_9BE_c : yuv2plane1_9LE_c;
3340
2/2
✓ Branch 0 taken 31264 times.
✓ Branch 1 taken 23622 times.
54886 } else if (desc->comp[0].depth == 10) {
3341
2/2
✓ Branch 1 taken 5199 times.
✓ Branch 2 taken 26065 times.
31264 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_10BE_c : yuv2planeX_10LE_c;
3342
2/2
✓ Branch 1 taken 5199 times.
✓ Branch 2 taken 26065 times.
31264 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_10BE_c : yuv2plane1_10LE_c;
3343
2/2
✓ Branch 0 taken 21849 times.
✓ Branch 1 taken 1773 times.
23622 } else if (desc->comp[0].depth == 12) {
3344
2/2
✓ Branch 1 taken 5194 times.
✓ Branch 2 taken 16655 times.
21849 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_12BE_c : yuv2planeX_12LE_c;
3345
2/2
✓ Branch 1 taken 5194 times.
✓ Branch 2 taken 16655 times.
21849 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_12BE_c : yuv2plane1_12LE_c;
3346
1/2
✓ Branch 0 taken 1773 times.
✗ Branch 1 not taken.
1773 } else if (desc->comp[0].depth == 14) {
3347
2/2
✓ Branch 1 taken 833 times.
✓ Branch 2 taken 940 times.
1773 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_14BE_c : yuv2planeX_14LE_c;
3348
2/2
✓ Branch 1 taken 833 times.
✓ Branch 2 taken 940 times.
1773 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_14BE_c : yuv2plane1_14LE_c;
3349 } else
3350 ✗ av_assert0(0);
3351
2/2
✓ Branch 0 taken 110 times.
✓ Branch 1 taken 296588 times.
296698 } else if (dstFormat == AV_PIX_FMT_GRAYF32BE) {
3352 110 *yuv2planeX = yuv2planeX_floatBE_c;
3353 110 *yuv2plane1 = yuv2plane1_floatBE_c;
3354
2/2
✓ Branch 0 taken 248 times.
✓ Branch 1 taken 296340 times.
296588 } else if (dstFormat == AV_PIX_FMT_GRAYF32LE) {
3355 248 *yuv2planeX = yuv2planeX_floatLE_c;
3356 248 *yuv2plane1 = yuv2plane1_floatLE_c;
3357 } else {
3358 296340 *yuv2plane1 = yuv2plane1_8_c;
3359 296340 *yuv2planeX = yuv2planeX_8_c;
3360
2/2
✓ Branch 1 taken 7498 times.
✓ Branch 2 taken 288842 times.
296340 if (isSemiPlanarYUV(dstFormat))
3361 7498 *yuv2nv12cX = yuv2nv12cX_c;
3362 }
3363
3364
2/2
✓ Branch 0 taken 366707 times.
✓ Branch 1 taken 48751 times.
415458 if(c->opts.flags & SWS_FULL_CHR_H_INT) {
3365
24/25
✓ Branch 0 taken 52 times.
✓ Branch 1 taken 52 times.
✓ Branch 2 taken 1680 times.
✓ Branch 3 taken 52 times.
✓ Branch 4 taken 26 times.
✓ Branch 5 taken 23 times.
✓ Branch 6 taken 26 times.
✓ Branch 7 taken 23 times.
✓ Branch 8 taken 3964 times.
✓ Branch 9 taken 1398 times.
✓ Branch 10 taken 3689 times.
✓ Branch 11 taken 26 times.
✓ Branch 12 taken 28 times.
✓ Branch 13 taken 23 times.
✓ Branch 14 taken 370 times.
✓ Branch 15 taken 370 times.
✓ Branch 16 taken 722 times.
✓ Branch 17 taken 421 times.
✓ Branch 18 taken 581 times.
✓ Branch 19 taken 581 times.
✓ Branch 20 taken 27241 times.
✓ Branch 21 taken 412 times.
✓ Branch 22 taken 4454 times.
✓ Branch 23 taken 2537 times.
✗ Branch 24 not taken.
48751 switch (dstFormat) {
3366 52 case AV_PIX_FMT_RGBA:
3367 #if CONFIG_SMALL
3368 *yuv2packedX = yuv2rgba32_full_X_c;
3369 *yuv2packed2 = yuv2rgba32_full_2_c;
3370 *yuv2packed1 = yuv2rgba32_full_1_c;
3371 #else
3372 #if CONFIG_SWSCALE_ALPHA
3373
2/2
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 6 times.
52 if (c->needAlpha) {
3374 46 *yuv2packedX = yuv2rgba32_full_X_c;
3375 46 *yuv2packed2 = yuv2rgba32_full_2_c;
3376 46 *yuv2packed1 = yuv2rgba32_full_1_c;
3377 } else
3378 #endif /* CONFIG_SWSCALE_ALPHA */
3379 {
3380 6 *yuv2packedX = yuv2rgbx32_full_X_c;
3381 6 *yuv2packed2 = yuv2rgbx32_full_2_c;
3382 6 *yuv2packed1 = yuv2rgbx32_full_1_c;
3383 }
3384 #endif /* !CONFIG_SMALL */
3385 52 break;
3386 52 case AV_PIX_FMT_ARGB:
3387 #if CONFIG_SMALL
3388 *yuv2packedX = yuv2argb32_full_X_c;
3389 *yuv2packed2 = yuv2argb32_full_2_c;
3390 *yuv2packed1 = yuv2argb32_full_1_c;
3391 #else
3392 #if CONFIG_SWSCALE_ALPHA
3393
2/2
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 6 times.
52 if (c->needAlpha) {
3394 46 *yuv2packedX = yuv2argb32_full_X_c;
3395 46 *yuv2packed2 = yuv2argb32_full_2_c;
3396 46 *yuv2packed1 = yuv2argb32_full_1_c;
3397 } else
3398 #endif /* CONFIG_SWSCALE_ALPHA */
3399 {
3400 6 *yuv2packedX = yuv2xrgb32_full_X_c;
3401 6 *yuv2packed2 = yuv2xrgb32_full_2_c;
3402 6 *yuv2packed1 = yuv2xrgb32_full_1_c;
3403 }
3404 #endif /* !CONFIG_SMALL */
3405 52 break;
3406 1680 case AV_PIX_FMT_BGRA:
3407 #if CONFIG_SMALL
3408 *yuv2packedX = yuv2bgra32_full_X_c;
3409 *yuv2packed2 = yuv2bgra32_full_2_c;
3410 *yuv2packed1 = yuv2bgra32_full_1_c;
3411 #else
3412 #if CONFIG_SWSCALE_ALPHA
3413
2/2
✓ Branch 0 taken 142 times.
✓ Branch 1 taken 1538 times.
1680 if (c->needAlpha) {
3414 142 *yuv2packedX = yuv2bgra32_full_X_c;
3415 142 *yuv2packed2 = yuv2bgra32_full_2_c;
3416 142 *yuv2packed1 = yuv2bgra32_full_1_c;
3417 } else
3418 #endif /* CONFIG_SWSCALE_ALPHA */
3419 {
3420 1538 *yuv2packedX = yuv2bgrx32_full_X_c;
3421 1538 *yuv2packed2 = yuv2bgrx32_full_2_c;
3422 1538 *yuv2packed1 = yuv2bgrx32_full_1_c;
3423 }
3424 #endif /* !CONFIG_SMALL */
3425 1680 break;
3426 52 case AV_PIX_FMT_ABGR:
3427 #if CONFIG_SMALL
3428 *yuv2packedX = yuv2abgr32_full_X_c;
3429 *yuv2packed2 = yuv2abgr32_full_2_c;
3430 *yuv2packed1 = yuv2abgr32_full_1_c;
3431 #else
3432 #if CONFIG_SWSCALE_ALPHA
3433
2/2
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 6 times.
52 if (c->needAlpha) {
3434 46 *yuv2packedX = yuv2abgr32_full_X_c;
3435 46 *yuv2packed2 = yuv2abgr32_full_2_c;
3436 46 *yuv2packed1 = yuv2abgr32_full_1_c;
3437 } else
3438 #endif /* CONFIG_SWSCALE_ALPHA */
3439 {
3440 6 *yuv2packedX = yuv2xbgr32_full_X_c;
3441 6 *yuv2packed2 = yuv2xbgr32_full_2_c;
3442 6 *yuv2packed1 = yuv2xbgr32_full_1_c;
3443 }
3444 #endif /* !CONFIG_SMALL */
3445 52 break;
3446 26 case AV_PIX_FMT_RGBA64LE:
3447 #if CONFIG_SWSCALE_ALPHA
3448
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 3 times.
26 if (c->needAlpha) {
3449 23 *yuv2packedX = yuv2rgba64le_full_X_c;
3450 23 *yuv2packed2 = yuv2rgba64le_full_2_c;
3451 23 *yuv2packed1 = yuv2rgba64le_full_1_c;
3452 } else
3453 #endif /* CONFIG_SWSCALE_ALPHA */
3454 {
3455 3 *yuv2packedX = yuv2rgbx64le_full_X_c;
3456 3 *yuv2packed2 = yuv2rgbx64le_full_2_c;
3457 3 *yuv2packed1 = yuv2rgbx64le_full_1_c;
3458 }
3459 26 break;
3460 23 case AV_PIX_FMT_RGBA64BE:
3461 #if CONFIG_SWSCALE_ALPHA
3462
1/2
✓ Branch 0 taken 23 times.
✗ Branch 1 not taken.
23 if (c->needAlpha) {
3463 23 *yuv2packedX = yuv2rgba64be_full_X_c;
3464 23 *yuv2packed2 = yuv2rgba64be_full_2_c;
3465 23 *yuv2packed1 = yuv2rgba64be_full_1_c;
3466 } else
3467 #endif /* CONFIG_SWSCALE_ALPHA */
3468 {
3469 ✗ *yuv2packedX = yuv2rgbx64be_full_X_c;
3470 ✗ *yuv2packed2 = yuv2rgbx64be_full_2_c;
3471 ✗ *yuv2packed1 = yuv2rgbx64be_full_1_c;
3472 }
3473 23 break;
3474 26 case AV_PIX_FMT_BGRA64LE:
3475 #if CONFIG_SWSCALE_ALPHA
3476
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 3 times.
26 if (c->needAlpha) {
3477 23 *yuv2packedX = yuv2bgra64le_full_X_c;
3478 23 *yuv2packed2 = yuv2bgra64le_full_2_c;
3479 23 *yuv2packed1 = yuv2bgra64le_full_1_c;
3480 } else
3481 #endif /* CONFIG_SWSCALE_ALPHA */
3482 {
3483 3 *yuv2packedX = yuv2bgrx64le_full_X_c;
3484 3 *yuv2packed2 = yuv2bgrx64le_full_2_c;
3485 3 *yuv2packed1 = yuv2bgrx64le_full_1_c;
3486 }
3487 26 break;
3488 23 case AV_PIX_FMT_BGRA64BE:
3489 #if CONFIG_SWSCALE_ALPHA
3490
1/2
✓ Branch 0 taken 23 times.
✗ Branch 1 not taken.
23 if (c->needAlpha) {
3491 23 *yuv2packedX = yuv2bgra64be_full_X_c;
3492 23 *yuv2packed2 = yuv2bgra64be_full_2_c;
3493 23 *yuv2packed1 = yuv2bgra64be_full_1_c;
3494 } else
3495 #endif /* CONFIG_SWSCALE_ALPHA */
3496 {
3497 ✗ *yuv2packedX = yuv2bgrx64be_full_X_c;
3498 ✗ *yuv2packed2 = yuv2bgrx64be_full_2_c;
3499 ✗ *yuv2packed1 = yuv2bgrx64be_full_1_c;
3500 }
3501 23 break;
3502
3503 3964 case AV_PIX_FMT_RGB24:
3504 3964 *yuv2packedX = yuv2rgb24_full_X_c;
3505 3964 *yuv2packed2 = yuv2rgb24_full_2_c;
3506 3964 *yuv2packed1 = yuv2rgb24_full_1_c;
3507 3964 break;
3508 1398 case AV_PIX_FMT_BGR24:
3509 1398 *yuv2packedX = yuv2bgr24_full_X_c;
3510 1398 *yuv2packed2 = yuv2bgr24_full_2_c;
3511 1398 *yuv2packed1 = yuv2bgr24_full_1_c;
3512 1398 break;
3513 3689 case AV_PIX_FMT_RGB48LE:
3514 3689 *yuv2packedX = yuv2rgb48le_full_X_c;
3515 3689 *yuv2packed2 = yuv2rgb48le_full_2_c;
3516 3689 *yuv2packed1 = yuv2rgb48le_full_1_c;
3517 3689 break;
3518 26 case AV_PIX_FMT_BGR48LE:
3519 26 *yuv2packedX = yuv2bgr48le_full_X_c;
3520 26 *yuv2packed2 = yuv2bgr48le_full_2_c;
3521 26 *yuv2packed1 = yuv2bgr48le_full_1_c;
3522 26 break;
3523 28 case AV_PIX_FMT_RGB48BE:
3524 28 *yuv2packedX = yuv2rgb48be_full_X_c;
3525 28 *yuv2packed2 = yuv2rgb48be_full_2_c;
3526 28 *yuv2packed1 = yuv2rgb48be_full_1_c;
3527 28 break;
3528 23 case AV_PIX_FMT_BGR48BE:
3529 23 *yuv2packedX = yuv2bgr48be_full_X_c;
3530 23 *yuv2packed2 = yuv2bgr48be_full_2_c;
3531 23 *yuv2packed1 = yuv2bgr48be_full_1_c;
3532 23 break;
3533 370 case AV_PIX_FMT_BGR4_BYTE:
3534 370 *yuv2packedX = yuv2bgr4_byte_full_X_c;
3535 370 *yuv2packed2 = yuv2bgr4_byte_full_2_c;
3536 370 *yuv2packed1 = yuv2bgr4_byte_full_1_c;
3537 370 break;
3538 370 case AV_PIX_FMT_RGB4_BYTE:
3539 370 *yuv2packedX = yuv2rgb4_byte_full_X_c;
3540 370 *yuv2packed2 = yuv2rgb4_byte_full_2_c;
3541 370 *yuv2packed1 = yuv2rgb4_byte_full_1_c;
3542 370 break;
3543 722 case AV_PIX_FMT_BGR8:
3544 722 *yuv2packedX = yuv2bgr8_full_X_c;
3545 722 *yuv2packed2 = yuv2bgr8_full_2_c;
3546 722 *yuv2packed1 = yuv2bgr8_full_1_c;
3547 722 break;
3548 421 case AV_PIX_FMT_RGB8:
3549 421 *yuv2packedX = yuv2rgb8_full_X_c;
3550 421 *yuv2packed2 = yuv2rgb8_full_2_c;
3551 421 *yuv2packed1 = yuv2rgb8_full_1_c;
3552 421 break;
3553 581 case AV_PIX_FMT_X2RGB10LE:
3554 581 *yuv2packedX = yuv2x2rgb10_full_X_c;
3555 581 *yuv2packed2 = yuv2x2rgb10_full_2_c;
3556 581 *yuv2packed1 = yuv2x2rgb10_full_1_c;
3557 581 break;
3558 581 case AV_PIX_FMT_X2BGR10LE:
3559 581 *yuv2packedX = yuv2x2bgr10_full_X_c;
3560 581 *yuv2packed2 = yuv2x2bgr10_full_2_c;
3561 581 *yuv2packed1 = yuv2x2bgr10_full_1_c;
3562 581 break;
3563 27241 case AV_PIX_FMT_GBRP:
3564 case AV_PIX_FMT_GBRP9BE:
3565 case AV_PIX_FMT_GBRP9LE:
3566 case AV_PIX_FMT_GBRP10BE:
3567 case AV_PIX_FMT_GBRP10LE:
3568 case AV_PIX_FMT_GBRP12BE:
3569 case AV_PIX_FMT_GBRP12LE:
3570 case AV_PIX_FMT_GBRP14BE:
3571 case AV_PIX_FMT_GBRP14LE:
3572 case AV_PIX_FMT_GBRAP:
3573 case AV_PIX_FMT_GBRAP10BE:
3574 case AV_PIX_FMT_GBRAP10LE:
3575 case AV_PIX_FMT_GBRAP12BE:
3576 case AV_PIX_FMT_GBRAP12LE:
3577 case AV_PIX_FMT_GBRAP14BE:
3578 case AV_PIX_FMT_GBRAP14LE:
3579 27241 *yuv2anyX = yuv2gbrp_full_X_c;
3580 27241 break;
3581 412 case AV_PIX_FMT_GBRP10MSBBE:
3582 case AV_PIX_FMT_GBRP10MSBLE:
3583 case AV_PIX_FMT_GBRP12MSBBE:
3584 case AV_PIX_FMT_GBRP12MSBLE:
3585 412 *yuv2anyX = yuv2gbrpmsb_full_X_c;
3586 412 break;
3587 4454 case AV_PIX_FMT_GBRP16BE:
3588 case AV_PIX_FMT_GBRP16LE:
3589 case AV_PIX_FMT_GBRAP16BE:
3590 case AV_PIX_FMT_GBRAP16LE:
3591 4454 *yuv2anyX = yuv2gbrp16_full_X_c;
3592 4454 break;
3593 2537 case AV_PIX_FMT_GBRPF32BE:
3594 case AV_PIX_FMT_GBRPF32LE:
3595 case AV_PIX_FMT_GBRAPF32BE:
3596 case AV_PIX_FMT_GBRAPF32LE:
3597 2537 *yuv2anyX = yuv2gbrpf32_full_X_c;
3598 2537 break;
3599 }
3600
3/4
✓ Branch 0 taken 34644 times.
✓ Branch 1 taken 14107 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 34644 times.
48751 if (!*yuv2packedX && !*yuv2anyX)
3601 ✗ goto YUV_PACKED;
3602 } else {
3603 366707 YUV_PACKED:
3604
21/21
✓ Branch 0 taken 170 times.
✓ Branch 1 taken 118 times.
✓ Branch 2 taken 118 times.
✓ Branch 3 taken 118 times.
✓ Branch 4 taken 3550 times.
✓ Branch 5 taken 252 times.
✓ Branch 6 taken 123 times.
✓ Branch 7 taken 118 times.
✓ Branch 8 taken 1718 times.
✓ Branch 9 taken 794 times.
✓ Branch 10 taken 6587 times.
✓ Branch 11 taken 1571 times.
✓ Branch 12 taken 2152 times.
✓ Branch 13 taken 3263 times.
✓ Branch 14 taken 564 times.
✓ Branch 15 taken 1161 times.
✓ Branch 16 taken 120 times.
✓ Branch 17 taken 265 times.
✓ Branch 18 taken 76 times.
✓ Branch 19 taken 76 times.
✓ Branch 20 taken 343793 times.
366707 switch (dstFormat) {
3605 170 case AV_PIX_FMT_RGBA64LE:
3606 #if CONFIG_SWSCALE_ALPHA
3607
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 170 times.
170 if (c->needAlpha) {
3608 ✗ *yuv2packed1 = yuv2rgba64le_1_c;
3609 ✗ *yuv2packed2 = yuv2rgba64le_2_c;
3610 ✗ *yuv2packedX = yuv2rgba64le_X_c;
3611 } else
3612 #endif /* CONFIG_SWSCALE_ALPHA */
3613 {
3614 170 *yuv2packed1 = yuv2rgbx64le_1_c;
3615 170 *yuv2packed2 = yuv2rgbx64le_2_c;
3616 170 *yuv2packedX = yuv2rgbx64le_X_c;
3617 }
3618 170 break;
3619 118 case AV_PIX_FMT_RGBA64BE:
3620 #if CONFIG_SWSCALE_ALPHA
3621
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 118 times.
118 if (c->needAlpha) {
3622 ✗ *yuv2packed1 = yuv2rgba64be_1_c;
3623 ✗ *yuv2packed2 = yuv2rgba64be_2_c;
3624 ✗ *yuv2packedX = yuv2rgba64be_X_c;
3625 } else
3626 #endif /* CONFIG_SWSCALE_ALPHA */
3627 {
3628 118 *yuv2packed1 = yuv2rgbx64be_1_c;
3629 118 *yuv2packed2 = yuv2rgbx64be_2_c;
3630 118 *yuv2packedX = yuv2rgbx64be_X_c;
3631 }
3632 118 break;
3633 118 case AV_PIX_FMT_BGRA64LE:
3634 #if CONFIG_SWSCALE_ALPHA
3635
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 118 times.
118 if (c->needAlpha) {
3636 ✗ *yuv2packed1 = yuv2bgra64le_1_c;
3637 ✗ *yuv2packed2 = yuv2bgra64le_2_c;
3638 ✗ *yuv2packedX = yuv2bgra64le_X_c;
3639 } else
3640 #endif /* CONFIG_SWSCALE_ALPHA */
3641 {
3642 118 *yuv2packed1 = yuv2bgrx64le_1_c;
3643 118 *yuv2packed2 = yuv2bgrx64le_2_c;
3644 118 *yuv2packedX = yuv2bgrx64le_X_c;
3645 }
3646 118 break;
3647 118 case AV_PIX_FMT_BGRA64BE:
3648 #if CONFIG_SWSCALE_ALPHA
3649
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 118 times.
118 if (c->needAlpha) {
3650 ✗ *yuv2packed1 = yuv2bgra64be_1_c;
3651 ✗ *yuv2packed2 = yuv2bgra64be_2_c;
3652 ✗ *yuv2packedX = yuv2bgra64be_X_c;
3653 } else
3654 #endif /* CONFIG_SWSCALE_ALPHA */
3655 {
3656 118 *yuv2packed1 = yuv2bgrx64be_1_c;
3657 118 *yuv2packed2 = yuv2bgrx64be_2_c;
3658 118 *yuv2packedX = yuv2bgrx64be_X_c;
3659 }
3660 118 break;
3661 3550 case AV_PIX_FMT_RGB48LE:
3662 3550 *yuv2packed1 = yuv2rgb48le_1_c;
3663 3550 *yuv2packed2 = yuv2rgb48le_2_c;
3664 3550 *yuv2packedX = yuv2rgb48le_X_c;
3665 3550 break;
3666 252 case AV_PIX_FMT_RGB48BE:
3667 252 *yuv2packed1 = yuv2rgb48be_1_c;
3668 252 *yuv2packed2 = yuv2rgb48be_2_c;
3669 252 *yuv2packedX = yuv2rgb48be_X_c;
3670 252 break;
3671 123 case AV_PIX_FMT_BGR48LE:
3672 123 *yuv2packed1 = yuv2bgr48le_1_c;
3673 123 *yuv2packed2 = yuv2bgr48le_2_c;
3674 123 *yuv2packedX = yuv2bgr48le_X_c;
3675 123 break;
3676 118 case AV_PIX_FMT_BGR48BE:
3677 118 *yuv2packed1 = yuv2bgr48be_1_c;
3678 118 *yuv2packed2 = yuv2bgr48be_2_c;
3679 118 *yuv2packedX = yuv2bgr48be_X_c;
3680 118 break;
3681 1718 case AV_PIX_FMT_RGB32:
3682 case AV_PIX_FMT_BGR32:
3683 #if CONFIG_SMALL
3684 *yuv2packed1 = yuv2rgb32_1_c;
3685 *yuv2packed2 = yuv2rgb32_2_c;
3686 *yuv2packedX = yuv2rgb32_X_c;
3687 #else
3688 #if CONFIG_SWSCALE_ALPHA
3689
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1718 times.
1718 if (c->needAlpha) {
3690 ✗ *yuv2packed1 = yuv2rgba32_1_c;
3691 ✗ *yuv2packed2 = yuv2rgba32_2_c;
3692 ✗ *yuv2packedX = yuv2rgba32_X_c;
3693 } else
3694 #endif /* CONFIG_SWSCALE_ALPHA */
3695 {
3696 1718 *yuv2packed1 = yuv2rgbx32_1_c;
3697 1718 *yuv2packed2 = yuv2rgbx32_2_c;
3698 1718 *yuv2packedX = yuv2rgbx32_X_c;
3699 }
3700 #endif /* !CONFIG_SMALL */
3701 1718 break;
3702 794 case AV_PIX_FMT_RGB32_1:
3703 case AV_PIX_FMT_BGR32_1:
3704 #if CONFIG_SMALL
3705 *yuv2packed1 = yuv2rgb32_1_1_c;
3706 *yuv2packed2 = yuv2rgb32_1_2_c;
3707 *yuv2packedX = yuv2rgb32_1_X_c;
3708 #else
3709 #if CONFIG_SWSCALE_ALPHA
3710
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 794 times.
794 if (c->needAlpha) {
3711 ✗ *yuv2packed1 = yuv2rgba32_1_1_c;
3712 ✗ *yuv2packed2 = yuv2rgba32_1_2_c;
3713 ✗ *yuv2packedX = yuv2rgba32_1_X_c;
3714 } else
3715 #endif /* CONFIG_SWSCALE_ALPHA */
3716 {
3717 794 *yuv2packed1 = yuv2rgbx32_1_1_c;
3718 794 *yuv2packed2 = yuv2rgbx32_1_2_c;
3719 794 *yuv2packedX = yuv2rgbx32_1_X_c;
3720 }
3721 #endif /* !CONFIG_SMALL */
3722 794 break;
3723 6587 case AV_PIX_FMT_RGB24:
3724 6587 *yuv2packed1 = yuv2rgb24_1_c;
3725 6587 *yuv2packed2 = yuv2rgb24_2_c;
3726 6587 *yuv2packedX = yuv2rgb24_X_c;
3727 6587 break;
3728 1571 case AV_PIX_FMT_BGR24:
3729 1571 *yuv2packed1 = yuv2bgr24_1_c;
3730 1571 *yuv2packed2 = yuv2bgr24_2_c;
3731 1571 *yuv2packedX = yuv2bgr24_X_c;
3732 1571 break;
3733 2152 case AV_PIX_FMT_RGB565LE:
3734 case AV_PIX_FMT_RGB565BE:
3735 case AV_PIX_FMT_BGR565LE:
3736 case AV_PIX_FMT_BGR565BE:
3737 2152 *yuv2packed1 = yuv2rgb16_1_c;
3738 2152 *yuv2packed2 = yuv2rgb16_2_c;
3739 2152 *yuv2packedX = yuv2rgb16_X_c;
3740 2152 break;
3741 3263 case AV_PIX_FMT_RGB555LE:
3742 case AV_PIX_FMT_RGB555BE:
3743 case AV_PIX_FMT_BGR555LE:
3744 case AV_PIX_FMT_BGR555BE:
3745 3263 *yuv2packed1 = yuv2rgb15_1_c;
3746 3263 *yuv2packed2 = yuv2rgb15_2_c;
3747 3263 *yuv2packedX = yuv2rgb15_X_c;
3748 3263 break;
3749 564 case AV_PIX_FMT_RGB444LE:
3750 case AV_PIX_FMT_RGB444BE:
3751 case AV_PIX_FMT_BGR444LE:
3752 case AV_PIX_FMT_BGR444BE:
3753 564 *yuv2packed1 = yuv2rgb12_1_c;
3754 564 *yuv2packed2 = yuv2rgb12_2_c;
3755 564 *yuv2packedX = yuv2rgb12_X_c;
3756 564 break;
3757 1161 case AV_PIX_FMT_RGB8:
3758 case AV_PIX_FMT_BGR8:
3759 1161 *yuv2packed1 = yuv2rgb8_1_c;
3760 1161 *yuv2packed2 = yuv2rgb8_2_c;
3761 1161 *yuv2packedX = yuv2rgb8_X_c;
3762 1161 break;
3763 120 case AV_PIX_FMT_RGB4:
3764 case AV_PIX_FMT_BGR4:
3765 120 *yuv2packed1 = yuv2rgb4_1_c;
3766 120 *yuv2packed2 = yuv2rgb4_2_c;
3767 120 *yuv2packedX = yuv2rgb4_X_c;
3768 120 break;
3769 265 case AV_PIX_FMT_RGB4_BYTE:
3770 case AV_PIX_FMT_BGR4_BYTE:
3771 265 *yuv2packed1 = yuv2rgb4b_1_c;
3772 265 *yuv2packed2 = yuv2rgb4b_2_c;
3773 265 *yuv2packedX = yuv2rgb4b_X_c;
3774 265 break;
3775 76 case AV_PIX_FMT_X2RGB10LE:
3776 case AV_PIX_FMT_X2RGB10BE:
3777 76 *yuv2packed1 = yuv2x2rgb10_1_c;
3778 76 *yuv2packed2 = yuv2x2rgb10_2_c;
3779 76 *yuv2packedX = yuv2x2rgb10_X_c;
3780 76 break;
3781 76 case AV_PIX_FMT_X2BGR10LE:
3782 case AV_PIX_FMT_X2BGR10BE:
3783 76 *yuv2packed1 = yuv2x2bgr10_1_c;
3784 76 *yuv2packed2 = yuv2x2bgr10_2_c;
3785 76 *yuv2packedX = yuv2x2bgr10_X_c;
3786 76 break;
3787 }
3788 }
3789
24/24
✓ Branch 0 taken 1738 times.
✓ Branch 1 taken 842 times.
✓ Branch 2 taken 816 times.
✓ Branch 3 taken 753 times.
✓ Branch 4 taken 1056 times.
✓ Branch 5 taken 1195 times.
✓ Branch 6 taken 104 times.
✓ Branch 7 taken 104 times.
✓ Branch 8 taken 99 times.
✓ Branch 9 taken 1295 times.
✓ Branch 10 taken 99 times.
✓ Branch 11 taken 99 times.
✓ Branch 12 taken 104 times.
✓ Branch 13 taken 895 times.
✓ Branch 14 taken 508 times.
✓ Branch 15 taken 781 times.
✓ Branch 16 taken 781 times.
✓ Branch 17 taken 781 times.
✓ Branch 18 taken 967 times.
✓ Branch 19 taken 967 times.
✓ Branch 20 taken 748 times.
✓ Branch 21 taken 748 times.
✓ Branch 22 taken 934 times.
✓ Branch 23 taken 399044 times.
415458 switch (dstFormat) {
3790 1738 case AV_PIX_FMT_MONOWHITE:
3791 1738 *yuv2packed1 = yuv2monowhite_1_c;
3792 1738 *yuv2packed2 = yuv2monowhite_2_c;
3793 1738 *yuv2packedX = yuv2monowhite_X_c;
3794 1738 break;
3795 842 case AV_PIX_FMT_MONOBLACK:
3796 842 *yuv2packed1 = yuv2monoblack_1_c;
3797 842 *yuv2packed2 = yuv2monoblack_2_c;
3798 842 *yuv2packedX = yuv2monoblack_X_c;
3799 842 break;
3800 816 case AV_PIX_FMT_YUYV422:
3801 816 *yuv2packed1 = yuv2yuyv422_1_c;
3802 816 *yuv2packed2 = yuv2yuyv422_2_c;
3803 816 *yuv2packedX = yuv2yuyv422_X_c;
3804 816 break;
3805 753 case AV_PIX_FMT_YVYU422:
3806 753 *yuv2packed1 = yuv2yvyu422_1_c;
3807 753 *yuv2packed2 = yuv2yvyu422_2_c;
3808 753 *yuv2packedX = yuv2yvyu422_X_c;
3809 753 break;
3810 1056 case AV_PIX_FMT_UYVY422:
3811 1056 *yuv2packed1 = yuv2uyvy422_1_c;
3812 1056 *yuv2packed2 = yuv2uyvy422_2_c;
3813 1056 *yuv2packedX = yuv2uyvy422_X_c;
3814 1056 break;
3815 1195 case AV_PIX_FMT_VYU444:
3816 1195 *yuv2packed1 = yuv2vyu444_1_c;
3817 1195 *yuv2packed2 = yuv2vyu444_2_c;
3818 1195 *yuv2packedX = yuv2vyu444_X_c;
3819 1195 break;
3820 104 case AV_PIX_FMT_YA8:
3821 104 *yuv2packed1 = yuv2ya8_1_c;
3822 104 *yuv2packed2 = yuv2ya8_2_c;
3823 104 *yuv2packedX = yuv2ya8_X_c;
3824 104 break;
3825 104 case AV_PIX_FMT_YA16LE:
3826 104 *yuv2packed1 = yuv2ya16le_1_c;
3827 104 *yuv2packed2 = yuv2ya16le_2_c;
3828 104 *yuv2packedX = yuv2ya16le_X_c;
3829 104 break;
3830 99 case AV_PIX_FMT_YA16BE:
3831 99 *yuv2packed1 = yuv2ya16be_1_c;
3832 99 *yuv2packed2 = yuv2ya16be_2_c;
3833 99 *yuv2packedX = yuv2ya16be_X_c;
3834 99 break;
3835 1295 case AV_PIX_FMT_V30XLE:
3836 1295 *yuv2packedX = yuv2v30xle_X_c;
3837 1295 break;
3838 99 case AV_PIX_FMT_AYUV64LE:
3839 99 *yuv2packedX = yuv2ayuv64le_X_c;
3840 99 break;
3841 99 case AV_PIX_FMT_AYUV64BE:
3842 99 *yuv2packedX = yuv2ayuv64be_X_c;
3843 99 break;
3844 104 case AV_PIX_FMT_AYUV:
3845 104 *yuv2packed1 = yuv2ayuv_1_c;
3846 104 *yuv2packed2 = yuv2ayuv_2_c;
3847 104 *yuv2packedX = yuv2ayuv_X_c;
3848 104 break;
3849 895 case AV_PIX_FMT_VUYA:
3850 case AV_PIX_FMT_VUYX:
3851 895 *yuv2packed1 = yuv2vuyX_1_c;
3852 895 *yuv2packed2 = yuv2vuyX_2_c;
3853 895 *yuv2packedX = yuv2vuyX_X_c;
3854 895 break;
3855 508 case AV_PIX_FMT_UYVA:
3856 508 *yuv2packed1 = yuv2uyva_1_c;
3857 508 *yuv2packed2 = yuv2uyva_2_c;
3858 508 *yuv2packedX = yuv2uyva_X_c;
3859 508 break;
3860 781 case AV_PIX_FMT_XV30LE:
3861 781 *yuv2packedX = yuv2xv30le_X_c;
3862 781 break;
3863 781 case AV_PIX_FMT_XV36LE:
3864 781 *yuv2packedX = yuv2xv36le_X_c;
3865 781 break;
3866 781 case AV_PIX_FMT_XV36BE:
3867 781 *yuv2packedX = yuv2xv36be_X_c;
3868 781 break;
3869 967 case AV_PIX_FMT_XV48LE:
3870 967 *yuv2packedX = yuv2xv48le_X_c;
3871 967 break;
3872 967 case AV_PIX_FMT_XV48BE:
3873 967 *yuv2packedX = yuv2xv48be_X_c;
3874 967 break;
3875 748 case AV_PIX_FMT_Y210LE:
3876 748 *yuv2packedX = yuv2y210le_X_c;
3877 748 break;
3878 748 case AV_PIX_FMT_Y212LE:
3879 748 *yuv2packedX = yuv2y212le_X_c;
3880 748 break;
3881 934 case AV_PIX_FMT_Y216LE:
3882 934 *yuv2packedX = yuv2y216le_X_c;
3883 934 break;
3884 }
3885 415458 }
3886