diff mpegvideo.c @ 947:9be53be2d1a9 libavcodec

trellis quantization for mpeg1 rounding bugfix for mpeg1 (seems this was introduced during the ME changes)
author michaelni
date Wed, 01 Jan 2003 00:42:18 +0000
parents 4f522c9e6099
children ad264a7d4f94
line wrap: on
line diff
--- a/mpegvideo.c	Tue Dec 31 22:58:41 2002 +0000
+++ b/mpegvideo.c	Wed Jan 01 00:42:18 2003 +0000
@@ -2780,7 +2780,7 @@
             s->no_rounding=1;
         else if(s->flipflop_rounding)
             s->no_rounding ^= 1;          
-    }else{
+    }else if(s->out_format == FMT_H263){
         if(s->pict_type==I_TYPE)
             s->no_rounding=0;
         else if(s->pict_type!=B_TYPE)
@@ -3307,7 +3307,7 @@
         start_i = 1;
         last_non_zero = 0;
         qmat = s->q_intra_matrix[qscale];
-        if(s->mpeg_quant)
+        if(s->mpeg_quant || s->codec_id== CODEC_ID_MPEG1VIDEO)
             bias= 1<<(QMAT_SHIFT-1);
         length     = s->intra_ac_vlc_length;
         last_length= s->intra_ac_vlc_last_length;
@@ -3381,13 +3381,33 @@
                 }else{
                     unquant_coeff= level*qmul - qadd;
                 }
-            } //FIXME else
+            }else{ //MPEG1
+                j= s->idct_permutation[ scantable[i + start_i] ]; //FIXME optimize
+                if(s->mb_intra){
+                    if (level < 0) {
+                        unquant_coeff = (int)((-level) * qscale * s->intra_matrix[j]) >> 3;
+                        unquant_coeff = -((unquant_coeff - 1) | 1);
+                    } else {
+                        unquant_coeff = (int)(  level  * qscale * s->intra_matrix[j]) >> 3;
+                        unquant_coeff =   (unquant_coeff - 1) | 1;
+                    }
+                }else{
+                    if (level < 0) {
+                        unquant_coeff = ((((-level) << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
+                        unquant_coeff = -((unquant_coeff - 1) | 1);
+                    } else {
+                        unquant_coeff = (((  level  << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
+                        unquant_coeff =   (unquant_coeff - 1) | 1;
+                    }
+                }
+                unquant_coeff<<= 3;
+            }
 
             distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff);
             level+=64;
             if((level&(~127)) == 0){
                 for(run=0; run<=i - left_limit; run++){
-                    int score= distoration + length[UNI_ENC_INDEX(run, level)]*lambda;
+                    int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
                     score += score_tab[i-run];
                     
                     if(score < best_score){
@@ -3400,7 +3420,7 @@
 
                 if(s->out_format == FMT_H263){
                     for(run=0; run<=i - left_limit; run++){
-                        int score= distoration + last_length[UNI_ENC_INDEX(run, level)]*lambda;
+                        int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
                         score += score_tab[i-run];
                         if(score < last_score){
                             last_score= score;
@@ -3452,11 +3472,12 @@
 
     if(s->out_format != FMT_H263){
         last_score= 256*256*256*120;
-        for(i=0; i<=last_non_zero - start_i + 1; i++){
+        for(i= left_limit; i<=last_non_zero - start_i + 1; i++){
             int score= score_tab[i];
+            if(i) score += lambda*2; //FIXME exacter?
+
             if(score < last_score){
                 last_score= score;
-                if(i) last_score += lambda*2; //FIXME exacter?
                 last_i= i;
                 last_level= level_tab[i];
                 last_run= run_tab[i];