changeset 695:3525da287ee2 libavcodec

adaptive quantization for h263
author michaelni
date Tue, 24 Sep 2002 15:07:44 +0000
parents 20810b0193ef
children 477bcb3b2f0a
files h263.c mpegvideo.c mpegvideo.h
diffstat 3 files changed, 29 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/h263.c	Tue Sep 24 12:33:37 2002 +0000
+++ b/h263.c	Tue Sep 24 15:07:44 2002 +0000
@@ -332,9 +332,8 @@
     return score0 > score1 ? 1 : 0;    
 }
 
-void ff_clean_mpeg4_qscales(MpegEncContext *s){
+void ff_clean_h263_qscales(MpegEncContext *s){
     int i;
-    /* more braindead iso mpeg mess */
     
     for(i=1; i<s->mb_num; i++){
         if(s->qscale_table[i] - s->qscale_table[i-1] >2)
@@ -344,6 +343,12 @@
         if(s->qscale_table[i] - s->qscale_table[i+1] >2)
             s->qscale_table[i]= s->qscale_table[i+1]+2;
     }
+}
+
+void ff_clean_mpeg4_qscales(MpegEncContext *s){
+    int i;
+    
+    ff_clean_h263_qscales(s);
     
     for(i=1; i<s->mb_num; i++){
         if(s->qscale_table[i] != s->qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_INTER4V)){
@@ -743,6 +748,7 @@
     INT16 pred_dc;
     INT16 rec_intradc[6];
     UINT16 *dc_ptr[6];
+    const int dquant_code[5]= {1,0,9,2,3};
            
     //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
     if (!s->mb_intra) {
@@ -752,19 +758,22 @@
             if (s->block_last_index[i] >= 0)
                 cbp |= 1 << (5 - i);
         }
-        if ((cbp | motion_x | motion_y) == 0) {
+        if ((cbp | motion_x | motion_y | s->dquant) == 0) {
             /* skip macroblock */
             put_bits(&s->pb, 1, 1);
             return;
         }
         put_bits(&s->pb, 1, 0);	/* mb coded */
         cbpc = cbp & 3;
+        if(s->dquant) cbpc+= 8;
         put_bits(&s->pb,
 		    inter_MCBPC_bits[cbpc],
 		    inter_MCBPC_code[cbpc]);
         cbpy = cbp >> 2;
         cbpy ^= 0xf;
         put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
+        if(s->dquant)
+            put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
 
         /* motion vectors: 16x16 mode only now */
         h263_pred_motion(s, 0, &pred_x, &pred_y);
@@ -828,10 +837,12 @@
 
         cbpc = cbp & 3;
         if (s->pict_type == I_TYPE) {
+            if(s->dquant) cbpc+=4;
             put_bits(&s->pb,
                 intra_MCBPC_bits[cbpc],
                 intra_MCBPC_code[cbpc]);
         } else {
+            if(s->dquant) cbpc+=8;
             put_bits(&s->pb, 1, 0);	/* mb coded */
             put_bits(&s->pb,
                 inter_MCBPC_bits[cbpc + 4],
@@ -843,6 +854,8 @@
         }
         cbpy = cbp >> 2;
         put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
+        if(s->dquant)
+            put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
     }
 
     for(i=0; i<6; i++) {
--- a/mpegvideo.c	Tue Sep 24 12:33:37 2002 +0000
+++ b/mpegvideo.c	Tue Sep 24 15:07:44 2002 +0000
@@ -2190,12 +2190,19 @@
     else
         s->frame_qscale = ff_rate_estimate_qscale(s);
 
-    if(s->adaptive_quant && s->codec_id==CODEC_ID_MPEG4)
-        ff_clean_mpeg4_qscales(s);
-    
-    if(s->adaptive_quant)
+    if(s->adaptive_quant){
+        switch(s->codec_id){
+        case CODEC_ID_MPEG4:
+            ff_clean_mpeg4_qscales(s);
+            break;
+        case CODEC_ID_H263:
+        case CODEC_ID_H263P:
+            ff_clean_h263_qscales(s);
+            break;
+        }
+
         s->qscale= s->qscale_table[0];
-    else
+    }else
         s->qscale= (int)(s->frame_qscale + 0.5);
         
     if (s->out_format == FMT_MJPEG) {
--- a/mpegvideo.h	Tue Sep 24 12:33:37 2002 +0000
+++ b/mpegvideo.h	Tue Sep 24 15:07:44 2002 +0000
@@ -587,6 +587,7 @@
 void ff_mpeg4_merge_partitions(MpegEncContext *s);
 extern inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
 void ff_clean_mpeg4_qscales(MpegEncContext *s);
+void ff_clean_h263_qscales(MpegEncContext *s);
 
 /* rv10.c */
 void rv10_encode_picture_header(MpegEncContext *s, int picture_number);