From 46b06bd894f0d69ce137503a06249e8a9bb8f840 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 20 Dec 2013 14:09:58 +0100 Subject: [PATCH] avcodec/mpegvideo_enc: implement frame skip score normalization Signed-off-by: Michael Niedermayer --- 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 1606f6c5c9..c2cd555284 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 6bf3e384c6..5828a27c50 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;