diff options
Diffstat (limited to 'postproc/postprocess.c')
-rw-r--r-- | postproc/postprocess.c | 80 |
1 files changed, 55 insertions, 25 deletions
diff --git a/postproc/postprocess.c b/postproc/postprocess.c index a732d400a4..599d6064b7 100644 --- a/postproc/postprocess.c +++ b/postproc/postprocess.c @@ -59,7 +59,6 @@ compare the quality & speed of all filters split this huge file optimize c versions try to unroll inner for(x=0 ... loop to avoid these damn if(x ... checks -put fastmemcpy back ... */ @@ -149,13 +148,14 @@ typedef struct PPContext{ uint64_t __attribute__((aligned(8))) pQPb; uint64_t __attribute__((aligned(8))) pQPb2; - - uint64_t __attribute__((aligned(8))) mmxDcOffset; - uint64_t __attribute__((aligned(8))) mmxDcThreshold; + uint64_t __attribute__((aligned(8))) mmxDcOffset[32]; + uint64_t __attribute__((aligned(8))) mmxDcThreshold[32]; + + QP_STORE_T *nonBQPTable; + int QP; - int dcOffset; - int dcThreshold; + int nonBQP; int frameNum; @@ -247,8 +247,8 @@ static inline int isHorizDC(uint8_t src[], int stride, PPContext *c) { int numEq= 0; int y; - const int dcOffset= c->dcOffset; - const int dcThreshold= c->dcThreshold; + const int dcOffset= ((c->QP*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++; @@ -269,8 +269,8 @@ static inline int isHorizDC(uint8_t src[], int stride, PPContext *c) static inline int isVertDC_C(uint8_t src[], int stride, PPContext *c){ int numEq= 0; int y; - const int dcOffset= c->dcOffset; - const int dcThreshold= c->dcThreshold; + const int dcOffset= ((c->QP*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++) { @@ -725,7 +725,7 @@ struct PPMode getPPModeByNameAndQuality(char *name, int quality) else if(filters[i].mask == V_DEBLOCK || filters[i].mask == H_DEBLOCK) { int o; - ppMode.maxDcDiff=1; + ppMode.baseDcDiff=256/4; // hFlatnessThreshold= 40; // vFlatnessThreshold= 40; @@ -736,7 +736,7 @@ struct PPMode getPPModeByNameAndQuality(char *name, int quality) if(tail==options[o]) break; numOfUnknownOptions--; - if(o==0) ppMode.maxDcDiff= val; + if(o==0) ppMode.baseDcDiff= val; else ppMode.flatnessThreshold= val; } } @@ -768,6 +768,8 @@ struct PPMode getPPModeByNameAndQuality(char *name, int quality) void *getPPContext(int width, int height){ PPContext *c= memalign(32, sizeof(PPContext)); int i; + int mbWidth = (width+15)>>4; + int mbHeight= (height+15)>>4; c->tempBlocks= (uint8_t*)memalign(8, 2*16*8); c->yHistogram= (uint64_t*)memalign(8, 256*sizeof(uint64_t)); @@ -789,6 +791,8 @@ void *getPPContext(int width, int height){ c->tempDstBlock= (uint8_t*)memalign(8, 1024*24); c->tempSrcBlock= (uint8_t*)memalign(8, 1024*24); c->deintTemp= (uint8_t*)memalign(8, width+16); + c->nonBQPTable= (QP_STORE_T*)memalign(8, mbWidth*mbHeight*sizeof(QP_STORE_T)); + memset(c->nonBQPTable, 0, mbWidth*mbHeight*sizeof(QP_STORE_T)); c->frameNum=-1; @@ -809,6 +813,7 @@ void freePPContext(void *vc){ free(c->tempDstBlock); free(c->tempSrcBlock); free(c->deintTemp); + free(c->nonBQPTable); free(c); } @@ -841,12 +846,14 @@ void revertPPOpt(void *conf, char* opt) void postprocess(uint8_t * src[3], int srcStride[3], uint8_t * dst[3], int dstStride[3], - int horizontalSize, int verticalSize, + int width, int height, QP_STORE_T *QP_store, int QPStride, - PPMode *mode, void *c) + PPMode *mode, void *vc, int pict_type) { - + int mbWidth = (width+15)>>4; + int mbHeight= (height+15)>>4; QP_STORE_T quantArray[2048/8]; + PPContext *c = (PPContext*)vc; if(QP_store==NULL || (mode->lumMode & FORCE_QUANT)) { @@ -858,6 +865,29 @@ void postprocess(uint8_t * src[3], int srcStride[3], else for(i=0; i<2048/8; i++) quantArray[i]= 1; } +if(0){ +int x,y; +for(y=0; y<mbHeight; y++){ + for(x=0; x<mbWidth; x++){ + printf("%2d ", QP_store[x + y*QPStride]); + } + printf("\n"); +} + printf("\n"); +} +//printf("pict_type:%d\n", pict_type); + if(pict_type!=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; + } + } + } if(firstTime2 && verbose) { @@ -866,30 +896,30 @@ void postprocess(uint8_t * src[3], int srcStride[3], } postProcess(src[0], srcStride[0], dst[0], dstStride[0], - horizontalSize, verticalSize, QP_store, QPStride, 0, mode, c); + width, height, QP_store, QPStride, 0, mode, c); - horizontalSize = (horizontalSize+1)>> 1; - verticalSize = (verticalSize+1)>>1; + width = (width +1)>>1; + height = (height+1)>>1; if(mode->chromMode) { postProcess(src[1], srcStride[1], dst[1], dstStride[1], - horizontalSize, verticalSize, QP_store, QPStride, 1, mode, c); + width, height, QP_store, QPStride, 1, mode, c); postProcess(src[2], srcStride[2], dst[2], dstStride[2], - horizontalSize, verticalSize, QP_store, QPStride, 2, mode, c); + width, height, QP_store, QPStride, 2, mode, c); } else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2]) { - memcpy(dst[1], src[1], srcStride[1]*verticalSize); - memcpy(dst[2], src[2], srcStride[2]*verticalSize); + memcpy(dst[1], src[1], srcStride[1]*height); + memcpy(dst[2], src[2], srcStride[2]*height); } else { int y; - for(y=0; y<verticalSize; y++) + for(y=0; y<height; y++) { - memcpy(&(dst[1][y*dstStride[1]]), &(src[1][y*srcStride[1]]), horizontalSize); - memcpy(&(dst[2][y*dstStride[2]]), &(src[2][y*srcStride[2]]), horizontalSize); + memcpy(&(dst[1][y*dstStride[1]]), &(src[1][y*srcStride[1]]), width); + memcpy(&(dst[2][y*dstStride[2]]), &(src[2][y*srcStride[2]]), width); } } } |