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