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",
493 int srcSliceY,
int srcSliceH,
494 uint8_t *dst[],
int dstStride[])
496 copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->
srcW,
497 dst[0], dstStride[0]);
498 copyPlane(src[1], srcStride[1], srcSliceY, srcSliceH, c->
srcW,
499 dst[1], dstStride[1]);
500 copyPlane(src[2], srcStride[2], srcSliceY, srcSliceH, c->
srcW,
501 dst[2], dstStride[2]);
503 fillPlane(dst[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
509 uint8_t *dst[],
int dstStride[],
int srcSliceH,
510 int alpha_first,
int inc_size,
int width)
522 for (h = 0; h < srcSliceH; h++) {
523 for (x = 0; x <
width; x++) {
530 src += srcStride - width * inc_size;
531 dest[0] += dstStride[0];
532 dest[1] += dstStride[1];
533 dest[2] += dstStride[2];
538 int srcStride[],
int srcSliceY,
int srcSliceH,
539 uint8_t *dst[],
int dstStride[])
542 int stride102[] = { dstStride[1], dstStride[0], dstStride[2] };
543 int stride201[] = { dstStride[2], dstStride[0], dstStride[1] };
544 uint8_t *dst102[] = { dst[1] + srcSliceY * dstStride[1],
545 dst[0] + srcSliceY * dstStride[0],
546 dst[2] + srcSliceY * dstStride[2] };
547 uint8_t *dst201[] = { dst[2] + srcSliceY * dstStride[2],
548 dst[0] + srcSliceY * dstStride[0],
549 dst[1] + srcSliceY * dstStride[1] };
554 stride201, srcSliceH, alpha_first, 3, c->
srcW);
558 stride102, srcSliceH, alpha_first, 3, c->
srcW);
564 stride201, srcSliceH, alpha_first, 4, c->
srcW);
570 stride102, srcSliceH, alpha_first, 4, c->
srcW);
574 "unsupported planar RGB conversion %s -> %s\n",
582 #define isRGBA32(x) ( \ 583 (x) == AV_PIX_FMT_ARGB \ 584 || (x) == AV_PIX_FMT_RGBA \ 585 || (x) == AV_PIX_FMT_BGRA \ 586 || (x) == AV_PIX_FMT_ABGR \ 601 #define IS_NOT_NE(bpp, desc) \ 602 (((bpp + 7) >> 3) == 2 && \ 603 (!(desc->flags & AV_PIX_FMT_FLAG_BE) != !HAVE_BIGENDIAN)) 609 #define CONV_IS(src, dst) (srcFormat == AV_PIX_FMT_##src && dstFormat == AV_PIX_FMT_##dst) 628 switch (srcId | (dstId << 16)) {
629 case 0x000F000C: conv =
rgb12to15;
break;
630 case 0x000F0010: conv =
rgb16to15;
break;
631 case 0x000F0018: conv =
rgb24to15;
break;
632 case 0x000F0020: conv =
rgb32to15;
break;
633 case 0x0010000F: conv =
rgb15to16;
break;
634 case 0x00100018: conv =
rgb24to16;
break;
635 case 0x00100020: conv =
rgb32to16;
break;
636 case 0x0018000F: conv =
rgb15to24;
break;
637 case 0x00180010: conv =
rgb16to24;
break;
638 case 0x00180020: conv =
rgb32to24;
break;
639 case 0x0020000F: conv =
rgb15to32;
break;
640 case 0x00200010: conv =
rgb16to32;
break;
641 case 0x00200018: conv =
rgb24to32;
break;
645 switch (srcId | (dstId << 16)) {
670 int srcSliceY,
int srcSliceH,
uint8_t *dst[],
684 const uint8_t *srcPtr = src[0];
694 if (dstStride[0] * srcBpp == srcStride[0] * dstBpp && srcStride[0] > 0 &&
695 !(srcStride[0] % srcBpp))
696 conv(srcPtr, dstPtr + dstStride[0] * srcSliceY,
697 (srcSliceH - 1) * srcStride[0] + c->
srcW * srcBpp);
700 dstPtr += dstStride[0] * srcSliceY;
702 for (i = 0; i < srcSliceH; i++) {
703 conv(srcPtr, dstPtr, c->
srcW * srcBpp);
704 srcPtr += srcStride[0];
705 dstPtr += dstStride[0];
713 int srcStride[],
int srcSliceY,
int srcSliceH,
714 uint8_t *dst[],
int dstStride[])
718 dst[0] + srcSliceY * dstStride[0],
719 dst[1] + (srcSliceY >> 1) * dstStride[1],
720 dst[2] + (srcSliceY >> 1) * dstStride[2],
722 dstStride[0], dstStride[1], srcStride[0]);
724 fillPlane(dst[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
729 int srcStride[],
int srcSliceY,
int srcSliceH,
730 uint8_t *dst[],
int dstStride[])
732 copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->
srcW,
733 dst[0], dstStride[0]);
736 srcSliceH >> 2, srcStride[1], dstStride[1]);
738 srcSliceH >> 2, srcStride[2], dstStride[2]);
740 fillPlane(dst[3], dstStride[3], c->
srcW, srcSliceH, srcSliceY, 255);
746 int srcStride[],
int srcSliceY,
int srcSliceH,
747 uint8_t *dst[],
int dstStride[])
749 if (dstStride[0] == srcStride[0] && srcStride[0] > 0)
750 memcpy(dst[0] + dstStride[0] * srcSliceY, src[0], srcSliceH * dstStride[0]);
753 const uint8_t *srcPtr = src[0];
754 uint8_t *dstPtr = dst[0] + dstStride[0] * srcSliceY;
758 while (length + c->
srcW <=
FFABS(dstStride[0]) &&
763 for (i = 0; i < srcSliceH; i++) {
764 memcpy(dstPtr, srcPtr, length);
765 srcPtr += srcStride[0];
766 dstPtr += dstStride[0];
772 #define clip9(x) av_clip_uintp2(x, 9) 773 #define clip10(x) av_clip_uintp2(x, 10) 774 #define DITHER_COPY(dst, dstStride, wfunc, src, srcStride, rfunc, dithers, shift, clip) \ 775 for (i = 0; i < height; i++) { \ 776 const uint8_t *dither = dithers[i & 7]; \ 777 for (j = 0; j < length - 7; j += 8) { \ 778 wfunc(&dst[j + 0], clip((rfunc(&src[j + 0]) + dither[0]) >> shift)); \ 779 wfunc(&dst[j + 1], clip((rfunc(&src[j + 1]) + dither[1]) >> shift)); \ 780 wfunc(&dst[j + 2], clip((rfunc(&src[j + 2]) + dither[2]) >> shift)); \ 781 wfunc(&dst[j + 3], clip((rfunc(&src[j + 3]) + dither[3]) >> shift)); \ 782 wfunc(&dst[j + 4], clip((rfunc(&src[j + 4]) + dither[4]) >> shift)); \ 783 wfunc(&dst[j + 5], clip((rfunc(&src[j + 5]) + dither[5]) >> shift)); \ 784 wfunc(&dst[j + 6], clip((rfunc(&src[j + 6]) + dither[6]) >> shift)); \ 785 wfunc(&dst[j + 7], clip((rfunc(&src[j + 7]) + dither[7]) >> shift)); \ 787 for (; j < length; j++) \ 788 wfunc(&dst[j], (rfunc(&src[j]) + dither[j & 7]) >> shift); \ 794 int srcStride[],
int srcSliceY,
int srcSliceH,
795 uint8_t *dst[],
int dstStride[])
800 for (plane = 0; plane < 4; plane++) {
804 const uint8_t *srcPtr = src[plane];
805 uint8_t *dstPtr = dst[plane] + dstStride[plane] * y;
806 int shiftonly = plane == 1 || plane == 2 || (!c->
srcRange && plane == 0);
811 if (plane == 1 && !dst[2])
continue;
812 if (!src[plane] || (plane == 1 && !src[2])) {
813 int val = (plane == 3) ? 255 : 128;
818 length, height, y, val,
822 fillPlane(dst[plane], dstStride[plane], length, height, y,
826 const int src_depth = desc_src->
comp[plane].
depth;
827 const int dst_depth = desc_dst->
comp[plane].
depth;
828 const uint16_t *srcPtr2 = (
const uint16_t *) srcPtr;
831 uint16_t *dstPtr2 = (uint16_t *) dstPtr;
832 #define COPY9_OR_10TO16(rfunc, wfunc) \ 834 for (i = 0; i < height; i++) { \ 835 for (j = 0; j < length; j++) { \ 836 int srcpx = rfunc(&srcPtr2[j]); \ 837 wfunc(&dstPtr2[j], srcpx << (16 - src_depth)); \ 839 dstPtr2 += dstStride[plane] / 2; \ 840 srcPtr2 += srcStride[plane] / 2; \ 843 for (i = 0; i < height; i++) { \ 844 for (j = 0; j < length; j++) { \ 845 int srcpx = rfunc(&srcPtr2[j]); \ 846 wfunc(&dstPtr2[j], (srcpx << (16 - src_depth)) | (srcpx >> (2 * src_depth - 16))); \ 848 dstPtr2 += dstStride[plane] / 2; \ 849 srcPtr2 += srcStride[plane] / 2; \ 866 uint16_t *dstPtr2 = (uint16_t *) dstPtr;
867 #define COPY9_OR_10TO9_OR_10(loop) \ 868 for (i = 0; i < height; i++) { \ 869 for (j = 0; j < length; j++) { \ 872 dstPtr2 += dstStride[plane] / 2; \ 873 srcPtr2 += srcStride[plane] / 2; \ 875 #define COPY9_OR_10TO9_OR_10_2(rfunc, wfunc) \ 876 if (dst_depth > src_depth) { \ 877 COPY9_OR_10TO9_OR_10(int srcpx = rfunc(&srcPtr2[j]); \ 878 wfunc(&dstPtr2[j], (srcpx << 1) | (srcpx >> 9))); \ 879 } else if (dst_depth < src_depth) { \ 880 DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \ 881 srcPtr2, srcStride[plane] / 2, rfunc, \ 882 dither_8x8_1, 1, clip9); \ 884 COPY9_OR_10TO9_OR_10(wfunc(&dstPtr2[j], rfunc(&srcPtr2[j]))); \ 900 #define W8(a, b) { *(a) = (b); } 901 #define COPY9_OR_10TO8(rfunc) \ 902 if (src_depth == 9) { \ 903 DITHER_COPY(dstPtr, dstStride[plane], W8, \ 904 srcPtr2, srcStride[plane] / 2, rfunc, \ 905 dither_8x8_1, 1, av_clip_uint8); \ 907 DITHER_COPY(dstPtr, dstStride[plane], W8, \ 908 srcPtr2, srcStride[plane] / 2, rfunc, \ 909 dither_8x8_3, 2, av_clip_uint8); \ 918 const int dst_depth = desc_dst->
comp[plane].
depth;
919 uint16_t *dstPtr2 = (uint16_t *) dstPtr;
922 const uint16_t *srcPtr2 = (
const uint16_t *) srcPtr;
923 #define COPY16TO9_OR_10(rfunc, wfunc) \ 924 if (dst_depth == 9) { \ 925 DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \ 926 srcPtr2, srcStride[plane] / 2, rfunc, \ 927 ff_dither_8x8_128, 7, clip9); \ 929 DITHER_COPY(dstPtr2, dstStride[plane] / 2, wfunc, \ 930 srcPtr2, srcStride[plane] / 2, rfunc, \ 931 dither_8x8_64, 6, clip10); \ 947 #define COPY8TO9_OR_10(wfunc) \ 949 for (i = 0; i < height; i++) { \ 950 for (j = 0; j < length; j++) { \ 951 const int srcpx = srcPtr[j]; \ 952 wfunc(&dstPtr2[j], srcpx << (dst_depth - 8)); \ 954 dstPtr2 += dstStride[plane] / 2; \ 955 srcPtr += srcStride[plane]; \ 958 for (i = 0; i < height; i++) { \ 959 for (j = 0; j < length; j++) { \ 960 const int srcpx = srcPtr[j]; \ 961 wfunc(&dstPtr2[j], (srcpx << (dst_depth - 8)) | (srcpx >> (16 - dst_depth))); \ 963 dstPtr2 += dstStride[plane] / 2; \ 964 srcPtr += srcStride[plane]; \ 974 const uint16_t *srcPtr2 = (
const uint16_t *) srcPtr;
975 #define COPY16TO8(rfunc) \ 976 DITHER_COPY(dstPtr, dstStride[plane], W8, \ 977 srcPtr2, srcStride[plane] / 2, rfunc, \ 978 dither_8x8_256, 8, av_clip_uint8); 985 for (i = 0; i <
height; i++) {
986 for (j = 0; j < length; j++) {
987 dstPtr[ j << 1 ] = srcPtr[j];
988 dstPtr[(j << 1) + 1] = srcPtr[j];
990 srcPtr += srcStride[plane];
991 dstPtr += dstStride[plane];
996 for (i = 0; i <
height; i++) {
997 for (j = 0; j < length; j++)
998 ((uint16_t *) dstPtr)[j] =
av_bswap16(((
const uint16_t *) srcPtr)[j]);
999 srcPtr += srcStride[plane];
1000 dstPtr += dstStride[plane];
1002 }
else if (dstStride[plane] == srcStride[plane] &&
1003 srcStride[plane] > 0 && srcStride[plane] == length) {
1004 memcpy(dst[plane] + dstStride[plane] * y, src[plane],
1005 height * dstStride[plane]);
1011 for (i = 0; i <
height; i++) {
1012 memcpy(dstPtr, srcPtr, length);
1013 srcPtr += srcStride[plane];
1014 dstPtr += dstStride[plane];
1023 #define IS_DIFFERENT_ENDIANESS(src_fmt, dst_fmt, pix_fmt) \ 1024 ((src_fmt == pix_fmt ## BE && dst_fmt == pix_fmt ## LE) || \ 1025 (src_fmt == pix_fmt ## LE && dst_fmt == pix_fmt ## BE)) 1036 needsDither =
isAnyRGB(dstFormat) &&
1079 #define isByteRGB(f) ( \ 1080 f == AV_PIX_FMT_RGB32 || \ 1081 f == AV_PIX_FMT_RGB32_1 || \ 1082 f == AV_PIX_FMT_RGB24 || \ 1083 f == AV_PIX_FMT_BGR32 || \ 1084 f == AV_PIX_FMT_BGR32_1 || \ 1085 f == AV_PIX_FMT_BGR24) 1111 if ((
usePal(srcFormat) && (
1149 if ( srcFormat == dstFormat ||
1178 src[3] = src[2] =
NULL;
1186 const int linesizes[4])
1191 for (i = 0; i < 4; i++) {
1193 if (!data[plane] || !linesizes[plane])
1205 const uint8_t *
const srcSlice[],
1206 const int srcStride[],
int srcSliceY,
1207 int srcSliceH,
uint8_t *
const dst[],
1208 const int dstStride[])
1211 const uint8_t *src2[4] = { srcSlice[0], srcSlice[1], srcSlice[2], srcSlice[3] };
1212 uint8_t *dst2[4] = { dst[0], dst[1], dst[2], dst[3] };
1227 if (c->
sliceDir == 0 && srcSliceY != 0 && srcSliceY + srcSliceH != c->
srcH) {
1236 for (i = 0; i < 256; i++) {
1237 int r,
g,
b, y,
u, v;
1239 uint32_t p = ((
const uint32_t *)(srcSlice[1]))[i];
1240 r = (p >> 16) & 0xFF;
1241 g = (p >> 8) & 0xFF;
1244 r = ( i >> 5 ) * 36;
1245 g = ((i >> 2) & 7) * 36;
1248 b = ( i >> 6 ) * 85;
1249 g = ((i >> 3) & 7) * 36;
1252 r = ( i >> 3 ) * 255;
1253 g = ((i >> 1) & 3) * 85;
1260 b = ( i >> 3 ) * 255;
1261 g = ((i >> 1) & 3) * 85;
1267 c->
pal_yuv[i] = y + (u << 8) + (v << 16) + (0xFF
U << 24);
1274 c->
pal_rgb[i] = r + (g << 8) + (b << 16) + (0xFF
U << 24);
1280 c->
pal_rgb[i] = 0xFF + (r << 8) + (g << 16) + ((unsigned)b << 24);
1286 c->
pal_rgb[i] = 0xFF + (b << 8) + (g << 16) + ((unsigned)r << 24);
1293 c->
pal_rgb[i] = b + (g << 8) + (r << 16) + (0xFF
U << 24);
1301 int srcStride2[4] = { srcStride[0], srcStride[1], srcStride[2],
1303 int dstStride2[4] = { dstStride[0], dstStride[1], dstStride[2],
1310 if (srcSliceY + srcSliceH == c->
srcH)
1313 return c->
swscale(c, src2, srcStride2, srcSliceY, srcSliceH, dst2,
1317 int srcStride2[4] = { -srcStride[0], -srcStride[1], -srcStride[2],
1319 int dstStride2[4] = { -dstStride[0], -dstStride[1], -dstStride[2],
1322 src2[0] += (srcSliceH - 1) * srcStride[0];
1326 src2[3] += (srcSliceH - 1) * srcStride[3];
1327 dst2[0] += ( c->
dstH - 1) * dstStride[0];
1330 dst2[3] += ( c->
dstH - 1) * dstStride[3];
1339 return c->
swscale(c, src2, srcStride2, c->
srcH-srcSliceY-srcSliceH,
1340 srcSliceH, dst2, dstStride2);
1346 int num_pixels,
const uint8_t *palette)
1350 for (i = 0; i < num_pixels; i++)
1351 ((uint32_t *) dst)[i] = ((
const uint32_t *) palette)[src[i]];
1356 int num_pixels,
const uint8_t *palette)
1360 for (i = 0; i < num_pixels; i++) {
1362 dst[0] = palette[src[i] * 4 + 0];
1363 dst[1] = palette[src[i] * 4 + 1];
1364 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.
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
void shuffle_bytes_1230(const uint8_t *src, uint8_t *dst, int src_size)
const char * sws_format_name(enum AVPixelFormat format)
int plane
Which of the 4 planes contains the component.
void(* rgb15to32)(const uint8_t *src, uint8_t *dst, int src_size)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
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[])
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.
8 bits gray, 8 bits alpha
void rgb16tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
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...
#define AV_PIX_FMT_RGBA64
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)
av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (%s)\, len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic ? ac->func_descr_generic :ac->func_descr)
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.
#define DECLARE_ALIGNED(n, t, v)
#define AV_PIX_FMT_BGRA64
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)
int srcRange
0 = MPG YUV range, 1 = JPG YUV range (source image).
#define COPY16TO9_OR_10(rfunc, wfunc)
#define AV_PIX_FMT_RGB444
void(* rgb16tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
static 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(* 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)
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[])
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
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.
8 bits with AV_PIX_FMT_RGB32 palette
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)
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
#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)
static int planarRgbToplanarRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
external api for the swscale stuff
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...
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[])
#define CONV_IS(src, dst)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_PIX_FMT_BGR32_1
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)
void shuffle_bytes_0321(const uint8_t *src, uint8_t *dst, int src_size)
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
void(* rgbConvFn)(const uint8_t *, uint8_t *, int)
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
static void fillPlane(uint8_t *plane, int stride, int width, int height, int y, uint8_t val)
like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian
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)
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
#define AV_PIX_FMT_GBRAP16
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
void(* rgb24to16)(const uint8_t *src, uint8_t *dst, int src_size)
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)
void(* interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst, int width, int height, int src1Stride, int src2Stride, int dstStride)
#define AV_PIX_FMT_GRAY16
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)
static av_always_inline int is9_OR_10BPS(enum AVPixelFormat pix_fmt)
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 RGB 8:8:8, 24bpp, BGRBGR...
void rgb12to15(const uint8_t *src, uint8_t *dst, int src_size)
enum AVPixelFormat pix_fmt
like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian
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)
static void gray8aToPacked32_1(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
#define AV_PIX_FMT_BGR555
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)
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
void(* deinterleaveBytes)(const uint8_t *src, uint8_t *dst1, uint8_t *dst2, int width, int height, int srcStride, int dst1Stride, int dst2Stride)
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)
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
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)
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
static void reset_ptr(const uint8_t *src[], enum AVPixelFormat 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.
SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c)
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)
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[])
#define AV_PIX_FMT_BGR565
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)
#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[])
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
planar GBRA 4:4:4:4 32bpp
#define AV_PIX_FMT_BGR444
enum AVPixelFormat srcFormat
Source pixel format.
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
static void packedtogbr24p(const uint8_t *src, int srcStride, uint8_t *dst[], int dstStride[], int srcSliceH, int alpha_first, int inc_size, int width)
#define AV_PIX_FMT_RGB555
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...
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_RGB32_1
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)
static int packedCopyWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
#define AV_PIX_FMT_RGB565
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)
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 depth
Number of bits in the component.
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(* 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)
#define AV_CEIL_RSHIFT(a, b)
Fast a / (1 << b) rounded toward +inf, assuming a >= 0 and b >= 0.
void rgb15to24(const uint8_t *src, uint8_t *dst, int src_size)