+static void cbs_h264_free_sei_payload(H264RawSEIPayload *payload)
+{
+ switch (payload->payload_type) {
+ case H264_SEI_TYPE_BUFFERING_PERIOD:
+ case H264_SEI_TYPE_PIC_TIMING:
+ case H264_SEI_TYPE_PAN_SCAN_RECT:
+ case H264_SEI_TYPE_RECOVERY_POINT:
+ case H264_SEI_TYPE_DISPLAY_ORIENTATION:
+ case H264_SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME:
+ case H264_SEI_TYPE_ALTERNATIVE_TRANSFER:
+ break;
+ case H264_SEI_TYPE_USER_DATA_REGISTERED:
+ av_buffer_unref(&payload->payload.user_data_registered.data_ref);
+ break;
+ case H264_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;
+ }
+}
+
+static void cbs_h264_free_sei(void *opaque, uint8_t *content)
+{
+ H264RawSEI *sei = (H264RawSEI*)content;
+ int i;
+ for (i = 0; i < sei->payload_count; i++)
+ cbs_h264_free_sei_payload(&sei->payload[i]);
+ av_freep(&content);
+}
+
+static const CodedBitstreamUnitTypeDescriptor cbs_h264_unit_types[] = {
+ CBS_UNIT_TYPE_POD(H264_NAL_SPS, H264RawSPS),
+ CBS_UNIT_TYPE_POD(H264_NAL_SPS_EXT, H264RawSPSExtension),
+
+ CBS_UNIT_TYPE_INTERNAL_REF(H264_NAL_PPS, H264RawPPS, slice_group_id),
+
+ {
+ .nb_unit_types = 3,
+ .unit_types = {
+ H264_NAL_IDR_SLICE,
+ H264_NAL_SLICE,
+ H264_NAL_AUXILIARY_SLICE,
+ },
+ .content_type = CBS_CONTENT_TYPE_INTERNAL_REFS,
+ .content_size = sizeof(H264RawSlice),
+ .nb_ref_offsets = 1,
+ .ref_offsets = { offsetof(H264RawSlice, data) },
+ },
+
+ CBS_UNIT_TYPE_POD(H264_NAL_AUD, H264RawAUD),
+ CBS_UNIT_TYPE_POD(H264_NAL_FILLER_DATA, H264RawFiller),
+ CBS_UNIT_TYPE_POD(H264_NAL_END_SEQUENCE, H264RawNALUnitHeader),
+ CBS_UNIT_TYPE_POD(H264_NAL_END_STREAM, H264RawNALUnitHeader),
+
+ CBS_UNIT_TYPE_COMPLEX(H264_NAL_SEI, H264RawSEI, &cbs_h264_free_sei),
+
+ 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
+};
+