diff libpostproc/postprocess.c @ 1196:2e06398e4647 libavcodec

mpeg2 qscale flag a few bugfixes for the C pp code minor optimization
author michaelni
date Fri, 18 Apr 2003 12:45:34 +0000
parents 57fe9c4e0c6e
children d9cbc8ef5a33
line wrap: on
line diff
--- a/libpostproc/postprocess.c	Thu Apr 17 19:53:36 2003 +0000
+++ b/libpostproc/postprocess.c	Fri Apr 18 12:45:34 2003 +0000
@@ -199,8 +199,9 @@
 {
 	int numEq= 0;
 	int y;
-	const int dcOffset= ((c->QP*c->ppMode.baseDcDiff)>>8) + 1;
+	const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
 	const int dcThreshold= dcOffset*2 + 1;
+
 	for(y=0; y<BLOCK_SIZE; y++)
 	{
 		if(((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold) numEq++;
@@ -221,8 +222,9 @@
 static inline int isVertDC_C(uint8_t src[], int stride, PPContext *c){
 	int numEq= 0;
 	int y;
-	const int dcOffset= ((c->QP*c->ppMode.baseDcDiff)>>8) + 1;
+	const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
 	const int dcThreshold= dcOffset*2 + 1;
+
 	src+= stride*4; // src points to begin of the 8x8 Block
 	for(y=0; y<BLOCK_SIZE-1; y++)
 	{
@@ -735,12 +737,13 @@
 	memset(*p, 0, size);
 }
 
-static void reallocBuffers(PPContext *c, int width, int height, int stride){
+static void reallocBuffers(PPContext *c, int width, int height, int stride, int qpStride){
 	int mbWidth = (width+15)>>4;
 	int mbHeight= (height+15)>>4;
 	int i;
 
 	c->stride= stride;
+	c->qpStride= qpStride;
 
 	reallocAlign((void **)&c->tempDst, 8, stride*24);
 	reallocAlign((void **)&c->tempSrc, 8, stride*24);
@@ -757,7 +760,8 @@
 	}
 
 	reallocAlign((void **)&c->deintTemp, 8, 2*width+32);
-	reallocAlign((void **)&c->nonBQPTable, 8, mbWidth*mbHeight*sizeof(QP_STORE_T));
+	reallocAlign((void **)&c->nonBQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
+	reallocAlign((void **)&c->stdQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
 	reallocAlign((void **)&c->forcedQPTable, 8, mbWidth*sizeof(QP_STORE_T));
 }
 
@@ -772,6 +776,7 @@
 pp_context_t *pp_get_context(int width, int height, int cpuCaps){
 	PPContext *c= memalign(32, sizeof(PPContext));
 	int stride= (width+15)&(~15); //assumed / will realloc if needed
+	int qpStride= (width+15)/16 + 2; //assumed / will realloc if needed
         
 	global_init();
 
@@ -785,7 +790,7 @@
 		c->vChromaSubSample= 1;
 	}
 
-	reallocBuffers(c, width, height, stride);
+	reallocBuffers(c, width, height, stride, qpStride);
         
 	c->frameNum=-1;
 
@@ -804,6 +809,7 @@
 	free(c->tempDst);
 	free(c->tempSrc);
 	free(c->deintTemp);
+	free(c->stdQPTable);
 	free(c->nonBQPTable);
 	free(c->forcedQPTable);
         
@@ -823,9 +829,11 @@
 	PPMode *mode = (PPMode*)vm;
 	PPContext *c = (PPContext*)vc;
         int minStride= MAX(srcStride[0], dstStride[0]);
-	
-	if(c->stride < minStride)
-		reallocBuffers(c, width, height, minStride);
+
+	if(c->stride < minStride || c->qpStride < QPStride)
+		reallocBuffers(c, width, height, 
+				MAX(minStride, c->stride), 
+				MAX(c->qpStride, QPStride));
 
 	if(QP_store==NULL || (mode->lumMode & FORCE_QUANT)) 
 	{
@@ -837,6 +845,20 @@
 		else
 			for(i=0; i<mbWidth; i++) QP_store[i]= 1;
 	}
+//printf("pict_type:%d\n", pict_type);
+
+	if(pict_type & PP_PICT_TYPE_QP2){
+		int i;
+		const int count= mbHeight * QPStride;
+		for(i=0; i<(count>>2); i++){
+			((uint32_t*)c->stdQPTable)[i] = (((uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F;
+		}
+		for(i<<=2; i<count; i++){
+			c->stdQPTable[i] = QP_store[i]>>1;
+		}
+                QP_store= c->stdQPTable;
+	}
+
 if(0){
 int x,y;
 for(y=0; y<mbHeight; y++){
@@ -847,18 +869,16 @@
 }
 	printf("\n");
 }
-//printf("pict_type:%d\n", pict_type);
 
-	if(pict_type!=3)
+	if((pict_type&7)!=3)
 	{
-		int x,y;
-		for(y=0; y<mbHeight; y++){
-			for(x=0; x<mbWidth; x++){
-				int qscale= QP_store[x + y*QPStride];
-				if(qscale&~31)
-				    qscale=31;
-				c->nonBQPTable[y*mbWidth + x]= qscale;
-			}
+		int i;
+		const int count= mbHeight * QPStride;
+		for(i=0; i<(count>>2); i++){
+			((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x1F1F1F1F;
+		}
+		for(i<<=2; i<count; i++){
+			c->nonBQPTable[i] = QP_store[i] & 0x1F;
 		}
 	}