| /* |
| * drivers/amvdec_ports/decoder/aml_hevc_parser.h |
| * |
| * Copyright (C) 2015 Amlogic, Inc. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program 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 General Public License for |
| * more details. |
| * |
| */ |
| |
| |
| #ifndef AML_HEVC_PARSER_H |
| #define AML_HEVC_PARSER_H |
| |
| #include "../aml_vcodec_drv.h" |
| #include "../utils/common.h" |
| |
| #define MAX_DPB_SIZE 16 // A.4.1 |
| #define MAX_REFS 16 |
| |
| #define MAX_NB_THREADS 16 |
| #define SHIFT_CTB_WPP 2 |
| |
| /** |
| * 7.4.2.1 |
| */ |
| #define MAX_SUB_LAYERS 7 |
| #define MAX_VPS_COUNT 16 |
| #define MAX_SPS_COUNT 32 |
| #define MAX_PPS_COUNT 256 |
| #define MAX_SHORT_TERM_RPS_COUNT 64 |
| #define MAX_CU_SIZE 128 |
| |
| //TODO: check if this is really the maximum |
| #define MAX_TRANSFORM_DEPTH 5 |
| |
| #define MAX_TB_SIZE 32 |
| #define MAX_PB_SIZE 64 |
| #define MAX_LOG2_CTB_SIZE 6 |
| #define MAX_QP 51 |
| #define DEFAULT_INTRA_TC_OFFSET 2 |
| |
| #define HEVC_CONTEXTS 183 |
| |
| #define MRG_MAX_NUM_CANDS 5 |
| |
| #define L0 0 |
| #define L1 1 |
| |
| #define EPEL_EXTRA_BEFORE 1 |
| #define EPEL_EXTRA_AFTER 2 |
| #define EPEL_EXTRA 3 |
| |
| #define FF_PROFILE_HEVC_MAIN 1 |
| #define FF_PROFILE_HEVC_MAIN_10 2 |
| #define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3 |
| #define FF_PROFILE_HEVC_REXT 4 |
| |
| /** |
| * Value of the luma sample at position (x, y) in the 2D array tab. |
| */ |
| #define SAMPLE(tab, x, y) ((tab)[(y) * s->sps->width + (x)]) |
| #define SAMPLE_CTB(tab, x, y) ((tab)[(y) * min_cb_width + (x)]) |
| #define SAMPLE_CBF(tab, x, y) ((tab)[((y) & ((1<<log2_trafo_size)-1)) * MAX_CU_SIZE + ((x) & ((1<<log2_trafo_size)-1))]) |
| |
| #define IS_IDR(s) (s->nal_unit_type == NAL_IDR_W_RADL || s->nal_unit_type == NAL_IDR_N_LP) |
| #define IS_BLA(s) (s->nal_unit_type == NAL_BLA_W_RADL || s->nal_unit_type == NAL_BLA_W_LP || \ |
| s->nal_unit_type == NAL_BLA_N_LP) |
| #define IS_IRAP(s) (s->nal_unit_type >= 16 && s->nal_unit_type <= 23) |
| |
| /** |
| * Table 7-3: NAL unit type codes |
| */ |
| enum HEVCNALUnitType { |
| HEVC_NAL_TRAIL_N = 0, |
| HEVC_NAL_TRAIL_R = 1, |
| HEVC_NAL_TSA_N = 2, |
| HEVC_NAL_TSA_R = 3, |
| HEVC_NAL_STSA_N = 4, |
| HEVC_NAL_STSA_R = 5, |
| HEVC_NAL_RADL_N = 6, |
| HEVC_NAL_RADL_R = 7, |
| HEVC_NAL_RASL_N = 8, |
| HEVC_NAL_RASL_R = 9, |
| HEVC_NAL_VCL_N10 = 10, |
| HEVC_NAL_VCL_R11 = 11, |
| HEVC_NAL_VCL_N12 = 12, |
| HEVC_NAL_VCL_R13 = 13, |
| HEVC_NAL_VCL_N14 = 14, |
| HEVC_NAL_VCL_R15 = 15, |
| HEVC_NAL_BLA_W_LP = 16, |
| HEVC_NAL_BLA_W_RADL = 17, |
| HEVC_NAL_BLA_N_LP = 18, |
| HEVC_NAL_IDR_W_RADL = 19, |
| HEVC_NAL_IDR_N_LP = 20, |
| HEVC_NAL_CRA_NUT = 21, |
| HEVC_NAL_IRAP_VCL22 = 22, |
| HEVC_NAL_IRAP_VCL23 = 23, |
| HEVC_NAL_RSV_VCL24 = 24, |
| HEVC_NAL_RSV_VCL25 = 25, |
| HEVC_NAL_RSV_VCL26 = 26, |
| HEVC_NAL_RSV_VCL27 = 27, |
| HEVC_NAL_RSV_VCL28 = 28, |
| HEVC_NAL_RSV_VCL29 = 29, |
| HEVC_NAL_RSV_VCL30 = 30, |
| HEVC_NAL_RSV_VCL31 = 31, |
| HEVC_NAL_VPS = 32, |
| HEVC_NAL_SPS = 33, |
| HEVC_NAL_PPS = 34, |
| HEVC_NAL_AUD = 35, |
| HEVC_NAL_EOS_NUT = 36, |
| HEVC_NAL_EOB_NUT = 37, |
| HEVC_NAL_FD_NUT = 38, |
| HEVC_NAL_SEI_PREFIX = 39, |
| HEVC_NAL_SEI_SUFFIX = 40, |
| }; |
| |
| enum HEVCSliceType { |
| HEVC_SLICE_B = 0, |
| HEVC_SLICE_P = 1, |
| HEVC_SLICE_I = 2, |
| }; |
| |
| enum { |
| // 7.4.3.1: vps_max_layers_minus1 is in [0, 62]. |
| HEVC_MAX_LAYERS = 63, |
| // 7.4.3.1: vps_max_sub_layers_minus1 is in [0, 6]. |
| HEVC_MAX_SUB_LAYERS = 7, |
| // 7.4.3.1: vps_num_layer_sets_minus1 is in [0, 1023]. |
| HEVC_MAX_LAYER_SETS = 1024, |
| |
| // 7.4.2.1: vps_video_parameter_set_id is u(4). |
| HEVC_MAX_VPS_COUNT = 16, |
| // 7.4.3.2.1: sps_seq_parameter_set_id is in [0, 15]. |
| HEVC_MAX_SPS_COUNT = 16, |
| // 7.4.3.3.1: pps_pic_parameter_set_id is in [0, 63]. |
| HEVC_MAX_PPS_COUNT = 64, |
| |
| // A.4.2: MaxDpbSize is bounded above by 16. |
| HEVC_MAX_DPB_SIZE = 16, |
| // 7.4.3.1: vps_max_dec_pic_buffering_minus1[i] is in [0, MaxDpbSize - 1]. |
| HEVC_MAX_REFS = HEVC_MAX_DPB_SIZE, |
| |
| // 7.4.3.2.1: num_short_term_ref_pic_sets is in [0, 64]. |
| HEVC_MAX_SHORT_TERM_REF_PIC_SETS = 64, |
| // 7.4.3.2.1: num_long_term_ref_pics_sps is in [0, 32]. |
| HEVC_MAX_LONG_TERM_REF_PICS = 32, |
| |
| // A.3: all profiles require that CtbLog2SizeY is in [4, 6]. |
| HEVC_MIN_LOG2_CTB_SIZE = 4, |
| HEVC_MAX_LOG2_CTB_SIZE = 6, |
| |
| // E.3.2: cpb_cnt_minus1[i] is in [0, 31]. |
| HEVC_MAX_CPB_CNT = 32, |
| |
| // A.4.1: in table A.6 the highest level allows a MaxLumaPs of 35 651 584. |
| HEVC_MAX_LUMA_PS = 35651584, |
| // A.4.1: pic_width_in_luma_samples and pic_height_in_luma_samples are |
| // constrained to be not greater than sqrt(MaxLumaPs * 8). Hence height/ |
| // width are bounded above by sqrt(8 * 35651584) = 16888.2 samples. |
| HEVC_MAX_WIDTH = 16888, |
| HEVC_MAX_HEIGHT = 16888, |
| |
| // A.4.1: table A.6 allows at most 22 tile rows for any level. |
| HEVC_MAX_TILE_ROWS = 22, |
| // A.4.1: table A.6 allows at most 20 tile columns for any level. |
| HEVC_MAX_TILE_COLUMNS = 20, |
| |
| // 7.4.7.1: in the worst case (tiles_enabled_flag and |
| // entropy_coding_sync_enabled_flag are both set), entry points can be |
| // placed at the beginning of every Ctb row in every tile, giving an |
| // upper bound of (num_tile_columns_minus1 + 1) * PicHeightInCtbsY - 1. |
| // Only a stream with very high resolution and perverse parameters could |
| // get near that, though, so set a lower limit here with the maximum |
| // possible value for 4K video (at most 135 16x16 Ctb rows). |
| HEVC_MAX_ENTRY_POINT_OFFSETS = HEVC_MAX_TILE_COLUMNS * 135, |
| }; |
| |
| struct ShortTermRPS { |
| u32 num_negative_pics; |
| int num_delta_pocs; |
| int rps_idx_num_delta_pocs; |
| int delta_poc[32]; |
| u8 used[32]; |
| }; |
| |
| struct LongTermRPS { |
| int poc[32]; |
| u8 used[32]; |
| u8 nb_refs; |
| }; |
| |
| struct SliceHeader { |
| u32 pps_id; |
| |
| ///< address (in raster order) of the first block in the current slice segment |
| u32 slice_segment_addr; |
| ///< address (in raster order) of the first block in the current slice |
| u32 slice_addr; |
| |
| enum HEVCSliceType slice_type; |
| |
| int pic_order_cnt_lsb; |
| |
| u8 first_slice_in_pic_flag; |
| u8 dependent_slice_segment_flag; |
| u8 pic_output_flag; |
| u8 colour_plane_id; |
| |
| ///< RPS coded in the slice header itself is stored here |
| int short_term_ref_pic_set_sps_flag; |
| int short_term_ref_pic_set_size; |
| struct ShortTermRPS slice_rps; |
| const struct ShortTermRPS *short_term_rps; |
| int long_term_ref_pic_set_size; |
| struct LongTermRPS long_term_rps; |
| u32 list_entry_lx[2][32]; |
| |
| u8 rpl_modification_flag[2]; |
| u8 no_output_of_prior_pics_flag; |
| u8 slice_temporal_mvp_enabled_flag; |
| |
| u32 nb_refs[2]; |
| |
| u8 slice_sample_adaptive_offset_flag[3]; |
| u8 mvd_l1_zero_flag; |
| |
| u8 cabac_init_flag; |
| u8 disable_deblocking_filter_flag; ///< slice_header_disable_deblocking_filter_flag |
| u8 slice_loop_filter_across_slices_enabled_flag; |
| u8 collocated_list; |
| |
| u32 collocated_ref_idx; |
| |
| int slice_qp_delta; |
| int slice_cb_qp_offset; |
| int slice_cr_qp_offset; |
| |
| u8 cu_chroma_qp_offset_enabled_flag; |
| |
| int beta_offset; ///< beta_offset_div2 * 2 |
| int tc_offset; ///< tc_offset_div2 * 2 |
| |
| u32 max_num_merge_cand; ///< 5 - 5_minus_max_num_merge_cand |
| |
| u8 *entry_point_offset; |
| int * offset; |
| int * size; |
| int num_entry_point_offsets; |
| |
| char slice_qp; |
| |
| u8 luma_log2_weight_denom; |
| s16 chroma_log2_weight_denom; |
| |
| s16 luma_weight_l0[16]; |
| s16 chroma_weight_l0[16][2]; |
| s16 chroma_weight_l1[16][2]; |
| s16 luma_weight_l1[16]; |
| |
| s16 luma_offset_l0[16]; |
| s16 chroma_offset_l0[16][2]; |
| |
| s16 luma_offset_l1[16]; |
| s16 chroma_offset_l1[16][2]; |
| |
| int slice_ctb_addr_rs; |
| }; |
| |
| struct HEVCWindow { |
| u32 left_offset; |
| u32 right_offset; |
| u32 top_offset; |
| u32 bottom_offset; |
| }; |
| |
| struct VUI { |
| #ifdef CONFIG_AMLOGIC_MEDIA_V4L_SOFTWARE_PARSER |
| struct AVRational sar; |
| #endif |
| int overscan_info_present_flag; |
| int overscan_appropriate_flag; |
| |
| int video_signal_type_present_flag; |
| int video_format; |
| int video_full_range_flag; |
| int colour_description_present_flag; |
| u8 colour_primaries; |
| u8 transfer_characteristic; |
| u8 matrix_coeffs; |
| |
| int chroma_loc_info_present_flag; |
| int chroma_sample_loc_type_top_field; |
| int chroma_sample_loc_type_bottom_field; |
| int neutra_chroma_indication_flag; |
| |
| int field_seq_flag; |
| int frame_field_info_present_flag; |
| |
| int default_display_window_flag; |
| struct HEVCWindow def_disp_win; |
| |
| int vui_timing_info_present_flag; |
| u32 vui_num_units_in_tick; |
| u32 vui_time_scale; |
| int vui_poc_proportional_to_timing_flag; |
| int vui_num_ticks_poc_diff_one_minus1; |
| int vui_hrd_parameters_present_flag; |
| |
| int bitstream_restriction_flag; |
| int tiles_fixed_structure_flag; |
| int motion_vectors_over_pic_boundaries_flag; |
| int restricted_ref_pic_lists_flag; |
| int min_spatial_segmentation_idc; |
| int max_bytes_per_pic_denom; |
| int max_bits_per_min_cu_denom; |
| int log2_max_mv_length_horizontal; |
| int log2_max_mv_length_vertical; |
| }; |
| |
| struct PTLCommon { |
| u8 profile_space; |
| u8 tier_flag; |
| u8 profile_idc; |
| u8 profile_compatibility_flag[32]; |
| u8 level_idc; |
| u8 progressive_source_flag; |
| u8 interlaced_source_flag; |
| u8 non_packed_constraint_flag; |
| u8 frame_only_constraint_flag; |
| }; |
| |
| struct PTL { |
| struct PTLCommon general_ptl; |
| struct PTLCommon sub_layer_ptl[HEVC_MAX_SUB_LAYERS]; |
| |
| u8 sub_layer_profile_present_flag[HEVC_MAX_SUB_LAYERS]; |
| u8 sub_layer_level_present_flag[HEVC_MAX_SUB_LAYERS]; |
| }; |
| |
| struct h265_VPS_t { |
| u8 vps_temporal_id_nesting_flag; |
| int vps_max_layers; |
| int vps_max_sub_layers; ///< vps_max_temporal_layers_minus1 + 1 |
| |
| struct PTL ptl; |
| int vps_sub_layer_ordering_info_present_flag; |
| u32 vps_max_dec_pic_buffering[HEVC_MAX_SUB_LAYERS]; |
| u32 vps_num_reorder_pics[HEVC_MAX_SUB_LAYERS]; |
| u32 vps_max_latency_increase[HEVC_MAX_SUB_LAYERS]; |
| int vps_max_layer_id; |
| int vps_num_layer_sets; ///< vps_num_layer_sets_minus1 + 1 |
| u8 vps_timing_info_present_flag; |
| u32 vps_num_units_in_tick; |
| u32 vps_time_scale; |
| u8 vps_poc_proportional_to_timing_flag; |
| int vps_num_ticks_poc_diff_one; ///< vps_num_ticks_poc_diff_one_minus1 + 1 |
| int vps_num_hrd_parameters; |
| }; |
| |
| struct ScalingList { |
| /* This is a little wasteful, since sizeID 0 only needs 8 coeffs, |
| * and size ID 3 only has 2 arrays, not 6. */ |
| u8 sl[4][6][64]; |
| u8 sl_dc[2][6]; |
| }; |
| |
| struct h265_SPS_t { |
| u8 vps_id; |
| u8 sps_id; |
| int chroma_format_idc; |
| u8 separate_colour_plane_flag; |
| |
| struct HEVCWindow output_window; |
| struct HEVCWindow pic_conf_win; |
| |
| int bit_depth; |
| int bit_depth_chroma; |
| int pixel_shift; |
| int pix_fmt; |
| |
| u32 log2_max_poc_lsb; |
| int pcm_enabled_flag; |
| |
| int max_sub_layers; |
| struct { |
| int max_dec_pic_buffering; |
| int num_reorder_pics; |
| int max_latency_increase; |
| } temporal_layer[HEVC_MAX_SUB_LAYERS]; |
| u8 temporal_id_nesting_flag; |
| |
| struct VUI vui; |
| struct PTL ptl; |
| |
| u8 scaling_list_enable_flag; |
| struct ScalingList scaling_list; |
| |
| u32 nb_st_rps; |
| struct ShortTermRPS st_rps[HEVC_MAX_SHORT_TERM_REF_PIC_SETS]; |
| |
| u8 amp_enabled_flag; |
| u8 sao_enabled; |
| |
| u8 long_term_ref_pics_present_flag; |
| u16 lt_ref_pic_poc_lsb_sps[HEVC_MAX_LONG_TERM_REF_PICS]; |
| u8 used_by_curr_pic_lt_sps_flag[HEVC_MAX_LONG_TERM_REF_PICS]; |
| u8 num_long_term_ref_pics_sps; |
| |
| struct { |
| u8 bit_depth; |
| u8 bit_depth_chroma; |
| u32 log2_min_pcm_cb_size; |
| u32 log2_max_pcm_cb_size; |
| u8 loop_filter_disable_flag; |
| } pcm; |
| u8 sps_temporal_mvp_enabled_flag; |
| u8 sps_strong_intra_smoothing_enable_flag; |
| |
| u32 log2_min_cb_size; |
| u32 log2_diff_max_min_coding_block_size; |
| u32 log2_min_tb_size; |
| u32 log2_max_trafo_size; |
| u32 log2_ctb_size; |
| u32 log2_min_pu_size; |
| |
| int max_transform_hierarchy_depth_inter; |
| int max_transform_hierarchy_depth_intra; |
| |
| int sps_range_extension_flag; |
| int transform_skip_rotation_enabled_flag; |
| int transform_skip_context_enabled_flag; |
| int implicit_rdpcm_enabled_flag; |
| int explicit_rdpcm_enabled_flag; |
| int extended_precision_processing_flag; |
| int intra_smoothing_disabled_flag; |
| int high_precision_offsets_enabled_flag; |
| int persistent_rice_adaptation_enabled_flag; |
| int cabac_bypass_alignment_enabled_flag; |
| |
| ///< coded frame dimension in various units |
| int width; |
| int height; |
| int ctb_width; |
| int ctb_height; |
| int ctb_size; |
| int min_cb_width; |
| int min_cb_height; |
| int min_tb_width; |
| int min_tb_height; |
| int min_pu_width; |
| int min_pu_height; |
| int tb_mask; |
| |
| int hshift[3]; |
| int vshift[3]; |
| |
| int qp_bd_offset; |
| |
| u8 data[4096]; |
| int data_size; |
| }; |
| |
| struct h265_PPS_t { |
| u32 sps_id; ///< seq_parameter_set_id |
| |
| u8 sign_data_hiding_flag; |
| |
| u8 cabac_init_present_flag; |
| |
| int num_ref_idx_l0_default_active; ///< num_ref_idx_l0_default_active_minus1 + 1 |
| int num_ref_idx_l1_default_active; ///< num_ref_idx_l1_default_active_minus1 + 1 |
| int pic_init_qp_minus26; |
| |
| u8 constrained_intra_pred_flag; |
| u8 transform_skip_enabled_flag; |
| |
| u8 cu_qp_delta_enabled_flag; |
| int diff_cu_qp_delta_depth; |
| |
| int cb_qp_offset; |
| int cr_qp_offset; |
| u8 pic_slice_level_chroma_qp_offsets_present_flag; |
| u8 weighted_pred_flag; |
| u8 weighted_bipred_flag; |
| u8 output_flag_present_flag; |
| u8 transquant_bypass_enable_flag; |
| |
| u8 dependent_slice_segments_enabled_flag; |
| u8 tiles_enabled_flag; |
| u8 entropy_coding_sync_enabled_flag; |
| |
| int num_tile_columns; ///< num_tile_columns_minus1 + 1 |
| int num_tile_rows; ///< num_tile_rows_minus1 + 1 |
| u8 uniform_spacing_flag; |
| u8 loop_filter_across_tiles_enabled_flag; |
| |
| u8 seq_loop_filter_across_slices_enabled_flag; |
| |
| u8 deblocking_filter_control_present_flag; |
| u8 deblocking_filter_override_enabled_flag; |
| u8 disable_dbf; |
| int beta_offset; ///< beta_offset_div2 * 2 |
| int tc_offset; ///< tc_offset_div2 * 2 |
| |
| u8 scaling_list_data_present_flag; |
| struct ScalingList scaling_list; |
| |
| u8 lists_modification_present_flag; |
| int log2_parallel_merge_level; ///< log2_parallel_merge_level_minus2 + 2 |
| int num_extra_slice_header_bits; |
| u8 slice_header_extension_present_flag; |
| u8 log2_max_transform_skip_block_size; |
| u8 cross_component_prediction_enabled_flag; |
| u8 chroma_qp_offset_list_enabled_flag; |
| u8 diff_cu_chroma_qp_offset_depth; |
| u8 chroma_qp_offset_list_len_minus1; |
| char cb_qp_offset_list[6]; |
| char cr_qp_offset_list[6]; |
| u8 log2_sao_offset_scale_luma; |
| u8 log2_sao_offset_scale_chroma; |
| |
| // Inferred parameters |
| u32 *column_width; ///< ColumnWidth |
| u32 *row_height; ///< RowHeight |
| u32 *col_bd; ///< ColBd |
| u32 *row_bd; ///< RowBd |
| int *col_idxX; |
| |
| int *ctb_addr_rs_to_ts; ///< CtbAddrRSToTS |
| int *ctb_addr_ts_to_rs; ///< CtbAddrTSToRS |
| int *tile_id; ///< TileId |
| int *tile_pos_rs; ///< TilePosRS |
| int *min_tb_addr_zs; ///< MinTbAddrZS |
| int *min_tb_addr_zs_tab;///< MinTbAddrZS |
| }; |
| |
| struct h265_param_sets { |
| bool vps_parsed; |
| bool sps_parsed; |
| bool pps_parsed; |
| /* currently active parameter sets */ |
| struct h265_VPS_t vps; |
| struct h265_SPS_t sps; |
| struct h265_PPS_t pps; |
| }; |
| |
| #ifdef CONFIG_AMLOGIC_MEDIA_V4L_SOFTWARE_PARSER |
| int h265_decode_extradata_ps(u8 *data, int size, struct h265_param_sets *ps); |
| #else |
| inline int h265_decode_extradata_ps(u8 *data, int size, struct h265_param_sets *ps) { return -1; } |
| #endif |
| |
| #endif /* AML_HEVC_PARSER_H */ |
| |