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