From: James Almer <jamrial@gmail.com> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 7/7] avcodec/libx264: add support for param change frame side data Date: Tue, 21 Jan 2025 23:54:03 -0300 Message-ID: <20250122025403.14457-7-jamrial@gmail.com> (raw) In-Reply-To: <20250122025403.14457-1-jamrial@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com> --- libavcodec/libx264.c | 98 ++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 39 deletions(-) diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index 409f45fc7d..c64c2a28b0 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -194,54 +194,64 @@ static int encode_nals(AVCodecContext *ctx, AVPacket *pkt, return 1; } -static void reconfig_encoder(AVCodecContext *ctx, const AVFrame *frame) +static void reconfig_encoder(AVCodecContext *ctx) { X264Context *x4 = ctx->priv_data; - AVFrameSideData *side_data; + if (x4->avcintra_class >= 0) + return; - if (x4->avcintra_class < 0) { - if (x4->params.b_interlaced && x4->params.b_tff != !!(frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST)) { + if (x4->params.vui.i_sar_height*ctx->sample_aspect_ratio.num != ctx->sample_aspect_ratio.den * x4->params.vui.i_sar_width) { + x4->params.vui.i_sar_height = ctx->sample_aspect_ratio.den; + x4->params.vui.i_sar_width = ctx->sample_aspect_ratio.num; + x264_encoder_reconfig(x4->enc, &x4->params); + } - x4->params.b_tff = !!(frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST); - x264_encoder_reconfig(x4->enc, &x4->params); - } - if (x4->params.vui.i_sar_height*ctx->sample_aspect_ratio.num != ctx->sample_aspect_ratio.den * x4->params.vui.i_sar_width) { - x4->params.vui.i_sar_height = ctx->sample_aspect_ratio.den; - x4->params.vui.i_sar_width = ctx->sample_aspect_ratio.num; - x264_encoder_reconfig(x4->enc, &x4->params); - } + if (x4->params.rc.i_vbv_buffer_size != ctx->rc_buffer_size / 1000 || + x4->params.rc.i_vbv_max_bitrate != ctx->rc_max_rate / 1000) { + x4->params.rc.i_vbv_buffer_size = ctx->rc_buffer_size / 1000; + x4->params.rc.i_vbv_max_bitrate = ctx->rc_max_rate / 1000; + x264_encoder_reconfig(x4->enc, &x4->params); + } - if (x4->params.rc.i_vbv_buffer_size != ctx->rc_buffer_size / 1000 || - x4->params.rc.i_vbv_max_bitrate != ctx->rc_max_rate / 1000) { - x4->params.rc.i_vbv_buffer_size = ctx->rc_buffer_size / 1000; - x4->params.rc.i_vbv_max_bitrate = ctx->rc_max_rate / 1000; - x264_encoder_reconfig(x4->enc, &x4->params); - } + if (x4->params.rc.i_rc_method == X264_RC_ABR && + x4->params.rc.i_bitrate != ctx->bit_rate / 1000) { + x4->params.rc.i_bitrate = ctx->bit_rate / 1000; + x264_encoder_reconfig(x4->enc, &x4->params); + } - if (x4->params.rc.i_rc_method == X264_RC_ABR && - x4->params.rc.i_bitrate != ctx->bit_rate / 1000) { - x4->params.rc.i_bitrate = ctx->bit_rate / 1000; - x264_encoder_reconfig(x4->enc, &x4->params); - } + if (x4->crf >= 0 && + x4->params.rc.i_rc_method == X264_RC_CRF && + x4->params.rc.f_rf_constant != x4->crf) { + x4->params.rc.f_rf_constant = x4->crf; + x264_encoder_reconfig(x4->enc, &x4->params); + } - if (x4->crf >= 0 && - x4->params.rc.i_rc_method == X264_RC_CRF && - x4->params.rc.f_rf_constant != x4->crf) { - x4->params.rc.f_rf_constant = x4->crf; - x264_encoder_reconfig(x4->enc, &x4->params); - } + if (x4->params.rc.i_rc_method == X264_RC_CQP && + x4->cqp >= 0 && + x4->params.rc.i_qp_constant != x4->cqp) { + x4->params.rc.i_qp_constant = x4->cqp; + x264_encoder_reconfig(x4->enc, &x4->params); + } - if (x4->params.rc.i_rc_method == X264_RC_CQP && - x4->cqp >= 0 && - x4->params.rc.i_qp_constant != x4->cqp) { - x4->params.rc.i_qp_constant = x4->cqp; - x264_encoder_reconfig(x4->enc, &x4->params); - } + if (x4->crf_max >= 0 && + x4->params.rc.f_rf_constant_max != x4->crf_max) { + x4->params.rc.f_rf_constant_max = x4->crf_max; + x264_encoder_reconfig(x4->enc, &x4->params); + } +} - if (x4->crf_max >= 0 && - x4->params.rc.f_rf_constant_max != x4->crf_max) { - x4->params.rc.f_rf_constant_max = x4->crf_max; +static void reconfig_encoder_from_frame(AVCodecContext *ctx, const AVFrame *frame) +{ + X264Context *x4 = ctx->priv_data; + AVFrameSideData *side_data; + + reconfig_encoder(ctx); + + if (x4->avcintra_class < 0) { + if (x4->params.b_interlaced && x4->params.b_tff != !!(frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST)) { + + x4->params.b_tff = !!(frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST); x264_encoder_reconfig(x4->enc, &x4->params); } } @@ -528,7 +538,7 @@ static int setup_frame(AVCodecContext *ctx, const AVFrame *frame, pic->i_type = X264_TYPE_AUTO; break; } - reconfig_encoder(ctx, frame); + reconfig_encoder_from_frame(ctx, frame); if (x4->a53_cc) { void *sei_data; @@ -759,6 +769,14 @@ static void X264_flush(AVCodecContext *avctx) x4->sei_size = -x4->sei_size; } +static av_cold int X264_reconf(AVCodecContext *avctx) +{ + X264Context *x4 = avctx->priv_data; + + reconfig_encoder(avctx); + return 0; +} + static av_cold int X264_close(AVCodecContext *avctx) { X264Context *x4 = avctx->priv_data; @@ -1624,6 +1642,7 @@ const FFCodec ff_libx264_encoder = { AV_CODEC_CAP_OTHER_THREADS | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE | AV_CODEC_CAP_ENCODER_FLUSH | + AV_CODEC_CAP_PARAM_CHANGE | AV_CODEC_CAP_ENCODER_RECON_FRAME, .p.priv_class = &x264_class, .p.wrapper_name = "libx264", @@ -1631,6 +1650,7 @@ const FFCodec ff_libx264_encoder = { .init = X264_init, FF_CODEC_ENCODE_CB(X264_frame), .flush = X264_flush, + .reconf = X264_reconf, .close = X264_close, .defaults = x264_defaults, .p.pix_fmts = pix_fmts_all, -- 2.48.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2025-01-22 2:55 UTC|newest] Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top 2025-01-22 2:53 [FFmpeg-devel] [PATCH 1/7] avutil/avutil: move some definitions to a new header James Almer 2025-01-22 2:53 ` [FFmpeg-devel] [PATCH 2/7] avcodec/packet: move AVSideDataParamChangeFlags to libavutil/defs.h James Almer 2025-01-22 2:53 ` [FFmpeg-devel] [PATCH 3/7] avutil/frame: add a param change side data type James Almer 2025-01-22 3:13 ` Lynne 2025-01-22 13:40 ` James Almer 2025-01-22 19:49 ` Nicolas George 2025-01-22 19:58 ` James Almer 2025-01-22 20:18 ` Nicolas George 2025-01-22 20:52 ` James Almer 2025-01-22 21:14 ` Nicolas George 2025-01-22 21:21 ` Nicolas George 2025-01-23 21:49 ` Alexander Strasser via ffmpeg-devel 2025-01-22 2:54 ` [FFmpeg-devel] [PATCH 4/7] avcodec/encode: add support for param change frame side data James Almer 2025-01-27 12:48 ` Andreas Rheinhardt 2025-01-27 12:54 ` James Almer 2025-01-22 2:54 ` [FFmpeg-devel] [PATCH 5/7] avcodec/encode: add a new param change side data value that takes a dictionary James Almer 2025-01-27 13:26 ` Andreas Rheinhardt 2025-01-27 13:33 ` James Almer 2025-01-22 2:54 ` [FFmpeg-devel] [PATCH 6/7] avcodec/libaomenc: add support for param change frame side data James Almer 2025-01-22 2:54 ` James Almer [this message] 2025-01-27 12:43 ` [FFmpeg-devel] [PATCH 1/7] avutil/avutil: move some definitions to a new header Andreas Rheinhardt
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20250122025403.14457-7-jamrial@gmail.com \ --to=jamrial@gmail.com \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git