[FFmpeg-devel] [PATCH] avcodec/mpegvideo_enc: implement frame skip score normalization

Michael Niedermayer michaelni at gmx.at
Fri Dec 20 15:32:07 CET 2013


Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
 doc/codecs.texi            |    3 +++
 libavcodec/mpegvideo_enc.c |    7 +++++--
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/doc/codecs.texi b/doc/codecs.texi
index 1606f6c..c2cd555 100644
--- a/doc/codecs.texi
+++ b/doc/codecs.texi
@@ -877,6 +877,9 @@ Set frame skip factor.
 
 @item skip_exp @var{integer} (@emph{encoding,video})
 Set frame skip exponent.
+Negative values behave identical to the corresponding positive ones, except
+that the score is normalized.
+Positive values exist primarly for compatibility reasons and are not so useful.
 
 @item skipcmp @var{integer} (@emph{encoding,video})
 Set frame skip compare function.
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 6bf3e38..5828a27 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -1145,7 +1145,7 @@ static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
                 uint8_t *rptr = ref->f.data[plane] + 8 * (x + y * stride);
                 int v   = s->dsp.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
 
-                switch (s->avctx->frame_skip_exp) {
+                switch (FFABS(s->avctx->frame_skip_exp)) {
                 case 0: score    =  FFMAX(score, v);          break;
                 case 1: score   += FFABS(v);                  break;
                 case 2: score64 += v * (int64_t)v;                       break;
@@ -1155,9 +1155,13 @@ static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
             }
         }
     }
+    emms_c();
 
     if (score)
         score64 = score;
+    if (s->avctx->frame_skip_exp < 0)
+        score64 = pow(score64 / (double)(s->mb_width * s->mb_height),
+                      -1.0/s->avctx->frame_skip_exp);
 
     if (score64 < s->avctx->frame_skip_threshold)
         return 1;
@@ -1307,7 +1311,6 @@ static int select_input_picture(MpegEncContext *s)
                 // FIXME check that te gop check above is +-1 correct
                 av_frame_unref(&s->input_picture[0]->f);
 
-                emms_c();
                 ff_vbv_update(s, 0);
 
                 goto no_output_pic;
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list