From 39a64e3023436af020fb2846880f99c2160e13f2 Mon Sep 17 00:00:00 2001 From: Corey Hickey Date: Sun, 22 Jan 2006 20:54:52 +0000 Subject: sc_factor support for encoding. Here's the description I'll add to the mplayer man page: --- Causes frames with higher quantizers to be more likely to trigger a scene change detection and make libavcodec use an I-frame (default: 1). 1-16 is a sane range. Values between 2 and 6 may yield increasing PSNR (up to approximately 0.04 dB) and better placement of I-frames in high-motion scenes. Higher values than 6 may give very slightly better PSNR (approximately 0.01 dB more than sc_factor=6), but noticably worse visual quality. --- Original idea from Michael; patch by me. Originally committed as revision 4883 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/avcodec.h | 7 +++++++ libavcodec/motion_est.c | 10 +++++----- libavcodec/utils.c | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index bf54fce05b..532e37565d 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1989,6 +1989,13 @@ typedef struct AVCodecContext { * - decoding: unused */ int cutoff; + + /** + * multiplied by qscale for each frame and added to scene_change_score + * - encoding: set by user. + * - decoding: unused + */ + int scenechange_factor; } AVCodecContext; /** diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c index 10b1db9232..526773b897 100644 --- a/libavcodec/motion_est.c +++ b/libavcodec/motion_est.c @@ -1179,7 +1179,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, if (vard <= 64<<8 || vard < varc) { //FIXME c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); }else{ - c->scene_change_score+= s->qscale; + c->scene_change_score+= s->qscale * s->avctx->scenechange_factor; } return; } @@ -1270,7 +1270,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, if (vard <= 64<<8 || vard < varc) c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); else - c->scene_change_score+= s->qscale; + c->scene_change_score+= s->qscale * s->avctx->scenechange_factor; if(mb_type == CANDIDATE_MB_TYPE_INTER){ c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); @@ -1291,7 +1291,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, if (vard <= 64<<8 || vard < varc) c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); else - c->scene_change_score+= s->qscale; + c->scene_change_score+= s->qscale * s->avctx->scenechange_factor; if (vard*2 + 200*256 > varc) mb_type|= CANDIDATE_MB_TYPE_INTRA; @@ -1397,7 +1397,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, if (vard <= 64<<8 || vard < varc) { //FIXME c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); }else{ - c->scene_change_score+= s->qscale; + c->scene_change_score+= s->qscale * s->avctx->scenechange_factor; } } @@ -1843,7 +1843,7 @@ void ff_estimate_b_frame_motion(MpegEncContext * s, /* if (vard <= 64<<8 || vard < varc) { c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); }else{ - c->scene_change_score+= s->qscale; + c->scene_change_score+= s->qscale * s->avctx->scenechange_factor; }*/ return; } diff --git a/libavcodec/utils.c b/libavcodec/utils.c index dc826c8b35..3e450cbeff 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -734,6 +734,7 @@ static AVOption options[]={ {"partp4x4", NULL, 0, FF_OPT_TYPE_CONST, X264_PART_P4X4, INT_MIN, INT_MAX, V|E, "partitions"}, {"partp8x8", NULL, 0, FF_OPT_TYPE_CONST, X264_PART_P8X8, INT_MIN, INT_MAX, V|E, "partitions"}, {"partb8x8", NULL, 0, FF_OPT_TYPE_CONST, X264_PART_B8X8, INT_MIN, INT_MAX, V|E, "partitions"}, +{"sc_factor", NULL, OFFSET(scenechange_factor), FF_OPT_TYPE_INT, 6, 0, INT_MAX, V|E}, {NULL}, }; -- cgit v1.2.3