xref: /aosp_15_r20/external/libhevc/encoder/ihevce_enc_loop_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_enc_loop_structs.h
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar *    This file contains strcutures of enc_loop 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_ENC_LOOP_STRUCTS_H_
37*c83a76b0SSuyog Pawar #define _IHEVCE_ENC_LOOP_STRUCTS_H_
38*c83a76b0SSuyog Pawar 
39*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
40*c83a76b0SSuyog Pawar 
41*c83a76b0SSuyog Pawar extern UWORD16 gau2_ihevce_cabac_bin_to_bits[64 * 2];
42*c83a76b0SSuyog Pawar 
43*c83a76b0SSuyog Pawar /*****************************************************************************/
44*c83a76b0SSuyog Pawar /* Constant Macros                                                           */
45*c83a76b0SSuyog Pawar /*****************************************************************************/
46*c83a76b0SSuyog Pawar /** /breif 4x4 DST, 4x4, 8x8, 16x16, 32x32 */
47*c83a76b0SSuyog Pawar #define NUM_TRANS_TYPES 5
48*c83a76b0SSuyog Pawar #define INTRA_PLANAR 0
49*c83a76b0SSuyog Pawar #define INTRA_DC 1
50*c83a76b0SSuyog Pawar #define NUM_POSSIBLE_TU_SIZES_CHR_INTRA_SATD 2
51*c83a76b0SSuyog Pawar #define MAX_TU_IN_TU_EQ_DIV_2 4
52*c83a76b0SSuyog Pawar #define MAX_MVP_LIST_CAND 2
53*c83a76b0SSuyog Pawar #define MAX_COST 0x7ffffff
54*c83a76b0SSuyog Pawar #define MAX_COST_64 0x7ffffffffffffff
55*c83a76b0SSuyog Pawar #define NUM_32CU_AND_64CU_IN_CTB 5 /* 4 - 32x32 + 1 64x64*/
56*c83a76b0SSuyog Pawar #define PING_PONG 2
57*c83a76b0SSuyog Pawar #define MAX_SAO_RD_CAND 10
58*c83a76b0SSuyog Pawar #define SCRATCH_BUF_STRIDE 80
59*c83a76b0SSuyog Pawar 
60*c83a76b0SSuyog Pawar /*****************************************************************************/
61*c83a76b0SSuyog Pawar /* Function Macros                                                           */
62*c83a76b0SSuyog Pawar /*****************************************************************************/
63*c83a76b0SSuyog Pawar #define INTRA_ANGULAR(x) (x)
64*c83a76b0SSuyog Pawar 
65*c83a76b0SSuyog Pawar /** @breif max 30bit value */
66*c83a76b0SSuyog Pawar #define MAX30 ((1 << 30) - 1)
67*c83a76b0SSuyog Pawar 
68*c83a76b0SSuyog Pawar /* @brief macro to clip a data to max of 30bits (assuming unsgined) */
69*c83a76b0SSuyog Pawar #define CLIP30(x) ((x) > MAX30 ? MAX30 : (x))
70*c83a76b0SSuyog Pawar 
71*c83a76b0SSuyog Pawar /* @brief compute the (lambda * rate) with a qshift and clip result to 30bits */
72*c83a76b0SSuyog Pawar #define COMPUTE_RATE_COST_CLIP30(r, l, qshift) ((WORD32)CLIP30((ULWORD64)((r) * (l)) >> (qshift)))
73*c83a76b0SSuyog Pawar 
74*c83a76b0SSuyog Pawar #define IHEVCE_INV_WT_PRED(inp, wt, off, shift)                                                    \
75*c83a76b0SSuyog Pawar     (((((inp) - (off)) << (shift)) * wt + (1 << 14)) >> 15)
76*c83a76b0SSuyog Pawar 
77*c83a76b0SSuyog Pawar #define POPULATE_PU_STRUCT(ps_pu, mvx, mvy, offset_x, offset_y, wd, ht, ref_idx, pred_lx)          \
78*c83a76b0SSuyog Pawar     {                                                                                              \
79*c83a76b0SSuyog Pawar         (ps_pu)->b4_pos_x = (offset_x) >> 2;                                                       \
80*c83a76b0SSuyog Pawar         (ps_pu)->b4_pos_y = (offset_y) >> 2;                                                       \
81*c83a76b0SSuyog Pawar         (ps_pu)->b4_wd = ((wd) >> 2) - 1;                                                          \
82*c83a76b0SSuyog Pawar         (ps_pu)->b4_ht = ((ht) >> 2) - 1;                                                          \
83*c83a76b0SSuyog Pawar         (ps_pu)->b1_intra_flag = 0;                                                                \
84*c83a76b0SSuyog Pawar         (ps_pu)->b2_pred_mode = pred_lx;                                                           \
85*c83a76b0SSuyog Pawar         if(pred_lx)                                                                                \
86*c83a76b0SSuyog Pawar         {                                                                                          \
87*c83a76b0SSuyog Pawar             (ps_pu)->mv.i1_l0_ref_idx = -1;                                                        \
88*c83a76b0SSuyog Pawar             (ps_pu)->mv.i1_l1_ref_idx = ref_idx;                                                   \
89*c83a76b0SSuyog Pawar             (ps_pu)->mv.s_l1_mv.i2_mvx = mvx;                                                      \
90*c83a76b0SSuyog Pawar             (ps_pu)->mv.s_l1_mv.i2_mvy = mvy;                                                      \
91*c83a76b0SSuyog Pawar         }                                                                                          \
92*c83a76b0SSuyog Pawar         else                                                                                       \
93*c83a76b0SSuyog Pawar         {                                                                                          \
94*c83a76b0SSuyog Pawar             (ps_pu)->mv.i1_l0_ref_idx = ref_idx;                                                   \
95*c83a76b0SSuyog Pawar             (ps_pu)->mv.i1_l1_ref_idx = -1;                                                        \
96*c83a76b0SSuyog Pawar             (ps_pu)->mv.s_l0_mv.i2_mvx = mvx;                                                      \
97*c83a76b0SSuyog Pawar             (ps_pu)->mv.s_l0_mv.i2_mvy = mvy;                                                      \
98*c83a76b0SSuyog Pawar         }                                                                                          \
99*c83a76b0SSuyog Pawar     }
100*c83a76b0SSuyog Pawar 
101*c83a76b0SSuyog Pawar #define GET_FRAME_QSTEP_FROM_QP(frame_qp, frame_qstep)                                             \
102*c83a76b0SSuyog Pawar     {                                                                                              \
103*c83a76b0SSuyog Pawar         double q_steps[6] = { 0.625, 0.703, 0.79, 0.889, 1.0, 1.125 };                             \
104*c83a76b0SSuyog Pawar                                                                                                    \
105*c83a76b0SSuyog Pawar         frame_qstep = (WORD32)((1 << ((frame_qp) / 6)) * q_steps[(frame_qp) % 6]);                 \
106*c83a76b0SSuyog Pawar     }
107*c83a76b0SSuyog Pawar 
108*c83a76b0SSuyog Pawar #define INITIALISE_MERGE_RESULT_STRUCT(ps_merge_data, pas_pu_results)                              \
109*c83a76b0SSuyog Pawar     {                                                                                              \
110*c83a76b0SSuyog Pawar         WORD32 i, j, k;                                                                            \
111*c83a76b0SSuyog Pawar                                                                                                    \
112*c83a76b0SSuyog Pawar         for(i = 0; i < TOT_NUM_PARTS; i++)                                                         \
113*c83a76b0SSuyog Pawar         {                                                                                          \
114*c83a76b0SSuyog Pawar             (ps_merge_data)->s_pu_results.u1_num_results_per_part_l0[i] = 0;                       \
115*c83a76b0SSuyog Pawar             (ps_merge_data)->s_pu_results.u1_num_results_per_part_l1[i] = 0;                       \
116*c83a76b0SSuyog Pawar         }                                                                                          \
117*c83a76b0SSuyog Pawar         for(i = 0; i < 2; i++)                                                                     \
118*c83a76b0SSuyog Pawar         {                                                                                          \
119*c83a76b0SSuyog Pawar             for(j = 0; j < TOT_NUM_PARTS; j++)                                                     \
120*c83a76b0SSuyog Pawar             {                                                                                      \
121*c83a76b0SSuyog Pawar                 (ps_merge_data)->s_pu_results.aps_pu_results[i][j] = pas_pu_results[i][j];         \
122*c83a76b0SSuyog Pawar                 for(k = 0; k < MAX_NUM_RESULTS_PER_PART_LIST; k++)                                 \
123*c83a76b0SSuyog Pawar                 {                                                                                  \
124*c83a76b0SSuyog Pawar                     pas_pu_results[i][j][k].i4_tot_cost = MAX_COST;                                \
125*c83a76b0SSuyog Pawar                     pas_pu_results[i][j][k].pu.mv.i1_l0_ref_idx = -1;                              \
126*c83a76b0SSuyog Pawar                     pas_pu_results[i][j][k].pu.mv.i1_l1_ref_idx = -1;                              \
127*c83a76b0SSuyog Pawar                 }                                                                                  \
128*c83a76b0SSuyog Pawar             }                                                                                      \
129*c83a76b0SSuyog Pawar         }                                                                                          \
130*c83a76b0SSuyog Pawar     }
131*c83a76b0SSuyog Pawar 
132*c83a76b0SSuyog Pawar #define POPULATE_CTB_PARAMS                                                                        \
133*c83a76b0SSuyog Pawar     (ps_common_frm_prms,                                                                           \
134*c83a76b0SSuyog Pawar      apu1_wt_inp,                                                                                  \
135*c83a76b0SSuyog Pawar      i4_ctb_x_off,                                                                                 \
136*c83a76b0SSuyog Pawar      i4_ctb_y_off,                                                                                 \
137*c83a76b0SSuyog Pawar      ppu1_pred,                                                                                    \
138*c83a76b0SSuyog Pawar      cu_size,                                                                                      \
139*c83a76b0SSuyog Pawar      ref_stride,                                                                                   \
140*c83a76b0SSuyog Pawar      bidir_enabled,                                                                                \
141*c83a76b0SSuyog Pawar      num_refs,                                                                                     \
142*c83a76b0SSuyog Pawar      pps_rec_list_l0,                                                                              \
143*c83a76b0SSuyog Pawar      pps_rec_list_l1,                                                                              \
144*c83a76b0SSuyog Pawar      pu1_non_wt_inp,                                                                               \
145*c83a76b0SSuyog Pawar      lambda,                                                                                       \
146*c83a76b0SSuyog Pawar      lambda_q_shift,                                                                               \
147*c83a76b0SSuyog Pawar      wpred_log_wdc)                                                                                \
148*c83a76b0SSuyog Pawar     {                                                                                              \
149*c83a76b0SSuyog Pawar         WORD32 i, j;                                                                               \
150*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->i4_bidir_enabled = bidir_enabled;                                    \
151*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->i4_ctb_x_off = i4_ctb_x_off;                                         \
152*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->i4_ctb_y_off = i4_ctb_y_off;                                         \
153*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->i4_inp_stride = cu_size;                                             \
154*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->i4_lamda = lambda;                                                   \
155*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->i4_pred_stride = cu_size;                                            \
156*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->i4_rec_stride = ref_stride;                                          \
157*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->pps_rec_list_l0 = pps_rec_list_l0;                                   \
158*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->pps_rec_list_l1 = pps_rec_list_l1;                                   \
159*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->ppu1_pred = ppu1_pred;                                               \
160*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->pu1_non_wt_inp = pu1_non_wt_inp;                                     \
161*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->pu1_wkg_mem = NULL;                                                  \
162*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->u1_lamda_qshift = lambda_q_shift;                                    \
163*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->u1_num_ref = num_refs;                                               \
164*c83a76b0SSuyog Pawar         (ps_common_frm_prms)->wpred_log_wdc = wpred_log_wdc;                                       \
165*c83a76b0SSuyog Pawar         for(i = 0; i < 2; i++)                                                                     \
166*c83a76b0SSuyog Pawar         {                                                                                          \
167*c83a76b0SSuyog Pawar             for(j = 0; j < MAX_NUM_REF; j++)                                                       \
168*c83a76b0SSuyog Pawar             {                                                                                      \
169*c83a76b0SSuyog Pawar                 (ps_common_frm_prms)->apu1_wt_inp = (apu1_wt_inp)[i][j];                           \
170*c83a76b0SSuyog Pawar             }                                                                                      \
171*c83a76b0SSuyog Pawar         }                                                                                          \
172*c83a76b0SSuyog Pawar     }
173*c83a76b0SSuyog Pawar 
174*c83a76b0SSuyog Pawar #define COMPUTE_MERGE_IDX_COST(merge_idx_0_model, merge_idx, max_merge_cand, lambda, cost)         \
175*c83a76b0SSuyog Pawar     {                                                                                              \
176*c83a76b0SSuyog Pawar         WORD32 cab_bits_q12 = 0;                                                                   \
177*c83a76b0SSuyog Pawar                                                                                                    \
178*c83a76b0SSuyog Pawar         /* sanity checks */                                                                        \
179*c83a76b0SSuyog Pawar         ASSERT((merge_idx >= 0) && (merge_idx < max_merge_cand));                                  \
180*c83a76b0SSuyog Pawar                                                                                                    \
181*c83a76b0SSuyog Pawar         /* encode the merge idx only if required */                                                \
182*c83a76b0SSuyog Pawar         if(max_merge_cand > 1)                                                                     \
183*c83a76b0SSuyog Pawar         {                                                                                          \
184*c83a76b0SSuyog Pawar             WORD32 bin = (merge_idx > 0);                                                          \
185*c83a76b0SSuyog Pawar                                                                                                    \
186*c83a76b0SSuyog Pawar             /* bits for the context modelled first bin */                                          \
187*c83a76b0SSuyog Pawar             cab_bits_q12 += gau2_ihevce_cabac_bin_to_bits[merge_idx_0_model ^ bin];                \
188*c83a76b0SSuyog Pawar                                                                                                    \
189*c83a76b0SSuyog Pawar             /* bits for larged merge idx coded as bypass tunary */                                 \
190*c83a76b0SSuyog Pawar             if((max_merge_cand > 2) && (merge_idx > 0))                                            \
191*c83a76b0SSuyog Pawar             {                                                                                      \
192*c83a76b0SSuyog Pawar                 cab_bits_q12 += (MIN(merge_idx, (max_merge_cand - 2))) << CABAC_FRAC_BITS_Q;       \
193*c83a76b0SSuyog Pawar             }                                                                                      \
194*c83a76b0SSuyog Pawar                                                                                                    \
195*c83a76b0SSuyog Pawar             cost = COMPUTE_RATE_COST_CLIP30(                                                       \
196*c83a76b0SSuyog Pawar                 cab_bits_q12, lambda, (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q));                       \
197*c83a76b0SSuyog Pawar         }                                                                                          \
198*c83a76b0SSuyog Pawar         else                                                                                       \
199*c83a76b0SSuyog Pawar         {                                                                                          \
200*c83a76b0SSuyog Pawar             cost = 0;                                                                              \
201*c83a76b0SSuyog Pawar         }                                                                                          \
202*c83a76b0SSuyog Pawar     }
203*c83a76b0SSuyog Pawar 
204*c83a76b0SSuyog Pawar /*****************************************************************************/
205*c83a76b0SSuyog Pawar /* Typedefs                                                                  */
206*c83a76b0SSuyog Pawar /*****************************************************************************/
207*c83a76b0SSuyog Pawar 
208*c83a76b0SSuyog Pawar typedef FT_CALC_HAD_SATD_8BIT *pf_res_trans_luma_had_chroma;
209*c83a76b0SSuyog Pawar 
210*c83a76b0SSuyog Pawar /** \breif function pointer prototype for residue and transform enc_loop */
211*c83a76b0SSuyog Pawar typedef UWORD32 (*pf_res_trans_chroma)(
212*c83a76b0SSuyog Pawar     UWORD8 *pu1_src,
213*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred,
214*c83a76b0SSuyog Pawar     WORD32 *pi4_tmp,
215*c83a76b0SSuyog Pawar     WORD16 *pi2_dst,
216*c83a76b0SSuyog Pawar     WORD32 src_strd,
217*c83a76b0SSuyog Pawar     WORD32 pred_strd,
218*c83a76b0SSuyog Pawar     WORD32 dst_strd,
219*c83a76b0SSuyog Pawar     CHROMA_PLANE_ID_T e_chroma_plane);
220*c83a76b0SSuyog Pawar 
221*c83a76b0SSuyog Pawar /** \breif function pointer prototype for quantization and inv Quant for ssd
222*c83a76b0SSuyog Pawar calc. for all transform sizes */
223*c83a76b0SSuyog Pawar typedef WORD32 (*pf_quant_iquant_ssd)(
224*c83a76b0SSuyog Pawar     WORD16 *pi2_coeffs,
225*c83a76b0SSuyog Pawar     WORD16 *pi2_quant_coeff,
226*c83a76b0SSuyog Pawar     WORD16 *pi2_q_dst,
227*c83a76b0SSuyog Pawar     WORD16 *pi2_iq_dst,
228*c83a76b0SSuyog Pawar     WORD32 trans_size,
229*c83a76b0SSuyog Pawar     WORD32 qp_div, /* qpscaled / 6 */
230*c83a76b0SSuyog Pawar     WORD32 qp_rem, /* qpscaled % 6 */
231*c83a76b0SSuyog Pawar     WORD32 q_add,
232*c83a76b0SSuyog Pawar     WORD32 *pi4_quant_round_factor_0_1,
233*c83a76b0SSuyog Pawar     WORD32 *pi4_quant_round_factor_1_2,
234*c83a76b0SSuyog Pawar     WORD32 src_strd,
235*c83a76b0SSuyog Pawar     WORD32 dst_q_strd,
236*c83a76b0SSuyog Pawar     WORD32 dst_iq_strd,
237*c83a76b0SSuyog Pawar     UWORD8 *csbf,
238*c83a76b0SSuyog Pawar     WORD32 csbf_strd,
239*c83a76b0SSuyog Pawar     WORD32 *zero_col,
240*c83a76b0SSuyog Pawar     WORD32 *zero_row,
241*c83a76b0SSuyog Pawar     WORD16 *pi2_dequant_coeff,
242*c83a76b0SSuyog Pawar     LWORD64 *pi8_cost);
243*c83a76b0SSuyog Pawar 
244*c83a76b0SSuyog Pawar /** \breif function pointer prototype for quantization and inv Quant for ssd
245*c83a76b0SSuyog Pawar calc. for all transform sizes (in case of RDOQ + SBH) */
246*c83a76b0SSuyog Pawar typedef WORD32 (*pf_quant_iquant_ssd_sbh)(
247*c83a76b0SSuyog Pawar     WORD16 *pi2_coeffs,
248*c83a76b0SSuyog Pawar     WORD16 *pi2_quant_coeff,
249*c83a76b0SSuyog Pawar     WORD16 *pi2_q_dst,
250*c83a76b0SSuyog Pawar     WORD16 *pi2_iq_dst,
251*c83a76b0SSuyog Pawar     WORD32 trans_size,
252*c83a76b0SSuyog Pawar     WORD32 qp_div, /* qpscaled / 6 */
253*c83a76b0SSuyog Pawar     WORD32 qp_rem, /* qpscaled % 6 */
254*c83a76b0SSuyog Pawar     WORD32 q_add,
255*c83a76b0SSuyog Pawar     WORD32 src_strd,
256*c83a76b0SSuyog Pawar     WORD32 dst_q_strd,
257*c83a76b0SSuyog Pawar     WORD32 dst_iq_strd,
258*c83a76b0SSuyog Pawar     UWORD8 *csbf,
259*c83a76b0SSuyog Pawar     WORD32 csbf_strd,
260*c83a76b0SSuyog Pawar     WORD32 *zero_col,
261*c83a76b0SSuyog Pawar     WORD32 *zero_row,
262*c83a76b0SSuyog Pawar     WORD16 *pi2_dequant_coeff,
263*c83a76b0SSuyog Pawar     WORD32 *pi4_cost,
264*c83a76b0SSuyog Pawar     WORD32 i4_scan_idx,
265*c83a76b0SSuyog Pawar     WORD32 i4_perform_rdoq);
266*c83a76b0SSuyog Pawar 
267*c83a76b0SSuyog Pawar /** \breif function pointer prototype for inverse transform and recon
268*c83a76b0SSuyog Pawar for all transform sizes : Luma */
269*c83a76b0SSuyog Pawar typedef void (*pf_it_recon)(
270*c83a76b0SSuyog Pawar     WORD16 *pi2_src,
271*c83a76b0SSuyog Pawar     WORD16 *pi2_tmp,
272*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred,
273*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst,
274*c83a76b0SSuyog Pawar     WORD32 src_strd,
275*c83a76b0SSuyog Pawar     WORD32 pred_strd,
276*c83a76b0SSuyog Pawar     WORD32 dst_strd,
277*c83a76b0SSuyog Pawar     WORD32 zero_cols,
278*c83a76b0SSuyog Pawar     WORD32 zero_rows);
279*c83a76b0SSuyog Pawar 
280*c83a76b0SSuyog Pawar /** \breif function pointer prototype for inverse transform and recon
281*c83a76b0SSuyog Pawar for all transform sizes : Chroma */
282*c83a76b0SSuyog Pawar typedef void (*pf_it_recon_chroma)(
283*c83a76b0SSuyog Pawar     WORD16 *pi2_src,
284*c83a76b0SSuyog Pawar     WORD16 *pi2_tmp,
285*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred,
286*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst,
287*c83a76b0SSuyog Pawar     WORD32 src_strd,
288*c83a76b0SSuyog Pawar     WORD32 pred_strd,
289*c83a76b0SSuyog Pawar     WORD32 dst_strd,
290*c83a76b0SSuyog Pawar     WORD32 zero_cols,
291*c83a76b0SSuyog Pawar     WORD32 zero_rows);
292*c83a76b0SSuyog Pawar 
293*c83a76b0SSuyog Pawar /** \breif function pointer prototype for luma sao. */
294*c83a76b0SSuyog Pawar typedef void (*pf_sao_luma)(
295*c83a76b0SSuyog Pawar     UWORD8 *pu1_src,
296*c83a76b0SSuyog Pawar     WORD32 src_strd,
297*c83a76b0SSuyog Pawar     UWORD8 *pu1_src_left,
298*c83a76b0SSuyog Pawar     UWORD8 *pu1_src_top,
299*c83a76b0SSuyog Pawar     UWORD8 *pu1_src_top_left,
300*c83a76b0SSuyog Pawar     UWORD8 *pu1_src_top_right,
301*c83a76b0SSuyog Pawar     UWORD8 *pu1_src_bot_left,
302*c83a76b0SSuyog Pawar     UWORD8 *pu1_avail,
303*c83a76b0SSuyog Pawar     WORD8 *pi1_sao_offset,
304*c83a76b0SSuyog Pawar     WORD32 wd,
305*c83a76b0SSuyog Pawar     WORD32 ht);
306*c83a76b0SSuyog Pawar 
307*c83a76b0SSuyog Pawar /** \breif function pointer prototype for chroma sao. */
308*c83a76b0SSuyog Pawar typedef void (*pf_sao_chroma)(
309*c83a76b0SSuyog Pawar     UWORD8 *pu1_src,
310*c83a76b0SSuyog Pawar     WORD32 src_strd,
311*c83a76b0SSuyog Pawar     UWORD8 *pu1_src_left,
312*c83a76b0SSuyog Pawar     UWORD8 *pu1_src_top,
313*c83a76b0SSuyog Pawar     UWORD8 *pu1_src_top_left,
314*c83a76b0SSuyog Pawar     UWORD8 *pu1_src_top_right,
315*c83a76b0SSuyog Pawar     UWORD8 *pu1_src_bot_left,
316*c83a76b0SSuyog Pawar     UWORD8 *pu1_avail,
317*c83a76b0SSuyog Pawar     WORD8 *pi1_sao_offset_u,
318*c83a76b0SSuyog Pawar     WORD8 *pi1_sao_offset_v,
319*c83a76b0SSuyog Pawar     WORD32 wd,
320*c83a76b0SSuyog Pawar     WORD32 ht);
321*c83a76b0SSuyog Pawar 
322*c83a76b0SSuyog Pawar /*****************************************************************************/
323*c83a76b0SSuyog Pawar /* Enums                                                                     */
324*c83a76b0SSuyog Pawar /*****************************************************************************/
325*c83a76b0SSuyog Pawar 
326*c83a76b0SSuyog Pawar typedef enum
327*c83a76b0SSuyog Pawar {
328*c83a76b0SSuyog Pawar     IP_FUNC_MODE_0 = 0,
329*c83a76b0SSuyog Pawar     IP_FUNC_MODE_1,
330*c83a76b0SSuyog Pawar     IP_FUNC_MODE_2,
331*c83a76b0SSuyog Pawar     IP_FUNC_MODE_3TO9,
332*c83a76b0SSuyog Pawar     IP_FUNC_MODE_10,
333*c83a76b0SSuyog Pawar     IP_FUNC_MODE_11TO17,
334*c83a76b0SSuyog Pawar     IP_FUNC_MODE_18_34,
335*c83a76b0SSuyog Pawar     IP_FUNC_MODE_19TO25,
336*c83a76b0SSuyog Pawar     IP_FUNC_MODE_26,
337*c83a76b0SSuyog Pawar     IP_FUNC_MODE_27TO33,
338*c83a76b0SSuyog Pawar 
339*c83a76b0SSuyog Pawar     NUM_IP_FUNCS
340*c83a76b0SSuyog Pawar 
341*c83a76b0SSuyog Pawar } IP_FUNCS_T;
342*c83a76b0SSuyog Pawar 
343*c83a76b0SSuyog Pawar typedef enum
344*c83a76b0SSuyog Pawar {
345*c83a76b0SSuyog Pawar     /* currently only cu and cu/2 modes are supported */
346*c83a76b0SSuyog Pawar     TU_EQ_CU = 0,
347*c83a76b0SSuyog Pawar     TU_EQ_CU_DIV2,
348*c83a76b0SSuyog Pawar     TU_EQ_SUBCU, /* only applicable for NXN mode at mincusize */
349*c83a76b0SSuyog Pawar 
350*c83a76b0SSuyog Pawar     /* support for below modes needs to be added */
351*c83a76b0SSuyog Pawar     TU_EQ_CU_DIV4,
352*c83a76b0SSuyog Pawar     TU_EQ_CU_DIV8,
353*c83a76b0SSuyog Pawar     TU_EQ_CU_DIV16,
354*c83a76b0SSuyog Pawar 
355*c83a76b0SSuyog Pawar     NUM_TU_WRT_CU,
356*c83a76b0SSuyog Pawar 
357*c83a76b0SSuyog Pawar } TU_SIZE_WRT_CU_T;
358*c83a76b0SSuyog Pawar 
359*c83a76b0SSuyog Pawar typedef enum
360*c83a76b0SSuyog Pawar {
361*c83a76b0SSuyog Pawar     RDOPT_MODE = 0,
362*c83a76b0SSuyog Pawar     RDOPT_SKIP_MODE = 1,
363*c83a76b0SSuyog Pawar 
364*c83a76b0SSuyog Pawar     NUM_CORE_CALL_MODES,
365*c83a76b0SSuyog Pawar 
366*c83a76b0SSuyog Pawar } CORE_FUNC_CALL_MODE_T;
367*c83a76b0SSuyog Pawar 
368*c83a76b0SSuyog Pawar typedef enum
369*c83a76b0SSuyog Pawar {
370*c83a76b0SSuyog Pawar     ENC_LOOP_CTXT = 0,
371*c83a76b0SSuyog Pawar     ENC_LOOP_THRDS_CTXT,
372*c83a76b0SSuyog Pawar     ENC_LOOP_SCALE_MAT,
373*c83a76b0SSuyog Pawar     ENC_LOOP_RESCALE_MAT,
374*c83a76b0SSuyog Pawar     ENC_LOOP_TOP_LUMA,
375*c83a76b0SSuyog Pawar     ENC_LOOP_TOP_CHROMA,
376*c83a76b0SSuyog Pawar     ENC_LOOP_TOP_NBR4X4,
377*c83a76b0SSuyog Pawar     ENC_LOOP_RC_PARAMS, /* memory to dump rate control parameters by each thread for each bit-rate instance */
378*c83a76b0SSuyog Pawar     ENC_LOOP_QP_TOP_4X4,
379*c83a76b0SSuyog Pawar     ENC_LOOP_DEBLOCKING,
380*c83a76b0SSuyog Pawar     ENC_LOOP_422_CHROMA_INTRA_PRED,
381*c83a76b0SSuyog Pawar     ENC_LOOP_INTER_PRED,
382*c83a76b0SSuyog Pawar     ENC_LOOP_CHROMA_PRED_INTRA,
383*c83a76b0SSuyog Pawar     ENC_LOOP_REF_SUB_OUT,
384*c83a76b0SSuyog Pawar     ENC_LOOP_REF_FILT_OUT,
385*c83a76b0SSuyog Pawar     ENC_LOOP_CU_RECUR_LUMA_RECON,
386*c83a76b0SSuyog Pawar     ENC_LOOP_CU_RECUR_CHROMA_RECON,
387*c83a76b0SSuyog Pawar     ENC_LOOP_CU_RECUR_LUMA_PRED,
388*c83a76b0SSuyog Pawar     ENC_LOOP_CU_RECUR_CHROMA_PRED,
389*c83a76b0SSuyog Pawar     ENC_LOOP_LEFT_LUMA_DATA,
390*c83a76b0SSuyog Pawar     ENC_LOOP_LEFT_CHROMA_DATA,
391*c83a76b0SSuyog Pawar     ENC_LOOP_SAO,
392*c83a76b0SSuyog Pawar     ENC_LOOP_CU_COEFF_DATA,
393*c83a76b0SSuyog Pawar     ENC_LOOP_CU_RECUR_COEFF_DATA,
394*c83a76b0SSuyog Pawar     ENC_LOOP_CU_DEQUANT_DATA,
395*c83a76b0SSuyog Pawar     ENC_LOOP_RECON_DATA_STORE,
396*c83a76b0SSuyog Pawar     /* should always be the last entry */
397*c83a76b0SSuyog Pawar     NUM_ENC_LOOP_MEM_RECS
398*c83a76b0SSuyog Pawar 
399*c83a76b0SSuyog Pawar } ENC_LOOP_MEM_TABS_T;
400*c83a76b0SSuyog Pawar 
401*c83a76b0SSuyog Pawar /** This is for assigning the pred buiffers for luma (2 ping-pong) and
402*c83a76b0SSuyog Pawar chroma(1)   */
403*c83a76b0SSuyog Pawar typedef enum
404*c83a76b0SSuyog Pawar {
405*c83a76b0SSuyog Pawar     CU_ME_INTRA_PRED_LUMA_IDX0 = 0,
406*c83a76b0SSuyog Pawar     CU_ME_INTRA_PRED_LUMA_IDX1,
407*c83a76b0SSuyog Pawar     CU_ME_INTRA_PRED_CHROMA_IDX,
408*c83a76b0SSuyog Pawar 
409*c83a76b0SSuyog Pawar     /* should be always the last entry */
410*c83a76b0SSuyog Pawar     NUM_CU_ME_INTRA_PRED_IDX
411*c83a76b0SSuyog Pawar 
412*c83a76b0SSuyog Pawar } CU_ME_INTRA_PRED_IDX_T;
413*c83a76b0SSuyog Pawar 
414*c83a76b0SSuyog Pawar /*****************************************************************************/
415*c83a76b0SSuyog Pawar /* Structure                                                                 */
416*c83a76b0SSuyog Pawar /*****************************************************************************/
417*c83a76b0SSuyog Pawar 
418*c83a76b0SSuyog Pawar /**
419*c83a76b0SSuyog Pawar ******************************************************************************
420*c83a76b0SSuyog Pawar *  @brief     Structure to store TU prms req. for enc_loop only
421*c83a76b0SSuyog Pawar ******************************************************************************
422*c83a76b0SSuyog Pawar */
423*c83a76b0SSuyog Pawar typedef struct
424*c83a76b0SSuyog Pawar {
425*c83a76b0SSuyog Pawar     /** Zero_col info. for the current TU Luma */
426*c83a76b0SSuyog Pawar     UWORD32 u4_luma_zero_col;
427*c83a76b0SSuyog Pawar     /** Zero_row info. for the current TU Luma */
428*c83a76b0SSuyog Pawar     UWORD32 u4_luma_zero_row;
429*c83a76b0SSuyog Pawar 
430*c83a76b0SSuyog Pawar     /** Zero_col info. for the current TU Chroma Cb */
431*c83a76b0SSuyog Pawar     UWORD32 au4_cb_zero_col[2];
432*c83a76b0SSuyog Pawar     /** Zero_row info. for the current TU Chroma Cb */
433*c83a76b0SSuyog Pawar     UWORD32 au4_cb_zero_row[2];
434*c83a76b0SSuyog Pawar     /** Zero_col info. for the current TU Chroma Cr */
435*c83a76b0SSuyog Pawar     UWORD32 au4_cr_zero_col[2];
436*c83a76b0SSuyog Pawar     /** Zero_row info. for the current TU Chroma Cr */
437*c83a76b0SSuyog Pawar     UWORD32 au4_cr_zero_row[2];
438*c83a76b0SSuyog Pawar 
439*c83a76b0SSuyog Pawar     /** bytes consumed by the luma ecd data */
440*c83a76b0SSuyog Pawar     WORD16 i2_luma_bytes_consumed;
441*c83a76b0SSuyog Pawar     /** bytes consumed by the Cb ecd data */
442*c83a76b0SSuyog Pawar     WORD16 ai2_cb_bytes_consumed[2];
443*c83a76b0SSuyog Pawar     /** bytes consumed by the Cr ecd data */
444*c83a76b0SSuyog Pawar     WORD16 ai2_cr_bytes_consumed[2];
445*c83a76b0SSuyog Pawar 
446*c83a76b0SSuyog Pawar     /** flag to re-evaluate IQ and Coeff data of luma in the final_recon
447*c83a76b0SSuyog Pawar     function. If zero, uses the data from RDOPT cand.                   */
448*c83a76b0SSuyog Pawar     UWORD16 b1_eval_luma_iq_and_coeff_data : 1;
449*c83a76b0SSuyog Pawar     /** flag to re-evaluate IQ and Coeff data of chroma in the final_recon
450*c83a76b0SSuyog Pawar     function. If zero, uses the data from RDOPT cand.                   */
451*c83a76b0SSuyog Pawar     UWORD16 b1_eval_chroma_iq_and_coeff_data : 1;
452*c83a76b0SSuyog Pawar 
453*c83a76b0SSuyog Pawar     /* TO DO : No support now, need to add. Always comapre ZERO_CBF cost */
454*c83a76b0SSuyog Pawar     /** Luma ZERO_CBF cost is compared with residue coding cost only if this
455*c83a76b0SSuyog Pawar     flag is enabled */
456*c83a76b0SSuyog Pawar     UWORD16 b1_eval_luma_zero_cbf_cost : 1;
457*c83a76b0SSuyog Pawar     /** Chroma ZERO_CBF cost is compared with residue coding cost only if this
458*c83a76b0SSuyog Pawar     flag is enabled */
459*c83a76b0SSuyog Pawar     UWORD16 b1_eval_chroma_zero_cbf_cost : 1;
460*c83a76b0SSuyog Pawar 
461*c83a76b0SSuyog Pawar     /** Reserved to make WORD32 alignment */
462*c83a76b0SSuyog Pawar     UWORD16 b12_reserved : 12;
463*c83a76b0SSuyog Pawar 
464*c83a76b0SSuyog Pawar } tu_enc_loop_temp_prms_t;
465*c83a76b0SSuyog Pawar 
466*c83a76b0SSuyog Pawar typedef struct recon_datastore_t
467*c83a76b0SSuyog Pawar {
468*c83a76b0SSuyog Pawar     /* 2 to store current and best */
469*c83a76b0SSuyog Pawar     void *apv_luma_recon_bufs[2];
470*c83a76b0SSuyog Pawar 
471*c83a76b0SSuyog Pawar     /* 0 to store cur chroma mode recon */
472*c83a76b0SSuyog Pawar     /* 1 to store winning independent chroma mode with a single TU's recon */
473*c83a76b0SSuyog Pawar     /* 2 to store winning independent chroma mode with 4 TUs' recon */
474*c83a76b0SSuyog Pawar     void *apv_chroma_recon_bufs[3];
475*c83a76b0SSuyog Pawar 
476*c83a76b0SSuyog Pawar     /* The following two arrays are used to store the ID's of the buffers */
477*c83a76b0SSuyog Pawar     /* where the winning recon is being stored */
478*c83a76b0SSuyog Pawar     /* For Luma buffers, the permissible values are 0, 1 and UCHAR_MAX */
479*c83a76b0SSuyog Pawar     /* For Chroma buffers, the permissible values are 0, 1, 2 and UCHAR_MAX */
480*c83a76b0SSuyog Pawar     /* The value 'UCHAR_MAX' indicates the absence of Recon for that particular TU */
481*c83a76b0SSuyog Pawar     UWORD8 au1_bufId_with_winning_LumaRecon[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW];
482*c83a76b0SSuyog Pawar 
483*c83a76b0SSuyog Pawar     /* 2 - 2 Chroma planes */
484*c83a76b0SSuyog Pawar     /* 2 - 2 possible subTU's */
485*c83a76b0SSuyog Pawar     UWORD8 au1_bufId_with_winning_ChromaRecon[2][MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW][2];
486*c83a76b0SSuyog Pawar 
487*c83a76b0SSuyog Pawar     WORD32 i4_lumaRecon_stride;
488*c83a76b0SSuyog Pawar 
489*c83a76b0SSuyog Pawar     WORD32 i4_chromaRecon_stride;
490*c83a76b0SSuyog Pawar 
491*c83a76b0SSuyog Pawar     UWORD8 au1_is_chromaRecon_available[3];
492*c83a76b0SSuyog Pawar 
493*c83a76b0SSuyog Pawar     UWORD8 u1_is_lumaRecon_available;
494*c83a76b0SSuyog Pawar 
495*c83a76b0SSuyog Pawar } recon_datastore_t;
496*c83a76b0SSuyog Pawar 
497*c83a76b0SSuyog Pawar typedef struct enc_loop_cu_final_prms_t
498*c83a76b0SSuyog Pawar {
499*c83a76b0SSuyog Pawar     recon_datastore_t s_recon_datastore;
500*c83a76b0SSuyog Pawar 
501*c83a76b0SSuyog Pawar     /**
502*c83a76b0SSuyog Pawar     * Cu size of the current cu being processed
503*c83a76b0SSuyog Pawar     */
504*c83a76b0SSuyog Pawar     UWORD8 u1_cu_size;
505*c83a76b0SSuyog Pawar     /**
506*c83a76b0SSuyog Pawar     * flags to indicate the final cu prediction mode
507*c83a76b0SSuyog Pawar     */
508*c83a76b0SSuyog Pawar     UWORD8 u1_intra_flag;
509*c83a76b0SSuyog Pawar 
510*c83a76b0SSuyog Pawar     /**
511*c83a76b0SSuyog Pawar     * flags to indicate Skip mode for CU
512*c83a76b0SSuyog Pawar     */
513*c83a76b0SSuyog Pawar     UWORD8 u1_skip_flag;
514*c83a76b0SSuyog Pawar 
515*c83a76b0SSuyog Pawar     /**
516*c83a76b0SSuyog Pawar     * number of tu in current cu for a given mode
517*c83a76b0SSuyog Pawar     * if skip then this value should be 1
518*c83a76b0SSuyog Pawar     */
519*c83a76b0SSuyog Pawar     UWORD16 u2_num_tus_in_cu;
520*c83a76b0SSuyog Pawar 
521*c83a76b0SSuyog Pawar     /**
522*c83a76b0SSuyog Pawar     * number of pu in current cu for a given mode
523*c83a76b0SSuyog Pawar     * if skip then this value should be 1
524*c83a76b0SSuyog Pawar     */
525*c83a76b0SSuyog Pawar     UWORD16 u2_num_pus_in_cu;
526*c83a76b0SSuyog Pawar 
527*c83a76b0SSuyog Pawar     /**
528*c83a76b0SSuyog Pawar     * total bytes produced in ECD data buffer
529*c83a76b0SSuyog Pawar     * if skip then this value should be 0
530*c83a76b0SSuyog Pawar     */
531*c83a76b0SSuyog Pawar     WORD32 i4_num_bytes_ecd_data;
532*c83a76b0SSuyog Pawar 
533*c83a76b0SSuyog Pawar     /**
534*c83a76b0SSuyog Pawar     * Partition mode of the best candidate
535*c83a76b0SSuyog Pawar     * if skip then this value should be SIZE_2Nx2N
536*c83a76b0SSuyog Pawar     * @sa PART_SIZE_E
537*c83a76b0SSuyog Pawar     */
538*c83a76b0SSuyog Pawar     UWORD8 u1_part_mode;
539*c83a76b0SSuyog Pawar 
540*c83a76b0SSuyog Pawar     /**
541*c83a76b0SSuyog Pawar     * indicates if inter cu has coded coeffs 1: coded, 0: not coded
542*c83a76b0SSuyog Pawar     * if skip then this value shoudl be ignored
543*c83a76b0SSuyog Pawar     */
544*c83a76b0SSuyog Pawar     UWORD8 u1_is_cu_coded;
545*c83a76b0SSuyog Pawar 
546*c83a76b0SSuyog Pawar     /**
547*c83a76b0SSuyog Pawar     * Chroma pred mode as signalled in bitstream
548*c83a76b0SSuyog Pawar     */
549*c83a76b0SSuyog Pawar     UWORD8 u1_chroma_intra_pred_mode;
550*c83a76b0SSuyog Pawar 
551*c83a76b0SSuyog Pawar     /**
552*c83a76b0SSuyog Pawar     * To store the best chroma mode for TU. Will be same for NxN case.
553*c83a76b0SSuyog Pawar     * Actual Chroma pred
554*c83a76b0SSuyog Pawar     */
555*c83a76b0SSuyog Pawar     UWORD8 u1_chroma_intra_pred_actual_mode;
556*c83a76b0SSuyog Pawar 
557*c83a76b0SSuyog Pawar     /**
558*c83a76b0SSuyog Pawar     * sad accumulated over all Tus of given CU
559*c83a76b0SSuyog Pawar     */
560*c83a76b0SSuyog Pawar     UWORD32 u4_cu_sad;
561*c83a76b0SSuyog Pawar 
562*c83a76b0SSuyog Pawar     /**
563*c83a76b0SSuyog Pawar     * sad accumulated over all Tus of given CU
564*c83a76b0SSuyog Pawar     */
565*c83a76b0SSuyog Pawar     LWORD64 i8_cu_ssd;
566*c83a76b0SSuyog Pawar 
567*c83a76b0SSuyog Pawar     /**
568*c83a76b0SSuyog Pawar     * open loop intra sad
569*c83a76b0SSuyog Pawar     */
570*c83a76b0SSuyog Pawar     UWORD32 u4_cu_open_intra_sad;
571*c83a76b0SSuyog Pawar 
572*c83a76b0SSuyog Pawar     /**
573*c83a76b0SSuyog Pawar     * header bits of cu estimated during RDO evaluation.
574*c83a76b0SSuyog Pawar     * Includes tu splits flags excludes cbf flags
575*c83a76b0SSuyog Pawar     */
576*c83a76b0SSuyog Pawar     UWORD32 u4_cu_hdr_bits;
577*c83a76b0SSuyog Pawar     /**
578*c83a76b0SSuyog Pawar     * luma residual bits of a cu estimated during RDO evaluation.
579*c83a76b0SSuyog Pawar     */
580*c83a76b0SSuyog Pawar     UWORD32 u4_cu_luma_res_bits;
581*c83a76b0SSuyog Pawar 
582*c83a76b0SSuyog Pawar     /**
583*c83a76b0SSuyog Pawar     * chroma residual bits of a cu estimated during RDO evaluation.
584*c83a76b0SSuyog Pawar     */
585*c83a76b0SSuyog Pawar     UWORD32 u4_cu_chroma_res_bits;
586*c83a76b0SSuyog Pawar 
587*c83a76b0SSuyog Pawar     /**
588*c83a76b0SSuyog Pawar     * cbf bits of a cu estimated during RDO evaluation (considered as part of texture bits later)
589*c83a76b0SSuyog Pawar     */
590*c83a76b0SSuyog Pawar     UWORD32 u4_cu_cbf_bits;
591*c83a76b0SSuyog Pawar 
592*c83a76b0SSuyog Pawar     /**
593*c83a76b0SSuyog Pawar     * array of PU for current CU
594*c83a76b0SSuyog Pawar     * For Inter PUs this will contain the follwoing
595*c83a76b0SSuyog Pawar     *   - merge flag
596*c83a76b0SSuyog Pawar     *   - (MVD and reference indicies) or (Merge Index)
597*c83a76b0SSuyog Pawar     *   - (if Cu is skipped then Merge index for skip
598*c83a76b0SSuyog Pawar     *      will be in 1st PU entry in array)
599*c83a76b0SSuyog Pawar     * for intra PU only intra flag will be set to 1
600*c83a76b0SSuyog Pawar     *
601*c83a76b0SSuyog Pawar     */
602*c83a76b0SSuyog Pawar     pu_t as_pu_enc_loop[NUM_PU_PARTS];
603*c83a76b0SSuyog Pawar 
604*c83a76b0SSuyog Pawar     /**
605*c83a76b0SSuyog Pawar     * array of PU for chroma usage
606*c83a76b0SSuyog Pawar     * in case of Merge MVs and reference idx of the final candidate
607*c83a76b0SSuyog Pawar     * used by luma need sto be stored
608*c83a76b0SSuyog Pawar     * for intra PU this will not be used
609*c83a76b0SSuyog Pawar     */
610*c83a76b0SSuyog Pawar     pu_t as_pu_chrm_proc[NUM_PU_PARTS];
611*c83a76b0SSuyog Pawar 
612*c83a76b0SSuyog Pawar     /**
613*c83a76b0SSuyog Pawar     * array of colocated PU for current CU
614*c83a76b0SSuyog Pawar     * MV and Ref pic id should be stored in this
615*c83a76b0SSuyog Pawar     * for intra PU only intra flag will be set to 1
616*c83a76b0SSuyog Pawar     */
617*c83a76b0SSuyog Pawar     pu_col_mv_t as_col_pu_enc_loop[NUM_INTER_PU_PARTS];
618*c83a76b0SSuyog Pawar 
619*c83a76b0SSuyog Pawar     /** array to store the intra mode pred related params
620*c83a76b0SSuyog Pawar     * if nxn mode the all 4 lcoations will be used
621*c83a76b0SSuyog Pawar     */
622*c83a76b0SSuyog Pawar     intra_prev_rem_flags_t as_intra_prev_rem[NUM_PU_PARTS];
623*c83a76b0SSuyog Pawar 
624*c83a76b0SSuyog Pawar     /**
625*c83a76b0SSuyog Pawar     * array to store TU propeties of the each tu in a CU
626*c83a76b0SSuyog Pawar     */
627*c83a76b0SSuyog Pawar     tu_enc_loop_out_t as_tu_enc_loop[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW];
628*c83a76b0SSuyog Pawar 
629*c83a76b0SSuyog Pawar     /**
630*c83a76b0SSuyog Pawar     * array to store TU propeties (req. for enc_loop only and not for
631*c83a76b0SSuyog Pawar     * entropy) of the each tu in a CU
632*c83a76b0SSuyog Pawar     */
633*c83a76b0SSuyog Pawar     tu_enc_loop_temp_prms_t as_tu_enc_loop_temp_prms[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW];
634*c83a76b0SSuyog Pawar 
635*c83a76b0SSuyog Pawar     /**
636*c83a76b0SSuyog Pawar     * Neighbour flags stored for chroma reuse
637*c83a76b0SSuyog Pawar     */
638*c83a76b0SSuyog Pawar     UWORD32 au4_nbr_flags[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW];
639*c83a76b0SSuyog Pawar 
640*c83a76b0SSuyog Pawar     /**
641*c83a76b0SSuyog Pawar     * intra pred modes stored for chroma reuse
642*c83a76b0SSuyog Pawar     */
643*c83a76b0SSuyog Pawar     UWORD8 au1_intra_pred_mode[4];
644*c83a76b0SSuyog Pawar 
645*c83a76b0SSuyog Pawar     /**
646*c83a76b0SSuyog Pawar     * array for storing coeffs during RD opt stage at CU level.
647*c83a76b0SSuyog Pawar     * Luma and chroma together
648*c83a76b0SSuyog Pawar     */
649*c83a76b0SSuyog Pawar     UWORD8 *pu1_cu_coeffs;
650*c83a76b0SSuyog Pawar 
651*c83a76b0SSuyog Pawar     /**
652*c83a76b0SSuyog Pawar     * Chroma deq_coeffs start point in the ai2_cu_deq_coeffs buffer.
653*c83a76b0SSuyog Pawar     */
654*c83a76b0SSuyog Pawar     WORD32 i4_chrm_cu_coeff_strt_idx;
655*c83a76b0SSuyog Pawar 
656*c83a76b0SSuyog Pawar     /**
657*c83a76b0SSuyog Pawar     * array for storing dequantized vals. during RD opt stage at CU level
658*c83a76b0SSuyog Pawar     * Luma and chroma together.
659*c83a76b0SSuyog Pawar     * Stride is assumed to be cu_size
660*c83a76b0SSuyog Pawar     * u-v interleaved storing is at TU level
661*c83a76b0SSuyog Pawar     */
662*c83a76b0SSuyog Pawar     WORD16 *pi2_cu_deq_coeffs;
663*c83a76b0SSuyog Pawar 
664*c83a76b0SSuyog Pawar     /**
665*c83a76b0SSuyog Pawar     * Chroma deq_coeffs start point in the ai2_cu_deq_coeffs buffer.
666*c83a76b0SSuyog Pawar     */
667*c83a76b0SSuyog Pawar     WORD32 i4_chrm_deq_coeff_strt_idx;
668*c83a76b0SSuyog Pawar 
669*c83a76b0SSuyog Pawar     /**
670*c83a76b0SSuyog Pawar     * The total RDOPT cost of the CU for the best mode
671*c83a76b0SSuyog Pawar     */
672*c83a76b0SSuyog Pawar     LWORD64 i8_best_rdopt_cost;
673*c83a76b0SSuyog Pawar 
674*c83a76b0SSuyog Pawar     /**
675*c83a76b0SSuyog Pawar     * The current running RDOPT cost for the current mode
676*c83a76b0SSuyog Pawar     */
677*c83a76b0SSuyog Pawar     LWORD64 i8_curr_rdopt_cost;
678*c83a76b0SSuyog Pawar 
679*c83a76b0SSuyog Pawar     LWORD64 i8_best_distortion;
680*c83a76b0SSuyog Pawar 
681*c83a76b0SSuyog Pawar } enc_loop_cu_final_prms_t;
682*c83a76b0SSuyog Pawar 
683*c83a76b0SSuyog Pawar typedef struct
684*c83a76b0SSuyog Pawar {
685*c83a76b0SSuyog Pawar     /** Current Cu chroma recon pointer in pic buffer */
686*c83a76b0SSuyog Pawar     UWORD8 *pu1_final_recon;
687*c83a76b0SSuyog Pawar 
688*c83a76b0SSuyog Pawar     UWORD16 *pu2_final_recon;
689*c83a76b0SSuyog Pawar 
690*c83a76b0SSuyog Pawar     /** Current Cu chroma source pointer in pic buffer */
691*c83a76b0SSuyog Pawar     UWORD8 *pu1_curr_src;
692*c83a76b0SSuyog Pawar 
693*c83a76b0SSuyog Pawar     UWORD16 *pu2_curr_src;
694*c83a76b0SSuyog Pawar 
695*c83a76b0SSuyog Pawar     /** Current CU chroma reocn buffer stride */
696*c83a76b0SSuyog Pawar     WORD32 i4_chrm_recon_stride;
697*c83a76b0SSuyog Pawar 
698*c83a76b0SSuyog Pawar     /** Current CU chroma source buffer stride */
699*c83a76b0SSuyog Pawar     WORD32 i4_chrm_src_stride;
700*c83a76b0SSuyog Pawar 
701*c83a76b0SSuyog Pawar     /** Current Cu chroma Left pointer for intra pred */
702*c83a76b0SSuyog Pawar     UWORD8 *pu1_cu_left;
703*c83a76b0SSuyog Pawar 
704*c83a76b0SSuyog Pawar     UWORD16 *pu2_cu_left;
705*c83a76b0SSuyog Pawar 
706*c83a76b0SSuyog Pawar     /** Left buffer stride */
707*c83a76b0SSuyog Pawar     WORD32 i4_cu_left_stride;
708*c83a76b0SSuyog Pawar 
709*c83a76b0SSuyog Pawar     /** Current Cu chroma top pointer for intra pred */
710*c83a76b0SSuyog Pawar     UWORD8 *pu1_cu_top;
711*c83a76b0SSuyog Pawar 
712*c83a76b0SSuyog Pawar     UWORD16 *pu2_cu_top;
713*c83a76b0SSuyog Pawar 
714*c83a76b0SSuyog Pawar     /** Current Cu chroma top left pointer for intra pred */
715*c83a76b0SSuyog Pawar     UWORD8 *pu1_cu_top_left;
716*c83a76b0SSuyog Pawar 
717*c83a76b0SSuyog Pawar     UWORD16 *pu2_cu_top_left;
718*c83a76b0SSuyog Pawar 
719*c83a76b0SSuyog Pawar } enc_loop_chrm_cu_buf_prms_t;
720*c83a76b0SSuyog Pawar 
721*c83a76b0SSuyog Pawar typedef struct
722*c83a76b0SSuyog Pawar {
723*c83a76b0SSuyog Pawar     /** cost of the current satd cand */
724*c83a76b0SSuyog Pawar     WORD32 i4_cost;
725*c83a76b0SSuyog Pawar 
726*c83a76b0SSuyog Pawar     /** tu size w.r.t to cu of the current satd cand
727*c83a76b0SSuyog Pawar     * @sa TU_SIZE_WRT_CU_T
728*c83a76b0SSuyog Pawar     */
729*c83a76b0SSuyog Pawar     WORD8 i4_tu_depth;
730*c83a76b0SSuyog Pawar 
731*c83a76b0SSuyog Pawar     /**
732*c83a76b0SSuyog Pawar     *  access valid number of entries in this array based on u1_part_size
733*c83a76b0SSuyog Pawar     */
734*c83a76b0SSuyog Pawar     UWORD8 au1_intra_luma_modes[NUM_PU_PARTS];
735*c83a76b0SSuyog Pawar 
736*c83a76b0SSuyog Pawar     /** @remarks u1_part_size 2Nx2N or  NxN  */
737*c83a76b0SSuyog Pawar     UWORD8 u1_part_mode; /* @sa: PART_SIZE_E */
738*c83a76b0SSuyog Pawar 
739*c83a76b0SSuyog Pawar     /** Flag to indicate whether current candidate needs to be evaluated */
740*c83a76b0SSuyog Pawar     UWORD8 u1_eval_flag;
741*c83a76b0SSuyog Pawar 
742*c83a76b0SSuyog Pawar } cu_intra_satd_out_t;
743*c83a76b0SSuyog Pawar 
744*c83a76b0SSuyog Pawar /** \brief cu level parameters for SATD / RDOPT function */
745*c83a76b0SSuyog Pawar 
746*c83a76b0SSuyog Pawar typedef struct
747*c83a76b0SSuyog Pawar {
748*c83a76b0SSuyog Pawar     /** pointer to source luma pointer
749*c83a76b0SSuyog Pawar     *  pointer will be pointing to CTB start location
750*c83a76b0SSuyog Pawar     *  At CU level based on the CU position this pointer
751*c83a76b0SSuyog Pawar     *  has to appropriately incremented
752*c83a76b0SSuyog Pawar     */
753*c83a76b0SSuyog Pawar     UWORD8 *pu1_luma_src;
754*c83a76b0SSuyog Pawar 
755*c83a76b0SSuyog Pawar     UWORD16 *pu2_luma_src;
756*c83a76b0SSuyog Pawar 
757*c83a76b0SSuyog Pawar     /** pointer to source chroma pointer
758*c83a76b0SSuyog Pawar     *  pointer will be pointing to CTB start location
759*c83a76b0SSuyog Pawar     *  At CU level based on the CU position this pointer
760*c83a76b0SSuyog Pawar     *  has to appropriately incremented
761*c83a76b0SSuyog Pawar     */
762*c83a76b0SSuyog Pawar     UWORD8 *pu1_chrm_src;
763*c83a76b0SSuyog Pawar 
764*c83a76b0SSuyog Pawar     UWORD16 *pu2_chrm_src;
765*c83a76b0SSuyog Pawar 
766*c83a76b0SSuyog Pawar     /** pointer to recon luma pointer
767*c83a76b0SSuyog Pawar     *  pointer will be pointing to CTB start location
768*c83a76b0SSuyog Pawar     *  At CU level based on the CU position this pointer
769*c83a76b0SSuyog Pawar     *  has to appropriately incremented
770*c83a76b0SSuyog Pawar     */
771*c83a76b0SSuyog Pawar     UWORD8 *pu1_luma_recon;
772*c83a76b0SSuyog Pawar 
773*c83a76b0SSuyog Pawar     UWORD16 *pu2_luma_recon;
774*c83a76b0SSuyog Pawar 
775*c83a76b0SSuyog Pawar     /** pointer to recon chroma pointer
776*c83a76b0SSuyog Pawar     *  pointer will be pointing to CTB start location
777*c83a76b0SSuyog Pawar     *  At CU level based on the CU position this pointer
778*c83a76b0SSuyog Pawar     *  has to appropriately incremented
779*c83a76b0SSuyog Pawar     */
780*c83a76b0SSuyog Pawar     UWORD8 *pu1_chrm_recon;
781*c83a76b0SSuyog Pawar 
782*c83a76b0SSuyog Pawar     UWORD16 *pu2_chrm_recon;
783*c83a76b0SSuyog Pawar 
784*c83a76b0SSuyog Pawar     /*1st pass parallel dpb buffer pointers aimilar to the above*/
785*c83a76b0SSuyog Pawar     UWORD8 *pu1_luma_recon_src;
786*c83a76b0SSuyog Pawar 
787*c83a76b0SSuyog Pawar     UWORD16 *pu2_luma_recon_src;
788*c83a76b0SSuyog Pawar 
789*c83a76b0SSuyog Pawar     UWORD8 *pu1_chrm_recon_src;
790*c83a76b0SSuyog Pawar 
791*c83a76b0SSuyog Pawar     UWORD16 *pu2_chrm_recon_src;
792*c83a76b0SSuyog Pawar 
793*c83a76b0SSuyog Pawar     /** Pointer to Subpel Plane Buffer */
794*c83a76b0SSuyog Pawar     UWORD8 *pu1_sbpel_hxfy;
795*c83a76b0SSuyog Pawar 
796*c83a76b0SSuyog Pawar     /** Pointer to Subpel Plane Buffer */
797*c83a76b0SSuyog Pawar     UWORD8 *pu1_sbpel_fxhy;
798*c83a76b0SSuyog Pawar 
799*c83a76b0SSuyog Pawar     /** Pointer to Subpel Plane Buffer */
800*c83a76b0SSuyog Pawar     UWORD8 *pu1_sbpel_hxhy;
801*c83a76b0SSuyog Pawar 
802*c83a76b0SSuyog Pawar     /** Luma source stride */
803*c83a76b0SSuyog Pawar     WORD32 i4_luma_src_stride;
804*c83a76b0SSuyog Pawar 
805*c83a76b0SSuyog Pawar     /** chroma soruce stride */
806*c83a76b0SSuyog Pawar     WORD32 i4_chrm_src_stride;
807*c83a76b0SSuyog Pawar 
808*c83a76b0SSuyog Pawar     /** Luma recon stride */
809*c83a76b0SSuyog Pawar     WORD32 i4_luma_recon_stride;
810*c83a76b0SSuyog Pawar 
811*c83a76b0SSuyog Pawar     /** chroma recon stride */
812*c83a76b0SSuyog Pawar     WORD32 i4_chrm_recon_stride;
813*c83a76b0SSuyog Pawar 
814*c83a76b0SSuyog Pawar     /** ctb size */
815*c83a76b0SSuyog Pawar     WORD32 i4_ctb_size;
816*c83a76b0SSuyog Pawar 
817*c83a76b0SSuyog Pawar     /** current ctb postion horz */
818*c83a76b0SSuyog Pawar     WORD32 i4_ctb_pos;
819*c83a76b0SSuyog Pawar 
820*c83a76b0SSuyog Pawar     /** number of PU finalized for curr CU  */
821*c83a76b0SSuyog Pawar     WORD32 i4_num_pus_in_cu;
822*c83a76b0SSuyog Pawar 
823*c83a76b0SSuyog Pawar     /** number of bytes consumed for current in ecd data buf */
824*c83a76b0SSuyog Pawar     WORD32 i4_num_bytes_cons;
825*c83a76b0SSuyog Pawar 
826*c83a76b0SSuyog Pawar     UWORD8 u1_is_cu_noisy;
827*c83a76b0SSuyog Pawar 
828*c83a76b0SSuyog Pawar     UWORD8 *pu1_is_8x8Blk_noisy;
829*c83a76b0SSuyog Pawar 
830*c83a76b0SSuyog Pawar } enc_loop_cu_prms_t;
831*c83a76b0SSuyog Pawar 
832*c83a76b0SSuyog Pawar /**
833*c83a76b0SSuyog Pawar ******************************************************************************
834*c83a76b0SSuyog Pawar *  @brief Pad inter pred recon context
835*c83a76b0SSuyog Pawar ******************************************************************************
836*c83a76b0SSuyog Pawar */
837*c83a76b0SSuyog Pawar typedef struct
838*c83a76b0SSuyog Pawar {
839*c83a76b0SSuyog Pawar     /** Pointer to Subpel Plane Buffer */
840*c83a76b0SSuyog Pawar     UWORD8 *pu1_sbpel_hxfy;
841*c83a76b0SSuyog Pawar 
842*c83a76b0SSuyog Pawar     /** Pointer to Subpel Plane Buffer */
843*c83a76b0SSuyog Pawar     UWORD8 *pu1_sbpel_fxhy;
844*c83a76b0SSuyog Pawar 
845*c83a76b0SSuyog Pawar     /** Pointer to Subpel Plane Buffer */
846*c83a76b0SSuyog Pawar     UWORD8 *pu1_sbpel_hxhy;
847*c83a76b0SSuyog Pawar 
848*c83a76b0SSuyog Pawar     /** pointer to recon luma pointer
849*c83a76b0SSuyog Pawar     *  pointer will be pointing to CTB start location
850*c83a76b0SSuyog Pawar     *  At CU level based on the CU position this pointer
851*c83a76b0SSuyog Pawar     *  has to appropriately incremented
852*c83a76b0SSuyog Pawar     */
853*c83a76b0SSuyog Pawar     UWORD8 *pu1_luma_recon;
854*c83a76b0SSuyog Pawar 
855*c83a76b0SSuyog Pawar     /** pointer to recon chroma pointer
856*c83a76b0SSuyog Pawar     *  pointer will be pointing to CTB start location
857*c83a76b0SSuyog Pawar     *  At CU level based on the CU position this pointer
858*c83a76b0SSuyog Pawar     *  has to appropriately incremented
859*c83a76b0SSuyog Pawar     */
860*c83a76b0SSuyog Pawar     UWORD8 *pu1_chrm_recon;
861*c83a76b0SSuyog Pawar 
862*c83a76b0SSuyog Pawar     /*FOr recon source 1st pass starts*/
863*c83a76b0SSuyog Pawar 
864*c83a76b0SSuyog Pawar     UWORD8 *pu1_luma_recon_src;
865*c83a76b0SSuyog Pawar 
866*c83a76b0SSuyog Pawar     /** pointer to recon chroma pointer
867*c83a76b0SSuyog Pawar     *  pointer will be pointing to CTB start location
868*c83a76b0SSuyog Pawar     *  At CU level based on the CU position this pointer
869*c83a76b0SSuyog Pawar     *  has to appropriately incremented
870*c83a76b0SSuyog Pawar     */
871*c83a76b0SSuyog Pawar     UWORD8 *pu1_chrm_recon_src;
872*c83a76b0SSuyog Pawar     /*FOr recon source 1st pass ends */
873*c83a76b0SSuyog Pawar     /** Luma recon stride */
874*c83a76b0SSuyog Pawar     WORD32 i4_luma_recon_stride;
875*c83a76b0SSuyog Pawar 
876*c83a76b0SSuyog Pawar     /** chroma recon stride */
877*c83a76b0SSuyog Pawar     WORD32 i4_chrm_recon_stride;
878*c83a76b0SSuyog Pawar 
879*c83a76b0SSuyog Pawar     /** ctb size */
880*c83a76b0SSuyog Pawar     WORD32 i4_ctb_size;
881*c83a76b0SSuyog Pawar 
882*c83a76b0SSuyog Pawar     /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */
883*c83a76b0SSuyog Pawar     UWORD8 u1_chroma_array_type;
884*c83a76b0SSuyog Pawar 
885*c83a76b0SSuyog Pawar } pad_interp_recon_frm_t;
886*c83a76b0SSuyog Pawar 
887*c83a76b0SSuyog Pawar /**
888*c83a76b0SSuyog Pawar ******************************************************************************
889*c83a76b0SSuyog Pawar *  @brief inter prediction (MC) context for enc loop
890*c83a76b0SSuyog Pawar ******************************************************************************
891*c83a76b0SSuyog Pawar */
892*c83a76b0SSuyog Pawar /*IMPORTANT please keep inter_pred_ctxt_t and inter_pred_me_ctxt_t as identical*/
893*c83a76b0SSuyog Pawar typedef struct
894*c83a76b0SSuyog Pawar {
895*c83a76b0SSuyog Pawar     /** pointer to reference lists */
896*c83a76b0SSuyog Pawar     recon_pic_buf_t *(*ps_ref_list)[HEVCE_MAX_REF_PICS * 2];
897*c83a76b0SSuyog Pawar 
898*c83a76b0SSuyog Pawar     /** scratch buffer for horizontal interpolation destination */
899*c83a76b0SSuyog Pawar     WORD16 MEM_ALIGN16 ai2_horz_scratch[MAX_CTB_SIZE * (MAX_CTB_SIZE + 8)];
900*c83a76b0SSuyog Pawar 
901*c83a76b0SSuyog Pawar     /** scratch 16 bit buffer for interpolation in l0 direction */
902*c83a76b0SSuyog Pawar     WORD16 MEM_ALIGN16 ai2_scratch_buf_l0[MAX_CTB_SIZE * MAX_CTB_SIZE];
903*c83a76b0SSuyog Pawar 
904*c83a76b0SSuyog Pawar     /** scratch 16 bit buffer for interpolation in l1 direction */
905*c83a76b0SSuyog Pawar     WORD16 MEM_ALIGN16 ai2_scratch_buf_l1[MAX_CTB_SIZE * MAX_CTB_SIZE];
906*c83a76b0SSuyog Pawar 
907*c83a76b0SSuyog Pawar     /** Pointer to struct containing function pointers to
908*c83a76b0SSuyog Pawar     functions in the 'common' library' */
909*c83a76b0SSuyog Pawar     func_selector_t *ps_func_selector;
910*c83a76b0SSuyog Pawar 
911*c83a76b0SSuyog Pawar     /** common denominator used for luma weights */
912*c83a76b0SSuyog Pawar     WORD32 i4_log2_luma_wght_denom;
913*c83a76b0SSuyog Pawar 
914*c83a76b0SSuyog Pawar     /** common denominator used for chroma weights */
915*c83a76b0SSuyog Pawar     WORD32 i4_log2_chroma_wght_denom;
916*c83a76b0SSuyog Pawar 
917*c83a76b0SSuyog Pawar     /**  offset w.r.t frame start in horz direction (pels) */
918*c83a76b0SSuyog Pawar     WORD32 i4_ctb_frm_pos_x;
919*c83a76b0SSuyog Pawar 
920*c83a76b0SSuyog Pawar     /**  offset w.r.t frame start in vert direction (pels) */
921*c83a76b0SSuyog Pawar     WORD32 i4_ctb_frm_pos_y;
922*c83a76b0SSuyog Pawar 
923*c83a76b0SSuyog Pawar     /* Bit Depth of Input */
924*c83a76b0SSuyog Pawar     WORD32 i4_bit_depth;
925*c83a76b0SSuyog Pawar 
926*c83a76b0SSuyog Pawar     /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */
927*c83a76b0SSuyog Pawar     UWORD8 u1_chroma_array_type;
928*c83a76b0SSuyog Pawar 
929*c83a76b0SSuyog Pawar     /** weighted_pred_flag      */
930*c83a76b0SSuyog Pawar     WORD8 i1_weighted_pred_flag;
931*c83a76b0SSuyog Pawar 
932*c83a76b0SSuyog Pawar     /** weighted_bipred_flag    */
933*c83a76b0SSuyog Pawar     WORD8 i1_weighted_bipred_flag;
934*c83a76b0SSuyog Pawar 
935*c83a76b0SSuyog Pawar     /** Structure to describe extra CTBs around frame due to search
936*c83a76b0SSuyog Pawar     range associated with distributed-mode. Entries are top, left,
937*c83a76b0SSuyog Pawar     right and bottom */
938*c83a76b0SSuyog Pawar     WORD32 ai4_tile_xtra_pel[4];
939*c83a76b0SSuyog Pawar 
940*c83a76b0SSuyog Pawar } inter_pred_ctxt_t;
941*c83a76b0SSuyog Pawar /*IMPORTANT please keep inter_pred_ctxt_t and inter_pred_me_ctxt_t as identical*/
942*c83a76b0SSuyog Pawar 
943*c83a76b0SSuyog Pawar typedef IV_API_CALL_STATUS_T (*PF_LUMA_INTER_PRED_PU)(
944*c83a76b0SSuyog Pawar     void *pv_inter_pred_ctxt,
945*c83a76b0SSuyog Pawar     pu_t *ps_pu,
946*c83a76b0SSuyog Pawar     void *pv_dst_buf,
947*c83a76b0SSuyog Pawar     WORD32 dst_stride,
948*c83a76b0SSuyog Pawar     WORD32 i4_flag_inter_pred_source);
949*c83a76b0SSuyog Pawar 
950*c83a76b0SSuyog Pawar /**
951*c83a76b0SSuyog Pawar ******************************************************************************
952*c83a76b0SSuyog Pawar *  @brief  Motion predictor context structure
953*c83a76b0SSuyog Pawar ******************************************************************************
954*c83a76b0SSuyog Pawar */
955*c83a76b0SSuyog Pawar typedef struct
956*c83a76b0SSuyog Pawar {
957*c83a76b0SSuyog Pawar     /** pointer to reference lists */
958*c83a76b0SSuyog Pawar     recon_pic_buf_t *(*ps_ref_list)[HEVCE_MAX_REF_PICS * 2];
959*c83a76b0SSuyog Pawar 
960*c83a76b0SSuyog Pawar     /** pointer to the slice header */
961*c83a76b0SSuyog Pawar     slice_header_t *ps_slice_hdr;
962*c83a76b0SSuyog Pawar 
963*c83a76b0SSuyog Pawar     /** pointer to SPS */
964*c83a76b0SSuyog Pawar     sps_t *ps_sps;
965*c83a76b0SSuyog Pawar 
966*c83a76b0SSuyog Pawar     /** CTB x. In CTB unit*/
967*c83a76b0SSuyog Pawar     WORD32 i4_ctb_x;
968*c83a76b0SSuyog Pawar 
969*c83a76b0SSuyog Pawar     /** CTB y. In CTB unit */
970*c83a76b0SSuyog Pawar     WORD32 i4_ctb_y;
971*c83a76b0SSuyog Pawar 
972*c83a76b0SSuyog Pawar     /** Log2 Parallel Merge Level - 2  */
973*c83a76b0SSuyog Pawar     WORD32 i4_log2_parallel_merge_level_minus2;
974*c83a76b0SSuyog Pawar 
975*c83a76b0SSuyog Pawar     /* Number of extra CTBs external to tile due to fetched search-range around Tile */
976*c83a76b0SSuyog Pawar     /* TOP, left, right and bottom */
977*c83a76b0SSuyog Pawar     WORD32 ai4_tile_xtra_ctb[4];
978*c83a76b0SSuyog Pawar 
979*c83a76b0SSuyog Pawar } mv_pred_ctxt_t;
980*c83a76b0SSuyog Pawar 
981*c83a76b0SSuyog Pawar /**
982*c83a76b0SSuyog Pawar ******************************************************************************
983*c83a76b0SSuyog Pawar *  @brief  Deblocking and Boundary strength CTB level structure
984*c83a76b0SSuyog Pawar ******************************************************************************
985*c83a76b0SSuyog Pawar */
986*c83a76b0SSuyog Pawar typedef struct
987*c83a76b0SSuyog Pawar {
988*c83a76b0SSuyog Pawar     /** Array to store the packed BS values in horizontal direction  */
989*c83a76b0SSuyog Pawar     UWORD32 au4_horz_bs[(MAX_CTB_SIZE >> 3) + 1];
990*c83a76b0SSuyog Pawar 
991*c83a76b0SSuyog Pawar     /** Array to store the packed BS values in vertical direction  */
992*c83a76b0SSuyog Pawar     UWORD32 au4_vert_bs[(MAX_CTB_SIZE >> 3) + 1];
993*c83a76b0SSuyog Pawar 
994*c83a76b0SSuyog Pawar     /** CTB neighbour availability flags for deblocking */
995*c83a76b0SSuyog Pawar     UWORD8 u1_not_first_ctb_col_of_frame;
996*c83a76b0SSuyog Pawar     UWORD8 u1_not_first_ctb_row_of_frame;
997*c83a76b0SSuyog Pawar 
998*c83a76b0SSuyog Pawar } deblk_bs_ctb_ctxt_t;
999*c83a76b0SSuyog Pawar 
1000*c83a76b0SSuyog Pawar /**
1001*c83a76b0SSuyog Pawar ******************************************************************************
1002*c83a76b0SSuyog Pawar *  @brief  Deblocking and CTB level structure
1003*c83a76b0SSuyog Pawar ******************************************************************************
1004*c83a76b0SSuyog Pawar */
1005*c83a76b0SSuyog Pawar typedef struct
1006*c83a76b0SSuyog Pawar {
1007*c83a76b0SSuyog Pawar     /**
1008*c83a76b0SSuyog Pawar     * BS of the last vertical 4x4 column of previous CTB
1009*c83a76b0SSuyog Pawar     */
1010*c83a76b0SSuyog Pawar     UWORD8 au1_prev_bs[MAX_CTB_SIZE >> 3];
1011*c83a76b0SSuyog Pawar 
1012*c83a76b0SSuyog Pawar     /**
1013*c83a76b0SSuyog Pawar     * BS of the last vertical 4x4 column of previous CTB
1014*c83a76b0SSuyog Pawar     */
1015*c83a76b0SSuyog Pawar     UWORD8 au1_prev_bs_uv[MAX_CTB_SIZE >> 3];
1016*c83a76b0SSuyog Pawar 
1017*c83a76b0SSuyog Pawar     /** pointer to top 4x4 ctb nbr structure; for accessing qp  */
1018*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_top_ctb_nbr_4x4;
1019*c83a76b0SSuyog Pawar 
1020*c83a76b0SSuyog Pawar     /** pointer to left 4x4 ctb nbr structure; for accessing qp */
1021*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_left_ctb_nbr_4x4;
1022*c83a76b0SSuyog Pawar 
1023*c83a76b0SSuyog Pawar     /** pointer to current 4x4 ctb nbr structure; for accessing qp */
1024*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_cur_ctb_4x4;
1025*c83a76b0SSuyog Pawar 
1026*c83a76b0SSuyog Pawar     /** max of 8 such contiguous bs to be computed for 64x64 ctb */
1027*c83a76b0SSuyog Pawar     UWORD32 *pu4_bs_horz;
1028*c83a76b0SSuyog Pawar 
1029*c83a76b0SSuyog Pawar     /** max of 8 such contiguous bs to be computed for 64x64 ctb */
1030*c83a76b0SSuyog Pawar     UWORD32 *pu4_bs_vert;
1031*c83a76b0SSuyog Pawar 
1032*c83a76b0SSuyog Pawar     /** ptr to current ctb luma pel in frame */
1033*c83a76b0SSuyog Pawar     UWORD8 *pu1_ctb_y;
1034*c83a76b0SSuyog Pawar 
1035*c83a76b0SSuyog Pawar     UWORD16 *pu2_ctb_y;
1036*c83a76b0SSuyog Pawar 
1037*c83a76b0SSuyog Pawar     /** ptr to current ctb sp interleaved chroma pel in frame */
1038*c83a76b0SSuyog Pawar     UWORD8 *pu1_ctb_uv;
1039*c83a76b0SSuyog Pawar 
1040*c83a76b0SSuyog Pawar     UWORD16 *pu2_ctb_uv;
1041*c83a76b0SSuyog Pawar 
1042*c83a76b0SSuyog Pawar     func_selector_t *ps_func_selector;
1043*c83a76b0SSuyog Pawar 
1044*c83a76b0SSuyog Pawar     /** left nbr buffer stride in terms of 4x4 units */
1045*c83a76b0SSuyog Pawar     WORD32 i4_left_nbr_4x4_strd;
1046*c83a76b0SSuyog Pawar 
1047*c83a76b0SSuyog Pawar     /** current  buffer stride in terms of 4x4 units */
1048*c83a76b0SSuyog Pawar     WORD32 i4_cur_4x4_strd;
1049*c83a76b0SSuyog Pawar 
1050*c83a76b0SSuyog Pawar     /** size in pels 16 / 32 /64 */
1051*c83a76b0SSuyog Pawar     WORD32 i4_ctb_size;
1052*c83a76b0SSuyog Pawar 
1053*c83a76b0SSuyog Pawar     /** stride for luma       */
1054*c83a76b0SSuyog Pawar     WORD32 i4_luma_pic_stride;
1055*c83a76b0SSuyog Pawar 
1056*c83a76b0SSuyog Pawar     /** stride for  chroma */
1057*c83a76b0SSuyog Pawar     WORD32 i4_chroma_pic_stride;
1058*c83a76b0SSuyog Pawar 
1059*c83a76b0SSuyog Pawar     /** boolean indicating if left ctb edge is to be deblocked or not */
1060*c83a76b0SSuyog Pawar     WORD32 i4_deblock_left_ctb_edge;
1061*c83a76b0SSuyog Pawar 
1062*c83a76b0SSuyog Pawar     /** boolean indicating if top ctb edge is to be deblocked or not */
1063*c83a76b0SSuyog Pawar     WORD32 i4_deblock_top_ctb_edge;
1064*c83a76b0SSuyog Pawar 
1065*c83a76b0SSuyog Pawar     /** beta offset index */
1066*c83a76b0SSuyog Pawar     WORD32 i4_beta_offset_div2;
1067*c83a76b0SSuyog Pawar 
1068*c83a76b0SSuyog Pawar     /** tc offset index */
1069*c83a76b0SSuyog Pawar     WORD32 i4_tc_offset_div2;
1070*c83a76b0SSuyog Pawar 
1071*c83a76b0SSuyog Pawar     /** chroma cb qp offset index */
1072*c83a76b0SSuyog Pawar     WORD32 i4_cb_qp_indx_offset;
1073*c83a76b0SSuyog Pawar 
1074*c83a76b0SSuyog Pawar     /** chroma cr qp offset index */
1075*c83a76b0SSuyog Pawar     WORD32 i4_cr_qp_indx_offset;
1076*c83a76b0SSuyog Pawar 
1077*c83a76b0SSuyog Pawar     WORD32 i4_bit_depth;
1078*c83a76b0SSuyog Pawar 
1079*c83a76b0SSuyog Pawar     /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */
1080*c83a76b0SSuyog Pawar     UWORD8 u1_chroma_array_type;
1081*c83a76b0SSuyog Pawar 
1082*c83a76b0SSuyog Pawar } deblk_ctb_params_t;
1083*c83a76b0SSuyog Pawar 
1084*c83a76b0SSuyog Pawar /**
1085*c83a76b0SSuyog Pawar ******************************************************************************
1086*c83a76b0SSuyog Pawar *  @brief  Stores the BS and Qp of a CTB row. For CTB-row level deblocking
1087*c83a76b0SSuyog Pawar ******************************************************************************
1088*c83a76b0SSuyog Pawar */
1089*c83a76b0SSuyog Pawar typedef struct deblk_ctbrow_prms
1090*c83a76b0SSuyog Pawar {
1091*c83a76b0SSuyog Pawar     /**
1092*c83a76b0SSuyog Pawar     * Refer to ihevce_enc_loop_get_mem_recs() and
1093*c83a76b0SSuyog Pawar     * ihevce_enc_loop_init()for more info
1094*c83a76b0SSuyog Pawar     * regarding memory allocation to each one below.
1095*c83a76b0SSuyog Pawar     */
1096*c83a76b0SSuyog Pawar 
1097*c83a76b0SSuyog Pawar     /**
1098*c83a76b0SSuyog Pawar     * Stores the vertical boundary strength of a CTB row.
1099*c83a76b0SSuyog Pawar     */
1100*c83a76b0SSuyog Pawar     UWORD32 *pu4_ctb_row_bs_vert;
1101*c83a76b0SSuyog Pawar 
1102*c83a76b0SSuyog Pawar     /**
1103*c83a76b0SSuyog Pawar     * Storage is same as above. Contains horizontal BS.
1104*c83a76b0SSuyog Pawar     */
1105*c83a76b0SSuyog Pawar     UWORD32 *pu4_ctb_row_bs_horz;
1106*c83a76b0SSuyog Pawar 
1107*c83a76b0SSuyog Pawar     /**
1108*c83a76b0SSuyog Pawar     * Pointer to the CTB row's Qp storage
1109*c83a76b0SSuyog Pawar     */
1110*c83a76b0SSuyog Pawar     WORD8 *pi1_ctb_row_qp;
1111*c83a76b0SSuyog Pawar 
1112*c83a76b0SSuyog Pawar     /**
1113*c83a76b0SSuyog Pawar     * Stride of the pu1_ctb_row_qp_p buffer in WORD32 unit
1114*c83a76b0SSuyog Pawar     */
1115*c83a76b0SSuyog Pawar     WORD32 u4_qp_buffer_stride;
1116*c83a76b0SSuyog Pawar 
1117*c83a76b0SSuyog Pawar     /*
1118*c83a76b0SSuyog Pawar     *   Pointer to the  memory which contains the Qp of
1119*c83a76b0SSuyog Pawar     *   top4x4 neighbour blocks for each CTB row.
1120*c83a76b0SSuyog Pawar     *   This memory is at frame level.
1121*c83a76b0SSuyog Pawar     */
1122*c83a76b0SSuyog Pawar     WORD8 *api1_qp_top_4x4_ctb_row[MAX_NUM_ENC_LOOP_PARALLEL];
1123*c83a76b0SSuyog Pawar 
1124*c83a76b0SSuyog Pawar     /*
1125*c83a76b0SSuyog Pawar     *   Stride of the above memory location.
1126*c83a76b0SSuyog Pawar     *   Values in one-stride correspondes to one CTB row.
1127*c83a76b0SSuyog Pawar     */
1128*c83a76b0SSuyog Pawar     WORD32 u4_qp_top_4x4_buf_strd;
1129*c83a76b0SSuyog Pawar 
1130*c83a76b0SSuyog Pawar     /*size of frm level qp buffer*/
1131*c83a76b0SSuyog Pawar     WORD32 u4_qp_top_4x4_buf_size;
1132*c83a76b0SSuyog Pawar 
1133*c83a76b0SSuyog Pawar } deblk_ctbrow_prms_t;
1134*c83a76b0SSuyog Pawar 
1135*c83a76b0SSuyog Pawar /**
1136*c83a76b0SSuyog Pawar ******************************************************************************
1137*c83a76b0SSuyog Pawar *  @brief  Entropy rd opt context for cabac bit estimation and RDO
1138*c83a76b0SSuyog Pawar ******************************************************************************
1139*c83a76b0SSuyog Pawar */
1140*c83a76b0SSuyog Pawar typedef struct rdopt_entropy_ctxt
1141*c83a76b0SSuyog Pawar {
1142*c83a76b0SSuyog Pawar     /**
1143*c83a76b0SSuyog Pawar     * array for entropy contexts during RD opt stage at CU level
1144*c83a76b0SSuyog Pawar     * one best and one current is required
1145*c83a76b0SSuyog Pawar     */
1146*c83a76b0SSuyog Pawar     entropy_context_t as_cu_entropy_ctxt[2];
1147*c83a76b0SSuyog Pawar 
1148*c83a76b0SSuyog Pawar     /**
1149*c83a76b0SSuyog Pawar     * init state of entropy context models during CU RD opt stage,
1150*c83a76b0SSuyog Pawar     * required for saving and restoring the cabac states
1151*c83a76b0SSuyog Pawar     */
1152*c83a76b0SSuyog Pawar     UWORD8 au1_init_cabac_ctxt_states[IHEVC_CAB_CTXT_END];
1153*c83a76b0SSuyog Pawar 
1154*c83a76b0SSuyog Pawar     /*
1155*c83a76b0SSuyog Pawar     * ptr to top row cu skip flags (1 bit per 8x8CU)
1156*c83a76b0SSuyog Pawar     */
1157*c83a76b0SSuyog Pawar     UWORD8 *pu1_cu_skip_top_row;
1158*c83a76b0SSuyog Pawar 
1159*c83a76b0SSuyog Pawar     /**
1160*c83a76b0SSuyog Pawar     * Current entropy ctxt idx
1161*c83a76b0SSuyog Pawar     */
1162*c83a76b0SSuyog Pawar     WORD32 i4_curr_buf_idx;
1163*c83a76b0SSuyog Pawar 
1164*c83a76b0SSuyog Pawar } rdopt_entropy_ctxt_t;
1165*c83a76b0SSuyog Pawar 
1166*c83a76b0SSuyog Pawar /**
1167*c83a76b0SSuyog Pawar ******************************************************************************
1168*c83a76b0SSuyog Pawar *  @brief  structure to save predicted data from Inter SATD stage to Inter RD opt stage
1169*c83a76b0SSuyog Pawar ******************************************************************************
1170*c83a76b0SSuyog Pawar */
1171*c83a76b0SSuyog Pawar typedef struct
1172*c83a76b0SSuyog Pawar {
1173*c83a76b0SSuyog Pawar     /*Buffer to store the predicted data after motion compensation for merge and
1174*c83a76b0SSuyog Pawar     * skip candidates.
1175*c83a76b0SSuyog Pawar     * [2] Because for a given candidate we do motion compensation for 5 merge candidates.
1176*c83a76b0SSuyog Pawar     *     store the pred data after mc for the first 2 candidates and from 3rd candidate
1177*c83a76b0SSuyog Pawar     *     onwards, overwrite the data which has higher SATD cost.
1178*c83a76b0SSuyog Pawar     */
1179*c83a76b0SSuyog Pawar     void *apv_pred_data[2];
1180*c83a76b0SSuyog Pawar 
1181*c83a76b0SSuyog Pawar     /** Stride to store the predicted data
1182*c83a76b0SSuyog Pawar     */
1183*c83a76b0SSuyog Pawar     WORD32 i4_pred_data_stride;
1184*c83a76b0SSuyog Pawar 
1185*c83a76b0SSuyog Pawar } merge_skip_pred_data_t;
1186*c83a76b0SSuyog Pawar /**
1187*c83a76b0SSuyog Pawar ******************************************************************************
1188*c83a76b0SSuyog Pawar *  @brief  Structure to hold Rate control related parameters
1189*c83a76b0SSuyog Pawar *          for each bit-rate instance and each thread
1190*c83a76b0SSuyog Pawar ******************************************************************************
1191*c83a76b0SSuyog Pawar */
1192*c83a76b0SSuyog Pawar typedef struct
1193*c83a76b0SSuyog Pawar {
1194*c83a76b0SSuyog Pawar     /**
1195*c83a76b0SSuyog Pawar     *frame level open loop intra sad
1196*c83a76b0SSuyog Pawar     *
1197*c83a76b0SSuyog Pawar     */
1198*c83a76b0SSuyog Pawar     LWORD64 i8_frame_open_loop_ssd;
1199*c83a76b0SSuyog Pawar 
1200*c83a76b0SSuyog Pawar     /**
1201*c83a76b0SSuyog Pawar     *frame level open loop intra sad
1202*c83a76b0SSuyog Pawar     *
1203*c83a76b0SSuyog Pawar     */
1204*c83a76b0SSuyog Pawar     UWORD32 u4_frame_open_loop_intra_sad;
1205*c83a76b0SSuyog Pawar     /**
1206*c83a76b0SSuyog Pawar     * frame level intra sad accumulator
1207*c83a76b0SSuyog Pawar     */
1208*c83a76b0SSuyog Pawar     UWORD32 u4_frame_intra_sad;
1209*c83a76b0SSuyog Pawar 
1210*c83a76b0SSuyog Pawar     /**
1211*c83a76b0SSuyog Pawar     *  frame level sad accumulator
1212*c83a76b0SSuyog Pawar     */
1213*c83a76b0SSuyog Pawar     UWORD32 u4_frame_sad_acc;
1214*c83a76b0SSuyog Pawar 
1215*c83a76b0SSuyog Pawar     /**
1216*c83a76b0SSuyog Pawar     *  frame level intra sad accumulator
1217*c83a76b0SSuyog Pawar     */
1218*c83a76b0SSuyog Pawar     UWORD32 u4_frame_inter_sad_acc;
1219*c83a76b0SSuyog Pawar 
1220*c83a76b0SSuyog Pawar     /**
1221*c83a76b0SSuyog Pawar     *  frame level inter sad accumulator
1222*c83a76b0SSuyog Pawar     */
1223*c83a76b0SSuyog Pawar     UWORD32 u4_frame_intra_sad_acc;
1224*c83a76b0SSuyog Pawar 
1225*c83a76b0SSuyog Pawar     /**
1226*c83a76b0SSuyog Pawar     *  frame level cost accumulator
1227*c83a76b0SSuyog Pawar     */
1228*c83a76b0SSuyog Pawar     LWORD64 i8_frame_cost_acc;
1229*c83a76b0SSuyog Pawar 
1230*c83a76b0SSuyog Pawar     /**
1231*c83a76b0SSuyog Pawar     *  frame level intra cost accumulator
1232*c83a76b0SSuyog Pawar     */
1233*c83a76b0SSuyog Pawar     LWORD64 i8_frame_inter_cost_acc;
1234*c83a76b0SSuyog Pawar 
1235*c83a76b0SSuyog Pawar     /**
1236*c83a76b0SSuyog Pawar     *  frame level inter cost accumulator
1237*c83a76b0SSuyog Pawar     */
1238*c83a76b0SSuyog Pawar     LWORD64 i8_frame_intra_cost_acc;
1239*c83a76b0SSuyog Pawar 
1240*c83a76b0SSuyog Pawar     /**
1241*c83a76b0SSuyog Pawar     * frame level rdopt bits accumulator
1242*c83a76b0SSuyog Pawar     */
1243*c83a76b0SSuyog Pawar     UWORD32 u4_frame_rdopt_bits;
1244*c83a76b0SSuyog Pawar 
1245*c83a76b0SSuyog Pawar     /**
1246*c83a76b0SSuyog Pawar     * frame level rdopt header bits accumulator
1247*c83a76b0SSuyog Pawar     */
1248*c83a76b0SSuyog Pawar     UWORD32 u4_frame_rdopt_header_bits;
1249*c83a76b0SSuyog Pawar 
1250*c83a76b0SSuyog Pawar     /* Sum the Qps of each 8*8 block in CU
1251*c83a76b0SSuyog Pawar     * 8*8 block is considered as Min CU size possible as per standard is 8
1252*c83a76b0SSuyog Pawar     * 0 corresponds to INTER and 1 corresponds to INTRA
1253*c83a76b0SSuyog Pawar     */
1254*c83a76b0SSuyog Pawar     WORD32 i4_qp_normalized_8x8_cu_sum[2];
1255*c83a76b0SSuyog Pawar 
1256*c83a76b0SSuyog Pawar     /* Count the number of 8x8 blocks in each CU type (INTER/INTRA)
1257*c83a76b0SSuyog Pawar     * 0 corresponds to INTER and 1 corresponds to INTRA
1258*c83a76b0SSuyog Pawar     */
1259*c83a76b0SSuyog Pawar     WORD32 i4_8x8_cu_sum[2];
1260*c83a76b0SSuyog Pawar 
1261*c83a76b0SSuyog Pawar     /* SAD/Qscale accumulated over all CUs. CU size is inherently
1262*c83a76b0SSuyog Pawar     * taken care in SAD
1263*c83a76b0SSuyog Pawar     */
1264*c83a76b0SSuyog Pawar     LWORD64 i8_sad_by_qscale[2];
1265*c83a76b0SSuyog Pawar 
1266*c83a76b0SSuyog Pawar } enc_loop_rc_params_t;
1267*c83a76b0SSuyog Pawar /**
1268*c83a76b0SSuyog Pawar ******************************************************************************
1269*c83a76b0SSuyog Pawar *  @brief  CU information structure. This is to store the
1270*c83a76b0SSuyog Pawar *  CU final out after Recursion
1271*c83a76b0SSuyog Pawar ******************************************************************************
1272*c83a76b0SSuyog Pawar */
1273*c83a76b0SSuyog Pawar typedef struct ihevce_enc_cu_node_ctxt_t
1274*c83a76b0SSuyog Pawar {
1275*c83a76b0SSuyog Pawar     /* CU params */
1276*c83a76b0SSuyog Pawar     /** CU X position in terms of min CU (8x8) units */
1277*c83a76b0SSuyog Pawar     UWORD8 b3_cu_pos_x : 3;
1278*c83a76b0SSuyog Pawar 
1279*c83a76b0SSuyog Pawar     /** CU Y position in terms of min CU (8x8) units */
1280*c83a76b0SSuyog Pawar     UWORD8 b3_cu_pos_y : 3;
1281*c83a76b0SSuyog Pawar 
1282*c83a76b0SSuyog Pawar     /** reserved bytes */
1283*c83a76b0SSuyog Pawar     UWORD8 b2_reserved : 2;
1284*c83a76b0SSuyog Pawar 
1285*c83a76b0SSuyog Pawar     /** CU size 2N (width or height) in pixels */
1286*c83a76b0SSuyog Pawar     UWORD8 u1_cu_size;
1287*c83a76b0SSuyog Pawar 
1288*c83a76b0SSuyog Pawar     /**
1289*c83a76b0SSuyog Pawar     * array for storing cu level final params for a given mode
1290*c83a76b0SSuyog Pawar     * one best and one current is required
1291*c83a76b0SSuyog Pawar     */
1292*c83a76b0SSuyog Pawar     enc_loop_cu_final_prms_t s_cu_prms;
1293*c83a76b0SSuyog Pawar 
1294*c83a76b0SSuyog Pawar     /**
1295*c83a76b0SSuyog Pawar     * array for storing cu level final params for a given mode
1296*c83a76b0SSuyog Pawar     * one best and one current is required
1297*c83a76b0SSuyog Pawar     */
1298*c83a76b0SSuyog Pawar     enc_loop_cu_final_prms_t *ps_cu_prms;
1299*c83a76b0SSuyog Pawar 
1300*c83a76b0SSuyog Pawar     /* flag to indicate if current CU is the first
1301*c83a76b0SSuyog Pawar     CU of the Quantisation group*/
1302*c83a76b0SSuyog Pawar     UWORD32 b1_first_cu_in_qg : 1;
1303*c83a76b0SSuyog Pawar 
1304*c83a76b0SSuyog Pawar     /** qp used during for CU
1305*c83a76b0SSuyog Pawar     * @remarks :
1306*c83a76b0SSuyog Pawar     */
1307*c83a76b0SSuyog Pawar     WORD8 i1_cu_qp;
1308*c83a76b0SSuyog Pawar 
1309*c83a76b0SSuyog Pawar } ihevce_enc_cu_node_ctxt_t;
1310*c83a76b0SSuyog Pawar 
1311*c83a76b0SSuyog Pawar typedef struct
1312*c83a76b0SSuyog Pawar {
1313*c83a76b0SSuyog Pawar     WORD32 i4_sad;
1314*c83a76b0SSuyog Pawar 
1315*c83a76b0SSuyog Pawar     WORD32 i4_mv_cost;
1316*c83a76b0SSuyog Pawar 
1317*c83a76b0SSuyog Pawar     WORD32 i4_tot_cost;
1318*c83a76b0SSuyog Pawar 
1319*c83a76b0SSuyog Pawar     WORD8 i1_ref_idx;
1320*c83a76b0SSuyog Pawar 
1321*c83a76b0SSuyog Pawar     mv_t s_mv;
1322*c83a76b0SSuyog Pawar 
1323*c83a76b0SSuyog Pawar } block_merge_nodes_t;
1324*c83a76b0SSuyog Pawar 
1325*c83a76b0SSuyog Pawar /**
1326*c83a76b0SSuyog Pawar ******************************************************************************
1327*c83a76b0SSuyog Pawar *  @brief  This struct is used for storing output of block merge
1328*c83a76b0SSuyog Pawar ******************************************************************************
1329*c83a76b0SSuyog Pawar */
1330*c83a76b0SSuyog Pawar typedef struct
1331*c83a76b0SSuyog Pawar {
1332*c83a76b0SSuyog Pawar     block_merge_nodes_t *aps_best_results[MAX_NUM_PARTS];
1333*c83a76b0SSuyog Pawar 
1334*c83a76b0SSuyog Pawar     /* Contains the best uni dir for each partition type */
1335*c83a76b0SSuyog Pawar     WORD32 ai4_best_uni_dir[MAX_NUM_PARTS];
1336*c83a76b0SSuyog Pawar 
1337*c83a76b0SSuyog Pawar     /* Contains the best pred dir for each partition type */
1338*c83a76b0SSuyog Pawar     WORD32 ai4_best_pred_dir[MAX_NUM_PARTS];
1339*c83a76b0SSuyog Pawar 
1340*c83a76b0SSuyog Pawar     WORD32 i4_tot_cost;
1341*c83a76b0SSuyog Pawar 
1342*c83a76b0SSuyog Pawar     PART_TYPE_T e_part_type;
1343*c83a76b0SSuyog Pawar } block_merge_results_t;
1344*c83a76b0SSuyog Pawar 
1345*c83a76b0SSuyog Pawar /**
1346*c83a76b0SSuyog Pawar ******************************************************************************
1347*c83a76b0SSuyog Pawar *  @brief  This struct is used for storing output of block merge and also
1348*c83a76b0SSuyog Pawar *          all of the intermediate results required
1349*c83a76b0SSuyog Pawar ******************************************************************************
1350*c83a76b0SSuyog Pawar */
1351*c83a76b0SSuyog Pawar typedef struct
1352*c83a76b0SSuyog Pawar {
1353*c83a76b0SSuyog Pawar     block_merge_results_t as_best_results[3 + 1][NUM_BEST_ME_OUTPUTS];
1354*c83a76b0SSuyog Pawar 
1355*c83a76b0SSuyog Pawar     block_merge_nodes_t as_nodes[3][TOT_NUM_PARTS][NUM_BEST_ME_OUTPUTS];
1356*c83a76b0SSuyog Pawar 
1357*c83a76b0SSuyog Pawar     WORD32 part_mask;
1358*c83a76b0SSuyog Pawar 
1359*c83a76b0SSuyog Pawar     WORD32 num_results_per_part;
1360*c83a76b0SSuyog Pawar 
1361*c83a76b0SSuyog Pawar     WORD32 num_best_results;
1362*c83a76b0SSuyog Pawar 
1363*c83a76b0SSuyog Pawar     /**
1364*c83a76b0SSuyog Pawar     * Overall best CU cost, while other entries store CU costs
1365*c83a76b0SSuyog Pawar     * in single direction, this is best CU cost, where each
1366*c83a76b0SSuyog Pawar     * partition cost is evaluated as best of uni/bi
1367*c83a76b0SSuyog Pawar     */
1368*c83a76b0SSuyog Pawar     WORD32 best_cu_cost;
1369*c83a76b0SSuyog Pawar 
1370*c83a76b0SSuyog Pawar } block_merge_data_t;
1371*c83a76b0SSuyog Pawar /**
1372*c83a76b0SSuyog Pawar ******************************************************************************
1373*c83a76b0SSuyog Pawar *  @brief  CU nbr information structure. This is to store the
1374*c83a76b0SSuyog Pawar *  neighbour information for final reconstruction function
1375*c83a76b0SSuyog Pawar ******************************************************************************
1376*c83a76b0SSuyog Pawar */
1377*c83a76b0SSuyog Pawar typedef struct
1378*c83a76b0SSuyog Pawar {
1379*c83a76b0SSuyog Pawar     /* Pointer to top-left nbr */
1380*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_topleft_nbr_4x4;
1381*c83a76b0SSuyog Pawar     /* Pointer to left nbr */
1382*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_left_nbr_4x4;
1383*c83a76b0SSuyog Pawar     /* Pointer to top nbr */
1384*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_top_nbr_4x4;
1385*c83a76b0SSuyog Pawar     /* stride of left_nbr_4x4 */
1386*c83a76b0SSuyog Pawar     WORD32 nbr_4x4_left_strd;
1387*c83a76b0SSuyog Pawar 
1388*c83a76b0SSuyog Pawar     /* Pointer to CU top */
1389*c83a76b0SSuyog Pawar     UWORD8 *pu1_cu_top;
1390*c83a76b0SSuyog Pawar 
1391*c83a76b0SSuyog Pawar     UWORD16 *pu2_cu_top;
1392*c83a76b0SSuyog Pawar 
1393*c83a76b0SSuyog Pawar     /* Pointer to CU top-left */
1394*c83a76b0SSuyog Pawar     UWORD8 *pu1_cu_top_left;
1395*c83a76b0SSuyog Pawar 
1396*c83a76b0SSuyog Pawar     UWORD16 *pu2_cu_top_left;
1397*c83a76b0SSuyog Pawar 
1398*c83a76b0SSuyog Pawar     /* Pointer to CU left */
1399*c83a76b0SSuyog Pawar     UWORD8 *pu1_cu_left;
1400*c83a76b0SSuyog Pawar 
1401*c83a76b0SSuyog Pawar     UWORD16 *pu2_cu_left;
1402*c83a76b0SSuyog Pawar 
1403*c83a76b0SSuyog Pawar     /* stride of left pointer */
1404*c83a76b0SSuyog Pawar     WORD32 cu_left_stride;
1405*c83a76b0SSuyog Pawar } cu_nbr_prms_t;
1406*c83a76b0SSuyog Pawar 
1407*c83a76b0SSuyog Pawar /** Structure to save the flags required for Final mode Reconstruction
1408*c83a76b0SSuyog Pawar function. These flags are set based on quality presets and
1409*c83a76b0SSuyog Pawar the bit-rate we are working on */
1410*c83a76b0SSuyog Pawar typedef struct
1411*c83a76b0SSuyog Pawar {
1412*c83a76b0SSuyog Pawar     /** Flag to indicate whether Luma pred data need to recomputed in the
1413*c83a76b0SSuyog Pawar     final_recon function. Now disabled for all modes */
1414*c83a76b0SSuyog Pawar     UWORD8 u1_eval_luma_pred_data;
1415*c83a76b0SSuyog Pawar 
1416*c83a76b0SSuyog Pawar     /** Flag to indicate whether Chroma pred data need to recomputed in the
1417*c83a76b0SSuyog Pawar     final_recon function. Now disabled for MedSpeed only */
1418*c83a76b0SSuyog Pawar     UWORD8 u1_eval_chroma_pred_data;
1419*c83a76b0SSuyog Pawar 
1420*c83a76b0SSuyog Pawar     /** Flag to indicate whether header data need to recomputed in the
1421*c83a76b0SSuyog Pawar     final_recon function. Now disabled for all modes */
1422*c83a76b0SSuyog Pawar     UWORD8 u1_eval_header_data;
1423*c83a76b0SSuyog Pawar 
1424*c83a76b0SSuyog Pawar     UWORD8 u1_eval_recon_data;
1425*c83a76b0SSuyog Pawar } cu_final_recon_flags_t;
1426*c83a76b0SSuyog Pawar 
1427*c83a76b0SSuyog Pawar /**
1428*c83a76b0SSuyog Pawar ******************************************************************************
1429*c83a76b0SSuyog Pawar *  @brief  structure to save pred data of ME cand. 1 ping-pong to store the
1430*c83a76b0SSuyog Pawar *  the best and current luma cand. 1 buffer to store the best chroma pred
1431*c83a76b0SSuyog Pawar ******************************************************************************
1432*c83a76b0SSuyog Pawar */
1433*c83a76b0SSuyog Pawar typedef struct
1434*c83a76b0SSuyog Pawar {
1435*c83a76b0SSuyog Pawar     /** Pointers to store luma pred data of me/intra cand.(2) and chroma(1) */
1436*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred_data[NUM_CU_ME_INTRA_PRED_IDX];
1437*c83a76b0SSuyog Pawar 
1438*c83a76b0SSuyog Pawar     UWORD16 *pu2_pred_data[NUM_CU_ME_INTRA_PRED_IDX];
1439*c83a76b0SSuyog Pawar 
1440*c83a76b0SSuyog Pawar     /** Stride to store the predicted data of me/intra cand.(2) and chroma(1) */
1441*c83a76b0SSuyog Pawar     WORD32 ai4_pred_data_stride[NUM_CU_ME_INTRA_PRED_IDX];
1442*c83a76b0SSuyog Pawar     /** Counter saying how many pointers are assigned */
1443*c83a76b0SSuyog Pawar     WORD32 i4_pointer_count;
1444*c83a76b0SSuyog Pawar 
1445*c83a76b0SSuyog Pawar } cu_me_intra_pred_prms_t;
1446*c83a76b0SSuyog Pawar 
1447*c83a76b0SSuyog Pawar /**
1448*c83a76b0SSuyog Pawar ******************************************************************************
1449*c83a76b0SSuyog Pawar *  @brief  Chroma RDOPT context structure
1450*c83a76b0SSuyog Pawar ******************************************************************************
1451*c83a76b0SSuyog Pawar */
1452*c83a76b0SSuyog Pawar typedef struct
1453*c83a76b0SSuyog Pawar {
1454*c83a76b0SSuyog Pawar     /** Storing the inverse quantized data (cb) for the special modes*/
1455*c83a76b0SSuyog Pawar     WORD16 ai2_iq_data_cb[(MAX_TU_SIZE * MAX_TU_SIZE) << 1];
1456*c83a76b0SSuyog Pawar 
1457*c83a76b0SSuyog Pawar     /** Storing the inverse quantized data (cr) for the special modes*/
1458*c83a76b0SSuyog Pawar     WORD16 ai2_iq_data_cr[(MAX_TU_SIZE * MAX_TU_SIZE) << 1];
1459*c83a76b0SSuyog Pawar 
1460*c83a76b0SSuyog Pawar     /** Storing the scan coeffs (cb) for the special modes*/
1461*c83a76b0SSuyog Pawar     UWORD8 au1_scan_coeff_cb[2][(MAX_TU_IN_CTB >> 1) * MAX_SCAN_COEFFS_BYTES_4x4];
1462*c83a76b0SSuyog Pawar 
1463*c83a76b0SSuyog Pawar     /** Storing the scan coeffs (cb) for the special modes*/
1464*c83a76b0SSuyog Pawar     UWORD8 au1_scan_coeff_cr[2][(MAX_TU_IN_CTB >> 1) * MAX_SCAN_COEFFS_BYTES_4x4];
1465*c83a76b0SSuyog Pawar 
1466*c83a76b0SSuyog Pawar     /** Max number of bytes filled in scan coeff data (cb) per TU*/
1467*c83a76b0SSuyog Pawar     WORD32 ai4_num_bytes_scan_coeff_cb_per_tu[2][MAX_TU_IN_TU_EQ_DIV_2];
1468*c83a76b0SSuyog Pawar 
1469*c83a76b0SSuyog Pawar     /** Max number of bytes filled in scan coeff data (cr) per TU*/
1470*c83a76b0SSuyog Pawar     WORD32 ai4_num_bytes_scan_coeff_cr_per_tu[2][MAX_TU_IN_TU_EQ_DIV_2];
1471*c83a76b0SSuyog Pawar 
1472*c83a76b0SSuyog Pawar     /** Stride of the iq buffer*/
1473*c83a76b0SSuyog Pawar     WORD32 i4_iq_buff_stride;
1474*c83a76b0SSuyog Pawar 
1475*c83a76b0SSuyog Pawar     /** Storing the pred data
1476*c83a76b0SSuyog Pawar     The predicted data is always interleaved. Therefore the size of this array will be
1477*c83a76b0SSuyog Pawar     ((MAX_TU_SIZE * MAX_TU_SIZE) >> 2) * 2)*/
1478*c83a76b0SSuyog Pawar     void *pv_pred_data;
1479*c83a76b0SSuyog Pawar 
1480*c83a76b0SSuyog Pawar     /** Predicted data stride*/
1481*c83a76b0SSuyog Pawar     WORD32 i4_pred_stride;
1482*c83a76b0SSuyog Pawar 
1483*c83a76b0SSuyog Pawar     /** Storing the cbfs for each tu
1484*c83a76b0SSuyog Pawar     For 1 tu case, only the 0th element will be valid*/
1485*c83a76b0SSuyog Pawar     UWORD8 au1_cbf_cb[2][MAX_TU_IN_TU_EQ_DIV_2];
1486*c83a76b0SSuyog Pawar 
1487*c83a76b0SSuyog Pawar     /** Storing the cbfs for each tu
1488*c83a76b0SSuyog Pawar     For 1 tu case, only the 0th element will be valid*/
1489*c83a76b0SSuyog Pawar     UWORD8 au1_cbf_cr[2][MAX_TU_IN_TU_EQ_DIV_2];
1490*c83a76b0SSuyog Pawar 
1491*c83a76b0SSuyog Pawar     /** To store the cabac ctxt model updated by the RDOPT of best chroma mode
1492*c83a76b0SSuyog Pawar     [0] : for 1 TU case, [1] : for 4 TU case */
1493*c83a76b0SSuyog Pawar     UWORD8 au1_chrm_satd_updated_ctxt_models[IHEVC_CAB_CTXT_END];
1494*c83a76b0SSuyog Pawar 
1495*c83a76b0SSuyog Pawar     /** Best SATD chroma mode, [0] : for 1 TU case (TU_EQ_CU) , [1] : for 4 TU case
1496*c83a76b0SSuyog Pawar     Values : 0(PLANAR), 1(VERT), 2(HOR), 3(DC) chroma mode per each TU */
1497*c83a76b0SSuyog Pawar     UWORD8 u1_best_cr_mode;
1498*c83a76b0SSuyog Pawar 
1499*c83a76b0SSuyog Pawar     /** Best SATD chroma mode's RDOPT cost, [0] : for 1 TU case, [1] : for 4 TU case */
1500*c83a76b0SSuyog Pawar     LWORD64 i8_chroma_best_rdopt;
1501*c83a76b0SSuyog Pawar 
1502*c83a76b0SSuyog Pawar     /* Account for coding b3_chroma_intra_pred_mode prefix and suffix bins */
1503*c83a76b0SSuyog Pawar     /* This is done by adding the bits for signalling chroma mode (0-3)    */
1504*c83a76b0SSuyog Pawar     /* and subtracting the bits for chroma mode same as luma mode (4)      */
1505*c83a76b0SSuyog Pawar     LWORD64 i8_cost_to_encode_chroma_mode;
1506*c83a76b0SSuyog Pawar 
1507*c83a76b0SSuyog Pawar     /** Best SATD chroma mode's tu bits, [0] : for 1 TU case, [1] : for 4 TU case */
1508*c83a76b0SSuyog Pawar     WORD32 i4_chrm_tu_bits;
1509*c83a76b0SSuyog Pawar 
1510*c83a76b0SSuyog Pawar     /** Storing the zero col values for each TU for cb*/
1511*c83a76b0SSuyog Pawar     WORD32 ai4_zero_col_cb[2][MAX_TU_IN_TU_EQ_DIV_2];
1512*c83a76b0SSuyog Pawar 
1513*c83a76b0SSuyog Pawar     /** Storing the zero col values for each TU for cr*/
1514*c83a76b0SSuyog Pawar     WORD32 ai4_zero_col_cr[2][MAX_TU_IN_TU_EQ_DIV_2];
1515*c83a76b0SSuyog Pawar 
1516*c83a76b0SSuyog Pawar     /** Storing the zero row values for each TU for cb*/
1517*c83a76b0SSuyog Pawar     WORD32 ai4_zero_row_cb[2][MAX_TU_IN_TU_EQ_DIV_2];
1518*c83a76b0SSuyog Pawar 
1519*c83a76b0SSuyog Pawar     /** Storing the zero row values for each TU for cr*/
1520*c83a76b0SSuyog Pawar     WORD32 ai4_zero_row_cr[2][MAX_TU_IN_TU_EQ_DIV_2];
1521*c83a76b0SSuyog Pawar } chroma_intra_satd_ctxt_t;
1522*c83a76b0SSuyog Pawar 
1523*c83a76b0SSuyog Pawar /**
1524*c83a76b0SSuyog Pawar ******************************************************************************
1525*c83a76b0SSuyog Pawar *  @brief  Chroma RDOPT context structure
1526*c83a76b0SSuyog Pawar ******************************************************************************
1527*c83a76b0SSuyog Pawar */
1528*c83a76b0SSuyog Pawar typedef struct
1529*c83a76b0SSuyog Pawar {
1530*c83a76b0SSuyog Pawar     /** Chroma SATD context structure. It is an array of two to account for the TU_EQ_CU candidate
1531*c83a76b0SSuyog Pawar     and the TU_EQ_CU_DIV2 candidate*/
1532*c83a76b0SSuyog Pawar     chroma_intra_satd_ctxt_t as_chr_intra_satd_ctxt[NUM_POSSIBLE_TU_SIZES_CHR_INTRA_SATD];
1533*c83a76b0SSuyog Pawar 
1534*c83a76b0SSuyog Pawar     /** Chroma SATD has has to be evaluated only for the HIGH QUALITY */
1535*c83a76b0SSuyog Pawar     UWORD8 u1_eval_chrm_satd;
1536*c83a76b0SSuyog Pawar 
1537*c83a76b0SSuyog Pawar     /** Chroma RDOPT has to be evaluated only for the HIGH QUALITY / MEDIUM SPEED preset */
1538*c83a76b0SSuyog Pawar     UWORD8 u1_eval_chrm_rdopt;
1539*c83a76b0SSuyog Pawar 
1540*c83a76b0SSuyog Pawar } ihevce_chroma_rdopt_ctxt_t;
1541*c83a76b0SSuyog Pawar 
1542*c83a76b0SSuyog Pawar typedef struct
1543*c83a76b0SSuyog Pawar {
1544*c83a76b0SSuyog Pawar     inter_cu_results_t s_cu_results;
1545*c83a76b0SSuyog Pawar 
1546*c83a76b0SSuyog Pawar     inter_pu_results_t s_pu_results;
1547*c83a76b0SSuyog Pawar } block_merge_output_t;
1548*c83a76b0SSuyog Pawar 
1549*c83a76b0SSuyog Pawar /**
1550*c83a76b0SSuyog Pawar ******************************************************************************
1551*c83a76b0SSuyog Pawar *  @brief  Structure to store the Merge/Skip Cand. for EncLoop
1552*c83a76b0SSuyog Pawar ******************************************************************************
1553*c83a76b0SSuyog Pawar */
1554*c83a76b0SSuyog Pawar typedef struct
1555*c83a76b0SSuyog Pawar {
1556*c83a76b0SSuyog Pawar     /** List of all  merge/skip candidates to be evalauted (SATD/RDOPT) for
1557*c83a76b0SSuyog Pawar     * this CU
1558*c83a76b0SSuyog Pawar     */
1559*c83a76b0SSuyog Pawar     cu_inter_cand_t as_cu_inter_merge_skip_cand[MAX_NUM_CU_MERGE_SKIP_CAND];
1560*c83a76b0SSuyog Pawar 
1561*c83a76b0SSuyog Pawar     /** number of merge/skip candidates
1562*c83a76b0SSuyog Pawar     */
1563*c83a76b0SSuyog Pawar     UWORD8 u1_num_merge_cands;
1564*c83a76b0SSuyog Pawar 
1565*c83a76b0SSuyog Pawar     UWORD8 u1_num_skip_cands;
1566*c83a76b0SSuyog Pawar 
1567*c83a76b0SSuyog Pawar     UWORD8 u1_num_merge_skip_cands;
1568*c83a76b0SSuyog Pawar 
1569*c83a76b0SSuyog Pawar } cu_inter_merge_skip_t;
1570*c83a76b0SSuyog Pawar 
1571*c83a76b0SSuyog Pawar /** Structure to store the Mixed mode Cand. for EncLoop */
1572*c83a76b0SSuyog Pawar typedef struct
1573*c83a76b0SSuyog Pawar {
1574*c83a76b0SSuyog Pawar     cu_inter_cand_t as_cu_data[MAX_NUM_MIXED_MODE_INTER_RDO_CANDS];
1575*c83a76b0SSuyog Pawar 
1576*c83a76b0SSuyog Pawar     UWORD8 u1_num_mixed_mode_type0_cands;
1577*c83a76b0SSuyog Pawar 
1578*c83a76b0SSuyog Pawar     UWORD8 u1_num_mixed_mode_type1_cands;
1579*c83a76b0SSuyog Pawar 
1580*c83a76b0SSuyog Pawar } cu_mixed_mode_inter_t;
1581*c83a76b0SSuyog Pawar 
1582*c83a76b0SSuyog Pawar typedef struct
1583*c83a76b0SSuyog Pawar {
1584*c83a76b0SSuyog Pawar     /* +2 because an additional buffer is required for */
1585*c83a76b0SSuyog Pawar     /* storing both cur and best during merge eval */
1586*c83a76b0SSuyog Pawar     void *apv_inter_pred_data[MAX_NUM_INTER_RDO_CANDS + 4];
1587*c83a76b0SSuyog Pawar 
1588*c83a76b0SSuyog Pawar     /* Bit field used to determine the indices of free bufs in 'apv_pred_data' buf array */
1589*c83a76b0SSuyog Pawar     UWORD32 u4_is_buf_in_use;
1590*c83a76b0SSuyog Pawar 
1591*c83a76b0SSuyog Pawar     /* Assumption is that the same stride is used for the */
1592*c83a76b0SSuyog Pawar     /* entire set of buffers above and is equal to the */
1593*c83a76b0SSuyog Pawar     /* CU size */
1594*c83a76b0SSuyog Pawar     WORD32 i4_pred_stride;
1595*c83a76b0SSuyog Pawar 
1596*c83a76b0SSuyog Pawar } ihevce_inter_pred_buf_data_t;
1597*c83a76b0SSuyog Pawar /** Structure to store the Inter Cand. info in EncLoop */
1598*c83a76b0SSuyog Pawar typedef struct
1599*c83a76b0SSuyog Pawar {
1600*c83a76b0SSuyog Pawar     cu_inter_cand_t *aps_cu_data[MAX_NUM_INTER_RDO_CANDS];
1601*c83a76b0SSuyog Pawar 
1602*c83a76b0SSuyog Pawar     UWORD32 au4_cost[MAX_NUM_INTER_RDO_CANDS];
1603*c83a76b0SSuyog Pawar 
1604*c83a76b0SSuyog Pawar     UWORD8 au1_pred_buf_idx[MAX_NUM_INTER_RDO_CANDS];
1605*c83a76b0SSuyog Pawar 
1606*c83a76b0SSuyog Pawar     UWORD32 u4_src_variance;
1607*c83a76b0SSuyog Pawar 
1608*c83a76b0SSuyog Pawar     UWORD8 u1_idx_of_worst_cost_in_cost_array;
1609*c83a76b0SSuyog Pawar 
1610*c83a76b0SSuyog Pawar     UWORD8 u1_idx_of_worst_cost_in_pred_buf_array;
1611*c83a76b0SSuyog Pawar 
1612*c83a76b0SSuyog Pawar     UWORD8 u1_num_inter_cands;
1613*c83a76b0SSuyog Pawar 
1614*c83a76b0SSuyog Pawar } inter_cu_mode_info_t;
1615*c83a76b0SSuyog Pawar typedef struct
1616*c83a76b0SSuyog Pawar {
1617*c83a76b0SSuyog Pawar     /*Frame level base pointer of buffers for each ctb row to store the top pixels
1618*c83a76b0SSuyog Pawar     *and top left pixel for the next ctb row.These buffers are common accross all threads
1619*c83a76b0SSuyog Pawar     */
1620*c83a76b0SSuyog Pawar     UWORD8 *apu1_sao_src_frm_top_luma[MAX_NUM_ENC_LOOP_PARALLEL];
1621*c83a76b0SSuyog Pawar     /*Ctb level pointer to buffer to store the top pixels
1622*c83a76b0SSuyog Pawar     *and top left pixel for the next ctb row.These buffers are common accross all threads
1623*c83a76b0SSuyog Pawar     */
1624*c83a76b0SSuyog Pawar     UWORD8 *pu1_curr_sao_src_top_luma;
1625*c83a76b0SSuyog Pawar     /*Buffer to store the left boundary before
1626*c83a76b0SSuyog Pawar     * doing sao on current ctb for the next ctb in the current row
1627*c83a76b0SSuyog Pawar     */
1628*c83a76b0SSuyog Pawar     UWORD8 au1_sao_src_left_luma[MAX_CTB_SIZE];
1629*c83a76b0SSuyog Pawar     /*Frame level base pointer of buffers for each ctb row to store the top pixels
1630*c83a76b0SSuyog Pawar     *and top left pixel for the next ctb row.These buffers are common accross all threads
1631*c83a76b0SSuyog Pawar     */
1632*c83a76b0SSuyog Pawar     UWORD8 *apu1_sao_src_frm_top_chroma[MAX_NUM_ENC_LOOP_PARALLEL];
1633*c83a76b0SSuyog Pawar 
1634*c83a76b0SSuyog Pawar     WORD32 i4_frm_top_chroma_buf_stride;
1635*c83a76b0SSuyog Pawar 
1636*c83a76b0SSuyog Pawar     /*Ctb level pointer to buffer to store the top chroma pixels
1637*c83a76b0SSuyog Pawar     *and top left pixel for the next ctb row.These buffers are common accross all threads
1638*c83a76b0SSuyog Pawar     */
1639*c83a76b0SSuyog Pawar     UWORD8 *pu1_curr_sao_src_top_chroma;
1640*c83a76b0SSuyog Pawar 
1641*c83a76b0SSuyog Pawar     /*Scratch buffer to store the left boundary before
1642*c83a76b0SSuyog Pawar     * doing sao on current ctb for the next ctb in the current row
1643*c83a76b0SSuyog Pawar     */
1644*c83a76b0SSuyog Pawar     UWORD8 au1_sao_src_left_chroma[MAX_CTB_SIZE * 2];
1645*c83a76b0SSuyog Pawar 
1646*c83a76b0SSuyog Pawar     /**
1647*c83a76b0SSuyog Pawar     * Luma recon buffer
1648*c83a76b0SSuyog Pawar     */
1649*c83a76b0SSuyog Pawar     UWORD8 *pu1_frm_luma_recon_buf;
1650*c83a76b0SSuyog Pawar     /**
1651*c83a76b0SSuyog Pawar     * Chroma recon buffer
1652*c83a76b0SSuyog Pawar     */
1653*c83a76b0SSuyog Pawar     UWORD8 *pu1_frm_chroma_recon_buf;
1654*c83a76b0SSuyog Pawar     /**
1655*c83a76b0SSuyog Pawar     * Luma recon buffer for curr ctb
1656*c83a76b0SSuyog Pawar     */
1657*c83a76b0SSuyog Pawar     UWORD8 *pu1_cur_luma_recon_buf;
1658*c83a76b0SSuyog Pawar     /**
1659*c83a76b0SSuyog Pawar     * Chroma recon buffer for curr ctb
1660*c83a76b0SSuyog Pawar     */
1661*c83a76b0SSuyog Pawar     UWORD8 *pu1_cur_chroma_recon_buf;
1662*c83a76b0SSuyog Pawar     /**
1663*c83a76b0SSuyog Pawar     * Luma src buffer
1664*c83a76b0SSuyog Pawar     */
1665*c83a76b0SSuyog Pawar     UWORD8 *pu1_frm_luma_src_buf;
1666*c83a76b0SSuyog Pawar     /**
1667*c83a76b0SSuyog Pawar     * Chroma src buffer
1668*c83a76b0SSuyog Pawar     */
1669*c83a76b0SSuyog Pawar     UWORD8 *pu1_frm_chroma_src_buf;
1670*c83a76b0SSuyog Pawar     /**
1671*c83a76b0SSuyog Pawar     * Luma src(input yuv) buffer for curr ctb
1672*c83a76b0SSuyog Pawar     */
1673*c83a76b0SSuyog Pawar     UWORD8 *pu1_cur_luma_src_buf;
1674*c83a76b0SSuyog Pawar     /**
1675*c83a76b0SSuyog Pawar     * Chroma src buffer for curr ctb
1676*c83a76b0SSuyog Pawar     */
1677*c83a76b0SSuyog Pawar     UWORD8 *pu1_cur_chroma_src_buf;
1678*c83a76b0SSuyog Pawar     /* Left luma scratch buffer required for sao RD optimisation*/
1679*c83a76b0SSuyog Pawar     UWORD8 au1_left_luma_scratch[MAX_CTB_SIZE];
1680*c83a76b0SSuyog Pawar 
1681*c83a76b0SSuyog Pawar     /* Left chroma scratch buffer required for sao RD optimisation*/
1682*c83a76b0SSuyog Pawar     /* Min size required= MAX_CTB_SIZE/2 * 2
1683*c83a76b0SSuyog Pawar     * Multiplied by 2 because size reuired is MAX_CTB_SIZE/2 each for U and V
1684*c83a76b0SSuyog Pawar     */
1685*c83a76b0SSuyog Pawar     UWORD8 au1_left_chroma_scratch[MAX_CTB_SIZE * 2];
1686*c83a76b0SSuyog Pawar 
1687*c83a76b0SSuyog Pawar     /* Top luma scratch buffer required for sao RD optimisation*/
1688*c83a76b0SSuyog Pawar     UWORD8 au1_top_luma_scratch[MAX_CTB_SIZE + 2];  // +1 for top left pixel and +1 for top right
1689*c83a76b0SSuyog Pawar 
1690*c83a76b0SSuyog Pawar     /* Top chroma scratch buffer required for sao RD optimisation*/
1691*c83a76b0SSuyog Pawar     UWORD8 au1_top_chroma_scratch[MAX_CTB_SIZE + 4];  // +2 for top left pixel and +2 for top right
1692*c83a76b0SSuyog Pawar 
1693*c83a76b0SSuyog Pawar     /* Scratch buffer to store the sao'ed output during sao RD optimisation*/
1694*c83a76b0SSuyog Pawar     /* One extra row(bot pixels) is copied to scratch buf but 2d buf copy func copies multiple of 4 ,hence
1695*c83a76b0SSuyog Pawar     MAX_CTB _SIZE + 4*/
1696*c83a76b0SSuyog Pawar     UWORD8 au1_sao_luma_scratch[PING_PONG][SCRATCH_BUF_STRIDE * (MAX_CTB_SIZE + 4)];
1697*c83a76b0SSuyog Pawar 
1698*c83a76b0SSuyog Pawar     /* Scratch buffer to store the sao'ed output during sao RD optimisation*/
1699*c83a76b0SSuyog Pawar     /* One extra row(bot pixels) is copied to scratch buf but 2d buf copy func copies multiple of 4 ,hence
1700*c83a76b0SSuyog Pawar     MAX_CTB _SIZE + 4*/
1701*c83a76b0SSuyog Pawar     UWORD8 au1_sao_chroma_scratch[PING_PONG][SCRATCH_BUF_STRIDE * (MAX_CTB_SIZE + 4)];
1702*c83a76b0SSuyog Pawar 
1703*c83a76b0SSuyog Pawar     /**
1704*c83a76b0SSuyog Pawar     * CTB size
1705*c83a76b0SSuyog Pawar     */
1706*c83a76b0SSuyog Pawar     WORD32 i4_ctb_size;
1707*c83a76b0SSuyog Pawar     /**
1708*c83a76b0SSuyog Pawar     * Luma recon buffer stride
1709*c83a76b0SSuyog Pawar     */
1710*c83a76b0SSuyog Pawar     WORD32 i4_frm_luma_recon_stride;
1711*c83a76b0SSuyog Pawar     /**
1712*c83a76b0SSuyog Pawar     * Chroma recon buffer stride
1713*c83a76b0SSuyog Pawar     */
1714*c83a76b0SSuyog Pawar     WORD32 i4_frm_chroma_recon_stride;
1715*c83a76b0SSuyog Pawar     /**
1716*c83a76b0SSuyog Pawar     * Luma recon buffer stride for curr ctb
1717*c83a76b0SSuyog Pawar     */
1718*c83a76b0SSuyog Pawar     WORD32 i4_cur_luma_recon_stride;
1719*c83a76b0SSuyog Pawar     /**
1720*c83a76b0SSuyog Pawar     * Chroma recon buffer stride for curr ctb
1721*c83a76b0SSuyog Pawar     */
1722*c83a76b0SSuyog Pawar     WORD32 i4_cur_chroma_recon_stride;
1723*c83a76b0SSuyog Pawar     /**
1724*c83a76b0SSuyog Pawar     * Luma src buffer stride
1725*c83a76b0SSuyog Pawar     */
1726*c83a76b0SSuyog Pawar     WORD32 i4_frm_luma_src_stride;
1727*c83a76b0SSuyog Pawar     /**
1728*c83a76b0SSuyog Pawar     * Chroma src buffer stride
1729*c83a76b0SSuyog Pawar     */
1730*c83a76b0SSuyog Pawar     WORD32 i4_frm_chroma_src_stride;
1731*c83a76b0SSuyog Pawar 
1732*c83a76b0SSuyog Pawar     WORD32 i4_frm_top_luma_buf_stride;
1733*c83a76b0SSuyog Pawar     /**
1734*c83a76b0SSuyog Pawar     * Luma src buffer stride for curr ctb
1735*c83a76b0SSuyog Pawar     */
1736*c83a76b0SSuyog Pawar     WORD32 i4_cur_luma_src_stride;
1737*c83a76b0SSuyog Pawar     /**
1738*c83a76b0SSuyog Pawar     * Chroma src buffer stride for curr ctb
1739*c83a76b0SSuyog Pawar     */
1740*c83a76b0SSuyog Pawar     WORD32 i4_cur_chroma_src_stride;
1741*c83a76b0SSuyog Pawar 
1742*c83a76b0SSuyog Pawar     /* Top luma buffer size */
1743*c83a76b0SSuyog Pawar     WORD32 i4_top_luma_buf_size;
1744*c83a76b0SSuyog Pawar 
1745*c83a76b0SSuyog Pawar     /* Top Chroma buffer size */
1746*c83a76b0SSuyog Pawar     WORD32 i4_top_chroma_buf_size;
1747*c83a76b0SSuyog Pawar 
1748*c83a76b0SSuyog Pawar     /*** Number of CTB units **/
1749*c83a76b0SSuyog Pawar     WORD32 i4_num_ctb_units;
1750*c83a76b0SSuyog Pawar 
1751*c83a76b0SSuyog Pawar     /**
1752*c83a76b0SSuyog Pawar     * CTB x pos
1753*c83a76b0SSuyog Pawar     */
1754*c83a76b0SSuyog Pawar     WORD32 i4_ctb_x;
1755*c83a76b0SSuyog Pawar     /**
1756*c83a76b0SSuyog Pawar     * CTB y pos
1757*c83a76b0SSuyog Pawar     */
1758*c83a76b0SSuyog Pawar     WORD32 i4_ctb_y;
1759*c83a76b0SSuyog Pawar     /* SAO block width*/
1760*c83a76b0SSuyog Pawar     WORD32 i4_sao_blk_wd;
1761*c83a76b0SSuyog Pawar 
1762*c83a76b0SSuyog Pawar     /* SAO block height*/
1763*c83a76b0SSuyog Pawar     WORD32 i4_sao_blk_ht;
1764*c83a76b0SSuyog Pawar 
1765*c83a76b0SSuyog Pawar     /* Last ctb row flag*/
1766*c83a76b0SSuyog Pawar     WORD32 i4_is_last_ctb_row;
1767*c83a76b0SSuyog Pawar 
1768*c83a76b0SSuyog Pawar     /* Last ctb col flag*/
1769*c83a76b0SSuyog Pawar     WORD32 i4_is_last_ctb_col;
1770*c83a76b0SSuyog Pawar 
1771*c83a76b0SSuyog Pawar     /* CTB aligned width */
1772*c83a76b0SSuyog Pawar     UWORD32 u4_ctb_aligned_wd;
1773*c83a76b0SSuyog Pawar 
1774*c83a76b0SSuyog Pawar     /* Number of ctbs in a row*/
1775*c83a76b0SSuyog Pawar     UWORD32 u4_num_ctbs_horz;
1776*c83a76b0SSuyog Pawar 
1777*c83a76b0SSuyog Pawar     UWORD32 u4_num_ctbs_vert;
1778*c83a76b0SSuyog Pawar     /**
1779*c83a76b0SSuyog Pawar     * Closed loop SSD Lambda
1780*c83a76b0SSuyog Pawar     * This is multiplied with bits for RD cost computations in SSD mode
1781*c83a76b0SSuyog Pawar     * This is represented in q format with shift of LAMBDA_Q_SHIFT
1782*c83a76b0SSuyog Pawar     */
1783*c83a76b0SSuyog Pawar     LWORD64 i8_cl_ssd_lambda_qf;
1784*c83a76b0SSuyog Pawar 
1785*c83a76b0SSuyog Pawar     /**
1786*c83a76b0SSuyog Pawar     * Closed loop SSD Lambda for chroma (chroma qp is different from luma qp)
1787*c83a76b0SSuyog Pawar     * This is multiplied with bits for RD cost computations in SSD mode
1788*c83a76b0SSuyog Pawar     * This is represented in q format with shift of LAMBDA_Q_SHIFT
1789*c83a76b0SSuyog Pawar     */
1790*c83a76b0SSuyog Pawar     LWORD64 i8_cl_ssd_lambda_chroma_qf;
1791*c83a76b0SSuyog Pawar     /**
1792*c83a76b0SSuyog Pawar     * Pointer to current PPS
1793*c83a76b0SSuyog Pawar     */
1794*c83a76b0SSuyog Pawar     pps_t *ps_pps;  //not used currently
1795*c83a76b0SSuyog Pawar     /**
1796*c83a76b0SSuyog Pawar     * Pointer to current SPS
1797*c83a76b0SSuyog Pawar     */
1798*c83a76b0SSuyog Pawar     sps_t *ps_sps;
1799*c83a76b0SSuyog Pawar 
1800*c83a76b0SSuyog Pawar     /**
1801*c83a76b0SSuyog Pawar     * Pointer to current slice header structure
1802*c83a76b0SSuyog Pawar     */
1803*c83a76b0SSuyog Pawar     slice_header_t *ps_slice_hdr;
1804*c83a76b0SSuyog Pawar     /**
1805*c83a76b0SSuyog Pawar     * Pointer to current frame ctb out array of structures
1806*c83a76b0SSuyog Pawar     */
1807*c83a76b0SSuyog Pawar     ctb_enc_loop_out_t *ps_ctb_out;
1808*c83a76b0SSuyog Pawar     /**
1809*c83a76b0SSuyog Pawar     *  context for cabac bit estimation used during rdopt stage
1810*c83a76b0SSuyog Pawar     */
1811*c83a76b0SSuyog Pawar     rdopt_entropy_ctxt_t *ps_rdopt_entropy_ctxt;
1812*c83a76b0SSuyog Pawar     /**
1813*c83a76b0SSuyog Pawar     * Pointer to sao_enc_t for the current ctb
1814*c83a76b0SSuyog Pawar     */
1815*c83a76b0SSuyog Pawar     sao_enc_t *ps_sao;
1816*c83a76b0SSuyog Pawar     /*
1817*c83a76b0SSuyog Pawar     * Pointer to an array to store the sao information of the top ctb
1818*c83a76b0SSuyog Pawar     * This is required for to decide top merge
1819*c83a76b0SSuyog Pawar     */
1820*c83a76b0SSuyog Pawar     sao_enc_t *aps_frm_top_ctb_sao[MAX_NUM_ENC_LOOP_PARALLEL];
1821*c83a76b0SSuyog Pawar 
1822*c83a76b0SSuyog Pawar     /*
1823*c83a76b0SSuyog Pawar     * Pointer to structure to store the sao parameters of (x,y)th ctb
1824*c83a76b0SSuyog Pawar     * for top merge of (x,y+1)th ctb
1825*c83a76b0SSuyog Pawar     */
1826*c83a76b0SSuyog Pawar     sao_enc_t *ps_top_ctb_sao;
1827*c83a76b0SSuyog Pawar 
1828*c83a76b0SSuyog Pawar     /* structure to store the sao parameters of (x,y)th ctb for
1829*c83a76b0SSuyog Pawar     * the left merge of (x+1,y)th ctb
1830*c83a76b0SSuyog Pawar     */
1831*c83a76b0SSuyog Pawar     sao_enc_t s_left_ctb_sao;
1832*c83a76b0SSuyog Pawar 
1833*c83a76b0SSuyog Pawar     /* Array of structures for SAO RDO candidates*/
1834*c83a76b0SSuyog Pawar     sao_enc_t as_sao_rd_cand[MAX_SAO_RD_CAND];
1835*c83a76b0SSuyog Pawar 
1836*c83a76b0SSuyog Pawar     /** array of function pointers for luma sao */
1837*c83a76b0SSuyog Pawar     pf_sao_luma apf_sao_luma[4];
1838*c83a76b0SSuyog Pawar 
1839*c83a76b0SSuyog Pawar     /** array of function pointers for chroma sao */
1840*c83a76b0SSuyog Pawar     pf_sao_chroma apf_sao_chroma[4];
1841*c83a76b0SSuyog Pawar 
1842*c83a76b0SSuyog Pawar     /* Flag to do SAO luma and chroma filtering*/
1843*c83a76b0SSuyog Pawar     WORD8 i1_slice_sao_luma_flag;
1844*c83a76b0SSuyog Pawar 
1845*c83a76b0SSuyog Pawar     WORD8 i1_slice_sao_chroma_flag;
1846*c83a76b0SSuyog Pawar 
1847*c83a76b0SSuyog Pawar #if DISABLE_SAO_WHEN_NOISY
1848*c83a76b0SSuyog Pawar     ctb_analyse_t *ps_ctb_data;
1849*c83a76b0SSuyog Pawar 
1850*c83a76b0SSuyog Pawar     WORD32 i4_ctb_data_stride;
1851*c83a76b0SSuyog Pawar #endif
1852*c83a76b0SSuyog Pawar 
1853*c83a76b0SSuyog Pawar     ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list;
1854*c83a76b0SSuyog Pawar 
1855*c83a76b0SSuyog Pawar } sao_ctxt_t;
1856*c83a76b0SSuyog Pawar 
1857*c83a76b0SSuyog Pawar /**
1858*c83a76b0SSuyog Pawar ******************************************************************************
1859*c83a76b0SSuyog Pawar *  @brief  Encode loop module context structure
1860*c83a76b0SSuyog Pawar ******************************************************************************
1861*c83a76b0SSuyog Pawar */
1862*c83a76b0SSuyog Pawar typedef struct
1863*c83a76b0SSuyog Pawar {
1864*c83a76b0SSuyog Pawar #if ENABLE_TU_TREE_DETERMINATION_IN_RDOPT
1865*c83a76b0SSuyog Pawar     void *pv_err_func_selector;
1866*c83a76b0SSuyog Pawar #endif
1867*c83a76b0SSuyog Pawar 
1868*c83a76b0SSuyog Pawar     /**
1869*c83a76b0SSuyog Pawar     * Quality preset for comtrolling numbe of RD opt cand
1870*c83a76b0SSuyog Pawar     * @sa : IHEVCE_QUALITY_CONFIG_T
1871*c83a76b0SSuyog Pawar     */
1872*c83a76b0SSuyog Pawar     WORD32 i4_quality_preset;
1873*c83a76b0SSuyog Pawar     /**
1874*c83a76b0SSuyog Pawar     *
1875*c83a76b0SSuyog Pawar     *
1876*c83a76b0SSuyog Pawar     */
1877*c83a76b0SSuyog Pawar     WORD32 i4_rc_pass;
1878*c83a76b0SSuyog Pawar     /**
1879*c83a76b0SSuyog Pawar     * Lamda to be mulitplied with bits for SATD
1880*c83a76b0SSuyog Pawar     * should be equal to Lamda*Qp
1881*c83a76b0SSuyog Pawar     */
1882*c83a76b0SSuyog Pawar     WORD32 i4_satd_lamda;
1883*c83a76b0SSuyog Pawar 
1884*c83a76b0SSuyog Pawar     /**
1885*c83a76b0SSuyog Pawar     * Lamda to be mulitplied with bits for SAD
1886*c83a76b0SSuyog Pawar     * should be equal to Lamda*Qp
1887*c83a76b0SSuyog Pawar     */
1888*c83a76b0SSuyog Pawar     WORD32 i4_sad_lamda;
1889*c83a76b0SSuyog Pawar 
1890*c83a76b0SSuyog Pawar     /**
1891*c83a76b0SSuyog Pawar     * Closed loop SSD Lambda
1892*c83a76b0SSuyog Pawar     * This is multiplied with bits for RD cost computations in SSD mode
1893*c83a76b0SSuyog Pawar     * This is represented in q format with shift of LAMBDA_Q_SHIFT
1894*c83a76b0SSuyog Pawar     */
1895*c83a76b0SSuyog Pawar     LWORD64 i8_cl_ssd_lambda_qf;
1896*c83a76b0SSuyog Pawar 
1897*c83a76b0SSuyog Pawar     /**
1898*c83a76b0SSuyog Pawar     * Closed loop SSD Lambda for chroma (chroma qp is different from luma qp)
1899*c83a76b0SSuyog Pawar     * This is multiplied with bits for RD cost computations in SSD mode
1900*c83a76b0SSuyog Pawar     * This is represented in q format with shift of LAMBDA_Q_SHIFT
1901*c83a76b0SSuyog Pawar     */
1902*c83a76b0SSuyog Pawar     LWORD64 i8_cl_ssd_lambda_chroma_qf;
1903*c83a76b0SSuyog Pawar 
1904*c83a76b0SSuyog Pawar     /**
1905*c83a76b0SSuyog Pawar     * Ratio of Closed loop SSD Lambda and Closed loop SSD Lambda for chroma
1906*c83a76b0SSuyog Pawar     * This is multiplied with (1 << CHROMA_COST_WEIGHING_FACTOR_Q_SHIFT)
1907*c83a76b0SSuyog Pawar     * to keep the precision of the ratio
1908*c83a76b0SSuyog Pawar     */
1909*c83a76b0SSuyog Pawar     UWORD32 u4_chroma_cost_weighing_factor;
1910*c83a76b0SSuyog Pawar     /**
1911*c83a76b0SSuyog Pawar     * Frame level QP to be used
1912*c83a76b0SSuyog Pawar     */
1913*c83a76b0SSuyog Pawar     WORD32 i4_frame_qp;
1914*c83a76b0SSuyog Pawar 
1915*c83a76b0SSuyog Pawar     WORD32 i4_frame_mod_qp;
1916*c83a76b0SSuyog Pawar 
1917*c83a76b0SSuyog Pawar     WORD32 i4_frame_qstep;
1918*c83a76b0SSuyog Pawar 
1919*c83a76b0SSuyog Pawar     UWORD8 u1_max_tr_depth;
1920*c83a76b0SSuyog Pawar 
1921*c83a76b0SSuyog Pawar     /**
1922*c83a76b0SSuyog Pawar     * CU level Qp
1923*c83a76b0SSuyog Pawar     */
1924*c83a76b0SSuyog Pawar     WORD32 i4_cu_qp;
1925*c83a76b0SSuyog Pawar 
1926*c83a76b0SSuyog Pawar     /**
1927*c83a76b0SSuyog Pawar     * CU level Qp / 6
1928*c83a76b0SSuyog Pawar     */
1929*c83a76b0SSuyog Pawar     WORD32 i4_cu_qp_div6;
1930*c83a76b0SSuyog Pawar 
1931*c83a76b0SSuyog Pawar     /**
1932*c83a76b0SSuyog Pawar     * CU level Qp % 6
1933*c83a76b0SSuyog Pawar     */
1934*c83a76b0SSuyog Pawar     WORD32 i4_cu_qp_mod6;
1935*c83a76b0SSuyog Pawar 
1936*c83a76b0SSuyog Pawar     /**
1937*c83a76b0SSuyog Pawar     *  CU level QP to be used
1938*c83a76b0SSuyog Pawar     */
1939*c83a76b0SSuyog Pawar     WORD32 i4_chrm_cu_qp;
1940*c83a76b0SSuyog Pawar 
1941*c83a76b0SSuyog Pawar     /**
1942*c83a76b0SSuyog Pawar     * CU level Qp / 6
1943*c83a76b0SSuyog Pawar     */
1944*c83a76b0SSuyog Pawar     WORD32 i4_chrm_cu_qp_div6;
1945*c83a76b0SSuyog Pawar 
1946*c83a76b0SSuyog Pawar     /**
1947*c83a76b0SSuyog Pawar     * CU level Qp % 6
1948*c83a76b0SSuyog Pawar     */
1949*c83a76b0SSuyog Pawar     WORD32 i4_chrm_cu_qp_mod6;
1950*c83a76b0SSuyog Pawar 
1951*c83a76b0SSuyog Pawar     /** previous cu qp
1952*c83a76b0SSuyog Pawar     * @remarks : This needs to be remembered to handle skip cases in deblocking.
1953*c83a76b0SSuyog Pawar     */
1954*c83a76b0SSuyog Pawar     WORD32 i4_prev_cu_qp;
1955*c83a76b0SSuyog Pawar 
1956*c83a76b0SSuyog Pawar     /** chroma qp offset
1957*c83a76b0SSuyog Pawar     * @remarks : Used to calculate chroma qp and other qp related parameter at CU level
1958*c83a76b0SSuyog Pawar     */
1959*c83a76b0SSuyog Pawar     WORD32 i4_chroma_qp_offset;
1960*c83a76b0SSuyog Pawar 
1961*c83a76b0SSuyog Pawar     /**
1962*c83a76b0SSuyog Pawar     * Buffer Pointer to populate the scale matrix for all transform size
1963*c83a76b0SSuyog Pawar     */
1964*c83a76b0SSuyog Pawar     WORD16 *pi2_scal_mat;
1965*c83a76b0SSuyog Pawar 
1966*c83a76b0SSuyog Pawar     /**
1967*c83a76b0SSuyog Pawar     * Buffer Pointer to populate the rescale matrix for all transform size
1968*c83a76b0SSuyog Pawar     */
1969*c83a76b0SSuyog Pawar     WORD16 *pi2_rescal_mat;
1970*c83a76b0SSuyog Pawar 
1971*c83a76b0SSuyog Pawar     /** array of pointer to store the scaling matrices for
1972*c83a76b0SSuyog Pawar     *  all transform sizes and qp % 6 (pre computed)
1973*c83a76b0SSuyog Pawar     */
1974*c83a76b0SSuyog Pawar     WORD16 *api2_scal_mat[NUM_TRANS_TYPES * 2];
1975*c83a76b0SSuyog Pawar 
1976*c83a76b0SSuyog Pawar     /** array of pointer to store the re-scaling matrices for
1977*c83a76b0SSuyog Pawar     *  all transform sizes and qp % 6 (pre computed)
1978*c83a76b0SSuyog Pawar     */
1979*c83a76b0SSuyog Pawar     WORD16 *api2_rescal_mat[NUM_TRANS_TYPES * 2];
1980*c83a76b0SSuyog Pawar 
1981*c83a76b0SSuyog Pawar     /** array of function pointers for residual and
1982*c83a76b0SSuyog Pawar     *  forward transform for all transform sizes
1983*c83a76b0SSuyog Pawar     */
1984*c83a76b0SSuyog Pawar     pf_res_trans_luma apf_resd_trns[NUM_TRANS_TYPES];
1985*c83a76b0SSuyog Pawar 
1986*c83a76b0SSuyog Pawar     /** array of function pointers for residual and
1987*c83a76b0SSuyog Pawar     *  forward HAD transform for all transform sizes
1988*c83a76b0SSuyog Pawar     */
1989*c83a76b0SSuyog Pawar     pf_res_trans_luma_had_chroma apf_chrm_resd_trns_had[NUM_TRANS_TYPES - 2];
1990*c83a76b0SSuyog Pawar 
1991*c83a76b0SSuyog Pawar     /** array of function pointers for residual and
1992*c83a76b0SSuyog Pawar     *  forward transform for all transform sizes
1993*c83a76b0SSuyog Pawar     *  for chroma
1994*c83a76b0SSuyog Pawar     */
1995*c83a76b0SSuyog Pawar     pf_res_trans_chroma apf_chrm_resd_trns[NUM_TRANS_TYPES - 2];
1996*c83a76b0SSuyog Pawar 
1997*c83a76b0SSuyog Pawar     /** array of function pointers for qunatization and
1998*c83a76b0SSuyog Pawar     *  inv Quant for ssd calc. for all transform sizes
1999*c83a76b0SSuyog Pawar     */
2000*c83a76b0SSuyog Pawar     pf_quant_iquant_ssd apf_quant_iquant_ssd[4];
2001*c83a76b0SSuyog Pawar 
2002*c83a76b0SSuyog Pawar     /** array of function pointers for inv.transform and
2003*c83a76b0SSuyog Pawar     *  recon for all transform sizes
2004*c83a76b0SSuyog Pawar     */
2005*c83a76b0SSuyog Pawar     pf_it_recon apf_it_recon[NUM_TRANS_TYPES];
2006*c83a76b0SSuyog Pawar 
2007*c83a76b0SSuyog Pawar     /** array of function pointers for inverse transform
2008*c83a76b0SSuyog Pawar     * and recon for all transform sizes for chroma
2009*c83a76b0SSuyog Pawar     */
2010*c83a76b0SSuyog Pawar     pf_it_recon_chroma apf_chrm_it_recon[NUM_TRANS_TYPES - 2];
2011*c83a76b0SSuyog Pawar 
2012*c83a76b0SSuyog Pawar     /** array of luma intra prediction function pointers */
2013*c83a76b0SSuyog Pawar     pf_intra_pred apf_lum_ip[NUM_IP_FUNCS];
2014*c83a76b0SSuyog Pawar 
2015*c83a76b0SSuyog Pawar     /** array of chroma intra prediction function pointers */
2016*c83a76b0SSuyog Pawar     pf_intra_pred apf_chrm_ip[NUM_IP_FUNCS];
2017*c83a76b0SSuyog Pawar 
2018*c83a76b0SSuyog Pawar     /* - Function pointer to cu_mode_decide function */
2019*c83a76b0SSuyog Pawar     /* - The 'void *' is used since one of the parameters of */
2020*c83a76b0SSuyog Pawar     /* this class of functions is the current structure */
2021*c83a76b0SSuyog Pawar     /* - This function pointer is used to choose the */
2022*c83a76b0SSuyog Pawar     /* appropriate function depending on whether bit_depth is */
2023*c83a76b0SSuyog Pawar     /* chosen as 8 bits or greater */
2024*c83a76b0SSuyog Pawar     /* - This function pointer's type is defined at the end */
2025*c83a76b0SSuyog Pawar     /* of this file */
2026*c83a76b0SSuyog Pawar     void *pv_cu_mode_decide;
2027*c83a76b0SSuyog Pawar 
2028*c83a76b0SSuyog Pawar     /* Infer from the comment for the variable 'pv_cu_mode_decide' */
2029*c83a76b0SSuyog Pawar     void *pv_inter_rdopt_cu_mc_mvp;
2030*c83a76b0SSuyog Pawar 
2031*c83a76b0SSuyog Pawar     /* Infer from the comment for the variable 'pv_cu_mode_decide' */
2032*c83a76b0SSuyog Pawar     void *pv_inter_rdopt_cu_ntu;
2033*c83a76b0SSuyog Pawar 
2034*c83a76b0SSuyog Pawar     /* Infer from the comment for the variable 'pv_cu_mode_decide' */
2035*c83a76b0SSuyog Pawar     void *pv_intra_chroma_pred_mode_selector;
2036*c83a76b0SSuyog Pawar 
2037*c83a76b0SSuyog Pawar     /* Infer from the comment for the variable 'pv_cu_mode_decide' */
2038*c83a76b0SSuyog Pawar     void *pv_intra_rdopt_cu_ntu;
2039*c83a76b0SSuyog Pawar 
2040*c83a76b0SSuyog Pawar     /* Infer from the comment for the variable 'pv_cu_mode_decide' */
2041*c83a76b0SSuyog Pawar     void *pv_final_rdopt_mode_prcs;
2042*c83a76b0SSuyog Pawar 
2043*c83a76b0SSuyog Pawar     /* Infer from the comment for the variable 'pv_cu_mode_decide' */
2044*c83a76b0SSuyog Pawar     void *pv_store_cu_results;
2045*c83a76b0SSuyog Pawar 
2046*c83a76b0SSuyog Pawar     /* Infer from the comment for the variable 'pv_cu_mode_decide' */
2047*c83a76b0SSuyog Pawar     void *pv_enc_loop_cu_bot_copy;
2048*c83a76b0SSuyog Pawar 
2049*c83a76b0SSuyog Pawar     /* Infer from the comment for the variable 'pv_cu_mode_decide' */
2050*c83a76b0SSuyog Pawar     void *pv_final_mode_reevaluation_with_modified_cu_qp;
2051*c83a76b0SSuyog Pawar 
2052*c83a76b0SSuyog Pawar     /* Infer from the comment for the variable 'pv_cu_mode_decide' */
2053*c83a76b0SSuyog Pawar     void *pv_enc_loop_ctb_left_copy;
2054*c83a76b0SSuyog Pawar 
2055*c83a76b0SSuyog Pawar     /** Qunatization rounding factor for inter and intra CUs */
2056*c83a76b0SSuyog Pawar     WORD32 i4_quant_rnd_factor[2];
2057*c83a76b0SSuyog Pawar 
2058*c83a76b0SSuyog Pawar     /**
2059*c83a76b0SSuyog Pawar     * Frame Buffer Pointer to store the top row luma data.
2060*c83a76b0SSuyog Pawar     * one pixel row in every ctb row
2061*c83a76b0SSuyog Pawar     */
2062*c83a76b0SSuyog Pawar     void *apv_frm_top_row_luma[MAX_NUM_ENC_LOOP_PARALLEL];
2063*c83a76b0SSuyog Pawar 
2064*c83a76b0SSuyog Pawar     /**
2065*c83a76b0SSuyog Pawar     * One CTB row size of Top row luma data buffer
2066*c83a76b0SSuyog Pawar     */
2067*c83a76b0SSuyog Pawar     WORD32 i4_top_row_luma_stride;
2068*c83a76b0SSuyog Pawar 
2069*c83a76b0SSuyog Pawar     /**
2070*c83a76b0SSuyog Pawar     * One frm of Top row luma data buffer
2071*c83a76b0SSuyog Pawar     */
2072*c83a76b0SSuyog Pawar     WORD32 i4_frm_top_row_luma_size;
2073*c83a76b0SSuyog Pawar 
2074*c83a76b0SSuyog Pawar     /**
2075*c83a76b0SSuyog Pawar     * Current luma row bottom data store pointer
2076*c83a76b0SSuyog Pawar     */
2077*c83a76b0SSuyog Pawar     void *pv_bot_row_luma;
2078*c83a76b0SSuyog Pawar 
2079*c83a76b0SSuyog Pawar     /**
2080*c83a76b0SSuyog Pawar     * Top luma row top data access pointer
2081*c83a76b0SSuyog Pawar     */
2082*c83a76b0SSuyog Pawar     void *pv_top_row_luma;
2083*c83a76b0SSuyog Pawar 
2084*c83a76b0SSuyog Pawar     /**
2085*c83a76b0SSuyog Pawar     * Frame Buffer Pointer to store the top row chroma data (Cb  Cr pixel interleaved )
2086*c83a76b0SSuyog Pawar     * one pixel row in every ctb row
2087*c83a76b0SSuyog Pawar     */
2088*c83a76b0SSuyog Pawar     void *apv_frm_top_row_chroma[MAX_NUM_ENC_LOOP_PARALLEL];
2089*c83a76b0SSuyog Pawar 
2090*c83a76b0SSuyog Pawar     /**
2091*c83a76b0SSuyog Pawar     * One CTB row size of Top row chroma data buffer (Cb  Cr pixel interleaved )
2092*c83a76b0SSuyog Pawar     */
2093*c83a76b0SSuyog Pawar     WORD32 i4_top_row_chroma_stride;
2094*c83a76b0SSuyog Pawar 
2095*c83a76b0SSuyog Pawar     /**
2096*c83a76b0SSuyog Pawar     * One frm size of Top row chroma data buffer (Cb  Cr pixel interleaved )
2097*c83a76b0SSuyog Pawar     */
2098*c83a76b0SSuyog Pawar     WORD32 i4_frm_top_row_chroma_size;
2099*c83a76b0SSuyog Pawar 
2100*c83a76b0SSuyog Pawar     /**
2101*c83a76b0SSuyog Pawar     * Current chroma row bottom data store pointer
2102*c83a76b0SSuyog Pawar     */
2103*c83a76b0SSuyog Pawar     void *pv_bot_row_chroma;
2104*c83a76b0SSuyog Pawar 
2105*c83a76b0SSuyog Pawar     /**
2106*c83a76b0SSuyog Pawar     * Top chroma row top data access pointer
2107*c83a76b0SSuyog Pawar     */
2108*c83a76b0SSuyog Pawar     void *pv_top_row_chroma;
2109*c83a76b0SSuyog Pawar 
2110*c83a76b0SSuyog Pawar     /**
2111*c83a76b0SSuyog Pawar     * Frame Buffer Pointer to store the top row neighbour modes stored at 4x4 level
2112*c83a76b0SSuyog Pawar     * one 4x4 row in every ctb row
2113*c83a76b0SSuyog Pawar     */
2114*c83a76b0SSuyog Pawar     nbr_4x4_t *aps_frm_top_row_nbr[MAX_NUM_ENC_LOOP_PARALLEL];
2115*c83a76b0SSuyog Pawar 
2116*c83a76b0SSuyog Pawar     /**
2117*c83a76b0SSuyog Pawar     * One CTB row size of Top row nbr 4x4 params buffer
2118*c83a76b0SSuyog Pawar     */
2119*c83a76b0SSuyog Pawar     WORD32 i4_top_row_nbr_stride;
2120*c83a76b0SSuyog Pawar 
2121*c83a76b0SSuyog Pawar     /**
2122*c83a76b0SSuyog Pawar     * One frm size of Top row nbr 4x4 params buffer
2123*c83a76b0SSuyog Pawar     */
2124*c83a76b0SSuyog Pawar     WORD32 i4_frm_top_row_nbr_size;
2125*c83a76b0SSuyog Pawar 
2126*c83a76b0SSuyog Pawar     /**
2127*c83a76b0SSuyog Pawar     * Current row nbr prms bottom data store pointer
2128*c83a76b0SSuyog Pawar     */
2129*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_bot_row_nbr;
2130*c83a76b0SSuyog Pawar 
2131*c83a76b0SSuyog Pawar     /**
2132*c83a76b0SSuyog Pawar     * Top row nbr prms top data access pointer
2133*c83a76b0SSuyog Pawar     */
2134*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_top_row_nbr;
2135*c83a76b0SSuyog Pawar 
2136*c83a76b0SSuyog Pawar     /**
2137*c83a76b0SSuyog Pawar     * Pointer to (1,1) location in au1_nbr_ctb_map
2138*c83a76b0SSuyog Pawar     */
2139*c83a76b0SSuyog Pawar     UWORD8 *pu1_ctb_nbr_map;
2140*c83a76b0SSuyog Pawar 
2141*c83a76b0SSuyog Pawar     /**
2142*c83a76b0SSuyog Pawar     * neigbour map buffer stride;
2143*c83a76b0SSuyog Pawar     */
2144*c83a76b0SSuyog Pawar     WORD32 i4_nbr_map_strd;
2145*c83a76b0SSuyog Pawar 
2146*c83a76b0SSuyog Pawar     /**
2147*c83a76b0SSuyog Pawar     * Array at ctb level to store the neighour map
2148*c83a76b0SSuyog Pawar     * its size is 25x25 for ctb size of 64x64
2149*c83a76b0SSuyog Pawar     */
2150*c83a76b0SSuyog Pawar     UWORD8 au1_nbr_ctb_map[MAX_PU_IN_CTB_ROW + 1 + 8][MAX_PU_IN_CTB_ROW + 1 + 8];
2151*c83a76b0SSuyog Pawar 
2152*c83a76b0SSuyog Pawar     /**
2153*c83a76b0SSuyog Pawar     * Array to store left ctb data for luma
2154*c83a76b0SSuyog Pawar     * some padding is added to take care of unconditional access
2155*c83a76b0SSuyog Pawar     */
2156*c83a76b0SSuyog Pawar     void *pv_left_luma_data;
2157*c83a76b0SSuyog Pawar 
2158*c83a76b0SSuyog Pawar     /**
2159*c83a76b0SSuyog Pawar     * Array to store left ctb data for chroma (cb abd cr pixel interleaved
2160*c83a76b0SSuyog Pawar     * some padding is added to take care of unconditional access
2161*c83a76b0SSuyog Pawar     */
2162*c83a76b0SSuyog Pawar     void *pv_left_chrm_data;
2163*c83a76b0SSuyog Pawar 
2164*c83a76b0SSuyog Pawar     /**
2165*c83a76b0SSuyog Pawar     * Array to store the left neighbour modes at 4x4 level
2166*c83a76b0SSuyog Pawar     */
2167*c83a76b0SSuyog Pawar     nbr_4x4_t as_left_col_nbr[MAX_PU_IN_CTB_ROW];
2168*c83a76b0SSuyog Pawar 
2169*c83a76b0SSuyog Pawar     /**
2170*c83a76b0SSuyog Pawar     * Array to store currrent CTb pred modes at a 4x4 level
2171*c83a76b0SSuyog Pawar     * used for prediction inside ctb
2172*c83a76b0SSuyog Pawar     */
2173*c83a76b0SSuyog Pawar     nbr_4x4_t as_ctb_nbr_arr[MAX_PU_IN_CTB_ROW * MAX_PU_IN_CTB_ROW];
2174*c83a76b0SSuyog Pawar 
2175*c83a76b0SSuyog Pawar     /**
2176*c83a76b0SSuyog Pawar     * array for storing csbf during RD opt stage at CU level
2177*c83a76b0SSuyog Pawar     * one best and one current is required
2178*c83a76b0SSuyog Pawar     */
2179*c83a76b0SSuyog Pawar     UWORD8 au1_cu_csbf[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW];
2180*c83a76b0SSuyog Pawar 
2181*c83a76b0SSuyog Pawar     /**
2182*c83a76b0SSuyog Pawar     * Stride of csbf buffer. will be useful for scanning access
2183*c83a76b0SSuyog Pawar     * if stored in a 2D order. right now set to max tx size >> 4;
2184*c83a76b0SSuyog Pawar     */
2185*c83a76b0SSuyog Pawar     WORD32 i4_cu_csbf_strd;
2186*c83a76b0SSuyog Pawar 
2187*c83a76b0SSuyog Pawar     /**
2188*c83a76b0SSuyog Pawar     * Array to store pred modes  during SATD and RD opt stage at CU level
2189*c83a76b0SSuyog Pawar     * one best and one current is required
2190*c83a76b0SSuyog Pawar     */
2191*c83a76b0SSuyog Pawar     nbr_4x4_t as_cu_nbr[2][MAX_PU_IN_CTB_ROW * MAX_PU_IN_CTB_ROW];
2192*c83a76b0SSuyog Pawar 
2193*c83a76b0SSuyog Pawar     /**
2194*c83a76b0SSuyog Pawar     * array to store the output of reference substitution process output
2195*c83a76b0SSuyog Pawar     * for intra CUs
2196*c83a76b0SSuyog Pawar     * TOP (32 x 2) + Left (32 x 2) + Top left (1) + Alignment (3)
2197*c83a76b0SSuyog Pawar     */
2198*c83a76b0SSuyog Pawar     void *pv_ref_sub_out;
2199*c83a76b0SSuyog Pawar 
2200*c83a76b0SSuyog Pawar     /**
2201*c83a76b0SSuyog Pawar     * array to store the filtered reference samples for intra CUs
2202*c83a76b0SSuyog Pawar     * TOP (32 x 2) + Left (32 x 2) + Top left (1) + Alignment (3)
2203*c83a76b0SSuyog Pawar     */
2204*c83a76b0SSuyog Pawar     void *pv_ref_filt_out;
2205*c83a76b0SSuyog Pawar 
2206*c83a76b0SSuyog Pawar     /**
2207*c83a76b0SSuyog Pawar     * Used for 3 purposes
2208*c83a76b0SSuyog Pawar     *
2209*c83a76b0SSuyog Pawar     * 1. MC Intermediate buffer
2210*c83a76b0SSuyog Pawar     * array for storing intermediate 16-bit value for hxhy subpel
2211*c83a76b0SSuyog Pawar     * generation at CTB level (+ 16) for subpel planes boundary
2212*c83a76b0SSuyog Pawar     * +4 is for horizontal 4pels
2213*c83a76b0SSuyog Pawar     *
2214*c83a76b0SSuyog Pawar     * 2. Temprory scratch buffer for transform and coeffs storage
2215*c83a76b0SSuyog Pawar     * MAX_TRANS_SIZE *2 for trans_scratch(32bit) and MAX_TRANS_SIZE *1 for trans_values
2216*c83a76b0SSuyog Pawar     * The first part i.e. from 0 to MAX_TRANS_SIZE is then reused for storing the quant coeffs
2217*c83a76b0SSuyog Pawar     * Max of both are used
2218*c83a76b0SSuyog Pawar     *
2219*c83a76b0SSuyog Pawar     * 3. MC Intermediate buffer
2220*c83a76b0SSuyog Pawar     * buffer for storing intermediate 16 bit values prior to conversion to 8bit in HBD
2221*c83a76b0SSuyog Pawar     *
2222*c83a76b0SSuyog Pawar     */
2223*c83a76b0SSuyog Pawar     MEM_ALIGN16 WORD16 ai2_scratch[(MAX_CTB_SIZE + 8 + 8) * (MAX_CTB_SIZE + 8 + 8 + 8) * 2];
2224*c83a76b0SSuyog Pawar 
2225*c83a76b0SSuyog Pawar     /**
2226*c83a76b0SSuyog Pawar     * array for storing cu level final params for a given mode
2227*c83a76b0SSuyog Pawar     * one best and one current is required
2228*c83a76b0SSuyog Pawar     */
2229*c83a76b0SSuyog Pawar     enc_loop_cu_final_prms_t as_cu_prms[2];
2230*c83a76b0SSuyog Pawar 
2231*c83a76b0SSuyog Pawar     /**
2232*c83a76b0SSuyog Pawar     * Scan index to be used for any gien transform
2233*c83a76b0SSuyog Pawar     * this is a scartch variable used to communicate
2234*c83a76b0SSuyog Pawar     * scan idx at every transform level
2235*c83a76b0SSuyog Pawar     */
2236*c83a76b0SSuyog Pawar     WORD32 i4_scan_idx;
2237*c83a76b0SSuyog Pawar 
2238*c83a76b0SSuyog Pawar     /**
2239*c83a76b0SSuyog Pawar     * Buffer index in ping pong buffers
2240*c83a76b0SSuyog Pawar     * to be used SATD mode evaluations
2241*c83a76b0SSuyog Pawar     */
2242*c83a76b0SSuyog Pawar     WORD32 i4_satd_buf_idx;
2243*c83a76b0SSuyog Pawar 
2244*c83a76b0SSuyog Pawar     /**
2245*c83a76b0SSuyog Pawar     * Motion Compensation module context structre
2246*c83a76b0SSuyog Pawar     */
2247*c83a76b0SSuyog Pawar     inter_pred_ctxt_t s_mc_ctxt;
2248*c83a76b0SSuyog Pawar 
2249*c83a76b0SSuyog Pawar     /**
2250*c83a76b0SSuyog Pawar     * MV pred module context structre
2251*c83a76b0SSuyog Pawar     */
2252*c83a76b0SSuyog Pawar     mv_pred_ctxt_t s_mv_pred_ctxt;
2253*c83a76b0SSuyog Pawar 
2254*c83a76b0SSuyog Pawar     /**
2255*c83a76b0SSuyog Pawar     * Deblock BS ctb structure
2256*c83a76b0SSuyog Pawar     */
2257*c83a76b0SSuyog Pawar     deblk_bs_ctb_ctxt_t s_deblk_bs_prms;
2258*c83a76b0SSuyog Pawar 
2259*c83a76b0SSuyog Pawar     /**
2260*c83a76b0SSuyog Pawar     * Deblocking ctb structure
2261*c83a76b0SSuyog Pawar     */
2262*c83a76b0SSuyog Pawar     deblk_ctb_params_t s_deblk_prms;
2263*c83a76b0SSuyog Pawar 
2264*c83a76b0SSuyog Pawar     /**
2265*c83a76b0SSuyog Pawar     * Deblocking structure. For ctb-row level
2266*c83a76b0SSuyog Pawar     */
2267*c83a76b0SSuyog Pawar     deblk_ctbrow_prms_t s_deblk_ctbrow_prms;
2268*c83a76b0SSuyog Pawar 
2269*c83a76b0SSuyog Pawar     /**
2270*c83a76b0SSuyog Pawar     * Deblocking enable flag
2271*c83a76b0SSuyog Pawar     */
2272*c83a76b0SSuyog Pawar     WORD32 i4_deblock_type;
2273*c83a76b0SSuyog Pawar 
2274*c83a76b0SSuyog Pawar     /**
2275*c83a76b0SSuyog Pawar     *  context for cabac bit estimation used during rdopt stage
2276*c83a76b0SSuyog Pawar     */
2277*c83a76b0SSuyog Pawar     rdopt_entropy_ctxt_t s_rdopt_entropy_ctxt;
2278*c83a76b0SSuyog Pawar 
2279*c83a76b0SSuyog Pawar     /**
2280*c83a76b0SSuyog Pawar     * Context models stored for RDopt store and restore purpose
2281*c83a76b0SSuyog Pawar     */
2282*c83a76b0SSuyog Pawar     UWORD8 au1_rdopt_init_ctxt_models[IHEVC_CAB_CTXT_END];
2283*c83a76b0SSuyog Pawar 
2284*c83a76b0SSuyog Pawar     /**
2285*c83a76b0SSuyog Pawar     * current picture slice type
2286*c83a76b0SSuyog Pawar     */
2287*c83a76b0SSuyog Pawar     WORD8 i1_slice_type;
2288*c83a76b0SSuyog Pawar 
2289*c83a76b0SSuyog Pawar     /**
2290*c83a76b0SSuyog Pawar     * strong_intra_smoothing_enable_flag
2291*c83a76b0SSuyog Pawar     */
2292*c83a76b0SSuyog Pawar     WORD8 i1_strong_intra_smoothing_enable_flag;
2293*c83a76b0SSuyog Pawar 
2294*c83a76b0SSuyog Pawar     /** Pointer to Dep Mngr for controlling Top-Right CU dependency */
2295*c83a76b0SSuyog Pawar     void *pv_dep_mngr_enc_loop_cu_top_right;
2296*c83a76b0SSuyog Pawar 
2297*c83a76b0SSuyog Pawar     /** Pointer to Dep Mngr for controlling Deblocking Top dependency */
2298*c83a76b0SSuyog Pawar     void *pv_dep_mngr_enc_loop_dblk;
2299*c83a76b0SSuyog Pawar 
2300*c83a76b0SSuyog Pawar     /** Pointer to Dep Mngr for controlling Deblocking Top dependency */
2301*c83a76b0SSuyog Pawar     void *pv_dep_mngr_enc_loop_sao;
2302*c83a76b0SSuyog Pawar 
2303*c83a76b0SSuyog Pawar     /** pointer to store the cabac states at end of second CTB in current row */
2304*c83a76b0SSuyog Pawar     UWORD8 *pu1_curr_row_cabac_state;
2305*c83a76b0SSuyog Pawar 
2306*c83a76b0SSuyog Pawar     /** pointer to copy the cabac states at start of first CTB in current row */
2307*c83a76b0SSuyog Pawar     UWORD8 *pu1_top_rt_cabac_state;
2308*c83a76b0SSuyog Pawar     /** flag to indicate rate control mode.
2309*c83a76b0SSuyog Pawar     * @remarks :  To enable CU level qp modulation only when required.
2310*c83a76b0SSuyog Pawar     */
2311*c83a76b0SSuyog Pawar     WORD8 i1_cu_qp_delta_enable;
2312*c83a76b0SSuyog Pawar 
2313*c83a76b0SSuyog Pawar     /** flag to indicate rate control mode.
2314*c83a76b0SSuyog Pawar     * @remarks :  Entropy sync enable flag
2315*c83a76b0SSuyog Pawar     */
2316*c83a76b0SSuyog Pawar     WORD8 i1_entropy_coding_sync_enabled_flag;
2317*c83a76b0SSuyog Pawar 
2318*c83a76b0SSuyog Pawar     /** Use SATD or SAD for best merge candidate evaluation */
2319*c83a76b0SSuyog Pawar     WORD32 i4_use_satd_for_merge_eval;
2320*c83a76b0SSuyog Pawar 
2321*c83a76b0SSuyog Pawar     UWORD8 u1_use_early_cbf_data;
2322*c83a76b0SSuyog Pawar 
2323*c83a76b0SSuyog Pawar     /** Use SATD or SAD for best CU merge candidate evaluation */
2324*c83a76b0SSuyog Pawar     WORD32 i4_use_satd_for_cu_merge;
2325*c83a76b0SSuyog Pawar 
2326*c83a76b0SSuyog Pawar     /** Maximum number of merge candidates to be evaluated */
2327*c83a76b0SSuyog Pawar     WORD32 i4_max_merge_candidates;
2328*c83a76b0SSuyog Pawar 
2329*c83a76b0SSuyog Pawar     /** Flag to indicate whether current pictute needs to be deblocked,
2330*c83a76b0SSuyog Pawar     padded and hpel planes need to be generated.
2331*c83a76b0SSuyog Pawar     These are turned off typically in non referecne pictures when psnr
2332*c83a76b0SSuyog Pawar     and recon dump is disabled
2333*c83a76b0SSuyog Pawar     */
2334*c83a76b0SSuyog Pawar     WORD32 i4_deblk_pad_hpel_cur_pic;
2335*c83a76b0SSuyog Pawar 
2336*c83a76b0SSuyog Pawar     /* Array of structures for storing mc predicted data for
2337*c83a76b0SSuyog Pawar     * merge and skip modes
2338*c83a76b0SSuyog Pawar     */
2339*c83a76b0SSuyog Pawar     merge_skip_pred_data_t as_merge_skip_pred_data[MAX_NUM_CU_MERGE_SKIP_CAND];
2340*c83a76b0SSuyog Pawar 
2341*c83a76b0SSuyog Pawar     /* Sum the Qps of each 8*8 block in CU
2342*c83a76b0SSuyog Pawar     * 8*8 block is considered as Min CU size possible as per standard is 8
2343*c83a76b0SSuyog Pawar     * 0 corresponds to INTER and 1 corresponds to INTRA
2344*c83a76b0SSuyog Pawar     */
2345*c83a76b0SSuyog Pawar     LWORD64 i8_cl_ssd_lambda_qf_array[MAX_HEVC_QP_12bit + 1];
2346*c83a76b0SSuyog Pawar     UWORD32 au4_chroma_cost_weighing_factor_array[MAX_HEVC_QP_12bit + 1];
2347*c83a76b0SSuyog Pawar     LWORD64 i8_cl_ssd_lambda_chroma_qf_array[MAX_HEVC_QP_12bit + 1];
2348*c83a76b0SSuyog Pawar     WORD32 i4_satd_lamda_array[MAX_HEVC_QP_12bit + 1];
2349*c83a76b0SSuyog Pawar     WORD32 i4_sad_lamda_array[MAX_HEVC_QP_12bit + 1];
2350*c83a76b0SSuyog Pawar 
2351*c83a76b0SSuyog Pawar     /************************************************************************/
2352*c83a76b0SSuyog Pawar     /* The fields with the string 'type2' in their names are required */
2353*c83a76b0SSuyog Pawar     /* when both 8bit and hbd lambdas are needed. The lambdas corresponding */
2354*c83a76b0SSuyog Pawar     /* to the bit_depth != internal_bit_depth are stored in these fields */
2355*c83a76b0SSuyog Pawar     /************************************************************************/
2356*c83a76b0SSuyog Pawar     LWORD64 i8_cl_ssd_type2_lambda_qf_array[MAX_HEVC_QP_12bit + 1];
2357*c83a76b0SSuyog Pawar     LWORD64 i8_cl_ssd_type2_lambda_chroma_qf_array[MAX_HEVC_QP_12bit + 1];
2358*c83a76b0SSuyog Pawar     WORD32 i4_satd_type2_lamda_array[MAX_HEVC_QP_12bit + 1];
2359*c83a76b0SSuyog Pawar     WORD32 i4_sad_type2_lamda_array[MAX_HEVC_QP_12bit + 1];
2360*c83a76b0SSuyog Pawar 
2361*c83a76b0SSuyog Pawar     /* Lokesh: Added to find if the CU is the first to be coded in the group */
2362*c83a76b0SSuyog Pawar     WORD32 i4_is_first_cu_qg_coded;
2363*c83a76b0SSuyog Pawar 
2364*c83a76b0SSuyog Pawar     /* Chroma RDOPT related parameters */
2365*c83a76b0SSuyog Pawar     ihevce_chroma_rdopt_ctxt_t s_chroma_rdopt_ctxt;
2366*c83a76b0SSuyog Pawar 
2367*c83a76b0SSuyog Pawar     /* Structure to save pred data of ME/Intra cand */
2368*c83a76b0SSuyog Pawar     cu_me_intra_pred_prms_t s_cu_me_intra_pred_prms;
2369*c83a76b0SSuyog Pawar 
2370*c83a76b0SSuyog Pawar     /* Structure to save the flags required for Final mode Reconstruction
2371*c83a76b0SSuyog Pawar     function. These flags are set based on quality presets and bit-rate
2372*c83a76b0SSuyog Pawar     we are working on */
2373*c83a76b0SSuyog Pawar     cu_final_recon_flags_t s_cu_final_recon_flags;
2374*c83a76b0SSuyog Pawar 
2375*c83a76b0SSuyog Pawar     /* Parameter to how at which level RDOQ will be implemented:
2376*c83a76b0SSuyog Pawar     0 - RDOQ disbaled
2377*c83a76b0SSuyog Pawar     1 - RDOQ enabled during RDOPT for all candidates
2378*c83a76b0SSuyog Pawar     2 - RDOQ enabled only for the final candidate*/
2379*c83a76b0SSuyog Pawar     WORD32 i4_rdoq_level;
2380*c83a76b0SSuyog Pawar 
2381*c83a76b0SSuyog Pawar     /* Parameter to how at which level Quant rounding factors are computed:
2382*c83a76b0SSuyog Pawar     FIXED_QUANT_ROUNDING       : Fixed Quant rounding values are used
2383*c83a76b0SSuyog Pawar     NCTB_LEVEL_QUANT_ROUNDING  : NCTB level Cmputed Quant rounding values are used
2384*c83a76b0SSuyog Pawar     CTB_LEVEL_QUANT_ROUNDING   : CTB level Cmputed Quant rounding values are used
2385*c83a76b0SSuyog Pawar     CU_LEVEL_QUANT_ROUNDING    : CU level Cmputed Quant rounding values are used
2386*c83a76b0SSuyog Pawar     TU_LEVEL_QUANT_ROUNDING    : TU level Cmputed Quant rounding values are used*/
2387*c83a76b0SSuyog Pawar     WORD32 i4_quant_rounding_level;
2388*c83a76b0SSuyog Pawar 
2389*c83a76b0SSuyog Pawar     /* Parameter to how at which level Quant rounding factors are computed:
2390*c83a76b0SSuyog Pawar     CHROMA_QUANT_ROUNDING    : Chroma Quant rounding values are used for chroma */
2391*c83a76b0SSuyog Pawar     WORD32 i4_chroma_quant_rounding_level;
2392*c83a76b0SSuyog Pawar 
2393*c83a76b0SSuyog Pawar     /* Parameter to how at which level RDOQ will be implemented:
2394*c83a76b0SSuyog Pawar     0 - SBH disbaled
2395*c83a76b0SSuyog Pawar     1 - SBH enabled during RDOPT for all candidates
2396*c83a76b0SSuyog Pawar     2 - SBH enabled only for the final candidate*/
2397*c83a76b0SSuyog Pawar     WORD32 i4_sbh_level;
2398*c83a76b0SSuyog Pawar 
2399*c83a76b0SSuyog Pawar     /* Parameter to how at which level ZERO CBF RDO will be implemented:
2400*c83a76b0SSuyog Pawar     0 - ZCBF disbaled
2401*c83a76b0SSuyog Pawar     1 - ZCBF enabled during RDOPT for all candidates
2402*c83a76b0SSuyog Pawar     2 - ZCBF enabled only for the final candidate
2403*c83a76b0SSuyog Pawar     */
2404*c83a76b0SSuyog Pawar     WORD32 i4_zcbf_rdo_level;
2405*c83a76b0SSuyog Pawar 
2406*c83a76b0SSuyog Pawar     /*RDOQ-SBH context structure*/
2407*c83a76b0SSuyog Pawar     rdoq_sbh_ctxt_t s_rdoq_sbh_ctxt;
2408*c83a76b0SSuyog Pawar 
2409*c83a76b0SSuyog Pawar     /** Structure to store the Merge/Skip Cand. for EncLoop */
2410*c83a76b0SSuyog Pawar     cu_inter_merge_skip_t s_cu_inter_merge_skip;
2411*c83a76b0SSuyog Pawar     /** Structure to store the Mixed mode Cand. for EncLoop */
2412*c83a76b0SSuyog Pawar     cu_mixed_mode_inter_t s_mixed_mode_inter_cu;
2413*c83a76b0SSuyog Pawar 
2414*c83a76b0SSuyog Pawar     ihevce_inter_pred_buf_data_t s_pred_buf_data;
2415*c83a76b0SSuyog Pawar 
2416*c83a76b0SSuyog Pawar     void *pv_422_chroma_intra_pred_buf;
2417*c83a76b0SSuyog Pawar 
2418*c83a76b0SSuyog Pawar     WORD32 i4_max_num_inter_rdopt_cands;
2419*c83a76b0SSuyog Pawar 
2420*c83a76b0SSuyog Pawar     /* Output Struct per each CU during recursions */
2421*c83a76b0SSuyog Pawar     ihevce_enc_cu_node_ctxt_t as_enc_cu_ctxt[MAX_CU_IN_CTB + 1];
2422*c83a76b0SSuyog Pawar 
2423*c83a76b0SSuyog Pawar     /* Used to store best inter candidate. Used only when */
2424*c83a76b0SSuyog Pawar     /* 'CU modulated QP override' is enabled */
2425*c83a76b0SSuyog Pawar     cu_inter_cand_t as_best_cand[MAX_CU_IN_CTB + 1];
2426*c83a76b0SSuyog Pawar 
2427*c83a76b0SSuyog Pawar     cu_inter_cand_t *ps_best_cand;
2428*c83a76b0SSuyog Pawar 
2429*c83a76b0SSuyog Pawar     UWORD8 au1_cu_init_cabac_state_a_priori[MAX_CU_IN_CTB + 1][IHEVC_CAB_CTXT_END];
2430*c83a76b0SSuyog Pawar 
2431*c83a76b0SSuyog Pawar     UWORD8 (*pau1_curr_cu_a_priori_cabac_state)[IHEVC_CAB_CTXT_END];
2432*c83a76b0SSuyog Pawar 
2433*c83a76b0SSuyog Pawar     /* Used to store pred data of each CU in the CTB. */
2434*c83a76b0SSuyog Pawar     /* Used only when 'CU modulated QP override' is enabled */
2435*c83a76b0SSuyog Pawar     void *pv_CTB_pred_luma;
2436*c83a76b0SSuyog Pawar 
2437*c83a76b0SSuyog Pawar     void *pv_CTB_pred_chroma;
2438*c83a76b0SSuyog Pawar 
2439*c83a76b0SSuyog Pawar     /**
2440*c83a76b0SSuyog Pawar     * array for storing recon during SATD and RD opt stage at CU level
2441*c83a76b0SSuyog Pawar     * one best and one current is required.Luma and chroma together
2442*c83a76b0SSuyog Pawar     */
2443*c83a76b0SSuyog Pawar     void *pv_cu_luma_recon;
2444*c83a76b0SSuyog Pawar 
2445*c83a76b0SSuyog Pawar     /**
2446*c83a76b0SSuyog Pawar     * array for storing recon during SATD and RD opt stage at CU level
2447*c83a76b0SSuyog Pawar     * one best and one current is required.Luma and chroma together
2448*c83a76b0SSuyog Pawar     */
2449*c83a76b0SSuyog Pawar     void *pv_cu_chrma_recon;
2450*c83a76b0SSuyog Pawar 
2451*c83a76b0SSuyog Pawar     /**
2452*c83a76b0SSuyog Pawar     * Array to store pred modes  during SATD and RD opt stage at CU level
2453*c83a76b0SSuyog Pawar     * one best and one current is required
2454*c83a76b0SSuyog Pawar     */
2455*c83a76b0SSuyog Pawar     nbr_4x4_t as_cu_recur_nbr[MAX_PU_IN_CTB_ROW * MAX_PU_IN_CTB_ROW];
2456*c83a76b0SSuyog Pawar 
2457*c83a76b0SSuyog Pawar     /**
2458*c83a76b0SSuyog Pawar     * Pointer to Array to store pred modes  during SATD and RD opt stage at CU level
2459*c83a76b0SSuyog Pawar     * one best and one current is required
2460*c83a76b0SSuyog Pawar     */
2461*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_cu_recur_nbr;
2462*c83a76b0SSuyog Pawar 
2463*c83a76b0SSuyog Pawar     /**
2464*c83a76b0SSuyog Pawar     * Context models stored for CU recursion parent evaluation
2465*c83a76b0SSuyog Pawar     */
2466*c83a76b0SSuyog Pawar     UWORD8 au1_rdopt_recur_ctxt_models[4][IHEVC_CAB_CTXT_END];
2467*c83a76b0SSuyog Pawar 
2468*c83a76b0SSuyog Pawar     ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt;
2469*c83a76b0SSuyog Pawar 
2470*c83a76b0SSuyog Pawar     /**
2471*c83a76b0SSuyog Pawar     * array for storing coeffs during RD opt stage at CU level
2472*c83a76b0SSuyog Pawar     * one best and one current is required. Luma and chroma together
2473*c83a76b0SSuyog Pawar     */
2474*c83a76b0SSuyog Pawar     /*UWORD8 au1_cu_recur_coeffs[MAX_LUMA_COEFFS_CTB + MAX_CHRM_COEFFS_CTB];*/
2475*c83a76b0SSuyog Pawar 
2476*c83a76b0SSuyog Pawar     UWORD8 *pu1_cu_recur_coeffs;
2477*c83a76b0SSuyog Pawar 
2478*c83a76b0SSuyog Pawar     UWORD8 *apu1_cu_level_pingpong_coeff_buf_addr[2];
2479*c83a76b0SSuyog Pawar 
2480*c83a76b0SSuyog Pawar     WORD16 *api2_cu_level_pingpong_deq_buf_addr[2];
2481*c83a76b0SSuyog Pawar 
2482*c83a76b0SSuyog Pawar     UWORD8 *pu1_ecd_data;
2483*c83a76b0SSuyog Pawar 
2484*c83a76b0SSuyog Pawar     /* OPT: flag to skip parent CU=4TU eval during recursion */
2485*c83a76b0SSuyog Pawar     UWORD8 is_parent_cu_rdopt;
2486*c83a76b0SSuyog Pawar 
2487*c83a76b0SSuyog Pawar     /**
2488*c83a76b0SSuyog Pawar     *   Array of structs containing block merge data for
2489*c83a76b0SSuyog Pawar     *   4 32x32 CU's in indices 1 - 4 and 64x64 CU at 0
2490*c83a76b0SSuyog Pawar     */
2491*c83a76b0SSuyog Pawar     UWORD8 u1_cabac_states_next_row_copied_flag;
2492*c83a76b0SSuyog Pawar 
2493*c83a76b0SSuyog Pawar     UWORD8 u1_cabac_states_first_cu_copied_flag;
2494*c83a76b0SSuyog Pawar 
2495*c83a76b0SSuyog Pawar     UWORD32 u4_cur_ctb_wd;
2496*c83a76b0SSuyog Pawar 
2497*c83a76b0SSuyog Pawar     UWORD32 u4_cur_ctb_ht;
2498*c83a76b0SSuyog Pawar 
2499*c83a76b0SSuyog Pawar     /* thread id of the current context */
2500*c83a76b0SSuyog Pawar     WORD32 thrd_id;
2501*c83a76b0SSuyog Pawar 
2502*c83a76b0SSuyog Pawar     /** Number of processing threads created run time */
2503*c83a76b0SSuyog Pawar     WORD32 i4_num_proc_thrds;
2504*c83a76b0SSuyog Pawar 
2505*c83a76b0SSuyog Pawar     /* Instance number of bit-rate for multiple bit-rate encode */
2506*c83a76b0SSuyog Pawar     WORD32 i4_bitrate_instance_num;
2507*c83a76b0SSuyog Pawar 
2508*c83a76b0SSuyog Pawar     WORD32 i4_num_bitrates;
2509*c83a76b0SSuyog Pawar 
2510*c83a76b0SSuyog Pawar     WORD32 i4_enc_frm_id;
2511*c83a76b0SSuyog Pawar 
2512*c83a76b0SSuyog Pawar     /* Flag to indicate if chroma needs to be considered for cost calculation */
2513*c83a76b0SSuyog Pawar     WORD32 i4_consider_chroma_cost;
2514*c83a76b0SSuyog Pawar 
2515*c83a76b0SSuyog Pawar     /* Number of modes to be evaluated for intra */
2516*c83a76b0SSuyog Pawar     WORD32 i4_num_modes_to_evaluate_intra;
2517*c83a76b0SSuyog Pawar 
2518*c83a76b0SSuyog Pawar     /* Number of modes to be evaluated for inter */
2519*c83a76b0SSuyog Pawar     WORD32 i4_num_modes_to_evaluate_inter;
2520*c83a76b0SSuyog Pawar     /*pointers for struct to hold RC parameters for each bit-rate instance */
2521*c83a76b0SSuyog Pawar     enc_loop_rc_params_t
2522*c83a76b0SSuyog Pawar         *aaps_enc_loop_rc_params[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];
2523*c83a76b0SSuyog Pawar 
2524*c83a76b0SSuyog Pawar     /** Pointer to structure containing function pointers of common*/
2525*c83a76b0SSuyog Pawar     func_selector_t *ps_func_selector;
2526*c83a76b0SSuyog Pawar 
2527*c83a76b0SSuyog Pawar     /* Flag to control Top Right Sync for during Merge */
2528*c83a76b0SSuyog Pawar     UWORD8 u1_use_top_at_ctb_boundary;
2529*c83a76b0SSuyog Pawar 
2530*c83a76b0SSuyog Pawar     UWORD8 u1_is_input_data_hbd;
2531*c83a76b0SSuyog Pawar 
2532*c83a76b0SSuyog Pawar     UWORD8 u1_bit_depth;
2533*c83a76b0SSuyog Pawar 
2534*c83a76b0SSuyog Pawar     /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */
2535*c83a76b0SSuyog Pawar     UWORD8 u1_chroma_array_type;
2536*c83a76b0SSuyog Pawar 
2537*c83a76b0SSuyog Pawar     rc_quant_t *ps_rc_quant_ctxt;
2538*c83a76b0SSuyog Pawar 
2539*c83a76b0SSuyog Pawar     sao_ctxt_t s_sao_ctxt_t;
2540*c83a76b0SSuyog Pawar 
2541*c83a76b0SSuyog Pawar     /* Offset to get the Qp for the last CU of upper CTB-row.
2542*c83a76b0SSuyog Pawar     This offset is from the current tile top row QP map start.
2543*c83a76b0SSuyog Pawar     This will only be consumed by the first CU of current CTB-row
2544*c83a76b0SSuyog Pawar     iff [it is skip && entropy sync is off] */
2545*c83a76b0SSuyog Pawar     WORD32 *pi4_offset_for_last_cu_qp;
2546*c83a76b0SSuyog Pawar 
2547*c83a76b0SSuyog Pawar     double i4_lamda_modifier;
2548*c83a76b0SSuyog Pawar     double i4_uv_lamda_modifier;
2549*c83a76b0SSuyog Pawar     WORD32 i4_temporal_layer_id;
2550*c83a76b0SSuyog Pawar 
2551*c83a76b0SSuyog Pawar     UWORD8 u1_disable_intra_eval;
2552*c83a76b0SSuyog Pawar 
2553*c83a76b0SSuyog Pawar     WORD32 i4_quant_round_tu[2][32 * 32];
2554*c83a76b0SSuyog Pawar 
2555*c83a76b0SSuyog Pawar     WORD32 *pi4_quant_round_factor_tu_0_1[5];
2556*c83a76b0SSuyog Pawar     WORD32 *pi4_quant_round_factor_tu_1_2[5];
2557*c83a76b0SSuyog Pawar 
2558*c83a76b0SSuyog Pawar     WORD32 i4_quant_round_4x4[2][4 * 4];
2559*c83a76b0SSuyog Pawar     WORD32 i4_quant_round_8x8[2][8 * 8];
2560*c83a76b0SSuyog Pawar     WORD32 i4_quant_round_16x16[2][16 * 16];
2561*c83a76b0SSuyog Pawar     WORD32 i4_quant_round_32x32[2][32 * 32];
2562*c83a76b0SSuyog Pawar 
2563*c83a76b0SSuyog Pawar     WORD32 *pi4_quant_round_factor_cu_ctb_0_1[5];
2564*c83a76b0SSuyog Pawar     WORD32 *pi4_quant_round_factor_cu_ctb_1_2[5];
2565*c83a76b0SSuyog Pawar 
2566*c83a76b0SSuyog Pawar     WORD32 i4_quant_round_cr_4x4[2][4 * 4];
2567*c83a76b0SSuyog Pawar     WORD32 i4_quant_round_cr_8x8[2][8 * 8];
2568*c83a76b0SSuyog Pawar     WORD32 i4_quant_round_cr_16x16[2][16 * 16];
2569*c83a76b0SSuyog Pawar 
2570*c83a76b0SSuyog Pawar     WORD32 *pi4_quant_round_factor_cr_cu_ctb_0_1[3];
2571*c83a76b0SSuyog Pawar     WORD32 *pi4_quant_round_factor_cr_cu_ctb_1_2[3];
2572*c83a76b0SSuyog Pawar     /* cost for not coding cu residue i.e forcing no residue syntax as 1 */
2573*c83a76b0SSuyog Pawar     LWORD64 i8_cu_not_coded_cost;
2574*c83a76b0SSuyog Pawar 
2575*c83a76b0SSuyog Pawar     /* dependency manager for forward ME  sync */
2576*c83a76b0SSuyog Pawar     void *pv_dep_mngr_encloop_dep_me;
2577*c83a76b0SSuyog Pawar 
2578*c83a76b0SSuyog Pawar     LWORD64 ai4_source_satd_8x8[64];
2579*c83a76b0SSuyog Pawar 
2580*c83a76b0SSuyog Pawar     LWORD64 ai4_source_chroma_satd[256];
2581*c83a76b0SSuyog Pawar 
2582*c83a76b0SSuyog Pawar     UWORD8 u1_is_refPic;
2583*c83a76b0SSuyog Pawar 
2584*c83a76b0SSuyog Pawar     WORD32 i4_qp_mod;
2585*c83a76b0SSuyog Pawar 
2586*c83a76b0SSuyog Pawar     WORD32 i4_is_ref_pic;
2587*c83a76b0SSuyog Pawar 
2588*c83a76b0SSuyog Pawar     WORD32 i4_chroma_format;
2589*c83a76b0SSuyog Pawar 
2590*c83a76b0SSuyog Pawar     WORD32 i4_temporal_layer;
2591*c83a76b0SSuyog Pawar 
2592*c83a76b0SSuyog Pawar     WORD32 i4_use_const_lamda_modifier;
2593*c83a76b0SSuyog Pawar 
2594*c83a76b0SSuyog Pawar     double f_i_pic_lamda_modifier;
2595*c83a76b0SSuyog Pawar 
2596*c83a76b0SSuyog Pawar     LWORD64 i8_distortion;
2597*c83a76b0SSuyog Pawar 
2598*c83a76b0SSuyog Pawar     WORD32 i4_use_ctb_level_lamda;
2599*c83a76b0SSuyog Pawar 
2600*c83a76b0SSuyog Pawar     float f_str_ratio;
2601*c83a76b0SSuyog Pawar 
2602*c83a76b0SSuyog Pawar     /* Flag to indicate if current frame is to be shared with other clients.
2603*c83a76b0SSuyog Pawar     Used only in distributed-encoding */
2604*c83a76b0SSuyog Pawar     WORD32 i4_share_flag;
2605*c83a76b0SSuyog Pawar 
2606*c83a76b0SSuyog Pawar     /* Pointer to the current recon being processed.
2607*c83a76b0SSuyog Pawar     Needed for enabling TMVP in dist-encoding */
2608*c83a76b0SSuyog Pawar     void *pv_frm_recon;
2609*c83a76b0SSuyog Pawar 
2610*c83a76b0SSuyog Pawar     ihevce_cmn_opt_func_t s_cmn_opt_func;
2611*c83a76b0SSuyog Pawar 
2612*c83a76b0SSuyog Pawar     /* The ME analogue to the struct above was not included since */
2613*c83a76b0SSuyog Pawar     /* that would have entailed inclusion of all ME specific */
2614*c83a76b0SSuyog Pawar     /* header files */
2615*c83a76b0SSuyog Pawar     /*FT_SAD_EVALUATOR **/
2616*c83a76b0SSuyog Pawar 
2617*c83a76b0SSuyog Pawar     /*FT_SAD_EVALUATOR **/
2618*c83a76b0SSuyog Pawar     void *pv_evalsad_pt_npu_mxn_8bit;
2619*c83a76b0SSuyog Pawar     UWORD8 u1_enable_psyRDOPT;
2620*c83a76b0SSuyog Pawar 
2621*c83a76b0SSuyog Pawar     UWORD8 u1_is_stasino_enabled;
2622*c83a76b0SSuyog Pawar 
2623*c83a76b0SSuyog Pawar     UWORD32 u4_psy_strength;
2624*c83a76b0SSuyog Pawar     /*Sub PIC rc context */
2625*c83a76b0SSuyog Pawar 
2626*c83a76b0SSuyog Pawar     WORD32 i4_sub_pic_level_rc;
2627*c83a76b0SSuyog Pawar     WORD32 i4_num_ctb_for_out_scale;
2628*c83a76b0SSuyog Pawar 
2629*c83a76b0SSuyog Pawar     /**
2630*c83a76b0SSuyog Pawar      * Accumalated bits of all cu for required CTBS estimated during RDO evaluation.
2631*c83a76b0SSuyog Pawar      * Required for sup pic level RC. Reset when required CU/CTB count is reached.
2632*c83a76b0SSuyog Pawar      */
2633*c83a76b0SSuyog Pawar     UWORD32 u4_total_cu_bits;
2634*c83a76b0SSuyog Pawar 
2635*c83a76b0SSuyog Pawar     UWORD32 u4_total_cu_bits_mul_qs;
2636*c83a76b0SSuyog Pawar 
2637*c83a76b0SSuyog Pawar     UWORD32 u4_total_cu_hdr_bits;
2638*c83a76b0SSuyog Pawar 
2639*c83a76b0SSuyog Pawar     UWORD32 u4_cu_tot_bits_into_qscale;
2640*c83a76b0SSuyog Pawar 
2641*c83a76b0SSuyog Pawar     UWORD32 u4_cu_tot_bits;
2642*c83a76b0SSuyog Pawar 
2643*c83a76b0SSuyog Pawar     /*Scale added to the current qscale, output from sub pic rc*/
2644*c83a76b0SSuyog Pawar     WORD32 i4_cu_qp_sub_pic_rc;
2645*c83a76b0SSuyog Pawar 
2646*c83a76b0SSuyog Pawar     /*Frame level L1 IPE sad*/
2647*c83a76b0SSuyog Pawar     LWORD64 i8_frame_l1_ipe_sad;
2648*c83a76b0SSuyog Pawar 
2649*c83a76b0SSuyog Pawar     /*Frame level L0 IPE satd*/
2650*c83a76b0SSuyog Pawar     LWORD64 i8_frame_l0_ipe_satd;
2651*c83a76b0SSuyog Pawar 
2652*c83a76b0SSuyog Pawar     /*Frame level L1 ME sad*/
2653*c83a76b0SSuyog Pawar     LWORD64 i8_frame_l1_me_sad;
2654*c83a76b0SSuyog Pawar 
2655*c83a76b0SSuyog Pawar     /*Frame level L1 activity factor*/
2656*c83a76b0SSuyog Pawar     LWORD64 i8_frame_l1_activity_fact;
2657*c83a76b0SSuyog Pawar     /*bits esimated for frame calulated for sub pic rc bit control */
2658*c83a76b0SSuyog Pawar     WORD32 ai4_frame_bits_estimated[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];
2659*c83a76b0SSuyog Pawar     /** I Scene cut */
2660*c83a76b0SSuyog Pawar     WORD32 i4_is_I_scenecut;
2661*c83a76b0SSuyog Pawar 
2662*c83a76b0SSuyog Pawar     /** Non Scene cut */
2663*c83a76b0SSuyog Pawar     WORD32 i4_is_non_I_scenecut;
2664*c83a76b0SSuyog Pawar 
2665*c83a76b0SSuyog Pawar     /** Frames for which online/offline model is not valid */
2666*c83a76b0SSuyog Pawar     WORD32 i4_is_model_valid;
2667*c83a76b0SSuyog Pawar 
2668*c83a76b0SSuyog Pawar     /** Steady State Frame */
2669*c83a76b0SSuyog Pawar     //WORD32 i4_is_steady_state;
2670*c83a76b0SSuyog Pawar 
2671*c83a76b0SSuyog Pawar     WORD32 i4_is_first_query;
2672*c83a76b0SSuyog Pawar 
2673*c83a76b0SSuyog Pawar     /* Pointer to Tile params base */
2674*c83a76b0SSuyog Pawar     void *pv_tile_params_base;
2675*c83a76b0SSuyog Pawar 
2676*c83a76b0SSuyog Pawar     /** The index of column tile for which it is working */
2677*c83a76b0SSuyog Pawar     WORD32 i4_tile_col_idx;
2678*c83a76b0SSuyog Pawar 
2679*c83a76b0SSuyog Pawar     WORD32 i4_max_search_range_horizontal;
2680*c83a76b0SSuyog Pawar 
2681*c83a76b0SSuyog Pawar     WORD32 i4_max_search_range_vertical;
2682*c83a76b0SSuyog Pawar 
2683*c83a76b0SSuyog Pawar     WORD32 i4_is_ctb_qp_modified;
2684*c83a76b0SSuyog Pawar 
2685*c83a76b0SSuyog Pawar     WORD32 i4_display_num;
2686*c83a76b0SSuyog Pawar 
2687*c83a76b0SSuyog Pawar     WORD32 i4_pred_qp;
2688*c83a76b0SSuyog Pawar 
2689*c83a76b0SSuyog Pawar     /*assumption of qg size is 8x8 block size*/
2690*c83a76b0SSuyog Pawar     WORD32 ai4_qp_qg[8 * 8];
2691*c83a76b0SSuyog Pawar 
2692*c83a76b0SSuyog Pawar     WORD32 i4_last_cu_qp_from_prev_ctb;
2693*c83a76b0SSuyog Pawar 
2694*c83a76b0SSuyog Pawar     WORD32 i4_prev_QP;
2695*c83a76b0SSuyog Pawar 
2696*c83a76b0SSuyog Pawar     UWORD8 u1_max_inter_tr_depth;
2697*c83a76b0SSuyog Pawar 
2698*c83a76b0SSuyog Pawar     UWORD8 u1_max_intra_tr_depth;
2699*c83a76b0SSuyog Pawar 
2700*c83a76b0SSuyog Pawar } ihevce_enc_loop_ctxt_t;
2701*c83a76b0SSuyog Pawar 
2702*c83a76b0SSuyog Pawar /*****************************************************************************/
2703*c83a76b0SSuyog Pawar /* Enums                                                                     */
2704*c83a76b0SSuyog Pawar /*****************************************************************************/
2705*c83a76b0SSuyog Pawar 
2706*c83a76b0SSuyog Pawar /** @brief RDOQ_LEVELS_T: This enumeration specifies the RDOQ mode of operation
2707*c83a76b0SSuyog Pawar *
2708*c83a76b0SSuyog Pawar *  NO_RDOQ    : RDOQ is not performed
2709*c83a76b0SSuyog Pawar *  BEST_CAND_RDOQ : RDOQ for final candidate only
2710*c83a76b0SSuyog Pawar *  ALL_CAND_RDOQ : RDOQ for all candidates
2711*c83a76b0SSuyog Pawar */
2712*c83a76b0SSuyog Pawar typedef enum
2713*c83a76b0SSuyog Pawar {
2714*c83a76b0SSuyog Pawar     NO_RDOQ,
2715*c83a76b0SSuyog Pawar     BEST_CAND_RDOQ,
2716*c83a76b0SSuyog Pawar     ALL_CAND_RDOQ,
2717*c83a76b0SSuyog Pawar } RDOQ_LEVELS_T;
2718*c83a76b0SSuyog Pawar 
2719*c83a76b0SSuyog Pawar /** @brief QUANT_ROUNDING_COEFF_LEVELS_T: This enumeration specifies the Coef level RDOQ mode of operation
2720*c83a76b0SSuyog Pawar *
2721*c83a76b0SSuyog Pawar *  FIXED_QUANT_ROUNDING       : Fixed Quant rounding values are used
2722*c83a76b0SSuyog Pawar *  NCTB_LEVEL_QUANT_ROUNDING  : NCTB level Cmputed Quant rounding values are used
2723*c83a76b0SSuyog Pawar *  CTB_LEVEL_QUANT_ROUNDING   : CTB level Cmputed Quant rounding values are used
2724*c83a76b0SSuyog Pawar *  CU_LEVEL_QUANT_ROUNDING    : CU level Cmputed Quant rounding values are used
2725*c83a76b0SSuyog Pawar *  TU_LEVEL_QUANT_ROUNDING    : TU level Cmputed Quant rounding values are used
2726*c83a76b0SSuyog Pawar *               Defaulat for all candidtes, based on RDOQ_LEVELS_T choose to best candidate
2727*c83a76b0SSuyog Pawar */
2728*c83a76b0SSuyog Pawar typedef enum
2729*c83a76b0SSuyog Pawar {
2730*c83a76b0SSuyog Pawar     FIXED_QUANT_ROUNDING,
2731*c83a76b0SSuyog Pawar     NCTB_LEVEL_QUANT_ROUNDING,
2732*c83a76b0SSuyog Pawar     CTB_LEVEL_QUANT_ROUNDING,
2733*c83a76b0SSuyog Pawar     CU_LEVEL_QUANT_ROUNDING,
2734*c83a76b0SSuyog Pawar     TU_LEVEL_QUANT_ROUNDING,
2735*c83a76b0SSuyog Pawar     CHROMA_QUANT_ROUNDING
2736*c83a76b0SSuyog Pawar } QUANT_ROUNDING_COEFF_LEVELS_T;
2737*c83a76b0SSuyog Pawar 
2738*c83a76b0SSuyog Pawar /*****************************************************************************/
2739*c83a76b0SSuyog Pawar /* Enums                                                                     */
2740*c83a76b0SSuyog Pawar /*****************************************************************************/
2741*c83a76b0SSuyog Pawar 
2742*c83a76b0SSuyog Pawar /** @brief SBH_LEVELS_T: This enumeration specifies the RDOQ mode of operation
2743*c83a76b0SSuyog Pawar *
2744*c83a76b0SSuyog Pawar *  NO_SBH    : SBH is not performed
2745*c83a76b0SSuyog Pawar *  BEST_CAND_SBH : SBH for final candidate only
2746*c83a76b0SSuyog Pawar *  ALL_CAND_SBH : SBH for all candidates
2747*c83a76b0SSuyog Pawar */
2748*c83a76b0SSuyog Pawar typedef enum
2749*c83a76b0SSuyog Pawar {
2750*c83a76b0SSuyog Pawar     NO_SBH,
2751*c83a76b0SSuyog Pawar     BEST_CAND_SBH,
2752*c83a76b0SSuyog Pawar     ALL_CAND_SBH,
2753*c83a76b0SSuyog Pawar } SBH_LEVELS_T;
2754*c83a76b0SSuyog Pawar 
2755*c83a76b0SSuyog Pawar /** @brief ZCBF_LEVELS_T: This enumeration specifies the ZeroCBF RDO mode of operation
2756*c83a76b0SSuyog Pawar *
2757*c83a76b0SSuyog Pawar *  NO_ZCBF    : ZCBF RDO is not performed
2758*c83a76b0SSuyog Pawar *  ALL_CAND_ZCBF : ZCBF RDO for all candidates
2759*c83a76b0SSuyog Pawar */
2760*c83a76b0SSuyog Pawar typedef enum
2761*c83a76b0SSuyog Pawar {
2762*c83a76b0SSuyog Pawar     NO_ZCBF,
2763*c83a76b0SSuyog Pawar     ZCBF_ENABLE,
2764*c83a76b0SSuyog Pawar } ZCBF_LEVELS_T;
2765*c83a76b0SSuyog Pawar 
2766*c83a76b0SSuyog Pawar /**
2767*c83a76b0SSuyog Pawar ******************************************************************************
2768*c83a76b0SSuyog Pawar *  @brief  Encode loop master context structure
2769*c83a76b0SSuyog Pawar ******************************************************************************
2770*c83a76b0SSuyog Pawar */
2771*c83a76b0SSuyog Pawar typedef struct
2772*c83a76b0SSuyog Pawar {
2773*c83a76b0SSuyog Pawar     /** Array of encode loop structure */
2774*c83a76b0SSuyog Pawar     ihevce_enc_loop_ctxt_t *aps_enc_loop_thrd_ctxt[MAX_NUM_FRM_PROC_THRDS_ENC];
2775*c83a76b0SSuyog Pawar 
2776*c83a76b0SSuyog Pawar     /** Number of processing threads created run time */
2777*c83a76b0SSuyog Pawar     WORD32 i4_num_proc_thrds;
2778*c83a76b0SSuyog Pawar 
2779*c83a76b0SSuyog Pawar     /**
2780*c83a76b0SSuyog Pawar     *  Array of top row cu skip flags (1 bit per 8x8CU)
2781*c83a76b0SSuyog Pawar     */
2782*c83a76b0SSuyog Pawar     UWORD8 au1_cu_skip_top_row[HEVCE_MAX_WIDTH >> 6];
2783*c83a76b0SSuyog Pawar 
2784*c83a76b0SSuyog Pawar     /** Context models stored at the end of second CTB in a row)
2785*c83a76b0SSuyog Pawar     *  stored in packed form pState[bits6-1] | MPS[bit0]
2786*c83a76b0SSuyog Pawar     *  for each CTB row
2787*c83a76b0SSuyog Pawar     *  using entropy sync model in RD opt
2788*c83a76b0SSuyog Pawar     */
2789*c83a76b0SSuyog Pawar     UWORD8 au1_ctxt_models[MAX_NUM_CTB_ROWS_FRM][IHEVC_CAB_CTXT_END];
2790*c83a76b0SSuyog Pawar 
2791*c83a76b0SSuyog Pawar     /** Dependency manager for controlling EncLoop Top-Right CU dependency
2792*c83a76b0SSuyog Pawar     * One per each bit-rate and one per each frame in parallel
2793*c83a76b0SSuyog Pawar     */
2794*c83a76b0SSuyog Pawar     void *aapv_dep_mngr_enc_loop_cu_top_right[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];
2795*c83a76b0SSuyog Pawar 
2796*c83a76b0SSuyog Pawar     /** Dependency manager for controlling Deblocking Top dependency
2797*c83a76b0SSuyog Pawar     * One per each bit-rate and one per each frame in parallel
2798*c83a76b0SSuyog Pawar     */
2799*c83a76b0SSuyog Pawar     void *aapv_dep_mngr_enc_loop_dblk[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];
2800*c83a76b0SSuyog Pawar 
2801*c83a76b0SSuyog Pawar     /** Dependency manager for controlling Sao Top dependency
2802*c83a76b0SSuyog Pawar     * One per each bit-rate and one per each frame in parallel
2803*c83a76b0SSuyog Pawar     */
2804*c83a76b0SSuyog Pawar     void *aapv_dep_mngr_enc_loop_sao[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];
2805*c83a76b0SSuyog Pawar 
2806*c83a76b0SSuyog Pawar     /** number of bit-rate instances running */
2807*c83a76b0SSuyog Pawar     WORD32 i4_num_bitrates;
2808*c83a76b0SSuyog Pawar 
2809*c83a76b0SSuyog Pawar     /** number of enc frames running in parallel */
2810*c83a76b0SSuyog Pawar     WORD32 i4_num_enc_loop_frm_pllel;
2811*c83a76b0SSuyog Pawar 
2812*c83a76b0SSuyog Pawar     /* Pointer to Tile params base */
2813*c83a76b0SSuyog Pawar     void *pv_tile_params_base;
2814*c83a76b0SSuyog Pawar     /* Offset to get the Qp for the last CU of upper CTB-row.
2815*c83a76b0SSuyog Pawar     This offset is from the current tile top row QP map start.
2816*c83a76b0SSuyog Pawar 
2817*c83a76b0SSuyog Pawar     This will only be consumed by the first CU of current CTB-row
2818*c83a76b0SSuyog Pawar     iff [it is skip && entropy sync is off]
2819*c83a76b0SSuyog Pawar     There is one entry of every tile-column bcoz offset remains constant
2820*c83a76b0SSuyog Pawar     for all tiles lying in a tile-column */
2821*c83a76b0SSuyog Pawar     WORD32 ai4_offset_for_last_cu_qp[MAX_TILE_COLUMNS];
2822*c83a76b0SSuyog Pawar } ihevce_enc_loop_master_ctxt_t;
2823*c83a76b0SSuyog Pawar 
2824*c83a76b0SSuyog Pawar /**
2825*c83a76b0SSuyog Pawar ******************************************************************************
2826*c83a76b0SSuyog Pawar *  @brief  This struct is used for storing data required by the block merge
2827*c83a76b0SSuyog Pawar *          function
2828*c83a76b0SSuyog Pawar ******************************************************************************
2829*c83a76b0SSuyog Pawar */
2830*c83a76b0SSuyog Pawar typedef struct
2831*c83a76b0SSuyog Pawar {
2832*c83a76b0SSuyog Pawar     block_data_8x8_t *ps_8x8_data;
2833*c83a76b0SSuyog Pawar 
2834*c83a76b0SSuyog Pawar     block_data_16x16_t *ps_16x16_data;
2835*c83a76b0SSuyog Pawar 
2836*c83a76b0SSuyog Pawar     block_data_32x32_t *ps_32x32_data;
2837*c83a76b0SSuyog Pawar 
2838*c83a76b0SSuyog Pawar     block_data_64x64_t *ps_64x64_data;
2839*c83a76b0SSuyog Pawar 
2840*c83a76b0SSuyog Pawar     part_type_results_t **ps_32x32_results;
2841*c83a76b0SSuyog Pawar 
2842*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_cu_tree;
2843*c83a76b0SSuyog Pawar 
2844*c83a76b0SSuyog Pawar     ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb;
2845*c83a76b0SSuyog Pawar 
2846*c83a76b0SSuyog Pawar     mv_pred_ctxt_t *ps_mv_pred_ctxt;
2847*c83a76b0SSuyog Pawar 
2848*c83a76b0SSuyog Pawar     recon_pic_buf_t *(*aps_ref_list)[HEVCE_MAX_REF_PICS * 2];
2849*c83a76b0SSuyog Pawar 
2850*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_top_nbr_4x4;
2851*c83a76b0SSuyog Pawar 
2852*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_left_nbr_4x4;
2853*c83a76b0SSuyog Pawar 
2854*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_curr_nbr_4x4;
2855*c83a76b0SSuyog Pawar 
2856*c83a76b0SSuyog Pawar     UWORD8 *pu1_inp;
2857*c83a76b0SSuyog Pawar 
2858*c83a76b0SSuyog Pawar     UWORD8 *pu1_ctb_nbr_map;
2859*c83a76b0SSuyog Pawar 
2860*c83a76b0SSuyog Pawar     WORD32 i4_nbr_map_strd;
2861*c83a76b0SSuyog Pawar 
2862*c83a76b0SSuyog Pawar     WORD32 inp_stride;
2863*c83a76b0SSuyog Pawar 
2864*c83a76b0SSuyog Pawar     WORD32 i4_ctb_x_off;
2865*c83a76b0SSuyog Pawar 
2866*c83a76b0SSuyog Pawar     WORD32 i4_ctb_y_off;
2867*c83a76b0SSuyog Pawar 
2868*c83a76b0SSuyog Pawar     WORD32 use_satd_for_err_calc;
2869*c83a76b0SSuyog Pawar 
2870*c83a76b0SSuyog Pawar     WORD32 lambda;
2871*c83a76b0SSuyog Pawar 
2872*c83a76b0SSuyog Pawar     WORD32 lambda_q_shift;
2873*c83a76b0SSuyog Pawar 
2874*c83a76b0SSuyog Pawar     WORD32 frm_qstep;
2875*c83a76b0SSuyog Pawar 
2876*c83a76b0SSuyog Pawar     WORD32 num_4x4_in_ctb;
2877*c83a76b0SSuyog Pawar 
2878*c83a76b0SSuyog Pawar     UWORD8 *pu1_wkg_mem;
2879*c83a76b0SSuyog Pawar 
2880*c83a76b0SSuyog Pawar     UWORD8 **ppu1_pred;
2881*c83a76b0SSuyog Pawar 
2882*c83a76b0SSuyog Pawar     UWORD8 u1_bidir_enabled;
2883*c83a76b0SSuyog Pawar 
2884*c83a76b0SSuyog Pawar     UWORD8 u1_max_tr_depth;
2885*c83a76b0SSuyog Pawar 
2886*c83a76b0SSuyog Pawar     WORD32 i4_ctb_pos;
2887*c83a76b0SSuyog Pawar 
2888*c83a76b0SSuyog Pawar     WORD32 i4_ctb_size;
2889*c83a76b0SSuyog Pawar 
2890*c83a76b0SSuyog Pawar     UWORD8 *apu1_wt_inp[MAX_REFS_SEARCHABLE + 1];
2891*c83a76b0SSuyog Pawar 
2892*c83a76b0SSuyog Pawar     /** Pointer of Dep Mngr for EncLoop Top-Right CU dependency */
2893*c83a76b0SSuyog Pawar     void *pv_dep_mngr_enc_loop_cu_top_right;
2894*c83a76b0SSuyog Pawar     /** The current cu row no. for Dep Manager to Check */
2895*c83a76b0SSuyog Pawar     WORD32 i4_dep_mngr_cur_cu_row_no;
2896*c83a76b0SSuyog Pawar     /** The Top cu row no. for Dep Manager to Check */
2897*c83a76b0SSuyog Pawar     WORD32 i4_dep_mngr_top_cu_row_no;
2898*c83a76b0SSuyog Pawar 
2899*c83a76b0SSuyog Pawar     WORD8 i1_quality_preset;
2900*c83a76b0SSuyog Pawar 
2901*c83a76b0SSuyog Pawar     /* Flag to control Top Right Sync for during Merge */
2902*c83a76b0SSuyog Pawar     UWORD8 u1_use_top_at_ctb_boundary;
2903*c83a76b0SSuyog Pawar 
2904*c83a76b0SSuyog Pawar } block_merge_input_t;
2905*c83a76b0SSuyog Pawar 
2906*c83a76b0SSuyog Pawar /* Structure which stores the info regarding the TU's present in the CU*/
2907*c83a76b0SSuyog Pawar typedef struct tu_prms_t
2908*c83a76b0SSuyog Pawar {
2909*c83a76b0SSuyog Pawar     UWORD8 u1_tu_size;
2910*c83a76b0SSuyog Pawar 
2911*c83a76b0SSuyog Pawar     UWORD8 u1_x_off;
2912*c83a76b0SSuyog Pawar 
2913*c83a76b0SSuyog Pawar     UWORD8 u1_y_off;
2914*c83a76b0SSuyog Pawar 
2915*c83a76b0SSuyog Pawar     WORD32 i4_tu_cost;
2916*c83a76b0SSuyog Pawar 
2917*c83a76b0SSuyog Pawar     WORD32 i4_early_cbf;
2918*c83a76b0SSuyog Pawar 
2919*c83a76b0SSuyog Pawar } tu_prms_t;
2920*c83a76b0SSuyog Pawar 
2921*c83a76b0SSuyog Pawar typedef struct
2922*c83a76b0SSuyog Pawar {
2923*c83a76b0SSuyog Pawar     cu_enc_loop_out_t **pps_cu_final;
2924*c83a76b0SSuyog Pawar 
2925*c83a76b0SSuyog Pawar     pu_t **pps_row_pu;
2926*c83a76b0SSuyog Pawar 
2927*c83a76b0SSuyog Pawar     tu_enc_loop_out_t **pps_row_tu;
2928*c83a76b0SSuyog Pawar 
2929*c83a76b0SSuyog Pawar     UWORD8 **ppu1_row_ecd_data;
2930*c83a76b0SSuyog Pawar 
2931*c83a76b0SSuyog Pawar     WORD32 *pi4_num_pus_in_ctb;
2932*c83a76b0SSuyog Pawar 
2933*c83a76b0SSuyog Pawar     WORD32 *pi4_last_cu_pos_in_ctb;
2934*c83a76b0SSuyog Pawar 
2935*c83a76b0SSuyog Pawar     WORD32 *pi4_last_cu_size;
2936*c83a76b0SSuyog Pawar 
2937*c83a76b0SSuyog Pawar     UWORD8 *pu1_num_cus_in_ctb_out;
2938*c83a76b0SSuyog Pawar 
2939*c83a76b0SSuyog Pawar } cu_final_update_prms;
2940*c83a76b0SSuyog Pawar 
2941*c83a76b0SSuyog Pawar typedef struct
2942*c83a76b0SSuyog Pawar {
2943*c83a76b0SSuyog Pawar     cu_nbr_prms_t *ps_cu_nbr_prms;
2944*c83a76b0SSuyog Pawar 
2945*c83a76b0SSuyog Pawar     cu_inter_cand_t *ps_best_inter_cand;
2946*c83a76b0SSuyog Pawar 
2947*c83a76b0SSuyog Pawar     enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms;
2948*c83a76b0SSuyog Pawar 
2949*c83a76b0SSuyog Pawar     WORD32 packed_pred_mode;
2950*c83a76b0SSuyog Pawar 
2951*c83a76b0SSuyog Pawar     WORD32 rd_opt_best_idx;
2952*c83a76b0SSuyog Pawar 
2953*c83a76b0SSuyog Pawar     void *pv_src;
2954*c83a76b0SSuyog Pawar 
2955*c83a76b0SSuyog Pawar     WORD32 src_strd;
2956*c83a76b0SSuyog Pawar 
2957*c83a76b0SSuyog Pawar     void *pv_pred;
2958*c83a76b0SSuyog Pawar 
2959*c83a76b0SSuyog Pawar     WORD32 pred_strd;
2960*c83a76b0SSuyog Pawar 
2961*c83a76b0SSuyog Pawar     void *pv_pred_chrm;
2962*c83a76b0SSuyog Pawar 
2963*c83a76b0SSuyog Pawar     WORD32 pred_chrm_strd;
2964*c83a76b0SSuyog Pawar 
2965*c83a76b0SSuyog Pawar     UWORD8 *pu1_final_ecd_data;
2966*c83a76b0SSuyog Pawar 
2967*c83a76b0SSuyog Pawar     UWORD8 *pu1_csbf_buf;
2968*c83a76b0SSuyog Pawar 
2969*c83a76b0SSuyog Pawar     WORD32 csbf_strd;
2970*c83a76b0SSuyog Pawar 
2971*c83a76b0SSuyog Pawar     void *pv_luma_recon;
2972*c83a76b0SSuyog Pawar 
2973*c83a76b0SSuyog Pawar     WORD32 recon_luma_strd;
2974*c83a76b0SSuyog Pawar 
2975*c83a76b0SSuyog Pawar     void *pv_chrm_recon;
2976*c83a76b0SSuyog Pawar 
2977*c83a76b0SSuyog Pawar     WORD32 recon_chrma_strd;
2978*c83a76b0SSuyog Pawar 
2979*c83a76b0SSuyog Pawar     UWORD8 u1_cu_pos_x;
2980*c83a76b0SSuyog Pawar 
2981*c83a76b0SSuyog Pawar     UWORD8 u1_cu_pos_y;
2982*c83a76b0SSuyog Pawar 
2983*c83a76b0SSuyog Pawar     UWORD8 u1_cu_size;
2984*c83a76b0SSuyog Pawar 
2985*c83a76b0SSuyog Pawar     WORD8 i1_cu_qp;
2986*c83a76b0SSuyog Pawar 
2987*c83a76b0SSuyog Pawar     UWORD8 u1_will_cabac_state_change;
2988*c83a76b0SSuyog Pawar 
2989*c83a76b0SSuyog Pawar     UWORD8 u1_recompute_sbh_and_rdoq;
2990*c83a76b0SSuyog Pawar 
2991*c83a76b0SSuyog Pawar     UWORD8 u1_is_first_pass;
2992*c83a76b0SSuyog Pawar 
2993*c83a76b0SSuyog Pawar #if USE_NOISE_TERM_IN_ZERO_CODING_DECISION_ALGORITHMS
2994*c83a76b0SSuyog Pawar     UWORD8 u1_is_cu_noisy;
2995*c83a76b0SSuyog Pawar #endif
2996*c83a76b0SSuyog Pawar 
2997*c83a76b0SSuyog Pawar } final_mode_process_prms_t;
2998*c83a76b0SSuyog Pawar 
2999*c83a76b0SSuyog Pawar typedef struct
3000*c83a76b0SSuyog Pawar {
3001*c83a76b0SSuyog Pawar     cu_inter_cand_t s_best_cand;
3002*c83a76b0SSuyog Pawar 
3003*c83a76b0SSuyog Pawar     /* The size is twice of what is required to ensure availability */
3004*c83a76b0SSuyog Pawar     /* of adequate space for 'HBD' case */
3005*c83a76b0SSuyog Pawar     UWORD8 au1_pred_luma[MAX_CU_SIZE * MAX_CU_SIZE * 2];
3006*c83a76b0SSuyog Pawar 
3007*c83a76b0SSuyog Pawar     /* The size is twice of what is required to ensure availability */
3008*c83a76b0SSuyog Pawar     /* of adequate space for 422 case */
3009*c83a76b0SSuyog Pawar     UWORD8 au1_pred_chroma[MAX_CU_SIZE * MAX_CU_SIZE * 2];
3010*c83a76b0SSuyog Pawar } final_mode_state_t;
3011*c83a76b0SSuyog Pawar 
3012*c83a76b0SSuyog Pawar typedef struct
3013*c83a76b0SSuyog Pawar {
3014*c83a76b0SSuyog Pawar     cu_mixed_mode_inter_t *ps_mixed_modes_datastore;
3015*c83a76b0SSuyog Pawar 
3016*c83a76b0SSuyog Pawar     cu_inter_cand_t *ps_me_cands;
3017*c83a76b0SSuyog Pawar 
3018*c83a76b0SSuyog Pawar     cu_inter_cand_t *ps_merge_cands;
3019*c83a76b0SSuyog Pawar 
3020*c83a76b0SSuyog Pawar     mv_pred_ctxt_t *ps_mv_pred_ctxt;
3021*c83a76b0SSuyog Pawar 
3022*c83a76b0SSuyog Pawar     inter_pred_ctxt_t *ps_mc_ctxt;
3023*c83a76b0SSuyog Pawar 
3024*c83a76b0SSuyog Pawar     UWORD8 *pu1_ctb_nbr_map;
3025*c83a76b0SSuyog Pawar 
3026*c83a76b0SSuyog Pawar     void *pv_src;
3027*c83a76b0SSuyog Pawar 
3028*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_cu_nbr_buf;
3029*c83a76b0SSuyog Pawar 
3030*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_left_nbr_4x4;
3031*c83a76b0SSuyog Pawar 
3032*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_top_nbr_4x4;
3033*c83a76b0SSuyog Pawar 
3034*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_topleft_nbr_4x4;
3035*c83a76b0SSuyog Pawar 
3036*c83a76b0SSuyog Pawar     WORD32 i4_ctb_nbr_map_stride;
3037*c83a76b0SSuyog Pawar 
3038*c83a76b0SSuyog Pawar     WORD32 i4_src_strd;
3039*c83a76b0SSuyog Pawar 
3040*c83a76b0SSuyog Pawar     WORD32 i4_nbr_4x4_left_strd;
3041*c83a76b0SSuyog Pawar 
3042*c83a76b0SSuyog Pawar     UWORD8 u1_cu_size;
3043*c83a76b0SSuyog Pawar 
3044*c83a76b0SSuyog Pawar     UWORD8 u1_cu_pos_x;
3045*c83a76b0SSuyog Pawar 
3046*c83a76b0SSuyog Pawar     UWORD8 u1_cu_pos_y;
3047*c83a76b0SSuyog Pawar 
3048*c83a76b0SSuyog Pawar     UWORD8 u1_num_me_cands;
3049*c83a76b0SSuyog Pawar 
3050*c83a76b0SSuyog Pawar     UWORD8 u1_num_merge_cands;
3051*c83a76b0SSuyog Pawar 
3052*c83a76b0SSuyog Pawar     UWORD8 u1_max_num_mixed_mode_cands_to_select;
3053*c83a76b0SSuyog Pawar 
3054*c83a76b0SSuyog Pawar     UWORD8 u1_max_merge_candidates;
3055*c83a76b0SSuyog Pawar 
3056*c83a76b0SSuyog Pawar     UWORD8 u1_use_satd_for_merge_eval;
3057*c83a76b0SSuyog Pawar 
3058*c83a76b0SSuyog Pawar } ihevce_mixed_inter_modes_selector_prms_t;
3059*c83a76b0SSuyog Pawar 
3060*c83a76b0SSuyog Pawar typedef struct
3061*c83a76b0SSuyog Pawar {
3062*c83a76b0SSuyog Pawar     LWORD64 i8_ssd;
3063*c83a76b0SSuyog Pawar 
3064*c83a76b0SSuyog Pawar     LWORD64 i8_cost;
3065*c83a76b0SSuyog Pawar 
3066*c83a76b0SSuyog Pawar #if ENABLE_INTER_ZCU_COST
3067*c83a76b0SSuyog Pawar     LWORD64 i8_not_coded_cost;
3068*c83a76b0SSuyog Pawar #endif
3069*c83a76b0SSuyog Pawar 
3070*c83a76b0SSuyog Pawar     UWORD32 u4_sad;
3071*c83a76b0SSuyog Pawar 
3072*c83a76b0SSuyog Pawar     WORD32 i4_bits;
3073*c83a76b0SSuyog Pawar 
3074*c83a76b0SSuyog Pawar     WORD32 i4_num_bytes_used_for_ecd;
3075*c83a76b0SSuyog Pawar 
3076*c83a76b0SSuyog Pawar     WORD32 i4_zero_col;
3077*c83a76b0SSuyog Pawar 
3078*c83a76b0SSuyog Pawar     WORD32 i4_zero_row;
3079*c83a76b0SSuyog Pawar 
3080*c83a76b0SSuyog Pawar     UWORD8 u1_cbf;
3081*c83a76b0SSuyog Pawar 
3082*c83a76b0SSuyog Pawar     UWORD8 u1_reconBufId;
3083*c83a76b0SSuyog Pawar 
3084*c83a76b0SSuyog Pawar     UWORD8 u1_is_valid_node;
3085*c83a76b0SSuyog Pawar 
3086*c83a76b0SSuyog Pawar     UWORD8 u1_size;
3087*c83a76b0SSuyog Pawar 
3088*c83a76b0SSuyog Pawar     UWORD8 u1_posx;
3089*c83a76b0SSuyog Pawar 
3090*c83a76b0SSuyog Pawar     UWORD8 u1_posy;
3091*c83a76b0SSuyog Pawar } tu_node_data_t;
3092*c83a76b0SSuyog Pawar 
3093*c83a76b0SSuyog Pawar typedef struct tu_tree_node_t
3094*c83a76b0SSuyog Pawar {
3095*c83a76b0SSuyog Pawar     struct tu_tree_node_t *ps_child_node_tl;
3096*c83a76b0SSuyog Pawar 
3097*c83a76b0SSuyog Pawar     struct tu_tree_node_t *ps_child_node_tr;
3098*c83a76b0SSuyog Pawar 
3099*c83a76b0SSuyog Pawar     struct tu_tree_node_t *ps_child_node_bl;
3100*c83a76b0SSuyog Pawar 
3101*c83a76b0SSuyog Pawar     struct tu_tree_node_t *ps_child_node_br;
3102*c83a76b0SSuyog Pawar 
3103*c83a76b0SSuyog Pawar     tu_node_data_t s_luma_data;
3104*c83a76b0SSuyog Pawar 
3105*c83a76b0SSuyog Pawar     /* 2 because of the 2 subTU's when input is 422 */
3106*c83a76b0SSuyog Pawar     tu_node_data_t as_cb_data[2];
3107*c83a76b0SSuyog Pawar 
3108*c83a76b0SSuyog Pawar     tu_node_data_t as_cr_data[2];
3109*c83a76b0SSuyog Pawar 
3110*c83a76b0SSuyog Pawar     UWORD8 u1_is_valid_node;
3111*c83a76b0SSuyog Pawar 
3112*c83a76b0SSuyog Pawar } tu_tree_node_t;
3113*c83a76b0SSuyog Pawar 
3114*c83a76b0SSuyog Pawar /*****************************************************************************/
3115*c83a76b0SSuyog Pawar /* Extern Variable Declarations                                              */
3116*c83a76b0SSuyog Pawar /*****************************************************************************/
3117*c83a76b0SSuyog Pawar 
3118*c83a76b0SSuyog Pawar /*****************************************************************************/
3119*c83a76b0SSuyog Pawar /* Extern Function Declarations                                              */
3120*c83a76b0SSuyog Pawar /*****************************************************************************/
3121*c83a76b0SSuyog Pawar 
3122*c83a76b0SSuyog Pawar /*****************************************************************************/
3123*c83a76b0SSuyog Pawar /* Typedefs                                                                  */
3124*c83a76b0SSuyog Pawar /*****************************************************************************/
3125*c83a76b0SSuyog Pawar typedef LWORD64 (*pf_cu_mode_decide)(
3126*c83a76b0SSuyog Pawar     ihevce_enc_loop_ctxt_t *ps_ctxt,
3127*c83a76b0SSuyog Pawar     enc_loop_cu_prms_t *ps_cu_prms,
3128*c83a76b0SSuyog Pawar     cu_analyse_t *ps_cu_analyse,
3129*c83a76b0SSuyog Pawar     final_mode_state_t *ps_final_mode_state,
3130*c83a76b0SSuyog Pawar     UWORD8 *pu1_ecd_data,
3131*c83a76b0SSuyog Pawar     pu_col_mv_t *ps_col_pu,
3132*c83a76b0SSuyog Pawar     UWORD8 *pu1_col_pu_map,
3133*c83a76b0SSuyog Pawar     WORD32 col_start_pu_idx);
3134*c83a76b0SSuyog Pawar 
3135*c83a76b0SSuyog Pawar typedef LWORD64 (*pf_inter_rdopt_cu_mc_mvp)(
3136*c83a76b0SSuyog Pawar     ihevce_enc_loop_ctxt_t *ps_ctxt,
3137*c83a76b0SSuyog Pawar     cu_inter_cand_t *ps_inter_cand,
3138*c83a76b0SSuyog Pawar     WORD32 cu_size,
3139*c83a76b0SSuyog Pawar     WORD32 cu_pos_x,
3140*c83a76b0SSuyog Pawar     WORD32 cu_pos_y,
3141*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_left_nbr_4x4,
3142*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_top_nbr_4x4,
3143*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_topleft_nbr_4x4,
3144*c83a76b0SSuyog Pawar     WORD32 nbr_4x4_left_strd,
3145*c83a76b0SSuyog Pawar     WORD32 curr_buf_idx);
3146*c83a76b0SSuyog Pawar 
3147*c83a76b0SSuyog Pawar typedef LWORD64 (*pf_inter_rdopt_cu_ntu)(
3148*c83a76b0SSuyog Pawar     ihevce_enc_loop_ctxt_t *ps_ctxt,
3149*c83a76b0SSuyog Pawar     enc_loop_cu_prms_t *ps_cu_prms,
3150*c83a76b0SSuyog Pawar     void *pv_src,
3151*c83a76b0SSuyog Pawar     WORD32 cu_size,
3152*c83a76b0SSuyog Pawar     WORD32 cu_pos_x,
3153*c83a76b0SSuyog Pawar     WORD32 cu_pos_y,
3154*c83a76b0SSuyog Pawar     WORD32 curr_buf_idx,
3155*c83a76b0SSuyog Pawar     enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
3156*c83a76b0SSuyog Pawar     cu_inter_cand_t *ps_inter_cand,
3157*c83a76b0SSuyog Pawar     cu_analyse_t *ps_cu_analyse,
3158*c83a76b0SSuyog Pawar     WORD32 i4_alpha_stim_multiplier);
3159*c83a76b0SSuyog Pawar 
3160*c83a76b0SSuyog Pawar typedef void (*pf_intra_chroma_pred_mode_selector)(
3161*c83a76b0SSuyog Pawar     ihevce_enc_loop_ctxt_t *ps_ctxt,
3162*c83a76b0SSuyog Pawar     enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
3163*c83a76b0SSuyog Pawar     cu_analyse_t *ps_cu_analyse,
3164*c83a76b0SSuyog Pawar     WORD32 rd_opt_curr_idx,
3165*c83a76b0SSuyog Pawar     WORD32 tu_mode,
3166*c83a76b0SSuyog Pawar     WORD32 i4_alpha_stim_multiplier,
3167*c83a76b0SSuyog Pawar     UWORD8 u1_is_cu_noisy);
3168*c83a76b0SSuyog Pawar 
3169*c83a76b0SSuyog Pawar typedef LWORD64 (*pf_intra_rdopt_cu_ntu)(
3170*c83a76b0SSuyog Pawar     ihevce_enc_loop_ctxt_t *ps_ctxt,
3171*c83a76b0SSuyog Pawar     enc_loop_cu_prms_t *ps_cu_prms,
3172*c83a76b0SSuyog Pawar     void *pv_pred_org,
3173*c83a76b0SSuyog Pawar     WORD32 pred_strd_org,
3174*c83a76b0SSuyog Pawar     enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
3175*c83a76b0SSuyog Pawar     UWORD8 *pu1_luma_mode,
3176*c83a76b0SSuyog Pawar     cu_analyse_t *ps_cu_analyse,
3177*c83a76b0SSuyog Pawar     void *pv_curr_src,
3178*c83a76b0SSuyog Pawar     void *pv_cu_left,
3179*c83a76b0SSuyog Pawar     void *pv_cu_top,
3180*c83a76b0SSuyog Pawar     void *pv_cu_top_left,
3181*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_left_nbr_4x4,
3182*c83a76b0SSuyog Pawar     nbr_4x4_t *ps_top_nbr_4x4,
3183*c83a76b0SSuyog Pawar     WORD32 nbr_4x4_left_strd,
3184*c83a76b0SSuyog Pawar     WORD32 cu_left_stride,
3185*c83a76b0SSuyog Pawar     WORD32 curr_buf_idx,
3186*c83a76b0SSuyog Pawar     WORD32 func_proc_mode,
3187*c83a76b0SSuyog Pawar     WORD32 i4_alpha_stim_multiplier);
3188*c83a76b0SSuyog Pawar 
3189*c83a76b0SSuyog Pawar typedef void (*pf_final_rdopt_mode_prcs)(
3190*c83a76b0SSuyog Pawar     ihevce_enc_loop_ctxt_t *ps_ctxt, final_mode_process_prms_t *ps_prms);
3191*c83a76b0SSuyog Pawar 
3192*c83a76b0SSuyog Pawar typedef void (*pf_store_cu_results)(
3193*c83a76b0SSuyog Pawar     ihevce_enc_loop_ctxt_t *ps_ctxt,
3194*c83a76b0SSuyog Pawar     enc_loop_cu_prms_t *ps_cu_prms,
3195*c83a76b0SSuyog Pawar     final_mode_state_t *ps_final_state);
3196*c83a76b0SSuyog Pawar 
3197*c83a76b0SSuyog Pawar typedef void (*pf_enc_loop_cu_bot_copy)(
3198*c83a76b0SSuyog Pawar     ihevce_enc_loop_ctxt_t *ps_ctxt,
3199*c83a76b0SSuyog Pawar     enc_loop_cu_prms_t *ps_cu_prms,
3200*c83a76b0SSuyog Pawar     ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt,
3201*c83a76b0SSuyog Pawar     WORD32 curr_cu_pos_in_row,
3202*c83a76b0SSuyog Pawar     WORD32 curr_cu_pos_in_ctb);
3203*c83a76b0SSuyog Pawar 
3204*c83a76b0SSuyog Pawar typedef void (*pf_enc_loop_ctb_left_copy)(
3205*c83a76b0SSuyog Pawar     ihevce_enc_loop_ctxt_t *ps_ctxt, enc_loop_cu_prms_t *ps_cu_prms);
3206*c83a76b0SSuyog Pawar 
3207*c83a76b0SSuyog Pawar #endif /* _IHEVCE_ENC_LOOP_STRUCTS_H_ */
3208