[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