[FFmpeg-devel] [PATCH 2/3] avcodec/cbs_av1: don't store a reference to the unit data if it's not needed
James Almer
jamrial at gmail.com
Fri May 23 06:10:20 EEST 2025
If a module using CBS-AV1 doesn't bother to decompose redundant frame header
OBUs, then there's no need to keep a reference to the previous frame header
around.
Signed-off-by: James Almer <jamrial at gmail.com>
---
libavcodec/cbs_av1.c | 23 +++++++++++++++++++++++
libavcodec/cbs_av1.h | 3 +++
libavcodec/cbs_av1_syntax_template.c | 2 ++
3 files changed, 28 insertions(+)
diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
index 4edb6ecd50..1938c5acff 100644
--- a/libavcodec/cbs_av1.c
+++ b/libavcodec/cbs_av1.c
@@ -1104,6 +1104,7 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx,
{
err = cbs_av1_write_frame_header_obu(ctx, pbc,
&obu->obu.frame_header,
+ priv->redundant &&
obu->header.obu_type ==
AV1_OBU_REDUNDANT_FRAME_HEADER,
NULL);
@@ -1265,6 +1266,27 @@ static int cbs_av1_assemble_fragment(CodedBitstreamContext *ctx,
#endif
}
+static int cbs_av1_init(CodedBitstreamContext *ctx)
+{
+ CodedBitstreamAV1Context *priv = ctx->priv_data;
+
+ if (ctx->decompose_unit_types) {
+ for (int i = 0; i < ctx->nb_decompose_unit_types; i++) {
+ switch (ctx->decompose_unit_types[i]) {
+ case AV1_OBU_REDUNDANT_FRAME_HEADER:
+ priv->redundant = 1;
+ break;
+ default:
+ break;
+ }
+ }
+ } else {
+ priv->redundant = 1;
+ }
+
+ return 0;
+}
+
static void cbs_av1_flush(CodedBitstreamContext *ctx)
{
CodedBitstreamAV1Context *priv = ctx->priv_data;
@@ -1385,6 +1407,7 @@ const CodedBitstreamType CBS_FUNC(type_av1) = {
.write_unit = &cbs_av1_write_obu,
.assemble_fragment = &cbs_av1_assemble_fragment,
+ .init = &cbs_av1_init,
.flush = &cbs_av1_flush,
.close = &cbs_av1_close,
};
diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h
index 874f64561f..e79e90c6eb 100644
--- a/libavcodec/cbs_av1.h
+++ b/libavcodec/cbs_av1.h
@@ -490,6 +490,9 @@ typedef struct CodedBitstreamAV1Context {
AV1ReferenceFrameState ref[AV1_NUM_REF_FRAMES];
+ // Init values
+ int redundant;
+
// AVOptions
int operating_point;
// When writing, fix the length in bytes of the obu_size field.
diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c
index 5518544a4d..701f474ce4 100644
--- a/libavcodec/cbs_av1_syntax_template.c
+++ b/libavcodec/cbs_av1_syntax_template.c
@@ -1795,6 +1795,7 @@ static int FUNC(frame_header_obu)(CodedBitstreamContext *ctx, RWContext *rw,
#endif
fh_bytes = (fh_bits + 7) / 8;
+ if (priv->redundant) {
priv->frame_header_size = fh_bits;
if (rw_buffer_ref) {
@@ -1810,6 +1811,7 @@ static int FUNC(frame_header_obu)(CodedBitstreamContext *ctx, RWContext *rw,
priv->frame_header = priv->frame_header_ref->data;
memcpy(priv->frame_header, fh_start, fh_bytes);
}
+ }
}
}
--
2.49.0
More information about the ffmpeg-devel
mailing list