support for negative strides
Originally committed as revision 3989 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@@ -1051,18 +1051,20 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3],
|
||||
int mbHeight= (height+15)>>4;
|
||||
PPMode *mode = (PPMode*)vm;
|
||||
PPContext *c = (PPContext*)vc;
|
||||
int minStride= MAX(srcStride[0], dstStride[0]);
|
||||
int minStride= MAX(ABS(srcStride[0]), ABS(dstStride[0]));
|
||||
int absQPStride = ABS(QPStride);
|
||||
|
||||
if(c->stride < minStride || c->qpStride < QPStride)
|
||||
// c->stride and c->QPStride are always positive
|
||||
if(c->stride < minStride || c->qpStride < absQPStride)
|
||||
reallocBuffers(c, width, height,
|
||||
MAX(minStride, c->stride),
|
||||
MAX(c->qpStride, QPStride));
|
||||
MAX(c->qpStride, absQPStride));
|
||||
|
||||
if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
|
||||
{
|
||||
int i;
|
||||
QP_store= c->forcedQPTable;
|
||||
QPStride= 0;
|
||||
absQPStride = QPStride = 0;
|
||||
if(mode->lumMode & FORCE_QUANT)
|
||||
for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant;
|
||||
else
|
||||
@@ -1072,7 +1074,7 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3],
|
||||
|
||||
if(pict_type & PP_PICT_TYPE_QP2){
|
||||
int i;
|
||||
const int count= mbHeight * QPStride;
|
||||
const int count= mbHeight * absQPStride;
|
||||
for(i=0; i<(count>>2); i++){
|
||||
((uint32_t*)c->stdQPTable)[i] = (((uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F;
|
||||
}
|
||||
@@ -1080,6 +1082,7 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3],
|
||||
c->stdQPTable[i] = QP_store[i]>>1;
|
||||
}
|
||||
QP_store= c->stdQPTable;
|
||||
QPStride= absQPStride;
|
||||
}
|
||||
|
||||
if(0){
|
||||
@@ -1095,13 +1098,22 @@ for(y=0; y<mbHeight; y++){
|
||||
|
||||
if((pict_type&7)!=3)
|
||||
{
|
||||
int i;
|
||||
const int count= mbHeight * QPStride;
|
||||
for(i=0; i<(count>>2); i++){
|
||||
((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x3F3F3F3F;
|
||||
}
|
||||
for(i<<=2; i<count; i++){
|
||||
c->nonBQPTable[i] = QP_store[i] & 0x3F;
|
||||
if (QPStride >= 0) {
|
||||
int i;
|
||||
const int count= mbHeight * QPStride;
|
||||
for(i=0; i<(count>>2); i++){
|
||||
((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x3F3F3F3F;
|
||||
}
|
||||
for(i<<=2; i<count; i++){
|
||||
c->nonBQPTable[i] = QP_store[i] & 0x3F;
|
||||
}
|
||||
} else {
|
||||
int i,j;
|
||||
for(i=0; i<mbHeight; i++) {
|
||||
for(j=0; j<absQPStride; j++) {
|
||||
c->nonBQPTable[i*absQPStride+j] = QP_store[i*QPStride+j] & 0x3F;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1125,8 +1137,8 @@ for(y=0; y<mbHeight; y++){
|
||||
}
|
||||
else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2])
|
||||
{
|
||||
memcpy(dst[1], src[1], srcStride[1]*height);
|
||||
memcpy(dst[2], src[2], srcStride[2]*height);
|
||||
linecpy(dst[1], src[1], height, srcStride[1]);
|
||||
linecpy(dst[2], src[2], height, srcStride[2]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user