mpeg2 qscale flag
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 18 Apr 2003 12:45:34 +0000 (12:45 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 18 Apr 2003 12:45:34 +0000 (12:45 +0000)
a few bugfixes for the C pp code
minor optimization

Originally committed as revision 1786 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/libpostproc/postprocess.c
libavcodec/libpostproc/postprocess.h
libavcodec/libpostproc/postprocess_internal.h
libavcodec/libpostproc/postprocess_template.c
libavcodec/mpeg12.c

index 1b0ca59e314cbdfb92a0adf52be7c9677492dbf0..b43858f12ebe0f985d9f652b6956f4cb0f424695 100644 (file)
@@ -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
index e922965cc4f89c140b0e45fbbd7adefe1cf38f96..f91bed6d054cb69a1298d999693788607cfc842c 100644 (file)
@@ -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;
                }
        }
 
index fd8a42c13d754ad3d8f7c6988eb1d696e3adc611..dae863044b148e4e9c424e7003e48ebe00eec252 100644 (file)
@@ -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
index febea181886e9ba049d1f694f045dd9e1f1a3e7a..13b3e38312f40ae79a019dfe6463d12bc3edcf06 100644 (file)
@@ -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;
 
+
index b4ecca123bc58d8253b7bd9b26b7a091e5f6e43c..48027e41786411cfc7ef48c41e4e481df46ee376 100644 (file)
@@ -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 */
index 7250226fd3e910b88a138c7ccd3bee716ee60df4..a21808080eb2522691f8d3bee139e01551f823be 100644 (file)
@@ -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);