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>tags/n3.0
| @@ -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 */ | |||