changeset 591:d3f374218030 libavcodec

fixing mpeg4 mpeg quantizers
author michaelni
date Fri, 02 Aug 2002 20:27:46 +0000
parents 3f8824eb4690
children 909e50c67d0e
files h263.c mpegvideo.c mpegvideo.h
diffstat 3 files changed, 31 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/h263.c	Fri Aug 02 11:58:02 2002 +0000
+++ b/h263.c	Fri Aug 02 20:27:46 2002 +0000
@@ -1452,9 +1452,11 @@
     /* left copy */
     for(i=1;i<8;i++)
         ac_val1[i] = block[block_permute_op(i * 8)];
+
     /* top copy */
     for(i=1;i<8;i++)
         ac_val1[8 + i] = block[block_permute_op(i)];
+
 }
 
 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
@@ -2641,6 +2643,7 @@
         case 0: /* direct */
             mx = h263_decode_motion(s, 0, 1);
             my = h263_decode_motion(s, 0, 1);
+            PRINT_MB_TYPE("S");
         case 4: /* direct with mx=my=0 */
             s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
             xy= s->block_index[0];
@@ -2659,7 +2662,7 @@
             s->mv[0][0][1] = 
             s->mv[1][0][0] = 
             s->mv[1][0][1] = 1000;*/
-            PRINT_MB_TYPE("D");
+            if(mb_type==4) PRINT_MB_TYPE("D");
             break;
         case 1: 
             s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
@@ -2701,13 +2704,14 @@
         dquant = cbpc & 4;
         s->mb_intra = 1;
 intra:
-        PRINT_MB_TYPE("I");
         s->ac_pred = 0;
         if (s->h263_pred || s->h263_aic) {
             s->ac_pred = get_bits1(&s->gb);
             if (s->ac_pred && s->h263_aic)
                 s->h263_aic_dir = get_bits1(&s->gb);
         }
+        PRINT_MB_TYPE(s->ac_pred ? "A" : "I");
+        
         cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
         if(cbpy<0) return -1;
         cbp = (cbpc & 3) | (cbpy << 2);
@@ -2995,10 +2999,16 @@
             return 0;
         }
         rl = &rl_inter;
-        rl_vlc = rl_inter.rl_vlc[s->qscale];
         scan_table = zigzag_direct;
-        qmul = s->qscale << 1;
-        qadd = (s->qscale - 1) | 1;
+        if(s->mpeg_quant){
+            qmul=1;
+            qadd=0;
+            rl_vlc = rl_inter.rl_vlc[0];        
+        }else{
+            qmul = s->qscale << 1;
+            qadd = (s->qscale - 1) | 1;
+            rl_vlc = rl_inter.rl_vlc[s->qscale];
+        }
     }
   {
     OPEN_READER(re, &s->gb);
@@ -3615,8 +3625,9 @@
             
             // FIXME a bunch of grayscale shape things
 
-            if(get_bits1(&s->gb)){ /* vol_quant_type */
+            if((s->mpeg_quant=get_bits1(&s->gb))){ /* vol_quant_type */
                 int i, j, v;
+                
                 /* load default matrixes */
                 for(i=0; i<64; i++){
                     v= ff_mpeg4_default_intra_matrix[i];
@@ -3659,11 +3670,8 @@
                     }
                 }
 
-                s->dct_unquantize= s->dct_unquantize_mpeg2;
-
                 // FIXME a bunch of grayscale shape things
-            }else
-                s->dct_unquantize= s->dct_unquantize_h263;
+            }
 
             if(vo_ver_id != 1)
                  s->quarter_sample= get_bits1(&s->gb);
@@ -3758,7 +3766,6 @@
         s->low_delay=0;
     }
 // printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample); 
-//printf("%d", s->pict_type);
     time_incr=0;
     while (get_bits1(&s->gb) != 0) 
         time_incr++;
--- a/mpegvideo.c	Fri Aug 02 11:58:02 2002 +0000
+++ b/mpegvideo.c	Fri Aug 02 20:27:46 2002 +0000
@@ -137,12 +137,7 @@
 #ifdef ARCH_ALPHA
     MPV_common_init_axp(s);
 #endif
-    //setup default unquantizers (mpeg4 might change it later)
-    if(s->out_format == FMT_H263)
-        s->dct_unquantize = s->dct_unquantize_h263;
-    else
-        s->dct_unquantize = s->dct_unquantize_mpeg1;
-    
+
     s->mb_width = (s->width + 15) / 16;
     s->mb_height = (s->height + 15) / 16;
     
@@ -671,6 +666,16 @@
                 avctx->dr_opaque_frame= s->next_dr_opaque;
         }
     }
+
+    /* set dequantizer, we cant do it during init as it might change for mpeg4
+       and we cant do it in the header decode as init isnt called for mpeg4 there yet */
+    if(s->out_format == FMT_H263){
+        if(s->mpeg_quant)
+            s->dct_unquantize = s->dct_unquantize_mpeg2;
+        else
+            s->dct_unquantize = s->dct_unquantize_h263;
+    }else 
+        s->dct_unquantize = s->dct_unquantize_mpeg1;
 }
 
 /* generic function for encode/decode called after a frame has been coded/decoded */
@@ -1513,7 +1518,7 @@
             if(s->hurry_up>1) goto the_end;
 
             /* add dct residue */
-            if(s->encoding || !(s->mpeg2 || s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG4)){
+            if(s->encoding || !(s->mpeg2 || s->h263_msmpeg4 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
                 add_dequant_dct(s, block[0], 0, dest_y, dct_linesize);
                 add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize);
                 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
--- a/mpegvideo.h	Fri Aug 02 11:58:02 2002 +0000
+++ b/mpegvideo.h	Fri Aug 02 20:27:46 2002 +0000
@@ -361,6 +361,7 @@
 #define PB_BUFFER_SIZE 1024*256
     uint8_t *tex_pb_buffer;          
     uint8_t *pb2_buffer;
+    int mpeg_quant;
 
     /* divx specific, used to workaround (many) bugs in divx5 */
     int divx_version;