diff options
author | Mike Melanson <mike@multimedia.cx> | 2003-06-19 00:47:19 +0000 |
---|---|---|
committer | Mike Melanson <mike@multimedia.cx> | 2003-06-19 00:47:19 +0000 |
commit | 6f3b07176ae833429586bf9d27c8477db9efa7a7 (patch) | |
tree | acba2593ed69e5a2aaa96aea9215948459d8ea8f /src/libffmpeg/libavcodec/libpostproc/postprocess.c | |
parent | c52df867db2f177dcabbbbe2b93517c9bf4f8ae1 (diff) | |
download | xine-lib-6f3b07176ae833429586bf9d27c8477db9efa7a7.tar.gz xine-lib-6f3b07176ae833429586bf9d27c8477db9efa7a7.tar.bz2 |
maintenance ffmpeg sync: import and activate decoders for 4X and
RealAudio codecs; import VP3 decoder but leave de-activated; fixes for
SVQ3 bugs; more conditional compilation for encoders
CVS patchset: 5067
CVS date: 2003/06/19 00:47:19
Diffstat (limited to 'src/libffmpeg/libavcodec/libpostproc/postprocess.c')
-rw-r--r-- | src/libffmpeg/libavcodec/libpostproc/postprocess.c | 66 |
1 files changed, 43 insertions, 23 deletions
diff --git a/src/libffmpeg/libavcodec/libpostproc/postprocess.c b/src/libffmpeg/libavcodec/libpostproc/postprocess.c index ce61ffd39..8473882bb 100644 --- a/src/libffmpeg/libavcodec/libpostproc/postprocess.c +++ b/src/libffmpeg/libavcodec/libpostproc/postprocess.c @@ -169,8 +169,9 @@ static inline int isHorizDC(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; + for(y=0; y<BLOCK_SIZE; y++) { if(((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold) numEq++; @@ -191,8 +192,9 @@ 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->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++) { @@ -483,8 +485,8 @@ char *pp_help= " c chrom chrominance filtring enabled\n" " y nochrom chrominance filtring disabled\n" "hb hdeblock (2 Threshold) horizontal deblocking filter\n" -" 1. difference factor: default=64, higher -> more deblocking\n" -" 2. flatness threshold: default=40, lower -> more deblocking\n" +" 1. difference factor: default=32, higher -> more deblocking\n" +" 2. flatness threshold: default=39, lower -> more deblocking\n" " the h & v deblocking filters share these\n" " so u cant set different thresholds for h / v\n" "vb vdeblock (2 Threshold) vertical deblocking filter\n" @@ -523,8 +525,8 @@ pp_mode_t *pp_get_mode_by_name_and_quality(char *name, int quality) ppMode->maxTmpNoise[2]= 3000; ppMode->maxAllowedY= 234; ppMode->minAllowedY= 16; - ppMode->baseDcDiff= 256/4; - ppMode->flatnessThreshold= 56-16; + ppMode->baseDcDiff= 256/8; + ppMode->flatnessThreshold= 56-16-1; ppMode->maxClippedThreshold= 0.01; ppMode->error=0; @@ -705,12 +707,13 @@ static void reallocAlign(void **p, int alignment, int size){ 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); @@ -727,11 +730,12 @@ static void reallocBuffers(PPContext *c, int width, int height, int stride){ } 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)); } -static void global_init(){ +static void global_init(void){ int i; memset(clip_table, 0, 256); for(i=256; i<512; i++) @@ -742,6 +746,7 @@ static void global_init(){ 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(); @@ -755,7 +760,7 @@ pp_context_t *pp_get_context(int width, int height, int cpuCaps){ c->vChromaSubSample= 1; } - reallocBuffers(c, width, height, stride); + reallocBuffers(c, width, height, stride, qpStride); c->frameNum=-1; @@ -774,6 +779,7 @@ void pp_free_context(void *vc){ free(c->tempDst); free(c->tempSrc); free(c->deintTemp); + free(c->stdQPTable); free(c->nonBQPTable); free(c->forcedQPTable); @@ -793,9 +799,11 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3], 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)) { @@ -807,6 +815,20 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3], 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++){ @@ -817,18 +839,16 @@ for(y=0; y<mbHeight; y++){ } 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; } } |