1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

cbs_av1: Use table-based alloc/free

This commit is contained in:
Mark Thompson 2020-07-27 17:32:26 +01:00
parent f643f9bd6d
commit ae7686a64f

View File

@ -809,50 +809,6 @@ fail:
return err; 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, static int cbs_av1_ref_tile_data(CodedBitstreamContext *ctx,
CodedBitstreamUnit *unit, CodedBitstreamUnit *unit,
GetBitContext *gbc, GetBitContext *gbc,
@ -887,8 +843,7 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx,
GetBitContext gbc; GetBitContext gbc;
int err, start_pos, end_pos; int err, start_pos, end_pos;
err = ff_cbs_alloc_unit_content(unit, sizeof(*obu), err = ff_cbs_alloc_unit_content2(ctx, unit);
&cbs_av1_free_obu);
if (err < 0) if (err < 0)
return err; return err;
obu = unit->content; obu = unit->content;
@ -1247,11 +1202,49 @@ static void cbs_av1_close(CodedBitstreamContext *ctx)
av_buffer_unref(&priv->frame_header_ref); av_buffer_unref(&priv->frame_header_ref);
} }
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 = { const CodedBitstreamType ff_cbs_type_av1 = {
.codec_id = AV_CODEC_ID_AV1, .codec_id = AV_CODEC_ID_AV1,
.priv_data_size = sizeof(CodedBitstreamAV1Context), .priv_data_size = sizeof(CodedBitstreamAV1Context),
.unit_types = cbs_av1_unit_types,
.split_fragment = &cbs_av1_split_fragment, .split_fragment = &cbs_av1_split_fragment,
.read_unit = &cbs_av1_read_unit, .read_unit = &cbs_av1_read_unit,
.write_unit = &cbs_av1_write_obu, .write_unit = &cbs_av1_write_obu,