From e8c7fca90c7474e2352efcbf4d71e19a85abc238 Mon Sep 17 00:00:00 2001 From: Jason Garrett-Glaser Date: Thu, 6 May 2010 22:38:18 +0000 Subject: [PATCH] Add intra refresh and crf-max support to the libavcodec libx264 wrapper. Minor version bump. Originally committed as revision 23038 to svn://svn.ffmpeg.org/ffmpeg/trunk --- configure | 4 ++-- libavcodec/avcodec.h | 12 +++++++++++- libavcodec/libx264.c | 2 ++ libavcodec/options.c | 2 ++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 5d1ba2b0063..355cab1cc31 100755 --- a/configure +++ b/configure @@ -2618,8 +2618,8 @@ enabled libspeex && require libspeex speex/speex.h speex_decoder_init -lspeex enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg enabled libvorbis && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264 -lm && - { check_cpp_condition x264.h "X264_BUILD >= 83" || - die "ERROR: libx264 version must be >= 0.83."; } + { check_cpp_condition x264.h "X264_BUILD >= 90" || + die "ERROR: libx264 version must be >= 0.90."; } enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore enabled mlib && require mediaLib mlib_types.h mlib_VectorSub_S16_U8_Mod -lmlib diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index b6437473e6c..be9994f7b26 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -30,7 +30,7 @@ #include "libavutil/avutil.h" #define LIBAVCODEC_VERSION_MAJOR 52 -#define LIBAVCODEC_VERSION_MINOR 66 +#define LIBAVCODEC_VERSION_MINOR 67 #define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ @@ -597,6 +597,7 @@ typedef struct RcOverride{ #define CODEC_FLAG2_MBTREE 0x00040000 ///< Use macroblock tree ratecontrol (x264 only) #define CODEC_FLAG2_PSY 0x00080000 ///< Use psycho visual optimizations. #define CODEC_FLAG2_SSIM 0x00100000 ///< Compute SSIM during encoding, error[] values are undefined. +#define CODEC_FLAG2_INTRA_REFRESH 0x00200000 ///< Use periodic insertion of intra blocks instead of keyframes. /* Unsupported options : * Syntax Arithmetic coding (SAC) @@ -2646,6 +2647,15 @@ typedef struct AVCodecContext { * - decoding: unused */ int rc_lookahead; + + /** + * Constant rate factor maximum + * With CRF encoding mode and VBV restrictions enabled, prevents quality from being worse + * than crf_max, even if doing so would violate VBV restrictions. + * - encoding: Set by user. + * - decoding: unused + */ + float crf_max; } AVCodecContext; /** diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index df7b2e806b6..ec6d5ea4339 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -156,6 +156,7 @@ static av_cold int X264_init(AVCodecContext *avctx) x4->params.p_log_private = avctx; x4->params.i_keyint_max = avctx->gop_size; + x4->params.b_intra_refresh = avctx->flags2 & CODEC_FLAG2_INTRA_REFRESH; x4->params.rc.i_bitrate = avctx->bit_rate / 1000; x4->params.rc.i_vbv_buffer_size = avctx->rc_buffer_size / 1000; x4->params.rc.i_vbv_max_bitrate = avctx->rc_max_rate / 1000; @@ -166,6 +167,7 @@ static av_cold int X264_init(AVCodecContext *avctx) if (avctx->crf) { x4->params.rc.i_rc_method = X264_RC_CRF; x4->params.rc.f_rf_constant = avctx->crf; + x4->params.rc.f_rf_constant_max = avctx->crf_max; } else if (avctx->cqp > -1) { x4->params.rc.i_rc_method = X264_RC_CQP; x4->params.rc.i_qp_constant = avctx->cqp; diff --git a/libavcodec/options.c b/libavcodec/options.c index 6835352c302..3b50d2c689d 100644 --- a/libavcodec/options.c +++ b/libavcodec/options.c @@ -411,6 +411,8 @@ static const AVOption options[]={ {"aq_strength", "specify aq strength", OFFSET(aq_strength), FF_OPT_TYPE_FLOAT, 1.0, 0, FLT_MAX, V|E}, {"rc_lookahead", "specify number of frames to look ahead for frametype", OFFSET(rc_lookahead), FF_OPT_TYPE_INT, 40, 0, INT_MAX, V|E}, {"ssim", "ssim will be calculated during encoding", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_SSIM, INT_MIN, INT_MAX, V|E, "flags2"}, +{"intra_refresh", "use periodic insertion of intra blocks instead of keyframes", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_INTRA_REFRESH, INT_MIN, INT_MAX, V|E, "flags2"}, +{"crf_max", "in crf mode, prevents vbv from lowering quality beyond this point", OFFSET(crf_max), FF_OPT_TYPE_FLOAT, DEFAULT, 0, 51, V|E}, {NULL}, }; -- 2.39.2