/* * Copyright 2021 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __AV1D_CBS_H__ #define __AV1D_CBS_H__ #include "av1.h" typedef struct AV1RawOBUHeader { RK_U8 obu_forbidden_bit; RK_U8 obu_type; RK_U8 obu_extension_flag; RK_U8 obu_has_size_field; RK_U8 obu_reserved_1bit; RK_U8 temporal_id; RK_U8 spatial_id; RK_U8 extension_header_reserved_3bits; } AV1RawOBUHeader; typedef struct AV1RawColorConfig { RK_U8 high_bitdepth; RK_U8 twelve_bit; RK_U8 mono_chrome; RK_U8 color_description_present_flag; RK_U8 color_primaries; RK_U8 transfer_characteristics; RK_U8 matrix_coefficients; RK_U8 color_range; RK_U8 subsampling_x; RK_U8 subsampling_y; RK_U8 chroma_sample_position; RK_U8 separate_uv_delta_q; } AV1RawColorConfig; typedef struct AV1RawTimingInfo { RK_U32 num_units_in_display_tick; RK_U32 time_scale; RK_U8 equal_picture_interval; RK_U32 num_ticks_per_picture_minus_1; } AV1RawTimingInfo; typedef struct AV1RawDecoderModelInfo { RK_U8 buffer_delay_length_minus_1; RK_U32 num_units_in_decoding_tick; RK_U8 buffer_removal_time_length_minus_1; RK_U8 frame_presentation_time_length_minus_1; } AV1RawDecoderModelInfo; typedef struct AV1RawSequenceHeader { RK_U8 seq_profile; RK_U8 still_picture; RK_U8 reduced_still_picture_header; RK_U8 timing_info_present_flag; RK_U8 decoder_model_info_present_flag; RK_U8 initial_display_delay_present_flag; RK_U8 operating_points_cnt_minus_1; AV1RawTimingInfo timing_info; AV1RawDecoderModelInfo decoder_model_info; RK_U16 operating_point_idc[AV1_MAX_OPERATING_POINTS]; RK_U8 seq_level_idx[AV1_MAX_OPERATING_POINTS]; RK_U8 seq_tier[AV1_MAX_OPERATING_POINTS]; RK_U8 decoder_model_present_for_this_op[AV1_MAX_OPERATING_POINTS]; RK_U32 decoder_buffer_delay[AV1_MAX_OPERATING_POINTS]; RK_U32 encoder_buffer_delay[AV1_MAX_OPERATING_POINTS]; RK_U8 low_delay_mode_flag[AV1_MAX_OPERATING_POINTS]; RK_U8 initial_display_delay_present_for_this_op[AV1_MAX_OPERATING_POINTS]; RK_U8 initial_display_delay_minus_1[AV1_MAX_OPERATING_POINTS]; RK_U8 frame_width_bits_minus_1; RK_U8 frame_height_bits_minus_1; RK_U16 max_frame_width_minus_1; RK_U16 max_frame_height_minus_1; RK_U8 frame_id_numbers_present_flag; RK_U8 delta_frame_id_length_minus_2; RK_U8 additional_frame_id_length_minus_1; RK_U8 use_128x128_superblock; RK_U8 enable_filter_intra; RK_U8 enable_intra_edge_filter; RK_U8 enable_interintra_compound; RK_U8 enable_masked_compound; RK_U8 enable_warped_motion; RK_U8 enable_dual_filter; RK_U8 enable_order_hint; RK_U8 enable_jnt_comp; RK_U8 enable_ref_frame_mvs; RK_U8 seq_choose_screen_content_tools; RK_U8 seq_force_screen_content_tools; RK_U8 seq_choose_integer_mv; RK_U8 seq_force_integer_mv; RK_U8 order_hint_bits_minus_1; RK_U8 enable_superres; RK_U8 enable_cdef; RK_U8 enable_restoration; AV1RawColorConfig color_config; RK_U8 film_grain_params_present; } AV1RawSequenceHeader; typedef struct AV1RawFilmGrainParams { RK_U8 apply_grain; RK_U16 grain_seed; RK_U8 update_grain; RK_U8 film_grain_params_ref_idx; RK_U8 num_y_points; RK_U8 point_y_value[14]; RK_U8 point_y_scaling[14]; RK_U8 chroma_scaling_from_luma; RK_U8 num_cb_points; RK_U8 point_cb_value[10]; RK_U8 point_cb_scaling[10]; RK_U8 num_cr_points; RK_U8 point_cr_value[10]; RK_U8 point_cr_scaling[10]; RK_U8 grain_scaling_minus_8; RK_U8 ar_coeff_lag; RK_U8 ar_coeffs_y_plus_128[24]; RK_U8 ar_coeffs_cb_plus_128[25]; RK_U8 ar_coeffs_cr_plus_128[25]; RK_U8 ar_coeff_shift_minus_6; RK_U8 grain_scale_shift; RK_U8 cb_mult; RK_U8 cb_luma_mult; RK_U16 cb_offset; RK_U8 cr_mult; RK_U8 cr_luma_mult; RK_U16 cr_offset; RK_U8 overlap_flag; RK_U8 clip_to_restricted_range; } AV1RawFilmGrainParams; typedef struct AV1RawFrameHeader { RK_U8 show_existing_frame; RK_U8 frame_to_show_map_idx; RK_U32 frame_presentation_time; RK_U32 display_frame_id; RK_U8 frame_type; RK_U8 show_frame; RK_U8 showable_frame; RK_U8 error_resilient_mode; RK_U8 disable_cdf_update; RK_U8 allow_screen_content_tools; RK_U8 force_integer_mv; RK_S32 current_frame_id; RK_U8 frame_size_override_flag; RK_U8 order_hint; RK_U8 buffer_removal_time_present_flag; RK_U32 buffer_removal_time[AV1_MAX_OPERATING_POINTS]; RK_U8 primary_ref_frame; RK_U16 frame_width_minus_1; RK_U16 frame_height_minus_1; RK_U8 use_superres; RK_U8 coded_denom; RK_U8 render_and_frame_size_different; RK_U16 render_width_minus_1; RK_U16 render_height_minus_1; RK_U8 found_ref[AV1_REFS_PER_FRAME]; RK_U8 refresh_frame_flags; RK_U8 allow_intrabc; RK_U8 ref_order_hint[AV1_NUM_REF_FRAMES]; RK_U8 frame_refs_short_signaling; RK_U8 last_frame_idx; RK_U8 golden_frame_idx; RK_S8 ref_frame_idx[AV1_REFS_PER_FRAME]; RK_U32 delta_frame_id_minus1[AV1_REFS_PER_FRAME]; RK_U8 allow_high_precision_mv; RK_U8 is_filter_switchable; RK_U8 interpolation_filter; RK_U8 is_motion_mode_switchable; RK_U8 use_ref_frame_mvs; RK_U8 disable_frame_end_update_cdf; RK_U8 uniform_tile_spacing_flag; RK_U8 tile_cols_log2; RK_U8 tile_rows_log2; RK_U8 width_in_sbs_minus_1[AV1_MAX_TILE_COLS]; RK_U8 height_in_sbs_minus_1[AV1_MAX_TILE_ROWS]; RK_U16 context_update_tile_id; RK_U8 tile_size_bytes_minus1; // These are derived values, but it's very unhelpful to have to // recalculate them all the time so we store them here. RK_U16 tile_cols; RK_U16 tile_rows; RK_U8 base_q_idx; RK_S8 delta_q_y_dc; RK_U8 diff_uv_delta; RK_S8 delta_q_u_dc; RK_S8 delta_q_u_ac; RK_S8 delta_q_v_dc; RK_S8 delta_q_v_ac; RK_U8 using_qmatrix; RK_U8 qm_y; RK_U8 qm_u; RK_U8 qm_v; RK_U8 segmentation_enabled; RK_U8 segmentation_update_map; RK_U8 segmentation_temporal_update; RK_U8 segmentation_update_data; RK_U8 feature_enabled[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX]; RK_S16 feature_value[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX]; RK_U8 delta_q_present; RK_U8 delta_q_res; RK_U8 delta_lf_present; RK_U8 delta_lf_res; RK_U8 delta_lf_multi; RK_U8 loop_filter_level[4]; RK_U8 loop_filter_sharpness; RK_U8 loop_filter_delta_enabled; RK_U8 loop_filter_delta_update; RK_U8 update_ref_delta[AV1_TOTAL_REFS_PER_FRAME]; RK_S8 loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME]; RK_U8 update_mode_delta[2]; RK_S8 loop_filter_mode_deltas[2]; RK_U8 cdef_damping_minus_3; RK_U8 cdef_bits; RK_U8 cdef_y_pri_strength[8]; RK_U8 cdef_y_sec_strength[8]; RK_U8 cdef_uv_pri_strength[8]; RK_U8 cdef_uv_sec_strength[8]; RK_U8 lr_type[3]; RK_U8 lr_unit_shift; RK_U8 lr_uv_shift; RK_U8 tx_mode; RK_U8 reference_select; RK_U8 skip_mode_present; RK_U8 allow_warped_motion; RK_U8 reduced_tx_set; RK_U8 is_global[AV1_TOTAL_REFS_PER_FRAME]; RK_U8 is_rot_zoom[AV1_TOTAL_REFS_PER_FRAME]; RK_U8 is_translation[AV1_TOTAL_REFS_PER_FRAME]; //AV1RawSubexp gm_params[AV1_TOTAL_REFS_PER_FRAME][6]; RK_U32 gm_params[AV1_TOTAL_REFS_PER_FRAME][6]; AV1RawFilmGrainParams film_grain; } AV1RawFrameHeader; typedef struct AV1RawTileData { RK_U8 *data; size_t data_size; } AV1RawTileData; typedef struct AV1RawTileGroup { RK_U8 tile_start_and_end_present_flag; RK_U8 tg_start; RK_U8 tg_end; AV1RawTileData tile_data; } AV1RawTileGroup; typedef struct AV1RawFrame { AV1RawFrameHeader header; AV1RawTileGroup tile_group; } AV1RawFrame; typedef struct AV1RawTileList { RK_U8 output_frame_width_in_tiles_minus_1; RK_U8 output_frame_height_in_tiles_minus_1; RK_U8 tile_count_minus_1; AV1RawTileData tile_data; } AV1RawTileList; typedef struct AV1RawMetadataHDRCLL { RK_U8 max_cll; RK_U8 max_fall; } AV1RawMetadataHDRCLL; typedef struct AV1RawMetadataHDRMDCV { RK_U8 primary_chromaticity_x[3]; RK_U8 primary_chromaticity_y[3]; RK_U8 white_point_chromaticity_x; RK_U8 white_point_chromaticity_y; RK_U32 luminance_max; RK_U32 luminance_min; } AV1RawMetadataHDRMDCV; typedef struct AV1RawMetadataScalability { RK_U8 scalability_mode_idc; RK_U8 spatial_layers_cnt_minus_1; RK_U8 spatial_layer_dimensions_present_flag; RK_U8 spatial_layer_description_present_flag; RK_U8 temporal_group_description_present_flag; RK_U8 scalability_structure_reserved_3bits; RK_U8 spatial_layer_max_width[4]; RK_U8 spatial_layer_max_height[4]; RK_U8 spatial_layer_ref_id[4]; RK_U8 temporal_group_size; RK_U8 temporal_group_temporal_id[255]; RK_U8 temporal_group_temporal_switching_up_point_flag[255]; RK_U8 temporal_group_spatial_switching_up_point_flag[255]; RK_U8 temporal_group_ref_cnt[255]; RK_U8 temporal_group_ref_pic_diff[255][7]; } AV1RawMetadataScalability; typedef struct AV1RawMetadataITUTT35 { RK_U8 itu_t_t35_country_code; RK_U8 itu_t_t35_country_code_extension_byte; RK_U8 *payload; size_t payload_size; } AV1RawMetadataITUTT35; typedef struct AV1RawMetadataTimecode { RK_U8 counting_type; RK_U8 full_timestamp_flag; RK_U8 discontinuity_flag; RK_U8 cnt_dropped_flag; RK_U8 n_frames; RK_U8 seconds_value; RK_U8 minutes_value; RK_U8 hours_value; RK_U8 seconds_flag; RK_U8 minutes_flag; RK_U8 hours_flag; RK_U8 time_offset_length; RK_U32 time_offset_value; } AV1RawMetadataTimecode; typedef struct AV1RawMetadata { RK_U64 metadata_type; union { AV1RawMetadataHDRCLL hdr_cll; AV1RawMetadataHDRMDCV hdr_mdcv; AV1RawMetadataScalability scalability; AV1RawMetadataITUTT35 itut_t35; AV1RawMetadataTimecode timecode; } metadata; } AV1RawMetadata; typedef struct AV1RawPadding { RK_U8 *payload; size_t payload_size; } AV1RawPadding; typedef struct AV1RawOBU { AV1RawOBUHeader header; size_t obu_size; union { AV1RawSequenceHeader sequence_header; AV1RawFrameHeader frame_header; AV1RawFrame frame; AV1RawTileGroup tile_group; AV1RawTileList tile_list; AV1RawMetadata metadata; AV1RawPadding padding; } obu; } AV1RawOBU; typedef struct AV1ReferenceFrameState { RK_S32 valid; // RefValid RK_S32 frame_id; // RefFrameId RK_S32 upscaled_width; // RefUpscaledWidth RK_S32 frame_width; // RefFrameWidth RK_S32 frame_height; // RefFrameHeight RK_S32 render_width; // RefRenderWidth RK_S32 render_height; // RefRenderHeight RK_S32 frame_type; // RefFrameType RK_S32 subsampling_x; // RefSubsamplingX RK_S32 subsampling_y; // RefSubsamplingY RK_S32 bit_depth; // RefBitDepth RK_S32 order_hint; // RefOrderHint RK_S8 loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME]; RK_S8 loop_filter_mode_deltas[2]; RK_U8 feature_enabled[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX]; RK_S16 feature_value[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX]; } AV1ReferenceFrameState; typedef RK_U32 Av1UnitType; typedef struct Av1ObuUnit_t { /** * Codec-specific type of this unit. */ Av1UnitType type; /** * Pointer to the directly-parsable bitstream form of this unit. * * May be NULL if the unit currently only exists in decomposed form. */ RK_U8 *data; size_t data_size; void *content; } Av1ObuUnit; typedef struct Av1UnitFragment_t { RK_U8 *data; size_t data_size; int nb_units; int nb_units_allocated; Av1ObuUnit *units; } Av1UnitFragment; #endif //__AV1D_CBS_H__