darkness masking (lumi masking does only bright stuff now)
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 24 Sep 2002 10:53:59 +0000 (10:53 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 24 Sep 2002 10:53:59 +0000 (10:53 +0000)
Originally committed as revision 967 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/mpegvideo.c
libavcodec/ratecontrol.c

index 9b63af8..c840bb0 100644 (file)
@@ -5,8 +5,8 @@
 
 #define LIBAVCODEC_VERSION_INT 0x000406
 #define LIBAVCODEC_VERSION     "0.4.6"
-#define LIBAVCODEC_BUILD       4625
-#define LIBAVCODEC_BUILD_STR   "4625"
+#define LIBAVCODEC_BUILD       4626
+#define LIBAVCODEC_BUILD_STR   "4626"
 
 enum CodecID {
     CODEC_ID_NONE, 
@@ -668,6 +668,13 @@ typedef struct AVCodecContext {
      */
     float p_masking;
 
+    /**
+     * darkness masking (0-> disabled)
+     * encoding: set by user
+     * decoding: unused
+     */
+    float dark_masking;
+
     //FIXME this should be reordered after kabis API is finished ...
     //TODO kill kabi
     /*
index a7d775b..4b2b0ad 100644 (file)
@@ -433,23 +433,24 @@ int MPV_encode_init(AVCodecContext *avctx)
     } else {
         s->intra_only = 0;
     }
-    
+
     /* ME algorithm */
     if (avctx->me_method == 0)
         /* For compatibility */
         s->me_method = motion_estimation_method;
     else
         s->me_method = avctx->me_method;
-        
+
     /* Fixed QSCALE */
     s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE);
     
     s->adaptive_quant= (   s->avctx->lumi_masking
+                        || s->avctx->dark_masking
                         || s->avctx->temporal_cplx_masking 
                         || s->avctx->spatial_cplx_masking
                         || s->avctx->p_masking)
                        && !s->fixed_qscale;
-    
+
     switch(avctx->codec->id) {
     case CODEC_ID_MPEG1VIDEO:
         s->out_format = FMT_MPEG1;
index c84fd22..cd0ff81 100644 (file)
@@ -465,6 +465,7 @@ static void update_predictor(Predictor *p, double q, double var, double size)
 static void adaptive_quantization(MpegEncContext *s, double q){
     int i;
     const float lumi_masking= s->avctx->lumi_masking / (128.0*128.0);
+    const float dark_masking= s->avctx->dark_masking / (128.0*128.0);
     const float temp_cplx_masking= s->avctx->temporal_cplx_masking;
     const float spatial_cplx_masking = s->avctx->spatial_cplx_masking;
     const float p_masking = s->avctx->p_masking;
@@ -492,7 +493,11 @@ static void adaptive_quantization(MpegEncContext *s, double q){
             factor= pow(temp_cplx, - temp_cplx_masking);
         }
         factor*=pow(spat_cplx, - spatial_cplx_masking);
-        factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);
+
+        if(lumi>127)
+            factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);
+        else
+            factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking);
         
         if(factor<0.00001) factor= 0.00001;