| @@ -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, | |||