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 <vittorio.giovara@gmail.com>
This commit is contained in:
		@@ -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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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" },
 | 
			
		||||
 
 | 
			
		||||
@@ -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 },
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -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[];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 
 | 
			
		||||
@@ -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},
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -109,7 +109,9 @@ static const AVCodecDefault qsv_enc_defaults[] = {
 | 
			
		||||
    { "coder",     "ac"    },
 | 
			
		||||
 | 
			
		||||
    { "flags",     "+cgop" },
 | 
			
		||||
#if FF_API_PRIVATE_OPT
 | 
			
		||||
    { "b_strategy", "-1"   },
 | 
			
		||||
#endif
 | 
			
		||||
    { NULL },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -244,7 +244,9 @@ static const AVCodecDefault qsv_enc_defaults[] = {
 | 
			
		||||
    { "bf",        "8"     },
 | 
			
		||||
 | 
			
		||||
    { "flags",     "+cgop" },
 | 
			
		||||
#if FF_API_PRIVATE_OPT
 | 
			
		||||
    { "b_strategy", "-1"   },
 | 
			
		||||
#endif
 | 
			
		||||
    { NULL },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -89,7 +89,9 @@ static const AVCodecDefault qsv_enc_defaults[] = {
 | 
			
		||||
    { "bf",        "3"     },
 | 
			
		||||
 | 
			
		||||
    { "flags",     "+cgop" },
 | 
			
		||||
#if FF_API_PRIVATE_OPT
 | 
			
		||||
    { "b_strategy", "-1"   },
 | 
			
		||||
#endif
 | 
			
		||||
    { NULL },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user