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
58 uint16_t *
src1 = (uint16_t*)src[0];
60 for (i = 0; i <
width; ++i) {
61 uint16_t
r =
AV_RL16(src1 + i*4 + 0);
62 uint16_t
g =
AV_RL16(src1 + i*4 + 1);
63 uint16_t
b =
AV_RL16(src1 + i*4 + 2);
65 AV_WL16(src1 + i*4 + 0, gamma[r]);
66 AV_WL16(src1 + i*4 + 1, gamma[g]);
67 AV_WL16(src1 + i*4 + 2, gamma[b]);
76 for (i = 0; i <
height; i++) {
77 memset(ptr, val, width);
84 const int32_t *filterPos,
int filterSize)
89 const uint16_t *
src = (
const uint16_t *) _src;
96 for (i = 0; i <
dstW; i++) {
98 int srcPos = filterPos[i];
101 for (j = 0; j < filterSize; j++) {
102 val += src[srcPos + j] * filter[filterSize * i + j];
105 dst[i] =
FFMIN(val >> sh, (1 << 19) - 1);
111 const int32_t *filterPos,
int filterSize)
115 const uint16_t *
src = (
const uint16_t *) _src;
121 for (i = 0; i <
dstW; i++) {
123 int srcPos = filterPos[i];
126 for (j = 0; j < filterSize; j++) {
127 val += src[srcPos + j] * filter[filterSize * i + j];
130 dst[i] =
FFMIN(val >> sh, (1 << 15) - 1);
137 const int32_t *filterPos,
int filterSize)
140 for (i = 0; i <
dstW; i++) {
142 int srcPos = filterPos[i];
144 for (j = 0; j < filterSize; j++) {
145 val += ((int)src[srcPos + j]) * filter[filterSize * i + j];
147 dst[i] =
FFMIN(val >> 7, (1 << 15) - 1);
153 const int32_t *filterPos,
int filterSize)
157 for (i = 0; i <
dstW; i++) {
159 int srcPos = filterPos[i];
161 for (j = 0; j < filterSize; j++) {
162 val += ((int)src[srcPos + j]) * filter[filterSize * i + j];
164 dst[i] =
FFMIN(val >> 3, (1 << 19) - 1);
173 for (i = 0; i <
width; i++) {
174 dstU[i] = (
FFMIN(dstU[i], 30775) * 4663 - 9289992) >> 12;
175 dstV[i] = (
FFMIN(dstV[i], 30775) * 4663 - 9289992) >> 12;
182 for (i = 0; i <
width; i++) {
183 dstU[i] = (dstU[i] * 1799 + 4081085) >> 11;
184 dstV[i] = (dstV[i] * 1799 + 4081085) >> 11;
191 for (i = 0; i <
width; i++)
192 dst[i] = (
FFMIN(dst[i], 30189) * 19077 - 39057361) >> 14;
198 for (i = 0; i <
width; i++)
199 dst[i] = (dst[i] * 14071 + 33561947) >> 14;
207 for (i = 0; i <
width; i++) {
208 dstU[i] = (
FFMIN(dstU[i], 30775 << 4) * 4663 - (9289992 << 4)) >> 12;
209 dstV[i] = (
FFMIN(dstV[i], 30775 << 4) * 4663 - (9289992 << 4)) >> 12;
218 for (i = 0; i <
width; i++) {
219 dstU[i] = (dstU[i] * 1799 + (4081085 << 4)) >> 11;
220 dstV[i] = (dstV[i] * 1799 + (4081085 << 4)) >> 11;
228 for (i = 0; i <
width; i++) {
229 dst[i] = ((int)(
FFMIN(dst[i], 30189 << 4) * 4769
U - (39057361 << 2))) >> 12;
237 for (i = 0; i <
width; i++)
238 dst[i] = (dst[i]*(14071/4) + (33561947<<4)/4)>>12;
249 uint32_t *pal,
int isAlpha)
251 void (*toYV12)(
uint8_t *,
const uint8_t *,
const uint8_t *,
const uint8_t *, int, uint32_t *) =
254 const uint8_t *
src = src_in[isAlpha ? 3 : 0];
257 toYV12(formatConvBuffer,
src, src_in[1], src_in[2], srcW, pal);
269 hLumFilterPos, hLumFilterSize);
275 convertRange(dst, dstWidth);
279 int16_t *dst2,
int dstWidth,
287 const uint8_t *
src1 = src_in[1], *src2 = src_in[2];
289 uint8_t *buf2 = formatConvBuffer +
291 c->
chrToYV12(formatConvBuffer, buf2, src_in[0], src1, src2, srcW, pal);
295 uint8_t *buf2 = formatConvBuffer +
303 c->
hcScale(c, dst1, dstWidth, src1, hChrFilter, hChrFilterPos, hChrFilterSize);
304 c->
hcScale(c, dst2, dstWidth, src2, hChrFilter, hChrFilterPos, hChrFilterSize);
306 c->
hcscale_fast(c, dst1, dst2, dstWidth, src1, src2, srcW, xInc);
313 #define DEBUG_SWSCALE_BUFFERS 0
314 #define DEBUG_BUFFERS(...) \
315 if (DEBUG_SWSCALE_BUFFERS) \
316 av_log(c, AV_LOG_DEBUG, __VA_ARGS__)
319 int srcStride[],
int srcSliceY,
320 int srcSliceH,
uint8_t *dst[],
int dstStride[])
387 int chrStart = lumEnd;
414 srcStride[3] = srcStride[0];
419 DEBUG_BUFFERS(
"swscale() %p[%d] %p[%d] %p[%d] %p[%d] -> %p[%d] %p[%d] %p[%d] %p[%d]\n",
420 src[0], srcStride[0], src[1], srcStride[1],
421 src[2], srcStride[2], src[3], srcStride[3],
422 dst[0], dstStride[0], dst[1], dstStride[1],
423 dst[2], dstStride[2], dst[3], dstStride[3]);
424 DEBUG_BUFFERS(
"srcSliceY: %d srcSliceH: %d dstY: %d dstH: %d\n",
425 srcSliceY, srcSliceH, dstY, dstH);
426 DEBUG_BUFFERS(
"vLumFilterSize: %d vLumBufSize: %d vChrFilterSize: %d vChrBufSize: %d\n",
427 vLumFilterSize, vLumBufSize, vChrFilterSize, vChrBufSize);
429 if (dstStride[0]&15 || dstStride[1]&15 ||
430 dstStride[2]&15 || dstStride[3]&15) {
431 static int warnedAlready = 0;
434 "Warning: dstStride is not aligned!\n"
435 " ->cannot do aligned memory accesses anymore\n");
440 if ( (uintptr_t)dst[0]&15 || (uintptr_t)dst[1]&15 || (uintptr_t)dst[2]&15
441 || (uintptr_t)src[0]&15 || (uintptr_t)src[1]&15 || (uintptr_t)src[2]&15
442 || dstStride[0]&15 || dstStride[1]&15 || dstStride[2]&15 || dstStride[3]&15
443 || srcStride[0]&15 || srcStride[1]&15 || srcStride[2]&15 || srcStride[3]&15
445 static int warnedAlready=0;
456 if (srcSliceY == 0) {
464 if (!should_dither) {
474 srcSliceY, srcSliceH, chrSrcSliceY, chrSrcSliceH);
492 for (; dstY <
dstH; dstY++) {
496 dst[0] + dstStride[0] *
dstY,
497 dst[1] + dstStride[1] * chrDstY,
498 dst[2] + dstStride[2] * chrDstY,
499 (CONFIG_SWSCALE_ALPHA &&
alpPixBuf) ? dst[3] + dstStride[3] * dstY :
NULL,
505 const int firstLumSrcY =
FFMAX(1 - vLumFilterSize, vLumFilterPos[dstY]);
508 const int firstChrSrcY =
FFMAX(1 - vChrFilterSize, vChrFilterPos[chrDstY]);
511 int lastLumSrcY =
FFMIN(c->
srcH, firstLumSrcY + vLumFilterSize) - 1;
512 int lastLumSrcY2 =
FFMIN(c->
srcH, firstLumSrcY2 + vLumFilterSize) - 1;
513 int lastChrSrcY =
FFMIN(c->
chrSrcH, firstChrSrcY + vChrFilterSize) - 1;
517 int posY, cPosY, firstPosY, lastPosY, firstCPosY, lastCPosY;
521 if (firstLumSrcY > lastInLumBuf) {
523 hasLumHoles = lastInLumBuf != firstLumSrcY - 1;
531 lastInLumBuf = firstLumSrcY - 1;
533 if (firstChrSrcY > lastInChrBuf) {
535 hasChrHoles = lastInChrBuf != firstChrSrcY - 1;
543 lastInChrBuf = firstChrSrcY - 1;
545 av_assert0(firstLumSrcY >= lastInLumBuf - vLumBufSize + 1);
546 av_assert0(firstChrSrcY >= lastInChrBuf - vChrBufSize + 1);
549 DEBUG_BUFFERS(
"\tfirstLumSrcY: %d lastLumSrcY: %d lastInLumBuf: %d\n",
550 firstLumSrcY, lastLumSrcY, lastInLumBuf);
551 DEBUG_BUFFERS(
"\tfirstChrSrcY: %d lastChrSrcY: %d lastInChrBuf: %d\n",
552 firstChrSrcY, lastChrSrcY, lastInChrBuf);
555 enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH &&
559 lastLumSrcY = srcSliceY + srcSliceH - 1;
560 lastChrSrcY = chrSrcSliceY + chrSrcSliceH - 1;
561 DEBUG_BUFFERS(
"buffering slice: lastLumSrcY %d lastChrSrcY %d\n",
562 lastLumSrcY, lastChrSrcY);
567 if (posY <= lastLumSrcY && !hasLumHoles) {
568 firstPosY =
FFMAX(firstLumSrcY, posY);
571 firstPosY = lastInLumBuf + 1;
572 lastPosY = lastLumSrcY;
576 if (cPosY <= lastChrSrcY && !hasChrHoles) {
577 firstCPosY =
FFMAX(firstChrSrcY, cPosY);
580 firstCPosY = lastInChrBuf + 1;
581 lastCPosY = lastChrSrcY;
586 if (posY < lastLumSrcY + 1) {
587 for (i = lumStart; i < lumEnd; ++i)
588 desc[i].
process(c, &desc[i], firstPosY, lastPosY - firstPosY + 1);
592 lastInLumBuf = lastLumSrcY;
594 if (cPosY < lastChrSrcY + 1) {
595 for (i = chrStart; i < chrEnd; ++i)
596 desc[i].
process(c, &desc[i], firstCPosY, lastCPosY - firstCPosY + 1);
600 lastInChrBuf = lastChrSrcY;
604 while (lastInLumBuf < lastLumSrcY) {
606 src[0] + (lastInLumBuf + 1 - srcSliceY) * srcStride[0],
607 src[1] + (lastInLumBuf + 1 - srcSliceY) * srcStride[1],
608 src[2] + (lastInLumBuf + 1 - srcSliceY) * srcStride[2],
609 src[3] + (lastInLumBuf + 1 - srcSliceY) * srcStride[3],
613 av_assert0(lastInLumBuf + 1 - srcSliceY < srcSliceH);
614 av_assert0(lastInLumBuf + 1 - srcSliceY >= 0);
619 hyscale(c, lumPixBuf[lumBufIndex], dstW, src1, srcW, lumXInc,
620 hLumFilter, hLumFilterPos, hLumFilterSize,
621 formatConvBuffer, pal, 0);
622 if (CONFIG_SWSCALE_ALPHA && alpPixBuf)
623 hyscale(c, alpPixBuf[lumBufIndex], dstW, src1, srcW,
624 lumXInc, hLumFilter, hLumFilterPos, hLumFilterSize,
625 formatConvBuffer, pal, 1);
628 lumBufIndex, lastInLumBuf);
630 while (lastInChrBuf < lastChrSrcY) {
632 src[0] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[0],
633 src[1] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[1],
634 src[2] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[2],
635 src[3] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[3],
639 av_assert0(lastInChrBuf + 1 - chrSrcSliceY < (chrSrcSliceH));
640 av_assert0(lastInChrBuf + 1 - chrSrcSliceY >= 0);
644 hcscale(c, chrUPixBuf[chrBufIndex], chrVPixBuf[chrBufIndex],
645 chrDstW, src1, chrSrcW, chrXInc,
646 hChrFilter, hChrFilterPos, hChrFilterSize,
647 formatConvBuffer, pal);
650 chrBufIndex, lastInChrBuf);
654 if (lumBufIndex >= vLumBufSize)
656 if (chrBufIndex >= vChrBufSize)
663 lastInLumBuf, lastInChrBuf);
669 if (dstY >= dstH - 2) {
673 &yuv2packed1, &yuv2packed2, &yuv2packedX, &yuv2anyX);
676 yuv2packed1, yuv2packed2, yuv2packedX, yuv2anyX, use_mmx_vfilter);
681 for (i = vStart; i < vEnd; ++i)
682 desc[i].
process(c, &desc[i], dstY, 1);
684 const int16_t **lumSrcPtr = (
const int16_t **)(
void*) lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf +
vLumBufSize;
685 const int16_t **chrUSrcPtr = (
const int16_t **)(
void*) chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf +
vChrBufSize;
686 const int16_t **chrVSrcPtr = (
const int16_t **)(
void*) chrVPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf +
vChrBufSize;
687 const int16_t **alpSrcPtr = (CONFIG_SWSCALE_ALPHA &&
alpPixBuf) ?
688 (
const int16_t **)(
void*) alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL;
713 if (vLumFilterSize == 1) {
721 if (!((dstY & chrSkipMask) ||
isGray(dstFormat))) {
724 vChrFilterSize, chrUSrcPtr, chrVSrcPtr,
726 }
else if (vChrFilterSize == 1) {
731 vChrFilterSize, chrUSrcPtr, dest[1],
734 vChrFilterSize, chrVSrcPtr, dest[2],
739 if (CONFIG_SWSCALE_ALPHA && alpPixBuf) {
743 if (vLumFilterSize == 1) {
748 vLumFilterSize, alpSrcPtr, dest[3],
752 }
else if (yuv2packedX) {
753 av_assert1(lumSrcPtr + vLumFilterSize - 1 < (
const int16_t **)lumPixBuf + vLumBufSize * 2);
754 av_assert1(chrUSrcPtr + vChrFilterSize - 1 < (
const int16_t **)chrUPixBuf + vChrBufSize * 2);
756 vChrFilterSize <= 2) {
757 int chrAlpha = vChrFilterSize == 1 ? 0 : vChrFilter[2 * dstY + 1];
759 alpPixBuf ? *alpSrcPtr : NULL,
760 dest[0], dstW, chrAlpha, dstY);
761 }
else if (c->
yuv2packed2 && vLumFilterSize == 2 &&
762 vChrFilterSize == 2) {
763 int lumAlpha = vLumFilter[2 * dstY + 1];
764 int chrAlpha = vChrFilter[2 * dstY + 1];
766 lumMmxFilter[3] = vLumFilter[2 *
dstY] * 0x10001;
768 chrMmxFilter[3] = vChrFilter[2 * chrDstY] * 0x10001;
770 alpPixBuf ? alpSrcPtr : NULL,
771 dest[0], dstW, lumAlpha, chrAlpha, dstY);
774 lumSrcPtr, vLumFilterSize,
775 vChrFilter + dstY * vChrFilterSize,
776 chrUSrcPtr, chrVSrcPtr, vChrFilterSize,
777 alpSrcPtr, dest[0], dstW, dstY);
781 yuv2anyX(c, vLumFilter + dstY * vLumFilterSize,
782 lumSrcPtr, vLumFilterSize,
783 vChrFilter + dstY * vChrFilterSize,
784 chrUSrcPtr, chrVSrcPtr, vChrFilterSize,
785 alpSrcPtr, dest, dstW, dstY);
794 int height = dstY - lastDstY;
798 fillPlane16(dst[3], dstStride[3], length, height, lastDstY,
802 fillPlane(dst[3], dstStride[3], length, height, lastDstY, 255);
805 #if HAVE_MMXEXT_INLINE
807 __asm__
volatile (
"sfence" :::
"memory");
818 return dstY - lastDstY;
896 src[3] = src[2] =
NULL;
904 const int linesizes[4])
911 for (i = 0; i < 4; i++) {
913 if (!data[plane] || !linesizes[plane])
921 const uint16_t *src,
int stride,
int h)
926 for (yp=0; yp<
h; yp++) {
927 for (xp=0; xp+2<
stride; xp+=3) {
928 int x,
y, z,
r,
g,
b;
956 r = av_clip_uintp2(r, 12);
957 g = av_clip_uintp2(g, 12);
958 b = av_clip_uintp2(b, 12);
977 const uint16_t *src,
int stride,
int h)
982 for (yp=0; yp<
h; yp++) {
983 for (xp=0; xp+2<
stride; xp+=3) {
984 int x,
y, z,
r,
g,
b;
1012 x = av_clip_uintp2(x, 12);
1013 y = av_clip_uintp2(y, 12);
1014 z = av_clip_uintp2(z, 12);
1037 const uint8_t *
const srcSlice[],
1038 const int srcStride[],
int srcSliceY,
1039 int srcSliceH,
uint8_t *
const dst[],
1040 const int dstStride[])
1047 if (!srcStride || !dstStride || !dst || !srcSlice) {
1048 av_log(c,
AV_LOG_ERROR,
"One of the input parameters to sws_scale() is NULL, please check the calling code\n");
1056 srcSlice, srcStride, srcSliceY, srcSliceH,
1080 srcSlice, srcStride, srcSliceY, srcSliceH,
1090 memcpy(src2, srcSlice,
sizeof(src2));
1091 memcpy(dst2, dst,
sizeof(dst2));
1106 if (c->
sliceDir == 0 && srcSliceY != 0 && srcSliceY + srcSliceH != c->
srcH) {
1115 for (i = 0; i < 256; i++) {
1116 int r,
g,
b,
y,
u,
v,
a = 0xff;
1118 uint32_t p = ((
const uint32_t *)(srcSlice[1]))[i];
1119 a = (p >> 24) & 0xFF;
1120 r = (p >> 16) & 0xFF;
1121 g = (p >> 8) & 0xFF;
1124 r = ( i >> 5 ) * 36;
1125 g = ((i >> 2) & 7) * 36;
1128 b = ( i >> 6 ) * 85;
1129 g = ((i >> 3) & 7) * 36;
1132 r = ( i >> 3 ) * 255;
1133 g = ((i >> 1) & 3) * 85;
1139 b = ( i >> 3 ) * 255;
1140 g = ((i >> 1) & 3) * 85;
1143 #define RGB2YUV_SHIFT 15
1144 #define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1145 #define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1146 #define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1147 #define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1148 #define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1149 #define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1150 #define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1151 #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1152 #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1157 c->
pal_yuv[i]= y + (u<<8) + (v<<16) + ((unsigned)a<<24);
1164 c->
pal_rgb[i]= r + (g<<8) + (b<<16) + ((unsigned)a<<24);
1170 c->
pal_rgb[i]= a + (r<<8) + (g<<16) + ((unsigned)b<<24);
1176 c->
pal_rgb[i]= a + (b<<8) + (g<<16) + ((unsigned)r<<24);
1183 c->
pal_rgb[i]= b + (g<<8) + (r<<16) + ((unsigned)a<<24);
1195 base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
1196 for (y=0; y<srcSliceH; y++){
1197 memcpy(base + srcStride[0]*y, src2[0] + srcStride[0]*y, 4*c->
srcW);
1198 for (x=c->
src0Alpha-1; x<4*c->srcW; x+=4) {
1199 base[ srcStride[0]*y + x] = 0xFF;
1211 base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
1213 xyz12Torgb48(c, (uint16_t*)base, (
const uint16_t*)src2[0], srcStride[0]/2, srcSliceH);
1218 for (i = 0; i < 4; i++)
1225 int srcStride2[4] = { srcStride[0], srcStride[1], srcStride[2],
1227 int dstStride2[4] = { dstStride[0], dstStride[1], dstStride[2],
1234 if (srcSliceY + srcSliceH == c->
srcH)
1237 ret = c->
swscale(c, src2, srcStride2, srcSliceY, srcSliceH, dst2,
1241 int srcStride2[4] = { -srcStride[0], -srcStride[1], -srcStride[2],
1243 int dstStride2[4] = { -dstStride[0], -dstStride[1], -dstStride[2],
1246 src2[0] += (srcSliceH - 1) * srcStride[0];
1250 src2[3] += (srcSliceH - 1) * srcStride[3];
1251 dst2[0] += ( c->
dstH - 1) * dstStride[0];
1254 dst2[3] += ( c->
dstH - 1) * dstStride[3];
1263 ret = c->
swscale(c, src2, srcStride2, c->
srcH-srcSliceY-srcSliceH,
1264 srcSliceH, dst2, dstStride2);
1270 rgb48Toxyz12(c, (uint16_t*)dst2[0], (
const uint16_t*)dst2[0], dstStride[0]/2, ret);
static void gamma_convert(uint8_t *src[], int width, uint16_t *gamma)
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 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.
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...
uint16_t depth_minus1
Number of bits in the component minus 1.
#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
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)
#define FF_CEIL_RSHIFT(a, b)
static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth, const uint8_t *src_in[4], int srcW, int xInc, const int16_t *hLumFilter, const int32_t *hLumFilterPos, int hLumFilterSize, uint8_t *formatConvBuffer, uint32_t *pal, int isAlpha)
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
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[])
uint16_t plane
Which of the 4 planes contains the component.
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)
static void filter(MpegAudioContext *s, int ch, const short *samples, int incr)
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...
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)
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
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)
static av_always_inline void hcscale(SwsContext *c, int16_t *dst1, int16_t *dst2, int dstWidth, const uint8_t *src_in[4], int srcW, int xInc, const int16_t *hChrFilter, const int32_t *hChrFilterPos, int hChrFilterSize, uint8_t *formatConvBuffer, uint32_t *pal)
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 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...
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)