xref: /aosp_15_r20/external/libhevc/encoder/ihevce_ipe_structs.h (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar  *
3*c83a76b0SSuyog Pawar  * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar  *
5*c83a76b0SSuyog Pawar  * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar  * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar  * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar  *
9*c83a76b0SSuyog Pawar  * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar  *
11*c83a76b0SSuyog Pawar  * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar  * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar  * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar  * limitations under the License.
16*c83a76b0SSuyog Pawar  *
17*c83a76b0SSuyog Pawar  *****************************************************************************
18*c83a76b0SSuyog Pawar  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar /*!
21*c83a76b0SSuyog Pawar ******************************************************************************
22*c83a76b0SSuyog Pawar * \file ihevce_ipe_structs.h
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar *    This file contains strcutures of ipe pass
26*c83a76b0SSuyog Pawar *
27*c83a76b0SSuyog Pawar * \date
28*c83a76b0SSuyog Pawar *    18/09/2012
29*c83a76b0SSuyog Pawar *
30*c83a76b0SSuyog Pawar * \author
31*c83a76b0SSuyog Pawar *    Ittiam
32*c83a76b0SSuyog Pawar *
33*c83a76b0SSuyog Pawar ******************************************************************************
34*c83a76b0SSuyog Pawar */
35*c83a76b0SSuyog Pawar 
36*c83a76b0SSuyog Pawar #ifndef _IHEVCE_IPE_STRUCTS_H_
37*c83a76b0SSuyog Pawar #define _IHEVCE_IPE_STRUCTS_H_
38*c83a76b0SSuyog Pawar 
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar /* Constant Macros                                                           */
41*c83a76b0SSuyog Pawar /*****************************************************************************/
42*c83a76b0SSuyog Pawar #define MAX_FAST_IP_MODES 23
43*c83a76b0SSuyog Pawar #define NUM_INTRA_RDOPT_MODES 1
44*c83a76b0SSuyog Pawar #if 1  // FAST_PART_WITH_OPTION_4
45*c83a76b0SSuyog Pawar #define MAX_TREE_NODES                                                                             \
46*c83a76b0SSuyog Pawar     ((MAX_CTB_SIZE == MIN_TU_SIZE)                                                                 \
47*c83a76b0SSuyog Pawar          ? 1                                                                                       \
48*c83a76b0SSuyog Pawar          : (MAX_CTB_SIZE == (MIN_TU_SIZE << 1)                                                     \
49*c83a76b0SSuyog Pawar                 ? 5                                                                                \
50*c83a76b0SSuyog Pawar                 : (MAX_CTB_SIZE == (MIN_TU_SIZE << 2)                                              \
51*c83a76b0SSuyog Pawar                        ? 21                                                                        \
52*c83a76b0SSuyog Pawar                        : (MAX_CTB_SIZE == (MIN_TU_SIZE << 3) ? 37 : 53))))
53*c83a76b0SSuyog Pawar #else  // FAST_PART_WITH_OPTION_4
54*c83a76b0SSuyog Pawar #define MAX_TREE_NODES                                                                             \
55*c83a76b0SSuyog Pawar     ((MAX_CTB_SIZE == MIN_TU_SIZE)                                                                 \
56*c83a76b0SSuyog Pawar          ? 1                                                                                       \
57*c83a76b0SSuyog Pawar          : (MAX_CTB_SIZE == (MIN_TU_SIZE << 1)                                                     \
58*c83a76b0SSuyog Pawar                 ? 5                                                                                \
59*c83a76b0SSuyog Pawar                 : (MAX_CTB_SIZE == (MIN_TU_SIZE << 2)                                              \
60*c83a76b0SSuyog Pawar                        ? 9                                                                         \
61*c83a76b0SSuyog Pawar                        : (MAX_CTB_SIZE == (MIN_TU_SIZE << 3) ? 13 : 17))))
62*c83a76b0SSuyog Pawar #endif  // FAST_PART_WITH_OPTION_4
63*c83a76b0SSuyog Pawar #define BOTTOM_LEFT_FLAG 0x0000000F
64*c83a76b0SSuyog Pawar #define LEFT_FLAG 0x000000F0
65*c83a76b0SSuyog Pawar #define TOP_LEFT_FLAG 0x00010000
66*c83a76b0SSuyog Pawar #define TOP_FLAG 0x00000F00
67*c83a76b0SSuyog Pawar #define TOP_RIGHT_FLAG 0x0000F000
68*c83a76b0SSuyog Pawar #define MAX_UWORD8 0xFF
69*c83a76b0SSuyog Pawar #define MAX_DOUBLE 1.7e+308  ///< max. value of double-type value
70*c83a76b0SSuyog Pawar #define MAX_INTRA_COST_IPE 0x0F7F7F7F
71*c83a76b0SSuyog Pawar 
72*c83a76b0SSuyog Pawar #define MAX_TU_ROW_IN_CTB (MAX_CTB_SIZE >> 2)
73*c83a76b0SSuyog Pawar #define MAX_TU_COL_IN_CTB (MAX_CTB_SIZE >> 2)
74*c83a76b0SSuyog Pawar 
75*c83a76b0SSuyog Pawar #define BIT_DEPTH 8
76*c83a76b0SSuyog Pawar 
77*c83a76b0SSuyog Pawar #define FAST_PARTITION_WITH_TRANSFORM 1
78*c83a76b0SSuyog Pawar 
79*c83a76b0SSuyog Pawar #define IHEVCE_INTRA_REF_FILTERING C
80*c83a76b0SSuyog Pawar #define IHEVCE_INTRA_LUMA_REF_SUBSTITUTION C
81*c83a76b0SSuyog Pawar /*****************************************************************************/
82*c83a76b0SSuyog Pawar /* Constant Macros                                                           */
83*c83a76b0SSuyog Pawar /*****************************************************************************/
84*c83a76b0SSuyog Pawar /** /breif 4x4 DST, 4x4, 8x8, 16x16, 32x32 */
85*c83a76b0SSuyog Pawar #define NUM_TRANS_TYPES 5
86*c83a76b0SSuyog Pawar #define INTRA_PLANAR 0
87*c83a76b0SSuyog Pawar #define INTRA_DC 1
88*c83a76b0SSuyog Pawar 
89*c83a76b0SSuyog Pawar /*****************************************************************************/
90*c83a76b0SSuyog Pawar /* Function Macros                                                           */
91*c83a76b0SSuyog Pawar /*****************************************************************************/
92*c83a76b0SSuyog Pawar #define INTRA_ANGULAR(x) (x)
93*c83a76b0SSuyog Pawar 
94*c83a76b0SSuyog Pawar /** @breif max 30bit value */
95*c83a76b0SSuyog Pawar #define MAX30 ((1 << 30) - 1)
96*c83a76b0SSuyog Pawar 
97*c83a76b0SSuyog Pawar /* @bried macro to clip a data to max of 30bits (assuming unsgined) */
98*c83a76b0SSuyog Pawar #define CLIP30(x) ((x) > MAX30 ? MAX30 : (x))
99*c83a76b0SSuyog Pawar 
100*c83a76b0SSuyog Pawar /* @bried compute the (lambda * rate) with a qshift and clip result to 30bits */
101*c83a76b0SSuyog Pawar #define COMPUTE_RATE_COST_CLIP30(r, l, qshift) ((WORD32)CLIP30((ULWORD64)((r) * (l)) >> (qshift)))
102*c83a76b0SSuyog Pawar 
103*c83a76b0SSuyog Pawar /*****************************************************************************/
104*c83a76b0SSuyog Pawar /* Typedefs                                                                  */
105*c83a76b0SSuyog Pawar /*****************************************************************************/
106*c83a76b0SSuyog Pawar typedef UWORD32 (*pf_res_trans_luma_had)(
107*c83a76b0SSuyog Pawar     UWORD8 *pu1_origin,
108*c83a76b0SSuyog Pawar     WORD32 src_strd,
109*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred_buf,
110*c83a76b0SSuyog Pawar     WORD32 pred_strd,
111*c83a76b0SSuyog Pawar     WORD16 *pi2_dst,
112*c83a76b0SSuyog Pawar     WORD32 dst_strd,
113*c83a76b0SSuyog Pawar     WORD32 size);
114*c83a76b0SSuyog Pawar 
115*c83a76b0SSuyog Pawar typedef void (*pf_ipe_intra_pred)(
116*c83a76b0SSuyog Pawar     UWORD8 *pu1_ref, WORD32 src_strd, UWORD8 *pu1_dst, WORD32 dst_strd, WORD32 nt, WORD32 mode);
117*c83a76b0SSuyog Pawar 
118*c83a76b0SSuyog Pawar typedef UWORD32 (*pf_ipe_res_trans)(
119*c83a76b0SSuyog Pawar     UWORD8 *pu1_src,
120*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred,
121*c83a76b0SSuyog Pawar     WORD16 *pi2_tmp,
122*c83a76b0SSuyog Pawar     WORD16 *pi2_dst,
123*c83a76b0SSuyog Pawar     WORD32 src_strd,
124*c83a76b0SSuyog Pawar     WORD32 pred_strd,
125*c83a76b0SSuyog Pawar     WORD32 dst_strd,
126*c83a76b0SSuyog Pawar     WORD32 chroma_flag);
127*c83a76b0SSuyog Pawar 
128*c83a76b0SSuyog Pawar typedef FT_CALC_HAD_SATD_8BIT *pf_ipe_res_trans_had;
129*c83a76b0SSuyog Pawar /*****************************************************************************/
130*c83a76b0SSuyog Pawar /* Enums                                                                     */
131*c83a76b0SSuyog Pawar /*****************************************************************************/
132*c83a76b0SSuyog Pawar 
133*c83a76b0SSuyog Pawar typedef enum
134*c83a76b0SSuyog Pawar {
135*c83a76b0SSuyog Pawar 
136*c83a76b0SSuyog Pawar     IPE_CTXT = 0,
137*c83a76b0SSuyog Pawar     IPE_THRDS_CTXT,
138*c83a76b0SSuyog Pawar 
139*c83a76b0SSuyog Pawar     /* should be last entry */
140*c83a76b0SSuyog Pawar     NUM_IPE_MEM_RECS
141*c83a76b0SSuyog Pawar 
142*c83a76b0SSuyog Pawar } IPE_MEM_TABS_T;
143*c83a76b0SSuyog Pawar 
144*c83a76b0SSuyog Pawar typedef enum
145*c83a76b0SSuyog Pawar {
146*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_0 = 0,
147*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_1,
148*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_2,
149*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_3TO9,
150*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_10,
151*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_11TO17,
152*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_18_34,
153*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_19TO25,
154*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_26,
155*c83a76b0SSuyog Pawar     IPE_FUNC_MODE_27TO33,
156*c83a76b0SSuyog Pawar 
157*c83a76b0SSuyog Pawar     NUM_IPE_FUNCS
158*c83a76b0SSuyog Pawar 
159*c83a76b0SSuyog Pawar } IPE_FUNCS_T;
160*c83a76b0SSuyog Pawar 
161*c83a76b0SSuyog Pawar /*****************************************************************************/
162*c83a76b0SSuyog Pawar /* Structure                                                                 */
163*c83a76b0SSuyog Pawar /*****************************************************************************/
164*c83a76b0SSuyog Pawar /**
165*c83a76b0SSuyog Pawar ******************************************************************************
166*c83a76b0SSuyog Pawar  *  @brief    IPE CTB to CU and TU Quadtree Recursive Structure
167*c83a76b0SSuyog Pawar ******************************************************************************
168*c83a76b0SSuyog Pawar  */
169*c83a76b0SSuyog Pawar 
170*c83a76b0SSuyog Pawar typedef struct ihevce_ipe_cu_tree_t ihevce_ipe_cu_tree_t;
171*c83a76b0SSuyog Pawar 
172*c83a76b0SSuyog Pawar typedef struct ihevce_ipe_cu_tree_t
173*c83a76b0SSuyog Pawar {
174*c83a76b0SSuyog Pawar     /**
175*c83a76b0SSuyog Pawar      * Origin of current coding unit relative to top-left of CTB
176*c83a76b0SSuyog Pawar      */
177*c83a76b0SSuyog Pawar     UWORD16 u2_x0;
178*c83a76b0SSuyog Pawar 
179*c83a76b0SSuyog Pawar     UWORD16 u2_y0;
180*c83a76b0SSuyog Pawar 
181*c83a76b0SSuyog Pawar     /**
182*c83a76b0SSuyog Pawar      * Origin of current coding unit relative to top-left of Picture
183*c83a76b0SSuyog Pawar      */
184*c83a76b0SSuyog Pawar     UWORD16 u2_orig_x;
185*c83a76b0SSuyog Pawar 
186*c83a76b0SSuyog Pawar     UWORD16 u2_orig_y;
187*c83a76b0SSuyog Pawar 
188*c83a76b0SSuyog Pawar     /**
189*c83a76b0SSuyog Pawar      * Size of current coding unit in luma pixels
190*c83a76b0SSuyog Pawar      */
191*c83a76b0SSuyog Pawar     UWORD8 u1_cu_size;
192*c83a76b0SSuyog Pawar 
193*c83a76b0SSuyog Pawar     UWORD8 u1_width;
194*c83a76b0SSuyog Pawar 
195*c83a76b0SSuyog Pawar     UWORD8 u1_height;
196*c83a76b0SSuyog Pawar 
197*c83a76b0SSuyog Pawar     UWORD8 u1_depth;
198*c83a76b0SSuyog Pawar 
199*c83a76b0SSuyog Pawar     UWORD8 u1_part_flag_pos;
200*c83a76b0SSuyog Pawar 
201*c83a76b0SSuyog Pawar     UWORD8 u1_log2_nt;
202*c83a76b0SSuyog Pawar 
203*c83a76b0SSuyog Pawar     WORD32 i4_nbr_flag;
204*c83a76b0SSuyog Pawar 
205*c83a76b0SSuyog Pawar     /**
206*c83a76b0SSuyog Pawar      * Recursive Bracketing Parameters
207*c83a76b0SSuyog Pawar      */
208*c83a76b0SSuyog Pawar     UWORD8 best_mode;
209*c83a76b0SSuyog Pawar 
210*c83a76b0SSuyog Pawar     WORD32 best_satd;
211*c83a76b0SSuyog Pawar 
212*c83a76b0SSuyog Pawar     WORD32 best_cost;
213*c83a76b0SSuyog Pawar 
214*c83a76b0SSuyog Pawar     /**
215*c83a76b0SSuyog Pawar      * Number of pixels available in these neighbors
216*c83a76b0SSuyog Pawar      */
217*c83a76b0SSuyog Pawar     UWORD8 u1_num_left_avail;
218*c83a76b0SSuyog Pawar 
219*c83a76b0SSuyog Pawar     UWORD8 u1_num_top_avail;
220*c83a76b0SSuyog Pawar 
221*c83a76b0SSuyog Pawar     UWORD8 u1_num_top_right_avail;
222*c83a76b0SSuyog Pawar 
223*c83a76b0SSuyog Pawar     UWORD8 u1_num_bottom_left_avail;
224*c83a76b0SSuyog Pawar 
225*c83a76b0SSuyog Pawar     UWORD8 au1_best_mode_1tu[NUM_BEST_MODES];
226*c83a76b0SSuyog Pawar 
227*c83a76b0SSuyog Pawar     WORD32 au4_best_cost_1tu[NUM_BEST_MODES];
228*c83a76b0SSuyog Pawar 
229*c83a76b0SSuyog Pawar     UWORD8 au1_best_mode_4tu[NUM_BEST_MODES];
230*c83a76b0SSuyog Pawar 
231*c83a76b0SSuyog Pawar     WORD32 au4_best_cost_4tu[NUM_BEST_MODES];
232*c83a76b0SSuyog Pawar 
233*c83a76b0SSuyog Pawar     ihevce_ipe_cu_tree_t *ps_parent;
234*c83a76b0SSuyog Pawar 
235*c83a76b0SSuyog Pawar     ihevce_ipe_cu_tree_t *ps_sub_cu[4];
236*c83a76b0SSuyog Pawar 
237*c83a76b0SSuyog Pawar     /* best mode bits cost */
238*c83a76b0SSuyog Pawar     UWORD16 u2_mode_bits_cost;
239*c83a76b0SSuyog Pawar 
240*c83a76b0SSuyog Pawar } ihevce_ipe_cu_tree_node_t;
241*c83a76b0SSuyog Pawar 
242*c83a76b0SSuyog Pawar /**
243*c83a76b0SSuyog Pawar ******************************************************************************
244*c83a76b0SSuyog Pawar  *  @brief    IPE module context memory
245*c83a76b0SSuyog Pawar ******************************************************************************
246*c83a76b0SSuyog Pawar  */
247*c83a76b0SSuyog Pawar typedef struct
248*c83a76b0SSuyog Pawar {
249*c83a76b0SSuyog Pawar     ihevce_ipe_cu_tree_t *ps_ipe_cu_tree;
250*c83a76b0SSuyog Pawar 
251*c83a76b0SSuyog Pawar     /* one parent and four children */
252*c83a76b0SSuyog Pawar     ihevce_ipe_cu_tree_t as_ipe_cu_tree[5];
253*c83a76b0SSuyog Pawar 
254*c83a76b0SSuyog Pawar     UWORD8 au1_ctb_mode_map[MAX_TU_ROW_IN_CTB + 1][MAX_TU_COL_IN_CTB + 1];
255*c83a76b0SSuyog Pawar 
256*c83a76b0SSuyog Pawar     UWORD8 au1_cand_mode_list[3];
257*c83a76b0SSuyog Pawar 
258*c83a76b0SSuyog Pawar     /** Pointer to structure containing function pointers of common*/
259*c83a76b0SSuyog Pawar     func_selector_t *ps_func_selector;
260*c83a76b0SSuyog Pawar 
261*c83a76b0SSuyog Pawar     /**
262*c83a76b0SSuyog Pawar      * CU level Qp / 6
263*c83a76b0SSuyog Pawar      */
264*c83a76b0SSuyog Pawar     WORD32 i4_cu_qp_div6;
265*c83a76b0SSuyog Pawar 
266*c83a76b0SSuyog Pawar     /**
267*c83a76b0SSuyog Pawar      * CU level Qp % 6
268*c83a76b0SSuyog Pawar      */
269*c83a76b0SSuyog Pawar     WORD32 i4_cu_qp_mod6;
270*c83a76b0SSuyog Pawar 
271*c83a76b0SSuyog Pawar     /** array of luma intra prediction function pointers */
272*c83a76b0SSuyog Pawar     pf_ipe_intra_pred apf_ipe_lum_ip[NUM_IPE_FUNCS];
273*c83a76b0SSuyog Pawar 
274*c83a76b0SSuyog Pawar     /** array of function pointers for residual and
275*c83a76b0SSuyog Pawar      *  forward transform for all transform sizes
276*c83a76b0SSuyog Pawar      */
277*c83a76b0SSuyog Pawar     pf_res_trans_luma apf_resd_trns[NUM_TRANS_TYPES];
278*c83a76b0SSuyog Pawar 
279*c83a76b0SSuyog Pawar     /** array of function pointers for residual and
280*c83a76b0SSuyog Pawar      *  forward transform for all transform sizes
281*c83a76b0SSuyog Pawar      */
282*c83a76b0SSuyog Pawar     pf_res_trans_luma_had apf_resd_trns_had[NUM_TRANS_TYPES];
283*c83a76b0SSuyog Pawar 
284*c83a76b0SSuyog Pawar     /** array of pointer to store the scaling matrices for
285*c83a76b0SSuyog Pawar      *  all transform sizes and qp % 6 (pre computed)
286*c83a76b0SSuyog Pawar      */
287*c83a76b0SSuyog Pawar     WORD16 *api2_scal_mat[NUM_TRANS_TYPES * 2];
288*c83a76b0SSuyog Pawar 
289*c83a76b0SSuyog Pawar     /** array of pointer to store the re-scaling matrices for
290*c83a76b0SSuyog Pawar      *  all transform sizes and qp % 6 (pre computed)
291*c83a76b0SSuyog Pawar      */
292*c83a76b0SSuyog Pawar     WORD16 *api2_rescal_mat[NUM_TRANS_TYPES * 2];
293*c83a76b0SSuyog Pawar 
294*c83a76b0SSuyog Pawar     /** Qunatization rounding factor for inter and intra CUs */
295*c83a76b0SSuyog Pawar     WORD32 i4_quant_rnd_factor[2];
296*c83a76b0SSuyog Pawar 
297*c83a76b0SSuyog Pawar     UWORD8 u1_ctb_size;
298*c83a76b0SSuyog Pawar 
299*c83a76b0SSuyog Pawar     UWORD8 u1_min_cu_size;
300*c83a76b0SSuyog Pawar 
301*c83a76b0SSuyog Pawar     UWORD8 u1_min_tu_size;
302*c83a76b0SSuyog Pawar 
303*c83a76b0SSuyog Pawar     UWORD16 u2_ctb_row_num;
304*c83a76b0SSuyog Pawar 
305*c83a76b0SSuyog Pawar     UWORD16 u2_ctb_num_in_row;
306*c83a76b0SSuyog Pawar 
307*c83a76b0SSuyog Pawar     WORD8 i1_QP;
308*c83a76b0SSuyog Pawar 
309*c83a76b0SSuyog Pawar     UWORD8 u1_num_b_frames;
310*c83a76b0SSuyog Pawar 
311*c83a76b0SSuyog Pawar     UWORD8 b_sad_type;
312*c83a76b0SSuyog Pawar 
313*c83a76b0SSuyog Pawar     UWORD8 u1_ipe_step_size;
314*c83a76b0SSuyog Pawar 
315*c83a76b0SSuyog Pawar     WORD32 i4_ol_satd_lambda;
316*c83a76b0SSuyog Pawar 
317*c83a76b0SSuyog Pawar     WORD32 i4_ol_sad_lambda;
318*c83a76b0SSuyog Pawar 
319*c83a76b0SSuyog Pawar     UWORD8 au1_nbr_ctb_map[MAX_PU_IN_CTB_ROW + 1 + 8][MAX_PU_IN_CTB_ROW + 1 + 8];
320*c83a76b0SSuyog Pawar 
321*c83a76b0SSuyog Pawar     /**
322*c83a76b0SSuyog Pawar      * Pointer to (1,1) location in au1_nbr_ctb_map
323*c83a76b0SSuyog Pawar      */
324*c83a76b0SSuyog Pawar     UWORD8 *pu1_ctb_nbr_map;
325*c83a76b0SSuyog Pawar 
326*c83a76b0SSuyog Pawar     /**
327*c83a76b0SSuyog Pawar      * neigbour map buffer stride;
328*c83a76b0SSuyog Pawar      */
329*c83a76b0SSuyog Pawar     WORD32 i4_nbr_map_strd;
330*c83a76b0SSuyog Pawar 
331*c83a76b0SSuyog Pawar     /** CTB neighbour availability flags */
332*c83a76b0SSuyog Pawar     nbr_avail_flags_t s_ctb_nbr_avail_flags;
333*c83a76b0SSuyog Pawar 
334*c83a76b0SSuyog Pawar     /** Slice Type of the current picture being processed */
335*c83a76b0SSuyog Pawar     WORD32 i4_slice_type;
336*c83a76b0SSuyog Pawar 
337*c83a76b0SSuyog Pawar     /** Temporal ID of the current picture being processed */
338*c83a76b0SSuyog Pawar     WORD32 i4_temporal_lyr_id;
339*c83a76b0SSuyog Pawar 
340*c83a76b0SSuyog Pawar     WORD32 i4_ol_sad_lambda_qf_array[MAX_HEVC_QP_10bit + 1];
341*c83a76b0SSuyog Pawar     WORD32 i4_ol_satd_lambda_qf_array[MAX_HEVC_QP_10bit + 1];
342*c83a76b0SSuyog Pawar 
343*c83a76b0SSuyog Pawar     /************************************************************************/
344*c83a76b0SSuyog Pawar     /* The fields with the string 'type2' in their names are required */
345*c83a76b0SSuyog Pawar     /* when both 8bit and hbd lambdas are needed. The lambdas corresponding */
346*c83a76b0SSuyog Pawar     /* to the bit_depth != internal_bit_depth are stored in these fields */
347*c83a76b0SSuyog Pawar     /************************************************************************/
348*c83a76b0SSuyog Pawar     WORD32 i4_ol_sad_type2_lambda_qf_array[MAX_HEVC_QP_10bit + 1];
349*c83a76b0SSuyog Pawar     WORD32 i4_ol_satd_type2_lambda_qf_array[MAX_HEVC_QP_10bit + 1];
350*c83a76b0SSuyog Pawar 
351*c83a76b0SSuyog Pawar     /*Store the HEVC frame level qp for level modulation*/
352*c83a76b0SSuyog Pawar     WORD32 i4_hevc_qp;
353*c83a76b0SSuyog Pawar     /*Store the frame level qscale for level modulation*/
354*c83a76b0SSuyog Pawar     WORD32 i4_qscale;
355*c83a76b0SSuyog Pawar #if POW_OPT
356*c83a76b0SSuyog Pawar     /* Averge activity of 8x8 blocks from previous frame
357*c83a76b0SSuyog Pawar     *  If L1, maps to 16*16 in L0
358*c83a76b0SSuyog Pawar     */
359*c83a76b0SSuyog Pawar     long double ld_curr_frame_8x8_log_avg[2];
360*c83a76b0SSuyog Pawar 
361*c83a76b0SSuyog Pawar     /* Averge activity of 16x16 blocks from previous frame
362*c83a76b0SSuyog Pawar     *  If L1, maps to 32*32 in L0
363*c83a76b0SSuyog Pawar     */
364*c83a76b0SSuyog Pawar     long double ld_curr_frame_16x16_log_avg[3];
365*c83a76b0SSuyog Pawar 
366*c83a76b0SSuyog Pawar     /* Averge activity of 32x32 blocks from previous frame
367*c83a76b0SSuyog Pawar     *  If L1, maps to 64*64 in L0
368*c83a76b0SSuyog Pawar     */
369*c83a76b0SSuyog Pawar     long double ld_curr_frame_32x32_log_avg[3];
370*c83a76b0SSuyog Pawar #else
371*c83a76b0SSuyog Pawar     /* Averge activity of 8x8 blocks from previous frame
372*c83a76b0SSuyog Pawar     *  If L1, maps to 16*16 in L0
373*c83a76b0SSuyog Pawar     */
374*c83a76b0SSuyog Pawar     LWORD64 i8_curr_frame_8x8_avg_act[2];
375*c83a76b0SSuyog Pawar 
376*c83a76b0SSuyog Pawar     /* Averge activity of 16x16 blocks from previous frame
377*c83a76b0SSuyog Pawar     *  If L1, maps to 32*32 in L0
378*c83a76b0SSuyog Pawar     */
379*c83a76b0SSuyog Pawar     LWORD64 i8_curr_frame_16x16_avg_act[3];
380*c83a76b0SSuyog Pawar 
381*c83a76b0SSuyog Pawar     /* Averge activity of 32x32 blocks from previous frame
382*c83a76b0SSuyog Pawar     *  If L1, maps to 64*64 in L0
383*c83a76b0SSuyog Pawar     */
384*c83a76b0SSuyog Pawar     LWORD64 i8_curr_frame_32x32_avg_act[3];
385*c83a76b0SSuyog Pawar #endif
386*c83a76b0SSuyog Pawar     /** Frame-levelSATD cost accumalator */
387*c83a76b0SSuyog Pawar     LWORD64 i8_frame_acc_satd_cost;
388*c83a76b0SSuyog Pawar 
389*c83a76b0SSuyog Pawar     /** Frame-levelSATD accumalator */
390*c83a76b0SSuyog Pawar     LWORD64 i8_frame_acc_satd;
391*c83a76b0SSuyog Pawar 
392*c83a76b0SSuyog Pawar     /** Frame-level activity factor for CU 8x8 accumalator */
393*c83a76b0SSuyog Pawar     LWORD64 i8_frame_acc_act_factor;
394*c83a76b0SSuyog Pawar 
395*c83a76b0SSuyog Pawar     /** Frame-level Mode Bits cost accumalator */
396*c83a76b0SSuyog Pawar     LWORD64 i8_frame_acc_mode_bits_cost;
397*c83a76b0SSuyog Pawar 
398*c83a76b0SSuyog Pawar     /** Encoder quality preset : See IHEVCE_QUALITY_CONFIG_T for presets */
399*c83a76b0SSuyog Pawar     WORD32 i4_quality_preset;
400*c83a76b0SSuyog Pawar 
401*c83a76b0SSuyog Pawar     /** Frame-level SATD/qp accumulator in q10 format*/
402*c83a76b0SSuyog Pawar     LWORD64 i8_frame_acc_satd_by_modqp_q10;
403*c83a76b0SSuyog Pawar 
404*c83a76b0SSuyog Pawar     /** For testing EIID only. */
405*c83a76b0SSuyog Pawar     UWORD32 u4_num_16x16_skips_at_L0_IPE;
406*c83a76b0SSuyog Pawar 
407*c83a76b0SSuyog Pawar     /** Reference sample array. Used as local variable in mode_eval_filtering  */
408*c83a76b0SSuyog Pawar     UWORD8 au1_ref_samples[1028];
409*c83a76b0SSuyog Pawar     /** filtered reference sample array. Used as local variable in mode_eval_filtering */
410*c83a76b0SSuyog Pawar     UWORD8 au1_filt_ref_samples[1028];
411*c83a76b0SSuyog Pawar     /** array for the modes to be evaluated. Used as local variable in mode_eval_filtering */
412*c83a76b0SSuyog Pawar     UWORD8 au1_modes_to_eval[MAX_NUM_IP_MODES];
413*c83a76b0SSuyog Pawar     /** temp array for the modes to be evaluated. Used as local variable in mode_eval_filtering */
414*c83a76b0SSuyog Pawar     UWORD8 au1_modes_to_eval_temp[MAX_NUM_IP_MODES];
415*c83a76b0SSuyog Pawar     /** pred samples array. Used as local variable in mode_eval_filtering */
416*c83a76b0SSuyog Pawar     MEM_ALIGN32 UWORD8 au1_pred_samples[4096];
417*c83a76b0SSuyog Pawar     /** array for storing satd cost. Used as local variable in mode_eval_filtering*/
418*c83a76b0SSuyog Pawar     UWORD16 au2_mode_bits_satd_cost[MAX_NUM_IP_MODES];
419*c83a76b0SSuyog Pawar     /** array for storing satd values. used as local variable in mode_eval_filtering */
420*c83a76b0SSuyog Pawar     UWORD16 au2_mode_bits_satd[MAX_NUM_IP_MODES];
421*c83a76b0SSuyog Pawar 
422*c83a76b0SSuyog Pawar     /** reference data, local for pu_calc_8x8 */
423*c83a76b0SSuyog Pawar     UWORD8 au1_ref_8x8pu[4][18];
424*c83a76b0SSuyog Pawar     /** mode_bits_cost, local for pu_calc_8x8 */
425*c83a76b0SSuyog Pawar     UWORD16 au2_mode_bits_cost_8x8pu[4][MAX_NUM_IP_MODES];
426*c83a76b0SSuyog Pawar     /** mode_bits, local for pu_calc_8x8 */
427*c83a76b0SSuyog Pawar     UWORD16 au2_mode_bits_8x8_pu[MAX_NUM_IP_MODES];
428*c83a76b0SSuyog Pawar 
429*c83a76b0SSuyog Pawar     /** tranform coeff temp, local to ihevce_pu_calc_4x4_blk */
430*c83a76b0SSuyog Pawar     WORD16 *pi2_trans_tmp;  //this memory is overlayed with au1_pred_samples[4096]. First half.
431*c83a76b0SSuyog Pawar 
432*c83a76b0SSuyog Pawar     /** tranform coeff out, local to ihevce_pu_calc_4x4_blk */
433*c83a76b0SSuyog Pawar     WORD16 *pi2_trans_out;  //this memory is overlayed with au1_pred_samples[4096]. Second half.
434*c83a76b0SSuyog Pawar 
435*c83a76b0SSuyog Pawar     UWORD8 u1_use_lambda_derived_from_min_8x8_act_in_ctb;
436*c83a76b0SSuyog Pawar 
437*c83a76b0SSuyog Pawar     UWORD8 u1_bit_depth;
438*c83a76b0SSuyog Pawar 
439*c83a76b0SSuyog Pawar     rc_quant_t *ps_rc_quant_ctxt;
440*c83a76b0SSuyog Pawar     /** Flag that specifies whether to use SATD or SAD in L0 IPE */
441*c83a76b0SSuyog Pawar     UWORD8 u1_use_satd;
442*c83a76b0SSuyog Pawar 
443*c83a76b0SSuyog Pawar     /** Flag that specifies level of refinement */
444*c83a76b0SSuyog Pawar     UWORD8 u1_level_1_refine_on;
445*c83a76b0SSuyog Pawar 
446*c83a76b0SSuyog Pawar     /** Flag indicates that child mode decision is disabled in L0 IPE recur bracketing */
447*c83a76b0SSuyog Pawar     UWORD8 u1_disable_child_cu_decide;
448*c83a76b0SSuyog Pawar 
449*c83a76b0SSuyog Pawar     /*Modulation factor*/
450*c83a76b0SSuyog Pawar     WORD32 ai4_mod_factor_derived_by_variance[2];
451*c83a76b0SSuyog Pawar     float f_strength;
452*c83a76b0SSuyog Pawar     WORD32 i4_l0ipe_qp_mod;
453*c83a76b0SSuyog Pawar 
454*c83a76b0SSuyog Pawar     WORD32 i4_frm_qp;
455*c83a76b0SSuyog Pawar     WORD32 i4_temporal_layer;
456*c83a76b0SSuyog Pawar     WORD32 i4_pass;
457*c83a76b0SSuyog Pawar 
458*c83a76b0SSuyog Pawar     double f_i_pic_lamda_modifier;
459*c83a76b0SSuyog Pawar     WORD32 i4_use_const_lamda_modifier;
460*c83a76b0SSuyog Pawar     WORD32 i4_is_ref_pic;
461*c83a76b0SSuyog Pawar     LWORD64 i8_curr_frame_avg_mean_act;
462*c83a76b0SSuyog Pawar     WORD32 i4_enable_noise_detection;
463*c83a76b0SSuyog Pawar 
464*c83a76b0SSuyog Pawar     ihevce_ipe_optimised_function_list_t s_ipe_optimised_function_list;
465*c83a76b0SSuyog Pawar 
466*c83a76b0SSuyog Pawar     ihevce_cmn_opt_func_t s_cmn_opt_func;
467*c83a76b0SSuyog Pawar 
468*c83a76b0SSuyog Pawar } ihevce_ipe_ctxt_t;
469*c83a76b0SSuyog Pawar 
470*c83a76b0SSuyog Pawar /**
471*c83a76b0SSuyog Pawar ******************************************************************************
472*c83a76b0SSuyog Pawar  *  @brief    IPE module overall context
473*c83a76b0SSuyog Pawar ******************************************************************************
474*c83a76b0SSuyog Pawar  */
475*c83a76b0SSuyog Pawar typedef struct
476*c83a76b0SSuyog Pawar {
477*c83a76b0SSuyog Pawar     /*array of ipe ctxt */
478*c83a76b0SSuyog Pawar     ihevce_ipe_ctxt_t *aps_ipe_thrd_ctxt[MAX_NUM_FRM_PROC_THRDS_PRE_ENC];
479*c83a76b0SSuyog Pawar 
480*c83a76b0SSuyog Pawar     /** Number of processing threads created run time */
481*c83a76b0SSuyog Pawar     WORD32 i4_num_proc_thrds;
482*c83a76b0SSuyog Pawar 
483*c83a76b0SSuyog Pawar } ihevce_ipe_master_ctxt_t;
484*c83a76b0SSuyog Pawar 
485*c83a76b0SSuyog Pawar /*****************************************************************************/
486*c83a76b0SSuyog Pawar /* Extern Variable Declarations                                              */
487*c83a76b0SSuyog Pawar /*****************************************************************************/
488*c83a76b0SSuyog Pawar 
489*c83a76b0SSuyog Pawar /*****************************************************************************/
490*c83a76b0SSuyog Pawar /* Extern Function Declarations                                              */
491*c83a76b0SSuyog Pawar /*****************************************************************************/
492*c83a76b0SSuyog Pawar void ihevce_ipe_analyse_update_cost(
493*c83a76b0SSuyog Pawar     ihevce_ipe_cu_tree_t *ps_cu_node, UWORD8 u1_mode, DOUBLE lf_cost);
494*c83a76b0SSuyog Pawar #endif /* _IHEVCE_IPE_STRUCTS_H_ */
495