diff mpeg12.c @ 1992:938e47c809b0 libavcodec

intra_dc_precission>0 encoding support
author michael
date Fri, 30 Apr 2004 13:44:29 +0000
parents 11991f81afd6
children 141a9539e270
line wrap: on
line diff
--- a/mpeg12.c	Fri Apr 30 01:35:45 2004 +0000
+++ b/mpeg12.c	Fri Apr 30 13:44:29 2004 +0000
@@ -360,7 +360,7 @@
 {
 
     s->y_dc_scale_table=
-    s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
+    s->c_dc_scale_table= mpeg2_dc_scale_table[s->intra_dc_precision];
 
 }
 
@@ -837,6 +837,27 @@
 
 static inline void encode_dc(MpegEncContext *s, int diff, int component)
 {
+  if(((unsigned) (diff+255)) >= 511){
+        int index;
+
+        if(diff<0){
+            index= av_log2_16bit(-2*diff);
+            diff--;
+        }else{
+            index= av_log2_16bit(2*diff);
+        }
+        if (component == 0) {
+            put_bits(
+                &s->pb, 
+                vlc_dc_lum_bits[index] + index,
+                (vlc_dc_lum_code[index]<<index) + (diff & ((1 << index) - 1)));
+        }else{
+            put_bits(
+                &s->pb, 
+                vlc_dc_chroma_bits[index] + index,
+                (vlc_dc_chroma_code[index]<<index) + (diff & ((1 << index) - 1)));
+        }
+  }else{
     if (component == 0) {
         put_bits(
 	    &s->pb, 
@@ -848,6 +869,7 @@
 	    mpeg1_chr_dc_uni[diff+255]&0xFF,
 	    mpeg1_chr_dc_uni[diff+255]>>8);
     }
+  }
 }
 
 static void mpeg1_encode_block(MpegEncContext *s,