diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2003-04-18 12:45:34 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2003-04-18 12:45:34 +0000 |
commit | 0426af31117b1bc50b3abb2b4265c38b8c02e7a5 (patch) | |
tree | 4490f5d425e3bf7ec2f2bdc607a0c8591790efd7 | |
parent | 22cf0455900adb1499763f12e8339987d85fe8c5 (diff) | |
download | ffmpeg-0426af31117b1bc50b3abb2b4265c38b8c02e7a5.tar.gz |
mpeg2 qscale flag
a few bugfixes for the C pp code
minor optimization
Originally committed as revision 1786 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/avcodec.h | 13 | ||||
-rw-r--r-- | libavcodec/libpostproc/postprocess.c | 56 | ||||
-rw-r--r-- | libavcodec/libpostproc/postprocess.h | 2 | ||||
-rw-r--r-- | libavcodec/libpostproc/postprocess_internal.h | 5 | ||||
-rw-r--r-- | libavcodec/libpostproc/postprocess_template.c | 2 | ||||
-rw-r--r-- | libavcodec/mpeg12.c | 7 |
6 files changed, 60 insertions, 25 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 1b0ca59e31..b43858f12e 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -15,8 +15,8 @@ extern "C" { #define LIBAVCODEC_VERSION_INT 0x000406 #define LIBAVCODEC_VERSION "0.4.6" -#define LIBAVCODEC_BUILD 4663 -#define LIBAVCODEC_BUILD_STR "4663" +#define LIBAVCODEC_BUILD 4664 +#define LIBAVCODEC_BUILD_STR "4664" #define LIBAVCODEC_IDENT "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR @@ -314,8 +314,15 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG, * - encoding: unused\ * - decoding: set by lavc\ */\ - int repeat_pict; + int repeat_pict;\ + \ + /**\ + * \ + */\ + int qscale_type;\ +#define FF_QSCALE_TYPE_MPEG1 0 +#define FF_QSCALE_TYPE_MPEG2 1 #define FF_BUFFER_TYPE_INTERNAL 1 #define FF_BUFFER_TYPE_USER 2 ///< Direct rendering buffers diff --git a/libavcodec/libpostproc/postprocess.c b/libavcodec/libpostproc/postprocess.c index e922965cc4..f91bed6d05 100644 --- a/libavcodec/libpostproc/postprocess.c +++ b/libavcodec/libpostproc/postprocess.c @@ -199,8 +199,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++; @@ -221,8 +222,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++) { @@ -735,12 +737,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); @@ -757,7 +760,8 @@ 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)); } @@ -772,6 +776,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(); @@ -785,7 +790,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; @@ -804,6 +809,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); @@ -823,9 +829,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)) { @@ -837,6 +845,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++){ @@ -847,18 +869,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; } } diff --git a/libavcodec/libpostproc/postprocess.h b/libavcodec/libpostproc/postprocess.h index fd8a42c13d..dae863044b 100644 --- a/libavcodec/libpostproc/postprocess.h +++ b/libavcodec/libpostproc/postprocess.h @@ -66,6 +66,8 @@ void pp_free_context(pp_context_t *ppContext); #define PP_FORMAT_411 (0x00000002|PP_FORMAT) #define PP_FORMAT_444 (0x00000000|PP_FORMAT) +#define PP_PICT_TYPE_QP2 0x00000010 ///< MPEG2 style QScale + #ifdef __cplusplus } #endif diff --git a/libavcodec/libpostproc/postprocess_internal.h b/libavcodec/libpostproc/postprocess_internal.h index febea18188..13b3e38312 100644 --- a/libavcodec/libpostproc/postprocess_internal.h +++ b/libavcodec/libpostproc/postprocess_internal.h @@ -137,6 +137,7 @@ typedef struct PPContext{ uint64_t __attribute__((aligned(8))) mmxDcOffset[32]; uint64_t __attribute__((aligned(8))) mmxDcThreshold[32]; + QP_STORE_T *stdQPTable; ///< used to fix MPEG2 style qscale QP_STORE_T *nonBQPTable; QP_STORE_T *forcedQPTable; @@ -147,7 +148,8 @@ typedef struct PPContext{ int cpuCaps; - int stride; ///<size of some buffers (needed to realloc them if needed) + int qpStride; ///<size of qp buffers (needed to realloc them if needed) + int stride; ///<size of some buffers (needed to realloc them if needed) int hChromaSubSample; int vChromaSubSample; @@ -155,3 +157,4 @@ typedef struct PPContext{ PPMode ppMode; } PPContext; + diff --git a/libavcodec/libpostproc/postprocess_template.c b/libavcodec/libpostproc/postprocess_template.c index b4ecca123b..48027e4178 100644 --- a/libavcodec/libpostproc/postprocess_template.c +++ b/libavcodec/libpostproc/postprocess_template.c @@ -2993,7 +2993,7 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int uint8_t *tempBlock2= c.tempBlocks + 8; #endif int8_t *QPptr= &QPs[(y>>qpVShift)*QPStride]; - int8_t *nonBQPptr= &c.nonBQPTable[(y>>qpVShift)*mbWidth]; + int8_t *nonBQPptr= &c.nonBQPTable[(y>>qpVShift)*QPStride]; int QP=0; /* can we mess with a 8x16 block from srcBlock/dstBlock downwards and 1 line upwards if not than use a temporary buffer */ diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index 7250226fd3..a21808080e 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -2001,8 +2001,11 @@ eos: //end of slice if (s->mb_y<<field_pic == s->mb_height && !s->first_field) { /* end of image */ - if(s->mpeg2) - s->qscale >>=1; + if(s->mpeg2){ + s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG2; + }else + s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG1; + ff_er_frame_end(s); MPV_frame_end(s); |