diff options
author | Benjamin Cheng <ben@bcheng.me> | 2024-12-21 15:25:37 -0500 |
---|---|---|
committer | Lynne <dev@lynne.ee> | 2024-12-23 04:24:54 +0900 |
commit | bf9f921ef7c6b77da4c93dd292cb8bea97a49b1d (patch) | |
tree | ee06eaa2ed36e82cfe49a252f2beca0c123bfc95 | |
parent | 0a6388d1da174bb2ed3e793461c9226341e3629f (diff) | |
download | ffmpeg-bf9f921ef7c6b77da4c93dd292cb8bea97a49b1d.tar.gz |
avcodec/hw_base_encode: restrict size of next_prev
Some drivers are more strict about the size of the reference lists given
(i.e. VAOn12 [1]). The next_prev list is used to handle multiple "L0"
references in AV1 encode. Restrict the size of next_prev based on the
value of ref_l0 when the GOP structure is initialized.
[1] https://github.com/intel/cartwheel-ffmpeg/issues/278
v2: fix indentation issues
-rw-r--r-- | libavcodec/hw_base_encode.c | 7 | ||||
-rw-r--r-- | libavcodec/hw_base_encode.h | 4 |
2 files changed, 9 insertions, 2 deletions
diff --git a/libavcodec/hw_base_encode.c b/libavcodec/hw_base_encode.c index 4d8bf4fe71..b790091d7d 100644 --- a/libavcodec/hw_base_encode.c +++ b/libavcodec/hw_base_encode.c @@ -190,12 +190,12 @@ static void hw_base_encode_add_next_prev(FFHWBaseEncodeContext *ctx, return; } - if (ctx->nb_next_prev < MAX_PICTURE_REFERENCES) { + if (ctx->nb_next_prev < ctx->ref_l0) { ctx->next_prev[ctx->nb_next_prev++] = pic; ++pic->ref_count[0]; } else { --ctx->next_prev[0]->ref_count[0]; - for (i = 0; i < MAX_PICTURE_REFERENCES - 1; i++) + for (i = 0; i < ctx->ref_l0 - 1; i++) ctx->next_prev[i] = ctx->next_prev[i + 1]; ctx->next_prev[i] = pic; ++pic->ref_count[0]; @@ -662,6 +662,9 @@ int ff_hw_base_init_gop_structure(FFHWBaseEncodeContext *ctx, AVCodecContext *av uint32_t ref_l0, uint32_t ref_l1, int flags, int prediction_pre_only) { + ctx->ref_l0 = FFMIN(ref_l0, MAX_PICTURE_REFERENCES); + ctx->ref_l1 = FFMIN(ref_l1, MAX_PICTURE_REFERENCES); + if (flags & FF_HW_FLAG_INTRA_ONLY || avctx->gop_size <= 1) { av_log(avctx, AV_LOG_VERBOSE, "Using intra frames only.\n"); ctx->gop_size = 1; diff --git a/libavcodec/hw_base_encode.h b/libavcodec/hw_base_encode.h index e30b1e60ad..e768579722 100644 --- a/libavcodec/hw_base_encode.h +++ b/libavcodec/hw_base_encode.h @@ -193,6 +193,10 @@ typedef struct FFHWBaseEncodeContext { int end_of_stream; int p_to_gpb; + // The number of L0/L1 references supported by the driver. + int ref_l0; + int ref_l1; + // Whether the driver supports ROI at all. int roi_allowed; |