]> git.sesse.net Git - ffmpeg/commitdiff
intra_dc_precission>0 encoding support
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 30 Apr 2004 13:44:29 +0000 (13:44 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 30 Apr 2004 13:44:29 +0000 (13:44 +0000)
Originally committed as revision 3093 to svn://svn.ffmpeg.org/ffmpeg/trunk

ffmpeg.c
libavcodec/avcodec.h
libavcodec/mpeg12.c
libavcodec/mpegvideo.c

index 2698c084c70b76c86034e1d1b8e44061774a80b2..9105819581eaafb5556fd86ffc10b8ceca4e82ca 100644 (file)
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -164,6 +164,7 @@ static int debug = 0;
 static int debug_mv = 0;
 static int me_threshold = 0;
 static int mb_threshold = 0;
+static int intra_dc_precision = 0;
 extern int loop_input; /* currently a hack */
 
 static int gop_size = 12;
@@ -2893,6 +2894,7 @@ static void opt_output_file(const char *filename)
                 video_enc->idct_algo = idct_algo;
                 video_enc->me_threshold= me_threshold;
                 video_enc->mb_threshold= mb_threshold;
+                video_enc->intra_dc_precision= intra_dc_precision;
                 video_enc->strict_std_compliance = strict;
                 video_enc->error_rate = error_rate;
                 video_enc->noise_reduction= noise_reduction;
@@ -3580,6 +3582,7 @@ const OptionDef options[] = {
     { "qns", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qns}, "quantization noise shaping", "" },
     { "sc_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_sc_threshold}, "scene change threshold", "threshold" },
     { "me_range", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_range}, "limit motion vectors range (1023 for DivX player)", "range" },
+    { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
 
     /* audio options */
     { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_bitrate}, "set audio bitrate (in kbit/s)", "bitrate", },
index a81c865b3f26af6789f004ea59126af7ef5f3efc..6a4d223769f199be67a67fa3ea3168fb0d19be2c 100644 (file)
@@ -17,7 +17,7 @@ extern "C" {
 
 #define FFMPEG_VERSION_INT     0x000408
 #define FFMPEG_VERSION         "0.4.8"
-#define LIBAVCODEC_BUILD       4710
+#define LIBAVCODEC_BUILD       4711
 
 #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT
 #define LIBAVCODEC_VERSION     FFMPEG_VERSION
@@ -1584,6 +1584,13 @@ typedef struct AVCodecContext {
      * - decoding: unused
      */
      int mb_threshold;
+
+    /**
+     * 
+     * - encoding: set by user
+     * - decoding: unused
+     */
+     int intra_dc_precision;
 } AVCodecContext;
 
 
index 0d6583c890f62cca4f70fd0e640614bfe42e81fc..93e21af1009daf970c2fba98958f3b806f9c23c2 100644 (file)
@@ -360,7 +360,7 @@ static void common_init(MpegEncContext *s)
 {
 
     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 @@ void ff_mpeg1_encode_init(MpegEncContext *s)
 
 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 @@ static inline void encode_dc(MpegEncContext *s, int diff, int component)
            mpeg1_chr_dc_uni[diff+255]&0xFF,
            mpeg1_chr_dc_uni[diff+255]>>8);
     }
+  }
 }
 
 static void mpeg1_encode_block(MpegEncContext *s, 
index 772775cdad8532177055f2417c2f49d5f7fc84b8..1fa39e0f1fb2a2ea17dc145b35fc3448bceb6a09 100644 (file)
@@ -890,6 +890,7 @@ int MPV_encode_init(AVCodecContext *avctx)
     s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
     s->mpeg_quant= avctx->mpeg_quant;
     s->rtp_mode= !!avctx->rtp_payload_size;
+    s->intra_dc_precision= avctx->intra_dc_precision;
 
     if (s->gop_size <= 1) {
         s->intra_only = 1;
@@ -4009,7 +4010,7 @@ static int encode_thread(AVCodecContext *c, void *arg){
     for(i=0; i<3; i++){
         /* init last dc values */
         /* note: quant matrix value (8) is implied here */
-        s->last_dc[i] = 128;
+        s->last_dc[i] = 128 << s->intra_dc_precision;
         
         s->current_picture_ptr->error[i] = 0;
     }