| Index: patched-ffmpeg-mt/libswscale/swscale_template.c
|
| ===================================================================
|
| --- patched-ffmpeg-mt/libswscale/swscale_template.c (revision 41250)
|
| +++ patched-ffmpeg-mt/libswscale/swscale_template.c (working copy)
|
| @@ -2651,8 +2651,10 @@
|
| unsigned char *aDest=(CONFIG_SWSCALE_ALPHA && alpPixBuf) ? dst[3]+dstStride[3]*dstY : NULL;
|
|
|
| const int firstLumSrcY= vLumFilterPos[dstY]; //First line needed as input
|
| + const int firstLumSrcY2= vLumFilterPos[FFMIN(dstY | ((1<<c->chrDstVSubSample) - 1), dstH-1)];
|
| const int firstChrSrcY= vChrFilterPos[chrDstY]; //First line needed as input
|
| int lastLumSrcY= firstLumSrcY + vLumFilterSize -1; // Last line needed as input
|
| + int lastLumSrcY2=firstLumSrcY2+ vLumFilterSize -1; // Last line needed as input
|
| int lastChrSrcY= firstChrSrcY + vChrFilterSize -1; // Last line needed as input
|
| int enough_lines;
|
|
|
| @@ -2662,26 +2664,27 @@
|
| assert(firstLumSrcY >= lastInLumBuf - vLumBufSize + 1);
|
| assert(firstChrSrcY >= lastInChrBuf - vChrBufSize + 1);
|
|
|
| + DEBUG_BUFFERS("dstY: %d\n", dstY);
|
| + DEBUG_BUFFERS("\tfirstLumSrcY: %d lastLumSrcY: %d lastInLumBuf: %d\n",
|
| + firstLumSrcY, lastLumSrcY, lastInLumBuf);
|
| + DEBUG_BUFFERS("\tfirstChrSrcY: %d lastChrSrcY: %d lastInChrBuf: %d\n",
|
| + firstChrSrcY, lastChrSrcY, lastInChrBuf);
|
| +
|
| // Do we have enough lines in this slice to output the dstY line
|
| - enough_lines = lastLumSrcY < srcSliceY + srcSliceH && lastChrSrcY < -((-srcSliceY - srcSliceH)>>c->chrSrcVSubSample);
|
| + enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH && lastChrSrcY < -((-srcSliceY - srcSliceH)>>c->chrSrcVSubSample);
|
| +
|
| if (!enough_lines) {
|
| lastLumSrcY = srcSliceY + srcSliceH - 1;
|
| lastChrSrcY = chrSrcSliceY + chrSrcSliceH - 1;
|
| + DEBUG_BUFFERS("buffering slice: lastLumSrcY %d lastChrSrcY %d\n",
|
| + lastLumSrcY, lastChrSrcY);
|
| }
|
|
|
| - DEBUG_BUFFERS("dstY: %d\n", dstY);
|
| - DEBUG_BUFFERS("\tfirstLumSrcY: %d lastLumSrcY: %d lastInLumBuf: %d\n",
|
| - firstLumSrcY, lastLumSrcY, lastInLumBuf);
|
| - DEBUG_BUFFERS("\tfirstChrSrcY: %d lastChrSrcY: %d lastInChrBuf: %d\n",
|
| - firstChrSrcY, lastChrSrcY, lastInChrBuf);
|
| -
|
| //Do horizontal scaling
|
| while(lastInLumBuf < lastLumSrcY) {
|
| const uint8_t *src1= src[0]+(lastInLumBuf + 1 - srcSliceY)*srcStride[0];
|
| const uint8_t *src2= src[3]+(lastInLumBuf + 1 - srcSliceY)*srcStride[3];
|
| lumBufIndex++;
|
| - DEBUG_BUFFERS("\t\tlumBufIndex %d: lastInLumBuf: %d\n",
|
| - lumBufIndex, lastInLumBuf);
|
| assert(lumBufIndex < 2*vLumBufSize);
|
| assert(lastInLumBuf + 1 - srcSliceY < srcSliceH);
|
| assert(lastInLumBuf + 1 - srcSliceY >= 0);
|
| @@ -2695,13 +2698,13 @@
|
| formatConvBuffer,
|
| pal, 1);
|
| lastInLumBuf++;
|
| + DEBUG_BUFFERS("\t\tlumBufIndex %d: lastInLumBuf: %d\n",
|
| + lumBufIndex, lastInLumBuf);
|
| }
|
| while(lastInChrBuf < lastChrSrcY) {
|
| const uint8_t *src1= src[1]+(lastInChrBuf + 1 - chrSrcSliceY)*srcStride[1];
|
| const uint8_t *src2= src[2]+(lastInChrBuf + 1 - chrSrcSliceY)*srcStride[2];
|
| chrBufIndex++;
|
| - DEBUG_BUFFERS("\t\tchrBufIndex %d: lastInChrBuf: %d\n",
|
| - chrBufIndex, lastInChrBuf);
|
| assert(chrBufIndex < 2*vChrBufSize);
|
| assert(lastInChrBuf + 1 - chrSrcSliceY < (chrSrcSliceH));
|
| assert(lastInChrBuf + 1 - chrSrcSliceY >= 0);
|
| @@ -2713,6 +2716,8 @@
|
| formatConvBuffer,
|
| pal);
|
| lastInChrBuf++;
|
| + DEBUG_BUFFERS("\t\tchrBufIndex %d: lastInChrBuf: %d\n",
|
| + chrBufIndex, lastInChrBuf);
|
| }
|
| //wrap buf index around to stay inside the ring buffer
|
| if (lumBufIndex >= vLumBufSize) lumBufIndex-= vLumBufSize;
|
| @@ -3048,7 +3053,7 @@
|
| break;
|
| }
|
|
|
| - if (c->srcRange != c->dstRange && !(isRGB(c->dstFormat) || isBGR(c->dstFormat))) {
|
| + if (c->srcRange != c->dstRange && !isAnyRGB(c->dstFormat)) {
|
| if (c->srcRange) {
|
| c->lumConvertRange = RENAME(lumRangeFromJpeg);
|
| c->chrConvertRange = RENAME(chrRangeFromJpeg);
|
|
|