xref: /rockchip-linux_mpp/mpp/hal/rkdec/h265d/hal_h265d_com.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  *
3*437bfbebSnyanmisaka  * Copyright 2020 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka  *
5*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka  * You may obtain a copy of the License at
8*437bfbebSnyanmisaka  *
9*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka  *
11*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka  * limitations under the License.
16*437bfbebSnyanmisaka  */
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #ifndef __HAL_H265D_COM_H__
19*437bfbebSnyanmisaka #define __HAL_H265D_COM_H__
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "rk_type.h"
22*437bfbebSnyanmisaka #include <limits.h>
23*437bfbebSnyanmisaka 
24*437bfbebSnyanmisaka #define SCALING_LIST_SIZE       (81 * 1360)
25*437bfbebSnyanmisaka #define RPS_SIZE                (600 * 32)
26*437bfbebSnyanmisaka #define SCALING_LIST_SIZE_NUM   4
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #define L0          0
29*437bfbebSnyanmisaka #define L1          1
30*437bfbebSnyanmisaka #define MAX_REFS    16
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka #define IS_IDR(nal_type)    (nal_type == 19 || nal_type == 20)
33*437bfbebSnyanmisaka #define IS_BLA(nal_type)    (nal_type == 17 || nal_type == 16 || nal_type == 18)
34*437bfbebSnyanmisaka #define IS_IRAP(nal_type)   (nal_type >= 16 && nal_type <= 23)
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka enum RPSType {
37*437bfbebSnyanmisaka     ST_CURR_BEF = 0,
38*437bfbebSnyanmisaka     ST_CURR_AFT,
39*437bfbebSnyanmisaka     ST_FOLL,
40*437bfbebSnyanmisaka     LT_CURR,
41*437bfbebSnyanmisaka     LT_FOLL,
42*437bfbebSnyanmisaka     NB_RPS_TYPE,
43*437bfbebSnyanmisaka };
44*437bfbebSnyanmisaka 
45*437bfbebSnyanmisaka enum SliceType {
46*437bfbebSnyanmisaka     B_SLICE = 0,
47*437bfbebSnyanmisaka     P_SLICE = 1,
48*437bfbebSnyanmisaka     I_SLICE = 2,
49*437bfbebSnyanmisaka };
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka typedef struct slice_ref_map {
52*437bfbebSnyanmisaka     RK_U8 dpb_index;
53*437bfbebSnyanmisaka     RK_U8 is_long_term;
54*437bfbebSnyanmisaka } slice_ref_map_t;
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka typedef struct ShortTermRPS {
57*437bfbebSnyanmisaka     RK_U32 num_negative_pics;
58*437bfbebSnyanmisaka     RK_S32 num_delta_pocs;
59*437bfbebSnyanmisaka     RK_S32 delta_poc[32];
60*437bfbebSnyanmisaka     RK_U8  used[32];
61*437bfbebSnyanmisaka } ShortTermRPS;
62*437bfbebSnyanmisaka 
63*437bfbebSnyanmisaka typedef struct LongTermRPS {
64*437bfbebSnyanmisaka     RK_S32  poc[32];
65*437bfbebSnyanmisaka     RK_U8   used[32];
66*437bfbebSnyanmisaka     RK_U8   nb_refs;
67*437bfbebSnyanmisaka } LongTermRPS;
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka typedef struct RefPicList {
70*437bfbebSnyanmisaka     RK_U32  dpb_index[MAX_REFS];
71*437bfbebSnyanmisaka     RK_U32 nb_refs;
72*437bfbebSnyanmisaka } RefPicList_t;
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka typedef struct RefPicListTab {
75*437bfbebSnyanmisaka     RefPicList_t refPicList[2];
76*437bfbebSnyanmisaka } RefPicListTab_t;
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka typedef struct SliceHeader {
79*437bfbebSnyanmisaka     RK_U32 pps_id;
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka     ///< address (in raster order) of the first block in the current slice segment
82*437bfbebSnyanmisaka     RK_U32   slice_segment_addr;
83*437bfbebSnyanmisaka     ///< address (in raster order) of the first block in the current slice
84*437bfbebSnyanmisaka     RK_U32   slice_addr;
85*437bfbebSnyanmisaka 
86*437bfbebSnyanmisaka     enum SliceType slice_type;
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka     RK_S32 pic_order_cnt_lsb;
89*437bfbebSnyanmisaka 
90*437bfbebSnyanmisaka     RK_U8 first_slice_in_pic_flag;
91*437bfbebSnyanmisaka     RK_U8 dependent_slice_segment_flag;
92*437bfbebSnyanmisaka     RK_U8 pic_output_flag;
93*437bfbebSnyanmisaka     RK_U8 colour_plane_id;
94*437bfbebSnyanmisaka 
95*437bfbebSnyanmisaka     ///< RPS coded in the slice header itself is stored here
96*437bfbebSnyanmisaka     ShortTermRPS slice_rps;
97*437bfbebSnyanmisaka     const ShortTermRPS *short_term_rps;
98*437bfbebSnyanmisaka     LongTermRPS long_term_rps;
99*437bfbebSnyanmisaka     RK_U32 list_entry_lx[2][32];
100*437bfbebSnyanmisaka 
101*437bfbebSnyanmisaka     RK_U8 rpl_modification_flag[2];
102*437bfbebSnyanmisaka     RK_U8 no_output_of_prior_pics_flag;
103*437bfbebSnyanmisaka     RK_U8 slice_temporal_mvp_enabled_flag;
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka     RK_U32 nb_refs[2];
106*437bfbebSnyanmisaka 
107*437bfbebSnyanmisaka     RK_U8 slice_sample_adaptive_offset_flag[3];
108*437bfbebSnyanmisaka     RK_U8 mvd_l1_zero_flag;
109*437bfbebSnyanmisaka 
110*437bfbebSnyanmisaka     RK_U8 cabac_init_flag;
111*437bfbebSnyanmisaka     RK_U8 disable_deblocking_filter_flag; ///< slice_header_disable_deblocking_filter_flag
112*437bfbebSnyanmisaka     RK_U8 slice_loop_filter_across_slices_enabled_flag;
113*437bfbebSnyanmisaka     RK_U8 collocated_list;
114*437bfbebSnyanmisaka 
115*437bfbebSnyanmisaka     RK_U32 collocated_ref_idx;
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka     RK_S32 slice_qp_delta;
118*437bfbebSnyanmisaka     RK_S32 slice_cb_qp_offset;
119*437bfbebSnyanmisaka     RK_S32 slice_cr_qp_offset;
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     RK_S32 beta_offset;    ///< beta_offset_div2 * 2
122*437bfbebSnyanmisaka     RK_S32 tc_offset;      ///< tc_offset_div2 * 2
123*437bfbebSnyanmisaka 
124*437bfbebSnyanmisaka     RK_U32 max_num_merge_cand; ///< 5 - 5_minus_max_num_merge_cand
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka     RK_S32 *entry_point_offset;
127*437bfbebSnyanmisaka     RK_S32 * offset;
128*437bfbebSnyanmisaka     RK_S32 * size;
129*437bfbebSnyanmisaka     RK_S32 num_entry_point_offsets;
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka     RK_S8 slice_qp;
132*437bfbebSnyanmisaka 
133*437bfbebSnyanmisaka     RK_U8 luma_log2_weight_denom;
134*437bfbebSnyanmisaka     RK_S16 chroma_log2_weight_denom;
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka     RK_S32 slice_ctb_addr_rs;
137*437bfbebSnyanmisaka } SliceHeader_t;
138*437bfbebSnyanmisaka 
139*437bfbebSnyanmisaka extern RK_U8 hal_hevc_diag_scan4x4_x[16];
140*437bfbebSnyanmisaka extern RK_U8 hal_hevc_diag_scan4x4_y[16];
141*437bfbebSnyanmisaka extern RK_U8 hal_hevc_diag_scan8x8_x[64];
142*437bfbebSnyanmisaka extern RK_U8 hal_hevc_diag_scan8x8_y[64];
143*437bfbebSnyanmisaka extern RK_U8 cabac_table[27456];
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka #ifdef __cplusplus
146*437bfbebSnyanmisaka extern "C" {
147*437bfbebSnyanmisaka #endif
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka RK_U32 hevc_ver_align(RK_U32 val);
150*437bfbebSnyanmisaka RK_U32 hevc_hor_align(RK_U32 val);
151*437bfbebSnyanmisaka void hal_record_scaling_list(scalingFactor_t *pScalingFactor_out, scalingList_t *pScalingList);
152*437bfbebSnyanmisaka RK_S32 hal_h265d_slice_hw_rps(void *dxva, void *rps_buf, void* sw_rps_buf, RK_U32 fast_mode);
153*437bfbebSnyanmisaka RK_S32 hal_h265d_slice_output_rps(void *dxva, void *rps_buf);
154*437bfbebSnyanmisaka void hal_h265d_output_scalinglist_packet(void *hal, void *ptr, void *dxva);
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka #ifdef __cplusplus
157*437bfbebSnyanmisaka }
158*437bfbebSnyanmisaka #endif
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka #endif /*__HAL_H265D_COM_H__*/
161