39 #define RGB2YUV_SHIFT 15
40 #define BY ( (int)(0.114*219/255*(1<<RGB2YUV_SHIFT)+0.5))
41 #define BV (-(int)(0.081*224/255*(1<<RGB2YUV_SHIFT)+0.5))
42 #define BU ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5))
43 #define GY ( (int)(0.587*219/255*(1<<RGB2YUV_SHIFT)+0.5))
44 #define GV (-(int)(0.419*224/255*(1<<RGB2YUV_SHIFT)+0.5))
45 #define GU (-(int)(0.331*224/255*(1<<RGB2YUV_SHIFT)+0.5))
46 #define RY ( (int)(0.299*219/255*(1<<RGB2YUV_SHIFT)+0.5))
47 #define RV ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5))
48 #define RU (-(int)(0.169*224/255*(1<<RGB2YUV_SHIFT)+0.5))
66 { 1, 3, 1, 3, 1, 3, 1, 3, },
67 { 2, 0, 2, 0, 2, 0, 2, 0, },
71 { 6, 2, 6, 2, 6, 2, 6, 2, },
72 { 0, 4, 0, 4, 0, 4, 0, 4, },
76 { 8, 4, 11, 7, 8, 4, 11, 7, },
77 { 2, 14, 1, 13, 2, 14, 1, 13, },
78 { 10, 6, 9, 5, 10, 6, 9, 5, },
79 { 0, 12, 3, 15, 0, 12, 3, 15, },
83 { 17, 9, 23, 15, 16, 8, 22, 14, },
84 { 5, 29, 3, 27, 4, 28, 2, 26, },
85 { 21, 13, 19, 11, 20, 12, 18, 10, },
86 { 0, 24, 6, 30, 1, 25, 7, 31, },
87 { 16, 8, 22, 14, 17, 9, 23, 15, },
88 { 4, 28, 2, 26, 5, 29, 3, 27, },
89 { 20, 12, 18, 10, 21, 13, 19, 11, },
90 { 1, 25, 7, 31, 0, 24, 6, 30, },
94 { 0, 55, 14, 68, 3, 58, 17, 72, },
95 { 37, 18, 50, 32, 40, 22, 54, 35, },
96 { 9, 64, 5, 59, 13, 67, 8, 63, },
97 { 46, 27, 41, 23, 49, 31, 44, 26, },
98 { 2, 57, 16, 71, 1, 56, 15, 70, },
99 { 39, 21, 52, 34, 38, 19, 51, 33, },
100 { 11, 66, 7, 62, 10, 65, 6, 60, },
101 { 48, 30, 43, 25, 47, 29, 42, 24, },
106 {117, 62, 158, 103, 113, 58, 155, 100, },
107 { 34, 199, 21, 186, 31, 196, 17, 182, },
108 {144, 89, 131, 76, 141, 86, 127, 72, },
109 { 0, 165, 41, 206, 10, 175, 52, 217, },
110 {110, 55, 151, 96, 120, 65, 162, 107, },
111 { 28, 193, 14, 179, 38, 203, 24, 189, },
112 {138, 83, 124, 69, 148, 93, 134, 79, },
113 { 7, 172, 48, 213, 3, 168, 45, 210, },
118 { 0, 143, 18, 200, 2, 156, 25, 215, },
119 { 78, 28, 125, 64, 89, 36, 138, 74, },
120 { 10, 180, 3, 161, 16, 195, 8, 175, },
121 {109, 51, 93, 38, 121, 60, 105, 47, },
122 { 1, 152, 23, 210, 0, 147, 20, 205, },
123 { 85, 33, 134, 71, 81, 30, 130, 67, },
124 { 14, 190, 6, 171, 12, 185, 5, 166, },
125 {117, 57, 101, 44, 113, 54, 97, 41, },
130 { 0, 124, 8, 193, 0, 140, 12, 213, },
131 { 55, 14, 104, 42, 66, 19, 119, 52, },
132 { 3, 168, 1, 145, 6, 187, 3, 162, },
133 { 86, 31, 70, 21, 99, 39, 82, 28, },
134 { 0, 134, 11, 206, 0, 129, 9, 200, },
135 { 62, 17, 114, 48, 58, 16, 109, 45, },
136 { 5, 181, 2, 157, 4, 175, 1, 151, },
137 { 95, 36, 78, 26, 90, 34, 74, 24, },
142 { 0, 107, 3, 187, 0, 125, 6, 212, },
143 { 39, 7, 86, 28, 49, 11, 102, 36, },
144 { 1, 158, 0, 131, 3, 180, 1, 151, },
145 { 68, 19, 52, 12, 81, 25, 64, 17, },
146 { 0, 119, 5, 203, 0, 113, 4, 195, },
147 { 45, 9, 96, 33, 42, 8, 91, 30, },
148 { 2, 172, 1, 144, 2, 165, 0, 137, },
149 { 77, 23, 60, 15, 72, 21, 56, 14, },
153 { 36, 68, 60, 92, 34, 66, 58, 90,},
154 { 100, 4,124, 28, 98, 2,122, 26,},
155 { 52, 84, 44, 76, 50, 82, 42, 74,},
156 { 116, 20,108, 12,114, 18,106, 10,},
157 { 32, 64, 56, 88, 38, 70, 62, 94,},
158 { 96, 0,120, 24,102, 6,126, 30,},
159 { 48, 80, 40, 72, 54, 86, 46, 78,},
160 { 112, 16,104, 8,118, 22,110, 14,},
163 { 64, 64, 64, 64, 64, 64, 64, 64 };
165 #define output_pixel(pos, val, bias, signedness) \
167 AV_WB16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
169 AV_WL16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
174 int big_endian,
int output_bits)
177 int shift = 19 - output_bits;
179 for (i = 0; i <
dstW; i++) {
180 int val = src[i] + (1 << (shift - 1));
187 const int32_t **src, uint16_t *dest,
int dstW,
188 int big_endian,
int output_bits)
191 int shift = 15 + 16 - output_bits;
193 for (i = 0; i <
dstW; i++) {
194 int val = 1 << (30-output_bits);
203 for (j = 0; j < filterSize; j++)
204 val += src[j][i] * filter[j];
212 #define output_pixel(pos, val) \
214 AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits)); \
216 AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits)); \
221 int big_endian,
int output_bits)
224 int shift = 15 - output_bits;
226 for (i = 0; i <
dstW; i++) {
227 int val = src[i] + (1 << (shift - 1));
234 const int16_t **src, uint16_t *dest,
int dstW,
235 int big_endian,
int output_bits)
238 int shift = 11 + 16 - output_bits;
240 for (i = 0; i <
dstW; i++) {
241 int val = 1 << (26-output_bits);
244 for (j = 0; j < filterSize; j++)
245 val += src[j][i] * filter[j];
253 #define yuv2NBPS(bits, BE_LE, is_be, template_size, typeX_t) \
254 static void yuv2plane1_ ## bits ## BE_LE ## _c(const int16_t *src, \
255 uint8_t *dest, int dstW, \
256 const uint8_t *dither, int offset)\
258 yuv2plane1_ ## template_size ## _c_template((const typeX_t *) src, \
259 (uint16_t *) dest, dstW, is_be, bits); \
261 static void yuv2planeX_ ## bits ## BE_LE ## _c(const int16_t *filter, int filterSize, \
262 const int16_t **src, uint8_t *dest, int dstW, \
263 const uint8_t *dither, int offset)\
265 yuv2planeX_## template_size ## _c_template(filter, \
266 filterSize, (const typeX_t **) src, \
267 (uint16_t *) dest, dstW, is_be, bits); \
271 yuv2NBPS(10, BE, 1, 10, int16_t)
272 yuv2NBPS(10, LE, 0, 10, int16_t)
273 yuv2NBPS(16, BE, 1, 16, int32_t)
274 yuv2NBPS(16, LE, 0, 16, int32_t)
276 static
void yuv2planeX_8_c(const int16_t *
filter,
int filterSize,
277 const int16_t **src, uint8_t *dest,
int dstW,
278 const uint8_t *
dither,
int offset)
281 for (i=0; i<
dstW; i++) {
282 int val = dither[(i + offset) & 7] << 12;
284 for (j=0; j<filterSize; j++)
285 val += src[j][i] * filter[j];
287 dest[i]= av_clip_uint8(val>>19);
292 const uint8_t *
dither,
int offset)
295 for (i=0; i<
dstW; i++) {
296 int val = (src[i] + dither[(i + offset) & 7]) >> 7;
297 dest[i]= av_clip_uint8(val);
302 const int16_t **chrUSrc,
const int16_t **chrVSrc,
311 int u = chrDither[i & 7] << 12;
312 int v = chrDither[(i + 3) & 7] << 12;
314 for (j=0; j<chrFilterSize; j++) {
315 u += chrUSrc[j][i] * chrFilter[j];
316 v += chrVSrc[j][i] * chrFilter[j];
319 dest[2*i]= av_clip_uint8(u>>19);
320 dest[2*i+1]= av_clip_uint8(v>>19);
324 int u = chrDither[i & 7] << 12;
325 int v = chrDither[(i + 3) & 7] << 12;
327 for (j=0; j<chrFilterSize; j++) {
328 u += chrUSrc[j][i] * chrFilter[j];
329 v += chrVSrc[j][i] * chrFilter[j];
332 dest[2*i]= av_clip_uint8(v>>19);
333 dest[2*i+1]= av_clip_uint8(u>>19);
337 #define output_pixel(pos, val) \
338 if (target == PIX_FMT_GRAY16BE) { \
346 const int32_t **lumSrc,
int lumFilterSize,
347 const int16_t *chrFilter,
const int32_t **chrUSrc,
348 const int32_t **chrVSrc,
int chrFilterSize,
349 const int32_t **alpSrc, uint16_t *dest,
int dstW,
354 for (i = 0; i < (dstW >> 1); i++) {
356 int Y1 = (1 << 14) - 0x40000000;
357 int Y2 = (1 << 14) - 0x40000000;
359 for (j = 0; j < lumFilterSize; j++) {
360 Y1 += lumSrc[j][i * 2] * lumFilter[j];
361 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
365 Y1 = av_clip_int16(Y1);
366 Y2 = av_clip_int16(Y2);
374 const int32_t *ubuf[2],
const int32_t *vbuf[2],
375 const int32_t *abuf[2], uint16_t *dest,
int dstW,
376 int yalpha,
int uvalpha,
int y,
379 int yalpha1 = 4095 - yalpha;
381 const int32_t *buf0 = buf[0], *buf1 = buf[1];
383 for (i = 0; i < (dstW >> 1); i++) {
384 int Y1 = (buf0[i * 2 ] * yalpha1 + buf1[i * 2 ] * yalpha) >> 15;
385 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 15;
394 const int32_t *ubuf[2],
const int32_t *vbuf[2],
395 const int32_t *abuf0, uint16_t *dest,
int dstW,
400 for (i = 0; i < (dstW >> 1); i++) {
401 int Y1 = buf0[i * 2 ] << 1;
402 int Y2 = buf0[i * 2 + 1] << 1;
411 #define YUV2PACKED16WRAPPER(name, base, ext, fmt) \
412 static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
413 const int16_t **_lumSrc, int lumFilterSize, \
414 const int16_t *chrFilter, const int16_t **_chrUSrc, \
415 const int16_t **_chrVSrc, int chrFilterSize, \
416 const int16_t **_alpSrc, uint8_t *_dest, int dstW, \
419 const int32_t **lumSrc = (const int32_t **) _lumSrc, \
420 **chrUSrc = (const int32_t **) _chrUSrc, \
421 **chrVSrc = (const int32_t **) _chrVSrc, \
422 **alpSrc = (const int32_t **) _alpSrc; \
423 uint16_t *dest = (uint16_t *) _dest; \
424 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
425 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
426 alpSrc, dest, dstW, y, fmt); \
429 static void name ## ext ## _2_c(SwsContext *c, const int16_t *_buf[2], \
430 const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
431 const int16_t *_abuf[2], uint8_t *_dest, int dstW, \
432 int yalpha, int uvalpha, int y) \
434 const int32_t **buf = (const int32_t **) _buf, \
435 **ubuf = (const int32_t **) _ubuf, \
436 **vbuf = (const int32_t **) _vbuf, \
437 **abuf = (const int32_t **) _abuf; \
438 uint16_t *dest = (uint16_t *) _dest; \
439 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
440 dest, dstW, yalpha, uvalpha, y, fmt); \
443 static void name ## ext ## _1_c(SwsContext *c, const int16_t *_buf0, \
444 const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
445 const int16_t *_abuf0, uint8_t *_dest, int dstW, \
446 int uvalpha, int y) \
448 const int32_t *buf0 = (const int32_t *) _buf0, \
449 **ubuf = (const int32_t **) _ubuf, \
450 **vbuf = (const int32_t **) _vbuf, \
451 *abuf0 = (const int32_t *) _abuf0; \
452 uint16_t *dest = (uint16_t *) _dest; \
453 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
454 dstW, uvalpha, y, fmt); \
460 #define output_pixel(pos, acc) \
461 if (target == PIX_FMT_MONOBLACK) { \
469 const int16_t **lumSrc,
int lumFilterSize,
470 const int16_t *chrFilter,
const int16_t **chrUSrc,
471 const int16_t **chrVSrc,
int chrFilterSize,
472 const int16_t **alpSrc, uint8_t *dest,
int dstW,
480 for (i = 0; i < dstW - 1; i += 2) {
485 for (j = 0; j < lumFilterSize; j++) {
486 Y1 += lumSrc[j][i] * lumFilter[j];
487 Y2 += lumSrc[j][i+1] * lumFilter[j];
491 if ((Y1 | Y2) & 0x100) {
492 Y1 = av_clip_uint8(Y1);
493 Y2 = av_clip_uint8(Y2);
495 acc += acc + g[Y1 + d128[(i + 0) & 7]];
496 acc += acc + g[Y2 + d128[(i + 1) & 7]];
505 const int16_t *ubuf[2],
const int16_t *vbuf[2],
506 const int16_t *abuf[2], uint8_t *dest,
int dstW,
507 int yalpha,
int uvalpha,
int y,
510 const int16_t *buf0 = buf[0], *buf1 = buf[1];
513 int yalpha1 = 4095 - yalpha;
516 for (i = 0; i < dstW - 7; i += 8) {
517 int acc = g[((buf0[i ] * yalpha1 + buf1[i ] * yalpha) >> 19) + d128[0]];
518 acc += acc + g[((buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19) + d128[1]];
519 acc += acc + g[((buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19) + d128[2]];
520 acc += acc + g[((buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19) + d128[3]];
521 acc += acc + g[((buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19) + d128[4]];
522 acc += acc + g[((buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19) + d128[5]];
523 acc += acc + g[((buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19) + d128[6]];
524 acc += acc + g[((buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19) + d128[7]];
531 const int16_t *ubuf[2],
const int16_t *vbuf[2],
532 const int16_t *abuf0, uint8_t *dest,
int dstW,
539 for (i = 0; i < dstW - 7; i += 8) {
540 int acc = g[(buf0[i ] >> 7) + d128[0]];
541 acc += acc + g[(buf0[i + 1] >> 7) + d128[1]];
542 acc += acc + g[(buf0[i + 2] >> 7) + d128[2]];
543 acc += acc + g[(buf0[i + 3] >> 7) + d128[3]];
544 acc += acc + g[(buf0[i + 4] >> 7) + d128[4]];
545 acc += acc + g[(buf0[i + 5] >> 7) + d128[5]];
546 acc += acc + g[(buf0[i + 6] >> 7) + d128[6]];
547 acc += acc + g[(buf0[i + 7] >> 7) + d128[7]];
554 #define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
555 static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
556 const int16_t **lumSrc, int lumFilterSize, \
557 const int16_t *chrFilter, const int16_t **chrUSrc, \
558 const int16_t **chrVSrc, int chrFilterSize, \
559 const int16_t **alpSrc, uint8_t *dest, int dstW, \
562 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
563 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
564 alpSrc, dest, dstW, y, fmt); \
567 static void name ## ext ## _2_c(SwsContext *c, const int16_t *buf[2], \
568 const int16_t *ubuf[2], const int16_t *vbuf[2], \
569 const int16_t *abuf[2], uint8_t *dest, int dstW, \
570 int yalpha, int uvalpha, int y) \
572 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
573 dest, dstW, yalpha, uvalpha, y, fmt); \
576 static void name ## ext ## _1_c(SwsContext *c, const int16_t *buf0, \
577 const int16_t *ubuf[2], const int16_t *vbuf[2], \
578 const int16_t *abuf0, uint8_t *dest, int dstW, \
579 int uvalpha, int y) \
581 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, \
582 abuf0, dest, dstW, uvalpha, \
589 #define output_pixels(pos, Y1, U, Y2, V) \
590 if (target == PIX_FMT_YUYV422) { \
591 dest[pos + 0] = Y1; \
593 dest[pos + 2] = Y2; \
597 dest[pos + 1] = Y1; \
599 dest[pos + 3] = Y2; \
604 const int16_t **lumSrc,
int lumFilterSize,
605 const int16_t *chrFilter,
const int16_t **chrUSrc,
606 const int16_t **chrVSrc,
int chrFilterSize,
607 const int16_t **alpSrc, uint8_t *dest,
int dstW,
612 for (i = 0; i < (dstW >> 1); i++) {
619 for (j = 0; j < lumFilterSize; j++) {
620 Y1 += lumSrc[j][i * 2] * lumFilter[j];
621 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
623 for (j = 0; j < chrFilterSize; j++) {
624 U += chrUSrc[j][i] * chrFilter[j];
625 V += chrVSrc[j][i] * chrFilter[j];
631 if ((Y1 | Y2 | U | V) & 0x100) {
632 Y1 = av_clip_uint8(Y1);
633 Y2 = av_clip_uint8(Y2);
634 U = av_clip_uint8(U);
635 V = av_clip_uint8(V);
643 const int16_t *ubuf[2],
const int16_t *vbuf[2],
644 const int16_t *abuf[2], uint8_t *dest,
int dstW,
645 int yalpha,
int uvalpha,
int y,
648 const int16_t *buf0 = buf[0], *buf1 = buf[1],
649 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
650 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
651 int yalpha1 = 4095 - yalpha;
652 int uvalpha1 = 4095 - uvalpha;
655 for (i = 0; i < (dstW >> 1); i++) {
656 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
657 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
658 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
659 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
667 const int16_t *ubuf[2],
const int16_t *vbuf[2],
668 const int16_t *abuf0, uint8_t *dest,
int dstW,
671 const int16_t *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
672 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
675 if (uvalpha < 2048) {
676 for (i = 0; i < (dstW >> 1); i++) {
677 int Y1 = buf0[i * 2] >> 7;
678 int Y2 = buf0[i * 2 + 1] >> 7;
679 int U = ubuf1[i] >> 7;
680 int V = vbuf1[i] >> 7;
685 for (i = 0; i < (dstW >> 1); i++) {
686 int Y1 = buf0[i * 2] >> 7;
687 int Y2 = buf0[i * 2 + 1] >> 7;
688 int U = (ubuf0[i] + ubuf1[i]) >> 8;
689 int V = (vbuf0[i] + vbuf1[i]) >> 8;
701 #define R_B ((target == PIX_FMT_RGB48LE || target == PIX_FMT_RGB48BE) ? R : B)
702 #define B_R ((target == PIX_FMT_RGB48LE || target == PIX_FMT_RGB48BE) ? B : R)
703 #define output_pixel(pos, val) \
704 if (isBE(target)) { \
712 const int32_t **lumSrc,
int lumFilterSize,
713 const int16_t *chrFilter,
const int32_t **chrUSrc,
714 const int32_t **chrVSrc,
int chrFilterSize,
715 const int32_t **alpSrc, uint16_t *dest,
int dstW,
720 for (i = 0; i < (dstW >> 1); i++) {
722 int Y1 = -0x40000000;
723 int Y2 = -0x40000000;
728 for (j = 0; j < lumFilterSize; j++) {
729 Y1 += lumSrc[j][i * 2] * lumFilter[j];
730 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
732 for (j = 0; j < chrFilterSize; j++) {
733 U += chrUSrc[j][i] * chrFilter[j];
734 V += chrVSrc[j][i] * chrFilter[j];
760 output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
763 output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
771 const int32_t *ubuf[2],
const int32_t *vbuf[2],
772 const int32_t *abuf[2], uint16_t *dest,
int dstW,
773 int yalpha,
int uvalpha,
int y,
776 const int32_t *buf0 = buf[0], *buf1 = buf[1],
777 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
778 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
779 int yalpha1 = 4095 - yalpha;
780 int uvalpha1 = 4095 - uvalpha;
783 for (i = 0; i < (dstW >> 1); i++) {
784 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 14;
785 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 14;
786 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha + (-128 << 23)) >> 14;
787 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha + (-128 << 23)) >> 14;
802 output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
805 output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
813 const int32_t *ubuf[2],
const int32_t *vbuf[2],
814 const int32_t *abuf0, uint16_t *dest,
int dstW,
817 const int32_t *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
818 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
821 if (uvalpha < 2048) {
822 for (i = 0; i < (dstW >> 1); i++) {
823 int Y1 = (buf0[i * 2] ) >> 2;
824 int Y2 = (buf0[i * 2 + 1]) >> 2;
825 int U = (ubuf0[i] + (-128 << 11)) >> 2;
826 int V = (vbuf0[i] + (-128 << 11)) >> 2;
841 output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
844 output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
849 for (i = 0; i < (dstW >> 1); i++) {
850 int Y1 = (buf0[i * 2] ) >> 2;
851 int Y2 = (buf0[i * 2 + 1]) >> 2;
852 int U = (ubuf0[i] + ubuf1[i] + (-128 << 11)) >> 3;
853 int V = (vbuf0[i] + vbuf1[i] + (-128 << 11)) >> 3;
868 output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
871 output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
897 unsigned A1,
unsigned A2,
898 const
void *_r, const
void *_g, const
void *_b,
int y,
903 uint32_t *dest = (uint32_t *) _dest;
904 const uint32_t *
r = (
const uint32_t *) _r;
905 const uint32_t *
g = (
const uint32_t *) _g;
906 const uint32_t *
b = (
const uint32_t *) _b;
911 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (hasAlpha ? A1 << sh : 0);
912 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (hasAlpha ? A2 << sh : 0);
917 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (A1 << sh);
918 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (A2 << sh);
920 dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
921 dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
925 uint8_t *dest = (uint8_t *) _dest;
926 const uint8_t *
r = (
const uint8_t *) _r;
927 const uint8_t *
g = (
const uint8_t *) _g;
928 const uint8_t *
b = (
const uint8_t *) _b;
930 #define r_b ((target == PIX_FMT_RGB24) ? r : b)
931 #define b_r ((target == PIX_FMT_RGB24) ? b : r)
932 dest[i * 6 + 0] =
r_b[Y1];
933 dest[i * 6 + 1] = g[Y1];
934 dest[i * 6 + 2] =
b_r[Y1];
935 dest[i * 6 + 3] =
r_b[Y2];
936 dest[i * 6 + 4] = g[Y2];
937 dest[i * 6 + 5] =
b_r[Y2];
943 uint16_t *dest = (uint16_t *) _dest;
944 const uint16_t *
r = (
const uint16_t *) _r;
945 const uint16_t *
g = (
const uint16_t *) _g;
946 const uint16_t *
b = (
const uint16_t *) _b;
947 int dr1, dg1, db1, dr2, dg2, db2;
972 dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
973 dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
975 uint8_t *dest = (uint8_t *) _dest;
976 const uint8_t *
r = (
const uint8_t *) _r;
977 const uint8_t *
g = (
const uint8_t *) _g;
978 const uint8_t *
b = (
const uint8_t *) _b;
979 int dr1, dg1, db1, dr2, dg2, db2;
984 dr1 = dg1 = d32[(i * 2 + 0) & 7];
985 db1 = d64[(i * 2 + 0) & 7];
986 dr2 = dg2 = d32[(i * 2 + 1) & 7];
987 db2 = d64[(i * 2 + 1) & 7];
991 dr1 = db1 = d128[(i * 2 + 0) & 7];
992 dg1 = d64[(i * 2 + 0) & 7];
993 dr2 = db2 = d128[(i * 2 + 1) & 7];
994 dg2 = d64[(i * 2 + 1) & 7];
998 dest[i] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1] +
999 ((r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2]) << 4);
1001 dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
1002 dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
1009 const int16_t **lumSrc,
int lumFilterSize,
1010 const int16_t *chrFilter,
const int16_t **chrUSrc,
1011 const int16_t **chrVSrc,
int chrFilterSize,
1012 const int16_t **alpSrc, uint8_t *dest,
int dstW,
1017 for (i = 0; i < (dstW >> 1); i++) {
1024 const void *
r, *
g, *
b;
1026 for (j = 0; j < lumFilterSize; j++) {
1027 Y1 += lumSrc[j][i * 2] * lumFilter[j];
1028 Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
1030 for (j = 0; j < chrFilterSize; j++) {
1031 U += chrUSrc[j][i] * chrFilter[j];
1032 V += chrVSrc[j][i] * chrFilter[j];
1038 if ((Y1 | Y2 | U | V) & 0x100) {
1039 Y1 = av_clip_uint8(Y1);
1040 Y2 = av_clip_uint8(Y2);
1041 U = av_clip_uint8(U);
1042 V = av_clip_uint8(V);
1047 for (j = 0; j < lumFilterSize; j++) {
1048 A1 += alpSrc[j][i * 2 ] * lumFilter[j];
1049 A2 += alpSrc[j][i * 2 + 1] * lumFilter[j];
1053 if ((A1 | A2) & 0x100) {
1054 A1 = av_clip_uint8(A1);
1055 A2 = av_clip_uint8(A2);
1064 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1065 r, g, b, y, target, hasAlpha);
1071 const int16_t *ubuf[2],
const int16_t *vbuf[2],
1072 const int16_t *abuf[2], uint8_t *dest,
int dstW,
1073 int yalpha,
int uvalpha,
int y,
1076 const int16_t *buf0 = buf[0], *buf1 = buf[1],
1077 *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1078 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1079 *abuf0 = hasAlpha ? abuf[0] :
NULL,
1080 *abuf1 = hasAlpha ? abuf[1] :
NULL;
1081 int yalpha1 = 4095 - yalpha;
1082 int uvalpha1 = 4095 - uvalpha;
1085 for (i = 0; i < (dstW >> 1); i++) {
1086 int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
1087 int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
1088 int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
1089 int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
1096 A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 19;
1097 A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 19;
1100 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1101 r,
g,
b, y, target, hasAlpha);
1107 const int16_t *ubuf[2],
const int16_t *vbuf[2],
1108 const int16_t *abuf0, uint8_t *dest,
int dstW,
1112 const int16_t *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1113 *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
1116 if (uvalpha < 2048) {
1117 for (i = 0; i < (dstW >> 1); i++) {
1118 int Y1 = buf0[i * 2] >> 7;
1119 int Y2 = buf0[i * 2 + 1] >> 7;
1120 int U = ubuf1[i] >> 7;
1121 int V = vbuf1[i] >> 7;
1128 A1 = abuf0[i * 2 ] >> 7;
1129 A2 = abuf0[i * 2 + 1] >> 7;
1132 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1133 r,
g,
b, y, target, hasAlpha);
1136 for (i = 0; i < (dstW >> 1); i++) {
1137 int Y1 = buf0[i * 2] >> 7;
1138 int Y2 = buf0[i * 2 + 1] >> 7;
1139 int U = (ubuf0[i] + ubuf1[i]) >> 8;
1140 int V = (vbuf0[i] + vbuf1[i]) >> 8;
1147 A1 = abuf0[i * 2 ] >> 7;
1148 A2 = abuf0[i * 2 + 1] >> 7;
1151 yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1152 r,
g,
b, y, target, hasAlpha);
1157 #define YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1158 static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
1159 const int16_t **lumSrc, int lumFilterSize, \
1160 const int16_t *chrFilter, const int16_t **chrUSrc, \
1161 const int16_t **chrVSrc, int chrFilterSize, \
1162 const int16_t **alpSrc, uint8_t *dest, int dstW, \
1165 name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
1166 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
1167 alpSrc, dest, dstW, y, fmt, hasAlpha); \
1169 #define YUV2RGBWRAPPER(name, base, ext, fmt, hasAlpha) \
1170 YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1171 static void name ## ext ## _2_c(SwsContext *c, const int16_t *buf[2], \
1172 const int16_t *ubuf[2], const int16_t *vbuf[2], \
1173 const int16_t *abuf[2], uint8_t *dest, int dstW, \
1174 int yalpha, int uvalpha, int y) \
1176 name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
1177 dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha); \
1180 static void name ## ext ## _1_c(SwsContext *c, const int16_t *buf0, \
1181 const int16_t *ubuf[2], const int16_t *vbuf[2], \
1182 const int16_t *abuf0, uint8_t *dest, int dstW, \
1183 int uvalpha, int y) \
1185 name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
1186 dstW, uvalpha, y, fmt, hasAlpha); \
1193 #if CONFIG_SWSCALE_ALPHA
1211 const int16_t **lumSrc,
int lumFilterSize,
1212 const int16_t *chrFilter, const int16_t **chrUSrc,
1213 const int16_t **chrVSrc,
int chrFilterSize,
1214 const int16_t **alpSrc, uint8_t *dest,
1220 for (i = 0; i <
dstW; i++) {
1228 for (j = 0; j < lumFilterSize; j++) {
1229 Y += lumSrc[j][i] * lumFilter[j];
1231 for (j = 0; j < chrFilterSize; j++) {
1232 U += chrUSrc[j][i] * chrFilter[j];
1233 V += chrVSrc[j][i] * chrFilter[j];
1240 for (j = 0; j < lumFilterSize; j++) {
1241 A += alpSrc[j][i] * lumFilter[j];
1245 A = av_clip_uint8(A);
1247 Y -= c->yuv2rgb_y_offset;
1248 Y *= c->yuv2rgb_y_coeff;
1250 R = Y + V*c->yuv2rgb_v2r_coeff;
1251 G = Y + V*c->yuv2rgb_v2g_coeff + U*c->yuv2rgb_u2g_coeff;
1252 B = Y + U*c->yuv2rgb_u2b_coeff;
1253 if ((R | G | B) & 0xC0000000) {
1254 R = av_clip_uintp2(R, 30);
1255 G = av_clip_uintp2(G, 30);
1256 B = av_clip_uintp2(B, 30);
1261 dest[0] = hasAlpha ? A : 255;
1275 dest[3] = hasAlpha ? A : 255;
1278 dest[0] = hasAlpha ? A : 255;
1293 dest[3] = hasAlpha ? A : 255;
1306 #if CONFIG_SWSCALE_ALPHA
1325 uint8_t *ptr = plane + stride*y;
1326 for (i=0; i<
height; i++) {
1327 memset(ptr, val, width);
1332 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
1334 #define r ((origin == PIX_FMT_BGR48BE || origin == PIX_FMT_BGR48LE) ? b_r : r_b)
1335 #define b ((origin == PIX_FMT_BGR48BE || origin == PIX_FMT_BGR48LE) ? r_b : b_r)
1342 for (i = 0; i <
width; i++) {
1353 const uint16_t *src1,
const uint16_t *src2,
1358 for (i = 0; i <
width; i++) {
1370 const uint16_t *src1,
const uint16_t *src2,
1375 for (i = 0; i <
width; i++) {
1389 #define rgb48funcs(pattern, BE_LE, origin) \
1390 static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, \
1391 int width, uint32_t *unused) \
1393 const uint16_t *src = (const uint16_t *) _src; \
1394 uint16_t *dst = (uint16_t *) _dst; \
1395 rgb48ToY_c_template(dst, src, width, origin); \
1398 static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
1399 const uint8_t *_src1, const uint8_t *_src2, \
1400 int width, uint32_t *unused) \
1402 const uint16_t *src1 = (const uint16_t *) _src1, \
1403 *src2 = (const uint16_t *) _src2; \
1404 uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
1405 rgb48ToUV_c_template(dstU, dstV, src1, src2, width, origin); \
1408 static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, \
1409 const uint8_t *_src1, const uint8_t *_src2, \
1410 int width, uint32_t *unused) \
1412 const uint16_t *src1 = (const uint16_t *) _src1, \
1413 *src2 = (const uint16_t *) _src2; \
1414 uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
1415 rgb48ToUV_half_c_template(dstU, dstV, src1, src2, width, origin); \
1423 #define input_pixel(i) ((origin == PIX_FMT_RGBA || origin == PIX_FMT_BGRA || \
1424 origin == PIX_FMT_ARGB || origin == PIX_FMT_ABGR) ? AV_RN32A(&src[(i)*4]) : \
1425 (isBE(origin) ? AV_RB16(&src[(i)*2]) : AV_RL16(&src[(i)*2])))
1428 rgb16_32ToY_c_template(uint8_t *dst,
const uint8_t *src,
1430 int shr,
int shg,
int shb,
int shp,
1431 int maskr,
int maskg,
int maskb,
1432 int rsh,
int gsh,
int bsh,
int S)
1434 const int ry =
RY << rsh, gy =
GY << gsh, by =
BY << bsh;
1435 const unsigned rnd = 33u << (S - 1);
1438 for (i = 0; i <
width; i++) {
1440 int b = (px & maskb) >> shb;
1441 int g = (px & maskg) >> shg;
1442 int r = (px & maskr) >> shr;
1444 dst[i] = (ry * r + gy * g + by * b + rnd) >> S;
1450 const uint8_t *src,
int width,
1452 int shr,
int shg,
int shb,
int shp,
1453 int maskr,
int maskg,
int maskb,
1454 int rsh,
int gsh,
int bsh,
int S)
1456 const int ru =
RU << rsh, gu =
GU << gsh, bu =
BU << bsh,
1457 rv =
RV << rsh, gv =
GV << gsh, bv =
BV << bsh;
1458 const unsigned rnd = 257u << (S - 1);
1461 for (i = 0; i <
width; i++) {
1463 int b = (px & maskb) >> shb;
1464 int g = (px & maskg) >> shg;
1465 int r = (px & maskr) >> shr;
1467 dstU[i] = (ru * r + gu * g + bu * b + rnd) >> S;
1468 dstV[i] = (rv * r + gv * g + bv * b + rnd) >> S;
1474 const uint8_t *src,
int width,
1476 int shr,
int shg,
int shb,
int shp,
1477 int maskr,
int maskg,
int maskb,
1478 int rsh,
int gsh,
int bsh,
int S)
1480 const int ru =
RU << rsh, gu =
GU << gsh, bu =
BU << bsh,
1481 rv =
RV << rsh, gv =
GV << gsh, bv =
BV << bsh,
1482 maskgx = ~(maskr | maskb);
1483 const unsigned rnd = 257u <<
S;
1486 maskr |= maskr << 1; maskb |= maskb << 1; maskg |= maskg << 1;
1487 for (i = 0; i <
width; i++) {
1490 int b,
r,
g = (px0 & maskgx) + (px1 & maskgx);
1491 int rb = px0 + px1 -
g;
1493 b = (rb & maskb) >> shb;
1498 g = (g & maskg) >> shg;
1500 r = (rb & maskr) >> shr;
1502 dstU[i] = (ru * r + gu * g + bu * b + rnd) >> (S + 1);
1503 dstV[i] = (rv * r + gv * g + bv * b + rnd) >> (S + 1);
1509 #define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr, \
1510 maskg, maskb, rsh, gsh, bsh, S) \
1511 static void name ## ToY_c(uint8_t *dst, const uint8_t *src, \
1512 int width, uint32_t *unused) \
1514 rgb16_32ToY_c_template(dst, src, width, fmt, shr, shg, shb, shp, \
1515 maskr, maskg, maskb, rsh, gsh, bsh, S); \
1518 static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
1519 const uint8_t *src, const uint8_t *dummy, \
1520 int width, uint32_t *unused) \
1522 rgb16_32ToUV_c_template(dstU, dstV, src, width, fmt, shr, shg, shb, shp, \
1523 maskr, maskg, maskb, rsh, gsh, bsh, S); \
1526 static void name ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV, \
1527 const uint8_t *src, const uint8_t *dummy, \
1528 int width, uint32_t *unused) \
1530 rgb16_32ToUV_half_c_template(dstU, dstV, src, width, fmt, shr, shg, shb, shp, \
1531 maskr, maskg, maskb, rsh, gsh, bsh, S); \
1534 rgb16_32_wrapper(
PIX_FMT_BGR32, bgr32, 16, 0, 0, 0, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8,
RGB2YUV_SHIFT+8)
1535 rgb16_32_wrapper(
PIX_FMT_BGR32_1,
bgr321, 16, 0, 0, 8, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8,
RGB2YUV_SHIFT+8)
1536 rgb16_32_wrapper(PIX_FMT_RGB32, rgb32, 0, 0, 16, 0, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8,
RGB2YUV_SHIFT+8)
1537 rgb16_32_wrapper(
PIX_FMT_RGB32_1,
rgb321, 0, 0, 16, 8, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8,
RGB2YUV_SHIFT+8)
1538 rgb16_32_wrapper(
PIX_FMT_BGR565LE, bgr16le, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0,
RGB2YUV_SHIFT+8)
1539 rgb16_32_wrapper(
PIX_FMT_BGR555LE,
bgr15le, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0,
RGB2YUV_SHIFT+7)
1540 rgb16_32_wrapper(
PIX_FMT_BGR444LE, bgr12le, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0,
RGB2YUV_SHIFT+4)
1541 rgb16_32_wrapper(
PIX_FMT_RGB565LE,
rgb16le, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11,
RGB2YUV_SHIFT+8)
1542 rgb16_32_wrapper(
PIX_FMT_RGB555LE, rgb15le, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10,
RGB2YUV_SHIFT+7)
1543 rgb16_32_wrapper(
PIX_FMT_RGB444LE,
rgb12le, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8,
RGB2YUV_SHIFT+4)
1544 rgb16_32_wrapper(
PIX_FMT_BGR565BE, bgr16be, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0,
RGB2YUV_SHIFT+8)
1545 rgb16_32_wrapper(
PIX_FMT_BGR555BE,
bgr15be, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0,
RGB2YUV_SHIFT+7)
1546 rgb16_32_wrapper(
PIX_FMT_BGR444BE, bgr12be, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0,
RGB2YUV_SHIFT+4)
1547 rgb16_32_wrapper(
PIX_FMT_RGB565BE,
rgb16be, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11,
RGB2YUV_SHIFT+8)
1548 rgb16_32_wrapper(
PIX_FMT_RGB555BE, rgb15be, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10,
RGB2YUV_SHIFT+7)
1549 rgb16_32_wrapper(
PIX_FMT_RGB444BE,
rgb12be, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8,
RGB2YUV_SHIFT+4)
1554 for (i=0; i<
width; i++) {
1562 for (i=0; i<
width; i++) {
1567 static void palToY_c(uint8_t *dst,
const uint8_t *src,
int width, uint32_t *pal)
1570 for (i=0; i<
width; i++) {
1573 dst[i]= pal[d] & 0xFF;
1578 const uint8_t *src1,
const uint8_t *src2,
1579 int width, uint32_t *pal)
1582 assert(src1 == src2);
1583 for (i=0; i<
width; i++) {
1584 int p= pal[src1[i]];
1592 int width, uint32_t *unused)
1595 for (i=0; i<width/8; i++) {
1598 dst[8*i+j]= ((d>>(7-j))&1)*255;
1603 int width, uint32_t *unused)
1606 for (i=0; i<width/8; i++) {
1609 dst[8*i+j]= ((d>>(7-j))&1)*255;
1619 for (i=0; i<
width; i++)
1623 static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV,
const uint8_t *src1,
1624 const uint8_t *src2,
int width, uint32_t *unused)
1627 for (i=0; i<
width; i++) {
1628 dstU[i]= src1[4*i + 1];
1629 dstV[i]= src1[4*i + 3];
1631 assert(src1 == src2);
1637 const uint16_t *src = (
const uint16_t *) _src;
1638 uint16_t *dst = (uint16_t *) _dst;
1639 for (i=0; i<
width; i++) {
1644 static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV,
const uint8_t *_src1,
1645 const uint8_t *_src2,
int width, uint32_t *unused)
1648 const uint16_t *src1 = (
const uint16_t *) _src1,
1649 *src2 = (
const uint16_t *) _src2;
1650 uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV;
1651 for (i=0; i<
width; i++) {
1663 for (i=0; i<
width; i++)
1667 static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV,
const uint8_t *src1,
1668 const uint8_t *src2,
int width, uint32_t *unused)
1671 for (i=0; i<
width; i++) {
1672 dstU[i]= src1[4*i + 0];
1673 dstV[i]= src1[4*i + 2];
1675 assert(src1 == src2);
1679 const uint8_t *src,
int width)
1682 for (i = 0; i <
width; i++) {
1683 dst1[i] = src[2*i+0];
1684 dst2[i] = src[2*i+1];
1689 const uint8_t *src1,
const uint8_t *src2,
1690 int width, uint32_t *unused)
1696 const uint8_t *src1,
const uint8_t *src2,
1697 int width, uint32_t *unused)
1702 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
1705 int width, uint32_t *unused)
1708 for (i=0; i<
width; i++) {
1717 static void bgr24ToUV_c(uint8_t *dstU, uint8_t *dstV,
const uint8_t *src1,
1718 const uint8_t *src2,
int width, uint32_t *unused)
1721 for (i=0; i<
width; i++) {
1722 int b= src1[3*i + 0];
1723 int g= src1[3*i + 1];
1724 int r= src1[3*i + 2];
1729 assert(src1 == src2);
1733 const uint8_t *src2,
int width, uint32_t *unused)
1736 for (i=0; i<
width; i++) {
1737 int b= src1[6*i + 0] + src1[6*i + 3];
1738 int g= src1[6*i + 1] + src1[6*i + 4];
1739 int r= src1[6*i + 2] + src1[6*i + 5];
1744 assert(src1 == src2);
1751 for (i=0; i<
width; i++) {
1760 static void rgb24ToUV_c(uint8_t *dstU, uint8_t *dstV,
const uint8_t *src1,
1761 const uint8_t *src2,
int width, uint32_t *unused)
1765 for (i=0; i<
width; i++) {
1766 int r= src1[3*i + 0];
1767 int g= src1[3*i + 1];
1768 int b= src1[3*i + 2];
1776 const uint8_t *src2,
int width, uint32_t *unused)
1780 for (i=0; i<
width; i++) {
1781 int r= src1[6*i + 0] + src1[6*i + 3];
1782 int g= src1[6*i + 1] + src1[6*i + 4];
1783 int b= src1[6*i + 2] + src1[6*i + 5];
1793 for (i = 0; i <
width; i++) {
1805 const uint16_t **src = (
const uint16_t **) _src;
1806 uint16_t *dst = (uint16_t *) _dst;
1807 for (i = 0; i <
width; i++) {
1819 const uint16_t **src = (
const uint16_t **) _src;
1820 uint16_t *dst = (uint16_t *) _dst;
1821 for (i = 0; i <
width; i++) {
1833 for (i = 0; i <
width; i++) {
1846 const uint16_t **src = (
const uint16_t **) _src;
1847 uint16_t *dstU = (uint16_t *) _dstU;
1848 uint16_t *dstV = (uint16_t *) _dstV;
1849 for (i = 0; i <
width; i++) {
1862 const uint16_t **src = (
const uint16_t **) _src;
1863 uint16_t *dstU = (uint16_t *) _dstU;
1864 uint16_t *dstV = (uint16_t *) _dstV;
1865 for (i = 0; i <
width; i++) {
1877 const int32_t *filterPos,
int filterSize)
1880 int32_t *dst = (int32_t *) _dst;
1881 const uint16_t *src = (
const uint16_t *) _src;
1885 for (i = 0; i <
dstW; i++) {
1887 int srcPos = filterPos[i];
1890 for (j = 0; j < filterSize; j++) {
1891 val += src[srcPos + j] * filter[filterSize * i + j];
1894 dst[i] =
FFMIN(val >> sh, (1 << 19) - 1);
1900 const int32_t *filterPos,
int filterSize)
1903 const uint16_t *src = (
const uint16_t *) _src;
1906 for (i = 0; i <
dstW; i++) {
1908 int srcPos = filterPos[i];
1911 for (j = 0; j < filterSize; j++) {
1912 val += src[srcPos + j] * filter[filterSize * i + j];
1915 dst[i] =
FFMIN(val >> sh, (1 << 15) - 1);
1921 const int16_t *
filter,
const int32_t *filterPos,
1925 for (i=0; i<
dstW; i++) {
1927 int srcPos= filterPos[i];
1929 for (j=0; j<filterSize; j++) {
1930 val += ((int)src[srcPos + j])*filter[filterSize*i + j];
1933 dst[i] =
FFMIN(val>>7, (1<<15)-1);
1939 const int16_t *
filter,
const int32_t *filterPos,
1943 int32_t *dst = (int32_t *) _dst;
1944 for (i=0; i<
dstW; i++) {
1946 int srcPos= filterPos[i];
1948 for (j=0; j<filterSize; j++) {
1949 val += ((int)src[srcPos + j])*filter[filterSize*i + j];
1952 dst[i] =
FFMIN(val>>3, (1<<19)-1);
1962 for (i = 0; i <
width; i++) {
1963 dstU[i] = (
FFMIN(dstU[i],30775)*4663 - 9289992)>>12;
1964 dstV[i] = (
FFMIN(dstV[i],30775)*4663 - 9289992)>>12;
1970 for (i = 0; i <
width; i++) {
1971 dstU[i] = (dstU[i]*1799 + 4081085)>>11;
1972 dstV[i] = (dstV[i]*1799 + 4081085)>>11;
1978 for (i = 0; i <
width; i++)
1979 dst[i] = (
FFMIN(dst[i],30189)*19077 - 39057361)>>14;
1984 for (i = 0; i <
width; i++)
1985 dst[i] = (dst[i]*14071 + 33561947)>>14;
1991 int32_t *dstU = (int32_t *) _dstU;
1992 int32_t *dstV = (int32_t *) _dstV;
1993 for (i = 0; i <
width; i++) {
1994 dstU[i] = (
FFMIN(dstU[i],30775<<4)*4663 - (9289992<<4))>>12;
1995 dstV[i] = (
FFMIN(dstV[i],30775<<4)*4663 - (9289992<<4))>>12;
2001 int32_t *dstU = (int32_t *) _dstU;
2002 int32_t *dstV = (int32_t *) _dstV;
2003 for (i = 0; i <
width; i++) {
2004 dstU[i] = (dstU[i]*1799 + (4081085<<4))>>11;
2005 dstV[i] = (dstV[i]*1799 + (4081085<<4))>>11;
2011 int32_t *dst = (int32_t *) _dst;
2012 for (i = 0; i <
width; i++)
2013 dst[i] = (
FFMIN(dst[i],30189<<4)*4769 - (39057361<<2))>>12;
2018 int32_t *dst = (int32_t *) _dst;
2019 for (i = 0; i <
width; i++)
2020 dst[i] = (dst[i]*14071 + (33561947<<4))>>14;
2024 const uint8_t *src,
int srcW,
int xInc)
2027 unsigned int xpos=0;
2028 for (i=0;i<dstWidth;i++) {
2029 register unsigned int xx=xpos>>16;
2030 register unsigned int xalpha=(xpos&0xFFFF)>>9;
2031 dst[i]= (src[xx]<<7) + (src[xx+1] - src[xx])*xalpha;
2038 const uint8_t *src_in[4],
int srcW,
int xInc,
2042 uint32_t *pal,
int isAlpha)
2046 const uint8_t *src = src_in[isAlpha ? 3 : 0];
2049 toYV12(formatConvBuffer, src, srcW, pal);
2057 c->
hyScale(c, dst, dstWidth, src, hLumFilter, hLumFilterPos, hLumFilterSize);
2063 convertRange(dst, dstWidth);
2067 int dstWidth,
const uint8_t *src1,
2068 const uint8_t *src2,
int srcW,
int xInc)
2071 unsigned int xpos=0;
2072 for (i=0;i<dstWidth;i++) {
2073 register unsigned int xx=xpos>>16;
2074 register unsigned int xalpha=(xpos&0xFFFF)>>9;
2075 dst1[i]=(src1[xx]*(xalpha^127)+src1[xx+1]*xalpha);
2076 dst2[i]=(src2[xx]*(xalpha^127)+src2[xx+1]*xalpha);
2082 const uint8_t *src_in[4],
2087 const uint8_t *src1 = src_in[1], *src2 = src_in[2];
2090 c->
chrToYV12(formatConvBuffer, buf2, src1, src2, srcW, pal);
2101 c->
hcScale(c, dst1, dstWidth, src1, hChrFilter, hChrFilterPos, hChrFilterSize);
2102 c->
hcScale(c, dst2, dstWidth, src2, hChrFilter, hChrFilterPos, hChrFilterSize);
2104 c->
hcscale_fast(c, dst1, dst2, dstWidth, src1, src2, srcW, xInc);
2121 *yuv2planeX =
isBE(dstFormat) ? yuv2planeX_16BE_c : yuv2planeX_16LE_c;
2122 *yuv2plane1 =
isBE(dstFormat) ? yuv2plane1_16BE_c : yuv2plane1_16LE_c;
2125 *yuv2planeX =
isBE(dstFormat) ? yuv2planeX_9BE_c : yuv2planeX_9LE_c;
2126 *yuv2plane1 =
isBE(dstFormat) ? yuv2plane1_9BE_c : yuv2plane1_9LE_c;
2128 *yuv2planeX =
isBE(dstFormat) ? yuv2planeX_10BE_c : yuv2planeX_10LE_c;
2129 *yuv2plane1 =
isBE(dstFormat) ? yuv2plane1_10BE_c : yuv2plane1_10LE_c;
2133 *yuv2planeX = yuv2planeX_8_c;
2139 switch (dstFormat) {
2142 *yuv2packedX = yuv2rgba32_full_X_c;
2144 #if CONFIG_SWSCALE_ALPHA
2146 *yuv2packedX = yuv2rgba32_full_X_c;
2150 *yuv2packedX = yuv2rgbx32_full_X_c;
2156 *yuv2packedX = yuv2argb32_full_X_c;
2158 #if CONFIG_SWSCALE_ALPHA
2160 *yuv2packedX = yuv2argb32_full_X_c;
2164 *yuv2packedX = yuv2xrgb32_full_X_c;
2170 *yuv2packedX = yuv2bgra32_full_X_c;
2172 #if CONFIG_SWSCALE_ALPHA
2174 *yuv2packedX = yuv2bgra32_full_X_c;
2178 *yuv2packedX = yuv2bgrx32_full_X_c;
2184 *yuv2packedX = yuv2abgr32_full_X_c;
2186 #if CONFIG_SWSCALE_ALPHA
2188 *yuv2packedX = yuv2abgr32_full_X_c;
2192 *yuv2packedX = yuv2xbgr32_full_X_c;
2197 *yuv2packedX = yuv2rgb24_full_X_c;
2200 *yuv2packedX = yuv2bgr24_full_X_c;
2204 switch (dstFormat) {
2206 *yuv2packed1 = yuv2rgb48le_1_c;
2207 *yuv2packed2 = yuv2rgb48le_2_c;
2208 *yuv2packedX = yuv2rgb48le_X_c;
2211 *yuv2packed1 = yuv2rgb48be_1_c;
2212 *yuv2packed2 = yuv2rgb48be_2_c;
2213 *yuv2packedX = yuv2rgb48be_X_c;
2216 *yuv2packed1 = yuv2bgr48le_1_c;
2217 *yuv2packed2 = yuv2bgr48le_2_c;
2218 *yuv2packedX = yuv2bgr48le_X_c;
2221 *yuv2packed1 = yuv2bgr48be_1_c;
2222 *yuv2packed2 = yuv2bgr48be_2_c;
2223 *yuv2packedX = yuv2bgr48be_X_c;
2228 *yuv2packed1 = yuv2rgb32_1_c;
2229 *yuv2packed2 = yuv2rgb32_2_c;
2230 *yuv2packedX = yuv2rgb32_X_c;
2232 #if CONFIG_SWSCALE_ALPHA
2234 *yuv2packed1 = yuv2rgba32_1_c;
2235 *yuv2packed2 = yuv2rgba32_2_c;
2236 *yuv2packedX = yuv2rgba32_X_c;
2240 *yuv2packed1 = yuv2rgbx32_1_c;
2241 *yuv2packed2 = yuv2rgbx32_2_c;
2242 *yuv2packedX = yuv2rgbx32_X_c;
2249 *yuv2packed1 = yuv2rgb32_1_1_c;
2250 *yuv2packed2 = yuv2rgb32_1_2_c;
2251 *yuv2packedX = yuv2rgb32_1_X_c;
2253 #if CONFIG_SWSCALE_ALPHA
2255 *yuv2packed1 = yuv2rgba32_1_1_c;
2256 *yuv2packed2 = yuv2rgba32_1_2_c;
2257 *yuv2packedX = yuv2rgba32_1_X_c;
2261 *yuv2packed1 = yuv2rgbx32_1_1_c;
2262 *yuv2packed2 = yuv2rgbx32_1_2_c;
2263 *yuv2packedX = yuv2rgbx32_1_X_c;
2268 *yuv2packed1 = yuv2rgb24_1_c;
2269 *yuv2packed2 = yuv2rgb24_2_c;
2270 *yuv2packedX = yuv2rgb24_X_c;
2273 *yuv2packed1 = yuv2bgr24_1_c;
2274 *yuv2packed2 = yuv2bgr24_2_c;
2275 *yuv2packedX = yuv2bgr24_X_c;
2281 *yuv2packed1 = yuv2rgb16_1_c;
2282 *yuv2packed2 = yuv2rgb16_2_c;
2283 *yuv2packedX = yuv2rgb16_X_c;
2289 *yuv2packed1 = yuv2rgb15_1_c;
2290 *yuv2packed2 = yuv2rgb15_2_c;
2291 *yuv2packedX = yuv2rgb15_X_c;
2297 *yuv2packed1 = yuv2rgb12_1_c;
2298 *yuv2packed2 = yuv2rgb12_2_c;
2299 *yuv2packedX = yuv2rgb12_X_c;
2303 *yuv2packed1 = yuv2rgb8_1_c;
2304 *yuv2packed2 = yuv2rgb8_2_c;
2305 *yuv2packedX = yuv2rgb8_X_c;
2309 *yuv2packed1 = yuv2rgb4_1_c;
2310 *yuv2packed2 = yuv2rgb4_2_c;
2311 *yuv2packedX = yuv2rgb4_X_c;
2315 *yuv2packed1 = yuv2rgb4b_1_c;
2316 *yuv2packed2 = yuv2rgb4b_2_c;
2317 *yuv2packedX = yuv2rgb4b_X_c;
2321 switch (dstFormat) {
2323 *yuv2packed1 = yuv2gray16BE_1_c;
2324 *yuv2packed2 = yuv2gray16BE_2_c;
2325 *yuv2packedX = yuv2gray16BE_X_c;
2328 *yuv2packed1 = yuv2gray16LE_1_c;
2329 *yuv2packed2 = yuv2gray16LE_2_c;
2330 *yuv2packedX = yuv2gray16LE_X_c;
2333 *yuv2packed1 = yuv2monowhite_1_c;
2334 *yuv2packed2 = yuv2monowhite_2_c;
2335 *yuv2packedX = yuv2monowhite_X_c;
2338 *yuv2packed1 = yuv2monoblack_1_c;
2339 *yuv2packed2 = yuv2monoblack_2_c;
2340 *yuv2packedX = yuv2monoblack_X_c;
2343 *yuv2packed1 = yuv2yuyv422_1_c;
2344 *yuv2packed2 = yuv2yuyv422_2_c;
2345 *yuv2packedX = yuv2yuyv422_X_c;
2348 *yuv2packed1 = yuv2uyvy422_1_c;
2349 *yuv2packed2 = yuv2uyvy422_2_c;
2350 *yuv2packedX = yuv2uyvy422_X_c;
2355 #define DEBUG_SWSCALE_BUFFERS 0
2356 #define DEBUG_BUFFERS(...) if (DEBUG_SWSCALE_BUFFERS) av_log(c, AV_LOG_DEBUG, __VA_ARGS__)
2359 int srcStride[],
int srcSliceY,
2360 int srcSliceH, uint8_t* dst[],
int dstStride[])
2421 srcStride[3]= srcStride[0];
2426 DEBUG_BUFFERS(
"swScale() %p[%d] %p[%d] %p[%d] %p[%d] -> %p[%d] %p[%d] %p[%d] %p[%d]\n",
2427 src[0], srcStride[0], src[1], srcStride[1], src[2], srcStride[2], src[3], srcStride[3],
2428 dst[0], dstStride[0], dst[1], dstStride[1], dst[2], dstStride[2], dst[3], dstStride[3]);
2429 DEBUG_BUFFERS(
"srcSliceY: %d srcSliceH: %d dstY: %d dstH: %d\n",
2430 srcSliceY, srcSliceH, dstY, dstH);
2431 DEBUG_BUFFERS(
"vLumFilterSize: %d vLumBufSize: %d vChrFilterSize: %d vChrBufSize: %d\n",
2432 vLumFilterSize, vLumBufSize, vChrFilterSize, vChrBufSize);
2434 if (dstStride[0]%8 !=0 || dstStride[1]%8 !=0 || dstStride[2]%8 !=0 || dstStride[3]%8 != 0) {
2435 static int warnedAlready=0;
2438 " ->cannot do aligned memory accesses anymore\n");
2446 if (srcSliceY ==0) {
2454 if (!should_dither) {
2459 for (;dstY <
dstH; dstY++) {
2461 uint8_t *dest[4] = {
2462 dst[0] + dstStride[0] *
dstY,
2463 dst[1] + dstStride[1] * chrDstY,
2464 dst[2] + dstStride[2] * chrDstY,
2468 const int firstLumSrcY= vLumFilterPos[
dstY];
2470 const int firstChrSrcY= vChrFilterPos[chrDstY];
2473 int lastLumSrcY =
FFMIN(c->
srcH, firstLumSrcY + vLumFilterSize) - 1;
2474 int lastLumSrcY2 =
FFMIN(c->
srcH, firstLumSrcY2 + vLumFilterSize) - 1;
2475 int lastChrSrcY =
FFMIN(c->
chrSrcH, firstChrSrcY + vChrFilterSize) - 1;
2479 if (firstLumSrcY > lastInLumBuf) lastInLumBuf= firstLumSrcY-1;
2480 if (firstChrSrcY > lastInChrBuf) lastInChrBuf= firstChrSrcY-1;
2481 assert(firstLumSrcY >= lastInLumBuf - vLumBufSize + 1);
2482 assert(firstChrSrcY >= lastInChrBuf - vChrBufSize + 1);
2485 DEBUG_BUFFERS(
"\tfirstLumSrcY: %d lastLumSrcY: %d lastInLumBuf: %d\n",
2486 firstLumSrcY, lastLumSrcY, lastInLumBuf);
2487 DEBUG_BUFFERS(
"\tfirstChrSrcY: %d lastChrSrcY: %d lastInChrBuf: %d\n",
2488 firstChrSrcY, lastChrSrcY, lastInChrBuf);
2491 enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH && lastChrSrcY < -((-srcSliceY - srcSliceH)>>c->
chrSrcVSubSample);
2493 if (!enough_lines) {
2494 lastLumSrcY = srcSliceY + srcSliceH - 1;
2495 lastChrSrcY = chrSrcSliceY + chrSrcSliceH - 1;
2496 DEBUG_BUFFERS(
"buffering slice: lastLumSrcY %d lastChrSrcY %d\n",
2497 lastLumSrcY, lastChrSrcY);
2501 while(lastInLumBuf < lastLumSrcY) {
2502 const uint8_t *src1[4] = {
2503 src[0] + (lastInLumBuf + 1 - srcSliceY) * srcStride[0],
2504 src[1] + (lastInLumBuf + 1 - srcSliceY) * srcStride[1],
2505 src[2] + (lastInLumBuf + 1 - srcSliceY) * srcStride[2],
2506 src[3] + (lastInLumBuf + 1 - srcSliceY) * srcStride[3],
2509 assert(lumBufIndex < 2*vLumBufSize);
2510 assert(lastInLumBuf + 1 - srcSliceY < srcSliceH);
2511 assert(lastInLumBuf + 1 - srcSliceY >= 0);
2512 hyscale(c, lumPixBuf[ lumBufIndex ], dstW, src1, srcW, lumXInc,
2513 hLumFilter, hLumFilterPos, hLumFilterSize,
2517 hyscale(c, alpPixBuf[ lumBufIndex ], dstW, src1, srcW,
2518 lumXInc, hLumFilter, hLumFilterPos, hLumFilterSize,
2523 lumBufIndex, lastInLumBuf);
2525 while(lastInChrBuf < lastChrSrcY) {
2526 const uint8_t *src1[4] = {
2527 src[0] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[0],
2528 src[1] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[1],
2529 src[2] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[2],
2530 src[3] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[3],
2533 assert(chrBufIndex < 2*vChrBufSize);
2534 assert(lastInChrBuf + 1 - chrSrcSliceY < (chrSrcSliceH));
2535 assert(lastInChrBuf + 1 - chrSrcSliceY >= 0);
2539 hcscale(c, chrUPixBuf[chrBufIndex], chrVPixBuf[chrBufIndex],
2540 chrDstW, src1, chrSrcW, chrXInc,
2541 hChrFilter, hChrFilterPos, hChrFilterSize,
2542 formatConvBuffer, pal);
2545 chrBufIndex, lastInChrBuf);
2548 if (lumBufIndex >= vLumBufSize) lumBufIndex-=
vLumBufSize;
2549 if (chrBufIndex >= vChrBufSize) chrBufIndex-=
vChrBufSize;
2556 if (should_dither) {
2560 if (dstY >= dstH-2) {
2563 &yuv2packed1, &yuv2packed2, &yuv2packedX);
2567 const int16_t **lumSrcPtr= (
const int16_t **) lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize;
2568 const int16_t **chrUSrcPtr= (
const int16_t **) chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
2569 const int16_t **chrVSrcPtr= (
const int16_t **) chrVPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
2572 if (firstLumSrcY < 0 || firstLumSrcY + vLumFilterSize > c->
srcH) {
2573 const int16_t **tmpY = (
const int16_t **) lumPixBuf + 2 * vLumBufSize;
2574 int neg = -firstLumSrcY, i, end =
FFMIN(c->
srcH - firstLumSrcY, vLumFilterSize);
2575 for (i = 0; i < neg; i++)
2576 tmpY[i] = lumSrcPtr[neg];
2577 for ( ; i < end; i++)
2578 tmpY[i] = lumSrcPtr[i];
2580 tmpY[i] = tmpY[i-1];
2584 const int16_t **tmpA = (
const int16_t **) alpPixBuf + 2 * vLumBufSize;
2585 for (i = 0; i < neg; i++)
2586 tmpA[i] = alpSrcPtr[neg];
2587 for ( ; i < end; i++)
2588 tmpA[i] = alpSrcPtr[i];
2590 tmpA[i] = tmpA[i - 1];
2594 if (firstChrSrcY < 0 || firstChrSrcY + vChrFilterSize > c->
chrSrcH) {
2595 const int16_t **tmpU = (
const int16_t **) chrUPixBuf + 2 * vChrBufSize,
2596 **tmpV = (
const int16_t **) chrVPixBuf + 2 *
vChrBufSize;
2597 int neg = -firstChrSrcY, i, end =
FFMIN(c->
chrSrcH - firstChrSrcY, vChrFilterSize);
2598 for (i = 0; i < neg; i++) {
2599 tmpU[i] = chrUSrcPtr[neg];
2600 tmpV[i] = chrVSrcPtr[neg];
2602 for ( ; i < end; i++) {
2603 tmpU[i] = chrUSrcPtr[i];
2604 tmpV[i] = chrVSrcPtr[i];
2607 tmpU[i] = tmpU[i - 1];
2608 tmpV[i] = tmpV[i - 1];
2617 if (vLumFilterSize == 1) {
2620 yuv2planeX(vLumFilter + dstY * vLumFilterSize, vLumFilterSize,
2624 if (!((dstY&chrSkipMask) ||
isGray(dstFormat))) {
2626 yuv2nv12cX(c, vChrFilter + chrDstY * vChrFilterSize, vChrFilterSize, chrUSrcPtr, chrVSrcPtr, dest[1], chrDstW);
2627 }
else if (vChrFilterSize == 1) {
2631 yuv2planeX(vChrFilter + chrDstY * vChrFilterSize, vChrFilterSize,
2632 chrUSrcPtr, dest[1], chrDstW, c->
chrDither8, 0);
2633 yuv2planeX(vChrFilter + chrDstY * vChrFilterSize, vChrFilterSize,
2634 chrVSrcPtr, dest[2], chrDstW, c->
chrDither8, 3);
2639 if (vLumFilterSize == 1) {
2642 yuv2planeX(vLumFilter + dstY * vLumFilterSize, vLumFilterSize,
2647 if (c->
yuv2packed1 && vLumFilterSize == 1 && vChrFilterSize == 2) {
2648 int chrAlpha = vChrFilter[2 * dstY + 1];
2649 yuv2packed1(c, *lumSrcPtr, chrUSrcPtr, chrVSrcPtr,
2650 alpPixBuf ? *alpSrcPtr : NULL,
2651 dest[0], dstW, chrAlpha, dstY);
2652 }
else if (c->
yuv2packed2 && vLumFilterSize == 2 && vChrFilterSize == 2) {
2653 int lumAlpha = vLumFilter[2 * dstY + 1];
2654 int chrAlpha = vChrFilter[2 * dstY + 1];
2656 lumMmxFilter[3] = vLumFilter[2 *
dstY ] * 0x10001;
2658 chrMmxFilter[3] = vChrFilter[2 * chrDstY] * 0x10001;
2660 alpPixBuf ? alpSrcPtr : NULL,
2661 dest[0], dstW, lumAlpha, chrAlpha, dstY);
2663 yuv2packedX(c, vLumFilter + dstY * vLumFilterSize,
2664 lumSrcPtr, vLumFilterSize,
2665 vChrFilter + dstY * vChrFilterSize,
2666 chrUSrcPtr, chrVSrcPtr, vChrFilterSize,
2667 alpSrcPtr, dest[0], dstW, dstY);
2674 fillPlane(dst[3], dstStride[3], dstW, dstY-lastDstY, lastDstY, 255);
2678 __asm__
volatile(
"sfence":::
"memory");
2689 return dstY - lastDstY;
2746 case PIX_FMT_RGB32 : c->
chrToYV12 = bgr32ToUV_half_c;
break;
2771 case PIX_FMT_RGB32 : c->
chrToYV12 = bgr32ToUV_c;
break;
2794 switch (srcFormat) {
2849 case PIX_FMT_RGB32 : c->
lumToYV12 = bgr32ToY_c;
break;
2859 switch (srcFormat) {