40 { 1, 3, 1, 3, 1, 3, 1, 3, },
41 { 2, 0, 2, 0, 2, 0, 2, 0, },
45 { 6, 2, 6, 2, 6, 2, 6, 2, },
46 { 0, 4, 0, 4, 0, 4, 0, 4, },
50 { 8, 4, 11, 7, 8, 4, 11, 7, },
51 { 2, 14, 1, 13, 2, 14, 1, 13, },
52 { 10, 6, 9, 5, 10, 6, 9, 5, },
53 { 0, 12, 3, 15, 0, 12, 3, 15, },
57 { 17, 9, 23, 15, 16, 8, 22, 14, },
58 { 5, 29, 3, 27, 4, 28, 2, 26, },
59 { 21, 13, 19, 11, 20, 12, 18, 10, },
60 { 0, 24, 6, 30, 1, 25, 7, 31, },
61 { 16, 8, 22, 14, 17, 9, 23, 15, },
62 { 4, 28, 2, 26, 5, 29, 3, 27, },
63 { 20, 12, 18, 10, 21, 13, 19, 11, },
64 { 1, 25, 7, 31, 0, 24, 6, 30, },
68 { 0, 55, 14, 68, 3, 58, 17, 72, },
69 { 37, 18, 50, 32, 40, 22, 54, 35, },
70 { 9, 64, 5, 59, 13, 67, 8, 63, },
71 { 46, 27, 41, 23, 49, 31, 44, 26, },
72 { 2, 57, 16, 71, 1, 56, 15, 70, },
73 { 39, 21, 52, 34, 38, 19, 51, 33, },
74 { 11, 66, 7, 62, 10, 65, 6, 60, },
75 { 48, 30, 43, 25, 47, 29, 42, 24, },
80 {117, 62, 158, 103, 113, 58, 155, 100, },
81 { 34, 199, 21, 186, 31, 196, 17, 182, },
82 {144, 89, 131, 76, 141, 86, 127, 72, },
83 { 0, 165, 41, 206, 10, 175, 52, 217, },
84 {110, 55, 151, 96, 120, 65, 162, 107, },
85 { 28, 193, 14, 179, 38, 203, 24, 189, },
86 {138, 83, 124, 69, 148, 93, 134, 79, },
87 { 7, 172, 48, 213, 3, 168, 45, 210, },
92 { 0, 143, 18, 200, 2, 156, 25, 215, },
93 { 78, 28, 125, 64, 89, 36, 138, 74, },
94 { 10, 180, 3, 161, 16, 195, 8, 175, },
95 {109, 51, 93, 38, 121, 60, 105, 47, },
96 { 1, 152, 23, 210, 0, 147, 20, 205, },
97 { 85, 33, 134, 71, 81, 30, 130, 67, },
98 { 14, 190, 6, 171, 12, 185, 5, 166, },
99 {117, 57, 101, 44, 113, 54, 97, 41, },
104 { 0, 124, 8, 193, 0, 140, 12, 213, },
105 { 55, 14, 104, 42, 66, 19, 119, 52, },
106 { 3, 168, 1, 145, 6, 187, 3, 162, },
107 { 86, 31, 70, 21, 99, 39, 82, 28, },
108 { 0, 134, 11, 206, 0, 129, 9, 200, },
109 { 62, 17, 114, 48, 58, 16, 109, 45, },
110 { 5, 181, 2, 157, 4, 175, 1, 151, },
111 { 95, 36, 78, 26, 90, 34, 74, 24, },
116 { 0, 107, 3, 187, 0, 125, 6, 212, },
117 { 39, 7, 86, 28, 49, 11, 102, 36, },
118 { 1, 158, 0, 131, 3, 180, 1, 151, },
119 { 68, 19, 52, 12, 81, 25, 64, 17, },
120 { 0, 119, 5, 203, 0, 113, 4, 195, },
121 { 45, 9, 96, 33, 42, 8, 91, 30, },
122 { 2, 172, 1, 144, 2, 165, 0, 137, },
123 { 77, 23, 60, 15, 72, 21, 56, 14, },
127 #define output_pixel(pos, val, bias, signedness) \
129 AV_WB16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
131 AV_WL16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
136 int big_endian,
int output_bits)
139 int shift = 19 - output_bits;
141 for (i = 0; i <
dstW; i++) {
142 int val = src[i] + (1 << (shift - 1));
150 int big_endian,
int output_bits)
153 int shift = 15 + 16 - output_bits;
155 for (i = 0; i <
dstW; i++) {
156 int val = 1 << (30-output_bits);
165 for (j = 0; j < filterSize; j++)
166 val += src[j][i] * filter[j];
174 #define output_pixel(pos, val) \
176 AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits)); \
178 AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits)); \
183 int big_endian,
int output_bits)
186 int shift = 15 - output_bits;
188 for (i = 0; i <
dstW; i++) {
189 int val = src[i] + (1 << (shift - 1));
196 const int16_t **src, uint16_t *dest,
int dstW,
197 int big_endian,
int output_bits)
200 int shift = 11 + 16 - output_bits;
202 for (i = 0; i <
dstW; i++) {
203 int val = 1 << (26-output_bits);
206 for (j = 0; j < filterSize; j++)
207 val += src[j][i] * filter[j];
215 #define yuv2NBPS(bits, BE_LE, is_be, template_size, typeX_t) \
216 static void yuv2plane1_ ## bits ## BE_LE ## _c(const int16_t *src, \
217 uint8_t *dest, int dstW, \
218 const uint8_t *dither, int offset)\
220 yuv2plane1_ ## template_size ## _c_template((const typeX_t *) src, \
221 (uint16_t *) dest, dstW, is_be, bits); \
223 static void yuv2planeX_ ## bits ## BE_LE ## _c(const int16_t *filter, int filterSize, \
224 const int16_t **src, uint8_t *dest, int dstW, \
225 const uint8_t *dither, int offset)\
227 yuv2planeX_## template_size ## _c_template(filter, \
228 filterSize, (const typeX_t **) src, \
229 (uint16_t *) dest, dstW, is_be, bits); \
233 yuv2NBPS(10, BE, 1, 10, int16_t)
234 yuv2NBPS(10, LE, 0, 10, int16_t)
235 yuv2NBPS(16, BE, 1, 16,
int32_t)
236 yuv2NBPS(16, LE, 0, 16,
int32_t)
238 static
void yuv2planeX_8_c(const int16_t *
filter,
int filterSize,
243 for (i=0; i<
dstW; i++) {
244 int val = dither[(i + offset) & 7] << 12;
246 for (j=0; j<filterSize; j++)
247 val += src[j][i] * filter[j];
249 dest[i]= av_clip_uint8(val>>19);
257 for (i=0; i<
dstW; i++) {
258 int val = (src[i] + dither[(i + offset) & 7]) >> 7;
259 dest[i]= av_clip_uint8(val);
264 const int16_t **chrUSrc,
const int16_t **chrVSrc,
273 int u = chrDither[i & 7] << 12;
274 int v = chrDither[(i + 3) & 7] << 12;
276 for (j=0; j<chrFilterSize; j++) {
277 u += chrUSrc[j][i] * chrFilter[j];
278 v += chrVSrc[j][i] * chrFilter[j];
281 dest[2*i]= av_clip_uint8(u>>19);
282 dest[2*i+1]= av_clip_uint8(v>>19);
286 int u = chrDither[i & 7] << 12;
287 int v = chrDither[(i + 3) & 7] << 12;
289 for (j=0; j<chrFilterSize; j++) {
290 u += chrUSrc[j][i] * chrFilter[j];
291 v += chrVSrc[j][i] * chrFilter[j];
294 dest[2*i]= av_clip_uint8(v>>19);
295 dest[2*i+1]= av_clip_uint8(u>>19);
299 #define accumulate_bit(acc, val) \
301 acc |= (val) >= (128 + 110)
302 #define output_pixel(pos, acc) \
303 if (target == AV_PIX_FMT_MONOBLACK) { \
311 const int16_t **lumSrc,
int lumFilterSize,
312 const int16_t *chrFilter,
const int16_t **chrUSrc,
313 const int16_t **chrVSrc,
int chrFilterSize,
321 for (i = 0; i <
dstW; i += 2) {
326 for (j = 0; j < lumFilterSize; j++) {
327 Y1 += lumSrc[j][i] * lumFilter[j];
328 Y2 += lumSrc[j][i+1] * lumFilter[j];
332 if ((Y1 | Y2) & 0x100) {
333 Y1 = av_clip_uint8(Y1);
334 Y2 = av_clip_uint8(Y2);
350 const int16_t *ubuf[2],
const int16_t *vbuf[2],
352 int yalpha,
int uvalpha,
int y,
355 const int16_t *buf0 = buf[0], *buf1 = buf[1];
357 int yalpha1 = 4096 - yalpha;
360 for (i = 0; i <
dstW; i += 8) {
363 Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
365 Y = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
367 Y = (buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19;
369 Y = (buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19;
371 Y = (buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19;
373 Y = (buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19;
375 Y = (buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19;
377 Y = (buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19;
386 const int16_t *ubuf[2],
const int16_t *vbuf[2],
393 for (i = 0; i <
dstW; i += 8) {
410 #undef accumulate_bit
412 #define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
413 static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
414 const int16_t **lumSrc, int lumFilterSize, \
415 const int16_t *chrFilter, const int16_t **chrUSrc, \
416 const int16_t **chrVSrc, int chrFilterSize, \
417 const int16_t **alpSrc, uint8_t *dest, int dstW, \
420 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
421 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
422 alpSrc, dest, dstW, y, fmt); \
425 static void name ## ext ## _2_c(SwsContext *c, const int16_t *buf[2], \
426 const int16_t *ubuf[2], const int16_t *vbuf[2], \
427 const int16_t *abuf[2], uint8_t *dest, int dstW, \
428 int yalpha, int uvalpha, int y) \
430 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
431 dest, dstW, yalpha, uvalpha, y, fmt); \
434 static void name ## ext ## _1_c(SwsContext *c, const int16_t *buf0, \
435 const int16_t *ubuf[2], const int16_t *vbuf[2], \
436 const int16_t *abuf0, uint8_t *dest, int dstW, \
437 int uvalpha, int y) \
439 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, \
440 abuf0, dest, dstW, uvalpha, \
447 #define output_pixels(pos, Y1, U, Y2, V) \
448 if (target == AV_PIX_FMT_YUYV422) { \
449 dest[pos + 0] = Y1; \
451 dest[pos + 2] = Y2; \
453 } else if (target == AV_PIX_FMT_YVYU422) { \
454 dest[pos + 0] = Y1; \
456 dest[pos + 2] = Y2; \
460 dest[pos + 1] = Y1; \
462 dest[pos + 3] = Y2; \
467 const int16_t **lumSrc,
int lumFilterSize,
468 const int16_t *chrFilter,
const int16_t **chrUSrc,
469 const int16_t **chrVSrc,
int chrFilterSize,
475 for (i = 0; i < ((dstW + 1) >> 1); i++) {
482 for (j = 0; j < lumFilterSize; j++) {
483 Y1 += lumSrc[j][i * 2] * lumFilter[j];
484 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
486 for (j = 0; j < chrFilterSize; j++) {
487 U += chrUSrc[j][i] * chrFilter[j];
488 V += chrVSrc[j][i] * chrFilter[j];
494 if ((Y1 | Y2 | U | V) & 0x100) {
495 Y1 = av_clip_uint8(Y1);
496 Y2 = av_clip_uint8(Y2);
497 U = av_clip_uint8(U);
498 V = av_clip_uint8(V);
506 const int16_t *ubuf[2],
const int16_t *vbuf[2],
508 int yalpha,
int uvalpha,
int y,
511 const int16_t *buf0 = buf[0], *buf1 = buf[1],
512 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
513 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
514 int yalpha1 = 4096 - yalpha;
515 int uvalpha1 = 4096 - uvalpha;
518 for (i = 0; i < ((dstW + 1) >> 1); i++) {
519 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
520 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
521 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
522 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
524 Y1 = av_clip_uint8(Y1);
525 Y2 = av_clip_uint8(Y2);
526 U = av_clip_uint8(U);
527 V = av_clip_uint8(V);
535 const int16_t *ubuf[2],
const int16_t *vbuf[2],
539 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
542 if (uvalpha < 2048) {
543 for (i = 0; i < ((dstW + 1) >> 1); i++) {
544 int Y1 = buf0[i * 2] >> 7;
545 int Y2 = buf0[i * 2 + 1] >> 7;
546 int U = ubuf0[i] >> 7;
547 int V = vbuf0[i] >> 7;
549 Y1 = av_clip_uint8(Y1);
550 Y2 = av_clip_uint8(Y2);
551 U = av_clip_uint8(U);
552 V = av_clip_uint8(V);
557 const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
558 for (i = 0; i < ((dstW + 1) >> 1); i++) {
559 int Y1 = buf0[i * 2] >> 7;
560 int Y2 = buf0[i * 2 + 1] >> 7;
561 int U = (ubuf0[i] + ubuf1[i]) >> 8;
562 int V = (vbuf0[i] + vbuf1[i]) >> 8;
564 Y1 = av_clip_uint8(Y1);
565 Y2 = av_clip_uint8(Y2);
566 U = av_clip_uint8(U);
567 V = av_clip_uint8(V);
580 #define R_B ((target == AV_PIX_FMT_RGB48LE || target == AV_PIX_FMT_RGB48BE) ? R : B)
581 #define B_R ((target == AV_PIX_FMT_RGB48LE || target == AV_PIX_FMT_RGB48BE) ? B : R)
582 #define output_pixel(pos, val) \
583 if (isBE(target)) { \
591 const int32_t **lumSrc,
int lumFilterSize,
592 const int16_t *chrFilter,
const int32_t **chrUSrc,
593 const int32_t **chrVSrc,
int chrFilterSize,
599 for (i = 0; i < ((dstW + 1) >> 1); i++) {
601 int Y1 = -0x40000000;
602 int Y2 = -0x40000000;
607 for (j = 0; j < lumFilterSize; j++) {
608 Y1 += lumSrc[j][i * 2] * lumFilter[j];
609 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
611 for (j = 0; j < chrFilterSize; j++) {
612 U += chrUSrc[j][i] * chrFilter[j];
613 V += chrVSrc[j][i] * chrFilter[j];
639 output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
642 output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
652 int yalpha,
int uvalpha,
int y,
655 const int32_t *buf0 = buf[0], *buf1 = buf[1],
656 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
657 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
658 int yalpha1 = 4096 - yalpha;
659 int uvalpha1 = 4096 - uvalpha;
662 for (i = 0; i < ((dstW + 1) >> 1); i++) {
663 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 14;
664 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 14;
665 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha + (-128 << 23)) >> 14;
666 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha + (-128 << 23)) >> 14;
681 output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
684 output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
696 const int32_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
699 if (uvalpha < 2048) {
700 for (i = 0; i < ((dstW + 1) >> 1); i++) {
701 int Y1 = (buf0[i * 2] ) >> 2;
702 int Y2 = (buf0[i * 2 + 1]) >> 2;
703 int U = (ubuf0[i] + (-128 << 11)) >> 2;
704 int V = (vbuf0[i] + (-128 << 11)) >> 2;
719 output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
722 output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
727 const int32_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
728 for (i = 0; i < ((dstW + 1) >> 1); i++) {
729 int Y1 = (buf0[i * 2] ) >> 2;
730 int Y2 = (buf0[i * 2 + 1]) >> 2;
731 int U = (ubuf0[i] + ubuf1[i] + (-128 << 12)) >> 3;
732 int V = (vbuf0[i] + vbuf1[i] + (-128 << 12)) >> 3;
747 output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
750 output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
761 #define YUV2PACKED16WRAPPER(name, base, ext, fmt) \
762 static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
763 const int16_t **_lumSrc, int lumFilterSize, \
764 const int16_t *chrFilter, const int16_t **_chrUSrc, \
765 const int16_t **_chrVSrc, int chrFilterSize, \
766 const int16_t **_alpSrc, uint8_t *_dest, int dstW, \
769 const int32_t **lumSrc = (const int32_t **) _lumSrc, \
770 **chrUSrc = (const int32_t **) _chrUSrc, \
771 **chrVSrc = (const int32_t **) _chrVSrc, \
772 **alpSrc = (const int32_t **) _alpSrc; \
773 uint16_t *dest = (uint16_t *) _dest; \
774 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
775 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
776 alpSrc, dest, dstW, y, fmt); \
779 static void name ## ext ## _2_c(SwsContext *c, const int16_t *_buf[2], \
780 const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
781 const int16_t *_abuf[2], uint8_t *_dest, int dstW, \
782 int yalpha, int uvalpha, int y) \
784 const int32_t **buf = (const int32_t **) _buf, \
785 **ubuf = (const int32_t **) _ubuf, \
786 **vbuf = (const int32_t **) _vbuf, \
787 **abuf = (const int32_t **) _abuf; \
788 uint16_t *dest = (uint16_t *) _dest; \
789 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
790 dest, dstW, yalpha, uvalpha, y, fmt); \
793 static void name ## ext ## _1_c(SwsContext *c, const int16_t *_buf0, \
794 const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
795 const int16_t *_abuf0, uint8_t *_dest, int dstW, \
796 int uvalpha, int y) \
798 const int32_t *buf0 = (const int32_t *) _buf0, \
799 **ubuf = (const int32_t **) _ubuf, \
800 **vbuf = (const int32_t **) _vbuf, \
801 *abuf0 = (const int32_t *) _abuf0; \
802 uint16_t *dest = (uint16_t *) _dest; \
803 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
804 dstW, uvalpha, y, fmt); \
822 unsigned A1,
unsigned A2,
823 const
void *_r, const
void *_g, const
void *_b,
int y,
828 uint32_t *dest = (uint32_t *) _dest;
829 const uint32_t *
r = (
const uint32_t *) _r;
830 const uint32_t *
g = (
const uint32_t *) _g;
831 const uint32_t *
b = (
const uint32_t *) _b;
836 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (hasAlpha ? A1 << sh : 0);
837 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (hasAlpha ? A2 << sh : 0);
842 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (A1 << sh);
843 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (A2 << sh);
845 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
846 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
855 #define r_b ((target == AV_PIX_FMT_RGB24) ? r : b)
856 #define b_r ((target == AV_PIX_FMT_RGB24) ? b : r)
857 dest[i * 6 + 0] =
r_b[Y1];
858 dest[i * 6 + 1] = g[Y1];
859 dest[i * 6 + 2] =
b_r[Y1];
860 dest[i * 6 + 3] =
r_b[Y2];
861 dest[i * 6 + 4] = g[Y2];
862 dest[i * 6 + 5] =
b_r[Y2];
868 uint16_t *dest = (uint16_t *) _dest;
869 const uint16_t *
r = (
const uint16_t *) _r;
870 const uint16_t *
g = (
const uint16_t *) _g;
871 const uint16_t *
b = (
const uint16_t *) _b;
872 int dr1, dg1, db1, dr2, dg2, db2;
897 dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
898 dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
904 int dr1, dg1, db1, dr2, dg2, db2;
909 dr1 = dg1 = d32[(i * 2 + 0) & 7];
910 db1 = d64[(i * 2 + 0) & 7];
911 dr2 = dg2 = d32[(i * 2 + 1) & 7];
912 db2 = d64[(i * 2 + 1) & 7];
916 dr1 = db1 = d128[(i * 2 + 0) & 7];
917 dg1 = d64[(i * 2 + 0) & 7];
918 dr2 = db2 = d128[(i * 2 + 1) & 7];
919 dg2 = d64[(i * 2 + 1) & 7];
923 dest[i] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1] +
924 ((r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2]) << 4);
926 dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
927 dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
934 const int16_t **lumSrc,
int lumFilterSize,
935 const int16_t *chrFilter,
const int16_t **chrUSrc,
936 const int16_t **chrVSrc,
int chrFilterSize,
942 for (i = 0; i < ((dstW + 1) >> 1); i++) {
948 const void *
r, *
g, *
b;
950 for (j = 0; j < lumFilterSize; j++) {
951 Y1 += lumSrc[j][i * 2] * lumFilter[j];
952 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
954 for (j = 0; j < chrFilterSize; j++) {
955 U += chrUSrc[j][i] * chrFilter[j];
956 V += chrVSrc[j][i] * chrFilter[j];
962 if ((Y1 | Y2 | U | V) & 0x100) {
963 Y1 = av_clip_uint8(Y1);
964 Y2 = av_clip_uint8(Y2);
965 U = av_clip_uint8(U);
966 V = av_clip_uint8(V);
971 for (j = 0; j < lumFilterSize; j++) {
972 A1 += alpSrc[j][i * 2 ] * lumFilter[j];
973 A2 += alpSrc[j][i * 2 + 1] * lumFilter[j];
977 if ((A1 | A2) & 0x100) {
978 A1 = av_clip_uint8(A1);
979 A2 = av_clip_uint8(A2);
988 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
989 r, g, b, y, target, hasAlpha);
995 const int16_t *ubuf[2],
const int16_t *vbuf[2],
997 int yalpha,
int uvalpha,
int y,
1000 const int16_t *buf0 = buf[0], *buf1 = buf[1],
1001 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1002 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1003 *abuf0 = hasAlpha ? abuf[0] :
NULL,
1004 *abuf1 = hasAlpha ? abuf[1] :
NULL;
1005 int yalpha1 = 4096 - yalpha;
1006 int uvalpha1 = 4096 - uvalpha;
1009 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1010 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
1011 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
1012 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
1013 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
1015 const void *
r, *
g, *
b;
1017 Y1 = av_clip_uint8(Y1);
1018 Y2 = av_clip_uint8(Y2);
1019 U = av_clip_uint8(U);
1020 V = av_clip_uint8(V);
1027 A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 19;
1028 A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 19;
1029 A1 = av_clip_uint8(A1);
1030 A2 = av_clip_uint8(A2);
1033 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1034 r, g, b, y, target, hasAlpha);
1040 const int16_t *ubuf[2],
const int16_t *vbuf[2],
1045 const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1048 if (uvalpha < 2048) {
1049 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1050 int Y1 = buf0[i * 2] >> 7;
1051 int Y2 = buf0[i * 2 + 1] >> 7;
1052 int U = ubuf0[i] >> 7;
1053 int V = vbuf0[i] >> 7;
1055 const void *
r, *
g, *
b;
1057 Y1 = av_clip_uint8(Y1);
1058 Y2 = av_clip_uint8(Y2);
1059 U = av_clip_uint8(U);
1060 V = av_clip_uint8(V);
1067 A1 = abuf0[i * 2 ] >> 7;
1068 A2 = abuf0[i * 2 + 1] >> 7;
1069 A1 = av_clip_uint8(A1);
1070 A2 = av_clip_uint8(A2);
1073 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1074 r, g, b, y, target, hasAlpha);
1077 const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1078 for (i = 0; i < ((dstW + 1) >> 1); i++) {
1079 int Y1 = buf0[i * 2] >> 7;
1080 int Y2 = buf0[i * 2 + 1] >> 7;
1081 int U = (ubuf0[i] + ubuf1[i]) >> 8;
1082 int V = (vbuf0[i] + vbuf1[i]) >> 8;
1084 const void *
r, *
g, *
b;
1086 Y1 = av_clip_uint8(Y1);
1087 Y2 = av_clip_uint8(Y2);
1088 U = av_clip_uint8(U);
1089 V = av_clip_uint8(V);
1096 A1 = abuf0[i * 2 ] >> 7;
1097 A2 = abuf0[i * 2 + 1] >> 7;
1098 A1 = av_clip_uint8(A1);
1099 A2 = av_clip_uint8(A2);
1102 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1103 r, g, b, y, target, hasAlpha);
1108 #define YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1109 static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
1110 const int16_t **lumSrc, int lumFilterSize, \
1111 const int16_t *chrFilter, const int16_t **chrUSrc, \
1112 const int16_t **chrVSrc, int chrFilterSize, \
1113 const int16_t **alpSrc, uint8_t *dest, int dstW, \
1116 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
1117 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
1118 alpSrc, dest, dstW, y, fmt, hasAlpha); \
1120 #define YUV2RGBWRAPPER(name, base, ext, fmt, hasAlpha) \
1121 YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1122 static void name ## ext ## _2_c(SwsContext *c, const int16_t *buf[2], \
1123 const int16_t *ubuf[2], const int16_t *vbuf[2], \
1124 const int16_t *abuf[2], uint8_t *dest, int dstW, \
1125 int yalpha, int uvalpha, int y) \
1127 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
1128 dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha); \
1131 static void name ## ext ## _1_c(SwsContext *c, const int16_t *buf0, \
1132 const int16_t *ubuf[2], const int16_t *vbuf[2], \
1133 const int16_t *abuf0, uint8_t *dest, int dstW, \
1134 int uvalpha, int y) \
1136 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
1137 dstW, uvalpha, y, fmt, hasAlpha); \
1144 #if CONFIG_SWSCALE_ALPHA
1162 const int16_t **lumSrc,
int lumFilterSize,
1163 const int16_t *chrFilter, const int16_t **chrUSrc,
1164 const int16_t **chrVSrc,
int chrFilterSize,
1165 const int16_t **alpSrc,
uint8_t *dest,
1171 for (i = 0; i <
dstW; i++) {
1178 for (j = 0; j < lumFilterSize; j++) {
1179 Y += lumSrc[j][i] * lumFilter[j];
1181 for (j = 0; j < chrFilterSize; j++) {
1182 U += chrUSrc[j][i] * chrFilter[j];
1183 V += chrVSrc[j][i] * chrFilter[j];
1190 for (j = 0; j < lumFilterSize; j++) {
1191 A += alpSrc[j][i] * lumFilter[j];
1195 A = av_clip_uint8(A);
1197 Y -= c->yuv2rgb_y_offset;
1198 Y *= c->yuv2rgb_y_coeff;
1200 R = Y + V*c->yuv2rgb_v2r_coeff;
1201 G = Y + V*c->yuv2rgb_v2g_coeff + U*c->yuv2rgb_u2g_coeff;
1202 B = Y + U*c->yuv2rgb_u2b_coeff;
1203 if ((R | G | B) & 0xC0000000) {
1204 R = av_clip_uintp2(R, 30);
1205 G = av_clip_uintp2(G, 30);
1206 B = av_clip_uintp2(B, 30);
1211 dest[0] = hasAlpha ? A : 255;
1225 dest[3] = hasAlpha ? A : 255;
1228 dest[0] = hasAlpha ? A : 255;
1234 case AV_PIX_FMT_BGR24:
1243 dest[3] = hasAlpha ? A : 255;
1256 #if CONFIG_SWSCALE_ALPHA
1272 const int16_t **lumSrc,
int lumFilterSize,
1273 const int16_t *chrFilter, const int16_t **chrUSrc,
1274 const int16_t **chrVSrc,
int chrFilterSize,
1275 const int16_t **alpSrc,
uint8_t **dest,
1281 uint16_t **dest16 = (uint16_t**)dest;
1284 for (i = 0; i <
dstW; i++) {
1287 int U = (1 << 9) - (128 << 19);
1288 int V = (1 << 9) - (128 << 19);
1291 for (j = 0; j < lumFilterSize; j++)
1292 Y += lumSrc[j][i] * lumFilter[j];
1294 for (j = 0; j < chrFilterSize; j++) {
1295 U += chrUSrc[j][i] * chrFilter[j];
1296 V += chrVSrc[j][i] * chrFilter[j];
1306 for (j = 0; j < lumFilterSize; j++)
1307 A += alpSrc[j][i] * lumFilter[j];
1312 A = av_clip_uint8(A);
1315 Y -= c->yuv2rgb_y_offset;
1316 Y *= c->yuv2rgb_y_coeff;
1318 R = Y + V * c->yuv2rgb_v2r_coeff;
1319 G = Y + V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1320 B = Y + U * c->yuv2rgb_u2b_coeff;
1322 if ((R | G | B) & 0xC0000000) {
1323 R = av_clip_uintp2(R, 30);
1324 G = av_clip_uintp2(G, 30);
1325 B = av_clip_uintp2(B, 30);
1329 dest16[0][i] = G >> SH;
1330 dest16[1][i] = B >> SH;
1331 dest16[2][i] = R >> SH;
1333 dest[0][i] = G >> 22;
1334 dest[1][i] = B >> 22;
1335 dest[2][i] = R >> 22;
1339 for (i = 0; i <
dstW; i++) {
1360 *yuv2planeX =
isBE(dstFormat) ? yuv2planeX_16BE_c : yuv2planeX_16LE_c;
1361 *yuv2plane1 =
isBE(dstFormat) ? yuv2plane1_16BE_c : yuv2plane1_16LE_c;
1364 *yuv2planeX =
isBE(dstFormat) ? yuv2planeX_9BE_c : yuv2planeX_9LE_c;
1365 *yuv2plane1 =
isBE(dstFormat) ? yuv2plane1_9BE_c : yuv2plane1_9LE_c;
1367 *yuv2planeX =
isBE(dstFormat) ? yuv2planeX_10BE_c : yuv2planeX_10LE_c;
1368 *yuv2plane1 =
isBE(dstFormat) ? yuv2plane1_10BE_c : yuv2plane1_10LE_c;
1372 *yuv2planeX = yuv2planeX_8_c;
1378 switch (dstFormat) {
1379 case AV_PIX_FMT_RGBA:
1381 *yuv2packedX = yuv2rgba32_full_X_c;
1383 #if CONFIG_SWSCALE_ALPHA
1385 *yuv2packedX = yuv2rgba32_full_X_c;
1389 *yuv2packedX = yuv2rgbx32_full_X_c;
1393 case AV_PIX_FMT_ARGB:
1395 *yuv2packedX = yuv2argb32_full_X_c;
1397 #if CONFIG_SWSCALE_ALPHA
1399 *yuv2packedX = yuv2argb32_full_X_c;
1403 *yuv2packedX = yuv2xrgb32_full_X_c;
1409 *yuv2packedX = yuv2bgra32_full_X_c;
1411 #if CONFIG_SWSCALE_ALPHA
1413 *yuv2packedX = yuv2bgra32_full_X_c;
1417 *yuv2packedX = yuv2bgrx32_full_X_c;
1421 case AV_PIX_FMT_ABGR:
1423 *yuv2packedX = yuv2abgr32_full_X_c;
1425 #if CONFIG_SWSCALE_ALPHA
1427 *yuv2packedX = yuv2abgr32_full_X_c;
1431 *yuv2packedX = yuv2xbgr32_full_X_c;
1436 *yuv2packedX = yuv2rgb24_full_X_c;
1439 *yuv2packedX = yuv2bgr24_full_X_c;
1452 switch (dstFormat) {
1454 *yuv2packed1 = yuv2rgb48le_1_c;
1455 *yuv2packed2 = yuv2rgb48le_2_c;
1456 *yuv2packedX = yuv2rgb48le_X_c;
1459 *yuv2packed1 = yuv2rgb48be_1_c;
1460 *yuv2packed2 = yuv2rgb48be_2_c;
1461 *yuv2packedX = yuv2rgb48be_X_c;
1464 *yuv2packed1 = yuv2bgr48le_1_c;
1465 *yuv2packed2 = yuv2bgr48le_2_c;
1466 *yuv2packedX = yuv2bgr48le_X_c;
1469 *yuv2packed1 = yuv2bgr48be_1_c;
1470 *yuv2packed2 = yuv2bgr48be_2_c;
1471 *yuv2packedX = yuv2bgr48be_X_c;
1473 case AV_PIX_FMT_RGB32:
1476 *yuv2packed1 = yuv2rgb32_1_c;
1477 *yuv2packed2 = yuv2rgb32_2_c;
1478 *yuv2packedX = yuv2rgb32_X_c;
1480 #if CONFIG_SWSCALE_ALPHA
1482 *yuv2packed1 = yuv2rgba32_1_c;
1483 *yuv2packed2 = yuv2rgba32_2_c;
1484 *yuv2packedX = yuv2rgba32_X_c;
1488 *yuv2packed1 = yuv2rgbx32_1_c;
1489 *yuv2packed2 = yuv2rgbx32_2_c;
1490 *yuv2packedX = yuv2rgbx32_X_c;
1497 *yuv2packed1 = yuv2rgb32_1_1_c;
1498 *yuv2packed2 = yuv2rgb32_1_2_c;
1499 *yuv2packedX = yuv2rgb32_1_X_c;
1501 #if CONFIG_SWSCALE_ALPHA
1503 *yuv2packed1 = yuv2rgba32_1_1_c;
1504 *yuv2packed2 = yuv2rgba32_1_2_c;
1505 *yuv2packedX = yuv2rgba32_1_X_c;
1509 *yuv2packed1 = yuv2rgbx32_1_1_c;
1510 *yuv2packed2 = yuv2rgbx32_1_2_c;
1511 *yuv2packedX = yuv2rgbx32_1_X_c;
1516 *yuv2packed1 = yuv2rgb24_1_c;
1517 *yuv2packed2 = yuv2rgb24_2_c;
1518 *yuv2packedX = yuv2rgb24_X_c;
1521 *yuv2packed1 = yuv2bgr24_1_c;
1522 *yuv2packed2 = yuv2bgr24_2_c;
1523 *yuv2packedX = yuv2bgr24_X_c;
1529 *yuv2packed1 = yuv2rgb16_1_c;
1530 *yuv2packed2 = yuv2rgb16_2_c;
1531 *yuv2packedX = yuv2rgb16_X_c;
1537 *yuv2packed1 = yuv2rgb15_1_c;
1538 *yuv2packed2 = yuv2rgb15_2_c;
1539 *yuv2packedX = yuv2rgb15_X_c;
1545 *yuv2packed1 = yuv2rgb12_1_c;
1546 *yuv2packed2 = yuv2rgb12_2_c;
1547 *yuv2packedX = yuv2rgb12_X_c;
1551 *yuv2packed1 = yuv2rgb8_1_c;
1552 *yuv2packed2 = yuv2rgb8_2_c;
1553 *yuv2packedX = yuv2rgb8_X_c;
1557 *yuv2packed1 = yuv2rgb4_1_c;
1558 *yuv2packed2 = yuv2rgb4_2_c;
1559 *yuv2packedX = yuv2rgb4_X_c;
1563 *yuv2packed1 = yuv2rgb4b_1_c;
1564 *yuv2packed2 = yuv2rgb4b_2_c;
1565 *yuv2packedX = yuv2rgb4b_X_c;
1569 switch (dstFormat) {
1571 *yuv2packed1 = yuv2monowhite_1_c;
1572 *yuv2packed2 = yuv2monowhite_2_c;
1573 *yuv2packedX = yuv2monowhite_X_c;
1576 *yuv2packed1 = yuv2monoblack_1_c;
1577 *yuv2packed2 = yuv2monoblack_2_c;
1578 *yuv2packedX = yuv2monoblack_X_c;
1581 *yuv2packed1 = yuv2yuyv422_1_c;
1582 *yuv2packed2 = yuv2yuyv422_2_c;
1583 *yuv2packedX = yuv2yuyv422_X_c;
1586 *yuv2packed1 = yuv2yvyu422_1_c;
1587 *yuv2packed2 = yuv2yvyu422_2_c;
1588 *yuv2packedX = yuv2yvyu422_X_c;
1591 *yuv2packed1 = yuv2uyvy422_1_c;
1592 *yuv2packed2 = yuv2uyvy422_2_c;
1593 *yuv2packedX = yuv2uyvy422_X_c;
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
int16_t ** alpPixBuf
Ring buffer for scaled horizontal alpha plane lines to be fed to the vertical scaler.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
packed RGB 8:8:8, 24bpp, RGBRGB...
packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in ...
static av_always_inline void yuv2rgb48_2_c_template(SwsContext *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, int uvalpha, int y, enum AVPixelFormat target)
packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0 ...
#define DECLARE_ALIGNED(n, t, v)
static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0 ...
#define AV_PIX_FMT_RGB444
#define yuv2NBPS(bits, BE_LE, is_be, template_size, typeX_t)
static av_always_inline void yuv2mono_2_c_template(SwsContext *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)
packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in ...
Macro definitions for various function/variable attributes.
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as lit...
static av_always_inline void yuv2rgb_1_c_template(SwsContext *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)
static void yuv2gbrp_full_X_c(SwsContext *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)
#define YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha)
packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0 ...
#define SWS_FULL_CHR_H_INT
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
static const uint8_t dither_2x2_8[2][8]
planar GBR 4:4:4 48bpp, big-endian
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 (...
external api for the swscale stuff
enum AVPixelFormat dstFormat
Destination pixel format.
yuv2packedX_fn yuv2packedX
planar GBR 4:4:4 27bpp, big-endian
uint16_t depth_minus1
Number of bits in the component minus 1.
#define AV_PIX_FMT_BGR32_1
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
static const uint8_t dither_2x2_4[2][8]
yuv2packed1_fn yuv2packed1
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
const uint8_t ff_dither_8x8_32[8][8]
#define output_pixel(pos, val, bias, signedness)
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
int chrDstW
Width of destination chroma planes.
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as lit...
#define YUV2RGBWRAPPER(name, base, ext, fmt, hasAlpha)
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
static av_always_inline void yuv2rgb48_1_c_template(SwsContext *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)
static av_always_inline void yuv2plane1_16_c_template(const int32_t *src, uint16_t *dest, int dstW, int big_endian, int output_bits)
static av_always_inline void yuv2422_1_c_template(SwsContext *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)
static void filter(MpegAudioContext *s, int ch, const short *samples, int incr)
static av_always_inline void yuv2422_X_c_template(SwsContext *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)
as above, but U and V bytes are swapped
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)
static av_always_inline void yuv2rgb_write(uint8_t *_dest, int i, unsigned Y1, unsigned Y2, unsigned A1, unsigned A2, const void *_r, const void *_g, const void *_b, int y, enum AVPixelFormat target, int hasAlpha)
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
#define YUV2PACKED16WRAPPER(name, base, ext, fmt)
static av_always_inline int is9_OR_10BPS(enum AVPixelFormat pix_fmt)
yuv2planar1_fn yuv2plane1
yuv2interleavedX_fn yuv2nv12cX
packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb
packed RGB 8:8:8, 24bpp, BGRBGR...
static av_always_inline void yuv2rgb_full_X_c_template(SwsContext *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)
#define YUV2PACKEDWRAPPER(name, base, ext, fmt)
const uint8_t ff_dither_4x4_16[4][8]
int dstW
Width of destination luma/alpha planes.
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big...
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
#define AV_PIX_FMT_BGR555
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
static av_always_inline void yuv2plane1_10_c_template(const int16_t *src, uint16_t *dest, int dstW, int big_endian, int output_bits)
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
static const uint16_t dither[8][8]
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)
static void yuv2rgb(uint8_t *out, int Y, int U, int V)
void(* yuv2packedX_fn)(struct SwsContext *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...
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
yuv2planarX_fn yuv2planeX
planar GBR 4:4:4 30bpp, big-endian
static av_always_inline void yuv2mono_1_c_template(SwsContext *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)
void(* yuv2packed1_fn)(struct SwsContext *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...
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
static av_always_inline void yuv2rgb48_X_c_template(SwsContext *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)
static av_always_inline void yuv2mono_X_c_template(SwsContext *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)
const uint8_t ff_dither_8x8_220[8][8]
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 void yuv2rgb_2_c_template(SwsContext *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)
packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1 ...
#define AV_PIX_FMT_BGR565
const uint8_t * chrDither8
static void yuv2plane1_8_c(const int16_t *src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0 ...
static av_always_inline void yuv2422_2_c_template(SwsContext *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)
packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1 ...
const uint8_t ff_dither_8x8_73[8][8]
#define output_pixels(pos, Y1, U, Y2, V)
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb...
yuv2packed2_fn yuv2packed2
Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb...
static void yuv2nv12cX_c(SwsContext *c, const int16_t *chrFilter, int chrFilterSize, const int16_t **chrUSrc, const int16_t **chrVSrc, uint8_t *dest, int chrDstW)
planar GBR 4:4:4 27bpp, little-endian
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big...
#define AV_PIX_FMT_BGR444
void(* yuv2packed2_fn)(struct SwsContext *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...
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
#define AV_PIX_FMT_RGB555
av_cold void ff_sws_init_output_funcs(SwsContext *c, yuv2planar1_fn *yuv2plane1, yuv2planarX_fn *yuv2planeX, yuv2interleavedX_fn *yuv2nv12cX, yuv2packed1_fn *yuv2packed1, yuv2packed2_fn *yuv2packed2, yuv2packedX_fn *yuv2packedX, yuv2anyX_fn *yuv2anyX)
#define AV_PIX_FMT_RGB32_1
void(* yuv2interleavedX_fn)(struct SwsContext *c, 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 ...
void(* yuv2anyX_fn)(struct SwsContext *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...
#define AV_PIX_FMT_RGB565
packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1 ...
planar GBR 4:4:4 48bpp, little-endian
packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1 ...
static av_always_inline void yuv2rgb_X_c_template(SwsContext *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)
int flags
Flags passed by the user to select scaler algorithm, optimizations, subsampling, etc...
AVPixelFormat
Pixel format.
#define accumulate_bit(acc, val)
planar GBR 4:4:4 30bpp, little-endian