FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libswscale/output.c
Date: 2025-01-20 09:27:23
Exec Total Coverage
Lines: 1516 1975 76.8%
Functions: 202 295 68.5%
Branches: 1089 1621 67.2%

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 <stdint.h>
23 #include <stdio.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/intreadwrite.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/mem_internal.h"
33 #include "libavutil/pixdesc.h"
34 #include "config.h"
35 #include "rgb2rgb.h"
36 #include "swscale.h"
37 #include "swscale_internal.h"
38
39 DECLARE_ALIGNED(8, const uint8_t, ff_dither_2x2_4)[][8] = {
40 { 1, 3, 1, 3, 1, 3, 1, 3, },
41 { 2, 0, 2, 0, 2, 0, 2, 0, },
42 { 1, 3, 1, 3, 1, 3, 1, 3, },
43 };
44
45 DECLARE_ALIGNED(8, const uint8_t, ff_dither_2x2_8)[][8] = {
46 { 6, 2, 6, 2, 6, 2, 6, 2, },
47 { 0, 4, 0, 4, 0, 4, 0, 4, },
48 { 6, 2, 6, 2, 6, 2, 6, 2, },
49 };
50
51 DECLARE_ALIGNED(8, const uint8_t, ff_dither_4x4_16)[][8] = {
52 { 8, 4, 11, 7, 8, 4, 11, 7, },
53 { 2, 14, 1, 13, 2, 14, 1, 13, },
54 { 10, 6, 9, 5, 10, 6, 9, 5, },
55 { 0, 12, 3, 15, 0, 12, 3, 15, },
56 { 8, 4, 11, 7, 8, 4, 11, 7, },
57 };
58
59 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_32)[][8] = {
60 { 17, 9, 23, 15, 16, 8, 22, 14, },
61 { 5, 29, 3, 27, 4, 28, 2, 26, },
62 { 21, 13, 19, 11, 20, 12, 18, 10, },
63 { 0, 24, 6, 30, 1, 25, 7, 31, },
64 { 16, 8, 22, 14, 17, 9, 23, 15, },
65 { 4, 28, 2, 26, 5, 29, 3, 27, },
66 { 20, 12, 18, 10, 21, 13, 19, 11, },
67 { 1, 25, 7, 31, 0, 24, 6, 30, },
68 { 17, 9, 23, 15, 16, 8, 22, 14, },
69 };
70
71 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_73)[][8] = {
72 { 0, 55, 14, 68, 3, 58, 17, 72, },
73 { 37, 18, 50, 32, 40, 22, 54, 35, },
74 { 9, 64, 5, 59, 13, 67, 8, 63, },
75 { 46, 27, 41, 23, 49, 31, 44, 26, },
76 { 2, 57, 16, 71, 1, 56, 15, 70, },
77 { 39, 21, 52, 34, 38, 19, 51, 33, },
78 { 11, 66, 7, 62, 10, 65, 6, 60, },
79 { 48, 30, 43, 25, 47, 29, 42, 24, },
80 { 0, 55, 14, 68, 3, 58, 17, 72, },
81 };
82
83 #if 1
84 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
85 {117, 62, 158, 103, 113, 58, 155, 100, },
86 { 34, 199, 21, 186, 31, 196, 17, 182, },
87 {144, 89, 131, 76, 141, 86, 127, 72, },
88 { 0, 165, 41, 206, 10, 175, 52, 217, },
89 {110, 55, 151, 96, 120, 65, 162, 107, },
90 { 28, 193, 14, 179, 38, 203, 24, 189, },
91 {138, 83, 124, 69, 148, 93, 134, 79, },
92 { 7, 172, 48, 213, 3, 168, 45, 210, },
93 {117, 62, 158, 103, 113, 58, 155, 100, },
94 };
95 #elif 1
96 // tries to correct a gamma of 1.5
97 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
98 { 0, 143, 18, 200, 2, 156, 25, 215, },
99 { 78, 28, 125, 64, 89, 36, 138, 74, },
100 { 10, 180, 3, 161, 16, 195, 8, 175, },
101 {109, 51, 93, 38, 121, 60, 105, 47, },
102 { 1, 152, 23, 210, 0, 147, 20, 205, },
103 { 85, 33, 134, 71, 81, 30, 130, 67, },
104 { 14, 190, 6, 171, 12, 185, 5, 166, },
105 {117, 57, 101, 44, 113, 54, 97, 41, },
106 { 0, 143, 18, 200, 2, 156, 25, 215, },
107 };
108 #elif 1
109 // tries to correct a gamma of 2.0
110 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
111 { 0, 124, 8, 193, 0, 140, 12, 213, },
112 { 55, 14, 104, 42, 66, 19, 119, 52, },
113 { 3, 168, 1, 145, 6, 187, 3, 162, },
114 { 86, 31, 70, 21, 99, 39, 82, 28, },
115 { 0, 134, 11, 206, 0, 129, 9, 200, },
116 { 62, 17, 114, 48, 58, 16, 109, 45, },
117 { 5, 181, 2, 157, 4, 175, 1, 151, },
118 { 95, 36, 78, 26, 90, 34, 74, 24, },
119 { 0, 124, 8, 193, 0, 140, 12, 213, },
120 };
121 #else
122 // tries to correct a gamma of 2.5
123 DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
124 { 0, 107, 3, 187, 0, 125, 6, 212, },
125 { 39, 7, 86, 28, 49, 11, 102, 36, },
126 { 1, 158, 0, 131, 3, 180, 1, 151, },
127 { 68, 19, 52, 12, 81, 25, 64, 17, },
128 { 0, 119, 5, 203, 0, 113, 4, 195, },
129 { 45, 9, 96, 33, 42, 8, 91, 30, },
130 { 2, 172, 1, 144, 2, 165, 0, 137, },
131 { 77, 23, 60, 15, 72, 21, 56, 14, },
132 { 0, 107, 3, 187, 0, 125, 6, 212, },
133 };
134 #endif
135
136 #define IS_BE_LE 0
137 #define IS_BE_BE 1
138 /* ENDIAN_IDENTIFIER needs to be "BE" or "LE". */
139 #define IS_BE(ENDIAN_IDENTIFIER) IS_BE_ ## ENDIAN_IDENTIFIER
140
141 #define output_pixel(pos, val, bias, signedness) \
142 if (big_endian) { \
143 AV_WB16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
144 } else { \
145 AV_WL16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
146 }
147
148 static av_always_inline void
149 2142478 yuv2plane1_16_c_template(const int32_t *src, uint16_t *dest, int dstW,
150 int big_endian, int output_bits)
151 {
152 int i;
153 2142478 int shift = 3;
154
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2142478 times.
2142478 av_assert0(output_bits == 16);
155
156
2/2
✓ Branch 0 taken 698681800 times.
✓ Branch 1 taken 2142478 times.
700824278 for (i = 0; i < dstW; i++) {
157 698681800 int val = src[i] + (1 << (shift - 1));
158
2/2
✓ Branch 0 taken 253452960 times.
✓ Branch 1 taken 445228840 times.
698681800 output_pixel(&dest[i], val, 0, uint);
159 }
160 2142478 }
161
162 static av_always_inline void
163 494088 yuv2planeX_16_c_template(const int16_t *filter, int filterSize,
164 const int32_t **src, uint16_t *dest, int dstW,
165 int big_endian, int output_bits)
166 {
167 int i;
168 494088 int shift = 15;
169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 494088 times.
494088 av_assert0(output_bits == 16);
170
171
2/2
✓ Branch 0 taken 136064032 times.
✓ Branch 1 taken 494088 times.
136558120 for (i = 0; i < dstW; i++) {
172 136064032 int val = 1 << (shift - 1);
173 int j;
174
175 /* range of val is [0,0x7FFFFFFF], so 31 bits, but with lanczos/spline
176 * filters (or anything with negative coeffs, the range can be slightly
177 * wider in both directions. To account for this overflow, we subtract
178 * a constant so it always fits in the signed range (assuming a
179 * reasonable filterSize), and re-add that at the end. */
180 136064032 val -= 0x40000000;
181
2/2
✓ Branch 0 taken 656087168 times.
✓ Branch 1 taken 136064032 times.
792151200 for (j = 0; j < filterSize; j++)
182 656087168 val += src[j][i] * (unsigned)filter[j];
183
184
2/2
✓ Branch 0 taken 26149504 times.
✓ Branch 1 taken 109914528 times.
136064032 output_pixel(&dest[i], val, 0x8000, int);
185 }
186 494088 }
187
188 static av_always_inline void
189 400676 yuv2nv12cX_16_c_template(int big_endian, const uint8_t *chrDither,
190 const int16_t *chrFilter, int chrFilterSize,
191 const int16_t **chrUSrc, const int16_t **chrVSrc,
192 uint8_t *dest8, int chrDstW, int output_bits)
193 {
194 400676 uint16_t *dest = (uint16_t*)dest8;
195 400676 const int32_t **uSrc = (const int32_t **)chrUSrc;
196 400676 const int32_t **vSrc = (const int32_t **)chrVSrc;
197 400676 int shift = 15;
198 int i, j;
199
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 400676 times.
400676 av_assert0(output_bits == 16);
200
201
2/2
✓ Branch 0 taken 98936944 times.
✓ Branch 1 taken 400676 times.
99337620 for (i = 0; i < chrDstW; i++) {
202 98936944 int u = 1 << (shift - 1);
203 98936944 int v = 1 << (shift - 1);
204
205 /* See yuv2planeX_16_c_template for details. */
206 98936944 u -= 0x40000000;
207 98936944 v -= 0x40000000;
208
2/2
✓ Branch 0 taken 210358848 times.
✓ Branch 1 taken 98936944 times.
309295792 for (j = 0; j < chrFilterSize; j++) {
209 210358848 u += uSrc[j][i] * (unsigned)chrFilter[j];
210 210358848 v += vSrc[j][i] * (unsigned)chrFilter[j];
211 }
212
213
2/2
✓ Branch 0 taken 49633208 times.
✓ Branch 1 taken 49303736 times.
98936944 output_pixel(&dest[2*i] , u, 0x8000, int);
214
2/2
✓ Branch 0 taken 49633208 times.
✓ Branch 1 taken 49303736 times.
98936944 output_pixel(&dest[2*i+1], v, 0x8000, int);
215 }
216 400676 }
217
218 static av_always_inline void
219 24480 yuv2plane1_float_c_template(const int32_t *src, float *dest, int dstW)
220 {
221 static const int big_endian = HAVE_BIGENDIAN;
222 static const int shift = 3;
223 static const float float_mult = 1.0f / 65535.0f;
224 int i, val;
225 uint16_t val_uint;
226
227
2/2
✓ Branch 0 taken 8616960 times.
✓ Branch 1 taken 24480 times.
8641440 for (i = 0; i < dstW; ++i){
228 8616960 val = src[i] + (1 << (shift - 1));
229
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8616960 times.
8616960 output_pixel(&val_uint, val, 0, uint);
230 8616960 dest[i] = float_mult * (float)val_uint;
231 }
232 24480 }
233
234 static av_always_inline void
235 9504 yuv2plane1_float_bswap_c_template(const int32_t *src, uint32_t *dest, int dstW)
236 {
237 static const int big_endian = HAVE_BIGENDIAN;
238 static const int shift = 3;
239 static const float float_mult = 1.0f / 65535.0f;
240 int i, val;
241 uint16_t val_uint;
242
243
2/2
✓ Branch 0 taken 3345408 times.
✓ Branch 1 taken 9504 times.
3354912 for (i = 0; i < dstW; ++i){
244 3345408 val = src[i] + (1 << (shift - 1));
245
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3345408 times.
3345408 output_pixel(&val_uint, val, 0, uint);
246 3345408 dest[i] = av_bswap32(av_float2int(float_mult * (float)val_uint));
247 }
248 9504 }
249
250 static av_always_inline void
251 100 yuv2planeX_float_c_template(const int16_t *filter, int filterSize, const int32_t **src,
252 float *dest, int dstW)
253 {
254 static const int big_endian = HAVE_BIGENDIAN;
255 static const int shift = 15;
256 static const float float_mult = 1.0f / 65535.0f;
257 int i, j, val;
258 uint16_t val_uint;
259
260
2/2
✓ Branch 0 taken 20000 times.
✓ Branch 1 taken 100 times.
20100 for (i = 0; i < dstW; ++i){
261 20000 val = (1 << (shift - 1)) - 0x40000000;
262
2/2
✓ Branch 0 taken 240000 times.
✓ Branch 1 taken 20000 times.
260000 for (j = 0; j < filterSize; ++j){
263 240000 val += src[j][i] * (unsigned)filter[j];
264 }
265
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 20000 times.
20000 output_pixel(&val_uint, val, 0x8000, int);
266 20000 dest[i] = float_mult * (float)val_uint;
267 }
268 100 }
269
270 static av_always_inline void
271 100 yuv2planeX_float_bswap_c_template(const int16_t *filter, int filterSize, const int32_t **src,
272 uint32_t *dest, int dstW)
273 {
274 static const int big_endian = HAVE_BIGENDIAN;
275 static const int shift = 15;
276 static const float float_mult = 1.0f / 65535.0f;
277 int i, j, val;
278 uint16_t val_uint;
279
280
2/2
✓ Branch 0 taken 20000 times.
✓ Branch 1 taken 100 times.
20100 for (i = 0; i < dstW; ++i){
281 20000 val = (1 << (shift - 1)) - 0x40000000;
282
2/2
✓ Branch 0 taken 240000 times.
✓ Branch 1 taken 20000 times.
260000 for (j = 0; j < filterSize; ++j){
283 240000 val += src[j][i] * (unsigned)filter[j];
284 }
285
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 20000 times.
20000 output_pixel(&val_uint, val, 0x8000, int);
286 20000 dest[i] = av_bswap32(av_float2int(float_mult * (float)val_uint));
287 }
288 100 }
289
290 #define yuv2plane1_float(template, dest_type, BE_LE) \
291 static void yuv2plane1_float ## BE_LE ## _c(const int16_t *src, uint8_t *dest, int dstW, \
292 const uint8_t *dither, int offset) \
293 { \
294 template((const int32_t *)src, (dest_type *)dest, dstW); \
295 }
296
297 #define yuv2planeX_float(template, dest_type, BE_LE) \
298 static void yuv2planeX_float ## BE_LE ## _c(const int16_t *filter, int filterSize, \
299 const int16_t **src, uint8_t *dest, int dstW, \
300 const uint8_t *dither, int offset) \
301 { \
302 template(filter, filterSize, (const int32_t **)src, (dest_type *)dest, dstW); \
303 }
304
305 #if HAVE_BIGENDIAN
306 yuv2plane1_float(yuv2plane1_float_c_template, float, BE)
307 yuv2plane1_float(yuv2plane1_float_bswap_c_template, uint32_t, LE)
308 yuv2planeX_float(yuv2planeX_float_c_template, float, BE)
309 yuv2planeX_float(yuv2planeX_float_bswap_c_template, uint32_t, LE)
310 #else
311 24480 yuv2plane1_float(yuv2plane1_float_c_template, float, LE)
312 9504 yuv2plane1_float(yuv2plane1_float_bswap_c_template, uint32_t, BE)
313 100 yuv2planeX_float(yuv2planeX_float_c_template, float, LE)
314 100 yuv2planeX_float(yuv2planeX_float_bswap_c_template, uint32_t, BE)
315 #endif
316
317 #undef output_pixel
318
319 #define output_pixel(pos, val) \
320 if (big_endian) { \
321 AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits)); \
322 } else { \
323 AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits)); \
324 }
325
326 static av_always_inline void
327 6168540 yuv2plane1_10_c_template(const int16_t *src, uint16_t *dest, int dstW,
328 int big_endian, int output_bits)
329 {
330 int i;
331 6168540 int shift = 15 - output_bits;
332
333
2/2
✓ Branch 0 taken 2024455592 times.
✓ Branch 1 taken 6168540 times.
2030624132 for (i = 0; i < dstW; i++) {
334 2024455592 int val = src[i] + (1 << (shift - 1));
335
2/2
✓ Branch 0 taken 334844928 times.
✓ Branch 1 taken 1689610664 times.
2024455592 output_pixel(&dest[i], val);
336 }
337 6168540 }
338
339 static av_always_inline void
340 2752688 yuv2planeX_10_c_template(const int16_t *filter, int filterSize,
341 const int16_t **src, uint16_t *dest, int dstW,
342 int big_endian, int output_bits)
343 {
344 int i;
345 2752688 int shift = 11 + 16 - output_bits;
346
347
2/2
✓ Branch 0 taken 863156616 times.
✓ Branch 1 taken 2752688 times.
865909304 for (i = 0; i < dstW; i++) {
348 863156616 int val = 1 << (shift - 1);
349 int j;
350
351
2/2
✓ Branch 0 taken 3996531744 times.
✓ Branch 1 taken 863156616 times.
4859688360 for (j = 0; j < filterSize; j++)
352 3996531744 val += src[j][i] * filter[j];
353
354
2/2
✓ Branch 0 taken 108455808 times.
✓ Branch 1 taken 754700808 times.
863156616 output_pixel(&dest[i], val);
355 }
356 2752688 }
357
358 #undef output_pixel
359
360 #define yuv2NBPS(bits, BE_LE, is_be, template_size, typeX_t) \
361 static void yuv2plane1_ ## bits ## BE_LE ## _c(const int16_t *src, \
362 uint8_t *dest, int dstW, \
363 const uint8_t *dither, int offset)\
364 { \
365 yuv2plane1_ ## template_size ## _c_template((const typeX_t *) src, \
366 (uint16_t *) dest, dstW, is_be, bits); \
367 }\
368 static void yuv2planeX_ ## bits ## BE_LE ## _c(const int16_t *filter, int filterSize, \
369 const int16_t **src, uint8_t *dest, int dstW, \
370 const uint8_t *dither, int offset)\
371 { \
372 yuv2planeX_## template_size ## _c_template(filter, \
373 filterSize, (const typeX_t **) src, \
374 (uint16_t *) dest, dstW, is_be, bits); \
375 }
376
377 157216 yuv2NBPS( 9, BE, 1, 10, int16_t)
378 172204 yuv2NBPS( 9, LE, 0, 10, int16_t)
379 1362608 yuv2NBPS(10, BE, 1, 10, int16_t)
380 9370652 yuv2NBPS(10, LE, 0, 10, int16_t)
381 1362008 yuv2NBPS(12, BE, 1, 10, int16_t)
382 5240792 yuv2NBPS(12, LE, 0, 10, int16_t)
383 84168 yuv2NBPS(14, BE, 1, 10, int16_t)
384 92808 yuv2NBPS(14, LE, 0, 10, int16_t)
385 1838944 yuv2NBPS(16, BE, 1, 16, int32_t)
386 3434188 yuv2NBPS(16, LE, 0, 16, int32_t)
387
388
389 199258 static void yuv2nv12cX_16LE_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
390 const int16_t *chrFilter, int chrFilterSize,
391 const int16_t **chrUSrc, const int16_t **chrVSrc,
392 uint8_t *dest8, int chrDstW)
393 {
394 199258 yuv2nv12cX_16_c_template(0, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, dest8, chrDstW, 16);
395 199258 }
396
397 201418 static void yuv2nv12cX_16BE_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
398 const int16_t *chrFilter, int chrFilterSize,
399 const int16_t **chrUSrc, const int16_t **chrVSrc,
400 uint8_t *dest8, int chrDstW)
401 {
402 201418 yuv2nv12cX_16_c_template(1, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, dest8, chrDstW, 16);
403 201418 }
404
405 11260546 static void yuv2planeX_8_c(const int16_t *filter, int filterSize,
406 const int16_t **src, uint8_t *dest, int dstW,
407 const uint8_t *dither, int offset)
408 {
409 int i;
410
2/2
✓ Branch 0 taken 6689025666 times.
✓ Branch 1 taken 11260546 times.
6700286212 for (i=0; i<dstW; i++) {
411 6689025666 int val = dither[(i + offset) & 7] << 12;
412 int j;
413
2/2
✓ Branch 0 taken 21779179813 times.
✓ Branch 1 taken 6689025666 times.
28468205479 for (j=0; j<filterSize; j++)
414 21779179813 val += src[j][i] * filter[j];
415
416 6689025666 dest[i]= av_clip_uint8(val>>19);
417 }
418 11260546 }
419
420 9878163 static void yuv2plane1_8_c(const int16_t *src, uint8_t *dest, int dstW,
421 const uint8_t *dither, int offset)
422 {
423 int i;
424
2/2
✓ Branch 0 taken 3741871673 times.
✓ Branch 1 taken 9878163 times.
3751749836 for (i=0; i<dstW; i++) {
425 3741871673 int val = (src[i] + dither[(i + offset) & 7]) >> 7;
426 3741871673 dest[i]= av_clip_uint8(val);
427 }
428 9878163 }
429
430 161802 static void yuv2nv12cX_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
431 const int16_t *chrFilter, int chrFilterSize,
432 const int16_t **chrUSrc, const int16_t **chrVSrc,
433 uint8_t *dest, int chrDstW)
434 {
435 int i;
436
437
2/2
✓ Branch 1 taken 155604 times.
✓ Branch 2 taken 6198 times.
161802 if (!isSwappedChroma(dstFormat))
438
2/2
✓ Branch 0 taken 37768344 times.
✓ Branch 1 taken 155604 times.
37923948 for (i=0; i<chrDstW; i++) {
439 37768344 int u = chrDither[i & 7] << 12;
440 37768344 int v = chrDither[(i + 3) & 7] << 12;
441 int j;
442
2/2
✓ Branch 0 taken 85534144 times.
✓ Branch 1 taken 37768344 times.
123302488 for (j=0; j<chrFilterSize; j++) {
443 85534144 u += chrUSrc[j][i] * chrFilter[j];
444 85534144 v += chrVSrc[j][i] * chrFilter[j];
445 }
446
447 37768344 dest[2*i]= av_clip_uint8(u>>19);
448 37768344 dest[2*i+1]= av_clip_uint8(v>>19);
449 }
450 else
451
2/2
✓ Branch 0 taken 2153896 times.
✓ Branch 1 taken 6198 times.
2160094 for (i=0; i<chrDstW; i++) {
452 2153896 int u = chrDither[i & 7] << 12;
453 2153896 int v = chrDither[(i + 3) & 7] << 12;
454 int j;
455
2/2
✓ Branch 0 taken 8815584 times.
✓ Branch 1 taken 2153896 times.
10969480 for (j=0; j<chrFilterSize; j++) {
456 8815584 u += chrUSrc[j][i] * chrFilter[j];
457 8815584 v += chrVSrc[j][i] * chrFilter[j];
458 }
459
460 2153896 dest[2*i]= av_clip_uint8(v>>19);
461 2153896 dest[2*i+1]= av_clip_uint8(u>>19);
462 }
463 161802 }
464
465
466 #define output_pixel(pos, val) \
467 if (big_endian) { \
468 AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits) << output_shift); \
469 } else { \
470 AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits) << output_shift); \
471 }
472
473 781632 static void yuv2p01xl1_c(const int16_t *src,
474 uint16_t *dest, int dstW,
475 int big_endian, int output_bits)
476 {
477 int i;
478 781632 int shift = 15 - output_bits;
479 781632 int output_shift = 16 - output_bits;
480
481
2/2
✓ Branch 0 taken 275134464 times.
✓ Branch 1 taken 781632 times.
275916096 for (i = 0; i < dstW; i++) {
482 275134464 int val = src[i] + (1 << (shift - 1));
483
2/2
✓ Branch 0 taken 138276864 times.
✓ Branch 1 taken 136857600 times.
275134464 output_pixel(&dest[i], val);
484 }
485 781632 }
486
487 1200 static void yuv2p01xlX_c(const int16_t *filter, int filterSize,
488 const int16_t **src, uint16_t *dest, int dstW,
489 int big_endian, int output_bits)
490 {
491 int i, j;
492 1200 int shift = 11 + 16 - output_bits;
493 1200 int output_shift = 16 - output_bits;
494
495
2/2
✓ Branch 0 taken 240000 times.
✓ Branch 1 taken 1200 times.
241200 for (i = 0; i < dstW; i++) {
496 240000 int val = 1 << (shift - 1);
497
498
2/2
✓ Branch 0 taken 2880000 times.
✓ Branch 1 taken 240000 times.
3120000 for (j = 0; j < filterSize; j++)
499 2880000 val += src[j][i] * filter[j];
500
501
2/2
✓ Branch 0 taken 120000 times.
✓ Branch 1 taken 120000 times.
240000 output_pixel(&dest[i], val);
502 }
503 1200 }
504
505 654472 static void yuv2p01xcX_c(int big_endian, const uint8_t *chrDither,
506 const int16_t *chrFilter, int chrFilterSize,
507 const int16_t **chrUSrc, const int16_t **chrVSrc,
508 uint8_t *dest8, int chrDstW, int output_bits)
509 {
510 654472 uint16_t *dest = (uint16_t*)dest8;
511 int i, j;
512 654472 int shift = 11 + 16 - output_bits;
513 654472 int output_shift = 16 - output_bits;
514
515
2/2
✓ Branch 0 taken 161479904 times.
✓ Branch 1 taken 654472 times.
162134376 for (i = 0; i < chrDstW; i++) {
516 161479904 int u = 1 << (shift - 1);
517 161479904 int v = 1 << (shift - 1);
518
519
2/2
✓ Branch 0 taken 347422848 times.
✓ Branch 1 taken 161479904 times.
508902752 for (j = 0; j < chrFilterSize; j++) {
520 347422848 u += chrUSrc[j][i] * chrFilter[j];
521 347422848 v += chrVSrc[j][i] * chrFilter[j];
522 }
523
524
2/2
✓ Branch 0 taken 80815984 times.
✓ Branch 1 taken 80663920 times.
161479904 output_pixel(&dest[2*i] , u);
525
2/2
✓ Branch 0 taken 80815984 times.
✓ Branch 1 taken 80663920 times.
161479904 output_pixel(&dest[2*i+1], v);
526 }
527 654472 }
528
529 #undef output_pixel
530
531 #define yuv2p01x_wrapper(bits) \
532 static void yuv2p0 ## bits ## l1_LE_c(const int16_t *src, \
533 uint8_t *dest, int dstW, \
534 const uint8_t *dither, int offset) \
535 { \
536 yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 0, bits); \
537 } \
538 \
539 static void yuv2p0 ## bits ## l1_BE_c(const int16_t *src, \
540 uint8_t *dest, int dstW, \
541 const uint8_t *dither, int offset) \
542 { \
543 yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 1, bits); \
544 } \
545 \
546 static void yuv2p0 ## bits ## lX_LE_c(const int16_t *filter, \
547 int filterSize, const int16_t **src, \
548 uint8_t *dest, int dstW, \
549 const uint8_t *dither, int offset) \
550 { \
551 yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 0, bits); \
552 } \
553 \
554 static void yuv2p0 ## bits ## lX_BE_c(const int16_t *filter, \
555 int filterSize, const int16_t **src, \
556 uint8_t *dest, int dstW, \
557 const uint8_t *dither, int offset) \
558 { \
559 yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 1, bits); \
560 } \
561 \
562 static void yuv2p0 ## bits ## cX_LE_c(enum AVPixelFormat dstFormat, \
563 const uint8_t *chrDither, \
564 const int16_t *chrFilter, \
565 int chrFilterSize, \
566 const int16_t **chrUSrc, \
567 const int16_t **chrVSrc, \
568 uint8_t *dest8, int chrDstW) \
569 { \
570 yuv2p01xcX_c(0, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, \
571 dest8, chrDstW, bits); \
572 } \
573 \
574 static void yuv2p0 ## bits ## cX_BE_c(enum AVPixelFormat dstFormat, \
575 const uint8_t *chrDither, \
576 const int16_t *chrFilter, \
577 int chrFilterSize, \
578 const int16_t **chrUSrc, \
579 const int16_t **chrVSrc, \
580 uint8_t *dest8, int chrDstW) \
581 { \
582 yuv2p01xcX_c(1, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, \
583 dest8, chrDstW, bits); \
584 }
585
586 1428664 yuv2p01x_wrapper(10)
587 1445944 yuv2p01x_wrapper(12)
588
589 #define accumulate_bit(acc, val) \
590 acc <<= 1; \
591 acc |= (val) >= 234
592 #define output_pixel(pos, acc) \
593 if (target == AV_PIX_FMT_MONOBLACK) { \
594 pos = acc; \
595 } else { \
596 pos = ~acc; \
597 }
598
599 static av_always_inline void
600 85420 yuv2mono_X_c_template(SwsInternal *c, const int16_t *lumFilter,
601 const int16_t **lumSrc, int lumFilterSize,
602 const int16_t *chrFilter, const int16_t **chrUSrc,
603 const int16_t **chrVSrc, int chrFilterSize,
604 const int16_t **alpSrc, uint8_t *dest, int dstW,
605 int y, enum AVPixelFormat target)
606 {
607 85420 const uint8_t * const d128 = ff_dither_8x8_220[y&7];
608 int i;
609 85420 unsigned acc = 0;
610 85420 int err = 0;
611
612
2/2
✓ Branch 0 taken 14748420 times.
✓ Branch 1 taken 85420 times.
14833840 for (i = 0; i < dstW; i += 2) {
613 int j;
614 14748420 int Y1 = 1 << 18;
615 14748420 int Y2 = 1 << 18;
616
617
2/2
✓ Branch 0 taken 14968420 times.
✓ Branch 1 taken 14748420 times.
29716840 for (j = 0; j < lumFilterSize; j++) {
618 14968420 Y1 += lumSrc[j][i] * lumFilter[j];
619 14968420 Y2 += lumSrc[j][i+1] * lumFilter[j];
620 }
621 14748420 Y1 >>= 19;
622 14748420 Y2 >>= 19;
623
2/2
✓ Branch 0 taken 376 times.
✓ Branch 1 taken 14748044 times.
14748420 if ((Y1 | Y2) & 0x100) {
624 376 Y1 = av_clip_uint8(Y1);
625 376 Y2 = av_clip_uint8(Y2);
626 }
627
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14748420 times.
14748420 if (c->opts.dither == SWS_DITHER_ED) {
628 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;
629 c->dither_error[0][i] = err;
630 acc = 2*acc + (Y1 >= 128);
631 Y1 -= 220*(acc&1);
632
633 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);
634 c->dither_error[0][i+1] = Y1;
635 acc = 2*acc + (err >= 128);
636 err -= 220*(acc&1);
637 } else {
638 14748420 accumulate_bit(acc, Y1 + d128[(i + 0) & 7]);
639 14748420 accumulate_bit(acc, Y2 + d128[(i + 1) & 7]);
640 }
641
2/2
✓ Branch 0 taken 3686680 times.
✓ Branch 1 taken 11061740 times.
14748420 if ((i & 7) == 6) {
642
2/2
✓ Branch 0 taken 560068 times.
✓ Branch 1 taken 3126612 times.
3686680 output_pixel(*dest++, acc);
643 }
644 }
645 85420 c->dither_error[0][i] = err;
646
647
2/2
✓ Branch 0 taken 1700 times.
✓ Branch 1 taken 83720 times.
85420 if (i & 6) {
648
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1700 times.
1700 output_pixel(*dest, acc);
649 }
650 85420 }
651
652 static av_always_inline void
653 yuv2mono_2_c_template(SwsInternal *c, const int16_t *buf[2],
654 const int16_t *ubuf[2], const int16_t *vbuf[2],
655 const int16_t *abuf[2], uint8_t *dest, int dstW,
656 int yalpha, int uvalpha, int y,
657 enum AVPixelFormat target)
658 {
659 const int16_t *buf0 = buf[0], *buf1 = buf[1];
660 const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
661 int yalpha1 = 4096 - yalpha;
662 int i;
663 av_assert2(yalpha <= 4096U);
664
665 if (c->opts.dither == SWS_DITHER_ED) {
666 int err = 0;
667 unsigned acc = 0;
668 for (i = 0; i < dstW; i +=2) {
669 int Y;
670
671 Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
672 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;
673 c->dither_error[0][i] = err;
674 acc = 2*acc + (Y >= 128);
675 Y -= 220*(acc&1);
676
677 err = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
678 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;
679 c->dither_error[0][i+1] = Y;
680 acc = 2*acc + (err >= 128);
681 err -= 220*(acc&1);
682
683 if ((i & 7) == 6)
684 output_pixel(*dest++, acc);
685 }
686 c->dither_error[0][i] = err;
687 } else {
688 for (i = 0; i < dstW; i += 8) {
689 int Y;
690 unsigned acc = 0;
691
692 Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
693 accumulate_bit(acc, Y + d128[0]);
694 Y = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
695 accumulate_bit(acc, Y + d128[1]);
696 Y = (buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19;
697 accumulate_bit(acc, Y + d128[2]);
698 Y = (buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19;
699 accumulate_bit(acc, Y + d128[3]);
700 Y = (buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19;
701 accumulate_bit(acc, Y + d128[4]);
702 Y = (buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19;
703 accumulate_bit(acc, Y + d128[5]);
704 Y = (buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19;
705 accumulate_bit(acc, Y + d128[6]);
706 Y = (buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19;
707 accumulate_bit(acc, Y + d128[7]);
708
709 output_pixel(*dest++, acc);
710 }
711 }
712 }
713
714 static av_always_inline void
715 129408 yuv2mono_1_c_template(SwsInternal *c, const int16_t *buf0,
716 const int16_t *ubuf[2], const int16_t *vbuf[2],
717 const int16_t *abuf0, uint8_t *dest, int dstW,
718 int uvalpha, int y, enum AVPixelFormat target)
719 {
720 129408 const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
721 int i;
722
723
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 129408 times.
129408 if (c->opts.dither == SWS_DITHER_ED) {
724 int err = 0;
725 unsigned acc = 0;
726 for (i = 0; i < dstW; i +=2) {
727 int Y;
728
729 Y = ((buf0[i + 0] + 64) >> 7);
730 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;
731 c->dither_error[0][i] = err;
732 acc = 2*acc + (Y >= 128);
733 Y -= 220*(acc&1);
734
735 err = ((buf0[i + 1] + 64) >> 7);
736 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;
737 c->dither_error[0][i+1] = Y;
738 acc = 2*acc + (err >= 128);
739 err -= 220*(acc&1);
740
741 if ((i & 7) == 6)
742 output_pixel(*dest++, acc);
743 }
744 c->dither_error[0][i] = err;
745 } else {
746
2/2
✓ Branch 0 taken 5329152 times.
✓ Branch 1 taken 129408 times.
5458560 for (i = 0; i < dstW; i += 8) {
747 5329152 unsigned acc = 0;
748 5329152 accumulate_bit(acc, ((buf0[i + 0] + 64) >> 7) + d128[0]);
749 5329152 accumulate_bit(acc, ((buf0[i + 1] + 64) >> 7) + d128[1]);
750 5329152 accumulate_bit(acc, ((buf0[i + 2] + 64) >> 7) + d128[2]);
751 5329152 accumulate_bit(acc, ((buf0[i + 3] + 64) >> 7) + d128[3]);
752 5329152 accumulate_bit(acc, ((buf0[i + 4] + 64) >> 7) + d128[4]);
753 5329152 accumulate_bit(acc, ((buf0[i + 5] + 64) >> 7) + d128[5]);
754 5329152 accumulate_bit(acc, ((buf0[i + 6] + 64) >> 7) + d128[6]);
755 5329152 accumulate_bit(acc, ((buf0[i + 7] + 64) >> 7) + d128[7]);
756
757
2/2
✓ Branch 0 taken 2635776 times.
✓ Branch 1 taken 2693376 times.
5329152 output_pixel(*dest++, acc);
758 }
759 }
760 129408 }
761
762 #undef output_pixel
763 #undef accumulate_bit
764
765 #define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
766 static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
767 const int16_t **lumSrc, int lumFilterSize, \
768 const int16_t *chrFilter, const int16_t **chrUSrc, \
769 const int16_t **chrVSrc, int chrFilterSize, \
770 const int16_t **alpSrc, uint8_t *dest, int dstW, \
771 int y) \
772 { \
773 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
774 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
775 alpSrc, dest, dstW, y, fmt); \
776 } \
777 \
778 static void name ## ext ## _2_c(SwsInternal *c, const int16_t *buf[2], \
779 const int16_t *ubuf[2], const int16_t *vbuf[2], \
780 const int16_t *abuf[2], uint8_t *dest, int dstW, \
781 int yalpha, int uvalpha, int y) \
782 { \
783 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
784 dest, dstW, yalpha, uvalpha, y, fmt); \
785 } \
786 \
787 static void name ## ext ## _1_c(SwsInternal *c, const int16_t *buf0, \
788 const int16_t *ubuf[2], const int16_t *vbuf[2], \
789 const int16_t *abuf0, uint8_t *dest, int dstW, \
790 int uvalpha, int y) \
791 { \
792 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, \
793 abuf0, dest, dstW, uvalpha, \
794 y, fmt); \
795 }
796
797 284304 YUV2PACKEDWRAPPER(yuv2mono,, white, AV_PIX_FMT_MONOWHITE)
798 145352 YUV2PACKEDWRAPPER(yuv2mono,, black, AV_PIX_FMT_MONOBLACK)
799
800 #define output_pixels(pos, Y1, U, Y2, V) \
801 if (target == AV_PIX_FMT_YUYV422) { \
802 dest[pos + 0] = Y1; \
803 dest[pos + 1] = U; \
804 dest[pos + 2] = Y2; \
805 dest[pos + 3] = V; \
806 } else if (target == AV_PIX_FMT_YVYU422) { \
807 dest[pos + 0] = Y1; \
808 dest[pos + 1] = V; \
809 dest[pos + 2] = Y2; \
810 dest[pos + 3] = U; \
811 } else { /* AV_PIX_FMT_UYVY422 */ \
812 dest[pos + 0] = U; \
813 dest[pos + 1] = Y1; \
814 dest[pos + 2] = V; \
815 dest[pos + 3] = Y2; \
816 }
817
818 static av_always_inline void
819 24204 yuv2422_X_c_template(SwsInternal *c, const int16_t *lumFilter,
820 const int16_t **lumSrc, int lumFilterSize,
821 const int16_t *chrFilter, const int16_t **chrUSrc,
822 const int16_t **chrVSrc, int chrFilterSize,
823 const int16_t **alpSrc, uint8_t *dest, int dstW,
824 int y, enum AVPixelFormat target)
825 {
826 int i;
827
828
2/2
✓ Branch 0 taken 4237104 times.
✓ Branch 1 taken 24204 times.
4261308 for (i = 0; i < ((dstW + 1) >> 1); i++) {
829 int j;
830 4237104 int Y1 = 1 << 18;
831 4237104 int Y2 = 1 << 18;
832 4237104 int U = 1 << 18;
833 4237104 int V = 1 << 18;
834
835
2/2
✓ Branch 0 taken 4567104 times.
✓ Branch 1 taken 4237104 times.
8804208 for (j = 0; j < lumFilterSize; j++) {
836 4567104 Y1 += lumSrc[j][i * 2] * lumFilter[j];
837 4567104 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
838 }
839
2/2
✓ Branch 0 taken 17188416 times.
✓ Branch 1 taken 4237104 times.
21425520 for (j = 0; j < chrFilterSize; j++) {
840 17188416 U += chrUSrc[j][i] * chrFilter[j];
841 17188416 V += chrVSrc[j][i] * chrFilter[j];
842 }
843 4237104 Y1 >>= 19;
844 4237104 Y2 >>= 19;
845 4237104 U >>= 19;
846 4237104 V >>= 19;
847
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 4237081 times.
4237104 if ((Y1 | Y2 | U | V) & 0x100) {
848 23 Y1 = av_clip_uint8(Y1);
849 23 Y2 = av_clip_uint8(Y2);
850 23 U = av_clip_uint8(U);
851 23 V = av_clip_uint8(V);
852 }
853
4/4
✓ Branch 0 taken 2290960 times.
✓ Branch 1 taken 1946144 times.
✓ Branch 2 taken 973072 times.
✓ Branch 3 taken 973072 times.
4237104 output_pixels(4*i, Y1, U, Y2, V);
854 }
855 24204 }
856
857 static av_always_inline void
858 yuv2422_2_c_template(SwsInternal *c, const int16_t *buf[2],
859 const int16_t *ubuf[2], const int16_t *vbuf[2],
860 const int16_t *abuf[2], uint8_t *dest, int dstW,
861 int yalpha, int uvalpha, int y,
862 enum AVPixelFormat target)
863 {
864 const int16_t *buf0 = buf[0], *buf1 = buf[1],
865 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
866 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
867 int yalpha1 = 4096 - yalpha;
868 int uvalpha1 = 4096 - uvalpha;
869 int i;
870 av_assert2(yalpha <= 4096U);
871 av_assert2(uvalpha <= 4096U);
872
873 for (i = 0; i < ((dstW + 1) >> 1); i++) {
874 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
875 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
876 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
877 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
878
879 if ((Y1 | Y2 | U | V) & 0x100) {
880 Y1 = av_clip_uint8(Y1);
881 Y2 = av_clip_uint8(Y2);
882 U = av_clip_uint8(U);
883 V = av_clip_uint8(V);
884 }
885
886 output_pixels(i * 4, Y1, U, Y2, V);
887 }
888 }
889
890 static av_always_inline void
891 266112 yuv2422_1_c_template(SwsInternal *c, const int16_t *buf0,
892 const int16_t *ubuf[2], const int16_t *vbuf[2],
893 const int16_t *abuf0, uint8_t *dest, int dstW,
894 int uvalpha, int y, enum AVPixelFormat target)
895 {
896 266112 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
897 int i;
898
899
1/2
✓ Branch 0 taken 266112 times.
✗ Branch 1 not taken.
266112 if (uvalpha < 2048) {
900
2/2
✓ Branch 0 taken 62733312 times.
✓ Branch 1 taken 266112 times.
62999424 for (i = 0; i < ((dstW + 1) >> 1); i++) {
901 62733312 int Y1 = (buf0[i * 2 ]+64) >> 7;
902 62733312 int Y2 = (buf0[i * 2 + 1]+64) >> 7;
903 62733312 int U = (ubuf0[i] +64) >> 7;
904 62733312 int V = (vbuf0[i] +64) >> 7;
905
906
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 62733312 times.
62733312 if ((Y1 | Y2 | U | V) & 0x100) {
907 Y1 = av_clip_uint8(Y1);
908 Y2 = av_clip_uint8(Y2);
909 U = av_clip_uint8(U);
910 V = av_clip_uint8(V);
911 }
912
913
4/4
✓ Branch 0 taken 10543104 times.
✓ Branch 1 taken 52190208 times.
✓ Branch 2 taken 10543104 times.
✓ Branch 3 taken 41647104 times.
62733312 output_pixels(i * 4, Y1, U, Y2, V);
914 }
915 } else {
916 const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
917 for (i = 0; i < ((dstW + 1) >> 1); i++) {
918 int Y1 = (buf0[i * 2 ] + 64) >> 7;
919 int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
920 int U = (ubuf0[i] + ubuf1[i]+128) >> 8;
921 int V = (vbuf0[i] + vbuf1[i]+128) >> 8;
922
923 if ((Y1 | Y2 | U | V) & 0x100) {
924 Y1 = av_clip_uint8(Y1);
925 Y2 = av_clip_uint8(Y2);
926 U = av_clip_uint8(U);
927 V = av_clip_uint8(V);
928 }
929
930 output_pixels(i * 4, Y1, U, Y2, V);
931 }
932 }
933 266112 }
934
935 #undef output_pixels
936
937 145928 YUV2PACKEDWRAPPER(yuv2, 422, yuyv422, AV_PIX_FMT_YUYV422)
938 130952 YUV2PACKEDWRAPPER(yuv2, 422, yvyu422, AV_PIX_FMT_YVYU422)
939 303752 YUV2PACKEDWRAPPER(yuv2, 422, uyvy422, AV_PIX_FMT_UYVY422)
940
941 #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)
942 #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)
943 #define output_pixel(pos, val) \
944 if (is_be) { \
945 AV_WB16(pos, val); \
946 } else { \
947 AV_WL16(pos, val); \
948 }
949
950 static av_always_inline void
951 12008 yuv2ya16_X_c_template(SwsInternal *c, const int16_t *lumFilter,
952 const int32_t **lumSrc, int lumFilterSize,
953 const int16_t *chrFilter, const int32_t **unused_chrUSrc,
954 const int32_t **unused_chrVSrc, int unused_chrFilterSize,
955 const int32_t **alpSrc, uint16_t *dest, int dstW,
956 int y, enum AVPixelFormat target,
957 int unused_hasAlpha, int unused_eightbytes, int is_be)
958 {
959 12008 int hasAlpha = !!alpSrc;
960 int i;
961
962
2/2
✓ Branch 0 taken 4196416 times.
✓ Branch 1 taken 12008 times.
4208424 for (i = 0; i < dstW; i++) {
963 int j;
964 4196416 int Y = -0x40000000;
965 4196416 int A = 0xffff;
966
967
2/2
✓ Branch 0 taken 4636416 times.
✓ Branch 1 taken 4196416 times.
8832832 for (j = 0; j < lumFilterSize; j++)
968 4636416 Y += lumSrc[j][i] * lumFilter[j];
969
970 4196416 Y >>= 15;
971 4196416 Y += (1<<3) + 0x8000;
972 4196416 Y = av_clip_uint16(Y);
973
974
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 4156416 times.
4196416 if (hasAlpha) {
975 40000 A = -0x40000000 + (1<<14);
976
2/2
✓ Branch 0 taken 480000 times.
✓ Branch 1 taken 40000 times.
520000 for (j = 0; j < lumFilterSize; j++)
977 480000 A += alpSrc[j][i] * lumFilter[j];
978
979 40000 A >>= 15;
980 40000 A += 0x8000;
981 40000 A = av_clip_uint16(A);
982 }
983
984
2/2
✓ Branch 0 taken 2047520 times.
✓ Branch 1 taken 2148896 times.
4196416 output_pixel(&dest[2 * i ], Y);
985
2/2
✓ Branch 0 taken 2047520 times.
✓ Branch 1 taken 2148896 times.
4196416 output_pixel(&dest[2 * i + 1], A);
986 }
987 12008 }
988
989 static av_always_inline void
990 yuv2ya16_2_c_template(SwsInternal *c, const int32_t *buf[2],
991 const int32_t *unused_ubuf[2], const int32_t *unused_vbuf[2],
992 const int32_t *abuf[2], uint16_t *dest, int dstW,
993 int yalpha, int unused_uvalpha, int y,
994 enum AVPixelFormat target, int unused_hasAlpha,
995 int unused_eightbytes, int is_be)
996 {
997 int hasAlpha = abuf && abuf[0] && abuf[1];
998 const int32_t *buf0 = buf[0], *buf1 = buf[1],
999 *abuf0 = hasAlpha ? abuf[0] : NULL,
1000 *abuf1 = hasAlpha ? abuf[1] : NULL;
1001 int yalpha1 = 4096 - yalpha;
1002 int i;
1003
1004 av_assert2(yalpha <= 4096U);
1005
1006 for (i = 0; i < dstW; i++) {
1007 int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 15;
1008 int A;
1009
1010 Y = av_clip_uint16(Y);
1011
1012 if (hasAlpha) {
1013 A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 15;
1014 A = av_clip_uint16(A);
1015 }
1016
1017 output_pixel(&dest[2 * i ], Y);
1018 output_pixel(&dest[2 * i + 1], hasAlpha ? A : 65535);
1019 }
1020 }
1021
1022 static av_always_inline void
1023 yuv2ya16_1_c_template(SwsInternal *c, const int32_t *buf0,
1024 const int32_t *unused_ubuf[2], const int32_t *unused_vbuf[2],
1025 const int32_t *abuf0, uint16_t *dest, int dstW,
1026 int unused_uvalpha, int y, enum AVPixelFormat target,
1027 int unused_hasAlpha, int unused_eightbytes, int is_be)
1028 {
1029 int hasAlpha = !!abuf0;
1030 int i;
1031
1032 for (i = 0; i < dstW; i++) {
1033 int Y = buf0[i] >> 3;/* 19 - 16 */
1034 int A;
1035
1036 Y = av_clip_uint16(Y);
1037
1038 if (hasAlpha) {
1039 A = abuf0[i] >> 3;
1040 if (A & 0x100)
1041 A = av_clip_uint16(A);
1042 }
1043
1044 output_pixel(&dest[2 * i ], Y);
1045 output_pixel(&dest[2 * i + 1], hasAlpha ? A : 65535);
1046 }
1047 }
1048
1049 static av_always_inline void
1050 260080 yuv2rgba64_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1051 const int32_t **lumSrc, int lumFilterSize,
1052 const int16_t *chrFilter, const int32_t **chrUSrc,
1053 const int32_t **chrVSrc, int chrFilterSize,
1054 const int32_t **alpSrc, uint16_t *dest, int dstW,
1055 int y, enum AVPixelFormat target, int hasAlpha, int eightbytes,
1056 int is_be)
1057 {
1058 int i;
1059 260080 int A1 = 0xffff<<14, A2 = 0xffff<<14;
1060
1061
2/2
✓ Branch 0 taken 45574640 times.
✓ Branch 1 taken 260080 times.
45834720 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1062 int j;
1063 45574640 unsigned Y1 = -0x40000000;
1064 45574640 unsigned Y2 = -0x40000000;
1065 45574640 int U = -(128 << 23); // 19
1066 45574640 int V = -(128 << 23);
1067 int R, G, B;
1068
1069
2/2
✓ Branch 0 taken 46090176 times.
✓ Branch 1 taken 45574640 times.
91664816 for (j = 0; j < lumFilterSize; j++) {
1070 46090176 Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j];
1071 46090176 Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1072 }
1073
2/2
✓ Branch 0 taken 182339520 times.
✓ Branch 1 taken 45574640 times.
227914160 for (j = 0; j < chrFilterSize; j++) {;
1074 182339520 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
1075 182339520 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
1076 }
1077
1078
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 45574640 times.
45574640 if (hasAlpha) {
1079 A1 = -0x40000000;
1080 A2 = -0x40000000;
1081 for (j = 0; j < lumFilterSize; j++) {
1082 A1 += alpSrc[j][i * 2] * (unsigned)lumFilter[j];
1083 A2 += alpSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1084 }
1085 A1 >>= 1;
1086 A1 += 0x20002000;
1087 A2 >>= 1;
1088 A2 += 0x20002000;
1089 }
1090
1091 // 8 bits: 12+15=27; 16 bits: 12+19=31
1092 45574640 Y1 = (int)Y1 >> 14; // 10
1093 45574640 Y1 += 0x10000;
1094 45574640 Y2 = (int)Y2 >> 14;
1095 45574640 Y2 += 0x10000;
1096 45574640 U >>= 14;
1097 45574640 V >>= 14;
1098
1099 // 8 bits: 27 -> 17 bits, 16 bits: 31 - 14 = 17 bits
1100 45574640 Y1 -= c->yuv2rgb_y_offset;
1101 45574640 Y2 -= c->yuv2rgb_y_offset;
1102 45574640 Y1 *= c->yuv2rgb_y_coeff;
1103 45574640 Y2 *= c->yuv2rgb_y_coeff;
1104 45574640 Y1 += (1 << 13) - (1 << 29); // 21
1105 45574640 Y2 += (1 << 13) - (1 << 29);
1106 // 8 bits: 17 + 13 bits = 30 bits, 16 bits: 17 + 13 bits = 30 bits
1107
1108 45574640 R = V * c->yuv2rgb_v2r_coeff;
1109 45574640 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1110 45574640 B = U * c->yuv2rgb_u2b_coeff;
1111
1112 // 8 bits: 30 - 22 = 8 bits, 16 bits: 30 bits - 14 = 16 bits
1113
14/18
✓ Branch 0 taken 6390784 times.
✓ Branch 1 taken 39183856 times.
✓ Branch 2 taken 6390784 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3044352 times.
✓ Branch 5 taken 3346432 times.
✓ Branch 6 taken 3044352 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1014784 times.
✓ Branch 9 taken 2029568 times.
✓ Branch 10 taken 3956736 times.
✓ Branch 11 taken 35227120 times.
✓ Branch 12 taken 3956736 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2080256 times.
✓ Branch 15 taken 1876480 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2080256 times.
45574640 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1114
2/2
✓ Branch 0 taken 6390784 times.
✓ Branch 1 taken 39183856 times.
45574640 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y1) >> 14) + (1<<15), 16));
1115
14/18
✓ Branch 0 taken 6390784 times.
✓ Branch 1 taken 39183856 times.
✓ Branch 2 taken 6390784 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3044352 times.
✓ Branch 5 taken 3346432 times.
✓ Branch 6 taken 3044352 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1014784 times.
✓ Branch 9 taken 2029568 times.
✓ Branch 10 taken 3956736 times.
✓ Branch 11 taken 35227120 times.
✓ Branch 12 taken 3956736 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2080256 times.
✓ Branch 15 taken 1876480 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2080256 times.
45574640 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1116
2/2
✓ Branch 0 taken 4920832 times.
✓ Branch 1 taken 40653808 times.
45574640 if (eightbytes) {
1117
2/2
✓ Branch 0 taken 2029568 times.
✓ Branch 1 taken 2891264 times.
4920832 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1118
12/18
✓ Branch 0 taken 2029568 times.
✓ Branch 1 taken 2891264 times.
✓ Branch 2 taken 2029568 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2029568 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2029568 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1014784 times.
✓ Branch 9 taken 1014784 times.
✓ Branch 10 taken 2891264 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2891264 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1014784 times.
✓ Branch 15 taken 1876480 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1014784 times.
4920832 output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1119
2/2
✓ Branch 0 taken 2029568 times.
✓ Branch 1 taken 2891264 times.
4920832 output_pixel(&dest[5], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1120
12/18
✓ Branch 0 taken 2029568 times.
✓ Branch 1 taken 2891264 times.
✓ Branch 2 taken 2029568 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2029568 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2029568 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1014784 times.
✓ Branch 9 taken 1014784 times.
✓ Branch 10 taken 2891264 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2891264 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1014784 times.
✓ Branch 15 taken 1876480 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1014784 times.
4920832 output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1121
2/2
✓ Branch 0 taken 2029568 times.
✓ Branch 1 taken 2891264 times.
4920832 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1122 4920832 dest += 8;
1123 } else {
1124
12/18
✓ Branch 0 taken 4361216 times.
✓ Branch 1 taken 36292592 times.
✓ Branch 2 taken 4361216 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1014784 times.
✓ Branch 5 taken 3346432 times.
✓ Branch 6 taken 1014784 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1014784 times.
✓ Branch 10 taken 1065472 times.
✓ Branch 11 taken 35227120 times.
✓ Branch 12 taken 1065472 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1065472 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1065472 times.
40653808 output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1125
2/2
✓ Branch 0 taken 4361216 times.
✓ Branch 1 taken 36292592 times.
40653808 output_pixel(&dest[4], av_clip_uintp2(((int)( G + Y2) >> 14) + (1<<15), 16));
1126
12/18
✓ Branch 0 taken 4361216 times.
✓ Branch 1 taken 36292592 times.
✓ Branch 2 taken 4361216 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1014784 times.
✓ Branch 5 taken 3346432 times.
✓ Branch 6 taken 1014784 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1014784 times.
✓ Branch 10 taken 1065472 times.
✓ Branch 11 taken 35227120 times.
✓ Branch 12 taken 1065472 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1065472 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1065472 times.
40653808 output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1127 40653808 dest += 6;
1128 }
1129 }
1130 260080 }
1131
1132 static av_always_inline void
1133 48 yuv2rgba64_2_c_template(SwsInternal *c, const int32_t *buf[2],
1134 const int32_t *ubuf[2], const int32_t *vbuf[2],
1135 const int32_t *abuf[2], uint16_t *dest, int dstW,
1136 int yalpha, int uvalpha, int y,
1137 enum AVPixelFormat target, int hasAlpha, int eightbytes,
1138 int is_be)
1139 {
1140 48 const int32_t *buf0 = buf[0], *buf1 = buf[1],
1141 48 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1142 48 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1143
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
48 *abuf0 = hasAlpha ? abuf[0] : NULL,
1144
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
48 *abuf1 = hasAlpha ? abuf[1] : NULL;
1145 48 int yalpha1 = 4096 - yalpha;
1146 48 int uvalpha1 = 4096 - uvalpha;
1147 int i;
1148 48 int A1 = 0xffff<<14, A2 = 0xffff<<14;
1149
1150 av_assert2(yalpha <= 4096U);
1151 av_assert2(uvalpha <= 4096U);
1152
1153
2/2
✓ Branch 0 taken 12288 times.
✓ Branch 1 taken 48 times.
12336 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1154 12288 unsigned Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 14;
1155 12288 unsigned Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 14;
1156 12288 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1157 12288 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1158 int R, G, B;
1159
1160 12288 Y1 -= c->yuv2rgb_y_offset;
1161 12288 Y2 -= c->yuv2rgb_y_offset;
1162 12288 Y1 *= c->yuv2rgb_y_coeff;
1163 12288 Y2 *= c->yuv2rgb_y_coeff;
1164 12288 Y1 += (1 << 13) - (1 << 29);
1165 12288 Y2 += (1 << 13) - (1 << 29);
1166
1167 12288 R = V * c->yuv2rgb_v2r_coeff;
1168 12288 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1169 12288 B = U * c->yuv2rgb_u2b_coeff;
1170
1171
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12288 times.
12288 if (hasAlpha) {
1172 A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 1;
1173 A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 1;
1174
1175 A1 += 1 << 13;
1176 A2 += 1 << 13;
1177 }
1178
1179
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));
1180
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));
1181
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));
1182
2/2
✓ Branch 0 taken 6144 times.
✓ Branch 1 taken 6144 times.
12288 if (eightbytes) {
1183
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
6144 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1184
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));
1185
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));
1186
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));
1187
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 3072 times.
6144 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1188 6144 dest += 8;
1189 } else {
1190
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));
1191
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));
1192
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));
1193 6144 dest += 6;
1194 }
1195 }
1196 48 }
1197
1198 static av_always_inline void
1199 209684 yuv2rgba64_1_c_template(SwsInternal *c, const int32_t *buf0,
1200 const int32_t *ubuf[2], const int32_t *vbuf[2],
1201 const int32_t *abuf0, uint16_t *dest, int dstW,
1202 int uvalpha, int y, enum AVPixelFormat target,
1203 int hasAlpha, int eightbytes, int is_be)
1204 {
1205 209684 const int32_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1206 int i;
1207 209684 int A1 = 0xffff<<14, A2= 0xffff<<14;
1208
1209
2/2
✓ Branch 0 taken 209652 times.
✓ Branch 1 taken 32 times.
209684 if (uvalpha == 0) {
1210
2/2
✓ Branch 0 taken 36629732 times.
✓ Branch 1 taken 209652 times.
36839384 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1211 36629732 SUINT Y1 = (buf0[i * 2] ) >> 2;
1212 36629732 SUINT Y2 = (buf0[i * 2 + 1]) >> 2;
1213 36629732 int U = (ubuf0[i] - (128 << 11)) >> 2;
1214 36629732 int V = (vbuf0[i] - (128 << 11)) >> 2;
1215 int R, G, B;
1216
1217 36629732 Y1 -= c->yuv2rgb_y_offset;
1218 36629732 Y2 -= c->yuv2rgb_y_offset;
1219 36629732 Y1 *= c->yuv2rgb_y_coeff;
1220 36629732 Y2 *= c->yuv2rgb_y_coeff;
1221 36629732 Y1 += (1 << 13) - (1 << 29);
1222 36629732 Y2 += (1 << 13) - (1 << 29);
1223
1224
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36629732 times.
36629732 if (hasAlpha) {
1225 A1 = abuf0[i * 2 ] * (1 << 11);
1226 A2 = abuf0[i * 2 + 1] * (1 << 11);
1227
1228 A1 += 1 << 13;
1229 A2 += 1 << 13;
1230 }
1231
1232 36629732 R = V * c->yuv2rgb_v2r_coeff;
1233 36629732 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1234 36629732 B = U * c->yuv2rgb_u2b_coeff;
1235
1236
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));
1237
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));
1238
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));
1239
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 36627684 times.
36629732 if (eightbytes) {
1240
2/2
✓ Branch 0 taken 1024 times.
✓ Branch 1 taken 1024 times.
2048 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1241
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));
1242
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));
1243
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));
1244
2/2
✓ Branch 0 taken 1024 times.
✓ Branch 1 taken 1024 times.
2048 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1245 2048 dest += 8;
1246 } else {
1247
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));
1248
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));
1249
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));
1250 36627684 dest += 6;
1251 }
1252 }
1253 } else {
1254 32 const int32_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1255 32 int A1 = 0xffff<<14, A2 = 0xffff<<14;
1256 32 int uvalpha1 = 4096 - uvalpha;
1257 av_assert2(uvalpha <= 4096U);
1258
1259
2/2
✓ Branch 0 taken 8192 times.
✓ Branch 1 taken 32 times.
8224 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1260 8192 SUINT Y1 = (buf0[i * 2] ) >> 2;
1261 8192 SUINT Y2 = (buf0[i * 2 + 1]) >> 2;
1262 8192 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1263 8192 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1264 int R, G, B;
1265
1266 8192 Y1 -= c->yuv2rgb_y_offset;
1267 8192 Y2 -= c->yuv2rgb_y_offset;
1268 8192 Y1 *= c->yuv2rgb_y_coeff;
1269 8192 Y2 *= c->yuv2rgb_y_coeff;
1270 8192 Y1 += (1 << 13) - (1 << 29);
1271 8192 Y2 += (1 << 13) - (1 << 29);
1272
1273
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8192 times.
8192 if (hasAlpha) {
1274 A1 = abuf0[i * 2 ] * (1 << 11);
1275 A2 = abuf0[i * 2 + 1] * (1 << 11);
1276
1277 A1 += 1 << 13;
1278 A2 += 1 << 13;
1279 }
1280
1281 8192 R = V * c->yuv2rgb_v2r_coeff;
1282 8192 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1283 8192 B = U * c->yuv2rgb_u2b_coeff;
1284
1285
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));
1286
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));
1287
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));
1288
2/2
✓ Branch 0 taken 4096 times.
✓ Branch 1 taken 4096 times.
8192 if (eightbytes) {
1289
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 2048 times.
4096 output_pixel(&dest[3], av_clip_uintp2(A1 , 30) >> 14);
1290
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));
1291
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));
1292
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));
1293
2/2
✓ Branch 0 taken 2048 times.
✓ Branch 1 taken 2048 times.
4096 output_pixel(&dest[7], av_clip_uintp2(A2 , 30) >> 14);
1294 4096 dest += 8;
1295 } else {
1296
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));
1297
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));
1298
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));
1299 4096 dest += 6;
1300 }
1301 }
1302 }
1303 209684 }
1304
1305 static av_always_inline void
1306 1000 yuv2rgba64_full_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1307 const int32_t **lumSrc, int lumFilterSize,
1308 const int16_t *chrFilter, const int32_t **chrUSrc,
1309 const int32_t **chrVSrc, int chrFilterSize,
1310 const int32_t **alpSrc, uint16_t *dest, int dstW,
1311 int y, enum AVPixelFormat target, int hasAlpha,
1312 int eightbytes, int is_be)
1313 {
1314 int i;
1315 1000 int A = 0xffff<<14;
1316
1317
2/2
✓ Branch 0 taken 200000 times.
✓ Branch 1 taken 1000 times.
201000 for (i = 0; i < dstW; i++) {
1318 int j;
1319 200000 int Y = -0x40000000;
1320 200000 int U = -(128 << 23); // 19
1321 200000 int V = -(128 << 23);
1322 int R, G, B;
1323
1324
2/2
✓ Branch 0 taken 2400000 times.
✓ Branch 1 taken 200000 times.
2600000 for (j = 0; j < lumFilterSize; j++) {
1325 2400000 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
1326 }
1327
2/2
✓ Branch 0 taken 2400000 times.
✓ Branch 1 taken 200000 times.
2600000 for (j = 0; j < chrFilterSize; j++) {;
1328 2400000 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
1329 2400000 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
1330 }
1331
1332
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 120000 times.
200000 if (hasAlpha) {
1333 80000 A = -0x40000000;
1334
2/2
✓ Branch 0 taken 960000 times.
✓ Branch 1 taken 80000 times.
1040000 for (j = 0; j < lumFilterSize; j++) {
1335 960000 A += alpSrc[j][i] * (unsigned)lumFilter[j];
1336 }
1337 80000 A >>= 1;
1338 80000 A += 0x20002000;
1339 }
1340
1341 // 8bit: 12+15=27; 16-bit: 12+19=31
1342 200000 Y >>= 14; // 10
1343 200000 Y += 0x10000;
1344 200000 U >>= 14;
1345 200000 V >>= 14;
1346
1347 // 8bit: 27 -> 17bit, 16bit: 31 - 14 = 17bit
1348 200000 Y -= c->yuv2rgb_y_offset;
1349 200000 Y *= c->yuv2rgb_y_coeff;
1350 200000 Y += (1 << 13) - (1<<29); // 21
1351 // 8bit: 17 + 13bit = 30bit, 16bit: 17 + 13bit = 30bit
1352
1353 200000 R = V * c->yuv2rgb_v2r_coeff;
1354 200000 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1355 200000 B = U * c->yuv2rgb_u2b_coeff;
1356
1357 // 8bit: 30 - 22 = 8bit, 16bit: 30bit - 14 = 16bit
1358
14/18
✓ Branch 0 taken 100000 times.
✓ Branch 1 taken 100000 times.
✓ Branch 2 taken 100000 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 60000 times.
✓ Branch 5 taken 40000 times.
✓ Branch 6 taken 60000 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 20000 times.
✓ Branch 9 taken 40000 times.
✓ Branch 10 taken 60000 times.
✓ Branch 11 taken 40000 times.
✓ Branch 12 taken 60000 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 40000 times.
✓ Branch 15 taken 20000 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 40000 times.
200000 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + (unsigned)Y)>>14) + (1<<15), 16));
1359
2/2
✓ Branch 0 taken 100000 times.
✓ Branch 1 taken 100000 times.
200000 output_pixel(&dest[1], av_clip_uintp2(((int)( G + (unsigned)Y)>>14) + (1<<15), 16));
1360
14/18
✓ Branch 0 taken 100000 times.
✓ Branch 1 taken 100000 times.
✓ Branch 2 taken 100000 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 60000 times.
✓ Branch 5 taken 40000 times.
✓ Branch 6 taken 60000 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 20000 times.
✓ Branch 9 taken 40000 times.
✓ Branch 10 taken 60000 times.
✓ Branch 11 taken 40000 times.
✓ Branch 12 taken 60000 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 40000 times.
✓ Branch 15 taken 20000 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 40000 times.
200000 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + (unsigned)Y)>>14) + (1<<15), 16));
1361
2/2
✓ Branch 0 taken 80000 times.
✓ Branch 1 taken 120000 times.
200000 if (eightbytes) {
1362
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 40000 times.
80000 output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1363 80000 dest += 4;
1364 } else {
1365 120000 dest += 3;
1366 }
1367 }
1368 1000 }
1369
1370 static av_always_inline void
1371 yuv2rgba64_full_2_c_template(SwsInternal *c, const int32_t *buf[2],
1372 const int32_t *ubuf[2], const int32_t *vbuf[2],
1373 const int32_t *abuf[2], uint16_t *dest, int dstW,
1374 int yalpha, int uvalpha, int y,
1375 enum AVPixelFormat target, int hasAlpha, int eightbytes,
1376 int is_be)
1377 {
1378 const int32_t *buf0 = buf[0], *buf1 = buf[1],
1379 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1380 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1381 *abuf0 = hasAlpha ? abuf[0] : NULL,
1382 *abuf1 = hasAlpha ? abuf[1] : NULL;
1383 int yalpha1 = 4096 - yalpha;
1384 int uvalpha1 = 4096 - uvalpha;
1385 int i;
1386 int A = 0xffff<<14;
1387
1388 av_assert2(yalpha <= 4096U);
1389 av_assert2(uvalpha <= 4096U);
1390
1391 for (i = 0; i < dstW; i++) {
1392 int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 14;
1393 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1394 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1395 int R, G, B;
1396
1397 Y -= c->yuv2rgb_y_offset;
1398 Y *= c->yuv2rgb_y_coeff;
1399 Y += (1 << 13) - (1 << 29);
1400
1401 R = V * c->yuv2rgb_v2r_coeff;
1402 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1403 B = U * c->yuv2rgb_u2b_coeff;
1404
1405 if (hasAlpha) {
1406 A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 1;
1407
1408 A += 1 << 13;
1409 }
1410
1411 output_pixel(&dest[0], av_clip_uintp2(((R_B + Y) >> 14) + (1<<15), 16));
1412 output_pixel(&dest[1], av_clip_uintp2((( G + Y) >> 14) + (1<<15), 16));
1413 output_pixel(&dest[2], av_clip_uintp2(((B_R + Y) >> 14) + (1<<15), 16));
1414 if (eightbytes) {
1415 output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1416 dest += 4;
1417 } else {
1418 dest += 3;
1419 }
1420 }
1421 }
1422
1423 static av_always_inline void
1424 359808 yuv2rgba64_full_1_c_template(SwsInternal *c, const int32_t *buf0,
1425 const int32_t *ubuf[2], const int32_t *vbuf[2],
1426 const int32_t *abuf0, uint16_t *dest, int dstW,
1427 int uvalpha, int y, enum AVPixelFormat target,
1428 int hasAlpha, int eightbytes, int is_be)
1429 {
1430 359808 const int32_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1431 int i;
1432 359808 int A = 0xffff<<14;
1433
1434
1/2
✓ Branch 0 taken 359808 times.
✗ Branch 1 not taken.
359808 if (uvalpha == 0) {
1435
2/2
✓ Branch 0 taken 126554112 times.
✓ Branch 1 taken 359808 times.
126913920 for (i = 0; i < dstW; i++) {
1436 126554112 SUINT Y = (buf0[i]) >> 2;
1437 126554112 int U = (ubuf0[i] - (128 << 11)) >> 2;
1438 126554112 int V = (vbuf0[i] - (128 << 11)) >> 2;
1439 int R, G, B;
1440
1441 126554112 Y -= c->yuv2rgb_y_offset;
1442 126554112 Y *= c->yuv2rgb_y_coeff;
1443 126554112 Y += (1 << 13) - (1 << 29);
1444
1445
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 126554112 times.
126554112 if (hasAlpha) {
1446 A = abuf0[i] * (1 << 11);
1447
1448 A += 1 << 13;
1449 }
1450
1451 126554112 R = V * c->yuv2rgb_v2r_coeff;
1452 126554112 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1453 126554112 B = U * c->yuv2rgb_u2b_coeff;
1454
1455
7/18
✗ Branch 0 not taken.
✓ Branch 1 taken 126554112 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 126526464 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.
126554112 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y) >> 14) + (1<<15), 16));
1456
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 126554112 times.
126554112 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y) >> 14) + (1<<15), 16));
1457
7/18
✗ Branch 0 not taken.
✓ Branch 1 taken 126554112 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 126526464 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.
126554112 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y) >> 14) + (1<<15), 16));
1458
2/2
✓ Branch 0 taken 18432 times.
✓ Branch 1 taken 126535680 times.
126554112 if (eightbytes) {
1459
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18432 times.
18432 output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1460 18432 dest += 4;
1461 } else {
1462 126535680 dest += 3;
1463 }
1464 }
1465 } else {
1466 const int32_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1467 int uvalpha1 = 4096 - uvalpha;
1468 int A = 0xffff<<14;
1469 av_assert2(uvalpha <= 4096U);
1470
1471 for (i = 0; i < dstW; i++) {
1472 SUINT Y = (buf0[i] ) >> 2;
1473 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1474 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1475 int R, G, B;
1476
1477 Y -= c->yuv2rgb_y_offset;
1478 Y *= c->yuv2rgb_y_coeff;
1479 Y += (1 << 13) - (1 << 29);
1480
1481 if (hasAlpha) {
1482 A = abuf0[i] * (1 << 11);
1483
1484 A += 1 << 13;
1485 }
1486
1487 R = V * c->yuv2rgb_v2r_coeff;
1488 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1489 B = U * c->yuv2rgb_u2b_coeff;
1490
1491 output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y) >> 14) + (1<<15), 16));
1492 output_pixel(&dest[1], av_clip_uintp2(((int)( G + Y) >> 14) + (1<<15), 16));
1493 output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y) >> 14) + (1<<15), 16));
1494 if (eightbytes) {
1495 output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1496 dest += 4;
1497 } else {
1498 dest += 3;
1499 }
1500 }
1501 }
1502 359808 }
1503
1504 #undef output_pixel
1505 #undef r_b
1506 #undef b_r
1507
1508 #define YUV2PACKED16WRAPPER_EXT(name, base, ext, fmt, is_be, hasAlpha, eightbytes) \
1509 static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
1510 const int16_t **_lumSrc, int lumFilterSize, \
1511 const int16_t *chrFilter, const int16_t **_chrUSrc, \
1512 const int16_t **_chrVSrc, int chrFilterSize, \
1513 const int16_t **_alpSrc, uint8_t *_dest, int dstW, \
1514 int y) \
1515 { \
1516 const int32_t **lumSrc = (const int32_t **) _lumSrc, \
1517 **chrUSrc = (const int32_t **) _chrUSrc, \
1518 **chrVSrc = (const int32_t **) _chrVSrc, \
1519 **alpSrc = (const int32_t **) _alpSrc; \
1520 uint16_t *dest = (uint16_t *) _dest; \
1521 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
1522 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
1523 alpSrc, dest, dstW, y, fmt, hasAlpha, eightbytes, is_be); \
1524 } \
1525 \
1526 static void name ## ext ## _2_c(SwsInternal *c, const int16_t *_buf[2], \
1527 const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
1528 const int16_t *_abuf[2], uint8_t *_dest, int dstW, \
1529 int yalpha, int uvalpha, int y) \
1530 { \
1531 const int32_t **buf = (const int32_t **) _buf, \
1532 **ubuf = (const int32_t **) _ubuf, \
1533 **vbuf = (const int32_t **) _vbuf, \
1534 **abuf = (const int32_t **) _abuf; \
1535 uint16_t *dest = (uint16_t *) _dest; \
1536 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
1537 dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha, eightbytes, is_be); \
1538 } \
1539 \
1540 static void name ## ext ## _1_c(SwsInternal *c, const int16_t *_buf0, \
1541 const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
1542 const int16_t *_abuf0, uint8_t *_dest, int dstW, \
1543 int uvalpha, int y) \
1544 { \
1545 const int32_t *buf0 = (const int32_t *) _buf0, \
1546 **ubuf = (const int32_t **) _ubuf, \
1547 **vbuf = (const int32_t **) _vbuf, \
1548 *abuf0 = (const int32_t *) _abuf0; \
1549 uint16_t *dest = (uint16_t *) _dest; \
1550 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
1551 dstW, uvalpha, y, fmt, hasAlpha, eightbytes, is_be); \
1552 }
1553 #define YUV2PACKED16WRAPPER(name, base, ext, base_fmt, endianness, hasAlpha, eightbytes) \
1554 YUV2PACKED16WRAPPER_EXT(name, base, ext, base_fmt ## endianness, IS_BE(endianness), hasAlpha, eightbytes)
1555
1556 38048 YUV2PACKED16WRAPPER(yuv2, rgba64, rgb48be, AV_PIX_FMT_RGB48, BE, 0, 0)
1557 821896 YUV2PACKED16WRAPPER(yuv2, rgba64, rgb48le, AV_PIX_FMT_RGB48, LE, 0, 0)
1558 11552 YUV2PACKED16WRAPPER(yuv2, rgba64, bgr48be, AV_PIX_FMT_BGR48, BE, 0, 0)
1559 12128 YUV2PACKED16WRAPPER(yuv2, rgba64, bgr48le, AV_PIX_FMT_BGR48, LE, 0, 0)
1560 YUV2PACKED16WRAPPER(yuv2, rgba64, rgba64be, AV_PIX_FMT_RGBA64, BE, 1, 1)
1561 YUV2PACKED16WRAPPER(yuv2, rgba64, rgba64le, AV_PIX_FMT_RGBA64, LE, 1, 1)
1562 11552 YUV2PACKED16WRAPPER(yuv2, rgba64, rgbx64be, AV_PIX_FMT_RGBA64, BE, 0, 1)
1563 21344 YUV2PACKED16WRAPPER(yuv2, rgba64, rgbx64le, AV_PIX_FMT_RGBA64, LE, 0, 1)
1564 YUV2PACKED16WRAPPER(yuv2, rgba64, bgra64be, AV_PIX_FMT_BGRA64, BE, 1, 1)
1565 YUV2PACKED16WRAPPER(yuv2, rgba64, bgra64le, AV_PIX_FMT_BGRA64, LE, 1, 1)
1566 11552 YUV2PACKED16WRAPPER(yuv2, rgba64, bgrx64be, AV_PIX_FMT_BGRA64, BE, 0, 1)
1567 11552 YUV2PACKED16WRAPPER(yuv2, rgba64, bgrx64le, AV_PIX_FMT_BGRA64, LE, 0, 1)
1568 11720 YUV2PACKED16WRAPPER(yuv2, ya16, ya16be, AV_PIX_FMT_YA16, BE, 1, 0)
1569 12296 YUV2PACKED16WRAPPER(yuv2, ya16, ya16le, AV_PIX_FMT_YA16, LE, 1, 0)
1570
1571 400 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgb48be_full, AV_PIX_FMT_RGB48, BE, 0, 0)
1572 719440 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgb48le_full, AV_PIX_FMT_RGB48, LE, 0, 0)
1573 200 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgr48be_full, AV_PIX_FMT_BGR48, BE, 0, 0)
1574 392 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgr48le_full, AV_PIX_FMT_BGR48, LE, 0, 0)
1575 200 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgba64be_full, AV_PIX_FMT_RGBA64, BE, 1, 1)
1576 200 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgba64le_full, AV_PIX_FMT_RGBA64, LE, 1, 1)
1577 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgbx64be_full, AV_PIX_FMT_RGBA64, BE, 0, 1)
1578 192 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgbx64le_full, AV_PIX_FMT_RGBA64, LE, 0, 1)
1579 200 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgra64be_full, AV_PIX_FMT_BGRA64, BE, 1, 1)
1580 200 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgra64le_full, AV_PIX_FMT_BGRA64, LE, 1, 1)
1581 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgrx64be_full, AV_PIX_FMT_BGRA64, BE, 0, 1)
1582 192 YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgrx64le_full, AV_PIX_FMT_BGRA64, LE, 0, 1)
1583
1584 /*
1585 * Write out 2 RGB pixels in the target pixel format. This function takes a
1586 * R/G/B LUT as generated by ff_yuv2rgb_c_init_tables(), which takes care of
1587 * things like endianness conversion and shifting. The caller takes care of
1588 * setting the correct offset in these tables from the chroma (U/V) values.
1589 * This function then uses the luminance (Y1/Y2) values to write out the
1590 * correct RGB values into the destination buffer.
1591 */
1592 static av_always_inline void
1593 276239204 yuv2rgb_write(uint8_t *_dest, int i, int Y1, int Y2,
1594 unsigned A1, unsigned A2,
1595 const void *_r, const void *_g, const void *_b, int y,
1596 enum AVPixelFormat target, int hasAlpha)
1597 {
1598
4/6
✓ Branch 0 taken 276239204 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 276239204 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 271206564 times.
✓ Branch 5 taken 5032640 times.
276239204 if (target == AV_PIX_FMT_ARGB || target == AV_PIX_FMT_RGBA ||
1599
2/2
✓ Branch 0 taken 25409992 times.
✓ Branch 1 taken 245796572 times.
301649196 target == AV_PIX_FMT_ABGR || target == AV_PIX_FMT_BGRA) {
1600 30442632 uint32_t *dest = (uint32_t *) _dest;
1601 30442632 const uint32_t *r = (const uint32_t *) _r;
1602 30442632 const uint32_t *g = (const uint32_t *) _g;
1603 30442632 const uint32_t *b = (const uint32_t *) _b;
1604
1605 #if CONFIG_SMALL
1606 int sh = hasAlpha ? ((target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24) : 0;
1607
1608 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (hasAlpha ? A1 << sh : 0);
1609 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (hasAlpha ? A2 << sh : 0);
1610 #else
1611
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 30442632 times.
30442632 if (hasAlpha) {
1612 int sh = (target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24;
1613
1614 av_assert2((((r[Y1] + g[Y1] + b[Y1]) >> sh) & 0xFF) == 0);
1615 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (A1 << sh);
1616 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (A2 << sh);
1617 } else {
1618 #if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1
1619 int sh = (target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24;
1620
1621 av_assert2((((r[Y1] + g[Y1] + b[Y1]) >> sh) & 0xFF) == 0xFF);
1622 #endif
1623 30442632 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
1624 30442632 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
1625 }
1626 #endif
1627
4/4
✓ Branch 0 taken 124147206 times.
✓ Branch 1 taken 121649366 times.
✓ Branch 2 taken 26307054 times.
✓ Branch 3 taken 97840152 times.
245796572 } else if (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) {
1628 147956420 uint8_t *dest = (uint8_t *) _dest;
1629 147956420 const uint8_t *r = (const uint8_t *) _r;
1630 147956420 const uint8_t *g = (const uint8_t *) _g;
1631 147956420 const uint8_t *b = (const uint8_t *) _b;
1632
1633 #define r_b ((target == AV_PIX_FMT_RGB24) ? r : b)
1634 #define b_r ((target == AV_PIX_FMT_RGB24) ? b : r)
1635
1636
2/2
✓ Branch 0 taken 121649366 times.
✓ Branch 1 taken 26307054 times.
147956420 dest[i * 6 + 0] = r_b[Y1];
1637 147956420 dest[i * 6 + 1] = g[Y1];
1638
2/2
✓ Branch 0 taken 121649366 times.
✓ Branch 1 taken 26307054 times.
147956420 dest[i * 6 + 2] = b_r[Y1];
1639
2/2
✓ Branch 0 taken 121649366 times.
✓ Branch 1 taken 26307054 times.
147956420 dest[i * 6 + 3] = r_b[Y2];
1640 147956420 dest[i * 6 + 4] = g[Y2];
1641
2/2
✓ Branch 0 taken 121649366 times.
✓ Branch 1 taken 26307054 times.
147956420 dest[i * 6 + 5] = b_r[Y2];
1642 #undef r_b
1643 #undef b_r
1644
5/6
✓ Branch 0 taken 74590452 times.
✓ Branch 1 taken 23249700 times.
✓ Branch 2 taken 74590452 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 28473352 times.
✓ Branch 5 taken 46117100 times.
97840152 } else if (target == AV_PIX_FMT_RGB565 || target == AV_PIX_FMT_BGR565 ||
1645
3/4
✓ Branch 0 taken 28473352 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 24361928 times.
✓ Branch 3 taken 4111424 times.
28473352 target == AV_PIX_FMT_RGB555 || target == AV_PIX_FMT_BGR555 ||
1646
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24361928 times.
24361928 target == AV_PIX_FMT_RGB444 || target == AV_PIX_FMT_BGR444) {
1647 73478224 uint16_t *dest = (uint16_t *) _dest;
1648 73478224 const uint16_t *r = (const uint16_t *) _r;
1649 73478224 const uint16_t *g = (const uint16_t *) _g;
1650 73478224 const uint16_t *b = (const uint16_t *) _b;
1651 int dr1, dg1, db1, dr2, dg2, db2;
1652
1653
3/4
✓ Branch 0 taken 50228524 times.
✓ Branch 1 taken 23249700 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 50228524 times.
73478224 if (target == AV_PIX_FMT_RGB565 || target == AV_PIX_FMT_BGR565) {
1654 23249700 dr1 = ff_dither_2x2_8[ y & 1 ][0];
1655 23249700 dg1 = ff_dither_2x2_4[ y & 1 ][0];
1656 23249700 db1 = ff_dither_2x2_8[(y & 1) ^ 1][0];
1657 23249700 dr2 = ff_dither_2x2_8[ y & 1 ][1];
1658 23249700 dg2 = ff_dither_2x2_4[ y & 1 ][1];
1659 23249700 db2 = ff_dither_2x2_8[(y & 1) ^ 1][1];
1660
3/4
✓ Branch 0 taken 4111424 times.
✓ Branch 1 taken 46117100 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4111424 times.
50228524 } else if (target == AV_PIX_FMT_RGB555 || target == AV_PIX_FMT_BGR555) {
1661 46117100 dr1 = ff_dither_2x2_8[ y & 1 ][0];
1662 46117100 dg1 = ff_dither_2x2_8[ y & 1 ][1];
1663 46117100 db1 = ff_dither_2x2_8[(y & 1) ^ 1][0];
1664 46117100 dr2 = ff_dither_2x2_8[ y & 1 ][1];
1665 46117100 dg2 = ff_dither_2x2_8[ y & 1 ][0];
1666 46117100 db2 = ff_dither_2x2_8[(y & 1) ^ 1][1];
1667 } else {
1668 4111424 dr1 = ff_dither_4x4_16[ y & 3 ][0];
1669 4111424 dg1 = ff_dither_4x4_16[ y & 3 ][1];
1670 4111424 db1 = ff_dither_4x4_16[(y & 3) ^ 3][0];
1671 4111424 dr2 = ff_dither_4x4_16[ y & 3 ][1];
1672 4111424 dg2 = ff_dither_4x4_16[ y & 3 ][0];
1673 4111424 db2 = ff_dither_4x4_16[(y & 3) ^ 3][1];
1674 }
1675
1676 73478224 dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
1677 73478224 dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
1678
4/4
✓ Branch 0 taken 23348168 times.
✓ Branch 1 taken 1013760 times.
✓ Branch 2 taken 1013760 times.
✓ Branch 3 taken 22334408 times.
24361928 } else if (target == AV_PIX_FMT_X2RGB10 || target == AV_PIX_FMT_X2BGR10) {
1679 2027520 uint32_t *dest = (uint32_t *) _dest;
1680 2027520 const uint32_t *r = (const uint32_t *) _r;
1681 2027520 const uint32_t *g = (const uint32_t *) _g;
1682 2027520 const uint32_t *b = (const uint32_t *) _b;
1683 2027520 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
1684 2027520 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
1685 } else /* 8/4 bits */ {
1686 22334408 uint8_t *dest = (uint8_t *) _dest;
1687 22334408 const uint8_t *r = (const uint8_t *) _r;
1688 22334408 const uint8_t *g = (const uint8_t *) _g;
1689 22334408 const uint8_t *b = (const uint8_t *) _b;
1690 int dr1, dg1, db1, dr2, dg2, db2;
1691
1692
3/4
✓ Branch 0 taken 2702848 times.
✓ Branch 1 taken 19631560 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2702848 times.
22334408 if (target == AV_PIX_FMT_RGB8 || target == AV_PIX_FMT_BGR8) {
1693 19631560 const uint8_t * const d64 = ff_dither_8x8_73[y & 7];
1694 19631560 const uint8_t * const d32 = ff_dither_8x8_32[y & 7];
1695 19631560 dr1 = dg1 = d32[(i * 2 + 0) & 7];
1696 19631560 db1 = d64[(i * 2 + 0) & 7];
1697 19631560 dr2 = dg2 = d32[(i * 2 + 1) & 7];
1698 19631560 db2 = d64[(i * 2 + 1) & 7];
1699 } else {
1700 2702848 const uint8_t * const d64 = ff_dither_8x8_73 [y & 7];
1701 2702848 const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
1702 2702848 dr1 = db1 = d128[(i * 2 + 0) & 7];
1703 2702848 dg1 = d64[(i * 2 + 0) & 7];
1704 2702848 dr2 = db2 = d128[(i * 2 + 1) & 7];
1705 2702848 dg2 = d64[(i * 2 + 1) & 7];
1706 }
1707
1708
3/4
✓ Branch 0 taken 22326216 times.
✓ Branch 1 taken 8192 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 22326216 times.
22334408 if (target == AV_PIX_FMT_RGB4 || target == AV_PIX_FMT_BGR4) {
1709 8192 dest[i] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1] +
1710 8192 ((r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2]) << 4);
1711 } else {
1712 22326216 dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
1713 22326216 dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
1714 }
1715 }
1716 276239204 }
1717
1718 static av_always_inline void
1719 1184472 yuv2rgb_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1720 const int16_t **lumSrc, int lumFilterSize,
1721 const int16_t *chrFilter, const int16_t **chrUSrc,
1722 const int16_t **chrVSrc, int chrFilterSize,
1723 const int16_t **alpSrc, uint8_t *dest, int dstW,
1724 int y, enum AVPixelFormat target, int hasAlpha)
1725 {
1726 int i;
1727
1728
2/2
✓ Branch 0 taken 203189432 times.
✓ Branch 1 taken 1184472 times.
204373904 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1729 int j, A1, A2;
1730 203189432 int Y1 = 1 << 18;
1731 203189432 int Y2 = 1 << 18;
1732 203189432 int U = 1 << 18;
1733 203189432 int V = 1 << 18;
1734 const void *r, *g, *b;
1735
1736
2/2
✓ Branch 0 taken 216298040 times.
✓ Branch 1 taken 203189432 times.
419487472 for (j = 0; j < lumFilterSize; j++) {
1737 216298040 Y1 += lumSrc[j][i * 2] * lumFilter[j];
1738 216298040 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
1739 }
1740
2/2
✓ Branch 0 taken 816317408 times.
✓ Branch 1 taken 203189432 times.
1019506840 for (j = 0; j < chrFilterSize; j++) {
1741 816317408 U += chrUSrc[j][i] * chrFilter[j];
1742 816317408 V += chrVSrc[j][i] * chrFilter[j];
1743 }
1744 203189432 Y1 >>= 19;
1745 203189432 Y2 >>= 19;
1746 203189432 U >>= 19;
1747 203189432 V >>= 19;
1748
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 203189432 times.
203189432 if (hasAlpha) {
1749 A1 = 1 << 18;
1750 A2 = 1 << 18;
1751 for (j = 0; j < lumFilterSize; j++) {
1752 A1 += alpSrc[j][i * 2 ] * lumFilter[j];
1753 A2 += alpSrc[j][i * 2 + 1] * lumFilter[j];
1754 }
1755 A1 >>= 19;
1756 A2 >>= 19;
1757 if ((A1 | A2) & 0x100) {
1758 A1 = av_clip_uint8(A1);
1759 A2 = av_clip_uint8(A2);
1760 }
1761 }
1762
1763 203189432 r = c->table_rV[V + YUVRGB_TABLE_HEADROOM];
1764 203189432 g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]);
1765 203189432 b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1766
1767
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 203189432 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 203189432 times.
203189432 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1768 r, g, b, y, target, hasAlpha);
1769 }
1770 1184472 }
1771
1772 static av_always_inline void
1773 144 yuv2rgb_2_c_template(SwsInternal *c, const int16_t *buf[2],
1774 const int16_t *ubuf[2], const int16_t *vbuf[2],
1775 const int16_t *abuf[2], uint8_t *dest, int dstW,
1776 int yalpha, int uvalpha, int y,
1777 enum AVPixelFormat target, int hasAlpha)
1778 {
1779 144 const int16_t *buf0 = buf[0], *buf1 = buf[1],
1780 144 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1781 144 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1782
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 144 times.
144 *abuf0 = hasAlpha ? abuf[0] : NULL,
1783
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 144 times.
144 *abuf1 = hasAlpha ? abuf[1] : NULL;
1784 144 int yalpha1 = 4096 - yalpha;
1785 144 int uvalpha1 = 4096 - uvalpha;
1786 int i;
1787 av_assert2(yalpha <= 4096U);
1788 av_assert2(uvalpha <= 4096U);
1789
1790
2/2
✓ Branch 0 taken 36864 times.
✓ Branch 1 taken 144 times.
37008 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1791 36864 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
1792 36864 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
1793 36864 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
1794 36864 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
1795 int A1, A2;
1796 36864 const void *r = c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1797 36864 *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1798 36864 *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1799
1800
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36864 times.
36864 if (hasAlpha) {
1801 A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 19;
1802 A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 19;
1803 A1 = av_clip_uint8(A1);
1804 A2 = av_clip_uint8(A2);
1805 }
1806
1807
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,
1808 r, g, b, y, target, hasAlpha);
1809 }
1810 144 }
1811
1812 static av_always_inline void
1813 419388 yuv2rgb_1_c_template(SwsInternal *c, const int16_t *buf0,
1814 const int16_t *ubuf[2], const int16_t *vbuf[2],
1815 const int16_t *abuf0, uint8_t *dest, int dstW,
1816 int uvalpha, int y, enum AVPixelFormat target,
1817 int hasAlpha)
1818 {
1819 419388 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1820 int i;
1821
1822
2/2
✓ Branch 0 taken 419292 times.
✓ Branch 1 taken 96 times.
419388 if (uvalpha == 0) {
1823
2/2
✓ Branch 0 taken 72988332 times.
✓ Branch 1 taken 419292 times.
73407624 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1824 72988332 int Y1 = (buf0[i * 2 ] + 64) >> 7;
1825 72988332 int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
1826 72988332 int U = (ubuf0[i] + 64) >> 7;
1827 72988332 int V = (vbuf0[i] + 64) >> 7;
1828 int A1, A2;
1829 72988332 const void *r = c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1830 72988332 *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1831 72988332 *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1832
1833
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 72988332 times.
72988332 if (hasAlpha) {
1834 A1 = abuf0[i * 2 ] * 255 + 16384 >> 15;
1835 A2 = abuf0[i * 2 + 1] * 255 + 16384 >> 15;
1836 A1 = av_clip_uint8(A1);
1837 A2 = av_clip_uint8(A2);
1838 }
1839
1840
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 72988332 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72988332 times.
72988332 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1841 r, g, b, y, target, hasAlpha);
1842 }
1843 } else {
1844 96 const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1845 96 int uvalpha1 = 4096 - uvalpha;
1846 av_assert2(uvalpha <= 4096U);
1847
1848
2/2
✓ Branch 0 taken 24576 times.
✓ Branch 1 taken 96 times.
24672 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1849 24576 int Y1 = (buf0[i * 2 ] + 64) >> 7;
1850 24576 int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
1851 24576 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha + (128 << 11)) >> 19;
1852 24576 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha + (128 << 11)) >> 19;
1853 int A1, A2;
1854 24576 const void *r = c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1855 24576 *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1856 24576 *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1857
1858
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24576 times.
24576 if (hasAlpha) {
1859 A1 = (abuf0[i * 2 ] + 64) >> 7;
1860 A2 = (abuf0[i * 2 + 1] + 64) >> 7;
1861 A1 = av_clip_uint8(A1);
1862 A2 = av_clip_uint8(A2);
1863 }
1864
1865
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,
1866 r, g, b, y, target, hasAlpha);
1867 }
1868 }
1869 419388 }
1870
1871 #define YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1872 static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
1873 const int16_t **lumSrc, int lumFilterSize, \
1874 const int16_t *chrFilter, const int16_t **chrUSrc, \
1875 const int16_t **chrVSrc, int chrFilterSize, \
1876 const int16_t **alpSrc, uint8_t *dest, int dstW, \
1877 int y) \
1878 { \
1879 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
1880 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
1881 alpSrc, dest, dstW, y, fmt, hasAlpha); \
1882 }
1883
1884 #define YUV2RGBWRAPPERX2(name, base, ext, fmt, hasAlpha) \
1885 YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1886 static void name ## ext ## _2_c(SwsInternal *c, const int16_t *buf[2], \
1887 const int16_t *ubuf[2], const int16_t *vbuf[2], \
1888 const int16_t *abuf[2], uint8_t *dest, int dstW, \
1889 int yalpha, int uvalpha, int y) \
1890 { \
1891 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
1892 dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha); \
1893 }
1894
1895 #define YUV2RGBWRAPPER(name, base, ext, fmt, hasAlpha) \
1896 YUV2RGBWRAPPERX2(name, base, ext, fmt, hasAlpha) \
1897 static void name ## ext ## _1_c(SwsInternal *c, const int16_t *buf0, \
1898 const int16_t *ubuf[2], const int16_t *vbuf[2], \
1899 const int16_t *abuf0, uint8_t *dest, int dstW, \
1900 int uvalpha, int y) \
1901 { \
1902 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
1903 dstW, uvalpha, y, fmt, hasAlpha); \
1904 }
1905
1906 #if CONFIG_SMALL
1907 YUV2RGBWRAPPER(yuv2rgb,, 32_1, AV_PIX_FMT_RGB32_1, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1908 YUV2RGBWRAPPER(yuv2rgb,, 32, AV_PIX_FMT_RGB32, CONFIG_SWSCALE_ALPHA && c->needAlpha)
1909 #else
1910 #if CONFIG_SWSCALE_ALPHA
1911 YUV2RGBWRAPPER(yuv2rgb,, a32_1, AV_PIX_FMT_RGB32_1, 1)
1912 YUV2RGBWRAPPER(yuv2rgb,, a32, AV_PIX_FMT_RGB32, 1)
1913 #endif
1914 62560 YUV2RGBWRAPPER(yuv2rgb,, x32_1, AV_PIX_FMT_RGB32_1, 0)
1915 294864 YUV2RGBWRAPPER(yuv2rgb,, x32, AV_PIX_FMT_RGB32, 0)
1916 #endif
1917 1411412 YUV2RGBWRAPPER(yuv2, rgb, rgb24, AV_PIX_FMT_RGB24, 0)
1918 308148 YUV2RGBWRAPPER(yuv2, rgb, bgr24, AV_PIX_FMT_BGR24, 0)
1919 267560 YUV2RGBWRAPPER(yuv2rgb,, 16, AV_PIX_FMT_RGB565, 0)
1920 533560 YUV2RGBWRAPPER(yuv2rgb,, 15, AV_PIX_FMT_RGB555, 0)
1921 47008 YUV2RGBWRAPPER(yuv2rgb,, 12, AV_PIX_FMT_RGB444, 0)
1922 229200 YUV2RGBWRAPPER(yuv2rgb,, 8, AV_PIX_FMT_RGB8, 0)
1923 64 YUV2RGBWRAPPER(yuv2rgb,, 4, AV_PIX_FMT_RGB4, 0)
1924 30592 YUV2RGBWRAPPER(yuv2rgb,, 4b, AV_PIX_FMT_RGB4_BYTE, 0)
1925 11520 YUV2RGBWRAPPER(yuv2, rgb, x2rgb10, AV_PIX_FMT_X2RGB10, 0)
1926 11520 YUV2RGBWRAPPER(yuv2, rgb, x2bgr10, AV_PIX_FMT_X2BGR10, 0)
1927
1928 308493732 static av_always_inline void yuv2rgb_write_full(SwsInternal *c,
1929 uint8_t *dest, int i, int Y, int A, int U, int V,
1930 int y, enum AVPixelFormat target, int hasAlpha, int err[4])
1931 {
1932 int R, G, B;
1933
4/4
✓ Branch 0 taken 292160938 times.
✓ Branch 1 taken 16332794 times.
✓ Branch 2 taken 10700797 times.
✓ Branch 3 taken 281460141 times.
308493732 int isrgb8 = target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8;
1934
1935 308493732 Y -= c->yuv2rgb_y_offset;
1936 308493732 Y *= c->yuv2rgb_y_coeff;
1937 308493732 Y += 1 << 21;
1938 308493732 R = (unsigned)Y + V*(unsigned)c->yuv2rgb_v2r_coeff;
1939 308493732 G = (unsigned)Y + V*(unsigned)c->yuv2rgb_v2g_coeff + U*(unsigned)c->yuv2rgb_u2g_coeff;
1940 308493732 B = (unsigned)Y + U*(unsigned)c->yuv2rgb_u2b_coeff;
1941
2/2
✓ Branch 0 taken 34701053 times.
✓ Branch 1 taken 273792679 times.
308493732 if ((R | G | B) & 0xC0000000) {
1942 34701053 R = av_clip_uintp2(R, 30);
1943 34701053 G = av_clip_uintp2(G, 30);
1944 34701053 B = av_clip_uintp2(B, 30);
1945 }
1946
1947
9/10
✓ Branch 0 taken 58432 times.
✓ Branch 1 taken 139728712 times.
✓ Branch 2 taken 58432 times.
✓ Branch 3 taken 58432 times.
✓ Branch 4 taken 46615556 times.
✓ Branch 5 taken 46938471 times.
✓ Branch 6 taken 15834656 times.
✓ Branch 7 taken 15834656 times.
✓ Branch 8 taken 43366385 times.
✗ Branch 9 not taken.
308493732 switch(target) {
1948 58432 case AV_PIX_FMT_ARGB:
1949
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 18432 times.
58432 dest[0] = hasAlpha ? A : 255;
1950 58432 dest[1] = R >> 22;
1951 58432 dest[2] = G >> 22;
1952 58432 dest[3] = B >> 22;
1953 58432 break;
1954 139728712 case AV_PIX_FMT_RGB24:
1955 139728712 dest[0] = R >> 22;
1956 139728712 dest[1] = G >> 22;
1957 139728712 dest[2] = B >> 22;
1958 139728712 break;
1959 58432 case AV_PIX_FMT_RGBA:
1960 58432 dest[0] = R >> 22;
1961 58432 dest[1] = G >> 22;
1962 58432 dest[2] = B >> 22;
1963
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 18432 times.
58432 dest[3] = hasAlpha ? A : 255;
1964 58432 break;
1965 58432 case AV_PIX_FMT_ABGR:
1966
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 18432 times.
58432 dest[0] = hasAlpha ? A : 255;
1967 58432 dest[1] = B >> 22;
1968 58432 dest[2] = G >> 22;
1969 58432 dest[3] = R >> 22;
1970 58432 break;
1971 46615556 case AV_PIX_FMT_BGR24:
1972 46615556 dest[0] = B >> 22;
1973 46615556 dest[1] = G >> 22;
1974 46615556 dest[2] = R >> 22;
1975 46615556 break;
1976 46938471 case AV_PIX_FMT_BGRA:
1977 46938471 dest[0] = B >> 22;
1978 46938471 dest[1] = G >> 22;
1979 46938471 dest[2] = R >> 22;
1980
2/2
✓ Branch 0 taken 3932007 times.
✓ Branch 1 taken 43006464 times.
46938471 dest[3] = hasAlpha ? A : 255;
1981 46938471 break;
1982 15834656 case AV_PIX_FMT_X2RGB10LE:
1983 15834656 R >>= 20;
1984 15834656 G >>= 20;
1985 15834656 B >>= 20;
1986 15834656 AV_WL32(dest, (3U << 30) + (R << 20) + (G << 10) + B);
1987 15834656 break;
1988 15834656 case AV_PIX_FMT_X2BGR10LE:
1989 15834656 R >>= 20;
1990 15834656 G >>= 20;
1991 15834656 B >>= 20;
1992 15834656 AV_WL32(dest, (3U << 30) + (B << 20) + (G << 10) + R);
1993 15834656 break;
1994 43366385 case AV_PIX_FMT_BGR4_BYTE:
1995 case AV_PIX_FMT_RGB4_BYTE:
1996 case AV_PIX_FMT_BGR8:
1997 case AV_PIX_FMT_RGB8:
1998 {
1999 int r,g,b;
2000
2001
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 43366385 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
43366385 switch (c->opts.dither) {
2002 case SWS_DITHER_NONE:
2003 if (isrgb8) {
2004 r = av_clip_uintp2(R >> 27, 3);
2005 g = av_clip_uintp2(G >> 27, 3);
2006 b = av_clip_uintp2(B >> 28, 2);
2007 } else {
2008 r = av_clip_uintp2(R >> 29, 1);
2009 g = av_clip_uintp2(G >> 28, 2);
2010 b = av_clip_uintp2(B >> 29, 1);
2011 }
2012 break;
2013 43366385 default:
2014 case SWS_DITHER_AUTO:
2015 case SWS_DITHER_ED:
2016 43366385 R >>= 22;
2017 43366385 G >>= 22;
2018 43366385 B >>= 22;
2019 43366385 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;
2020 43366385 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;
2021 43366385 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;
2022 43366385 c->dither_error[0][i] = err[0];
2023 43366385 c->dither_error[1][i] = err[1];
2024 43366385 c->dither_error[2][i] = err[2];
2025
2/2
✓ Branch 0 taken 27033591 times.
✓ Branch 1 taken 16332794 times.
43366385 r = R >> (isrgb8 ? 5 : 7);
2026
2/2
✓ Branch 0 taken 27033591 times.
✓ Branch 1 taken 16332794 times.
43366385 g = G >> (isrgb8 ? 5 : 6);
2027
2/2
✓ Branch 0 taken 27033591 times.
✓ Branch 1 taken 16332794 times.
43366385 b = B >> (isrgb8 ? 6 : 7);
2028
2/2
✓ Branch 0 taken 27033591 times.
✓ Branch 1 taken 16332794 times.
43366385 r = av_clip(r, 0, isrgb8 ? 7 : 1);
2029
2/2
✓ Branch 0 taken 27033591 times.
✓ Branch 1 taken 16332794 times.
43366385 g = av_clip(g, 0, isrgb8 ? 7 : 3);
2030
2/2
✓ Branch 0 taken 27033591 times.
✓ Branch 1 taken 16332794 times.
43366385 b = av_clip(b, 0, isrgb8 ? 3 : 1);
2031
2/2
✓ Branch 0 taken 27033591 times.
✓ Branch 1 taken 16332794 times.
43366385 err[0] = R - r*(isrgb8 ? 36 : 255);
2032
2/2
✓ Branch 0 taken 27033591 times.
✓ Branch 1 taken 16332794 times.
43366385 err[1] = G - g*(isrgb8 ? 36 : 85);
2033
2/2
✓ Branch 0 taken 27033591 times.
✓ Branch 1 taken 16332794 times.
43366385 err[2] = B - b*(isrgb8 ? 85 : 255);
2034 43366385 break;
2035 case SWS_DITHER_A_DITHER:
2036 if (isrgb8) {
2037 /* see http://pippin.gimp.org/a_dither/ for details/origin */
2038 #define A_DITHER(u,v) (((((u)+((v)*236))*119)&0xff))
2039 r = (((R >> 19) + A_DITHER(i,y) -96)>>8);
2040 g = (((G >> 19) + A_DITHER(i + 17,y) - 96)>>8);
2041 b = (((B >> 20) + A_DITHER(i + 17*2,y) -96)>>8);
2042 r = av_clip_uintp2(r, 3);
2043 g = av_clip_uintp2(g, 3);
2044 b = av_clip_uintp2(b, 2);
2045 } else {
2046 r = (((R >> 21) + A_DITHER(i,y)-256)>>8);
2047 g = (((G >> 19) + A_DITHER(i + 17,y)-256)>>8);
2048 b = (((B >> 21) + A_DITHER(i + 17*2,y)-256)>>8);
2049 r = av_clip_uintp2(r, 1);
2050 g = av_clip_uintp2(g, 2);
2051 b = av_clip_uintp2(b, 1);
2052 }
2053 break;
2054 case SWS_DITHER_X_DITHER:
2055 if (isrgb8) {
2056 /* see http://pippin.gimp.org/a_dither/ for details/origin */
2057 #define X_DITHER(u,v) (((((u)^((v)*237))*181)&0x1ff)/2)
2058 r = (((R >> 19) + X_DITHER(i,y) - 96)>>8);
2059 g = (((G >> 19) + X_DITHER(i + 17,y) - 96)>>8);
2060 b = (((B >> 20) + X_DITHER(i + 17*2,y) - 96)>>8);
2061 r = av_clip_uintp2(r, 3);
2062 g = av_clip_uintp2(g, 3);
2063 b = av_clip_uintp2(b, 2);
2064 } else {
2065 r = (((R >> 21) + X_DITHER(i,y)-256)>>8);
2066 g = (((G >> 19) + X_DITHER(i + 17,y)-256)>>8);
2067 b = (((B >> 21) + X_DITHER(i + 17*2,y)-256)>>8);
2068 r = av_clip_uintp2(r, 1);
2069 g = av_clip_uintp2(g, 2);
2070 b = av_clip_uintp2(b, 1);
2071 }
2072
2073 break;
2074 }
2075
2076
2/2
✓ Branch 0 taken 8166397 times.
✓ Branch 1 taken 35199988 times.
43366385 if(target == AV_PIX_FMT_BGR4_BYTE) {
2077 8166397 dest[0] = r + 2*g + 8*b;
2078
2/2
✓ Branch 0 taken 8166397 times.
✓ Branch 1 taken 27033591 times.
35199988 } else if(target == AV_PIX_FMT_RGB4_BYTE) {
2079 8166397 dest[0] = b + 2*g + 8*r;
2080
2/2
✓ Branch 0 taken 16332794 times.
✓ Branch 1 taken 10700797 times.
27033591 } else if(target == AV_PIX_FMT_BGR8) {
2081 16332794 dest[0] = r + 8*g + 64*b;
2082
1/2
✓ Branch 0 taken 10700797 times.
✗ Branch 1 not taken.
10700797 } else if(target == AV_PIX_FMT_RGB8) {
2083 10700797 dest[0] = b + 4*g + 32*r;
2084 } else
2085 av_assert2(0);
2086 43366385 break;}
2087 }
2088 308493732 }
2089
2090 static av_always_inline void
2091 10535 yuv2rgb_full_X_c_template(SwsInternal *c, const int16_t *lumFilter,
2092 const int16_t **lumSrc, int lumFilterSize,
2093 const int16_t *chrFilter, const int16_t **chrUSrc,
2094 const int16_t **chrVSrc, int chrFilterSize,
2095 const int16_t **alpSrc, uint8_t *dest,
2096 int dstW, int y, enum AVPixelFormat target, int hasAlpha)
2097 {
2098 int i;
2099
4/4
✓ Branch 0 taken 8823 times.
✓ Branch 1 taken 1712 times.
✓ Branch 2 taken 722 times.
✓ Branch 3 taken 8101 times.
10535 int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2100 10535 int err[4] = {0};
2101 10535 int A = 0; //init to silence warning
2102
2103
4/4
✓ Branch 0 taken 10435 times.
✓ Branch 1 taken 100 times.
✓ Branch 2 taken 10335 times.
✓ Branch 3 taken 100 times.
10535 if( target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2104
4/4
✓ Branch 0 taken 10135 times.
✓ Branch 1 taken 200 times.
✓ Branch 2 taken 100 times.
✓ Branch 3 taken 10035 times.
10335 || target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8)
2105 500 step = 1;
2106
2107
2/2
✓ Branch 0 taken 4865275 times.
✓ Branch 1 taken 10535 times.
4875810 for (i = 0; i < dstW; i++) {
2108 int j;
2109 4865275 int Y = 1<<9;
2110 4865275 int U = (1<<9)-(128 << 19);
2111 4865275 int V = (1<<9)-(128 << 19);
2112
2113
2/2
✓ Branch 0 taken 21139196 times.
✓ Branch 1 taken 4865275 times.
26004471 for (j = 0; j < lumFilterSize; j++) {
2114 21139196 Y += lumSrc[j][i] * lumFilter[j];
2115 }
2116
2/2
✓ Branch 0 taken 22598900 times.
✓ Branch 1 taken 4865275 times.
27464175 for (j = 0; j < chrFilterSize; j++) {
2117 22598900 U += chrUSrc[j][i] * chrFilter[j];
2118 22598900 V += chrVSrc[j][i] * chrFilter[j];
2119 }
2120 4865275 Y >>= 10;
2121 4865275 U >>= 10;
2122 4865275 V >>= 10;
2123
2/2
✓ Branch 0 taken 4052007 times.
✓ Branch 1 taken 813268 times.
4865275 if (hasAlpha) {
2124 4052007 A = 1 << 18;
2125
2/2
✓ Branch 0 taken 17488028 times.
✓ Branch 1 taken 4052007 times.
21540035 for (j = 0; j < lumFilterSize; j++) {
2126 17488028 A += alpSrc[j][i] * lumFilter[j];
2127 }
2128 4052007 A >>= 19;
2129
1/2
✓ Branch 0 taken 4052007 times.
✗ Branch 1 not taken.
4052007 if (A & 0x100)
2130 4052007 A = av_clip_uint8(A);
2131 }
2132 4865275 yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2133 4865275 dest += step;
2134 }
2135 10535 c->dither_error[0][i] = err[0];
2136 10535 c->dither_error[1][i] = err[1];
2137 10535 c->dither_error[2][i] = err[2];
2138 10535 }
2139
2140 static av_always_inline void
2141 yuv2rgb_full_2_c_template(SwsInternal *c, const int16_t *buf[2],
2142 const int16_t *ubuf[2], const int16_t *vbuf[2],
2143 const int16_t *abuf[2], uint8_t *dest, int dstW,
2144 int yalpha, int uvalpha, int y,
2145 enum AVPixelFormat target, int hasAlpha)
2146 {
2147 const int16_t *buf0 = buf[0], *buf1 = buf[1],
2148 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
2149 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
2150 *abuf0 = hasAlpha ? abuf[0] : NULL,
2151 *abuf1 = hasAlpha ? abuf[1] : NULL;
2152 int yalpha1 = 4096 - yalpha;
2153 int uvalpha1 = 4096 - uvalpha;
2154 int i;
2155 int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2156 int err[4] = {0};
2157 int A = 0; // init to silcene warning
2158
2159 av_assert2(yalpha <= 4096U);
2160 av_assert2(uvalpha <= 4096U);
2161
2162 if( target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2163 || target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8)
2164 step = 1;
2165
2166 for (i = 0; i < dstW; i++) {
2167 int Y = ( buf0[i] * yalpha1 + buf1[i] * yalpha ) >> 10; //FIXME rounding
2168 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha-(128 << 19)) >> 10;
2169 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha-(128 << 19)) >> 10;
2170
2171 if (hasAlpha) {
2172 A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha + (1<<18)) >> 19;
2173 if (A & 0x100)
2174 A = av_clip_uint8(A);
2175 }
2176
2177 yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2178 dest += step;
2179 }
2180 c->dither_error[0][i] = err[0];
2181 c->dither_error[1][i] = err[1];
2182 c->dither_error[2][i] = err[2];
2183 }
2184
2185 static av_always_inline void
2186 947661 yuv2rgb_full_1_c_template(SwsInternal *c, const int16_t *buf0,
2187 const int16_t *ubuf[2], const int16_t *vbuf[2],
2188 const int16_t *abuf0, uint8_t *dest, int dstW,
2189 int uvalpha, int y, enum AVPixelFormat target,
2190 int hasAlpha)
2191 {
2192 947661 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
2193 int i;
2194
4/4
✓ Branch 0 taken 549449 times.
✓ Branch 1 taken 398212 times.
✓ Branch 2 taken 134824 times.
✓ Branch 3 taken 414625 times.
947661 int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2195 947661 int err[4] = {0};
2196
2197
4/4
✓ Branch 0 taken 910120 times.
✓ Branch 1 taken 37541 times.
✓ Branch 2 taken 872579 times.
✓ Branch 3 taken 37541 times.
947661 if( target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2198
4/4
✓ Branch 0 taken 797497 times.
✓ Branch 1 taken 75082 times.
✓ Branch 2 taken 44741 times.
✓ Branch 3 taken 752756 times.
872579 || target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8)
2199 194905 step = 1;
2200
2201
1/2
✓ Branch 0 taken 947661 times.
✗ Branch 1 not taken.
947661 if (uvalpha == 0) {
2202 947661 int A = 0; //init to silence warning
2203
2/2
✓ Branch 0 taken 303628457 times.
✓ Branch 1 taken 947661 times.
304576118 for (i = 0; i < dstW; i++) {
2204 303628457 int Y = buf0[i] * 4;
2205 303628457 int U = (ubuf0[i] - (128<<7)) * 4;
2206 303628457 int V = (vbuf0[i] - (128<<7)) * 4;
2207
2208
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 303628457 times.
303628457 if (hasAlpha) {
2209 A = (abuf0[i] + 64) >> 7;
2210 if (A & 0x100)
2211 A = av_clip_uint8(A);
2212 }
2213
2214 303628457 yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2215 303628457 dest += step;
2216 }
2217 } else {
2218 const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
2219 int A = 0; //init to silence warning
2220 int uvalpha1 = 4096 - uvalpha;
2221 av_assert2(uvalpha <= 4096U);
2222
2223 for (i = 0; i < dstW; i++) {
2224 int Y = buf0[i] * 4;
2225 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 19)) >> 10;
2226 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 19)) >> 10;
2227
2228 if (hasAlpha) {
2229 A = (abuf0[i] + 64) >> 7;
2230 if (A & 0x100)
2231 A = av_clip_uint8(A);
2232 }
2233
2234 yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2235 dest += step;
2236 }
2237 }
2238
2239 947661 c->dither_error[0][i] = err[0];
2240 947661 c->dither_error[1][i] = err[1];
2241 947661 c->dither_error[2][i] = err[2];
2242 947661 }
2243
2244 #if CONFIG_SMALL
2245 YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2246 YUV2RGBWRAPPER(yuv2, rgb_full, abgr32_full, AV_PIX_FMT_ABGR, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2247 YUV2RGBWRAPPER(yuv2, rgb_full, rgba32_full, AV_PIX_FMT_RGBA, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2248 YUV2RGBWRAPPER(yuv2, rgb_full, argb32_full, AV_PIX_FMT_ARGB, CONFIG_SWSCALE_ALPHA && c->needAlpha)
2249 #else
2250 #if CONFIG_SWSCALE_ALPHA
2251 13602 YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA, 1)
2252 400 YUV2RGBWRAPPER(yuv2, rgb_full, abgr32_full, AV_PIX_FMT_ABGR, 1)
2253 400 YUV2RGBWRAPPER(yuv2, rgb_full, rgba32_full, AV_PIX_FMT_RGBA, 1)
2254 400 YUV2RGBWRAPPER(yuv2, rgb_full, argb32_full, AV_PIX_FMT_ARGB, 1)
2255 #endif
2256 258576 YUV2RGBWRAPPER(yuv2, rgb_full, bgrx32_full, AV_PIX_FMT_BGRA, 0)
2257 384 YUV2RGBWRAPPER(yuv2, rgb_full, xbgr32_full, AV_PIX_FMT_ABGR, 0)
2258 384 YUV2RGBWRAPPER(yuv2, rgb_full, rgbx32_full, AV_PIX_FMT_RGBA, 0)
2259 384 YUV2RGBWRAPPER(yuv2, rgb_full, xrgb32_full, AV_PIX_FMT_ARGB, 0)
2260 #endif
2261 271092 YUV2RGBWRAPPER(yuv2, rgb_full, bgr24_full, AV_PIX_FMT_BGR24, 0)
2262 799848 YUV2RGBWRAPPER(yuv2, rgb_full, rgb24_full, AV_PIX_FMT_RGB24, 0)
2263
2264 75282 YUV2RGBWRAPPER(yuv2, rgb_full, bgr4_byte_full, AV_PIX_FMT_BGR4_BYTE, 0)
2265 75282 YUV2RGBWRAPPER(yuv2, rgb_full, rgb4_byte_full, AV_PIX_FMT_RGB4_BYTE, 0)
2266 150564 YUV2RGBWRAPPER(yuv2, rgb_full, bgr8_full, AV_PIX_FMT_BGR8, 0)
2267 89682 YUV2RGBWRAPPER(yuv2, rgb_full, rgb8_full, AV_PIX_FMT_RGB8, 0)
2268
2269 90056 YUV2RGBWRAPPER(yuv2, rgb_full, x2rgb10_full, AV_PIX_FMT_X2RGB10LE, 0)
2270 90056 YUV2RGBWRAPPER(yuv2, rgb_full, x2bgr10_full, AV_PIX_FMT_X2BGR10LE, 0)
2271
2272 static void
2273 2410536 yuv2gbrp_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2274 const int16_t **lumSrc, int lumFilterSize,
2275 const int16_t *chrFilter, const int16_t **chrUSrc,
2276 const int16_t **chrVSrc, int chrFilterSize,
2277 const int16_t **alpSrc, uint8_t **dest,
2278 int dstW, int y)
2279 {
2280 2410536 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2281 int i;
2282
4/4
✓ Branch 0 taken 96106 times.
✓ Branch 1 taken 2314430 times.
✓ Branch 2 taken 1060 times.
✓ Branch 3 taken 95046 times.
2410536 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrc;
2283 2410536 uint16_t **dest16 = (uint16_t**)dest;
2284 2410536 int SH = 22 + 8 - desc->comp[0].depth;
2285 2410536 int A = 0; // init to silence warning
2286
2287
2/2
✓ Branch 0 taken 847005456 times.
✓ Branch 1 taken 2410536 times.
849415992 for (i = 0; i < dstW; i++) {
2288 int j;
2289 847005456 int Y = 1 << 9;
2290 847005456 int U = (1 << 9) - (128 << 19);
2291 847005456 int V = (1 << 9) - (128 << 19);
2292 int R, G, B;
2293
2294
2/2
✓ Branch 0 taken 851651056 times.
✓ Branch 1 taken 847005456 times.
1698656512 for (j = 0; j < lumFilterSize; j++)
2295 851651056 Y += lumSrc[j][i] * lumFilter[j];
2296
2297
2/2
✓ Branch 0 taken 1691087008 times.
✓ Branch 1 taken 847005456 times.
2538092464 for (j = 0; j < chrFilterSize; j++) {
2298 1691087008 U += chrUSrc[j][i] * chrFilter[j];
2299 1691087008 V += chrVSrc[j][i] * chrFilter[j];
2300 }
2301
2302 847005456 Y >>= 10;
2303 847005456 U >>= 10;
2304 847005456 V >>= 10;
2305
2306
2/2
✓ Branch 0 taken 204320 times.
✓ Branch 1 taken 846801136 times.
847005456 if (hasAlpha) {
2307 204320 A = 1 << 18;
2308
2309
2/2
✓ Branch 0 taken 2146320 times.
✓ Branch 1 taken 204320 times.
2350640 for (j = 0; j < lumFilterSize; j++)
2310 2146320 A += alpSrc[j][i] * lumFilter[j];
2311
2312
2/2
✓ Branch 0 taken 175125 times.
✓ Branch 1 taken 29195 times.
204320 if (A & 0xF8000000)
2313 175125 A = av_clip_uintp2(A, 27);
2314 }
2315
2316 847005456 Y -= c->yuv2rgb_y_offset;
2317 847005456 Y *= c->yuv2rgb_y_coeff;
2318 847005456 Y += 1 << (SH-1);
2319 847005456 R = Y + V * c->yuv2rgb_v2r_coeff;
2320 847005456 G = Y + V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
2321 847005456 B = Y + U * c->yuv2rgb_u2b_coeff;
2322
2323
2/2
✓ Branch 0 taken 262059137 times.
✓ Branch 1 taken 584946319 times.
847005456 if ((R | G | B) & 0xC0000000) {
2324 262059137 R = av_clip_uintp2(R, 30);
2325 262059137 G = av_clip_uintp2(G, 30);
2326 262059137 B = av_clip_uintp2(B, 30);
2327 }
2328
2329
2/2
✓ Branch 0 taken 574643408 times.
✓ Branch 1 taken 272362048 times.
847005456 if (SH != 22) {
2330 574643408 dest16[0][i] = G >> SH;
2331 574643408 dest16[1][i] = B >> SH;
2332 574643408 dest16[2][i] = R >> SH;
2333
2/2
✓ Branch 0 taken 171456 times.
✓ Branch 1 taken 574471952 times.
574643408 if (hasAlpha)
2334 171456 dest16[3][i] = A >> (SH - 3);
2335 } else {
2336 272362048 dest[0][i] = G >> 22;
2337 272362048 dest[1][i] = B >> 22;
2338 272362048 dest[2][i] = R >> 22;
2339
2/2
✓ Branch 0 taken 32864 times.
✓ Branch 1 taken 272329184 times.
272362048 if (hasAlpha)
2340 32864 dest[3][i] = A >> 19;
2341 }
2342 }
2343
4/4
✓ Branch 0 taken 1636620 times.
✓ Branch 1 taken 773916 times.
✓ Branch 3 taken 131308 times.
✓ Branch 4 taken 1505312 times.
2410536 if (SH != 22 && (!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2344
2/2
✓ Branch 0 taken 46039136 times.
✓ Branch 1 taken 131308 times.
46170444 for (i = 0; i < dstW; i++) {
2345 46039136 dest16[0][i] = av_bswap16(dest16[0][i]);
2346 46039136 dest16[1][i] = av_bswap16(dest16[1][i]);
2347 46039136 dest16[2][i] = av_bswap16(dest16[2][i]);
2348
2/2
✓ Branch 0 taken 85728 times.
✓ Branch 1 taken 45953408 times.
46039136 if (hasAlpha)
2349 85728 dest16[3][i] = av_bswap16(dest16[3][i]);
2350 }
2351 }
2352 2410536 }
2353
2354 static void
2355 287324 yuv2gbrp16_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2356 const int16_t **lumSrcx, int lumFilterSize,
2357 const int16_t *chrFilter, const int16_t **chrUSrcx,
2358 const int16_t **chrVSrcx, int chrFilterSize,
2359 const int16_t **alpSrcx, uint8_t **dest,
2360 int dstW, int y)
2361 {
2362 287324 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2363 int i;
2364
4/4
✓ Branch 0 taken 20110 times.
✓ Branch 1 taken 267214 times.
✓ Branch 2 taken 524 times.
✓ Branch 3 taken 19586 times.
287324 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrcx;
2365 287324 uint16_t **dest16 = (uint16_t**)dest;
2366 287324 const int32_t **lumSrc = (const int32_t**)lumSrcx;
2367 287324 const int32_t **chrUSrc = (const int32_t**)chrUSrcx;
2368 287324 const int32_t **chrVSrc = (const int32_t**)chrVSrcx;
2369 287324 const int32_t **alpSrc = (const int32_t**)alpSrcx;
2370
2371
2/2
✓ Branch 0 taken 100925504 times.
✓ Branch 1 taken 287324 times.
101212828 for (i = 0; i < dstW; i++) {
2372 int j;
2373 100925504 int Y = -0x40000000;
2374 100925504 int U = -(128 << 23);
2375 100925504 int V = -(128 << 23);
2376 int R, G, B, A;
2377
2378
2/2
✓ Branch 0 taken 102127104 times.
✓ Branch 1 taken 100925504 times.
203052608 for (j = 0; j < lumFilterSize; j++)
2379 102127104 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2380
2381
2/2
✓ Branch 0 taken 175117824 times.
✓ Branch 1 taken 100925504 times.
276043328 for (j = 0; j < chrFilterSize; j++) {
2382 175117824 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2383 175117824 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2384 }
2385
2386 100925504 Y >>= 14;
2387 100925504 Y += 0x10000;
2388 100925504 U >>= 14;
2389 100925504 V >>= 14;
2390
2391
2/2
✓ Branch 0 taken 78688 times.
✓ Branch 1 taken 100846816 times.
100925504 if (hasAlpha) {
2392 78688 A = -0x40000000;
2393
2394
2/2
✓ Branch 0 taken 679488 times.
✓ Branch 1 taken 78688 times.
758176 for (j = 0; j < lumFilterSize; j++)
2395 679488 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2396
2397 78688 A >>= 1;
2398 78688 A += 0x20002000;
2399 }
2400
2401 100925504 Y -= c->yuv2rgb_y_offset;
2402 100925504 Y *= c->yuv2rgb_y_coeff;
2403 100925504 Y += (1 << 13) - (1 << 29);
2404 100925504 R = V * c->yuv2rgb_v2r_coeff;
2405 100925504 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
2406 100925504 B = U * c->yuv2rgb_u2b_coeff;
2407
2408 100925504 dest16[2][i] = av_clip_uintp2(((Y + R) >> 14) + (1<<15), 16);
2409 100925504 dest16[0][i] = av_clip_uintp2(((Y + G) >> 14) + (1<<15), 16);
2410 100925504 dest16[1][i] = av_clip_uintp2(((Y + B) >> 14) + (1<<15), 16);
2411
2412
2/2
✓ Branch 0 taken 78688 times.
✓ Branch 1 taken 100846816 times.
100925504 if (hasAlpha)
2413 78688 dest16[3][i] = av_clip_uintp2(A, 30) >> 14;
2414 }
2415
2/2
✓ Branch 1 taken 87104 times.
✓ Branch 2 taken 200220 times.
287324 if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2416
2/2
✓ Branch 0 taken 30504448 times.
✓ Branch 1 taken 87104 times.
30591552 for (i = 0; i < dstW; i++) {
2417 30504448 dest16[0][i] = av_bswap16(dest16[0][i]);
2418 30504448 dest16[1][i] = av_bswap16(dest16[1][i]);
2419 30504448 dest16[2][i] = av_bswap16(dest16[2][i]);
2420
2/2
✓ Branch 0 taken 45824 times.
✓ Branch 1 taken 30458624 times.
30504448 if (hasAlpha)
2421 45824 dest16[3][i] = av_bswap16(dest16[3][i]);
2422 }
2423 }
2424 287324 }
2425
2426 static void
2427 61228 yuv2gbrpf32_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2428 const int16_t **lumSrcx, int lumFilterSize,
2429 const int16_t *chrFilter, const int16_t **chrUSrcx,
2430 const int16_t **chrVSrcx, int chrFilterSize,
2431 const int16_t **alpSrcx, uint8_t **dest,
2432 int dstW, int y)
2433 {
2434 61228 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2435 int i;
2436
4/4
✓ Branch 0 taken 26840 times.
✓ Branch 1 taken 34388 times.
✓ Branch 2 taken 344 times.
✓ Branch 3 taken 26496 times.
61228 int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrcx;
2437 61228 uint32_t **dest32 = (uint32_t**)dest;
2438 61228 const int32_t **lumSrc = (const int32_t**)lumSrcx;
2439 61228 const int32_t **chrUSrc = (const int32_t**)chrUSrcx;
2440 61228 const int32_t **chrVSrc = (const int32_t**)chrVSrcx;
2441 61228 const int32_t **alpSrc = (const int32_t**)alpSrcx;
2442 static const float float_mult = 1.0f / 65535.0f;
2443
2444
2/2
✓ Branch 0 taken 21426176 times.
✓ Branch 1 taken 61228 times.
21487404 for (i = 0; i < dstW; i++) {
2445 int j;
2446 21426176 int Y = -0x40000000;
2447 21426176 int U = -(128 << 23);
2448 21426176 int V = -(128 << 23);
2449 int R, G, B, A;
2450
2451
2/2
✓ Branch 0 taken 22627776 times.
✓ Branch 1 taken 21426176 times.
44053952 for (j = 0; j < lumFilterSize; j++)
2452 22627776 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2453
2454
2/2
✓ Branch 0 taken 86494656 times.
✓ Branch 1 taken 21426176 times.
107920832 for (j = 0; j < chrFilterSize; j++) {
2455 86494656 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2456 86494656 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2457 }
2458
2459 21426176 Y >>= 14;
2460 21426176 Y += 0x10000;
2461 21426176 U >>= 14;
2462 21426176 V >>= 14;
2463
2464
2/2
✓ Branch 0 taken 65728 times.
✓ Branch 1 taken 21360448 times.
21426176 if (hasAlpha) {
2465 65728 A = -0x40000000;
2466
2467
2/2
✓ Branch 0 taken 666528 times.
✓ Branch 1 taken 65728 times.
732256 for (j = 0; j < lumFilterSize; j++)
2468 666528 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2469
2470 65728 A >>= 1;
2471 65728 A += 0x20002000;
2472 }
2473
2474 21426176 Y -= c->yuv2rgb_y_offset;
2475 21426176 Y *= c->yuv2rgb_y_coeff;
2476 21426176 Y += (1 << 13) - (1 << 29);
2477 21426176 R = V * c->yuv2rgb_v2r_coeff;
2478 21426176 G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
2479 21426176 B = U * c->yuv2rgb_u2b_coeff;
2480
2481 21426176 R = av_clip_uintp2(((Y + R) >> 14) + (1<<15), 16);
2482 21426176 G = av_clip_uintp2(((Y + G) >> 14) + (1<<15), 16);
2483 21426176 B = av_clip_uintp2(((Y + B) >> 14) + (1<<15), 16);
2484
2485 21426176 dest32[0][i] = av_float2int(float_mult * (float)G);
2486 21426176 dest32[1][i] = av_float2int(float_mult * (float)B);
2487 21426176 dest32[2][i] = av_float2int(float_mult * (float)R);
2488
2/2
✓ Branch 0 taken 65728 times.
✓ Branch 1 taken 21360448 times.
21426176 if (hasAlpha)
2489 65728 dest32[3][i] = av_float2int(float_mult * (float)(av_clip_uintp2(A, 30) >> 14));
2490 }
2491
2/2
✓ Branch 1 taken 15608 times.
✓ Branch 2 taken 45620 times.
61228 if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2492
2/2
✓ Branch 0 taken 5438656 times.
✓ Branch 1 taken 15608 times.
5454264 for (i = 0; i < dstW; i++) {
2493 5438656 dest32[0][i] = av_bswap32(dest32[0][i]);
2494 5438656 dest32[1][i] = av_bswap32(dest32[1][i]);
2495 5438656 dest32[2][i] = av_bswap32(dest32[2][i]);
2496
2/2
✓ Branch 0 taken 32864 times.
✓ Branch 1 taken 5405792 times.
5438656 if (hasAlpha)
2497 32864 dest32[3][i] = av_bswap32(dest32[3][i]);
2498 }
2499 }
2500 61228 }
2501
2502 static void
2503 yuv2ya8_1_c(SwsInternal *c, const int16_t *buf0,
2504 const int16_t *ubuf[2], const int16_t *vbuf[2],
2505 const int16_t *abuf0, uint8_t *dest, int dstW,
2506 int uvalpha, int y)
2507 {
2508 int hasAlpha = !!abuf0;
2509 int i;
2510
2511 for (i = 0; i < dstW; i++) {
2512 int Y = (buf0[i] + 64) >> 7;
2513 int A;
2514
2515 Y = av_clip_uint8(Y);
2516
2517 if (hasAlpha) {
2518 A = (abuf0[i] + 64) >> 7;
2519 if (A & 0x100)
2520 A = av_clip_uint8(A);
2521 }
2522
2523 dest[i * 2 ] = Y;
2524 dest[i * 2 + 1] = hasAlpha ? A : 255;
2525 }
2526 }
2527
2528 static void
2529 yuv2ya8_2_c(SwsInternal *c, const int16_t *buf[2],
2530 const int16_t *ubuf[2], const int16_t *vbuf[2],
2531 const int16_t *abuf[2], uint8_t *dest, int dstW,
2532 int yalpha, int uvalpha, int y)
2533 {
2534 int hasAlpha = abuf && abuf[0] && abuf[1];
2535 const int16_t *buf0 = buf[0], *buf1 = buf[1],
2536 *abuf0 = hasAlpha ? abuf[0] : NULL,
2537 *abuf1 = hasAlpha ? abuf[1] : NULL;
2538 int yalpha1 = 4096 - yalpha;
2539 int i;
2540
2541 av_assert2(yalpha <= 4096U);
2542
2543 for (i = 0; i < dstW; i++) {
2544 int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 19;
2545 int A;
2546
2547 Y = av_clip_uint8(Y);
2548
2549 if (hasAlpha) {
2550 A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 19;
2551 A = av_clip_uint8(A);
2552 }
2553
2554 dest[i * 2 ] = Y;
2555 dest[i * 2 + 1] = hasAlpha ? A : 255;
2556 }
2557 }
2558
2559 static void
2560 6148 yuv2ya8_X_c(SwsInternal *c, const int16_t *lumFilter,
2561 const int16_t **lumSrc, int lumFilterSize,
2562 const int16_t *chrFilter, const int16_t **chrUSrc,
2563 const int16_t **chrVSrc, int chrFilterSize,
2564 const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
2565 {
2566 6148 int hasAlpha = !!alpSrc;
2567 int i;
2568
2569
2/2
✓ Branch 0 taken 2148896 times.
✓ Branch 1 taken 6148 times.
2155044 for (i = 0; i < dstW; i++) {
2570 int j;
2571 2148896 int Y = 1 << 18, A = 1 << 18;
2572
2573
2/2
✓ Branch 0 taken 2368896 times.
✓ Branch 1 taken 2148896 times.
4517792 for (j = 0; j < lumFilterSize; j++)
2574 2368896 Y += lumSrc[j][i] * lumFilter[j];
2575
2576 2148896 Y >>= 19;
2577
2/2
✓ Branch 0 taken 11918 times.
✓ Branch 1 taken 2136978 times.
2148896 if (Y & 0x100)
2578 11918 Y = av_clip_uint8(Y);
2579
2580
2/2
✓ Branch 0 taken 20000 times.
✓ Branch 1 taken 2128896 times.
2148896 if (hasAlpha) {
2581
2/2
✓ Branch 0 taken 240000 times.
✓ Branch 1 taken 20000 times.
260000 for (j = 0; j < lumFilterSize; j++)
2582 240000 A += alpSrc[j][i] * lumFilter[j];
2583
2584 20000 A >>= 19;
2585
2586
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 20000 times.
20000 if (A & 0x100)
2587 A = av_clip_uint8(A);
2588 }
2589
2590 2148896 dest[2 * i ] = Y;
2591
2/2
✓ Branch 0 taken 20000 times.
✓ Branch 1 taken 2128896 times.
2148896 dest[2 * i + 1] = hasAlpha ? A : 255;
2592 }
2593 6148 }
2594
2595 #define output_pixels(pos, val) \
2596 if (is_be) { \
2597 AV_WB16(pos, val); \
2598 } else { \
2599 AV_WL16(pos, val); \
2600 }
2601
2602 static av_always_inline void
2603 173200 yuv2ayuv64_X_c(SwsInternal *c, const int16_t *lumFilter,
2604 const int16_t **_lumSrc, int lumFilterSize,
2605 const int16_t *chrFilter, const int16_t **_chrUSrc,
2606 const int16_t **_chrVSrc, int chrFilterSize,
2607 const int16_t **_alpSrc, uint8_t *dest, int dstW, int y,
2608 int A_offset, int Y_offset, int U_offset, int V_offset, int is_be)
2609 {
2610 173200 const int32_t **lumSrc = (const int32_t **) _lumSrc,
2611 173200 **chrUSrc = (const int32_t **) _chrUSrc,
2612 173200 **chrVSrc = (const int32_t **) _chrVSrc,
2613 173200 **alpSrc = (const int32_t **) _alpSrc;
2614 173200 int hasAlpha = !!alpSrc;
2615 int i;
2616
2617
2/2
✓ Branch 0 taken 60905600 times.
✓ Branch 1 taken 173200 times.
61078800 for (i = 0; i < dstW; i++) {
2618 60905600 int Y = 1 << 14, U = 1 << 14;
2619 60905600 int V = 1 << 14, A = 1 << 14;
2620 int j;
2621
2622 60905600 Y -= 0x40000000;
2623 60905600 U -= 0x40000000;
2624 60905600 V -= 0x40000000;
2625 60905600 A -= 0x40000000;
2626
2627
2/2
✓ Branch 0 taken 61785600 times.
✓ Branch 1 taken 60905600 times.
122691200 for (j = 0; j < lumFilterSize; j++)
2628 61785600 Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2629
2630
2/2
✓ Branch 0 taken 86115840 times.
✓ Branch 1 taken 60905600 times.
147021440 for (j = 0; j < chrFilterSize; j++)
2631 86115840 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2632
2633
2/2
✓ Branch 0 taken 86115840 times.
✓ Branch 1 taken 60905600 times.
147021440 for (j = 0; j < chrFilterSize; j++)
2634 86115840 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2635
2636
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 60865600 times.
60905600 if (hasAlpha)
2637
2/2
✓ Branch 0 taken 480000 times.
✓ Branch 1 taken 40000 times.
520000 for (j = 0; j < lumFilterSize; j++)
2638 480000 A += alpSrc[j][i] * (unsigned)lumFilter[j];
2639
2640 60905600 Y = 0x8000 + av_clip_int16(Y >> 15);
2641 60905600 U = 0x8000 + av_clip_int16(U >> 15);
2642 60905600 V = 0x8000 + av_clip_int16(V >> 15);
2643
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 60865600 times.
60905600 if (hasAlpha)
2644 40000 A = 0x8000 + av_clip_int16(A >> 15);
2645
2646
6/6
✓ Branch 0 taken 30452800 times.
✓ Branch 1 taken 30452800 times.
✓ Branch 2 taken 20000 times.
✓ Branch 3 taken 30432800 times.
✓ Branch 4 taken 20000 times.
✓ Branch 5 taken 30432800 times.
60905600 output_pixels(dest + 8 * i + A_offset, hasAlpha ? A : 65535);
2647
2/2
✓ Branch 0 taken 30452800 times.
✓ Branch 1 taken 30452800 times.
60905600 output_pixels(dest + 8 * i + Y_offset, Y);
2648
2/2
✓ Branch 0 taken 30452800 times.
✓ Branch 1 taken 30452800 times.
60905600 output_pixels(dest + 8 * i + U_offset, U);
2649
2/2
✓ Branch 0 taken 30452800 times.
✓ Branch 1 taken 30452800 times.
60905600 output_pixels(dest + 8 * i + V_offset, V);
2650 }
2651 173200 }
2652
2653 #define YUV2AYUV64(pixfmt, BE_LE, A, Y, U, V, is_be) \
2654 static void \
2655 yuv2 ## pixfmt ## BE_LE ##_X_c(SwsInternal *c, const int16_t *lumFilter, \
2656 const int16_t **lumSrc, int lumFilterSize, \
2657 const int16_t *chrFilter, const int16_t **chrUSrc, \
2658 const int16_t **chrVSrc, int chrFilterSize, \
2659 const int16_t **alpSrc, uint8_t *dest, int dstW, int y) \
2660 { \
2661 yuv2ayuv64_X_c(c, lumFilter, lumSrc, lumFilterSize, \
2662 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2663 alpSrc, dest, dstW, y, A, Y, U, V, is_be); \
2664 }
2665
2666 5860 YUV2AYUV64(ayuv64, le, 0, 2, 4, 6, 0)
2667 5860 YUV2AYUV64(ayuv64, be, 0, 2, 4, 6, 1)
2668
2669 80740 YUV2AYUV64(xv48, le, 6, 2, 0, 4, 0)
2670 80740 YUV2AYUV64(xv48, be, 6, 2, 0, 4, 1)
2671
2672 #undef output_pixels
2673
2674 static av_always_inline void
2675 176428 yuv2v30_X_c_template(SwsInternal *c, const int16_t *lumFilter,
2676 const int16_t **lumSrc, int lumFilterSize,
2677 const int16_t *chrFilter, const int16_t **chrUSrc,
2678 const int16_t **chrVSrc, int chrFilterSize,
2679 const int16_t **alpSrc, uint8_t *dest, int dstW, int y,
2680 int shift)
2681 {
2682 int i;
2683
2/2
✓ Branch 0 taken 61531656 times.
✓ Branch 1 taken 176428 times.
61708084 for (i = 0; i < dstW; i++) {
2684 61531656 int Y = 1 << 16, U = 1 << 16, V = 1 << 16, A = 0x3;
2685 int j;
2686
2687
2/2
✓ Branch 0 taken 61971656 times.
✓ Branch 1 taken 61531656 times.
123503312 for (j = 0; j < lumFilterSize; j++)
2688 61971656 Y += lumSrc[j][i] * lumFilter[j];
2689
2690
2/2
✓ Branch 0 taken 74136776 times.
✓ Branch 1 taken 61531656 times.
135668432 for (j = 0; j < chrFilterSize; j++) {
2691 74136776 U += chrUSrc[j][i] * chrFilter[j];
2692 74136776 V += chrVSrc[j][i] * chrFilter[j];
2693 }
2694
2695 61531656 Y = av_clip_uintp2(Y >> 17, 10);
2696 61531656 U = av_clip_uintp2(U >> 17, 10);
2697 61531656 V = av_clip_uintp2(V >> 17, 10);
2698
2699
2/2
✓ Branch 0 taken 38397928 times.
✓ Branch 1 taken 23133728 times.
61531656 AV_WL32(dest + 4 * i, U << (shift + 0) |
2700 Y << (shift + 10) |
2701 (unsigned)V << (shift + 20) |
2702 (unsigned)A << (shift ? 0 : 30 /* xv30le = 30, v30xle = 0 */));
2703 }
2704 176428 }
2705
2706 #define V30LE_WRAPPER(name, shift) \
2707 static void yuv2 ## name ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
2708 const int16_t **lumSrc, int lumFilterSize, \
2709 const int16_t *chrFilter, const int16_t **chrUSrc, \
2710 const int16_t **chrVSrc, int chrFilterSize, \
2711 const int16_t **alpSrc, uint8_t *dest, int dstW, \
2712 int y) \
2713 { \
2714 yuv2v30_X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
2715 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2716 alpSrc, dest, dstW, y, shift); \
2717 }
2718
2719 65764 V30LE_WRAPPER(xv30le, 0)
2720 110664 V30LE_WRAPPER(v30xle, 2)
2721
2722 #define output_pixels(pos, val, shift, bits, output_shift) \
2723 if (is_be) { \
2724 AV_WB16(pos, av_clip_uintp2(val >> shift, bits) << output_shift); \
2725 } else { \
2726 AV_WL16(pos, av_clip_uintp2(val >> shift, bits) << output_shift); \
2727 }
2728
2729 static void
2730 131528 yuv2xv36_X_c(SwsInternal *c, const int16_t *lumFilter,
2731 const int16_t **lumSrc, int lumFilterSize,
2732 const int16_t *chrFilter, const int16_t **chrUSrc,
2733 const int16_t **chrVSrc, int chrFilterSize,
2734 const int16_t **alpSrc, uint8_t *dest, int dstW, int y, int is_be)
2735 {
2736 int i;
2737
2/2
✓ Branch 0 taken 46267456 times.
✓ Branch 1 taken 131528 times.
46398984 for (i = 0; i < dstW; i++) {
2738 46267456 int Y = 1 << 14, U = 1 << 14, V = 1 << 14, A = 65535;
2739 int j;
2740
2741
2/2
✓ Branch 0 taken 46707456 times.
✓ Branch 1 taken 46267456 times.
92974912 for (j = 0; j < lumFilterSize; j++)
2742 46707456 Y += lumSrc[j][i] * lumFilter[j];
2743
2744
2/2
✓ Branch 0 taken 58872576 times.
✓ Branch 1 taken 46267456 times.
105140032 for (j = 0; j < chrFilterSize; j++) {
2745 58872576 U += chrUSrc[j][i] * chrFilter[j];
2746 58872576 V += chrVSrc[j][i] * chrFilter[j];
2747 }
2748
2749
2/2
✓ Branch 0 taken 23133728 times.
✓ Branch 1 taken 23133728 times.
46267456 output_pixels(dest + 8 * i + 2, Y, 15, 12, 4)
2750
2/2
✓ Branch 0 taken 23133728 times.
✓ Branch 1 taken 23133728 times.
46267456 output_pixels(dest + 8 * i + 0, U, 15, 12, 4)
2751
2/2
✓ Branch 0 taken 23133728 times.
✓ Branch 1 taken 23133728 times.
46267456 output_pixels(dest + 8 * i + 4, V, 15, 12, 4)
2752
2/2
✓ Branch 0 taken 23133728 times.
✓ Branch 1 taken 23133728 times.
46267456 output_pixels(dest + 8 * i + 6, A, 0, 12, 4);
2753 }
2754 131528 }
2755
2756 #undef output_pixels
2757
2758 #define YUV2XV36(BE_LE, is_be) \
2759 static void \
2760 yuv2xv36 ## BE_LE ##_X_c(SwsInternal *c, const int16_t *lumFilter, \
2761 const int16_t **lumSrc, int lumFilterSize, \
2762 const int16_t *chrFilter, const int16_t **chrUSrc, \
2763 const int16_t **chrVSrc, int chrFilterSize, \
2764 const int16_t **alpSrc, uint8_t *dest, int dstW, int y) \
2765 { \
2766 yuv2xv36_X_c(c, lumFilter, lumSrc, lumFilterSize, \
2767 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2768 alpSrc, dest, dstW, y, is_be); \
2769 }
2770
2771 65764 YUV2XV36(le, 0)
2772 65764 YUV2XV36(be, 1)
2773
2774 #define output_pixels(pos, A, Y, U, V) \
2775 if (target == AV_PIX_FMT_AYUV) { \
2776 dest[pos + 0] = A; \
2777 dest[pos + 1] = Y; \
2778 dest[pos + 2] = U; \
2779 dest[pos + 3] = V; \
2780 } else if (target == AV_PIX_FMT_UYVA) { \
2781 dest[pos + 0] = U; \
2782 dest[pos + 1] = Y; \
2783 dest[pos + 2] = V; \
2784 dest[pos + 3] = A; \
2785 } else { /* AV_PIX_FMT_VUYA || AV_PIX_FMT_VUYX */ \
2786 dest[pos + 0] = V; \
2787 dest[pos + 1] = U; \
2788 dest[pos + 2] = Y; \
2789 dest[pos + 3] = A; \
2790 }
2791
2792 static av_always_inline void
2793 104804 yuv2ayuv_1_c_template(SwsInternal *c, const int16_t *buf0,
2794 const int16_t *ubuf[2], const int16_t *vbuf[2],
2795 const int16_t *abuf0, uint8_t *dest, int dstW,
2796 int uvalpha, int y, enum AVPixelFormat target)
2797 {
2798 104804 int hasAlpha = !!abuf0;
2799 int i;
2800
2801
1/2
✓ Branch 0 taken 104804 times.
✗ Branch 1 not taken.
104804 if (uvalpha < 2048) {
2802
2/2
✓ Branch 0 taken 36350408 times.
✓ Branch 1 taken 104804 times.
36455212 for (i = 0; i < dstW; i++) {
2803 36350408 int Y = (buf0[i] + 64) >> 7;
2804 36350408 int U = (ubuf[0][i] + 64) >> 7;
2805 36350408 int V = (vbuf[0][i] + 64) >> 7;
2806 36350408 int A = 255;
2807
2808
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36350408 times.
36350408 if (Y & 0x100)
2809 Y = av_clip_uint8(Y);
2810
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36350408 times.
36350408 if (U & 0x100)
2811 U = av_clip_uint8(U);
2812
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36350408 times.
36350408 if (V & 0x100)
2813 V = av_clip_uint8(V);
2814
2815
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36350408 times.
36350408 if (hasAlpha) {
2816 A = (abuf0[i] + 64) >> 7;
2817 if (A & 0x100)
2818 A = av_clip_uint8(A);
2819 }
2820
2821
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36350408 times.
✓ Branch 2 taken 15264200 times.
✓ Branch 3 taken 21086208 times.
36350408 output_pixels(i * 4, A, Y, U, V)
2822 }
2823 } else {
2824 for (i = 0; i < dstW; i++) {
2825 int Y = (buf0[i] + 64) >> 7;
2826 int U = (ubuf[0][i] + ubuf[1][i] + 128) >> 8;
2827 int V = (vbuf[0][i] + vbuf[1][i] + 128) >> 8;
2828 int A = 255;
2829
2830 if (Y & 0x100)
2831 Y = av_clip_uint8(Y);
2832 if (U & 0x100)
2833 U = av_clip_uint8(U);
2834 if (V & 0x100)
2835 V = av_clip_uint8(V);
2836
2837 if (hasAlpha) {
2838 A = (abuf0[i] + 64) >> 7;
2839 if (A & 0x100)
2840 A = av_clip_uint8(A);
2841 }
2842
2843 output_pixels(i * 4, A, Y, U, V)
2844 }
2845 }
2846 104804 }
2847
2848 static av_always_inline void
2849 yuv2ayuv_2_c_template(SwsInternal *c, const int16_t *buf[2],
2850 const int16_t *ubuf[2], const int16_t *vbuf[2],
2851 const int16_t *abuf[2], uint8_t *dest, int dstW,
2852 int yalpha, int uvalpha, int y,
2853 enum AVPixelFormat target)
2854 {
2855 int hasAlpha = abuf && abuf[0] && abuf[1];
2856 const int16_t *buf0 = buf[0], *buf1 = buf[1],
2857 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
2858 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
2859 *abuf0 = hasAlpha ? abuf[0] : NULL,
2860 *abuf1 = hasAlpha ? abuf[1] : NULL;
2861 int yalpha1 = 4096 - yalpha;
2862 int uvalpha1 = 4096 - uvalpha;
2863 int i;
2864
2865 av_assert2(yalpha <= 4096U);
2866 av_assert2(uvalpha <= 4096U);
2867
2868 for (i = 0; i < dstW; i++) {
2869 int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 19;
2870 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
2871 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
2872 int A = 255;
2873
2874 if (Y & 0x100)
2875 Y = av_clip_uint8(Y);
2876 if (U & 0x100)
2877 U = av_clip_uint8(U);
2878 if (V & 0x100)
2879 V = av_clip_uint8(V);
2880
2881 if (hasAlpha) {
2882 A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 19;
2883 A = av_clip_uint8(A);
2884 }
2885
2886 output_pixels(i * 4, A, Y, U, V)
2887 }
2888 }
2889
2890 static av_always_inline void
2891 25168 yuv2ayuv_X_c_template(SwsInternal *c, const int16_t *lumFilter,
2892 const int16_t **lumSrc, int lumFilterSize,
2893 const int16_t *chrFilter, const int16_t **chrUSrc,
2894 const int16_t **chrVSrc, int chrFilterSize,
2895 const int16_t **alpSrc, uint8_t *dest, int dstW,
2896 int y, enum AVPixelFormat target)
2897 {
2898 int i;
2899
2900
2/2
✓ Branch 0 taken 8798336 times.
✓ Branch 1 taken 25168 times.
8823504 for (i = 0; i < dstW; i++) {
2901 int j;
2902 8798336 int Y = 1 << 18, U = 1 << 18;
2903 8798336 int V = 1 << 18, A = 255;
2904
2905
2/2
✓ Branch 0 taken 9678336 times.
✓ Branch 1 taken 8798336 times.
18476672 for (j = 0; j < lumFilterSize; j++)
2906 9678336 Y += lumSrc[j][i] * lumFilter[j];
2907
2908
2/2
✓ Branch 0 taken 35833344 times.
✓ Branch 1 taken 8798336 times.
44631680 for (j = 0; j < chrFilterSize; j++)
2909 35833344 U += chrUSrc[j][i] * chrFilter[j];
2910
2911
2/2
✓ Branch 0 taken 35833344 times.
✓ Branch 1 taken 8798336 times.
44631680 for (j = 0; j < chrFilterSize; j++)
2912 35833344 V += chrVSrc[j][i] * chrFilter[j];
2913
2914 8798336 Y >>= 19;
2915 8798336 U >>= 19;
2916 8798336 V >>= 19;
2917
2918
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8798336 times.
8798336 if (Y & 0x100)
2919 Y = av_clip_uint8(Y);
2920
2/2
✓ Branch 0 taken 364 times.
✓ Branch 1 taken 8797972 times.
8798336 if (U & 0x100)
2921 364 U = av_clip_uint8(U);
2922
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8798328 times.
8798336 if (V & 0x100)
2923 8 V = av_clip_uint8(V);
2924
2925
2/2
✓ Branch 0 taken 60000 times.
✓ Branch 1 taken 8738336 times.
8798336 if (alpSrc) {
2926 60000 A = 1 << 18;
2927
2928
2/2
✓ Branch 0 taken 720000 times.
✓ Branch 1 taken 60000 times.
780000 for (j = 0; j < lumFilterSize; j++)
2929 720000 A += alpSrc[j][i] * lumFilter[j];
2930
2931 60000 A >>= 19;
2932
2933
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 60000 times.
60000 if (A & 0x100)
2934 A = av_clip_uint8(A);
2935 }
2936
2937
4/4
✓ Branch 0 taken 2148896 times.
✓ Branch 1 taken 6649440 times.
✓ Branch 2 taken 2148896 times.
✓ Branch 3 taken 4500544 times.
8798336 output_pixels(i * 4, A, Y, U, V)
2938 }
2939 25168 }
2940
2941 #undef output_pixels
2942
2943 #define AYUVPACKEDWRAPPER(name, fmt) \
2944 static void yuv2 ## name ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
2945 const int16_t **lumSrc, int lumFilterSize, \
2946 const int16_t *chrFilter, const int16_t **chrUSrc, \
2947 const int16_t **chrVSrc, int chrFilterSize, \
2948 const int16_t **alpSrc, uint8_t *dest, int dstW, \
2949 int y) \
2950 { \
2951 yuv2ayuv_X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
2952 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2953 alpSrc, dest, dstW, y, fmt); \
2954 } \
2955 \
2956 static void yuv2 ## name ## _2_c(SwsInternal *c, const int16_t *buf[2], \
2957 const int16_t *ubuf[2], const int16_t *vbuf[2], \
2958 const int16_t *abuf[2], uint8_t *dest, int dstW, \
2959 int yalpha, int uvalpha, int y) \
2960 { \
2961 yuv2ayuv_2_c_template(c, buf, ubuf, vbuf, abuf, \
2962 dest, dstW, yalpha, uvalpha, y, fmt); \
2963 } \
2964 \
2965 static void yuv2 ## name ## _1_c(SwsInternal *c, const int16_t *buf0, \
2966 const int16_t *ubuf[2], const int16_t *vbuf[2], \
2967 const int16_t *abuf0, uint8_t *dest, int dstW, \
2968 int uvalpha, int y) \
2969 { \
2970 yuv2ayuv_1_c_template(c, buf0, ubuf, vbuf, \
2971 abuf0, dest, dstW, uvalpha, \
2972 y, fmt); \
2973 }
2974
2975 145552 AYUVPACKEDWRAPPER(vuyX, AV_PIX_FMT_VUYX)
2976 12296 AYUVPACKEDWRAPPER(ayuv, AV_PIX_FMT_AYUV)
2977 102096 AYUVPACKEDWRAPPER(uyva, AV_PIX_FMT_UYVA)
2978
2979 #define output_pixel(pos, val, bits) \
2980 AV_WL16(pos, av_clip_uintp2(val >> shift, bits) << output_shift);
2981
2982 #define yuv2y2xx_wrapper(bits) \
2983 static void \
2984 yuv2y2 ## bits ## le_X_c(SwsInternal *c, const int16_t *lumFilter, \
2985 const int16_t **lumSrc, int lumFilterSize, \
2986 const int16_t *chrFilter, \
2987 const int16_t **chrUSrc, \
2988 const int16_t **chrVSrc, int chrFilterSize, \
2989 const int16_t **alpSrc, \
2990 uint8_t *dest, int dstW, int y) \
2991 { \
2992 int i, j; \
2993 int shift = 11 + 16 - bits; \
2994 int output_shift = 16 - bits; \
2995 for (i = 0; i < ((dstW + 1) >> 1); i++) { \
2996 int Y1 = 1 << (shift - 1), Y2 = 1 << (shift - 1); \
2997 int U = 1 << (shift - 1), V = 1 << (shift - 1); \
2998 \
2999 for (j = 0; j < lumFilterSize; j++) { \
3000 Y1 += lumSrc[j][i * 2] * lumFilter[j]; \
3001 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j]; \
3002 } \
3003 \
3004 for (j = 0; j < chrFilterSize; j++) { \
3005 U += chrUSrc[j][i] * chrFilter[j]; \
3006 V += chrVSrc[j][i] * chrFilter[j]; \
3007 } \
3008 \
3009 output_pixel(dest + 8 * i + 0, Y1, bits); \
3010 output_pixel(dest + 8 * i + 2, U, bits); \
3011 output_pixel(dest + 8 * i + 4, Y2, bits); \
3012 output_pixel(dest + 8 * i + 6, V, bits); \
3013 } \
3014 }
3015
3016
6/6
✓ Branch 0 taken 11524800 times.
✓ Branch 1 taken 11414800 times.
✓ Branch 2 taken 14109888 times.
✓ Branch 3 taken 11414800 times.
✓ Branch 4 taken 11414800 times.
✓ Branch 5 taken 64900 times.
37114388 yuv2y2xx_wrapper(10)
3017
6/6
✓ Branch 0 taken 11524800 times.
✓ Branch 1 taken 11414800 times.
✓ Branch 2 taken 14109888 times.
✓ Branch 3 taken 11414800 times.
✓ Branch 4 taken 11414800 times.
✓ Branch 5 taken 64900 times.
37114388 yuv2y2xx_wrapper(12)
3018
3019 static void
3020 79876 yuv2y216le_X_c(SwsInternal *c, const int16_t *lumFilter,
3021 const int16_t **_lumSrc, int lumFilterSize,
3022 const int16_t *chrFilter,
3023 const int16_t **_chrUSrc,
3024 const int16_t **_chrVSrc, int chrFilterSize,
3025 const int16_t **_alpSrc,
3026 uint8_t *dest, int dstW, int y)
3027 {
3028 79876 const int32_t **lumSrc = (const int32_t **)_lumSrc;
3029 79876 const int32_t **chrUSrc = (const int32_t **)_chrUSrc;
3030 79876 const int32_t **chrVSrc = (const int32_t **)_chrVSrc;
3031 79876 int shift = 15;
3032
3033
2/2
✓ Branch 0 taken 14050576 times.
✓ Branch 1 taken 79876 times.
14130452 for (int i = 0; i < ((dstW + 1) >> 1); i++) {
3034 14050576 int Y1 = 1 << (shift - 1), Y2 = 1 << (shift - 1);
3035 14050576 int U = 1 << (shift - 1), V = 1 << (shift - 1);
3036
3037 /* See yuv2planeX_16_c_template for details. */
3038 14050576 Y1 -= 0x40000000;
3039 14050576 U -= 0x40000000;
3040 14050576 Y2 -= 0x40000000;
3041 14050576 V -= 0x40000000;
3042
3043
2/2
✓ Branch 0 taken 14160576 times.
✓ Branch 1 taken 14050576 times.
28211152 for (int j = 0; j < lumFilterSize; j++) {
3044 14160576 Y1 += lumSrc[j][i * 2] * (unsigned)lumFilter[j];
3045 14160576 Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
3046 }
3047
3048
2/2
✓ Branch 0 taken 16745664 times.
✓ Branch 1 taken 14050576 times.
30796240 for (int j = 0; j < chrFilterSize; j++) {
3049 16745664 U += chrUSrc[j][i] * (unsigned)chrFilter[j];
3050 16745664 V += chrVSrc[j][i] * (unsigned)chrFilter[j];
3051 }
3052
3053 14050576 AV_WL16(dest + 8 * i + 0, 0x8000 + av_clip_int16(Y1 >> shift));
3054 14050576 AV_WL16(dest + 8 * i + 2, 0x8000 + av_clip_int16(U >> shift));
3055 14050576 AV_WL16(dest + 8 * i + 4, 0x8000 + av_clip_int16(Y2 >> shift));
3056 14050576 AV_WL16(dest + 8 * i + 6, 0x8000 + av_clip_int16(V >> shift));
3057 }
3058 79876 }
3059
3060 static void
3061 104804 yuv2vyu444_1_c(SwsInternal *c, const int16_t *buf0,
3062 const int16_t *ubuf[2], const int16_t *vbuf[2],
3063 const int16_t *abuf0, uint8_t *dest, int dstW,
3064 int uvalpha, int y)
3065 {
3066 int i;
3067
3068
1/2
✓ Branch 0 taken 104804 times.
✗ Branch 1 not taken.
104804 if (uvalpha < 2048) {
3069
2/2
✓ Branch 0 taken 36350408 times.
✓ Branch 1 taken 104804 times.
36455212 for (i = 0; i < dstW; i++) {
3070 36350408 int Y = (buf0[i] + 64) >> 7;
3071 36350408 int U = (ubuf[0][i] + 64) >> 7;
3072 36350408 int V = (vbuf[0][i] + 64) >> 7;
3073
3074
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36350408 times.
36350408 if (Y & 0x100)
3075 Y = av_clip_uint8(Y);
3076
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36350408 times.
36350408 if (U & 0x100)
3077 U = av_clip_uint8(U);
3078
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36350408 times.
36350408 if (V & 0x100)
3079 V = av_clip_uint8(V);
3080
3081 36350408 dest[3 * i ] = V;
3082 36350408 dest[3 * i + 1] = Y;
3083 36350408 dest[3 * i + 2] = U;
3084 }
3085 } else {
3086 for (i = 0; i < dstW; i++) {
3087 int Y = (buf0[i] + 64) >> 7;
3088 int U = (ubuf[0][i] + ubuf[1][i] + 128) >> 8;
3089 int V = (vbuf[0][i] + vbuf[1][i] + 128) >> 8;
3090
3091 if (Y & 0x100)
3092 Y = av_clip_uint8(Y);
3093 if (U & 0x100)
3094 U = av_clip_uint8(U);
3095 if (V & 0x100)
3096 V = av_clip_uint8(V);
3097
3098 dest[3 * i ] = V;
3099 dest[3 * i + 1] = Y;
3100 dest[3 * i + 2] = U;
3101 }
3102 }
3103 104804 }
3104
3105 static void
3106 yuv2vyu444_2_c(SwsInternal *c, const int16_t *buf[2],
3107 const int16_t *ubuf[2], const int16_t *vbuf[2],
3108 const int16_t *abuf[2], uint8_t *dest, int dstW,
3109 int yalpha, int uvalpha, int y)
3110 {
3111 const int16_t *buf0 = buf[0], *buf1 = buf[1],
3112 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
3113 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
3114 int yalpha1 = 4096 - yalpha;
3115 int uvalpha1 = 4096 - uvalpha;
3116 int i;
3117
3118 av_assert2(yalpha <= 4096U);
3119 av_assert2(uvalpha <= 4096U);
3120
3121 for (i = 0; i < dstW; i++) {
3122 int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 19;
3123 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
3124 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
3125
3126 if (Y & 0x100)
3127 Y = av_clip_uint8(Y);
3128 if (U & 0x100)
3129 U = av_clip_uint8(U);
3130 if (V & 0x100)
3131 V = av_clip_uint8(V);
3132
3133 dest[3 * i ] = V;
3134 dest[3 * i + 1] = Y;
3135 dest[3 * i + 2] = U;
3136 }
3137 }
3138
3139 static void
3140 6724 yuv2vyu444_X_c(SwsInternal *c, const int16_t *lumFilter,
3141 const int16_t **lumSrc, int lumFilterSize,
3142 const int16_t *chrFilter, const int16_t **chrUSrc,
3143 const int16_t **chrVSrc, int chrFilterSize,
3144 const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
3145 {
3146 int i;
3147
3148
2/2
✓ Branch 0 taken 2351648 times.
✓ Branch 1 taken 6724 times.
2358372 for (i = 0; i < dstW; i++) {
3149 int j;
3150 2351648 int Y = 1 << 18, U = 1 << 18;
3151 2351648 int V = 1 << 18;
3152
3153
2/2
✓ Branch 0 taken 2571648 times.
✓ Branch 1 taken 2351648 times.
4923296 for (j = 0; j < lumFilterSize; j++)
3154 2571648 Y += lumSrc[j][i] * lumFilter[j];
3155
3156
2/2
✓ Branch 0 taken 9566592 times.
✓ Branch 1 taken 2351648 times.
11918240 for (j = 0; j < chrFilterSize; j++)
3157 9566592 U += chrUSrc[j][i] * chrFilter[j];
3158
3159
2/2
✓ Branch 0 taken 9566592 times.
✓ Branch 1 taken 2351648 times.
11918240 for (j = 0; j < chrFilterSize; j++)
3160 9566592 V += chrVSrc[j][i] * chrFilter[j];
3161
3162 2351648 Y >>= 19;
3163 2351648 U >>= 19;
3164 2351648 V >>= 19;
3165
3166
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2351648 times.
2351648 if (Y & 0x100)
3167 Y = av_clip_uint8(Y);
3168
2/2
✓ Branch 0 taken 97 times.
✓ Branch 1 taken 2351551 times.
2351648 if (U & 0x100)
3169 97 U = av_clip_uint8(U);
3170
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2351646 times.
2351648 if (V & 0x100)
3171 2 V = av_clip_uint8(V);
3172
3173 2351648 dest[3 * i ] = V;
3174 2351648 dest[3 * i + 1] = Y;
3175 2351648 dest[3 * i + 2] = U;
3176 }
3177 6724 }
3178
3179 #undef output_pixel
3180
3181 182680 av_cold void ff_sws_init_output_funcs(SwsInternal *c,
3182 yuv2planar1_fn *yuv2plane1,
3183 yuv2planarX_fn *yuv2planeX,
3184 yuv2interleavedX_fn *yuv2nv12cX,
3185 yuv2packed1_fn *yuv2packed1,
3186 yuv2packed2_fn *yuv2packed2,
3187 yuv2packedX_fn *yuv2packedX,
3188 yuv2anyX_fn *yuv2anyX)
3189 {
3190 182680 enum AVPixelFormat dstFormat = c->opts.dst_format;
3191 182680 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(dstFormat);
3192
3193
4/4
✓ Branch 1 taken 12193 times.
✓ Branch 2 taken 170487 times.
✓ Branch 4 taken 6554 times.
✓ Branch 5 taken 5639 times.
182680 if (isSemiPlanarYUV(dstFormat) && isDataInHighBits(dstFormat)) {
3194
2/2
✓ Branch 0 taken 3251 times.
✓ Branch 1 taken 3303 times.
6554 if (desc->comp[0].depth == 10) {
3195
2/2
✓ Branch 1 taken 1647 times.
✓ Branch 2 taken 1604 times.
3251 *yuv2plane1 = isBE(dstFormat) ? yuv2p010l1_BE_c : yuv2p010l1_LE_c;
3196
2/2
✓ Branch 1 taken 1647 times.
✓ Branch 2 taken 1604 times.
3251 *yuv2planeX = isBE(dstFormat) ? yuv2p010lX_BE_c : yuv2p010lX_LE_c;
3197
2/2
✓ Branch 1 taken 1647 times.
✓ Branch 2 taken 1604 times.
3251 *yuv2nv12cX = isBE(dstFormat) ? yuv2p010cX_BE_c : yuv2p010cX_LE_c;
3198
1/2
✓ Branch 0 taken 3303 times.
✗ Branch 1 not taken.
3303 } else if (desc->comp[0].depth == 12) {
3199
2/2
✓ Branch 1 taken 1647 times.
✓ Branch 2 taken 1656 times.
3303 *yuv2plane1 = isBE(dstFormat) ? yuv2p012l1_BE_c : yuv2p012l1_LE_c;
3200
2/2
✓ Branch 1 taken 1647 times.
✓ Branch 2 taken 1656 times.
3303 *yuv2planeX = isBE(dstFormat) ? yuv2p012lX_BE_c : yuv2p012lX_LE_c;
3201
2/2
✓ Branch 1 taken 1647 times.
✓ Branch 2 taken 1656 times.
3303 *yuv2nv12cX = isBE(dstFormat) ? yuv2p012cX_BE_c : yuv2p012cX_LE_c;
3202 } else
3203 av_assert0(0);
3204
2/2
✓ Branch 1 taken 28931 times.
✓ Branch 2 taken 147195 times.
176126 } else if (is16BPS(dstFormat)) {
3205
2/2
✓ Branch 1 taken 7311 times.
✓ Branch 2 taken 21620 times.
28931 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_16BE_c : yuv2planeX_16LE_c;
3206
2/2
✓ Branch 1 taken 7311 times.
✓ Branch 2 taken 21620 times.
28931 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_16BE_c : yuv2plane1_16LE_c;
3207
2/2
✓ Branch 1 taken 3995 times.
✓ Branch 2 taken 24936 times.
28931 if (isSemiPlanarYUV(dstFormat)) {
3208
2/2
✓ Branch 1 taken 2019 times.
✓ Branch 2 taken 1976 times.
3995 *yuv2nv12cX = isBE(dstFormat) ? yuv2nv12cX_16BE_c : yuv2nv12cX_16LE_c;
3209 }
3210
2/2
✓ Branch 1 taken 50518 times.
✓ Branch 2 taken 96677 times.
147195 } else if (isNBPS(dstFormat)) {
3211
2/2
✓ Branch 0 taken 1402 times.
✓ Branch 1 taken 49116 times.
50518 if (desc->comp[0].depth == 9) {
3212
2/2
✓ Branch 1 taken 654 times.
✓ Branch 2 taken 748 times.
1402 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_9BE_c : yuv2planeX_9LE_c;
3213
2/2
✓ Branch 1 taken 654 times.
✓ Branch 2 taken 748 times.
1402 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_9BE_c : yuv2plane1_9LE_c;
3214
2/2
✓ Branch 0 taken 27588 times.
✓ Branch 1 taken 21528 times.
49116 } else if (desc->comp[0].depth == 10) {
3215
2/2
✓ Branch 1 taken 3739 times.
✓ Branch 2 taken 23849 times.
27588 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_10BE_c : yuv2planeX_10LE_c;
3216
2/2
✓ Branch 1 taken 3739 times.
✓ Branch 2 taken 23849 times.
27588 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_10BE_c : yuv2plane1_10LE_c;
3217
2/2
✓ Branch 0 taken 20257 times.
✓ Branch 1 taken 1271 times.
21528 } else if (desc->comp[0].depth == 12) {
3218
2/2
✓ Branch 1 taken 4287 times.
✓ Branch 2 taken 15970 times.
20257 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_12BE_c : yuv2planeX_12LE_c;
3219
2/2
✓ Branch 1 taken 4287 times.
✓ Branch 2 taken 15970 times.
20257 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_12BE_c : yuv2plane1_12LE_c;
3220
1/2
✓ Branch 0 taken 1271 times.
✗ Branch 1 not taken.
1271 } else if (desc->comp[0].depth == 14) {
3221
2/2
✓ Branch 1 taken 593 times.
✓ Branch 2 taken 678 times.
1271 *yuv2planeX = isBE(dstFormat) ? yuv2planeX_14BE_c : yuv2planeX_14LE_c;
3222
2/2
✓ Branch 1 taken 593 times.
✓ Branch 2 taken 678 times.
1271 *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_14BE_c : yuv2plane1_14LE_c;
3223 } else
3224 av_assert0(0);
3225
2/2
✓ Branch 0 taken 82 times.
✓ Branch 1 taken 96595 times.
96677 } else if (dstFormat == AV_PIX_FMT_GRAYF32BE) {
3226 82 *yuv2planeX = yuv2planeX_floatBE_c;
3227 82 *yuv2plane1 = yuv2plane1_floatBE_c;
3228
2/2
✓ Branch 0 taken 190 times.
✓ Branch 1 taken 96405 times.
96595 } else if (dstFormat == AV_PIX_FMT_GRAYF32LE) {
3229 190 *yuv2planeX = yuv2planeX_floatLE_c;
3230 190 *yuv2plane1 = yuv2plane1_floatLE_c;
3231 } else {
3232 96405 *yuv2plane1 = yuv2plane1_8_c;
3233 96405 *yuv2planeX = yuv2planeX_8_c;
3234
2/2
✓ Branch 1 taken 1644 times.
✓ Branch 2 taken 94761 times.
96405 if (isSemiPlanarYUV(dstFormat))
3235 1644 *yuv2nv12cX = yuv2nv12cX_c;
3236 }
3237
3238
2/2
✓ Branch 0 taken 140965 times.
✓ Branch 1 taken 41715 times.
182680 if(c->opts.flags & SWS_FULL_CHR_H_INT) {
3239
23/24
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 1454 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 6 times.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 3506 times.
✓ Branch 9 taken 1192 times.
✓ Branch 10 taken 2985 times.
✓ Branch 11 taken 6 times.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 3 times.
✓ Branch 14 taken 350 times.
✓ Branch 15 taken 350 times.
✓ Branch 16 taken 700 times.
✓ Branch 17 taken 401 times.
✓ Branch 18 taken 375 times.
✓ Branch 19 taken 375 times.
✓ Branch 20 taken 24452 times.
✓ Branch 21 taken 3678 times.
✓ Branch 22 taken 1828 times.
✗ Branch 23 not taken.
41715 switch (dstFormat) {
3240 12 case AV_PIX_FMT_RGBA:
3241 #if CONFIG_SMALL
3242 *yuv2packedX = yuv2rgba32_full_X_c;
3243 *yuv2packed2 = yuv2rgba32_full_2_c;
3244 *yuv2packed1 = yuv2rgba32_full_1_c;
3245 #else
3246 #if CONFIG_SWSCALE_ALPHA
3247
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 if (c->needAlpha) {
3248 6 *yuv2packedX = yuv2rgba32_full_X_c;
3249 6 *yuv2packed2 = yuv2rgba32_full_2_c;
3250 6 *yuv2packed1 = yuv2rgba32_full_1_c;
3251 } else
3252 #endif /* CONFIG_SWSCALE_ALPHA */
3253 {
3254 6 *yuv2packedX = yuv2rgbx32_full_X_c;
3255 6 *yuv2packed2 = yuv2rgbx32_full_2_c;
3256 6 *yuv2packed1 = yuv2rgbx32_full_1_c;
3257 }
3258 #endif /* !CONFIG_SMALL */
3259 12 break;
3260 12 case AV_PIX_FMT_ARGB:
3261 #if CONFIG_SMALL
3262 *yuv2packedX = yuv2argb32_full_X_c;
3263 *yuv2packed2 = yuv2argb32_full_2_c;
3264 *yuv2packed1 = yuv2argb32_full_1_c;
3265 #else
3266 #if CONFIG_SWSCALE_ALPHA
3267
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 if (c->needAlpha) {
3268 6 *yuv2packedX = yuv2argb32_full_X_c;
3269 6 *yuv2packed2 = yuv2argb32_full_2_c;
3270 6 *yuv2packed1 = yuv2argb32_full_1_c;
3271 } else
3272 #endif /* CONFIG_SWSCALE_ALPHA */
3273 {
3274 6 *yuv2packedX = yuv2xrgb32_full_X_c;
3275 6 *yuv2packed2 = yuv2xrgb32_full_2_c;
3276 6 *yuv2packed1 = yuv2xrgb32_full_1_c;
3277 }
3278 #endif /* !CONFIG_SMALL */
3279 12 break;
3280 1454 case AV_PIX_FMT_BGRA:
3281 #if CONFIG_SMALL
3282 *yuv2packedX = yuv2bgra32_full_X_c;
3283 *yuv2packed2 = yuv2bgra32_full_2_c;
3284 *yuv2packed1 = yuv2bgra32_full_1_c;
3285 #else
3286 #if CONFIG_SWSCALE_ALPHA
3287
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 1352 times.
1454 if (c->needAlpha) {
3288 102 *yuv2packedX = yuv2bgra32_full_X_c;
3289 102 *yuv2packed2 = yuv2bgra32_full_2_c;
3290 102 *yuv2packed1 = yuv2bgra32_full_1_c;
3291 } else
3292 #endif /* CONFIG_SWSCALE_ALPHA */
3293 {
3294 1352 *yuv2packedX = yuv2bgrx32_full_X_c;
3295 1352 *yuv2packed2 = yuv2bgrx32_full_2_c;
3296 1352 *yuv2packed1 = yuv2bgrx32_full_1_c;
3297 }
3298 #endif /* !CONFIG_SMALL */
3299 1454 break;
3300 12 case AV_PIX_FMT_ABGR:
3301 #if CONFIG_SMALL
3302 *yuv2packedX = yuv2abgr32_full_X_c;
3303 *yuv2packed2 = yuv2abgr32_full_2_c;
3304 *yuv2packed1 = yuv2abgr32_full_1_c;
3305 #else
3306 #if CONFIG_SWSCALE_ALPHA
3307
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 if (c->needAlpha) {
3308 6 *yuv2packedX = yuv2abgr32_full_X_c;
3309 6 *yuv2packed2 = yuv2abgr32_full_2_c;
3310 6 *yuv2packed1 = yuv2abgr32_full_1_c;
3311 } else
3312 #endif /* CONFIG_SWSCALE_ALPHA */
3313 {
3314 6 *yuv2packedX = yuv2xbgr32_full_X_c;
3315 6 *yuv2packed2 = yuv2xbgr32_full_2_c;
3316 6 *yuv2packed1 = yuv2xbgr32_full_1_c;
3317 }
3318 #endif /* !CONFIG_SMALL */
3319 12 break;
3320 6 case AV_PIX_FMT_RGBA64LE:
3321 #if CONFIG_SWSCALE_ALPHA
3322
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if (c->needAlpha) {
3323 3 *yuv2packedX = yuv2rgba64le_full_X_c;
3324 3 *yuv2packed2 = yuv2rgba64le_full_2_c;
3325 3 *yuv2packed1 = yuv2rgba64le_full_1_c;
3326 } else
3327 #endif /* CONFIG_SWSCALE_ALPHA */
3328 {
3329 3 *yuv2packedX = yuv2rgbx64le_full_X_c;
3330 3 *yuv2packed2 = yuv2rgbx64le_full_2_c;
3331 3 *yuv2packed1 = yuv2rgbx64le_full_1_c;
3332 }
3333 6 break;
3334 3 case AV_PIX_FMT_RGBA64BE:
3335 #if CONFIG_SWSCALE_ALPHA
3336
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if (c->needAlpha) {
3337 3 *yuv2packedX = yuv2rgba64be_full_X_c;
3338 3 *yuv2packed2 = yuv2rgba64be_full_2_c;
3339 3 *yuv2packed1 = yuv2rgba64be_full_1_c;
3340 } else
3341 #endif /* CONFIG_SWSCALE_ALPHA */
3342 {
3343 *yuv2packedX = yuv2rgbx64be_full_X_c;
3344 *yuv2packed2 = yuv2rgbx64be_full_2_c;
3345 *yuv2packed1 = yuv2rgbx64be_full_1_c;
3346 }
3347 3 break;
3348 6 case AV_PIX_FMT_BGRA64LE:
3349 #if CONFIG_SWSCALE_ALPHA
3350
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if (c->needAlpha) {
3351 3 *yuv2packedX = yuv2bgra64le_full_X_c;
3352 3 *yuv2packed2 = yuv2bgra64le_full_2_c;
3353 3 *yuv2packed1 = yuv2bgra64le_full_1_c;
3354 } else
3355 #endif /* CONFIG_SWSCALE_ALPHA */
3356 {
3357 3 *yuv2packedX = yuv2bgrx64le_full_X_c;
3358 3 *yuv2packed2 = yuv2bgrx64le_full_2_c;
3359 3 *yuv2packed1 = yuv2bgrx64le_full_1_c;
3360 }
3361 6 break;
3362 3 case AV_PIX_FMT_BGRA64BE:
3363 #if CONFIG_SWSCALE_ALPHA
3364
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if (c->needAlpha) {
3365 3 *yuv2packedX = yuv2bgra64be_full_X_c;
3366 3 *yuv2packed2 = yuv2bgra64be_full_2_c;
3367 3 *yuv2packed1 = yuv2bgra64be_full_1_c;
3368 } else
3369 #endif /* CONFIG_SWSCALE_ALPHA */
3370 {
3371 *yuv2packedX = yuv2bgrx64be_full_X_c;
3372 *yuv2packed2 = yuv2bgrx64be_full_2_c;
3373 *yuv2packed1 = yuv2bgrx64be_full_1_c;
3374 }
3375 3 break;
3376
3377 3506 case AV_PIX_FMT_RGB24:
3378 3506 *yuv2packedX = yuv2rgb24_full_X_c;
3379 3506 *yuv2packed2 = yuv2rgb24_full_2_c;
3380 3506 *yuv2packed1 = yuv2rgb24_full_1_c;
3381 3506 break;
3382 1192 case AV_PIX_FMT_BGR24:
3383 1192 *yuv2packedX = yuv2bgr24_full_X_c;
3384 1192 *yuv2packed2 = yuv2bgr24_full_2_c;
3385 1192 *yuv2packed1 = yuv2bgr24_full_1_c;
3386 1192 break;
3387 2985 case AV_PIX_FMT_RGB48LE:
3388 2985 *yuv2packedX = yuv2rgb48le_full_X_c;
3389 2985 *yuv2packed2 = yuv2rgb48le_full_2_c;
3390 2985 *yuv2packed1 = yuv2rgb48le_full_1_c;
3391 2985 break;
3392 6 case AV_PIX_FMT_BGR48LE:
3393 6 *yuv2packedX = yuv2bgr48le_full_X_c;
3394 6 *yuv2packed2 = yuv2bgr48le_full_2_c;
3395 6 *yuv2packed1 = yuv2bgr48le_full_1_c;
3396 6 break;
3397 6 case AV_PIX_FMT_RGB48BE:
3398 6 *yuv2packedX = yuv2rgb48be_full_X_c;
3399 6 *yuv2packed2 = yuv2rgb48be_full_2_c;
3400 6 *yuv2packed1 = yuv2rgb48be_full_1_c;
3401 6 break;
3402 3 case AV_PIX_FMT_BGR48BE:
3403 3 *yuv2packedX = yuv2bgr48be_full_X_c;
3404 3 *yuv2packed2 = yuv2bgr48be_full_2_c;
3405 3 *yuv2packed1 = yuv2bgr48be_full_1_c;
3406 3 break;
3407 350 case AV_PIX_FMT_BGR4_BYTE:
3408 350 *yuv2packedX = yuv2bgr4_byte_full_X_c;
3409 350 *yuv2packed2 = yuv2bgr4_byte_full_2_c;
3410 350 *yuv2packed1 = yuv2bgr4_byte_full_1_c;
3411 350 break;
3412 350 case AV_PIX_FMT_RGB4_BYTE:
3413 350 *yuv2packedX = yuv2rgb4_byte_full_X_c;
3414 350 *yuv2packed2 = yuv2rgb4_byte_full_2_c;
3415 350 *yuv2packed1 = yuv2rgb4_byte_full_1_c;
3416 350 break;
3417 700 case AV_PIX_FMT_BGR8:
3418 700 *yuv2packedX = yuv2bgr8_full_X_c;
3419 700 *yuv2packed2 = yuv2bgr8_full_2_c;
3420 700 *yuv2packed1 = yuv2bgr8_full_1_c;
3421 700 break;
3422 401 case AV_PIX_FMT_RGB8:
3423 401 *yuv2packedX = yuv2rgb8_full_X_c;
3424 401 *yuv2packed2 = yuv2rgb8_full_2_c;
3425 401 *yuv2packed1 = yuv2rgb8_full_1_c;
3426 401 break;
3427 375 case AV_PIX_FMT_X2RGB10LE:
3428 375 *yuv2packedX = yuv2x2rgb10_full_X_c;
3429 375 *yuv2packed2 = yuv2x2rgb10_full_2_c;
3430 375 *yuv2packed1 = yuv2x2rgb10_full_1_c;
3431 375 break;
3432 375 case AV_PIX_FMT_X2BGR10LE:
3433 375 *yuv2packedX = yuv2x2bgr10_full_X_c;
3434 375 *yuv2packed2 = yuv2x2bgr10_full_2_c;
3435 375 *yuv2packed1 = yuv2x2bgr10_full_1_c;
3436 375 break;
3437 24452 case AV_PIX_FMT_GBRP:
3438 case AV_PIX_FMT_GBRP9BE:
3439 case AV_PIX_FMT_GBRP9LE:
3440 case AV_PIX_FMT_GBRP10BE:
3441 case AV_PIX_FMT_GBRP10LE:
3442 case AV_PIX_FMT_GBRP12BE:
3443 case AV_PIX_FMT_GBRP12LE:
3444 case AV_PIX_FMT_GBRP14BE:
3445 case AV_PIX_FMT_GBRP14LE:
3446 case AV_PIX_FMT_GBRAP:
3447 case AV_PIX_FMT_GBRAP10BE:
3448 case AV_PIX_FMT_GBRAP10LE:
3449 case AV_PIX_FMT_GBRAP12BE:
3450 case AV_PIX_FMT_GBRAP12LE:
3451 case AV_PIX_FMT_GBRAP14BE:
3452 case AV_PIX_FMT_GBRAP14LE:
3453 24452 *yuv2anyX = yuv2gbrp_full_X_c;
3454 24452 break;
3455 3678 case AV_PIX_FMT_GBRP16BE:
3456 case AV_PIX_FMT_GBRP16LE:
3457 case AV_PIX_FMT_GBRAP16BE:
3458 case AV_PIX_FMT_GBRAP16LE:
3459 3678 *yuv2anyX = yuv2gbrp16_full_X_c;
3460 3678 break;
3461 1828 case AV_PIX_FMT_GBRPF32BE:
3462 case AV_PIX_FMT_GBRPF32LE:
3463 case AV_PIX_FMT_GBRAPF32BE:
3464 case AV_PIX_FMT_GBRAPF32LE:
3465 1828 *yuv2anyX = yuv2gbrpf32_full_X_c;
3466 1828 break;
3467 }
3468
3/4
✓ Branch 0 taken 29958 times.
✓ Branch 1 taken 11757 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 29958 times.
41715 if (!*yuv2packedX && !*yuv2anyX)
3469 goto YUV_PACKED;
3470 } else {
3471 140965 YUV_PACKED:
3472
21/21
✓ Branch 0 taken 137 times.
✓ Branch 1 taken 91 times.
✓ Branch 2 taken 91 times.
✓ Branch 3 taken 91 times.
✓ Branch 4 taken 3491 times.
✓ Branch 5 taken 197 times.
✓ Branch 6 taken 94 times.
✓ Branch 7 taken 91 times.
✓ Branch 8 taken 1364 times.
✓ Branch 9 taken 444 times.
✓ Branch 10 taken 6252 times.
✓ Branch 11 taken 1416 times.
✓ Branch 12 taken 1320 times.
✓ Branch 13 taken 2431 times.
✓ Branch 14 taken 376 times.
✓ Branch 15 taken 1091 times.
✓ Branch 16 taken 78 times.
✓ Branch 17 taken 209 times.
✓ Branch 18 taken 52 times.
✓ Branch 19 taken 52 times.
✓ Branch 20 taken 121597 times.
140965 switch (dstFormat) {
3473 137 case AV_PIX_FMT_RGBA64LE:
3474 #if CONFIG_SWSCALE_ALPHA
3475
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 137 times.
137 if (c->needAlpha) {
3476 *yuv2packed1 = yuv2rgba64le_1_c;
3477 *yuv2packed2 = yuv2rgba64le_2_c;
3478 *yuv2packedX = yuv2rgba64le_X_c;
3479 } else
3480 #endif /* CONFIG_SWSCALE_ALPHA */
3481 {
3482 137 *yuv2packed1 = yuv2rgbx64le_1_c;
3483 137 *yuv2packed2 = yuv2rgbx64le_2_c;
3484 137 *yuv2packedX = yuv2rgbx64le_X_c;
3485 }
3486 137 break;
3487 91 case AV_PIX_FMT_RGBA64BE:
3488 #if CONFIG_SWSCALE_ALPHA
3489
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 91 times.
91 if (c->needAlpha) {
3490 *yuv2packed1 = yuv2rgba64be_1_c;
3491 *yuv2packed2 = yuv2rgba64be_2_c;
3492 *yuv2packedX = yuv2rgba64be_X_c;
3493 } else
3494 #endif /* CONFIG_SWSCALE_ALPHA */
3495 {
3496 91 *yuv2packed1 = yuv2rgbx64be_1_c;
3497 91 *yuv2packed2 = yuv2rgbx64be_2_c;
3498 91 *yuv2packedX = yuv2rgbx64be_X_c;
3499 }
3500 91 break;
3501 91 case AV_PIX_FMT_BGRA64LE:
3502 #if CONFIG_SWSCALE_ALPHA
3503
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 91 times.
91 if (c->needAlpha) {
3504 *yuv2packed1 = yuv2bgra64le_1_c;
3505 *yuv2packed2 = yuv2bgra64le_2_c;
3506 *yuv2packedX = yuv2bgra64le_X_c;
3507 } else
3508 #endif /* CONFIG_SWSCALE_ALPHA */
3509 {
3510 91 *yuv2packed1 = yuv2bgrx64le_1_c;
3511 91 *yuv2packed2 = yuv2bgrx64le_2_c;
3512 91 *yuv2packedX = yuv2bgrx64le_X_c;
3513 }
3514 91 break;
3515 91 case AV_PIX_FMT_BGRA64BE:
3516 #if CONFIG_SWSCALE_ALPHA
3517
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 91 times.
91 if (c->needAlpha) {
3518 *yuv2packed1 = yuv2bgra64be_1_c;
3519 *yuv2packed2 = yuv2bgra64be_2_c;
3520 *yuv2packedX = yuv2bgra64be_X_c;
3521 } else
3522 #endif /* CONFIG_SWSCALE_ALPHA */
3523 {
3524 91 *yuv2packed1 = yuv2bgrx64be_1_c;
3525 91 *yuv2packed2 = yuv2bgrx64be_2_c;
3526 91 *yuv2packedX = yuv2bgrx64be_X_c;
3527 }
3528 91 break;
3529 3491 case AV_PIX_FMT_RGB48LE:
3530 3491 *yuv2packed1 = yuv2rgb48le_1_c;
3531 3491 *yuv2packed2 = yuv2rgb48le_2_c;
3532 3491 *yuv2packedX = yuv2rgb48le_X_c;
3533 3491 break;
3534 197 case AV_PIX_FMT_RGB48BE:
3535 197 *yuv2packed1 = yuv2rgb48be_1_c;
3536 197 *yuv2packed2 = yuv2rgb48be_2_c;
3537 197 *yuv2packedX = yuv2rgb48be_X_c;
3538 197 break;
3539 94 case AV_PIX_FMT_BGR48LE:
3540 94 *yuv2packed1 = yuv2bgr48le_1_c;
3541 94 *yuv2packed2 = yuv2bgr48le_2_c;
3542 94 *yuv2packedX = yuv2bgr48le_X_c;
3543 94 break;
3544 91 case AV_PIX_FMT_BGR48BE:
3545 91 *yuv2packed1 = yuv2bgr48be_1_c;
3546 91 *yuv2packed2 = yuv2bgr48be_2_c;
3547 91 *yuv2packedX = yuv2bgr48be_X_c;
3548 91 break;
3549 1364 case AV_PIX_FMT_RGB32:
3550 case AV_PIX_FMT_BGR32:
3551 #if CONFIG_SMALL
3552 *yuv2packed1 = yuv2rgb32_1_c;
3553 *yuv2packed2 = yuv2rgb32_2_c;
3554 *yuv2packedX = yuv2rgb32_X_c;
3555 #else
3556 #if CONFIG_SWSCALE_ALPHA
3557
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1364 times.
1364 if (c->needAlpha) {
3558 *yuv2packed1 = yuv2rgba32_1_c;
3559 *yuv2packed2 = yuv2rgba32_2_c;
3560 *yuv2packedX = yuv2rgba32_X_c;
3561 } else
3562 #endif /* CONFIG_SWSCALE_ALPHA */
3563 {
3564 1364 *yuv2packed1 = yuv2rgbx32_1_c;
3565 1364 *yuv2packed2 = yuv2rgbx32_2_c;
3566 1364 *yuv2packedX = yuv2rgbx32_X_c;
3567 }
3568 #endif /* !CONFIG_SMALL */
3569 1364 break;
3570 444 case AV_PIX_FMT_RGB32_1:
3571 case AV_PIX_FMT_BGR32_1:
3572 #if CONFIG_SMALL
3573 *yuv2packed1 = yuv2rgb32_1_1_c;
3574 *yuv2packed2 = yuv2rgb32_1_2_c;
3575 *yuv2packedX = yuv2rgb32_1_X_c;
3576 #else
3577 #if CONFIG_SWSCALE_ALPHA
3578
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 444 times.
444 if (c->needAlpha) {
3579 *yuv2packed1 = yuv2rgba32_1_1_c;
3580 *yuv2packed2 = yuv2rgba32_1_2_c;
3581 *yuv2packedX = yuv2rgba32_1_X_c;
3582 } else
3583 #endif /* CONFIG_SWSCALE_ALPHA */
3584 {
3585 444 *yuv2packed1 = yuv2rgbx32_1_1_c;
3586 444 *yuv2packed2 = yuv2rgbx32_1_2_c;
3587 444 *yuv2packedX = yuv2rgbx32_1_X_c;
3588 }
3589 #endif /* !CONFIG_SMALL */
3590 444 break;
3591 6252 case AV_PIX_FMT_RGB24:
3592 6252 *yuv2packed1 = yuv2rgb24_1_c;
3593 6252 *yuv2packed2 = yuv2rgb24_2_c;
3594 6252 *yuv2packedX = yuv2rgb24_X_c;
3595 6252 break;
3596 1416 case AV_PIX_FMT_BGR24:
3597 1416 *yuv2packed1 = yuv2bgr24_1_c;
3598 1416 *yuv2packed2 = yuv2bgr24_2_c;
3599 1416 *yuv2packedX = yuv2bgr24_X_c;
3600 1416 break;
3601 1320 case AV_PIX_FMT_RGB565LE:
3602 case AV_PIX_FMT_RGB565BE:
3603 case AV_PIX_FMT_BGR565LE:
3604 case AV_PIX_FMT_BGR565BE:
3605 1320 *yuv2packed1 = yuv2rgb16_1_c;
3606 1320 *yuv2packed2 = yuv2rgb16_2_c;
3607 1320 *yuv2packedX = yuv2rgb16_X_c;
3608 1320 break;
3609 2431 case AV_PIX_FMT_RGB555LE:
3610 case AV_PIX_FMT_RGB555BE:
3611 case AV_PIX_FMT_BGR555LE:
3612 case AV_PIX_FMT_BGR555BE:
3613 2431 *yuv2packed1 = yuv2rgb15_1_c;
3614 2431 *yuv2packed2 = yuv2rgb15_2_c;
3615 2431 *yuv2packedX = yuv2rgb15_X_c;
3616 2431 break;
3617 376 case AV_PIX_FMT_RGB444LE:
3618 case AV_PIX_FMT_RGB444BE:
3619 case AV_PIX_FMT_BGR444LE:
3620 case AV_PIX_FMT_BGR444BE:
3621 376 *yuv2packed1 = yuv2rgb12_1_c;
3622 376 *yuv2packed2 = yuv2rgb12_2_c;
3623 376 *yuv2packedX = yuv2rgb12_X_c;
3624 376 break;
3625 1091 case AV_PIX_FMT_RGB8:
3626 case AV_PIX_FMT_BGR8:
3627 1091 *yuv2packed1 = yuv2rgb8_1_c;
3628 1091 *yuv2packed2 = yuv2rgb8_2_c;
3629 1091 *yuv2packedX = yuv2rgb8_X_c;
3630 1091 break;
3631 78 case AV_PIX_FMT_RGB4:
3632 case AV_PIX_FMT_BGR4:
3633 78 *yuv2packed1 = yuv2rgb4_1_c;
3634 78 *yuv2packed2 = yuv2rgb4_2_c;
3635 78 *yuv2packedX = yuv2rgb4_X_c;
3636 78 break;
3637 209 case AV_PIX_FMT_RGB4_BYTE:
3638 case AV_PIX_FMT_BGR4_BYTE:
3639 209 *yuv2packed1 = yuv2rgb4b_1_c;
3640 209 *yuv2packed2 = yuv2rgb4b_2_c;
3641 209 *yuv2packedX = yuv2rgb4b_X_c;
3642 209 break;
3643 52 case AV_PIX_FMT_X2RGB10LE:
3644 case AV_PIX_FMT_X2RGB10BE:
3645 52 *yuv2packed1 = yuv2x2rgb10_1_c;
3646 52 *yuv2packed2 = yuv2x2rgb10_2_c;
3647 52 *yuv2packedX = yuv2x2rgb10_X_c;
3648 52 break;
3649 52 case AV_PIX_FMT_X2BGR10LE:
3650 case AV_PIX_FMT_X2BGR10BE:
3651 52 *yuv2packed1 = yuv2x2bgr10_1_c;
3652 52 *yuv2packed2 = yuv2x2bgr10_2_c;
3653 52 *yuv2packedX = yuv2x2bgr10_X_c;
3654 52 break;
3655 }
3656 }
3657
24/24
✓ Branch 0 taken 1512 times.
✓ Branch 1 taken 598 times.
✓ Branch 2 taken 610 times.
✓ Branch 3 taken 547 times.
✓ Branch 4 taken 850 times.
✓ Branch 5 taken 963 times.
✓ Branch 6 taken 58 times.
✓ Branch 7 taken 58 times.
✓ Branch 8 taken 55 times.
✓ Branch 9 taken 955 times.
✓ Branch 10 taken 55 times.
✓ Branch 11 taken 55 times.
✓ Branch 12 taken 58 times.
✓ Branch 13 taken 617 times.
✓ Branch 14 taken 462 times.
✓ Branch 15 taken 551 times.
✓ Branch 16 taken 551 times.
✓ Branch 17 taken 551 times.
✓ Branch 18 taken 675 times.
✓ Branch 19 taken 675 times.
✓ Branch 20 taken 542 times.
✓ Branch 21 taken 542 times.
✓ Branch 22 taken 666 times.
✓ Branch 23 taken 170474 times.
182680 switch (dstFormat) {
3658 1512 case AV_PIX_FMT_MONOWHITE:
3659 1512 *yuv2packed1 = yuv2monowhite_1_c;
3660 1512 *yuv2packed2 = yuv2monowhite_2_c;
3661 1512 *yuv2packedX = yuv2monowhite_X_c;
3662 1512 break;
3663 598 case AV_PIX_FMT_MONOBLACK:
3664 598 *yuv2packed1 = yuv2monoblack_1_c;
3665 598 *yuv2packed2 = yuv2monoblack_2_c;
3666 598 *yuv2packedX = yuv2monoblack_X_c;
3667 598 break;
3668 610 case AV_PIX_FMT_YUYV422:
3669 610 *yuv2packed1 = yuv2yuyv422_1_c;
3670 610 *yuv2packed2 = yuv2yuyv422_2_c;
3671 610 *yuv2packedX = yuv2yuyv422_X_c;
3672 610 break;
3673 547 case AV_PIX_FMT_YVYU422:
3674 547 *yuv2packed1 = yuv2yvyu422_1_c;
3675 547 *yuv2packed2 = yuv2yvyu422_2_c;
3676 547 *yuv2packedX = yuv2yvyu422_X_c;
3677 547 break;
3678 850 case AV_PIX_FMT_UYVY422:
3679 850 *yuv2packed1 = yuv2uyvy422_1_c;
3680 850 *yuv2packed2 = yuv2uyvy422_2_c;
3681 850 *yuv2packedX = yuv2uyvy422_X_c;
3682 850 break;
3683 963 case AV_PIX_FMT_VYU444:
3684 963 *yuv2packed1 = yuv2vyu444_1_c;
3685 963 *yuv2packed2 = yuv2vyu444_2_c;
3686 963 *yuv2packedX = yuv2vyu444_X_c;
3687 963 break;
3688 58 case AV_PIX_FMT_YA8:
3689 58 *yuv2packed1 = yuv2ya8_1_c;
3690 58 *yuv2packed2 = yuv2ya8_2_c;
3691 58 *yuv2packedX = yuv2ya8_X_c;
3692 58 break;
3693 58 case AV_PIX_FMT_YA16LE:
3694 58 *yuv2packed1 = yuv2ya16le_1_c;
3695 58 *yuv2packed2 = yuv2ya16le_2_c;
3696 58 *yuv2packedX = yuv2ya16le_X_c;
3697 58 break;
3698 55 case AV_PIX_FMT_YA16BE:
3699 55 *yuv2packed1 = yuv2ya16be_1_c;
3700 55 *yuv2packed2 = yuv2ya16be_2_c;
3701 55 *yuv2packedX = yuv2ya16be_X_c;
3702 55 break;
3703 955 case AV_PIX_FMT_V30XLE:
3704 955 *yuv2packedX = yuv2v30xle_X_c;
3705 955 break;
3706 55 case AV_PIX_FMT_AYUV64LE:
3707 55 *yuv2packedX = yuv2ayuv64le_X_c;
3708 55 break;
3709 55 case AV_PIX_FMT_AYUV64BE:
3710 55 *yuv2packedX = yuv2ayuv64be_X_c;
3711 55 break;
3712 58 case AV_PIX_FMT_AYUV:
3713 58 *yuv2packed1 = yuv2ayuv_1_c;
3714 58 *yuv2packed2 = yuv2ayuv_2_c;
3715 58 *yuv2packedX = yuv2ayuv_X_c;
3716 58 break;
3717 617 case AV_PIX_FMT_VUYA:
3718 case AV_PIX_FMT_VUYX:
3719 617 *yuv2packed1 = yuv2vuyX_1_c;
3720 617 *yuv2packed2 = yuv2vuyX_2_c;
3721 617 *yuv2packedX = yuv2vuyX_X_c;
3722 617 break;
3723 462 case AV_PIX_FMT_UYVA:
3724 462 *yuv2packed1 = yuv2uyva_1_c;
3725 462 *yuv2packed2 = yuv2uyva_2_c;
3726 462 *yuv2packedX = yuv2uyva_X_c;
3727 462 break;
3728 551 case AV_PIX_FMT_XV30LE:
3729 551 *yuv2packedX = yuv2xv30le_X_c;
3730 551 break;
3731 551 case AV_PIX_FMT_XV36LE:
3732 551 *yuv2packedX = yuv2xv36le_X_c;
3733 551 break;
3734 551 case AV_PIX_FMT_XV36BE:
3735 551 *yuv2packedX = yuv2xv36be_X_c;
3736 551 break;
3737 675 case AV_PIX_FMT_XV48LE:
3738 675 *yuv2packedX = yuv2xv48le_X_c;
3739 675 break;
3740 675 case AV_PIX_FMT_XV48BE:
3741 675 *yuv2packedX = yuv2xv48be_X_c;
3742 675 break;
3743 542 case AV_PIX_FMT_Y210LE:
3744 542 *yuv2packedX = yuv2y210le_X_c;
3745 542 break;
3746 542 case AV_PIX_FMT_Y212LE:
3747 542 *yuv2packedX = yuv2y212le_X_c;
3748 542 break;
3749 666 case AV_PIX_FMT_Y216LE:
3750 666 *yuv2packedX = yuv2y216le_X_c;
3751 666 break;
3752 }
3753 182680 }
3754