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 ******************************************************************************
23*c83a76b0SSuyog Pawar * \file ihevce_enc_cu_recursion.c
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * \brief
26*c83a76b0SSuyog Pawar * This file contains Encoder normative loop pass related functions
27*c83a76b0SSuyog Pawar *
28*c83a76b0SSuyog Pawar * \date
29*c83a76b0SSuyog Pawar * 18/09/2012
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * \author
32*c83a76b0SSuyog Pawar * Ittiam
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar *
35*c83a76b0SSuyog Pawar * List of Functions
36*c83a76b0SSuyog Pawar *
37*c83a76b0SSuyog Pawar *
38*c83a76b0SSuyog Pawar ******************************************************************************
39*c83a76b0SSuyog Pawar */
40*c83a76b0SSuyog Pawar
41*c83a76b0SSuyog Pawar /*****************************************************************************/
42*c83a76b0SSuyog Pawar /* File Includes */
43*c83a76b0SSuyog Pawar /*****************************************************************************/
44*c83a76b0SSuyog Pawar /* System include files */
45*c83a76b0SSuyog Pawar #include <stdio.h>
46*c83a76b0SSuyog Pawar #include <string.h>
47*c83a76b0SSuyog Pawar #include <stdlib.h>
48*c83a76b0SSuyog Pawar #include <assert.h>
49*c83a76b0SSuyog Pawar #include <stdarg.h>
50*c83a76b0SSuyog Pawar #include <math.h>
51*c83a76b0SSuyog Pawar
52*c83a76b0SSuyog Pawar /* User include files */
53*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
54*c83a76b0SSuyog Pawar #include "itt_video_api.h"
55*c83a76b0SSuyog Pawar #include "ihevce_api.h"
56*c83a76b0SSuyog Pawar
57*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
58*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
59*c83a76b0SSuyog Pawar #include "rc_look_ahead_params.h"
60*c83a76b0SSuyog Pawar
61*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
62*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
63*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
64*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
65*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
66*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
67*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
68*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
69*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
70*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
71*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
72*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
73*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
74*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
75*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
76*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
77*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
78*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
79*c83a76b0SSuyog Pawar
80*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
81*c83a76b0SSuyog Pawar #include "ihevce_hle_interface.h"
82*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
83*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
84*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_funcs.h"
85*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
86*c83a76b0SSuyog Pawar #include "ihevce_had_satd.h"
87*c83a76b0SSuyog Pawar #include "ihevce_error_codes.h"
88*c83a76b0SSuyog Pawar #include "ihevce_bitstream.h"
89*c83a76b0SSuyog Pawar #include "ihevce_cabac.h"
90*c83a76b0SSuyog Pawar #include "ihevce_rdoq_macros.h"
91*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
92*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
93*c83a76b0SSuyog Pawar #include "ihevce_entropy_structs.h"
94*c83a76b0SSuyog Pawar #include "ihevce_cmn_utils_instr_set_router.h"
95*c83a76b0SSuyog Pawar #include "ihevce_ipe_instr_set_router.h"
96*c83a76b0SSuyog Pawar #include "ihevce_decomp_pre_intra_structs.h"
97*c83a76b0SSuyog Pawar #include "ihevce_decomp_pre_intra_pass.h"
98*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_structs.h"
99*c83a76b0SSuyog Pawar #include "ihevce_global_tables.h"
100*c83a76b0SSuyog Pawar #include "ihevce_nbr_avail.h"
101*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_utils.h"
102*c83a76b0SSuyog Pawar #include "ihevce_bs_compute_ctb.h"
103*c83a76b0SSuyog Pawar #include "ihevce_cabac_rdo.h"
104*c83a76b0SSuyog Pawar #include "ihevce_dep_mngr_interface.h"
105*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_pass.h"
106*c83a76b0SSuyog Pawar #include "ihevce_rc_enc_structs.h"
107*c83a76b0SSuyog Pawar #include "ihevce_enc_cu_recursion.h"
108*c83a76b0SSuyog Pawar #include "ihevce_stasino_helpers.h"
109*c83a76b0SSuyog Pawar
110*c83a76b0SSuyog Pawar #include "cast_types.h"
111*c83a76b0SSuyog Pawar #include "osal.h"
112*c83a76b0SSuyog Pawar #include "osal_defaults.h"
113*c83a76b0SSuyog Pawar
114*c83a76b0SSuyog Pawar /*****************************************************************************/
115*c83a76b0SSuyog Pawar /* Macros */
116*c83a76b0SSuyog Pawar /*****************************************************************************/
117*c83a76b0SSuyog Pawar #define NUM_CTB_QUANT_ROUNDING 6
118*c83a76b0SSuyog Pawar
119*c83a76b0SSuyog Pawar /*****************************************************************************/
120*c83a76b0SSuyog Pawar /* Function Definitions */
121*c83a76b0SSuyog Pawar /*****************************************************************************/
122*c83a76b0SSuyog Pawar
123*c83a76b0SSuyog Pawar /**
124*c83a76b0SSuyog Pawar *********************************************************************************
125*c83a76b0SSuyog Pawar * Function name : ihevce_store_cu_final
126*c83a76b0SSuyog Pawar *
127*c83a76b0SSuyog Pawar * \brief
128*c83a76b0SSuyog Pawar * This function store cu info to the enc loop cu context
129*c83a76b0SSuyog Pawar *
130*c83a76b0SSuyog Pawar * \param[in] ps_ctxt : pointer to enc loop context structure
131*c83a76b0SSuyog Pawar * \param[in] ps_cu_final : pointer to enc loop output CU structure
132*c83a76b0SSuyog Pawar * \param[in] pu1_ecd_data : ecd data pointer
133*c83a76b0SSuyog Pawar * \param[in] ps_enc_out_ctxt : pointer to CU information structure
134*c83a76b0SSuyog Pawar * \param[in] ps_cu_prms : pointer to cu level parameters for SATD / RDOPT
135*c83a76b0SSuyog Pawar *
136*c83a76b0SSuyog Pawar * \return
137*c83a76b0SSuyog Pawar * None
138*c83a76b0SSuyog Pawar *
139*c83a76b0SSuyog Pawar **********************************************************************************/
ihevce_store_cu_final(ihevce_enc_loop_ctxt_t * ps_ctxt,cu_enc_loop_out_t * ps_cu_final,UWORD8 * pu1_ecd_data,ihevce_enc_cu_node_ctxt_t * ps_enc_out_ctxt,enc_loop_cu_prms_t * ps_cu_prms)140*c83a76b0SSuyog Pawar void ihevce_store_cu_final(
141*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt,
142*c83a76b0SSuyog Pawar cu_enc_loop_out_t *ps_cu_final,
143*c83a76b0SSuyog Pawar UWORD8 *pu1_ecd_data,
144*c83a76b0SSuyog Pawar ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt,
145*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms)
146*c83a76b0SSuyog Pawar {
147*c83a76b0SSuyog Pawar enc_loop_cu_final_prms_t *ps_enc_loop_bestprms;
148*c83a76b0SSuyog Pawar WORD32 i4_8x8_blks_in_cu;
149*c83a76b0SSuyog Pawar WORD32 i4_br_id, i4_enc_frm_id;
150*c83a76b0SSuyog Pawar
151*c83a76b0SSuyog Pawar WORD32 u4_tex_bits, u4_hdr_bits;
152*c83a76b0SSuyog Pawar WORD32 i4_qscale, i4_qscale_ctb;
153*c83a76b0SSuyog Pawar ps_enc_loop_bestprms = ps_enc_out_ctxt->ps_cu_prms;
154*c83a76b0SSuyog Pawar i4_qscale = ((ps_ctxt->ps_rc_quant_ctxt->pi4_qp_to_qscale
155*c83a76b0SSuyog Pawar [ps_enc_out_ctxt->i1_cu_qp + ps_ctxt->ps_rc_quant_ctxt->i1_qp_offset]));
156*c83a76b0SSuyog Pawar i4_qscale_ctb = ((
157*c83a76b0SSuyog Pawar ps_ctxt->ps_rc_quant_ctxt
158*c83a76b0SSuyog Pawar ->pi4_qp_to_qscale[ps_ctxt->i4_frame_mod_qp + ps_ctxt->ps_rc_quant_ctxt->i1_qp_offset]));
159*c83a76b0SSuyog Pawar
160*c83a76b0SSuyog Pawar /* All texture bits accumulated */
161*c83a76b0SSuyog Pawar u4_tex_bits = ps_enc_loop_bestprms->u4_cu_luma_res_bits +
162*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->u4_cu_chroma_res_bits +
163*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->u4_cu_cbf_bits;
164*c83a76b0SSuyog Pawar
165*c83a76b0SSuyog Pawar u4_hdr_bits = ps_enc_loop_bestprms->u4_cu_hdr_bits;
166*c83a76b0SSuyog Pawar
167*c83a76b0SSuyog Pawar i4_br_id = ps_ctxt->i4_bitrate_instance_num;
168*c83a76b0SSuyog Pawar i4_enc_frm_id = ps_ctxt->i4_enc_frm_id;
169*c83a76b0SSuyog Pawar
170*c83a76b0SSuyog Pawar i4_8x8_blks_in_cu = ((ps_enc_out_ctxt->u1_cu_size >> 3) * (ps_enc_out_ctxt->u1_cu_size >> 3));
171*c83a76b0SSuyog Pawar
172*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]->i8_frame_open_loop_ssd +=
173*c83a76b0SSuyog Pawar ps_enc_loop_bestprms
174*c83a76b0SSuyog Pawar ->i8_cu_ssd; // + (((float)(ps_ctxt->i8_cl_ssd_lambda_qf/ (1<< LAMBDA_Q_SHIFT))) * ps_enc_loop_bestprms->u4_cu_hdr_bits);
175*c83a76b0SSuyog Pawar
176*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]->u4_frame_open_loop_intra_sad +=
177*c83a76b0SSuyog Pawar (UWORD32)(
178*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->u4_cu_open_intra_sad +
179*c83a76b0SSuyog Pawar (((float)(ps_ctxt->i4_sad_lamda) / (1 << LAMBDA_Q_SHIFT)) *
180*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->u4_cu_hdr_bits));
181*c83a76b0SSuyog Pawar
182*c83a76b0SSuyog Pawar if(1 == ps_enc_loop_bestprms->u1_intra_flag)
183*c83a76b0SSuyog Pawar {
184*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]->u4_frame_intra_sad_acc +=
185*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->u4_cu_sad;
186*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]->i8_frame_intra_cost_acc +=
187*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->i8_best_rdopt_cost;
188*c83a76b0SSuyog Pawar }
189*c83a76b0SSuyog Pawar else
190*c83a76b0SSuyog Pawar {
191*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]->u4_frame_inter_sad_acc +=
192*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->u4_cu_sad;
193*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]->i8_frame_inter_cost_acc +=
194*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->i8_best_rdopt_cost;
195*c83a76b0SSuyog Pawar }
196*c83a76b0SSuyog Pawar /*accumulating the frame level stats across frame*/
197*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]->u4_frame_sad_acc +=
198*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->u4_cu_sad;
199*c83a76b0SSuyog Pawar
200*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]->i8_frame_cost_acc +=
201*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->i8_best_rdopt_cost;
202*c83a76b0SSuyog Pawar
203*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]->u4_frame_rdopt_bits +=
204*c83a76b0SSuyog Pawar (u4_tex_bits + u4_hdr_bits);
205*c83a76b0SSuyog Pawar
206*c83a76b0SSuyog Pawar /*Total bits and header bits accumalted here for CTB*/
207*c83a76b0SSuyog Pawar ps_ctxt->u4_total_cu_bits += (u4_tex_bits + u4_hdr_bits);
208*c83a76b0SSuyog Pawar ps_ctxt->u4_total_cu_bits_mul_qs +=
209*c83a76b0SSuyog Pawar ((ULWORD64)((u4_tex_bits + u4_hdr_bits) * (i4_qscale_ctb)) + (1 << (QSCALE_Q_FAC_3 - 1))) >>
210*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3;
211*c83a76b0SSuyog Pawar ps_ctxt->u4_total_cu_hdr_bits += u4_hdr_bits;
212*c83a76b0SSuyog Pawar ps_ctxt->u4_cu_tot_bits_into_qscale +=
213*c83a76b0SSuyog Pawar ((ULWORD64)((u4_tex_bits + u4_hdr_bits) * (i4_qscale)) + (1 << (QSCALE_Q_FAC_3 - 1))) >>
214*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3;
215*c83a76b0SSuyog Pawar ps_ctxt->u4_cu_tot_bits += (u4_tex_bits + u4_hdr_bits);
216*c83a76b0SSuyog Pawar
217*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]->u4_frame_rdopt_header_bits +=
218*c83a76b0SSuyog Pawar u4_hdr_bits;
219*c83a76b0SSuyog Pawar
220*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]
221*c83a76b0SSuyog Pawar ->i8_sad_by_qscale[ps_enc_loop_bestprms->u1_intra_flag] +=
222*c83a76b0SSuyog Pawar ((((LWORD64)ps_enc_loop_bestprms->u4_cu_sad) << SAD_BY_QSCALE_Q) / i4_qscale);
223*c83a76b0SSuyog Pawar
224*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]
225*c83a76b0SSuyog Pawar ->i4_qp_normalized_8x8_cu_sum[ps_enc_loop_bestprms->u1_intra_flag] +=
226*c83a76b0SSuyog Pawar (i4_8x8_blks_in_cu * i4_qscale);
227*c83a76b0SSuyog Pawar
228*c83a76b0SSuyog Pawar ps_ctxt->aaps_enc_loop_rc_params[i4_enc_frm_id][i4_br_id]
229*c83a76b0SSuyog Pawar ->i4_8x8_cu_sum[ps_enc_loop_bestprms->u1_intra_flag] += i4_8x8_blks_in_cu;
230*c83a76b0SSuyog Pawar
231*c83a76b0SSuyog Pawar /* PCM not supported */
232*c83a76b0SSuyog Pawar ps_cu_final->b1_pcm_flag = 0;
233*c83a76b0SSuyog Pawar ps_cu_final->b1_pred_mode_flag = ps_enc_loop_bestprms->u1_intra_flag;
234*c83a76b0SSuyog Pawar
235*c83a76b0SSuyog Pawar ps_cu_final->b1_skip_flag = ps_enc_loop_bestprms->u1_skip_flag;
236*c83a76b0SSuyog Pawar ps_cu_final->b1_tq_bypass_flag = 0;
237*c83a76b0SSuyog Pawar ps_cu_final->b3_part_mode = ps_enc_loop_bestprms->u1_part_mode;
238*c83a76b0SSuyog Pawar
239*c83a76b0SSuyog Pawar ps_cu_final->pv_coeff = pu1_ecd_data;
240*c83a76b0SSuyog Pawar
241*c83a76b0SSuyog Pawar ps_cu_final->i1_cu_qp = ps_enc_out_ctxt->i1_cu_qp;
242*c83a76b0SSuyog Pawar if(ps_enc_loop_bestprms->u1_is_cu_coded)
243*c83a76b0SSuyog Pawar {
244*c83a76b0SSuyog Pawar ps_ctxt->i4_last_cu_qp_from_prev_ctb = ps_enc_out_ctxt->i1_cu_qp;
245*c83a76b0SSuyog Pawar }
246*c83a76b0SSuyog Pawar else
247*c83a76b0SSuyog Pawar {
248*c83a76b0SSuyog Pawar ps_ctxt->i4_last_cu_qp_from_prev_ctb = ps_ctxt->i4_pred_qp;
249*c83a76b0SSuyog Pawar }
250*c83a76b0SSuyog Pawar ps_cu_final->b1_first_cu_in_qg = ps_enc_out_ctxt->b1_first_cu_in_qg;
251*c83a76b0SSuyog Pawar
252*c83a76b0SSuyog Pawar /* Update the no residue flag. Needed for inter cu. */
253*c83a76b0SSuyog Pawar /* Needed for deblocking inter/intra both */
254*c83a76b0SSuyog Pawar //if(ps_cu_final->b1_pred_mode_flag == PRED_MODE_INTER)
255*c83a76b0SSuyog Pawar {
256*c83a76b0SSuyog Pawar ps_cu_final->b1_no_residual_syntax_flag = !ps_enc_loop_bestprms->u1_is_cu_coded;
257*c83a76b0SSuyog Pawar }
258*c83a76b0SSuyog Pawar
259*c83a76b0SSuyog Pawar /* store the number of TUs */
260*c83a76b0SSuyog Pawar ps_cu_final->u2_num_tus_in_cu = ps_enc_loop_bestprms->u2_num_tus_in_cu;
261*c83a76b0SSuyog Pawar
262*c83a76b0SSuyog Pawar /* ---- copy the TUs to final structure ----- */
263*c83a76b0SSuyog Pawar memcpy(
264*c83a76b0SSuyog Pawar ps_cu_final->ps_enc_tu,
265*c83a76b0SSuyog Pawar &ps_enc_loop_bestprms->as_tu_enc_loop[0],
266*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->u2_num_tus_in_cu * sizeof(tu_enc_loop_out_t));
267*c83a76b0SSuyog Pawar
268*c83a76b0SSuyog Pawar /* ---- copy the PUs to final structure ----- */
269*c83a76b0SSuyog Pawar memcpy(
270*c83a76b0SSuyog Pawar ps_cu_final->ps_pu,
271*c83a76b0SSuyog Pawar &ps_enc_loop_bestprms->as_pu_enc_loop[0],
272*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->u2_num_pus_in_cu * sizeof(pu_t));
273*c83a76b0SSuyog Pawar
274*c83a76b0SSuyog Pawar /* --- copy reminder and prev_flags ----- */
275*c83a76b0SSuyog Pawar /* only required for intra */
276*c83a76b0SSuyog Pawar if(PRED_MODE_INTRA == ps_cu_final->b1_pred_mode_flag)
277*c83a76b0SSuyog Pawar {
278*c83a76b0SSuyog Pawar memcpy(
279*c83a76b0SSuyog Pawar &ps_cu_final->as_prev_rem[0],
280*c83a76b0SSuyog Pawar &ps_enc_loop_bestprms->as_intra_prev_rem[0],
281*c83a76b0SSuyog Pawar ps_enc_loop_bestprms->u2_num_tus_in_cu * sizeof(intra_prev_rem_flags_t));
282*c83a76b0SSuyog Pawar
283*c83a76b0SSuyog Pawar ps_cu_final->b3_chroma_intra_pred_mode = ps_enc_loop_bestprms->u1_chroma_intra_pred_mode;
284*c83a76b0SSuyog Pawar }
285*c83a76b0SSuyog Pawar
286*c83a76b0SSuyog Pawar /* --------------------------------------------------- */
287*c83a76b0SSuyog Pawar /* ---- Boundary Strength Calculation at CU level ---- */
288*c83a76b0SSuyog Pawar /* --------------------------------------------------- */
289*c83a76b0SSuyog Pawar if(ps_ctxt->i4_deblk_pad_hpel_cur_pic)
290*c83a76b0SSuyog Pawar {
291*c83a76b0SSuyog Pawar WORD32 num_4x4_in_ctb;
292*c83a76b0SSuyog Pawar nbr_4x4_t *ps_left_nbr_4x4;
293*c83a76b0SSuyog Pawar nbr_4x4_t *ps_top_nbr_4x4;
294*c83a76b0SSuyog Pawar nbr_4x4_t *ps_curr_nbr_4x4;
295*c83a76b0SSuyog Pawar WORD32 nbr_4x4_left_strd;
296*c83a76b0SSuyog Pawar
297*c83a76b0SSuyog Pawar num_4x4_in_ctb = (ps_cu_prms->i4_ctb_size >> 2);
298*c83a76b0SSuyog Pawar
299*c83a76b0SSuyog Pawar ps_curr_nbr_4x4 = &ps_ctxt->as_ctb_nbr_arr[0];
300*c83a76b0SSuyog Pawar ps_curr_nbr_4x4 += (ps_enc_out_ctxt->b3_cu_pos_x << 1);
301*c83a76b0SSuyog Pawar ps_curr_nbr_4x4 += ((ps_enc_out_ctxt->b3_cu_pos_y << 1) * num_4x4_in_ctb);
302*c83a76b0SSuyog Pawar
303*c83a76b0SSuyog Pawar /* CU left */
304*c83a76b0SSuyog Pawar if(0 == ps_enc_out_ctxt->b3_cu_pos_x)
305*c83a76b0SSuyog Pawar {
306*c83a76b0SSuyog Pawar ps_left_nbr_4x4 = &ps_ctxt->as_left_col_nbr[0];
307*c83a76b0SSuyog Pawar ps_left_nbr_4x4 += ps_enc_out_ctxt->b3_cu_pos_y << 1;
308*c83a76b0SSuyog Pawar nbr_4x4_left_strd = 1;
309*c83a76b0SSuyog Pawar }
310*c83a76b0SSuyog Pawar else
311*c83a76b0SSuyog Pawar {
312*c83a76b0SSuyog Pawar /* inside CTB */
313*c83a76b0SSuyog Pawar ps_left_nbr_4x4 = ps_curr_nbr_4x4 - 1;
314*c83a76b0SSuyog Pawar nbr_4x4_left_strd = num_4x4_in_ctb;
315*c83a76b0SSuyog Pawar }
316*c83a76b0SSuyog Pawar
317*c83a76b0SSuyog Pawar /* CU top */
318*c83a76b0SSuyog Pawar if(0 == ps_enc_out_ctxt->b3_cu_pos_y)
319*c83a76b0SSuyog Pawar {
320*c83a76b0SSuyog Pawar /* CTB boundary */
321*c83a76b0SSuyog Pawar ps_top_nbr_4x4 = ps_ctxt->ps_top_row_nbr;
322*c83a76b0SSuyog Pawar ps_top_nbr_4x4 += (ps_cu_prms->i4_ctb_pos * (ps_cu_prms->i4_ctb_size >> 2));
323*c83a76b0SSuyog Pawar ps_top_nbr_4x4 += (ps_enc_out_ctxt->b3_cu_pos_x << 1);
324*c83a76b0SSuyog Pawar }
325*c83a76b0SSuyog Pawar else
326*c83a76b0SSuyog Pawar {
327*c83a76b0SSuyog Pawar /* inside CTB */
328*c83a76b0SSuyog Pawar ps_top_nbr_4x4 = ps_curr_nbr_4x4 - num_4x4_in_ctb;
329*c83a76b0SSuyog Pawar }
330*c83a76b0SSuyog Pawar
331*c83a76b0SSuyog Pawar ihevce_bs_compute_cu(
332*c83a76b0SSuyog Pawar ps_cu_final,
333*c83a76b0SSuyog Pawar ps_top_nbr_4x4,
334*c83a76b0SSuyog Pawar ps_left_nbr_4x4,
335*c83a76b0SSuyog Pawar ps_curr_nbr_4x4,
336*c83a76b0SSuyog Pawar nbr_4x4_left_strd,
337*c83a76b0SSuyog Pawar num_4x4_in_ctb,
338*c83a76b0SSuyog Pawar &ps_ctxt->s_deblk_bs_prms);
339*c83a76b0SSuyog Pawar }
340*c83a76b0SSuyog Pawar }
341*c83a76b0SSuyog Pawar
342*c83a76b0SSuyog Pawar /**
343*c83a76b0SSuyog Pawar *********************************************************************************
344*c83a76b0SSuyog Pawar * Function name : ihevce_store_cu_results
345*c83a76b0SSuyog Pawar *
346*c83a76b0SSuyog Pawar * \brief
347*c83a76b0SSuyog Pawar * This function store cu result to cu info context
348*c83a76b0SSuyog Pawar *
349*c83a76b0SSuyog Pawar * \param[in] ps_ctxt : pointer to enc loop context structure
350*c83a76b0SSuyog Pawar * \param[out] ps_cu_prms : pointer to cu level parameters for SATD / RDOPT
351*c83a76b0SSuyog Pawar *
352*c83a76b0SSuyog Pawar * \return
353*c83a76b0SSuyog Pawar * None
354*c83a76b0SSuyog Pawar *
355*c83a76b0SSuyog Pawar **********************************************************************************/
ihevce_store_cu_results(ihevce_enc_loop_ctxt_t * ps_ctxt,enc_loop_cu_prms_t * ps_cu_prms,final_mode_state_t * ps_final_state)356*c83a76b0SSuyog Pawar void ihevce_store_cu_results(
357*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt,
358*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms,
359*c83a76b0SSuyog Pawar final_mode_state_t *ps_final_state)
360*c83a76b0SSuyog Pawar {
361*c83a76b0SSuyog Pawar ihevce_enc_cu_node_ctxt_t *ps_enc_tmp_out_ctxt;
362*c83a76b0SSuyog Pawar nbr_4x4_t *ps_nbr_4x4, *ps_tmp_nbr_4x4, *ps_curr_nbr_4x4;
363*c83a76b0SSuyog Pawar
364*c83a76b0SSuyog Pawar UWORD8 *pu1_recon, *pu1_final_recon;
365*c83a76b0SSuyog Pawar WORD32 num_4x4_in_ctb, ctr;
366*c83a76b0SSuyog Pawar WORD32 num_4x4_in_cu;
367*c83a76b0SSuyog Pawar UWORD8 u1_is_422 = (ps_ctxt->u1_chroma_array_type == 2);
368*c83a76b0SSuyog Pawar WORD32 cu_depth, log2_ctb_size, log2_cu_size;
369*c83a76b0SSuyog Pawar
370*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt = ps_ctxt->ps_enc_out_ctxt;
371*c83a76b0SSuyog Pawar (void)ps_final_state;
372*c83a76b0SSuyog Pawar #if PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS
373*c83a76b0SSuyog Pawar {
374*c83a76b0SSuyog Pawar /* ---- copy the child luma recon back to curr. recon -------- */
375*c83a76b0SSuyog Pawar pu1_recon = (UWORD8 *)ps_ctxt->pv_cu_luma_recon;
376*c83a76b0SSuyog Pawar
377*c83a76b0SSuyog Pawar /* based on CU position derive the luma pointers */
378*c83a76b0SSuyog Pawar pu1_final_recon = ps_cu_prms->pu1_luma_recon + (ps_enc_tmp_out_ctxt->b3_cu_pos_x << 3);
379*c83a76b0SSuyog Pawar
380*c83a76b0SSuyog Pawar pu1_final_recon +=
381*c83a76b0SSuyog Pawar ((ps_enc_tmp_out_ctxt->b3_cu_pos_y << 3) * ps_cu_prms->i4_luma_recon_stride);
382*c83a76b0SSuyog Pawar
383*c83a76b0SSuyog Pawar ps_ctxt->s_cmn_opt_func.pf_copy_2d(
384*c83a76b0SSuyog Pawar pu1_final_recon,
385*c83a76b0SSuyog Pawar ps_cu_prms->i4_luma_recon_stride,
386*c83a76b0SSuyog Pawar pu1_recon,
387*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->u1_cu_size,
388*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->u1_cu_size,
389*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->u1_cu_size);
390*c83a76b0SSuyog Pawar
391*c83a76b0SSuyog Pawar /* ---- copy the child chroma recon back to curr. recon -------- */
392*c83a76b0SSuyog Pawar pu1_recon = (UWORD8 *)ps_ctxt->pv_cu_chrma_recon;
393*c83a76b0SSuyog Pawar
394*c83a76b0SSuyog Pawar /* based on CU position derive the chroma pointers */
395*c83a76b0SSuyog Pawar pu1_final_recon = ps_cu_prms->pu1_chrm_recon + (ps_enc_tmp_out_ctxt->b3_cu_pos_x << 3);
396*c83a76b0SSuyog Pawar
397*c83a76b0SSuyog Pawar pu1_final_recon +=
398*c83a76b0SSuyog Pawar ((ps_enc_tmp_out_ctxt->b3_cu_pos_y << (u1_is_422 + 2)) *
399*c83a76b0SSuyog Pawar ps_cu_prms->i4_chrm_recon_stride);
400*c83a76b0SSuyog Pawar
401*c83a76b0SSuyog Pawar /* Cb and Cr pixel interleaved */
402*c83a76b0SSuyog Pawar ps_ctxt->s_cmn_opt_func.pf_copy_2d(
403*c83a76b0SSuyog Pawar pu1_final_recon,
404*c83a76b0SSuyog Pawar ps_cu_prms->i4_chrm_recon_stride,
405*c83a76b0SSuyog Pawar pu1_recon,
406*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->u1_cu_size,
407*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->u1_cu_size,
408*c83a76b0SSuyog Pawar (ps_enc_tmp_out_ctxt->u1_cu_size >> (0 == u1_is_422)));
409*c83a76b0SSuyog Pawar }
410*c83a76b0SSuyog Pawar #else
411*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset < IHEVCE_QUALITY_P2)
412*c83a76b0SSuyog Pawar {
413*c83a76b0SSuyog Pawar /* ---- copy the child luma recon back to curr. recon -------- */
414*c83a76b0SSuyog Pawar pu1_recon = (UWORD8 *)ps_ctxt->pv_cu_luma_recon;
415*c83a76b0SSuyog Pawar
416*c83a76b0SSuyog Pawar /* based on CU position derive the luma pointers */
417*c83a76b0SSuyog Pawar pu1_final_recon = ps_cu_prms->pu1_luma_recon + (ps_enc_tmp_out_ctxt->b3_cu_pos_x << 3);
418*c83a76b0SSuyog Pawar
419*c83a76b0SSuyog Pawar pu1_final_recon +=
420*c83a76b0SSuyog Pawar ((ps_enc_tmp_out_ctxt->b3_cu_pos_y << 3) * ps_cu_prms->i4_luma_recon_stride);
421*c83a76b0SSuyog Pawar
422*c83a76b0SSuyog Pawar ps_ctxt->s_cmn_opt_func.pf_copy_2d(
423*c83a76b0SSuyog Pawar pu1_final_recon,
424*c83a76b0SSuyog Pawar ps_cu_prms->i4_luma_recon_stride,
425*c83a76b0SSuyog Pawar pu1_recon,
426*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->u1_cu_size,
427*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->u1_cu_size,
428*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->u1_cu_size);
429*c83a76b0SSuyog Pawar
430*c83a76b0SSuyog Pawar /* ---- copy the child chroma recon back to curr. recon -------- */
431*c83a76b0SSuyog Pawar pu1_recon = (UWORD8 *)ps_ctxt->pv_cu_chrma_recon;
432*c83a76b0SSuyog Pawar
433*c83a76b0SSuyog Pawar /* based on CU position derive the chroma pointers */
434*c83a76b0SSuyog Pawar pu1_final_recon = ps_cu_prms->pu1_chrm_recon + (ps_enc_tmp_out_ctxt->b3_cu_pos_x << 3);
435*c83a76b0SSuyog Pawar
436*c83a76b0SSuyog Pawar pu1_final_recon +=
437*c83a76b0SSuyog Pawar ((ps_enc_tmp_out_ctxt->b3_cu_pos_y << (u1_is_422 + 2)) *
438*c83a76b0SSuyog Pawar ps_cu_prms->i4_chrm_recon_stride);
439*c83a76b0SSuyog Pawar
440*c83a76b0SSuyog Pawar ps_ctxt->s_cmn_opt_func.pf_copy_2d(
441*c83a76b0SSuyog Pawar pu1_final_recon,
442*c83a76b0SSuyog Pawar ps_cu_prms->i4_chrm_recon_stride,
443*c83a76b0SSuyog Pawar pu1_recon,
444*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->u1_cu_size,
445*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->u1_cu_size,
446*c83a76b0SSuyog Pawar (ps_enc_tmp_out_ctxt->u1_cu_size >> (0 == u1_is_422)));
447*c83a76b0SSuyog Pawar }
448*c83a76b0SSuyog Pawar #endif
449*c83a76b0SSuyog Pawar /*copy qp for qg*/
450*c83a76b0SSuyog Pawar {
451*c83a76b0SSuyog Pawar WORD32 i4_num_8x8, i4_x, i4_y;
452*c83a76b0SSuyog Pawar WORD32 i4_cu_pos_x, i4_cu_pox_y;
453*c83a76b0SSuyog Pawar i4_num_8x8 = ps_enc_tmp_out_ctxt->u1_cu_size >> 3;
454*c83a76b0SSuyog Pawar i4_cu_pos_x = ps_enc_tmp_out_ctxt->b3_cu_pos_x;
455*c83a76b0SSuyog Pawar i4_cu_pox_y = ps_enc_tmp_out_ctxt->b3_cu_pos_y;
456*c83a76b0SSuyog Pawar for(i4_y = 0; i4_y < i4_num_8x8; i4_y++)
457*c83a76b0SSuyog Pawar {
458*c83a76b0SSuyog Pawar for(i4_x = 0; i4_x < i4_num_8x8; i4_x++)
459*c83a76b0SSuyog Pawar {
460*c83a76b0SSuyog Pawar if(ps_enc_tmp_out_ctxt->ps_cu_prms->u1_is_cu_coded)
461*c83a76b0SSuyog Pawar {
462*c83a76b0SSuyog Pawar ps_ctxt->ai4_qp_qg[((i4_cu_pox_y + i4_y) * 8) + (i4_cu_pos_x + i4_x)] =
463*c83a76b0SSuyog Pawar ps_ctxt->i4_cu_qp;
464*c83a76b0SSuyog Pawar }
465*c83a76b0SSuyog Pawar else
466*c83a76b0SSuyog Pawar {
467*c83a76b0SSuyog Pawar ps_ctxt->ai4_qp_qg[((i4_cu_pox_y + i4_y) * 8) + (i4_cu_pos_x + i4_x)] =
468*c83a76b0SSuyog Pawar ps_ctxt->i4_pred_qp;
469*c83a76b0SSuyog Pawar }
470*c83a76b0SSuyog Pawar }
471*c83a76b0SSuyog Pawar }
472*c83a76b0SSuyog Pawar }
473*c83a76b0SSuyog Pawar
474*c83a76b0SSuyog Pawar /* ------ copy the nbr 4x4 to final output ------ */
475*c83a76b0SSuyog Pawar num_4x4_in_cu = ps_enc_tmp_out_ctxt->u1_cu_size >> 2;
476*c83a76b0SSuyog Pawar num_4x4_in_ctb = (ps_cu_prms->i4_ctb_size >> 2);
477*c83a76b0SSuyog Pawar
478*c83a76b0SSuyog Pawar ps_curr_nbr_4x4 = &ps_ctxt->as_ctb_nbr_arr[0];
479*c83a76b0SSuyog Pawar ps_curr_nbr_4x4 += (ps_enc_tmp_out_ctxt->b3_cu_pos_x << 1);
480*c83a76b0SSuyog Pawar ps_curr_nbr_4x4 += ((ps_enc_tmp_out_ctxt->b3_cu_pos_y << 1) * num_4x4_in_ctb);
481*c83a76b0SSuyog Pawar ps_tmp_nbr_4x4 = ps_curr_nbr_4x4;
482*c83a76b0SSuyog Pawar
483*c83a76b0SSuyog Pawar ps_nbr_4x4 = ps_ctxt->ps_cu_recur_nbr;
484*c83a76b0SSuyog Pawar
485*c83a76b0SSuyog Pawar GETRANGE(log2_ctb_size, ps_cu_prms->i4_ctb_size);
486*c83a76b0SSuyog Pawar GETRANGE(log2_cu_size, ps_enc_tmp_out_ctxt->u1_cu_size);
487*c83a76b0SSuyog Pawar cu_depth = log2_ctb_size - log2_cu_size;
488*c83a76b0SSuyog Pawar
489*c83a76b0SSuyog Pawar ASSERT(cu_depth <= 3);
490*c83a76b0SSuyog Pawar ASSERT(cu_depth >= 0);
491*c83a76b0SSuyog Pawar
492*c83a76b0SSuyog Pawar /*assign qp for all 4x4 nbr blocks*/
493*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_4x4_in_cu * num_4x4_in_cu; ctr++, ps_nbr_4x4++)
494*c83a76b0SSuyog Pawar {
495*c83a76b0SSuyog Pawar ps_nbr_4x4->b1_skip_flag = ps_enc_tmp_out_ctxt->s_cu_prms.u1_skip_flag;
496*c83a76b0SSuyog Pawar ps_nbr_4x4->b2_cu_depth = cu_depth;
497*c83a76b0SSuyog Pawar ps_nbr_4x4->b8_qp = ps_ctxt->i4_cu_qp;
498*c83a76b0SSuyog Pawar }
499*c83a76b0SSuyog Pawar
500*c83a76b0SSuyog Pawar ps_nbr_4x4 = ps_ctxt->ps_cu_recur_nbr;
501*c83a76b0SSuyog Pawar
502*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_4x4_in_cu; ctr++)
503*c83a76b0SSuyog Pawar {
504*c83a76b0SSuyog Pawar memcpy(ps_tmp_nbr_4x4, ps_nbr_4x4, num_4x4_in_cu * sizeof(nbr_4x4_t));
505*c83a76b0SSuyog Pawar
506*c83a76b0SSuyog Pawar ps_tmp_nbr_4x4 += num_4x4_in_ctb;
507*c83a76b0SSuyog Pawar ps_nbr_4x4 += num_4x4_in_cu;
508*c83a76b0SSuyog Pawar }
509*c83a76b0SSuyog Pawar }
510*c83a76b0SSuyog Pawar
511*c83a76b0SSuyog Pawar /**
512*c83a76b0SSuyog Pawar *********************************************************************************
513*c83a76b0SSuyog Pawar * Function name : ihevce_populate_cu_struct
514*c83a76b0SSuyog Pawar *
515*c83a76b0SSuyog Pawar * \brief
516*c83a76b0SSuyog Pawar * This function populate cu struct
517*c83a76b0SSuyog Pawar *
518*c83a76b0SSuyog Pawar * \param[in] ps_ctxt : pointer to enc loop context structure
519*c83a76b0SSuyog Pawar * \param[in] ps_cur_ipe_ctb : pointer to IPE L0 analyze structure
520*c83a76b0SSuyog Pawar * \param[in] ps_cu_tree_analyse : pointer to Structure for CU recursion
521*c83a76b0SSuyog Pawar * \param[in] ps_best_results : pointer to strcuture contain result for partition type of CU
522*c83a76b0SSuyog Pawar * \param[in] ps_cu_out : pointer to structre contain mode analysis info
523*c83a76b0SSuyog Pawar * \param[in] i4_32x32_id : noise estimation id
524*c83a76b0SSuyog Pawar * \param[in] u1_num_best_results : num best result value
525*c83a76b0SSuyog Pawar *
526*c83a76b0SSuyog Pawar * \return
527*c83a76b0SSuyog Pawar * None
528*c83a76b0SSuyog Pawar *
529*c83a76b0SSuyog Pawar **********************************************************************************/
ihevce_populate_cu_struct(ihevce_enc_loop_ctxt_t * ps_ctxt,ipe_l0_ctb_analyse_for_me_t * ps_cur_ipe_ctb,cur_ctb_cu_tree_t * ps_cu_tree_analyse,part_type_results_t * ps_best_results,cu_analyse_t * ps_cu_out,WORD32 i4_32x32_id,UWORD8 u1_is_cu_noisy,UWORD8 u1_num_best_results)530*c83a76b0SSuyog Pawar void ihevce_populate_cu_struct(
531*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt,
532*c83a76b0SSuyog Pawar ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb,
533*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_analyse,
534*c83a76b0SSuyog Pawar part_type_results_t *ps_best_results,
535*c83a76b0SSuyog Pawar cu_analyse_t *ps_cu_out,
536*c83a76b0SSuyog Pawar WORD32 i4_32x32_id,
537*c83a76b0SSuyog Pawar #if DISABLE_INTRA_WHEN_NOISY && USE_NOISE_TERM_IN_ENC_LOOP
538*c83a76b0SSuyog Pawar UWORD8 u1_is_cu_noisy,
539*c83a76b0SSuyog Pawar #endif
540*c83a76b0SSuyog Pawar UWORD8 u1_num_best_results)
541*c83a76b0SSuyog Pawar {
542*c83a76b0SSuyog Pawar cu_inter_cand_t *ps_cu_candt;
543*c83a76b0SSuyog Pawar
544*c83a76b0SSuyog Pawar WORD32 j;
545*c83a76b0SSuyog Pawar /* open loop intra cost by IPE */
546*c83a76b0SSuyog Pawar WORD32 intra_cost_ol;
547*c83a76b0SSuyog Pawar /* closed loop intra cost based on empirical coding noise estimate */
548*c83a76b0SSuyog Pawar WORD32 intra_cost_cl_est = 0;
549*c83a76b0SSuyog Pawar /* closed loop intra coding noise estimate */
550*c83a76b0SSuyog Pawar WORD32 intra_noise_cl_est;
551*c83a76b0SSuyog Pawar WORD32 num_results_to_copy = 0;
552*c83a76b0SSuyog Pawar
553*c83a76b0SSuyog Pawar WORD32 found_intra = 0;
554*c83a76b0SSuyog Pawar WORD32 quality_preset = ps_ctxt->i4_quality_preset;
555*c83a76b0SSuyog Pawar WORD32 frm_qp = ps_ctxt->i4_frame_qp;
556*c83a76b0SSuyog Pawar WORD32 frm_qstep_multiplier = gau4_frame_qstep_multiplier[frm_qp - 1];
557*c83a76b0SSuyog Pawar WORD32 frm_qstep = ps_ctxt->i4_frame_qstep;
558*c83a76b0SSuyog Pawar UWORD8 u1_cu_size = ps_cu_tree_analyse->u1_cu_size;
559*c83a76b0SSuyog Pawar UWORD8 u1_x_off = ps_cu_tree_analyse->b3_cu_pos_x << 3;
560*c83a76b0SSuyog Pawar UWORD8 u1_y_off = ps_cu_tree_analyse->b3_cu_pos_y << 3;
561*c83a76b0SSuyog Pawar UWORD8 u1_threshold_multi;
562*c83a76b0SSuyog Pawar switch(quality_preset)
563*c83a76b0SSuyog Pawar {
564*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P0:
565*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P2:
566*c83a76b0SSuyog Pawar {
567*c83a76b0SSuyog Pawar num_results_to_copy =
568*c83a76b0SSuyog Pawar MIN(MAX_NUMBER_OF_INTER_RDOPT_CANDS_IN_PQ_AND_HQ, u1_num_best_results);
569*c83a76b0SSuyog Pawar break;
570*c83a76b0SSuyog Pawar }
571*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P3:
572*c83a76b0SSuyog Pawar {
573*c83a76b0SSuyog Pawar num_results_to_copy = MIN(MAX_NUMBER_OF_INTER_RDOPT_CANDS_IN_MS, u1_num_best_results);
574*c83a76b0SSuyog Pawar break;
575*c83a76b0SSuyog Pawar }
576*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P4:
577*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P5:
578*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P6:
579*c83a76b0SSuyog Pawar {
580*c83a76b0SSuyog Pawar num_results_to_copy =
581*c83a76b0SSuyog Pawar MIN(MAX_NUMBER_OF_INTER_RDOPT_CANDS_IN_HS_AND_XS, u1_num_best_results);
582*c83a76b0SSuyog Pawar break;
583*c83a76b0SSuyog Pawar }
584*c83a76b0SSuyog Pawar }
585*c83a76b0SSuyog Pawar
586*c83a76b0SSuyog Pawar ps_cu_out->u1_num_inter_cands = 0;
587*c83a76b0SSuyog Pawar
588*c83a76b0SSuyog Pawar /***************************************************************/
589*c83a76b0SSuyog Pawar /* Depending CU size that has won in ME, */
590*c83a76b0SSuyog Pawar /* Estimate the closed loop intra cost for enabling intra */
591*c83a76b0SSuyog Pawar /* evaluation in rdopt stage based on preset */
592*c83a76b0SSuyog Pawar /***************************************************************/
593*c83a76b0SSuyog Pawar switch(u1_cu_size)
594*c83a76b0SSuyog Pawar {
595*c83a76b0SSuyog Pawar case 64:
596*c83a76b0SSuyog Pawar {
597*c83a76b0SSuyog Pawar /* coding noise estimate for intra closed loop cost */
598*c83a76b0SSuyog Pawar intra_cost_ol = ps_cur_ipe_ctb->i4_best64x64_intra_cost - frm_qstep * 256;
599*c83a76b0SSuyog Pawar
600*c83a76b0SSuyog Pawar intra_noise_cl_est = (frm_qstep * frm_qstep_multiplier) + (intra_cost_ol >> 4);
601*c83a76b0SSuyog Pawar
602*c83a76b0SSuyog Pawar intra_noise_cl_est = MIN(intra_noise_cl_est, (frm_qstep * 16)) * 16;
603*c83a76b0SSuyog Pawar
604*c83a76b0SSuyog Pawar intra_cost_cl_est = intra_cost_ol + intra_noise_cl_est;
605*c83a76b0SSuyog Pawar break;
606*c83a76b0SSuyog Pawar }
607*c83a76b0SSuyog Pawar case 32:
608*c83a76b0SSuyog Pawar {
609*c83a76b0SSuyog Pawar /* coding noise estimate for intra closed loop cost */
610*c83a76b0SSuyog Pawar intra_cost_ol = ps_cur_ipe_ctb->ai4_best32x32_intra_cost[i4_32x32_id] - frm_qstep * 64;
611*c83a76b0SSuyog Pawar
612*c83a76b0SSuyog Pawar intra_noise_cl_est = (frm_qstep * frm_qstep_multiplier) + (intra_cost_ol >> 4);
613*c83a76b0SSuyog Pawar
614*c83a76b0SSuyog Pawar intra_noise_cl_est = MIN(intra_noise_cl_est, (frm_qstep * 16)) * 4;
615*c83a76b0SSuyog Pawar
616*c83a76b0SSuyog Pawar intra_cost_cl_est = intra_cost_ol + intra_noise_cl_est;
617*c83a76b0SSuyog Pawar break;
618*c83a76b0SSuyog Pawar }
619*c83a76b0SSuyog Pawar case 16:
620*c83a76b0SSuyog Pawar {
621*c83a76b0SSuyog Pawar /* coding noise estimate for intra closed loop cost */
622*c83a76b0SSuyog Pawar intra_cost_ol =
623*c83a76b0SSuyog Pawar ps_cur_ipe_ctb->ai4_best16x16_intra_cost[(u1_x_off >> 4) + ((u1_y_off >> 4) << 2)] -
624*c83a76b0SSuyog Pawar frm_qstep * 16;
625*c83a76b0SSuyog Pawar
626*c83a76b0SSuyog Pawar intra_noise_cl_est = (frm_qstep * frm_qstep_multiplier) + (intra_cost_ol >> 4);
627*c83a76b0SSuyog Pawar
628*c83a76b0SSuyog Pawar intra_noise_cl_est = MIN(intra_noise_cl_est, (frm_qstep * 16));
629*c83a76b0SSuyog Pawar
630*c83a76b0SSuyog Pawar intra_cost_cl_est = intra_cost_ol + intra_noise_cl_est;
631*c83a76b0SSuyog Pawar break;
632*c83a76b0SSuyog Pawar }
633*c83a76b0SSuyog Pawar case 8:
634*c83a76b0SSuyog Pawar {
635*c83a76b0SSuyog Pawar /* coding noise estimate for intra closed loop cost */
636*c83a76b0SSuyog Pawar intra_cost_ol =
637*c83a76b0SSuyog Pawar ps_cur_ipe_ctb->ai4_best8x8_intra_cost[(u1_x_off >> 3) + u1_y_off] - frm_qstep * 4;
638*c83a76b0SSuyog Pawar
639*c83a76b0SSuyog Pawar intra_noise_cl_est = (frm_qstep * frm_qstep_multiplier) + (intra_cost_ol >> 4);
640*c83a76b0SSuyog Pawar
641*c83a76b0SSuyog Pawar intra_noise_cl_est = MIN(intra_noise_cl_est, (frm_qstep * 16)) >> 2;
642*c83a76b0SSuyog Pawar
643*c83a76b0SSuyog Pawar intra_cost_cl_est = intra_cost_ol + intra_noise_cl_est;
644*c83a76b0SSuyog Pawar break;
645*c83a76b0SSuyog Pawar }
646*c83a76b0SSuyog Pawar }
647*c83a76b0SSuyog Pawar #if DISABLE_INTER_CANDIDATES
648*c83a76b0SSuyog Pawar return;
649*c83a76b0SSuyog Pawar #endif
650*c83a76b0SSuyog Pawar
651*c83a76b0SSuyog Pawar u1_threshold_multi = 1;
652*c83a76b0SSuyog Pawar #if DISABLE_INTRA_WHEN_NOISY && USE_NOISE_TERM_IN_ENC_LOOP
653*c83a76b0SSuyog Pawar if(u1_is_cu_noisy)
654*c83a76b0SSuyog Pawar {
655*c83a76b0SSuyog Pawar intra_cost_cl_est = INT_MAX;
656*c83a76b0SSuyog Pawar }
657*c83a76b0SSuyog Pawar #endif
658*c83a76b0SSuyog Pawar
659*c83a76b0SSuyog Pawar ps_cu_candt = ps_cu_out->as_cu_inter_cand;
660*c83a76b0SSuyog Pawar
661*c83a76b0SSuyog Pawar /* Check if the first best candidate is inter or intra */
662*c83a76b0SSuyog Pawar if(ps_best_results[0].as_pu_results[0].pu.b1_intra_flag)
663*c83a76b0SSuyog Pawar {
664*c83a76b0SSuyog Pawar ps_cu_out->u1_best_is_intra = 1;
665*c83a76b0SSuyog Pawar }
666*c83a76b0SSuyog Pawar else
667*c83a76b0SSuyog Pawar {
668*c83a76b0SSuyog Pawar ps_cu_out->u1_best_is_intra = 0;
669*c83a76b0SSuyog Pawar }
670*c83a76b0SSuyog Pawar
671*c83a76b0SSuyog Pawar for(j = 0; j < u1_num_best_results; j++)
672*c83a76b0SSuyog Pawar {
673*c83a76b0SSuyog Pawar part_type_results_t *ps_best = &ps_best_results[j];
674*c83a76b0SSuyog Pawar
675*c83a76b0SSuyog Pawar if(ps_best->as_pu_results[0].pu.b1_intra_flag)
676*c83a76b0SSuyog Pawar {
677*c83a76b0SSuyog Pawar found_intra = 1;
678*c83a76b0SSuyog Pawar }
679*c83a76b0SSuyog Pawar else
680*c83a76b0SSuyog Pawar {
681*c83a76b0SSuyog Pawar /* populate the TU split flags, 4 flags copied as max cu can be 64 */
682*c83a76b0SSuyog Pawar memcpy(ps_cu_candt->ai4_tu_split_flag, ps_best->ai4_tu_split_flag, 4 * sizeof(WORD32));
683*c83a76b0SSuyog Pawar
684*c83a76b0SSuyog Pawar /* populate the TU early CBF flags, 4 flags copied as max cu can be 64 */
685*c83a76b0SSuyog Pawar memcpy(ps_cu_candt->ai4_tu_early_cbf, ps_best->ai4_tu_early_cbf, 4 * sizeof(WORD32));
686*c83a76b0SSuyog Pawar
687*c83a76b0SSuyog Pawar /* Note: the enums of part size and me part types shall match */
688*c83a76b0SSuyog Pawar ps_cu_candt->b3_part_size = ps_best->u1_part_type;
689*c83a76b0SSuyog Pawar
690*c83a76b0SSuyog Pawar /* ME will always set the skip flag to 0 */
691*c83a76b0SSuyog Pawar /* in closed loop skip will be added as a candidate */
692*c83a76b0SSuyog Pawar ps_cu_candt->b1_skip_flag = 0;
693*c83a76b0SSuyog Pawar
694*c83a76b0SSuyog Pawar /* copy the inter pus : Note: assuming NxN part type is not supported */
695*c83a76b0SSuyog Pawar ps_cu_candt->as_inter_pu[0] = ps_best->as_pu_results[0].pu;
696*c83a76b0SSuyog Pawar
697*c83a76b0SSuyog Pawar ps_cu_candt->as_inter_pu[0].b1_merge_flag = 0;
698*c83a76b0SSuyog Pawar
699*c83a76b0SSuyog Pawar /* Copy the total cost of the CU candt */
700*c83a76b0SSuyog Pawar ps_cu_candt->i4_total_cost = ps_best->i4_tot_cost;
701*c83a76b0SSuyog Pawar
702*c83a76b0SSuyog Pawar ps_cu_out->ai4_mv_cost[ps_cu_out->u1_num_inter_cands][0] =
703*c83a76b0SSuyog Pawar ps_best->as_pu_results[0].i4_mv_cost;
704*c83a76b0SSuyog Pawar
705*c83a76b0SSuyog Pawar #if REUSE_ME_COMPUTED_ERROR_FOR_INTER_CAND_SIFTING
706*c83a76b0SSuyog Pawar ps_cu_out->ai4_err_metric[ps_cu_out->u1_num_inter_cands][0] =
707*c83a76b0SSuyog Pawar ps_best->as_pu_results[0].i4_tot_cost - ps_best->as_pu_results[0].i4_mv_cost;
708*c83a76b0SSuyog Pawar #endif
709*c83a76b0SSuyog Pawar
710*c83a76b0SSuyog Pawar if(ps_best->u1_part_type)
711*c83a76b0SSuyog Pawar {
712*c83a76b0SSuyog Pawar ps_cu_candt->as_inter_pu[1] = ps_best->as_pu_results[1].pu;
713*c83a76b0SSuyog Pawar ps_cu_out->ai4_mv_cost[ps_cu_out->u1_num_inter_cands][1] =
714*c83a76b0SSuyog Pawar ps_best->as_pu_results[1].i4_mv_cost;
715*c83a76b0SSuyog Pawar #if REUSE_ME_COMPUTED_ERROR_FOR_INTER_CAND_SIFTING
716*c83a76b0SSuyog Pawar ps_cu_out->ai4_err_metric[ps_cu_out->u1_num_inter_cands][1] =
717*c83a76b0SSuyog Pawar ps_best->as_pu_results[1].i4_tot_cost - ps_best->as_pu_results[1].i4_mv_cost;
718*c83a76b0SSuyog Pawar #endif
719*c83a76b0SSuyog Pawar
720*c83a76b0SSuyog Pawar ps_cu_candt->as_inter_pu[1].b1_merge_flag = 0;
721*c83a76b0SSuyog Pawar }
722*c83a76b0SSuyog Pawar
723*c83a76b0SSuyog Pawar ps_cu_candt++;
724*c83a76b0SSuyog Pawar ps_cu_out->u1_num_inter_cands++;
725*c83a76b0SSuyog Pawar if(intra_cost_cl_est < ((ps_best->i4_tot_cost * u1_threshold_multi) >> 0))
726*c83a76b0SSuyog Pawar {
727*c83a76b0SSuyog Pawar /* The rationale - */
728*c83a76b0SSuyog Pawar /* Artefacts were being observed in some sequences, */
729*c83a76b0SSuyog Pawar /* Brooklyn_1080p in particular - where it was readily */
730*c83a76b0SSuyog Pawar /* apparent. The cause was coding of CU's as inter CU's */
731*c83a76b0SSuyog Pawar /* when they actually needed to be coded as intra CU's. */
732*c83a76b0SSuyog Pawar /* This was observed during either fade-outs aor flashes. */
733*c83a76b0SSuyog Pawar /* After tinkering with the magnitude of the coding noise */
734*c83a76b0SSuyog Pawar /* factor that was added to the intra cost to see when the */
735*c83a76b0SSuyog Pawar /* artefacts in Brooklyn vanished, it was observed that the */
736*c83a76b0SSuyog Pawar /* factor multiplied with the frame_qstep followed a pattern. */
737*c83a76b0SSuyog Pawar /* When the pattern was subjected to a regression analysis, the */
738*c83a76b0SSuyog Pawar /* formula seen below emerged. Also note the fact that the coding */
739*c83a76b0SSuyog Pawar /* noise factor is the product of the frame_qstep and a constant */
740*c83a76b0SSuyog Pawar /* multiplier */
741*c83a76b0SSuyog Pawar
742*c83a76b0SSuyog Pawar /*UWORD32 frm_qstep_multiplier =
743*c83a76b0SSuyog Pawar -3.346 * log((float)frm_qstep) + 15.925;*/
744*c83a76b0SSuyog Pawar found_intra = 1;
745*c83a76b0SSuyog Pawar }
746*c83a76b0SSuyog Pawar
747*c83a76b0SSuyog Pawar if(ps_cu_out->u1_num_inter_cands >= num_results_to_copy)
748*c83a76b0SSuyog Pawar {
749*c83a76b0SSuyog Pawar break;
750*c83a76b0SSuyog Pawar }
751*c83a76b0SSuyog Pawar }
752*c83a76b0SSuyog Pawar }
753*c83a76b0SSuyog Pawar
754*c83a76b0SSuyog Pawar if(quality_preset < IHEVCE_QUALITY_P4)
755*c83a76b0SSuyog Pawar {
756*c83a76b0SSuyog Pawar found_intra = 1;
757*c83a76b0SSuyog Pawar }
758*c83a76b0SSuyog Pawar
759*c83a76b0SSuyog Pawar if(!found_intra)
760*c83a76b0SSuyog Pawar {
761*c83a76b0SSuyog Pawar /* rdopt evaluation of intra disabled as inter is clear winner */
762*c83a76b0SSuyog Pawar ps_cu_out->u1_num_intra_rdopt_cands = 0;
763*c83a76b0SSuyog Pawar
764*c83a76b0SSuyog Pawar /* all the modes invalidated */
765*c83a76b0SSuyog Pawar ps_cu_out->s_cu_intra_cand.au1_intra_luma_modes_2nx2n_tu_eq_cu[0] = 255;
766*c83a76b0SSuyog Pawar ps_cu_out->s_cu_intra_cand.au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2[0] = 255;
767*c83a76b0SSuyog Pawar ps_cu_out->s_cu_intra_cand.au1_intra_luma_modes_nxn[0][0] = 255;
768*c83a76b0SSuyog Pawar ps_cu_out->u1_chroma_intra_pred_mode = 255;
769*c83a76b0SSuyog Pawar
770*c83a76b0SSuyog Pawar /* no intra candt to verify */
771*c83a76b0SSuyog Pawar ps_cu_out->s_cu_intra_cand.b6_num_intra_cands = 0;
772*c83a76b0SSuyog Pawar }
773*c83a76b0SSuyog Pawar }
774*c83a76b0SSuyog Pawar
775*c83a76b0SSuyog Pawar /**
776*c83a76b0SSuyog Pawar *********************************************************************************
777*c83a76b0SSuyog Pawar * Function name : ihevce_create_child_nodes_cu_tree
778*c83a76b0SSuyog Pawar *
779*c83a76b0SSuyog Pawar * \brief
780*c83a76b0SSuyog Pawar * This function create child node from cu tree
781*c83a76b0SSuyog Pawar *
782*c83a76b0SSuyog Pawar * \param[in] ps_cu_tree_root : pointer to Structure for CU recursion
783*c83a76b0SSuyog Pawar * \param[out] ps_cu_tree_cur_node : pointer to Structure for CU recursion
784*c83a76b0SSuyog Pawar * \param[in] ai4_child_node_enable : child node enable flag
785*c83a76b0SSuyog Pawar * \param[in] nodes_already_created : already created node value
786*c83a76b0SSuyog Pawar * \return
787*c83a76b0SSuyog Pawar * None
788*c83a76b0SSuyog Pawar *
789*c83a76b0SSuyog Pawar **********************************************************************************/
ihevce_create_child_nodes_cu_tree(cur_ctb_cu_tree_t * ps_cu_tree_root,cur_ctb_cu_tree_t * ps_cu_tree_cur_node,WORD32 * ai4_child_node_enable,WORD32 nodes_already_created)790*c83a76b0SSuyog Pawar WORD32 ihevce_create_child_nodes_cu_tree(
791*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_root,
792*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_cur_node,
793*c83a76b0SSuyog Pawar WORD32 *ai4_child_node_enable,
794*c83a76b0SSuyog Pawar WORD32 nodes_already_created)
795*c83a76b0SSuyog Pawar {
796*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_tl;
797*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_tr;
798*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_bl;
799*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_br;
800*c83a76b0SSuyog Pawar
801*c83a76b0SSuyog Pawar ps_tl = ps_cu_tree_root + nodes_already_created;
802*c83a76b0SSuyog Pawar ps_tr = ps_tl + 1;
803*c83a76b0SSuyog Pawar ps_bl = ps_tr + 1;
804*c83a76b0SSuyog Pawar ps_br = ps_bl + 1;
805*c83a76b0SSuyog Pawar
806*c83a76b0SSuyog Pawar if(1 == ps_cu_tree_cur_node->is_node_valid)
807*c83a76b0SSuyog Pawar {
808*c83a76b0SSuyog Pawar ps_tl = (ai4_child_node_enable[0]) ? ps_tl : NULL;
809*c83a76b0SSuyog Pawar ps_tr = (ai4_child_node_enable[1]) ? ps_tr : NULL;
810*c83a76b0SSuyog Pawar ps_bl = (ai4_child_node_enable[2]) ? ps_bl : NULL;
811*c83a76b0SSuyog Pawar ps_br = (ai4_child_node_enable[3]) ? ps_br : NULL;
812*c83a76b0SSuyog Pawar
813*c83a76b0SSuyog Pawar /* In incomplete CTB, if any of the child nodes are assigned to NULL */
814*c83a76b0SSuyog Pawar /* then parent node ceases to be valid */
815*c83a76b0SSuyog Pawar if((ps_tl == NULL) || (ps_tr == NULL) || (ps_br == NULL) || (ps_bl == NULL))
816*c83a76b0SSuyog Pawar {
817*c83a76b0SSuyog Pawar ps_cu_tree_cur_node->is_node_valid = 0;
818*c83a76b0SSuyog Pawar }
819*c83a76b0SSuyog Pawar }
820*c83a76b0SSuyog Pawar ps_cu_tree_cur_node->ps_child_node_tl = ps_tl;
821*c83a76b0SSuyog Pawar ps_cu_tree_cur_node->ps_child_node_tr = ps_tr;
822*c83a76b0SSuyog Pawar ps_cu_tree_cur_node->ps_child_node_bl = ps_bl;
823*c83a76b0SSuyog Pawar ps_cu_tree_cur_node->ps_child_node_br = ps_br;
824*c83a76b0SSuyog Pawar
825*c83a76b0SSuyog Pawar return 4;
826*c83a76b0SSuyog Pawar }
827*c83a76b0SSuyog Pawar
828*c83a76b0SSuyog Pawar /**
829*c83a76b0SSuyog Pawar *********************************************************************************
830*c83a76b0SSuyog Pawar * Function name : ihevce_populate_cu_tree
831*c83a76b0SSuyog Pawar *
832*c83a76b0SSuyog Pawar * \brief
833*c83a76b0SSuyog Pawar * This function create child node from cu tree
834*c83a76b0SSuyog Pawar *
835*c83a76b0SSuyog Pawar * \param[in] ps_cur_ipe_ctb : pointer to Structure for CU recursion
836*c83a76b0SSuyog Pawar * \param[out] ps_cu_tree : pointer to Structure for CU recursion
837*c83a76b0SSuyog Pawar * \param[in] tree_depth : child node enable flag
838*c83a76b0SSuyog Pawar * \param[in] e_quality_preset : already created node value
839*c83a76b0SSuyog Pawar * \param[in] e_grandparent_blk_pos : already created node value
840*c83a76b0SSuyog Pawar * \param[in] e_parent_blk_pos : already created node value
841*c83a76b0SSuyog Pawar * \param[in] e_cur_blk_pos : already created node value
842*c83a76b0SSuyog Pawar *
843*c83a76b0SSuyog Pawar * \return
844*c83a76b0SSuyog Pawar * None
845*c83a76b0SSuyog Pawar *
846*c83a76b0SSuyog Pawar **********************************************************************************/
ihevce_populate_cu_tree(ipe_l0_ctb_analyse_for_me_t * ps_cur_ipe_ctb,cur_ctb_cu_tree_t * ps_cu_tree,WORD32 tree_depth,IHEVCE_QUALITY_CONFIG_T e_quality_preset,CU_POS_T e_grandparent_blk_pos,CU_POS_T e_parent_blk_pos,CU_POS_T e_cur_blk_pos)847*c83a76b0SSuyog Pawar void ihevce_populate_cu_tree(
848*c83a76b0SSuyog Pawar ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb,
849*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree,
850*c83a76b0SSuyog Pawar WORD32 tree_depth,
851*c83a76b0SSuyog Pawar IHEVCE_QUALITY_CONFIG_T e_quality_preset,
852*c83a76b0SSuyog Pawar CU_POS_T e_grandparent_blk_pos,
853*c83a76b0SSuyog Pawar CU_POS_T e_parent_blk_pos,
854*c83a76b0SSuyog Pawar CU_POS_T e_cur_blk_pos)
855*c83a76b0SSuyog Pawar {
856*c83a76b0SSuyog Pawar WORD32 ai4_child_enable[4];
857*c83a76b0SSuyog Pawar WORD32 children_nodes_required = 0;
858*c83a76b0SSuyog Pawar WORD32 cu_pos_x = 0;
859*c83a76b0SSuyog Pawar WORD32 cu_pos_y = 0;
860*c83a76b0SSuyog Pawar WORD32 cu_size = 0;
861*c83a76b0SSuyog Pawar WORD32 i;
862*c83a76b0SSuyog Pawar WORD32 node_validity = 0;
863*c83a76b0SSuyog Pawar
864*c83a76b0SSuyog Pawar if(NULL == ps_cu_tree)
865*c83a76b0SSuyog Pawar {
866*c83a76b0SSuyog Pawar return;
867*c83a76b0SSuyog Pawar }
868*c83a76b0SSuyog Pawar
869*c83a76b0SSuyog Pawar switch(tree_depth)
870*c83a76b0SSuyog Pawar {
871*c83a76b0SSuyog Pawar case 0:
872*c83a76b0SSuyog Pawar {
873*c83a76b0SSuyog Pawar /* 64x64 block */
874*c83a76b0SSuyog Pawar intra32_analyse_t *ps_intra32_analyse = ps_cur_ipe_ctb->as_intra32_analyse;
875*c83a76b0SSuyog Pawar
876*c83a76b0SSuyog Pawar children_nodes_required = 1;
877*c83a76b0SSuyog Pawar cu_size = 64;
878*c83a76b0SSuyog Pawar cu_pos_x = 0;
879*c83a76b0SSuyog Pawar cu_pos_y = 0;
880*c83a76b0SSuyog Pawar
881*c83a76b0SSuyog Pawar node_validity = !ps_cur_ipe_ctb->u1_split_flag;
882*c83a76b0SSuyog Pawar
883*c83a76b0SSuyog Pawar if(e_quality_preset >= IHEVCE_QUALITY_P2)
884*c83a76b0SSuyog Pawar {
885*c83a76b0SSuyog Pawar if(node_validity == 1)
886*c83a76b0SSuyog Pawar {
887*c83a76b0SSuyog Pawar children_nodes_required = 0;
888*c83a76b0SSuyog Pawar }
889*c83a76b0SSuyog Pawar }
890*c83a76b0SSuyog Pawar
891*c83a76b0SSuyog Pawar for(i = 0; i < 4; i++)
892*c83a76b0SSuyog Pawar {
893*c83a76b0SSuyog Pawar ai4_child_enable[i] = ps_intra32_analyse[i].b1_valid_cu;
894*c83a76b0SSuyog Pawar }
895*c83a76b0SSuyog Pawar
896*c83a76b0SSuyog Pawar break;
897*c83a76b0SSuyog Pawar }
898*c83a76b0SSuyog Pawar case 1:
899*c83a76b0SSuyog Pawar {
900*c83a76b0SSuyog Pawar /* 32x32 block */
901*c83a76b0SSuyog Pawar WORD32 valid_flag_32 = (ps_cur_ipe_ctb->as_intra32_analyse[e_cur_blk_pos].b1_valid_cu);
902*c83a76b0SSuyog Pawar
903*c83a76b0SSuyog Pawar intra16_analyse_t *ps_intra16_analyse =
904*c83a76b0SSuyog Pawar ps_cur_ipe_ctb->as_intra32_analyse[e_cur_blk_pos].as_intra16_analyse;
905*c83a76b0SSuyog Pawar
906*c83a76b0SSuyog Pawar cu_size = 32;
907*c83a76b0SSuyog Pawar
908*c83a76b0SSuyog Pawar /* Explanation for logic below - */
909*c83a76b0SSuyog Pawar /* * pos_x and pos_y are in units of 8x8 CU's */
910*c83a76b0SSuyog Pawar /* * pos_x = 0 for TL and BL children */
911*c83a76b0SSuyog Pawar /* * pos_x = 4 for TR and BR children */
912*c83a76b0SSuyog Pawar /* * pos_y = 0 for TL and TR children */
913*c83a76b0SSuyog Pawar /* * pos_y = 4 for BL and BR children */
914*c83a76b0SSuyog Pawar cu_pos_x = (e_cur_blk_pos & 1) << 2;
915*c83a76b0SSuyog Pawar cu_pos_y = (e_cur_blk_pos & 2) << 1;
916*c83a76b0SSuyog Pawar
917*c83a76b0SSuyog Pawar {
918*c83a76b0SSuyog Pawar node_validity = (ps_cur_ipe_ctb->as_intra32_analyse[e_cur_blk_pos].b1_merge_flag);
919*c83a76b0SSuyog Pawar
920*c83a76b0SSuyog Pawar if(e_quality_preset >= IHEVCE_QUALITY_P2)
921*c83a76b0SSuyog Pawar {
922*c83a76b0SSuyog Pawar node_validity = (!ps_cur_ipe_ctb->as_intra32_analyse[e_cur_blk_pos].b1_split_flag);
923*c83a76b0SSuyog Pawar }
924*c83a76b0SSuyog Pawar
925*c83a76b0SSuyog Pawar node_validity = node_validity && valid_flag_32;
926*c83a76b0SSuyog Pawar children_nodes_required = !node_validity || ps_cur_ipe_ctb->u1_split_flag;
927*c83a76b0SSuyog Pawar }
928*c83a76b0SSuyog Pawar
929*c83a76b0SSuyog Pawar if(e_quality_preset >= IHEVCE_QUALITY_P2)
930*c83a76b0SSuyog Pawar {
931*c83a76b0SSuyog Pawar if(node_validity == 1)
932*c83a76b0SSuyog Pawar {
933*c83a76b0SSuyog Pawar children_nodes_required = 0;
934*c83a76b0SSuyog Pawar }
935*c83a76b0SSuyog Pawar else
936*c83a76b0SSuyog Pawar {
937*c83a76b0SSuyog Pawar children_nodes_required =
938*c83a76b0SSuyog Pawar (ps_cur_ipe_ctb->as_intra32_analyse[e_cur_blk_pos].b1_split_flag);
939*c83a76b0SSuyog Pawar }
940*c83a76b0SSuyog Pawar }
941*c83a76b0SSuyog Pawar
942*c83a76b0SSuyog Pawar for(i = 0; i < 4; i++)
943*c83a76b0SSuyog Pawar {
944*c83a76b0SSuyog Pawar ai4_child_enable[i] = ps_intra16_analyse[i].b1_valid_cu;
945*c83a76b0SSuyog Pawar }
946*c83a76b0SSuyog Pawar
947*c83a76b0SSuyog Pawar break;
948*c83a76b0SSuyog Pawar }
949*c83a76b0SSuyog Pawar case 2:
950*c83a76b0SSuyog Pawar {
951*c83a76b0SSuyog Pawar /* 16x16 block */
952*c83a76b0SSuyog Pawar WORD32 cu_pos_x_parent;
953*c83a76b0SSuyog Pawar WORD32 cu_pos_y_parent;
954*c83a76b0SSuyog Pawar WORD32 merge_flag_16;
955*c83a76b0SSuyog Pawar WORD32 merge_flag_32;
956*c83a76b0SSuyog Pawar
957*c83a76b0SSuyog Pawar intra8_analyse_t *ps_intra8_analyse = ps_cur_ipe_ctb->as_intra32_analyse[e_parent_blk_pos]
958*c83a76b0SSuyog Pawar .as_intra16_analyse[e_cur_blk_pos]
959*c83a76b0SSuyog Pawar .as_intra8_analyse;
960*c83a76b0SSuyog Pawar
961*c83a76b0SSuyog Pawar WORD32 valid_flag_16 = (ps_cur_ipe_ctb->as_intra32_analyse[e_parent_blk_pos]
962*c83a76b0SSuyog Pawar .as_intra16_analyse[e_cur_blk_pos]
963*c83a76b0SSuyog Pawar .b1_valid_cu);
964*c83a76b0SSuyog Pawar
965*c83a76b0SSuyog Pawar cu_size = 16;
966*c83a76b0SSuyog Pawar
967*c83a76b0SSuyog Pawar /* Explanation for logic below - */
968*c83a76b0SSuyog Pawar /* See similar explanation above */
969*c83a76b0SSuyog Pawar cu_pos_x_parent = (e_parent_blk_pos & 1) << 2;
970*c83a76b0SSuyog Pawar cu_pos_y_parent = (e_parent_blk_pos & 2) << 1;
971*c83a76b0SSuyog Pawar cu_pos_x = cu_pos_x_parent + ((e_cur_blk_pos & 1) << 1);
972*c83a76b0SSuyog Pawar cu_pos_y = cu_pos_y_parent + (e_cur_blk_pos & 2);
973*c83a76b0SSuyog Pawar
974*c83a76b0SSuyog Pawar merge_flag_16 = (ps_cur_ipe_ctb->as_intra32_analyse[e_parent_blk_pos]
975*c83a76b0SSuyog Pawar .as_intra16_analyse[e_cur_blk_pos]
976*c83a76b0SSuyog Pawar .b1_merge_flag);
977*c83a76b0SSuyog Pawar merge_flag_32 = (ps_cur_ipe_ctb->as_intra32_analyse[e_parent_blk_pos].b1_merge_flag);
978*c83a76b0SSuyog Pawar
979*c83a76b0SSuyog Pawar #if !ENABLE_UNIFORM_CU_SIZE_8x8
980*c83a76b0SSuyog Pawar node_validity = (merge_flag_16) || ((ps_cur_ipe_ctb->u1_split_flag) && (!merge_flag_32));
981*c83a76b0SSuyog Pawar #else
982*c83a76b0SSuyog Pawar node_validity = 0;
983*c83a76b0SSuyog Pawar #endif
984*c83a76b0SSuyog Pawar
985*c83a76b0SSuyog Pawar node_validity = (merge_flag_16) || ((ps_cur_ipe_ctb->u1_split_flag) && (!merge_flag_32));
986*c83a76b0SSuyog Pawar
987*c83a76b0SSuyog Pawar if(e_quality_preset >= IHEVCE_QUALITY_P2)
988*c83a76b0SSuyog Pawar {
989*c83a76b0SSuyog Pawar node_validity = (!ps_cur_ipe_ctb->as_intra32_analyse[e_parent_blk_pos]
990*c83a76b0SSuyog Pawar .as_intra16_analyse[e_cur_blk_pos]
991*c83a76b0SSuyog Pawar .b1_split_flag);
992*c83a76b0SSuyog Pawar }
993*c83a76b0SSuyog Pawar
994*c83a76b0SSuyog Pawar node_validity = node_validity && valid_flag_16;
995*c83a76b0SSuyog Pawar
996*c83a76b0SSuyog Pawar children_nodes_required = ((ps_cur_ipe_ctb->u1_split_flag) && (!merge_flag_32)) ||
997*c83a76b0SSuyog Pawar !merge_flag_16;
998*c83a76b0SSuyog Pawar
999*c83a76b0SSuyog Pawar if(e_quality_preset >= IHEVCE_QUALITY_P2)
1000*c83a76b0SSuyog Pawar {
1001*c83a76b0SSuyog Pawar children_nodes_required = !node_validity;
1002*c83a76b0SSuyog Pawar }
1003*c83a76b0SSuyog Pawar
1004*c83a76b0SSuyog Pawar for(i = 0; i < 4; i++)
1005*c83a76b0SSuyog Pawar {
1006*c83a76b0SSuyog Pawar ai4_child_enable[i] = ps_intra8_analyse[i].b1_valid_cu;
1007*c83a76b0SSuyog Pawar }
1008*c83a76b0SSuyog Pawar break;
1009*c83a76b0SSuyog Pawar }
1010*c83a76b0SSuyog Pawar case 3:
1011*c83a76b0SSuyog Pawar {
1012*c83a76b0SSuyog Pawar /* 8x8 block */
1013*c83a76b0SSuyog Pawar WORD32 cu_pos_x_grandparent;
1014*c83a76b0SSuyog Pawar WORD32 cu_pos_y_grandparent;
1015*c83a76b0SSuyog Pawar
1016*c83a76b0SSuyog Pawar WORD32 cu_pos_x_parent;
1017*c83a76b0SSuyog Pawar WORD32 cu_pos_y_parent;
1018*c83a76b0SSuyog Pawar
1019*c83a76b0SSuyog Pawar WORD32 valid_flag_8 = (ps_cur_ipe_ctb->as_intra32_analyse[e_grandparent_blk_pos]
1020*c83a76b0SSuyog Pawar .as_intra16_analyse[e_parent_blk_pos]
1021*c83a76b0SSuyog Pawar .as_intra8_analyse[e_cur_blk_pos]
1022*c83a76b0SSuyog Pawar .b1_valid_cu);
1023*c83a76b0SSuyog Pawar
1024*c83a76b0SSuyog Pawar cu_size = 8;
1025*c83a76b0SSuyog Pawar
1026*c83a76b0SSuyog Pawar cu_pos_x_grandparent = (e_grandparent_blk_pos & 1) << 2;
1027*c83a76b0SSuyog Pawar cu_pos_y_grandparent = (e_grandparent_blk_pos & 2) << 1;
1028*c83a76b0SSuyog Pawar cu_pos_x_parent = cu_pos_x_grandparent + ((e_parent_blk_pos & 1) << 1);
1029*c83a76b0SSuyog Pawar cu_pos_y_parent = cu_pos_y_grandparent + (e_parent_blk_pos & 2);
1030*c83a76b0SSuyog Pawar cu_pos_x = cu_pos_x_parent + (e_cur_blk_pos & 1);
1031*c83a76b0SSuyog Pawar cu_pos_y = cu_pos_y_parent + ((e_cur_blk_pos & 2) >> 1);
1032*c83a76b0SSuyog Pawar
1033*c83a76b0SSuyog Pawar node_validity = 1 && valid_flag_8;
1034*c83a76b0SSuyog Pawar
1035*c83a76b0SSuyog Pawar children_nodes_required = 0;
1036*c83a76b0SSuyog Pawar
1037*c83a76b0SSuyog Pawar break;
1038*c83a76b0SSuyog Pawar }
1039*c83a76b0SSuyog Pawar }
1040*c83a76b0SSuyog Pawar
1041*c83a76b0SSuyog Pawar /* Fill the current cu_tree node */
1042*c83a76b0SSuyog Pawar ps_cu_tree->is_node_valid = node_validity;
1043*c83a76b0SSuyog Pawar ps_cu_tree->u1_cu_size = cu_size;
1044*c83a76b0SSuyog Pawar ps_cu_tree->b3_cu_pos_x = cu_pos_x;
1045*c83a76b0SSuyog Pawar ps_cu_tree->b3_cu_pos_y = cu_pos_y;
1046*c83a76b0SSuyog Pawar
1047*c83a76b0SSuyog Pawar if(children_nodes_required)
1048*c83a76b0SSuyog Pawar {
1049*c83a76b0SSuyog Pawar tree_depth++;
1050*c83a76b0SSuyog Pawar
1051*c83a76b0SSuyog Pawar ps_cur_ipe_ctb->nodes_created_in_cu_tree += ihevce_create_child_nodes_cu_tree(
1052*c83a76b0SSuyog Pawar ps_cur_ipe_ctb->ps_cu_tree_root,
1053*c83a76b0SSuyog Pawar ps_cu_tree,
1054*c83a76b0SSuyog Pawar ai4_child_enable,
1055*c83a76b0SSuyog Pawar ps_cur_ipe_ctb->nodes_created_in_cu_tree);
1056*c83a76b0SSuyog Pawar
1057*c83a76b0SSuyog Pawar ihevce_populate_cu_tree(
1058*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
1059*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_tl,
1060*c83a76b0SSuyog Pawar tree_depth,
1061*c83a76b0SSuyog Pawar e_quality_preset,
1062*c83a76b0SSuyog Pawar e_parent_blk_pos,
1063*c83a76b0SSuyog Pawar e_cur_blk_pos,
1064*c83a76b0SSuyog Pawar POS_TL);
1065*c83a76b0SSuyog Pawar
1066*c83a76b0SSuyog Pawar ihevce_populate_cu_tree(
1067*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
1068*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_tr,
1069*c83a76b0SSuyog Pawar tree_depth,
1070*c83a76b0SSuyog Pawar e_quality_preset,
1071*c83a76b0SSuyog Pawar e_parent_blk_pos,
1072*c83a76b0SSuyog Pawar e_cur_blk_pos,
1073*c83a76b0SSuyog Pawar POS_TR);
1074*c83a76b0SSuyog Pawar
1075*c83a76b0SSuyog Pawar ihevce_populate_cu_tree(
1076*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
1077*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_bl,
1078*c83a76b0SSuyog Pawar tree_depth,
1079*c83a76b0SSuyog Pawar e_quality_preset,
1080*c83a76b0SSuyog Pawar e_parent_blk_pos,
1081*c83a76b0SSuyog Pawar e_cur_blk_pos,
1082*c83a76b0SSuyog Pawar POS_BL);
1083*c83a76b0SSuyog Pawar
1084*c83a76b0SSuyog Pawar ihevce_populate_cu_tree(
1085*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
1086*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_br,
1087*c83a76b0SSuyog Pawar tree_depth,
1088*c83a76b0SSuyog Pawar e_quality_preset,
1089*c83a76b0SSuyog Pawar e_parent_blk_pos,
1090*c83a76b0SSuyog Pawar e_cur_blk_pos,
1091*c83a76b0SSuyog Pawar POS_BR);
1092*c83a76b0SSuyog Pawar }
1093*c83a76b0SSuyog Pawar else
1094*c83a76b0SSuyog Pawar {
1095*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_tl = NULL;
1096*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_tr = NULL;
1097*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_bl = NULL;
1098*c83a76b0SSuyog Pawar ps_cu_tree->ps_child_node_br = NULL;
1099*c83a76b0SSuyog Pawar }
1100*c83a76b0SSuyog Pawar }
1101*c83a76b0SSuyog Pawar
1102*c83a76b0SSuyog Pawar /**
1103*c83a76b0SSuyog Pawar *********************************************************************************
1104*c83a76b0SSuyog Pawar * Function name : ihevce_intra_mode_populator
1105*c83a76b0SSuyog Pawar *
1106*c83a76b0SSuyog Pawar * \brief
1107*c83a76b0SSuyog Pawar * This function populate intra mode info to strcut
1108*c83a76b0SSuyog Pawar *
1109*c83a76b0SSuyog Pawar * \param[in] ps_cu_intra_cand : pointer to Structure contain cu intra candidate info
1110*c83a76b0SSuyog Pawar * \param[out] ps_ipe_data : pointer to IPE L0 analyze structure
1111*c83a76b0SSuyog Pawar * \param[in] ps_cu_tree_data : poniter to cu recursive struct
1112*c83a76b0SSuyog Pawar * \param[in] i1_slice_type : contain slice type value
1113*c83a76b0SSuyog Pawar * \param[in] i4_quality_preset : contain quality preset value
1114*c83a76b0SSuyog Pawar *
1115*c83a76b0SSuyog Pawar * \return
1116*c83a76b0SSuyog Pawar * None
1117*c83a76b0SSuyog Pawar *
1118*c83a76b0SSuyog Pawar **********************************************************************************/
ihevce_intra_mode_populator(cu_intra_cand_t * ps_cu_intra_cand,ipe_l0_ctb_analyse_for_me_t * ps_ipe_data,cur_ctb_cu_tree_t * ps_cu_tree_data,WORD8 i1_slice_type,WORD32 i4_quality_preset)1119*c83a76b0SSuyog Pawar static void ihevce_intra_mode_populator(
1120*c83a76b0SSuyog Pawar cu_intra_cand_t *ps_cu_intra_cand,
1121*c83a76b0SSuyog Pawar ipe_l0_ctb_analyse_for_me_t *ps_ipe_data,
1122*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_data,
1123*c83a76b0SSuyog Pawar WORD8 i1_slice_type,
1124*c83a76b0SSuyog Pawar WORD32 i4_quality_preset)
1125*c83a76b0SSuyog Pawar {
1126*c83a76b0SSuyog Pawar WORD32 i4_32x32_id, i4_16x16_id, i4_8x8_id;
1127*c83a76b0SSuyog Pawar
1128*c83a76b0SSuyog Pawar UWORD8 u1_cu_pos_x = ps_cu_tree_data->b3_cu_pos_x;
1129*c83a76b0SSuyog Pawar UWORD8 u1_cu_pos_y = ps_cu_tree_data->b3_cu_pos_y;
1130*c83a76b0SSuyog Pawar
1131*c83a76b0SSuyog Pawar i4_32x32_id = ((u1_cu_pos_x & 4) >> 2) + ((u1_cu_pos_y & 4) >> 1);
1132*c83a76b0SSuyog Pawar
1133*c83a76b0SSuyog Pawar i4_16x16_id = ((u1_cu_pos_x & 2) >> 1) + ((u1_cu_pos_y & 2));
1134*c83a76b0SSuyog Pawar
1135*c83a76b0SSuyog Pawar i4_8x8_id = (u1_cu_pos_x & 1) + ((u1_cu_pos_y & 1) << 1);
1136*c83a76b0SSuyog Pawar
1137*c83a76b0SSuyog Pawar if(i4_quality_preset < IHEVCE_QUALITY_P3)
1138*c83a76b0SSuyog Pawar {
1139*c83a76b0SSuyog Pawar switch(ps_cu_tree_data->u1_cu_size)
1140*c83a76b0SSuyog Pawar {
1141*c83a76b0SSuyog Pawar case 64:
1142*c83a76b0SSuyog Pawar {
1143*c83a76b0SSuyog Pawar memcpy(
1144*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1145*c83a76b0SSuyog Pawar ps_ipe_data->au1_best_modes_32x32_tu,
1146*c83a76b0SSuyog Pawar MAX_INTRA_CU_CANDIDATES + 1);
1147*c83a76b0SSuyog Pawar
1148*c83a76b0SSuyog Pawar break;
1149*c83a76b0SSuyog Pawar }
1150*c83a76b0SSuyog Pawar case 32:
1151*c83a76b0SSuyog Pawar {
1152*c83a76b0SSuyog Pawar intra32_analyse_t *ps_32x32_ipe_analyze = &ps_ipe_data->as_intra32_analyse[i4_32x32_id];
1153*c83a76b0SSuyog Pawar
1154*c83a76b0SSuyog Pawar memcpy(
1155*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu,
1156*c83a76b0SSuyog Pawar ps_32x32_ipe_analyze->au1_best_modes_32x32_tu,
1157*c83a76b0SSuyog Pawar MAX_INTRA_CU_CANDIDATES + 1);
1158*c83a76b0SSuyog Pawar
1159*c83a76b0SSuyog Pawar if((i1_slice_type != ISLICE) && (i4_quality_preset == IHEVCE_QUALITY_P0))
1160*c83a76b0SSuyog Pawar {
1161*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2[0] = 255;
1162*c83a76b0SSuyog Pawar }
1163*c83a76b0SSuyog Pawar else if((i1_slice_type == ISLICE) && (i4_quality_preset == IHEVCE_QUALITY_P0))
1164*c83a76b0SSuyog Pawar {
1165*c83a76b0SSuyog Pawar if((ps_cu_tree_data->ps_child_node_bl != NULL) &&
1166*c83a76b0SSuyog Pawar (ps_cu_tree_data->ps_child_node_bl->is_node_valid))
1167*c83a76b0SSuyog Pawar {
1168*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2[0] = 255;
1169*c83a76b0SSuyog Pawar }
1170*c83a76b0SSuyog Pawar else
1171*c83a76b0SSuyog Pawar {
1172*c83a76b0SSuyog Pawar memcpy(
1173*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1174*c83a76b0SSuyog Pawar ps_32x32_ipe_analyze->au1_best_modes_16x16_tu,
1175*c83a76b0SSuyog Pawar MAX_INTRA_CU_CANDIDATES + 1);
1176*c83a76b0SSuyog Pawar }
1177*c83a76b0SSuyog Pawar }
1178*c83a76b0SSuyog Pawar else
1179*c83a76b0SSuyog Pawar {
1180*c83a76b0SSuyog Pawar memcpy(
1181*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1182*c83a76b0SSuyog Pawar ps_32x32_ipe_analyze->au1_best_modes_16x16_tu,
1183*c83a76b0SSuyog Pawar MAX_INTRA_CU_CANDIDATES + 1);
1184*c83a76b0SSuyog Pawar }
1185*c83a76b0SSuyog Pawar
1186*c83a76b0SSuyog Pawar break;
1187*c83a76b0SSuyog Pawar }
1188*c83a76b0SSuyog Pawar case 16:
1189*c83a76b0SSuyog Pawar {
1190*c83a76b0SSuyog Pawar /* Copy best 16x16 CU modes */
1191*c83a76b0SSuyog Pawar intra32_analyse_t *ps_32x32_ipe_analyze = &ps_ipe_data->as_intra32_analyse[i4_32x32_id];
1192*c83a76b0SSuyog Pawar
1193*c83a76b0SSuyog Pawar intra16_analyse_t *ps_16x16_ipe_analyze =
1194*c83a76b0SSuyog Pawar &ps_32x32_ipe_analyze->as_intra16_analyse[i4_16x16_id];
1195*c83a76b0SSuyog Pawar
1196*c83a76b0SSuyog Pawar memcpy(
1197*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu,
1198*c83a76b0SSuyog Pawar ps_16x16_ipe_analyze->au1_best_modes_16x16_tu,
1199*c83a76b0SSuyog Pawar MAX_INTRA_CU_CANDIDATES + 1);
1200*c83a76b0SSuyog Pawar
1201*c83a76b0SSuyog Pawar if((i1_slice_type != ISLICE) && (i4_quality_preset == IHEVCE_QUALITY_P0))
1202*c83a76b0SSuyog Pawar {
1203*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2[0] = 255;
1204*c83a76b0SSuyog Pawar }
1205*c83a76b0SSuyog Pawar else if((i1_slice_type == ISLICE) && (i4_quality_preset == IHEVCE_QUALITY_P0))
1206*c83a76b0SSuyog Pawar {
1207*c83a76b0SSuyog Pawar if((ps_cu_tree_data->ps_child_node_bl != NULL) &&
1208*c83a76b0SSuyog Pawar (ps_cu_tree_data->ps_child_node_bl->is_node_valid))
1209*c83a76b0SSuyog Pawar {
1210*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2[0] = 255;
1211*c83a76b0SSuyog Pawar }
1212*c83a76b0SSuyog Pawar else
1213*c83a76b0SSuyog Pawar {
1214*c83a76b0SSuyog Pawar memcpy(
1215*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1216*c83a76b0SSuyog Pawar ps_16x16_ipe_analyze->au1_best_modes_8x8_tu,
1217*c83a76b0SSuyog Pawar MAX_INTRA_CU_CANDIDATES + 1);
1218*c83a76b0SSuyog Pawar }
1219*c83a76b0SSuyog Pawar }
1220*c83a76b0SSuyog Pawar else
1221*c83a76b0SSuyog Pawar {
1222*c83a76b0SSuyog Pawar memcpy(
1223*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1224*c83a76b0SSuyog Pawar ps_16x16_ipe_analyze->au1_best_modes_8x8_tu,
1225*c83a76b0SSuyog Pawar MAX_INTRA_CU_CANDIDATES + 1);
1226*c83a76b0SSuyog Pawar }
1227*c83a76b0SSuyog Pawar
1228*c83a76b0SSuyog Pawar break;
1229*c83a76b0SSuyog Pawar }
1230*c83a76b0SSuyog Pawar case 8:
1231*c83a76b0SSuyog Pawar {
1232*c83a76b0SSuyog Pawar intra32_analyse_t *ps_32x32_ipe_analyze = &ps_ipe_data->as_intra32_analyse[i4_32x32_id];
1233*c83a76b0SSuyog Pawar
1234*c83a76b0SSuyog Pawar intra16_analyse_t *ps_16x16_ipe_analyze =
1235*c83a76b0SSuyog Pawar &ps_32x32_ipe_analyze->as_intra16_analyse[i4_16x16_id];
1236*c83a76b0SSuyog Pawar
1237*c83a76b0SSuyog Pawar intra8_analyse_t *ps_8x8_ipe_analyze =
1238*c83a76b0SSuyog Pawar &ps_16x16_ipe_analyze->as_intra8_analyse[i4_8x8_id];
1239*c83a76b0SSuyog Pawar
1240*c83a76b0SSuyog Pawar memcpy(
1241*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu,
1242*c83a76b0SSuyog Pawar ps_8x8_ipe_analyze->au1_best_modes_8x8_tu,
1243*c83a76b0SSuyog Pawar MAX_INTRA_CU_CANDIDATES + 1);
1244*c83a76b0SSuyog Pawar
1245*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2[0] = 255;
1246*c83a76b0SSuyog Pawar
1247*c83a76b0SSuyog Pawar /* Initialise the hash */
1248*c83a76b0SSuyog Pawar {
1249*c83a76b0SSuyog Pawar WORD32 i, j;
1250*c83a76b0SSuyog Pawar
1251*c83a76b0SSuyog Pawar for(i = 0; i < NUM_PU_PARTS; i++)
1252*c83a76b0SSuyog Pawar {
1253*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_num_modes_added[i] = 0;
1254*c83a76b0SSuyog Pawar
1255*c83a76b0SSuyog Pawar for(j = 0; j < MAX_INTRA_CANDIDATES; j++)
1256*c83a76b0SSuyog Pawar {
1257*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_mode_nxn_hash[i][j] = 0;
1258*c83a76b0SSuyog Pawar }
1259*c83a76b0SSuyog Pawar }
1260*c83a76b0SSuyog Pawar
1261*c83a76b0SSuyog Pawar for(i = 0; i < NUM_PU_PARTS; i++)
1262*c83a76b0SSuyog Pawar {
1263*c83a76b0SSuyog Pawar for(j = 0; j < MAX_INTRA_CU_CANDIDATES; j++)
1264*c83a76b0SSuyog Pawar {
1265*c83a76b0SSuyog Pawar if(ps_8x8_ipe_analyze->au1_4x4_best_modes[i][j] == 255)
1266*c83a76b0SSuyog Pawar {
1267*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[i][j] = 255;
1268*c83a76b0SSuyog Pawar break;
1269*c83a76b0SSuyog Pawar }
1270*c83a76b0SSuyog Pawar
1271*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[i][j] =
1272*c83a76b0SSuyog Pawar ps_8x8_ipe_analyze->au1_4x4_best_modes[i][j];
1273*c83a76b0SSuyog Pawar
1274*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_mode_nxn_hash
1275*c83a76b0SSuyog Pawar [i][ps_8x8_ipe_analyze->au1_4x4_best_modes[i][j]] = 1;
1276*c83a76b0SSuyog Pawar
1277*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_num_modes_added[i]++;
1278*c83a76b0SSuyog Pawar }
1279*c83a76b0SSuyog Pawar
1280*c83a76b0SSuyog Pawar if(ps_cu_intra_cand->au1_num_modes_added[i] == MAX_INTRA_CU_CANDIDATES)
1281*c83a76b0SSuyog Pawar {
1282*c83a76b0SSuyog Pawar if(i1_slice_type != BSLICE)
1283*c83a76b0SSuyog Pawar {
1284*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_num_modes_added[i] =
1285*c83a76b0SSuyog Pawar ihevce_intra_mode_nxn_hash_updater(
1286*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[i],
1287*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_mode_nxn_hash[i],
1288*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_num_modes_added[i]);
1289*c83a76b0SSuyog Pawar }
1290*c83a76b0SSuyog Pawar }
1291*c83a76b0SSuyog Pawar }
1292*c83a76b0SSuyog Pawar }
1293*c83a76b0SSuyog Pawar
1294*c83a76b0SSuyog Pawar break;
1295*c83a76b0SSuyog Pawar }
1296*c83a76b0SSuyog Pawar }
1297*c83a76b0SSuyog Pawar }
1298*c83a76b0SSuyog Pawar else if(i4_quality_preset == IHEVCE_QUALITY_P6)
1299*c83a76b0SSuyog Pawar {
1300*c83a76b0SSuyog Pawar switch(ps_cu_tree_data->u1_cu_size)
1301*c83a76b0SSuyog Pawar {
1302*c83a76b0SSuyog Pawar case 64:
1303*c83a76b0SSuyog Pawar {
1304*c83a76b0SSuyog Pawar memcpy(
1305*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1306*c83a76b0SSuyog Pawar ps_ipe_data->au1_best_modes_32x32_tu,
1307*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1308*c83a76b0SSuyog Pawar
1309*c83a76b0SSuyog Pawar ps_cu_intra_cand->b1_eval_tx_cusize = 0;
1310*c83a76b0SSuyog Pawar ps_cu_intra_cand->b1_eval_tx_cusize_by2 = 1;
1311*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu[0] = 255;
1312*c83a76b0SSuyog Pawar
1313*c83a76b0SSuyog Pawar #if ENABLE_INTRA_MODE_FILTERING_IN_XS25
1314*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2
1315*c83a76b0SSuyog Pawar [MAX_NUM_INTRA_MODES_PER_TU_DISTRIBUTION_IN_XS25] = 255;
1316*c83a76b0SSuyog Pawar #endif
1317*c83a76b0SSuyog Pawar
1318*c83a76b0SSuyog Pawar break;
1319*c83a76b0SSuyog Pawar }
1320*c83a76b0SSuyog Pawar case 32:
1321*c83a76b0SSuyog Pawar {
1322*c83a76b0SSuyog Pawar intra32_analyse_t *ps_32x32_ipe_analyze = &ps_ipe_data->as_intra32_analyse[i4_32x32_id];
1323*c83a76b0SSuyog Pawar
1324*c83a76b0SSuyog Pawar memcpy(
1325*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu,
1326*c83a76b0SSuyog Pawar ps_32x32_ipe_analyze->au1_best_modes_32x32_tu,
1327*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1328*c83a76b0SSuyog Pawar
1329*c83a76b0SSuyog Pawar memcpy(
1330*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1331*c83a76b0SSuyog Pawar ps_32x32_ipe_analyze->au1_best_modes_16x16_tu,
1332*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1333*c83a76b0SSuyog Pawar
1334*c83a76b0SSuyog Pawar #if ENABLE_INTRA_MODE_FILTERING_IN_XS25
1335*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu
1336*c83a76b0SSuyog Pawar [MAX_NUM_INTRA_MODES_PER_TU_DISTRIBUTION_IN_XS25] = 255;
1337*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2
1338*c83a76b0SSuyog Pawar [MAX_NUM_INTRA_MODES_PER_TU_DISTRIBUTION_IN_XS25] = 255;
1339*c83a76b0SSuyog Pawar #endif
1340*c83a76b0SSuyog Pawar
1341*c83a76b0SSuyog Pawar break;
1342*c83a76b0SSuyog Pawar }
1343*c83a76b0SSuyog Pawar case 16:
1344*c83a76b0SSuyog Pawar {
1345*c83a76b0SSuyog Pawar /* Copy best 16x16 CU modes */
1346*c83a76b0SSuyog Pawar intra32_analyse_t *ps_32x32_ipe_analyze = &ps_ipe_data->as_intra32_analyse[i4_32x32_id];
1347*c83a76b0SSuyog Pawar
1348*c83a76b0SSuyog Pawar intra16_analyse_t *ps_16x16_ipe_analyze =
1349*c83a76b0SSuyog Pawar &ps_32x32_ipe_analyze->as_intra16_analyse[i4_16x16_id];
1350*c83a76b0SSuyog Pawar
1351*c83a76b0SSuyog Pawar memcpy(
1352*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu,
1353*c83a76b0SSuyog Pawar ps_16x16_ipe_analyze->au1_best_modes_16x16_tu,
1354*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1355*c83a76b0SSuyog Pawar
1356*c83a76b0SSuyog Pawar memcpy(
1357*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1358*c83a76b0SSuyog Pawar ps_16x16_ipe_analyze->au1_best_modes_8x8_tu,
1359*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1360*c83a76b0SSuyog Pawar
1361*c83a76b0SSuyog Pawar #if ENABLE_INTRA_MODE_FILTERING_IN_XS25
1362*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu
1363*c83a76b0SSuyog Pawar [MAX_NUM_INTRA_MODES_PER_TU_DISTRIBUTION_IN_XS25] = 255;
1364*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2
1365*c83a76b0SSuyog Pawar [MAX_NUM_INTRA_MODES_PER_TU_DISTRIBUTION_IN_XS25] = 255;
1366*c83a76b0SSuyog Pawar #endif
1367*c83a76b0SSuyog Pawar
1368*c83a76b0SSuyog Pawar break;
1369*c83a76b0SSuyog Pawar }
1370*c83a76b0SSuyog Pawar case 8:
1371*c83a76b0SSuyog Pawar {
1372*c83a76b0SSuyog Pawar WORD32 i;
1373*c83a76b0SSuyog Pawar
1374*c83a76b0SSuyog Pawar intra32_analyse_t *ps_32x32_ipe_analyze = &ps_ipe_data->as_intra32_analyse[i4_32x32_id];
1375*c83a76b0SSuyog Pawar
1376*c83a76b0SSuyog Pawar intra16_analyse_t *ps_16x16_ipe_analyze =
1377*c83a76b0SSuyog Pawar &ps_32x32_ipe_analyze->as_intra16_analyse[i4_16x16_id];
1378*c83a76b0SSuyog Pawar
1379*c83a76b0SSuyog Pawar intra8_analyse_t *ps_8x8_ipe_analyze =
1380*c83a76b0SSuyog Pawar &ps_16x16_ipe_analyze->as_intra8_analyse[i4_8x8_id];
1381*c83a76b0SSuyog Pawar
1382*c83a76b0SSuyog Pawar memcpy(
1383*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu,
1384*c83a76b0SSuyog Pawar ps_8x8_ipe_analyze->au1_best_modes_8x8_tu,
1385*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1386*c83a76b0SSuyog Pawar
1387*c83a76b0SSuyog Pawar #if !ENABLE_INTRA_MODE_FILTERING_IN_XS25
1388*c83a76b0SSuyog Pawar memcpy(
1389*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1390*c83a76b0SSuyog Pawar ps_8x8_ipe_analyze->au1_best_modes_4x4_tu,
1391*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1392*c83a76b0SSuyog Pawar
1393*c83a76b0SSuyog Pawar for(i = 0; i < 4; i++)
1394*c83a76b0SSuyog Pawar {
1395*c83a76b0SSuyog Pawar memcpy(
1396*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[i],
1397*c83a76b0SSuyog Pawar ps_8x8_ipe_analyze->au1_4x4_best_modes[i],
1398*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1399*c83a76b0SSuyog Pawar
1400*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[i][MAX_INTRA_CU_CANDIDATES] = 255;
1401*c83a76b0SSuyog Pawar }
1402*c83a76b0SSuyog Pawar #else
1403*c83a76b0SSuyog Pawar if(255 == ps_8x8_ipe_analyze->au1_4x4_best_modes[0][0])
1404*c83a76b0SSuyog Pawar {
1405*c83a76b0SSuyog Pawar memcpy(
1406*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1407*c83a76b0SSuyog Pawar ps_8x8_ipe_analyze->au1_best_modes_4x4_tu,
1408*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1409*c83a76b0SSuyog Pawar
1410*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2
1411*c83a76b0SSuyog Pawar [MAX_NUM_INTRA_MODES_PER_TU_DISTRIBUTION_IN_XS25] = 255;
1412*c83a76b0SSuyog Pawar }
1413*c83a76b0SSuyog Pawar else
1414*c83a76b0SSuyog Pawar {
1415*c83a76b0SSuyog Pawar for(i = 0; i < 4; i++)
1416*c83a76b0SSuyog Pawar {
1417*c83a76b0SSuyog Pawar memcpy(
1418*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[i],
1419*c83a76b0SSuyog Pawar ps_8x8_ipe_analyze->au1_4x4_best_modes[i],
1420*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1421*c83a76b0SSuyog Pawar
1422*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn
1423*c83a76b0SSuyog Pawar [i][MAX_NUM_INTRA_MODES_PER_TU_DISTRIBUTION_IN_XS25] = 255;
1424*c83a76b0SSuyog Pawar }
1425*c83a76b0SSuyog Pawar }
1426*c83a76b0SSuyog Pawar
1427*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu
1428*c83a76b0SSuyog Pawar [MAX_NUM_INTRA_MODES_PER_TU_DISTRIBUTION_IN_XS25] = 255;
1429*c83a76b0SSuyog Pawar #endif
1430*c83a76b0SSuyog Pawar
1431*c83a76b0SSuyog Pawar #if FORCE_NXN_MODE_BASED_ON_OL_IPE
1432*c83a76b0SSuyog Pawar if((i4_quality_preset == IHEVCE_QUALITY_P6) && (i1_slice_type != ISLICE))
1433*c83a76b0SSuyog Pawar {
1434*c83a76b0SSuyog Pawar /*Evaluate nxn mode for 8x8 if ol ipe wins for nxn over cu=tu and cu=4tu.*/
1435*c83a76b0SSuyog Pawar /*Disbale CU=TU and CU=4TU modes */
1436*c83a76b0SSuyog Pawar if(ps_8x8_ipe_analyze->b1_enable_nxn == 1)
1437*c83a76b0SSuyog Pawar {
1438*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu[0] = 255;
1439*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2[0] = 255;
1440*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[0][1] = 255;
1441*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[1][1] = 255;
1442*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[2][1] = 255;
1443*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[3][1] = 255;
1444*c83a76b0SSuyog Pawar }
1445*c83a76b0SSuyog Pawar }
1446*c83a76b0SSuyog Pawar #endif
1447*c83a76b0SSuyog Pawar
1448*c83a76b0SSuyog Pawar break;
1449*c83a76b0SSuyog Pawar }
1450*c83a76b0SSuyog Pawar }
1451*c83a76b0SSuyog Pawar }
1452*c83a76b0SSuyog Pawar else
1453*c83a76b0SSuyog Pawar {
1454*c83a76b0SSuyog Pawar switch(ps_cu_tree_data->u1_cu_size)
1455*c83a76b0SSuyog Pawar {
1456*c83a76b0SSuyog Pawar case 64:
1457*c83a76b0SSuyog Pawar {
1458*c83a76b0SSuyog Pawar memcpy(
1459*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1460*c83a76b0SSuyog Pawar ps_ipe_data->au1_best_modes_32x32_tu,
1461*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1462*c83a76b0SSuyog Pawar
1463*c83a76b0SSuyog Pawar ps_cu_intra_cand->b1_eval_tx_cusize = 0;
1464*c83a76b0SSuyog Pawar ps_cu_intra_cand->b1_eval_tx_cusize_by2 = 1;
1465*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu[0] = 255;
1466*c83a76b0SSuyog Pawar
1467*c83a76b0SSuyog Pawar break;
1468*c83a76b0SSuyog Pawar }
1469*c83a76b0SSuyog Pawar case 32:
1470*c83a76b0SSuyog Pawar {
1471*c83a76b0SSuyog Pawar intra32_analyse_t *ps_32x32_ipe_analyze = &ps_ipe_data->as_intra32_analyse[i4_32x32_id];
1472*c83a76b0SSuyog Pawar
1473*c83a76b0SSuyog Pawar memcpy(
1474*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu,
1475*c83a76b0SSuyog Pawar ps_32x32_ipe_analyze->au1_best_modes_32x32_tu,
1476*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1477*c83a76b0SSuyog Pawar
1478*c83a76b0SSuyog Pawar memcpy(
1479*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1480*c83a76b0SSuyog Pawar ps_32x32_ipe_analyze->au1_best_modes_16x16_tu,
1481*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1482*c83a76b0SSuyog Pawar
1483*c83a76b0SSuyog Pawar break;
1484*c83a76b0SSuyog Pawar }
1485*c83a76b0SSuyog Pawar case 16:
1486*c83a76b0SSuyog Pawar {
1487*c83a76b0SSuyog Pawar /* Copy best 16x16 CU modes */
1488*c83a76b0SSuyog Pawar intra32_analyse_t *ps_32x32_ipe_analyze = &ps_ipe_data->as_intra32_analyse[i4_32x32_id];
1489*c83a76b0SSuyog Pawar
1490*c83a76b0SSuyog Pawar intra16_analyse_t *ps_16x16_ipe_analyze =
1491*c83a76b0SSuyog Pawar &ps_32x32_ipe_analyze->as_intra16_analyse[i4_16x16_id];
1492*c83a76b0SSuyog Pawar
1493*c83a76b0SSuyog Pawar memcpy(
1494*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu,
1495*c83a76b0SSuyog Pawar ps_16x16_ipe_analyze->au1_best_modes_16x16_tu,
1496*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1497*c83a76b0SSuyog Pawar
1498*c83a76b0SSuyog Pawar memcpy(
1499*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1500*c83a76b0SSuyog Pawar ps_16x16_ipe_analyze->au1_best_modes_8x8_tu,
1501*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1502*c83a76b0SSuyog Pawar
1503*c83a76b0SSuyog Pawar break;
1504*c83a76b0SSuyog Pawar }
1505*c83a76b0SSuyog Pawar case 8:
1506*c83a76b0SSuyog Pawar {
1507*c83a76b0SSuyog Pawar WORD32 i;
1508*c83a76b0SSuyog Pawar
1509*c83a76b0SSuyog Pawar intra32_analyse_t *ps_32x32_ipe_analyze = &ps_ipe_data->as_intra32_analyse[i4_32x32_id];
1510*c83a76b0SSuyog Pawar
1511*c83a76b0SSuyog Pawar intra16_analyse_t *ps_16x16_ipe_analyze =
1512*c83a76b0SSuyog Pawar &ps_32x32_ipe_analyze->as_intra16_analyse[i4_16x16_id];
1513*c83a76b0SSuyog Pawar
1514*c83a76b0SSuyog Pawar intra8_analyse_t *ps_8x8_ipe_analyze =
1515*c83a76b0SSuyog Pawar &ps_16x16_ipe_analyze->as_intra8_analyse[i4_8x8_id];
1516*c83a76b0SSuyog Pawar
1517*c83a76b0SSuyog Pawar memcpy(
1518*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu,
1519*c83a76b0SSuyog Pawar ps_8x8_ipe_analyze->au1_best_modes_8x8_tu,
1520*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1521*c83a76b0SSuyog Pawar
1522*c83a76b0SSuyog Pawar memcpy(
1523*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2,
1524*c83a76b0SSuyog Pawar ps_8x8_ipe_analyze->au1_best_modes_4x4_tu,
1525*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1526*c83a76b0SSuyog Pawar
1527*c83a76b0SSuyog Pawar for(i = 0; i < 4; i++)
1528*c83a76b0SSuyog Pawar {
1529*c83a76b0SSuyog Pawar memcpy(
1530*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[i],
1531*c83a76b0SSuyog Pawar ps_8x8_ipe_analyze->au1_4x4_best_modes[i],
1532*c83a76b0SSuyog Pawar (NUM_BEST_MODES + 1) * sizeof(UWORD8));
1533*c83a76b0SSuyog Pawar
1534*c83a76b0SSuyog Pawar ps_cu_intra_cand->au1_intra_luma_modes_nxn[i][MAX_INTRA_CU_CANDIDATES] = 255;
1535*c83a76b0SSuyog Pawar }
1536*c83a76b0SSuyog Pawar
1537*c83a76b0SSuyog Pawar break;
1538*c83a76b0SSuyog Pawar }
1539*c83a76b0SSuyog Pawar }
1540*c83a76b0SSuyog Pawar }
1541*c83a76b0SSuyog Pawar }
1542*c83a76b0SSuyog Pawar /**
1543*c83a76b0SSuyog Pawar ******************************************************************************
1544*c83a76b0SSuyog Pawar * \if Function name : ihevce_compute_rdo \endif
1545*c83a76b0SSuyog Pawar *
1546*c83a76b0SSuyog Pawar * \brief
1547*c83a76b0SSuyog Pawar * Coding Unit mode decide function. Performs RD opt and decides the best mode
1548*c83a76b0SSuyog Pawar *
1549*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to enc_loop module
1550*c83a76b0SSuyog Pawar * \param[in] ps_cu_prms : pointer to coding unit params (position, buffer pointers)
1551*c83a76b0SSuyog Pawar * \param[in] ps_cu_analyse : pointer to cu analyse
1552*c83a76b0SSuyog Pawar * \param[out] ps_cu_final : pointer to cu final
1553*c83a76b0SSuyog Pawar * \param[out] pu1_ecd_data :pointer to store coeff data for ECD
1554*c83a76b0SSuyog Pawar * \param[out]ps_row_col_pu; colocated pu buffer pointer
1555*c83a76b0SSuyog Pawar * \param[out]pu1_row_pu_map; colocated pu map buffer pointer
1556*c83a76b0SSuyog Pawar * \param[in]col_start_pu_idx : pu index start value
1557*c83a76b0SSuyog Pawar *
1558*c83a76b0SSuyog Pawar * \return
1559*c83a76b0SSuyog Pawar * None
1560*c83a76b0SSuyog Pawar *
1561*c83a76b0SSuyog Pawar *
1562*c83a76b0SSuyog Pawar * \author
1563*c83a76b0SSuyog Pawar * Ittiam
1564*c83a76b0SSuyog Pawar *
1565*c83a76b0SSuyog Pawar *****************************************************************************
1566*c83a76b0SSuyog Pawar */
ihevce_compute_rdo(ihevce_enc_loop_ctxt_t * ps_ctxt,enc_loop_cu_prms_t * ps_cu_prms,cur_ctb_cu_tree_t * ps_cu_tree_analyse,ipe_l0_ctb_analyse_for_me_t * ps_cur_ipe_ctb,me_ctb_data_t * ps_cu_me_data,pu_col_mv_t * ps_col_pu,final_mode_state_t * ps_final_mode_state,UWORD8 * pu1_col_pu_map,UWORD8 * pu1_ecd_data,WORD32 col_start_pu_idx,WORD32 i4_ctb_x_off,WORD32 i4_ctb_y_off)1567*c83a76b0SSuyog Pawar LWORD64 ihevce_compute_rdo(
1568*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt,
1569*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms,
1570*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_analyse,
1571*c83a76b0SSuyog Pawar ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb,
1572*c83a76b0SSuyog Pawar me_ctb_data_t *ps_cu_me_data,
1573*c83a76b0SSuyog Pawar pu_col_mv_t *ps_col_pu,
1574*c83a76b0SSuyog Pawar final_mode_state_t *ps_final_mode_state,
1575*c83a76b0SSuyog Pawar UWORD8 *pu1_col_pu_map,
1576*c83a76b0SSuyog Pawar UWORD8 *pu1_ecd_data,
1577*c83a76b0SSuyog Pawar WORD32 col_start_pu_idx,
1578*c83a76b0SSuyog Pawar WORD32 i4_ctb_x_off,
1579*c83a76b0SSuyog Pawar WORD32 i4_ctb_y_off)
1580*c83a76b0SSuyog Pawar {
1581*c83a76b0SSuyog Pawar /* Populate the rdo candiates to the structure */
1582*c83a76b0SSuyog Pawar cu_analyse_t s_cu_analyse;
1583*c83a76b0SSuyog Pawar LWORD64 rdopt_best_cost;
1584*c83a76b0SSuyog Pawar /* Populate candidates of child nodes to CU analyse struct for further evaluation */
1585*c83a76b0SSuyog Pawar cu_analyse_t *ps_cu_analyse;
1586*c83a76b0SSuyog Pawar WORD32 curr_cu_pos_in_row;
1587*c83a76b0SSuyog Pawar WORD32 cu_top_right_offset, cu_top_right_dep_pos;
1588*c83a76b0SSuyog Pawar WORD32 is_first_cu_in_ctb, is_ctb_level_quant_rounding, is_nctb_level_quant_rounding;
1589*c83a76b0SSuyog Pawar
1590*c83a76b0SSuyog Pawar WORD32 cu_pos_x = ps_cu_tree_analyse->b3_cu_pos_x;
1591*c83a76b0SSuyog Pawar WORD32 cu_pos_y = ps_cu_tree_analyse->b3_cu_pos_y;
1592*c83a76b0SSuyog Pawar
1593*c83a76b0SSuyog Pawar /*Derive the indices of 32*32, 16*16 and 8*8 blocks*/
1594*c83a76b0SSuyog Pawar WORD32 i4_32x32_id = ((cu_pos_x & 4) >> 2) + ((cu_pos_y & 4) >> 1);
1595*c83a76b0SSuyog Pawar
1596*c83a76b0SSuyog Pawar WORD32 i4_16x16_id = ((cu_pos_x & 2) >> 1) + ((cu_pos_y & 2));
1597*c83a76b0SSuyog Pawar
1598*c83a76b0SSuyog Pawar WORD32 i4_8x8_id = (cu_pos_x & 1) + ((cu_pos_y & 1) << 1);
1599*c83a76b0SSuyog Pawar if(i4_ctb_y_off == 0)
1600*c83a76b0SSuyog Pawar {
1601*c83a76b0SSuyog Pawar /* No wait for 1st row */
1602*c83a76b0SSuyog Pawar cu_top_right_offset = -(MAX_CTB_SIZE);
1603*c83a76b0SSuyog Pawar {
1604*c83a76b0SSuyog Pawar ihevce_tile_params_t *ps_col_tile_params =
1605*c83a76b0SSuyog Pawar ((ihevce_tile_params_t *)ps_ctxt->pv_tile_params_base + ps_ctxt->i4_tile_col_idx);
1606*c83a76b0SSuyog Pawar
1607*c83a76b0SSuyog Pawar cu_top_right_offset = -(ps_col_tile_params->i4_first_sample_x + (MAX_CTB_SIZE));
1608*c83a76b0SSuyog Pawar }
1609*c83a76b0SSuyog Pawar
1610*c83a76b0SSuyog Pawar cu_top_right_dep_pos = 0;
1611*c83a76b0SSuyog Pawar }
1612*c83a76b0SSuyog Pawar else
1613*c83a76b0SSuyog Pawar {
1614*c83a76b0SSuyog Pawar cu_top_right_offset = ps_cu_tree_analyse->u1_cu_size << 1;
1615*c83a76b0SSuyog Pawar cu_top_right_dep_pos = (i4_ctb_y_off >> 6) - 1;
1616*c83a76b0SSuyog Pawar }
1617*c83a76b0SSuyog Pawar ps_cu_analyse = &s_cu_analyse;
1618*c83a76b0SSuyog Pawar
1619*c83a76b0SSuyog Pawar ps_cu_analyse->b3_cu_pos_x = cu_pos_x;
1620*c83a76b0SSuyog Pawar ps_cu_analyse->b3_cu_pos_y = cu_pos_y;
1621*c83a76b0SSuyog Pawar ps_cu_analyse->u1_cu_size = ps_cu_tree_analyse->u1_cu_size;
1622*c83a76b0SSuyog Pawar
1623*c83a76b0SSuyog Pawar /* Default initializations */
1624*c83a76b0SSuyog Pawar ps_cu_analyse->u1_num_intra_rdopt_cands = MAX_INTRA_CU_CANDIDATES;
1625*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.au1_intra_luma_modes_nxn[0][0] = 255;
1626*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.au1_intra_luma_modes_2nx2n_tu_eq_cu[0] = 255;
1627*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2[0] = 255;
1628*c83a76b0SSuyog Pawar
1629*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.b1_eval_tx_cusize = 1;
1630*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.b1_eval_tx_cusize_by2 = 1;
1631*c83a76b0SSuyog Pawar
1632*c83a76b0SSuyog Pawar switch(ps_cu_tree_analyse->u1_cu_size)
1633*c83a76b0SSuyog Pawar {
1634*c83a76b0SSuyog Pawar case 64:
1635*c83a76b0SSuyog Pawar {
1636*c83a76b0SSuyog Pawar memcpy(
1637*c83a76b0SSuyog Pawar ps_cu_analyse[0].i4_act_factor,
1638*c83a76b0SSuyog Pawar ps_cur_ipe_ctb->i4_64x64_act_factor,
1639*c83a76b0SSuyog Pawar 4 * 2 * sizeof(WORD32));
1640*c83a76b0SSuyog Pawar
1641*c83a76b0SSuyog Pawar ps_cu_analyse[0].s_cu_intra_cand.b1_eval_tx_cusize = 0;
1642*c83a76b0SSuyog Pawar ps_cu_analyse[0].s_cu_intra_cand.b1_eval_tx_cusize_by2 = 1;
1643*c83a76b0SSuyog Pawar ps_cu_analyse[0].s_cu_intra_cand.au1_intra_luma_modes_2nx2n_tu_eq_cu[0] = 255;
1644*c83a76b0SSuyog Pawar
1645*c83a76b0SSuyog Pawar break;
1646*c83a76b0SSuyog Pawar }
1647*c83a76b0SSuyog Pawar case 32:
1648*c83a76b0SSuyog Pawar {
1649*c83a76b0SSuyog Pawar memcpy(
1650*c83a76b0SSuyog Pawar ps_cu_analyse[0].i4_act_factor,
1651*c83a76b0SSuyog Pawar ps_cur_ipe_ctb->i4_32x32_act_factor[i4_32x32_id],
1652*c83a76b0SSuyog Pawar 3 * 2 * sizeof(WORD32));
1653*c83a76b0SSuyog Pawar
1654*c83a76b0SSuyog Pawar break;
1655*c83a76b0SSuyog Pawar }
1656*c83a76b0SSuyog Pawar case 16:
1657*c83a76b0SSuyog Pawar {
1658*c83a76b0SSuyog Pawar memcpy(
1659*c83a76b0SSuyog Pawar ps_cu_analyse[0].i4_act_factor,
1660*c83a76b0SSuyog Pawar ps_cur_ipe_ctb->i4_16x16_act_factor[(i4_32x32_id << 2) + i4_16x16_id],
1661*c83a76b0SSuyog Pawar 2 * 2 * sizeof(WORD32));
1662*c83a76b0SSuyog Pawar
1663*c83a76b0SSuyog Pawar break;
1664*c83a76b0SSuyog Pawar }
1665*c83a76b0SSuyog Pawar case 8:
1666*c83a76b0SSuyog Pawar {
1667*c83a76b0SSuyog Pawar memcpy(
1668*c83a76b0SSuyog Pawar ps_cu_analyse[0].i4_act_factor,
1669*c83a76b0SSuyog Pawar ps_cur_ipe_ctb->i4_16x16_act_factor[(i4_32x32_id << 2) + i4_16x16_id],
1670*c83a76b0SSuyog Pawar 2 * 2 * sizeof(WORD32));
1671*c83a76b0SSuyog Pawar
1672*c83a76b0SSuyog Pawar break;
1673*c83a76b0SSuyog Pawar }
1674*c83a76b0SSuyog Pawar }
1675*c83a76b0SSuyog Pawar
1676*c83a76b0SSuyog Pawar /* Populate the me data in cu_analyse struct */
1677*c83a76b0SSuyog Pawar /* For CU size 32 and 64, add me data to array of cu analyse struct */
1678*c83a76b0SSuyog Pawar if(ISLICE != ps_ctxt->i1_slice_type)
1679*c83a76b0SSuyog Pawar {
1680*c83a76b0SSuyog Pawar if((ps_cu_tree_analyse->u1_cu_size >= 32) && (ps_cu_tree_analyse->u1_inter_eval_enable))
1681*c83a76b0SSuyog Pawar {
1682*c83a76b0SSuyog Pawar if(32 == ps_cu_tree_analyse->u1_cu_size)
1683*c83a76b0SSuyog Pawar {
1684*c83a76b0SSuyog Pawar ihevce_populate_cu_struct(
1685*c83a76b0SSuyog Pawar ps_ctxt,
1686*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
1687*c83a76b0SSuyog Pawar ps_cu_tree_analyse,
1688*c83a76b0SSuyog Pawar ps_cu_me_data->as_32x32_block_data[i4_32x32_id].as_best_results,
1689*c83a76b0SSuyog Pawar ps_cu_analyse,
1690*c83a76b0SSuyog Pawar i4_32x32_id,
1691*c83a76b0SSuyog Pawar #if DISABLE_INTRA_WHEN_NOISY && USE_NOISE_TERM_IN_ENC_LOOP
1692*c83a76b0SSuyog Pawar ps_cu_prms->u1_is_cu_noisy,
1693*c83a76b0SSuyog Pawar #endif
1694*c83a76b0SSuyog Pawar ps_cu_me_data->as_32x32_block_data[i4_32x32_id].num_best_results);
1695*c83a76b0SSuyog Pawar }
1696*c83a76b0SSuyog Pawar else
1697*c83a76b0SSuyog Pawar {
1698*c83a76b0SSuyog Pawar ihevce_populate_cu_struct(
1699*c83a76b0SSuyog Pawar ps_ctxt,
1700*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
1701*c83a76b0SSuyog Pawar ps_cu_tree_analyse,
1702*c83a76b0SSuyog Pawar ps_cu_me_data->s_64x64_block_data.as_best_results,
1703*c83a76b0SSuyog Pawar ps_cu_analyse,
1704*c83a76b0SSuyog Pawar i4_32x32_id,
1705*c83a76b0SSuyog Pawar #if DISABLE_INTRA_WHEN_NOISY && USE_NOISE_TERM_IN_ENC_LOOP
1706*c83a76b0SSuyog Pawar ps_cu_prms->u1_is_cu_noisy,
1707*c83a76b0SSuyog Pawar #endif
1708*c83a76b0SSuyog Pawar ps_cu_me_data->s_64x64_block_data.num_best_results);
1709*c83a76b0SSuyog Pawar }
1710*c83a76b0SSuyog Pawar }
1711*c83a76b0SSuyog Pawar else if(ps_cu_tree_analyse->u1_cu_size < 32)
1712*c83a76b0SSuyog Pawar {
1713*c83a76b0SSuyog Pawar i4_8x8_id += (i4_32x32_id << 4) + (i4_16x16_id << 2);
1714*c83a76b0SSuyog Pawar i4_16x16_id += (i4_32x32_id << 2);
1715*c83a76b0SSuyog Pawar
1716*c83a76b0SSuyog Pawar if(16 == ps_cu_tree_analyse->u1_cu_size)
1717*c83a76b0SSuyog Pawar {
1718*c83a76b0SSuyog Pawar block_data_16x16_t *ps_data = &ps_cu_me_data->as_block_data[i4_16x16_id];
1719*c83a76b0SSuyog Pawar
1720*c83a76b0SSuyog Pawar if(ps_cu_tree_analyse->u1_inter_eval_enable)
1721*c83a76b0SSuyog Pawar {
1722*c83a76b0SSuyog Pawar ihevce_populate_cu_struct(
1723*c83a76b0SSuyog Pawar ps_ctxt,
1724*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
1725*c83a76b0SSuyog Pawar ps_cu_tree_analyse,
1726*c83a76b0SSuyog Pawar ps_data->as_best_results,
1727*c83a76b0SSuyog Pawar ps_cu_analyse,
1728*c83a76b0SSuyog Pawar i4_32x32_id,
1729*c83a76b0SSuyog Pawar #if DISABLE_INTRA_WHEN_NOISY && USE_NOISE_TERM_IN_ENC_LOOP
1730*c83a76b0SSuyog Pawar ps_cu_prms->u1_is_cu_noisy,
1731*c83a76b0SSuyog Pawar #endif
1732*c83a76b0SSuyog Pawar ps_data->num_best_results);
1733*c83a76b0SSuyog Pawar }
1734*c83a76b0SSuyog Pawar else
1735*c83a76b0SSuyog Pawar {
1736*c83a76b0SSuyog Pawar ps_cu_analyse->u1_num_inter_cands = 0;
1737*c83a76b0SSuyog Pawar ps_cu_analyse->u1_best_is_intra = 1;
1738*c83a76b0SSuyog Pawar }
1739*c83a76b0SSuyog Pawar }
1740*c83a76b0SSuyog Pawar else /* If CU size is 8 */
1741*c83a76b0SSuyog Pawar {
1742*c83a76b0SSuyog Pawar block_data_8x8_t *ps_data = &ps_cu_me_data->as_8x8_block_data[i4_8x8_id];
1743*c83a76b0SSuyog Pawar
1744*c83a76b0SSuyog Pawar if(ps_cu_tree_analyse->u1_inter_eval_enable)
1745*c83a76b0SSuyog Pawar {
1746*c83a76b0SSuyog Pawar ihevce_populate_cu_struct(
1747*c83a76b0SSuyog Pawar ps_ctxt,
1748*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
1749*c83a76b0SSuyog Pawar ps_cu_tree_analyse,
1750*c83a76b0SSuyog Pawar ps_data->as_best_results,
1751*c83a76b0SSuyog Pawar ps_cu_analyse,
1752*c83a76b0SSuyog Pawar i4_32x32_id,
1753*c83a76b0SSuyog Pawar #if DISABLE_INTRA_WHEN_NOISY && USE_NOISE_TERM_IN_ENC_LOOP
1754*c83a76b0SSuyog Pawar ps_cu_prms->u1_is_cu_noisy,
1755*c83a76b0SSuyog Pawar #endif
1756*c83a76b0SSuyog Pawar ps_data->num_best_results);
1757*c83a76b0SSuyog Pawar }
1758*c83a76b0SSuyog Pawar else
1759*c83a76b0SSuyog Pawar {
1760*c83a76b0SSuyog Pawar ps_cu_analyse->u1_num_inter_cands = 0;
1761*c83a76b0SSuyog Pawar ps_cu_analyse->u1_best_is_intra = 1;
1762*c83a76b0SSuyog Pawar }
1763*c83a76b0SSuyog Pawar }
1764*c83a76b0SSuyog Pawar }
1765*c83a76b0SSuyog Pawar else
1766*c83a76b0SSuyog Pawar {
1767*c83a76b0SSuyog Pawar ps_cu_analyse->u1_num_inter_cands = 0;
1768*c83a76b0SSuyog Pawar ps_cu_analyse->u1_best_is_intra = 1;
1769*c83a76b0SSuyog Pawar }
1770*c83a76b0SSuyog Pawar }
1771*c83a76b0SSuyog Pawar else
1772*c83a76b0SSuyog Pawar {
1773*c83a76b0SSuyog Pawar ps_cu_analyse->u1_num_inter_cands = 0;
1774*c83a76b0SSuyog Pawar ps_cu_analyse->u1_best_is_intra = 1;
1775*c83a76b0SSuyog Pawar }
1776*c83a76b0SSuyog Pawar
1777*c83a76b0SSuyog Pawar if(!ps_ctxt->i1_cu_qp_delta_enable)
1778*c83a76b0SSuyog Pawar {
1779*c83a76b0SSuyog Pawar ps_cu_analyse->i1_cu_qp = ps_ctxt->i4_frame_qp;
1780*c83a76b0SSuyog Pawar
1781*c83a76b0SSuyog Pawar /*cu qp must be populated in cu_analyse_t struct*/
1782*c83a76b0SSuyog Pawar ps_ctxt->i4_cu_qp = ps_cu_analyse->i1_cu_qp;
1783*c83a76b0SSuyog Pawar }
1784*c83a76b0SSuyog Pawar else
1785*c83a76b0SSuyog Pawar {
1786*c83a76b0SSuyog Pawar ASSERT(ps_cu_analyse->i4_act_factor[0] > 0);
1787*c83a76b0SSuyog Pawar ASSERT(
1788*c83a76b0SSuyog Pawar ((ps_cu_analyse->i4_act_factor[1] > 0) && (ps_cu_analyse->u1_cu_size != 8)) ||
1789*c83a76b0SSuyog Pawar ((ps_cu_analyse->u1_cu_size == 8)));
1790*c83a76b0SSuyog Pawar ASSERT(
1791*c83a76b0SSuyog Pawar ((ps_cu_analyse->i4_act_factor[2] > 0) && (ps_cu_analyse->u1_cu_size == 32)) ||
1792*c83a76b0SSuyog Pawar ((ps_cu_analyse->u1_cu_size != 32)));
1793*c83a76b0SSuyog Pawar }
1794*c83a76b0SSuyog Pawar
1795*c83a76b0SSuyog Pawar if(ps_ctxt->u1_disable_intra_eval)
1796*c83a76b0SSuyog Pawar {
1797*c83a76b0SSuyog Pawar /* rdopt evaluation of intra disabled as inter is clear winner */
1798*c83a76b0SSuyog Pawar ps_cu_analyse->u1_num_intra_rdopt_cands = 0;
1799*c83a76b0SSuyog Pawar
1800*c83a76b0SSuyog Pawar /* all the modes invalidated */
1801*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.au1_intra_luma_modes_2nx2n_tu_eq_cu[0] = 255;
1802*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2[0] = 255;
1803*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.au1_intra_luma_modes_nxn[0][0] = 255;
1804*c83a76b0SSuyog Pawar ps_cu_analyse->u1_chroma_intra_pred_mode = 255;
1805*c83a76b0SSuyog Pawar
1806*c83a76b0SSuyog Pawar /* no intra candt to verify */
1807*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.b6_num_intra_cands = 0;
1808*c83a76b0SSuyog Pawar }
1809*c83a76b0SSuyog Pawar
1810*c83a76b0SSuyog Pawar #if DISABLE_L2_IPE_IN_PB_L1_IN_B
1811*c83a76b0SSuyog Pawar if((ps_ctxt->i4_quality_preset == IHEVCE_QUALITY_P6) && (ps_cu_analyse->u1_cu_size == 32) &&
1812*c83a76b0SSuyog Pawar (ps_ctxt->i1_slice_type != ISLICE))
1813*c83a76b0SSuyog Pawar {
1814*c83a76b0SSuyog Pawar /* rdopt evaluation of intra disabled as inter is clear winner */
1815*c83a76b0SSuyog Pawar ps_cu_analyse->u1_num_intra_rdopt_cands = 0;
1816*c83a76b0SSuyog Pawar
1817*c83a76b0SSuyog Pawar /* all the modes invalidated */
1818*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.au1_intra_luma_modes_2nx2n_tu_eq_cu[0] = 255;
1819*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.au1_intra_luma_modes_2nx2n_tu_eq_cu_by_2[0] = 255;
1820*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.au1_intra_luma_modes_nxn[0][0] = 255;
1821*c83a76b0SSuyog Pawar ps_cu_analyse->u1_chroma_intra_pred_mode = 255;
1822*c83a76b0SSuyog Pawar
1823*c83a76b0SSuyog Pawar /* no intra candt to verify */
1824*c83a76b0SSuyog Pawar ps_cu_analyse->s_cu_intra_cand.b6_num_intra_cands = 0;
1825*c83a76b0SSuyog Pawar }
1826*c83a76b0SSuyog Pawar #endif
1827*c83a76b0SSuyog Pawar
1828*c83a76b0SSuyog Pawar if(DISABLE_INTRA_WHEN_NOISY && ps_cu_prms->u1_is_cu_noisy)
1829*c83a76b0SSuyog Pawar {
1830*c83a76b0SSuyog Pawar ps_cu_analyse->u1_num_intra_rdopt_cands = 0;
1831*c83a76b0SSuyog Pawar }
1832*c83a76b0SSuyog Pawar
1833*c83a76b0SSuyog Pawar if(ps_cu_analyse->u1_num_intra_rdopt_cands || ps_cu_tree_analyse->u1_intra_eval_enable)
1834*c83a76b0SSuyog Pawar {
1835*c83a76b0SSuyog Pawar ihevce_intra_mode_populator(
1836*c83a76b0SSuyog Pawar &ps_cu_analyse->s_cu_intra_cand,
1837*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
1838*c83a76b0SSuyog Pawar ps_cu_tree_analyse,
1839*c83a76b0SSuyog Pawar ps_ctxt->i1_slice_type,
1840*c83a76b0SSuyog Pawar ps_ctxt->i4_quality_preset);
1841*c83a76b0SSuyog Pawar
1842*c83a76b0SSuyog Pawar ps_cu_analyse->u1_num_intra_rdopt_cands = 1;
1843*c83a76b0SSuyog Pawar }
1844*c83a76b0SSuyog Pawar
1845*c83a76b0SSuyog Pawar ASSERT(!!ps_cu_analyse->u1_num_intra_rdopt_cands || ps_cu_analyse->u1_num_inter_cands);
1846*c83a76b0SSuyog Pawar
1847*c83a76b0SSuyog Pawar if(ps_ctxt->u1_use_top_at_ctb_boundary)
1848*c83a76b0SSuyog Pawar {
1849*c83a76b0SSuyog Pawar /* Wait till top data is ready */
1850*c83a76b0SSuyog Pawar /* Currently checking till top right CU */
1851*c83a76b0SSuyog Pawar curr_cu_pos_in_row = i4_ctb_x_off + (ps_cu_analyse->b3_cu_pos_x << 3);
1852*c83a76b0SSuyog Pawar
1853*c83a76b0SSuyog Pawar if(0 == ps_cu_analyse->b3_cu_pos_y)
1854*c83a76b0SSuyog Pawar {
1855*c83a76b0SSuyog Pawar ihevce_dmgr_chk_row_row_sync(
1856*c83a76b0SSuyog Pawar ps_ctxt->pv_dep_mngr_enc_loop_cu_top_right,
1857*c83a76b0SSuyog Pawar curr_cu_pos_in_row,
1858*c83a76b0SSuyog Pawar cu_top_right_offset,
1859*c83a76b0SSuyog Pawar cu_top_right_dep_pos,
1860*c83a76b0SSuyog Pawar ps_ctxt->i4_tile_col_idx, /* Col Tile No. */
1861*c83a76b0SSuyog Pawar ps_ctxt->thrd_id);
1862*c83a76b0SSuyog Pawar }
1863*c83a76b0SSuyog Pawar }
1864*c83a76b0SSuyog Pawar
1865*c83a76b0SSuyog Pawar #if !DISABLE_TOP_SYNC
1866*c83a76b0SSuyog Pawar {
1867*c83a76b0SSuyog Pawar if(0 == ps_cu_analyse->b3_cu_pos_y)
1868*c83a76b0SSuyog Pawar {
1869*c83a76b0SSuyog Pawar if((0 == i4_ctb_x_off) && (i4_ctb_y_off != 0))
1870*c83a76b0SSuyog Pawar {
1871*c83a76b0SSuyog Pawar if(ps_cu_analyse->b3_cu_pos_x == 0)
1872*c83a76b0SSuyog Pawar {
1873*c83a76b0SSuyog Pawar if(!ps_ctxt->u1_use_top_at_ctb_boundary)
1874*c83a76b0SSuyog Pawar {
1875*c83a76b0SSuyog Pawar /* Wait till top data is ready */
1876*c83a76b0SSuyog Pawar /* Currently checking till top right CU */
1877*c83a76b0SSuyog Pawar curr_cu_pos_in_row = i4_ctb_x_off + (ps_cu_analyse->b3_cu_pos_x << 3);
1878*c83a76b0SSuyog Pawar
1879*c83a76b0SSuyog Pawar if(0 == ps_cu_analyse->b3_cu_pos_y)
1880*c83a76b0SSuyog Pawar {
1881*c83a76b0SSuyog Pawar ihevce_dmgr_chk_row_row_sync(
1882*c83a76b0SSuyog Pawar ps_ctxt->pv_dep_mngr_enc_loop_cu_top_right,
1883*c83a76b0SSuyog Pawar curr_cu_pos_in_row,
1884*c83a76b0SSuyog Pawar cu_top_right_offset,
1885*c83a76b0SSuyog Pawar cu_top_right_dep_pos,
1886*c83a76b0SSuyog Pawar ps_ctxt->i4_tile_col_idx, /* Col Tile No. */
1887*c83a76b0SSuyog Pawar ps_ctxt->thrd_id);
1888*c83a76b0SSuyog Pawar }
1889*c83a76b0SSuyog Pawar }
1890*c83a76b0SSuyog Pawar
1891*c83a76b0SSuyog Pawar ihevce_entropy_rdo_copy_states(
1892*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt,
1893*c83a76b0SSuyog Pawar ps_ctxt->pu1_top_rt_cabac_state,
1894*c83a76b0SSuyog Pawar UPDATE_ENT_SYNC_RDO_STATE);
1895*c83a76b0SSuyog Pawar }
1896*c83a76b0SSuyog Pawar }
1897*c83a76b0SSuyog Pawar }
1898*c83a76b0SSuyog Pawar }
1899*c83a76b0SSuyog Pawar #else
1900*c83a76b0SSuyog Pawar {
1901*c83a76b0SSuyog Pawar if((0 == ps_cu_analyse->b3_cu_pos_y) && (IHEVCE_QUALITY_P6 != ps_ctxt->i4_quality_preset))
1902*c83a76b0SSuyog Pawar {
1903*c83a76b0SSuyog Pawar if((0 == i4_ctb_x_off) && (i4_ctb_y_off != 0))
1904*c83a76b0SSuyog Pawar {
1905*c83a76b0SSuyog Pawar if(ps_cu_analyse->b3_cu_pos_x == 0)
1906*c83a76b0SSuyog Pawar {
1907*c83a76b0SSuyog Pawar if(!ps_ctxt->u1_use_top_at_ctb_boundary)
1908*c83a76b0SSuyog Pawar {
1909*c83a76b0SSuyog Pawar /* Wait till top data is ready */
1910*c83a76b0SSuyog Pawar /* Currently checking till top right CU */
1911*c83a76b0SSuyog Pawar curr_cu_pos_in_row = i4_ctb_x_off + (ps_cu_analyse->b3_cu_pos_x << 3);
1912*c83a76b0SSuyog Pawar
1913*c83a76b0SSuyog Pawar if(0 == ps_cu_analyse->b3_cu_pos_y)
1914*c83a76b0SSuyog Pawar {
1915*c83a76b0SSuyog Pawar ihevce_dmgr_chk_row_row_sync(
1916*c83a76b0SSuyog Pawar ps_ctxt->pv_dep_mngr_enc_loop_cu_top_right,
1917*c83a76b0SSuyog Pawar curr_cu_pos_in_row,
1918*c83a76b0SSuyog Pawar cu_top_right_offset,
1919*c83a76b0SSuyog Pawar cu_top_right_dep_pos,
1920*c83a76b0SSuyog Pawar ps_ctxt->i4_tile_col_idx, /* Col Tile No. */
1921*c83a76b0SSuyog Pawar ps_ctxt->thrd_id);
1922*c83a76b0SSuyog Pawar }
1923*c83a76b0SSuyog Pawar }
1924*c83a76b0SSuyog Pawar
1925*c83a76b0SSuyog Pawar ihevce_entropy_rdo_copy_states(
1926*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt,
1927*c83a76b0SSuyog Pawar ps_ctxt->pu1_top_rt_cabac_state,
1928*c83a76b0SSuyog Pawar UPDATE_ENT_SYNC_RDO_STATE);
1929*c83a76b0SSuyog Pawar }
1930*c83a76b0SSuyog Pawar }
1931*c83a76b0SSuyog Pawar }
1932*c83a76b0SSuyog Pawar else if((0 == ps_cu_analyse->b3_cu_pos_y) && (IHEVCE_QUALITY_P6 == ps_ctxt->i4_quality_preset))
1933*c83a76b0SSuyog Pawar {
1934*c83a76b0SSuyog Pawar UWORD8 u1_cabac_init_idc;
1935*c83a76b0SSuyog Pawar WORD8 i1_cabac_init_flag =
1936*c83a76b0SSuyog Pawar ps_ctxt->s_rdopt_entropy_ctxt.as_cu_entropy_ctxt->ps_slice_hdr->i1_cabac_init_flag;
1937*c83a76b0SSuyog Pawar
1938*c83a76b0SSuyog Pawar if(ps_ctxt->i1_slice_type == ISLICE)
1939*c83a76b0SSuyog Pawar {
1940*c83a76b0SSuyog Pawar u1_cabac_init_idc = 0;
1941*c83a76b0SSuyog Pawar }
1942*c83a76b0SSuyog Pawar else if(ps_ctxt->i1_slice_type == PSLICE)
1943*c83a76b0SSuyog Pawar {
1944*c83a76b0SSuyog Pawar u1_cabac_init_idc = i1_cabac_init_flag ? 2 : 1;
1945*c83a76b0SSuyog Pawar }
1946*c83a76b0SSuyog Pawar else
1947*c83a76b0SSuyog Pawar {
1948*c83a76b0SSuyog Pawar u1_cabac_init_idc = i1_cabac_init_flag ? 1 : 2;
1949*c83a76b0SSuyog Pawar }
1950*c83a76b0SSuyog Pawar
1951*c83a76b0SSuyog Pawar ihevce_entropy_rdo_copy_states(
1952*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt,
1953*c83a76b0SSuyog Pawar (UWORD8 *)gau1_ihevc_cab_ctxts[u1_cabac_init_idc][ps_ctxt->i4_frame_qp],
1954*c83a76b0SSuyog Pawar UPDATE_ENT_SYNC_RDO_STATE);
1955*c83a76b0SSuyog Pawar }
1956*c83a76b0SSuyog Pawar }
1957*c83a76b0SSuyog Pawar #endif
1958*c83a76b0SSuyog Pawar
1959*c83a76b0SSuyog Pawar /*2 Multi- dimensinal array based on trans size of rounding factor to be added here */
1960*c83a76b0SSuyog Pawar /* arrays are for rounding factor corr. to 0-1 decision and 1-2 decision */
1961*c83a76b0SSuyog Pawar /* Currently the complete array will contain only single value*/
1962*c83a76b0SSuyog Pawar /*The rounding factor is calculated with the formula
1963*c83a76b0SSuyog Pawar Deadzone val = (((R1 - R0) * (2^(-8/3)) * lamMod) + 1)/2
1964*c83a76b0SSuyog Pawar rounding factor = (1 - DeadZone Val)
1965*c83a76b0SSuyog Pawar
1966*c83a76b0SSuyog Pawar Assumption: Cabac states of All the sub-blocks in the TU are considered independent
1967*c83a76b0SSuyog Pawar */
1968*c83a76b0SSuyog Pawar
1969*c83a76b0SSuyog Pawar /*As long as coef level rdoq is enabled perform this operation */
1970*c83a76b0SSuyog Pawar is_first_cu_in_ctb = ((0 == ps_cu_analyse->b3_cu_pos_x) && (0 == ps_cu_analyse->b3_cu_pos_y));
1971*c83a76b0SSuyog Pawar is_ctb_level_quant_rounding =
1972*c83a76b0SSuyog Pawar ((ps_ctxt->i4_quant_rounding_level == CTB_LEVEL_QUANT_ROUNDING) &&
1973*c83a76b0SSuyog Pawar (1 == is_first_cu_in_ctb));
1974*c83a76b0SSuyog Pawar is_nctb_level_quant_rounding =
1975*c83a76b0SSuyog Pawar ((ps_ctxt->i4_quant_rounding_level == NCTB_LEVEL_QUANT_ROUNDING) &&
1976*c83a76b0SSuyog Pawar (1 == is_first_cu_in_ctb) && (((i4_ctb_x_off >> 6) % NUM_CTB_QUANT_ROUNDING) == 0));
1977*c83a76b0SSuyog Pawar
1978*c83a76b0SSuyog Pawar if((ps_ctxt->i4_quant_rounding_level == CU_LEVEL_QUANT_ROUNDING) ||
1979*c83a76b0SSuyog Pawar (ps_ctxt->i4_quant_rounding_level == TU_LEVEL_QUANT_ROUNDING) ||
1980*c83a76b0SSuyog Pawar (1 == is_ctb_level_quant_rounding) || (1 == is_nctb_level_quant_rounding))
1981*c83a76b0SSuyog Pawar {
1982*c83a76b0SSuyog Pawar double i4_lamda_modifier, i4_lamda_modifier_uv;
1983*c83a76b0SSuyog Pawar WORD32 trans_size, trans_size_cr;
1984*c83a76b0SSuyog Pawar trans_size = ps_cu_analyse->u1_cu_size;
1985*c83a76b0SSuyog Pawar
1986*c83a76b0SSuyog Pawar if((1 == is_ctb_level_quant_rounding) || (1 == is_nctb_level_quant_rounding))
1987*c83a76b0SSuyog Pawar {
1988*c83a76b0SSuyog Pawar trans_size = MAX_TU_SIZE;
1989*c83a76b0SSuyog Pawar }
1990*c83a76b0SSuyog Pawar else
1991*c83a76b0SSuyog Pawar {
1992*c83a76b0SSuyog Pawar if(ps_cu_analyse->u1_cu_size == 64)
1993*c83a76b0SSuyog Pawar {
1994*c83a76b0SSuyog Pawar trans_size >>= 1;
1995*c83a76b0SSuyog Pawar }
1996*c83a76b0SSuyog Pawar }
1997*c83a76b0SSuyog Pawar
1998*c83a76b0SSuyog Pawar /*Chroma trans size = half of luma trans size */
1999*c83a76b0SSuyog Pawar trans_size_cr = trans_size >> 1;
2000*c83a76b0SSuyog Pawar
2001*c83a76b0SSuyog Pawar if((BSLICE == ps_ctxt->i1_slice_type) && (ps_ctxt->i4_temporal_layer_id))
2002*c83a76b0SSuyog Pawar {
2003*c83a76b0SSuyog Pawar i4_lamda_modifier = ps_ctxt->i4_lamda_modifier *
2004*c83a76b0SSuyog Pawar CLIP3((((double)(ps_ctxt->i4_cu_qp - 12)) / 6.0), 2.00, 4.00);
2005*c83a76b0SSuyog Pawar i4_lamda_modifier_uv =
2006*c83a76b0SSuyog Pawar ps_ctxt->i4_uv_lamda_modifier *
2007*c83a76b0SSuyog Pawar CLIP3((((double)(ps_ctxt->i4_chrm_cu_qp - 12)) / 6.0), 2.00, 4.00);
2008*c83a76b0SSuyog Pawar }
2009*c83a76b0SSuyog Pawar else
2010*c83a76b0SSuyog Pawar {
2011*c83a76b0SSuyog Pawar i4_lamda_modifier = ps_ctxt->i4_lamda_modifier;
2012*c83a76b0SSuyog Pawar i4_lamda_modifier_uv = ps_ctxt->i4_uv_lamda_modifier;
2013*c83a76b0SSuyog Pawar }
2014*c83a76b0SSuyog Pawar if(ps_ctxt->i4_use_const_lamda_modifier)
2015*c83a76b0SSuyog Pawar {
2016*c83a76b0SSuyog Pawar if(ISLICE == ps_ctxt->i1_slice_type)
2017*c83a76b0SSuyog Pawar {
2018*c83a76b0SSuyog Pawar i4_lamda_modifier = ps_ctxt->f_i_pic_lamda_modifier;
2019*c83a76b0SSuyog Pawar i4_lamda_modifier_uv = ps_ctxt->f_i_pic_lamda_modifier;
2020*c83a76b0SSuyog Pawar }
2021*c83a76b0SSuyog Pawar else
2022*c83a76b0SSuyog Pawar {
2023*c83a76b0SSuyog Pawar i4_lamda_modifier = CONST_LAMDA_MOD_VAL;
2024*c83a76b0SSuyog Pawar i4_lamda_modifier_uv = CONST_LAMDA_MOD_VAL;
2025*c83a76b0SSuyog Pawar }
2026*c83a76b0SSuyog Pawar }
2027*c83a76b0SSuyog Pawar
2028*c83a76b0SSuyog Pawar do
2029*c83a76b0SSuyog Pawar {
2030*c83a76b0SSuyog Pawar memset(
2031*c83a76b0SSuyog Pawar ps_ctxt->pi4_quant_round_factor_cu_ctb_0_1[trans_size >> 3],
2032*c83a76b0SSuyog Pawar 0,
2033*c83a76b0SSuyog Pawar trans_size * trans_size * sizeof(WORD32));
2034*c83a76b0SSuyog Pawar memset(
2035*c83a76b0SSuyog Pawar ps_ctxt->pi4_quant_round_factor_cu_ctb_1_2[trans_size >> 3],
2036*c83a76b0SSuyog Pawar 0,
2037*c83a76b0SSuyog Pawar trans_size * trans_size * sizeof(WORD32));
2038*c83a76b0SSuyog Pawar
2039*c83a76b0SSuyog Pawar /*ps_ctxt->i4_quant_rnd_factor[intra_flag], is currently not used */
2040*c83a76b0SSuyog Pawar ihevce_quant_rounding_factor_gen(
2041*c83a76b0SSuyog Pawar trans_size,
2042*c83a76b0SSuyog Pawar 1, //is_luma = 1
2043*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt,
2044*c83a76b0SSuyog Pawar ps_ctxt->pi4_quant_round_factor_cu_ctb_0_1[trans_size >> 3],
2045*c83a76b0SSuyog Pawar ps_ctxt->pi4_quant_round_factor_cu_ctb_1_2[trans_size >> 3],
2046*c83a76b0SSuyog Pawar i4_lamda_modifier,
2047*c83a76b0SSuyog Pawar 0); //is_tu_level_quant rounding = 0
2048*c83a76b0SSuyog Pawar
2049*c83a76b0SSuyog Pawar trans_size = trans_size >> 1;
2050*c83a76b0SSuyog Pawar
2051*c83a76b0SSuyog Pawar } while(trans_size >= 4);
2052*c83a76b0SSuyog Pawar
2053*c83a76b0SSuyog Pawar /*CHROMA Quant Rounding is to be enabled with CU/TU/CTB/NCTB Luma rounding */
2054*c83a76b0SSuyog Pawar /*Please note chroma is calcualted only for 1st TU at TU level Rounding */
2055*c83a76b0SSuyog Pawar if(ps_ctxt->i4_chroma_quant_rounding_level == CHROMA_QUANT_ROUNDING)
2056*c83a76b0SSuyog Pawar {
2057*c83a76b0SSuyog Pawar do
2058*c83a76b0SSuyog Pawar {
2059*c83a76b0SSuyog Pawar memset(
2060*c83a76b0SSuyog Pawar ps_ctxt->pi4_quant_round_factor_cr_cu_ctb_0_1[trans_size_cr >> 3],
2061*c83a76b0SSuyog Pawar 0,
2062*c83a76b0SSuyog Pawar trans_size_cr * trans_size_cr * sizeof(WORD32));
2063*c83a76b0SSuyog Pawar memset(
2064*c83a76b0SSuyog Pawar ps_ctxt->pi4_quant_round_factor_cr_cu_ctb_1_2[trans_size_cr >> 3],
2065*c83a76b0SSuyog Pawar 0,
2066*c83a76b0SSuyog Pawar trans_size_cr * trans_size_cr * sizeof(WORD32));
2067*c83a76b0SSuyog Pawar
2068*c83a76b0SSuyog Pawar ihevce_quant_rounding_factor_gen(
2069*c83a76b0SSuyog Pawar trans_size_cr,
2070*c83a76b0SSuyog Pawar 0, //is_luma = 0
2071*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt,
2072*c83a76b0SSuyog Pawar ps_ctxt->pi4_quant_round_factor_cr_cu_ctb_0_1[trans_size_cr >> 3],
2073*c83a76b0SSuyog Pawar ps_ctxt->pi4_quant_round_factor_cr_cu_ctb_1_2[trans_size_cr >> 3],
2074*c83a76b0SSuyog Pawar i4_lamda_modifier_uv,
2075*c83a76b0SSuyog Pawar 0); //is_tu_level_quant rounding = 0
2076*c83a76b0SSuyog Pawar
2077*c83a76b0SSuyog Pawar trans_size_cr = trans_size_cr >> 1;
2078*c83a76b0SSuyog Pawar
2079*c83a76b0SSuyog Pawar } while(trans_size_cr >= 4);
2080*c83a76b0SSuyog Pawar }
2081*c83a76b0SSuyog Pawar }
2082*c83a76b0SSuyog Pawar
2083*c83a76b0SSuyog Pawar #if DISABLE_INTRAS_IN_BPIC
2084*c83a76b0SSuyog Pawar if((ps_ctxt->i1_slice_type == BSLICE) && (ps_cu_analyse->u1_num_inter_cands))
2085*c83a76b0SSuyog Pawar {
2086*c83a76b0SSuyog Pawar ps_cu_analyse->u1_num_intra_rdopt_cands = 0;
2087*c83a76b0SSuyog Pawar }
2088*c83a76b0SSuyog Pawar #endif
2089*c83a76b0SSuyog Pawar
2090*c83a76b0SSuyog Pawar rdopt_best_cost = ihevce_cu_mode_decide(
2091*c83a76b0SSuyog Pawar ps_ctxt,
2092*c83a76b0SSuyog Pawar ps_cu_prms,
2093*c83a76b0SSuyog Pawar ps_cu_analyse,
2094*c83a76b0SSuyog Pawar ps_final_mode_state,
2095*c83a76b0SSuyog Pawar pu1_ecd_data,
2096*c83a76b0SSuyog Pawar ps_col_pu,
2097*c83a76b0SSuyog Pawar pu1_col_pu_map,
2098*c83a76b0SSuyog Pawar col_start_pu_idx);
2099*c83a76b0SSuyog Pawar
2100*c83a76b0SSuyog Pawar return rdopt_best_cost;
2101*c83a76b0SSuyog Pawar }
2102*c83a76b0SSuyog Pawar
2103*c83a76b0SSuyog Pawar /**
2104*c83a76b0SSuyog Pawar ******************************************************************************
2105*c83a76b0SSuyog Pawar * \if Function name : ihevce_enc_loop_cu_bot_copy \endif
2106*c83a76b0SSuyog Pawar *
2107*c83a76b0SSuyog Pawar * \brief
2108*c83a76b0SSuyog Pawar * This function copy the bottom data at CU level to row buffers
2109*c83a76b0SSuyog Pawar *
2110*c83a76b0SSuyog Pawar * \date
2111*c83a76b0SSuyog Pawar * 18/09/2012
2112*c83a76b0SSuyog Pawar *
2113*c83a76b0SSuyog Pawar * \author
2114*c83a76b0SSuyog Pawar * Ittiam
2115*c83a76b0SSuyog Pawar *
2116*c83a76b0SSuyog Pawar * \return
2117*c83a76b0SSuyog Pawar *
2118*c83a76b0SSuyog Pawar * List of Functions
2119*c83a76b0SSuyog Pawar *
2120*c83a76b0SSuyog Pawar *
2121*c83a76b0SSuyog Pawar ******************************************************************************
2122*c83a76b0SSuyog Pawar */
ihevce_enc_loop_cu_bot_copy(ihevce_enc_loop_ctxt_t * ps_ctxt,enc_loop_cu_prms_t * ps_cu_prms,ihevce_enc_cu_node_ctxt_t * ps_enc_out_ctxt,WORD32 curr_cu_pos_in_row,WORD32 curr_cu_pos_in_ctb)2123*c83a76b0SSuyog Pawar void ihevce_enc_loop_cu_bot_copy(
2124*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt,
2125*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms,
2126*c83a76b0SSuyog Pawar ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt,
2127*c83a76b0SSuyog Pawar WORD32 curr_cu_pos_in_row,
2128*c83a76b0SSuyog Pawar WORD32 curr_cu_pos_in_ctb)
2129*c83a76b0SSuyog Pawar {
2130*c83a76b0SSuyog Pawar /* ---------------------------------------------- */
2131*c83a76b0SSuyog Pawar /* copy the bottom row data to the row buffers */
2132*c83a76b0SSuyog Pawar /* ---------------------------------------------- */
2133*c83a76b0SSuyog Pawar nbr_4x4_t *ps_top_nbr;
2134*c83a76b0SSuyog Pawar UWORD8 *pu1_buff;
2135*c83a76b0SSuyog Pawar UWORD8 *pu1_luma_top, *pu1_chrm_top;
2136*c83a76b0SSuyog Pawar WORD32 nbr_strd;
2137*c83a76b0SSuyog Pawar
2138*c83a76b0SSuyog Pawar WORD32 u1_is_422 = (ps_ctxt->u1_chroma_array_type == 2);
2139*c83a76b0SSuyog Pawar
2140*c83a76b0SSuyog Pawar /* derive the appropraite pointers */
2141*c83a76b0SSuyog Pawar pu1_luma_top = (UWORD8 *)ps_ctxt->pv_bot_row_luma + curr_cu_pos_in_row;
2142*c83a76b0SSuyog Pawar pu1_chrm_top = (UWORD8 *)ps_ctxt->pv_bot_row_chroma + curr_cu_pos_in_row;
2143*c83a76b0SSuyog Pawar ps_top_nbr = ps_ctxt->ps_bot_row_nbr + (curr_cu_pos_in_row >> 2);
2144*c83a76b0SSuyog Pawar nbr_strd = ps_cu_prms->i4_ctb_size >> 2;
2145*c83a76b0SSuyog Pawar
2146*c83a76b0SSuyog Pawar /* copy bottom luma data */
2147*c83a76b0SSuyog Pawar pu1_buff = ps_cu_prms->pu1_luma_recon +
2148*c83a76b0SSuyog Pawar (ps_cu_prms->i4_luma_recon_stride * (ps_cu_prms->i4_ctb_size - 1));
2149*c83a76b0SSuyog Pawar
2150*c83a76b0SSuyog Pawar pu1_buff += curr_cu_pos_in_ctb;
2151*c83a76b0SSuyog Pawar
2152*c83a76b0SSuyog Pawar memcpy(pu1_luma_top, pu1_buff, ps_enc_out_ctxt->u1_cu_size);
2153*c83a76b0SSuyog Pawar
2154*c83a76b0SSuyog Pawar /* copy bottom chroma data cb and cr pixel interleaved */
2155*c83a76b0SSuyog Pawar pu1_buff = ps_cu_prms->pu1_chrm_recon + (ps_cu_prms->i4_chrm_recon_stride *
2156*c83a76b0SSuyog Pawar ((ps_cu_prms->i4_ctb_size >> (0 == u1_is_422)) - 1));
2157*c83a76b0SSuyog Pawar
2158*c83a76b0SSuyog Pawar pu1_buff += curr_cu_pos_in_ctb;
2159*c83a76b0SSuyog Pawar
2160*c83a76b0SSuyog Pawar memcpy(pu1_chrm_top, pu1_buff, ps_enc_out_ctxt->u1_cu_size);
2161*c83a76b0SSuyog Pawar
2162*c83a76b0SSuyog Pawar /* store the nbr 4x4 data at cu level */
2163*c83a76b0SSuyog Pawar {
2164*c83a76b0SSuyog Pawar nbr_4x4_t *ps_nbr;
2165*c83a76b0SSuyog Pawar
2166*c83a76b0SSuyog Pawar /* copy bottom nbr data */
2167*c83a76b0SSuyog Pawar ps_nbr = &ps_ctxt->as_ctb_nbr_arr[0];
2168*c83a76b0SSuyog Pawar ps_nbr += ((ps_cu_prms->i4_ctb_size >> 2) - 1) * nbr_strd;
2169*c83a76b0SSuyog Pawar
2170*c83a76b0SSuyog Pawar ps_nbr += (curr_cu_pos_in_ctb >> 2);
2171*c83a76b0SSuyog Pawar
2172*c83a76b0SSuyog Pawar memcpy(ps_top_nbr, ps_nbr, (ps_enc_out_ctxt->u1_cu_size >> 2) * sizeof(nbr_4x4_t));
2173*c83a76b0SSuyog Pawar }
2174*c83a76b0SSuyog Pawar return;
2175*c83a76b0SSuyog Pawar }
2176*c83a76b0SSuyog Pawar
2177*c83a76b0SSuyog Pawar /**
2178*c83a76b0SSuyog Pawar ******************************************************************************
2179*c83a76b0SSuyog Pawar * \if Function name : ihevce_update_final_cu_results \endif
2180*c83a76b0SSuyog Pawar *
2181*c83a76b0SSuyog Pawar * \brief
2182*c83a76b0SSuyog Pawar *
2183*c83a76b0SSuyog Pawar * \return
2184*c83a76b0SSuyog Pawar * None
2185*c83a76b0SSuyog Pawar *
2186*c83a76b0SSuyog Pawar * \author
2187*c83a76b0SSuyog Pawar * Ittiam
2188*c83a76b0SSuyog Pawar *
2189*c83a76b0SSuyog Pawar *****************************************************************************
2190*c83a76b0SSuyog Pawar */
ihevce_update_final_cu_results(ihevce_enc_loop_ctxt_t * ps_ctxt,ihevce_enc_cu_node_ctxt_t * ps_enc_out_ctxt,enc_loop_cu_prms_t * ps_cu_prms,pu_col_mv_t ** pps_row_col_pu,WORD32 * pi4_col_pu_map_idx,cu_final_update_prms * ps_cu_update_prms,WORD32 ctb_ctr,WORD32 vert_ctb_ctr)2191*c83a76b0SSuyog Pawar void ihevce_update_final_cu_results(
2192*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt,
2193*c83a76b0SSuyog Pawar ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt,
2194*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms,
2195*c83a76b0SSuyog Pawar pu_col_mv_t **pps_row_col_pu,
2196*c83a76b0SSuyog Pawar WORD32 *pi4_col_pu_map_idx,
2197*c83a76b0SSuyog Pawar cu_final_update_prms *ps_cu_update_prms,
2198*c83a76b0SSuyog Pawar WORD32 ctb_ctr,
2199*c83a76b0SSuyog Pawar WORD32 vert_ctb_ctr)
2200*c83a76b0SSuyog Pawar {
2201*c83a76b0SSuyog Pawar WORD32 curr_cu_pos_in_row;
2202*c83a76b0SSuyog Pawar
2203*c83a76b0SSuyog Pawar cu_enc_loop_out_t *ps_cu_final = *ps_cu_update_prms->pps_cu_final;
2204*c83a76b0SSuyog Pawar pu_t **pps_row_pu = ps_cu_update_prms->pps_row_pu;
2205*c83a76b0SSuyog Pawar tu_enc_loop_out_t **pps_row_tu = ps_cu_update_prms->pps_row_tu;
2206*c83a76b0SSuyog Pawar UWORD8 **ppu1_row_ecd_data = ps_cu_update_prms->ppu1_row_ecd_data;
2207*c83a76b0SSuyog Pawar WORD32 *pi4_num_pus_in_ctb = ps_cu_update_prms->pi4_num_pus_in_ctb;
2208*c83a76b0SSuyog Pawar UWORD32 u4_cu_size = ps_enc_out_ctxt->u1_cu_size;
2209*c83a76b0SSuyog Pawar ps_cu_final->b3_cu_pos_x = ps_enc_out_ctxt->b3_cu_pos_x;
2210*c83a76b0SSuyog Pawar ps_cu_final->b3_cu_pos_y = ps_enc_out_ctxt->b3_cu_pos_y;
2211*c83a76b0SSuyog Pawar
2212*c83a76b0SSuyog Pawar ps_cu_final->b4_cu_size = ps_enc_out_ctxt->u1_cu_size >> 3;
2213*c83a76b0SSuyog Pawar
2214*c83a76b0SSuyog Pawar /* store the current pu and tu pointes */
2215*c83a76b0SSuyog Pawar ps_cu_final->ps_pu = *pps_row_pu;
2216*c83a76b0SSuyog Pawar ps_cu_final->ps_enc_tu = *pps_row_tu;
2217*c83a76b0SSuyog Pawar curr_cu_pos_in_row = ctb_ctr * ps_cu_prms->i4_ctb_size + (ps_cu_final->b3_cu_pos_x << 3);
2218*c83a76b0SSuyog Pawar
2219*c83a76b0SSuyog Pawar ihevce_store_cu_final(ps_ctxt, ps_cu_final, *ppu1_row_ecd_data, ps_enc_out_ctxt, ps_cu_prms);
2220*c83a76b0SSuyog Pawar
2221*c83a76b0SSuyog Pawar if(NULL != pps_row_col_pu)
2222*c83a76b0SSuyog Pawar {
2223*c83a76b0SSuyog Pawar (*pps_row_col_pu) += ps_enc_out_ctxt->ps_cu_prms->u2_num_pus_in_cu;
2224*c83a76b0SSuyog Pawar }
2225*c83a76b0SSuyog Pawar if(NULL != pi4_col_pu_map_idx)
2226*c83a76b0SSuyog Pawar {
2227*c83a76b0SSuyog Pawar (*pi4_col_pu_map_idx) += ps_enc_out_ctxt->ps_cu_prms->u2_num_pus_in_cu;
2228*c83a76b0SSuyog Pawar }
2229*c83a76b0SSuyog Pawar (*pi4_num_pus_in_ctb) += ps_enc_out_ctxt->ps_cu_prms->u2_num_pus_in_cu;
2230*c83a76b0SSuyog Pawar (*pps_row_tu) += ps_cu_final->u2_num_tus_in_cu;
2231*c83a76b0SSuyog Pawar (*pps_row_pu) += ps_enc_out_ctxt->ps_cu_prms->u2_num_pus_in_cu;
2232*c83a76b0SSuyog Pawar (*ppu1_row_ecd_data) += ps_enc_out_ctxt->ps_cu_prms->i4_num_bytes_ecd_data;
2233*c83a76b0SSuyog Pawar
2234*c83a76b0SSuyog Pawar (*ps_cu_update_prms->pps_cu_final)++;
2235*c83a76b0SSuyog Pawar (*ps_cu_update_prms->pu1_num_cus_in_ctb_out)++;
2236*c83a76b0SSuyog Pawar
2237*c83a76b0SSuyog Pawar /* Updated for each CU in bottom row of CTB */
2238*c83a76b0SSuyog Pawar if(((ps_cu_final->b3_cu_pos_y << 3) + u4_cu_size) == ps_ctxt->u4_cur_ctb_ht)
2239*c83a76b0SSuyog Pawar {
2240*c83a76b0SSuyog Pawar /* copy the bottom data to row buffers */
2241*c83a76b0SSuyog Pawar ((pf_enc_loop_cu_bot_copy)ps_ctxt->pv_enc_loop_cu_bot_copy)(
2242*c83a76b0SSuyog Pawar ps_ctxt,
2243*c83a76b0SSuyog Pawar ps_cu_prms,
2244*c83a76b0SSuyog Pawar ps_enc_out_ctxt,
2245*c83a76b0SSuyog Pawar curr_cu_pos_in_row,
2246*c83a76b0SSuyog Pawar (ps_enc_out_ctxt->b3_cu_pos_x << 3));
2247*c83a76b0SSuyog Pawar
2248*c83a76b0SSuyog Pawar /* Setting Dependency for CU TopRight */
2249*c83a76b0SSuyog Pawar ihevce_dmgr_set_row_row_sync(
2250*c83a76b0SSuyog Pawar ps_ctxt->pv_dep_mngr_enc_loop_cu_top_right,
2251*c83a76b0SSuyog Pawar (curr_cu_pos_in_row + ps_enc_out_ctxt->u1_cu_size),
2252*c83a76b0SSuyog Pawar vert_ctb_ctr,
2253*c83a76b0SSuyog Pawar ps_ctxt->i4_tile_col_idx /* Col Tile No. */);
2254*c83a76b0SSuyog Pawar
2255*c83a76b0SSuyog Pawar /* Setting Dependency for Entropy to consume is made at CTB level */
2256*c83a76b0SSuyog Pawar }
2257*c83a76b0SSuyog Pawar }
2258*c83a76b0SSuyog Pawar
2259*c83a76b0SSuyog Pawar /**
2260*c83a76b0SSuyog Pawar ******************************************************************************
2261*c83a76b0SSuyog Pawar * \if Function name : ihevce_cu_recurse_decide \endif
2262*c83a76b0SSuyog Pawar *
2263*c83a76b0SSuyog Pawar * \brief
2264*c83a76b0SSuyog Pawar * Coding Unit mode decide function. Performs RD opt and decides the best mode
2265*c83a76b0SSuyog Pawar *
2266*c83a76b0SSuyog Pawar * \param[in] pv_ctxt : pointer to enc_loop module
2267*c83a76b0SSuyog Pawar * \param[in] ps_cu_prms : pointer to coding unit params (position, buffer pointers)
2268*c83a76b0SSuyog Pawar * \param[in] ps_cu_analyse : pointer to cu analyse
2269*c83a76b0SSuyog Pawar * \param[out] ps_cu_final : pointer to cu final
2270*c83a76b0SSuyog Pawar * \param[out] pu1_ecd_data :pointer to store coeff data for ECD
2271*c83a76b0SSuyog Pawar * \param[out]ps_row_col_pu; colocated pu buffer pointer
2272*c83a76b0SSuyog Pawar * \param[out]pu1_row_pu_map; colocated pu map buffer pointer
2273*c83a76b0SSuyog Pawar * \param[in]col_start_pu_idx : pu index start value
2274*c83a76b0SSuyog Pawar *
2275*c83a76b0SSuyog Pawar * \return
2276*c83a76b0SSuyog Pawar * None
2277*c83a76b0SSuyog Pawar *
2278*c83a76b0SSuyog Pawar *
2279*c83a76b0SSuyog Pawar * \author
2280*c83a76b0SSuyog Pawar * Ittiam
2281*c83a76b0SSuyog Pawar *
2282*c83a76b0SSuyog Pawar *****************************************************************************
2283*c83a76b0SSuyog Pawar */
ihevce_cu_recurse_decide(ihevce_enc_loop_ctxt_t * ps_ctxt,enc_loop_cu_prms_t * ps_cu_prms,cur_ctb_cu_tree_t * ps_cu_tree_analyse,cur_ctb_cu_tree_t * ps_cu_tree_analyse_parent,ipe_l0_ctb_analyse_for_me_t * ps_cur_ipe_ctb,me_ctb_data_t * ps_cu_me_data,pu_col_mv_t ** pps_col_pu,cu_final_update_prms * ps_cu_update_prms,UWORD8 * pu1_col_pu_map,WORD32 * pi4_col_start_pu_idx,WORD32 i4_tree_depth,WORD32 i4_ctb_x_off,WORD32 i4_ctb_y_off,WORD32 cur_ctb_ht)2284*c83a76b0SSuyog Pawar WORD32 ihevce_cu_recurse_decide(
2285*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt,
2286*c83a76b0SSuyog Pawar enc_loop_cu_prms_t *ps_cu_prms,
2287*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_analyse,
2288*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_analyse_parent,
2289*c83a76b0SSuyog Pawar ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb,
2290*c83a76b0SSuyog Pawar me_ctb_data_t *ps_cu_me_data,
2291*c83a76b0SSuyog Pawar pu_col_mv_t **pps_col_pu,
2292*c83a76b0SSuyog Pawar cu_final_update_prms *ps_cu_update_prms,
2293*c83a76b0SSuyog Pawar UWORD8 *pu1_col_pu_map,
2294*c83a76b0SSuyog Pawar WORD32 *pi4_col_start_pu_idx,
2295*c83a76b0SSuyog Pawar WORD32 i4_tree_depth,
2296*c83a76b0SSuyog Pawar WORD32 i4_ctb_x_off,
2297*c83a76b0SSuyog Pawar WORD32 i4_ctb_y_off,
2298*c83a76b0SSuyog Pawar WORD32 cur_ctb_ht)
2299*c83a76b0SSuyog Pawar {
2300*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_cu_tree_analyse_child[4];
2301*c83a76b0SSuyog Pawar final_mode_state_t s_final_mode_state;
2302*c83a76b0SSuyog Pawar
2303*c83a76b0SSuyog Pawar WORD32 i;
2304*c83a76b0SSuyog Pawar WORD32 child_nodes_null;
2305*c83a76b0SSuyog Pawar LWORD64 i8_least_child_cost;
2306*c83a76b0SSuyog Pawar
2307*c83a76b0SSuyog Pawar WORD32 num_children_encoded = 0;
2308*c83a76b0SSuyog Pawar
2309*c83a76b0SSuyog Pawar /* Take backup of collocated start PU index for parent node rdo for PQ */
2310*c83a76b0SSuyog Pawar WORD32 i4_col_pu_idx_bkup = *pi4_col_start_pu_idx;
2311*c83a76b0SSuyog Pawar pu_col_mv_t *ps_col_mv_bkup = *pps_col_pu;
2312*c83a76b0SSuyog Pawar
2313*c83a76b0SSuyog Pawar #if ENABLE_CU_SPLIT_FLAG_RATE_ESTIMATION
2314*c83a76b0SSuyog Pawar WORD32 x0_frm = i4_ctb_x_off + (ps_cu_tree_analyse->b3_cu_pos_x << 3);
2315*c83a76b0SSuyog Pawar WORD32 y0_frm = i4_ctb_y_off + (ps_cu_tree_analyse->b3_cu_pos_y << 3);
2316*c83a76b0SSuyog Pawar WORD32 pic_wd = ps_ctxt->s_sao_ctxt_t.ps_sps->i2_pic_width_in_luma_samples;
2317*c83a76b0SSuyog Pawar WORD32 pic_ht = ps_ctxt->s_sao_ctxt_t.ps_sps->i2_pic_height_in_luma_samples;
2318*c83a76b0SSuyog Pawar WORD32 log2_min_cb_size = ps_ctxt->s_sao_ctxt_t.ps_sps->i1_log2_min_coding_block_size;
2319*c83a76b0SSuyog Pawar WORD32 cu_size = ps_cu_tree_analyse->u1_cu_size;
2320*c83a76b0SSuyog Pawar
2321*c83a76b0SSuyog Pawar /* bits for coding split_cu_flag = 1 */
2322*c83a76b0SSuyog Pawar WORD32 split_cu1_bits_q12 = 0;
2323*c83a76b0SSuyog Pawar
2324*c83a76b0SSuyog Pawar /* bits for coding split_cu_flag = 0 */
2325*c83a76b0SSuyog Pawar WORD32 split_cu0_bits_q12 = 0;
2326*c83a76b0SSuyog Pawar #endif
2327*c83a76b0SSuyog Pawar
2328*c83a76b0SSuyog Pawar UWORD8 u1_is_cu_noisy = ps_ctxt->u1_is_stasino_enabled
2329*c83a76b0SSuyog Pawar ? ihevce_determine_cu_noise_based_on_8x8Blk_data(
2330*c83a76b0SSuyog Pawar ps_cu_prms->pu1_is_8x8Blk_noisy,
2331*c83a76b0SSuyog Pawar ((ps_cu_tree_analyse->b3_cu_pos_x << 3) >> 4) << 4,
2332*c83a76b0SSuyog Pawar ((ps_cu_tree_analyse->b3_cu_pos_y << 3) >> 4) << 4,
2333*c83a76b0SSuyog Pawar MAX(16, ps_cu_tree_analyse->u1_cu_size))
2334*c83a76b0SSuyog Pawar : 0;
2335*c83a76b0SSuyog Pawar
2336*c83a76b0SSuyog Pawar #if ENABLE_CU_SPLIT_FLAG_RATE_ESTIMATION
2337*c83a76b0SSuyog Pawar LWORD64 i8_lambda_qf = ps_ctxt->s_sao_ctxt_t.i8_cl_ssd_lambda_qf;
2338*c83a76b0SSuyog Pawar #endif
2339*c83a76b0SSuyog Pawar
2340*c83a76b0SSuyog Pawar (void)ps_cu_tree_analyse_parent;
2341*c83a76b0SSuyog Pawar
2342*c83a76b0SSuyog Pawar #if USE_NOISE_TERM_IN_ENC_LOOP && RDOPT_LAMBDA_DISCOUNT_WHEN_NOISY
2343*c83a76b0SSuyog Pawar if(!ps_ctxt->u1_enable_psyRDOPT && u1_is_cu_noisy)
2344*c83a76b0SSuyog Pawar {
2345*c83a76b0SSuyog Pawar ps_ctxt->i8_cl_ssd_lambda_qf = ps_ctxt->s_sao_ctxt_t.i8_cl_ssd_lambda_qf;
2346*c83a76b0SSuyog Pawar ps_ctxt->i8_cl_ssd_lambda_chroma_qf = ps_ctxt->s_sao_ctxt_t.i8_cl_ssd_lambda_chroma_qf;
2347*c83a76b0SSuyog Pawar }
2348*c83a76b0SSuyog Pawar #endif
2349*c83a76b0SSuyog Pawar
2350*c83a76b0SSuyog Pawar if(u1_is_cu_noisy && !ps_ctxt->u1_enable_psyRDOPT)
2351*c83a76b0SSuyog Pawar {
2352*c83a76b0SSuyog Pawar i8_lambda_qf = ((float)i8_lambda_qf * (100.0f - RDOPT_LAMBDA_DISCOUNT_WHEN_NOISY) / 100.0f);
2353*c83a76b0SSuyog Pawar }
2354*c83a76b0SSuyog Pawar
2355*c83a76b0SSuyog Pawar ps_cu_tree_analyse_child[0] = ps_cu_tree_analyse->ps_child_node_tl;
2356*c83a76b0SSuyog Pawar ps_cu_tree_analyse_child[1] = ps_cu_tree_analyse->ps_child_node_tr;
2357*c83a76b0SSuyog Pawar ps_cu_tree_analyse_child[2] = ps_cu_tree_analyse->ps_child_node_bl;
2358*c83a76b0SSuyog Pawar ps_cu_tree_analyse_child[3] = ps_cu_tree_analyse->ps_child_node_br;
2359*c83a76b0SSuyog Pawar
2360*c83a76b0SSuyog Pawar child_nodes_null =
2361*c83a76b0SSuyog Pawar ((ps_cu_tree_analyse_child[0] == NULL) + (ps_cu_tree_analyse_child[1] == NULL) +
2362*c83a76b0SSuyog Pawar (ps_cu_tree_analyse_child[2] == NULL) + (ps_cu_tree_analyse_child[3] == NULL));
2363*c83a76b0SSuyog Pawar
2364*c83a76b0SSuyog Pawar #if ENABLE_CU_SPLIT_FLAG_RATE_ESTIMATION
2365*c83a76b0SSuyog Pawar #if !PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS
2366*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset < IHEVCE_QUALITY_P2)
2367*c83a76b0SSuyog Pawar #endif
2368*c83a76b0SSuyog Pawar {
2369*c83a76b0SSuyog Pawar /*----------------------------------------------*/
2370*c83a76b0SSuyog Pawar /* ---------- CU Depth Bit Estimation --------- */
2371*c83a76b0SSuyog Pawar /*----------------------------------------------*/
2372*c83a76b0SSuyog Pawar
2373*c83a76b0SSuyog Pawar /* Encode cu split flags based on following conditions; See section 7.3.8*/
2374*c83a76b0SSuyog Pawar if(((x0_frm + cu_size) <= pic_wd) && ((y0_frm + cu_size) <= pic_ht) &&
2375*c83a76b0SSuyog Pawar (cu_size > (1 << log2_min_cb_size))) /* &&(ps_entropy_ctxt->i1_ctb_num_pcm_blks == 0)) */
2376*c83a76b0SSuyog Pawar {
2377*c83a76b0SSuyog Pawar WORD32 left_cu_depth = 0;
2378*c83a76b0SSuyog Pawar WORD32 top_cu_depth = 0;
2379*c83a76b0SSuyog Pawar WORD32 pos_x_4x4 = ps_cu_tree_analyse->b3_cu_pos_x << 1;
2380*c83a76b0SSuyog Pawar WORD32 pos_y_4x4 = ps_cu_tree_analyse->b3_cu_pos_y << 1;
2381*c83a76b0SSuyog Pawar WORD32 num_4x4_in_ctb = (ps_cu_prms->i4_ctb_size >> 2);
2382*c83a76b0SSuyog Pawar WORD32 cur_4x4_in_ctb = pos_x_4x4 + (pos_y_4x4 * num_4x4_in_ctb);
2383*c83a76b0SSuyog Pawar UWORD8 u1_split_cu_flag_cab_model;
2384*c83a76b0SSuyog Pawar WORD32 split_cu_ctxt_inc;
2385*c83a76b0SSuyog Pawar
2386*c83a76b0SSuyog Pawar /* Left and Top CU depth is required for cabac context */
2387*c83a76b0SSuyog Pawar
2388*c83a76b0SSuyog Pawar /* CU left */
2389*c83a76b0SSuyog Pawar if(0 == pos_x_4x4)
2390*c83a76b0SSuyog Pawar {
2391*c83a76b0SSuyog Pawar /* CTB boundary */
2392*c83a76b0SSuyog Pawar if(i4_ctb_x_off)
2393*c83a76b0SSuyog Pawar {
2394*c83a76b0SSuyog Pawar left_cu_depth = ps_ctxt->as_left_col_nbr[pos_y_4x4].b2_cu_depth;
2395*c83a76b0SSuyog Pawar }
2396*c83a76b0SSuyog Pawar }
2397*c83a76b0SSuyog Pawar else
2398*c83a76b0SSuyog Pawar {
2399*c83a76b0SSuyog Pawar /* inside CTB */
2400*c83a76b0SSuyog Pawar left_cu_depth = ps_ctxt->as_ctb_nbr_arr[cur_4x4_in_ctb - 1].b2_cu_depth;
2401*c83a76b0SSuyog Pawar }
2402*c83a76b0SSuyog Pawar
2403*c83a76b0SSuyog Pawar /* CU top */
2404*c83a76b0SSuyog Pawar if(0 == pos_y_4x4)
2405*c83a76b0SSuyog Pawar {
2406*c83a76b0SSuyog Pawar /* CTB boundary */
2407*c83a76b0SSuyog Pawar if(i4_ctb_y_off)
2408*c83a76b0SSuyog Pawar {
2409*c83a76b0SSuyog Pawar /* Wait till top cu depth is available */
2410*c83a76b0SSuyog Pawar ihevce_dmgr_chk_row_row_sync(
2411*c83a76b0SSuyog Pawar ps_ctxt->pv_dep_mngr_enc_loop_cu_top_right,
2412*c83a76b0SSuyog Pawar (i4_ctb_x_off) + (pos_x_4x4 << 2),
2413*c83a76b0SSuyog Pawar 4,
2414*c83a76b0SSuyog Pawar ((i4_ctb_y_off >> 6) - 1),
2415*c83a76b0SSuyog Pawar ps_ctxt->i4_tile_col_idx, /* Col Tile No. */
2416*c83a76b0SSuyog Pawar ps_ctxt->thrd_id);
2417*c83a76b0SSuyog Pawar
2418*c83a76b0SSuyog Pawar top_cu_depth =
2419*c83a76b0SSuyog Pawar ps_ctxt->ps_top_row_nbr[(i4_ctb_x_off >> 2) + pos_x_4x4].b2_cu_depth;
2420*c83a76b0SSuyog Pawar }
2421*c83a76b0SSuyog Pawar }
2422*c83a76b0SSuyog Pawar else
2423*c83a76b0SSuyog Pawar {
2424*c83a76b0SSuyog Pawar /* inside CTB */
2425*c83a76b0SSuyog Pawar top_cu_depth = ps_ctxt->as_ctb_nbr_arr[cur_4x4_in_ctb - num_4x4_in_ctb].b2_cu_depth;
2426*c83a76b0SSuyog Pawar }
2427*c83a76b0SSuyog Pawar
2428*c83a76b0SSuyog Pawar split_cu_ctxt_inc = IHEVC_CAB_SPLIT_CU_FLAG + (left_cu_depth > i4_tree_depth) +
2429*c83a76b0SSuyog Pawar (top_cu_depth > i4_tree_depth);
2430*c83a76b0SSuyog Pawar
2431*c83a76b0SSuyog Pawar u1_split_cu_flag_cab_model =
2432*c83a76b0SSuyog Pawar ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth][split_cu_ctxt_inc];
2433*c83a76b0SSuyog Pawar
2434*c83a76b0SSuyog Pawar /* bits for coding split_cu_flag = 1 */
2435*c83a76b0SSuyog Pawar split_cu1_bits_q12 = gau2_ihevce_cabac_bin_to_bits[u1_split_cu_flag_cab_model ^ 1];
2436*c83a76b0SSuyog Pawar
2437*c83a76b0SSuyog Pawar /* bits for coding split_cu_flag = 0 */
2438*c83a76b0SSuyog Pawar split_cu0_bits_q12 = gau2_ihevce_cabac_bin_to_bits[u1_split_cu_flag_cab_model ^ 0];
2439*c83a76b0SSuyog Pawar
2440*c83a76b0SSuyog Pawar /* update the cu split cabac context of all child nodes before evaluating child */
2441*c83a76b0SSuyog Pawar for(i = (i4_tree_depth + 1); i < 4; i++)
2442*c83a76b0SSuyog Pawar {
2443*c83a76b0SSuyog Pawar ps_ctxt->au1_rdopt_recur_ctxt_models[i][split_cu_ctxt_inc] =
2444*c83a76b0SSuyog Pawar gau1_ihevc_next_state[(u1_split_cu_flag_cab_model << 1) | 1];
2445*c83a76b0SSuyog Pawar }
2446*c83a76b0SSuyog Pawar
2447*c83a76b0SSuyog Pawar /* update the cu split cabac context of the parent node with split flag = 0 */
2448*c83a76b0SSuyog Pawar ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth][split_cu_ctxt_inc] =
2449*c83a76b0SSuyog Pawar gau1_ihevc_next_state[(u1_split_cu_flag_cab_model << 1) | 0];
2450*c83a76b0SSuyog Pawar }
2451*c83a76b0SSuyog Pawar }
2452*c83a76b0SSuyog Pawar #endif
2453*c83a76b0SSuyog Pawar
2454*c83a76b0SSuyog Pawar /* If all the child nodes are null, then do rdo for this node and return the cost */
2455*c83a76b0SSuyog Pawar if((1 == ps_cu_tree_analyse->is_node_valid) && (4 == child_nodes_null))
2456*c83a76b0SSuyog Pawar {
2457*c83a76b0SSuyog Pawar WORD32 i4_num_bytes_ecd_data;
2458*c83a76b0SSuyog Pawar
2459*c83a76b0SSuyog Pawar #if(PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS)
2460*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2461*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2462*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth][0],
2463*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2464*c83a76b0SSuyog Pawar #else
2465*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset < IHEVCE_QUALITY_P2)
2466*c83a76b0SSuyog Pawar {
2467*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2468*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2469*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth][0],
2470*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2471*c83a76b0SSuyog Pawar }
2472*c83a76b0SSuyog Pawar #endif
2473*c83a76b0SSuyog Pawar
2474*c83a76b0SSuyog Pawar ps_cu_prms->u1_is_cu_noisy = u1_is_cu_noisy;
2475*c83a76b0SSuyog Pawar ihevce_update_pred_qp(
2476*c83a76b0SSuyog Pawar ps_ctxt, ps_cu_tree_analyse->b3_cu_pos_x, ps_cu_tree_analyse->b3_cu_pos_y);
2477*c83a76b0SSuyog Pawar /* DO rdo for current node here */
2478*c83a76b0SSuyog Pawar /* return rdo cost for current node*/
2479*c83a76b0SSuyog Pawar ps_cu_tree_analyse->i8_best_rdopt_cost = ihevce_compute_rdo(
2480*c83a76b0SSuyog Pawar ps_ctxt,
2481*c83a76b0SSuyog Pawar ps_cu_prms,
2482*c83a76b0SSuyog Pawar ps_cu_tree_analyse,
2483*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
2484*c83a76b0SSuyog Pawar ps_cu_me_data,
2485*c83a76b0SSuyog Pawar *pps_col_pu,
2486*c83a76b0SSuyog Pawar &s_final_mode_state,
2487*c83a76b0SSuyog Pawar pu1_col_pu_map,
2488*c83a76b0SSuyog Pawar *ps_cu_update_prms->ppu1_row_ecd_data,
2489*c83a76b0SSuyog Pawar *pi4_col_start_pu_idx,
2490*c83a76b0SSuyog Pawar i4_ctb_x_off,
2491*c83a76b0SSuyog Pawar i4_ctb_y_off);
2492*c83a76b0SSuyog Pawar
2493*c83a76b0SSuyog Pawar if((((ps_cu_tree_analyse->b3_cu_pos_y << 3) + ps_cu_tree_analyse->u1_cu_size) ==
2494*c83a76b0SSuyog Pawar cur_ctb_ht) &&
2495*c83a76b0SSuyog Pawar (ps_cu_tree_analyse->b3_cu_pos_x == 0) && (i4_ctb_x_off == 0))
2496*c83a76b0SSuyog Pawar {
2497*c83a76b0SSuyog Pawar /* copy the state to row level context after 1st Cu, in the Last CU row of CTB */
2498*c83a76b0SSuyog Pawar /* copy current ctb CU states into a entropy sync state */
2499*c83a76b0SSuyog Pawar /* to be used for next row */
2500*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2501*c83a76b0SSuyog Pawar ps_ctxt->pu1_curr_row_cabac_state,
2502*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2503*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2504*c83a76b0SSuyog Pawar }
2505*c83a76b0SSuyog Pawar
2506*c83a76b0SSuyog Pawar #if(PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS)
2507*c83a76b0SSuyog Pawar {
2508*c83a76b0SSuyog Pawar #if ENABLE_CU_SPLIT_FLAG_RATE_ESTIMATION
2509*c83a76b0SSuyog Pawar /* Add parent split cu = 0 cost signalling */
2510*c83a76b0SSuyog Pawar ps_cu_tree_analyse->i8_best_rdopt_cost += COMPUTE_RATE_COST_CLIP30(
2511*c83a76b0SSuyog Pawar split_cu0_bits_q12, i8_lambda_qf, (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q));
2512*c83a76b0SSuyog Pawar #endif
2513*c83a76b0SSuyog Pawar for(i = (i4_tree_depth); i < 4; i++)
2514*c83a76b0SSuyog Pawar {
2515*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2516*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i][0],
2517*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2518*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2519*c83a76b0SSuyog Pawar }
2520*c83a76b0SSuyog Pawar }
2521*c83a76b0SSuyog Pawar #else
2522*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset < IHEVCE_QUALITY_P2)
2523*c83a76b0SSuyog Pawar {
2524*c83a76b0SSuyog Pawar #if ENABLE_CU_SPLIT_FLAG_RATE_ESTIMATION
2525*c83a76b0SSuyog Pawar /* Add parent split cu = 0 cost signalling */
2526*c83a76b0SSuyog Pawar ps_cu_tree_analyse->i8_best_rdopt_cost += COMPUTE_RATE_COST_CLIP30(
2527*c83a76b0SSuyog Pawar split_cu0_bits_q12, i8_lambda_qf, (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q));
2528*c83a76b0SSuyog Pawar #endif
2529*c83a76b0SSuyog Pawar
2530*c83a76b0SSuyog Pawar for(i = (i4_tree_depth); i < 4; i++)
2531*c83a76b0SSuyog Pawar {
2532*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2533*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i][0],
2534*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2535*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2536*c83a76b0SSuyog Pawar }
2537*c83a76b0SSuyog Pawar }
2538*c83a76b0SSuyog Pawar #endif
2539*c83a76b0SSuyog Pawar
2540*c83a76b0SSuyog Pawar ((pf_store_cu_results)ps_ctxt->pv_store_cu_results)(
2541*c83a76b0SSuyog Pawar ps_ctxt, ps_cu_prms, &s_final_mode_state);
2542*c83a76b0SSuyog Pawar
2543*c83a76b0SSuyog Pawar #if(!PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS)
2544*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset >= IHEVCE_QUALITY_P2)
2545*c83a76b0SSuyog Pawar {
2546*c83a76b0SSuyog Pawar ihevce_update_final_cu_results(
2547*c83a76b0SSuyog Pawar ps_ctxt,
2548*c83a76b0SSuyog Pawar ps_ctxt->ps_enc_out_ctxt,
2549*c83a76b0SSuyog Pawar ps_cu_prms,
2550*c83a76b0SSuyog Pawar pps_col_pu,
2551*c83a76b0SSuyog Pawar pi4_col_start_pu_idx,
2552*c83a76b0SSuyog Pawar ps_cu_update_prms,
2553*c83a76b0SSuyog Pawar i4_ctb_x_off >> 6,
2554*c83a76b0SSuyog Pawar i4_ctb_y_off >> 6);
2555*c83a76b0SSuyog Pawar }
2556*c83a76b0SSuyog Pawar else
2557*c83a76b0SSuyog Pawar {
2558*c83a76b0SSuyog Pawar /* ---- copy the luma & chroma coeffs to final output -------- */
2559*c83a76b0SSuyog Pawar i4_num_bytes_ecd_data = ps_ctxt->ps_enc_out_ctxt->ps_cu_prms->i4_num_bytes_ecd_data;
2560*c83a76b0SSuyog Pawar
2561*c83a76b0SSuyog Pawar if(0 != i4_num_bytes_ecd_data)
2562*c83a76b0SSuyog Pawar {
2563*c83a76b0SSuyog Pawar memcpy(
2564*c83a76b0SSuyog Pawar ps_ctxt->pu1_ecd_data,
2565*c83a76b0SSuyog Pawar &ps_ctxt->pu1_cu_recur_coeffs[0],
2566*c83a76b0SSuyog Pawar i4_num_bytes_ecd_data * sizeof(UWORD8));
2567*c83a76b0SSuyog Pawar
2568*c83a76b0SSuyog Pawar ps_ctxt->pu1_ecd_data += i4_num_bytes_ecd_data;
2569*c83a76b0SSuyog Pawar }
2570*c83a76b0SSuyog Pawar
2571*c83a76b0SSuyog Pawar /* Collocated PU updates */
2572*c83a76b0SSuyog Pawar *pps_col_pu += ps_ctxt->ps_enc_out_ctxt->ps_cu_prms->u2_num_pus_in_cu;
2573*c83a76b0SSuyog Pawar *pi4_col_start_pu_idx += ps_ctxt->ps_enc_out_ctxt->ps_cu_prms->u2_num_pus_in_cu;
2574*c83a76b0SSuyog Pawar }
2575*c83a76b0SSuyog Pawar #else
2576*c83a76b0SSuyog Pawar /* ---- copy the luma & chroma coeffs to final output -------- */
2577*c83a76b0SSuyog Pawar i4_num_bytes_ecd_data = ps_ctxt->ps_enc_out_ctxt->ps_cu_prms->i4_num_bytes_ecd_data;
2578*c83a76b0SSuyog Pawar if(0 != i4_num_bytes_ecd_data)
2579*c83a76b0SSuyog Pawar {
2580*c83a76b0SSuyog Pawar memcpy(
2581*c83a76b0SSuyog Pawar ps_ctxt->pu1_ecd_data,
2582*c83a76b0SSuyog Pawar &ps_ctxt->pu1_cu_recur_coeffs[0],
2583*c83a76b0SSuyog Pawar i4_num_bytes_ecd_data * sizeof(UWORD8));
2584*c83a76b0SSuyog Pawar
2585*c83a76b0SSuyog Pawar ps_ctxt->pu1_ecd_data += i4_num_bytes_ecd_data;
2586*c83a76b0SSuyog Pawar }
2587*c83a76b0SSuyog Pawar
2588*c83a76b0SSuyog Pawar /* Collocated PU updates */
2589*c83a76b0SSuyog Pawar *pps_col_pu += ps_ctxt->ps_enc_out_ctxt->ps_cu_prms->u2_num_pus_in_cu;
2590*c83a76b0SSuyog Pawar *pi4_col_start_pu_idx += ps_ctxt->ps_enc_out_ctxt->ps_cu_prms->u2_num_pus_in_cu;
2591*c83a76b0SSuyog Pawar #endif
2592*c83a76b0SSuyog Pawar
2593*c83a76b0SSuyog Pawar ps_ctxt->ps_enc_out_ctxt++;
2594*c83a76b0SSuyog Pawar num_children_encoded++;
2595*c83a76b0SSuyog Pawar }
2596*c83a76b0SSuyog Pawar else
2597*c83a76b0SSuyog Pawar {
2598*c83a76b0SSuyog Pawar i8_least_child_cost = 0;
2599*c83a76b0SSuyog Pawar
2600*c83a76b0SSuyog Pawar for(i = 0; i < 4; i++)
2601*c83a76b0SSuyog Pawar {
2602*c83a76b0SSuyog Pawar if(ps_cu_tree_analyse_child[i] != NULL)
2603*c83a76b0SSuyog Pawar {
2604*c83a76b0SSuyog Pawar num_children_encoded += ihevce_cu_recurse_decide(
2605*c83a76b0SSuyog Pawar ps_ctxt,
2606*c83a76b0SSuyog Pawar ps_cu_prms,
2607*c83a76b0SSuyog Pawar ps_cu_tree_analyse_child[i],
2608*c83a76b0SSuyog Pawar ps_cu_tree_analyse,
2609*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
2610*c83a76b0SSuyog Pawar ps_cu_me_data,
2611*c83a76b0SSuyog Pawar pps_col_pu,
2612*c83a76b0SSuyog Pawar ps_cu_update_prms,
2613*c83a76b0SSuyog Pawar pu1_col_pu_map,
2614*c83a76b0SSuyog Pawar pi4_col_start_pu_idx,
2615*c83a76b0SSuyog Pawar i4_tree_depth + 1,
2616*c83a76b0SSuyog Pawar i4_ctb_x_off,
2617*c83a76b0SSuyog Pawar i4_ctb_y_off,
2618*c83a76b0SSuyog Pawar cur_ctb_ht);
2619*c83a76b0SSuyog Pawar
2620*c83a76b0SSuyog Pawar /* In case of incomplete ctb, */
2621*c83a76b0SSuyog Pawar //if(MAX_COST != ps_cu_tree_analyse_child[i]->i4_best_rdopt_cost)
2622*c83a76b0SSuyog Pawar if(((ULWORD64)(
2623*c83a76b0SSuyog Pawar i8_least_child_cost + ps_cu_tree_analyse_child[i]->i8_best_rdopt_cost)) >
2624*c83a76b0SSuyog Pawar MAX_COST_64)
2625*c83a76b0SSuyog Pawar {
2626*c83a76b0SSuyog Pawar i8_least_child_cost = MAX_COST_64;
2627*c83a76b0SSuyog Pawar }
2628*c83a76b0SSuyog Pawar else
2629*c83a76b0SSuyog Pawar {
2630*c83a76b0SSuyog Pawar i8_least_child_cost += ps_cu_tree_analyse_child[i]->i8_best_rdopt_cost;
2631*c83a76b0SSuyog Pawar }
2632*c83a76b0SSuyog Pawar }
2633*c83a76b0SSuyog Pawar else
2634*c83a76b0SSuyog Pawar {
2635*c83a76b0SSuyog Pawar /* If the child node is NULL, return MAX_COST*/
2636*c83a76b0SSuyog Pawar i8_least_child_cost = MAX_COST_64;
2637*c83a76b0SSuyog Pawar }
2638*c83a76b0SSuyog Pawar }
2639*c83a76b0SSuyog Pawar
2640*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset < IHEVCE_QUALITY_P2)
2641*c83a76b0SSuyog Pawar {
2642*c83a76b0SSuyog Pawar #if !ENABLE_4CTB_EVALUATION
2643*c83a76b0SSuyog Pawar if((ps_cu_tree_analyse->u1_cu_size == 64) && (num_children_encoded > 10) &&
2644*c83a76b0SSuyog Pawar (ps_ctxt->i1_slice_type != ISLICE))
2645*c83a76b0SSuyog Pawar {
2646*c83a76b0SSuyog Pawar ps_cu_tree_analyse->is_node_valid = 0;
2647*c83a76b0SSuyog Pawar }
2648*c83a76b0SSuyog Pawar #endif
2649*c83a76b0SSuyog Pawar }
2650*c83a76b0SSuyog Pawar
2651*c83a76b0SSuyog Pawar /* If current CU node is valid, do rdo for the node and decide btwn child nodes and parent nodes */
2652*c83a76b0SSuyog Pawar if(ps_cu_tree_analyse->is_node_valid)
2653*c83a76b0SSuyog Pawar {
2654*c83a76b0SSuyog Pawar UWORD8 au1_cu_pu_map[(MAX_CTB_SIZE / MIN_PU_SIZE) * (MAX_CTB_SIZE / MIN_PU_SIZE)];
2655*c83a76b0SSuyog Pawar pu_col_mv_t as_col_mv[2]; /* Max of 2 PUs only per CU */
2656*c83a76b0SSuyog Pawar
2657*c83a76b0SSuyog Pawar WORD32 i4_col_pu_idx_start = i4_col_pu_idx_bkup;
2658*c83a76b0SSuyog Pawar
2659*c83a76b0SSuyog Pawar /* Copy the collocated PU map to the local array */
2660*c83a76b0SSuyog Pawar memcpy(
2661*c83a76b0SSuyog Pawar au1_cu_pu_map,
2662*c83a76b0SSuyog Pawar pu1_col_pu_map,
2663*c83a76b0SSuyog Pawar (MAX_CTB_SIZE / MIN_PU_SIZE) * (MAX_CTB_SIZE / MIN_PU_SIZE));
2664*c83a76b0SSuyog Pawar
2665*c83a76b0SSuyog Pawar #if(PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS)
2666*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2667*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2668*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth][0],
2669*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2670*c83a76b0SSuyog Pawar
2671*c83a76b0SSuyog Pawar /* Reset the nbr maps while computing Parent CU node ()*/
2672*c83a76b0SSuyog Pawar /* set the neighbour map to 0 */
2673*c83a76b0SSuyog Pawar ihevce_set_nbr_map(
2674*c83a76b0SSuyog Pawar ps_ctxt->pu1_ctb_nbr_map,
2675*c83a76b0SSuyog Pawar ps_ctxt->i4_nbr_map_strd,
2676*c83a76b0SSuyog Pawar (ps_cu_tree_analyse->b3_cu_pos_x << 1),
2677*c83a76b0SSuyog Pawar (ps_cu_tree_analyse->b3_cu_pos_y << 1),
2678*c83a76b0SSuyog Pawar (ps_cu_tree_analyse->u1_cu_size >> 2),
2679*c83a76b0SSuyog Pawar 0);
2680*c83a76b0SSuyog Pawar #else
2681*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset < IHEVCE_QUALITY_P2)
2682*c83a76b0SSuyog Pawar {
2683*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2684*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2685*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth][0],
2686*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2687*c83a76b0SSuyog Pawar
2688*c83a76b0SSuyog Pawar /* Reset the nbr maps while computing Parent CU node ()*/
2689*c83a76b0SSuyog Pawar /* set the neighbour map to 0 */
2690*c83a76b0SSuyog Pawar ihevce_set_nbr_map(
2691*c83a76b0SSuyog Pawar ps_ctxt->pu1_ctb_nbr_map,
2692*c83a76b0SSuyog Pawar ps_ctxt->i4_nbr_map_strd,
2693*c83a76b0SSuyog Pawar (ps_cu_tree_analyse->b3_cu_pos_x << 1),
2694*c83a76b0SSuyog Pawar (ps_cu_tree_analyse->b3_cu_pos_y << 1),
2695*c83a76b0SSuyog Pawar (ps_cu_tree_analyse->u1_cu_size >> 2),
2696*c83a76b0SSuyog Pawar 0);
2697*c83a76b0SSuyog Pawar }
2698*c83a76b0SSuyog Pawar #endif
2699*c83a76b0SSuyog Pawar
2700*c83a76b0SSuyog Pawar /* Do rdo for the parent node */
2701*c83a76b0SSuyog Pawar /* Compare parent node cost vs child node costs */
2702*c83a76b0SSuyog Pawar ps_ctxt->is_parent_cu_rdopt = 1;
2703*c83a76b0SSuyog Pawar
2704*c83a76b0SSuyog Pawar ps_cu_prms->u1_is_cu_noisy = u1_is_cu_noisy;
2705*c83a76b0SSuyog Pawar
2706*c83a76b0SSuyog Pawar ihevce_update_pred_qp(
2707*c83a76b0SSuyog Pawar ps_ctxt, ps_cu_tree_analyse->b3_cu_pos_x, ps_cu_tree_analyse->b3_cu_pos_y);
2708*c83a76b0SSuyog Pawar
2709*c83a76b0SSuyog Pawar ps_cu_tree_analyse->i8_best_rdopt_cost = ihevce_compute_rdo(
2710*c83a76b0SSuyog Pawar ps_ctxt,
2711*c83a76b0SSuyog Pawar ps_cu_prms,
2712*c83a76b0SSuyog Pawar ps_cu_tree_analyse,
2713*c83a76b0SSuyog Pawar ps_cur_ipe_ctb,
2714*c83a76b0SSuyog Pawar ps_cu_me_data,
2715*c83a76b0SSuyog Pawar as_col_mv,
2716*c83a76b0SSuyog Pawar &s_final_mode_state,
2717*c83a76b0SSuyog Pawar au1_cu_pu_map,
2718*c83a76b0SSuyog Pawar *ps_cu_update_prms->ppu1_row_ecd_data,
2719*c83a76b0SSuyog Pawar i4_col_pu_idx_start,
2720*c83a76b0SSuyog Pawar i4_ctb_x_off,
2721*c83a76b0SSuyog Pawar i4_ctb_y_off);
2722*c83a76b0SSuyog Pawar
2723*c83a76b0SSuyog Pawar ps_ctxt->is_parent_cu_rdopt = 0;
2724*c83a76b0SSuyog Pawar
2725*c83a76b0SSuyog Pawar #if(PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS)
2726*c83a76b0SSuyog Pawar /* Add parent split cu cost signalling */
2727*c83a76b0SSuyog Pawar ps_cu_tree_analyse->i8_best_rdopt_cost += COMPUTE_RATE_COST_CLIP30(
2728*c83a76b0SSuyog Pawar split_cu0_bits_q12, i8_lambda_qf, (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q));
2729*c83a76b0SSuyog Pawar
2730*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2731*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth][0],
2732*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2733*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2734*c83a76b0SSuyog Pawar
2735*c83a76b0SSuyog Pawar /* i8_least_child_cost += (num_children_encoded * ps_ctxt->i4_sad_lamda\
2736*c83a76b0SSuyog Pawar + ((1 << (LAMBDA_Q_SHIFT)))) >> (LAMBDA_Q_SHIFT + 1) */
2737*c83a76b0SSuyog Pawar ;
2738*c83a76b0SSuyog Pawar /* bits for coding cu split flag as 1 */
2739*c83a76b0SSuyog Pawar i8_least_child_cost += COMPUTE_RATE_COST_CLIP30(
2740*c83a76b0SSuyog Pawar split_cu1_bits_q12, i8_lambda_qf, (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q));
2741*c83a76b0SSuyog Pawar #else
2742*c83a76b0SSuyog Pawar #if ENABLE_CU_SPLIT_FLAG_RATE_ESTIMATION
2743*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset < IHEVCE_QUALITY_P2)
2744*c83a76b0SSuyog Pawar {
2745*c83a76b0SSuyog Pawar /* Add parent split cu cost signalling */
2746*c83a76b0SSuyog Pawar ps_cu_tree_analyse->i8_best_rdopt_cost += COMPUTE_RATE_COST_CLIP30(
2747*c83a76b0SSuyog Pawar split_cu0_bits_q12, i8_lambda_qf, (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q));
2748*c83a76b0SSuyog Pawar
2749*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2750*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth][0],
2751*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2752*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2753*c83a76b0SSuyog Pawar
2754*c83a76b0SSuyog Pawar /* i8_least_child_cost += (num_children_encoded * ps_ctxt->i4_sad_lamda\
2755*c83a76b0SSuyog Pawar + ((1 << (LAMBDA_Q_SHIFT)))) >> (LAMBDA_Q_SHIFT + 1) */
2756*c83a76b0SSuyog Pawar ;
2757*c83a76b0SSuyog Pawar /* bits for coding cu split flag as 1 */
2758*c83a76b0SSuyog Pawar i8_least_child_cost += COMPUTE_RATE_COST_CLIP30(
2759*c83a76b0SSuyog Pawar split_cu1_bits_q12, i8_lambda_qf, (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q));
2760*c83a76b0SSuyog Pawar }
2761*c83a76b0SSuyog Pawar #else
2762*c83a76b0SSuyog Pawar i8_least_child_cost +=
2763*c83a76b0SSuyog Pawar (num_children_encoded * ps_ctxt->i4_sad_lamda + ((1 << (LAMBDA_Q_SHIFT)))) >>
2764*c83a76b0SSuyog Pawar (LAMBDA_Q_SHIFT + 1);
2765*c83a76b0SSuyog Pawar #endif
2766*c83a76b0SSuyog Pawar #endif
2767*c83a76b0SSuyog Pawar
2768*c83a76b0SSuyog Pawar /* If child modes win over parent, discard parent enc ctxt */
2769*c83a76b0SSuyog Pawar /* else discard child ctxt */
2770*c83a76b0SSuyog Pawar if(ps_cu_tree_analyse->i8_best_rdopt_cost > i8_least_child_cost)
2771*c83a76b0SSuyog Pawar {
2772*c83a76b0SSuyog Pawar #if(PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS)
2773*c83a76b0SSuyog Pawar /* Store child node Models for evalution of next CU */
2774*c83a76b0SSuyog Pawar for(i = (i4_tree_depth); i < 4; i++)
2775*c83a76b0SSuyog Pawar {
2776*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2777*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i][0],
2778*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth + 1][0],
2779*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2780*c83a76b0SSuyog Pawar }
2781*c83a76b0SSuyog Pawar /* Reset cabac states if child has won */
2782*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2783*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2784*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth + 1][0],
2785*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2786*c83a76b0SSuyog Pawar #else
2787*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset < IHEVCE_QUALITY_P2)
2788*c83a76b0SSuyog Pawar {
2789*c83a76b0SSuyog Pawar for(i = i4_tree_depth; i < 4; i++)
2790*c83a76b0SSuyog Pawar {
2791*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2792*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i][0],
2793*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth + 1][0],
2794*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2795*c83a76b0SSuyog Pawar }
2796*c83a76b0SSuyog Pawar /* Reset cabac states if child has won */
2797*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2798*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2799*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth + 1][0],
2800*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2801*c83a76b0SSuyog Pawar }
2802*c83a76b0SSuyog Pawar #endif
2803*c83a76b0SSuyog Pawar ps_cu_tree_analyse->i8_best_rdopt_cost = i8_least_child_cost;
2804*c83a76b0SSuyog Pawar ps_cu_tree_analyse->is_node_valid = 0;
2805*c83a76b0SSuyog Pawar }
2806*c83a76b0SSuyog Pawar else
2807*c83a76b0SSuyog Pawar {
2808*c83a76b0SSuyog Pawar /* Parent node wins over child node */
2809*c83a76b0SSuyog Pawar ihevce_enc_cu_node_ctxt_t *ps_enc_tmp_out_ctxt;
2810*c83a76b0SSuyog Pawar WORD32 i4_num_bytes_ecd_data;
2811*c83a76b0SSuyog Pawar WORD32 num_child_nodes = 0;
2812*c83a76b0SSuyog Pawar WORD32 i4_num_pus_in_cu;
2813*c83a76b0SSuyog Pawar
2814*c83a76b0SSuyog Pawar if((((ps_cu_tree_analyse->b3_cu_pos_y << 3) + ps_cu_tree_analyse->u1_cu_size) ==
2815*c83a76b0SSuyog Pawar cur_ctb_ht) &&
2816*c83a76b0SSuyog Pawar (ps_cu_tree_analyse->b3_cu_pos_x == 0) && (i4_ctb_x_off == 0))
2817*c83a76b0SSuyog Pawar {
2818*c83a76b0SSuyog Pawar /* copy the state to row level context after 1st Cu, in the Last CU row of CTB */
2819*c83a76b0SSuyog Pawar /* copy current ctb CU states into a entropy sync state */
2820*c83a76b0SSuyog Pawar /* to be used for next row */
2821*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2822*c83a76b0SSuyog Pawar ps_ctxt->pu1_curr_row_cabac_state,
2823*c83a76b0SSuyog Pawar &ps_ctxt->s_rdopt_entropy_ctxt.au1_init_cabac_ctxt_states[0],
2824*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2825*c83a76b0SSuyog Pawar }
2826*c83a76b0SSuyog Pawar
2827*c83a76b0SSuyog Pawar #if(PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS)
2828*c83a76b0SSuyog Pawar /* Store parent node Models for evalution of next CU */
2829*c83a76b0SSuyog Pawar for(i = (i4_tree_depth + 1); i < 4; i++)
2830*c83a76b0SSuyog Pawar {
2831*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2832*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i][0],
2833*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth][0],
2834*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2835*c83a76b0SSuyog Pawar }
2836*c83a76b0SSuyog Pawar #else
2837*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset < IHEVCE_QUALITY_P2)
2838*c83a76b0SSuyog Pawar {
2839*c83a76b0SSuyog Pawar for(i = (i4_tree_depth + 1); i < 4; i++)
2840*c83a76b0SSuyog Pawar {
2841*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2842*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i][0],
2843*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth][0],
2844*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2845*c83a76b0SSuyog Pawar }
2846*c83a76b0SSuyog Pawar }
2847*c83a76b0SSuyog Pawar #endif
2848*c83a76b0SSuyog Pawar ((pf_store_cu_results)ps_ctxt->pv_store_cu_results)(
2849*c83a76b0SSuyog Pawar ps_ctxt, ps_cu_prms, &s_final_mode_state);
2850*c83a76b0SSuyog Pawar
2851*c83a76b0SSuyog Pawar #if(!PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS)
2852*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset >= IHEVCE_QUALITY_P2)
2853*c83a76b0SSuyog Pawar {
2854*c83a76b0SSuyog Pawar ihevce_update_final_cu_results(
2855*c83a76b0SSuyog Pawar ps_ctxt,
2856*c83a76b0SSuyog Pawar ps_ctxt->ps_enc_out_ctxt,
2857*c83a76b0SSuyog Pawar ps_cu_prms,
2858*c83a76b0SSuyog Pawar pps_col_pu,
2859*c83a76b0SSuyog Pawar pi4_col_start_pu_idx,
2860*c83a76b0SSuyog Pawar ps_cu_update_prms,
2861*c83a76b0SSuyog Pawar i4_ctb_x_off >> 6,
2862*c83a76b0SSuyog Pawar i4_ctb_y_off >> 6);
2863*c83a76b0SSuyog Pawar
2864*c83a76b0SSuyog Pawar ps_ctxt->ps_enc_out_ctxt++;
2865*c83a76b0SSuyog Pawar }
2866*c83a76b0SSuyog Pawar else
2867*c83a76b0SSuyog Pawar {
2868*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt = ps_ctxt->ps_enc_out_ctxt;
2869*c83a76b0SSuyog Pawar
2870*c83a76b0SSuyog Pawar num_child_nodes = num_children_encoded;
2871*c83a76b0SSuyog Pawar
2872*c83a76b0SSuyog Pawar /* ---- copy the luma & chroma coeffs to final output -------- */
2873*c83a76b0SSuyog Pawar for(i = 0; i < num_child_nodes; i++)
2874*c83a76b0SSuyog Pawar {
2875*c83a76b0SSuyog Pawar i4_num_bytes_ecd_data =
2876*c83a76b0SSuyog Pawar (ps_ctxt->ps_enc_out_ctxt - i - 1)->ps_cu_prms->i4_num_bytes_ecd_data;
2877*c83a76b0SSuyog Pawar ps_ctxt->pu1_ecd_data -= i4_num_bytes_ecd_data;
2878*c83a76b0SSuyog Pawar }
2879*c83a76b0SSuyog Pawar
2880*c83a76b0SSuyog Pawar i4_num_bytes_ecd_data =
2881*c83a76b0SSuyog Pawar ps_ctxt->ps_enc_out_ctxt->ps_cu_prms->i4_num_bytes_ecd_data;
2882*c83a76b0SSuyog Pawar if(0 != i4_num_bytes_ecd_data)
2883*c83a76b0SSuyog Pawar {
2884*c83a76b0SSuyog Pawar memcpy(
2885*c83a76b0SSuyog Pawar ps_ctxt->pu1_ecd_data,
2886*c83a76b0SSuyog Pawar &ps_ctxt->pu1_cu_recur_coeffs[0],
2887*c83a76b0SSuyog Pawar i4_num_bytes_ecd_data);
2888*c83a76b0SSuyog Pawar
2889*c83a76b0SSuyog Pawar ps_ctxt->pu1_ecd_data += i4_num_bytes_ecd_data;
2890*c83a76b0SSuyog Pawar }
2891*c83a76b0SSuyog Pawar
2892*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt = ps_ctxt->ps_enc_out_ctxt - num_child_nodes;
2893*c83a76b0SSuyog Pawar
2894*c83a76b0SSuyog Pawar memcpy(
2895*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt,
2896*c83a76b0SSuyog Pawar ps_ctxt->ps_enc_out_ctxt,
2897*c83a76b0SSuyog Pawar sizeof(ihevce_enc_cu_node_ctxt_t));
2898*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->ps_cu_prms = &ps_enc_tmp_out_ctxt->s_cu_prms;
2899*c83a76b0SSuyog Pawar
2900*c83a76b0SSuyog Pawar /* Collocated PU updates */
2901*c83a76b0SSuyog Pawar i4_num_pus_in_cu = ps_ctxt->ps_enc_out_ctxt->ps_cu_prms->u2_num_pus_in_cu;
2902*c83a76b0SSuyog Pawar /* Copy the collocated MVs and the PU map to frame buffers */
2903*c83a76b0SSuyog Pawar memcpy(ps_col_mv_bkup, as_col_mv, sizeof(pu_col_mv_t) * i4_num_pus_in_cu);
2904*c83a76b0SSuyog Pawar memcpy(
2905*c83a76b0SSuyog Pawar pu1_col_pu_map,
2906*c83a76b0SSuyog Pawar au1_cu_pu_map,
2907*c83a76b0SSuyog Pawar (MAX_CTB_SIZE / MIN_PU_SIZE) * (MAX_CTB_SIZE / MIN_PU_SIZE));
2908*c83a76b0SSuyog Pawar /* Update the frame buffer pointer and the map index */
2909*c83a76b0SSuyog Pawar *pps_col_pu = ps_col_mv_bkup + i4_num_pus_in_cu;
2910*c83a76b0SSuyog Pawar *pi4_col_start_pu_idx = i4_col_pu_idx_bkup + i4_num_pus_in_cu;
2911*c83a76b0SSuyog Pawar
2912*c83a76b0SSuyog Pawar ps_ctxt->ps_enc_out_ctxt = ps_enc_tmp_out_ctxt + 1;
2913*c83a76b0SSuyog Pawar }
2914*c83a76b0SSuyog Pawar #else
2915*c83a76b0SSuyog Pawar
2916*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt = ps_ctxt->ps_enc_out_ctxt;
2917*c83a76b0SSuyog Pawar
2918*c83a76b0SSuyog Pawar num_child_nodes = num_children_encoded;
2919*c83a76b0SSuyog Pawar
2920*c83a76b0SSuyog Pawar /* ---- copy the luma & chroma coeffs to final output -------- */
2921*c83a76b0SSuyog Pawar for(i = 0; i < num_child_nodes; i++)
2922*c83a76b0SSuyog Pawar {
2923*c83a76b0SSuyog Pawar i4_num_bytes_ecd_data =
2924*c83a76b0SSuyog Pawar (ps_ctxt->ps_enc_out_ctxt - i - 1)->ps_cu_prms->i4_num_bytes_ecd_data;
2925*c83a76b0SSuyog Pawar ps_ctxt->pu1_ecd_data -= i4_num_bytes_ecd_data;
2926*c83a76b0SSuyog Pawar }
2927*c83a76b0SSuyog Pawar
2928*c83a76b0SSuyog Pawar i4_num_bytes_ecd_data = ps_ctxt->ps_enc_out_ctxt->ps_cu_prms->i4_num_bytes_ecd_data;
2929*c83a76b0SSuyog Pawar if(0 != i4_num_bytes_ecd_data)
2930*c83a76b0SSuyog Pawar {
2931*c83a76b0SSuyog Pawar memcpy(
2932*c83a76b0SSuyog Pawar ps_ctxt->pu1_ecd_data,
2933*c83a76b0SSuyog Pawar &ps_ctxt->pu1_cu_recur_coeffs[0],
2934*c83a76b0SSuyog Pawar i4_num_bytes_ecd_data * sizeof(UWORD8));
2935*c83a76b0SSuyog Pawar
2936*c83a76b0SSuyog Pawar ps_ctxt->pu1_ecd_data += i4_num_bytes_ecd_data;
2937*c83a76b0SSuyog Pawar }
2938*c83a76b0SSuyog Pawar
2939*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt = ps_ctxt->ps_enc_out_ctxt - num_child_nodes;
2940*c83a76b0SSuyog Pawar
2941*c83a76b0SSuyog Pawar memcpy(
2942*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt,
2943*c83a76b0SSuyog Pawar ps_ctxt->ps_enc_out_ctxt,
2944*c83a76b0SSuyog Pawar sizeof(ihevce_enc_cu_node_ctxt_t));
2945*c83a76b0SSuyog Pawar
2946*c83a76b0SSuyog Pawar ps_enc_tmp_out_ctxt->ps_cu_prms = &ps_enc_tmp_out_ctxt->s_cu_prms;
2947*c83a76b0SSuyog Pawar
2948*c83a76b0SSuyog Pawar /* Collocated PU updates */
2949*c83a76b0SSuyog Pawar i4_num_pus_in_cu = ps_ctxt->ps_enc_out_ctxt->ps_cu_prms->u2_num_pus_in_cu;
2950*c83a76b0SSuyog Pawar /* Copy the collocated MVs and the PU map to frame buffers */
2951*c83a76b0SSuyog Pawar memcpy(ps_col_mv_bkup, as_col_mv, sizeof(pu_col_mv_t) * i4_num_pus_in_cu);
2952*c83a76b0SSuyog Pawar memcpy(
2953*c83a76b0SSuyog Pawar pu1_col_pu_map,
2954*c83a76b0SSuyog Pawar au1_cu_pu_map,
2955*c83a76b0SSuyog Pawar (MAX_CTB_SIZE / MIN_PU_SIZE) * (MAX_CTB_SIZE / MIN_PU_SIZE));
2956*c83a76b0SSuyog Pawar /* Update the frame buffer pointer and the map index */
2957*c83a76b0SSuyog Pawar *pps_col_pu = ps_col_mv_bkup + i4_num_pus_in_cu;
2958*c83a76b0SSuyog Pawar *pi4_col_start_pu_idx = i4_col_pu_idx_bkup + i4_num_pus_in_cu;
2959*c83a76b0SSuyog Pawar
2960*c83a76b0SSuyog Pawar ps_ctxt->ps_enc_out_ctxt = ps_enc_tmp_out_ctxt + 1;
2961*c83a76b0SSuyog Pawar #endif
2962*c83a76b0SSuyog Pawar
2963*c83a76b0SSuyog Pawar num_children_encoded = 1;
2964*c83a76b0SSuyog Pawar DISABLE_THE_CHILDREN_NODES(ps_cu_tree_analyse);
2965*c83a76b0SSuyog Pawar }
2966*c83a76b0SSuyog Pawar }
2967*c83a76b0SSuyog Pawar else /* if(ps_cu_tree_analyse->is_node_valid) */
2968*c83a76b0SSuyog Pawar {
2969*c83a76b0SSuyog Pawar ps_cu_tree_analyse->i8_best_rdopt_cost = i8_least_child_cost;
2970*c83a76b0SSuyog Pawar
2971*c83a76b0SSuyog Pawar /* Tree depth of four will occur for Incomplete CTB */
2972*c83a76b0SSuyog Pawar if((i8_least_child_cost > 0) && (i4_tree_depth != 3))
2973*c83a76b0SSuyog Pawar {
2974*c83a76b0SSuyog Pawar #if(PROCESS_GT_1CTB_VIA_CU_RECUR_IN_FAST_PRESETS)
2975*c83a76b0SSuyog Pawar /* Store child node Models for evalution of next CU */
2976*c83a76b0SSuyog Pawar for(i = i4_tree_depth; i < 4; i++)
2977*c83a76b0SSuyog Pawar {
2978*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2979*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i][0],
2980*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth + 1][0],
2981*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2982*c83a76b0SSuyog Pawar }
2983*c83a76b0SSuyog Pawar #else
2984*c83a76b0SSuyog Pawar if(ps_ctxt->i4_quality_preset < IHEVCE_QUALITY_P2)
2985*c83a76b0SSuyog Pawar {
2986*c83a76b0SSuyog Pawar for(i = (i4_tree_depth); i < 4; i++)
2987*c83a76b0SSuyog Pawar {
2988*c83a76b0SSuyog Pawar COPY_CABAC_STATES(
2989*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i][0],
2990*c83a76b0SSuyog Pawar &ps_ctxt->au1_rdopt_recur_ctxt_models[i4_tree_depth + 1][0],
2991*c83a76b0SSuyog Pawar IHEVC_CAB_CTXT_END * sizeof(UWORD8));
2992*c83a76b0SSuyog Pawar }
2993*c83a76b0SSuyog Pawar }
2994*c83a76b0SSuyog Pawar #endif
2995*c83a76b0SSuyog Pawar }
2996*c83a76b0SSuyog Pawar }
2997*c83a76b0SSuyog Pawar }
2998*c83a76b0SSuyog Pawar
2999*c83a76b0SSuyog Pawar return num_children_encoded;
3000*c83a76b0SSuyog Pawar }
3001*c83a76b0SSuyog Pawar
ihevce_intraData_availability_extractor(WORD8 * pi1_8x8CULevel_intraData_availability_indicator,UWORD8 u1_cu_size,UWORD8 u1_x_8x8CU_units,UWORD8 u1_y_8x8CU_units)3002*c83a76b0SSuyog Pawar static UWORD8 ihevce_intraData_availability_extractor(
3003*c83a76b0SSuyog Pawar WORD8 *pi1_8x8CULevel_intraData_availability_indicator,
3004*c83a76b0SSuyog Pawar UWORD8 u1_cu_size,
3005*c83a76b0SSuyog Pawar UWORD8 u1_x_8x8CU_units,
3006*c83a76b0SSuyog Pawar UWORD8 u1_y_8x8CU_units)
3007*c83a76b0SSuyog Pawar {
3008*c83a76b0SSuyog Pawar if(8 == u1_cu_size)
3009*c83a76b0SSuyog Pawar {
3010*c83a76b0SSuyog Pawar return (!pi1_8x8CULevel_intraData_availability_indicator
3011*c83a76b0SSuyog Pawar [u1_x_8x8CU_units + MAX_CU_IN_CTB_ROW * u1_y_8x8CU_units]);
3012*c83a76b0SSuyog Pawar }
3013*c83a76b0SSuyog Pawar else
3014*c83a76b0SSuyog Pawar {
3015*c83a76b0SSuyog Pawar UWORD8 u1_data_availability = 0;
3016*c83a76b0SSuyog Pawar UWORD8 u1_child_cu_size = u1_cu_size / 2;
3017*c83a76b0SSuyog Pawar
3018*c83a76b0SSuyog Pawar u1_data_availability |= ihevce_intraData_availability_extractor(
3019*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator,
3020*c83a76b0SSuyog Pawar u1_child_cu_size,
3021*c83a76b0SSuyog Pawar u1_x_8x8CU_units,
3022*c83a76b0SSuyog Pawar u1_y_8x8CU_units);
3023*c83a76b0SSuyog Pawar
3024*c83a76b0SSuyog Pawar u1_data_availability |= ihevce_intraData_availability_extractor(
3025*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator,
3026*c83a76b0SSuyog Pawar u1_child_cu_size,
3027*c83a76b0SSuyog Pawar u1_x_8x8CU_units + u1_child_cu_size / 8,
3028*c83a76b0SSuyog Pawar u1_y_8x8CU_units);
3029*c83a76b0SSuyog Pawar
3030*c83a76b0SSuyog Pawar u1_data_availability |= ihevce_intraData_availability_extractor(
3031*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator,
3032*c83a76b0SSuyog Pawar u1_child_cu_size,
3033*c83a76b0SSuyog Pawar u1_x_8x8CU_units,
3034*c83a76b0SSuyog Pawar u1_y_8x8CU_units + u1_child_cu_size / 8);
3035*c83a76b0SSuyog Pawar
3036*c83a76b0SSuyog Pawar u1_data_availability |= ihevce_intraData_availability_extractor(
3037*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator,
3038*c83a76b0SSuyog Pawar u1_child_cu_size,
3039*c83a76b0SSuyog Pawar u1_x_8x8CU_units + u1_child_cu_size / 8,
3040*c83a76b0SSuyog Pawar u1_y_8x8CU_units + u1_child_cu_size / 8);
3041*c83a76b0SSuyog Pawar
3042*c83a76b0SSuyog Pawar return u1_data_availability;
3043*c83a76b0SSuyog Pawar }
3044*c83a76b0SSuyog Pawar }
3045*c83a76b0SSuyog Pawar
ihevce_intra_and_inter_cuTree_merger(cur_ctb_cu_tree_t * ps_merged_tree,cur_ctb_cu_tree_t * ps_intra_tree,cur_ctb_cu_tree_t * ps_inter_tree,WORD8 * pi1_8x8CULevel_intraData_availability_indicator)3046*c83a76b0SSuyog Pawar void ihevce_intra_and_inter_cuTree_merger(
3047*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_merged_tree,
3048*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_intra_tree,
3049*c83a76b0SSuyog Pawar cur_ctb_cu_tree_t *ps_inter_tree,
3050*c83a76b0SSuyog Pawar WORD8 *pi1_8x8CULevel_intraData_availability_indicator)
3051*c83a76b0SSuyog Pawar {
3052*c83a76b0SSuyog Pawar /* 0 => Intra and inter children valid */
3053*c83a76b0SSuyog Pawar /* 1 => Only Intra valid */
3054*c83a76b0SSuyog Pawar /* 2 => Only Inter valid */
3055*c83a76b0SSuyog Pawar /* 3 => Neither */
3056*c83a76b0SSuyog Pawar UWORD8 au1_children_recursive_call_type[4];
3057*c83a76b0SSuyog Pawar
3058*c83a76b0SSuyog Pawar if(NULL != ps_intra_tree)
3059*c83a76b0SSuyog Pawar {
3060*c83a76b0SSuyog Pawar ps_intra_tree->is_node_valid =
3061*c83a76b0SSuyog Pawar ps_intra_tree->is_node_valid &
3062*c83a76b0SSuyog Pawar ihevce_intraData_availability_extractor(
3063*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator,
3064*c83a76b0SSuyog Pawar ps_intra_tree->u1_cu_size,
3065*c83a76b0SSuyog Pawar ps_intra_tree->b3_cu_pos_x & ((8 == ps_intra_tree->u1_cu_size) ? 0xfe : 0xff),
3066*c83a76b0SSuyog Pawar ps_intra_tree->b3_cu_pos_y & ((8 == ps_intra_tree->u1_cu_size) ? 0xfe : 0xff));
3067*c83a76b0SSuyog Pawar }
3068*c83a76b0SSuyog Pawar
3069*c83a76b0SSuyog Pawar switch(((NULL == ps_intra_tree) << 1) | (NULL == ps_inter_tree))
3070*c83a76b0SSuyog Pawar {
3071*c83a76b0SSuyog Pawar case 0:
3072*c83a76b0SSuyog Pawar {
3073*c83a76b0SSuyog Pawar ps_merged_tree->is_node_valid = ps_intra_tree->is_node_valid ||
3074*c83a76b0SSuyog Pawar ps_inter_tree->is_node_valid;
3075*c83a76b0SSuyog Pawar ps_merged_tree->u1_inter_eval_enable = ps_inter_tree->is_node_valid;
3076*c83a76b0SSuyog Pawar ps_merged_tree->u1_intra_eval_enable = ps_intra_tree->is_node_valid;
3077*c83a76b0SSuyog Pawar
3078*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_TL] =
3079*c83a76b0SSuyog Pawar ((NULL == ps_intra_tree->ps_child_node_tl) << 1) |
3080*c83a76b0SSuyog Pawar (NULL == ps_inter_tree->ps_child_node_tl);
3081*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_TR] =
3082*c83a76b0SSuyog Pawar ((NULL == ps_intra_tree->ps_child_node_tr) << 1) |
3083*c83a76b0SSuyog Pawar (NULL == ps_inter_tree->ps_child_node_tr);
3084*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_BL] =
3085*c83a76b0SSuyog Pawar ((NULL == ps_intra_tree->ps_child_node_bl) << 1) |
3086*c83a76b0SSuyog Pawar (NULL == ps_inter_tree->ps_child_node_bl);
3087*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_BR] =
3088*c83a76b0SSuyog Pawar ((NULL == ps_intra_tree->ps_child_node_br) << 1) |
3089*c83a76b0SSuyog Pawar (NULL == ps_inter_tree->ps_child_node_br);
3090*c83a76b0SSuyog Pawar
3091*c83a76b0SSuyog Pawar break;
3092*c83a76b0SSuyog Pawar }
3093*c83a76b0SSuyog Pawar case 1:
3094*c83a76b0SSuyog Pawar {
3095*c83a76b0SSuyog Pawar ps_merged_tree->is_node_valid = ps_intra_tree->is_node_valid;
3096*c83a76b0SSuyog Pawar ps_merged_tree->u1_inter_eval_enable = 0;
3097*c83a76b0SSuyog Pawar ps_merged_tree->u1_intra_eval_enable = ps_intra_tree->is_node_valid;
3098*c83a76b0SSuyog Pawar
3099*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_TL] =
3100*c83a76b0SSuyog Pawar ((NULL == ps_intra_tree->ps_child_node_tl) << 1) + 1;
3101*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_TR] =
3102*c83a76b0SSuyog Pawar ((NULL == ps_intra_tree->ps_child_node_tr) << 1) + 1;
3103*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_BL] =
3104*c83a76b0SSuyog Pawar ((NULL == ps_intra_tree->ps_child_node_bl) << 1) + 1;
3105*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_BR] =
3106*c83a76b0SSuyog Pawar ((NULL == ps_intra_tree->ps_child_node_br) << 1) + 1;
3107*c83a76b0SSuyog Pawar
3108*c83a76b0SSuyog Pawar break;
3109*c83a76b0SSuyog Pawar }
3110*c83a76b0SSuyog Pawar case 2:
3111*c83a76b0SSuyog Pawar {
3112*c83a76b0SSuyog Pawar ps_merged_tree->is_node_valid = ps_inter_tree->is_node_valid;
3113*c83a76b0SSuyog Pawar ps_merged_tree->u1_inter_eval_enable = ps_inter_tree->is_node_valid;
3114*c83a76b0SSuyog Pawar ps_merged_tree->u1_intra_eval_enable = 0;
3115*c83a76b0SSuyog Pawar
3116*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_TL] = 2 + (NULL == ps_inter_tree->ps_child_node_tl);
3117*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_TR] = 2 + (NULL == ps_inter_tree->ps_child_node_tr);
3118*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_BL] = 2 + (NULL == ps_inter_tree->ps_child_node_bl);
3119*c83a76b0SSuyog Pawar au1_children_recursive_call_type[POS_BR] = 2 + (NULL == ps_inter_tree->ps_child_node_br);
3120*c83a76b0SSuyog Pawar
3121*c83a76b0SSuyog Pawar break;
3122*c83a76b0SSuyog Pawar }
3123*c83a76b0SSuyog Pawar case 3:
3124*c83a76b0SSuyog Pawar {
3125*c83a76b0SSuyog Pawar /* The swamps of Dagobah! */
3126*c83a76b0SSuyog Pawar ASSERT(0);
3127*c83a76b0SSuyog Pawar
3128*c83a76b0SSuyog Pawar break;
3129*c83a76b0SSuyog Pawar }
3130*c83a76b0SSuyog Pawar }
3131*c83a76b0SSuyog Pawar
3132*c83a76b0SSuyog Pawar switch(au1_children_recursive_call_type[POS_TL])
3133*c83a76b0SSuyog Pawar {
3134*c83a76b0SSuyog Pawar case 0:
3135*c83a76b0SSuyog Pawar {
3136*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3137*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_tl,
3138*c83a76b0SSuyog Pawar ps_intra_tree->ps_child_node_tl,
3139*c83a76b0SSuyog Pawar ps_inter_tree->ps_child_node_tl,
3140*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3141*c83a76b0SSuyog Pawar
3142*c83a76b0SSuyog Pawar break;
3143*c83a76b0SSuyog Pawar }
3144*c83a76b0SSuyog Pawar case 2:
3145*c83a76b0SSuyog Pawar {
3146*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3147*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_tl,
3148*c83a76b0SSuyog Pawar NULL,
3149*c83a76b0SSuyog Pawar ps_inter_tree->ps_child_node_tl,
3150*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3151*c83a76b0SSuyog Pawar
3152*c83a76b0SSuyog Pawar break;
3153*c83a76b0SSuyog Pawar }
3154*c83a76b0SSuyog Pawar case 1:
3155*c83a76b0SSuyog Pawar {
3156*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3157*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_tl,
3158*c83a76b0SSuyog Pawar ps_intra_tree->ps_child_node_tl,
3159*c83a76b0SSuyog Pawar NULL,
3160*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3161*c83a76b0SSuyog Pawar
3162*c83a76b0SSuyog Pawar break;
3163*c83a76b0SSuyog Pawar }
3164*c83a76b0SSuyog Pawar }
3165*c83a76b0SSuyog Pawar
3166*c83a76b0SSuyog Pawar switch(au1_children_recursive_call_type[POS_TR])
3167*c83a76b0SSuyog Pawar {
3168*c83a76b0SSuyog Pawar case 0:
3169*c83a76b0SSuyog Pawar {
3170*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3171*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_tr,
3172*c83a76b0SSuyog Pawar ps_intra_tree->ps_child_node_tr,
3173*c83a76b0SSuyog Pawar ps_inter_tree->ps_child_node_tr,
3174*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3175*c83a76b0SSuyog Pawar
3176*c83a76b0SSuyog Pawar break;
3177*c83a76b0SSuyog Pawar }
3178*c83a76b0SSuyog Pawar case 2:
3179*c83a76b0SSuyog Pawar {
3180*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3181*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_tr,
3182*c83a76b0SSuyog Pawar NULL,
3183*c83a76b0SSuyog Pawar ps_inter_tree->ps_child_node_tr,
3184*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3185*c83a76b0SSuyog Pawar
3186*c83a76b0SSuyog Pawar break;
3187*c83a76b0SSuyog Pawar }
3188*c83a76b0SSuyog Pawar case 1:
3189*c83a76b0SSuyog Pawar {
3190*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3191*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_tr,
3192*c83a76b0SSuyog Pawar ps_intra_tree->ps_child_node_tr,
3193*c83a76b0SSuyog Pawar NULL,
3194*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3195*c83a76b0SSuyog Pawar
3196*c83a76b0SSuyog Pawar break;
3197*c83a76b0SSuyog Pawar }
3198*c83a76b0SSuyog Pawar }
3199*c83a76b0SSuyog Pawar
3200*c83a76b0SSuyog Pawar switch(au1_children_recursive_call_type[POS_BL])
3201*c83a76b0SSuyog Pawar {
3202*c83a76b0SSuyog Pawar case 0:
3203*c83a76b0SSuyog Pawar {
3204*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3205*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_bl,
3206*c83a76b0SSuyog Pawar ps_intra_tree->ps_child_node_bl,
3207*c83a76b0SSuyog Pawar ps_inter_tree->ps_child_node_bl,
3208*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3209*c83a76b0SSuyog Pawar
3210*c83a76b0SSuyog Pawar break;
3211*c83a76b0SSuyog Pawar }
3212*c83a76b0SSuyog Pawar case 2:
3213*c83a76b0SSuyog Pawar {
3214*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3215*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_bl,
3216*c83a76b0SSuyog Pawar NULL,
3217*c83a76b0SSuyog Pawar ps_inter_tree->ps_child_node_bl,
3218*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3219*c83a76b0SSuyog Pawar
3220*c83a76b0SSuyog Pawar break;
3221*c83a76b0SSuyog Pawar }
3222*c83a76b0SSuyog Pawar case 1:
3223*c83a76b0SSuyog Pawar {
3224*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3225*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_bl,
3226*c83a76b0SSuyog Pawar ps_intra_tree->ps_child_node_bl,
3227*c83a76b0SSuyog Pawar NULL,
3228*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3229*c83a76b0SSuyog Pawar
3230*c83a76b0SSuyog Pawar break;
3231*c83a76b0SSuyog Pawar }
3232*c83a76b0SSuyog Pawar }
3233*c83a76b0SSuyog Pawar
3234*c83a76b0SSuyog Pawar switch(au1_children_recursive_call_type[POS_BR])
3235*c83a76b0SSuyog Pawar {
3236*c83a76b0SSuyog Pawar case 0:
3237*c83a76b0SSuyog Pawar {
3238*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3239*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_br,
3240*c83a76b0SSuyog Pawar ps_intra_tree->ps_child_node_br,
3241*c83a76b0SSuyog Pawar ps_inter_tree->ps_child_node_br,
3242*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3243*c83a76b0SSuyog Pawar
3244*c83a76b0SSuyog Pawar break;
3245*c83a76b0SSuyog Pawar }
3246*c83a76b0SSuyog Pawar case 2:
3247*c83a76b0SSuyog Pawar {
3248*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3249*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_br,
3250*c83a76b0SSuyog Pawar NULL,
3251*c83a76b0SSuyog Pawar ps_inter_tree->ps_child_node_br,
3252*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3253*c83a76b0SSuyog Pawar
3254*c83a76b0SSuyog Pawar break;
3255*c83a76b0SSuyog Pawar }
3256*c83a76b0SSuyog Pawar case 1:
3257*c83a76b0SSuyog Pawar {
3258*c83a76b0SSuyog Pawar ihevce_intra_and_inter_cuTree_merger(
3259*c83a76b0SSuyog Pawar ps_merged_tree->ps_child_node_br,
3260*c83a76b0SSuyog Pawar ps_intra_tree->ps_child_node_br,
3261*c83a76b0SSuyog Pawar NULL,
3262*c83a76b0SSuyog Pawar pi1_8x8CULevel_intraData_availability_indicator);
3263*c83a76b0SSuyog Pawar
3264*c83a76b0SSuyog Pawar break;
3265*c83a76b0SSuyog Pawar }
3266*c83a76b0SSuyog Pawar }
3267*c83a76b0SSuyog Pawar }
3268