[FFmpeg-devel,v2,11/11] cbs_av1: Use table-based alloc/free

Submitted by Mark Thompson on May 20, 2019, 11:02 p.m.

Details

Message ID 20190520230224.19221-11-sw@jkqxz.net
State New
Headers show

Commit Message

Mark Thompson May 20, 2019, 11:02 p.m.
---
 libavcodec/cbs_av1.c | 85 ++++++++++++++++++++------------------------
 1 file changed, 39 insertions(+), 46 deletions(-)

Patch hide | download patch | download mbox

diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
index eb2d03ef43..c497ddc352 100644
--- a/libavcodec/cbs_av1.c
+++ b/libavcodec/cbs_av1.c
@@ -811,50 +811,6 @@  fail:
     return err;
 }
 
-static void cbs_av1_free_tile_data(AV1RawTileData *td)
-{
-    av_buffer_unref(&td->data_ref);
-}
-
-static void cbs_av1_free_padding(AV1RawPadding *pd)
-{
-    av_buffer_unref(&pd->payload_ref);
-}
-
-static void cbs_av1_free_metadata(AV1RawMetadata *md)
-{
-    switch (md->metadata_type) {
-    case AV1_METADATA_TYPE_ITUT_T35:
-        av_buffer_unref(&md->metadata.itut_t35.payload_ref);
-        break;
-    }
-}
-
-static void cbs_av1_free_obu(void *unit, uint8_t *content)
-{
-    AV1RawOBU *obu = (AV1RawOBU*)content;
-
-    switch (obu->header.obu_type) {
-    case AV1_OBU_TILE_GROUP:
-        cbs_av1_free_tile_data(&obu->obu.tile_group.tile_data);
-        break;
-    case AV1_OBU_FRAME:
-        cbs_av1_free_tile_data(&obu->obu.frame.tile_group.tile_data);
-        break;
-    case AV1_OBU_TILE_LIST:
-        cbs_av1_free_tile_data(&obu->obu.tile_list.tile_data);
-        break;
-    case AV1_OBU_METADATA:
-        cbs_av1_free_metadata(&obu->obu.metadata);
-        break;
-    case AV1_OBU_PADDING:
-        cbs_av1_free_padding(&obu->obu.padding);
-        break;
-    }
-
-    av_freep(&obu);
-}
-
 static int cbs_av1_ref_tile_data(CodedBitstreamContext *ctx,
                                  CodedBitstreamUnit *unit,
                                  GetBitContext *gbc,
@@ -889,8 +845,7 @@  static int cbs_av1_read_unit(CodedBitstreamContext *ctx,
     GetBitContext gbc;
     int err, start_pos, end_pos;
 
-    err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*obu),
-                                    &cbs_av1_free_obu);
+    err = ff_cbs_alloc_unit_content2(ctx, unit);
     if (err < 0)
         return err;
     obu = unit->content;
@@ -1303,11 +1258,49 @@  static void cbs_av1_close(CodedBitstreamContext *ctx)
     av_freep(&priv->write_buffer);
 }
 
+static void cbs_av1_free_metadata(void *unit, uint8_t *content)
+{
+    AV1RawOBU *obu = (AV1RawOBU*)content;
+    AV1RawMetadata *md;
+
+    av_assert0(obu->header.obu_type == AV1_OBU_METADATA);
+    md = &obu->obu.metadata;
+
+    switch (md->metadata_type) {
+    case AV1_METADATA_TYPE_ITUT_T35:
+        av_buffer_unref(&md->metadata.itut_t35.payload_ref);
+        break;
+    }
+}
+
+static const CodedBitstreamUnitTypeDescriptor cbs_av1_unit_types[] = {
+    CBS_UNIT_TYPE_POD(AV1_OBU_SEQUENCE_HEADER,        AV1RawOBU),
+    CBS_UNIT_TYPE_POD(AV1_OBU_TEMPORAL_DELIMITER,     AV1RawOBU),
+    CBS_UNIT_TYPE_POD(AV1_OBU_FRAME_HEADER,           AV1RawOBU),
+    CBS_UNIT_TYPE_POD(AV1_OBU_REDUNDANT_FRAME_HEADER, AV1RawOBU),
+
+    CBS_UNIT_TYPE_INTERNAL_REFS(AV1_OBU_TILE_GROUP, AV1RawOBU, 1,
+                                { offsetof(AV1RawOBU, obu.tile_group.tile_data.data) }),
+    CBS_UNIT_TYPE_INTERNAL_REFS(AV1_OBU_FRAME,      AV1RawOBU, 1,
+                                { offsetof(AV1RawOBU, obu.frame.tile_group.tile_data.data) }),
+    CBS_UNIT_TYPE_INTERNAL_REFS(AV1_OBU_TILE_LIST,  AV1RawOBU, 1,
+                                { offsetof(AV1RawOBU, obu.tile_list.tile_data.data) }),
+    CBS_UNIT_TYPE_INTERNAL_REFS(AV1_OBU_PADDING,    AV1RawOBU, 1,
+                                { offsetof(AV1RawOBU, obu.padding.payload) }),
+
+    CBS_UNIT_TYPE_COMPLEX(AV1_OBU_METADATA, AV1RawOBU,
+                          &cbs_av1_free_metadata),
+
+    CBS_UNIT_TYPE_END_OF_LIST
+};
+
 const CodedBitstreamType ff_cbs_type_av1 = {
     .codec_id          = AV_CODEC_ID_AV1,
 
     .priv_data_size    = sizeof(CodedBitstreamAV1Context),
 
+    .unit_types        = cbs_av1_unit_types,
+
     .split_fragment    = &cbs_av1_split_fragment,
     .read_unit         = &cbs_av1_read_unit,
     .write_unit        = &cbs_av1_write_unit,