From 0e6c8532215790bbe560a9eea4f3cc82bb55cf92 Mon Sep 17 00:00:00 2001 From: Vittorio Giovara Date: Wed, 9 Sep 2015 04:18:26 +0200 Subject: [PATCH] lavc: Move b_frame_strategy and b_sensitivity to codec private options The b_frame_strategy option is only used by mpegvideoenc, qsv, x264, and xavs, while b_sensitivity is only used by mpegvideoenc. These are very codec-specific options, so deprecate the global variants. Set proper limits to the maximum allowed values. Signed-off-by: Vittorio Giovara --- libavcodec/avcodec.h | 13 ++++++++----- libavcodec/libx264.c | 13 ++++++++++++- libavcodec/libxavs.c | 11 ++++++++++- libavcodec/mpegvideo.h | 4 ++++ libavcodec/mpegvideo_enc.c | 28 +++++++++++++++++----------- libavcodec/options_table.h | 4 ++++ libavcodec/qsvenc.c | 8 +++++++- libavcodec/qsvenc.h | 2 ++ libavcodec/qsvenc_h264.c | 2 ++ libavcodec/qsvenc_hevc.c | 2 ++ libavcodec/qsvenc_mpeg2.c | 2 ++ libavcodec/version.h | 3 +++ 12 files changed, 73 insertions(+), 19 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 8083111605..66e6ac8a70 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1594,7 +1594,11 @@ typedef struct AVCodecContext { #define FF_RC_STRATEGY_XVID 1 #endif +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int b_frame_strategy; +#endif /** * qscale offset between IP and B-frames @@ -1999,12 +2003,11 @@ typedef struct AVCodecContext { */ int mv0_threshold; - /** - * Adjust sensitivity of b_frame_strategy 1. - * - encoding: Set by user. - * - decoding: unused - */ +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated int b_sensitivity; +#endif /** * Chromaticity coordinates of the source primaries. diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index fe0247f9a3..5db00ff540 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -79,6 +79,7 @@ typedef struct X264Context { int motion_est; int forced_idr; int coder; + int b_frame_strategy; char *x264_params; } X264Context; @@ -439,8 +440,12 @@ static av_cold int X264_init(AVCodecContext *avctx) x4->params.analyse.i_noise_reduction = avctx->noise_reduction; if (avctx->me_subpel_quality >= 0) x4->params.analyse.i_subpel_refine = avctx->me_subpel_quality; +#if FF_API_PRIVATE_OPT +FF_DISABLE_DEPRECATION_WARNINGS if (avctx->b_frame_strategy >= 0) - x4->params.i_bframe_adaptive = avctx->b_frame_strategy; + x4->b_frame_strategy = avctx->b_frame_strategy; +FF_ENABLE_DEPRECATION_WARNINGS +#endif if (avctx->keyint_min >= 0) x4->params.i_keyint_min = avctx->keyint_min; #if FF_API_CODER_TYPE @@ -527,6 +532,9 @@ FF_ENABLE_DEPRECATION_WARNINGS if (x4->coder >= 0) x4->params.b_cabac = x4->coder; + if (x4->b_frame_strategy >= 0) + x4->params.i_bframe_adaptive = x4->b_frame_strategy; + if (x4->profile) if (x264_param_apply_profile(&x4->params, x4->profile) < 0) { av_log(avctx, AV_LOG_ERROR, "Error setting profile %s.\n", x4->profile); @@ -730,6 +738,7 @@ static const AVOption options[] = { { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, INT_MIN, INT_MAX, VE, "coder" }, { "cavlc", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, VE, "coder" }, { "cabac", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN, INT_MAX, VE, "coder" }, + { "b_strategy", "Strategy to choose between I/P/B-frames", OFFSET(b_frame_strategy), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 2, VE }, { "x264-params", "Override the x264 configuration using a :-separated list of key=value parameters", OFFSET(x264_params), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE }, { NULL }, @@ -754,7 +763,9 @@ static const AVCodecDefault x264_defaults[] = { { "me_method", "-1" }, #endif { "subq", "-1" }, +#if FF_API_PRIVATE_OPT { "b_strategy", "-1" }, +#endif { "keyint_min", "-1" }, #if FF_API_CODER_TYPE { "coder", "-1" }, diff --git a/libavcodec/libxavs.c b/libavcodec/libxavs.c index 43b0915c52..910d6c965e 100644 --- a/libavcodec/libxavs.c +++ b/libavcodec/libxavs.c @@ -56,6 +56,7 @@ typedef struct XavsContext { int motion_est; int mbtree; int mixed_refs; + int b_frame_strategy; int64_t *pts_buffer; int out_frame_count; @@ -311,7 +312,14 @@ FF_ENABLE_DEPRECATION_WARNINGS /* cabac is not included in AVS JiZhun Profile */ x4->params.b_cabac = 0; - x4->params.i_bframe_adaptive = avctx->b_frame_strategy; +#if FF_API_PRIVATE_OPT +FF_DISABLE_DEPRECATION_WARNINGS + if (avctx->b_frame_strategy) + x4->b_frame_strategy = avctx->b_frame_strategy; +FF_ENABLE_DEPRECATION_WARNINGS +#endif + + x4->params.i_bframe_adaptive = x4->b_frame_strategy; avctx->has_b_frames = !!avctx->max_b_frames; @@ -439,6 +447,7 @@ static const AVOption options[] = { { "umh", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_UMH }, INT_MIN, INT_MAX, VE, "motion-est" }, { "esa", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_ESA }, INT_MIN, INT_MAX, VE, "motion-est" }, { "tesa", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_TESA }, INT_MIN, INT_MAX, VE, "motion-est" }, + { "b_strategy", "Strategy to choose between I/P/B-frames", OFFSET(b_frame_strategy), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, VE}, { NULL }, }; diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 52c6f91d20..ea7a2d01df 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -525,6 +525,8 @@ typedef struct MpegEncContext { /* temporary frames used by b_frame_strategy = 2 */ AVFrame *tmp_frames[MAX_B_FRAMES + 2]; + int b_frame_strategy; + int b_sensitivity; } MpegEncContext; /* mpegvideo_enc common options */ @@ -573,6 +575,8 @@ typedef struct MpegEncContext { { "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, FF_MPV_OPT_FLAGS, "motion_est" }, \ { "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, FF_MPV_OPT_FLAGS, "motion_est" }, \ { "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, FF_MPV_OPT_FLAGS, "motion_est" }, \ +{"b_strategy", "Strategy to choose between I/P/B-frames", FF_MPV_OFFSET(b_frame_strategy), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, FF_MPV_OPT_FLAGS }, \ +{"b_sensitivity", "Adjust sensitivity of b_frame_strategy 1", FF_MPV_OFFSET(b_sensitivity), AV_OPT_TYPE_INT, {.i64 = 40 }, 1, INT_MAX, FF_MPV_OPT_FLAGS }, \ extern const AVOption ff_mpv_generic_options[]; diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 34e008f66d..585631232f 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -525,10 +525,19 @@ FF_ENABLE_DEPRECATION_WARNINGS return -1; } - if (avctx->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) { +#if FF_API_PRIVATE_OPT +FF_DISABLE_DEPRECATION_WARNINGS + if (avctx->b_frame_strategy) + s->b_frame_strategy = avctx->b_frame_strategy; + if (avctx->b_sensitivity != 40) + s->b_sensitivity = avctx->b_sensitivity; +FF_ENABLE_DEPRECATION_WARNINGS +#endif + + if (s->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) { av_log(avctx, AV_LOG_INFO, "notice: b_frame_strategy only affects the first pass\n"); - avctx->b_frame_strategy = 0; + s->b_frame_strategy = 0; } i = av_gcd(avctx->time_base.den, avctx->time_base.num); @@ -867,7 +876,7 @@ FF_ENABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS #endif - if (avctx->b_frame_strategy == 2) { + if (s->b_frame_strategy == 2) { for (i = 0; i < s->max_b_frames + 2; i++) { s->tmp_frames[i] = av_frame_alloc(); if (!s->tmp_frames[i]) @@ -1302,7 +1311,7 @@ static int select_input_picture(MpegEncContext *s) s->reordered_input_picture[0]->f->coded_picture_number = s->coded_picture_number++; } else { - int b_frames; + int b_frames = 0; if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) { if (s->picture_in_gop_number < s->gop_size && @@ -1333,11 +1342,11 @@ static int select_input_picture(MpegEncContext *s) } } - if (s->avctx->b_frame_strategy == 0) { + if (s->b_frame_strategy == 0) { b_frames = s->max_b_frames; while (b_frames && !s->input_picture[b_frames]) b_frames--; - } else if (s->avctx->b_frame_strategy == 1) { + } else if (s->b_frame_strategy == 1) { for (i = 1; i < s->max_b_frames + 1; i++) { if (s->input_picture[i] && s->input_picture[i]->b_frame_score == 0) { @@ -1351,7 +1360,7 @@ static int select_input_picture(MpegEncContext *s) for (i = 0; i < s->max_b_frames + 1; i++) { if (!s->input_picture[i] || s->input_picture[i]->b_frame_score - 1 > - s->mb_num / s->avctx->b_sensitivity) + s->mb_num / s->b_sensitivity) break; } @@ -1361,11 +1370,8 @@ static int select_input_picture(MpegEncContext *s) for (i = 0; i < b_frames + 1; i++) { s->input_picture[i]->b_frame_score = 0; } - } else if (s->avctx->b_frame_strategy == 2) { + } else if (s->b_frame_strategy == 2) { b_frames = estimate_best_b_count(s); - } else { - av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n"); - b_frames = 0; } emms_c(); diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h index 91b2bef7a6..2c8fb949e8 100644 --- a/libavcodec/options_table.h +++ b/libavcodec/options_table.h @@ -119,7 +119,9 @@ static const AVOption avcodec_options[] = { #if FF_API_RC_STRATEGY {"rc_strategy", "ratecontrol method", OFFSET(rc_strategy), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E}, #endif +#if FF_API_PRIVATE_OPT {"b_strategy", "strategy to choose between I/P/B-frames", OFFSET(b_frame_strategy), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, V|E}, +#endif {"ps", "RTP payload size in bytes", OFFSET(rtp_payload_size), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E}, #if FF_API_STAT_BITS {"mv_bits", NULL, OFFSET(mv_bits), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX}, @@ -390,7 +392,9 @@ static const AVOption avcodec_options[] = { {"sc_factor", "multiplied by qscale for each frame and added to scene_change_score", OFFSET(scenechange_factor), AV_OPT_TYPE_INT, {.i64 = 6 }, 0, INT_MAX, V|E}, #endif /* FF_API_UNUSED_MEMBERS */ {"mv0_threshold", NULL, OFFSET(mv0_threshold), AV_OPT_TYPE_INT, {.i64 = 256 }, 0, INT_MAX, V|E}, +#if FF_API_PRIVATE_OPT {"b_sensitivity", "adjust sensitivity of b_frame_strategy 1", OFFSET(b_sensitivity), AV_OPT_TYPE_INT, {.i64 = 40 }, 1, INT_MAX, V|E}, +#endif {"compression_level", NULL, OFFSET(compression_level), AV_OPT_TYPE_INT, {.i64 = FF_COMPRESSION_DEFAULT }, INT_MIN, INT_MAX, V|A|E}, {"min_prediction_order", NULL, OFFSET(min_prediction_order), AV_OPT_TYPE_INT, {.i64 = -1 }, INT_MIN, INT_MAX, A|E}, {"max_prediction_order", NULL, OFFSET(max_prediction_order), AV_OPT_TYPE_INT, {.i64 = -1 }, INT_MIN, INT_MAX, A|E}, diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index 4a33adea08..bf3dc0f620 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -498,8 +498,14 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) #endif #if QSV_HAVE_BREF_TYPE +#if FF_API_PRIVATE_OPT +FF_DISABLE_DEPRECATION_WARNINGS if (avctx->b_frame_strategy >= 0) - q->extco2.BRefType = avctx->b_frame_strategy ? MFX_B_REF_PYRAMID : MFX_B_REF_OFF; + q->b_strategy = avctx->b_frame_strategy; +FF_ENABLE_DEPRECATION_WARNINGS +#endif + if (q->extco2.b_strategy >= 0) + q->extco2.BRefType = q->b_strategy ? MFX_B_REF_PYRAMID : MFX_B_REF_OFF; if (q->adaptive_i >= 0) q->extco2.AdaptiveI = q->adaptive_i ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF; if (q->adaptive_b >= 0) diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h index ec0c4df1e6..97165fc0ed 100644 --- a/libavcodec/qsvenc.h +++ b/libavcodec/qsvenc.h @@ -65,6 +65,7 @@ { "extbrc", "Extended bitrate control", OFFSET(qsv.extbrc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \ { "adaptive_i", "Adaptive I-frame placement", OFFSET(qsv.adaptive_i), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \ { "adaptive_b", "Adaptive B-frame placement", OFFSET(qsv.adaptive_b), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \ +{ "b_strategy", "Strategy to choose between I/P/B-frames", OFFSET(qsv.b_strategy), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \ typedef struct QSVEncContext { AVCodecContext *avctx; @@ -118,6 +119,7 @@ typedef struct QSVEncContext { int extbrc; int adaptive_i; int adaptive_b; + int b_strategy; int int_ref_type; int int_ref_cycle_size; diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c index 2294604371..7f4fb8126f 100644 --- a/libavcodec/qsvenc_h264.c +++ b/libavcodec/qsvenc_h264.c @@ -109,7 +109,9 @@ static const AVCodecDefault qsv_enc_defaults[] = { { "coder", "ac" }, { "flags", "+cgop" }, +#if FF_API_PRIVATE_OPT { "b_strategy", "-1" }, +#endif { NULL }, }; diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c index 343733bdbe..8884e240d9 100644 --- a/libavcodec/qsvenc_hevc.c +++ b/libavcodec/qsvenc_hevc.c @@ -244,7 +244,9 @@ static const AVCodecDefault qsv_enc_defaults[] = { { "bf", "8" }, { "flags", "+cgop" }, +#if FF_API_PRIVATE_OPT { "b_strategy", "-1" }, +#endif { NULL }, }; diff --git a/libavcodec/qsvenc_mpeg2.c b/libavcodec/qsvenc_mpeg2.c index dcfcb81cf3..f29f445182 100644 --- a/libavcodec/qsvenc_mpeg2.c +++ b/libavcodec/qsvenc_mpeg2.c @@ -89,7 +89,9 @@ static const AVCodecDefault qsv_enc_defaults[] = { { "bf", "3" }, { "flags", "+cgop" }, +#if FF_API_PRIVATE_OPT { "b_strategy", "-1" }, +#endif { NULL }, }; diff --git a/libavcodec/version.h b/libavcodec/version.h index 75d99bc441..9c40c7956b 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -195,5 +195,8 @@ #ifndef FF_API_NVENC_OLD_NAME #define FF_API_NVENC_OLD_NAME (LIBAVCODEC_VERSION_MAJOR < 59) #endif +#ifndef FF_API_PRIVATE_OPT +#define FF_API_PRIVATE_OPT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif #endif /* AVCODEC_VERSION_H */