From 6e76c57cf2c0e790228f19c88089eef110fd74aa Mon Sep 17 00:00:00 2001 From: 21pages Date: Thu, 5 Sep 2024 16:32:16 +0800 Subject: [PATCH 2/3] libavcodec/amfenc: reconfig when bitrate change Signed-off-by: 21pages --- libavcodec/amfenc.c | 20 ++++++++++++++++++++ libavcodec/amfenc.h | 1 + 2 files changed, 21 insertions(+) diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c index 061859f85c..97587fe66b 100644 --- a/libavcodec/amfenc.c +++ b/libavcodec/amfenc.c @@ -222,6 +222,7 @@ static int amf_init_context(AVCodecContext *avctx) ctx->hwsurfaces_in_queue = 0; ctx->hwsurfaces_in_queue_max = 16; + ctx->av_bitrate = avctx->bit_rate; // configure AMF logger // the return of these functions indicates old state and do not affect behaviour @@ -583,6 +584,23 @@ static void amf_release_buffer_with_frame_ref(AMFBuffer *frame_ref_storage_buffe frame_ref_storage_buffer->pVtbl->Release(frame_ref_storage_buffer); } +static int reconfig_encoder(AVCodecContext *avctx) +{ + AmfContext *ctx = avctx->priv_data; + AMF_RESULT res = AMF_OK; + + if (ctx->av_bitrate != avctx->bit_rate) { + av_log(ctx, AV_LOG_INFO, "change bitrate from %d to %d\n", ctx->av_bitrate, avctx->bit_rate); + ctx->av_bitrate = avctx->bit_rate; + if (avctx->codec->id == AV_CODEC_ID_H264) { + AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_TARGET_BITRATE, avctx->bit_rate); + } else if (avctx->codec->id == AV_CODEC_ID_HEVC) { + AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_TARGET_BITRATE, avctx->bit_rate); + } + } + return 0; +} + int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) { AmfContext *ctx = avctx->priv_data; @@ -596,6 +614,8 @@ int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) int query_output_data_flag = 0; AMF_RESULT res_resubmit; + reconfig_encoder(avctx); + if (!ctx->encoder) return AVERROR(EINVAL); diff --git a/libavcodec/amfenc.h b/libavcodec/amfenc.h index d636673a9d..09506ee2e0 100644 --- a/libavcodec/amfenc.h +++ b/libavcodec/amfenc.h @@ -113,6 +113,7 @@ typedef struct AmfContext { int max_b_frames; int qvbr_quality_level; int hw_high_motion_quality_boost; + int64_t av_bitrate; // HEVC - specific options -- 2.43.0.windows.1