[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