avcodec/mpegvideo_enc: implement frame skip score normalization

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2013-12-20 14:09:58 +01:00
parent 21a2fb7e05
commit 46b06bd894
2 changed files with 8 additions and 2 deletions

View File

@ -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.

View File

@ -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;