38 { 0, 1, 0, 1, 0, 1, 0, 1,},
39 { 1, 0, 1, 0, 1, 0, 1, 0,},
40 { 0, 1, 0, 1, 0, 1, 0, 1,},
41 { 1, 0, 1, 0, 1, 0, 1, 0,},
42 { 0, 1, 0, 1, 0, 1, 0, 1,},
43 { 1, 0, 1, 0, 1, 0, 1, 0,},
44 { 0, 1, 0, 1, 0, 1, 0, 1,},
45 { 1, 0, 1, 0, 1, 0, 1, 0,},
48 { 1, 2, 1, 2, 1, 2, 1, 2,},
49 { 3, 0, 3, 0, 3, 0, 3, 0,},
50 { 1, 2, 1, 2, 1, 2, 1, 2,},
51 { 3, 0, 3, 0, 3, 0, 3, 0,},
52 { 1, 2, 1, 2, 1, 2, 1, 2,},
53 { 3, 0, 3, 0, 3, 0, 3, 0,},
54 { 1, 2, 1, 2, 1, 2, 1, 2,},
55 { 3, 0, 3, 0, 3, 0, 3, 0,},
58 { 18, 34, 30, 46, 17, 33, 29, 45,},
59 { 50, 2, 62, 14, 49, 1, 61, 13,},
60 { 26, 42, 22, 38, 25, 41, 21, 37,},
61 { 58, 10, 54, 6, 57, 9, 53, 5,},
62 { 16, 32, 28, 44, 19, 35, 31, 47,},
63 { 48, 0, 60, 12, 51, 3, 63, 15,},
64 { 24, 40, 20, 36, 27, 43, 23, 39,},
65 { 56, 8, 52, 4, 59, 11, 55, 7,},
69 { 72, 136, 120, 184, 68, 132, 116, 180,},
70 { 200, 8, 248, 56, 196, 4, 244, 52,},
71 { 104, 168, 88, 152, 100, 164, 84, 148,},
72 { 232, 40, 216, 24, 228, 36, 212, 20,},
73 { 64, 128, 102, 176, 76, 140, 124, 188,},
74 { 192, 0, 240, 48, 204, 12, 252, 60,},
75 { 96, 160, 80, 144, 108, 172, 92, 156,},
76 { 224, 32, 208, 16, 236, 44, 220, 28,},
79 #define RGB2YUV_SHIFT 15
80 #define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
81 #define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
82 #define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
83 #define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
84 #define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
85 #define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
86 #define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
87 #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
88 #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
94 uint8_t *ptr = plane + stride * y;
95 for (i = 0; i <
height; i++) {
96 memset(ptr, val, width);
103 const int dst_depth,
const int big_endian)
106 uint16_t *dst = (uint16_t *) (plane + stride * y);
107 #define FILL8TO9_OR_10(wfunc) \
108 for (i = 0; i < height; i++) { \
109 for (j = 0; j < width; j++) { \
110 wfunc(&dst[j], (val << (dst_depth - 8)) | \
111 (val >> (16 - dst_depth))); \
123 int srcSliceY,
int srcSliceH,
int width,
126 dst += dstStride * srcSliceY;
127 if (dstStride == srcStride && srcStride > 0) {
128 memcpy(dst, src, srcSliceH * dstStride);
131 for (i = 0; i < srcSliceH; i++) {
132 memcpy(dst, src, width);
140 int srcStride[],
int srcSliceY,
141 int srcSliceH,
uint8_t *dstParam[],
144 uint8_t *dst = dstParam[1] + dstStride[1] * srcSliceY / 2;
146 copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->
srcW,
147 dstParam[0], dstStride[0]);
151 srcStride[1], srcStride[2], dstStride[0]);
154 srcStride[2], srcStride[1], dstStride[0]);
160 int srcStride[],
int srcSliceY,
int srcSliceH,
161 uint8_t *dstParam[],
int dstStride[])
163 uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
165 yv12toyuy2(src[0], src[1], src[2], dst, c->
srcW, srcSliceH, srcStride[0],
166 srcStride[1], dstStride[0]);
172 int srcStride[],
int srcSliceY,
int srcSliceH,
173 uint8_t *dstParam[],
int dstStride[])
175 uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
177 yv12touyvy(src[0], src[1], src[2], dst, c->
srcW, srcSliceH, srcStride[0],
178 srcStride[1], dstStride[0]);
184 int srcStride[],
int srcSliceY,
int srcSliceH,
185 uint8_t *dstParam[],
int dstStride[])
187 uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
190 srcStride[1], dstStride[0]);
196 int srcStride[],
int srcSliceY,
int srcSliceH,
197 uint8_t *dstParam[],
int dstStride[])
199 uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
202 srcStride[1], dstStride[0]);
208 int srcStride[],
int srcSliceY,
int srcSliceH,
209 uint8_t *dstParam[],
int dstStride[])
211 uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
212 uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY / 2;
213 uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY / 2;
216 dstStride[1], srcStride[0]);
219 fillPlane(dstParam[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
225 int srcStride[],
int srcSliceY,
int srcSliceH,
226 uint8_t *dstParam[],
int dstStride[])
228 uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
229 uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY;
230 uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY;
233 dstStride[1], srcStride[0]);
239 int srcStride[],
int srcSliceY,
int srcSliceH,
240 uint8_t *dstParam[],
int dstStride[])
242 uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
243 uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY / 2;
244 uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY / 2;
247 dstStride[1], srcStride[0]);
250 fillPlane(dstParam[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
256 int srcStride[],
int srcSliceY,
int srcSliceH,
257 uint8_t *dstParam[],
int dstStride[])
259 uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
260 uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY;
261 uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY;
264 dstStride[1], srcStride[0]);
273 for (i = 0; i < num_pixels; i++)
274 ((uint32_t *) dst)[i] = ((
const uint32_t *) palette)[src[i << 1]] | (src[(i << 1) + 1] << 24);
282 for (i = 0; i < num_pixels; i++)
283 ((uint32_t *) dst)[i] = ((
const uint32_t *) palette)[src[i << 1]] | src[(i << 1) + 1];
291 for (i = 0; i < num_pixels; i++) {
293 dst[0] = palette[src[i << 1] * 4 + 0];
294 dst[1] = palette[src[i << 1] * 4 + 1];
295 dst[2] = palette[src[i << 1] * 4 + 2];
301 int srcStride[],
int srcSliceY,
int srcSliceH,
302 uint8_t *dst[],
int dstStride[])
305 int srcstr = srcStride[0] >> 1;
306 int dststr = dstStride[0] >> 1;
307 uint16_t *dstPtr = (uint16_t *) dst[0];
308 const uint16_t *srcPtr = (
const uint16_t *) src[0];
309 int min_stride =
FFMIN(srcstr, dststr);
311 for (i = 0; i < srcSliceH; i++) {
312 for (j = 0; j < min_stride; j++) {
323 int srcSliceY,
int srcSliceH,
uint8_t *dst[],
331 uint8_t *dstPtr = dst[0] + dstStride[0] * srcSliceY;
332 const uint8_t *srcPtr = src[0];
343 }
else if (
usePal(srcFormat)) {
358 for (i = 0; i < srcSliceH; i++) {
360 srcPtr += srcStride[0];
361 dstPtr += dstStride[0];
369 uint8_t *dst,
int dstStride,
int srcSliceH,
373 for (h = 0; h < srcSliceH; h++) {
374 uint8_t *dest = dst + dstStride * h;
375 for (x = 0; x <
width; x++) {
381 for (i = 0; i < 3; i++)
382 src[i] += srcStride[i];
387 uint8_t *dst,
int dstStride,
int srcSliceH,
388 int alpha_first,
int width)
391 for (h = 0; h < srcSliceH; h++) {
392 uint8_t *dest = dst + dstStride * h;
395 for (x = 0; x <
width; x++) {
402 for (x = 0; x <
width; x++) {
410 for (i = 0; i < 3; i++)
411 src[i] += srcStride[i];
416 int srcStride[],
int srcSliceY,
int srcSliceH,
417 uint8_t *dst[],
int dstStride[])
420 const uint8_t *src102[] = { src[1], src[0], src[2] };
421 const uint8_t *src201[] = { src[2], src[0], src[1] };
422 int stride102[] = { srcStride[1], srcStride[0], srcStride[2] };
423 int stride201[] = { srcStride[2], srcStride[0], srcStride[1] };
435 dst[0] + srcSliceY * dstStride[0], dstStride[0],
441 dst[0] + srcSliceY * dstStride[0], dstStride[0],
449 dst[0] + srcSliceY * dstStride[0], dstStride[0],
450 srcSliceH, alpha_first, c->
srcW);
457 dst[0] + srcSliceY * dstStride[0], dstStride[0],
458 srcSliceH, alpha_first, c->
srcW);
463 "unsupported planar RGB conversion %s -> %s\n",
471 #define isRGBA32(x) ( \
472 (x) == AV_PIX_FMT_ARGB \
473 || (x) == AV_PIX_FMT_RGBA \
474 || (x) == AV_PIX_FMT_BGRA \
475 || (x) == AV_PIX_FMT_ABGR \
490 #define IS_NOT_NE(bpp, desc) \
491 (((bpp + 7) >> 3) == 2 && \
492 (!(desc->flags & PIX_FMT_BE) != !HAVE_BIGENDIAN))
498 #define CONV_IS(src, dst) (srcFormat == AV_PIX_FMT_##src && dstFormat == AV_PIX_FMT_##dst)
517 switch (srcId | (dstId << 16)) {
518 case 0x000F000C: conv =
rgb12to15;
break;
519 case 0x000F0010: conv =
rgb16to15;
break;
520 case 0x000F0018: conv =
rgb24to15;
break;
521 case 0x000F0020: conv =
rgb32to15;
break;
522 case 0x0010000F: conv =
rgb15to16;
break;
523 case 0x00100018: conv =
rgb24to16;
break;
524 case 0x00100020: conv =
rgb32to16;
break;
525 case 0x0018000F: conv =
rgb15to24;
break;
526 case 0x00180010: conv =
rgb16to24;
break;
527 case 0x00180020: conv =
rgb32to24;
break;
528 case 0x0020000F: conv =
rgb15to32;
break;
529 case 0x00200010: conv =
rgb16to32;
break;
530 case 0x00200018: conv =
rgb24to32;
break;
534 switch (srcId | (dstId << 16)) {
559 int srcSliceY,
int srcSliceH,
uint8_t *dst[],
573 const uint8_t *srcPtr = src[0];
583 if (dstStride[0] * srcBpp == srcStride[0] * dstBpp && srcStride[0] > 0 &&
584 !(srcStride[0] % srcBpp))
585 conv(srcPtr, dstPtr + dstStride[0] * srcSliceY,
586 srcSliceH * srcStride[0]);
589 dstPtr += dstStride[0] * srcSliceY;
591 for (i = 0; i < srcSliceH; i++) {
592 conv(srcPtr, dstPtr, c->
srcW * srcBpp);
593 srcPtr += srcStride[0];
594 dstPtr += dstStride[0];
602 int srcStride[],
int srcSliceY,
int srcSliceH,
603 uint8_t *dst[],
int dstStride[])
607 dst[0] + srcSliceY * dstStride[0],
608 dst[1] + (srcSliceY >> 1) * dstStride[1],
609 dst[2] + (srcSliceY >> 1) * dstStride[2],
611 dstStride[0], dstStride[1], srcStride[0]);
613 fillPlane(dst[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
618 int srcStride[],
int srcSliceY,
int srcSliceH,
619 uint8_t *dst[],
int dstStride[])
621 copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->
srcW,
622 dst[0], dstStride[0]);
625 srcSliceH >> 2, srcStride[1], dstStride[1]);
627 srcSliceH >> 2, srcStride[2], dstStride[2]);
629 fillPlane(dst[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
635 int srcStride[],
int srcSliceY,
int srcSliceH,
636 uint8_t *dst[],
int dstStride[])
638 if (dstStride[0] == srcStride[0] && srcStride[0] > 0)
639 memcpy(dst[0] + dstStride[0] * srcSliceY, src[0], srcSliceH * dstStride[0]);
642 const uint8_t *srcPtr = src[0];
643 uint8_t *dstPtr = dst[0] + dstStride[0] * srcSliceY;
647 while (length + c->
srcW <=
FFABS(dstStride[0]) &&
652 for (i = 0; i < srcSliceH; i++) {
653 memcpy(dstPtr, srcPtr, length);
654 srcPtr += srcStride[0];
655 dstPtr += dstStride[0];
661 #define clip9(x) av_clip_uintp2(x, 9)
662 #define clip10(x) av_clip_uintp2(x, 10)
663 #define DITHER_COPY(dst, dstStride, wfunc, src, srcStride, rfunc, dithers, shift, clip) \
664 for (i = 0; i < height; i++) { \
665 const uint8_t *dither = dithers[i & 7]; \
666 for (j = 0; j < length - 7; j += 8) { \
667 wfunc(&dst[j + 0], clip((rfunc(&src[j + 0]) + dither[0]) >> shift)); \
668 wfunc(&dst[j + 1], clip((rfunc(&src[j + 1]) + dither[1]) >> shift)); \
669 wfunc(&dst[j + 2], clip((rfunc(&src[j + 2]) + dither[2]) >> shift)); \
670 wfunc(&dst[j + 3], clip((rfunc(&src[j + 3]) + dither[3]) >> shift)); \
671 wfunc(&dst[j + 4], clip((rfunc(&src[j + 4]) + dither[4]) >> shift)); \
672 wfunc(&dst[j + 5], clip((rfunc(&src[j + 5]) + dither[5]) >> shift)); \
673 wfunc(&dst[j + 6], clip((rfunc(&src[j + 6]) + dither[6]) >> shift)); \
674 wfunc(&dst[j + 7], clip((rfunc(&src[j + 7]) + dither[7]) >> shift)); \
676 for (; j < length; j++) \
677 wfunc(&dst[j], (rfunc(&src[j]) + dither[j & 7]) >> shift); \
683 int srcStride[],
int srcSliceY,
int srcSliceH,
684 uint8_t *dst[],
int dstStride[])
689 for (plane = 0; plane < 4; plane++) {
691 int y = (plane == 0 || plane == 3) ? srcSliceY: -((-srcSliceY) >> c->
chrDstVSubSample);
693 const uint8_t *srcPtr = src[plane];
694 uint8_t *dstPtr = dst[plane] + dstStride[plane] * y;
699 if (plane == 1 && !dst[2])
continue;
700 if (!src[plane] || (plane == 1 && !src[2])) {
701 int val = (plane == 3) ? 255 : 128;
706 length, height, y, val,
710 fillPlane(dst[plane], dstStride[plane], length, height, y,
716 const uint16_t *srcPtr2 = (
const uint16_t *) srcPtr;
719 uint16_t *dstPtr2 = (uint16_t *) dstPtr;
720 #define COPY9_OR_10TO16(rfunc, wfunc) \
721 for (i = 0; i < height; i++) { \
722 for (j = 0; j < length; j++) { \
723 int srcpx = rfunc(&srcPtr2[j]); \
724 wfunc(&dstPtr2[j], (srcpx << (16 - src_depth)) | (srcpx >> (2 * src_depth - 16))); \
726 dstPtr2 += dstStride[plane] / 2; \
727 srcPtr2 += srcStride[plane] / 2; \
743 uint16_t *dstPtr2 = (uint16_t *) dstPtr;
744 #define COPY9_OR_10TO9_OR_10(loop) \
745 for (i = 0; i < height; i++) { \
746 for (j = 0; j < length; j++) { \
749 dstPtr2 += dstStride[plane] / 2; \
750 srcPtr2 += srcStride[plane] / 2; \
752 #define COPY9_OR_10TO9_OR_10_2(rfunc, wfunc) \
753 if (dst_depth > src_depth) { \
754 COPY9_OR_10TO9_OR_10(int srcpx = rfunc(&srcPtr2[j]); \
755 wfunc(&dstPtr2[j], (srcpx << 1) | (srcpx >> 9))); \
756 } else if (dst_depth < src_depth) { \
757 DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \
758 srcPtr2, srcStride[plane] / 2, rfunc, \
759 dither_8x8_1, 1, clip9); \
761 COPY9_OR_10TO9_OR_10(wfunc(&dstPtr2[j], rfunc(&srcPtr2[j]))); \
777 #define W8(a, b) { *(a) = (b); }
778 #define COPY9_OR_10TO8(rfunc) \
779 if (src_depth == 9) { \
780 DITHER_COPY(dstPtr, dstStride[plane], W8, \
781 srcPtr2, srcStride[plane] / 2, rfunc, \
782 dither_8x8_1, 1, av_clip_uint8); \
784 DITHER_COPY(dstPtr, dstStride[plane], W8, \
785 srcPtr2, srcStride[plane] / 2, rfunc, \
786 dither_8x8_3, 2, av_clip_uint8); \
796 uint16_t *dstPtr2 = (uint16_t *) dstPtr;
799 const uint16_t *srcPtr2 = (
const uint16_t *) srcPtr;
800 #define COPY16TO9_OR_10(rfunc, wfunc) \
801 if (dst_depth == 9) { \
802 DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \
803 srcPtr2, srcStride[plane] / 2, rfunc, \
804 dither_8x8_128, 7, clip9); \
806 DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \
807 srcPtr2, srcStride[plane] / 2, rfunc, \
808 dither_8x8_64, 6, clip10); \
824 #define COPY8TO9_OR_10(wfunc) \
825 for (i = 0; i < height; i++) { \
826 for (j = 0; j < length; j++) { \
827 const int srcpx = srcPtr[j]; \
828 wfunc(&dstPtr2[j], (srcpx << (dst_depth - 8)) | (srcpx >> (16 - dst_depth))); \
830 dstPtr2 += dstStride[plane] / 2; \
831 srcPtr += srcStride[plane]; \
840 const uint16_t *srcPtr2 = (
const uint16_t *) srcPtr;
841 #define COPY16TO8(rfunc) \
842 DITHER_COPY(dstPtr, dstStride[plane], W8, \
843 srcPtr2, srcStride[plane] / 2, rfunc, \
844 dither_8x8_256, 8, av_clip_uint8);
851 for (i = 0; i <
height; i++) {
852 for (j = 0; j < length; j++) {
853 dstPtr[ j << 1 ] = srcPtr[j];
854 dstPtr[(j << 1) + 1] = srcPtr[j];
856 srcPtr += srcStride[plane];
857 dstPtr += dstStride[plane];
862 for (i = 0; i <
height; i++) {
863 for (j = 0; j < length; j++)
864 ((uint16_t *) dstPtr)[j] =
av_bswap16(((
const uint16_t *) srcPtr)[j]);
865 srcPtr += srcStride[plane];
866 dstPtr += dstStride[plane];
868 }
else if (dstStride[plane] == srcStride[plane] &&
869 srcStride[plane] > 0 && srcStride[plane] == length) {
870 memcpy(dst[plane] + dstStride[plane] * y, src[plane],
871 height * dstStride[plane]);
877 for (i = 0; i <
height; i++) {
878 memcpy(dstPtr, srcPtr, length);
879 srcPtr += srcStride[plane];
880 dstPtr += dstStride[plane];
889 #define IS_DIFFERENT_ENDIANESS(src_fmt, dst_fmt, pix_fmt) \
890 ((src_fmt == pix_fmt ## BE && dst_fmt == pix_fmt ## LE) || \
891 (src_fmt == pix_fmt ## LE && dst_fmt == pix_fmt ## BE))
902 needsDither =
isAnyRGB(dstFormat) &&
950 if ((
usePal(srcFormat) && (
988 if ( srcFormat == dstFormat ||
1017 src[3] = src[2] =
NULL;
1025 const int linesizes[4])
1030 for (i = 0; i < 4; i++) {
1032 if (!data[plane] || !linesizes[plane])
1044 const uint8_t *
const srcSlice[],
1045 const int srcStride[],
int srcSliceY,
1046 int srcSliceH,
uint8_t *
const dst[],
1047 const int dstStride[])
1050 const uint8_t *src2[4] = { srcSlice[0], srcSlice[1], srcSlice[2], srcSlice[3] };
1051 uint8_t *dst2[4] = { dst[0], dst[1], dst[2], dst[3] };
1066 if (c->
sliceDir == 0 && srcSliceY != 0 && srcSliceY + srcSliceH != c->
srcH) {
1075 for (i = 0; i < 256; i++) {
1076 int p,
r,
g,
b, y, u, v;
1078 p = ((
const uint32_t *)(srcSlice[1]))[i];
1079 r = (p >> 16) & 0xFF;
1080 g = (p >> 8) & 0xFF;
1083 r = ( i >> 5 ) * 36;
1084 g = ((i >> 2) & 7) * 36;
1087 b = ( i >> 6 ) * 85;
1088 g = ((i >> 3) & 7) * 36;
1091 r = ( i >> 3 ) * 255;
1092 g = ((i >> 1) & 3) * 85;
1099 b = ( i >> 3 ) * 255;
1100 g = ((i >> 1) & 3) * 85;
1106 c->
pal_yuv[i] = y + (u << 8) + (v << 16);
1113 c->
pal_rgb[i] = r + (g << 8) + (b << 16);
1119 c->
pal_rgb[i] = (r + (g << 8) + (b << 16)) << 8;
1125 c->
pal_rgb[i] = (b + (g << 8) + (r << 16)) << 8;
1132 c->
pal_rgb[i] = b + (g << 8) + (r << 16);
1140 int srcStride2[4] = { srcStride[0], srcStride[1], srcStride[2],
1142 int dstStride2[4] = { dstStride[0], dstStride[1], dstStride[2],
1149 if (srcSliceY + srcSliceH == c->
srcH)
1152 return c->
swScale(c, src2, srcStride2, srcSliceY, srcSliceH, dst2,
1156 int srcStride2[4] = { -srcStride[0], -srcStride[1], -srcStride[2],
1158 int dstStride2[4] = { -dstStride[0], -dstStride[1], -dstStride[2],
1161 src2[0] += (srcSliceH - 1) * srcStride[0];
1165 src2[3] += (srcSliceH - 1) * srcStride[3];
1166 dst2[0] += ( c->
dstH - 1) * dstStride[0];
1169 dst2[3] += ( c->
dstH - 1) * dstStride[3];
1178 return c->
swScale(c, src2, srcStride2, c->
srcH-srcSliceY-srcSliceH,
1179 srcSliceH, dst2, dstStride2);
1185 int num_pixels,
const uint8_t *palette)
1189 for (i = 0; i < num_pixels; i++)
1190 ((uint32_t *) dst)[i] = ((
const uint32_t *) palette)[src[i]];
1195 int num_pixels,
const uint8_t *palette)
1199 for (i = 0; i < num_pixels; i++) {
1201 dst[0] = palette[src[i] * 4 + 0];
1202 dst[1] = palette[src[i] * 4 + 1];
1203 dst[2] = palette[src[i] * 4 + 2];
#define IS_NOT_NE(bpp, desc)
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
static void reset_ptr(const uint8_t *src[], int format)
void shuffle_bytes_1230(const uint8_t *src, uint8_t *dst, int src_size)
const char * sws_format_name(enum AVPixelFormat format)
#define AV_PIX_FMT_BGR565
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
const uint8_t dither_8x8_3[8][8]
static int packed_16bpc_bswap(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
static av_always_inline int isPlanarRGB(enum AVPixelFormat pix_fmt)
void rgb16tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
#define AV_PIX_FMT_RGB444
void rgb12tobgr12(const uint8_t *src, uint8_t *dst, int src_size)
void shuffle_bytes_3012(const uint8_t *src, uint8_t *dst, int src_size)
packed RGB 8:8:8, 24bpp, RGBRGB...
void(* planar2x)(const uint8_t *src, uint8_t *dst, int width, int height, int srcStride, int dstStride)
#define AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_BGR444
void shuffle_bytes_3210(const uint8_t *src, uint8_t *dst, int src_size)
#define SWS_FAST_BILINEAR
#define AV_PIX_FMT_BGR555
void rgb16tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
static void gbr24ptopacked32(const uint8_t *src[], int srcStride[], uint8_t *dst, int dstStride, int srcSliceH, int alpha_first, int width)
void(* yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, int width, int height, int lumStride, int chromStride, int srcStride)
int dstFormatBpp
Number of bits per pixel of the destination pixel format.
void(* yuv422ptouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, int width, int height, int lumStride, int chromStride, int dstStride)
Width should be a multiple of 16.
static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
static void gbr24ptopacked24(const uint8_t *src[], int srcStride[], uint8_t *dst, int dstStride, int srcSliceH, int width)
#define COPY16TO9_OR_10(rfunc, wfunc)
void(* rgb32to16)(const uint8_t *src, uint8_t *dst, int src_size)
SwsFunc swScale
Note that src, dst, srcStride, dstStride will be copied in the sws_scale() wrapper so they can be fre...
const uint8_t dither_8x8_1[8][8]
int srcH
Height of source luma/alpha planes.
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
void(* rgb16to15)(const uint8_t *src, uint8_t *dst, int src_size)
void(* uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, int width, int height, int lumStride, int chromStride, int srcStride)
void(* uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, int width, int height, int lumStride, int chromStride, int srcStride)
static int bgr24ToYv12Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
int chrDstVSubSample
Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in destination i...
static int uyvyToYuv422Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
void ff_bfin_get_unscaled_swscale(SwsContext *c)
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
void(* yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, int width, int height, int lumStride, int chromStride, int dstStride)
Width should be a multiple of 16.
8 bit with PIX_FMT_RGB32 palette
static int yuyvToYuv422Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
const uint8_t dither_8x8_64[8][8]
#define COPY9_OR_10TO8(rfunc)
void rgb16to24(const uint8_t *src, uint8_t *dst, int src_size)
#define AV_PIX_FMT_RGB555
#define AV_PIX_FMT_RGB32_1
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
void(* rgb15tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
static int yuyvToYuv420Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
#define COPY9_OR_10TO16(rfunc, wfunc)
external api for the swscale stuff
enum AVPixelFormat dstFormat
Destination pixel format.
int chrSrcHSubSample
Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in source imag...
#define AV_PIX_FMT_RGB565
void(* yv12touyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, int width, int height, int lumStride, int chromStride, int dstStride)
Height should be a multiple of 2 and width should be a multiple of 16.
int dstH
Height of destination luma/alpha planes.
void ff_get_unscaled_swscale(SwsContext *c)
Set c->swScale to an unscaled converter if one exists for the specific source and destination formats...
static int yuv422pToUyvyWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
uint16_t depth_minus1
number of bits in the component minus 1
#define CONV_IS(src, dst)
static int planarToNv12Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
void(* interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst, int width, int height, int src1Stride, int src2Stride, int dstStride)
static rgbConvFn findRgbConvFn(SwsContext *c)
static void gray8aToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
void(* rgb16to32)(const uint8_t *src, uint8_t *dst, int src_size)
void shuffle_bytes_0321(const uint8_t *src, uint8_t *dst, int src_size)
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
void(* rgb24tobgr32)(const uint8_t *src, uint8_t *dst, int src_size)
void(* rgb24to15)(const uint8_t *src, uint8_t *dst, int src_size)
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
void av_log(void *avcl, int level, const char *fmt,...)
static void fillPlane(uint8_t *plane, int stride, int width, int height, int y, uint8_t val)
#define AV_PIX_FMT_BGR32_1
static int yuv422pToYuy2Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
static int uyvyToYuv420Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
static int palToRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
void rgb15tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
as above, but U and V bytes are swapped
#define COPY9_OR_10TO9_OR_10_2(rfunc, wfunc)
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
static void fill_plane9or10(uint8_t *plane, int stride, int width, int height, int y, uint8_t val, const int dst_depth, const int big_endian)
void(* rgb32tobgr15)(const uint8_t *src, uint8_t *dst, int src_size)
static av_always_inline int is9_OR_10BPS(enum AVPixelFormat pix_fmt)
void ff_swscale_get_unscaled_altivec(SwsContext *c)
void(* rgbConvFn)(const uint8_t *, uint8_t *, int)
packed RGB 8:8:8, 24bpp, BGRBGR...
void rgb12to15(const uint8_t *src, uint8_t *dst, int src_size)
enum AVPixelFormat pix_fmt
static int check_image_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, const int linesizes[4])
int sliceDir
Direction that slices are fed to the scaler (1 = top-to-bottom, -1 = bottom-to-top).
static void gray8aToPacked32_1(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
#define attribute_align_arg
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
void(* rgb15to32)(const uint8_t *src, uint8_t *dst, int src_size)
void(* rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, int width, int height, int lumStride, int chromStride, int srcStride)
Height should be a multiple of 2 and width should be a multiple of 2.
void(* rgb15to16)(const uint8_t *src, uint8_t *dst, int src_size)
static int rgbToRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
static av_always_inline int isPlanar(enum AVPixelFormat pix_fmt)
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
#define IS_DIFFERENT_ENDIANESS(src_fmt, dst_fmt, pix_fmt)
static void(WINAPI *cond_broadcast)(pthread_cond_t *cond)
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
void rgb32to24(const uint8_t *src, uint8_t *dst, int src_size)
void(* rgb32to15)(const uint8_t *src, uint8_t *dst, int src_size)
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
void(* shuffle_bytes_2103)(const uint8_t *src, uint8_t *dst, int src_size)
SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c)
void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
Convert an 8-bit paletted frame into a frame with a color depth of 24 bits.
static av_always_inline int isPlanarYUV(enum AVPixelFormat pix_fmt)
static void gray8aToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
const uint8_t dither_8x8_256[8][8]
void rgb24to32(const uint8_t *src, uint8_t *dst, int src_size)
static int planarCopyWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
void(* rgb24tobgr15)(const uint8_t *src, uint8_t *dst, int src_size)
static int planarRgbToRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
#define DECLARE_ALIGNED(n, t, v)
void rgb15tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
void(* yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, int width, int height, int lumStride, int chromStride, int dstStride)
Height should be a multiple of 2 and width should be a multiple of 16.
uint16_t plane
which of the 4 planes contains the component
#define FILL8TO9_OR_10(wfunc)
static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
void(* yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, int width, int height, int lumStride, int chromStride, int srcStride)
void(* rgb24tobgr16)(const uint8_t *src, uint8_t *dst, int src_size)
enum AVPixelFormat srcFormat
Source pixel format.
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
static void copyPlane(const uint8_t *src, int srcStride, int srcSliceY, int srcSliceH, int width, uint8_t *dst, int dstStride)
void(* rgb32tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
Convert an 8-bit paletted frame into a frame with a color depth of 32 bits.
int attribute_align_arg sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
swscale wrapper, so we don't need to export the SwsContext.
void(* rgb24to16)(const uint8_t *src, uint8_t *dst, int src_size)
void(* rgb16tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
static int planarToUyvyWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
void(* rgb32tobgr16)(const uint8_t *src, uint8_t *dst, int src_size)
void rgb15tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
static int planarToYuy2Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
int srcFormatBpp
Number of bits per pixel of the source pixel format.
#define COPY8TO9_OR_10(wfunc)
static int packedCopyWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
const uint8_t dither_8x8_128[8][8]
static av_always_inline int isPackedRGB(enum AVPixelFormat pix_fmt)
static av_always_inline int usePal(enum AVPixelFormat pix_fmt)
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
static av_always_inline int isPacked(enum AVPixelFormat pix_fmt)
int chrDstHSubSample
Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in destination...
int chrSrcW
Width of source chroma planes.
int srcW
Width of source luma/alpha planes.
void rgb16tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
int chrSrcVSubSample
Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in source image...
int flags
Flags passed by the user to select scaler algorithm, optimizations, subsampling, etc...
AVPixelFormat
Pixel format.
void(* rgb24tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
void rgb15to24(const uint8_t *src, uint8_t *dst, int src_size)