mirror of https://git.ffmpeg.org/ffmpeg.git
cbs_h265: Use table-based alloc/free
This commit is contained in:
parent
d1c6e09d09
commit
e38646de1c
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue