30 #include "libavutil/intreadwrite.h"
31 #include "libavutil/cpu.h"
32 #include "libavutil/avutil.h"
33 #include "libavutil/mathematics.h"
34 #include "libavutil/bswap.h"
35 #include "libavutil/pixdesc.h"
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,},
68 { 72, 136, 120, 184, 68, 132, 116, 180,},
69 { 200, 8, 248, 56, 196, 4, 244, 52,},
70 { 104, 168, 88, 152, 100, 164, 84, 148,},
71 { 232, 40, 216, 24, 228, 36, 212, 20,},
72 { 64, 128, 102, 176, 76, 140, 124, 188,},
73 { 192, 0, 240, 48, 204, 12, 252, 60,},
74 { 96, 160, 80, 144, 108, 172, 92, 156,},
75 { 224, 32, 208, 16, 236, 44, 220, 28,},
78 #define RGB2YUV_SHIFT 15
79 #define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
80 #define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
81 #define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
82 #define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
83 #define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
84 #define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
85 #define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
86 #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
87 #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
93 uint8_t *ptr = plane + stride * y;
94 for (i = 0; i <
height; i++) {
95 memset(ptr, val, width);
102 const int dst_depth,
const int big_endian)
105 uint16_t *dst = (uint16_t *) (plane + stride * y);
106 #define FILL8TO9_OR_10(wfunc) \
107 for (i = 0; i < height; i++) { \
108 for (j = 0; j < width; j++) { \
109 wfunc(&dst[j], (val << (dst_depth - 8)) | \
110 (val >> (16 - dst_depth))); \
122 int srcSliceY,
int srcSliceH,
int width,
125 dst += dstStride * srcSliceY;
126 if (dstStride == srcStride && srcStride > 0) {
127 memcpy(dst, src, srcSliceH * dstStride);
130 for (i = 0; i < srcSliceH; i++) {
131 memcpy(dst, src, width);
139 int srcStride[],
int srcSliceY,
140 int srcSliceH,
uint8_t *dstParam[],
143 uint8_t *dst = dstParam[1] + dstStride[1] * srcSliceY / 2;
145 copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->
srcW,
146 dstParam[0], dstStride[0]);
150 srcStride[1], srcStride[2], dstStride[1]);
153 srcStride[2], srcStride[1], dstStride[1]);
159 int srcStride[],
int srcSliceY,
160 int srcSliceH,
uint8_t *dstParam[],
163 uint8_t *dst1 = dstParam[1] + dstStride[1] * srcSliceY / 2;
164 uint8_t *dst2 = dstParam[2] + dstStride[2] * srcSliceY / 2;
166 copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->
srcW,
167 dstParam[0], dstStride[0]);
171 srcStride[1], dstStride[1], dstStride[2]);
174 srcStride[1], dstStride[2], dstStride[1]);
180 int srcStride[],
int srcSliceY,
int srcSliceH,
181 uint8_t *dstParam[],
int dstStride[])
183 uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
185 yv12toyuy2(src[0], src[1], src[2], dst, c->
srcW, srcSliceH, srcStride[0],
186 srcStride[1], dstStride[0]);
192 int srcStride[],
int srcSliceY,
int srcSliceH,
193 uint8_t *dstParam[],
int dstStride[])
195 uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
197 yv12touyvy(src[0], src[1], src[2], dst, c->
srcW, srcSliceH, srcStride[0],
198 srcStride[1], dstStride[0]);
204 int srcStride[],
int srcSliceY,
int srcSliceH,
205 uint8_t *dstParam[],
int dstStride[])
207 uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
210 srcStride[1], dstStride[0]);
216 int srcStride[],
int srcSliceY,
int srcSliceH,
217 uint8_t *dstParam[],
int dstStride[])
219 uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
222 srcStride[1], dstStride[0]);
228 int srcStride[],
int srcSliceY,
int srcSliceH,
229 uint8_t *dstParam[],
int dstStride[])
231 uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
232 uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY / 2;
233 uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY / 2;
236 dstStride[1], srcStride[0]);
239 fillPlane(dstParam[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
245 int srcStride[],
int srcSliceY,
int srcSliceH,
246 uint8_t *dstParam[],
int dstStride[])
248 uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
249 uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY;
250 uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY;
253 dstStride[1], srcStride[0]);
259 int srcStride[],
int srcSliceY,
int srcSliceH,
260 uint8_t *dstParam[],
int dstStride[])
262 uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
263 uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY / 2;
264 uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY / 2;
267 dstStride[1], srcStride[0]);
270 fillPlane(dstParam[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
276 int srcStride[],
int srcSliceY,
int srcSliceH,
277 uint8_t *dstParam[],
int dstStride[])
279 uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
280 uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY;
281 uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY;
284 dstStride[1], srcStride[0]);
293 for (i = 0; i < num_pixels; i++)
294 ((uint32_t *) dst)[i] = ((
const uint32_t *) palette)[src[i << 1]] | (src[(i << 1) + 1] << 24);
302 for (i = 0; i < num_pixels; i++)
303 ((uint32_t *) dst)[i] = ((
const uint32_t *) palette)[src[i << 1]] | src[(i << 1) + 1];
311 for (i = 0; i < num_pixels; i++) {
313 dst[0] = palette[src[i << 1] * 4 + 0];
314 dst[1] = palette[src[i << 1] * 4 + 1];
315 dst[2] = palette[src[i << 1] * 4 + 2];
321 int srcStride[],
int srcSliceY,
int srcSliceH,
322 uint8_t *dst[],
int dstStride[])
325 int srcstr = srcStride[0] >> 1;
326 int dststr = dstStride[0] >> 1;
327 uint16_t *dstPtr = (uint16_t *) dst[0];
328 const uint16_t *srcPtr = (
const uint16_t *) src[0];
329 int min_stride =
FFMIN(srcstr, dststr);
331 for (i = 0; i < srcSliceH; i++) {
332 for (j = 0; j < min_stride; j++) {
343 int srcSliceY,
int srcSliceH,
uint8_t *dst[],
351 uint8_t *dstPtr = dst[0] + dstStride[0] * srcSliceY;
352 const uint8_t *srcPtr = src[0];
363 }
else if (
usePal(srcFormat)) {
378 for (i = 0; i < srcSliceH; i++) {
380 srcPtr += srcStride[0];
381 dstPtr += dstStride[0];
389 uint8_t *dst,
int dstStride,
int srcSliceH,
393 for (h = 0; h < srcSliceH; h++) {
394 uint8_t *dest = dst + dstStride * h;
395 for (x = 0; x <
width; x++) {
401 for (i = 0; i < 3; i++)
402 src[i] += srcStride[i];
407 uint8_t *dst,
int dstStride,
int srcSliceH,
408 int alpha_first,
int width)
411 for (h = 0; h < srcSliceH; h++) {
412 uint8_t *dest = dst + dstStride * h;
415 for (x = 0; x <
width; x++) {
422 for (x = 0; x <
width; x++) {
430 for (i = 0; i < 3; i++)
431 src[i] += srcStride[i];
436 int srcStride[],
int srcSliceY,
int srcSliceH,
437 uint8_t *dst[],
int dstStride[])
440 const uint8_t *src102[] = { src[1], src[0], src[2] };
441 const uint8_t *src201[] = { src[2], src[0], src[1] };
442 int stride102[] = { srcStride[1], srcStride[0], srcStride[2] };
443 int stride201[] = { srcStride[2], srcStride[0], srcStride[1] };
455 dst[0] + srcSliceY * dstStride[0], dstStride[0],
461 dst[0] + srcSliceY * dstStride[0], dstStride[0],
469 dst[0] + srcSliceY * dstStride[0], dstStride[0],
470 srcSliceH, alpha_first, c->
srcW);
477 dst[0] + srcSliceY * dstStride[0], dstStride[0],
478 srcSliceH, alpha_first, c->
srcW);
483 "unsupported planar RGB conversion %s -> %s\n",
492 uint8_t *dst[],
int dstStride[],
int srcSliceH,
493 int alpha_first,
int inc_size,
int width)
505 for (h = 0; h < srcSliceH; h++) {
506 for (x = 0; x <
width; x++) {
513 src += srcStride - width * inc_size;
514 dest[0] += dstStride[0];
515 dest[1] += dstStride[1];
516 dest[2] += dstStride[2];
521 int srcStride[],
int srcSliceY,
int srcSliceH,
522 uint8_t *dst[],
int dstStride[])
525 int stride102[] = { dstStride[1], dstStride[0], dstStride[2] };
526 int stride201[] = { dstStride[2], dstStride[0], dstStride[1] };
527 uint8_t *dst102[] = { dst[1] + srcSliceY * dstStride[1],
528 dst[0] + srcSliceY * dstStride[0],
529 dst[2] + srcSliceY * dstStride[2] };
530 uint8_t *dst201[] = { dst[2] + srcSliceY * dstStride[2],
531 dst[0] + srcSliceY * dstStride[0],
532 dst[1] + srcSliceY * dstStride[1] };
537 stride201, srcSliceH, alpha_first, 3, c->
srcW);
541 stride102, srcSliceH, alpha_first, 3, c->
srcW);
547 stride201, srcSliceH, alpha_first, 4, c->
srcW);
553 stride102, srcSliceH, alpha_first, 4, c->
srcW);
557 "unsupported planar RGB conversion %s -> %s\n",
565 #define isRGBA32(x) ( \
566 (x) == AV_PIX_FMT_ARGB \
567 || (x) == AV_PIX_FMT_RGBA \
568 || (x) == AV_PIX_FMT_BGRA \
569 || (x) == AV_PIX_FMT_ABGR \
584 #define IS_NOT_NE(bpp, desc) \
585 (((bpp + 7) >> 3) == 2 && \
586 (!(desc->flags & AV_PIX_FMT_FLAG_BE) != !HAVE_BIGENDIAN))
592 #define CONV_IS(src, dst) (srcFormat == AV_PIX_FMT_##src && dstFormat == AV_PIX_FMT_##dst)
611 switch (srcId | (dstId << 16)) {
612 case 0x000F000C: conv =
rgb12to15;
break;
613 case 0x000F0010: conv =
rgb16to15;
break;
614 case 0x000F0018: conv =
rgb24to15;
break;
615 case 0x000F0020: conv =
rgb32to15;
break;
616 case 0x0010000F: conv =
rgb15to16;
break;
617 case 0x00100018: conv =
rgb24to16;
break;
618 case 0x00100020: conv =
rgb32to16;
break;
619 case 0x0018000F: conv =
rgb15to24;
break;
620 case 0x00180010: conv =
rgb16to24;
break;
621 case 0x00180020: conv =
rgb32to24;
break;
622 case 0x0020000F: conv =
rgb15to32;
break;
623 case 0x00200010: conv =
rgb16to32;
break;
624 case 0x00200018: conv =
rgb24to32;
break;
628 switch (srcId | (dstId << 16)) {
653 int srcSliceY,
int srcSliceH,
uint8_t *dst[],
667 const uint8_t *srcPtr = src[0];
677 if (dstStride[0] * srcBpp == srcStride[0] * dstBpp && srcStride[0] > 0 &&
678 !(srcStride[0] % srcBpp))
679 conv(srcPtr, dstPtr + dstStride[0] * srcSliceY,
680 (srcSliceH - 1) * srcStride[0] + c->
srcW * srcBpp);
683 dstPtr += dstStride[0] * srcSliceY;
685 for (i = 0; i < srcSliceH; i++) {
686 conv(srcPtr, dstPtr, c->
srcW * srcBpp);
687 srcPtr += srcStride[0];
688 dstPtr += dstStride[0];
696 int srcStride[],
int srcSliceY,
int srcSliceH,
697 uint8_t *dst[],
int dstStride[])
701 dst[0] + srcSliceY * dstStride[0],
702 dst[1] + (srcSliceY >> 1) * dstStride[1],
703 dst[2] + (srcSliceY >> 1) * dstStride[2],
705 dstStride[0], dstStride[1], srcStride[0]);
707 fillPlane(dst[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
712 int srcStride[],
int srcSliceY,
int srcSliceH,
713 uint8_t *dst[],
int dstStride[])
715 copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->
srcW,
716 dst[0], dstStride[0]);
719 srcSliceH >> 2, srcStride[1], dstStride[1]);
721 srcSliceH >> 2, srcStride[2], dstStride[2]);
723 fillPlane(dst[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
729 int srcStride[],
int srcSliceY,
int srcSliceH,
730 uint8_t *dst[],
int dstStride[])
732 if (dstStride[0] == srcStride[0] && srcStride[0] > 0)
733 memcpy(dst[0] + dstStride[0] * srcSliceY, src[0], srcSliceH * dstStride[0]);
736 const uint8_t *srcPtr = src[0];
737 uint8_t *dstPtr = dst[0] + dstStride[0] * srcSliceY;
741 while (length + c->
srcW <=
FFABS(dstStride[0]) &&
746 for (i = 0; i < srcSliceH; i++) {
747 memcpy(dstPtr, srcPtr, length);
748 srcPtr += srcStride[0];
749 dstPtr += dstStride[0];
755 #define clip9(x) av_clip_uintp2(x, 9)
756 #define clip10(x) av_clip_uintp2(x, 10)
757 #define DITHER_COPY(dst, dstStride, wfunc, src, srcStride, rfunc, dithers, shift, clip) \
758 for (i = 0; i < height; i++) { \
759 const uint8_t *dither = dithers[i & 7]; \
760 for (j = 0; j < length - 7; j += 8) { \
761 wfunc(&dst[j + 0], clip((rfunc(&src[j + 0]) + dither[0]) >> shift)); \
762 wfunc(&dst[j + 1], clip((rfunc(&src[j + 1]) + dither[1]) >> shift)); \
763 wfunc(&dst[j + 2], clip((rfunc(&src[j + 2]) + dither[2]) >> shift)); \
764 wfunc(&dst[j + 3], clip((rfunc(&src[j + 3]) + dither[3]) >> shift)); \
765 wfunc(&dst[j + 4], clip((rfunc(&src[j + 4]) + dither[4]) >> shift)); \
766 wfunc(&dst[j + 5], clip((rfunc(&src[j + 5]) + dither[5]) >> shift)); \
767 wfunc(&dst[j + 6], clip((rfunc(&src[j + 6]) + dither[6]) >> shift)); \
768 wfunc(&dst[j + 7], clip((rfunc(&src[j + 7]) + dither[7]) >> shift)); \
770 for (; j < length; j++) \
771 wfunc(&dst[j], (rfunc(&src[j]) + dither[j & 7]) >> shift); \
777 int srcStride[],
int srcSliceY,
int srcSliceH,
778 uint8_t *dst[],
int dstStride[])
783 for (plane = 0; plane < 4; plane++) {
785 int y = (plane == 0 || plane == 3) ? srcSliceY: -((-srcSliceY) >> c->
chrDstVSubSample);
787 const uint8_t *srcPtr = src[plane];
788 uint8_t *dstPtr = dst[plane] + dstStride[plane] * y;
793 if (plane == 1 && !dst[2])
continue;
794 if (!src[plane] || (plane == 1 && !src[2])) {
795 int val = (plane == 3) ? 255 : 128;
800 length, height, y, val,
804 fillPlane(dst[plane], dstStride[plane], length, height, y,
810 const uint16_t *srcPtr2 = (
const uint16_t *) srcPtr;
813 uint16_t *dstPtr2 = (uint16_t *) dstPtr;
814 #define COPY9_OR_10TO16(rfunc, wfunc) \
815 for (i = 0; i < height; i++) { \
816 for (j = 0; j < length; j++) { \
817 int srcpx = rfunc(&srcPtr2[j]); \
818 wfunc(&dstPtr2[j], (srcpx << (16 - src_depth)) | (srcpx >> (2 * src_depth - 16))); \
820 dstPtr2 += dstStride[plane] / 2; \
821 srcPtr2 += srcStride[plane] / 2; \
837 uint16_t *dstPtr2 = (uint16_t *) dstPtr;
838 #define COPY9_OR_10TO9_OR_10(loop) \
839 for (i = 0; i < height; i++) { \
840 for (j = 0; j < length; j++) { \
843 dstPtr2 += dstStride[plane] / 2; \
844 srcPtr2 += srcStride[plane] / 2; \
846 #define COPY9_OR_10TO9_OR_10_2(rfunc, wfunc) \
847 if (dst_depth > src_depth) { \
848 COPY9_OR_10TO9_OR_10(int srcpx = rfunc(&srcPtr2[j]); \
849 wfunc(&dstPtr2[j], (srcpx << 1) | (srcpx >> 9))); \
850 } else if (dst_depth < src_depth) { \
851 DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \
852 srcPtr2, srcStride[plane] / 2, rfunc, \
853 dither_8x8_1, 1, clip9); \
855 COPY9_OR_10TO9_OR_10(wfunc(&dstPtr2[j], rfunc(&srcPtr2[j]))); \
871 #define W8(a, b) { *(a) = (b); }
872 #define COPY9_OR_10TO8(rfunc) \
873 if (src_depth == 9) { \
874 DITHER_COPY(dstPtr, dstStride[plane], W8, \
875 srcPtr2, srcStride[plane] / 2, rfunc, \
876 dither_8x8_1, 1, av_clip_uint8); \
878 DITHER_COPY(dstPtr, dstStride[plane], W8, \
879 srcPtr2, srcStride[plane] / 2, rfunc, \
880 dither_8x8_3, 2, av_clip_uint8); \
890 uint16_t *dstPtr2 = (uint16_t *) dstPtr;
893 const uint16_t *srcPtr2 = (
const uint16_t *) srcPtr;
894 #define COPY16TO9_OR_10(rfunc, wfunc) \
895 if (dst_depth == 9) { \
896 DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \
897 srcPtr2, srcStride[plane] / 2, rfunc, \
898 ff_dither_8x8_128, 7, clip9); \
900 DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \
901 srcPtr2, srcStride[plane] / 2, rfunc, \
902 dither_8x8_64, 6, clip10); \
918 #define COPY8TO9_OR_10(wfunc) \
919 for (i = 0; i < height; i++) { \
920 for (j = 0; j < length; j++) { \
921 const int srcpx = srcPtr[j]; \
922 wfunc(&dstPtr2[j], (srcpx << (dst_depth - 8)) | (srcpx >> (16 - dst_depth))); \
924 dstPtr2 += dstStride[plane] / 2; \
925 srcPtr += srcStride[plane]; \
934 const uint16_t *srcPtr2 = (
const uint16_t *) srcPtr;
935 #define COPY16TO8(rfunc) \
936 DITHER_COPY(dstPtr, dstStride[plane], W8, \
937 srcPtr2, srcStride[plane] / 2, rfunc, \
938 dither_8x8_256, 8, av_clip_uint8);
945 for (i = 0; i <
height; i++) {
946 for (j = 0; j < length; j++) {
947 dstPtr[ j << 1 ] = srcPtr[j];
948 dstPtr[(j << 1) + 1] = srcPtr[j];
950 srcPtr += srcStride[plane];
951 dstPtr += dstStride[plane];
956 for (i = 0; i <
height; i++) {
957 for (j = 0; j < length; j++)
958 ((uint16_t *) dstPtr)[j] =
av_bswap16(((
const uint16_t *) srcPtr)[j]);
959 srcPtr += srcStride[plane];
960 dstPtr += dstStride[plane];
962 }
else if (dstStride[plane] == srcStride[plane] &&
963 srcStride[plane] > 0 && srcStride[plane] == length) {
964 memcpy(dst[plane] + dstStride[plane] * y, src[plane],
965 height * dstStride[plane]);
971 for (i = 0; i <
height; i++) {
972 memcpy(dstPtr, srcPtr, length);
973 srcPtr += srcStride[plane];
974 dstPtr += dstStride[plane];
983 #define IS_DIFFERENT_ENDIANESS(src_fmt, dst_fmt, pix_fmt) \
984 ((src_fmt == pix_fmt ## BE && dst_fmt == pix_fmt ## LE) || \
985 (src_fmt == pix_fmt ## LE && dst_fmt == pix_fmt ## BE))
996 needsDither =
isAnyRGB(dstFormat) &&
1034 #define isByteRGB(f) ( \
1035 f == AV_PIX_FMT_RGB32 || \
1036 f == AV_PIX_FMT_RGB32_1 || \
1037 f == AV_PIX_FMT_RGB24 || \
1038 f == AV_PIX_FMT_BGR32 || \
1039 f == AV_PIX_FMT_BGR32_1 || \
1040 f == AV_PIX_FMT_BGR24)
1065 if ((
usePal(srcFormat) && (
1103 if ( srcFormat == dstFormat ||
1130 src[3] = src[2] =
NULL;
1138 const int linesizes[4])
1143 for (i = 0; i < 4; i++) {
1145 if (!data[plane] || !linesizes[plane])
1157 const uint8_t *
const srcSlice[],
1158 const int srcStride[],
int srcSliceY,
1159 int srcSliceH,
uint8_t *
const dst[],
1160 const int dstStride[])
1163 const uint8_t *src2[4] = { srcSlice[0], srcSlice[1], srcSlice[2], srcSlice[3] };
1164 uint8_t *dst2[4] = { dst[0], dst[1], dst[2], dst[3] };
1179 if (c->
sliceDir == 0 && srcSliceY != 0 && srcSliceY + srcSliceH != c->
srcH) {
1188 for (i = 0; i < 256; i++) {
1189 int r,
g,
b, y, u, v;
1191 uint32_t p = ((
const uint32_t *)(srcSlice[1]))[i];
1192 r = (p >> 16) & 0xFF;
1193 g = (p >> 8) & 0xFF;
1196 r = ( i >> 5 ) * 36;
1197 g = ((i >> 2) & 7) * 36;
1200 b = ( i >> 6 ) * 85;
1201 g = ((i >> 3) & 7) * 36;
1204 r = ( i >> 3 ) * 255;
1205 g = ((i >> 1) & 3) * 85;
1212 b = ( i >> 3 ) * 255;
1213 g = ((i >> 1) & 3) * 85;
1219 c->
pal_yuv[i] = y + (u << 8) + (v << 16) + (0xFF
U << 24);
1226 c->
pal_rgb[i] = r + (g << 8) + (b << 16) + (0xFF
U << 24);
1232 c->
pal_rgb[i] = 0xFF + (r << 8) + (g << 16) + ((unsigned)b << 24);
1238 c->
pal_rgb[i] = 0xFF + (b << 8) + (g << 16) + ((unsigned)r << 24);
1245 c->
pal_rgb[i] = b + (g << 8) + (r << 16) + (0xFF
U << 24);
1253 int srcStride2[4] = { srcStride[0], srcStride[1], srcStride[2],
1255 int dstStride2[4] = { dstStride[0], dstStride[1], dstStride[2],
1262 if (srcSliceY + srcSliceH == c->
srcH)
1265 return c->
swscale(c, src2, srcStride2, srcSliceY, srcSliceH, dst2,
1269 int srcStride2[4] = { -srcStride[0], -srcStride[1], -srcStride[2],
1271 int dstStride2[4] = { -dstStride[0], -dstStride[1], -dstStride[2],
1274 src2[0] += (srcSliceH - 1) * srcStride[0];
1278 src2[3] += (srcSliceH - 1) * srcStride[3];
1279 dst2[0] += ( c->
dstH - 1) * dstStride[0];
1282 dst2[3] += ( c->
dstH - 1) * dstStride[3];
1291 return c->
swscale(c, src2, srcStride2, c->
srcH-srcSliceY-srcSliceH,
1292 srcSliceH, dst2, dstStride2);
1298 int num_pixels,
const uint8_t *palette)
1302 for (i = 0; i < num_pixels; i++)
1303 ((uint32_t *) dst)[i] = ((
const uint32_t *) palette)[src[i]];
1308 int num_pixels,
const uint8_t *palette)
1312 for (i = 0; i < num_pixels; i++) {
1314 dst[0] = palette[src[i] * 4 + 0];
1315 dst[1] = palette[src[i] * 4 + 1];
1316 dst[2] = palette[src[i] * 4 + 2];
#define IS_NOT_NE(bpp, desc)
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.
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)
void(* rgb15to32)(const uint8_t *src, uint8_t *dst, int src_size)
static 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[])
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
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.
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.
void rgb16tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
packed RGB 8:8:8, 24bpp, RGBRGB...
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 BGRA 8:8:8:8, 32bpp, BGRABGRA...
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
void shuffle_bytes_3210(const uint8_t *src, uint8_t *dst, int src_size)
void rgb16tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
void(* rgb32tobgr16)(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)
int dstFormatBpp
Number of bits per pixel of the destination pixel format.
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
#define DECLARE_ALIGNED(n, t, v)
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 is16BPS(enum AVPixelFormat pix_fmt)
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
static void gbr24ptopacked24(const uint8_t *src[], int srcStride[], uint8_t *dst, int dstStride, int srcSliceH, int width)
#define AV_PIX_FMT_BGR32_1
#define COPY16TO9_OR_10(rfunc, wfunc)
void(* rgb16tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
static const uint8_t dither_8x8_1[8][8]
int srcH
Height of source luma/alpha planes.
void(* rgb24tobgr16)(const uint8_t *src, uint8_t *dst, int src_size)
static int bgr24ToYv12Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
void(* shuffle_bytes_2103)(const uint8_t *src, uint8_t *dst, int src_size)
void(* rgb32to16)(const uint8_t *src, uint8_t *dst, int src_size)
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(* 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.
static int rgbToPlanarRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
static int yuyvToYuv422Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
static 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 SWS_FAST_BILINEAR
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)
enum AVPixelFormat dstFormat
Destination pixel format.
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.
int chrSrcHSubSample
Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in source imag...
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
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[])
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
uint16_t depth_minus1
Number of bits in the component minus 1.
#define CONV_IS(src, dst)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int planarToNv12Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
static rgbConvFn findRgbConvFn(SwsContext *c)
static void gray8aToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
void shuffle_bytes_0321(const uint8_t *src, uint8_t *dst, int src_size)
void(* rgbConvFn)(const uint8_t *, uint8_t *, int)
static void fillPlane(uint8_t *plane, int stride, int width, int height, int y, uint8_t val)
static int yuv422pToYuy2Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
void(* rgb15tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
void(* rgb32tobgr15)(const uint8_t *src, uint8_t *dst, int src_size)
AVPixelFormat
Pixel format.
void(* rgb24to16)(const uint8_t *src, uint8_t *dst, int src_size)
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)
#define COPY9_OR_10TO9_OR_10_2(rfunc, wfunc)
void(* interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst, int width, int height, int src1Stride, int src2Stride, int dstStride)
external api for the swscale stuff
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)
static av_always_inline int is9_OR_10BPS(enum AVPixelFormat pix_fmt)
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
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.
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
void rgb12to15(const uint8_t *src, uint8_t *dst, int src_size)
enum AVPixelFormat pix_fmt
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
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).
void(* rgb24tobgr32)(const uint8_t *src, uint8_t *dst, int src_size)
#define AV_PIX_FMT_RGBA64
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
static void gray8aToPacked32_1(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
8 bit with PIX_FMT_RGB32 palette
#define AV_PIX_FMT_RGB32_1
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
#define attribute_align_arg
void(* rgb16to15)(const uint8_t *src, uint8_t *dst, int src_size)
void(* deinterleaveBytes)(const uint8_t *src, uint8_t *dst1, uint8_t *dst2, int width, int height, int srcStride, int dst1Stride, int dst2Stride)
#define AV_PIX_FMT_RGB555
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)
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)
#define AV_PIX_FMT_BGRA64
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 RGB 8:8:8, 24bpp, BGRBGR...
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 rgb32to24(const uint8_t *src, uint8_t *dst, int src_size)
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.
SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c)
#define AV_PIX_FMT_RGB444
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 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)
void(* rgb24to15)(const uint8_t *src, uint8_t *dst, int src_size)
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
static const uint8_t dither_8x8_256[8][8]
void rgb24to32(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)
static int planarCopyWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
static int planarRgbToRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
void(* rgb16to32)(const uint8_t *src, uint8_t *dst, int src_size)
void rgb15tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
void(* rgb24tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
void(* rgb24tobgr15)(const uint8_t *src, uint8_t *dst, int src_size)
uint16_t plane
Which of the 4 planes contains the component.
#define FILL8TO9_OR_10(wfunc)
static int nv12ToPlanarWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
#define AV_PIX_FMT_RGB565
enum AVPixelFormat srcFormat
Source pixel format.
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
static void packedtogbr24p(const uint8_t *src, int srcStride, uint8_t *dst[], int dstStride[], int srcSliceH, int alpha_first, int inc_size, int width)
static void copyPlane(const uint8_t *src, int srcStride, int srcSliceY, int srcSliceH, int width, uint8_t *dst, int dstStride)
SwsFunc swscale
Note that src, dst, srcStride, dstStride will be copied in the sws_scale() wrapper so they can be fre...
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
static int planarToUyvyWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dstParam[], int dstStride[])
void(* rgb32to15)(const uint8_t *src, uint8_t *dst, int src_size)
#define AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_BGR444
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.
void(* planar2x)(const uint8_t *src, uint8_t *dst, int width, int height, int srcStride, int dstStride)
void(* rgb32tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
av_cold void ff_get_unscaled_swscale_ppc(SwsContext *c)
#define COPY8TO9_OR_10(wfunc)
#define AV_PIX_FMT_BGR565
static int packedCopyWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
static av_always_inline int isPackedRGB(enum AVPixelFormat pix_fmt)
static void comp(unsigned char *dst, int dst_stride, unsigned char *src, int src_stride, int add)
static av_always_inline int usePal(enum AVPixelFormat pix_fmt)
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...
void(* rgb15to16)(const uint8_t *src, uint8_t *dst, int src_size)
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)
as above, but U and V bytes are swapped
#define AV_PIX_FMT_BGR555
void rgb15to24(const uint8_t *src, uint8_t *dst, int src_size)