FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libswscale/output.c
Date: 2025-07-28 20:30:09
Exec Total Coverage
Lines: 1565 2029 77.1%
Functions: 219 312 70.2%
Branches: 1135 1676 67.7%

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 2933038 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 2933038 int shift = 3;
155
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2933038 times.
2933038 av_assert0(output_bits == 16);
156
157
2/2
✓ Branch 0 taken 955872712 times.
✓ Branch 1 taken 2933038 times.
958805750 for (i = 0; i < dstW; i++) {
158 955872712 int val = src[i] + (1 << (shift - 1));
159
2/2
✓ Branch 0 taken 358275744 times.
✓ Branch 1 taken 597596968 times.
955872712 output_pixel(&dest[i], val, 0, uint);
160 }
161 2933038 }
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 7161068 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 7161068 int shift = 15 - output_bits;
333
334
2/2
✓ Branch 0 taken 2342175656 times.
✓ Branch 1 taken 7161068 times.
2349336724 for (i = 0; i < dstW; i++) {
335 2342175656 int val = src[i] + (1 << (shift - 1));
336
2/2
✓ Branch 0 taken 488429568 times.
✓ Branch 1 taken 1853746088 times.
2342175656 output_pixel(&dest[i], val);
337 }
338 7161068 }
339
340 static av_always_inline void
341 3209576 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 3209576 int shift = 11 + 16 - output_bits;
347
348
2/2
✓ Branch 0 taken 999943944 times.
✓ Branch 1 taken 3209576 times.
1003153520 for (i = 0; i < dstW; i++) {
349 999943944 int val = 1 << (shift - 1);
350 int j;
351
352
2/2
✓ Branch 0 taken 4753011744 times.
✓ Branch 1 taken 999943944 times.
5752955688 for (j = 0; j < filterSize; j++)
353 4753011744 val += src[j][i] * filter[j];
354
355
2/2
✓ Branch 0 taken 160343808 times.
✓ Branch 1 taken 839600136 times.
999943944 output_pixel(&dest[i], val);
356 }
357 3209576 }
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 254528 yuv2NBPS( 9, BE, 1, 10, int16_t)
379 284492 yuv2NBPS( 9, LE, 0, 10, int16_t)
380 1967200 yuv2NBPS(10, BE, 1, 10, int16_t)
381 10091068 yuv2NBPS(10, LE, 0, 10, int16_t)
382 1966000 yuv2NBPS(12, BE, 1, 10, int16_t)
383 5889136 yuv2NBPS(12, LE, 0, 10, int16_t)
384 136080 yuv2NBPS(14, BE, 1, 10, int16_t)
385 152784 yuv2NBPS(14, LE, 0, 10, int16_t)
386 2616536 yuv2NBPS(16, BE, 1, 16, int32_t)
387 4493444 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 38592 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 38592 int shift = 15 - output_bits;
402
403
2/2
✓ Branch 0 taken 13436928 times.
✓ Branch 1 taken 38592 times.
13475520 for (i = 0; i < dstW; i++) {
404 13436928 int val = src[i] + (1 << (shift - 1));
405
2/2
✓ Branch 0 taken 6488064 times.
✓ Branch 1 taken 6948864 times.
13436928 output_pixel(&dest[i], val);
406 }
407 38592 }
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 56496 yuv2MSBNBPS(10, BE, 1, 10, int16_t)
446 60528 yuv2MSBNBPS(10, LE, 0, 10, int16_t)
447 56496 yuv2MSBNBPS(12, BE, 1, 10, int16_t)
448 60528 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 11626532 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 7037855332 times.
✓ Branch 1 taken 11626532 times.
7049481864 for (i=0; i<dstW; i++) {
474 7037855332 int val = dither[(i + offset) & 7] << 12;
475 int j;
476
2/2
✓ Branch 0 taken 23285254332 times.
✓ Branch 1 taken 7037855332 times.
30323109664 for (j=0; j<filterSize; j++)
477 23285254332 val += src[j][i] * filter[j];
478
479 7037855332 dest[i]= av_clip_uint8(val>>19);
480 }
481 11626532 }
482
483 11175991 static void yuv2plane1_8_c(const int16_t *src, uint8_t *dest, int dstW,
484 const uint8_t *dither, int offset)
485 {
486 int i;
487
2/2
✓ Branch 0 taken 4162057277 times.
✓ Branch 1 taken 11175991 times.
4173233268 for (i=0; i<dstW; i++) {
488 4162057277 int val = (src[i] + dither[(i + offset) & 7]) >> 7;
489 4162057277 dest[i]= av_clip_uint8(val);
490 }
491 11175991 }
492
493 828346 static void yuv2nv12cX_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
494 const int16_t *chrFilter, int chrFilterSize,
495 const int16_t **chrUSrc, const int16_t **chrVSrc,
496 uint8_t *dest, int chrDstW)
497 {
498 int i;
499
500
2/2
✓ Branch 1 taken 818254 times.
✓ Branch 2 taken 10092 times.
828346 if (!isSwappedChroma(dstFormat))
501
2/2
✓ Branch 0 taken 264429392 times.
✓ Branch 1 taken 818254 times.
265247646 for (i=0; i<chrDstW; i++) {
502 264429392 int u = chrDither[i & 7] << 12;
503 264429392 int v = chrDither[(i + 3) & 7] << 12;
504 int j;
505
2/2
✓ Branch 0 taken 506157664 times.
✓ Branch 1 taken 264429392 times.
770587056 for (j=0; j<chrFilterSize; j++) {
506 506157664 u += chrUSrc[j][i] * chrFilter[j];
507 506157664 v += chrVSrc[j][i] * chrFilter[j];
508 }
509
510 264429392 dest[2*i]= av_clip_uint8(u>>19);
511 264429392 dest[2*i+1]= av_clip_uint8(v>>19);
512 }
513 else
514
2/2
✓ Branch 0 taken 3496784 times.
✓ Branch 1 taken 10092 times.
3506876 for (i=0; i<chrDstW; i++) {
515 3496784 int u = chrDither[i & 7] << 12;
516 3496784 int v = chrDither[(i + 3) & 7] << 12;
517 int j;
518
2/2
✓ Branch 0 taken 14387136 times.
✓ Branch 1 taken 3496784 times.
17883920 for (j=0; j<chrFilterSize; j++) {
519 14387136 u += chrUSrc[j][i] * chrFilter[j];
520 14387136 v += chrVSrc[j][i] * chrFilter[j];
521 }
522
523 3496784 dest[2*i]= av_clip_uint8(v>>19);
524 3496784 dest[2*i+1]= av_clip_uint8(u>>19);
525 }
526 828346 }
527
528
529 #define output_pixel(pos, val) \
530 if (big_endian) { \
531 AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits) << output_shift); \
532 } else { \
533 AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits) << output_shift); \
534 }
535
536 2274624 static void yuv2p01xl1_c(const int16_t *src,
537 uint16_t *dest, int dstW,
538 int big_endian, int output_bits, int output_shift)
539 {
540 int i;
541 2274624 int shift = 15 - output_bits;
542
543
2/2
✓ Branch 0 taken 800667648 times.
✓ Branch 1 taken 2274624 times.
802942272 for (i = 0; i < dstW; i++) {
544 800667648 int val = src[i] + (1 << (shift - 1));
545
2/2
✓ Branch 0 taken 179841024 times.
✓ Branch 1 taken 620826624 times.
800667648 output_pixel(&dest[i], val);
546 }
547 2274624 }
548
549 2800 static void yuv2p01xlX_c(const int16_t *filter, int filterSize,
550 const int16_t **src, uint16_t *dest, int dstW,
551 int big_endian, int output_bits, int output_shift)
552 {
553 int i, j;
554 2800 int shift = 11 + 16 - output_bits;
555
556
2/2
✓ Branch 0 taken 560000 times.
✓ Branch 1 taken 2800 times.
562800 for (i = 0; i < dstW; i++) {
557 560000 int val = 1 << (shift - 1);
558
559
2/2
✓ Branch 0 taken 6720000 times.
✓ Branch 1 taken 560000 times.
7280000 for (j = 0; j < filterSize; j++)
560 6720000 val += src[j][i] * filter[j];
561
562
2/2
✓ Branch 0 taken 280000 times.
✓ Branch 1 taken 280000 times.
560000 output_pixel(&dest[i], val);
563 }
564 2800 }
565
566 2099040 static void yuv2p01xcX_c(int big_endian, const uint8_t *chrDither,
567 const int16_t *chrFilter, int chrFilterSize,
568 const int16_t **chrUSrc, const int16_t **chrVSrc,
569 uint8_t *dest8, int chrDstW, int output_bits, int output_shift)
570 {
571 2099040 uint16_t *dest = (uint16_t*)dest8;
572 int i, j;
573 2099040 int shift = 11 + 16 - output_bits;
574
575
2/2
✓ Branch 0 taken 639597056 times.
✓ Branch 1 taken 2099040 times.
641696096 for (i = 0; i < chrDstW; i++) {
576 639597056 int u = 1 << (shift - 1);
577 639597056 int v = 1 << (shift - 1);
578
579
2/2
✓ Branch 0 taken 1262423040 times.
✓ Branch 1 taken 639597056 times.
1902020096 for (j = 0; j < chrFilterSize; j++) {
580 1262423040 u += chrUSrc[j][i] * chrFilter[j];
581 1262423040 v += chrVSrc[j][i] * chrFilter[j];
582 }
583
584
2/2
✓ Branch 0 taken 98393344 times.
✓ Branch 1 taken 541203712 times.
639597056 output_pixel(&dest[2*i] , u);
585
2/2
✓ Branch 0 taken 98393344 times.
✓ Branch 1 taken 541203712 times.
639597056 output_pixel(&dest[2*i+1], v);
586 }
587 2099040 }
588
589 #undef output_pixel
590
591 #define yuv2p01x_wrapper(fmt, bits, shift) \
592 static void yuv2 ## fmt ## l1_LE_c(const int16_t *src, \
593 uint8_t *dest, int dstW, \
594 const uint8_t *dither, int offset) \
595 { \
596 yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 0, bits, shift); \
597 } \
598 \
599 static void yuv2 ## fmt ## l1_BE_c(const int16_t *src, \
600 uint8_t *dest, int dstW, \
601 const uint8_t *dither, int offset) \
602 { \
603 yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 1, bits, shift); \
604 } \
605 \
606 static void yuv2 ## fmt ## lX_LE_c(const int16_t *filter, \
607 int filterSize, const int16_t **src, \
608 uint8_t *dest, int dstW, \
609 const uint8_t *dither, int offset) \
610 { \
611 yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 0, \
612 bits, shift); \
613 } \
614 \
615 static void yuv2 ## fmt ## lX_BE_c(const int16_t *filter, \
616 int filterSize, const int16_t **src, \
617 uint8_t *dest, int dstW, \
618 const uint8_t *dither, int offset) \
619 { \
620 yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 1, \
621 bits, shift); \
622 } \
623 \
624 static void yuv2 ## fmt ## cX_LE_c(enum AVPixelFormat dstFormat, \
625 const uint8_t *chrDither, \
626 const int16_t *chrFilter, \
627 int chrFilterSize, \
628 const int16_t **chrUSrc, \
629 const int16_t **chrVSrc, \
630 uint8_t *dest8, int chrDstW) \
631 { \
632 yuv2p01xcX_c(0, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, \
633 dest8, chrDstW, bits, shift); \
634 } \
635 \
636 static void yuv2 ## fmt ## cX_BE_c(enum AVPixelFormat dstFormat, \
637 const uint8_t *chrDither, \
638 const int16_t *chrFilter, \
639 int chrFilterSize, \
640 const int16_t **chrUSrc, \
641 const int16_t **chrVSrc, \
642 uint8_t *dest8, int chrDstW) \
643 { \
644 yuv2p01xcX_c(1, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, \
645 dest8, chrDstW, bits, shift); \
646 }
647
648 4326128 yuv2p01x_wrapper(p010, 10, 6)
649 4353776 yuv2p01x_wrapper(p012, 12, 4)
650 73024 yuv2p01x_wrapper(nv20, 10, 0)
651
652 #define accumulate_bit(acc, val) \
653 acc <<= 1; \
654 acc |= (val) >= 234
655 #define output_pixel(pos, acc) \
656 if (target == AV_PIX_FMT_MONOBLACK) { \
657 pos = acc; \
658 } else { \
659 pos = ~acc; \
660 }
661
662 static av_always_inline void
663 91380 yuv2mono_X_c_template(SwsInternal *c, const int16_t *lumFilter,
664 const int16_t **lumSrc, int lumFilterSize,
665 const int16_t *chrFilter, const int16_t **chrUSrc,
666 const int16_t **chrVSrc, int chrFilterSize,
667 const int16_t **alpSrc, uint8_t *dest, int dstW,
668 int y, enum AVPixelFormat target)
669 {
670 91380 const uint8_t * const d128 = ff_dither_8x8_220[y&7];
671 int i;
672 91380 unsigned acc = 0;
673 91380 int err = 0;
674
675
2/2
✓ Branch 0 taken 15782180 times.
✓ Branch 1 taken 91380 times.
15873560 for (i = 0; i < dstW; i += 2) {
676 int j;
677 15782180 int Y1 = 1 << 18;
678 15782180 int Y2 = 1 << 18;
679
680
2/2
✓ Branch 0 taken 16222180 times.
✓ Branch 1 taken 15782180 times.
32004360 for (j = 0; j < lumFilterSize; j++) {
681 16222180 Y1 += lumSrc[j][i] * lumFilter[j];
682 16222180 Y2 += lumSrc[j][i+1] * lumFilter[j];
683 }
684 15782180 Y1 >>= 19;
685 15782180 Y2 >>= 19;
686
2/2
✓ Branch 0 taken 734 times.
✓ Branch 1 taken 15781446 times.
15782180 if ((Y1 | Y2) & 0x100) {
687 734 Y1 = av_clip_uint8(Y1);
688 734 Y2 = av_clip_uint8(Y2);
689 }
690
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15782180 times.
15782180 if (c->opts.dither == SWS_DITHER_ED) {
691 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;
692 c->dither_error[0][i] = err;
693 acc = 2*acc + (Y1 >= 128);
694 Y1 -= 220*(acc&1);
695
696 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);
697 c->dither_error[0][i+1] = Y1;
698 acc = 2*acc + (err >= 128);
699 err -= 220*(acc&1);
700 } else {
701 15782180 accumulate_bit(acc, Y1 + d128[(i + 0) & 7]);
702 15782180 accumulate_bit(acc, Y2 + d128[(i + 1) & 7]);
703 }
704
2/2
✓ Branch 0 taken 3945120 times.
✓ Branch 1 taken 11837060 times.
15782180 if ((i & 7) == 6) {
705
2/2
✓ Branch 0 taken 689288 times.
✓ Branch 1 taken 3255832 times.
3945120 output_pixel(*dest++, acc);
706 }
707 }
708 91380 c->dither_error[0][i] = err;
709
710
2/2
✓ Branch 0 taken 1700 times.
✓ Branch 1 taken 89680 times.
91380 if (i & 6) {
711
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1700 times.
1700 output_pixel(*dest, acc);
712 }
713 91380 }
714
715 static av_always_inline void
716 yuv2mono_2_c_template(SwsInternal *c, const int16_t *buf[2],
717 const int16_t *ubuf[2], const int16_t *vbuf[2],
718 const int16_t *abuf[2], uint8_t *dest, int dstW,
719 int yalpha, int uvalpha, int y,
720 enum AVPixelFormat target)
721 {
722 const int16_t *buf0 = buf[0], *buf1 = buf[1];
723 const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
724 int yalpha1 = 4096 - yalpha;
725 int i;
726 av_assert2(yalpha <= 4096U);
727
728 if (c->opts.dither == SWS_DITHER_ED) {
729 int err = 0;
730 unsigned acc = 0;
731 for (i = 0; i < dstW; i +=2) {
732 int Y;
733
734 Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
735 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;
736 c->dither_error[0][i] = err;
737 acc = 2*acc + (Y >= 128);
738 Y -= 220*(acc&1);
739
740 err = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
741 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;
742 c->dither_error[0][i+1] = Y;
743 acc = 2*acc + (err >= 128);
744 err -= 220*(acc&1);
745
746 if ((i & 7) == 6)
747 output_pixel(*dest++, acc);
748 }
749 c->dither_error[0][i] = err;
750 } else {
751 for (i = 0; i < dstW; i += 8) {
752 int Y;
753 unsigned acc = 0;
754
755 Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
756 accumulate_bit(acc, Y + d128[0]);
757 Y = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
758 accumulate_bit(acc, Y + d128[1]);
759 Y = (buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19;
760 accumulate_bit(acc, Y + d128[2]);
761 Y = (buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19;
762 accumulate_bit(acc, Y + d128[3]);
763 Y = (buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19;
764 accumulate_bit(acc, Y + d128[4]);
765 Y = (buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19;
766 accumulate_bit(acc, Y + d128[5]);
767 Y = (buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19;
768 accumulate_bit(acc, Y + d128[6]);
769 Y = (buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19;
770 accumulate_bit(acc, Y + d128[7]);
771
772 output_pixel(*dest++, acc);
773 }
774 }
775 }
776
777 static av_always_inline void
778 174336 yuv2mono_1_c_template(SwsInternal *c, const int16_t *buf0,
779 const int16_t *ubuf[2], const int16_t *vbuf[2],
780 const int16_t *abuf0, uint8_t *dest, int dstW,
781 int uvalpha, int y, enum AVPixelFormat target)
782 {
783 174336 const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
784 int i;
785
786
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 174336 times.
174336 if (c->opts.dither == SWS_DITHER_ED) {
787 int err = 0;
788 unsigned acc = 0;
789 for (i = 0; i < dstW; i +=2) {
790 int Y;
791
792 Y = ((buf0[i + 0] + 64) >> 7);
793 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;
794 c->dither_error[0][i] = err;
795 acc = 2*acc + (Y >= 128);
796 Y -= 220*(acc&1);
797
798 err = ((buf0[i + 1] + 64) >> 7);
799 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;
800 c->dither_error[0][i+1] = Y;
801 acc = 2*acc + (err >= 128);
802 err -= 220*(acc&1);
803
804 if ((i & 7) == 6)
805 output_pixel(*dest++, acc);
806 }
807 c->dither_error[0][i] = err;
808 } else {
809
2/2
✓ Branch 0 taken 7305984 times.
✓ Branch 1 taken 174336 times.
7480320 for (i = 0; i < dstW; i += 8) {
810 7305984 unsigned acc = 0;
811 7305984 accumulate_bit(acc, ((buf0[i + 0] + 64) >> 7) + d128[0]);
812 7305984 accumulate_bit(acc, ((buf0[i + 1] + 64) >> 7) + d128[1]);
813 7305984 accumulate_bit(acc, ((buf0[i + 2] + 64) >> 7) + d128[2]);
814 7305984 accumulate_bit(acc, ((buf0[i + 3] + 64) >> 7) + d128[3]);
815 7305984 accumulate_bit(acc, ((buf0[i + 4] + 64) >> 7) + d128[4]);
816 7305984 accumulate_bit(acc, ((buf0[i + 5] + 64) >> 7) + d128[5]);
817 7305984 accumulate_bit(acc, ((buf0[i + 6] + 64) >> 7) + d128[6]);
818 7305984 accumulate_bit(acc, ((buf0[i + 7] + 64) >> 7) + d128[7]);
819
820
2/2
✓ Branch 0 taken 3624192 times.
✓ Branch 1 taken 3681792 times.
7305984 output_pixel(*dest++, acc);
821 }
822 }
823 174336 }
824
825 #undef output_pixel
826 #undef accumulate_bit
827
828 #define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
829 static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
830 const int16_t **lumSrc, int lumFilterSize, \
831 const int16_t *chrFilter, const int16_t **chrUSrc, \
832 const int16_t **chrVSrc, int chrFilterSize, \
833 const int16_t **alpSrc, uint8_t *dest, int dstW, \
834 int y) \
835 { \
836 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
837 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
838 alpSrc, dest, dstW, y, fmt); \
839 } \
840 \
841 static void name ## ext ## _2_c(SwsInternal *c, const int16_t *buf[2], \
842 const int16_t *ubuf[2], const int16_t *vbuf[2], \
843 const int16_t *abuf[2], uint8_t *dest, int dstW, \
844 int yalpha, int uvalpha, int y) \
845 { \
846 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
847 dest, dstW, yalpha, uvalpha, y, fmt); \
848 } \
849 \
850 static void name ## ext ## _1_c(SwsInternal *c, const int16_t *buf0, \
851 const int16_t *ubuf[2], const int16_t *vbuf[2], \
852 const int16_t *abuf0, uint8_t *dest, int dstW, \
853 int uvalpha, int y) \
854 { \
855 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, \
856 abuf0, dest, dstW, uvalpha, \
857 y, fmt); \
858 }
859
860 335192 YUV2PACKEDWRAPPER(yuv2mono,, white, AV_PIX_FMT_MONOWHITE)
861 196240 YUV2PACKEDWRAPPER(yuv2mono,, black, AV_PIX_FMT_MONOBLACK)
862
863 #define output_pixels(pos, Y1, U, Y2, V) \
864 if (target == AV_PIX_FMT_YUYV422) { \
865 dest[pos + 0] = Y1; \
866 dest[pos + 1] = U; \
867 dest[pos + 2] = Y2; \
868 dest[pos + 3] = V; \
869 } else if (target == AV_PIX_FMT_YVYU422) { \
870 dest[pos + 0] = Y1; \
871 dest[pos + 1] = V; \
872 dest[pos + 2] = Y2; \
873 dest[pos + 3] = U; \
874 } else { /* AV_PIX_FMT_UYVY422 */ \
875 dest[pos + 0] = U; \
876 dest[pos + 1] = Y1; \
877 dest[pos + 2] = V; \
878 dest[pos + 3] = Y2; \
879 }
880
881 static av_always_inline void
882 32280 yuv2422_X_c_template(SwsInternal *c, const int16_t *lumFilter,
883 const int16_t **lumSrc, int lumFilterSize,
884 const int16_t *chrFilter, const int16_t **chrUSrc,
885 const int16_t **chrVSrc, int chrFilterSize,
886 const int16_t **alpSrc, uint8_t *dest, int dstW,
887 int y, enum AVPixelFormat target)
888 {
889 int i;
890
891
2/2
✓ Branch 0 taken 5635680 times.
✓ Branch 1 taken 32280 times.
5667960 for (i = 0; i < ((dstW + 1) >> 1); i++) {
892 int j;
893 5635680 int Y1 = 1 << 18;
894 5635680 int Y2 = 1 << 18;
895 5635680 int U = 1 << 18;
896 5635680 int V = 1 << 18;
897
898
2/2
✓ Branch 0 taken 6295680 times.
✓ Branch 1 taken 5635680 times.
11931360 for (j = 0; j < lumFilterSize; j++) {
899 6295680 Y1 += lumSrc[j][i * 2] * lumFilter[j];
900 6295680 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
901 }
902
2/2
✓ Branch 0 taken 23022720 times.
✓ Branch 1 taken 5635680 times.
28658400 for (j = 0; j < chrFilterSize; j++) {
903 23022720 U += chrUSrc[j][i] * chrFilter[j];
904 23022720 V += chrVSrc[j][i] * chrFilter[j];
905 }
906 5635680 Y1 >>= 19;
907 5635680 Y2 >>= 19;
908 5635680 U >>= 19;
909 5635680 V >>= 19;
910
2/2
✓ Branch 0 taken 35 times.
✓ Branch 1 taken 5635645 times.
5635680 if ((Y1 | Y2 | U | V) & 0x100) {
911 35 Y1 = av_clip_uint8(Y1);
912 35 Y2 = av_clip_uint8(Y2);
913 35 U = av_clip_uint8(U);
914 35 V = av_clip_uint8(V);
915 }
916
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);
917 }
918 32280 }
919
920 static av_always_inline void
921 yuv2422_2_c_template(SwsInternal *c, const int16_t *buf[2],
922 const int16_t *ubuf[2], const int16_t *vbuf[2],
923 const int16_t *abuf[2], uint8_t *dest, int dstW,
924 int yalpha, int uvalpha, int y,
925 enum AVPixelFormat target)
926 {
927 const int16_t *buf0 = buf[0], *buf1 = buf[1],
928 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
929 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
930 int yalpha1 = 4096 - yalpha;
931 int uvalpha1 = 4096 - uvalpha;
932 int i;
933 av_assert2(yalpha <= 4096U);
934 av_assert2(uvalpha <= 4096U);
935
936 for (i = 0; i < ((dstW + 1) >> 1); i++) {
937 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
938 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
939 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
940 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
941
942 if ((Y1 | Y2 | U | V) & 0x100) {
943 Y1 = av_clip_uint8(Y1);
944 Y2 = av_clip_uint8(Y2);
945 U = av_clip_uint8(U);
946 V = av_clip_uint8(V);
947 }
948
949 output_pixels(i * 4, Y1, U, Y2, V);
950 }
951 }
952
953 static av_always_inline void
954 333504 yuv2422_1_c_template(SwsInternal *c, const int16_t *buf0,
955 const int16_t *ubuf[2], const int16_t *vbuf[2],
956 const int16_t *abuf0, uint8_t *dest, int dstW,
957 int uvalpha, int y, enum AVPixelFormat target)
958 {
959 333504 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
960 int i;
961
962
1/2
✓ Branch 0 taken 333504 times.
✗ Branch 1 not taken.
333504 if (uvalpha < 2048) {
963
2/2
✓ Branch 0 taken 74594304 times.
✓ Branch 1 taken 333504 times.
74927808 for (i = 0; i < ((dstW + 1) >> 1); i++) {
964 74594304 int Y1 = (buf0[i * 2 ]+64) >> 7;
965 74594304 int Y2 = (buf0[i * 2 + 1]+64) >> 7;
966 74594304 int U = (ubuf0[i] +64) >> 7;
967 74594304 int V = (vbuf0[i] +64) >> 7;
968
969
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 74594304 times.
74594304 if ((Y1 | Y2 | U | V) & 0x100) {
970 Y1 = av_clip_uint8(Y1);
971 Y2 = av_clip_uint8(Y2);
972 U = av_clip_uint8(U);
973 V = av_clip_uint8(V);
974 }
975
976
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);
977 }
978 } else {
979 const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
980 for (i = 0; i < ((dstW + 1) >> 1); i++) {
981 int Y1 = (buf0[i * 2 ] + 64) >> 7;
982 int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
983 int U = (ubuf0[i] + ubuf1[i]+128) >> 8;
984 int V = (vbuf0[i] + vbuf1[i]+128) >> 8;
985
986 if ((Y1 | Y2 | U | V) & 0x100) {
987 Y1 = av_clip_uint8(Y1);
988 Y2 = av_clip_uint8(Y2);
989 U = av_clip_uint8(U);
990 V = av_clip_uint8(V);
991 }
992
993 output_pixels(i * 4, Y1, U, Y2, V);
994 }
995 }
996 333504 }
997
998 #undef output_pixels
999
1000 196240 YUV2PACKEDWRAPPER(yuv2, 422, yuyv422, AV_PIX_FMT_YUYV422)
1001 181264 YUV2PACKEDWRAPPER(yuv2, 422, yvyu422, AV_PIX_FMT_YVYU422)
1002 354064 YUV2PACKEDWRAPPER(yuv2, 422, uyvy422, AV_PIX_FMT_UYVY422)
1003
1004 #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)
1005 #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)
1006 #define output_pixel(pos, val) \
1007 if (is_be) { \
1008 AV_WB16(pos, val); \
1009 } else { \
1010 AV_WL16(pos, val); \
1011 }
1012
1013 static av_always_inline void
1014 19408 yuv2ya16_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1015 const int32_t **lumSrc, int lumFilterSize,
1016 const int16_t *chrFilter, const int32_t **unused_chrUSrc,
1017 const int32_t **unused_chrVSrc, int unused_chrFilterSize,
1018 const int32_t **alpSrc, uint16_t *dest, int dstW,
1019 int y, enum AVPixelFormat target,
1020 int unused_hasAlpha, int unused_eightbytes, int is_be)
1021 {
1022 19408 int hasAlpha = !!alpSrc;
1023 int i;
1024
1025
2/2
✓ Branch 0 taken 6770816 times.
✓ Branch 1 taken 19408 times.
6790224 for (i = 0; i < dstW; i++) {
1026 int j;
1027 6770816 int Y = -0x40000000;
1028 6770816 int A = 0xffff;
1029
1030
2/2
✓ Branch 0 taken 7650816 times.
✓ Branch 1 taken 6770816 times.
14421632 for (j = 0; j < lumFilterSize; j++)
1031 7650816 Y += lumSrc[j][i] * lumFilter[j];
1032
1033 6770816 Y >>= 15;
1034 6770816 Y += (1<<3) + 0x8000;
1035 6770816 Y = av_clip_uint16(Y);
1036
1037
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 6690816 times.
6770816 if (hasAlpha) {
1038 80000 A = -0x40000000 + (1<<14);
1039
2/2
✓ Branch 0 taken 960000 times.
✓ Branch 1 taken 80000 times.
1040000 for (j = 0; j < lumFilterSize; j++)
1040 960000 A += alpSrc[j][i] * lumFilter[j];
1041
1042 80000 A >>= 15;
1043 80000 A += 0x8000;
1044 80000 A = av_clip_uint16(A);
1045 }
1046
1047
2/2
✓ Branch 0 taken 3284032 times.
✓ Branch 1 taken 3486784 times.
6770816 output_pixel(&dest[2 * i ], Y);
1048
2/2
✓ Branch 0 taken 3284032 times.
✓ Branch 1 taken 3486784 times.
6770816 output_pixel(&dest[2 * i + 1], A);
1049 }
1050 19408 }
1051
1052 static av_always_inline void
1053 yuv2ya16_2_c_template(SwsInternal *c, const int32_t *buf[2],
1054 const int32_t *unused_ubuf[2], const int32_t *unused_vbuf[2],
1055 const int32_t *abuf[2], uint16_t *dest, int dstW,
1056 int yalpha, int unused_uvalpha, int y,
1057 enum AVPixelFormat target, int unused_hasAlpha,
1058 int unused_eightbytes, int is_be)
1059 {
1060 int hasAlpha = abuf && abuf[0] && abuf[1];
1061 const int32_t *buf0 = buf[0], *buf1 = buf[1],
1062 *abuf0 = hasAlpha ? abuf[0] : NULL,
1063 *abuf1 = hasAlpha ? abuf[1] : NULL;
1064 int yalpha1 = 4096 - yalpha;
1065 int i;
1066
1067 av_assert2(yalpha <= 4096U);
1068
1069 for (i = 0; i < dstW; i++) {
1070 int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 15;
1071 int A;
1072
1073 Y = av_clip_uint16(Y);
1074
1075 if (hasAlpha) {
1076 A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 15;
1077 A = av_clip_uint16(A);
1078 }
1079
1080 output_pixel(&dest[2 * i ], Y);
1081 output_pixel(&dest[2 * i + 1], hasAlpha ? A : 65535);
1082 }
1083 }
1084
1085 static av_always_inline void
1086 yuv2ya16_1_c_template(SwsInternal *c, const int32_t *buf0,
1087 const int32_t *unused_ubuf[2], const int32_t *unused_vbuf[2],
1088 const int32_t *abuf0, uint16_t *dest, int dstW,
1089 int unused_uvalpha, int y, enum AVPixelFormat target,
1090 int unused_hasAlpha, int unused_eightbytes, int is_be)
1091 {
1092 int hasAlpha = !!abuf0;
1093 int i;
1094
1095 for (i = 0; i < dstW; i++) {
1096 int Y = buf0[i] >> 3;/* 19 - 16 */
1097 int A;
1098
1099 Y = av_clip_uint16(Y);
1100
1101 if (hasAlpha) {
1102 A = abuf0[i] >> 3;
1103 if (A & 0x100)
1104 A = av_clip_uint16(A);
1105 }
1106
1107 output_pixel(&dest[2 * i ], Y);
1108 output_pixel(&dest[2 * i + 1], hasAlpha ? A : 65535);
1109 }
1110 }
1111
1112 static av_always_inline void
1113 297520 yuv2rgba64_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1114 const int32_t **lumSrc, int lumFilterSize,
1115 const int16_t *chrFilter, const int32_t **chrUSrc,
1116 const int32_t **chrVSrc, int chrFilterSize,
1117 const int32_t **alpSrc, uint16_t *dest, int dstW,
1118 int y, enum AVPixelFormat target, int hasAlpha, int eightbytes,
1119 int is_be)
1120 {
1121 int i;
1122 297520 int A1 = 0xffff<<14, A2 = 0xffff<<14;
1123
1124
2/2
✓ Branch 0 taken 52164080 times.
✓ Branch 1 taken 297520 times.
52461600 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1125 int j;
1126 52164080 unsigned Y1 = -0x40000000;
1127 52164080 unsigned Y2 = -0x40000000;
1128 52164080 int U = -(128 << 23); // 19
1129 52164080 int V = -(128 << 23);
1130 int R, G, B;
1131
1132
2/2
✓ Branch 0 taken 52679616 times.
✓ Branch 1 taken 52164080 times.
104843696 for (j = 0; j < lumFilterSize; j++) {
1133 52679616 Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j];
1134 52679616 Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1135 }
1136
2/2
✓ Branch 0 taken 208697280 times.
✓ Branch 1 taken 52164080 times.
260861360 for (j = 0; j < chrFilterSize; j++) {;
1137 208697280 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
1138 208697280 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
1139 }
1140
1141
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 52164080 times.
52164080 if (hasAlpha) {
1142 A1 = -0x40000000;
1143 A2 = -0x40000000;
1144 for (j = 0; j < lumFilterSize; j++) {
1145 A1 += alpSrc[j][i * 2] * (unsigned)lumFilter[j];
1146 A2 += alpSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1147 }
1148 A1 >>= 1;
1149 A1 += 0x20002000;
1150 A2 >>= 1;
1151 A2 += 0x20002000;
1152 }
1153
1154 // 8 bits: 12+15=27; 16 bits: 12+19=31
1155 52164080 Y1 = (int)Y1 >> 14; // 10
1156 52164080 Y1 += 0x10000;
1157 52164080 Y2 = (int)Y2 >> 14;
1158 52164080 Y2 += 0x10000;
1159 52164080 U >>= 14;
1160 52164080 V >>= 14;
1161
1162 // 8 bits: 27 -> 17 bits, 16 bits: 31 - 14 = 17 bits
1163 52164080 Y1 -= c->yuv2rgb_y_offset;
1164 52164080 Y2 -= c->yuv2rgb_y_offset;
1165 52164080 Y1 *= c->yuv2rgb_y_coeff;
1166 52164080 Y2 *= c->yuv2rgb_y_coeff;
1167 52164080 Y1 += (1 << 13) - (1 << 29); // 21
1168 52164080 Y2 += (1 << 13) - (1 << 29);
1169 // 8 bits: 17 + 13 bits = 30 bits, 16 bits: 17 + 13 bits = 30 bits
1170
1171 52164080 R = V * c->yuv2rgb_v2r_coeff;
1172 52164080 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1173 52164080 B = U * c->yuv2rgb_u2b_coeff;
1174
1175 // 8 bits: 30 - 22 = 8 bits, 16 bits: 30 bits - 14 = 16 bits
1176
14/18
✓ Branch 0 taken 9533440 times.
✓ Branch 1 taken 42630640 times.
✓ Branch 2 taken 9533440 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4869120 times.
✓ Branch 5 taken 4664320 times.
✓ Branch 6 taken 4869120 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1623040 times.
✓ Branch 9 taken 3246080 times.
✓ Branch 10 taken 5984256 times.
✓ Branch 11 taken 36646384 times.
✓ Branch 12 taken 5984256 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3347456 times.
✓ Branch 15 taken 2636800 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3347456 times.
52164080 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1177
2/2
✓ Branch 0 taken 9533440 times.
✓ Branch 1 taken 42630640 times.
52164080 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y1) >> 14) + (1<<15), 16));
1178
14/18
✓ Branch 0 taken 9533440 times.
✓ Branch 1 taken 42630640 times.
✓ Branch 2 taken 9533440 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4869120 times.
✓ Branch 5 taken 4664320 times.
✓ Branch 6 taken 4869120 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1623040 times.
✓ Branch 9 taken 3246080 times.
✓ Branch 10 taken 5984256 times.
✓ Branch 11 taken 36646384 times.
✓ Branch 12 taken 5984256 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3347456 times.
✓ Branch 15 taken 2636800 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3347456 times.
52164080 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1179
2/2
✓ Branch 0 taken 7505920 times.
✓ Branch 1 taken 44658160 times.
52164080 if (eightbytes) {
1180
2/2
✓ Branch 0 taken 3246080 times.
✓ Branch 1 taken 4259840 times.
7505920 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1181
12/18
✓ Branch 0 taken 3246080 times.
✓ Branch 1 taken 4259840 times.
✓ Branch 2 taken 3246080 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3246080 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3246080 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1623040 times.
✓ Branch 9 taken 1623040 times.
✓ Branch 10 taken 4259840 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4259840 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1623040 times.
✓ Branch 15 taken 2636800 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1623040 times.
7505920 output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1182
2/2
✓ Branch 0 taken 3246080 times.
✓ Branch 1 taken 4259840 times.
7505920 output_pixel(&dest[5], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1183
12/18
✓ Branch 0 taken 3246080 times.
✓ Branch 1 taken 4259840 times.
✓ Branch 2 taken 3246080 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3246080 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3246080 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1623040 times.
✓ Branch 9 taken 1623040 times.
✓ Branch 10 taken 4259840 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4259840 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1623040 times.
✓ Branch 15 taken 2636800 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1623040 times.
7505920 output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1184
2/2
✓ Branch 0 taken 3246080 times.
✓ Branch 1 taken 4259840 times.
7505920 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1185 7505920 dest += 8;
1186 } else {
1187
12/18
✓ Branch 0 taken 6287360 times.
✓ Branch 1 taken 38370800 times.
✓ Branch 2 taken 6287360 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1623040 times.
✓ Branch 5 taken 4664320 times.
✓ Branch 6 taken 1623040 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1623040 times.
✓ Branch 10 taken 1724416 times.
✓ Branch 11 taken 36646384 times.
✓ Branch 12 taken 1724416 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1724416 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1724416 times.
44658160 output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1188
2/2
✓ Branch 0 taken 6287360 times.
✓ Branch 1 taken 38370800 times.
44658160 output_pixel(&dest[4], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1189
12/18
✓ Branch 0 taken 6287360 times.
✓ Branch 1 taken 38370800 times.
✓ Branch 2 taken 6287360 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1623040 times.
✓ Branch 5 taken 4664320 times.
✓ Branch 6 taken 1623040 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1623040 times.
✓ Branch 10 taken 1724416 times.
✓ Branch 11 taken 36646384 times.
✓ Branch 12 taken 1724416 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1724416 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1724416 times.
44658160 output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1190 44658160 dest += 6;
1191 }
1192 }
1193 297520 }
1194
1195 static av_always_inline void
1196 48 yuv2rgba64_2_c_template(SwsInternal *c, const int32_t *buf[2],
1197 const int32_t *ubuf[2], const int32_t *vbuf[2],
1198 const int32_t *abuf[2], uint16_t *dest, int dstW,
1199 int yalpha, int uvalpha, int y,
1200 enum AVPixelFormat target, int hasAlpha, int eightbytes,
1201 int is_be)
1202 {
1203 48 const int32_t *buf0 = buf[0], *buf1 = buf[1],
1204 48 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1205 48 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1206
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
48 *abuf0 = hasAlpha ? abuf[0] : NULL,
1207
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
48 *abuf1 = hasAlpha ? abuf[1] : NULL;
1208 48 int yalpha1 = 4096 - yalpha;
1209 48 int uvalpha1 = 4096 - uvalpha;
1210 int i;
1211 48 int A1 = 0xffff<<14, A2 = 0xffff<<14;
1212
1213 av_assert2(yalpha <= 4096U);
1214 av_assert2(uvalpha <= 4096U);
1215
1216
2/2
✓ Branch 0 taken 12288 times.
✓ Branch 1 taken 48 times.
12336 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1217 12288 unsigned Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 14;
1218 12288 unsigned Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 14;
1219 12288 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1220 12288 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1221 int R, G, B;
1222
1223 12288 Y1 -= c->yuv2rgb_y_offset;
1224 12288 Y2 -= c->yuv2rgb_y_offset;
1225 12288 Y1 *= c->yuv2rgb_y_coeff;
1226 12288 Y2 *= c->yuv2rgb_y_coeff;
1227 12288 Y1 += (1 << 13) - (1 << 29);
1228 12288 Y2 += (1 << 13) - (1 << 29);
1229
1230 12288 R = V * c->yuv2rgb_v2r_coeff;
1231 12288 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1232 12288 B = U * c->yuv2rgb_u2b_coeff;
1233
1234
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12288 times.
12288 if (hasAlpha) {
1235 A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 1;
1236 A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 1;
1237
1238 A1 += 1 << 13;
1239 A2 += 1 << 13;
1240 }
1241
1242
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));
1243
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));
1244
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));
1245
2/2
✓ Branch 0 taken 6144 times.
✓ Branch 1 taken 6144 times.
12288 if (eightbytes) {
1246
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
6144 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1247
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));
1248
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));
1249
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));
1250
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
6144 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1251 6144 dest += 8;
1252 } else {
1253
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));
1254
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));
1255
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));
1256 6144 dest += 6;
1257 }
1258 }
1259 48 }
1260
1261 static av_always_inline void
1262 209684 yuv2rgba64_1_c_template(SwsInternal *c, const int32_t *buf0,
1263 const int32_t *ubuf[2], const int32_t *vbuf[2],
1264 const int32_t *abuf0, uint16_t *dest, int dstW,
1265 int uvalpha, int y, enum AVPixelFormat target,
1266 int hasAlpha, int eightbytes, int is_be)
1267 {
1268 209684 const int32_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1269 int i;
1270 209684 int A1 = 0xffff<<14, A2= 0xffff<<14;
1271
1272
2/2
✓ Branch 0 taken 209652 times.
✓ Branch 1 taken 32 times.
209684 if (uvalpha == 0) {
1273
2/2
✓ Branch 0 taken 36629732 times.
✓ Branch 1 taken 209652 times.
36839384 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1274 36629732 SUINT Y1 = (buf0[i * 2] ) >> 2;
1275 36629732 SUINT Y2 = (buf0[i * 2 + 1]) >> 2;
1276 36629732 SUINT U = (ubuf0[i] - (128 << 11)) >> 2;
1277 36629732 SUINT V = (vbuf0[i] - (128 << 11)) >> 2;
1278 int R, G, B;
1279
1280 36629732 Y1 -= c->yuv2rgb_y_offset;
1281 36629732 Y2 -= c->yuv2rgb_y_offset;
1282 36629732 Y1 *= c->yuv2rgb_y_coeff;
1283 36629732 Y2 *= c->yuv2rgb_y_coeff;
1284 36629732 Y1 += (1 << 13) - (1 << 29);
1285 36629732 Y2 += (1 << 13) - (1 << 29);
1286
1287
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36629732 times.
36629732 if (hasAlpha) {
1288 A1 = abuf0[i * 2 ] * (1 << 11);
1289 A2 = abuf0[i * 2 + 1] * (1 << 11);
1290
1291 A1 += 1 << 13;
1292 A2 += 1 << 13;
1293 }
1294
1295 36629732 R = V * c->yuv2rgb_v2r_coeff;
1296 36629732 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1297 36629732 B = U * c->yuv2rgb_u2b_coeff;
1298
1299
14/18
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 36627684 times.
✓ Branch 2 taken 2048 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1536 times.
✓ Branch 5 taken 512 times.
✓ Branch 6 taken 1536 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 512 times.
✓ Branch 9 taken 1024 times.
✓ Branch 10 taken 1536 times.
✓ Branch 11 taken 36626148 times.
✓ Branch 12 taken 1536 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1024 times.
✓ Branch 15 taken 512 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1024 times.
36629732 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1300
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 36627684 times.
36629732 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y1) >> 14) + (1<<15), 16));
1301
14/18
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 36627684 times.
✓ Branch 2 taken 2048 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1536 times.
✓ Branch 5 taken 512 times.
✓ Branch 6 taken 1536 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 512 times.
✓ Branch 9 taken 1024 times.
✓ Branch 10 taken 1536 times.
✓ Branch 11 taken 36626148 times.
✓ Branch 12 taken 1536 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1024 times.
✓ Branch 15 taken 512 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1024 times.
36629732 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1302
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 36627684 times.
36629732 if (eightbytes) {
1303
2/2
✓ Branch 0 taken 1024 times.
✓ Branch 1 taken 1024 times.
2048 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1304
12/18
✓ Branch 0 taken 1024 times.
✓ Branch 1 taken 1024 times.
✓ Branch 2 taken 1024 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1024 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1024 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 512 times.
✓ Branch 9 taken 512 times.
✓ Branch 10 taken 1024 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1024 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 512 times.
✓ Branch 15 taken 512 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 512 times.
2048 output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1305
2/2
✓ Branch 0 taken 1024 times.
✓ Branch 1 taken 1024 times.
2048 output_pixel(&dest[5], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1306
12/18
✓ Branch 0 taken 1024 times.
✓ Branch 1 taken 1024 times.
✓ Branch 2 taken 1024 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1024 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1024 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 512 times.
✓ Branch 9 taken 512 times.
✓ Branch 10 taken 1024 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1024 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 512 times.
✓ Branch 15 taken 512 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 512 times.
2048 output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1307
2/2
✓ Branch 0 taken 1024 times.
✓ Branch 1 taken 1024 times.
2048 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1308 2048 dest += 8;
1309 } else {
1310
12/18
✓ Branch 0 taken 1024 times.
✓ Branch 1 taken 36626660 times.
✓ Branch 2 taken 1024 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 512 times.
✓ Branch 5 taken 512 times.
✓ Branch 6 taken 512 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 512 times.
✓ Branch 10 taken 512 times.
✓ Branch 11 taken 36626148 times.
✓ Branch 12 taken 512 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 512 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 512 times.
36627684 output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1311
2/2
✓ Branch 0 taken 1024 times.
✓ Branch 1 taken 36626660 times.
36627684 output_pixel(&dest[4], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1312
12/18
✓ Branch 0 taken 1024 times.
✓ Branch 1 taken 36626660 times.
✓ Branch 2 taken 1024 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 512 times.
✓ Branch 5 taken 512 times.
✓ Branch 6 taken 512 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 512 times.
✓ Branch 10 taken 512 times.
✓ Branch 11 taken 36626148 times.
✓ Branch 12 taken 512 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 512 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 512 times.
36627684 output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1313 36627684 dest += 6;
1314 }
1315 }
1316 } else {
1317 32 const int32_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1318 32 int A1 = 0xffff<<14, A2 = 0xffff<<14;
1319 32 int uvalpha1 = 4096 - uvalpha;
1320 av_assert2(uvalpha <= 4096U);
1321
1322
2/2
✓ Branch 0 taken 8192 times.
✓ Branch 1 taken 32 times.
8224 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1323 8192 SUINT Y1 = (buf0[i * 2] ) >> 2;
1324 8192 SUINT Y2 = (buf0[i * 2 + 1]) >> 2;
1325 8192 SUINT U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1326 8192 SUINT V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1327 int R, G, B;
1328
1329 8192 Y1 -= c->yuv2rgb_y_offset;
1330 8192 Y2 -= c->yuv2rgb_y_offset;
1331 8192 Y1 *= c->yuv2rgb_y_coeff;
1332 8192 Y2 *= c->yuv2rgb_y_coeff;
1333 8192 Y1 += (1 << 13) - (1 << 29);
1334 8192 Y2 += (1 << 13) - (1 << 29);
1335
1336
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8192 times.
8192 if (hasAlpha) {
1337 A1 = abuf0[i * 2 ] * (1 << 11);
1338 A2 = abuf0[i * 2 + 1] * (1 << 11);
1339
1340 A1 += 1 << 13;
1341 A2 += 1 << 13;
1342 }
1343
1344 8192 R = V * c->yuv2rgb_v2r_coeff;
1345 8192 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1346 8192 B = U * c->yuv2rgb_u2b_coeff;
1347
1348
14/18
✓ Branch 0 taken 4096 times.
✓ Branch 1 taken 4096 times.
✓ Branch 2 taken 4096 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3072 times.
✓ Branch 5 taken 1024 times.
✓ Branch 6 taken 3072 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1024 times.
✓ Branch 9 taken 2048 times.
✓ Branch 10 taken 3072 times.
✓ Branch 11 taken 1024 times.
✓ Branch 12 taken 3072 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2048 times.
✓ Branch 15 taken 1024 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2048 times.
8192 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1349
2/2
✓ Branch 0 taken 4096 times.
✓ Branch 1 taken 4096 times.
8192 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y1) >> 14) + (1<<15), 16));
1350
14/18
✓ Branch 0 taken 4096 times.
✓ Branch 1 taken 4096 times.
✓ Branch 2 taken 4096 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3072 times.
✓ Branch 5 taken 1024 times.
✓ Branch 6 taken 3072 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1024 times.
✓ Branch 9 taken 2048 times.
✓ Branch 10 taken 3072 times.
✓ Branch 11 taken 1024 times.
✓ Branch 12 taken 3072 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2048 times.
✓ Branch 15 taken 1024 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2048 times.
8192 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1351
2/2
✓ Branch 0 taken 4096 times.
✓ Branch 1 taken 4096 times.
8192 if (eightbytes) {
1352
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 2048 times.
4096 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1353
12/18
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 2048 times.
✓ Branch 2 taken 2048 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2048 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2048 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1024 times.
✓ Branch 9 taken 1024 times.
✓ Branch 10 taken 2048 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2048 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1024 times.
✓ Branch 15 taken 1024 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1024 times.
4096 output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1354
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 2048 times.
4096 output_pixel(&dest[5], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1355
12/18
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 2048 times.
✓ Branch 2 taken 2048 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2048 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2048 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1024 times.
✓ Branch 9 taken 1024 times.
✓ Branch 10 taken 2048 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2048 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1024 times.
✓ Branch 15 taken 1024 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1024 times.
4096 output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1356
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 2048 times.
4096 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1357 4096 dest += 8;
1358 } else {
1359
12/18
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 2048 times.
✓ Branch 2 taken 2048 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1024 times.
✓ Branch 5 taken 1024 times.
✓ Branch 6 taken 1024 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1024 times.
✓ Branch 10 taken 1024 times.
✓ Branch 11 taken 1024 times.
✓ Branch 12 taken 1024 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1024 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1024 times.
4096 output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1360
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 2048 times.
4096 output_pixel(&dest[4], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1361
12/18
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 2048 times.
✓ Branch 2 taken 2048 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1024 times.
✓ Branch 5 taken 1024 times.
✓ Branch 6 taken 1024 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1024 times.
✓ Branch 10 taken 1024 times.
✓ Branch 11 taken 1024 times.
✓ Branch 12 taken 1024 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1024 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1024 times.
4096 output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1362 4096 dest += 6;
1363 }
1364 }
1365 }
1366 209684 }
1367
1368 static av_always_inline void
1369 2000 yuv2rgba64_full_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1370 const int32_t **lumSrc, int lumFilterSize,
1371 const int16_t *chrFilter, const int32_t **chrUSrc,
1372 const int32_t **chrVSrc, int chrFilterSize,
1373 const int32_t **alpSrc, uint16_t *dest, int dstW,
1374 int y, enum AVPixelFormat target, int hasAlpha,
1375 int eightbytes, int is_be)
1376 {
1377 int i;
1378 2000 int A = 0xffff<<14;
1379
1380
2/2
✓ Branch 0 taken 400000 times.
✓ Branch 1 taken 2000 times.
402000 for (i = 0; i < dstW; i++) {
1381 int j;
1382 400000 int Y = -0x40000000;
1383 400000 int U = -(128 << 23); // 19
1384 400000 int V = -(128 << 23);
1385 int R, G, B;
1386
1387
2/2
✓ Branch 0 taken 4800000 times.
✓ Branch 1 taken 400000 times.
5200000 for (j = 0; j < lumFilterSize; j++) {
1388 4800000 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
1389 }
1390
2/2
✓ Branch 0 taken 4800000 times.
✓ Branch 1 taken 400000 times.
5200000 for (j = 0; j < chrFilterSize; j++) {;
1391 4800000 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
1392 4800000 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
1393 }
1394
1395
2/2
✓ Branch 0 taken 160000 times.
✓ Branch 1 taken 240000 times.
400000 if (hasAlpha) {
1396 160000 A = -0x40000000;
1397
2/2
✓ Branch 0 taken 1920000 times.
✓ Branch 1 taken 160000 times.
2080000 for (j = 0; j < lumFilterSize; j++) {
1398 1920000 A += alpSrc[j][i] * (unsigned)lumFilter[j];
1399 }
1400 160000 A >>= 1;
1401 160000 A += 0x20002000;
1402 }
1403
1404 // 8bit: 12+15=27; 16-bit: 12+19=31
1405 400000 Y >>= 14; // 10
1406 400000 Y += 0x10000;
1407 400000 U >>= 14;
1408 400000 V >>= 14;
1409
1410 // 8bit: 27 -> 17bit, 16bit: 31 - 14 = 17bit
1411 400000 Y -= c->yuv2rgb_y_offset;
1412 400000 Y *= c->yuv2rgb_y_coeff;
1413 400000 Y += (1 << 13) - (1<<29); // 21
1414 // 8bit: 17 + 13bit = 30bit, 16bit: 17 + 13bit = 30bit
1415
1416 400000 R = V * c->yuv2rgb_v2r_coeff;
1417 400000 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1418 400000 B = U * c->yuv2rgb_u2b_coeff;
1419
1420 // 8bit: 30 - 22 = 8bit, 16bit: 30bit - 14 = 16bit
1421
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));
1422
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));
1423
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));
1424
2/2
✓ Branch 0 taken 160000 times.
✓ Branch 1 taken 240000 times.
400000 if (eightbytes) {
1425
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 80000 times.
160000 output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1426 160000 dest += 4;
1427 } else {
1428 240000 dest += 3;
1429 }
1430 }
1431 2000 }
1432
1433 static av_always_inline void
1434 yuv2rgba64_full_2_c_template(SwsInternal *c, const int32_t *buf[2],
1435 const int32_t *ubuf[2], const int32_t *vbuf[2],
1436 const int32_t *abuf[2], uint16_t *dest, int dstW,
1437 int yalpha, int uvalpha, int y,
1438 enum AVPixelFormat target, int hasAlpha, int eightbytes,
1439 int is_be)
1440 {
1441 const int32_t *buf0 = buf[0], *buf1 = buf[1],
1442 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1443 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1444 *abuf0 = hasAlpha ? abuf[0] : NULL,
1445 *abuf1 = hasAlpha ? abuf[1] : NULL;
1446 int yalpha1 = 4096 - yalpha;
1447 int uvalpha1 = 4096 - uvalpha;
1448 int i;
1449 int A = 0xffff<<14;
1450
1451 av_assert2(yalpha <= 4096U);
1452 av_assert2(uvalpha <= 4096U);
1453
1454 for (i = 0; i < dstW; i++) {
1455 int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 14;
1456 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1457 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1458 int R, G, B;
1459
1460 Y -= c->yuv2rgb_y_offset;
1461 Y *= c->yuv2rgb_y_coeff;
1462 Y += (1 << 13) - (1 << 29);
1463
1464 R = V * c->yuv2rgb_v2r_coeff;
1465 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1466 B = U * c->yuv2rgb_u2b_coeff;
1467
1468 if (hasAlpha) {
1469 A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 1;
1470
1471 A += 1 << 13;
1472 }
1473
1474 output_pixel(&dest[0], av_clip_uintp2(((R_B + Y) >> 14) + (1<<15), 16));
1475 output_pixel(&dest[1], av_clip_uintp2((( G + Y) >> 14) + (1<<15), 16));
1476 output_pixel(&dest[2], av_clip_uintp2(((B_R + Y) >> 14) + (1<<15), 16));
1477 if (eightbytes) {
1478 output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1479 dest += 4;
1480 } else {
1481 dest += 3;
1482 }
1483 }
1484 }
1485
1486 static av_always_inline void
1487 412224 yuv2rgba64_full_1_c_template(SwsInternal *c, const int32_t *buf0,
1488 const int32_t *ubuf[2], const int32_t *vbuf[2],
1489 const int32_t *abuf0, uint16_t *dest, int dstW,
1490 int uvalpha, int y, enum AVPixelFormat target,
1491 int hasAlpha, int eightbytes, int is_be)
1492 {
1493 412224 const int32_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1494 int i;
1495 412224 int A = 0xffff<<14;
1496
1497
1/2
✓ Branch 0 taken 412224 times.
✗ Branch 1 not taken.
412224 if (uvalpha == 0) {
1498
2/2
✓ Branch 0 taken 145004544 times.
✓ Branch 1 taken 412224 times.
145416768 for (i = 0; i < dstW; i++) {
1499 145004544 SUINT Y = (buf0[i]) >> 2;
1500 145004544 SUINT U = (ubuf0[i] - (128 << 11)) >> 2;
1501 145004544 SUINT V = (vbuf0[i] - (128 << 11)) >> 2;
1502 int R, G, B;
1503
1504 145004544 Y -= c->yuv2rgb_y_offset;
1505 145004544 Y *= c->yuv2rgb_y_coeff;
1506 145004544 Y += (1 << 13) - (1 << 29);
1507
1508
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 145004544 times.
145004544 if (hasAlpha) {
1509 A = abuf0[i] * (1 << 11);
1510
1511 A += 1 << 13;
1512 }
1513
1514 145004544 R = V * c->yuv2rgb_v2r_coeff;
1515 145004544 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1516 145004544 B = U * c->yuv2rgb_u2b_coeff;
1517
1518
7/18
✗ Branch 0 not taken.
✓ Branch 1 taken 145004544 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 27648 times.
✓ Branch 11 taken 144976896 times.
✓ Branch 12 taken 27648 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 18432 times.
✓ Branch 15 taken 9216 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 18432 times.
145004544 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y) >> 14) + (1<<15), 16));
1519
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 145004544 times.
145004544 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y) >> 14) + (1<<15), 16));
1520
7/18
✗ Branch 0 not taken.
✓ Branch 1 taken 145004544 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 27648 times.
✓ Branch 11 taken 144976896 times.
✓ Branch 12 taken 27648 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 18432 times.
✓ Branch 15 taken 9216 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 18432 times.
145004544 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y) >> 14) + (1<<15), 16));
1521
2/2
✓ Branch 0 taken 18432 times.
✓ Branch 1 taken 144986112 times.
145004544 if (eightbytes) {
1522
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18432 times.
18432 output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1523 18432 dest += 4;
1524 } else {
1525 144986112 dest += 3;
1526 }
1527 }
1528 } else {
1529 const int32_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1530 int uvalpha1 = 4096 - uvalpha;
1531 int A = 0xffff<<14;
1532 av_assert2(uvalpha <= 4096U);
1533
1534 for (i = 0; i < dstW; i++) {
1535 SUINT Y = (buf0[i] ) >> 2;
1536 SUINT U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1537 SUINT V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1538 int R, G, B;
1539
1540 Y -= c->yuv2rgb_y_offset;
1541 Y *= c->yuv2rgb_y_coeff;
1542 Y += (1 << 13) - (1 << 29);
1543
1544 if (hasAlpha) {
1545 A = abuf0[i] * (1 << 11);
1546
1547 A += 1 << 13;
1548 }
1549
1550 R = V * c->yuv2rgb_v2r_coeff;
1551 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1552 B = U * c->yuv2rgb_u2b_coeff;
1553
1554 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y) >> 14) + (1<<15), 16));
1555 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y) >> 14) + (1<<15), 16));
1556 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y) >> 14) + (1<<15), 16));
1557 if (eightbytes) {
1558 output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1559 dest += 4;
1560 } else {
1561 dest += 3;
1562 }
1563 }
1564 }
1565 412224 }
1566
1567 #undef output_pixel
1568 #undef r_b
1569 #undef b_r
1570
1571 #define YUV2PACKED16WRAPPER_EXT(name, base, ext, fmt, is_be, hasAlpha, eightbytes) \
1572 static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
1573 const int16_t **_lumSrc, int lumFilterSize, \
1574 const int16_t *chrFilter, const int16_t **_chrUSrc, \
1575 const int16_t **_chrVSrc, int chrFilterSize, \
1576 const int16_t **_alpSrc, uint8_t *_dest, int dstW, \
1577 int y) \
1578 { \
1579 const int32_t **lumSrc = (const int32_t **) _lumSrc, \
1580 **chrUSrc = (const int32_t **) _chrUSrc, \
1581 **chrVSrc = (const int32_t **) _chrVSrc, \
1582 **alpSrc = (const int32_t **) _alpSrc; \
1583 uint16_t *dest = (uint16_t *) _dest; \
1584 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
1585 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
1586 alpSrc, dest, dstW, y, fmt, hasAlpha, eightbytes, is_be); \
1587 } \
1588 \
1589 static void name ## ext ## _2_c(SwsInternal *c, const int16_t *_buf[2], \
1590 const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
1591 const int16_t *_abuf[2], uint8_t *_dest, int dstW, \
1592 int yalpha, int uvalpha, int y) \
1593 { \
1594 const int32_t **buf = (const int32_t **) _buf, \
1595 **ubuf = (const int32_t **) _ubuf, \
1596 **vbuf = (const int32_t **) _vbuf, \
1597 **abuf = (const int32_t **) _abuf; \
1598 uint16_t *dest = (uint16_t *) _dest; \
1599 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
1600 dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha, eightbytes, is_be); \
1601 } \
1602 \
1603 static void name ## ext ## _1_c(SwsInternal *c, const int16_t *_buf0, \
1604 const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
1605 const int16_t *_abuf0, uint8_t *_dest, int dstW, \
1606 int uvalpha, int y) \
1607 { \
1608 const int32_t *buf0 = (const int32_t *) _buf0, \
1609 **ubuf = (const int32_t **) _ubuf, \
1610 **vbuf = (const int32_t **) _vbuf, \
1611 *abuf0 = (const int32_t *) _abuf0; \
1612 uint16_t *dest = (uint16_t *) _dest; \
1613 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
1614 dstW, uvalpha, y, fmt, hasAlpha, eightbytes, is_be); \
1615 }
1616 #define YUV2PACKED16WRAPPER(name, base, ext, base_fmt, endianness, hasAlpha, eightbytes) \
1617 YUV2PACKED16WRAPPER_EXT(name, base, ext, base_fmt ## endianness, IS_BE(endianness), hasAlpha, eightbytes)
1618
1619 53024 YUV2PACKED16WRAPPER(yuv2, rgba64, rgb48be, AV_PIX_FMT_RGB48, BE, 0, 0)
1620 838024 YUV2PACKED16WRAPPER(yuv2, rgba64, rgb48le, AV_PIX_FMT_RGB48, LE, 0, 0)
1621 18464 YUV2PACKED16WRAPPER(yuv2, rgba64, bgr48be, AV_PIX_FMT_BGR48, BE, 0, 0)
1622 19616 YUV2PACKED16WRAPPER(yuv2, rgba64, bgr48le, AV_PIX_FMT_BGR48, LE, 0, 0)
1623 YUV2PACKED16WRAPPER(yuv2, rgba64, rgba64be, AV_PIX_FMT_RGBA64, BE, 1, 1)
1624 YUV2PACKED16WRAPPER(yuv2, rgba64, rgba64le, AV_PIX_FMT_RGBA64, LE, 1, 1)
1625 18464 YUV2PACKED16WRAPPER(yuv2, rgba64, rgbx64be, AV_PIX_FMT_RGBA64, BE, 0, 1)
1626 29984 YUV2PACKED16WRAPPER(yuv2, rgba64, rgbx64le, AV_PIX_FMT_RGBA64, LE, 0, 1)
1627 YUV2PACKED16WRAPPER(yuv2, rgba64, bgra64be, AV_PIX_FMT_BGRA64, BE, 1, 1)
1628 YUV2PACKED16WRAPPER(yuv2, rgba64, bgra64le, AV_PIX_FMT_BGRA64, LE, 1, 1)
1629 18464 YUV2PACKED16WRAPPER(yuv2, rgba64, bgrx64be, AV_PIX_FMT_BGRA64, BE, 0, 1)
1630 18464 YUV2PACKED16WRAPPER(yuv2, rgba64, bgrx64le, AV_PIX_FMT_BGRA64, LE, 0, 1)
1631 18832 YUV2PACKED16WRAPPER(yuv2, ya16, ya16be, AV_PIX_FMT_YA16, BE, 1, 0)
1632 19984 YUV2PACKED16WRAPPER(yuv2, ya16, ya16le, AV_PIX_FMT_YA16, LE, 1, 0)
1633
1634 800 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgb48be_full, AV_PIX_FMT_RGB48, BE, 0, 0)
1635 824672 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgb48le_full, AV_PIX_FMT_RGB48, LE, 0, 0)
1636 400 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgr48be_full, AV_PIX_FMT_BGR48, BE, 0, 0)
1637 592 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgr48le_full, AV_PIX_FMT_BGR48, LE, 0, 0)
1638 400 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgba64be_full, AV_PIX_FMT_RGBA64, BE, 1, 1)
1639 400 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgba64le_full, AV_PIX_FMT_RGBA64, LE, 1, 1)
1640 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgbx64be_full, AV_PIX_FMT_RGBA64, BE, 0, 1)
1641 192 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgbx64le_full, AV_PIX_FMT_RGBA64, LE, 0, 1)
1642 400 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgra64be_full, AV_PIX_FMT_BGRA64, BE, 1, 1)
1643 400 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgra64le_full, AV_PIX_FMT_BGRA64, LE, 1, 1)
1644 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgrx64be_full, AV_PIX_FMT_BGRA64, BE, 0, 1)
1645 192 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgrx64le_full, AV_PIX_FMT_BGRA64, LE, 0, 1)
1646
1647 /*
1648 * Write out 2 RGB pixels in the target pixel format. This function takes a
1649 * R/G/B LUT as generated by ff_yuv2rgb_c_init_tables(), which takes care of
1650 * things like endianness conversion and shifting. The caller takes care of
1651 * setting the correct offset in these tables from the chroma (U/V) values.
1652 * This function then uses the luminance (Y1/Y2) values to write out the
1653 * correct RGB values into the destination buffer.
1654 */
1655 static av_always_inline void
1656 305454116 yuv2rgb_write(uint8_t *_dest, int i, int Y1, int Y2,
1657 unsigned A1, unsigned A2,
1658 const void *_r, const void *_g, const void *_b, int y,
1659 enum AVPixelFormat target, int hasAlpha)
1660 {
1661
4/6
✓ Branch 0 taken 305454116 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 305454116 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 297380196 times.
✓ Branch 5 taken 8073920 times.
305454116 if (target == AV_PIX_FMT_ARGB || target == AV_PIX_FMT_RGBA ||
1662
2/2
✓ Branch 0 taken 28552648 times.
✓ Branch 1 taken 268827548 times.
334006764 target == AV_PIX_FMT_ABGR || target == AV_PIX_FMT_BGRA) {
1663 36626568 uint32_t *dest = (uint32_t *) _dest;
1664 36626568 const uint32_t *r = (const uint32_t *) _r;
1665 36626568 const uint32_t *g = (const uint32_t *) _g;
1666 36626568 const uint32_t *b = (const uint32_t *) _b;
1667
1668 #if CONFIG_SMALL
1669 int sh = hasAlpha ? ((target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24) : 0;
1670
1671 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (hasAlpha ? A1 << sh : 0);
1672 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (hasAlpha ? A2 << sh : 0);
1673 #else
1674
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36626568 times.
36626568 if (hasAlpha) {
1675 int sh = (target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24;
1676
1677 av_assert2((((r[Y1] + g[Y1] + b[Y1]) >> sh) & 0xFF) == 0);
1678 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (A1 << sh);
1679 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (A2 << sh);
1680 } else {
1681 #if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1
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) == 0xFF);
1685 #endif
1686 36626568 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
1687 36626568 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
1688 }
1689 #endif
1690
4/4
✓ Branch 0 taken 145099974 times.
✓ Branch 1 taken 123727574 times.
✓ Branch 2 taken 27320814 times.
✓ Branch 3 taken 117779160 times.
268827548 } else if (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) {
1691 151048388 uint8_t *dest = (uint8_t *) _dest;
1692 151048388 const uint8_t *r = (const uint8_t *) _r;
1693 151048388 const uint8_t *g = (const uint8_t *) _g;
1694 151048388 const uint8_t *b = (const uint8_t *) _b;
1695
1696 #define r_b ((target == AV_PIX_FMT_RGB24) ? r : b)
1697 #define b_r ((target == AV_PIX_FMT_RGB24) ? b : r)
1698
1699
2/2
✓ Branch 0 taken 123727574 times.
✓ Branch 1 taken 27320814 times.
151048388 dest[i * 6 + 0] = r_b[Y1];
1700 151048388 dest[i * 6 + 1] = g[Y1];
1701
2/2
✓ Branch 0 taken 123727574 times.
✓ Branch 1 taken 27320814 times.
151048388 dest[i * 6 + 2] = b_r[Y1];
1702
2/2
✓ Branch 0 taken 123727574 times.
✓ Branch 1 taken 27320814 times.
151048388 dest[i * 6 + 3] = r_b[Y2];
1703 151048388 dest[i * 6 + 4] = g[Y2];
1704
2/2
✓ Branch 0 taken 123727574 times.
✓ Branch 1 taken 27320814 times.
151048388 dest[i * 6 + 5] = b_r[Y2];
1705 #undef r_b
1706 #undef b_r
1707
5/6
✓ Branch 0 taken 87849332 times.
✓ Branch 1 taken 29929828 times.
✓ Branch 2 taken 87849332 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 35052104 times.
✓ Branch 5 taken 52797228 times.
117779160 } else if (target == AV_PIX_FMT_RGB565 || target == AV_PIX_FMT_BGR565 ||
1708
3/4
✓ Branch 0 taken 35052104 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 28467656 times.
✓ Branch 3 taken 6584448 times.
35052104 target == AV_PIX_FMT_RGB555 || target == AV_PIX_FMT_BGR555 ||
1709
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28467656 times.
28467656 target == AV_PIX_FMT_RGB444 || target == AV_PIX_FMT_BGR444) {
1710 89311504 uint16_t *dest = (uint16_t *) _dest;
1711 89311504 const uint16_t *r = (const uint16_t *) _r;
1712 89311504 const uint16_t *g = (const uint16_t *) _g;
1713 89311504 const uint16_t *b = (const uint16_t *) _b;
1714 int dr1, dg1, db1, dr2, dg2, db2;
1715
1716
3/4
✓ Branch 0 taken 59381676 times.
✓ Branch 1 taken 29929828 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 59381676 times.
89311504 if (target == AV_PIX_FMT_RGB565 || target == AV_PIX_FMT_BGR565) {
1717 29929828 dr1 = ff_dither_2x2_8[ y & 1 ][0];
1718 29929828 dg1 = ff_dither_2x2_4[ y & 1 ][0];
1719 29929828 db1 = ff_dither_2x2_8[(y & 1) ^ 1][0];
1720 29929828 dr2 = ff_dither_2x2_8[ y & 1 ][1];
1721 29929828 dg2 = ff_dither_2x2_4[ y & 1 ][1];
1722 29929828 db2 = ff_dither_2x2_8[(y & 1) ^ 1][1];
1723
3/4
✓ Branch 0 taken 6584448 times.
✓ Branch 1 taken 52797228 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6584448 times.
59381676 } else if (target == AV_PIX_FMT_RGB555 || target == AV_PIX_FMT_BGR555) {
1724 52797228 dr1 = ff_dither_2x2_8[ y & 1 ][0];
1725 52797228 dg1 = ff_dither_2x2_8[ y & 1 ][1];
1726 52797228 db1 = ff_dither_2x2_8[(y & 1) ^ 1][0];
1727 52797228 dr2 = ff_dither_2x2_8[ y & 1 ][1];
1728 52797228 dg2 = ff_dither_2x2_8[ y & 1 ][0];
1729 52797228 db2 = ff_dither_2x2_8[(y & 1) ^ 1][1];
1730 } else {
1731 6584448 dr1 = ff_dither_4x4_16[ y & 3 ][0];
1732 6584448 dg1 = ff_dither_4x4_16[ y & 3 ][1];
1733 6584448 db1 = ff_dither_4x4_16[(y & 3) ^ 3][0];
1734 6584448 dr2 = ff_dither_4x4_16[ y & 3 ][1];
1735 6584448 dg2 = ff_dither_4x4_16[ y & 3 ][0];
1736 6584448 db2 = ff_dither_4x4_16[(y & 3) ^ 3][1];
1737 }
1738
1739 89311504 dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
1740 89311504 dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
1741
4/4
✓ Branch 0 taken 26845640 times.
✓ Branch 1 taken 1622016 times.
✓ Branch 2 taken 1622016 times.
✓ Branch 3 taken 25223624 times.
28467656 } else if (target == AV_PIX_FMT_X2RGB10 || target == AV_PIX_FMT_X2BGR10) {
1742 3244032 uint32_t *dest = (uint32_t *) _dest;
1743 3244032 const uint32_t *r = (const uint32_t *) _r;
1744 3244032 const uint32_t *g = (const uint32_t *) _g;
1745 3244032 const uint32_t *b = (const uint32_t *) _b;
1746 3244032 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
1747 3244032 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
1748 } else /* 8/4 bits */ {
1749 25223624 uint8_t *dest = (uint8_t *) _dest;
1750 25223624 const uint8_t *r = (const uint8_t *) _r;
1751 25223624 const uint8_t *g = (const uint8_t *) _g;
1752 25223624 const uint8_t *b = (const uint8_t *) _b;
1753 int dr1, dg1, db1, dr2, dg2, db2;
1754
1755
3/4
✓ Branch 0 taken 3970048 times.
✓ Branch 1 taken 21253576 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3970048 times.
25223624 if (target == AV_PIX_FMT_RGB8 || target == AV_PIX_FMT_BGR8) {
1756 21253576 const uint8_t * const d64 = ff_dither_8x8_73[y & 7];
1757 21253576 const uint8_t * const d32 = ff_dither_8x8_32[y & 7];
1758 21253576 dr1 = dg1 = d32[(i * 2 + 0) & 7];
1759 21253576 db1 = d64[(i * 2 + 0) & 7];
1760 21253576 dr2 = dg2 = d32[(i * 2 + 1) & 7];
1761 21253576 db2 = d64[(i * 2 + 1) & 7];
1762 } else {
1763 3970048 const uint8_t * const d64 = ff_dither_8x8_73 [y & 7];
1764 3970048 const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
1765 3970048 dr1 = db1 = d128[(i * 2 + 0) & 7];
1766 3970048 dg1 = d64[(i * 2 + 0) & 7];
1767 3970048 dr2 = db2 = d128[(i * 2 + 1) & 7];
1768 3970048 dg2 = d64[(i * 2 + 1) & 7];
1769 }
1770
1771
3/4
✓ Branch 0 taken 25215432 times.
✓ Branch 1 taken 8192 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 25215432 times.
25223624 if (target == AV_PIX_FMT_RGB4 || target == AV_PIX_FMT_BGR4) {
1772 8192 dest[i] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1] +
1773 8192 ((r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2]) << 4);
1774 } else {
1775 25215432 dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
1776 25215432 dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
1777 }
1778 }
1779 305454116 }
1780
1781 static av_always_inline void
1782 1306056 yuv2rgb_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1783 const int16_t **lumSrc, int lumFilterSize,
1784 const int16_t *chrFilter, const int16_t **chrUSrc,
1785 const int16_t **chrVSrc, int chrFilterSize,
1786 const int16_t **alpSrc, uint8_t *dest, int dstW,
1787 int y, enum AVPixelFormat target, int hasAlpha)
1788 {
1789 int i;
1790
1791
2/2
✓ Branch 0 taken 224497016 times.
✓ Branch 1 taken 1306056 times.
225803072 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1792 int j, A1, A2;
1793 224497016 int Y1 = 1 << 18;
1794 224497016 int Y2 = 1 << 18;
1795 224497016 int U = 1 << 18;
1796 224497016 int V = 1 << 18;
1797 const void *r, *g, *b;
1798
1799
2/2
✓ Branch 0 taken 238925624 times.
✓ Branch 1 taken 224497016 times.
463422640 for (j = 0; j < lumFilterSize; j++) {
1800 238925624 Y1 += lumSrc[j][i * 2] * lumFilter[j];
1801 238925624 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
1802 }
1803
2/2
✓ Branch 0 taken 902507744 times.
✓ Branch 1 taken 224497016 times.
1127004760 for (j = 0; j < chrFilterSize; j++) {
1804 902507744 U += chrUSrc[j][i] * chrFilter[j];
1805 902507744 V += chrVSrc[j][i] * chrFilter[j];
1806 }
1807 224497016 Y1 >>= 19;
1808 224497016 Y2 >>= 19;
1809 224497016 U >>= 19;
1810 224497016 V >>= 19;
1811
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 224497016 times.
224497016 if (hasAlpha) {
1812 A1 = 1 << 18;
1813 A2 = 1 << 18;
1814 for (j = 0; j < lumFilterSize; j++) {
1815 A1 += alpSrc[j][i * 2 ] * lumFilter[j];
1816 A2 += alpSrc[j][i * 2 + 1] * lumFilter[j];
1817 }
1818 A1 >>= 19;
1819 A2 >>= 19;
1820 if ((A1 | A2) & 0x100) {
1821 A1 = av_clip_uint8(A1);
1822 A2 = av_clip_uint8(A2);
1823 }
1824 }
1825
1826 224497016 r = c->table_rV[V + YUVRGB_TABLE_HEADROOM];
1827 224497016 g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]);
1828 224497016 b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1829
1830
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 224497016 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 224497016 times.
224497016 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1831 r, g, b, y, target, hasAlpha);
1832 }
1833 1306056 }
1834
1835 static av_always_inline void
1836 144 yuv2rgb_2_c_template(SwsInternal *c, const int16_t *buf[2],
1837 const int16_t *ubuf[2], const int16_t *vbuf[2],
1838 const int16_t *abuf[2], uint8_t *dest, int dstW,
1839 int yalpha, int uvalpha, int y,
1840 enum AVPixelFormat target, int hasAlpha)
1841 {
1842 144 const int16_t *buf0 = buf[0], *buf1 = buf[1],
1843 144 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1844 144 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1845
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 144 times.
144 *abuf0 = hasAlpha ? abuf[0] : NULL,
1846
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 144 times.
144 *abuf1 = hasAlpha ? abuf[1] : NULL;
1847 144 int yalpha1 = 4096 - yalpha;
1848 144 int uvalpha1 = 4096 - uvalpha;
1849 int i;
1850 av_assert2(yalpha <= 4096U);
1851 av_assert2(uvalpha <= 4096U);
1852
1853
2/2
✓ Branch 0 taken 36864 times.
✓ Branch 1 taken 144 times.
37008 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1854 36864 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
1855 36864 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
1856 36864 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
1857 36864 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
1858 int A1, A2;
1859 36864 const void *r = c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1860 36864 *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1861 36864 *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1862
1863
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36864 times.
36864 if (hasAlpha) {
1864 A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 19;
1865 A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 19;
1866 A1 = av_clip_uint8(A1);
1867 A2 = av_clip_uint8(A2);
1868 }
1869
1870
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,
1871 r, g, b, y, target, hasAlpha);
1872 }
1873 144 }
1874
1875 static av_always_inline void
1876 464316 yuv2rgb_1_c_template(SwsInternal *c, const int16_t *buf0,
1877 const int16_t *ubuf[2], const int16_t *vbuf[2],
1878 const int16_t *abuf0, uint8_t *dest, int dstW,
1879 int uvalpha, int y, enum AVPixelFormat target,
1880 int hasAlpha)
1881 {
1882 464316 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1883 int i;
1884
1885
2/2
✓ Branch 0 taken 464220 times.
✓ Branch 1 taken 96 times.
464316 if (uvalpha == 0) {
1886
2/2
✓ Branch 0 taken 80895660 times.
✓ Branch 1 taken 464220 times.
81359880 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1887 80895660 int Y1 = (buf0[i * 2 ] + 64) >> 7;
1888 80895660 int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
1889 80895660 int U = (ubuf0[i] + 64) >> 7;
1890 80895660 int V = (vbuf0[i] + 64) >> 7;
1891 int A1, A2;
1892 80895660 const void *r = c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1893 80895660 *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1894 80895660 *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1895
1896
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 80895660 times.
80895660 if (hasAlpha) {
1897 A1 = abuf0[i * 2 ] * 255 + 16384 >> 15;
1898 A2 = abuf0[i * 2 + 1] * 255 + 16384 >> 15;
1899 A1 = av_clip_uint8(A1);
1900 A2 = av_clip_uint8(A2);
1901 }
1902
1903
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 80895660 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 80895660 times.
80895660 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1904 r, g, b, y, target, hasAlpha);
1905 }
1906 } else {
1907 96 const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1908 96 int uvalpha1 = 4096 - uvalpha;
1909 av_assert2(uvalpha <= 4096U);
1910
1911
2/2
✓ Branch 0 taken 24576 times.
✓ Branch 1 taken 96 times.
24672 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1912 24576 int Y1 = (buf0[i * 2 ] + 64) >> 7;
1913 24576 int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
1914 24576 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha + (128 << 11)) >> 19;
1915 24576 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha + (128 << 11)) >> 19;
1916 int A1, A2;
1917 24576 const void *r = c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1918 24576 *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1919 24576 *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1920
1921
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24576 times.
24576 if (hasAlpha) {
1922 A1 = (abuf0[i * 2 ] + 64) >> 7;
1923 A2 = (abuf0[i * 2 + 1] + 64) >> 7;
1924 A1 = av_clip_uint8(A1);
1925 A2 = av_clip_uint8(A2);
1926 }
1927
1928
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 24576 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24576 times.
24576 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1929 r, g, b, y, target, hasAlpha);
1930 }
1931 }
1932 464316 }
1933
1934 #define YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1935 static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
1936 const int16_t **lumSrc, int lumFilterSize, \
1937 const int16_t *chrFilter, const int16_t **chrUSrc, \
1938 const int16_t **chrVSrc, int chrFilterSize, \
1939 const int16_t **alpSrc, uint8_t *dest, int dstW, \
1940 int y) \
1941 { \
1942 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
1943 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
1944 alpSrc, dest, dstW, y, fmt, hasAlpha); \
1945 }
1946
1947 #define YUV2RGBWRAPPERX2(name, base, ext, fmt, hasAlpha) \
1948 YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1949 static void name ## ext ## _2_c(SwsInternal *c, const int16_t *buf[2], \
1950 const int16_t *ubuf[2], const int16_t *vbuf[2], \
1951 const int16_t *abuf[2], uint8_t *dest, int dstW, \
1952 int yalpha, int uvalpha, int y) \
1953 { \
1954 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
1955 dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha); \
1956 }
1957
1958 #define YUV2RGBWRAPPER(name, base, ext, fmt, hasAlpha) \
1959 YUV2RGBWRAPPERX2(name, base, ext, fmt, hasAlpha) \
1960 static void name ## ext ## _1_c(SwsInternal *c, const int16_t *buf0, \
1961 const int16_t *ubuf[2], const int16_t *vbuf[2], \
1962 const int16_t *abuf0, uint8_t *dest, int dstW, \
1963 int uvalpha, int y) \
1964 { \
1965 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
1966 dstW, uvalpha, y, fmt, hasAlpha); \
1967 }
1968
1969 #if CONFIG_SMALL
1970 YUV2RGBWRAPPER(yuv2rgb,, 32_1, AV_PIX_FMT_RGB32_1, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1971 YUV2RGBWRAPPER(yuv2rgb,, 32, AV_PIX_FMT_RGB32, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1972 #else
1973 #if CONFIG_SWSCALE_ALPHA
1974 YUV2RGBWRAPPER(yuv2rgb,, a32_1, AV_PIX_FMT_RGB32_1, 1)
1975 YUV2RGBWRAPPER(yuv2rgb,, a32, AV_PIX_FMT_RGB32, 1)
1976 #endif
1977 97120 YUV2RGBWRAPPER(yuv2rgb,, x32_1, AV_PIX_FMT_RGB32_1, 0)
1978 330576 YUV2RGBWRAPPER(yuv2rgb,, x32, AV_PIX_FMT_RGB32, 0)
1979 #endif
1980 1435028 YUV2RGBWRAPPER(yuv2, rgb, rgb24, AV_PIX_FMT_RGB24, 0)
1981 319668 YUV2RGBWRAPPER(yuv2, rgb, bgr24, AV_PIX_FMT_BGR24, 0)
1982 343816 YUV2RGBWRAPPER(yuv2rgb,, 16, AV_PIX_FMT_RGB565, 0)
1983 609816 YUV2RGBWRAPPER(yuv2rgb,, 15, AV_PIX_FMT_RGB555, 0)
1984 75456 YUV2RGBWRAPPER(yuv2rgb,, 12, AV_PIX_FMT_RGB444, 0)
1985 247632 YUV2RGBWRAPPER(yuv2rgb,, 8, AV_PIX_FMT_RGB8, 0)
1986 64 YUV2RGBWRAPPER(yuv2rgb,, 4, AV_PIX_FMT_RGB4, 0)
1987 44992 YUV2RGBWRAPPER(yuv2rgb,, 4b, AV_PIX_FMT_RGB4_BYTE, 0)
1988 18432 YUV2RGBWRAPPER(yuv2, rgb, x2rgb10, AV_PIX_FMT_X2RGB10, 0)
1989 18432 YUV2RGBWRAPPER(yuv2, rgb, x2bgr10, AV_PIX_FMT_X2BGR10, 0)
1990
1991 348370372 static av_always_inline void yuv2rgb_write_full(SwsInternal *c,
1992 uint8_t *dest, int i, int Y, int A, int U, int V,
1993 int y, enum AVPixelFormat target, int hasAlpha, int err[4])
1994 {
1995 int R, G, B;
1996
4/4
✓ Branch 0 taken 331997578 times.
✓ Branch 1 taken 16372794 times.
✓ Branch 2 taken 10720797 times.
✓ Branch 3 taken 321276781 times.
348370372 int isrgb8 = target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8;
1997
1998 348370372 Y -= c->yuv2rgb_y_offset;
1999 348370372 Y *= c->yuv2rgb_y_coeff;
2000 348370372 Y += 1 << 21;
2001 348370372 R = (unsigned)Y + V*(unsigned)c->yuv2rgb_v2r_coeff;
2002 348370372 G = (unsigned)Y + V*(unsigned)c->yuv2rgb_v2g_coeff + U*(unsigned)c->yuv2rgb_u2g_coeff;
2003 348370372 B = (unsigned)Y + U*(unsigned)c->yuv2rgb_u2b_coeff;
2004
2/2
✓ Branch 0 taken 48158541 times.
✓ Branch 1 taken 300211831 times.
348370372 if ((R | G | B) & 0xC0000000) {
2005 48158541 R = av_clip_uintp2(R, 30);
2006 48158541 G = av_clip_uintp2(G, 30);
2007 48158541 B = av_clip_uintp2(B, 30);
2008 }
2009
2010
9/10
✓ Branch 0 taken 98432 times.
✓ Branch 1 taken 147656040 times.
✓ Branch 2 taken 98432 times.
✓ Branch 3 taken 98432 times.
✓ Branch 4 taken 54542884 times.
✓ Branch 5 taken 54885799 times.
✓ Branch 6 taken 23761984 times.
✓ Branch 7 taken 23761984 times.
✓ Branch 8 taken 43466385 times.
✗ Branch 9 not taken.
348370372 switch(target) {
2011 98432 case AV_PIX_FMT_ARGB:
2012
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 18432 times.
98432 dest[0] = hasAlpha ? A : 255;
2013 98432 dest[1] = R >> 22;
2014 98432 dest[2] = G >> 22;
2015 98432 dest[3] = B >> 22;
2016 98432 break;
2017 147656040 case AV_PIX_FMT_RGB24:
2018 147656040 dest[0] = R >> 22;
2019 147656040 dest[1] = G >> 22;
2020 147656040 dest[2] = B >> 22;
2021 147656040 break;
2022 98432 case AV_PIX_FMT_RGBA:
2023 98432 dest[0] = R >> 22;
2024 98432 dest[1] = G >> 22;
2025 98432 dest[2] = B >> 22;
2026
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 18432 times.
98432 dest[3] = hasAlpha ? A : 255;
2027 98432 break;
2028 98432 case AV_PIX_FMT_ABGR:
2029
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 18432 times.
98432 dest[0] = hasAlpha ? A : 255;
2030 98432 dest[1] = B >> 22;
2031 98432 dest[2] = G >> 22;
2032 98432 dest[3] = R >> 22;
2033 98432 break;
2034 54542884 case AV_PIX_FMT_BGR24:
2035 54542884 dest[0] = B >> 22;
2036 54542884 dest[1] = G >> 22;
2037 54542884 dest[2] = R >> 22;
2038 54542884 break;
2039 54885799 case AV_PIX_FMT_BGRA:
2040 54885799 dest[0] = B >> 22;
2041 54885799 dest[1] = G >> 22;
2042 54885799 dest[2] = R >> 22;
2043
2/2
✓ Branch 0 taken 3972007 times.
✓ Branch 1 taken 50913792 times.
54885799 dest[3] = hasAlpha ? A : 255;
2044 54885799 break;
2045 23761984 case AV_PIX_FMT_X2RGB10LE:
2046 23761984 R >>= 20;
2047 23761984 G >>= 20;
2048 23761984 B >>= 20;
2049 23761984 AV_WL32(dest, (3U << 30) + (R << 20) + (G << 10) + B);
2050 23761984 break;
2051 23761984 case AV_PIX_FMT_X2BGR10LE:
2052 23761984 R >>= 20;
2053 23761984 G >>= 20;
2054 23761984 B >>= 20;
2055 23761984 AV_WL32(dest, (3U << 30) + (B << 20) + (G << 10) + R);
2056 23761984 break;
2057 43466385 case AV_PIX_FMT_BGR4_BYTE:
2058 case AV_PIX_FMT_RGB4_BYTE:
2059 case AV_PIX_FMT_BGR8:
2060 case AV_PIX_FMT_RGB8:
2061 {
2062 int r,g,b;
2063
2064
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 43466385 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
43466385 switch (c->opts.dither) {
2065 case SWS_DITHER_NONE:
2066 if (isrgb8) {
2067 r = av_clip_uintp2(R >> 27, 3);
2068 g = av_clip_uintp2(G >> 27, 3);
2069 b = av_clip_uintp2(B >> 28, 2);
2070 } else {
2071 r = av_clip_uintp2(R >> 29, 1);
2072 g = av_clip_uintp2(G >> 28, 2);
2073 b = av_clip_uintp2(B >> 29, 1);
2074 }
2075 break;
2076 43466385 default:
2077 case SWS_DITHER_AUTO:
2078 case SWS_DITHER_ED:
2079 43466385 R >>= 22;
2080 43466385 G >>= 22;
2081 43466385 B >>= 22;
2082 43466385 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;
2083 43466385 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;
2084 43466385 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;
2085 43466385 c->dither_error[0][i] = err[0];
2086 43466385 c->dither_error[1][i] = err[1];
2087 43466385 c->dither_error[2][i] = err[2];
2088
2/2
✓ Branch 0 taken 27093591 times.
✓ Branch 1 taken 16372794 times.
43466385 r = R >> (isrgb8 ? 5 : 7);
2089
2/2
✓ Branch 0 taken 27093591 times.
✓ Branch 1 taken 16372794 times.
43466385 g = G >> (isrgb8 ? 5 : 6);
2090
2/2
✓ Branch 0 taken 27093591 times.
✓ Branch 1 taken 16372794 times.
43466385 b = B >> (isrgb8 ? 6 : 7);
2091
2/2
✓ Branch 0 taken 27093591 times.
✓ Branch 1 taken 16372794 times.
43466385 r = av_clip(r, 0, isrgb8 ? 7 : 1);
2092
2/2
✓ Branch 0 taken 27093591 times.
✓ Branch 1 taken 16372794 times.
43466385 g = av_clip(g, 0, isrgb8 ? 7 : 3);
2093
2/2
✓ Branch 0 taken 27093591 times.
✓ Branch 1 taken 16372794 times.
43466385 b = av_clip(b, 0, isrgb8 ? 3 : 1);
2094
2/2
✓ Branch 0 taken 27093591 times.
✓ Branch 1 taken 16372794 times.
43466385 err[0] = R - r*(isrgb8 ? 36 : 255);
2095
2/2
✓ Branch 0 taken 27093591 times.
✓ Branch 1 taken 16372794 times.
43466385 err[1] = G - g*(isrgb8 ? 36 : 85);
2096
2/2
✓ Branch 0 taken 27093591 times.
✓ Branch 1 taken 16372794 times.
43466385 err[2] = B - b*(isrgb8 ? 85 : 255);
2097 43466385 break;
2098 case SWS_DITHER_A_DITHER:
2099 if (isrgb8) {
2100 /* see http://pippin.gimp.org/a_dither/ for details/origin */
2101 #define A_DITHER(u,v) (((((u)+((v)*236))*119)&0xff))
2102 r = (((R >> 19) + A_DITHER(i,y) -96)>>8);
2103 g = (((G >> 19) + A_DITHER(i + 17,y) - 96)>>8);
2104 b = (((B >> 20) + A_DITHER(i + 17*2,y) -96)>>8);
2105 r = av_clip_uintp2(r, 3);
2106 g = av_clip_uintp2(g, 3);
2107 b = av_clip_uintp2(b, 2);
2108 } else {
2109 r = (((R >> 21) + A_DITHER(i,y)-256)>>8);
2110 g = (((G >> 19) + A_DITHER(i + 17,y)-256)>>8);
2111 b = (((B >> 21) + A_DITHER(i + 17*2,y)-256)>>8);
2112 r = av_clip_uintp2(r, 1);
2113 g = av_clip_uintp2(g, 2);
2114 b = av_clip_uintp2(b, 1);
2115 }
2116 break;
2117 case SWS_DITHER_X_DITHER:
2118 if (isrgb8) {
2119 /* see http://pippin.gimp.org/a_dither/ for details/origin */
2120 #define X_DITHER(u,v) (((((u)^((v)*237))*181)&0x1ff)/2)
2121 r = (((R >> 19) + X_DITHER(i,y) - 96)>>8);
2122 g = (((G >> 19) + X_DITHER(i + 17,y) - 96)>>8);
2123 b = (((B >> 20) + X_DITHER(i + 17*2,y) - 96)>>8);
2124 r = av_clip_uintp2(r, 3);
2125 g = av_clip_uintp2(g, 3);
2126 b = av_clip_uintp2(b, 2);
2127 } else {
2128 r = (((R >> 21) + X_DITHER(i,y)-256)>>8);
2129 g = (((G >> 19) + X_DITHER(i + 17,y)-256)>>8);
2130 b = (((B >> 21) + X_DITHER(i + 17*2,y)-256)>>8);
2131 r = av_clip_uintp2(r, 1);
2132 g = av_clip_uintp2(g, 2);
2133 b = av_clip_uintp2(b, 1);
2134 }
2135
2136 break;
2137 }
2138
2139
2/2
✓ Branch 0 taken 8186397 times.
✓ Branch 1 taken 35279988 times.
43466385 if(target == AV_PIX_FMT_BGR4_BYTE) {
2140 8186397 dest[0] = r + 2*g + 8*b;
2141
2/2
✓ Branch 0 taken 8186397 times.
✓ Branch 1 taken 27093591 times.
35279988 } else if(target == AV_PIX_FMT_RGB4_BYTE) {
2142 8186397 dest[0] = b + 2*g + 8*r;
2143
2/2
✓ Branch 0 taken 16372794 times.
✓ Branch 1 taken 10720797 times.
27093591 } else if(target == AV_PIX_FMT_BGR8) {
2144 16372794 dest[0] = r + 8*g + 64*b;
2145
1/2
✓ Branch 0 taken 10720797 times.
✗ Branch 1 not taken.
10720797 } else if(target == AV_PIX_FMT_RGB8) {
2146 10720797 dest[0] = b + 4*g + 32*r;
2147 } else
2148 av_assert2(0);
2149 43466385 break;}
2150 }
2151 348370372 }
2152
2153 static av_always_inline void
2154 12235 yuv2rgb_full_X_c_template(SwsInternal *c, const int16_t *lumFilter,
2155 const int16_t **lumSrc, int lumFilterSize,
2156 const int16_t *chrFilter, const int16_t **chrUSrc,
2157 const int16_t **chrVSrc, int chrFilterSize,
2158 const int16_t **alpSrc, uint8_t *dest,
2159 int dstW, int y, enum AVPixelFormat target, int hasAlpha)
2160 {
2161 int i;
2162
4/4
✓ Branch 0 taken 10423 times.
✓ Branch 1 taken 1812 times.
✓ Branch 2 taken 822 times.
✓ Branch 3 taken 9601 times.
12235 int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2163 12235 int err[4] = {0};
2164 12235 int A = 0; //init to silence warning
2165
2166
4/4
✓ Branch 0 taken 12035 times.
✓ Branch 1 taken 200 times.
✓ Branch 2 taken 11835 times.
✓ Branch 3 taken 200 times.
12235 if( target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2167
4/4
✓ Branch 0 taken 11435 times.
✓ Branch 1 taken 400 times.
✓ Branch 2 taken 200 times.
✓ Branch 3 taken 11235 times.
11835 || target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8)
2168 1000 step = 1;
2169
2170
2/2
✓ Branch 0 taken 5205275 times.
✓ Branch 1 taken 12235 times.
5217510 for (i = 0; i < dstW; i++) {
2171 int j;
2172 5205275 int Y = 1<<9;
2173 5205275 int U = (1<<9)-(128 << 19);
2174 5205275 int V = (1<<9)-(128 << 19);
2175
2176
2/2
✓ Branch 0 taken 25219196 times.
✓ Branch 1 taken 5205275 times.
30424471 for (j = 0; j < lumFilterSize; j++) {
2177 25219196 Y += lumSrc[j][i] * lumFilter[j];
2178 }
2179
2/2
✓ Branch 0 taken 26678900 times.
✓ Branch 1 taken 5205275 times.
31884175 for (j = 0; j < chrFilterSize; j++) {
2180 26678900 U += chrUSrc[j][i] * chrFilter[j];
2181 26678900 V += chrVSrc[j][i] * chrFilter[j];
2182 }
2183 5205275 Y >>= 10;
2184 5205275 U >>= 10;
2185 5205275 V >>= 10;
2186
2/2
✓ Branch 0 taken 4212007 times.
✓ Branch 1 taken 993268 times.
5205275 if (hasAlpha) {
2187 4212007 A = 1 << 18;
2188
2/2
✓ Branch 0 taken 19408028 times.
✓ Branch 1 taken 4212007 times.
23620035 for (j = 0; j < lumFilterSize; j++) {
2189 19408028 A += alpSrc[j][i] * lumFilter[j];
2190 }
2191 4212007 A >>= 19;
2192
1/2
✓ Branch 0 taken 4212007 times.
✗ Branch 1 not taken.
4212007 if (A & 0x100)
2193 4212007 A = av_clip_uint8(A);
2194 }
2195 5205275 yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2196 5205275 dest += step;
2197 }
2198 12235 c->dither_error[0][i] = err[0];
2199 12235 c->dither_error[1][i] = err[1];
2200 12235 c->dither_error[2][i] = err[2];
2201 12235 }
2202
2203 static av_always_inline void
2204 yuv2rgb_full_2_c_template(SwsInternal *c, const int16_t *buf[2],
2205 const int16_t *ubuf[2], const int16_t *vbuf[2],
2206 const int16_t *abuf[2], uint8_t *dest, int dstW,
2207 int yalpha, int uvalpha, int y,
2208 enum AVPixelFormat target, int hasAlpha)
2209 {
2210 const int16_t *buf0 = buf[0], *buf1 = buf[1],
2211 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
2212 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
2213 *abuf0 = hasAlpha ? abuf[0] : NULL,
2214 *abuf1 = hasAlpha ? abuf[1] : NULL;
2215 int yalpha1 = 4096 - yalpha;
2216 int uvalpha1 = 4096 - uvalpha;
2217 int i;
2218 int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2219 int err[4] = {0};
2220 int A = 0; // init to silcene warning
2221
2222 av_assert2(yalpha <= 4096U);
2223 av_assert2(uvalpha <= 4096U);
2224
2225 if( target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2226 || target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8)
2227 step = 1;
2228
2229 for (i = 0; i < dstW; i++) {
2230 int Y = ( buf0[i] * yalpha1 + buf1[i] * yalpha ) >> 10; //FIXME rounding
2231 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha-(128 << 19)) >> 10;
2232 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha-(128 << 19)) >> 10;
2233
2234 if (hasAlpha) {
2235 A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha + (1<<18)) >> 19;
2236 if (A & 0x100)
2237 A = av_clip_uint8(A);
2238 }
2239
2240 yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2241 dest += step;
2242 }
2243 c->dither_error[0][i] = err[0];
2244 c->dither_error[1][i] = err[1];
2245 c->dither_error[2][i] = err[2];
2246 }
2247
2248 static av_always_inline void
2249 1059981 yuv2rgb_full_1_c_template(SwsInternal *c, const int16_t *buf0,
2250 const int16_t *ubuf[2], const int16_t *vbuf[2],
2251 const int16_t *abuf0, uint8_t *dest, int dstW,
2252 int uvalpha, int y, enum AVPixelFormat target,
2253 int hasAlpha)
2254 {
2255 1059981 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
2256 int i;
2257
4/4
✓ Branch 0 taken 639305 times.
✓ Branch 1 taken 420676 times.
✓ Branch 2 taken 157288 times.
✓ Branch 3 taken 482017 times.
1059981 int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2258 1059981 int err[4] = {0};
2259
2260
4/4
✓ Branch 0 taken 1022440 times.
✓ Branch 1 taken 37541 times.
✓ Branch 2 taken 984899 times.
✓ Branch 3 taken 37541 times.
1059981 if( target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2261
4/4
✓ Branch 0 taken 909817 times.
✓ Branch 1 taken 75082 times.
✓ Branch 2 taken 44741 times.
✓ Branch 3 taken 865076 times.
984899 || target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8)
2262 194905 step = 1;
2263
2264
1/2
✓ Branch 0 taken 1059981 times.
✗ Branch 1 not taken.
1059981 if (uvalpha == 0) {
2265 1059981 int A = 0; //init to silence warning
2266
2/2
✓ Branch 0 taken 343165097 times.
✓ Branch 1 taken 1059981 times.
344225078 for (i = 0; i < dstW; i++) {
2267 343165097 int Y = buf0[i] * 4;
2268 343165097 int U = (ubuf0[i] - (128<<7)) * 4;
2269 343165097 int V = (vbuf0[i] - (128<<7)) * 4;
2270
2271
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 343165097 times.
343165097 if (hasAlpha) {
2272 A = (abuf0[i] + 64) >> 7;
2273 if (A & 0x100)
2274 A = av_clip_uint8(A);
2275 }
2276
2277 343165097 yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2278 343165097 dest += step;
2279 }
2280 } else {
2281 const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
2282 int A = 0; //init to silence warning
2283 int uvalpha1 = 4096 - uvalpha;
2284 av_assert2(uvalpha <= 4096U);
2285
2286 for (i = 0; i < dstW; i++) {
2287 int Y = buf0[i] * 4;
2288 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 19)) >> 10;
2289 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 19)) >> 10;
2290
2291 if (hasAlpha) {
2292 A = (abuf0[i] + 64) >> 7;
2293 if (A & 0x100)
2294 A = av_clip_uint8(A);
2295 }
2296
2297 yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2298 dest += step;
2299 }
2300 }
2301
2302 1059981 c->dither_error[0][i] = err[0];
2303 1059981 c->dither_error[1][i] = err[1];
2304 1059981 c->dither_error[2][i] = err[2];
2305 1059981 }
2306
2307 #if CONFIG_SMALL
2308 YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2309 YUV2RGBWRAPPER(yuv2, rgb_full, abgr32_full, AV_PIX_FMT_ABGR, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2310 YUV2RGBWRAPPER(yuv2, rgb_full, rgba32_full, AV_PIX_FMT_RGBA, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2311 YUV2RGBWRAPPER(yuv2, rgb_full, argb32_full, AV_PIX_FMT_ARGB, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2312 #else
2313 #if CONFIG_SWSCALE_ALPHA
2314 14002 YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA, 1)
2315 800 YUV2RGBWRAPPER(yuv2, rgb_full, abgr32_full, AV_PIX_FMT_ABGR, 1)
2316 800 YUV2RGBWRAPPER(yuv2, rgb_full, rgba32_full, AV_PIX_FMT_RGBA, 1)
2317 800 YUV2RGBWRAPPER(yuv2, rgb_full, argb32_full, AV_PIX_FMT_ARGB, 1)
2318 #endif
2319 303504 YUV2RGBWRAPPER(yuv2, rgb_full, bgrx32_full, AV_PIX_FMT_BGRA, 0)
2320 384 YUV2RGBWRAPPER(yuv2, rgb_full, xbgr32_full, AV_PIX_FMT_ABGR, 0)
2321 384 YUV2RGBWRAPPER(yuv2, rgb_full, rgbx32_full, AV_PIX_FMT_RGBA, 0)
2322 384 YUV2RGBWRAPPER(yuv2, rgb_full, xrgb32_full, AV_PIX_FMT_ARGB, 0)
2323 #endif
2324 316220 YUV2RGBWRAPPER(yuv2, rgb_full, bgr24_full, AV_PIX_FMT_BGR24, 0)
2325 844976 YUV2RGBWRAPPER(yuv2, rgb_full, rgb24_full, AV_PIX_FMT_RGB24, 0)
2326
2327 75482 YUV2RGBWRAPPER(yuv2, rgb_full, bgr4_byte_full, AV_PIX_FMT_BGR4_BYTE, 0)
2328 75482 YUV2RGBWRAPPER(yuv2, rgb_full, rgb4_byte_full, AV_PIX_FMT_RGB4_BYTE, 0)
2329 150964 YUV2RGBWRAPPER(yuv2, rgb_full, bgr8_full, AV_PIX_FMT_BGR8, 0)
2330 89882 YUV2RGBWRAPPER(yuv2, rgb_full, rgb8_full, AV_PIX_FMT_RGB8, 0)
2331
2332 135184 YUV2RGBWRAPPER(yuv2, rgb_full, x2rgb10_full, AV_PIX_FMT_X2RGB10LE, 0)
2333 135184 YUV2RGBWRAPPER(yuv2, rgb_full, x2bgr10_full, AV_PIX_FMT_X2BGR10LE, 0)
2334
2335 static void
2336 2617608 yuv2gbrp_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2337 const int16_t **lumSrc, int lumFilterSize,
2338 const int16_t *chrFilter, const int16_t **chrUSrc,
2339 const int16_t **chrVSrc, int chrFilterSize,
2340 const int16_t **alpSrc, uint8_t **dest,
2341 int dstW, int y)
2342 {
2343 2617608 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2344 int i;
2345
4/4
✓ Branch 0 taken 123878 times.
✓ Branch 1 taken 2493730 times.
✓ Branch 2 taken 1760 times.
✓ Branch 3 taken 122118 times.
2617608 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrc;
2346 2617608 uint16_t **dest16 = (uint16_t**)dest;
2347 2617608 int SH = 22 + 8 - desc->comp[0].depth;
2348 2617608 int A = 0; // init to silence warning
2349
2350
2/2
✓ Branch 0 taken 919480848 times.
✓ Branch 1 taken 2617608 times.
922098456 for (i = 0; i < dstW; i++) {
2351 int j;
2352 919480848 int Y = 1 << 9;
2353 919480848 int U = (1 << 9) - (128 << 19);
2354 919480848 int V = (1 << 9) - (128 << 19);
2355 int R, G, B;
2356
2357
2/2
✓ Branch 0 taken 929406448 times.
✓ Branch 1 taken 919480848 times.
1848887296 for (j = 0; j < lumFilterSize; j++)
2358 929406448 Y += lumSrc[j][i] * lumFilter[j];
2359
2360
2/2
✓ Branch 0 taken 1874678944 times.
✓ Branch 1 taken 919480848 times.
2794159792 for (j = 0; j < chrFilterSize; j++) {
2361 1874678944 U += chrUSrc[j][i] * chrFilter[j];
2362 1874678944 V += chrVSrc[j][i] * chrFilter[j];
2363 }
2364
2365 919480848 Y >>= 10;
2366 919480848 U >>= 10;
2367 919480848 V >>= 10;
2368
2369
2/2
✓ Branch 0 taken 344320 times.
✓ Branch 1 taken 919136528 times.
919480848 if (hasAlpha) {
2370 344320 A = 1 << 18;
2371
2372
2/2
✓ Branch 0 taken 3826320 times.
✓ Branch 1 taken 344320 times.
4170640 for (j = 0; j < lumFilterSize; j++)
2373 3826320 A += alpSrc[j][i] * lumFilter[j];
2374
2375
2/2
✓ Branch 0 taken 300275 times.
✓ Branch 1 taken 44045 times.
344320 if (A & 0xF8000000)
2376 300275 A = av_clip_uintp2(A, 27);
2377 }
2378
2379 919480848 Y -= c->yuv2rgb_y_offset;
2380 919480848 Y *= c->yuv2rgb_y_coeff;
2381 919480848 Y += 1 << (SH-1);
2382 919480848 R = Y + V * (unsigned)c->yuv2rgb_v2r_coeff;
2383 919480848 G = Y + V * (unsigned)c->yuv2rgb_v2g_coeff + U * (unsigned)c->yuv2rgb_u2g_coeff;
2384 919480848 B = Y + U * (unsigned)c->yuv2rgb_u2b_coeff;
2385
2386
2/2
✓ Branch 0 taken 281373782 times.
✓ Branch 1 taken 638107066 times.
919480848 if ((R | G | B) & 0xC0000000) {
2387 281373782 R = av_clip_uintp2(R, 30);
2388 281373782 G = av_clip_uintp2(G, 30);
2389 281373782 B = av_clip_uintp2(B, 30);
2390 }
2391
2392
2/2
✓ Branch 0 taken 638664592 times.
✓ Branch 1 taken 280816256 times.
919480848 if (SH != 22) {
2393 638664592 dest16[0][i] = G >> SH;
2394 638664592 dest16[1][i] = B >> SH;
2395 638664592 dest16[2][i] = R >> SH;
2396
2/2
✓ Branch 0 taken 291456 times.
✓ Branch 1 taken 638373136 times.
638664592 if (hasAlpha)
2397 291456 dest16[3][i] = A >> (SH - 3);
2398 } else {
2399 280816256 dest[0][i] = G >> 22;
2400 280816256 dest[1][i] = B >> 22;
2401 280816256 dest[2][i] = R >> 22;
2402
2/2
✓ Branch 0 taken 52864 times.
✓ Branch 1 taken 280763392 times.
280816256 if (hasAlpha)
2403 52864 dest[3][i] = A >> 19;
2404 }
2405 }
2406
4/4
✓ Branch 0 taken 1819588 times.
✓ Branch 1 taken 798020 times.
✓ Branch 3 taken 219960 times.
✓ Branch 4 taken 1599628 times.
2617608 if (SH != 22 && (!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2407
2/2
✓ Branch 0 taken 77077440 times.
✓ Branch 1 taken 219960 times.
77297400 for (i = 0; i < dstW; i++) {
2408 77077440 dest16[0][i] = av_bswap16(dest16[0][i]);
2409 77077440 dest16[1][i] = av_bswap16(dest16[1][i]);
2410 77077440 dest16[2][i] = av_bswap16(dest16[2][i]);
2411
2/2
✓ Branch 0 taken 145728 times.
✓ Branch 1 taken 76931712 times.
77077440 if (hasAlpha)
2412 145728 dest16[3][i] = av_bswap16(dest16[3][i]);
2413 }
2414 }
2415 2617608 }
2416
2417 static void
2418 39008 yuv2gbrpmsb_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2419 const int16_t **lumSrc, int lumFilterSize,
2420 const int16_t *chrFilter, const int16_t **chrUSrc,
2421 const int16_t **chrVSrc, int chrFilterSize,
2422 const int16_t **alpSrc, uint8_t **dest,
2423 int dstW, int y)
2424 {
2425 39008 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2426
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 39008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
39008 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrc;
2427 39008 uint16_t **dest16 = (uint16_t**)dest;
2428 39008 int shift = 16 - desc->comp[0].depth;
2429 int i;
2430
2431 39008 yuv2gbrp_full_X_c(c, lumFilter, lumSrc, lumFilterSize,
2432 chrFilter, chrUSrc, chrVSrc, chrFilterSize,
2433 alpSrc, dest, dstW, y);
2434
2435
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 39008 times.
39008 if (desc->comp[0].depth <= 8)
2436 return;
2437
2438
2/2
✓ Branch 1 taken 18832 times.
✓ Branch 2 taken 20176 times.
39008 if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2439
2/2
✓ Branch 0 taken 6568064 times.
✓ Branch 1 taken 18832 times.
6586896 for (i = 0; i < dstW; i++) {
2440 6568064 dest16[0][i] = av_bswap16(av_bswap16(dest16[0][i]) << shift);
2441 6568064 dest16[1][i] = av_bswap16(av_bswap16(dest16[1][i]) << shift);
2442 6568064 dest16[2][i] = av_bswap16(av_bswap16(dest16[2][i]) << shift);
2443
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6568064 times.
6568064 if (hasAlpha)
2444 dest16[3][i] = av_bswap16(av_bswap16(dest16[3][i]) << shift);
2445 }
2446 } else {
2447
2/2
✓ Branch 0 taken 6992000 times.
✓ Branch 1 taken 20176 times.
7012176 for (i = 0; i < dstW; i++) {
2448 6992000 dest16[0][i] = dest16[0][i] << shift;
2449 6992000 dest16[1][i] = dest16[1][i] << shift;
2450 6992000 dest16[2][i] = dest16[2][i] << shift;
2451
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6992000 times.
6992000 if (hasAlpha)
2452 dest16[3][i] = dest16[3][i] << shift;
2453 }
2454 }
2455 }
2456
2457 static void
2458 362604 yuv2gbrp16_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2459 const int16_t **lumSrcx, int lumFilterSize,
2460 const int16_t *chrFilter, const int16_t **chrUSrcx,
2461 const int16_t **chrVSrcx, int chrFilterSize,
2462 const int16_t **alpSrcx, uint8_t **dest,
2463 int dstW, int y)
2464 {
2465 362604 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2466 int i;
2467
4/4
✓ Branch 0 taken 27798 times.
✓ Branch 1 taken 334806 times.
✓ Branch 2 taken 724 times.
✓ Branch 3 taken 27074 times.
362604 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrcx;
2468 362604 uint16_t **dest16 = (uint16_t**)dest;
2469 362604 const int32_t **lumSrc = (const int32_t**)lumSrcx;
2470 362604 const int32_t **chrUSrc = (const int32_t**)chrUSrcx;
2471 362604 const int32_t **chrVSrc = (const int32_t**)chrVSrcx;
2472 362604 const int32_t **alpSrc = (const int32_t**)alpSrcx;
2473
2474
2/2
✓ Branch 0 taken 127363264 times.
✓ Branch 1 taken 362604 times.
127725868 for (i = 0; i < dstW; i++) {
2475 int j;
2476 127363264 int Y = -0x40000000;
2477 127363264 int U = -(128 << 23);
2478 127363264 int V = -(128 << 23);
2479 int R, G, B, A;
2480
2481
2/2
✓ Branch 0 taken 129444864 times.
✓ Branch 1 taken 127363264 times.
256808128 for (j = 0; j < lumFilterSize; j++)
2482 129444864 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2483
2484
2/2
✓ Branch 0 taken 218250240 times.
✓ Branch 1 taken 127363264 times.
345613504 for (j = 0; j < chrFilterSize; j++) {
2485 218250240 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2486 218250240 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2487 }
2488
2489 127363264 Y >>= 14;
2490 127363264 Y += 0x10000;
2491 127363264 U >>= 14;
2492 127363264 V >>= 14;
2493
2494
2/2
✓ Branch 0 taken 118688 times.
✓ Branch 1 taken 127244576 times.
127363264 if (hasAlpha) {
2495 118688 A = -0x40000000;
2496
2497
2/2
✓ Branch 0 taken 1159488 times.
✓ Branch 1 taken 118688 times.
1278176 for (j = 0; j < lumFilterSize; j++)
2498 1159488 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2499
2500 118688 A >>= 1;
2501 118688 A += 0x20002000;
2502 }
2503
2504 127363264 Y -= c->yuv2rgb_y_offset;
2505 127363264 Y *= c->yuv2rgb_y_coeff;
2506 127363264 Y += (1 << 13) - (1 << 29);
2507 127363264 R = V * c->yuv2rgb_v2r_coeff;
2508 127363264 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
2509 127363264 B = U * c->yuv2rgb_u2b_coeff;
2510
2511 127363264 dest16[2][i] = av_clip_uintp2(((Y + R) >> 14) + (1<<15), 16);
2512 127363264 dest16[0][i] = av_clip_uintp2(((Y + G) >> 14) + (1<<15), 16);
2513 127363264 dest16[1][i] = av_clip_uintp2(((Y + B) >> 14) + (1<<15), 16);
2514
2515
2/2
✓ Branch 0 taken 118688 times.
✓ Branch 1 taken 127244576 times.
127363264 if (hasAlpha)
2516 118688 dest16[3][i] = av_clip_uintp2(A, 30) >> 14;
2517 }
2518
2/2
✓ Branch 1 taken 124168 times.
✓ Branch 2 taken 238436 times.
362604 if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2519
2/2
✓ Branch 0 taken 43520576 times.
✓ Branch 1 taken 124168 times.
43644744 for (i = 0; i < dstW; i++) {
2520 43520576 dest16[0][i] = av_bswap16(dest16[0][i]);
2521 43520576 dest16[1][i] = av_bswap16(dest16[1][i]);
2522 43520576 dest16[2][i] = av_bswap16(dest16[2][i]);
2523
2/2
✓ Branch 0 taken 65824 times.
✓ Branch 1 taken 43454752 times.
43520576 if (hasAlpha)
2524 65824 dest16[3][i] = av_bswap16(dest16[3][i]);
2525 }
2526 }
2527 362604 }
2528
2529 static void
2530 84691 yuv2gbrpf32_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2531 const int16_t **lumSrcx, int lumFilterSize,
2532 const int16_t *chrFilter, const int16_t **chrUSrcx,
2533 const int16_t **chrVSrcx, int chrFilterSize,
2534 const int16_t **alpSrcx, uint8_t **dest,
2535 int dstW, int y)
2536 {
2537 84691 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2538 int i;
2539
4/4
✓ Branch 0 taken 38145 times.
✓ Branch 1 taken 46546 times.
✓ Branch 2 taken 3585 times.
✓ Branch 3 taken 34560 times.
84691 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrcx;
2540 84691 uint32_t **dest32 = (uint32_t**)dest;
2541 84691 const int32_t **lumSrc = (const int32_t**)lumSrcx;
2542 84691 const int32_t **chrUSrc = (const int32_t**)chrUSrcx;
2543 84691 const int32_t **chrVSrc = (const int32_t**)chrVSrcx;
2544 84691 const int32_t **alpSrc = (const int32_t**)alpSrcx;
2545 static const float float_mult = 1.0f / 65535.0f;
2546
2547
2/2
✓ Branch 0 taken 30848054 times.
✓ Branch 1 taken 84691 times.
30932745 for (i = 0; i < dstW; i++) {
2548 int j;
2549 30848054 int Y = -0x40000000;
2550 30848054 int U = -(128 << 23);
2551 30848054 int V = -(128 << 23);
2552 int R, G, B, A;
2553
2554
2/2
✓ Branch 0 taken 32929654 times.
✓ Branch 1 taken 30848054 times.
63777708 for (j = 0; j < lumFilterSize; j++)
2555 32929654 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2556
2557
2/2
✓ Branch 0 taken 114435958 times.
✓ Branch 1 taken 30848054 times.
145284012 for (j = 0; j < chrFilterSize; j++) {
2558 114435958 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2559 114435958 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2560 }
2561
2562 30848054 Y >>= 14;
2563 30848054 Y += 0x10000;
2564 30848054 U >>= 14;
2565 30848054 V >>= 14;
2566
2567
2/2
✓ Branch 0 taken 1926539 times.
✓ Branch 1 taken 28921515 times.
30848054 if (hasAlpha) {
2568 1926539 A = -0x40000000;
2569
2570
2/2
✓ Branch 0 taken 2967339 times.
✓ Branch 1 taken 1926539 times.
4893878 for (j = 0; j < lumFilterSize; j++)
2571 2967339 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2572
2573 1926539 A >>= 1;
2574 1926539 A += 0x20002000;
2575 }
2576
2577 30848054 Y -= c->yuv2rgb_y_offset;
2578 30848054 Y *= c->yuv2rgb_y_coeff;
2579 30848054 Y += (1 << 13) - (1 << 29);
2580 30848054 R = V * c->yuv2rgb_v2r_coeff;
2581 30848054 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
2582 30848054 B = U * c->yuv2rgb_u2b_coeff;
2583
2584 30848054 R = av_clip_uintp2(((Y + R) >> 14) + (1<<15), 16);
2585 30848054 G = av_clip_uintp2(((Y + G) >> 14) + (1<<15), 16);
2586 30848054 B = av_clip_uintp2(((Y + B) >> 14) + (1<<15), 16);
2587
2588 30848054 dest32[0][i] = av_float2int(float_mult * (float)G);
2589 30848054 dest32[1][i] = av_float2int(float_mult * (float)B);
2590 30848054 dest32[2][i] = av_float2int(float_mult * (float)R);
2591
2/2
✓ Branch 0 taken 1926539 times.
✓ Branch 1 taken 28921515 times.
30848054 if (hasAlpha)
2592 1926539 dest32[3][i] = av_float2int(float_mult * (float)(av_clip_uintp2(A, 30) >> 14));
2593 }
2594
2/2
✓ Branch 1 taken 23008 times.
✓ Branch 2 taken 61683 times.
84691 if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2595
2/2
✓ Branch 0 taken 8013056 times.
✓ Branch 1 taken 23008 times.
8036064 for (i = 0; i < dstW; i++) {
2596 8013056 dest32[0][i] = av_bswap32(dest32[0][i]);
2597 8013056 dest32[1][i] = av_bswap32(dest32[1][i]);
2598 8013056 dest32[2][i] = av_bswap32(dest32[2][i]);
2599
2/2
✓ Branch 0 taken 52864 times.
✓ Branch 1 taken 7960192 times.
8013056 if (hasAlpha)
2600 52864 dest32[3][i] = av_bswap32(dest32[3][i]);
2601 }
2602 }
2603 84691 }
2604
2605 static void
2606 yuv2ya8_1_c(SwsInternal *c, const int16_t *buf0,
2607 const int16_t *ubuf[2], const int16_t *vbuf[2],
2608 const int16_t *abuf0, uint8_t *dest, int dstW,
2609 int uvalpha, int y)
2610 {
2611 int hasAlpha = !!abuf0;
2612 int i;
2613
2614 for (i = 0; i < dstW; i++) {
2615 int Y = (buf0[i] + 64) >> 7;
2616 int A;
2617
2618 Y = av_clip_uint8(Y);
2619
2620 if (hasAlpha) {
2621 A = (abuf0[i] + 64) >> 7;
2622 if (A & 0x100)
2623 A = av_clip_uint8(A);
2624 }
2625
2626 dest[i * 2 ] = Y;
2627 dest[i * 2 + 1] = hasAlpha ? A : 255;
2628 }
2629 }
2630
2631 static void
2632 yuv2ya8_2_c(SwsInternal *c, const int16_t *buf[2],
2633 const int16_t *ubuf[2], const int16_t *vbuf[2],
2634 const int16_t *abuf[2], uint8_t *dest, int dstW,
2635 int yalpha, int uvalpha, int y)
2636 {
2637 int hasAlpha = abuf && abuf[0] && abuf[1];
2638 const int16_t *buf0 = buf[0], *buf1 = buf[1],
2639 *abuf0 = hasAlpha ? abuf[0] : NULL,
2640 *abuf1 = hasAlpha ? abuf[1] : NULL;
2641 int yalpha1 = 4096 - yalpha;
2642 int i;
2643
2644 av_assert2(yalpha <= 4096U);
2645
2646 for (i = 0; i < dstW; i++) {
2647 int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 19;
2648 int A;
2649
2650 Y = av_clip_uint8(Y);
2651
2652 if (hasAlpha) {
2653 A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 19;
2654 A = av_clip_uint8(A);
2655 }
2656
2657 dest[i * 2 ] = Y;
2658 dest[i * 2 + 1] = hasAlpha ? A : 255;
2659 }
2660 }
2661
2662 static void
2663 9992 yuv2ya8_X_c(SwsInternal *c, const int16_t *lumFilter,
2664 const int16_t **lumSrc, int lumFilterSize,
2665 const int16_t *chrFilter, const int16_t **chrUSrc,
2666 const int16_t **chrVSrc, int chrFilterSize,
2667 const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
2668 {
2669 9992 int hasAlpha = !!alpSrc;
2670 int i;
2671
2672
2/2
✓ Branch 0 taken 3486784 times.
✓ Branch 1 taken 9992 times.
3496776 for (i = 0; i < dstW; i++) {
2673 int j;
2674 3486784 int Y = 1 << 18, A = 1 << 18;
2675
2676
2/2
✓ Branch 0 taken 3926784 times.
✓ Branch 1 taken 3486784 times.
7413568 for (j = 0; j < lumFilterSize; j++)
2677 3926784 Y += lumSrc[j][i] * lumFilter[j];
2678
2679 3486784 Y >>= 19;
2680
2/2
✓ Branch 0 taken 19122 times.
✓ Branch 1 taken 3467662 times.
3486784 if (Y & 0x100)
2681 19122 Y = av_clip_uint8(Y);
2682
2683
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 3446784 times.
3486784 if (hasAlpha) {
2684
2/2
✓ Branch 0 taken 480000 times.
✓ Branch 1 taken 40000 times.
520000 for (j = 0; j < lumFilterSize; j++)
2685 480000 A += alpSrc[j][i] * lumFilter[j];
2686
2687 40000 A >>= 19;
2688
2689
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 40000 times.
40000 if (A & 0x100)
2690 A = av_clip_uint8(A);
2691 }
2692
2693 3486784 dest[2 * i ] = Y;
2694
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 3446784 times.
3486784 dest[2 * i + 1] = hasAlpha ? A : 255;
2695 }
2696 9992 }
2697
2698 #define output_pixels(pos, val) \
2699 if (is_be) { \
2700 AV_WB16(pos, val); \
2701 } else { \
2702 AV_WL16(pos, val); \
2703 }
2704
2705 static av_always_inline void
2706 247328 yuv2ayuv64_X_c(SwsInternal *c, const int16_t *lumFilter,
2707 const int16_t **_lumSrc, int lumFilterSize,
2708 const int16_t *chrFilter, const int16_t **_chrUSrc,
2709 const int16_t **_chrVSrc, int chrFilterSize,
2710 const int16_t **_alpSrc, uint8_t *dest, int dstW, int y,
2711 int A_offset, int Y_offset, int U_offset, int V_offset, int is_be)
2712 {
2713 247328 const int32_t **lumSrc = (const int32_t **) _lumSrc,
2714 247328 **chrUSrc = (const int32_t **) _chrUSrc,
2715 247328 **chrVSrc = (const int32_t **) _chrVSrc,
2716 247328 **alpSrc = (const int32_t **) _alpSrc;
2717 247328 int hasAlpha = !!alpSrc;
2718 int i;
2719
2720
2/2
✓ Branch 0 taken 86937856 times.
✓ Branch 1 taken 247328 times.
87185184 for (i = 0; i < dstW; i++) {
2721 86937856 int Y = 1 << 14, U = 1 << 14;
2722 86937856 int V = 1 << 14, A = 1 << 14;
2723 int j;
2724
2725 86937856 Y -= 0x40000000;
2726 86937856 U -= 0x40000000;
2727 86937856 V -= 0x40000000;
2728 86937856 A -= 0x40000000;
2729
2730
2/2
✓ Branch 0 taken 88697856 times.
✓ Branch 1 taken 86937856 times.
175635712 for (j = 0; j < lumFilterSize; j++)
2731 88697856 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2732
2733
2/2
✓ Branch 0 taken 127626240 times.
✓ Branch 1 taken 86937856 times.
214564096 for (j = 0; j < chrFilterSize; j++)
2734 127626240 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2735
2736
2/2
✓ Branch 0 taken 127626240 times.
✓ Branch 1 taken 86937856 times.
214564096 for (j = 0; j < chrFilterSize; j++)
2737 127626240 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2738
2739
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 86857856 times.
86937856 if (hasAlpha)
2740
2/2
✓ Branch 0 taken 960000 times.
✓ Branch 1 taken 80000 times.
1040000 for (j = 0; j < lumFilterSize; j++)
2741 960000 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2742
2743 86937856 Y = 0x8000 + av_clip_int16(Y >> 15);
2744 86937856 U = 0x8000 + av_clip_int16(U >> 15);
2745 86937856 V = 0x8000 + av_clip_int16(V >> 15);
2746
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 86857856 times.
86937856 if (hasAlpha)
2747 80000 A = 0x8000 + av_clip_int16(A >> 15);
2748
2749
6/6
✓ Branch 0 taken 43468928 times.
✓ Branch 1 taken 43468928 times.
✓ Branch 2 taken 40000 times.
✓ Branch 3 taken 43428928 times.
✓ Branch 4 taken 40000 times.
✓ Branch 5 taken 43428928 times.
86937856 output_pixels(dest + 8 * i + A_offset, hasAlpha ? A : 65535);
2750
2/2
✓ Branch 0 taken 43468928 times.
✓ Branch 1 taken 43468928 times.
86937856 output_pixels(dest + 8 * i + Y_offset, Y);
2751
2/2
✓ Branch 0 taken 43468928 times.
✓ Branch 1 taken 43468928 times.
86937856 output_pixels(dest + 8 * i + U_offset, U);
2752
2/2
✓ Branch 0 taken 43468928 times.
✓ Branch 1 taken 43468928 times.
86937856 output_pixels(dest + 8 * i + V_offset, V);
2753 }
2754 247328 }
2755
2756 #define YUV2AYUV64(pixfmt, BE_LE, A, Y, U, V, is_be) \
2757 static void \
2758 yuv2 ## pixfmt ## BE_LE ##_X_c(SwsInternal *c, const int16_t *lumFilter, \
2759 const int16_t **lumSrc, int lumFilterSize, \
2760 const int16_t *chrFilter, const int16_t **chrUSrc, \
2761 const int16_t **chrVSrc, int chrFilterSize, \
2762 const int16_t **alpSrc, uint8_t *dest, int dstW, int y) \
2763 { \
2764 yuv2ayuv64_X_c(c, lumFilter, lumSrc, lumFilterSize, \
2765 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2766 alpSrc, dest, dstW, y, A, Y, U, V, is_be); \
2767 }
2768
2769 9416 YUV2AYUV64(ayuv64, le, 0, 2, 4, 6, 0)
2770 9416 YUV2AYUV64(ayuv64, be, 0, 2, 4, 6, 1)
2771
2772 114248 YUV2AYUV64(xv48, le, 6, 2, 0, 4, 0)
2773 114248 YUV2AYUV64(xv48, be, 6, 2, 0, 4, 1)
2774
2775 #undef output_pixels
2776
2777 static av_always_inline void
2778 228468 yuv2v30_X_c_template(SwsInternal *c, const int16_t *lumFilter,
2779 const int16_t **lumSrc, int lumFilterSize,
2780 const int16_t *chrFilter, const int16_t **chrUSrc,
2781 const int16_t **chrVSrc, int chrFilterSize,
2782 const int16_t **alpSrc, uint8_t *dest, int dstW, int y,
2783 int shift)
2784 {
2785 int i;
2786
2/2
✓ Branch 0 taken 79819336 times.
✓ Branch 1 taken 228468 times.
80047804 for (i = 0; i < dstW; i++) {
2787 79819336 int Y = 1 << 16, U = 1 << 16, V = 1 << 16, A = 0x3;
2788 int j;
2789
2790
2/2
✓ Branch 0 taken 80699336 times.
✓ Branch 1 taken 79819336 times.
160518672 for (j = 0; j < lumFilterSize; j++)
2791 80699336 Y += lumSrc[j][i] * lumFilter[j];
2792
2793
2/2
✓ Branch 0 taken 100163528 times.
✓ Branch 1 taken 79819336 times.
179982864 for (j = 0; j < chrFilterSize; j++) {
2794 100163528 U += chrUSrc[j][i] * chrFilter[j];
2795 100163528 V += chrVSrc[j][i] * chrFilter[j];
2796 }
2797
2798 79819336 Y = av_clip_uintp2(Y >> 17, 10);
2799 79819336 U = av_clip_uintp2(U >> 17, 10);
2800 79819336 V = av_clip_uintp2(V >> 17, 10);
2801
2802
2/2
✓ Branch 0 taken 47541768 times.
✓ Branch 1 taken 32277568 times.
79819336 AV_WL32(dest + 4 * i, U << (shift + 0) |
2803 Y << (shift + 10) |
2804 (unsigned)V << (shift + 20) |
2805 (unsigned)A << (shift ? 0 : 30 /* xv30le = 30, v30xle = 0 */));
2806 }
2807 228468 }
2808
2809 #define V30LE_WRAPPER(name, shift) \
2810 static void yuv2 ## name ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
2811 const int16_t **lumSrc, int lumFilterSize, \
2812 const int16_t *chrFilter, const int16_t **chrUSrc, \
2813 const int16_t **chrVSrc, int chrFilterSize, \
2814 const int16_t **alpSrc, uint8_t *dest, int dstW, \
2815 int y) \
2816 { \
2817 yuv2v30_X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
2818 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2819 alpSrc, dest, dstW, y, shift); \
2820 }
2821
2822 91784 V30LE_WRAPPER(xv30le, 0)
2823 136684 V30LE_WRAPPER(v30xle, 2)
2824
2825 #define output_pixels(pos, val, shift, bits, output_shift) \
2826 if (is_be) { \
2827 AV_WB16(pos, av_clip_uintp2(val >> shift, bits) << output_shift); \
2828 } else { \
2829 AV_WL16(pos, av_clip_uintp2(val >> shift, bits) << output_shift); \
2830 }
2831
2832 static void
2833 183568 yuv2xv36_X_c(SwsInternal *c, const int16_t *lumFilter,
2834 const int16_t **lumSrc, int lumFilterSize,
2835 const int16_t *chrFilter, const int16_t **chrUSrc,
2836 const int16_t **chrVSrc, int chrFilterSize,
2837 const int16_t **alpSrc, uint8_t *dest, int dstW, int y, int is_be)
2838 {
2839 int i;
2840
2/2
✓ Branch 0 taken 64555136 times.
✓ Branch 1 taken 183568 times.
64738704 for (i = 0; i < dstW; i++) {
2841 64555136 int Y = 1 << 14, U = 1 << 14, V = 1 << 14, A = 65535;
2842 int j;
2843
2844
2/2
✓ Branch 0 taken 65435136 times.
✓ Branch 1 taken 64555136 times.
129990272 for (j = 0; j < lumFilterSize; j++)
2845 65435136 Y += lumSrc[j][i] * lumFilter[j];
2846
2847
2/2
✓ Branch 0 taken 84899328 times.
✓ Branch 1 taken 64555136 times.
149454464 for (j = 0; j < chrFilterSize; j++) {
2848 84899328 U += chrUSrc[j][i] * chrFilter[j];
2849 84899328 V += chrVSrc[j][i] * chrFilter[j];
2850 }
2851
2852
2/2
✓ Branch 0 taken 32277568 times.
✓ Branch 1 taken 32277568 times.
64555136 output_pixels(dest + 8 * i + 2, Y, 15, 12, 4)
2853
2/2
✓ Branch 0 taken 32277568 times.
✓ Branch 1 taken 32277568 times.
64555136 output_pixels(dest + 8 * i + 0, U, 15, 12, 4)
2854
2/2
✓ Branch 0 taken 32277568 times.
✓ Branch 1 taken 32277568 times.
64555136 output_pixels(dest + 8 * i + 4, V, 15, 12, 4)
2855
2/2
✓ Branch 0 taken 32277568 times.
✓ Branch 1 taken 32277568 times.
64555136 output_pixels(dest + 8 * i + 6, A, 0, 12, 4);
2856 }
2857 183568 }
2858
2859 #undef output_pixels
2860
2861 #define YUV2XV36(BE_LE, is_be) \
2862 static void \
2863 yuv2xv36 ## BE_LE ##_X_c(SwsInternal *c, const int16_t *lumFilter, \
2864 const int16_t **lumSrc, int lumFilterSize, \
2865 const int16_t *chrFilter, const int16_t **chrUSrc, \
2866 const int16_t **chrVSrc, int chrFilterSize, \
2867 const int16_t **alpSrc, uint8_t *dest, int dstW, int y) \
2868 { \
2869 yuv2xv36_X_c(c, lumFilter, lumSrc, lumFilterSize, \
2870 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2871 alpSrc, dest, dstW, y, is_be); \
2872 }
2873
2874 91784 YUV2XV36(le, 0)
2875 91784 YUV2XV36(be, 1)
2876
2877 #define output_pixels(pos, A, Y, U, V) \
2878 if (target == AV_PIX_FMT_AYUV) { \
2879 dest[pos + 0] = A; \
2880 dest[pos + 1] = Y; \
2881 dest[pos + 2] = U; \
2882 dest[pos + 3] = V; \
2883 } else if (target == AV_PIX_FMT_UYVA) { \
2884 dest[pos + 0] = U; \
2885 dest[pos + 1] = Y; \
2886 dest[pos + 2] = V; \
2887 dest[pos + 3] = A; \
2888 } else { /* AV_PIX_FMT_VUYA || AV_PIX_FMT_VUYX */ \
2889 dest[pos + 0] = V; \
2890 dest[pos + 1] = U; \
2891 dest[pos + 2] = Y; \
2892 dest[pos + 3] = A; \
2893 }
2894
2895 static av_always_inline void
2896 127268 yuv2ayuv_1_c_template(SwsInternal *c, const int16_t *buf0,
2897 const int16_t *ubuf[2], const int16_t *vbuf[2],
2898 const int16_t *abuf0, uint8_t *dest, int dstW,
2899 int uvalpha, int y, enum AVPixelFormat target)
2900 {
2901 127268 int hasAlpha = !!abuf0;
2902 int i;
2903
2904
1/2
✓ Branch 0 taken 127268 times.
✗ Branch 1 not taken.
127268 if (uvalpha < 2048) {
2905
2/2
✓ Branch 0 taken 44257736 times.
✓ Branch 1 taken 127268 times.
44385004 for (i = 0; i < dstW; i++) {
2906 44257736 int Y = (buf0[i] + 64) >> 7;
2907 44257736 int U = (ubuf[0][i] + 64) >> 7;
2908 44257736 int V = (vbuf[0][i] + 64) >> 7;
2909 44257736 int A = 255;
2910
2911
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44257736 times.
44257736 if (Y & 0x100)
2912 Y = av_clip_uint8(Y);
2913
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44257736 times.
44257736 if (U & 0x100)
2914 U = av_clip_uint8(U);
2915
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44257736 times.
44257736 if (V & 0x100)
2916 V = av_clip_uint8(V);
2917
2918
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44257736 times.
44257736 if (hasAlpha) {
2919 A = (abuf0[i] + 64) >> 7;
2920 if (A & 0x100)
2921 A = av_clip_uint8(A);
2922 }
2923
2924
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 44257736 times.
✓ Branch 2 taken 15264200 times.
✓ Branch 3 taken 28993536 times.
44257736 output_pixels(i * 4, A, Y, U, V)
2925 }
2926 } else {
2927 for (i = 0; i < dstW; i++) {
2928 int Y = (buf0[i] + 64) >> 7;
2929 int U = (ubuf[0][i] + ubuf[1][i] + 128) >> 8;
2930 int V = (vbuf[0][i] + vbuf[1][i] + 128) >> 8;
2931 int A = 255;
2932
2933 if (Y & 0x100)
2934 Y = av_clip_uint8(Y);
2935 if (U & 0x100)
2936 U = av_clip_uint8(U);
2937 if (V & 0x100)
2938 V = av_clip_uint8(V);
2939
2940 if (hasAlpha) {
2941 A = (abuf0[i] + 64) >> 7;
2942 if (A & 0x100)
2943 A = av_clip_uint8(A);
2944 }
2945
2946 output_pixels(i * 4, A, Y, U, V)
2947 }
2948 }
2949 127268 }
2950
2951 static av_always_inline void
2952 yuv2ayuv_2_c_template(SwsInternal *c, const int16_t *buf[2],
2953 const int16_t *ubuf[2], const int16_t *vbuf[2],
2954 const int16_t *abuf[2], uint8_t *dest, int dstW,
2955 int yalpha, int uvalpha, int y,
2956 enum AVPixelFormat target)
2957 {
2958 int hasAlpha = abuf && abuf[0] && abuf[1];
2959 const int16_t *buf0 = buf[0], *buf1 = buf[1],
2960 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
2961 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
2962 *abuf0 = hasAlpha ? abuf[0] : NULL,
2963 *abuf1 = hasAlpha ? abuf[1] : NULL;
2964 int yalpha1 = 4096 - yalpha;
2965 int uvalpha1 = 4096 - uvalpha;
2966 int i;
2967
2968 av_assert2(yalpha <= 4096U);
2969 av_assert2(uvalpha <= 4096U);
2970
2971 for (i = 0; i < dstW; i++) {
2972 int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 19;
2973 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
2974 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
2975 int A = 255;
2976
2977 if (Y & 0x100)
2978 Y = av_clip_uint8(Y);
2979 if (U & 0x100)
2980 U = av_clip_uint8(U);
2981 if (V & 0x100)
2982 V = av_clip_uint8(V);
2983
2984 if (hasAlpha) {
2985 A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 19;
2986 A = av_clip_uint8(A);
2987 }
2988
2989 output_pixels(i * 4, A, Y, U, V)
2990 }
2991 }
2992
2993 static av_always_inline void
2994 40544 yuv2ayuv_X_c_template(SwsInternal *c, const int16_t *lumFilter,
2995 const int16_t **lumSrc, int lumFilterSize,
2996 const int16_t *chrFilter, const int16_t **chrUSrc,
2997 const int16_t **chrVSrc, int chrFilterSize,
2998 const int16_t **alpSrc, uint8_t *dest, int dstW,
2999 int y, enum AVPixelFormat target)
3000 {
3001 int i;
3002
3003
2/2
✓ Branch 0 taken 14149888 times.
✓ Branch 1 taken 40544 times.
14190432 for (i = 0; i < dstW; i++) {
3004 int j;
3005 14149888 int Y = 1 << 18, U = 1 << 18;
3006 14149888 int V = 1 << 18, A = 255;
3007
3008
2/2
✓ Branch 0 taken 15909888 times.
✓ Branch 1 taken 14149888 times.
30059776 for (j = 0; j < lumFilterSize; j++)
3009 15909888 Y += lumSrc[j][i] * lumFilter[j];
3010
3011
2/2
✓ Branch 0 taken 57879552 times.
✓ Branch 1 taken 14149888 times.
72029440 for (j = 0; j < chrFilterSize; j++)
3012 57879552 U += chrUSrc[j][i] * chrFilter[j];
3013
3014
2/2
✓ Branch 0 taken 57879552 times.
✓ Branch 1 taken 14149888 times.
72029440 for (j = 0; j < chrFilterSize; j++)
3015 57879552 V += chrVSrc[j][i] * chrFilter[j];
3016
3017 14149888 Y >>= 19;
3018 14149888 U >>= 19;
3019 14149888 V >>= 19;
3020
3021
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14149888 times.
14149888 if (Y & 0x100)
3022 Y = av_clip_uint8(Y);
3023
2/2
✓ Branch 0 taken 560 times.
✓ Branch 1 taken 14149328 times.
14149888 if (U & 0x100)
3024 560 U = av_clip_uint8(U);
3025
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 14149880 times.
14149888 if (V & 0x100)
3026 8 V = av_clip_uint8(V);
3027
3028
2/2
✓ Branch 0 taken 120000 times.
✓ Branch 1 taken 14029888 times.
14149888 if (alpSrc) {
3029 120000 A = 1 << 18;
3030
3031
2/2
✓ Branch 0 taken 1440000 times.
✓ Branch 1 taken 120000 times.
1560000 for (j = 0; j < lumFilterSize; j++)
3032 1440000 A += alpSrc[j][i] * lumFilter[j];
3033
3034 120000 A >>= 19;
3035
3036
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 120000 times.
120000 if (A & 0x100)
3037 A = av_clip_uint8(A);
3038 }
3039
3040
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)
3041 }
3042 40544 }
3043
3044 #undef output_pixels
3045
3046 #define AYUVPACKEDWRAPPER(name, fmt) \
3047 static void yuv2 ## name ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
3048 const int16_t **lumSrc, int lumFilterSize, \
3049 const int16_t *chrFilter, const int16_t **chrUSrc, \
3050 const int16_t **chrVSrc, int chrFilterSize, \
3051 const int16_t **alpSrc, uint8_t *dest, int dstW, \
3052 int y) \
3053 { \
3054 yuv2ayuv_X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
3055 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
3056 alpSrc, dest, dstW, y, fmt); \
3057 } \
3058 \
3059 static void yuv2 ## name ## _2_c(SwsInternal *c, const int16_t *buf[2], \
3060 const int16_t *ubuf[2], const int16_t *vbuf[2], \
3061 const int16_t *abuf[2], uint8_t *dest, int dstW, \
3062 int yalpha, int uvalpha, int y) \
3063 { \
3064 yuv2ayuv_2_c_template(c, buf, ubuf, vbuf, abuf, \
3065 dest, dstW, yalpha, uvalpha, y, fmt); \
3066 } \
3067 \
3068 static void yuv2 ## name ## _1_c(SwsInternal *c, const int16_t *buf0, \
3069 const int16_t *ubuf[2], const int16_t *vbuf[2], \
3070 const int16_t *abuf0, uint8_t *dest, int dstW, \
3071 int uvalpha, int y) \
3072 { \
3073 yuv2ayuv_1_c_template(c, buf0, ubuf, vbuf, \
3074 abuf0, dest, dstW, uvalpha, \
3075 y, fmt); \
3076 }
3077
3078 205856 AYUVPACKEDWRAPPER(vuyX, AV_PIX_FMT_VUYX)
3079 19984 AYUVPACKEDWRAPPER(ayuv, AV_PIX_FMT_AYUV)
3080 109784 AYUVPACKEDWRAPPER(uyva, AV_PIX_FMT_UYVA)
3081
3082 #define output_pixel(pos, val, bits) \
3083 AV_WL16(pos, av_clip_uintp2(val >> shift, bits) << output_shift);
3084
3085 #define yuv2y2xx_wrapper(bits) \
3086 static void \
3087 yuv2y2 ## bits ## le_X_c(SwsInternal *c, const int16_t *lumFilter, \
3088 const int16_t **lumSrc, int lumFilterSize, \
3089 const int16_t *chrFilter, \
3090 const int16_t **chrUSrc, \
3091 const int16_t **chrVSrc, int chrFilterSize, \
3092 const int16_t **alpSrc, \
3093 uint8_t *dest, int dstW, int y) \
3094 { \
3095 int i, j; \
3096 int shift = 11 + 16 - bits; \
3097 int output_shift = 16 - bits; \
3098 for (i = 0; i < ((dstW + 1) >> 1); i++) { \
3099 int Y1 = 1 << (shift - 1), Y2 = 1 << (shift - 1); \
3100 int U = 1 << (shift - 1), V = 1 << (shift - 1); \
3101 \
3102 for (j = 0; j < lumFilterSize; j++) { \
3103 Y1 += lumSrc[j][i * 2] * lumFilter[j]; \
3104 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j]; \
3105 } \
3106 \
3107 for (j = 0; j < chrFilterSize; j++) { \
3108 U += chrUSrc[j][i] * chrFilter[j]; \
3109 V += chrVSrc[j][i] * chrFilter[j]; \
3110 } \
3111 \
3112 output_pixel(dest + 8 * i + 0, Y1, bits); \
3113 output_pixel(dest + 8 * i + 2, U, bits); \
3114 output_pixel(dest + 8 * i + 4, Y2, bits); \
3115 output_pixel(dest + 8 * i + 6, V, bits); \
3116 } \
3117 }
3118
3119
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)
3120
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)
3121
3122 static void
3123 112520 yuv2y216le_X_c(SwsInternal *c, const int16_t *lumFilter,
3124 const int16_t **_lumSrc, int lumFilterSize,
3125 const int16_t *chrFilter,
3126 const int16_t **_chrUSrc,
3127 const int16_t **_chrVSrc, int chrFilterSize,
3128 const int16_t **_alpSrc,
3129 uint8_t *dest, int dstW, int y)
3130 {
3131 112520 const int32_t **lumSrc = (const int32_t **)_lumSrc;
3132 112520 const int32_t **chrUSrc = (const int32_t **)_chrUSrc;
3133 112520 const int32_t **chrVSrc = (const int32_t **)_chrVSrc;
3134 112520 int shift = 15;
3135
3136
2/2
✓ Branch 0 taken 19788320 times.
✓ Branch 1 taken 112520 times.
19900840 for (int i = 0; i < ((dstW + 1) >> 1); i++) {
3137 19788320 int Y1 = 1 << (shift - 1), Y2 = 1 << (shift - 1);
3138 19788320 int U = 1 << (shift - 1), V = 1 << (shift - 1);
3139
3140 /* See yuv2planeX_16_c_template for details. */
3141 19788320 Y1 -= 0x40000000;
3142 19788320 U -= 0x40000000;
3143 19788320 Y2 -= 0x40000000;
3144 19788320 V -= 0x40000000;
3145
3146
2/2
✓ Branch 0 taken 20008320 times.
✓ Branch 1 taken 19788320 times.
39796640 for (int j = 0; j < lumFilterSize; j++) {
3147 20008320 Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j];
3148 20008320 Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
3149 }
3150
3151
2/2
✓ Branch 0 taken 23961984 times.
✓ Branch 1 taken 19788320 times.
43750304 for (int j = 0; j < chrFilterSize; j++) {
3152 23961984 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
3153 23961984 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
3154 }
3155
3156 19788320 AV_WL16(dest + 8 * i + 0, 0x8000 + av_clip_int16(Y1 >> shift));
3157 19788320 AV_WL16(dest + 8 * i + 2, 0x8000 + av_clip_int16(U >> shift));
3158 19788320 AV_WL16(dest + 8 * i + 4, 0x8000 + av_clip_int16(Y2 >> shift));
3159 19788320 AV_WL16(dest + 8 * i + 6, 0x8000 + av_clip_int16(V >> shift));
3160 }
3161 112520 }
3162
3163 static void
3164 127268 yuv2vyu444_1_c(SwsInternal *c, const int16_t *buf0,
3165 const int16_t *ubuf[2], const int16_t *vbuf[2],
3166 const int16_t *abuf0, uint8_t *dest, int dstW,
3167 int uvalpha, int y)
3168 {
3169 int i;
3170
3171
1/2
✓ Branch 0 taken 127268 times.
✗ Branch 1 not taken.
127268 if (uvalpha < 2048) {
3172
2/2
✓ Branch 0 taken 44257736 times.
✓ Branch 1 taken 127268 times.
44385004 for (i = 0; i < dstW; i++) {
3173 44257736 int Y = (buf0[i] + 64) >> 7;
3174 44257736 int U = (ubuf[0][i] + 64) >> 7;
3175 44257736 int V = (vbuf[0][i] + 64) >> 7;
3176
3177
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44257736 times.
44257736 if (Y & 0x100)
3178 Y = av_clip_uint8(Y);
3179
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44257736 times.
44257736 if (U & 0x100)
3180 U = av_clip_uint8(U);
3181
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44257736 times.
44257736 if (V & 0x100)
3182 V = av_clip_uint8(V);
3183
3184 44257736 dest[3 * i ] = V;
3185 44257736 dest[3 * i + 1] = Y;
3186 44257736 dest[3 * i + 2] = U;
3187 }
3188 } else {
3189 for (i = 0; i < dstW; i++) {
3190 int Y = (buf0[i] + 64) >> 7;
3191 int U = (ubuf[0][i] + ubuf[1][i] + 128) >> 8;
3192 int V = (vbuf[0][i] + vbuf[1][i] + 128) >> 8;
3193
3194 if (Y & 0x100)
3195 Y = av_clip_uint8(Y);
3196 if (U & 0x100)
3197 U = av_clip_uint8(U);
3198 if (V & 0x100)
3199 V = av_clip_uint8(V);
3200
3201 dest[3 * i ] = V;
3202 dest[3 * i + 1] = Y;
3203 dest[3 * i + 2] = U;
3204 }
3205 }
3206 127268 }
3207
3208 static void
3209 yuv2vyu444_2_c(SwsInternal *c, const int16_t *buf[2],
3210 const int16_t *ubuf[2], const int16_t *vbuf[2],
3211 const int16_t *abuf[2], uint8_t *dest, int dstW,
3212 int yalpha, int uvalpha, int y)
3213 {
3214 const int16_t *buf0 = buf[0], *buf1 = buf[1],
3215 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
3216 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
3217 int yalpha1 = 4096 - yalpha;
3218 int uvalpha1 = 4096 - uvalpha;
3219 int i;
3220
3221 av_assert2(yalpha <= 4096U);
3222 av_assert2(uvalpha <= 4096U);
3223
3224 for (i = 0; i < dstW; i++) {
3225 int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 19;
3226 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
3227 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
3228
3229 if (Y & 0x100)
3230 Y = av_clip_uint8(Y);
3231 if (U & 0x100)
3232 U = av_clip_uint8(U);
3233 if (V & 0x100)
3234 V = av_clip_uint8(V);
3235
3236 dest[3 * i ] = V;
3237 dest[3 * i + 1] = Y;
3238 dest[3 * i + 2] = U;
3239 }
3240 }
3241
3242 static void
3243 10568 yuv2vyu444_X_c(SwsInternal *c, const int16_t *lumFilter,
3244 const int16_t **lumSrc, int lumFilterSize,
3245 const int16_t *chrFilter, const int16_t **chrUSrc,
3246 const int16_t **chrVSrc, int chrFilterSize,
3247 const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
3248 {
3249 int i;
3250
3251
2/2
✓ Branch 0 taken 3689536 times.
✓ Branch 1 taken 10568 times.
3700104 for (i = 0; i < dstW; i++) {
3252 int j;
3253 3689536 int Y = 1 << 18, U = 1 << 18;
3254 3689536 int V = 1 << 18;
3255
3256
2/2
✓ Branch 0 taken 4129536 times.
✓ Branch 1 taken 3689536 times.
7819072 for (j = 0; j < lumFilterSize; j++)
3257 4129536 Y += lumSrc[j][i] * lumFilter[j];
3258
3259
2/2
✓ Branch 0 taken 15078144 times.
✓ Branch 1 taken 3689536 times.
18767680 for (j = 0; j < chrFilterSize; j++)
3260 15078144 U += chrUSrc[j][i] * chrFilter[j];
3261
3262
2/2
✓ Branch 0 taken 15078144 times.
✓ Branch 1 taken 3689536 times.
18767680 for (j = 0; j < chrFilterSize; j++)
3263 15078144 V += chrVSrc[j][i] * chrFilter[j];
3264
3265 3689536 Y >>= 19;
3266 3689536 U >>= 19;
3267 3689536 V >>= 19;
3268
3269
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3689536 times.
3689536 if (Y & 0x100)
3270 Y = av_clip_uint8(Y);
3271
2/2
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 3689390 times.
3689536 if (U & 0x100)
3272 146 U = av_clip_uint8(U);
3273
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3689534 times.
3689536 if (V & 0x100)
3274 2 V = av_clip_uint8(V);
3275
3276 3689536 dest[3 * i ] = V;
3277 3689536 dest[3 * i + 1] = Y;
3278 3689536 dest[3 * i + 2] = U;
3279 }
3280 10568 }
3281
3282 #undef output_pixel
3283
3284 223284 av_cold void ff_sws_init_output_funcs(SwsInternal *c,
3285 yuv2planar1_fn *yuv2plane1,
3286 yuv2planarX_fn *yuv2planeX,
3287 yuv2interleavedX_fn *yuv2nv12cX,
3288 yuv2packed1_fn *yuv2packed1,
3289 yuv2packed2_fn *yuv2packed2,
3290 yuv2packedX_fn *yuv2packedX,
3291 yuv2anyX_fn *yuv2anyX)
3292 {
3293 223284 enum AVPixelFormat dstFormat = c->opts.dst_format;
3294 223284 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(dstFormat);
3295
3296
4/4
✓ Branch 1 taken 32380 times.
✓ Branch 2 taken 190904 times.
✓ Branch 4 taken 18742 times.
✓ Branch 5 taken 13638 times.
223284 if (isSemiPlanarYUV(dstFormat) && isDataInHighBits(dstFormat)) {
3297
2/2
✓ Branch 0 taken 9333 times.
✓ Branch 1 taken 9409 times.
18742 if (desc->comp[0].depth == 10) {
3298
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7240 times.
9333 *yuv2plane1 = isBE(dstFormat) ? yuv2p010l1_BE_c : yuv2p010l1_LE_c;
3299
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7240 times.
9333 *yuv2planeX = isBE(dstFormat) ? yuv2p010lX_BE_c : yuv2p010lX_LE_c;
3300
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7240 times.
9333 *yuv2nv12cX = isBE(dstFormat) ? yuv2p010cX_BE_c : yuv2p010cX_LE_c;
3301
1/2
✓ Branch 0 taken 9409 times.
✗ Branch 1 not taken.
9409 } else if (desc->comp[0].depth == 12) {
3302
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7316 times.
9409 *yuv2plane1 = isBE(dstFormat) ? yuv2p012l1_BE_c : yuv2p012l1_LE_c;
3303
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7316 times.
9409 *yuv2planeX = isBE(dstFormat) ? yuv2p012lX_BE_c : yuv2p012lX_LE_c;
3304
2/2
✓ Branch 1 taken 2093 times.
✓ Branch 2 taken 7316 times.
9409 *yuv2nv12cX = isBE(dstFormat) ? yuv2p012cX_BE_c : yuv2p012cX_LE_c;
3305 } else
3306 av_assert0(0);
3307
4/4
✓ Branch 1 taken 13638 times.
✓ Branch 2 taken 190904 times.
✓ Branch 4 taken 157 times.
✓ Branch 5 taken 13481 times.
204542 } else if (isSemiPlanarYUV(dstFormat) && isNBPS(dstFormat)) {
3308
1/2
✓ Branch 0 taken 157 times.
✗ Branch 1 not taken.
157 if (desc->comp[0].depth == 10) {
3309
2/2
✓ Branch 1 taken 76 times.
✓ Branch 2 taken 81 times.
157 *yuv2plane1 = isBE(dstFormat) ? yuv2nv20l1_BE_c : yuv2nv20l1_LE_c;
3310
2/2
✓ Branch 1 taken 76 times.
✓ Branch 2 taken 81 times.
157 *yuv2planeX = isBE(dstFormat) ? yuv2nv20lX_BE_c : yuv2nv20lX_LE_c;
3311
2/2
✓ Branch 1 taken 76 times.
✓ Branch 2 taken 81 times.
157 *yuv2nv12cX = isBE(dstFormat) ? yuv2nv20cX_BE_c : yuv2nv20cX_LE_c;
3312 } else
3313 av_assert0(0);
3314
2/2
✓ Branch 1 taken 35701 times.
✓ Branch 2 taken 168684 times.
204385 } else if (is16BPS(dstFormat)) {
3315
2/2
✓ Branch 1 taken 9775 times.
✓ Branch 2 taken 25926 times.
35701 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_16BE_c : yuv2planeX_16LE_c;
3316
2/2
✓ Branch 1 taken 9775 times.
✓ Branch 2 taken 25926 times.
35701 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_16BE_c : yuv2plane1_16LE_c;
3317
2/2
✓ Branch 1 taken 6233 times.
✓ Branch 2 taken 29468 times.
35701 if (isSemiPlanarYUV(dstFormat)) {
3318
2/2
✓ Branch 1 taken 2589 times.
✓ Branch 2 taken 3644 times.
6233 *yuv2nv12cX = isBE(dstFormat) ? yuv2nv12cX_16BE_c : yuv2nv12cX_16LE_c;
3319 }
3320
3/4
✓ Branch 1 taken 3702 times.
✓ Branch 2 taken 164982 times.
✓ Branch 4 taken 3702 times.
✗ Branch 5 not taken.
168684 } else if (isDataInHighBits(dstFormat) && isNBPS(dstFormat)) {
3321
2/2
✓ Branch 0 taken 1088 times.
✓ Branch 1 taken 2614 times.
3702 if (desc->comp[0].depth == 10) {
3322
2/2
✓ Branch 1 taken 162 times.
✓ Branch 2 taken 926 times.
1088 *yuv2planeX = isBE(dstFormat) ? yuv2msbplaneX_10BE_c : yuv2msbplaneX_10LE_c;
3323
2/2
✓ Branch 1 taken 162 times.
✓ Branch 2 taken 926 times.
1088 *yuv2plane1 = isBE(dstFormat) ? yuv2msbplane1_10BE_c : yuv2msbplane1_10LE_c;
3324
1/2
✓ Branch 0 taken 2614 times.
✗ Branch 1 not taken.
2614 } else if (desc->comp[0].depth == 12) {
3325
2/2
✓ Branch 1 taken 925 times.
✓ Branch 2 taken 1689 times.
2614 *yuv2planeX = isBE(dstFormat) ? yuv2msbplaneX_12BE_c : yuv2msbplaneX_12LE_c;
3326
2/2
✓ Branch 1 taken 925 times.
✓ Branch 2 taken 1689 times.
2614 *yuv2plane1 = isBE(dstFormat) ? yuv2msbplane1_12BE_c : yuv2msbplane1_12LE_c;
3327 } else
3328 av_assert0(0);
3329
2/2
✓ Branch 1 taken 55328 times.
✓ Branch 2 taken 109654 times.
164982 } else if (isNBPS(dstFormat)) {
3330
2/2
✓ Branch 0 taken 1754 times.
✓ Branch 1 taken 53574 times.
55328 if (desc->comp[0].depth == 9) {
3331
2/2
✓ Branch 1 taken 818 times.
✓ Branch 2 taken 936 times.
1754 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_9BE_c : yuv2planeX_9LE_c;
3332
2/2
✓ Branch 1 taken 818 times.
✓ Branch 2 taken 936 times.
1754 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_9BE_c : yuv2plane1_9LE_c;
3333
2/2
✓ Branch 0 taken 30680 times.
✓ Branch 1 taken 22894 times.
53574 } else if (desc->comp[0].depth == 10) {
3334
2/2
✓ Branch 1 taken 5069 times.
✓ Branch 2 taken 25611 times.
30680 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_10BE_c : yuv2planeX_10LE_c;
3335
2/2
✓ Branch 1 taken 5069 times.
✓ Branch 2 taken 25611 times.
30680 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_10BE_c : yuv2plane1_10LE_c;
3336
2/2
✓ Branch 0 taken 21337 times.
✓ Branch 1 taken 1557 times.
22894 } else if (desc->comp[0].depth == 12) {
3337
2/2
✓ Branch 1 taken 5064 times.
✓ Branch 2 taken 16273 times.
21337 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_12BE_c : yuv2planeX_12LE_c;
3338
2/2
✓ Branch 1 taken 5064 times.
✓ Branch 2 taken 16273 times.
21337 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_12BE_c : yuv2plane1_12LE_c;
3339
1/2
✓ Branch 0 taken 1557 times.
✗ Branch 1 not taken.
1557 } else if (desc->comp[0].depth == 14) {
3340
2/2
✓ Branch 1 taken 727 times.
✓ Branch 2 taken 830 times.
1557 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_14BE_c : yuv2planeX_14LE_c;
3341
2/2
✓ Branch 1 taken 727 times.
✓ Branch 2 taken 830 times.
1557 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_14BE_c : yuv2plane1_14LE_c;
3342 } else
3343 av_assert0(0);
3344
2/2
✓ Branch 0 taken 110 times.
✓ Branch 1 taken 109544 times.
109654 } else if (dstFormat == AV_PIX_FMT_GRAYF32BE) {
3345 110 *yuv2planeX = yuv2planeX_floatBE_c;
3346 110 *yuv2plane1 = yuv2plane1_floatBE_c;
3347
2/2
✓ Branch 0 taken 248 times.
✓ Branch 1 taken 109296 times.
109544 } else if (dstFormat == AV_PIX_FMT_GRAYF32LE) {
3348 248 *yuv2planeX = yuv2planeX_floatLE_c;
3349 248 *yuv2plane1 = yuv2plane1_floatLE_c;
3350 } else {
3351 109296 *yuv2plane1 = yuv2plane1_8_c;
3352 109296 *yuv2planeX = yuv2planeX_8_c;
3353
2/2
✓ Branch 1 taken 7248 times.
✓ Branch 2 taken 102048 times.
109296 if (isSemiPlanarYUV(dstFormat))
3354 7248 *yuv2nv12cX = yuv2nv12cX_c;
3355 }
3356
3357
2/2
✓ Branch 0 taken 177281 times.
✓ Branch 1 taken 46003 times.
223284 if(c->opts.flags & SWS_FULL_CHR_H_INT) {
3358
24/25
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 1644 times.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 5 times.
✓ Branch 6 taken 8 times.
✓ Branch 7 taken 5 times.
✓ Branch 8 taken 3694 times.
✓ Branch 9 taken 1380 times.
✓ Branch 10 taken 3423 times.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 10 times.
✓ Branch 13 taken 5 times.
✓ Branch 14 taken 352 times.
✓ Branch 15 taken 352 times.
✓ Branch 16 taken 704 times.
✓ Branch 17 taken 403 times.
✓ Branch 18 taken 563 times.
✓ Branch 19 taken 563 times.
✓ Branch 20 taken 25761 times.
✓ Branch 21 taken 340 times.
✓ Branch 22 taken 4286 times.
✓ Branch 23 taken 2441 times.
✗ Branch 24 not taken.
46003 switch (dstFormat) {
3359 16 case AV_PIX_FMT_RGBA:
3360 #if CONFIG_SMALL
3361 *yuv2packedX = yuv2rgba32_full_X_c;
3362 *yuv2packed2 = yuv2rgba32_full_2_c;
3363 *yuv2packed1 = yuv2rgba32_full_1_c;
3364 #else
3365 #if CONFIG_SWSCALE_ALPHA
3366
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
16 if (c->needAlpha) {
3367 10 *yuv2packedX = yuv2rgba32_full_X_c;
3368 10 *yuv2packed2 = yuv2rgba32_full_2_c;
3369 10 *yuv2packed1 = yuv2rgba32_full_1_c;
3370 } else
3371 #endif /* CONFIG_SWSCALE_ALPHA */
3372 {
3373 6 *yuv2packedX = yuv2rgbx32_full_X_c;
3374 6 *yuv2packed2 = yuv2rgbx32_full_2_c;
3375 6 *yuv2packed1 = yuv2rgbx32_full_1_c;
3376 }
3377 #endif /* !CONFIG_SMALL */
3378 16 break;
3379 16 case AV_PIX_FMT_ARGB:
3380 #if CONFIG_SMALL
3381 *yuv2packedX = yuv2argb32_full_X_c;
3382 *yuv2packed2 = yuv2argb32_full_2_c;
3383 *yuv2packed1 = yuv2argb32_full_1_c;
3384 #else
3385 #if CONFIG_SWSCALE_ALPHA
3386
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
16 if (c->needAlpha) {
3387 10 *yuv2packedX = yuv2argb32_full_X_c;
3388 10 *yuv2packed2 = yuv2argb32_full_2_c;
3389 10 *yuv2packed1 = yuv2argb32_full_1_c;
3390 } else
3391 #endif /* CONFIG_SWSCALE_ALPHA */
3392 {
3393 6 *yuv2packedX = yuv2xrgb32_full_X_c;
3394 6 *yuv2packed2 = yuv2xrgb32_full_2_c;
3395 6 *yuv2packed1 = yuv2xrgb32_full_1_c;
3396 }
3397 #endif /* !CONFIG_SMALL */
3398 16 break;
3399 1644 case AV_PIX_FMT_BGRA:
3400 #if CONFIG_SMALL
3401 *yuv2packedX = yuv2bgra32_full_X_c;
3402 *yuv2packed2 = yuv2bgra32_full_2_c;
3403 *yuv2packed1 = yuv2bgra32_full_1_c;
3404 #else
3405 #if CONFIG_SWSCALE_ALPHA
3406
2/2
✓ Branch 0 taken 106 times.
✓ Branch 1 taken 1538 times.
1644 if (c->needAlpha) {
3407 106 *yuv2packedX = yuv2bgra32_full_X_c;
3408 106 *yuv2packed2 = yuv2bgra32_full_2_c;
3409 106 *yuv2packed1 = yuv2bgra32_full_1_c;
3410 } else
3411 #endif /* CONFIG_SWSCALE_ALPHA */
3412 {
3413 1538 *yuv2packedX = yuv2bgrx32_full_X_c;
3414 1538 *yuv2packed2 = yuv2bgrx32_full_2_c;
3415 1538 *yuv2packed1 = yuv2bgrx32_full_1_c;
3416 }
3417 #endif /* !CONFIG_SMALL */
3418 1644 break;
3419 16 case AV_PIX_FMT_ABGR:
3420 #if CONFIG_SMALL
3421 *yuv2packedX = yuv2abgr32_full_X_c;
3422 *yuv2packed2 = yuv2abgr32_full_2_c;
3423 *yuv2packed1 = yuv2abgr32_full_1_c;
3424 #else
3425 #if CONFIG_SWSCALE_ALPHA
3426
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
16 if (c->needAlpha) {
3427 10 *yuv2packedX = yuv2abgr32_full_X_c;
3428 10 *yuv2packed2 = yuv2abgr32_full_2_c;
3429 10 *yuv2packed1 = yuv2abgr32_full_1_c;
3430 } else
3431 #endif /* CONFIG_SWSCALE_ALPHA */
3432 {
3433 6 *yuv2packedX = yuv2xbgr32_full_X_c;
3434 6 *yuv2packed2 = yuv2xbgr32_full_2_c;
3435 6 *yuv2packed1 = yuv2xbgr32_full_1_c;
3436 }
3437 #endif /* !CONFIG_SMALL */
3438 16 break;
3439 8 case AV_PIX_FMT_RGBA64LE:
3440 #if CONFIG_SWSCALE_ALPHA
3441
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3 times.
8 if (c->needAlpha) {
3442 5 *yuv2packedX = yuv2rgba64le_full_X_c;
3443 5 *yuv2packed2 = yuv2rgba64le_full_2_c;
3444 5 *yuv2packed1 = yuv2rgba64le_full_1_c;
3445 } else
3446 #endif /* CONFIG_SWSCALE_ALPHA */
3447 {
3448 3 *yuv2packedX = yuv2rgbx64le_full_X_c;
3449 3 *yuv2packed2 = yuv2rgbx64le_full_2_c;
3450 3 *yuv2packed1 = yuv2rgbx64le_full_1_c;
3451 }
3452 8 break;
3453 5 case AV_PIX_FMT_RGBA64BE:
3454 #if CONFIG_SWSCALE_ALPHA
3455
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
5 if (c->needAlpha) {
3456 5 *yuv2packedX = yuv2rgba64be_full_X_c;
3457 5 *yuv2packed2 = yuv2rgba64be_full_2_c;
3458 5 *yuv2packed1 = yuv2rgba64be_full_1_c;
3459 } else
3460 #endif /* CONFIG_SWSCALE_ALPHA */
3461 {
3462 *yuv2packedX = yuv2rgbx64be_full_X_c;
3463 *yuv2packed2 = yuv2rgbx64be_full_2_c;
3464 *yuv2packed1 = yuv2rgbx64be_full_1_c;
3465 }
3466 5 break;
3467 8 case AV_PIX_FMT_BGRA64LE:
3468 #if CONFIG_SWSCALE_ALPHA
3469
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3 times.
8 if (c->needAlpha) {
3470 5 *yuv2packedX = yuv2bgra64le_full_X_c;
3471 5 *yuv2packed2 = yuv2bgra64le_full_2_c;
3472 5 *yuv2packed1 = yuv2bgra64le_full_1_c;
3473 } else
3474 #endif /* CONFIG_SWSCALE_ALPHA */
3475 {
3476 3 *yuv2packedX = yuv2bgrx64le_full_X_c;
3477 3 *yuv2packed2 = yuv2bgrx64le_full_2_c;
3478 3 *yuv2packed1 = yuv2bgrx64le_full_1_c;
3479 }
3480 8 break;
3481 5 case AV_PIX_FMT_BGRA64BE:
3482 #if CONFIG_SWSCALE_ALPHA
3483
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
5 if (c->needAlpha) {
3484 5 *yuv2packedX = yuv2bgra64be_full_X_c;
3485 5 *yuv2packed2 = yuv2bgra64be_full_2_c;
3486 5 *yuv2packed1 = yuv2bgra64be_full_1_c;
3487 } else
3488 #endif /* CONFIG_SWSCALE_ALPHA */
3489 {
3490 *yuv2packedX = yuv2bgrx64be_full_X_c;
3491 *yuv2packed2 = yuv2bgrx64be_full_2_c;
3492 *yuv2packed1 = yuv2bgrx64be_full_1_c;
3493 }
3494 5 break;
3495
3496 3694 case AV_PIX_FMT_RGB24:
3497 3694 *yuv2packedX = yuv2rgb24_full_X_c;
3498 3694 *yuv2packed2 = yuv2rgb24_full_2_c;
3499 3694 *yuv2packed1 = yuv2rgb24_full_1_c;
3500 3694 break;
3501 1380 case AV_PIX_FMT_BGR24:
3502 1380 *yuv2packedX = yuv2bgr24_full_X_c;
3503 1380 *yuv2packed2 = yuv2bgr24_full_2_c;
3504 1380 *yuv2packed1 = yuv2bgr24_full_1_c;
3505 1380 break;
3506 3423 case AV_PIX_FMT_RGB48LE:
3507 3423 *yuv2packedX = yuv2rgb48le_full_X_c;
3508 3423 *yuv2packed2 = yuv2rgb48le_full_2_c;
3509 3423 *yuv2packed1 = yuv2rgb48le_full_1_c;
3510 3423 break;
3511 8 case AV_PIX_FMT_BGR48LE:
3512 8 *yuv2packedX = yuv2bgr48le_full_X_c;
3513 8 *yuv2packed2 = yuv2bgr48le_full_2_c;
3514 8 *yuv2packed1 = yuv2bgr48le_full_1_c;
3515 8 break;
3516 10 case AV_PIX_FMT_RGB48BE:
3517 10 *yuv2packedX = yuv2rgb48be_full_X_c;
3518 10 *yuv2packed2 = yuv2rgb48be_full_2_c;
3519 10 *yuv2packed1 = yuv2rgb48be_full_1_c;
3520 10 break;
3521 5 case AV_PIX_FMT_BGR48BE:
3522 5 *yuv2packedX = yuv2bgr48be_full_X_c;
3523 5 *yuv2packed2 = yuv2bgr48be_full_2_c;
3524 5 *yuv2packed1 = yuv2bgr48be_full_1_c;
3525 5 break;
3526 352 case AV_PIX_FMT_BGR4_BYTE:
3527 352 *yuv2packedX = yuv2bgr4_byte_full_X_c;
3528 352 *yuv2packed2 = yuv2bgr4_byte_full_2_c;
3529 352 *yuv2packed1 = yuv2bgr4_byte_full_1_c;
3530 352 break;
3531 352 case AV_PIX_FMT_RGB4_BYTE:
3532 352 *yuv2packedX = yuv2rgb4_byte_full_X_c;
3533 352 *yuv2packed2 = yuv2rgb4_byte_full_2_c;
3534 352 *yuv2packed1 = yuv2rgb4_byte_full_1_c;
3535 352 break;
3536 704 case AV_PIX_FMT_BGR8:
3537 704 *yuv2packedX = yuv2bgr8_full_X_c;
3538 704 *yuv2packed2 = yuv2bgr8_full_2_c;
3539 704 *yuv2packed1 = yuv2bgr8_full_1_c;
3540 704 break;
3541 403 case AV_PIX_FMT_RGB8:
3542 403 *yuv2packedX = yuv2rgb8_full_X_c;
3543 403 *yuv2packed2 = yuv2rgb8_full_2_c;
3544 403 *yuv2packed1 = yuv2rgb8_full_1_c;
3545 403 break;
3546 563 case AV_PIX_FMT_X2RGB10LE:
3547 563 *yuv2packedX = yuv2x2rgb10_full_X_c;
3548 563 *yuv2packed2 = yuv2x2rgb10_full_2_c;
3549 563 *yuv2packed1 = yuv2x2rgb10_full_1_c;
3550 563 break;
3551 563 case AV_PIX_FMT_X2BGR10LE:
3552 563 *yuv2packedX = yuv2x2bgr10_full_X_c;
3553 563 *yuv2packed2 = yuv2x2bgr10_full_2_c;
3554 563 *yuv2packed1 = yuv2x2bgr10_full_1_c;
3555 563 break;
3556 25761 case AV_PIX_FMT_GBRP:
3557 case AV_PIX_FMT_GBRP9BE:
3558 case AV_PIX_FMT_GBRP9LE:
3559 case AV_PIX_FMT_GBRP10BE:
3560 case AV_PIX_FMT_GBRP10LE:
3561 case AV_PIX_FMT_GBRP12BE:
3562 case AV_PIX_FMT_GBRP12LE:
3563 case AV_PIX_FMT_GBRP14BE:
3564 case AV_PIX_FMT_GBRP14LE:
3565 case AV_PIX_FMT_GBRAP:
3566 case AV_PIX_FMT_GBRAP10BE:
3567 case AV_PIX_FMT_GBRAP10LE:
3568 case AV_PIX_FMT_GBRAP12BE:
3569 case AV_PIX_FMT_GBRAP12LE:
3570 case AV_PIX_FMT_GBRAP14BE:
3571 case AV_PIX_FMT_GBRAP14LE:
3572 25761 *yuv2anyX = yuv2gbrp_full_X_c;
3573 25761 break;
3574 340 case AV_PIX_FMT_GBRP10MSBBE:
3575 case AV_PIX_FMT_GBRP10MSBLE:
3576 case AV_PIX_FMT_GBRP12MSBBE:
3577 case AV_PIX_FMT_GBRP12MSBLE:
3578 340 *yuv2anyX = yuv2gbrpmsb_full_X_c;
3579 340 break;
3580 4286 case AV_PIX_FMT_GBRP16BE:
3581 case AV_PIX_FMT_GBRP16LE:
3582 case AV_PIX_FMT_GBRAP16BE:
3583 case AV_PIX_FMT_GBRAP16LE:
3584 4286 *yuv2anyX = yuv2gbrp16_full_X_c;
3585 4286 break;
3586 2441 case AV_PIX_FMT_GBRPF32BE:
3587 case AV_PIX_FMT_GBRPF32LE:
3588 case AV_PIX_FMT_GBRAPF32BE:
3589 case AV_PIX_FMT_GBRAPF32LE:
3590 2441 *yuv2anyX = yuv2gbrpf32_full_X_c;
3591 2441 break;
3592 }
3593
3/4
✓ Branch 0 taken 32828 times.
✓ Branch 1 taken 13175 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 32828 times.
46003 if (!*yuv2packedX && !*yuv2anyX)
3594 goto YUV_PACKED;
3595 } else {
3596 177281 YUV_PACKED:
3597
21/21
✓ Branch 0 taken 167 times.
✓ Branch 1 taken 115 times.
✓ Branch 2 taken 115 times.
✓ Branch 3 taken 115 times.
✓ Branch 4 taken 3547 times.
✓ Branch 5 taken 249 times.
✓ Branch 6 taken 120 times.
✓ Branch 7 taken 115 times.
✓ Branch 8 taken 1488 times.
✓ Branch 9 taken 564 times.
✓ Branch 10 taken 6334 times.
✓ Branch 11 taken 1456 times.
✓ Branch 12 taken 1620 times.
✓ Branch 13 taken 2731 times.
✓ Branch 14 taken 480 times.
✓ Branch 15 taken 1155 times.
✓ Branch 16 taken 78 times.
✓ Branch 17 taken 259 times.
✓ Branch 18 taken 76 times.
✓ Branch 19 taken 76 times.
✓ Branch 20 taken 156421 times.
177281 switch (dstFormat) {
3598 167 case AV_PIX_FMT_RGBA64LE:
3599 #if CONFIG_SWSCALE_ALPHA
3600
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 167 times.
167 if (c->needAlpha) {
3601 *yuv2packed1 = yuv2rgba64le_1_c;
3602 *yuv2packed2 = yuv2rgba64le_2_c;
3603 *yuv2packedX = yuv2rgba64le_X_c;
3604 } else
3605 #endif /* CONFIG_SWSCALE_ALPHA */
3606 {
3607 167 *yuv2packed1 = yuv2rgbx64le_1_c;
3608 167 *yuv2packed2 = yuv2rgbx64le_2_c;
3609 167 *yuv2packedX = yuv2rgbx64le_X_c;
3610 }
3611 167 break;
3612 115 case AV_PIX_FMT_RGBA64BE:
3613 #if CONFIG_SWSCALE_ALPHA
3614
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 115 times.
115 if (c->needAlpha) {
3615 *yuv2packed1 = yuv2rgba64be_1_c;
3616 *yuv2packed2 = yuv2rgba64be_2_c;
3617 *yuv2packedX = yuv2rgba64be_X_c;
3618 } else
3619 #endif /* CONFIG_SWSCALE_ALPHA */
3620 {
3621 115 *yuv2packed1 = yuv2rgbx64be_1_c;
3622 115 *yuv2packed2 = yuv2rgbx64be_2_c;
3623 115 *yuv2packedX = yuv2rgbx64be_X_c;
3624 }
3625 115 break;
3626 115 case AV_PIX_FMT_BGRA64LE:
3627 #if CONFIG_SWSCALE_ALPHA
3628
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 115 times.
115 if (c->needAlpha) {
3629 *yuv2packed1 = yuv2bgra64le_1_c;
3630 *yuv2packed2 = yuv2bgra64le_2_c;
3631 *yuv2packedX = yuv2bgra64le_X_c;
3632 } else
3633 #endif /* CONFIG_SWSCALE_ALPHA */
3634 {
3635 115 *yuv2packed1 = yuv2bgrx64le_1_c;
3636 115 *yuv2packed2 = yuv2bgrx64le_2_c;
3637 115 *yuv2packedX = yuv2bgrx64le_X_c;
3638 }
3639 115 break;
3640 115 case AV_PIX_FMT_BGRA64BE:
3641 #if CONFIG_SWSCALE_ALPHA
3642
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 115 times.
115 if (c->needAlpha) {
3643 *yuv2packed1 = yuv2bgra64be_1_c;
3644 *yuv2packed2 = yuv2bgra64be_2_c;
3645 *yuv2packedX = yuv2bgra64be_X_c;
3646 } else
3647 #endif /* CONFIG_SWSCALE_ALPHA */
3648 {
3649 115 *yuv2packed1 = yuv2bgrx64be_1_c;
3650 115 *yuv2packed2 = yuv2bgrx64be_2_c;
3651 115 *yuv2packedX = yuv2bgrx64be_X_c;
3652 }
3653 115 break;
3654 3547 case AV_PIX_FMT_RGB48LE:
3655 3547 *yuv2packed1 = yuv2rgb48le_1_c;
3656 3547 *yuv2packed2 = yuv2rgb48le_2_c;
3657 3547 *yuv2packedX = yuv2rgb48le_X_c;
3658 3547 break;
3659 249 case AV_PIX_FMT_RGB48BE:
3660 249 *yuv2packed1 = yuv2rgb48be_1_c;
3661 249 *yuv2packed2 = yuv2rgb48be_2_c;
3662 249 *yuv2packedX = yuv2rgb48be_X_c;
3663 249 break;
3664 120 case AV_PIX_FMT_BGR48LE:
3665 120 *yuv2packed1 = yuv2bgr48le_1_c;
3666 120 *yuv2packed2 = yuv2bgr48le_2_c;
3667 120 *yuv2packedX = yuv2bgr48le_X_c;
3668 120 break;
3669 115 case AV_PIX_FMT_BGR48BE:
3670 115 *yuv2packed1 = yuv2bgr48be_1_c;
3671 115 *yuv2packed2 = yuv2bgr48be_2_c;
3672 115 *yuv2packedX = yuv2bgr48be_X_c;
3673 115 break;
3674 1488 case AV_PIX_FMT_RGB32:
3675 case AV_PIX_FMT_BGR32:
3676 #if CONFIG_SMALL
3677 *yuv2packed1 = yuv2rgb32_1_c;
3678 *yuv2packed2 = yuv2rgb32_2_c;
3679 *yuv2packedX = yuv2rgb32_X_c;
3680 #else
3681 #if CONFIG_SWSCALE_ALPHA
3682
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1488 times.
1488 if (c->needAlpha) {
3683 *yuv2packed1 = yuv2rgba32_1_c;
3684 *yuv2packed2 = yuv2rgba32_2_c;
3685 *yuv2packedX = yuv2rgba32_X_c;
3686 } else
3687 #endif /* CONFIG_SWSCALE_ALPHA */
3688 {
3689 1488 *yuv2packed1 = yuv2rgbx32_1_c;
3690 1488 *yuv2packed2 = yuv2rgbx32_2_c;
3691 1488 *yuv2packedX = yuv2rgbx32_X_c;
3692 }
3693 #endif /* !CONFIG_SMALL */
3694 1488 break;
3695 564 case AV_PIX_FMT_RGB32_1:
3696 case AV_PIX_FMT_BGR32_1:
3697 #if CONFIG_SMALL
3698 *yuv2packed1 = yuv2rgb32_1_1_c;
3699 *yuv2packed2 = yuv2rgb32_1_2_c;
3700 *yuv2packedX = yuv2rgb32_1_X_c;
3701 #else
3702 #if CONFIG_SWSCALE_ALPHA
3703
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 564 times.
564 if (c->needAlpha) {
3704 *yuv2packed1 = yuv2rgba32_1_1_c;
3705 *yuv2packed2 = yuv2rgba32_1_2_c;
3706 *yuv2packedX = yuv2rgba32_1_X_c;
3707 } else
3708 #endif /* CONFIG_SWSCALE_ALPHA */
3709 {
3710 564 *yuv2packed1 = yuv2rgbx32_1_1_c;
3711 564 *yuv2packed2 = yuv2rgbx32_1_2_c;
3712 564 *yuv2packedX = yuv2rgbx32_1_X_c;
3713 }
3714 #endif /* !CONFIG_SMALL */
3715 564 break;
3716 6334 case AV_PIX_FMT_RGB24:
3717 6334 *yuv2packed1 = yuv2rgb24_1_c;
3718 6334 *yuv2packed2 = yuv2rgb24_2_c;
3719 6334 *yuv2packedX = yuv2rgb24_X_c;
3720 6334 break;
3721 1456 case AV_PIX_FMT_BGR24:
3722 1456 *yuv2packed1 = yuv2bgr24_1_c;
3723 1456 *yuv2packed2 = yuv2bgr24_2_c;
3724 1456 *yuv2packedX = yuv2bgr24_X_c;
3725 1456 break;
3726 1620 case AV_PIX_FMT_RGB565LE:
3727 case AV_PIX_FMT_RGB565BE:
3728 case AV_PIX_FMT_BGR565LE:
3729 case AV_PIX_FMT_BGR565BE:
3730 1620 *yuv2packed1 = yuv2rgb16_1_c;
3731 1620 *yuv2packed2 = yuv2rgb16_2_c;
3732 1620 *yuv2packedX = yuv2rgb16_X_c;
3733 1620 break;
3734 2731 case AV_PIX_FMT_RGB555LE:
3735 case AV_PIX_FMT_RGB555BE:
3736 case AV_PIX_FMT_BGR555LE:
3737 case AV_PIX_FMT_BGR555BE:
3738 2731 *yuv2packed1 = yuv2rgb15_1_c;
3739 2731 *yuv2packed2 = yuv2rgb15_2_c;
3740 2731 *yuv2packedX = yuv2rgb15_X_c;
3741 2731 break;
3742 480 case AV_PIX_FMT_RGB444LE:
3743 case AV_PIX_FMT_RGB444BE:
3744 case AV_PIX_FMT_BGR444LE:
3745 case AV_PIX_FMT_BGR444BE:
3746 480 *yuv2packed1 = yuv2rgb12_1_c;
3747 480 *yuv2packed2 = yuv2rgb12_2_c;
3748 480 *yuv2packedX = yuv2rgb12_X_c;
3749 480 break;
3750 1155 case AV_PIX_FMT_RGB8:
3751 case AV_PIX_FMT_BGR8:
3752 1155 *yuv2packed1 = yuv2rgb8_1_c;
3753 1155 *yuv2packed2 = yuv2rgb8_2_c;
3754 1155 *yuv2packedX = yuv2rgb8_X_c;
3755 1155 break;
3756 78 case AV_PIX_FMT_RGB4:
3757 case AV_PIX_FMT_BGR4:
3758 78 *yuv2packed1 = yuv2rgb4_1_c;
3759 78 *yuv2packed2 = yuv2rgb4_2_c;
3760 78 *yuv2packedX = yuv2rgb4_X_c;
3761 78 break;
3762 259 case AV_PIX_FMT_RGB4_BYTE:
3763 case AV_PIX_FMT_BGR4_BYTE:
3764 259 *yuv2packed1 = yuv2rgb4b_1_c;
3765 259 *yuv2packed2 = yuv2rgb4b_2_c;
3766 259 *yuv2packedX = yuv2rgb4b_X_c;
3767 259 break;
3768 76 case AV_PIX_FMT_X2RGB10LE:
3769 case AV_PIX_FMT_X2RGB10BE:
3770 76 *yuv2packed1 = yuv2x2rgb10_1_c;
3771 76 *yuv2packed2 = yuv2x2rgb10_2_c;
3772 76 *yuv2packedX = yuv2x2rgb10_X_c;
3773 76 break;
3774 76 case AV_PIX_FMT_X2BGR10LE:
3775 case AV_PIX_FMT_X2BGR10BE:
3776 76 *yuv2packed1 = yuv2x2bgr10_1_c;
3777 76 *yuv2packed2 = yuv2x2bgr10_2_c;
3778 76 *yuv2packedX = yuv2x2bgr10_X_c;
3779 76 break;
3780 }
3781 }
3782
24/24
✓ Branch 0 taken 1720 times.
✓ Branch 1 taken 806 times.
✓ Branch 2 taken 816 times.
✓ Branch 3 taken 753 times.
✓ Branch 4 taken 1056 times.
✓ Branch 5 taken 1177 times.
✓ Branch 6 taken 86 times.
✓ Branch 7 taken 86 times.
✓ Branch 8 taken 81 times.
✓ Branch 9 taken 1167 times.
✓ Branch 10 taken 81 times.
✓ Branch 11 taken 81 times.
✓ Branch 12 taken 86 times.
✓ Branch 13 taken 859 times.
✓ Branch 14 taken 490 times.
✓ Branch 15 taken 763 times.
✓ Branch 16 taken 763 times.
✓ Branch 17 taken 763 times.
✓ Branch 18 taken 949 times.
✓ Branch 19 taken 949 times.
✓ Branch 20 taken 748 times.
✓ Branch 21 taken 748 times.
✓ Branch 22 taken 934 times.
✓ Branch 23 taken 207322 times.
223284 switch (dstFormat) {
3783 1720 case AV_PIX_FMT_MONOWHITE:
3784 1720 *yuv2packed1 = yuv2monowhite_1_c;
3785 1720 *yuv2packed2 = yuv2monowhite_2_c;
3786 1720 *yuv2packedX = yuv2monowhite_X_c;
3787 1720 break;
3788 806 case AV_PIX_FMT_MONOBLACK:
3789 806 *yuv2packed1 = yuv2monoblack_1_c;
3790 806 *yuv2packed2 = yuv2monoblack_2_c;
3791 806 *yuv2packedX = yuv2monoblack_X_c;
3792 806 break;
3793 816 case AV_PIX_FMT_YUYV422:
3794 816 *yuv2packed1 = yuv2yuyv422_1_c;
3795 816 *yuv2packed2 = yuv2yuyv422_2_c;
3796 816 *yuv2packedX = yuv2yuyv422_X_c;
3797 816 break;
3798 753 case AV_PIX_FMT_YVYU422:
3799 753 *yuv2packed1 = yuv2yvyu422_1_c;
3800 753 *yuv2packed2 = yuv2yvyu422_2_c;
3801 753 *yuv2packedX = yuv2yvyu422_X_c;
3802 753 break;
3803 1056 case AV_PIX_FMT_UYVY422:
3804 1056 *yuv2packed1 = yuv2uyvy422_1_c;
3805 1056 *yuv2packed2 = yuv2uyvy422_2_c;
3806 1056 *yuv2packedX = yuv2uyvy422_X_c;
3807 1056 break;
3808 1177 case AV_PIX_FMT_VYU444:
3809 1177 *yuv2packed1 = yuv2vyu444_1_c;
3810 1177 *yuv2packed2 = yuv2vyu444_2_c;
3811 1177 *yuv2packedX = yuv2vyu444_X_c;
3812 1177 break;
3813 86 case AV_PIX_FMT_YA8:
3814 86 *yuv2packed1 = yuv2ya8_1_c;
3815 86 *yuv2packed2 = yuv2ya8_2_c;
3816 86 *yuv2packedX = yuv2ya8_X_c;
3817 86 break;
3818 86 case AV_PIX_FMT_YA16LE:
3819 86 *yuv2packed1 = yuv2ya16le_1_c;
3820 86 *yuv2packed2 = yuv2ya16le_2_c;
3821 86 *yuv2packedX = yuv2ya16le_X_c;
3822 86 break;
3823 81 case AV_PIX_FMT_YA16BE:
3824 81 *yuv2packed1 = yuv2ya16be_1_c;
3825 81 *yuv2packed2 = yuv2ya16be_2_c;
3826 81 *yuv2packedX = yuv2ya16be_X_c;
3827 81 break;
3828 1167 case AV_PIX_FMT_V30XLE:
3829 1167 *yuv2packedX = yuv2v30xle_X_c;
3830 1167 break;
3831 81 case AV_PIX_FMT_AYUV64LE:
3832 81 *yuv2packedX = yuv2ayuv64le_X_c;
3833 81 break;
3834 81 case AV_PIX_FMT_AYUV64BE:
3835 81 *yuv2packedX = yuv2ayuv64be_X_c;
3836 81 break;
3837 86 case AV_PIX_FMT_AYUV:
3838 86 *yuv2packed1 = yuv2ayuv_1_c;
3839 86 *yuv2packed2 = yuv2ayuv_2_c;
3840 86 *yuv2packedX = yuv2ayuv_X_c;
3841 86 break;
3842 859 case AV_PIX_FMT_VUYA:
3843 case AV_PIX_FMT_VUYX:
3844 859 *yuv2packed1 = yuv2vuyX_1_c;
3845 859 *yuv2packed2 = yuv2vuyX_2_c;
3846 859 *yuv2packedX = yuv2vuyX_X_c;
3847 859 break;
3848 490 case AV_PIX_FMT_UYVA:
3849 490 *yuv2packed1 = yuv2uyva_1_c;
3850 490 *yuv2packed2 = yuv2uyva_2_c;
3851 490 *yuv2packedX = yuv2uyva_X_c;
3852 490 break;
3853 763 case AV_PIX_FMT_XV30LE:
3854 763 *yuv2packedX = yuv2xv30le_X_c;
3855 763 break;
3856 763 case AV_PIX_FMT_XV36LE:
3857 763 *yuv2packedX = yuv2xv36le_X_c;
3858 763 break;
3859 763 case AV_PIX_FMT_XV36BE:
3860 763 *yuv2packedX = yuv2xv36be_X_c;
3861 763 break;
3862 949 case AV_PIX_FMT_XV48LE:
3863 949 *yuv2packedX = yuv2xv48le_X_c;
3864 949 break;
3865 949 case AV_PIX_FMT_XV48BE:
3866 949 *yuv2packedX = yuv2xv48be_X_c;
3867 949 break;
3868 748 case AV_PIX_FMT_Y210LE:
3869 748 *yuv2packedX = yuv2y210le_X_c;
3870 748 break;
3871 748 case AV_PIX_FMT_Y212LE:
3872 748 *yuv2packedX = yuv2y212le_X_c;
3873 748 break;
3874 934 case AV_PIX_FMT_Y216LE:
3875 934 *yuv2packedX = yuv2y216le_X_c;
3876 934 break;
3877 }
3878 223284 }
3879