mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-13 21:28:01 +02:00
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
|
#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,
|
static int cbs_h2645_fragment_add_nals(CodedBitstreamContext *ctx,
|
||||||
CodedBitstreamFragment *frag,
|
CodedBitstreamFragment *frag,
|
||||||
const H2645Packet *packet)
|
const H2645Packet *packet)
|
||||||
@ -877,16 +811,14 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
err = ff_cbs_alloc_unit_content2(ctx, unit);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
switch (unit->type) {
|
switch (unit->type) {
|
||||||
case HEVC_NAL_VPS:
|
case HEVC_NAL_VPS:
|
||||||
{
|
{
|
||||||
H265RawVPS *vps;
|
H265RawVPS *vps = unit->content;
|
||||||
|
|
||||||
err = ff_cbs_alloc_unit_content(unit, sizeof(*vps),
|
|
||||||
&cbs_h265_free_vps);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
vps = unit->content;
|
|
||||||
|
|
||||||
err = cbs_h265_read_vps(ctx, &gbc, vps);
|
err = cbs_h265_read_vps(ctx, &gbc, vps);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
@ -899,13 +831,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
|
|||||||
break;
|
break;
|
||||||
case HEVC_NAL_SPS:
|
case HEVC_NAL_SPS:
|
||||||
{
|
{
|
||||||
H265RawSPS *sps;
|
H265RawSPS *sps = unit->content;
|
||||||
|
|
||||||
err = ff_cbs_alloc_unit_content(unit, sizeof(*sps),
|
|
||||||
&cbs_h265_free_sps);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
sps = unit->content;
|
|
||||||
|
|
||||||
err = cbs_h265_read_sps(ctx, &gbc, sps);
|
err = cbs_h265_read_sps(ctx, &gbc, sps);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
@ -919,13 +845,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
|
|||||||
|
|
||||||
case HEVC_NAL_PPS:
|
case HEVC_NAL_PPS:
|
||||||
{
|
{
|
||||||
H265RawPPS *pps;
|
H265RawPPS *pps = unit->content;
|
||||||
|
|
||||||
err = ff_cbs_alloc_unit_content(unit, sizeof(*pps),
|
|
||||||
&cbs_h265_free_pps);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
pps = unit->content;
|
|
||||||
|
|
||||||
err = cbs_h265_read_pps(ctx, &gbc, pps);
|
err = cbs_h265_read_pps(ctx, &gbc, pps);
|
||||||
if (err < 0)
|
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_IDR_N_LP:
|
||||||
case HEVC_NAL_CRA_NUT:
|
case HEVC_NAL_CRA_NUT:
|
||||||
{
|
{
|
||||||
H265RawSlice *slice;
|
H265RawSlice *slice = unit->content;
|
||||||
int pos, len;
|
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);
|
err = cbs_h265_read_slice_segment_header(ctx, &gbc, &slice->header);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
@ -984,11 +898,6 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
|
|||||||
|
|
||||||
case HEVC_NAL_AUD:
|
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);
|
err = cbs_h265_read_aud(ctx, &gbc, unit->content);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
@ -998,12 +907,6 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
|
|||||||
case HEVC_NAL_SEI_PREFIX:
|
case HEVC_NAL_SEI_PREFIX:
|
||||||
case HEVC_NAL_SEI_SUFFIX:
|
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,
|
err = cbs_h265_read_sei(ctx, &gbc, unit->content,
|
||||||
unit->type == HEVC_NAL_SEI_PREFIX);
|
unit->type == HEVC_NAL_SEI_PREFIX);
|
||||||
|
|
||||||
@ -1482,6 +1385,89 @@ static const CodedBitstreamUnitTypeDescriptor cbs_h264_unit_types[] = {
|
|||||||
CBS_UNIT_TYPE_END_OF_LIST
|
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 = {
|
const CodedBitstreamType ff_cbs_type_h264 = {
|
||||||
.codec_id = AV_CODEC_ID_H264,
|
.codec_id = AV_CODEC_ID_H264,
|
||||||
|
|
||||||
@ -1502,6 +1488,8 @@ const CodedBitstreamType ff_cbs_type_h265 = {
|
|||||||
|
|
||||||
.priv_data_size = sizeof(CodedBitstreamH265Context),
|
.priv_data_size = sizeof(CodedBitstreamH265Context),
|
||||||
|
|
||||||
|
.unit_types = cbs_h265_unit_types,
|
||||||
|
|
||||||
.split_fragment = &cbs_h2645_split_fragment,
|
.split_fragment = &cbs_h2645_split_fragment,
|
||||||
.read_unit = &cbs_h265_read_nal_unit,
|
.read_unit = &cbs_h265_read_nal_unit,
|
||||||
.write_unit = &cbs_h265_write_nal_unit,
|
.write_unit = &cbs_h265_write_nal_unit,
|
||||||
|
Loading…
Reference in New Issue
Block a user