/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef AVCODEC_CBS_LCEVC_H #define AVCODEC_CBS_LCEVC_H #include #include #include "cbs_h2645.h" #include "cbs_sei.h" #include "lcevc.h" typedef struct LCEVCRawNALUnitHeader { uint8_t nal_unit_type; uint16_t reserved_flag; } LCEVCRawNALUnitHeader; typedef struct LCEVCRawSequenceConfig { uint8_t profile_idc; uint8_t level_idc; uint8_t sublevel_idc; uint8_t conformance_window_flag; uint8_t reserved_zeros_5bit; uint8_t extended_profile_idc; uint8_t extended_level_idc; uint8_t reserved_zeros_1bit; uint32_t conf_win_left_offset; uint32_t conf_win_right_offset; uint32_t conf_win_top_offset; uint32_t conf_win_bottom_offset; } LCEVCRawSequenceConfig; typedef struct LCEVCRawGlobalConfig { uint8_t processed_planes_type_flag; uint8_t resolution_type; uint8_t transform_type; uint8_t chroma_sampling_type; uint8_t base_depth_type; uint8_t enhancement_depth_type; uint8_t temporal_step_width_modifier_signalled_flag; uint8_t predicted_residual_mode_flag; uint8_t temporal_tile_intra_signalling_enabled_flag; uint8_t temporal_enabled_flag; uint8_t upsample_type; uint8_t level1_filtering_signalled_flag; uint8_t scaling_mode_level1; uint8_t scaling_mode_level2; uint8_t tile_dimensions_type; uint8_t user_data_enabled; uint8_t level1_depth_flag; uint8_t chroma_step_width_flag; uint8_t planes_type; uint8_t reserved_zeros_4bit; uint8_t temporal_step_width_modifier; uint16_t upsampler_coeff1; uint16_t upsampler_coeff2; uint16_t upsampler_coeff3; uint16_t upsampler_coeff4; uint8_t level1_filtering_first_coefficient; uint8_t level1_filtering_second_coefficient; uint16_t custom_tile_width; uint16_t custom_tile_height; uint16_t reserved_zeros_5bit; uint8_t compression_type_entropy_enabled_per_tile_flag; uint8_t compression_type_size_per_tile; uint16_t custom_resolution_width; uint16_t custom_resolution_height; uint8_t chroma_step_width_multiplier; } LCEVCRawGlobalConfig; typedef struct LCEVCRawPictureConfig { uint8_t no_enhancement_bit_flag; uint8_t quant_matrix_mode; uint8_t dequant_offset_signalled_flag; uint8_t picture_type_bit_flag; uint8_t temporal_refresh_bit_flag; uint8_t step_width_sublayer1_enabled_flag; uint16_t step_width_sublayer2; uint8_t dithering_control_flag; uint8_t reserved_zeros_4bit; uint8_t temporal_signalling_present_flag; uint8_t field_type_bit_flag; uint8_t reserved_zeros_7bit; uint16_t step_width_sublayer1; uint8_t level1_filtering_enabled_flag; uint8_t qm_coefficient_0[16]; uint8_t qm_coefficient_1[16]; uint8_t dequant_offset_mode_flag; uint8_t dequant_offset; uint8_t dithering_type; uint8_t reserverd_zero; uint8_t dithering_strength; uint8_t reserved_zeros_5bit; LCEVCRawGlobalConfig *gc; ///< RefStruct references } LCEVCRawPictureConfig; typedef struct LCEVCRawEncodedData { LCEVCRawNALUnitHeader nal_unit_header; uint8_t surfaces_entropy_enabled_flag[3][3][16]; uint8_t surfaces_rle_only_flag[3][3][16]; uint8_t temporal_surfaces_entropy_enabled_flag[3]; uint8_t temporal_surfaces_rle_only_flag[3]; uint8_t *data; AVBufferRef *data_ref; size_t header_size; size_t data_size; LCEVCRawSequenceConfig *sc; ///< RefStruct references LCEVCRawGlobalConfig *gc; ///< RefStruct references LCEVCRawPictureConfig *pc; ///< RefStruct references } LCEVCRawEncodedData; typedef struct LCEVCRawVUI { uint8_t aspect_ratio_info_present_flag; uint8_t aspect_ratio_idc; uint16_t sar_width; uint8_t sar_height; uint8_t overscan_info_present_flag; uint8_t overscan_appropriate_flag; uint8_t video_signal_type_present_flag; uint8_t video_format; uint8_t video_full_range_flag; uint8_t colour_description_present_flag; uint8_t colour_primaries; uint8_t transfer_characteristics; uint8_t matrix_coefficients; uint8_t chroma_loc_info_present_flag; uint8_t chroma_sample_loc_type_top_field; uint8_t chroma_sample_loc_type_bottom_field; } LCEVCRawVUI; typedef struct LCEVCRawSEI { SEIRawMessage message; uint8_t payload_type; uint32_t payload_size; void *payload; void *payload_ref; ///< RefStruct reference } LCEVCRawSEI; typedef struct LCEVCRawAdditionalInfo { uint8_t additional_info_type; LCEVCRawSEI sei; LCEVCRawVUI vui; uint32_t payload_size; void *payload; void *payload_ref; ///< RefStruct reference } LCEVCRawAdditionalInfo; typedef struct LCEVCRawFiller { uint32_t filler_size; } LCEVCRawFiller; typedef struct LCEVCRawProcessBlock { uint32_t payload_type; uint32_t payload_size; void *payload; void *payload_ref; ///< RefStruct reference uint8_t *extension_data; ///< RefStruct reference size_t extension_bit_length; } LCEVCRawProcessBlock; typedef struct LCEVCRawProcessBlockList { LCEVCRawProcessBlock *blocks; int nb_blocks; int nb_blocks_allocated; } LCEVCRawProcessBlockList; typedef struct LCEVCRawNAL { LCEVCRawNALUnitHeader nal_unit_header; LCEVCRawProcessBlockList process_block_list; } LCEVCRawNAL; typedef struct LCEVCProcessBlockState { // The type of the payload being written. uint32_t payload_type; // When reading, contains the size of the payload to allow finding the // end of variable-length fields (such as user_data_payload_byte[]). // (When writing, the size will be derived from the total number of // bytes actually written.) uint32_t payload_size; // When writing, indicates that payload extension data is present so // all extended fields must be written. May be updated by the writer // to indicate that extended fields have been written, so the extension // end bits must be written too. uint8_t extension_present; } LCEVCProcessBlockState; typedef int (*LCEVCRawProcessBlockReadFunction)(CodedBitstreamContext *ctx, struct GetBitContext *rw, void *current, LCEVCProcessBlockState *state, int nal_unit_type); typedef int (*LCEVCRawProcessBlockWriteFunction)(CodedBitstreamContext *ctx, struct PutBitContext *rw, void *current, LCEVCProcessBlockState *state, int nal_unit_type); typedef struct LCEVCProcessBlockTypeDescriptor { // Payload type for the block. (-1 in this field ends a list.) int payload_type; // Size of the decomposed structure. size_t payload_size; // Read bitstream into Process Block. LCEVCRawProcessBlockReadFunction read; // Write bitstream from Process Block. LCEVCRawProcessBlockWriteFunction write; } LCEVCProcessBlockTypeDescriptor; // End-of-list sentinel element. #define LCEVC_PROCESS_BLOCK_TYPE_END { .payload_type = -1 } typedef struct CodedBitstreamLCEVCContext { // Reader/writer context in common with the H.264 implementation. CodedBitstreamH2645Context common; int dithering_control_flag; // All currently available parameter sets. These are updated when // any parameter set NAL unit is read/written with this context. LCEVCRawSequenceConfig *sc; ///< RefStruct references LCEVCRawGlobalConfig *gc; ///< RefStruct references LCEVCRawPictureConfig *pc; ///< RefStruct references } CodedBitstreamLCEVCContext; /** * Find the type descriptor for the given payload type. * * Returns NULL if the payload type is not known. */ const LCEVCProcessBlockTypeDescriptor *ff_cbs_lcevc_process_block_find_type(CodedBitstreamContext *ctx, int payload_type); /** * Allocate a new payload for the given Process Block. */ int ff_cbs_lcevc_alloc_process_block_payload(LCEVCRawProcessBlock *block, const LCEVCProcessBlockTypeDescriptor *desc); /** * Allocate a new empty Process Block in a block list at a given position. */ int ff_cbs_lcevc_list_add(LCEVCRawProcessBlockList *list, int position); /** * Free all Process Block in a block list. */ void ff_cbs_lcevc_free_process_block_list(LCEVCRawProcessBlockList *list); /** * Add a process block to an access unit. * * An existing NAL unit of type IDR or NON_IDR are required. * * If set, payload_ref must be a RefStruct reference backing payload_data. * This function creates a new reference to payload_ref in this case. * If payload_ref is NULL, the new message will not be reference counted. */ int ff_cbs_lcevc_add_process_block(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, int position, uint32_t payload_type, void *payload_data, void *payload_ref); /** * Iterate over blocks with the given payload type in an access unit. * * Set block to NULL in the first call. Returns 0 while more blocks * are available, AVERROR(ENOENT) when all blocks have been found. */ int ff_cbs_lcevc_find_process_block(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, uint32_t payload_type, LCEVCRawProcessBlock **block); /** * Delete all blocks with the given payload type from an access unit. */ void ff_cbs_lcevc_delete_process_block_type(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, uint32_t payload_type); #endif /* AVCODEC_CBS_LCEVC_H */