提交 332105e4 编写于 作者: M Michael Niedermayer

minor dststride bugfix for i420 output

srcHeight %2 != 0 bugfix / chroma height = (luma height +1)>>1 in YV12

Originally committed as revision 4699 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
上级 f004ca1c
...@@ -2589,7 +2589,7 @@ FUNNYUVCODE ...@@ -2589,7 +2589,7 @@ FUNNYUVCODE
} }
static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
int srcSliceH, uint8_t* dstParam[], int dstStride[]){ int srcSliceH, uint8_t* dstParam[], int dstStrideParam[]){
/* load a few things into local vars to make the code more readable? and faster */ /* load a few things into local vars to make the code more readable? and faster */
const int srcW= c->srcW; const int srcW= c->srcW;
...@@ -2630,6 +2630,7 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar ...@@ -2630,6 +2630,7 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar
int lastInLumBuf= c->lastInLumBuf; int lastInLumBuf= c->lastInLumBuf;
int lastInChrBuf= c->lastInChrBuf; int lastInChrBuf= c->lastInChrBuf;
int srcStride[3]; int srcStride[3];
int dstStride[3];
uint8_t *src[3]; uint8_t *src[3];
uint8_t *dst[3]; uint8_t *dst[3];
...@@ -2666,15 +2667,20 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar ...@@ -2666,15 +2667,20 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar
srcStride[2]= 0; srcStride[2]= 0;
} }
if(c->dstFormat == IMGFMT_I420){ if(dstFormat == IMGFMT_I420){
dst[0]= dstParam[0]; dst[0]= dstParam[0];
dst[1]= dstParam[2]; dst[1]= dstParam[2];
dst[2]= dstParam[1]; dst[2]= dstParam[1];
dstStride[0]= dstStrideParam[0];
dstStride[1]= dstStrideParam[2];
dstStride[2]= dstStrideParam[1];
}else{ }else{
dst[0]= dstParam[0]; dst[0]= dstParam[0];
dst[1]= dstParam[1]; dst[1]= dstParam[1];
dst[2]= dstParam[2]; dst[2]= dstParam[2];
dstStride[0]= dstStrideParam[0];
dstStride[1]= dstStrideParam[1];
dstStride[2]= dstStrideParam[2];
} }
//printf("sws Strides:%d %d %d -> %d %d %d\n", srcStride[0],srcStride[1],srcStride[2], //printf("sws Strides:%d %d %d -> %d %d %d\n", srcStride[0],srcStride[1],srcStride[2],
...@@ -2720,7 +2726,7 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar ...@@ -2720,7 +2726,7 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar
ASSERT(firstChrSrcY >= lastInChrBuf - vChrBufSize + 1) ASSERT(firstChrSrcY >= lastInChrBuf - vChrBufSize + 1)
// Do we have enough lines in this slice to output the dstY line // Do we have enough lines in this slice to output the dstY line
if(lastLumSrcY < srcSliceY + srcSliceH && lastChrSrcY < ((srcSliceY + srcSliceH)>>1)) if(lastLumSrcY < srcSliceY + srcSliceH && lastChrSrcY < ((srcSliceY + srcSliceH + 1)>>1))
{ {
//Do horizontal scaling //Do horizontal scaling
while(lastInLumBuf < lastLumSrcY) while(lastInLumBuf < lastLumSrcY)
...@@ -2743,7 +2749,7 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar ...@@ -2743,7 +2749,7 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar
uint8_t *src2= src[2]+(lastInChrBuf + 1 - (srcSliceY>>1))*srcStride[2]; uint8_t *src2= src[2]+(lastInChrBuf + 1 - (srcSliceY>>1))*srcStride[2];
chrBufIndex++; chrBufIndex++;
ASSERT(chrBufIndex < 2*vChrBufSize) ASSERT(chrBufIndex < 2*vChrBufSize)
ASSERT(lastInChrBuf + 1 - (srcSliceY>>1) < (srcSliceH>>1)) ASSERT(lastInChrBuf + 1 - (srcSliceY>>1) < ((srcSliceH+1)>>1))
ASSERT(lastInChrBuf + 1 - (srcSliceY>>1) >= 0) ASSERT(lastInChrBuf + 1 - (srcSliceY>>1) >= 0)
//FIXME replace parameters through context struct (some at least) //FIXME replace parameters through context struct (some at least)
RENAME(hcscale)(chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, (srcW+1)>>1, chrXInc, RENAME(hcscale)(chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, (srcW+1)>>1, chrXInc,
...@@ -2781,7 +2787,7 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar ...@@ -2781,7 +2787,7 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar
uint8_t *src2= src[2]+(lastInChrBuf + 1 - (srcSliceY>>1))*srcStride[2]; uint8_t *src2= src[2]+(lastInChrBuf + 1 - (srcSliceY>>1))*srcStride[2];
chrBufIndex++; chrBufIndex++;
ASSERT(chrBufIndex < 2*vChrBufSize) ASSERT(chrBufIndex < 2*vChrBufSize)
ASSERT(lastInChrBuf + 1 - (srcSliceY>>1) < (srcSliceH>>1)) ASSERT(lastInChrBuf + 1 - (srcSliceY>>1) < ((srcSliceH+1)>>1))
ASSERT(lastInChrBuf + 1 - (srcSliceY>>1) >= 0) ASSERT(lastInChrBuf + 1 - (srcSliceY>>1) >= 0)
RENAME(hcscale)(chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, (srcW+1)>>1, chrXInc, RENAME(hcscale)(chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, (srcW+1)>>1, chrXInc,
flags, canMMX2BeUsed, hChrFilter, hChrFilterPos, hChrFilterSize, flags, canMMX2BeUsed, hChrFilter, hChrFilterPos, hChrFilterSize,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册