40 { 36, 68, 60, 92, 34, 66, 58, 90, },
41 { 100, 4, 124, 28, 98, 2, 122, 26, },
42 { 52, 84, 44, 76, 50, 82, 42, 74, },
43 { 116, 20, 108, 12, 114, 18, 106, 10, },
44 { 32, 64, 56, 88, 38, 70, 62, 94, },
45 { 96, 0, 120, 24, 102, 6, 126, 30, },
46 { 48, 80, 40, 72, 54, 86, 46, 78, },
47 { 112, 16, 104, 8, 118, 22, 110, 14, },
48 { 36, 68, 60, 92, 34, 66, 58, 90, },
52 64, 64, 64, 64, 64, 64, 64, 64
59 uint16_t *
src1 = (uint16_t*)src[0];
61 for (i = 0; i <
width; ++i) {
62 uint16_t
r =
AV_RL16(src1 + i*4 + 0);
63 uint16_t
g =
AV_RL16(src1 + i*4 + 1);
64 uint16_t
b =
AV_RL16(src1 + i*4 + 2);
66 AV_WL16(src1 + i*4 + 0, gamma[r]);
67 AV_WL16(src1 + i*4 + 1, gamma[g]);
68 AV_WL16(src1 + i*4 + 2, gamma[b]);
77 uint8_t *ptr = plane + stride * y;
78 for (i = 0; i <
height; i++) {
79 memset(ptr, val, width);
86 const int32_t *filterPos,
int filterSize)
91 const uint16_t *src = (
const uint16_t *) _src;
98 for (i = 0; i <
dstW; i++) {
100 int srcPos = filterPos[i];
103 for (j = 0; j < filterSize; j++) {
104 val += src[srcPos + j] * filter[filterSize * i + j];
107 dst[i] =
FFMIN(val >> sh, (1 << 19) - 1);
113 const int32_t *filterPos,
int filterSize)
117 const uint16_t *src = (
const uint16_t *) _src;
123 for (i = 0; i <
dstW; i++) {
125 int srcPos = filterPos[i];
128 for (j = 0; j < filterSize; j++) {
129 val += src[srcPos + j] * filter[filterSize * i + j];
132 dst[i] =
FFMIN(val >> sh, (1 << 15) - 1);
139 const int32_t *filterPos,
int filterSize)
142 for (i = 0; i <
dstW; i++) {
144 int srcPos = filterPos[i];
146 for (j = 0; j < filterSize; j++) {
147 val += ((int)src[srcPos + j]) * filter[filterSize * i + j];
149 dst[i] =
FFMIN(val >> 7, (1 << 15) - 1);
155 const int32_t *filterPos,
int filterSize)
159 for (i = 0; i <
dstW; i++) {
161 int srcPos = filterPos[i];
163 for (j = 0; j < filterSize; j++) {
164 val += ((int)src[srcPos + j]) * filter[filterSize * i + j];
166 dst[i] =
FFMIN(val >> 3, (1 << 19) - 1);
175 for (i = 0; i <
width; i++) {
176 dstU[i] = (
FFMIN(dstU[i], 30775) * 4663 - 9289992) >> 12;
177 dstV[i] = (
FFMIN(dstV[i], 30775) * 4663 - 9289992) >> 12;
184 for (i = 0; i <
width; i++) {
185 dstU[i] = (dstU[i] * 1799 + 4081085) >> 11;
186 dstV[i] = (dstV[i] * 1799 + 4081085) >> 11;
193 for (i = 0; i <
width; i++)
194 dst[i] = (
FFMIN(dst[i], 30189) * 19077 - 39057361) >> 14;
200 for (i = 0; i <
width; i++)
201 dst[i] = (dst[i] * 14071 + 33561947) >> 14;
209 for (i = 0; i <
width; i++) {
210 dstU[i] = (
FFMIN(dstU[i], 30775 << 4) * 4663 - (9289992 << 4)) >> 12;
211 dstV[i] = (
FFMIN(dstV[i], 30775 << 4) * 4663 - (9289992 << 4)) >> 12;
220 for (i = 0; i <
width; i++) {
221 dstU[i] = (dstU[i] * 1799 + (4081085 << 4)) >> 11;
222 dstV[i] = (dstV[i] * 1799 + (4081085 << 4)) >> 11;
230 for (i = 0; i <
width; i++) {
231 dst[i] = ((int)(
FFMIN(dst[i], 30189 << 4) * 4769
U - (39057361 << 2))) >> 12;
239 for (i = 0; i <
width; i++)
240 dst[i] = (dst[i]*(14071/4) + (33561947<<4)/4)>>12;
252 uint32_t *pal,
int isAlpha)
254 void (*toYV12)(
uint8_t *,
const uint8_t *,
const uint8_t *,
const uint8_t *, int, uint32_t *) =
257 const uint8_t *src = src_in[isAlpha ? 3 : 0];
260 toYV12(formatConvBuffer, src, src_in[1], src_in[2], srcW, pal);
271 c->
hyScale(c, dst, dstWidth, src, hLumFilter,
272 hLumFilterPos, hLumFilterSize);
278 convertRange(dst, dstWidth);
282 int16_t *dst2,
int dstWidth,
283 const uint8_t *src_in[4],
288 uint8_t *formatConvBuffer, uint32_t *pal)
290 const uint8_t *src1 = src_in[1], *src2 = src_in[2];
292 uint8_t *buf2 = formatConvBuffer +
294 c->
chrToYV12(formatConvBuffer, buf2, src_in[0], src1, src2, srcW, pal);
298 uint8_t *buf2 = formatConvBuffer +
306 c->
hcScale(c, dst1, dstWidth, src1, hChrFilter, hChrFilterPos, hChrFilterSize);
307 c->
hcScale(c, dst2, dstWidth, src2, hChrFilter, hChrFilterPos, hChrFilterSize);
309 c->
hcscale_fast(c, dst1, dst2, dstWidth, src1, src2, srcW, xInc);
317 #define DEBUG_SWSCALE_BUFFERS 0
318 #define DEBUG_BUFFERS(...) \
319 if (DEBUG_SWSCALE_BUFFERS) \
320 av_log(c, AV_LOG_DEBUG, __VA_ARGS__)
323 int srcStride[],
int srcSliceY,
324 int srcSliceH, uint8_t *dst[],
int dstStride[])
329 const int srcW = c->
srcW;
391 int chrStart = lumEnd;
418 srcStride[3] = srcStride[0];
423 DEBUG_BUFFERS(
"swscale() %p[%d] %p[%d] %p[%d] %p[%d] -> %p[%d] %p[%d] %p[%d] %p[%d]\n",
424 src[0], srcStride[0], src[1], srcStride[1],
425 src[2], srcStride[2], src[3], srcStride[3],
426 dst[0], dstStride[0], dst[1], dstStride[1],
427 dst[2], dstStride[2], dst[3], dstStride[3]);
428 DEBUG_BUFFERS(
"srcSliceY: %d srcSliceH: %d dstY: %d dstH: %d\n",
429 srcSliceY, srcSliceH, dstY, dstH);
430 DEBUG_BUFFERS(
"vLumFilterSize: %d vLumBufSize: %d vChrFilterSize: %d vChrBufSize: %d\n",
431 vLumFilterSize, vLumBufSize, vChrFilterSize, vChrBufSize);
433 if (dstStride[0]&15 || dstStride[1]&15 ||
434 dstStride[2]&15 || dstStride[3]&15) {
435 static int warnedAlready = 0;
438 "Warning: dstStride is not aligned!\n"
439 " ->cannot do aligned memory accesses anymore\n");
444 if ( (uintptr_t)dst[0]&15 || (uintptr_t)dst[1]&15 || (uintptr_t)dst[2]&15
445 || (uintptr_t)src[0]&15 || (uintptr_t)src[1]&15 || (uintptr_t)src[2]&15
446 || dstStride[0]&15 || dstStride[1]&15 || dstStride[2]&15 || dstStride[3]&15
447 || srcStride[0]&15 || srcStride[1]&15 || srcStride[2]&15 || srcStride[3]&15
449 static int warnedAlready=0;
460 if (srcSliceY == 0) {
468 if (!should_dither) {
478 srcSliceY, srcSliceH, chrSrcSliceY, chrSrcSliceH, 1);
483 if (srcSliceY == 0) {
497 for (; dstY <
dstH; dstY++) {
501 dst[0] + dstStride[0] *
dstY,
502 dst[1] + dstStride[1] * chrDstY,
503 dst[2] + dstStride[2] * chrDstY,
504 (CONFIG_SWSCALE_ALPHA &&
alpPixBuf) ? dst[3] + dstStride[3] * dstY :
NULL,
510 const int firstLumSrcY =
FFMAX(1 - vLumFilterSize, vLumFilterPos[dstY]);
513 const int firstChrSrcY =
FFMAX(1 - vChrFilterSize, vChrFilterPos[chrDstY]);
516 int lastLumSrcY =
FFMIN(c->
srcH, firstLumSrcY + vLumFilterSize) - 1;
517 int lastLumSrcY2 =
FFMIN(c->
srcH, firstLumSrcY2 + vLumFilterSize) - 1;
518 int lastChrSrcY =
FFMIN(c->
chrSrcH, firstChrSrcY + vChrFilterSize) - 1;
522 int posY, cPosY, firstPosY, lastPosY, firstCPosY, lastCPosY;
526 if (firstLumSrcY > lastInLumBuf) {
528 hasLumHoles = lastInLumBuf != firstLumSrcY - 1;
536 lastInLumBuf = firstLumSrcY - 1;
538 if (firstChrSrcY > lastInChrBuf) {
540 hasChrHoles = lastInChrBuf != firstChrSrcY - 1;
548 lastInChrBuf = firstChrSrcY - 1;
550 av_assert0(firstLumSrcY >= lastInLumBuf - vLumBufSize + 1);
551 av_assert0(firstChrSrcY >= lastInChrBuf - vChrBufSize + 1);
554 DEBUG_BUFFERS(
"\tfirstLumSrcY: %d lastLumSrcY: %d lastInLumBuf: %d\n",
555 firstLumSrcY, lastLumSrcY, lastInLumBuf);
556 DEBUG_BUFFERS(
"\tfirstChrSrcY: %d lastChrSrcY: %d lastInChrBuf: %d\n",
557 firstChrSrcY, lastChrSrcY, lastInChrBuf);
560 enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH &&
564 lastLumSrcY = srcSliceY + srcSliceH - 1;
565 lastChrSrcY = chrSrcSliceY + chrSrcSliceH - 1;
566 DEBUG_BUFFERS(
"buffering slice: lastLumSrcY %d lastChrSrcY %d\n",
567 lastLumSrcY, lastChrSrcY);
572 if (posY <= lastLumSrcY && !hasLumHoles) {
573 firstPosY =
FFMAX(firstLumSrcY, posY);
576 firstPosY = lastInLumBuf + 1;
577 lastPosY = lastLumSrcY;
581 if (cPosY <= lastChrSrcY && !hasChrHoles) {
582 firstCPosY =
FFMAX(firstChrSrcY, cPosY);
585 firstCPosY = lastInChrBuf + 1;
586 lastCPosY = lastChrSrcY;
591 if (posY < lastLumSrcY + 1) {
592 for (i = lumStart; i < lumEnd; ++i)
593 desc[i].
process(c, &desc[i], firstPosY, lastPosY - firstPosY + 1);
597 lastInLumBuf = lastLumSrcY;
599 if (cPosY < lastChrSrcY + 1) {
600 for (i = chrStart; i < chrEnd; ++i)
601 desc[i].
process(c, &desc[i], firstCPosY, lastCPosY - firstCPosY + 1);
605 lastInChrBuf = lastChrSrcY;
609 while (lastInLumBuf < lastLumSrcY) {
610 const uint8_t *src1[4] = {
611 src[0] + (lastInLumBuf + 1 - srcSliceY) * srcStride[0],
612 src[1] + (lastInLumBuf + 1 - srcSliceY) * srcStride[1],
613 src[2] + (lastInLumBuf + 1 - srcSliceY) * srcStride[2],
614 src[3] + (lastInLumBuf + 1 - srcSliceY) * srcStride[3],
618 av_assert0(lastInLumBuf + 1 - srcSliceY < srcSliceH);
619 av_assert0(lastInLumBuf + 1 - srcSliceY >= 0);
624 hyscale(c, lumPixBuf[lumBufIndex], dstW, src1, srcW, lumXInc,
625 hLumFilter, hLumFilterPos, hLumFilterSize,
626 formatConvBuffer, pal, 0);
627 if (CONFIG_SWSCALE_ALPHA && alpPixBuf)
628 hyscale(c, alpPixBuf[lumBufIndex], dstW, src1, srcW,
629 lumXInc, hLumFilter, hLumFilterPos, hLumFilterSize,
630 formatConvBuffer, pal, 1);
633 lumBufIndex, lastInLumBuf);
635 while (lastInChrBuf < lastChrSrcY) {
636 const uint8_t *src1[4] = {
637 src[0] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[0],
638 src[1] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[1],
639 src[2] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[2],
640 src[3] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[3],
644 av_assert0(lastInChrBuf + 1 - chrSrcSliceY < (chrSrcSliceH));
645 av_assert0(lastInChrBuf + 1 - chrSrcSliceY >= 0);
649 hcscale(c, chrUPixBuf[chrBufIndex], chrVPixBuf[chrBufIndex],
650 chrDstW, src1, chrSrcW, chrXInc,
651 hChrFilter, hChrFilterPos, hChrFilterSize,
652 formatConvBuffer, pal);
655 chrBufIndex, lastInChrBuf);
659 if (lumBufIndex >= vLumBufSize)
661 if (chrBufIndex >= vChrBufSize)
668 lastInLumBuf, lastInChrBuf);
674 if (dstY >= dstH - 2) {
678 &yuv2packed1, &yuv2packed2, &yuv2packedX, &yuv2anyX);
681 yuv2packed1, yuv2packed2, yuv2packedX, yuv2anyX, use_mmx_vfilter);
686 for (i = vStart; i < vEnd; ++i)
687 desc[i].
process(c, &desc[i], dstY, 1);
689 const int16_t **lumSrcPtr = (
const int16_t **)(
void*) lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf +
vLumBufSize;
690 const int16_t **chrUSrcPtr = (
const int16_t **)(
void*) chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf +
vChrBufSize;
691 const int16_t **chrVSrcPtr = (
const int16_t **)(
void*) chrVPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf +
vChrBufSize;
692 const int16_t **alpSrcPtr = (CONFIG_SWSCALE_ALPHA &&
alpPixBuf) ?
693 (
const int16_t **)(
void*) alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL;
718 if (vLumFilterSize == 1) {
726 if (!((dstY & chrSkipMask) ||
isGray(dstFormat))) {
729 vChrFilterSize, chrUSrcPtr, chrVSrcPtr,
731 }
else if (vChrFilterSize == 1) {
736 vChrFilterSize, chrUSrcPtr, dest[1],
739 vChrFilterSize, chrVSrcPtr, dest[2],
744 if (CONFIG_SWSCALE_ALPHA && alpPixBuf) {
748 if (vLumFilterSize == 1) {
753 vLumFilterSize, alpSrcPtr, dest[3],
757 }
else if (yuv2packedX) {
758 av_assert1(lumSrcPtr + vLumFilterSize - 1 < (
const int16_t **)lumPixBuf + vLumBufSize * 2);
759 av_assert1(chrUSrcPtr + vChrFilterSize - 1 < (
const int16_t **)chrUPixBuf + vChrBufSize * 2);
761 vChrFilterSize <= 2) {
762 int chrAlpha = vChrFilterSize == 1 ? 0 : vChrFilter[2 * dstY + 1];
764 alpPixBuf ? *alpSrcPtr : NULL,
765 dest[0], dstW, chrAlpha, dstY);
766 }
else if (c->
yuv2packed2 && vLumFilterSize == 2 &&
767 vChrFilterSize == 2) {
768 int lumAlpha = vLumFilter[2 * dstY + 1];
769 int chrAlpha = vChrFilter[2 * dstY + 1];
771 lumMmxFilter[3] = vLumFilter[2 *
dstY] * 0x10001;
773 chrMmxFilter[3] = vChrFilter[2 * chrDstY] * 0x10001;
775 alpPixBuf ? alpSrcPtr : NULL,
776 dest[0], dstW, lumAlpha, chrAlpha, dstY);
779 lumSrcPtr, vLumFilterSize,
780 vChrFilter + dstY * vChrFilterSize,
781 chrUSrcPtr, chrVSrcPtr, vChrFilterSize,
782 alpSrcPtr, dest[0], dstW, dstY);
786 yuv2anyX(c, vLumFilter + dstY * vLumFilterSize,
787 lumSrcPtr, vLumFilterSize,
788 vChrFilter + dstY * vChrFilterSize,
789 chrUSrcPtr, chrVSrcPtr, vChrFilterSize,
790 alpSrcPtr, dest, dstW, dstY);
799 int height = dstY - lastDstY;
803 fillPlane16(dst[3], dstStride[3], length, height, lastDstY,
807 fillPlane(dst[3], dstStride[3], length, height, lastDstY, 255);
810 #if HAVE_MMXEXT_INLINE
812 __asm__
volatile (
"sfence" :::
"memory");
823 return dstY - lastDstY;
901 src[3] = src[2] =
NULL;
909 const int linesizes[4])
916 for (i = 0; i < 4; i++) {
918 if (!data[plane] || !linesizes[plane])
926 const uint16_t *src,
int stride,
int h)
931 for (yp=0; yp<
h; yp++) {
932 for (xp=0; xp+2<
stride; xp+=3) {
933 int x, y, z,
r,
g,
b;
961 r = av_clip_uintp2(r, 12);
962 g = av_clip_uintp2(g, 12);
963 b = av_clip_uintp2(b, 12);
982 const uint16_t *src,
int stride,
int h)
987 for (yp=0; yp<
h; yp++) {
988 for (xp=0; xp+2<
stride; xp+=3) {
989 int x, y, z,
r,
g,
b;
1017 x = av_clip_uintp2(x, 12);
1018 y = av_clip_uintp2(y, 12);
1019 z = av_clip_uintp2(z, 12);
1042 const uint8_t *
const srcSlice[],
1043 const int srcStride[],
int srcSliceY,
1044 int srcSliceH, uint8_t *
const dst[],
1045 const int dstStride[])
1048 const uint8_t *src2[4];
1050 uint8_t *rgb0_tmp =
NULL;
1053 if (!srcStride || !dstStride || !dst || !srcSlice) {
1054 av_log(c,
AV_LOG_ERROR,
"One of the input parameters to sws_scale() is NULL, please check the calling code\n");
1058 if ((srcSliceY & (macro_height-1)) ||
1059 ((srcSliceH& (macro_height-1)) && srcSliceY + srcSliceH != c->
srcH) ||
1060 srcSliceY + srcSliceH > c->
srcH) {
1061 av_log(c,
AV_LOG_ERROR,
"Slice parameters %d, %d are invalid\n", srcSliceY, srcSliceH);
1069 srcSlice, srcStride, srcSliceY, srcSliceH,
1093 srcSlice, srcStride, srcSliceY, srcSliceH,
1103 memcpy(src2, srcSlice,
sizeof(src2));
1104 memcpy(dst2, dst,
sizeof(dst2));
1119 if (c->
sliceDir == 0 && srcSliceY != 0 && srcSliceY + srcSliceH != c->
srcH) {
1128 for (i = 0; i < 256; i++) {
1129 int r,
g,
b, y, u, v,
a = 0xff;
1131 uint32_t p = ((
const uint32_t *)(srcSlice[1]))[i];
1132 a = (p >> 24) & 0xFF;
1133 r = (p >> 16) & 0xFF;
1134 g = (p >> 8) & 0xFF;
1137 r = ( i >> 5 ) * 36;
1138 g = ((i >> 2) & 7) * 36;
1141 b = ( i >> 6 ) * 85;
1142 g = ((i >> 3) & 7) * 36;
1145 r = ( i >> 3 ) * 255;
1146 g = ((i >> 1) & 3) * 85;
1152 b = ( i >> 3 ) * 255;
1153 g = ((i >> 1) & 3) * 85;
1156 #define RGB2YUV_SHIFT 15
1157 #define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1158 #define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1159 #define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1160 #define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1161 #define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1162 #define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1163 #define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1164 #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1165 #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1170 c->
pal_yuv[i]= y + (u<<8) + (v<<16) + ((unsigned)a<<24);
1177 c->
pal_rgb[i]= r + (g<<8) + (b<<16) + ((unsigned)a<<24);
1183 c->
pal_rgb[i]= a + (r<<8) + (g<<16) + ((unsigned)b<<24);
1189 c->
pal_rgb[i]= a + (b<<8) + (g<<16) + ((unsigned)r<<24);
1196 c->
pal_rgb[i]= b + (g<<8) + (r<<16) + ((unsigned)a<<24);
1208 base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
1209 for (y=0; y<srcSliceH; y++){
1210 memcpy(base + srcStride[0]*y, src2[0] + srcStride[0]*y, 4*c->
srcW);
1211 for (x=c->
src0Alpha-1; x<4*c->srcW; x+=4) {
1212 base[ srcStride[0]*y + x] = 0xFF;
1224 base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
1226 xyz12Torgb48(c, (uint16_t*)base, (
const uint16_t*)src2[0], srcStride[0]/2, srcSliceH);
1231 for (i = 0; i < 4; i++)
1238 int srcStride2[4] = { srcStride[0], srcStride[1], srcStride[2],
1240 int dstStride2[4] = { dstStride[0], dstStride[1], dstStride[2],
1247 if (srcSliceY + srcSliceH == c->
srcH)
1250 ret = c->
swscale(c, src2, srcStride2, srcSliceY, srcSliceH, dst2,
1254 int srcStride2[4] = { -srcStride[0], -srcStride[1], -srcStride[2],
1256 int dstStride2[4] = { -dstStride[0], -dstStride[1], -dstStride[2],
1259 src2[0] += (srcSliceH - 1) * srcStride[0];
1263 src2[3] += (srcSliceH - 1) * srcStride[3];
1264 dst2[0] += ( c->
dstH - 1) * dstStride[0];
1267 dst2[3] += ( c->
dstH - 1) * dstStride[3];
1276 ret = c->
swscale(c, src2, srcStride2, c->
srcH-srcSliceY-srcSliceH,
1277 srcSliceH, dst2, dstStride2);
1283 rgb48Toxyz12(c, (uint16_t*)dst2[0], (
const uint16_t*)dst2[0], dstStride[0]/2, ret);
int plane
Which of the 4 planes contains the component.
int16_t ** alpPixBuf
Ring buffer for scaled horizontal alpha plane lines to be fed to the vertical scaler.
const char const char void * val
int chrBufIndex
Index in ring buffer of the last scaled horizontal chroma line from source.
static void lumRangeToJpeg_c(int16_t *dst, int width)
void(* hcscale_fast)(struct SwsContext *c, int16_t *dst1, int16_t *dst2, int dstWidth, const uint8_t *src1, const uint8_t *src2, int srcW, int xInc)
av_cold void ff_sws_init_output_funcs(SwsContext *c, yuv2planar1_fn *yuv2plane1, yuv2planarX_fn *yuv2planeX, yuv2interleavedX_fn *yuv2nv12cX, yuv2packed1_fn *yuv2packed1, yuv2packed2_fn *yuv2packed2, yuv2packedX_fn *yuv2packedX, yuv2anyX_fn *yuv2anyX)
static enum AVPixelFormat pix_fmt
static void chrRangeFromJpeg_c(int16_t *dstU, int16_t *dstV, int width)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
int chrSrcH
Height of source chroma planes.
ptrdiff_t const GLvoid * data
static void reset_ptr(const uint8_t *src[], enum AVPixelFormat format)
#define AV_LOG_WARNING
Something somehow does not look correct.
packed RGB 8:8:8, 24bpp, RGBRGB...
int ff_init_slice_from_src(SwsSlice *s, uint8_t *src[4], int stride[4], int srcW, int lumY, int lumH, int chrY, int chrH, int relative)
int vChrDrop
Binary logarithm of extra vertical subsampling factor in source image chroma planes specified by user...
static void lumRangeToJpeg16_c(int16_t *_dst, int width)
Struct which holds all necessary data for processing a slice.
#define DECLARE_ALIGNED(n, t, v)
static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
int srcRange
0 = MPG YUV range, 1 = JPG YUV range (source image).
const uint8_t * lumDither8
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
int dstY
Last destination vertical line output from last slice.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
void ff_sws_init_input_funcs(SwsContext *c)
int srcH
Height of source luma/alpha planes.
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
static void rgb48Toxyz12(struct SwsContext *c, uint16_t *dst, const uint16_t *src, int stride, int h)
static void hScale16To19_c(SwsContext *c, int16_t *_dst, int dstW, const uint8_t *_src, const int16_t *filter, const int32_t *filterPos, int filterSize)
int ff_rotate_slice(SwsSlice *s, int lum, int chr)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int chrDstVSubSample
Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in destination i...
void(* yuv2interleavedX_fn)(struct SwsContext *c, const int16_t *chrFilter, int chrFilterSize, const int16_t **chrUSrc, const int16_t **chrVSrc, uint8_t *dest, int dstW)
Write one line of horizontally scaled chroma to interleaved output with multi-point vertical scaling ...
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
static void lumRangeFromJpeg_c(int16_t *dst, int width)
void(* readChrPlanar)(uint8_t *dstU, uint8_t *dstV, const uint8_t *src[4], int width, int32_t *rgb2yuv)
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
8 bit with AV_PIX_FMT_RGB32 palette
int vChrFilterSize
Vertical filter size for chroma pixels.
void(* yuv2anyX_fn)(struct SwsContext *c, const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, const int16_t *chrFilter, const int16_t **chrUSrc, const int16_t **chrVSrc, int chrFilterSize, const int16_t **alpSrc, uint8_t **dest, int dstW, int y)
Write one line of horizontally scaled Y/U/V/A to YUV/RGB output by doing multi-point vertical scaling...
int16_t ** lumPixBuf
Ring buffer for scaled horizontal luma plane lines to be fed to the vertical scaler.
#define AV_CPU_FLAG_MMXEXT
SSE integer functions or AMD MMX ext.
void(* lumToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3, int width, uint32_t *pal)
Unscaled conversion of luma plane to YV12 for horizontal scaler.
static void filter(int16_t *output, ptrdiff_t out_stride, int16_t *low, ptrdiff_t low_stride, int16_t *high, ptrdiff_t high_stride, int len, uint8_t clip)
int cascaded_tmpStride[4]
av_cold void ff_sws_init_swscale_x86(SwsContext *c)
#define SWS_FAST_BILINEAR
int lastInLumBuf
Last scaled horizontal luma/alpha line from source in the ring buffer.
int16_t rgb2xyz_matrix[3][4]
enum AVPixelFormat dstFormat
Destination pixel format.
yuv2packedX_fn yuv2packedX
void ff_init_vscale_pfn(SwsContext *c, yuv2planar1_fn yuv2plane1, yuv2planarX_fn yuv2planeX, yuv2interleavedX_fn yuv2nv12cX, yuv2packed1_fn yuv2packed1, yuv2packed2_fn yuv2packed2, yuv2packedX_fn yuv2packedX, yuv2anyX_fn yuv2anyX, int use_mmx)
setup vertical scaler functions
void(* lumConvertRange)(int16_t *dst, int width)
Color range conversion function for luma plane if needed.
int32_t * vChrFilterPos
Array of vertical filter starting positions for each dst[i] for chroma planes.
#define DEBUG_BUFFERS(...)
int dstH
Height of destination luma/alpha planes.
void(* yuv2packed1_fn)(struct SwsContext *c, const int16_t *lumSrc, const int16_t *chrUSrc[2], const int16_t *chrVSrc[2], const int16_t *alpSrc, uint8_t *dest, int dstW, int uvalpha, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output without any additional v...
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_PIX_FMT_BGR32_1
int16_t ** chrVPixBuf
Ring buffer for scaled horizontal chroma plane lines to be fed to the vertical scaler.
int32_t * hChrFilterPos
Array of horizontal filter starting positions for each dst[i] for chroma planes.
int hLumFilterSize
Horizontal filter size for luma/alpha pixels.
SwsFunc ff_getSwsFunc(SwsContext *c)
Return function pointer to fastest main scaler path function depending on architecture and available ...
static void chrRangeToJpeg_c(int16_t *dstU, int16_t *dstV, int width)
yuv2packed1_fn yuv2packed1
simple assert() macros that are a bit more flexible than ISO C assert().
static void hScale16To15_c(SwsContext *c, int16_t *dst, int dstW, const uint8_t *_src, const int16_t *filter, const int32_t *filterPos, int filterSize)
void ff_hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2, int dstWidth, const uint8_t *src1, const uint8_t *src2, int srcW, int xInc)
int vChrBufSize
Number of vertical chroma lines allocated in the ring buffer.
static int check_image_pointers(const uint8_t *const data[4], enum AVPixelFormat pix_fmt, const int linesizes[4])
int chrDstW
Width of destination chroma planes.
uint8_t * cascaded1_tmp[4]
static av_cold void sws_init_swscale(SwsContext *c)
SwsPlane plane[MAX_SLICE_PLANES]
color planes
int32_t alpMmxFilter[4 *MAX_FILTER_SIZE]
void(* chrConvertRange)(int16_t *dst1, int16_t *dst2, int width)
Color range conversion function for chroma planes if needed.
int32_t * hLumFilterPos
Array of horizontal filter starting positions for each dst[i] for luma/alpha planes.
int hChrFilterSize
Horizontal filter size for chroma pixels.
int sliceH
number of lines
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
static void xyz12Torgb48(struct SwsContext *c, uint16_t *dst, const uint16_t *src, int stride, int h)
av_cold void ff_sws_init_swscale_ppc(SwsContext *c)
int dstRange
0 = MPG YUV range, 1 = JPG YUV range (destination image).
void(* yuv2planar1_fn)(const int16_t *src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
Write one line of horizontally scaled data to planar output without any additional vertical scaling (...
ptrdiff_t uv_offx2
offset (in bytes) between u and v planes
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
uint8_t * formatConvBuffer
static av_always_inline int is9_OR_10BPS(enum AVPixelFormat pix_fmt)
yuv2planar1_fn yuv2plane1
int vLumBufSize
Number of vertical luma/alpha lines allocated in the ring buffer.
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
int16_t ** chrUPixBuf
Ring buffer for scaled horizontal chroma plane lines to be fed to the vertical scaler.
yuv2interleavedX_fn yuv2nv12cX
int(* process)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
void(* hcScale)(struct SwsContext *c, int16_t *dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
void(* readLumPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv)
Functions to read planar input, such as planar RGB, and convert internally to Y/UV/A.
packed RGB 8:8:8, 24bpp, BGRBGR...
av_cold void ff_sws_init_range_convert(SwsContext *c)
struct SwsFilterDescriptor * desc
int dstW
Width of destination luma/alpha planes.
uint8_t * cascaded_tmp[4]
int sliceDir
Direction that slices are fed to the scaler (1 = top-to-bottom, -1 = bottom-to-top).
int cascaded1_tmpStride[4]
int needs_hcscale
Set if there are chroma planes to be converted.
int32_t * vLumFilterPos
Array of vertical filter starting positions for each dst[i] for luma/alpha planes.
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
int32_t lumMmxFilter[4 *MAX_FILTER_SIZE]
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
int width
Slice line width.
int16_t xyz2rgb_matrix[3][4]
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...
yuv2planarX_fn yuv2planeX
static const char * format
const uint8_t ff_dither_8x8_128[9][8]
Struct which defines a slice of an image to be scaled or a output for a scaled slice.
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.
static av_always_inline void fillPlane(uint8_t *plane, int stride, int width, int height, int y, uint8_t val)
static void lumRangeFromJpeg16_c(int16_t *_dst, int width)
BYTE int const BYTE int int int height
int(* SwsFunc)(struct SwsContext *context, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
void ff_hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth, const uint8_t *src, int srcW, int xInc)
int vLumFilterSize
Vertical filter size for luma/alpha pixels.
static av_always_inline int isPlanarYUV(enum AVPixelFormat pix_fmt)
int16_t * vChrFilter
Array of vertical filter coefficients for chroma planes.
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
int16_t * hLumFilter
Array of horizontal filter coefficients for luma/alpha planes.
static void fillPlane16(uint8_t *plane, int stride, int width, int height, int y, int alpha, int bits, const int big_endian)
const uint8_t * chrDither8
static void chrRangeToJpeg16_c(int16_t *_dstU, int16_t *_dstV, int width)
int lumBufIndex
Index in ring buffer of the last scaled horizontal luma/alpha line from source.
static int swscale(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb...
int lastInChrBuf
Last scaled horizontal chroma line from source in the ring buffer.
GLint GLenum GLboolean GLsizei stride
yuv2packed2_fn yuv2packed2
void(* readAlpPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv)
void(* yuv2planarX_fn)(const int16_t *filter, int filterSize, const int16_t **src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
Write one line of horizontally scaled data to planar output with multi-point vertical scaling between...
void(* yuv2packed2_fn)(struct SwsContext *c, const int16_t *lumSrc[2], const int16_t *chrUSrc[2], const int16_t *chrVSrc[2], const int16_t *alpSrc[2], uint8_t *dest, int dstW, int yalpha, int uvalpha, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output by doing bilinear scalin...
Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb...
void(* yuv2packedX_fn)(struct SwsContext *c, const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, const int16_t *chrFilter, const int16_t **chrUSrc, const int16_t **chrVSrc, int chrFilterSize, const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output by doing multi-point ver...
enum AVPixelFormat srcFormat
Source pixel format.
int32_t chrMmxFilter[4 *MAX_FILTER_SIZE]
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
void(* hyscale_fast)(struct SwsContext *c, int16_t *dst, int dstWidth, const uint8_t *src, int srcW, int xInc)
Scale one horizontal line of input data using a bilinear filter to produce one line of output data...
struct SwsContext * cascaded_context[3]
#define AV_PIX_FMT_FLAG_BE
Pixel format is big-endian.
SwsFunc swscale
Note that src, dst, srcStride, dstStride will be copied in the sws_scale() wrapper so they can be fre...
void(* alpToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3, int width, uint32_t *pal)
Unscaled conversion of alpha plane to YV12 for horizontal scaler.
void ff_updateMMXDitherTables(SwsContext *c, int dstY, int lumBufIndex, int chrBufIndex, int lastInLumBuf, int lastInChrBuf)
#define AV_PIX_FMT_RGB32_1
static int gamma_convert(SwsContext *c, SwsFilterDescriptor *desc, int sliceY, int sliceH)
void(* chrToYV12)(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1, const uint8_t *src2, const uint8_t *src3, int width, uint32_t *pal)
Unscaled conversion of chroma planes to YV12 for horizontal scaler.
static void chrRangeFromJpeg16_c(int16_t *_dstU, int16_t *_dstV, int width)
int32_t input_rgb2yuv_table[16+40 *4]
int16_t * vLumFilter
Array of vertical filter coefficients for luma/alpha planes.
#define AV_CPU_FLAG_SSE2
PIV SSE2 functions.
static const uint8_t sws_pb_64[8]
static av_always_inline int usePal(enum AVPixelFormat pix_fmt)
int16_t * hChrFilter
Array of horizontal filter coefficients for chroma planes.
static void hScale8To15_c(SwsContext *c, int16_t *dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
int sliceY
index of first line
int chrSrcW
Width of source chroma planes.
int depth
Number of bits in the component.
int srcW
Width of source luma/alpha planes.
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(* hyScale)(struct SwsContext *c, int16_t *dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
Scale one horizontal line of input data using a filter over the input lines, to produce one (differen...
#define AV_CEIL_RSHIFT(a, b)
static void hScale8To19_c(SwsContext *c, int16_t *_dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)