[FFmpeg-devel] [PATCH v3 11/18] cbs_av1: Use table-based alloc/free
Mark Thompson
sw at jkqxz.net
Thu Oct 3 02:04:46 EEST 2019
---
libavcodec/cbs_av1.c | 85 ++++++++++++++++++++------------------------
1 file changed, 39 insertions(+), 46 deletions(-)
diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
index c027933218..67caaf3eea 100644
--- a/libavcodec/cbs_av1.c
+++ b/libavcodec/cbs_av1.c
@@ -810,50 +810,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 *opaque, 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,
@@ -888,8 +844,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;
@@ -1302,11 +1257,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_REF(AV1_OBU_TILE_GROUP, AV1RawOBU,
+ obu.tile_group.tile_data.data),
+ CBS_UNIT_TYPE_INTERNAL_REF(AV1_OBU_FRAME, AV1RawOBU,
+ obu.frame.tile_group.tile_data.data),
+ CBS_UNIT_TYPE_INTERNAL_REF(AV1_OBU_TILE_LIST, AV1RawOBU,
+ obu.tile_list.tile_data.data),
+ CBS_UNIT_TYPE_INTERNAL_REF(AV1_OBU_PADDING, 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,
--
2.20.1
More information about the ffmpeg-devel
mailing list