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); |