/* * * Copyright 2020 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 __HAL_H265D_COM_H__ #define __HAL_H265D_COM_H__ #include "rk_type.h" #define SCALING_LIST_SIZE (81 * 1360) #define RPS_SIZE (600 * 32) #define SCALING_LIST_SIZE_NUM 4 #define L0 0 #define L1 1 #define MAX_REFS 16 #define IS_IDR(nal_type) (nal_type == 19 || nal_type == 20) #define IS_BLA(nal_type) (nal_type == 17 || nal_type == 16 || nal_type == 18) #define IS_IRAP(nal_type) (nal_type >= 16 && nal_type <= 23) enum RPSType { ST_CURR_BEF = 0, ST_CURR_AFT, ST_FOLL, LT_CURR, LT_FOLL, NB_RPS_TYPE, }; enum SliceType { B_SLICE = 0, P_SLICE = 1, I_SLICE = 2, }; typedef struct slice_ref_map { RK_U8 dpb_index; RK_U8 is_long_term; } slice_ref_map_t; typedef struct ShortTermRPS { RK_U32 num_negative_pics; RK_S32 num_delta_pocs; RK_S32 delta_poc[32]; RK_U8 used[32]; } ShortTermRPS; typedef struct LongTermRPS { RK_S32 poc[32]; RK_U8 used[32]; RK_U8 nb_refs; } LongTermRPS; typedef struct RefPicList { RK_U32 dpb_index[MAX_REFS]; RK_U32 nb_refs; } RefPicList_t; typedef struct RefPicListTab { RefPicList_t refPicList[2]; } RefPicListTab_t; typedef struct SliceHeader { RK_U32 pps_id; ///< address (in raster order) of the first block in the current slice segment RK_U32 slice_segment_addr; ///< address (in raster order) of the first block in the current slice RK_U32 slice_addr; enum SliceType slice_type; RK_S32 pic_order_cnt_lsb; RK_U8 first_slice_in_pic_flag; RK_U8 dependent_slice_segment_flag; RK_U8 pic_output_flag; RK_U8 colour_plane_id; ///< RPS coded in the slice header itself is stored here ShortTermRPS slice_rps; const ShortTermRPS *short_term_rps; LongTermRPS long_term_rps; RK_U32 list_entry_lx[2][32]; RK_U8 rpl_modification_flag[2]; RK_U8 no_output_of_prior_pics_flag; RK_U8 slice_temporal_mvp_enabled_flag; RK_U32 nb_refs[2]; RK_U8 slice_sample_adaptive_offset_flag[3]; RK_U8 mvd_l1_zero_flag; RK_U8 cabac_init_flag; RK_U8 disable_deblocking_filter_flag; ///< slice_header_disable_deblocking_filter_flag RK_U8 slice_loop_filter_across_slices_enabled_flag; RK_U8 collocated_list; RK_U32 collocated_ref_idx; RK_S32 slice_qp_delta; RK_S32 slice_cb_qp_offset; RK_S32 slice_cr_qp_offset; RK_S32 beta_offset; ///< beta_offset_div2 * 2 RK_S32 tc_offset; ///< tc_offset_div2 * 2 RK_U32 max_num_merge_cand; ///< 5 - 5_minus_max_num_merge_cand RK_S32 *entry_point_offset; RK_S32 * offset; RK_S32 * size; RK_S32 num_entry_point_offsets; RK_S8 slice_qp; RK_U8 luma_log2_weight_denom; RK_S16 chroma_log2_weight_denom; RK_S32 slice_ctb_addr_rs; } SliceHeader_t; extern RK_U8 hal_hevc_diag_scan4x4_x[16]; extern RK_U8 hal_hevc_diag_scan4x4_y[16]; extern RK_U8 hal_hevc_diag_scan8x8_x[64]; extern RK_U8 hal_hevc_diag_scan8x8_y[64]; extern RK_U8 cabac_table[27456]; #ifdef __cplusplus extern "C" { #endif RK_U32 hevc_ver_align(RK_U32 val); RK_U32 hevc_hor_align(RK_U32 val); void hal_record_scaling_list(scalingFactor_t *pScalingFactor_out, scalingList_t *pScalingList); RK_S32 hal_h265d_slice_hw_rps(void *dxva, void *rps_buf, void* sw_rps_buf, RK_U32 fast_mode); RK_S32 hal_h265d_slice_output_rps(void *dxva, void *rps_buf); void hal_h265d_output_scalinglist_packet(void *hal, void *ptr, void *dxva); #ifdef __cplusplus } #endif #endif /*__HAL_H265D_COM_H__*/