mpeg4 mpeg quantizer support
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 7 Apr 2002 02:03:32 +0000 (02:03 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 7 Apr 2002 02:03:32 +0000 (02:03 +0000)
Originally committed as revision 381 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/dsputil.c
libavcodec/h263.c
libavcodec/i386/mpegvideo_mmx.c
libavcodec/mpeg4data.h
libavcodec/mpegvideo.c
libavcodec/mpegvideo.h

index dcfad05..a4f900c 100644 (file)
@@ -47,6 +47,8 @@ UINT32 squareTbl[512];
 
 extern UINT16 default_intra_matrix[64];
 extern UINT16 default_non_intra_matrix[64];
+extern UINT16 ff_mpeg4_default_intra_matrix[64];
+extern UINT16 ff_mpeg4_default_non_intra_matrix[64];
 
 UINT8 zigzag_direct[64] = {
     0, 1, 8, 16, 9, 2, 3, 10,
@@ -953,6 +955,8 @@ void dsputil_init(void)
         }
         block_permute(default_intra_matrix);
         block_permute(default_non_intra_matrix);
+        block_permute(ff_mpeg4_default_intra_matrix);
+        block_permute(ff_mpeg4_default_non_intra_matrix);
     }
     
     build_zigzag_end();
index 52127aa..429caf3 100644 (file)
@@ -624,17 +624,14 @@ static void h263_encode_motion(MpegEncContext * s, int val)
         }
 
         if (val >= 0) {
-            val--;
-            code = (val >> bit_size) + 1;
-            bits = val & (range - 1);
             sign = 0;
         } else {
             val = -val;
-            val--;
-            code = (val >> bit_size) + 1;
-            bits = val & (range - 1);
             sign = 1;
         }
+        val--;
+        code = (val >> bit_size) + 1;
+        bits = val & (range - 1);
 
         put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign); 
         if (bit_size > 0) {
@@ -728,7 +725,7 @@ static void init_uni_dc_tab()
 {
     int level, uni_code, uni_len;
 
-    for(level=-255; level<256; level++){
+    for(level=-256; level<256; level++){
         int size, v, l;
         /* find number of bits */
         size = 0;
@@ -2509,7 +2506,57 @@ int mpeg4_decode_picture_header(MpegEncContext * s)
             }
             
             // FIXME a bunch of grayscale shape things
-            if(get_bits1(&s->gb)) printf("Quant-Type not supported\n");  /* vol_quant_type */ //FIXME
+
+            if(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];
+                    s->intra_matrix[i]= v;
+                    s->chroma_intra_matrix[i]= v;
+                    
+                    v= ff_mpeg4_default_non_intra_matrix[i];
+                    s->non_intra_matrix[i]= v;
+                    s->chroma_non_intra_matrix[i]= v;
+                }
+
+                /* load custom intra matrix */
+                if(get_bits1(&s->gb)){
+                    for(i=0; i<64; i++){
+                        v= get_bits(&s->gb, 8);
+                        if(v==0) break;
+
+                        j= zigzag_direct[i];
+                        s->intra_matrix[j]= v;
+                        s->chroma_intra_matrix[j]= v;
+                    }
+                }
+
+                /* load custom non intra matrix */
+                if(get_bits1(&s->gb)){
+                    for(i=0; i<64; i++){
+                        v= get_bits(&s->gb, 8);
+                        if(v==0) break;
+
+                        j= zigzag_direct[i];
+                        s->non_intra_matrix[j]= v;
+                        s->chroma_non_intra_matrix[j]= v;
+                    }
+
+                    /* replicate last value */
+                    for(; i<64; i++){
+                        j= zigzag_direct[i];
+                        s->non_intra_matrix[j]= v;
+                        s->chroma_non_intra_matrix[j]= v;
+                    }
+                }
+
+                s->dct_unquantize= s->dct_unquantize_mpeg;
+
+                // 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);
             else s->quarter_sample=0;
index f23bdd8..28cba8a 100644 (file)
@@ -440,11 +440,9 @@ void unused_var_warning_killer(){
 void MPV_common_init_mmx(MpegEncContext *s)
 {
     if (mm_flags & MM_MMX) {
-        if (s->out_format == FMT_H263)
-               s->dct_unquantize = dct_unquantize_h263_mmx;
-       else
-               s->dct_unquantize = dct_unquantize_mpeg1_mmx;
-       
+               s->dct_unquantize_h263 = dct_unquantize_h263_mmx;
+               s->dct_unquantize_mpeg = dct_unquantize_mpeg1_mmx;
+
        draw_edges = draw_edges_mmx;
 
        if(mm_flags & MM_MMXEXT){
index 91b9962..d94b1d9 100644 (file)
@@ -122,3 +122,27 @@ static const UINT16 pixel_aspect[16][2]={
  {0, 0},
  {0, 0},
 };
+
+/* these matrixes will be permuted for the idct */
+INT16 ff_mpeg4_default_intra_matrix[64] = {
+  8, 17, 18, 19, 21, 23, 25, 27,
+ 17, 18, 19, 21, 23, 25, 27, 28,
+ 20, 21, 22, 23, 24, 26, 28, 30,
+ 21, 22, 23, 24, 26, 28, 30, 32,
+ 22, 23, 24, 26, 28, 30, 32, 35,
+ 23, 24, 26, 28, 30, 32, 35, 38,
+ 25, 26, 28, 30, 32, 35, 38, 41,
+ 27, 28, 30, 32, 35, 38, 41, 45, 
+};
+
+INT16 ff_mpeg4_default_non_intra_matrix[64] = {
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 17, 18, 19, 20, 21, 22, 23, 24,
+ 18, 19, 20, 21, 22, 23, 24, 25,
+ 19, 20, 21, 22, 23, 24, 26, 27,
+ 20, 21, 22, 23, 25, 26, 27, 28,
+ 21, 22, 23, 24, 26, 27, 28, 30,
+ 22, 23, 24, 26, 27, 28, 30, 31,
+ 23, 24, 25, 27, 28, 30, 31, 33,
+};
+
index f35483e..417c63e 100644 (file)
@@ -110,14 +110,18 @@ int MPV_common_init(MpegEncContext *s)
     int c_size, i;
     UINT8 *pict;
 
-    if (s->out_format == FMT_H263) 
-        s->dct_unquantize = dct_unquantize_h263_c;
-    else
-        s->dct_unquantize = dct_unquantize_mpeg1_c;
+    s->dct_unquantize_h263 = dct_unquantize_h263_c;
+    s->dct_unquantize_mpeg = dct_unquantize_mpeg1_c;
         
 #ifdef HAVE_MMX
     MPV_common_init_mmx(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_mpeg;
+    
     s->mb_width = (s->width + 15) / 16;
     s->mb_height = (s->height + 15) / 16;
     s->mb_num = s->mb_width * s->mb_height;
index f809a12..b7fe207 100644 (file)
@@ -309,7 +309,11 @@ typedef struct MpegEncContext {
     DCTELEM intra_block[6][64] __align8;
     DCTELEM inter_block[6][64] __align8;
     DCTELEM inter4v_block[6][64] __align8;
-    void (*dct_unquantize)(struct MpegEncContext *s, 
+    void (*dct_unquantize_mpeg)(struct MpegEncContext *s, 
+                           DCTELEM *block, int n, int qscale);
+    void (*dct_unquantize_h263)(struct MpegEncContext *s, 
+                           DCTELEM *block, int n, int qscale);
+    void (*dct_unquantize)(struct MpegEncContext *s, // unquantizer to use (mpeg4 can use both)
                            DCTELEM *block, int n, int qscale);
 } MpegEncContext;