summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2020-07-27 17:32:24 +0100
committerMark Thompson <sw@jkqxz.net>2020-09-02 00:00:57 +0100
commite38646de1cef80ebf451402ddaf15941f2b60522 (patch)
tree989317a4fc2ef86803f6ec21dc2370e2f3c0b7f7 /libavcodec
parentd1c6e09d09f530a1f103a5dbdf06f69f42611974 (diff)
cbs_h265: Use table-based alloc/free
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/cbs_h2645.c198
1 files changed, 93 insertions, 105 deletions
diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
index e19fa5249d..b9233f4df7 100644
--- a/libavcodec/cbs_h2645.c
+++ b/libavcodec/cbs_h2645.c
@@ -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,