cbs_h265: Use table-based alloc/free

This commit is contained in:
Mark Thompson 2020-07-27 17:32:24 +01:00
parent d1c6e09d09
commit e38646de1c
1 changed files with 93 additions and 105 deletions

View File

@ -454,72 +454,6 @@ static int cbs_h2645_read_more_rbsp_data(GetBitContext *gbc)
#undef allocate
static void cbs_h265_free_vps(void *opaque, uint8_t *content)
{
H265RawVPS *vps = (H265RawVPS*)content;
av_buffer_unref(&vps->extension_data.data_ref);
av_freep(&content);
}
static void cbs_h265_free_sps(void *opaque, uint8_t *content)
{
H265RawSPS *sps = (H265RawSPS*)content;
av_buffer_unref(&sps->extension_data.data_ref);
av_freep(&content);
}
static void cbs_h265_free_pps(void *opaque, uint8_t *content)
{
H265RawPPS *pps = (H265RawPPS*)content;
av_buffer_unref(&pps->extension_data.data_ref);
av_freep(&content);
}
static void cbs_h265_free_slice(void *opaque, uint8_t *content)
{
H265RawSlice *slice = (H265RawSlice*)content;
av_buffer_unref(&slice->data_ref);
av_freep(&content);
}
static void cbs_h265_free_sei_payload(H265RawSEIPayload *payload)
{
switch (payload->payload_type) {
case HEVC_SEI_TYPE_BUFFERING_PERIOD:
case HEVC_SEI_TYPE_PICTURE_TIMING:
case HEVC_SEI_TYPE_PAN_SCAN_RECT:
case HEVC_SEI_TYPE_RECOVERY_POINT:
case HEVC_SEI_TYPE_DISPLAY_ORIENTATION:
case HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS:
case HEVC_SEI_TYPE_DECODED_PICTURE_HASH:
case HEVC_SEI_TYPE_TIME_CODE:
case HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO:
case HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO:
case HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS:
case HEVC_SEI_TYPE_ALPHA_CHANNEL_INFO:
break;
case HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35:
av_buffer_unref(&payload->payload.user_data_registered.data_ref);
break;
case HEVC_SEI_TYPE_USER_DATA_UNREGISTERED:
av_buffer_unref(&payload->payload.user_data_unregistered.data_ref);
break;
default:
av_buffer_unref(&payload->payload.other.data_ref);
break;
}
av_buffer_unref(&payload->extension_data.data_ref);
}
static void cbs_h265_free_sei(void *opaque, uint8_t *content)
{
H265RawSEI *sei = (H265RawSEI*)content;
int i;
for (i = 0; i < sei->payload_count; i++)
cbs_h265_free_sei_payload(&sei->payload[i]);
av_freep(&content);
}
static int cbs_h2645_fragment_add_nals(CodedBitstreamContext *ctx,
CodedBitstreamFragment *frag,
const H2645Packet *packet)
@ -877,16 +811,14 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
if (err < 0)
return err;
err = ff_cbs_alloc_unit_content2(ctx, unit);
if (err < 0)
return err;
switch (unit->type) {
case HEVC_NAL_VPS:
{
H265RawVPS *vps;
err = ff_cbs_alloc_unit_content(unit, sizeof(*vps),
&cbs_h265_free_vps);
if (err < 0)
return err;
vps = unit->content;
H265RawVPS *vps = unit->content;
err = cbs_h265_read_vps(ctx, &gbc, vps);
if (err < 0)
@ -899,13 +831,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
break;
case HEVC_NAL_SPS:
{
H265RawSPS *sps;
err = ff_cbs_alloc_unit_content(unit, sizeof(*sps),
&cbs_h265_free_sps);
if (err < 0)
return err;
sps = unit->content;
H265RawSPS *sps = unit->content;
err = cbs_h265_read_sps(ctx, &gbc, sps);
if (err < 0)
@ -919,13 +845,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
case HEVC_NAL_PPS:
{
H265RawPPS *pps;
err = ff_cbs_alloc_unit_content(unit, sizeof(*pps),
&cbs_h265_free_pps);
if (err < 0)
return err;
pps = unit->content;
H265RawPPS *pps = unit->content;
err = cbs_h265_read_pps(ctx, &gbc, pps);
if (err < 0)
@ -954,15 +874,9 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
case HEVC_NAL_IDR_N_LP:
case HEVC_NAL_CRA_NUT:
{
H265RawSlice *slice;
H265RawSlice *slice = unit->content;
int pos, len;
err = ff_cbs_alloc_unit_content(unit, sizeof(*slice),
&cbs_h265_free_slice);
if (err < 0)
return err;
slice = unit->content;
err = cbs_h265_read_slice_segment_header(ctx, &gbc, &slice->header);
if (err < 0)
return err;
@ -984,11 +898,6 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
case HEVC_NAL_AUD:
{
err = ff_cbs_alloc_unit_content(unit,
sizeof(H265RawAUD), NULL);
if (err < 0)
return err;
err = cbs_h265_read_aud(ctx, &gbc, unit->content);
if (err < 0)
return err;
@ -998,12 +907,6 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
case HEVC_NAL_SEI_PREFIX:
case HEVC_NAL_SEI_SUFFIX:
{
err = ff_cbs_alloc_unit_content(unit, sizeof(H265RawSEI),
&cbs_h265_free_sei);
if (err < 0)
return err;
err = cbs_h265_read_sei(ctx, &gbc, unit->content,
unit->type == HEVC_NAL_SEI_PREFIX);
@ -1482,6 +1385,89 @@ static const CodedBitstreamUnitTypeDescriptor cbs_h264_unit_types[] = {
CBS_UNIT_TYPE_END_OF_LIST
};
static void cbs_h265_free_sei_payload(H265RawSEIPayload *payload)
{
switch (payload->payload_type) {
case HEVC_SEI_TYPE_BUFFERING_PERIOD:
case HEVC_SEI_TYPE_PICTURE_TIMING:
case HEVC_SEI_TYPE_PAN_SCAN_RECT:
case HEVC_SEI_TYPE_RECOVERY_POINT:
case HEVC_SEI_TYPE_DISPLAY_ORIENTATION:
case HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS:
case HEVC_SEI_TYPE_DECODED_PICTURE_HASH:
case HEVC_SEI_TYPE_TIME_CODE:
case HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO:
case HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO:
case HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS:
case HEVC_SEI_TYPE_ALPHA_CHANNEL_INFO:
break;
case HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35:
av_buffer_unref(&payload->payload.user_data_registered.data_ref);
break;
case HEVC_SEI_TYPE_USER_DATA_UNREGISTERED:
av_buffer_unref(&payload->payload.user_data_unregistered.data_ref);
break;
default:
av_buffer_unref(&payload->payload.other.data_ref);
break;
}
av_buffer_unref(&payload->extension_data.data_ref);
}
static void cbs_h265_free_sei(void *opaque, uint8_t *content)
{
H265RawSEI *sei = (H265RawSEI*)content;
int i;
for (i = 0; i < sei->payload_count; i++)
cbs_h265_free_sei_payload(&sei->payload[i]);
av_freep(&content);
}
static const CodedBitstreamUnitTypeDescriptor cbs_h265_unit_types[] = {
CBS_UNIT_TYPE_INTERNAL_REF(HEVC_NAL_VPS, H265RawVPS, extension_data.data),
CBS_UNIT_TYPE_INTERNAL_REF(HEVC_NAL_SPS, H265RawSPS, extension_data.data),
CBS_UNIT_TYPE_INTERNAL_REF(HEVC_NAL_PPS, H265RawPPS, extension_data.data),
CBS_UNIT_TYPE_POD(HEVC_NAL_AUD, H265RawAUD),
{
// Slices of non-IRAP pictures.
.nb_unit_types = CBS_UNIT_TYPE_RANGE,
.unit_type_range_start = HEVC_NAL_TRAIL_N,
.unit_type_range_end = HEVC_NAL_RASL_R,
.content_type = CBS_CONTENT_TYPE_INTERNAL_REFS,
.content_size = sizeof(H265RawSlice),
.nb_ref_offsets = 1,
.ref_offsets = { offsetof(H265RawSlice, data) },
},
{
// Slices of IRAP pictures.
.nb_unit_types = CBS_UNIT_TYPE_RANGE,
.unit_type_range_start = HEVC_NAL_BLA_W_LP,
.unit_type_range_end = HEVC_NAL_CRA_NUT,
.content_type = CBS_CONTENT_TYPE_INTERNAL_REFS,
.content_size = sizeof(H265RawSlice),
.nb_ref_offsets = 1,
.ref_offsets = { offsetof(H265RawSlice, data) },
},
{
.nb_unit_types = 2,
.unit_types = {
HEVC_NAL_SEI_PREFIX,
HEVC_NAL_SEI_SUFFIX
},
.content_type = CBS_CONTENT_TYPE_COMPLEX,
.content_size = sizeof(H265RawSEI),
.content_free = &cbs_h265_free_sei,
},
CBS_UNIT_TYPE_END_OF_LIST
};
const CodedBitstreamType ff_cbs_type_h264 = {
.codec_id = AV_CODEC_ID_H264,
@ -1502,6 +1488,8 @@ const CodedBitstreamType ff_cbs_type_h265 = {
.priv_data_size = sizeof(CodedBitstreamH265Context),
.unit_types = cbs_h265_unit_types,
.split_fragment = &cbs_h2645_split_fragment,
.read_unit = &cbs_h265_read_nal_unit,
.write_unit = &cbs_h265_write_nal_unit,