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, 1);
479 if (srcSliceY == 0) {
493 for (; dstY <
dstH; dstY++) {
497 dst[0] + dstStride[0] *
dstY,
498 dst[1] + dstStride[1] * chrDstY,
499 dst[2] + dstStride[2] * chrDstY,
506 const int firstLumSrcY =
FFMAX(1 - vLumFilterSize, vLumFilterPos[dstY]);
509 const int firstChrSrcY =
FFMAX(1 - vChrFilterSize, vChrFilterPos[chrDstY]);
512 int lastLumSrcY =
FFMIN(c->
srcH, firstLumSrcY + vLumFilterSize) - 1;
513 int lastLumSrcY2 =
FFMIN(c->
srcH, firstLumSrcY2 + vLumFilterSize) - 1;
514 int lastChrSrcY =
FFMIN(c->
chrSrcH, firstChrSrcY + vChrFilterSize) - 1;
518 int posY, cPosY, firstPosY, lastPosY, firstCPosY, lastCPosY;
522 if (firstLumSrcY > lastInLumBuf) {
524 hasLumHoles = lastInLumBuf != firstLumSrcY - 1;
532 lastInLumBuf = firstLumSrcY - 1;
534 if (firstChrSrcY > lastInChrBuf) {
536 hasChrHoles = lastInChrBuf != firstChrSrcY - 1;
544 lastInChrBuf = firstChrSrcY - 1;
546 av_assert0(firstLumSrcY >= lastInLumBuf - vLumBufSize + 1);
547 av_assert0(firstChrSrcY >= lastInChrBuf - vChrBufSize + 1);
550 DEBUG_BUFFERS(
"\tfirstLumSrcY: %d lastLumSrcY: %d lastInLumBuf: %d\n",
551 firstLumSrcY, lastLumSrcY, lastInLumBuf);
552 DEBUG_BUFFERS(
"\tfirstChrSrcY: %d lastChrSrcY: %d lastInChrBuf: %d\n",
553 firstChrSrcY, lastChrSrcY, lastInChrBuf);
556 enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH &&
560 lastLumSrcY = srcSliceY + srcSliceH - 1;
561 lastChrSrcY = chrSrcSliceY + chrSrcSliceH - 1;
562 DEBUG_BUFFERS(
"buffering slice: lastLumSrcY %d lastChrSrcY %d\n",
563 lastLumSrcY, lastChrSrcY);
568 if (posY <= lastLumSrcY && !hasLumHoles) {
569 firstPosY =
FFMAX(firstLumSrcY, posY);
572 firstPosY = lastInLumBuf + 1;
573 lastPosY = lastLumSrcY;
577 if (cPosY <= lastChrSrcY && !hasChrHoles) {
578 firstCPosY =
FFMAX(firstChrSrcY, cPosY);
581 firstCPosY = lastInChrBuf + 1;
582 lastCPosY = lastChrSrcY;
587 if (posY < lastLumSrcY + 1) {
588 for (i = lumStart; i < lumEnd; ++i)
589 desc[i].
process(c, &desc[i], firstPosY, lastPosY - firstPosY + 1);
593 lastInLumBuf = lastLumSrcY;
595 if (cPosY < lastChrSrcY + 1) {
596 for (i = chrStart; i < chrEnd; ++i)
597 desc[i].
process(c, &desc[i], firstCPosY, lastCPosY - firstCPosY + 1);
601 lastInChrBuf = lastChrSrcY;
605 while (lastInLumBuf < lastLumSrcY) {
607 src[0] + (lastInLumBuf + 1 - srcSliceY) * srcStride[0],
608 src[1] + (lastInLumBuf + 1 - srcSliceY) * srcStride[1],
609 src[2] + (lastInLumBuf + 1 - srcSliceY) * srcStride[2],
610 src[3] + (lastInLumBuf + 1 - srcSliceY) * srcStride[3],
614 av_assert0(lastInLumBuf + 1 - srcSliceY < srcSliceH);
615 av_assert0(lastInLumBuf + 1 - srcSliceY >= 0);
620 hyscale(c, lumPixBuf[lumBufIndex], dstW, src1, srcW, lumXInc,
621 hLumFilter, hLumFilterPos, hLumFilterSize,
622 formatConvBuffer, pal, 0);
624 hyscale(c, alpPixBuf[lumBufIndex], dstW, src1, srcW,
625 lumXInc, hLumFilter, hLumFilterPos, hLumFilterSize,
626 formatConvBuffer, pal, 1);
629 lumBufIndex, lastInLumBuf);
631 while (lastInChrBuf < lastChrSrcY) {
633 src[0] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[0],
634 src[1] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[1],
635 src[2] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[2],
636 src[3] + (lastInChrBuf + 1 - chrSrcSliceY) * srcStride[3],
640 av_assert0(lastInChrBuf + 1 - chrSrcSliceY < (chrSrcSliceH));
641 av_assert0(lastInChrBuf + 1 - chrSrcSliceY >= 0);
645 hcscale(c, chrUPixBuf[chrBufIndex], chrVPixBuf[chrBufIndex],
646 chrDstW, src1, chrSrcW, chrXInc,
647 hChrFilter, hChrFilterPos, hChrFilterSize,
648 formatConvBuffer, pal);
651 chrBufIndex, lastInChrBuf);
655 if (lumBufIndex >= vLumBufSize)
657 if (chrBufIndex >= vChrBufSize)
664 lastInLumBuf, lastInChrBuf);
670 if (dstY >= dstH - 2) {
674 &yuv2packed1, &yuv2packed2, &yuv2packedX, &yuv2anyX);
677 yuv2packed1, yuv2packed2, yuv2packedX, yuv2anyX, use_mmx_vfilter);
682 for (i = vStart; i < vEnd; ++i)
683 desc[i].
process(c, &desc[i], dstY, 1);
685 const int16_t **lumSrcPtr = (
const int16_t **)(
void*) lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf +
vLumBufSize;
686 const int16_t **chrUSrcPtr = (
const int16_t **)(
void*) chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf +
vChrBufSize;
687 const int16_t **chrVSrcPtr = (
const int16_t **)(
void*) chrVPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf +
vChrBufSize;
689 (
const int16_t **)(
void*) alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL;
714 if (vLumFilterSize == 1) {
722 if (!((dstY & chrSkipMask) ||
isGray(dstFormat))) {
725 vChrFilterSize, chrUSrcPtr, chrVSrcPtr,
727 }
else if (vChrFilterSize == 1) {
732 vChrFilterSize, chrUSrcPtr, dest[1],
735 vChrFilterSize, chrVSrcPtr, dest[2],
744 if (vLumFilterSize == 1) {
749 vLumFilterSize, alpSrcPtr, dest[3],
753 }
else if (yuv2packedX) {
754 av_assert1(lumSrcPtr + vLumFilterSize - 1 < (
const int16_t **)lumPixBuf + vLumBufSize * 2);
755 av_assert1(chrUSrcPtr + vChrFilterSize - 1 < (
const int16_t **)chrUPixBuf + vChrBufSize * 2);
757 vChrFilterSize <= 2) {
758 int chrAlpha = vChrFilterSize == 1 ? 0 : vChrFilter[2 * dstY + 1];
760 alpPixBuf ? *alpSrcPtr : NULL,
761 dest[0], dstW, chrAlpha, dstY);
762 }
else if (c->
yuv2packed2 && vLumFilterSize == 2 &&
763 vChrFilterSize == 2) {
764 int lumAlpha = vLumFilter[2 * dstY + 1];
765 int chrAlpha = vChrFilter[2 * dstY + 1];
767 lumMmxFilter[3] = vLumFilter[2 *
dstY] * 0x10001;
769 chrMmxFilter[3] = vChrFilter[2 * chrDstY] * 0x10001;
771 alpPixBuf ? alpSrcPtr : NULL,
772 dest[0], dstW, lumAlpha, chrAlpha, dstY);
775 lumSrcPtr, vLumFilterSize,
776 vChrFilter + dstY * vChrFilterSize,
777 chrUSrcPtr, chrVSrcPtr, vChrFilterSize,
778 alpSrcPtr, dest[0], dstW, dstY);
782 yuv2anyX(c, vLumFilter + dstY * vLumFilterSize,
783 lumSrcPtr, vLumFilterSize,
784 vChrFilter + dstY * vChrFilterSize,
785 chrUSrcPtr, chrVSrcPtr, vChrFilterSize,
786 alpSrcPtr, dest, dstW, dstY);
795 int height = dstY - lastDstY;
799 fillPlane16(dst[3], dstStride[3], length, height, lastDstY,
803 fillPlane(dst[3], dstStride[3], length, height, lastDstY, 255);
806 #if HAVE_MMXEXT_INLINE
808 __asm__
volatile (
"sfence" :::
"memory");
819 return dstY - lastDstY;
897 src[3] = src[2] =
NULL;
905 const int linesizes[4])
912 for (i = 0; i < 4; i++) {
914 if (!data[plane] || !linesizes[plane])
922 const uint16_t *src,
int stride,
int h)
927 for (yp=0; yp<
h; yp++) {
928 for (xp=0; xp+2<
stride; xp+=3) {
929 int x,
y, z,
r,
g,
b;
957 r = av_clip_uintp2(r, 12);
958 g = av_clip_uintp2(g, 12);
959 b = av_clip_uintp2(b, 12);
978 const uint16_t *src,
int stride,
int h)
983 for (yp=0; yp<
h; yp++) {
984 for (xp=0; xp+2<
stride; xp+=3) {
985 int x,
y, z,
r,
g,
b;
1013 x = av_clip_uintp2(x, 12);
1014 y = av_clip_uintp2(y, 12);
1015 z = av_clip_uintp2(z, 12);
1038 const uint8_t *
const srcSlice[],
1039 const int srcStride[],
int srcSliceY,
1040 int srcSliceH,
uint8_t *
const dst[],
1041 const int dstStride[])
1049 if (!srcStride || !dstStride || !dst || !srcSlice) {
1050 av_log(c,
AV_LOG_ERROR,
"One of the input parameters to sws_scale() is NULL, please check the calling code\n");
1054 if ((srcSliceY & (macro_height-1)) ||
1055 ((srcSliceH& (macro_height-1)) && srcSliceY + srcSliceH != c->
srcH) ||
1056 srcSliceY + srcSliceH > c->
srcH) {
1057 av_log(c,
AV_LOG_ERROR,
"Slice parameters %d, %d are invalid\n", srcSliceY, srcSliceH);
1065 srcSlice, srcStride, srcSliceY, srcSliceH,
1089 srcSlice, srcStride, srcSliceY, srcSliceH,
1099 memcpy(src2, srcSlice,
sizeof(src2));
1100 memcpy(dst2, dst,
sizeof(dst2));
1115 if (c->
sliceDir == 0 && srcSliceY != 0 && srcSliceY + srcSliceH != c->
srcH) {
1124 for (i = 0; i < 256; i++) {
1125 int r,
g,
b,
y,
u,
v,
a = 0xff;
1127 uint32_t p = ((
const uint32_t *)(srcSlice[1]))[i];
1128 a = (p >> 24) & 0xFF;
1129 r = (p >> 16) & 0xFF;
1130 g = (p >> 8) & 0xFF;
1133 r = ( i >> 5 ) * 36;
1134 g = ((i >> 2) & 7) * 36;
1137 b = ( i >> 6 ) * 85;
1138 g = ((i >> 3) & 7) * 36;
1141 r = ( i >> 3 ) * 255;
1142 g = ((i >> 1) & 3) * 85;
1148 b = ( i >> 3 ) * 255;
1149 g = ((i >> 1) & 3) * 85;
1152 #define RGB2YUV_SHIFT 15
1153 #define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1154 #define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1155 #define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1156 #define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1157 #define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1158 #define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1159 #define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1160 #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1161 #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
1166 c->
pal_yuv[i]= y + (u<<8) + (v<<16) + ((unsigned)a<<24);
1173 c->
pal_rgb[i]= r + (g<<8) + (b<<16) + ((unsigned)a<<24);
1179 c->
pal_rgb[i]= a + (r<<8) + (g<<16) + ((unsigned)b<<24);
1185 c->
pal_rgb[i]= a + (b<<8) + (g<<16) + ((unsigned)r<<24);
1192 c->
pal_rgb[i]= b + (g<<8) + (r<<16) + ((unsigned)a<<24);
1204 base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
1205 for (y=0; y<srcSliceH; y++){
1206 memcpy(base + srcStride[0]*y, src2[0] + srcStride[0]*y, 4*c->
srcW);
1207 for (x=c->
src0Alpha-1; x<4*c->srcW; x+=4) {
1208 base[ srcStride[0]*y + x] = 0xFF;
1220 base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
1222 xyz12Torgb48(c, (uint16_t*)base, (
const uint16_t*)src2[0], srcStride[0]/2, srcSliceH);
1227 for (i = 0; i < 4; i++)
1234 int srcStride2[4] = { srcStride[0], srcStride[1], srcStride[2],
1236 int dstStride2[4] = { dstStride[0], dstStride[1], dstStride[2],
1243 if (srcSliceY + srcSliceH == c->
srcH)
1246 ret = c->
swscale(c, src2, srcStride2, srcSliceY, srcSliceH, dst2,
1250 int srcStride2[4] = { -srcStride[0], -srcStride[1], -srcStride[2],
1252 int dstStride2[4] = { -dstStride[0], -dstStride[1], -dstStride[2],
1255 src2[0] += (srcSliceH - 1) * srcStride[0];
1259 src2[3] += (srcSliceH - 1) * srcStride[3];
1260 dst2[0] += ( c->
dstH - 1) * dstStride[0];
1263 dst2[3] += ( c->
dstH - 1) * dstStride[3];
1272 ret = c->
swscale(c, src2, srcStride2, c->
srcH-srcSliceY-srcSliceH,
1273 srcSliceH, dst2, dstStride2);
1279 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 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
int dstY
Last destination vertical line output from last slice.
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.
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)
#define attribute_align_arg
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 void(WINAPI *cond_broadcast)(pthread_cond_t *cond)
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)
#define CONFIG_SWSCALE_ALPHA
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...
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)