On Mon, Jan 4, 2016 at 2:34 PM, Vittorio Giovara
<[email protected]> wrote:
> 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 <[email protected]>
> ---
> 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 8083111..66e6ac8 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 fe0247f..bcb5dd1 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 },
Use "b_strategy" to remain consistent with the global option and all
the other codecs.
>
> { "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 43b0915..910d6c9 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 52c6f91..309a02f 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 34e008f..5856312 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 91b2bef..2c8fb94 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 f19ca76..861cf63 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->extco2.b_strategy = avctx->b_frame_strategy;
> +FF_ENABLE_DEPRECATION_WARNINGS
> +#endif
> + if (q->extco2.b_strategy >= 0)
> + q->extco2.BRefType = q->extco2.b_strategy ?
> MFX_B_REF_PYRAMID : MFX_B_REF_OFF;
This doesn't build, you used the wrong context to store/access things.
> 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 ec0c4df..97165fc 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 2294604..7f4fb81 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 343733b..8884e24 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 dcfcb81..f29f445 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 e9e76b6..72a18ed 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -189,5 +189,8 @@
> #ifndef FF_API_STAT_BITS
> #define FF_API_STAT_BITS (LIBAVCODEC_VERSION_MAJOR < 59)
> #endif
> +#ifndef FF_API_PRIVATE_OPT
> +#define FF_API_PRIVATE_OPT (LIBAVCODEC_VERSION_MAJOR < 59)
> +#endif
>
> #endif /* AVCODEC_VERSION_H */
> --
> 2.6.4
>
> _______________________________________________
> libav-devel mailing list
> [email protected]
> https://lists.libav.org/mailman/listinfo/libav-devel
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel