diff mpegvideo.c @ 2345:ada3891b859d libavcodec

H261 fixing and cleaning: -corrected wrong value in mv data -set correct mb_type after adjusting index -don't use H263 loop filter when the loop filter flag is set but when using the H261 encoder -use the same unquantizer as H263 (which is optimized btw) -removed unused members in H261Context patch by (Maarten Daniels <maarten.daniels >at< luc >dot< ac >dot< be>) regression test checksum update by me
author michael
date Fri, 12 Nov 2004 01:21:34 +0000
parents 5e5cf598a48b
children e0bda0b8359a
line wrap: on
line diff
--- a/mpegvideo.c	Thu Nov 11 18:09:28 2004 +0000
+++ b/mpegvideo.c	Fri Nov 12 01:21:34 2004 +0000
@@ -53,10 +53,6 @@
                                   DCTELEM *block, int n, int qscale);
 static void dct_unquantize_h263_inter_c(MpegEncContext *s, 
                                   DCTELEM *block, int n, int qscale);
-static void dct_unquantize_h261_intra_c(MpegEncContext *s, 
-                                  DCTELEM *block, int n, int qscale);
-static void dct_unquantize_h261_inter_c(MpegEncContext *s, 
-                                  DCTELEM *block, int n, int qscale);
 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
 #ifdef CONFIG_ENCODERS
 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
@@ -219,8 +215,6 @@
 {
     s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
     s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
-    s->dct_unquantize_h261_intra = dct_unquantize_h261_intra_c;
-    s->dct_unquantize_h261_inter = dct_unquantize_h261_inter_c;
     s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
     s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
     s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
@@ -1482,12 +1476,9 @@
     if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
         s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
         s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
-    }else if(s->out_format == FMT_H263){
+    }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
         s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
         s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
-    }else if(s->out_format == FMT_H261){
-        s->dct_unquantize_intra = s->dct_unquantize_h261_intra;
-        s->dct_unquantize_inter = s->dct_unquantize_h261_inter;
     }else{
         s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
         s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
@@ -4517,6 +4508,7 @@
             if(s->codec_id == CODEC_ID_H261){
                 ff_h261_reorder_mb_index(s);
                 xy= s->mb_y*s->mb_stride + s->mb_x;
+                mb_type= s->mb_type[xy];
             }
 
             /* write gob / video packet header  */
@@ -4990,8 +4982,10 @@
                     s, s->new_picture    .data[2] + s->mb_x*8  + s->mb_y*s->uvlinesize*8,
                     s->dest[2], w>>1, h>>1, s->uvlinesize);
             }
-            if(s->loop_filter)
-                ff_h263_loop_filter(s);
+            if(s->loop_filter){
+                if(s->out_format == FMT_H263)
+                    ff_h263_loop_filter(s);
+            }
 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
         }
     }
@@ -6250,59 +6244,6 @@
     }
 }
 
-static void dct_unquantize_h261_intra_c(MpegEncContext *s, 
-                                  DCTELEM *block, int n, int qscale)
-{
-    int i, level, even;
-    int nCoeffs;
-    
-    assert(s->block_last_index[n]>=0);
-    
-    if (n < 4) 
-        block[0] = block[0] * s->y_dc_scale;
-    else
-        block[0] = block[0] * s->c_dc_scale;
-    even = (qscale & 1)^1;
-    nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
-
-    for(i=1; i<=nCoeffs; i++){
-        level = block[i];
-        if (level){
-            if (level < 0){
-                level = qscale * ((level << 1) - 1) + even;
-            }else{
-                level = qscale * ((level << 1) + 1) - even;
-            }
-        }
-        block[i] = level;
-    }
-}
-
-static void dct_unquantize_h261_inter_c(MpegEncContext *s, 
-                                  DCTELEM *block, int n, int qscale)
-{
-    int i, level, even;
-    int nCoeffs;
-    
-    assert(s->block_last_index[n]>=0);
-
-    even = (qscale & 1)^1;
-    
-    nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
-
-    for(i=0; i<=nCoeffs; i++){
-        level = block[i];
-        if (level){
-            if (level < 0){
-                level = qscale * ((level << 1) - 1) + even;
-            }else{
-                level = qscale * ((level << 1) + 1) - even;
-            }
-        }
-        block[i] = level;
-    }
-}
-
 static const AVOption mpeg4_options[] =
 {
     AVOPTION_CODEC_INT("bitrate", "desired video bitrate", bit_rate, 4, 240000000, 800000),