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_frame_process.c
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * \brief
26*c83a76b0SSuyog Pawar * This file contains top level functions related Frame processing
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 #include <time.h>
52*c83a76b0SSuyog Pawar
53*c83a76b0SSuyog Pawar /* User include files */
54*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
55*c83a76b0SSuyog Pawar #include "itt_video_api.h"
56*c83a76b0SSuyog Pawar #include "ihevce_api.h"
57*c83a76b0SSuyog Pawar
58*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
59*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
60*c83a76b0SSuyog Pawar #include "rc_look_ahead_params.h"
61*c83a76b0SSuyog Pawar
62*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
63*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
64*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
65*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
66*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
67*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
68*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
69*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
70*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
71*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
72*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
73*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
74*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
75*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
76*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
77*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
78*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
79*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
80*c83a76b0SSuyog Pawar #include "ihevc_common_tables.h"
81*c83a76b0SSuyog Pawar
82*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
83*c83a76b0SSuyog Pawar #include "ihevce_buffer_que_interface.h"
84*c83a76b0SSuyog Pawar #include "ihevce_hle_interface.h"
85*c83a76b0SSuyog Pawar #include "ihevce_hle_q_func.h"
86*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
87*c83a76b0SSuyog Pawar #include "ihevce_lap_interface.h"
88*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
89*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_funcs.h"
90*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
91*c83a76b0SSuyog Pawar #include "ihevce_had_satd.h"
92*c83a76b0SSuyog Pawar #include "ihevce_error_checks.h"
93*c83a76b0SSuyog Pawar #include "ihevce_error_codes.h"
94*c83a76b0SSuyog Pawar #include "ihevce_bitstream.h"
95*c83a76b0SSuyog Pawar #include "ihevce_cabac.h"
96*c83a76b0SSuyog Pawar #include "ihevce_rdoq_macros.h"
97*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
98*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
99*c83a76b0SSuyog Pawar #include "ihevce_global_tables.h"
100*c83a76b0SSuyog Pawar #include "ihevce_cmn_utils_instr_set_router.h"
101*c83a76b0SSuyog Pawar #include "ihevce_ipe_instr_set_router.h"
102*c83a76b0SSuyog Pawar #include "ihevce_entropy_structs.h"
103*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_structs.h"
104*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_utils.h"
105*c83a76b0SSuyog Pawar #include "ihevce_inter_pred.h"
106*c83a76b0SSuyog Pawar #include "ihevce_common_utils.h"
107*c83a76b0SSuyog Pawar #include "ihevce_sub_pic_rc.h"
108*c83a76b0SSuyog Pawar #include "hme_datatype.h"
109*c83a76b0SSuyog Pawar #include "hme_interface.h"
110*c83a76b0SSuyog Pawar #include "hme_common_defs.h"
111*c83a76b0SSuyog Pawar #include "hme_defs.h"
112*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_pass.h"
113*c83a76b0SSuyog Pawar #include "ihevce_trace.h"
114*c83a76b0SSuyog Pawar #include "ihevce_encode_header.h"
115*c83a76b0SSuyog Pawar #include "ihevce_encode_header_sei_vui.h"
116*c83a76b0SSuyog Pawar #include "ihevce_ipe_structs.h"
117*c83a76b0SSuyog Pawar #include "ihevce_ipe_pass.h"
118*c83a76b0SSuyog Pawar #include "ihevce_dep_mngr_interface.h"
119*c83a76b0SSuyog Pawar #include "ihevce_rc_enc_structs.h"
120*c83a76b0SSuyog Pawar #include "hme_globals.h"
121*c83a76b0SSuyog Pawar #include "ihevce_me_pass.h"
122*c83a76b0SSuyog Pawar #include "ihevce_coarse_me_pass.h"
123*c83a76b0SSuyog Pawar #include "ihevce_frame_process.h"
124*c83a76b0SSuyog Pawar #include "ihevce_rc_interface.h"
125*c83a76b0SSuyog Pawar #include "ihevce_profile.h"
126*c83a76b0SSuyog Pawar #include "ihevce_decomp_pre_intra_structs.h"
127*c83a76b0SSuyog Pawar #include "ihevce_decomp_pre_intra_pass.h"
128*c83a76b0SSuyog Pawar #include "ihevce_frame_process_utils.h"
129*c83a76b0SSuyog Pawar
130*c83a76b0SSuyog Pawar #include "cast_types.h"
131*c83a76b0SSuyog Pawar #include "osal.h"
132*c83a76b0SSuyog Pawar #include "osal_defaults.h"
133*c83a76b0SSuyog Pawar
134*c83a76b0SSuyog Pawar /*****************************************************************************/
135*c83a76b0SSuyog Pawar /* Constant Macros */
136*c83a76b0SSuyog Pawar /*****************************************************************************/
137*c83a76b0SSuyog Pawar
138*c83a76b0SSuyog Pawar #define REF_MOD_STRENGTH 1.0
139*c83a76b0SSuyog Pawar #define REF_MAX_STRENGTH 1.4f
140*c83a76b0SSuyog Pawar
141*c83a76b0SSuyog Pawar /*****************************************************************************/
142*c83a76b0SSuyog Pawar /* Extern variables */
143*c83a76b0SSuyog Pawar /*****************************************************************************/
144*c83a76b0SSuyog Pawar
145*c83a76b0SSuyog Pawar /**
146*c83a76b0SSuyog Pawar * @var QP2QUANT_MD[]
147*c83a76b0SSuyog Pawar *
148*c83a76b0SSuyog Pawar * @brief Direct Cost Comoparision Table
149*c83a76b0SSuyog Pawar *
150*c83a76b0SSuyog Pawar * @param Comments: Direct cost is compared with 16 * QP2QUANT_MD[Qp]
151*c83a76b0SSuyog Pawar * If direct cost is less than 16 * QP2QUANT_MD[Qp]
152*c83a76b0SSuyog Pawar * than direct cost is assumed to be zero
153*c83a76b0SSuyog Pawar */
154*c83a76b0SSuyog Pawar const WORD16 QP2QUANT_MD[52] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
155*c83a76b0SSuyog Pawar 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4,
156*c83a76b0SSuyog Pawar 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16, 18, 20,
157*c83a76b0SSuyog Pawar 23, 25, 29, 32, 36, 40, 45, 51, 57, 64, 72, 81, 91 };
158*c83a76b0SSuyog Pawar
159*c83a76b0SSuyog Pawar /*
160*c83a76b0SSuyog Pawar Gaussian 11x11 window with a sigma of 1.5 - values multiplied by 2048
161*c83a76b0SSuyog Pawar Window made into 9x9 window as most entries were zero
162*c83a76b0SSuyog Pawar The center weight has been reduced by 1 after dropping first row/col and last row/col
163*c83a76b0SSuyog Pawar */
164*c83a76b0SSuyog Pawar UWORD8 g_u1_win_size = 9;
165*c83a76b0SSuyog Pawar UWORD8 g_u1_win_q_shift = 11;
166*c83a76b0SSuyog Pawar UWORD8 au1_g_win[81] = { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 3, 8, 16, 20, 16, 8, 3,
167*c83a76b0SSuyog Pawar 1, 2, 8, 24, 48, 60, 48, 24, 8, 2, 3, 16, 48, 93, 116, 93, 48,
168*c83a76b0SSuyog Pawar 16, 3, 4, 20, 60, 116, 144, 116, 60, 20, 4, 3, 16, 48, 93, 116, 93,
169*c83a76b0SSuyog Pawar 48, 16, 3, 2, 8, 24, 48, 60, 48, 24, 8, 2, 1, 3, 8, 16, 20,
170*c83a76b0SSuyog Pawar 16, 8, 3, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0 };
171*c83a76b0SSuyog Pawar
172*c83a76b0SSuyog Pawar /* lagrange params */
173*c83a76b0SSuyog Pawar const double lamda_modifier_for_I_pic[8] = { 0.85, 0.7471, 0.6646, 0.5913,
174*c83a76b0SSuyog Pawar 0.5261, 0.4680, 0.4164, 0.3705 };
175*c83a76b0SSuyog Pawar
176*c83a76b0SSuyog Pawar /*****************************************************************************/
177*c83a76b0SSuyog Pawar /* Function Definitions */
178*c83a76b0SSuyog Pawar /*****************************************************************************/
179*c83a76b0SSuyog Pawar
180*c83a76b0SSuyog Pawar /*!
181*c83a76b0SSuyog Pawar ******************************************************************************
182*c83a76b0SSuyog Pawar * \if Function name : ihevce_mbr_quality_tool_set_configuration \endif
183*c83a76b0SSuyog Pawar *
184*c83a76b0SSuyog Pawar * \brief
185*c83a76b0SSuyog Pawar * tool set selection for auxilary bitrate. currently only num intra and inter
186*c83a76b0SSuyog Pawar * candidates for auxilary bitrates are controlled
187*c83a76b0SSuyog Pawar *
188*c83a76b0SSuyog Pawar * \param[in] ps_enc_loop_thrd_ctxt : enc ctxt
189*c83a76b0SSuyog Pawar * \param[in] ps_stat_prms: static parameters
190*c83a76b0SSuyog Pawar * \return
191*c83a76b0SSuyog Pawar * None
192*c83a76b0SSuyog Pawar *
193*c83a76b0SSuyog Pawar * \author
194*c83a76b0SSuyog Pawar * Ittiam
195*c83a76b0SSuyog Pawar *
196*c83a76b0SSuyog Pawar *****************************************************************************
197*c83a76b0SSuyog Pawar */
ihevce_mbr_quality_tool_set_configuration(ihevce_enc_loop_ctxt_t * ps_enc_loop_thrd_ctxt,ihevce_static_cfg_params_t * ps_stat_prms)198*c83a76b0SSuyog Pawar void ihevce_mbr_quality_tool_set_configuration(
199*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_enc_loop_thrd_ctxt, ihevce_static_cfg_params_t *ps_stat_prms)
200*c83a76b0SSuyog Pawar {
201*c83a76b0SSuyog Pawar /* for single bitrate encoder*/
202*c83a76b0SSuyog Pawar switch(ps_stat_prms->s_tgt_lyr_prms.i4_mbr_quality_setting)
203*c83a76b0SSuyog Pawar {
204*c83a76b0SSuyog Pawar case IHEVCE_MBR_HIGH_QUALITY:
205*c83a76b0SSuyog Pawar ps_enc_loop_thrd_ctxt->i4_num_modes_to_evaluate_intra = 3;
206*c83a76b0SSuyog Pawar ps_enc_loop_thrd_ctxt->i4_num_modes_to_evaluate_inter = 4;
207*c83a76b0SSuyog Pawar break;
208*c83a76b0SSuyog Pawar
209*c83a76b0SSuyog Pawar case IHEVCE_MBR_MEDIUM_SPEED:
210*c83a76b0SSuyog Pawar ps_enc_loop_thrd_ctxt->i4_num_modes_to_evaluate_intra = 3;
211*c83a76b0SSuyog Pawar ps_enc_loop_thrd_ctxt->i4_num_modes_to_evaluate_inter = 3;
212*c83a76b0SSuyog Pawar break;
213*c83a76b0SSuyog Pawar
214*c83a76b0SSuyog Pawar case IHEVCE_MBR_HIGH_SPEED:
215*c83a76b0SSuyog Pawar ps_enc_loop_thrd_ctxt->i4_num_modes_to_evaluate_intra = 2;
216*c83a76b0SSuyog Pawar ps_enc_loop_thrd_ctxt->i4_num_modes_to_evaluate_inter = 2;
217*c83a76b0SSuyog Pawar break;
218*c83a76b0SSuyog Pawar
219*c83a76b0SSuyog Pawar case IHEVCE_MBR_EXTREME_SPEED:
220*c83a76b0SSuyog Pawar ps_enc_loop_thrd_ctxt->i4_num_modes_to_evaluate_intra = 1;
221*c83a76b0SSuyog Pawar ps_enc_loop_thrd_ctxt->i4_num_modes_to_evaluate_inter = 1;
222*c83a76b0SSuyog Pawar break;
223*c83a76b0SSuyog Pawar
224*c83a76b0SSuyog Pawar default:
225*c83a76b0SSuyog Pawar assert(0);
226*c83a76b0SSuyog Pawar break;
227*c83a76b0SSuyog Pawar }
228*c83a76b0SSuyog Pawar }
229*c83a76b0SSuyog Pawar
230*c83a76b0SSuyog Pawar /*!
231*c83a76b0SSuyog Pawar ******************************************************************************
232*c83a76b0SSuyog Pawar * \if Function name : ihevce_find_free_indx \endif
233*c83a76b0SSuyog Pawar *
234*c83a76b0SSuyog Pawar * \brief
235*c83a76b0SSuyog Pawar * Pre encode Frame processing slave thread entry point function
236*c83a76b0SSuyog Pawar *
237*c83a76b0SSuyog Pawar * \param[in] Frame processing thread context pointer
238*c83a76b0SSuyog Pawar *
239*c83a76b0SSuyog Pawar * \return
240*c83a76b0SSuyog Pawar * None
241*c83a76b0SSuyog Pawar *
242*c83a76b0SSuyog Pawar * \author
243*c83a76b0SSuyog Pawar * Ittiam
244*c83a76b0SSuyog Pawar *
245*c83a76b0SSuyog Pawar *****************************************************************************
246*c83a76b0SSuyog Pawar */
ihevce_find_free_indx(recon_pic_buf_t ** pps_recon_buf_q,WORD32 i4_num_buf)247*c83a76b0SSuyog Pawar WORD32 ihevce_find_free_indx(recon_pic_buf_t **pps_recon_buf_q, WORD32 i4_num_buf)
248*c83a76b0SSuyog Pawar {
249*c83a76b0SSuyog Pawar WORD32 i4_ctr;
250*c83a76b0SSuyog Pawar WORD32 i4_is_full = 1;
251*c83a76b0SSuyog Pawar WORD32 i4_least_POC = 0x7FFFFFFF;
252*c83a76b0SSuyog Pawar WORD32 i4_least_POC_idx = -1;
253*c83a76b0SSuyog Pawar WORD32 i4_least_GOP_num = 0x7FFFFFFF;
254*c83a76b0SSuyog Pawar
255*c83a76b0SSuyog Pawar for(i4_ctr = 0; i4_ctr < i4_num_buf; i4_ctr++)
256*c83a76b0SSuyog Pawar {
257*c83a76b0SSuyog Pawar if(pps_recon_buf_q[i4_ctr]->i4_is_free == 1)
258*c83a76b0SSuyog Pawar {
259*c83a76b0SSuyog Pawar i4_is_full = 0;
260*c83a76b0SSuyog Pawar break;
261*c83a76b0SSuyog Pawar }
262*c83a76b0SSuyog Pawar }
263*c83a76b0SSuyog Pawar if(i4_is_full)
264*c83a76b0SSuyog Pawar {
265*c83a76b0SSuyog Pawar /* remove if any non-reference pictures are present */
266*c83a76b0SSuyog Pawar for(i4_ctr = 0; i4_ctr < i4_num_buf; i4_ctr++)
267*c83a76b0SSuyog Pawar {
268*c83a76b0SSuyog Pawar if(!pps_recon_buf_q[i4_ctr]->i4_is_reference &&
269*c83a76b0SSuyog Pawar pps_recon_buf_q[i4_ctr]->i4_non_ref_free_flag)
270*c83a76b0SSuyog Pawar {
271*c83a76b0SSuyog Pawar i4_least_POC_idx = i4_ctr;
272*c83a76b0SSuyog Pawar break;
273*c83a76b0SSuyog Pawar }
274*c83a76b0SSuyog Pawar }
275*c83a76b0SSuyog Pawar /* if all non reference pictures are removed, then find the least poc
276*c83a76b0SSuyog Pawar in the least gop number*/
277*c83a76b0SSuyog Pawar if(i4_least_POC_idx == -1)
278*c83a76b0SSuyog Pawar {
279*c83a76b0SSuyog Pawar for(i4_ctr = 0; i4_ctr < i4_num_buf; i4_ctr++)
280*c83a76b0SSuyog Pawar {
281*c83a76b0SSuyog Pawar if(i4_least_GOP_num > pps_recon_buf_q[i4_ctr]->i4_idr_gop_num)
282*c83a76b0SSuyog Pawar {
283*c83a76b0SSuyog Pawar i4_least_GOP_num = pps_recon_buf_q[i4_ctr]->i4_idr_gop_num;
284*c83a76b0SSuyog Pawar }
285*c83a76b0SSuyog Pawar }
286*c83a76b0SSuyog Pawar for(i4_ctr = 0; i4_ctr < i4_num_buf; i4_ctr++)
287*c83a76b0SSuyog Pawar {
288*c83a76b0SSuyog Pawar if(i4_least_POC > pps_recon_buf_q[i4_ctr]->i4_poc &&
289*c83a76b0SSuyog Pawar i4_least_GOP_num == pps_recon_buf_q[i4_ctr]->i4_idr_gop_num)
290*c83a76b0SSuyog Pawar {
291*c83a76b0SSuyog Pawar i4_least_POC = pps_recon_buf_q[i4_ctr]->i4_poc;
292*c83a76b0SSuyog Pawar i4_least_POC_idx = i4_ctr;
293*c83a76b0SSuyog Pawar }
294*c83a76b0SSuyog Pawar }
295*c83a76b0SSuyog Pawar }
296*c83a76b0SSuyog Pawar }
297*c83a76b0SSuyog Pawar return i4_least_POC_idx;
298*c83a76b0SSuyog Pawar }
299*c83a76b0SSuyog Pawar
300*c83a76b0SSuyog Pawar /*!
301*c83a76b0SSuyog Pawar ******************************************************************************
302*c83a76b0SSuyog Pawar * \if Function name : complexity_RC_reset_marking \endif
303*c83a76b0SSuyog Pawar *
304*c83a76b0SSuyog Pawar * \brief
305*c83a76b0SSuyog Pawar * this function the complexity variation and set the complexity change flag for
306*c83a76b0SSuyog Pawar * rate control to reset the model
307*c83a76b0SSuyog Pawar *
308*c83a76b0SSuyog Pawar * \param[in] ps_enc_loop_thrd_ctxt : enc ctxt
309*c83a76b0SSuyog Pawar * \param[in] ps_stat_prms: static parameters
310*c83a76b0SSuyog Pawar * \return
311*c83a76b0SSuyog Pawar * None
312*c83a76b0SSuyog Pawar *
313*c83a76b0SSuyog Pawar * \author
314*c83a76b0SSuyog Pawar * Ittiam
315*c83a76b0SSuyog Pawar *
316*c83a76b0SSuyog Pawar *****************************************************************************
317*c83a76b0SSuyog Pawar */
complexity_RC_reset_marking(enc_ctxt_t * ps_enc_ctxt,WORD32 i4_cur_ipe_idx,WORD32 i4_end_flag)318*c83a76b0SSuyog Pawar void complexity_RC_reset_marking(enc_ctxt_t *ps_enc_ctxt, WORD32 i4_cur_ipe_idx, WORD32 i4_end_flag)
319*c83a76b0SSuyog Pawar {
320*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_cur_ipe_lap_out;
321*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_lap_out_temp;
322*c83a76b0SSuyog Pawar WORD32 i4_max_temporal_layers;
323*c83a76b0SSuyog Pawar
324*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out =
325*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.aps_curr_inp_pre_enc[i4_cur_ipe_idx]->s_rc_lap_out;
326*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_is_cmplx_change_reset_model = 0;
327*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_is_cmplx_change_reset_bits = 0;
328*c83a76b0SSuyog Pawar
329*c83a76b0SSuyog Pawar i4_max_temporal_layers = ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_temporal_layers;
330*c83a76b0SSuyog Pawar
331*c83a76b0SSuyog Pawar /*reset the RC_reset counter at reset points*/
332*c83a76b0SSuyog Pawar if(ps_cur_ipe_lap_out->i4_is_I_only_scd || ps_cur_ipe_lap_out->i4_is_non_I_scd ||
333*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_rc_scene_type == SCENE_TYPE_SCENE_CUT)
334*c83a76b0SSuyog Pawar {
335*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_past_RC_reset_count = 0;
336*c83a76b0SSuyog Pawar }
337*c83a76b0SSuyog Pawar
338*c83a76b0SSuyog Pawar if(ps_cur_ipe_lap_out->i4_rc_scene_type == SCENE_TYPE_SCENE_CUT)
339*c83a76b0SSuyog Pawar {
340*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_past_RC_scd_reset_count = 0;
341*c83a76b0SSuyog Pawar }
342*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_past_RC_reset_count++;
343*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_past_RC_scd_reset_count++;
344*c83a76b0SSuyog Pawar
345*c83a76b0SSuyog Pawar /*complexity based rate control reset */
346*c83a76b0SSuyog Pawar
347*c83a76b0SSuyog Pawar if((ps_cur_ipe_lap_out->i4_rc_pic_type == IV_P_FRAME ||
348*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_rc_pic_type == IV_I_FRAME) &&
349*c83a76b0SSuyog Pawar (i4_max_temporal_layers > 1) && (!i4_end_flag) &&
350*c83a76b0SSuyog Pawar (ps_enc_ctxt->s_multi_thrd.i4_delay_pre_me_btw_l0_ipe > (2 * (1 << i4_max_temporal_layers))))
351*c83a76b0SSuyog Pawar {
352*c83a76b0SSuyog Pawar WORD32 i4_is_cur_pic_high_complex_region =
353*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_curr_out_pre_enc[i4_cur_ipe_idx]
354*c83a76b0SSuyog Pawar ->i4_is_high_complex_region;
355*c83a76b0SSuyog Pawar WORD32 i4_next_ipe_idx;
356*c83a76b0SSuyog Pawar WORD32 i4_next_next_ipe_idx;
357*c83a76b0SSuyog Pawar WORD32 i4_temp_ipe_idx;
358*c83a76b0SSuyog Pawar WORD32 i;
359*c83a76b0SSuyog Pawar
360*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_future_RC_reset = 0;
361*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_future_RC_scd_reset = 0;
362*c83a76b0SSuyog Pawar ASSERT(i4_is_cur_pic_high_complex_region != -1);
363*c83a76b0SSuyog Pawar
364*c83a76b0SSuyog Pawar /*get the next idx of p/i picture */
365*c83a76b0SSuyog Pawar i4_next_ipe_idx = (i4_cur_ipe_idx + 1);
366*c83a76b0SSuyog Pawar if(i4_next_ipe_idx >= ps_enc_ctxt->s_multi_thrd.i4_max_delay_pre_me_btw_l0_ipe)
367*c83a76b0SSuyog Pawar {
368*c83a76b0SSuyog Pawar i4_next_ipe_idx = 0;
369*c83a76b0SSuyog Pawar }
370*c83a76b0SSuyog Pawar i4_temp_ipe_idx = i4_next_ipe_idx;
371*c83a76b0SSuyog Pawar for(i = 0; i < (1 << i4_max_temporal_layers); i++)
372*c83a76b0SSuyog Pawar {
373*c83a76b0SSuyog Pawar ps_lap_out_temp =
374*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.aps_curr_inp_pre_enc[i4_next_ipe_idx]->s_rc_lap_out;
375*c83a76b0SSuyog Pawar
376*c83a76b0SSuyog Pawar if(ps_lap_out_temp->i4_rc_pic_type == IV_P_FRAME ||
377*c83a76b0SSuyog Pawar ps_lap_out_temp->i4_rc_pic_type == IV_I_FRAME)
378*c83a76b0SSuyog Pawar {
379*c83a76b0SSuyog Pawar break;
380*c83a76b0SSuyog Pawar }
381*c83a76b0SSuyog Pawar i4_next_ipe_idx++;
382*c83a76b0SSuyog Pawar if(i4_next_ipe_idx >= ps_enc_ctxt->s_multi_thrd.i4_max_delay_pre_me_btw_l0_ipe)
383*c83a76b0SSuyog Pawar {
384*c83a76b0SSuyog Pawar i4_next_ipe_idx = 0;
385*c83a76b0SSuyog Pawar }
386*c83a76b0SSuyog Pawar }
387*c83a76b0SSuyog Pawar /* get the next idx of next p/i picture*/
388*c83a76b0SSuyog Pawar i4_next_next_ipe_idx = (i4_next_ipe_idx + 1);
389*c83a76b0SSuyog Pawar if(i4_next_next_ipe_idx >= ps_enc_ctxt->s_multi_thrd.i4_max_delay_pre_me_btw_l0_ipe)
390*c83a76b0SSuyog Pawar {
391*c83a76b0SSuyog Pawar i4_next_next_ipe_idx = 0;
392*c83a76b0SSuyog Pawar }
393*c83a76b0SSuyog Pawar for(i = 0; i < (1 << i4_max_temporal_layers); i++)
394*c83a76b0SSuyog Pawar {
395*c83a76b0SSuyog Pawar ps_lap_out_temp =
396*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.aps_curr_inp_pre_enc[i4_next_next_ipe_idx]->s_rc_lap_out;
397*c83a76b0SSuyog Pawar
398*c83a76b0SSuyog Pawar if(ps_lap_out_temp->i4_rc_pic_type == IV_P_FRAME ||
399*c83a76b0SSuyog Pawar ps_lap_out_temp->i4_rc_pic_type == IV_I_FRAME)
400*c83a76b0SSuyog Pawar {
401*c83a76b0SSuyog Pawar break;
402*c83a76b0SSuyog Pawar }
403*c83a76b0SSuyog Pawar i4_next_next_ipe_idx++;
404*c83a76b0SSuyog Pawar if(i4_next_next_ipe_idx >= ps_enc_ctxt->s_multi_thrd.i4_max_delay_pre_me_btw_l0_ipe)
405*c83a76b0SSuyog Pawar {
406*c83a76b0SSuyog Pawar i4_next_next_ipe_idx = 0;
407*c83a76b0SSuyog Pawar }
408*c83a76b0SSuyog Pawar }
409*c83a76b0SSuyog Pawar
410*c83a76b0SSuyog Pawar /*check for any possible RC reset in the future 8 frames*/
411*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
412*c83a76b0SSuyog Pawar {
413*c83a76b0SSuyog Pawar ps_lap_out_temp =
414*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.aps_curr_inp_pre_enc[i4_temp_ipe_idx]->s_rc_lap_out;
415*c83a76b0SSuyog Pawar
416*c83a76b0SSuyog Pawar if(ps_lap_out_temp->i4_is_I_only_scd || ps_lap_out_temp->i4_is_non_I_scd ||
417*c83a76b0SSuyog Pawar ps_lap_out_temp->i4_rc_scene_type == SCENE_TYPE_SCENE_CUT)
418*c83a76b0SSuyog Pawar {
419*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_future_RC_reset = 1;
420*c83a76b0SSuyog Pawar }
421*c83a76b0SSuyog Pawar if(ps_cur_ipe_lap_out->i4_rc_scene_type == SCENE_TYPE_SCENE_CUT)
422*c83a76b0SSuyog Pawar {
423*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_future_RC_scd_reset = 1;
424*c83a76b0SSuyog Pawar }
425*c83a76b0SSuyog Pawar i4_temp_ipe_idx++;
426*c83a76b0SSuyog Pawar if(i4_temp_ipe_idx >= ps_enc_ctxt->s_multi_thrd.i4_max_delay_pre_me_btw_l0_ipe)
427*c83a76b0SSuyog Pawar {
428*c83a76b0SSuyog Pawar i4_temp_ipe_idx = 0;
429*c83a76b0SSuyog Pawar }
430*c83a76b0SSuyog Pawar }
431*c83a76b0SSuyog Pawar
432*c83a76b0SSuyog Pawar if((!ps_enc_ctxt->i4_future_RC_reset) && (ps_enc_ctxt->i4_past_RC_reset_count > 8))
433*c83a76b0SSuyog Pawar {
434*c83a76b0SSuyog Pawar /*if the prev two P/I pic is not in high complex region
435*c83a76b0SSuyog Pawar then enable reset RC flag*/
436*c83a76b0SSuyog Pawar if((!ps_enc_ctxt->ai4_is_past_pic_complex[0]) &&
437*c83a76b0SSuyog Pawar (!ps_enc_ctxt->ai4_is_past_pic_complex[1]))
438*c83a76b0SSuyog Pawar {
439*c83a76b0SSuyog Pawar if(i4_is_cur_pic_high_complex_region)
440*c83a76b0SSuyog Pawar {
441*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_is_cmplx_change_reset_model = 1;
442*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_is_cmplx_change_reset_bits = 1;
443*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_is_I_reset_done = 0;
444*c83a76b0SSuyog Pawar }
445*c83a76b0SSuyog Pawar }
446*c83a76b0SSuyog Pawar
447*c83a76b0SSuyog Pawar /*if the next two P/I pic is not in high complex region
448*c83a76b0SSuyog Pawar then enable reset RC flag*/
449*c83a76b0SSuyog Pawar if((!ps_enc_ctxt->s_multi_thrd.aps_curr_out_pre_enc[i4_next_ipe_idx]
450*c83a76b0SSuyog Pawar ->i4_is_high_complex_region) &&
451*c83a76b0SSuyog Pawar (!ps_enc_ctxt->s_multi_thrd.aps_curr_out_pre_enc[i4_next_next_ipe_idx]
452*c83a76b0SSuyog Pawar ->i4_is_high_complex_region))
453*c83a76b0SSuyog Pawar {
454*c83a76b0SSuyog Pawar if(i4_is_cur_pic_high_complex_region)
455*c83a76b0SSuyog Pawar {
456*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_is_cmplx_change_reset_model = 1;
457*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_is_cmplx_change_reset_bits = 1;
458*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_is_I_reset_done = 0;
459*c83a76b0SSuyog Pawar }
460*c83a76b0SSuyog Pawar }
461*c83a76b0SSuyog Pawar }
462*c83a76b0SSuyog Pawar else if((!ps_enc_ctxt->i4_future_RC_scd_reset) && (ps_enc_ctxt->i4_past_RC_scd_reset_count > 8))
463*c83a76b0SSuyog Pawar {
464*c83a76b0SSuyog Pawar /*if the prev two P/I pic is not in high complex region
465*c83a76b0SSuyog Pawar then enable reset RC flag*/
466*c83a76b0SSuyog Pawar if((!ps_enc_ctxt->ai4_is_past_pic_complex[0]) &&
467*c83a76b0SSuyog Pawar (!ps_enc_ctxt->ai4_is_past_pic_complex[1]))
468*c83a76b0SSuyog Pawar {
469*c83a76b0SSuyog Pawar if(i4_is_cur_pic_high_complex_region)
470*c83a76b0SSuyog Pawar {
471*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_is_cmplx_change_reset_bits = 1;
472*c83a76b0SSuyog Pawar }
473*c83a76b0SSuyog Pawar }
474*c83a76b0SSuyog Pawar
475*c83a76b0SSuyog Pawar /*if the next two P/I pic is not in high complex region
476*c83a76b0SSuyog Pawar then enable reset RC flag*/
477*c83a76b0SSuyog Pawar if((!ps_enc_ctxt->s_multi_thrd.aps_curr_out_pre_enc[i4_next_ipe_idx]
478*c83a76b0SSuyog Pawar ->i4_is_high_complex_region) &&
479*c83a76b0SSuyog Pawar (!ps_enc_ctxt->s_multi_thrd.aps_curr_out_pre_enc[i4_next_next_ipe_idx]
480*c83a76b0SSuyog Pawar ->i4_is_high_complex_region))
481*c83a76b0SSuyog Pawar {
482*c83a76b0SSuyog Pawar if(i4_is_cur_pic_high_complex_region)
483*c83a76b0SSuyog Pawar {
484*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_is_cmplx_change_reset_bits = 1;
485*c83a76b0SSuyog Pawar }
486*c83a76b0SSuyog Pawar }
487*c83a76b0SSuyog Pawar }
488*c83a76b0SSuyog Pawar
489*c83a76b0SSuyog Pawar /* forcing I frame reset after complexity change is disable as it gives gain, could be due to that
490*c83a76b0SSuyog Pawar required i reset is already happening on pre Intra SAD*/
491*c83a76b0SSuyog Pawar /*if(!ps_enc_ctxt->i4_is_I_reset_done && (ps_cur_ipe_lap_out->i4_pic_type
492*c83a76b0SSuyog Pawar == IV_I_FRAME))
493*c83a76b0SSuyog Pawar {
494*c83a76b0SSuyog Pawar ps_cur_ipe_lap_out->i4_is_I_only_scd = 1;
495*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_is_I_reset_done = 1;
496*c83a76b0SSuyog Pawar }*/
497*c83a76b0SSuyog Pawar
498*c83a76b0SSuyog Pawar ps_enc_ctxt->ai4_is_past_pic_complex[0] = i4_is_cur_pic_high_complex_region;
499*c83a76b0SSuyog Pawar
500*c83a76b0SSuyog Pawar ps_enc_ctxt->ai4_is_past_pic_complex[1] = ps_enc_ctxt->ai4_is_past_pic_complex[0];
501*c83a76b0SSuyog Pawar }
502*c83a76b0SSuyog Pawar return;
503*c83a76b0SSuyog Pawar }
504*c83a76b0SSuyog Pawar /*!
505*c83a76b0SSuyog Pawar ******************************************************************************
506*c83a76b0SSuyog Pawar * \if Function name : ihevce_manage_ref_pics \endif
507*c83a76b0SSuyog Pawar *
508*c83a76b0SSuyog Pawar * \brief
509*c83a76b0SSuyog Pawar * Reference picture management based on delta poc array given by LAP
510*c83a76b0SSuyog Pawar * Populates the reference list after removing non used reference pictures
511*c83a76b0SSuyog Pawar * populates the delta poc of reference pics to be signalled in slice header
512*c83a76b0SSuyog Pawar *
513*c83a76b0SSuyog Pawar * \param[in] encoder context pointer
514*c83a76b0SSuyog Pawar * \param[in] current LAP Encoder buffer pointer
515*c83a76b0SSuyog Pawar * \param[in] current frame process and entropy buffer pointer
516*c83a76b0SSuyog Pawar *
517*c83a76b0SSuyog Pawar * \return
518*c83a76b0SSuyog Pawar * None
519*c83a76b0SSuyog Pawar *
520*c83a76b0SSuyog Pawar * \author
521*c83a76b0SSuyog Pawar * Ittiam
522*c83a76b0SSuyog Pawar *
523*c83a76b0SSuyog Pawar *****************************************************************************
524*c83a76b0SSuyog Pawar */
ihevce_pre_enc_manage_ref_pics(enc_ctxt_t * ps_enc_ctxt,ihevce_lap_enc_buf_t * ps_curr_inp,pre_enc_me_ctxt_t * ps_curr_out,WORD32 i4_ping_pong)525*c83a76b0SSuyog Pawar void ihevce_pre_enc_manage_ref_pics(
526*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt,
527*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp,
528*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_out,
529*c83a76b0SSuyog Pawar WORD32 i4_ping_pong)
530*c83a76b0SSuyog Pawar {
531*c83a76b0SSuyog Pawar /* local variables */
532*c83a76b0SSuyog Pawar WORD32 ctr;
533*c83a76b0SSuyog Pawar WORD32 ref_pics;
534*c83a76b0SSuyog Pawar WORD32 ai4_buf_status[HEVCE_MAX_DPB_PICS] = { 0 };
535*c83a76b0SSuyog Pawar WORD32 curr_poc;
536*c83a76b0SSuyog Pawar WORD32 wp_flag = 0;
537*c83a76b0SSuyog Pawar WORD32 num_ref_pics_list0 = 0;
538*c83a76b0SSuyog Pawar WORD32 num_ref_pics_list1 = 0;
539*c83a76b0SSuyog Pawar WORD32 cra_poc = ps_curr_inp->s_lap_out.i4_assoc_IRAP_poc;
540*c83a76b0SSuyog Pawar WORD32 slice_type = ps_curr_out->s_slice_hdr.i1_slice_type;
541*c83a76b0SSuyog Pawar recon_pic_buf_t *(*aps_pre_enc_ref_pic_list)[HEVCE_MAX_REF_PICS * 2];
542*c83a76b0SSuyog Pawar WORD32 i4_inc_L1_active_ref_pic = 0;
543*c83a76b0SSuyog Pawar WORD32 i4_inc_L0_active_ref_pic = 0;
544*c83a76b0SSuyog Pawar
545*c83a76b0SSuyog Pawar (void)ps_curr_out;
546*c83a76b0SSuyog Pawar curr_poc = ps_curr_inp->s_lap_out.i4_poc;
547*c83a76b0SSuyog Pawar
548*c83a76b0SSuyog Pawar /* Number of reference pics given by LAP should not be greater than max */
549*c83a76b0SSuyog Pawar ASSERT(HEVCE_MAX_REF_PICS >= ps_curr_inp->s_lap_out.i4_num_ref_pics);
550*c83a76b0SSuyog Pawar
551*c83a76b0SSuyog Pawar /*derive ref_pic_list based on ping_pong instance */
552*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list = ps_enc_ctxt->aps_pre_enc_ref_lists[i4_ping_pong];
553*c83a76b0SSuyog Pawar
554*c83a76b0SSuyog Pawar /* derive the weighted prediction enable flag based on slice type */
555*c83a76b0SSuyog Pawar if(BSLICE == slice_type)
556*c83a76b0SSuyog Pawar {
557*c83a76b0SSuyog Pawar wp_flag = ps_curr_inp->s_lap_out.i1_weighted_bipred_flag;
558*c83a76b0SSuyog Pawar }
559*c83a76b0SSuyog Pawar else if(PSLICE == slice_type)
560*c83a76b0SSuyog Pawar {
561*c83a76b0SSuyog Pawar wp_flag = ps_curr_inp->s_lap_out.i1_weighted_pred_flag;
562*c83a76b0SSuyog Pawar }
563*c83a76b0SSuyog Pawar else
564*c83a76b0SSuyog Pawar {
565*c83a76b0SSuyog Pawar wp_flag = 0;
566*c83a76b0SSuyog Pawar }
567*c83a76b0SSuyog Pawar
568*c83a76b0SSuyog Pawar /*to support diplicate pics*/
569*c83a76b0SSuyog Pawar {
570*c83a76b0SSuyog Pawar WORD32 i, j;
571*c83a76b0SSuyog Pawar for(i = 0; i < 2; i++)
572*c83a76b0SSuyog Pawar {
573*c83a76b0SSuyog Pawar for(j = 0; j < HEVCE_MAX_REF_PICS * 2; j++)
574*c83a76b0SSuyog Pawar {
575*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[i][j] =
576*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][i][j];
577*c83a76b0SSuyog Pawar }
578*c83a76b0SSuyog Pawar }
579*c83a76b0SSuyog Pawar }
580*c83a76b0SSuyog Pawar
581*c83a76b0SSuyog Pawar /* run a loop over the number of reference pics given by LAP */
582*c83a76b0SSuyog Pawar for(ref_pics = 0; ref_pics < ps_curr_inp->s_lap_out.i4_num_ref_pics; ref_pics++)
583*c83a76b0SSuyog Pawar {
584*c83a76b0SSuyog Pawar WORD32 ref_poc;
585*c83a76b0SSuyog Pawar WORD32 i4_loop = 1;
586*c83a76b0SSuyog Pawar WORD32 i4_temp_list;
587*c83a76b0SSuyog Pawar
588*c83a76b0SSuyog Pawar ref_poc = curr_poc + ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].i4_ref_pic_delta_poc;
589*c83a76b0SSuyog Pawar
590*c83a76b0SSuyog Pawar /* run a loop to check the poc based on delta poc array */
591*c83a76b0SSuyog Pawar for(ctr = 0; ctr < ps_enc_ctxt->i4_pre_enc_num_buf_recon_q; ctr++)
592*c83a76b0SSuyog Pawar {
593*c83a76b0SSuyog Pawar /* if the POC is matching with current ref picture*/
594*c83a76b0SSuyog Pawar if((ref_poc == ps_enc_ctxt->pps_pre_enc_recon_buf_q[ctr]->i4_poc) &&
595*c83a76b0SSuyog Pawar (0 == ps_enc_ctxt->pps_pre_enc_recon_buf_q[ctr]->i4_is_free))
596*c83a76b0SSuyog Pawar {
597*c83a76b0SSuyog Pawar /* mark the buf status as used */
598*c83a76b0SSuyog Pawar ai4_buf_status[ctr] = 1;
599*c83a76b0SSuyog Pawar
600*c83a76b0SSuyog Pawar /* populate the reference lists based on delta poc array */
601*c83a76b0SSuyog Pawar if((ref_poc < curr_poc) || (0 == curr_poc))
602*c83a76b0SSuyog Pawar {
603*c83a76b0SSuyog Pawar /* list 0 */
604*c83a76b0SSuyog Pawar memcpy(
605*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][LIST_0][num_ref_pics_list0],
606*c83a76b0SSuyog Pawar ps_enc_ctxt->pps_pre_enc_recon_buf_q[ctr],
607*c83a76b0SSuyog Pawar sizeof(recon_pic_buf_t));
608*c83a76b0SSuyog Pawar i4_temp_list = num_ref_pics_list0;
609*c83a76b0SSuyog Pawar
610*c83a76b0SSuyog Pawar /*duplicate pics added to the list*/
611*c83a76b0SSuyog Pawar while(i4_loop != ps_curr_inp->s_lap_out.as_ref_pics[ref_pics]
612*c83a76b0SSuyog Pawar .i4_num_duplicate_entries_in_ref_list)
613*c83a76b0SSuyog Pawar {
614*c83a76b0SSuyog Pawar /* list 0 */
615*c83a76b0SSuyog Pawar i4_temp_list++;
616*c83a76b0SSuyog Pawar memcpy(
617*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][LIST_0][i4_temp_list],
618*c83a76b0SSuyog Pawar ps_enc_ctxt->pps_pre_enc_recon_buf_q[ctr],
619*c83a76b0SSuyog Pawar sizeof(recon_pic_buf_t));
620*c83a76b0SSuyog Pawar i4_loop++;
621*c83a76b0SSuyog Pawar }
622*c83a76b0SSuyog Pawar
623*c83a76b0SSuyog Pawar /* populate weights and offsets corresponding to this ref pic */
624*c83a76b0SSuyog Pawar memcpy(
625*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][LIST_0][num_ref_pics_list0]
626*c83a76b0SSuyog Pawar .s_weight_offset,
627*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].as_wght_off[0],
628*c83a76b0SSuyog Pawar sizeof(ihevce_wght_offst_t));
629*c83a76b0SSuyog Pawar
630*c83a76b0SSuyog Pawar /* Store the used as ref for current pic flag */
631*c83a76b0SSuyog Pawar ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][LIST_0][num_ref_pics_list0]
632*c83a76b0SSuyog Pawar .i4_used_by_cur_pic_flag =
633*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].i4_used_by_cur_pic_flag;
634*c83a76b0SSuyog Pawar
635*c83a76b0SSuyog Pawar num_ref_pics_list0++;
636*c83a76b0SSuyog Pawar i4_loop = 1;
637*c83a76b0SSuyog Pawar /*duplicate pics added to the list*/
638*c83a76b0SSuyog Pawar while(i4_loop != ps_curr_inp->s_lap_out.as_ref_pics[ref_pics]
639*c83a76b0SSuyog Pawar .i4_num_duplicate_entries_in_ref_list)
640*c83a76b0SSuyog Pawar {
641*c83a76b0SSuyog Pawar /* populate weights and offsets corresponding to this ref pic */
642*c83a76b0SSuyog Pawar memcpy(
643*c83a76b0SSuyog Pawar &ps_enc_ctxt
644*c83a76b0SSuyog Pawar ->as_pre_enc_ref_lists[i4_ping_pong][LIST_0][num_ref_pics_list0]
645*c83a76b0SSuyog Pawar .s_weight_offset,
646*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].as_wght_off[i4_loop],
647*c83a76b0SSuyog Pawar sizeof(ihevce_wght_offst_t));
648*c83a76b0SSuyog Pawar
649*c83a76b0SSuyog Pawar /* Store the used as ref for current pic flag */
650*c83a76b0SSuyog Pawar ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][LIST_0][num_ref_pics_list0]
651*c83a76b0SSuyog Pawar .i4_used_by_cur_pic_flag =
652*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].i4_used_by_cur_pic_flag;
653*c83a76b0SSuyog Pawar
654*c83a76b0SSuyog Pawar num_ref_pics_list0++;
655*c83a76b0SSuyog Pawar i4_loop++;
656*c83a76b0SSuyog Pawar }
657*c83a76b0SSuyog Pawar }
658*c83a76b0SSuyog Pawar else
659*c83a76b0SSuyog Pawar {
660*c83a76b0SSuyog Pawar /* list 1 */
661*c83a76b0SSuyog Pawar memcpy(
662*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][LIST_1][num_ref_pics_list1],
663*c83a76b0SSuyog Pawar ps_enc_ctxt->pps_pre_enc_recon_buf_q[ctr],
664*c83a76b0SSuyog Pawar sizeof(recon_pic_buf_t));
665*c83a76b0SSuyog Pawar
666*c83a76b0SSuyog Pawar i4_temp_list = num_ref_pics_list1;
667*c83a76b0SSuyog Pawar /*duplicate pics added to the list*/
668*c83a76b0SSuyog Pawar while(i4_loop != ps_curr_inp->s_lap_out.as_ref_pics[ref_pics]
669*c83a76b0SSuyog Pawar .i4_num_duplicate_entries_in_ref_list)
670*c83a76b0SSuyog Pawar {
671*c83a76b0SSuyog Pawar /* list 1 */
672*c83a76b0SSuyog Pawar i4_temp_list++;
673*c83a76b0SSuyog Pawar memcpy(
674*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][LIST_1][i4_temp_list],
675*c83a76b0SSuyog Pawar ps_enc_ctxt->pps_pre_enc_recon_buf_q[ctr],
676*c83a76b0SSuyog Pawar sizeof(recon_pic_buf_t));
677*c83a76b0SSuyog Pawar i4_loop++;
678*c83a76b0SSuyog Pawar }
679*c83a76b0SSuyog Pawar
680*c83a76b0SSuyog Pawar /* populate weights and offsets corresponding to this ref pic */
681*c83a76b0SSuyog Pawar memcpy(
682*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][LIST_1][num_ref_pics_list1]
683*c83a76b0SSuyog Pawar .s_weight_offset,
684*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].as_wght_off[0],
685*c83a76b0SSuyog Pawar sizeof(ihevce_wght_offst_t));
686*c83a76b0SSuyog Pawar
687*c83a76b0SSuyog Pawar /* Store the used as ref for current pic flag */
688*c83a76b0SSuyog Pawar ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][LIST_1][num_ref_pics_list1]
689*c83a76b0SSuyog Pawar .i4_used_by_cur_pic_flag =
690*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].i4_used_by_cur_pic_flag;
691*c83a76b0SSuyog Pawar
692*c83a76b0SSuyog Pawar num_ref_pics_list1++;
693*c83a76b0SSuyog Pawar i4_loop = 1;
694*c83a76b0SSuyog Pawar /*duplicate pics added to the list*/
695*c83a76b0SSuyog Pawar while(i4_loop != ps_curr_inp->s_lap_out.as_ref_pics[ref_pics]
696*c83a76b0SSuyog Pawar .i4_num_duplicate_entries_in_ref_list)
697*c83a76b0SSuyog Pawar {
698*c83a76b0SSuyog Pawar /* populate weights and offsets corresponding to this ref pic */
699*c83a76b0SSuyog Pawar memcpy(
700*c83a76b0SSuyog Pawar &ps_enc_ctxt
701*c83a76b0SSuyog Pawar ->as_pre_enc_ref_lists[i4_ping_pong][LIST_1][num_ref_pics_list1]
702*c83a76b0SSuyog Pawar .s_weight_offset,
703*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].as_wght_off[i4_loop],
704*c83a76b0SSuyog Pawar sizeof(ihevce_wght_offst_t));
705*c83a76b0SSuyog Pawar
706*c83a76b0SSuyog Pawar /* Store the used as ref for current pic flag */
707*c83a76b0SSuyog Pawar ps_enc_ctxt->as_pre_enc_ref_lists[i4_ping_pong][LIST_1][num_ref_pics_list1]
708*c83a76b0SSuyog Pawar .i4_used_by_cur_pic_flag =
709*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].i4_used_by_cur_pic_flag;
710*c83a76b0SSuyog Pawar
711*c83a76b0SSuyog Pawar num_ref_pics_list1++;
712*c83a76b0SSuyog Pawar i4_loop++;
713*c83a76b0SSuyog Pawar }
714*c83a76b0SSuyog Pawar }
715*c83a76b0SSuyog Pawar break;
716*c83a76b0SSuyog Pawar }
717*c83a76b0SSuyog Pawar }
718*c83a76b0SSuyog Pawar
719*c83a76b0SSuyog Pawar /* if the reference picture is not found then error */
720*c83a76b0SSuyog Pawar ASSERT(ctr != ps_enc_ctxt->i4_pre_enc_num_buf_recon_q);
721*c83a76b0SSuyog Pawar }
722*c83a76b0SSuyog Pawar /* sort the reference pics in List0 in descending order POC */
723*c83a76b0SSuyog Pawar if(num_ref_pics_list0 > 1)
724*c83a76b0SSuyog Pawar {
725*c83a76b0SSuyog Pawar /* run a loop for num ref pics -1 */
726*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list0 - 1; ctr++)
727*c83a76b0SSuyog Pawar {
728*c83a76b0SSuyog Pawar WORD32 max_idx = ctr;
729*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_temp;
730*c83a76b0SSuyog Pawar WORD32 i;
731*c83a76b0SSuyog Pawar
732*c83a76b0SSuyog Pawar for(i = (ctr + 1); i < num_ref_pics_list0; i++)
733*c83a76b0SSuyog Pawar {
734*c83a76b0SSuyog Pawar /* check for poc greater than current ref poc */
735*c83a76b0SSuyog Pawar if(aps_pre_enc_ref_pic_list[LIST_0][i]->i4_poc >
736*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][max_idx]->i4_poc)
737*c83a76b0SSuyog Pawar {
738*c83a76b0SSuyog Pawar max_idx = i;
739*c83a76b0SSuyog Pawar }
740*c83a76b0SSuyog Pawar }
741*c83a76b0SSuyog Pawar
742*c83a76b0SSuyog Pawar /* if max of remaining is not current, swap the pointers */
743*c83a76b0SSuyog Pawar if(max_idx != ctr)
744*c83a76b0SSuyog Pawar {
745*c83a76b0SSuyog Pawar ps_temp = aps_pre_enc_ref_pic_list[LIST_0][max_idx];
746*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][max_idx] = aps_pre_enc_ref_pic_list[LIST_0][ctr];
747*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][ctr] = ps_temp;
748*c83a76b0SSuyog Pawar }
749*c83a76b0SSuyog Pawar }
750*c83a76b0SSuyog Pawar }
751*c83a76b0SSuyog Pawar
752*c83a76b0SSuyog Pawar /* sort the reference pics in List1 in ascending order POC */
753*c83a76b0SSuyog Pawar if(num_ref_pics_list1 > 1)
754*c83a76b0SSuyog Pawar {
755*c83a76b0SSuyog Pawar /* run a loop for num ref pics -1 */
756*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list1 - 1; ctr++)
757*c83a76b0SSuyog Pawar {
758*c83a76b0SSuyog Pawar WORD32 min_idx = ctr;
759*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_temp;
760*c83a76b0SSuyog Pawar WORD32 i;
761*c83a76b0SSuyog Pawar
762*c83a76b0SSuyog Pawar for(i = (ctr + 1); i < num_ref_pics_list1; i++)
763*c83a76b0SSuyog Pawar {
764*c83a76b0SSuyog Pawar /* check for p[oc less than current ref poc */
765*c83a76b0SSuyog Pawar if(aps_pre_enc_ref_pic_list[LIST_1][i]->i4_poc <
766*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_1][min_idx]->i4_poc)
767*c83a76b0SSuyog Pawar {
768*c83a76b0SSuyog Pawar min_idx = i;
769*c83a76b0SSuyog Pawar }
770*c83a76b0SSuyog Pawar }
771*c83a76b0SSuyog Pawar
772*c83a76b0SSuyog Pawar /* if min of remaining is not current, swap the pointers */
773*c83a76b0SSuyog Pawar if(min_idx != ctr)
774*c83a76b0SSuyog Pawar {
775*c83a76b0SSuyog Pawar ps_temp = aps_pre_enc_ref_pic_list[LIST_1][min_idx];
776*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_1][min_idx] = aps_pre_enc_ref_pic_list[LIST_1][ctr];
777*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_1][ctr] = ps_temp;
778*c83a76b0SSuyog Pawar }
779*c83a76b0SSuyog Pawar }
780*c83a76b0SSuyog Pawar }
781*c83a76b0SSuyog Pawar
782*c83a76b0SSuyog Pawar /* call the ME API to update the DPB of HME pyramids coarse layers */
783*c83a76b0SSuyog Pawar ihevce_coarse_me_frame_dpb_update(
784*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt,
785*c83a76b0SSuyog Pawar num_ref_pics_list0,
786*c83a76b0SSuyog Pawar num_ref_pics_list1,
787*c83a76b0SSuyog Pawar &aps_pre_enc_ref_pic_list[LIST_0][0],
788*c83a76b0SSuyog Pawar &aps_pre_enc_ref_pic_list[LIST_1][0]);
789*c83a76b0SSuyog Pawar
790*c83a76b0SSuyog Pawar /* Default list creation based on uses as ref pic for current pic flag */
791*c83a76b0SSuyog Pawar {
792*c83a76b0SSuyog Pawar WORD32 num_ref_pics_list_final = 0;
793*c83a76b0SSuyog Pawar WORD32 list_idx = 0;
794*c83a76b0SSuyog Pawar
795*c83a76b0SSuyog Pawar /* LIST 0 */
796*c83a76b0SSuyog Pawar /* run a loop for num ref pics in list 0 */
797*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list0; ctr++)
798*c83a76b0SSuyog Pawar {
799*c83a76b0SSuyog Pawar /* check for used as reference flag */
800*c83a76b0SSuyog Pawar if(1 == aps_pre_enc_ref_pic_list[LIST_0][ctr]->i4_used_by_cur_pic_flag)
801*c83a76b0SSuyog Pawar {
802*c83a76b0SSuyog Pawar /* copy the pointer to the actual valid list idx */
803*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][list_idx] = aps_pre_enc_ref_pic_list[LIST_0][ctr];
804*c83a76b0SSuyog Pawar
805*c83a76b0SSuyog Pawar /* increment the valid pic counters and idx */
806*c83a76b0SSuyog Pawar list_idx++;
807*c83a76b0SSuyog Pawar num_ref_pics_list_final++;
808*c83a76b0SSuyog Pawar }
809*c83a76b0SSuyog Pawar }
810*c83a76b0SSuyog Pawar
811*c83a76b0SSuyog Pawar /* finally store the number of pictures in List0 */
812*c83a76b0SSuyog Pawar num_ref_pics_list0 = num_ref_pics_list_final;
813*c83a76b0SSuyog Pawar /* LIST 1 */
814*c83a76b0SSuyog Pawar num_ref_pics_list_final = 0;
815*c83a76b0SSuyog Pawar list_idx = 0;
816*c83a76b0SSuyog Pawar
817*c83a76b0SSuyog Pawar /* run a loop for num ref pics in list 1 */
818*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list1; ctr++)
819*c83a76b0SSuyog Pawar {
820*c83a76b0SSuyog Pawar /* check for used as reference flag */
821*c83a76b0SSuyog Pawar if(1 == aps_pre_enc_ref_pic_list[LIST_1][ctr]->i4_used_by_cur_pic_flag)
822*c83a76b0SSuyog Pawar {
823*c83a76b0SSuyog Pawar /* copy the pointer to the actual valid list idx */
824*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_1][list_idx] = aps_pre_enc_ref_pic_list[LIST_1][ctr];
825*c83a76b0SSuyog Pawar
826*c83a76b0SSuyog Pawar /* increment the valid pic counters and idx */
827*c83a76b0SSuyog Pawar list_idx++;
828*c83a76b0SSuyog Pawar num_ref_pics_list_final++;
829*c83a76b0SSuyog Pawar }
830*c83a76b0SSuyog Pawar }
831*c83a76b0SSuyog Pawar
832*c83a76b0SSuyog Pawar /* finally store the number of pictures in List1 */
833*c83a76b0SSuyog Pawar num_ref_pics_list1 = num_ref_pics_list_final;
834*c83a76b0SSuyog Pawar }
835*c83a76b0SSuyog Pawar /*in case of single active ref picture on L0 and L1, then consider one of them weighted
836*c83a76b0SSuyog Pawar and another non-weighted*/
837*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_P_FRAME)
838*c83a76b0SSuyog Pawar {
839*c83a76b0SSuyog Pawar if(num_ref_pics_list0 > 2)
840*c83a76b0SSuyog Pawar {
841*c83a76b0SSuyog Pawar if(aps_pre_enc_ref_pic_list[LIST_0][0]->i4_poc ==
842*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][1]->i4_poc)
843*c83a76b0SSuyog Pawar {
844*c83a76b0SSuyog Pawar i4_inc_L0_active_ref_pic = 1;
845*c83a76b0SSuyog Pawar }
846*c83a76b0SSuyog Pawar }
847*c83a76b0SSuyog Pawar }
848*c83a76b0SSuyog Pawar else
849*c83a76b0SSuyog Pawar {
850*c83a76b0SSuyog Pawar if(num_ref_pics_list0 >= 2 && num_ref_pics_list1 >= 2)
851*c83a76b0SSuyog Pawar {
852*c83a76b0SSuyog Pawar if(aps_pre_enc_ref_pic_list[LIST_0][0]->i4_poc ==
853*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][1]->i4_poc)
854*c83a76b0SSuyog Pawar {
855*c83a76b0SSuyog Pawar i4_inc_L0_active_ref_pic = 1;
856*c83a76b0SSuyog Pawar }
857*c83a76b0SSuyog Pawar if(aps_pre_enc_ref_pic_list[LIST_1][0]->i4_poc ==
858*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_1][1]->i4_poc)
859*c83a76b0SSuyog Pawar {
860*c83a76b0SSuyog Pawar i4_inc_L1_active_ref_pic = 1;
861*c83a76b0SSuyog Pawar }
862*c83a76b0SSuyog Pawar }
863*c83a76b0SSuyog Pawar }
864*c83a76b0SSuyog Pawar
865*c83a76b0SSuyog Pawar /* append the reference pics in List1 and end of list0 */
866*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list1; ctr++)
867*c83a76b0SSuyog Pawar {
868*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][num_ref_pics_list0 + ctr] =
869*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_1][ctr];
870*c83a76b0SSuyog Pawar }
871*c83a76b0SSuyog Pawar
872*c83a76b0SSuyog Pawar /* append the reference pics in List0 and end of list1 */
873*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list0; ctr++)
874*c83a76b0SSuyog Pawar {
875*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_1][num_ref_pics_list1 + ctr] =
876*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][ctr];
877*c83a76b0SSuyog Pawar }
878*c83a76b0SSuyog Pawar
879*c83a76b0SSuyog Pawar /* reference list modification for adding duplicate reference */
880*c83a76b0SSuyog Pawar {
881*c83a76b0SSuyog Pawar
882*c83a76b0SSuyog Pawar }
883*c83a76b0SSuyog Pawar
884*c83a76b0SSuyog Pawar /* popluate the default weights and offsets for disabled cases */
885*c83a76b0SSuyog Pawar {
886*c83a76b0SSuyog Pawar WORD32 i;
887*c83a76b0SSuyog Pawar
888*c83a76b0SSuyog Pawar /* populate the weights and offsets for all pics in L0 + L1 */
889*c83a76b0SSuyog Pawar for(i = 0; i < (num_ref_pics_list0 + num_ref_pics_list1); i++)
890*c83a76b0SSuyog Pawar {
891*c83a76b0SSuyog Pawar /* populate the weights and offsets if weighted prediction is disabled */
892*c83a76b0SSuyog Pawar if(1 == wp_flag)
893*c83a76b0SSuyog Pawar {
894*c83a76b0SSuyog Pawar /* if weights are disabled then populate default values */
895*c83a76b0SSuyog Pawar if(0 ==
896*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][i]->s_weight_offset.u1_luma_weight_enable_flag)
897*c83a76b0SSuyog Pawar {
898*c83a76b0SSuyog Pawar /* set to default values */
899*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][i]->s_weight_offset.i2_luma_weight =
900*c83a76b0SSuyog Pawar (1 << ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom);
901*c83a76b0SSuyog Pawar
902*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_0][i]->s_weight_offset.i2_luma_offset = 0;
903*c83a76b0SSuyog Pawar }
904*c83a76b0SSuyog Pawar }
905*c83a76b0SSuyog Pawar }
906*c83a76b0SSuyog Pawar
907*c83a76b0SSuyog Pawar for(i = 0; i < (num_ref_pics_list0 + num_ref_pics_list1); i++)
908*c83a76b0SSuyog Pawar {
909*c83a76b0SSuyog Pawar /* populate the weights and offsets if weighted prediction is enabled */
910*c83a76b0SSuyog Pawar if(1 == wp_flag)
911*c83a76b0SSuyog Pawar {
912*c83a76b0SSuyog Pawar /* if weights are disabled then populate default values */
913*c83a76b0SSuyog Pawar if(0 ==
914*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_1][i]->s_weight_offset.u1_luma_weight_enable_flag)
915*c83a76b0SSuyog Pawar {
916*c83a76b0SSuyog Pawar /* set to default values */
917*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_1][i]->s_weight_offset.i2_luma_weight =
918*c83a76b0SSuyog Pawar (1 << ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom);
919*c83a76b0SSuyog Pawar
920*c83a76b0SSuyog Pawar aps_pre_enc_ref_pic_list[LIST_1][i]->s_weight_offset.i2_luma_offset = 0;
921*c83a76b0SSuyog Pawar }
922*c83a76b0SSuyog Pawar }
923*c83a76b0SSuyog Pawar }
924*c83a76b0SSuyog Pawar }
925*c83a76b0SSuyog Pawar
926*c83a76b0SSuyog Pawar /* run a loop to free the non used reference pics */
927*c83a76b0SSuyog Pawar for(ctr = 0; ctr < ps_enc_ctxt->i4_pre_enc_num_buf_recon_q; ctr++)
928*c83a76b0SSuyog Pawar {
929*c83a76b0SSuyog Pawar /* if not used as reference */
930*c83a76b0SSuyog Pawar if(0 == ai4_buf_status[ctr])
931*c83a76b0SSuyog Pawar {
932*c83a76b0SSuyog Pawar ps_enc_ctxt->pps_pre_enc_recon_buf_q[ctr]->i4_is_free = 1;
933*c83a76b0SSuyog Pawar ps_enc_ctxt->pps_pre_enc_recon_buf_q[ctr]->i4_poc = -1;
934*c83a76b0SSuyog Pawar }
935*c83a76b0SSuyog Pawar }
936*c83a76b0SSuyog Pawar
937*c83a76b0SSuyog Pawar /* store the number of reference pics in the list for ME/MC etc */
938*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0 = num_ref_pics_list0;
939*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1 = num_ref_pics_list1;
940*c83a76b0SSuyog Pawar
941*c83a76b0SSuyog Pawar #define HME_USE_ONLY_2REF
942*c83a76b0SSuyog Pawar #ifndef HME_USE_ONLY_2REF
943*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = num_ref_pics_list0;
944*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = num_ref_pics_list1;
945*c83a76b0SSuyog Pawar #else
946*c83a76b0SSuyog Pawar #if MULTI_REF_ENABLE == 1
947*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_quality_preset >= IHEVCE_QUALITY_P3)
948*c83a76b0SSuyog Pawar {
949*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_P_FRAME)
950*c83a76b0SSuyog Pawar {
951*c83a76b0SSuyog Pawar if(IHEVCE_QUALITY_P6 == ps_curr_inp->s_lap_out.i4_quality_preset)
952*c83a76b0SSuyog Pawar {
953*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
954*c83a76b0SSuyog Pawar {
955*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active =
956*c83a76b0SSuyog Pawar MIN(MAX_NUM_REFS_IN_PPICS_IN_XS25 + 1, num_ref_pics_list0);
957*c83a76b0SSuyog Pawar }
958*c83a76b0SSuyog Pawar else
959*c83a76b0SSuyog Pawar {
960*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active =
961*c83a76b0SSuyog Pawar MIN(MAX_NUM_REFS_IN_PPICS_IN_XS25, num_ref_pics_list0);
962*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active += i4_inc_L0_active_ref_pic;
963*c83a76b0SSuyog Pawar }
964*c83a76b0SSuyog Pawar
965*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = 0;
966*c83a76b0SSuyog Pawar }
967*c83a76b0SSuyog Pawar else
968*c83a76b0SSuyog Pawar {
969*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
970*c83a76b0SSuyog Pawar {
971*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(3, num_ref_pics_list0);
972*c83a76b0SSuyog Pawar }
973*c83a76b0SSuyog Pawar else
974*c83a76b0SSuyog Pawar {
975*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(2, num_ref_pics_list0);
976*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active += i4_inc_L0_active_ref_pic;
977*c83a76b0SSuyog Pawar }
978*c83a76b0SSuyog Pawar
979*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = 0;
980*c83a76b0SSuyog Pawar }
981*c83a76b0SSuyog Pawar }
982*c83a76b0SSuyog Pawar else
983*c83a76b0SSuyog Pawar {
984*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
985*c83a76b0SSuyog Pawar {
986*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(2, num_ref_pics_list0);
987*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = MIN(1, num_ref_pics_list1);
988*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active += i4_inc_L1_active_ref_pic;
989*c83a76b0SSuyog Pawar }
990*c83a76b0SSuyog Pawar else
991*c83a76b0SSuyog Pawar {
992*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(1, num_ref_pics_list0);
993*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = MIN(1, num_ref_pics_list1);
994*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active += i4_inc_L1_active_ref_pic;
995*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active += i4_inc_L0_active_ref_pic;
996*c83a76b0SSuyog Pawar }
997*c83a76b0SSuyog Pawar }
998*c83a76b0SSuyog Pawar }
999*c83a76b0SSuyog Pawar else
1000*c83a76b0SSuyog Pawar {
1001*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_P_FRAME)
1002*c83a76b0SSuyog Pawar {
1003*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1004*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(4, num_ref_pics_list0);
1005*c83a76b0SSuyog Pawar else
1006*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(4, num_ref_pics_list0);
1007*c83a76b0SSuyog Pawar
1008*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = 0;
1009*c83a76b0SSuyog Pawar }
1010*c83a76b0SSuyog Pawar else
1011*c83a76b0SSuyog Pawar {
1012*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1013*c83a76b0SSuyog Pawar {
1014*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(4, num_ref_pics_list0);
1015*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = MIN(4, num_ref_pics_list1);
1016*c83a76b0SSuyog Pawar }
1017*c83a76b0SSuyog Pawar else
1018*c83a76b0SSuyog Pawar {
1019*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(4, num_ref_pics_list0);
1020*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = MIN(4, num_ref_pics_list1);
1021*c83a76b0SSuyog Pawar }
1022*c83a76b0SSuyog Pawar }
1023*c83a76b0SSuyog Pawar }
1024*c83a76b0SSuyog Pawar #else
1025*c83a76b0SSuyog Pawar {
1026*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_P_FRAME)
1027*c83a76b0SSuyog Pawar {
1028*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1029*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(3, num_ref_pics_list0);
1030*c83a76b0SSuyog Pawar else
1031*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(2, num_ref_pics_list0);
1032*c83a76b0SSuyog Pawar
1033*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = 0;
1034*c83a76b0SSuyog Pawar }
1035*c83a76b0SSuyog Pawar else
1036*c83a76b0SSuyog Pawar {
1037*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1038*c83a76b0SSuyog Pawar {
1039*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(2, num_ref_pics_list0);
1040*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = MIN(1, num_ref_pics_list1);
1041*c83a76b0SSuyog Pawar }
1042*c83a76b0SSuyog Pawar else
1043*c83a76b0SSuyog Pawar {
1044*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active = MIN(1, num_ref_pics_list0);
1045*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active = MIN(1, num_ref_pics_list1);
1046*c83a76b0SSuyog Pawar }
1047*c83a76b0SSuyog Pawar }
1048*c83a76b0SSuyog Pawar }
1049*c83a76b0SSuyog Pawar #endif
1050*c83a76b0SSuyog Pawar #endif
1051*c83a76b0SSuyog Pawar
1052*c83a76b0SSuyog Pawar return;
1053*c83a76b0SSuyog Pawar }
1054*c83a76b0SSuyog Pawar
1055*c83a76b0SSuyog Pawar /*!
1056*c83a76b0SSuyog Pawar ******************************************************************************
1057*c83a76b0SSuyog Pawar * \if Function name : ihevce_manage_ref_pics \endif
1058*c83a76b0SSuyog Pawar *
1059*c83a76b0SSuyog Pawar * \brief
1060*c83a76b0SSuyog Pawar * Reference picture management based on delta poc array given by LAP
1061*c83a76b0SSuyog Pawar * Populates the reference list after removing non used reference pictures
1062*c83a76b0SSuyog Pawar * populates the delta poc of reference pics to be signalled in slice header
1063*c83a76b0SSuyog Pawar *
1064*c83a76b0SSuyog Pawar * \param[in] encoder context pointer
1065*c83a76b0SSuyog Pawar * \param[in] current LAP Encoder buffer pointer
1066*c83a76b0SSuyog Pawar * \param[in] current frame process and entropy buffer pointer
1067*c83a76b0SSuyog Pawar *
1068*c83a76b0SSuyog Pawar * \return
1069*c83a76b0SSuyog Pawar * None
1070*c83a76b0SSuyog Pawar *
1071*c83a76b0SSuyog Pawar * \author
1072*c83a76b0SSuyog Pawar * Ittiam
1073*c83a76b0SSuyog Pawar *
1074*c83a76b0SSuyog Pawar *****************************************************************************
1075*c83a76b0SSuyog Pawar */
ihevce_manage_ref_pics(enc_ctxt_t * ps_enc_ctxt,ihevce_lap_enc_buf_t * ps_curr_inp,slice_header_t * ps_slice_header,WORD32 i4_me_frm_id,WORD32 i4_thrd_id,WORD32 i4_bitrate_instance_id)1076*c83a76b0SSuyog Pawar void ihevce_manage_ref_pics(
1077*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt,
1078*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp,
1079*c83a76b0SSuyog Pawar slice_header_t *ps_slice_header,
1080*c83a76b0SSuyog Pawar WORD32 i4_me_frm_id,
1081*c83a76b0SSuyog Pawar WORD32 i4_thrd_id,
1082*c83a76b0SSuyog Pawar WORD32 i4_bitrate_instance_id)
1083*c83a76b0SSuyog Pawar {
1084*c83a76b0SSuyog Pawar WORD32 ctr;
1085*c83a76b0SSuyog Pawar WORD32 ref_pics;
1086*c83a76b0SSuyog Pawar WORD32 curr_poc, curr_idr_gop_num;
1087*c83a76b0SSuyog Pawar WORD32 wp_flag;
1088*c83a76b0SSuyog Pawar WORD32 num_ref_pics_list0 = 0;
1089*c83a76b0SSuyog Pawar WORD32 num_ref_pics_list1 = 0;
1090*c83a76b0SSuyog Pawar WORD32 cra_poc = ps_curr_inp->s_lap_out.i4_assoc_IRAP_poc;
1091*c83a76b0SSuyog Pawar WORD32 slice_type = ps_slice_header->i1_slice_type;
1092*c83a76b0SSuyog Pawar recon_pic_buf_t *(*aps_ref_list)[HEVCE_MAX_REF_PICS * 2];
1093*c83a76b0SSuyog Pawar recon_pic_buf_t(*aps_ref_list_temp)[HEVCE_MAX_REF_PICS * 2];
1094*c83a76b0SSuyog Pawar WORD32 i4_num_rpics_l0_excl_dup;
1095*c83a76b0SSuyog Pawar WORD32 i4_num_rpics_l1_excl_dup;
1096*c83a76b0SSuyog Pawar WORD32 i4_inc_L1_active_ref_pic = 0;
1097*c83a76b0SSuyog Pawar WORD32 i4_inc_L0_active_ref_pic = 0;
1098*c83a76b0SSuyog Pawar WORD32 i4_bridx = i4_bitrate_instance_id; //bitrate instance index
1099*c83a76b0SSuyog Pawar WORD32 i4_resolution_id = ps_enc_ctxt->i4_resolution_id;
1100*c83a76b0SSuyog Pawar me_enc_rdopt_ctxt_t *ps_cur_out_me_prms;
1101*c83a76b0SSuyog Pawar recon_pic_buf_t ***ppps_recon_bufs = ps_enc_ctxt->pps_recon_buf_q;
1102*c83a76b0SSuyog Pawar WORD32 i4_num_recon_bufs = ps_enc_ctxt->ai4_num_buf_recon_q[i4_bridx];
1103*c83a76b0SSuyog Pawar
1104*c83a76b0SSuyog Pawar ps_cur_out_me_prms = ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id];
1105*c83a76b0SSuyog Pawar
1106*c83a76b0SSuyog Pawar /*to support diplicate pics*/
1107*c83a76b0SSuyog Pawar {
1108*c83a76b0SSuyog Pawar WORD32 i, j;
1109*c83a76b0SSuyog Pawar for(i = 0; i < NUM_REF_LISTS; i++)
1110*c83a76b0SSuyog Pawar {
1111*c83a76b0SSuyog Pawar for(j = 0; j < HEVCE_MAX_REF_PICS * 2; j++)
1112*c83a76b0SSuyog Pawar {
1113*c83a76b0SSuyog Pawar ps_cur_out_me_prms->aps_ref_list[i4_bridx][i][j] =
1114*c83a76b0SSuyog Pawar &ps_cur_out_me_prms->as_ref_list[i4_bridx][i][j];
1115*c83a76b0SSuyog Pawar }
1116*c83a76b0SSuyog Pawar }
1117*c83a76b0SSuyog Pawar }
1118*c83a76b0SSuyog Pawar
1119*c83a76b0SSuyog Pawar aps_ref_list = ps_cur_out_me_prms->aps_ref_list[i4_bridx];
1120*c83a76b0SSuyog Pawar aps_ref_list_temp = ps_cur_out_me_prms->as_ref_list[i4_bridx];
1121*c83a76b0SSuyog Pawar
1122*c83a76b0SSuyog Pawar curr_poc = ps_curr_inp->s_lap_out.i4_poc;
1123*c83a76b0SSuyog Pawar curr_idr_gop_num = ps_curr_inp->s_lap_out.i4_idr_gop_num;
1124*c83a76b0SSuyog Pawar
1125*c83a76b0SSuyog Pawar /* Number of reference pics given by LAP should not be greater than max */
1126*c83a76b0SSuyog Pawar ASSERT(HEVCE_MAX_REF_PICS >= ps_curr_inp->s_lap_out.i4_num_ref_pics);
1127*c83a76b0SSuyog Pawar
1128*c83a76b0SSuyog Pawar /* derive the weighted prediction enable flag based on slice type */
1129*c83a76b0SSuyog Pawar if(BSLICE == slice_type)
1130*c83a76b0SSuyog Pawar {
1131*c83a76b0SSuyog Pawar wp_flag = ps_curr_inp->s_lap_out.i1_weighted_bipred_flag;
1132*c83a76b0SSuyog Pawar }
1133*c83a76b0SSuyog Pawar else if(PSLICE == slice_type)
1134*c83a76b0SSuyog Pawar {
1135*c83a76b0SSuyog Pawar wp_flag = ps_curr_inp->s_lap_out.i1_weighted_pred_flag;
1136*c83a76b0SSuyog Pawar }
1137*c83a76b0SSuyog Pawar else
1138*c83a76b0SSuyog Pawar {
1139*c83a76b0SSuyog Pawar wp_flag = 0;
1140*c83a76b0SSuyog Pawar }
1141*c83a76b0SSuyog Pawar
1142*c83a76b0SSuyog Pawar ps_slice_header->s_rplm.i1_ref_pic_list_modification_flag_l0 = 0;
1143*c83a76b0SSuyog Pawar ps_slice_header->s_rplm.i1_ref_pic_list_modification_flag_l1 = 0;
1144*c83a76b0SSuyog Pawar ASSERT(curr_poc != INVALID_POC);
1145*c83a76b0SSuyog Pawar
1146*c83a76b0SSuyog Pawar /* run a loop over the number of reference pics given by LAP */
1147*c83a76b0SSuyog Pawar for(ref_pics = 0; ref_pics < ps_curr_inp->s_lap_out.i4_num_ref_pics; ref_pics++)
1148*c83a76b0SSuyog Pawar {
1149*c83a76b0SSuyog Pawar WORD32 ref_poc;
1150*c83a76b0SSuyog Pawar WORD32 i4_loop = 1;
1151*c83a76b0SSuyog Pawar WORD32 i4_temp_list;
1152*c83a76b0SSuyog Pawar
1153*c83a76b0SSuyog Pawar ref_poc = curr_poc + ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].i4_ref_pic_delta_poc;
1154*c83a76b0SSuyog Pawar if((0 == curr_poc) && curr_idr_gop_num)
1155*c83a76b0SSuyog Pawar {
1156*c83a76b0SSuyog Pawar curr_idr_gop_num -= 1;
1157*c83a76b0SSuyog Pawar }
1158*c83a76b0SSuyog Pawar ASSERT(ref_poc != INVALID_POC);
1159*c83a76b0SSuyog Pawar /* run a loop to check the poc based on delta poc array */
1160*c83a76b0SSuyog Pawar for(ctr = 0; ctr < i4_num_recon_bufs; ctr++)
1161*c83a76b0SSuyog Pawar {
1162*c83a76b0SSuyog Pawar /* if the POC is matching with current ref picture*/
1163*c83a76b0SSuyog Pawar if((ref_poc == ppps_recon_bufs[i4_bridx][ctr]->i4_poc) &&
1164*c83a76b0SSuyog Pawar (0 == ppps_recon_bufs[i4_bridx][ctr]->i4_is_free) &&
1165*c83a76b0SSuyog Pawar (curr_idr_gop_num == ppps_recon_bufs[i4_bridx][ctr]->i4_idr_gop_num))
1166*c83a76b0SSuyog Pawar {
1167*c83a76b0SSuyog Pawar /* populate the reference lists based on delta poc array */
1168*c83a76b0SSuyog Pawar if((ref_poc < curr_poc) || (0 == curr_poc))
1169*c83a76b0SSuyog Pawar {
1170*c83a76b0SSuyog Pawar /* list 0 */
1171*c83a76b0SSuyog Pawar memcpy(
1172*c83a76b0SSuyog Pawar &aps_ref_list_temp[LIST_0][num_ref_pics_list0],
1173*c83a76b0SSuyog Pawar ppps_recon_bufs[i4_bridx][ctr],
1174*c83a76b0SSuyog Pawar sizeof(recon_pic_buf_t));
1175*c83a76b0SSuyog Pawar
1176*c83a76b0SSuyog Pawar i4_temp_list = num_ref_pics_list0;
1177*c83a76b0SSuyog Pawar
1178*c83a76b0SSuyog Pawar /*duplicate pics added to the list*/
1179*c83a76b0SSuyog Pawar while(i4_loop != ps_curr_inp->s_lap_out.as_ref_pics[ref_pics]
1180*c83a76b0SSuyog Pawar .i4_num_duplicate_entries_in_ref_list)
1181*c83a76b0SSuyog Pawar {
1182*c83a76b0SSuyog Pawar i4_temp_list++;
1183*c83a76b0SSuyog Pawar /* list 0 */
1184*c83a76b0SSuyog Pawar memcpy(
1185*c83a76b0SSuyog Pawar &aps_ref_list_temp[LIST_0][i4_temp_list],
1186*c83a76b0SSuyog Pawar ppps_recon_bufs[i4_bridx][ctr],
1187*c83a76b0SSuyog Pawar sizeof(recon_pic_buf_t));
1188*c83a76b0SSuyog Pawar i4_loop++;
1189*c83a76b0SSuyog Pawar }
1190*c83a76b0SSuyog Pawar
1191*c83a76b0SSuyog Pawar /* populate weights and offsets corresponding to this ref pic */
1192*c83a76b0SSuyog Pawar memcpy(
1193*c83a76b0SSuyog Pawar &aps_ref_list_temp[LIST_0][num_ref_pics_list0].s_weight_offset,
1194*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].as_wght_off[0],
1195*c83a76b0SSuyog Pawar sizeof(ihevce_wght_offst_t));
1196*c83a76b0SSuyog Pawar
1197*c83a76b0SSuyog Pawar /* Store the used as ref for current pic flag */
1198*c83a76b0SSuyog Pawar aps_ref_list_temp[LIST_0][num_ref_pics_list0].i4_used_by_cur_pic_flag =
1199*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].i4_used_by_cur_pic_flag;
1200*c83a76b0SSuyog Pawar
1201*c83a76b0SSuyog Pawar if(wp_flag)
1202*c83a76b0SSuyog Pawar {
1203*c83a76b0SSuyog Pawar WORD16 i2_luma_weight = (aps_ref_list[LIST_0][num_ref_pics_list0]
1204*c83a76b0SSuyog Pawar ->s_weight_offset.i2_luma_weight);
1205*c83a76b0SSuyog Pawar
1206*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0]->i4_inv_luma_wt =
1207*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1208*c83a76b0SSuyog Pawar
1209*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0]->i4_log2_wt_denom =
1210*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1211*c83a76b0SSuyog Pawar }
1212*c83a76b0SSuyog Pawar else
1213*c83a76b0SSuyog Pawar {
1214*c83a76b0SSuyog Pawar WORD16 i2_luma_weight =
1215*c83a76b0SSuyog Pawar (1 << ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom);
1216*c83a76b0SSuyog Pawar
1217*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0]->s_weight_offset.i2_luma_weight =
1218*c83a76b0SSuyog Pawar i2_luma_weight;
1219*c83a76b0SSuyog Pawar
1220*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0]->i4_inv_luma_wt =
1221*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1222*c83a76b0SSuyog Pawar
1223*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0]->i4_log2_wt_denom =
1224*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1225*c83a76b0SSuyog Pawar }
1226*c83a76b0SSuyog Pawar
1227*c83a76b0SSuyog Pawar num_ref_pics_list0++;
1228*c83a76b0SSuyog Pawar i4_loop = 1;
1229*c83a76b0SSuyog Pawar
1230*c83a76b0SSuyog Pawar /*duplicate pics added to the list*/
1231*c83a76b0SSuyog Pawar while(i4_loop != ps_curr_inp->s_lap_out.as_ref_pics[ref_pics]
1232*c83a76b0SSuyog Pawar .i4_num_duplicate_entries_in_ref_list)
1233*c83a76b0SSuyog Pawar {
1234*c83a76b0SSuyog Pawar /* populate weights and offsets corresponding to this ref pic */
1235*c83a76b0SSuyog Pawar memcpy(
1236*c83a76b0SSuyog Pawar &aps_ref_list_temp[LIST_0][num_ref_pics_list0].s_weight_offset,
1237*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].as_wght_off[i4_loop],
1238*c83a76b0SSuyog Pawar sizeof(ihevce_wght_offst_t));
1239*c83a76b0SSuyog Pawar
1240*c83a76b0SSuyog Pawar /* Store the used as ref for current pic flag */
1241*c83a76b0SSuyog Pawar aps_ref_list_temp[LIST_0][num_ref_pics_list0].i4_used_by_cur_pic_flag =
1242*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].i4_used_by_cur_pic_flag;
1243*c83a76b0SSuyog Pawar
1244*c83a76b0SSuyog Pawar if(wp_flag)
1245*c83a76b0SSuyog Pawar {
1246*c83a76b0SSuyog Pawar WORD16 i2_luma_weight = (aps_ref_list[LIST_0][num_ref_pics_list0]
1247*c83a76b0SSuyog Pawar ->s_weight_offset.i2_luma_weight);
1248*c83a76b0SSuyog Pawar
1249*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0]->i4_inv_luma_wt =
1250*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1251*c83a76b0SSuyog Pawar
1252*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0]->i4_log2_wt_denom =
1253*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1254*c83a76b0SSuyog Pawar }
1255*c83a76b0SSuyog Pawar else
1256*c83a76b0SSuyog Pawar {
1257*c83a76b0SSuyog Pawar WORD16 i2_luma_weight =
1258*c83a76b0SSuyog Pawar (1 << ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom);
1259*c83a76b0SSuyog Pawar
1260*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0]
1261*c83a76b0SSuyog Pawar ->s_weight_offset.i2_luma_weight = i2_luma_weight;
1262*c83a76b0SSuyog Pawar
1263*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0]->i4_inv_luma_wt =
1264*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1265*c83a76b0SSuyog Pawar
1266*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0]->i4_log2_wt_denom =
1267*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1268*c83a76b0SSuyog Pawar }
1269*c83a76b0SSuyog Pawar
1270*c83a76b0SSuyog Pawar num_ref_pics_list0++;
1271*c83a76b0SSuyog Pawar i4_loop++;
1272*c83a76b0SSuyog Pawar ps_slice_header->s_rplm.i1_ref_pic_list_modification_flag_l0 = 1;
1273*c83a76b0SSuyog Pawar ps_slice_header->s_rplm.i1_ref_pic_list_modification_flag_l1 = 1;
1274*c83a76b0SSuyog Pawar }
1275*c83a76b0SSuyog Pawar }
1276*c83a76b0SSuyog Pawar else
1277*c83a76b0SSuyog Pawar {
1278*c83a76b0SSuyog Pawar /* list 1 */
1279*c83a76b0SSuyog Pawar memcpy(
1280*c83a76b0SSuyog Pawar &aps_ref_list_temp[LIST_1][num_ref_pics_list1],
1281*c83a76b0SSuyog Pawar ppps_recon_bufs[i4_bridx][ctr],
1282*c83a76b0SSuyog Pawar sizeof(recon_pic_buf_t));
1283*c83a76b0SSuyog Pawar i4_temp_list = num_ref_pics_list1;
1284*c83a76b0SSuyog Pawar /*duplicate pics added to the list*/
1285*c83a76b0SSuyog Pawar while(i4_loop != ps_curr_inp->s_lap_out.as_ref_pics[ref_pics]
1286*c83a76b0SSuyog Pawar .i4_num_duplicate_entries_in_ref_list)
1287*c83a76b0SSuyog Pawar {
1288*c83a76b0SSuyog Pawar i4_temp_list++;
1289*c83a76b0SSuyog Pawar /* list 1 */
1290*c83a76b0SSuyog Pawar memcpy(
1291*c83a76b0SSuyog Pawar &aps_ref_list_temp[LIST_1][i4_temp_list],
1292*c83a76b0SSuyog Pawar ppps_recon_bufs[i4_bridx][ctr],
1293*c83a76b0SSuyog Pawar sizeof(recon_pic_buf_t));
1294*c83a76b0SSuyog Pawar i4_loop++;
1295*c83a76b0SSuyog Pawar }
1296*c83a76b0SSuyog Pawar
1297*c83a76b0SSuyog Pawar /* populate weights and offsets corresponding to this ref pic */
1298*c83a76b0SSuyog Pawar memcpy(
1299*c83a76b0SSuyog Pawar &aps_ref_list_temp[LIST_1][num_ref_pics_list1].s_weight_offset,
1300*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].as_wght_off[0],
1301*c83a76b0SSuyog Pawar sizeof(ihevce_wght_offst_t));
1302*c83a76b0SSuyog Pawar
1303*c83a76b0SSuyog Pawar /* Store the used as ref for current pic flag */
1304*c83a76b0SSuyog Pawar aps_ref_list_temp[LIST_1][num_ref_pics_list1].i4_used_by_cur_pic_flag =
1305*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].i4_used_by_cur_pic_flag;
1306*c83a76b0SSuyog Pawar
1307*c83a76b0SSuyog Pawar if(wp_flag)
1308*c83a76b0SSuyog Pawar {
1309*c83a76b0SSuyog Pawar WORD16 i2_luma_weight = (aps_ref_list[LIST_1][num_ref_pics_list1]
1310*c83a76b0SSuyog Pawar ->s_weight_offset.i2_luma_weight);
1311*c83a76b0SSuyog Pawar
1312*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1]->i4_inv_luma_wt =
1313*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1314*c83a76b0SSuyog Pawar
1315*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1]->i4_log2_wt_denom =
1316*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1317*c83a76b0SSuyog Pawar }
1318*c83a76b0SSuyog Pawar else
1319*c83a76b0SSuyog Pawar {
1320*c83a76b0SSuyog Pawar WORD16 i2_luma_weight =
1321*c83a76b0SSuyog Pawar (1 << ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom);
1322*c83a76b0SSuyog Pawar
1323*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1]->s_weight_offset.i2_luma_weight =
1324*c83a76b0SSuyog Pawar i2_luma_weight;
1325*c83a76b0SSuyog Pawar
1326*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1]->i4_inv_luma_wt =
1327*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1328*c83a76b0SSuyog Pawar
1329*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1]->i4_log2_wt_denom =
1330*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1331*c83a76b0SSuyog Pawar }
1332*c83a76b0SSuyog Pawar
1333*c83a76b0SSuyog Pawar num_ref_pics_list1++;
1334*c83a76b0SSuyog Pawar i4_loop = 1;
1335*c83a76b0SSuyog Pawar /*duplicate pics added to the list*/
1336*c83a76b0SSuyog Pawar while(i4_loop != ps_curr_inp->s_lap_out.as_ref_pics[ref_pics]
1337*c83a76b0SSuyog Pawar .i4_num_duplicate_entries_in_ref_list)
1338*c83a76b0SSuyog Pawar {
1339*c83a76b0SSuyog Pawar /* populate weights and offsets corresponding to this ref pic */
1340*c83a76b0SSuyog Pawar memcpy(
1341*c83a76b0SSuyog Pawar &aps_ref_list_temp[LIST_1][num_ref_pics_list1].s_weight_offset,
1342*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].as_wght_off[i4_loop],
1343*c83a76b0SSuyog Pawar sizeof(ihevce_wght_offst_t));
1344*c83a76b0SSuyog Pawar
1345*c83a76b0SSuyog Pawar /* Store the used as ref for current pic flag */
1346*c83a76b0SSuyog Pawar aps_ref_list_temp[LIST_1][num_ref_pics_list1].i4_used_by_cur_pic_flag =
1347*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.as_ref_pics[ref_pics].i4_used_by_cur_pic_flag;
1348*c83a76b0SSuyog Pawar
1349*c83a76b0SSuyog Pawar if(wp_flag)
1350*c83a76b0SSuyog Pawar {
1351*c83a76b0SSuyog Pawar WORD16 i2_luma_weight = (aps_ref_list[LIST_1][num_ref_pics_list1]
1352*c83a76b0SSuyog Pawar ->s_weight_offset.i2_luma_weight);
1353*c83a76b0SSuyog Pawar
1354*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1]->i4_inv_luma_wt =
1355*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1356*c83a76b0SSuyog Pawar
1357*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1]->i4_log2_wt_denom =
1358*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1359*c83a76b0SSuyog Pawar }
1360*c83a76b0SSuyog Pawar else
1361*c83a76b0SSuyog Pawar {
1362*c83a76b0SSuyog Pawar WORD16 i2_luma_weight =
1363*c83a76b0SSuyog Pawar (1 << ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom);
1364*c83a76b0SSuyog Pawar
1365*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1]
1366*c83a76b0SSuyog Pawar ->s_weight_offset.i2_luma_weight = i2_luma_weight;
1367*c83a76b0SSuyog Pawar
1368*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1]->i4_inv_luma_wt =
1369*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1370*c83a76b0SSuyog Pawar
1371*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1]->i4_log2_wt_denom =
1372*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1373*c83a76b0SSuyog Pawar }
1374*c83a76b0SSuyog Pawar
1375*c83a76b0SSuyog Pawar num_ref_pics_list1++;
1376*c83a76b0SSuyog Pawar i4_loop++;
1377*c83a76b0SSuyog Pawar ps_slice_header->s_rplm.i1_ref_pic_list_modification_flag_l1 = 1;
1378*c83a76b0SSuyog Pawar ps_slice_header->s_rplm.i1_ref_pic_list_modification_flag_l0 = 1;
1379*c83a76b0SSuyog Pawar }
1380*c83a76b0SSuyog Pawar }
1381*c83a76b0SSuyog Pawar break;
1382*c83a76b0SSuyog Pawar }
1383*c83a76b0SSuyog Pawar }
1384*c83a76b0SSuyog Pawar
1385*c83a76b0SSuyog Pawar /* if the reference picture is not found then error */
1386*c83a76b0SSuyog Pawar ASSERT(ctr != i4_num_recon_bufs);
1387*c83a76b0SSuyog Pawar }
1388*c83a76b0SSuyog Pawar
1389*c83a76b0SSuyog Pawar i4_num_rpics_l0_excl_dup = num_ref_pics_list0;
1390*c83a76b0SSuyog Pawar i4_num_rpics_l1_excl_dup = num_ref_pics_list1;
1391*c83a76b0SSuyog Pawar
1392*c83a76b0SSuyog Pawar /* sort the reference pics in List0 in descending order POC */
1393*c83a76b0SSuyog Pawar if(num_ref_pics_list0 > 1)
1394*c83a76b0SSuyog Pawar {
1395*c83a76b0SSuyog Pawar /* run a loop for num ref pics -1 */
1396*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list0 - 1; ctr++)
1397*c83a76b0SSuyog Pawar {
1398*c83a76b0SSuyog Pawar WORD32 max_idx = ctr;
1399*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_temp;
1400*c83a76b0SSuyog Pawar WORD32 i;
1401*c83a76b0SSuyog Pawar
1402*c83a76b0SSuyog Pawar for(i = (ctr + 1); i < num_ref_pics_list0; i++)
1403*c83a76b0SSuyog Pawar {
1404*c83a76b0SSuyog Pawar /* check for poc greater than current ref poc */
1405*c83a76b0SSuyog Pawar if(aps_ref_list[LIST_0][i]->i4_poc > aps_ref_list[LIST_0][max_idx]->i4_poc)
1406*c83a76b0SSuyog Pawar {
1407*c83a76b0SSuyog Pawar max_idx = i;
1408*c83a76b0SSuyog Pawar }
1409*c83a76b0SSuyog Pawar }
1410*c83a76b0SSuyog Pawar
1411*c83a76b0SSuyog Pawar /* if max of remaining is not current, swap the pointers */
1412*c83a76b0SSuyog Pawar if(max_idx != ctr)
1413*c83a76b0SSuyog Pawar {
1414*c83a76b0SSuyog Pawar ps_temp = aps_ref_list[LIST_0][max_idx];
1415*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][max_idx] = aps_ref_list[LIST_0][ctr];
1416*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][ctr] = ps_temp;
1417*c83a76b0SSuyog Pawar }
1418*c83a76b0SSuyog Pawar }
1419*c83a76b0SSuyog Pawar }
1420*c83a76b0SSuyog Pawar
1421*c83a76b0SSuyog Pawar /* sort the reference pics in List1 in ascending order POC */
1422*c83a76b0SSuyog Pawar if(num_ref_pics_list1 > 1)
1423*c83a76b0SSuyog Pawar {
1424*c83a76b0SSuyog Pawar /* run a loop for num ref pics -1 */
1425*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list1 - 1; ctr++)
1426*c83a76b0SSuyog Pawar {
1427*c83a76b0SSuyog Pawar WORD32 min_idx = ctr;
1428*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_temp;
1429*c83a76b0SSuyog Pawar WORD32 i;
1430*c83a76b0SSuyog Pawar
1431*c83a76b0SSuyog Pawar for(i = (ctr + 1); i < num_ref_pics_list1; i++)
1432*c83a76b0SSuyog Pawar {
1433*c83a76b0SSuyog Pawar /* check for p[oc less than current ref poc */
1434*c83a76b0SSuyog Pawar if(aps_ref_list[LIST_1][i]->i4_poc < aps_ref_list[LIST_1][min_idx]->i4_poc)
1435*c83a76b0SSuyog Pawar {
1436*c83a76b0SSuyog Pawar min_idx = i;
1437*c83a76b0SSuyog Pawar }
1438*c83a76b0SSuyog Pawar }
1439*c83a76b0SSuyog Pawar
1440*c83a76b0SSuyog Pawar /* if min of remaining is not current, swap the pointers */
1441*c83a76b0SSuyog Pawar if(min_idx != ctr)
1442*c83a76b0SSuyog Pawar {
1443*c83a76b0SSuyog Pawar ps_temp = aps_ref_list[LIST_1][min_idx];
1444*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][min_idx] = aps_ref_list[LIST_1][ctr];
1445*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][ctr] = ps_temp;
1446*c83a76b0SSuyog Pawar }
1447*c83a76b0SSuyog Pawar }
1448*c83a76b0SSuyog Pawar }
1449*c83a76b0SSuyog Pawar
1450*c83a76b0SSuyog Pawar /* popluate the slice header parameters to signal delta POCs and use flags */
1451*c83a76b0SSuyog Pawar {
1452*c83a76b0SSuyog Pawar WORD32 i;
1453*c83a76b0SSuyog Pawar WORD32 prev_poc = curr_poc;
1454*c83a76b0SSuyog Pawar
1455*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.i1_inter_ref_pic_set_prediction_flag = 0;
1456*c83a76b0SSuyog Pawar
1457*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.i1_num_neg_pics = num_ref_pics_list0;
1458*c83a76b0SSuyog Pawar
1459*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.i1_num_pos_pics = num_ref_pics_list1;
1460*c83a76b0SSuyog Pawar
1461*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.i1_num_ref_idc = -1;
1462*c83a76b0SSuyog Pawar
1463*c83a76b0SSuyog Pawar /* populate the delta POCs of reference pics */
1464*c83a76b0SSuyog Pawar i = 0;
1465*c83a76b0SSuyog Pawar
1466*c83a76b0SSuyog Pawar for(ctr = 0; ctr < i4_num_rpics_l0_excl_dup; ctr++)
1467*c83a76b0SSuyog Pawar {
1468*c83a76b0SSuyog Pawar WORD32 ref_poc_l0 = aps_ref_list[LIST_0][i]->i4_poc;
1469*c83a76b0SSuyog Pawar
1470*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.ai2_delta_poc[ctr] = prev_poc - ref_poc_l0;
1471*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.ai1_used[ctr] =
1472*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->i4_used_by_cur_pic_flag;
1473*c83a76b0SSuyog Pawar
1474*c83a76b0SSuyog Pawar /* check if this picture has to be used as reference */
1475*c83a76b0SSuyog Pawar if(1 == ps_slice_header->s_stref_picset.ai1_used[ctr])
1476*c83a76b0SSuyog Pawar {
1477*c83a76b0SSuyog Pawar /* check for CRA poc related use flag signalling */
1478*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.ai1_used[ctr] =
1479*c83a76b0SSuyog Pawar (curr_poc > cra_poc) ? (ref_poc_l0 >= cra_poc) : (slice_type != ISLICE);
1480*c83a76b0SSuyog Pawar }
1481*c83a76b0SSuyog Pawar if(!(prev_poc - ref_poc_l0))
1482*c83a76b0SSuyog Pawar {
1483*c83a76b0SSuyog Pawar ctr -= 1;
1484*c83a76b0SSuyog Pawar i4_num_rpics_l0_excl_dup -= 1;
1485*c83a76b0SSuyog Pawar }
1486*c83a76b0SSuyog Pawar prev_poc = ref_poc_l0;
1487*c83a76b0SSuyog Pawar
1488*c83a76b0SSuyog Pawar i++;
1489*c83a76b0SSuyog Pawar }
1490*c83a76b0SSuyog Pawar
1491*c83a76b0SSuyog Pawar i = 0;
1492*c83a76b0SSuyog Pawar prev_poc = curr_poc;
1493*c83a76b0SSuyog Pawar for(; ctr < (i4_num_rpics_l0_excl_dup + i4_num_rpics_l1_excl_dup); ctr++)
1494*c83a76b0SSuyog Pawar {
1495*c83a76b0SSuyog Pawar WORD32 ref_poc_l1 = aps_ref_list[LIST_1][i]->i4_poc;
1496*c83a76b0SSuyog Pawar
1497*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.ai2_delta_poc[ctr] = ref_poc_l1 - prev_poc;
1498*c83a76b0SSuyog Pawar
1499*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.ai1_used[ctr] =
1500*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->i4_used_by_cur_pic_flag;
1501*c83a76b0SSuyog Pawar
1502*c83a76b0SSuyog Pawar /* check if this picture has to be used as reference */
1503*c83a76b0SSuyog Pawar if(1 == ps_slice_header->s_stref_picset.ai1_used[ctr])
1504*c83a76b0SSuyog Pawar {
1505*c83a76b0SSuyog Pawar /* check for CRA poc related use flag signalling */
1506*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.ai1_used[ctr] =
1507*c83a76b0SSuyog Pawar (curr_poc > cra_poc) ? (ref_poc_l1 >= cra_poc) : (slice_type != ISLICE);
1508*c83a76b0SSuyog Pawar /* (slice_type != ISLICE); */
1509*c83a76b0SSuyog Pawar }
1510*c83a76b0SSuyog Pawar if(!(ref_poc_l1 - prev_poc))
1511*c83a76b0SSuyog Pawar {
1512*c83a76b0SSuyog Pawar ctr -= 1;
1513*c83a76b0SSuyog Pawar i4_num_rpics_l1_excl_dup -= 1;
1514*c83a76b0SSuyog Pawar }
1515*c83a76b0SSuyog Pawar prev_poc = ref_poc_l1;
1516*c83a76b0SSuyog Pawar i++;
1517*c83a76b0SSuyog Pawar }
1518*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.i1_num_neg_pics = i4_num_rpics_l0_excl_dup;
1519*c83a76b0SSuyog Pawar
1520*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.i1_num_pos_pics = i4_num_rpics_l1_excl_dup;
1521*c83a76b0SSuyog Pawar
1522*c83a76b0SSuyog Pawar if(IV_IDR_FRAME == ps_curr_inp->s_lap_out.i4_pic_type)
1523*c83a76b0SSuyog Pawar {
1524*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.i1_num_neg_pics = 0;
1525*c83a76b0SSuyog Pawar ps_slice_header->s_stref_picset.i1_num_pos_pics = 0;
1526*c83a76b0SSuyog Pawar }
1527*c83a76b0SSuyog Pawar
1528*c83a76b0SSuyog Pawar /* not used so set to -1 */
1529*c83a76b0SSuyog Pawar memset(&ps_slice_header->s_stref_picset.ai1_ref_idc[0], -1, MAX_DPB_SIZE);
1530*c83a76b0SSuyog Pawar }
1531*c83a76b0SSuyog Pawar /* call the ME API to update the DPB of HME pyramids
1532*c83a76b0SSuyog Pawar Upadate list for reference bit-rate only */
1533*c83a76b0SSuyog Pawar if(0 == i4_bridx)
1534*c83a76b0SSuyog Pawar {
1535*c83a76b0SSuyog Pawar ihevce_me_frame_dpb_update(
1536*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_me_ctxt,
1537*c83a76b0SSuyog Pawar num_ref_pics_list0,
1538*c83a76b0SSuyog Pawar num_ref_pics_list1,
1539*c83a76b0SSuyog Pawar &aps_ref_list[LIST_0][0],
1540*c83a76b0SSuyog Pawar &aps_ref_list[LIST_1][0],
1541*c83a76b0SSuyog Pawar i4_thrd_id);
1542*c83a76b0SSuyog Pawar }
1543*c83a76b0SSuyog Pawar
1544*c83a76b0SSuyog Pawar /* Default list creation based on uses as ref pic for current pic flag */
1545*c83a76b0SSuyog Pawar {
1546*c83a76b0SSuyog Pawar WORD32 num_ref_pics_list_final = 0;
1547*c83a76b0SSuyog Pawar WORD32 list_idx = 0;
1548*c83a76b0SSuyog Pawar
1549*c83a76b0SSuyog Pawar /* LIST 0 */
1550*c83a76b0SSuyog Pawar /* run a loop for num ref pics in list 0 */
1551*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list0; ctr++)
1552*c83a76b0SSuyog Pawar {
1553*c83a76b0SSuyog Pawar /* check for used as reference flag */
1554*c83a76b0SSuyog Pawar if(1 == aps_ref_list[LIST_0][ctr]->i4_used_by_cur_pic_flag)
1555*c83a76b0SSuyog Pawar {
1556*c83a76b0SSuyog Pawar /* copy the pointer to the actual valid list idx */
1557*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][list_idx] = aps_ref_list[LIST_0][ctr];
1558*c83a76b0SSuyog Pawar
1559*c83a76b0SSuyog Pawar /* increment the valid pic counters and idx */
1560*c83a76b0SSuyog Pawar list_idx++;
1561*c83a76b0SSuyog Pawar num_ref_pics_list_final++;
1562*c83a76b0SSuyog Pawar }
1563*c83a76b0SSuyog Pawar }
1564*c83a76b0SSuyog Pawar
1565*c83a76b0SSuyog Pawar /* finally store the number of pictures in List0 */
1566*c83a76b0SSuyog Pawar num_ref_pics_list0 = num_ref_pics_list_final;
1567*c83a76b0SSuyog Pawar
1568*c83a76b0SSuyog Pawar /* LIST 1 */
1569*c83a76b0SSuyog Pawar num_ref_pics_list_final = 0;
1570*c83a76b0SSuyog Pawar list_idx = 0;
1571*c83a76b0SSuyog Pawar
1572*c83a76b0SSuyog Pawar /* run a loop for num ref pics in list 1 */
1573*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list1; ctr++)
1574*c83a76b0SSuyog Pawar {
1575*c83a76b0SSuyog Pawar /* check for used as reference flag */
1576*c83a76b0SSuyog Pawar if(1 == aps_ref_list[LIST_1][ctr]->i4_used_by_cur_pic_flag)
1577*c83a76b0SSuyog Pawar {
1578*c83a76b0SSuyog Pawar /* copy the pointer to the actual valid list idx */
1579*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][list_idx] = aps_ref_list[LIST_1][ctr];
1580*c83a76b0SSuyog Pawar
1581*c83a76b0SSuyog Pawar /* increment the valid pic counters and idx */
1582*c83a76b0SSuyog Pawar list_idx++;
1583*c83a76b0SSuyog Pawar num_ref_pics_list_final++;
1584*c83a76b0SSuyog Pawar }
1585*c83a76b0SSuyog Pawar }
1586*c83a76b0SSuyog Pawar
1587*c83a76b0SSuyog Pawar /* finally store the number of pictures in List1 */
1588*c83a76b0SSuyog Pawar num_ref_pics_list1 = num_ref_pics_list_final;
1589*c83a76b0SSuyog Pawar }
1590*c83a76b0SSuyog Pawar /*in case of single active ref picture on L0 and L1, then consider one of them weighted
1591*c83a76b0SSuyog Pawar and another non-weighted*/
1592*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_P_FRAME)
1593*c83a76b0SSuyog Pawar {
1594*c83a76b0SSuyog Pawar if(num_ref_pics_list0 > 2)
1595*c83a76b0SSuyog Pawar {
1596*c83a76b0SSuyog Pawar if(aps_ref_list[LIST_0][0]->i4_poc == aps_ref_list[LIST_0][1]->i4_poc)
1597*c83a76b0SSuyog Pawar {
1598*c83a76b0SSuyog Pawar i4_inc_L0_active_ref_pic = 1;
1599*c83a76b0SSuyog Pawar }
1600*c83a76b0SSuyog Pawar }
1601*c83a76b0SSuyog Pawar }
1602*c83a76b0SSuyog Pawar else
1603*c83a76b0SSuyog Pawar {
1604*c83a76b0SSuyog Pawar if(num_ref_pics_list0 >= 2 && num_ref_pics_list1 >= 2)
1605*c83a76b0SSuyog Pawar {
1606*c83a76b0SSuyog Pawar if(aps_ref_list[LIST_0][0]->i4_poc == aps_ref_list[LIST_0][1]->i4_poc)
1607*c83a76b0SSuyog Pawar {
1608*c83a76b0SSuyog Pawar i4_inc_L0_active_ref_pic = 1;
1609*c83a76b0SSuyog Pawar }
1610*c83a76b0SSuyog Pawar
1611*c83a76b0SSuyog Pawar if(aps_ref_list[LIST_1][0]->i4_poc == aps_ref_list[LIST_1][1]->i4_poc)
1612*c83a76b0SSuyog Pawar {
1613*c83a76b0SSuyog Pawar i4_inc_L1_active_ref_pic = 1;
1614*c83a76b0SSuyog Pawar }
1615*c83a76b0SSuyog Pawar }
1616*c83a76b0SSuyog Pawar }
1617*c83a76b0SSuyog Pawar /* append the reference pics in List1 and end of list0 */
1618*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list1; ctr++)
1619*c83a76b0SSuyog Pawar {
1620*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][num_ref_pics_list0 + ctr] = aps_ref_list[LIST_1][ctr];
1621*c83a76b0SSuyog Pawar }
1622*c83a76b0SSuyog Pawar
1623*c83a76b0SSuyog Pawar /* append the reference pics in List0 and end of list1 */
1624*c83a76b0SSuyog Pawar for(ctr = 0; ctr < num_ref_pics_list0; ctr++)
1625*c83a76b0SSuyog Pawar {
1626*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][num_ref_pics_list1 + ctr] = aps_ref_list[LIST_0][ctr];
1627*c83a76b0SSuyog Pawar }
1628*c83a76b0SSuyog Pawar
1629*c83a76b0SSuyog Pawar /* reference list modification for adding duplicate reference */
1630*c83a76b0SSuyog Pawar {
1631*c83a76b0SSuyog Pawar WORD32 i4_latest_idx = 0;
1632*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_ref_list_cur;
1633*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_ref_list_prev;
1634*c83a76b0SSuyog Pawar /*List 0*/
1635*c83a76b0SSuyog Pawar ps_ref_list_cur = aps_ref_list[LIST_0][0];
1636*c83a76b0SSuyog Pawar ps_ref_list_prev = ps_ref_list_cur;
1637*c83a76b0SSuyog Pawar for(ctr = 0; ctr < (num_ref_pics_list0 + num_ref_pics_list1); ctr++)
1638*c83a76b0SSuyog Pawar {
1639*c83a76b0SSuyog Pawar if(ps_ref_list_cur->i4_poc != ps_ref_list_prev->i4_poc)
1640*c83a76b0SSuyog Pawar {
1641*c83a76b0SSuyog Pawar i4_latest_idx++;
1642*c83a76b0SSuyog Pawar }
1643*c83a76b0SSuyog Pawar ps_ref_list_prev = ps_ref_list_cur;
1644*c83a76b0SSuyog Pawar ps_slice_header->s_rplm.i4_ref_poc_l0[ctr] = ps_ref_list_cur->i4_poc;
1645*c83a76b0SSuyog Pawar ps_slice_header->s_rplm.i1_list_entry_l0[ctr] = i4_latest_idx;
1646*c83a76b0SSuyog Pawar if((ctr + 1) < (num_ref_pics_list0 + num_ref_pics_list1))
1647*c83a76b0SSuyog Pawar {
1648*c83a76b0SSuyog Pawar ps_ref_list_cur = aps_ref_list[LIST_0][ctr + 1];
1649*c83a76b0SSuyog Pawar }
1650*c83a76b0SSuyog Pawar } /*end for*/
1651*c83a76b0SSuyog Pawar
1652*c83a76b0SSuyog Pawar /*LIST 1*/
1653*c83a76b0SSuyog Pawar i4_latest_idx = 0;
1654*c83a76b0SSuyog Pawar ps_ref_list_cur = aps_ref_list[LIST_1][0];
1655*c83a76b0SSuyog Pawar ps_ref_list_prev = ps_ref_list_cur;
1656*c83a76b0SSuyog Pawar for(ctr = 0; ctr < (num_ref_pics_list0 + num_ref_pics_list1); ctr++)
1657*c83a76b0SSuyog Pawar {
1658*c83a76b0SSuyog Pawar if(ps_ref_list_cur->i4_poc != ps_ref_list_prev->i4_poc)
1659*c83a76b0SSuyog Pawar {
1660*c83a76b0SSuyog Pawar i4_latest_idx++;
1661*c83a76b0SSuyog Pawar }
1662*c83a76b0SSuyog Pawar ps_ref_list_prev = ps_ref_list_cur;
1663*c83a76b0SSuyog Pawar ps_slice_header->s_rplm.i4_ref_poc_l1[ctr] = ps_ref_list_cur->i4_poc;
1664*c83a76b0SSuyog Pawar ps_slice_header->s_rplm.i1_list_entry_l1[ctr] = i4_latest_idx;
1665*c83a76b0SSuyog Pawar if((ctr + 1) < (num_ref_pics_list0 + num_ref_pics_list1))
1666*c83a76b0SSuyog Pawar {
1667*c83a76b0SSuyog Pawar ps_ref_list_cur = aps_ref_list[LIST_1][ctr + 1];
1668*c83a76b0SSuyog Pawar }
1669*c83a76b0SSuyog Pawar } /*end for*/
1670*c83a76b0SSuyog Pawar }
1671*c83a76b0SSuyog Pawar
1672*c83a76b0SSuyog Pawar /* set number of active references used for l0 and l1 in slice hdr */
1673*c83a76b0SSuyog Pawar ps_slice_header->i1_num_ref_idx_active_override_flag = 1;
1674*c83a76b0SSuyog Pawar ps_slice_header->i1_num_ref_idx_l0_active = num_ref_pics_list0 + num_ref_pics_list1;
1675*c83a76b0SSuyog Pawar if(BSLICE == slice_type)
1676*c83a76b0SSuyog Pawar {
1677*c83a76b0SSuyog Pawar /* i1_num_ref_idx_l1_active applicable only for B pics */
1678*c83a76b0SSuyog Pawar ps_slice_header->i1_num_ref_idx_l1_active = num_ref_pics_list0 + num_ref_pics_list1;
1679*c83a76b0SSuyog Pawar }
1680*c83a76b0SSuyog Pawar /* popluate the slice header parameters with weights and offsets */
1681*c83a76b0SSuyog Pawar {
1682*c83a76b0SSuyog Pawar WORD32 i;
1683*c83a76b0SSuyog Pawar
1684*c83a76b0SSuyog Pawar /* populate the log 2 weight denom if weighted prediction is enabled */
1685*c83a76b0SSuyog Pawar if(1 == wp_flag)
1686*c83a76b0SSuyog Pawar {
1687*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i1_chroma_log2_weight_denom =
1688*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_chroma_wght_denom;
1689*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i1_luma_log2_weight_denom =
1690*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1691*c83a76b0SSuyog Pawar }
1692*c83a76b0SSuyog Pawar
1693*c83a76b0SSuyog Pawar /* populate the weights and offsets for all pics in L0 + L1 */
1694*c83a76b0SSuyog Pawar for(i = 0; i < (num_ref_pics_list0 + num_ref_pics_list1); i++)
1695*c83a76b0SSuyog Pawar {
1696*c83a76b0SSuyog Pawar /* populate the weights and offsets if weighted prediction is enabled */
1697*c83a76b0SSuyog Pawar if(1 == wp_flag)
1698*c83a76b0SSuyog Pawar {
1699*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i1_luma_weight_l0_flag[i] =
1700*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.u1_luma_weight_enable_flag;
1701*c83a76b0SSuyog Pawar
1702*c83a76b0SSuyog Pawar /* if weights are enabled then copy to slice header */
1703*c83a76b0SSuyog Pawar if(1 == ps_slice_header->s_wt_ofst.i1_luma_weight_l0_flag[i])
1704*c83a76b0SSuyog Pawar {
1705*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_luma_weight_l0[i] =
1706*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_luma_weight;
1707*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_luma_offset_l0[i] =
1708*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_luma_offset;
1709*c83a76b0SSuyog Pawar
1710*c83a76b0SSuyog Pawar {
1711*c83a76b0SSuyog Pawar WORD16 i2_luma_weight =
1712*c83a76b0SSuyog Pawar (aps_ref_list[LIST_0][i]->s_weight_offset.i2_luma_weight);
1713*c83a76b0SSuyog Pawar
1714*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->i4_inv_luma_wt =
1715*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1716*c83a76b0SSuyog Pawar
1717*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->i4_log2_wt_denom =
1718*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1719*c83a76b0SSuyog Pawar }
1720*c83a76b0SSuyog Pawar }
1721*c83a76b0SSuyog Pawar else
1722*c83a76b0SSuyog Pawar {
1723*c83a76b0SSuyog Pawar WORD16 i2_luma_weight = (1 << ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom);
1724*c83a76b0SSuyog Pawar
1725*c83a76b0SSuyog Pawar /* set to default values */
1726*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_luma_weight = (i2_luma_weight);
1727*c83a76b0SSuyog Pawar
1728*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_luma_offset = 0;
1729*c83a76b0SSuyog Pawar
1730*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->i4_inv_luma_wt =
1731*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1732*c83a76b0SSuyog Pawar
1733*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->i4_log2_wt_denom =
1734*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1735*c83a76b0SSuyog Pawar }
1736*c83a76b0SSuyog Pawar
1737*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i1_chroma_weight_l0_flag[i] =
1738*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.u1_chroma_weight_enable_flag;
1739*c83a76b0SSuyog Pawar
1740*c83a76b0SSuyog Pawar /* if weights are enabled then copy to slice header */
1741*c83a76b0SSuyog Pawar if(1 == ps_slice_header->s_wt_ofst.i1_chroma_weight_l0_flag[i])
1742*c83a76b0SSuyog Pawar {
1743*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_chroma_weight_l0_cb[i] =
1744*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_cb_weight;
1745*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_chroma_offset_l0_cb[i] =
1746*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_cb_offset;
1747*c83a76b0SSuyog Pawar
1748*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_chroma_weight_l0_cr[i] =
1749*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_cr_weight;
1750*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_chroma_offset_l0_cr[i] =
1751*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_cr_offset;
1752*c83a76b0SSuyog Pawar }
1753*c83a76b0SSuyog Pawar else
1754*c83a76b0SSuyog Pawar {
1755*c83a76b0SSuyog Pawar /* set to default values */
1756*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_cb_weight =
1757*c83a76b0SSuyog Pawar (1 << ps_curr_inp->s_lap_out.i4_log2_chroma_wght_denom);
1758*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_cr_weight =
1759*c83a76b0SSuyog Pawar (1 << ps_curr_inp->s_lap_out.i4_log2_chroma_wght_denom);
1760*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_cb_offset = 0;
1761*c83a76b0SSuyog Pawar aps_ref_list[LIST_0][i]->s_weight_offset.i2_cr_offset = 0;
1762*c83a76b0SSuyog Pawar }
1763*c83a76b0SSuyog Pawar }
1764*c83a76b0SSuyog Pawar }
1765*c83a76b0SSuyog Pawar
1766*c83a76b0SSuyog Pawar for(i = 0; i < (num_ref_pics_list0 + num_ref_pics_list1); i++)
1767*c83a76b0SSuyog Pawar {
1768*c83a76b0SSuyog Pawar /* populate the weights and offsets if weighted prediction is enabled */
1769*c83a76b0SSuyog Pawar if(1 == wp_flag)
1770*c83a76b0SSuyog Pawar {
1771*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i1_luma_weight_l1_flag[i] =
1772*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.u1_luma_weight_enable_flag;
1773*c83a76b0SSuyog Pawar
1774*c83a76b0SSuyog Pawar /* if weights are enabled then copy to slice header */
1775*c83a76b0SSuyog Pawar if(1 == ps_slice_header->s_wt_ofst.i1_luma_weight_l1_flag[i])
1776*c83a76b0SSuyog Pawar {
1777*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_luma_weight_l1[i] =
1778*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_luma_weight;
1779*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_luma_offset_l1[i] =
1780*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_luma_offset;
1781*c83a76b0SSuyog Pawar
1782*c83a76b0SSuyog Pawar {
1783*c83a76b0SSuyog Pawar WORD16 i2_luma_weight =
1784*c83a76b0SSuyog Pawar (aps_ref_list[LIST_1][i]->s_weight_offset.i2_luma_weight);
1785*c83a76b0SSuyog Pawar
1786*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->i4_inv_luma_wt =
1787*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1788*c83a76b0SSuyog Pawar
1789*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->i4_log2_wt_denom =
1790*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1791*c83a76b0SSuyog Pawar }
1792*c83a76b0SSuyog Pawar }
1793*c83a76b0SSuyog Pawar else
1794*c83a76b0SSuyog Pawar {
1795*c83a76b0SSuyog Pawar WORD16 i2_luma_weight = (1 << ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom);
1796*c83a76b0SSuyog Pawar
1797*c83a76b0SSuyog Pawar /* set to default values */
1798*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_luma_weight = (i2_luma_weight);
1799*c83a76b0SSuyog Pawar
1800*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_luma_offset = 0;
1801*c83a76b0SSuyog Pawar
1802*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->i4_inv_luma_wt =
1803*c83a76b0SSuyog Pawar ((1 << 15) + (i2_luma_weight >> 1)) / i2_luma_weight;
1804*c83a76b0SSuyog Pawar
1805*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->i4_log2_wt_denom =
1806*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom;
1807*c83a76b0SSuyog Pawar }
1808*c83a76b0SSuyog Pawar
1809*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i1_chroma_weight_l1_flag[i] =
1810*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.u1_chroma_weight_enable_flag;
1811*c83a76b0SSuyog Pawar
1812*c83a76b0SSuyog Pawar /* if weights are enabled then copy to slice header */
1813*c83a76b0SSuyog Pawar if(1 == ps_slice_header->s_wt_ofst.i1_chroma_weight_l1_flag[i])
1814*c83a76b0SSuyog Pawar {
1815*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_chroma_weight_l1_cb[i] =
1816*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_cb_weight;
1817*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_chroma_offset_l1_cb[i] =
1818*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_cb_offset;
1819*c83a76b0SSuyog Pawar
1820*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_chroma_weight_l1_cr[i] =
1821*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_cr_weight;
1822*c83a76b0SSuyog Pawar ps_slice_header->s_wt_ofst.i2_chroma_offset_l1_cr[i] =
1823*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_cr_offset;
1824*c83a76b0SSuyog Pawar }
1825*c83a76b0SSuyog Pawar else
1826*c83a76b0SSuyog Pawar {
1827*c83a76b0SSuyog Pawar /* set to default values */
1828*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_cb_weight =
1829*c83a76b0SSuyog Pawar (1 << ps_curr_inp->s_lap_out.i4_log2_chroma_wght_denom);
1830*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_cr_weight =
1831*c83a76b0SSuyog Pawar (1 << ps_curr_inp->s_lap_out.i4_log2_chroma_wght_denom);
1832*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_cb_offset = 0;
1833*c83a76b0SSuyog Pawar aps_ref_list[LIST_1][i]->s_weight_offset.i2_cr_offset = 0;
1834*c83a76b0SSuyog Pawar }
1835*c83a76b0SSuyog Pawar }
1836*c83a76b0SSuyog Pawar }
1837*c83a76b0SSuyog Pawar }
1838*c83a76b0SSuyog Pawar
1839*c83a76b0SSuyog Pawar /* store the number of reference pics in the list for ME/MC etc */
1840*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0 = num_ref_pics_list0;
1841*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1 = num_ref_pics_list1;
1842*c83a76b0SSuyog Pawar
1843*c83a76b0SSuyog Pawar #define HME_USE_ONLY_2REF
1844*c83a76b0SSuyog Pawar #ifndef HME_USE_ONLY_2REF
1845*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = num_ref_pics_list0;
1846*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = num_ref_pics_list1;
1847*c83a76b0SSuyog Pawar #else
1848*c83a76b0SSuyog Pawar #if MULTI_REF_ENABLE == 1
1849*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_quality_preset >= IHEVCE_QUALITY_P3)
1850*c83a76b0SSuyog Pawar {
1851*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_P_FRAME)
1852*c83a76b0SSuyog Pawar {
1853*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_quality_preset == IHEVCE_QUALITY_P6)
1854*c83a76b0SSuyog Pawar {
1855*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1856*c83a76b0SSuyog Pawar {
1857*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active =
1858*c83a76b0SSuyog Pawar MIN(MAX_NUM_REFS_IN_PPICS_IN_XS25 + 1, num_ref_pics_list0);
1859*c83a76b0SSuyog Pawar }
1860*c83a76b0SSuyog Pawar else
1861*c83a76b0SSuyog Pawar {
1862*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active =
1863*c83a76b0SSuyog Pawar MIN(MAX_NUM_REFS_IN_PPICS_IN_XS25, num_ref_pics_list0);
1864*c83a76b0SSuyog Pawar
1865*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active += i4_inc_L0_active_ref_pic;
1866*c83a76b0SSuyog Pawar }
1867*c83a76b0SSuyog Pawar }
1868*c83a76b0SSuyog Pawar else
1869*c83a76b0SSuyog Pawar {
1870*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1871*c83a76b0SSuyog Pawar {
1872*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(3, num_ref_pics_list0);
1873*c83a76b0SSuyog Pawar }
1874*c83a76b0SSuyog Pawar else
1875*c83a76b0SSuyog Pawar {
1876*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(2, num_ref_pics_list0);
1877*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active += i4_inc_L0_active_ref_pic;
1878*c83a76b0SSuyog Pawar }
1879*c83a76b0SSuyog Pawar }
1880*c83a76b0SSuyog Pawar
1881*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = 0;
1882*c83a76b0SSuyog Pawar }
1883*c83a76b0SSuyog Pawar else
1884*c83a76b0SSuyog Pawar {
1885*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1886*c83a76b0SSuyog Pawar {
1887*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(2, num_ref_pics_list0);
1888*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = MIN(1, num_ref_pics_list1);
1889*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active += i4_inc_L1_active_ref_pic;
1890*c83a76b0SSuyog Pawar }
1891*c83a76b0SSuyog Pawar else
1892*c83a76b0SSuyog Pawar {
1893*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(1, num_ref_pics_list0);
1894*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = MIN(1, num_ref_pics_list1);
1895*c83a76b0SSuyog Pawar
1896*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active += i4_inc_L1_active_ref_pic;
1897*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active += i4_inc_L0_active_ref_pic;
1898*c83a76b0SSuyog Pawar }
1899*c83a76b0SSuyog Pawar }
1900*c83a76b0SSuyog Pawar }
1901*c83a76b0SSuyog Pawar else
1902*c83a76b0SSuyog Pawar {
1903*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_P_FRAME)
1904*c83a76b0SSuyog Pawar {
1905*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1906*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(4, num_ref_pics_list0);
1907*c83a76b0SSuyog Pawar else
1908*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(4, num_ref_pics_list0);
1909*c83a76b0SSuyog Pawar
1910*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = 0;
1911*c83a76b0SSuyog Pawar }
1912*c83a76b0SSuyog Pawar else
1913*c83a76b0SSuyog Pawar {
1914*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1915*c83a76b0SSuyog Pawar {
1916*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(4, num_ref_pics_list0);
1917*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = MIN(4, num_ref_pics_list1);
1918*c83a76b0SSuyog Pawar }
1919*c83a76b0SSuyog Pawar else
1920*c83a76b0SSuyog Pawar {
1921*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(4, num_ref_pics_list0);
1922*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = MIN(4, num_ref_pics_list1);
1923*c83a76b0SSuyog Pawar }
1924*c83a76b0SSuyog Pawar }
1925*c83a76b0SSuyog Pawar }
1926*c83a76b0SSuyog Pawar #else
1927*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_P_FRAME)
1928*c83a76b0SSuyog Pawar {
1929*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1930*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(3, num_ref_pics_list0);
1931*c83a76b0SSuyog Pawar else
1932*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(2, num_ref_pics_list0);
1933*c83a76b0SSuyog Pawar
1934*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = 0;
1935*c83a76b0SSuyog Pawar }
1936*c83a76b0SSuyog Pawar else
1937*c83a76b0SSuyog Pawar {
1938*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1939*c83a76b0SSuyog Pawar {
1940*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(2, num_ref_pics_list0);
1941*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = MIN(1, num_ref_pics_list1);
1942*c83a76b0SSuyog Pawar }
1943*c83a76b0SSuyog Pawar else
1944*c83a76b0SSuyog Pawar {
1945*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = MIN(1, num_ref_pics_list0);
1946*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = MIN(1, num_ref_pics_list1);
1947*c83a76b0SSuyog Pawar }
1948*c83a76b0SSuyog Pawar }
1949*c83a76b0SSuyog Pawar #endif
1950*c83a76b0SSuyog Pawar
1951*c83a76b0SSuyog Pawar #endif
1952*c83a76b0SSuyog Pawar
1953*c83a76b0SSuyog Pawar ps_slice_header->i1_num_ref_idx_l0_active = MAX(1, ps_enc_ctxt->i4_num_ref_l0_active);
1954*c83a76b0SSuyog Pawar if(BSLICE == slice_type)
1955*c83a76b0SSuyog Pawar {
1956*c83a76b0SSuyog Pawar /* i1_num_ref_idx_l1_active applicable only for B pics */
1957*c83a76b0SSuyog Pawar ps_slice_header->i1_num_ref_idx_l1_active = MAX(1, ps_enc_ctxt->i4_num_ref_l1_active);
1958*c83a76b0SSuyog Pawar }
1959*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
1960*c83a76b0SSuyog Pawar {
1961*c83a76b0SSuyog Pawar /* If Interlace field is enabled, p field following an cra I field should have only one ref frame */
1962*c83a76b0SSuyog Pawar WORD32 cra_second_poc = cra_poc + 1;
1963*c83a76b0SSuyog Pawar
1964*c83a76b0SSuyog Pawar if(curr_poc == cra_second_poc)
1965*c83a76b0SSuyog Pawar {
1966*c83a76b0SSuyog Pawar /* set number of active references used for l0 and l1 for me */
1967*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active = 1;
1968*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active = 0;
1969*c83a76b0SSuyog Pawar
1970*c83a76b0SSuyog Pawar /* set number of active references used for l0 and l1 in slice hdr */
1971*c83a76b0SSuyog Pawar ps_slice_header->i1_num_ref_idx_active_override_flag = 1;
1972*c83a76b0SSuyog Pawar ps_slice_header->i1_num_ref_idx_l0_active =
1973*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0 + ps_enc_ctxt->i4_num_ref_l1;
1974*c83a76b0SSuyog Pawar }
1975*c83a76b0SSuyog Pawar }
1976*c83a76b0SSuyog Pawar return;
1977*c83a76b0SSuyog Pawar }
1978*c83a76b0SSuyog Pawar
1979*c83a76b0SSuyog Pawar /*!
1980*c83a76b0SSuyog Pawar ******************************************************************************
1981*c83a76b0SSuyog Pawar * \if Function name : ihevce_get_frame_lambda_prms \endif
1982*c83a76b0SSuyog Pawar *
1983*c83a76b0SSuyog Pawar * \brief
1984*c83a76b0SSuyog Pawar * Function whihc calculates the Lambda params for current picture
1985*c83a76b0SSuyog Pawar *
1986*c83a76b0SSuyog Pawar * \param[in] ps_enc_ctxt : encoder ctxt pointer
1987*c83a76b0SSuyog Pawar * \param[in] ps_cur_pic_ctxt : current pic ctxt
1988*c83a76b0SSuyog Pawar * \param[in] i4_cur_frame_qp : current pic QP
1989*c83a76b0SSuyog Pawar * \param[in] first_field : is first field flag
1990*c83a76b0SSuyog Pawar * \param[in] i4_temporal_lyr_id : Current picture layer id
1991*c83a76b0SSuyog Pawar *
1992*c83a76b0SSuyog Pawar * \return
1993*c83a76b0SSuyog Pawar * None
1994*c83a76b0SSuyog Pawar *
1995*c83a76b0SSuyog Pawar * \author
1996*c83a76b0SSuyog Pawar * Ittiam
1997*c83a76b0SSuyog Pawar *
1998*c83a76b0SSuyog Pawar *****************************************************************************
1999*c83a76b0SSuyog Pawar */
ihevce_get_frame_lambda_prms(enc_ctxt_t * ps_enc_ctxt,pre_enc_me_ctxt_t * ps_cur_pic_ctxt,WORD32 i4_cur_frame_qp,WORD32 first_field,WORD32 i4_is_ref_pic,WORD32 i4_temporal_lyr_id,double f_i_pic_lamda_modifier,WORD32 i4_inst_id,WORD32 i4_lambda_type)2000*c83a76b0SSuyog Pawar void ihevce_get_frame_lambda_prms(
2001*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt,
2002*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_cur_pic_ctxt,
2003*c83a76b0SSuyog Pawar WORD32 i4_cur_frame_qp,
2004*c83a76b0SSuyog Pawar WORD32 first_field,
2005*c83a76b0SSuyog Pawar WORD32 i4_is_ref_pic,
2006*c83a76b0SSuyog Pawar WORD32 i4_temporal_lyr_id,
2007*c83a76b0SSuyog Pawar double f_i_pic_lamda_modifier,
2008*c83a76b0SSuyog Pawar WORD32 i4_inst_id,
2009*c83a76b0SSuyog Pawar WORD32 i4_lambda_type)
2010*c83a76b0SSuyog Pawar {
2011*c83a76b0SSuyog Pawar double lambda_modifier = CONST_LAMDA_MOD_VAL;
2012*c83a76b0SSuyog Pawar double lambda_uv_modifier = CONST_LAMDA_MOD_VAL;
2013*c83a76b0SSuyog Pawar double lambda = 0;
2014*c83a76b0SSuyog Pawar double lambda_uv;
2015*c83a76b0SSuyog Pawar WORD32 i4_use_const_lamda_modifier;
2016*c83a76b0SSuyog Pawar
2017*c83a76b0SSuyog Pawar /* initialize lambda based on frm qp, slice type, num b and temporal id */
2018*c83a76b0SSuyog Pawar /* This lamba calculation mimics the jctvc doc (TODO add doc number */
2019*c83a76b0SSuyog Pawar
2020*c83a76b0SSuyog Pawar WORD32 num_b_frms =
2021*c83a76b0SSuyog Pawar (1 << ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_temporal_layers) - 1;
2022*c83a76b0SSuyog Pawar WORD32 chroma_qp = (ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
2023*c83a76b0SSuyog Pawar ? MIN(i4_cur_frame_qp, 51)
2024*c83a76b0SSuyog Pawar : gai1_ihevc_chroma_qp_scale[i4_cur_frame_qp + MAX_QP_BD_OFFSET];
2025*c83a76b0SSuyog Pawar
2026*c83a76b0SSuyog Pawar WORD32 i4_qp_bdoffset =
2027*c83a76b0SSuyog Pawar 6 * (ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth - 8);
2028*c83a76b0SSuyog Pawar WORD32 slice_type = ps_cur_pic_ctxt->s_slice_hdr.i1_slice_type;
2029*c83a76b0SSuyog Pawar
2030*c83a76b0SSuyog Pawar (void)first_field;
2031*c83a76b0SSuyog Pawar (void)i4_is_ref_pic;
2032*c83a76b0SSuyog Pawar (void)i4_temporal_lyr_id;
2033*c83a76b0SSuyog Pawar i4_use_const_lamda_modifier = USE_CONSTANT_LAMBDA_MODIFIER;
2034*c83a76b0SSuyog Pawar i4_use_const_lamda_modifier = i4_use_const_lamda_modifier ||
2035*c83a76b0SSuyog Pawar ((ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_vqet &
2036*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_CONTROL_TOGGLER)) &&
2037*c83a76b0SSuyog Pawar ((ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_vqet &
2038*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_NOISE_PRESERVATION)) ||
2039*c83a76b0SSuyog Pawar (ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_vqet &
2040*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_1)) ||
2041*c83a76b0SSuyog Pawar (ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_vqet &
2042*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_2)) ||
2043*c83a76b0SSuyog Pawar (ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_vqet &
2044*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_3))));
2045*c83a76b0SSuyog Pawar
2046*c83a76b0SSuyog Pawar /* lambda modifier is the dependent on slice type and temporal id */
2047*c83a76b0SSuyog Pawar if(ISLICE == slice_type)
2048*c83a76b0SSuyog Pawar {
2049*c83a76b0SSuyog Pawar double temporal_correction_islice = 1.0 - 0.05 * num_b_frms;
2050*c83a76b0SSuyog Pawar temporal_correction_islice = MAX(0.5, temporal_correction_islice);
2051*c83a76b0SSuyog Pawar
2052*c83a76b0SSuyog Pawar lambda_modifier = 0.57 * temporal_correction_islice;
2053*c83a76b0SSuyog Pawar lambda_uv_modifier = lambda_modifier;
2054*c83a76b0SSuyog Pawar if(i4_use_const_lamda_modifier)
2055*c83a76b0SSuyog Pawar {
2056*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_modifier = f_i_pic_lamda_modifier;
2057*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_uv_modifier = f_i_pic_lamda_modifier;
2058*c83a76b0SSuyog Pawar }
2059*c83a76b0SSuyog Pawar else
2060*c83a76b0SSuyog Pawar {
2061*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_modifier = lambda_modifier;
2062*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_uv_modifier = lambda_uv_modifier;
2063*c83a76b0SSuyog Pawar }
2064*c83a76b0SSuyog Pawar }
2065*c83a76b0SSuyog Pawar else if(PSLICE == slice_type)
2066*c83a76b0SSuyog Pawar {
2067*c83a76b0SSuyog Pawar if(first_field)
2068*c83a76b0SSuyog Pawar lambda_modifier = 0.442; //0.442*0.8;
2069*c83a76b0SSuyog Pawar else
2070*c83a76b0SSuyog Pawar lambda_modifier = 0.442;
2071*c83a76b0SSuyog Pawar lambda_uv_modifier = lambda_modifier;
2072*c83a76b0SSuyog Pawar if(i4_use_const_lamda_modifier)
2073*c83a76b0SSuyog Pawar {
2074*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_modifier = CONST_LAMDA_MOD_VAL;
2075*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_uv_modifier = CONST_LAMDA_MOD_VAL;
2076*c83a76b0SSuyog Pawar }
2077*c83a76b0SSuyog Pawar else
2078*c83a76b0SSuyog Pawar {
2079*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_modifier = lambda_modifier;
2080*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_uv_modifier = lambda_uv_modifier;
2081*c83a76b0SSuyog Pawar }
2082*c83a76b0SSuyog Pawar }
2083*c83a76b0SSuyog Pawar else
2084*c83a76b0SSuyog Pawar {
2085*c83a76b0SSuyog Pawar /* BSLICE */
2086*c83a76b0SSuyog Pawar if(1 == i4_is_ref_pic)
2087*c83a76b0SSuyog Pawar {
2088*c83a76b0SSuyog Pawar lambda_modifier = 0.3536;
2089*c83a76b0SSuyog Pawar }
2090*c83a76b0SSuyog Pawar else if(2 == i4_is_ref_pic)
2091*c83a76b0SSuyog Pawar {
2092*c83a76b0SSuyog Pawar lambda_modifier = 0.45;
2093*c83a76b0SSuyog Pawar }
2094*c83a76b0SSuyog Pawar else
2095*c83a76b0SSuyog Pawar {
2096*c83a76b0SSuyog Pawar lambda_modifier = 0.68;
2097*c83a76b0SSuyog Pawar }
2098*c83a76b0SSuyog Pawar lambda_uv_modifier = lambda_modifier;
2099*c83a76b0SSuyog Pawar if(i4_use_const_lamda_modifier)
2100*c83a76b0SSuyog Pawar {
2101*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_modifier = CONST_LAMDA_MOD_VAL;
2102*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_uv_modifier = CONST_LAMDA_MOD_VAL;
2103*c83a76b0SSuyog Pawar }
2104*c83a76b0SSuyog Pawar else
2105*c83a76b0SSuyog Pawar {
2106*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_modifier = lambda_modifier;
2107*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].lambda_uv_modifier = lambda_uv_modifier;
2108*c83a76b0SSuyog Pawar }
2109*c83a76b0SSuyog Pawar /* TODO: Disable lambda modification for interlace encode to match HM runs */
2110*c83a76b0SSuyog Pawar //if(0 == ps_enc_ctxt->s_runtime_src_prms.i4_field_pic)
2111*c83a76b0SSuyog Pawar {
2112*c83a76b0SSuyog Pawar /* modify b lambda further based on temporal id */
2113*c83a76b0SSuyog Pawar if(i4_temporal_lyr_id)
2114*c83a76b0SSuyog Pawar {
2115*c83a76b0SSuyog Pawar lambda_modifier *= CLIP3((((double)(i4_cur_frame_qp - 12)) / 6.0), 2.00, 4.00);
2116*c83a76b0SSuyog Pawar lambda_uv_modifier *= CLIP3((((double)(chroma_qp - 12)) / 6.0), 2.00, 4.00);
2117*c83a76b0SSuyog Pawar }
2118*c83a76b0SSuyog Pawar }
2119*c83a76b0SSuyog Pawar }
2120*c83a76b0SSuyog Pawar if(i4_use_const_lamda_modifier)
2121*c83a76b0SSuyog Pawar {
2122*c83a76b0SSuyog Pawar if(ISLICE == slice_type)
2123*c83a76b0SSuyog Pawar {
2124*c83a76b0SSuyog Pawar lambda_modifier = f_i_pic_lamda_modifier;
2125*c83a76b0SSuyog Pawar lambda_uv_modifier = f_i_pic_lamda_modifier;
2126*c83a76b0SSuyog Pawar }
2127*c83a76b0SSuyog Pawar else
2128*c83a76b0SSuyog Pawar {
2129*c83a76b0SSuyog Pawar lambda_modifier = CONST_LAMDA_MOD_VAL;
2130*c83a76b0SSuyog Pawar lambda_uv_modifier = CONST_LAMDA_MOD_VAL;
2131*c83a76b0SSuyog Pawar }
2132*c83a76b0SSuyog Pawar }
2133*c83a76b0SSuyog Pawar
2134*c83a76b0SSuyog Pawar switch(i4_lambda_type)
2135*c83a76b0SSuyog Pawar {
2136*c83a76b0SSuyog Pawar case 0:
2137*c83a76b0SSuyog Pawar {
2138*c83a76b0SSuyog Pawar i4_qp_bdoffset = 0;
2139*c83a76b0SSuyog Pawar
2140*c83a76b0SSuyog Pawar lambda = pow(2.0, (((double)(i4_cur_frame_qp + i4_qp_bdoffset - 12)) / 3.0));
2141*c83a76b0SSuyog Pawar lambda_uv = pow(2.0, (((double)(chroma_qp + i4_qp_bdoffset - 12)) / 3.0));
2142*c83a76b0SSuyog Pawar
2143*c83a76b0SSuyog Pawar /* modify the base lambda according to lambda modifier */
2144*c83a76b0SSuyog Pawar lambda *= lambda_modifier;
2145*c83a76b0SSuyog Pawar lambda_uv *= lambda_uv_modifier;
2146*c83a76b0SSuyog Pawar
2147*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].u4_chroma_cost_weighing_factor =
2148*c83a76b0SSuyog Pawar (UWORD32)((lambda / lambda_uv) * (1 << CHROMA_COST_WEIGHING_FACTOR_Q_SHIFT));
2149*c83a76b0SSuyog Pawar
2150*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_lambda_qf =
2151*c83a76b0SSuyog Pawar (LWORD64)(lambda * (1 << LAMBDA_Q_SHIFT));
2152*c83a76b0SSuyog Pawar
2153*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_lambda_chroma_qf =
2154*c83a76b0SSuyog Pawar (LWORD64)(lambda_uv * (1 << LAMBDA_Q_SHIFT));
2155*c83a76b0SSuyog Pawar
2156*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_sad_lambda_qf =
2157*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda) * (1 << LAMBDA_Q_SHIFT));
2158*c83a76b0SSuyog Pawar if(i4_use_const_lamda_modifier)
2159*c83a76b0SSuyog Pawar {
2160*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_lambda_qf =
2161*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
2162*c83a76b0SSuyog Pawar
2163*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_lambda_qf =
2164*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda) * (1 << LAMBDA_Q_SHIFT));
2165*c83a76b0SSuyog Pawar
2166*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_lambda_qf =
2167*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda)) * (1 << (LAMBDA_Q_SHIFT)));
2168*c83a76b0SSuyog Pawar }
2169*c83a76b0SSuyog Pawar else
2170*c83a76b0SSuyog Pawar {
2171*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_lambda_qf =
2172*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda) / 1.5) * (1 << LAMBDA_Q_SHIFT));
2173*c83a76b0SSuyog Pawar
2174*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_lambda_qf =
2175*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda * 1.5) * (1 << LAMBDA_Q_SHIFT));
2176*c83a76b0SSuyog Pawar
2177*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_lambda_qf =
2178*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda * 1.5)) * (1 << (LAMBDA_Q_SHIFT)));
2179*c83a76b0SSuyog Pawar }
2180*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_type2_lambda_qf =
2181*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_lambda_qf;
2182*c83a76b0SSuyog Pawar
2183*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_type2_lambda_chroma_qf =
2184*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_lambda_chroma_qf;
2185*c83a76b0SSuyog Pawar
2186*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_sad_type2_lambda_qf =
2187*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_sad_lambda_qf;
2188*c83a76b0SSuyog Pawar
2189*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_type2_lambda_qf =
2190*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_lambda_qf;
2191*c83a76b0SSuyog Pawar
2192*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_type2_lambda_qf =
2193*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_lambda_qf;
2194*c83a76b0SSuyog Pawar
2195*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_type2_lambda_qf =
2196*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_lambda_qf;
2197*c83a76b0SSuyog Pawar
2198*c83a76b0SSuyog Pawar break;
2199*c83a76b0SSuyog Pawar }
2200*c83a76b0SSuyog Pawar case 1:
2201*c83a76b0SSuyog Pawar {
2202*c83a76b0SSuyog Pawar lambda = pow(2.0, (((double)(i4_cur_frame_qp + i4_qp_bdoffset - 12)) / 3.0));
2203*c83a76b0SSuyog Pawar lambda_uv = pow(2.0, (((double)(chroma_qp + i4_qp_bdoffset - 12)) / 3.0));
2204*c83a76b0SSuyog Pawar
2205*c83a76b0SSuyog Pawar /* modify the base lambda according to lambda modifier */
2206*c83a76b0SSuyog Pawar lambda *= lambda_modifier;
2207*c83a76b0SSuyog Pawar lambda_uv *= lambda_uv_modifier;
2208*c83a76b0SSuyog Pawar
2209*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].u4_chroma_cost_weighing_factor =
2210*c83a76b0SSuyog Pawar (UWORD32)((lambda / lambda_uv) * (1 << CHROMA_COST_WEIGHING_FACTOR_Q_SHIFT));
2211*c83a76b0SSuyog Pawar
2212*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_lambda_qf =
2213*c83a76b0SSuyog Pawar (LWORD64)(lambda * (1 << LAMBDA_Q_SHIFT));
2214*c83a76b0SSuyog Pawar
2215*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_lambda_chroma_qf =
2216*c83a76b0SSuyog Pawar (LWORD64)(lambda_uv * (1 << LAMBDA_Q_SHIFT));
2217*c83a76b0SSuyog Pawar
2218*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_sad_lambda_qf =
2219*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda) * (1 << LAMBDA_Q_SHIFT));
2220*c83a76b0SSuyog Pawar if(i4_use_const_lamda_modifier)
2221*c83a76b0SSuyog Pawar {
2222*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_lambda_qf =
2223*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
2224*c83a76b0SSuyog Pawar
2225*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_lambda_qf =
2226*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda) * (1 << LAMBDA_Q_SHIFT));
2227*c83a76b0SSuyog Pawar
2228*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_lambda_qf =
2229*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda)) * (1 << (LAMBDA_Q_SHIFT)));
2230*c83a76b0SSuyog Pawar }
2231*c83a76b0SSuyog Pawar else
2232*c83a76b0SSuyog Pawar {
2233*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_lambda_qf =
2234*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda) / 1.5) * (1 << LAMBDA_Q_SHIFT));
2235*c83a76b0SSuyog Pawar
2236*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_lambda_qf =
2237*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda * 1.5) * (1 << LAMBDA_Q_SHIFT));
2238*c83a76b0SSuyog Pawar
2239*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_lambda_qf =
2240*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda * 1.5)) * (1 << (LAMBDA_Q_SHIFT)));
2241*c83a76b0SSuyog Pawar }
2242*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_type2_lambda_qf =
2243*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_lambda_qf;
2244*c83a76b0SSuyog Pawar
2245*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_type2_lambda_chroma_qf =
2246*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_lambda_chroma_qf;
2247*c83a76b0SSuyog Pawar
2248*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_sad_type2_lambda_qf =
2249*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_sad_lambda_qf;
2250*c83a76b0SSuyog Pawar
2251*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_type2_lambda_qf =
2252*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_lambda_qf;
2253*c83a76b0SSuyog Pawar
2254*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_type2_lambda_qf =
2255*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_lambda_qf;
2256*c83a76b0SSuyog Pawar
2257*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_type2_lambda_qf =
2258*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_lambda_qf;
2259*c83a76b0SSuyog Pawar
2260*c83a76b0SSuyog Pawar break;
2261*c83a76b0SSuyog Pawar }
2262*c83a76b0SSuyog Pawar case 2:
2263*c83a76b0SSuyog Pawar {
2264*c83a76b0SSuyog Pawar lambda = pow(2.0, (((double)(i4_cur_frame_qp + i4_qp_bdoffset - 12)) / 3.0));
2265*c83a76b0SSuyog Pawar lambda_uv = pow(2.0, (((double)(chroma_qp + i4_qp_bdoffset - 12)) / 3.0));
2266*c83a76b0SSuyog Pawar
2267*c83a76b0SSuyog Pawar /* modify the base lambda according to lambda modifier */
2268*c83a76b0SSuyog Pawar lambda *= lambda_modifier;
2269*c83a76b0SSuyog Pawar lambda_uv *= lambda_uv_modifier;
2270*c83a76b0SSuyog Pawar
2271*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].u4_chroma_cost_weighing_factor =
2272*c83a76b0SSuyog Pawar (UWORD32)((lambda / lambda_uv) * (1 << CHROMA_COST_WEIGHING_FACTOR_Q_SHIFT));
2273*c83a76b0SSuyog Pawar
2274*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_lambda_qf =
2275*c83a76b0SSuyog Pawar (LWORD64)(lambda * (1 << LAMBDA_Q_SHIFT));
2276*c83a76b0SSuyog Pawar
2277*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_lambda_chroma_qf =
2278*c83a76b0SSuyog Pawar (LWORD64)(lambda_uv * (1 << LAMBDA_Q_SHIFT));
2279*c83a76b0SSuyog Pawar
2280*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_sad_lambda_qf =
2281*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda) * (1 << LAMBDA_Q_SHIFT));
2282*c83a76b0SSuyog Pawar
2283*c83a76b0SSuyog Pawar if(i4_use_const_lamda_modifier)
2284*c83a76b0SSuyog Pawar {
2285*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_lambda_qf =
2286*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
2287*c83a76b0SSuyog Pawar
2288*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_lambda_qf =
2289*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda) * (1 << LAMBDA_Q_SHIFT));
2290*c83a76b0SSuyog Pawar
2291*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_lambda_qf =
2292*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda)) * (1 << (LAMBDA_Q_SHIFT)));
2293*c83a76b0SSuyog Pawar }
2294*c83a76b0SSuyog Pawar else
2295*c83a76b0SSuyog Pawar {
2296*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_lambda_qf =
2297*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda) / 1.5) * (1 << LAMBDA_Q_SHIFT));
2298*c83a76b0SSuyog Pawar
2299*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_lambda_qf =
2300*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda * 1.5) * (1 << LAMBDA_Q_SHIFT));
2301*c83a76b0SSuyog Pawar
2302*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_lambda_qf =
2303*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda * 1.5)) * (1 << (LAMBDA_Q_SHIFT)));
2304*c83a76b0SSuyog Pawar }
2305*c83a76b0SSuyog Pawar /* lambda corresponding to 8- bit, for metrics based on 8- bit ( Example 8bit SAD in encloop)*/
2306*c83a76b0SSuyog Pawar
2307*c83a76b0SSuyog Pawar lambda = pow(2.0, (((double)(i4_cur_frame_qp - 12)) / 3.0));
2308*c83a76b0SSuyog Pawar lambda_uv = pow(2.0, (((double)(chroma_qp - 12)) / 3.0));
2309*c83a76b0SSuyog Pawar
2310*c83a76b0SSuyog Pawar /* modify the base lambda according to lambda modifier */
2311*c83a76b0SSuyog Pawar lambda *= lambda_modifier;
2312*c83a76b0SSuyog Pawar lambda_uv *= lambda_uv_modifier;
2313*c83a76b0SSuyog Pawar
2314*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].u4_chroma_cost_weighing_factor =
2315*c83a76b0SSuyog Pawar (UWORD32)((lambda / lambda_uv) * (1 << CHROMA_COST_WEIGHING_FACTOR_Q_SHIFT));
2316*c83a76b0SSuyog Pawar
2317*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_type2_lambda_qf =
2318*c83a76b0SSuyog Pawar (LWORD64)(lambda * (1 << LAMBDA_Q_SHIFT));
2319*c83a76b0SSuyog Pawar
2320*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i8_cl_ssd_type2_lambda_chroma_qf =
2321*c83a76b0SSuyog Pawar (LWORD64)(lambda_uv * (1 << LAMBDA_Q_SHIFT));
2322*c83a76b0SSuyog Pawar
2323*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_sad_type2_lambda_qf =
2324*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda) * (1 << LAMBDA_Q_SHIFT));
2325*c83a76b0SSuyog Pawar if(i4_use_const_lamda_modifier)
2326*c83a76b0SSuyog Pawar {
2327*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_type2_lambda_qf =
2328*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda)) * (1 << LAMBDA_Q_SHIFT));
2329*c83a76b0SSuyog Pawar
2330*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_type2_lambda_qf =
2331*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda) * (1 << LAMBDA_Q_SHIFT));
2332*c83a76b0SSuyog Pawar
2333*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_type2_lambda_qf =
2334*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda)) * (1 << (LAMBDA_Q_SHIFT)));
2335*c83a76b0SSuyog Pawar }
2336*c83a76b0SSuyog Pawar else
2337*c83a76b0SSuyog Pawar {
2338*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_sad_type2_lambda_qf =
2339*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda) / 1.5) * (1 << LAMBDA_Q_SHIFT));
2340*c83a76b0SSuyog Pawar
2341*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_type2_lambda_qf =
2342*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda * 1.5) * (1 << LAMBDA_Q_SHIFT));
2343*c83a76b0SSuyog Pawar
2344*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_type2_lambda_qf =
2345*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda * 1.5)) * (1 << (LAMBDA_Q_SHIFT)));
2346*c83a76b0SSuyog Pawar }
2347*c83a76b0SSuyog Pawar
2348*c83a76b0SSuyog Pawar break;
2349*c83a76b0SSuyog Pawar }
2350*c83a76b0SSuyog Pawar default:
2351*c83a76b0SSuyog Pawar {
2352*c83a76b0SSuyog Pawar /* Intended to be a barren wasteland! */
2353*c83a76b0SSuyog Pawar ASSERT(0);
2354*c83a76b0SSuyog Pawar }
2355*c83a76b0SSuyog Pawar }
2356*c83a76b0SSuyog Pawar
2357*c83a76b0SSuyog Pawar /* Assign the final lambdas after up shifting to its q format */
2358*c83a76b0SSuyog Pawar
2359*c83a76b0SSuyog Pawar /* closed loop ssd lambda is same as final lambda */
2360*c83a76b0SSuyog Pawar
2361*c83a76b0SSuyog Pawar /* --- Initialized the lambda for SATD computations --- */
2362*c83a76b0SSuyog Pawar if(i4_use_const_lamda_modifier)
2363*c83a76b0SSuyog Pawar {
2364*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_lambda_qf =
2365*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda) * (1 << LAMBDA_Q_SHIFT));
2366*c83a76b0SSuyog Pawar
2367*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_lambda_qf =
2368*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda)) * (1 << (LAMBDA_Q_SHIFT)));
2369*c83a76b0SSuyog Pawar }
2370*c83a76b0SSuyog Pawar else
2371*c83a76b0SSuyog Pawar {
2372*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_cl_satd_lambda_qf =
2373*c83a76b0SSuyog Pawar (WORD32)(sqrt(lambda * 1.5) * (1 << LAMBDA_Q_SHIFT));
2374*c83a76b0SSuyog Pawar
2375*c83a76b0SSuyog Pawar ps_cur_pic_ctxt->as_lambda_prms[i4_inst_id].i4_ol_satd_lambda_qf =
2376*c83a76b0SSuyog Pawar (WORD32)((sqrt(lambda * 1.5)) * (1 << (LAMBDA_Q_SHIFT)));
2377*c83a76b0SSuyog Pawar }
2378*c83a76b0SSuyog Pawar }
2379*c83a76b0SSuyog Pawar
2380*c83a76b0SSuyog Pawar /*!
2381*c83a76b0SSuyog Pawar ******************************************************************************
2382*c83a76b0SSuyog Pawar * \if Function name : ihevce_update_qp_L1_sad_based \endif
2383*c83a76b0SSuyog Pawar *
2384*c83a76b0SSuyog Pawar * \brief
2385*c83a76b0SSuyog Pawar * Function which recalculates qp in case of scene cut based on L1 satd/act
2386*c83a76b0SSuyog Pawar *
2387*c83a76b0SSuyog Pawar * \param[in] ps_enc_ctxt : encoder ctxt pointer
2388*c83a76b0SSuyog Pawar * \param[in] ps_cur_pic_ctxt : current pic ctxt
2389*c83a76b0SSuyog Pawar * \param[in] i4_cur_frame_qp : current pic QP
2390*c83a76b0SSuyog Pawar * \param[in] first_field : is first field flag
2391*c83a76b0SSuyog Pawar * \param[in] i4_temporal_lyr_id : Current picture layer id
2392*c83a76b0SSuyog Pawar *
2393*c83a76b0SSuyog Pawar * \return
2394*c83a76b0SSuyog Pawar * None
2395*c83a76b0SSuyog Pawar *
2396*c83a76b0SSuyog Pawar * \author
2397*c83a76b0SSuyog Pawar * Ittiam
2398*c83a76b0SSuyog Pawar *
2399*c83a76b0SSuyog Pawar *****************************************************************************
2400*c83a76b0SSuyog Pawar */
ihevce_update_qp_L1_sad_based(enc_ctxt_t * ps_enc_ctxt,ihevce_lap_enc_buf_t * ps_curr_inp,ihevce_lap_enc_buf_t * ps_prev_inp,pre_enc_me_ctxt_t * ps_curr_out,WORD32 i4_is_last_thread)2401*c83a76b0SSuyog Pawar void ihevce_update_qp_L1_sad_based(
2402*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt,
2403*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp,
2404*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_prev_inp,
2405*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_out,
2406*c83a76b0SSuyog Pawar WORD32 i4_is_last_thread)
2407*c83a76b0SSuyog Pawar {
2408*c83a76b0SSuyog Pawar WORD32 i4_l1_ht, i4_l1_wd;
2409*c83a76b0SSuyog Pawar ihevce_ed_blk_t *ps_ed_4x4 = ps_curr_out->ps_layer1_buf;
2410*c83a76b0SSuyog Pawar WORD32 best_satd_16x16;
2411*c83a76b0SSuyog Pawar //LWORD64 acc_satd = 0;
2412*c83a76b0SSuyog Pawar LWORD64 acc_sad = 0; /*SAD accumulated to compare with coarse me sad*/
2413*c83a76b0SSuyog Pawar WORD32 i4_tot_4x4block_l1_x, i4_tot_4x4block_l1_y;
2414*c83a76b0SSuyog Pawar WORD32 i4_tot_ctb_l1_x, i4_tot_ctb_l1_y;
2415*c83a76b0SSuyog Pawar WORD32 i;
2416*c83a76b0SSuyog Pawar WORD32 i4_act_factor;
2417*c83a76b0SSuyog Pawar UWORD8 u1_cu_possible_qp;
2418*c83a76b0SSuyog Pawar WORD32 i4_q_scale_mod;
2419*c83a76b0SSuyog Pawar LWORD64 i8_best_satd_16x16;
2420*c83a76b0SSuyog Pawar LWORD64 i8_frame_satd_by_act_L1_accum;
2421*c83a76b0SSuyog Pawar LWORD64 i8_frame_acc_sadt_L1, i8_frame_acc_sadt_L1_squared;
2422*c83a76b0SSuyog Pawar WORD32 i4_new_frame_qp = 0, i4_qp_for_I_pic = 0;
2423*c83a76b0SSuyog Pawar LWORD64 pre_intra_satd_act_evaluated = 0;
2424*c83a76b0SSuyog Pawar ihevce_ed_ctb_l1_t *ps_ed_ctb_l1 = ps_curr_out->ps_ed_ctb_l1;
2425*c83a76b0SSuyog Pawar WORD32 i4_j;
2426*c83a76b0SSuyog Pawar double scale_factor_cmplx_change_detection;
2427*c83a76b0SSuyog Pawar WORD32 i4_cmplx_change_detection_thrsh;
2428*c83a76b0SSuyog Pawar long double ld_frame_avg_satd_L1;
2429*c83a76b0SSuyog Pawar
2430*c83a76b0SSuyog Pawar if(i4_is_last_thread)
2431*c83a76b0SSuyog Pawar {
2432*c83a76b0SSuyog Pawar ihevce_decomp_pre_intra_master_ctxt_t *ps_master_ctxt =
2433*c83a76b0SSuyog Pawar (ihevce_decomp_pre_intra_master_ctxt_t *)
2434*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_decomp_pre_intra_ctxt;
2435*c83a76b0SSuyog Pawar ihevce_decomp_pre_intra_ctxt_t *ps_ctxt = ps_master_ctxt->aps_decomp_pre_intra_thrd_ctxt[0];
2436*c83a76b0SSuyog Pawar
2437*c83a76b0SSuyog Pawar i4_l1_wd = ps_ctxt->as_layers[1].i4_actual_wd;
2438*c83a76b0SSuyog Pawar i4_l1_ht = ps_ctxt->as_layers[1].i4_actual_ht;
2439*c83a76b0SSuyog Pawar
2440*c83a76b0SSuyog Pawar if((ps_curr_inp->s_lap_out.i4_quality_preset == IHEVCE_QUALITY_P6) &&
2441*c83a76b0SSuyog Pawar (ps_curr_inp->s_lap_out.i4_temporal_lyr_id > TEMPORAL_LAYER_DISABLE))
2442*c83a76b0SSuyog Pawar {
2443*c83a76b0SSuyog Pawar i8_frame_acc_sadt_L1 = -1;
2444*c83a76b0SSuyog Pawar }
2445*c83a76b0SSuyog Pawar else
2446*c83a76b0SSuyog Pawar {
2447*c83a76b0SSuyog Pawar /*the accumulation of intra satd and calculation of new qp happens for all thread
2448*c83a76b0SSuyog Pawar It must be made sure every thread returns same value of intra satd and qp*/
2449*c83a76b0SSuyog Pawar i8_frame_acc_sadt_L1 = ihevce_decomp_pre_intra_get_frame_satd(
2450*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_decomp_pre_intra_ctxt, &i4_l1_wd, &i4_l1_ht);
2451*c83a76b0SSuyog Pawar }
2452*c83a76b0SSuyog Pawar
2453*c83a76b0SSuyog Pawar #if USE_SQRT_AVG_OF_SATD_SQR
2454*c83a76b0SSuyog Pawar if((ps_curr_inp->s_lap_out.i4_quality_preset == IHEVCE_QUALITY_P6) &&
2455*c83a76b0SSuyog Pawar (ps_curr_inp->s_lap_out.i4_temporal_lyr_id > TEMPORAL_LAYER_DISABLE))
2456*c83a76b0SSuyog Pawar {
2457*c83a76b0SSuyog Pawar i8_frame_acc_sadt_L1_squared = 0x7fffffff;
2458*c83a76b0SSuyog Pawar }
2459*c83a76b0SSuyog Pawar else
2460*c83a76b0SSuyog Pawar {
2461*c83a76b0SSuyog Pawar i8_frame_acc_sadt_L1_squared = ihevce_decomp_pre_intra_get_frame_satd_squared(
2462*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_decomp_pre_intra_ctxt, &i4_l1_wd, &i4_l1_ht);
2463*c83a76b0SSuyog Pawar }
2464*c83a76b0SSuyog Pawar #else
2465*c83a76b0SSuyog Pawar i8_frame_acc_sadt_L1_squared = i8_frame_acc_sadt_L1;
2466*c83a76b0SSuyog Pawar #endif
2467*c83a76b0SSuyog Pawar if((i4_l1_wd * i4_l1_ht) > (245760 /*640 * 384*/))
2468*c83a76b0SSuyog Pawar {
2469*c83a76b0SSuyog Pawar scale_factor_cmplx_change_detection =
2470*c83a76b0SSuyog Pawar (double)0.12 * ((i4_l1_wd * i4_l1_ht) / (640.0 * 384.0));
2471*c83a76b0SSuyog Pawar i4_cmplx_change_detection_thrsh =
2472*c83a76b0SSuyog Pawar (WORD32)(HME_HIGH_SAD_BLK_THRESH * (1 - scale_factor_cmplx_change_detection));
2473*c83a76b0SSuyog Pawar }
2474*c83a76b0SSuyog Pawar else
2475*c83a76b0SSuyog Pawar {
2476*c83a76b0SSuyog Pawar scale_factor_cmplx_change_detection =
2477*c83a76b0SSuyog Pawar (double)0.12 * ((640.0 * 384.0) / (i4_l1_wd * i4_l1_ht));
2478*c83a76b0SSuyog Pawar i4_cmplx_change_detection_thrsh =
2479*c83a76b0SSuyog Pawar (WORD32)(HME_HIGH_SAD_BLK_THRESH * (1 + scale_factor_cmplx_change_detection));
2480*c83a76b0SSuyog Pawar }
2481*c83a76b0SSuyog Pawar i4_tot_4x4block_l1_x =
2482*c83a76b0SSuyog Pawar ((i4_l1_wd + ((MAX_CTB_SIZE >> 1) - 1)) & 0xFFFFFFE0) /
2483*c83a76b0SSuyog Pawar 4; //((i4_l1_wd + 31) & 0xFFFFFFE0)/4;//(i4_l1_wd + (i4_l1_wd % 32 )) / 4;
2484*c83a76b0SSuyog Pawar i4_tot_4x4block_l1_y =
2485*c83a76b0SSuyog Pawar ((i4_l1_ht + ((MAX_CTB_SIZE >> 1) - 1)) & 0xFFFFFFE0) /
2486*c83a76b0SSuyog Pawar 4; //((i4_l1_ht + 31) & 0xFFFFFFE0)/4;//(i4_l1_ht + (i4_l1_ht % 32 )) / 4;
2487*c83a76b0SSuyog Pawar ld_frame_avg_satd_L1 =
2488*c83a76b0SSuyog Pawar (WORD32)log(
2489*c83a76b0SSuyog Pawar 1 + (long double)i8_frame_acc_sadt_L1_squared /
2490*c83a76b0SSuyog Pawar ((long double)((i4_tot_4x4block_l1_x * i4_tot_4x4block_l1_y) >> 2))) /
2491*c83a76b0SSuyog Pawar log(2.0);
2492*c83a76b0SSuyog Pawar /* L1 satd accumalated for computing qp */
2493*c83a76b0SSuyog Pawar i8_frame_satd_by_act_L1_accum = 0;
2494*c83a76b0SSuyog Pawar i4_tot_ctb_l1_x =
2495*c83a76b0SSuyog Pawar ((i4_l1_wd + ((MAX_CTB_SIZE >> 1) - 1)) & 0xFFFFFFE0) / (MAX_CTB_SIZE >> 1);
2496*c83a76b0SSuyog Pawar i4_tot_ctb_l1_y =
2497*c83a76b0SSuyog Pawar ((i4_l1_ht + ((MAX_CTB_SIZE >> 1) - 1)) & 0xFFFFFFE0) / (MAX_CTB_SIZE >> 1);
2498*c83a76b0SSuyog Pawar
2499*c83a76b0SSuyog Pawar for(i = 0; i < (i4_tot_ctb_l1_x * i4_tot_ctb_l1_y); i += 1)
2500*c83a76b0SSuyog Pawar {
2501*c83a76b0SSuyog Pawar for(i4_j = 0; i4_j < 16; i4_j++)
2502*c83a76b0SSuyog Pawar {
2503*c83a76b0SSuyog Pawar if(ps_ed_ctb_l1->i4_best_satd_8x8[i4_j] != -1)
2504*c83a76b0SSuyog Pawar {
2505*c83a76b0SSuyog Pawar ASSERT(ps_ed_ctb_l1->i4_best_satd_8x8[i4_j] >= 0);
2506*c83a76b0SSuyog Pawar ASSERT(ps_ed_ctb_l1->i4_best_sad_8x8_l1_ipe[i4_j] >= 0);
2507*c83a76b0SSuyog Pawar
2508*c83a76b0SSuyog Pawar if((ps_curr_inp->s_lap_out.i4_quality_preset == IHEVCE_QUALITY_P6) &&
2509*c83a76b0SSuyog Pawar (ps_curr_inp->s_lap_out.i4_temporal_lyr_id > TEMPORAL_LAYER_DISABLE))
2510*c83a76b0SSuyog Pawar {
2511*c83a76b0SSuyog Pawar best_satd_16x16 = 0;
2512*c83a76b0SSuyog Pawar }
2513*c83a76b0SSuyog Pawar else
2514*c83a76b0SSuyog Pawar {
2515*c83a76b0SSuyog Pawar best_satd_16x16 = ps_ed_ctb_l1->i4_best_satd_8x8[i4_j];
2516*c83a76b0SSuyog Pawar }
2517*c83a76b0SSuyog Pawar
2518*c83a76b0SSuyog Pawar acc_sad += (WORD32)ps_ed_ctb_l1->i4_best_sad_8x8_l1_ipe[i4_j];
2519*c83a76b0SSuyog Pawar //acc_satd += (WORD32)best_satd_16x16;
2520*c83a76b0SSuyog Pawar u1_cu_possible_qp = ihevce_cu_level_qp_mod(
2521*c83a76b0SSuyog Pawar 32,
2522*c83a76b0SSuyog Pawar best_satd_16x16,
2523*c83a76b0SSuyog Pawar ld_frame_avg_satd_L1,
2524*c83a76b0SSuyog Pawar REF_MOD_STRENGTH, // To be changed later
2525*c83a76b0SSuyog Pawar &i4_act_factor,
2526*c83a76b0SSuyog Pawar &i4_q_scale_mod,
2527*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_rc_quant);
2528*c83a76b0SSuyog Pawar i8_best_satd_16x16 = best_satd_16x16 << QP_LEVEL_MOD_ACT_FACTOR;
2529*c83a76b0SSuyog Pawar
2530*c83a76b0SSuyog Pawar if((ps_curr_inp->s_lap_out.i4_quality_preset == IHEVCE_QUALITY_P6) &&
2531*c83a76b0SSuyog Pawar (ps_curr_inp->s_lap_out.i4_temporal_lyr_id > TEMPORAL_LAYER_DISABLE))
2532*c83a76b0SSuyog Pawar {
2533*c83a76b0SSuyog Pawar i4_act_factor = (1 << QP_LEVEL_MOD_ACT_FACTOR);
2534*c83a76b0SSuyog Pawar }
2535*c83a76b0SSuyog Pawar
2536*c83a76b0SSuyog Pawar if(0 != i4_act_factor)
2537*c83a76b0SSuyog Pawar {
2538*c83a76b0SSuyog Pawar i8_frame_satd_by_act_L1_accum +=
2539*c83a76b0SSuyog Pawar ((WORD32)(i8_best_satd_16x16 / i4_act_factor));
2540*c83a76b0SSuyog Pawar /*Accumulate SAD for those regions which will undergo evaluation in L0 stage*/
2541*c83a76b0SSuyog Pawar if(ps_ed_4x4->intra_or_inter != 2)
2542*c83a76b0SSuyog Pawar pre_intra_satd_act_evaluated +=
2543*c83a76b0SSuyog Pawar ((WORD32)(i8_best_satd_16x16 / i4_act_factor));
2544*c83a76b0SSuyog Pawar }
2545*c83a76b0SSuyog Pawar }
2546*c83a76b0SSuyog Pawar ps_ed_4x4 += 4;
2547*c83a76b0SSuyog Pawar }
2548*c83a76b0SSuyog Pawar ps_ed_ctb_l1 += 1;
2549*c83a76b0SSuyog Pawar }
2550*c83a76b0SSuyog Pawar /** store the L1 satd in context struct
2551*c83a76b0SSuyog Pawar Note: this variable is common across all thread. it must be made sure all threads write same value*/
2552*c83a76b0SSuyog Pawar if((ps_curr_inp->s_lap_out.i4_quality_preset == IHEVCE_QUALITY_P6) &&
2553*c83a76b0SSuyog Pawar (ps_curr_inp->s_lap_out.i4_temporal_lyr_id > TEMPORAL_LAYER_DISABLE))
2554*c83a76b0SSuyog Pawar {
2555*c83a76b0SSuyog Pawar i8_frame_satd_by_act_L1_accum = ps_prev_inp->s_rc_lap_out.i8_frame_satd_by_act_L1_accum;
2556*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_frame_satd_by_act_L1_accum = i8_frame_satd_by_act_L1_accum;
2557*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_satd_by_act_L1_accum_evaluated = -1;
2558*c83a76b0SSuyog Pawar }
2559*c83a76b0SSuyog Pawar else
2560*c83a76b0SSuyog Pawar {
2561*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_frame_satd_by_act_L1_accum = i8_frame_satd_by_act_L1_accum;
2562*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_satd_by_act_L1_accum_evaluated =
2563*c83a76b0SSuyog Pawar pre_intra_satd_act_evaluated;
2564*c83a76b0SSuyog Pawar }
2565*c83a76b0SSuyog Pawar
2566*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_pre_intra_satd = i8_frame_acc_sadt_L1;
2567*c83a76b0SSuyog Pawar /*accumulate raw intra sad without subtracting non coded sad*/
2568*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_raw_pre_intra_sad = acc_sad;
2569*c83a76b0SSuyog Pawar }
2570*c83a76b0SSuyog Pawar /*update pre-enc qp using data from L1 to use better qp in L0 in case of cbr mode*/
2571*c83a76b0SSuyog Pawar if(i4_is_last_thread)
2572*c83a76b0SSuyog Pawar {
2573*c83a76b0SSuyog Pawar /* acquire mutex lock for rate control calls */
2574*c83a76b0SSuyog Pawar osal_mutex_lock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
2575*c83a76b0SSuyog Pawar {
2576*c83a76b0SSuyog Pawar LWORD64 i8_est_L0_satd_by_act;
2577*c83a76b0SSuyog Pawar WORD32 i4_cur_q_scale;
2578*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_rate_control_mode != CONST_QP)
2579*c83a76b0SSuyog Pawar {
2580*c83a76b0SSuyog Pawar /*RCTODO :This needs to be reviewed in the context of 10/12 bit encoding as the Qp seems to be sub-optimal*/
2581*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_pass_prms.i4_pass != 2)
2582*c83a76b0SSuyog Pawar i4_cur_q_scale =
2583*c83a76b0SSuyog Pawar ps_enc_ctxt->s_rc_quant.pi4_qp_to_qscale
2584*c83a76b0SSuyog Pawar [ps_curr_out->i4_curr_frm_qp]; // + ps_enc_ctxt->s_rc_quant.i1_qp_offset];
2585*c83a76b0SSuyog Pawar else
2586*c83a76b0SSuyog Pawar i4_cur_q_scale = ps_enc_ctxt->s_rc_quant
2587*c83a76b0SSuyog Pawar .pi4_qp_to_qscale[MAX(ps_curr_out->i4_curr_frm_qp, 0)];
2588*c83a76b0SSuyog Pawar }
2589*c83a76b0SSuyog Pawar else
2590*c83a76b0SSuyog Pawar i4_cur_q_scale =
2591*c83a76b0SSuyog Pawar ps_enc_ctxt->s_rc_quant.pi4_qp_to_qscale
2592*c83a76b0SSuyog Pawar [ps_curr_out->i4_curr_frm_qp + ps_enc_ctxt->s_rc_quant.i1_qp_offset];
2593*c83a76b0SSuyog Pawar
2594*c83a76b0SSuyog Pawar i4_cur_q_scale = (i4_cur_q_scale + (1 << (QSCALE_Q_FAC_3 - 1))) >> QSCALE_Q_FAC_3;
2595*c83a76b0SSuyog Pawar
2596*c83a76b0SSuyog Pawar i8_est_L0_satd_by_act = ihevce_get_L0_satd_based_on_L1(
2597*c83a76b0SSuyog Pawar i8_frame_satd_by_act_L1_accum,
2598*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i4_num_pels_in_frame_considered,
2599*c83a76b0SSuyog Pawar i4_cur_q_scale);
2600*c83a76b0SSuyog Pawar /*HEVC_RC query rate control for qp*/
2601*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_rate_control_mode != 3)
2602*c83a76b0SSuyog Pawar {
2603*c83a76b0SSuyog Pawar i4_new_frame_qp = ihevce_get_L0_est_satd_based_scd_qp(
2604*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0],
2605*c83a76b0SSuyog Pawar &ps_curr_inp->s_rc_lap_out,
2606*c83a76b0SSuyog Pawar i8_est_L0_satd_by_act,
2607*c83a76b0SSuyog Pawar 8.00);
2608*c83a76b0SSuyog Pawar }
2609*c83a76b0SSuyog Pawar else
2610*c83a76b0SSuyog Pawar i4_new_frame_qp = ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms
2611*c83a76b0SSuyog Pawar .as_tgt_params[ps_enc_ctxt->i4_resolution_id]
2612*c83a76b0SSuyog Pawar .ai4_frame_qp[0];
2613*c83a76b0SSuyog Pawar i4_new_frame_qp = CLIP3(i4_new_frame_qp, 1, 51);
2614*c83a76b0SSuyog Pawar i4_qp_for_I_pic = CLIP3(i4_qp_for_I_pic, 1, 51);
2615*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i4_L1_qp = i4_new_frame_qp;
2616*c83a76b0SSuyog Pawar /*I frame qp = qp-3 due to effect of lambda modifier*/
2617*c83a76b0SSuyog Pawar i4_qp_for_I_pic = i4_new_frame_qp - 3;
2618*c83a76b0SSuyog Pawar
2619*c83a76b0SSuyog Pawar /*use new qp get possible qp even for inter pictures assuming default offset*/
2620*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type != IV_IDR_FRAME &&
2621*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_pic_type != IV_I_FRAME)
2622*c83a76b0SSuyog Pawar {
2623*c83a76b0SSuyog Pawar i4_new_frame_qp += ps_curr_inp->s_lap_out.i4_temporal_lyr_id + 1;
2624*c83a76b0SSuyog Pawar }
2625*c83a76b0SSuyog Pawar
2626*c83a76b0SSuyog Pawar /*accumulate the L1 ME sad using skip sad value based on qp*/
2627*c83a76b0SSuyog Pawar /*accumulate this only for last thread as it ll be guranteed that L1 ME sad is completely populated*/
2628*c83a76b0SSuyog Pawar /*The lambda modifier in encoder is tuned in such a way that the qp offsets according to lambda modifer are as follows
2629*c83a76b0SSuyog Pawar Note: These qp offset only account for lambda modifier, Hence this should be applied over qp offset that is already there due to picture type
2630*c83a76b0SSuyog Pawar relative lambda scale(these lambda diff are mapped into qp difference which is applied over and obove the qp offset)
2631*c83a76b0SSuyog Pawar Qi = Iqp 1
2632*c83a76b0SSuyog Pawar Qp = Iqp 1
2633*c83a76b0SSuyog Pawar Qb = Iqp + 1.55 1.48
2634*c83a76b0SSuyog Pawar Qb1 = Iqp + 3.1 2.05
2635*c83a76b0SSuyog Pawar Qb2 = Iqp + 3.1 2.05*/
2636*c83a76b0SSuyog Pawar
2637*c83a76b0SSuyog Pawar /*ihevce_compute_offsets_from_rc(ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0],ai4_offsets,&ps_curr_inp->s_lap_out);*/
2638*c83a76b0SSuyog Pawar
2639*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_I_FRAME ||
2640*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_pic_type == IV_IDR_FRAME)
2641*c83a76b0SSuyog Pawar {
2642*c83a76b0SSuyog Pawar i4_new_frame_qp = i4_new_frame_qp - 3;
2643*c83a76b0SSuyog Pawar }
2644*c83a76b0SSuyog Pawar else if(ps_curr_inp->s_lap_out.i4_pic_type == IV_P_FRAME)
2645*c83a76b0SSuyog Pawar {
2646*c83a76b0SSuyog Pawar i4_new_frame_qp = i4_new_frame_qp - 2;
2647*c83a76b0SSuyog Pawar }
2648*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_B_FRAME &&
2649*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_temporal_lyr_id == 1)
2650*c83a76b0SSuyog Pawar {
2651*c83a76b0SSuyog Pawar i4_new_frame_qp = i4_new_frame_qp + 2;
2652*c83a76b0SSuyog Pawar }
2653*c83a76b0SSuyog Pawar else if(
2654*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_pic_type == IV_B_FRAME &&
2655*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_temporal_lyr_id == 2)
2656*c83a76b0SSuyog Pawar {
2657*c83a76b0SSuyog Pawar i4_new_frame_qp = i4_new_frame_qp + 6;
2658*c83a76b0SSuyog Pawar }
2659*c83a76b0SSuyog Pawar else if(
2660*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_pic_type == IV_B_FRAME &&
2661*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_temporal_lyr_id == 3)
2662*c83a76b0SSuyog Pawar {
2663*c83a76b0SSuyog Pawar i4_new_frame_qp = i4_new_frame_qp + 7;
2664*c83a76b0SSuyog Pawar }
2665*c83a76b0SSuyog Pawar
2666*c83a76b0SSuyog Pawar i4_new_frame_qp = CLIP3(i4_new_frame_qp, 1, 51);
2667*c83a76b0SSuyog Pawar i4_qp_for_I_pic = CLIP3(i4_qp_for_I_pic, 1, 51);
2668*c83a76b0SSuyog Pawar
2669*c83a76b0SSuyog Pawar {
2670*c83a76b0SSuyog Pawar calc_l1_level_hme_intra_sad_different_qp(
2671*c83a76b0SSuyog Pawar ps_enc_ctxt, ps_curr_out, ps_curr_inp, i4_tot_ctb_l1_x, i4_tot_ctb_l1_y);
2672*c83a76b0SSuyog Pawar
2673*c83a76b0SSuyog Pawar /** frame accumulated SAD over entire frame after accounting for dead zone SAD, this is least of intra or inter*/
2674*c83a76b0SSuyog Pawar /*ihevce_accum_hme_sad_subgop_rc(ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0],&ps_curr_inp->s_lap_out); */
2675*c83a76b0SSuyog Pawar ihevce_rc_register_L1_analysis_data(
2676*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0],
2677*c83a76b0SSuyog Pawar &ps_curr_inp->s_rc_lap_out,
2678*c83a76b0SSuyog Pawar i8_est_L0_satd_by_act,
2679*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_pre_intra_sad
2680*c83a76b0SSuyog Pawar [i4_new_frame_qp], //since the sad passed will be used to calc complexity it should be non coded sad subtracted sad
2681*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_frame_acc_coarse_me_sad[i4_new_frame_qp]);
2682*c83a76b0SSuyog Pawar
2683*c83a76b0SSuyog Pawar ihevce_coarse_me_get_rc_param(
2684*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt,
2685*c83a76b0SSuyog Pawar &ps_curr_out->i8_acc_frame_coarse_me_cost,
2686*c83a76b0SSuyog Pawar &ps_curr_out->i8_acc_frame_coarse_me_sad,
2687*c83a76b0SSuyog Pawar &ps_curr_out->i8_acc_num_blks_high_sad,
2688*c83a76b0SSuyog Pawar &ps_curr_out->i8_total_blks,
2689*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_is_prev_pic_in_Tid0_same_scene);
2690*c83a76b0SSuyog Pawar
2691*c83a76b0SSuyog Pawar if(ps_curr_out->i8_total_blks)
2692*c83a76b0SSuyog Pawar {
2693*c83a76b0SSuyog Pawar ps_curr_out->i4_complexity_percentage = (WORD32)(
2694*c83a76b0SSuyog Pawar (ps_curr_out->i8_acc_num_blks_high_sad * 100) /
2695*c83a76b0SSuyog Pawar (ps_curr_out->i8_total_blks));
2696*c83a76b0SSuyog Pawar }
2697*c83a76b0SSuyog Pawar /*not for Const QP mode*/
2698*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_rate_control_mode != 3)
2699*c83a76b0SSuyog Pawar {
2700*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_is_prev_pic_in_Tid0_same_scene &&
2701*c83a76b0SSuyog Pawar ps_curr_out->i8_total_blks &&
2702*c83a76b0SSuyog Pawar (((float)(ps_curr_out->i8_acc_num_blks_high_sad * 100) /
2703*c83a76b0SSuyog Pawar (ps_curr_out->i8_total_blks)) > (i4_cmplx_change_detection_thrsh)))
2704*c83a76b0SSuyog Pawar {
2705*c83a76b0SSuyog Pawar ps_curr_out->i4_is_high_complex_region = 1;
2706*c83a76b0SSuyog Pawar }
2707*c83a76b0SSuyog Pawar else
2708*c83a76b0SSuyog Pawar {
2709*c83a76b0SSuyog Pawar ps_curr_out->i4_is_high_complex_region = 0;
2710*c83a76b0SSuyog Pawar }
2711*c83a76b0SSuyog Pawar }
2712*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_frame_acc_coarse_me_cost =
2713*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_coarse_me_cost;
2714*c83a76b0SSuyog Pawar /*check for I only reset case and Non I SCD*/
2715*c83a76b0SSuyog Pawar ihevce_rc_check_non_lap_scd(
2716*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0], &ps_curr_inp->s_rc_lap_out);
2717*c83a76b0SSuyog Pawar }
2718*c83a76b0SSuyog Pawar }
2719*c83a76b0SSuyog Pawar /* release mutex lock after rate control calls */
2720*c83a76b0SSuyog Pawar osal_mutex_unlock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
2721*c83a76b0SSuyog Pawar }
2722*c83a76b0SSuyog Pawar }
2723*c83a76b0SSuyog Pawar
2724*c83a76b0SSuyog Pawar /*!
2725*c83a76b0SSuyog Pawar ******************************************************************************
2726*c83a76b0SSuyog Pawar * \if Function name : ihevce_frame_init \endif
2727*c83a76b0SSuyog Pawar *
2728*c83a76b0SSuyog Pawar * \brief
2729*c83a76b0SSuyog Pawar * Pre encode Frame processing slave thread entry point function
2730*c83a76b0SSuyog Pawar *
2731*c83a76b0SSuyog Pawar * \param[in] Frame processing thread context pointer
2732*c83a76b0SSuyog Pawar *
2733*c83a76b0SSuyog Pawar * \return
2734*c83a76b0SSuyog Pawar * None
2735*c83a76b0SSuyog Pawar *
2736*c83a76b0SSuyog Pawar * \author
2737*c83a76b0SSuyog Pawar * Ittiam
2738*c83a76b0SSuyog Pawar *
2739*c83a76b0SSuyog Pawar *****************************************************************************
2740*c83a76b0SSuyog Pawar */
ihevce_frame_init(enc_ctxt_t * ps_enc_ctxt,pre_enc_me_ctxt_t * ps_curr_inp_prms,me_enc_rdopt_ctxt_t * ps_cur_out_me_prms,WORD32 i4_cur_frame_qp,WORD32 i4_me_frm_id,WORD32 i4_thrd_id)2741*c83a76b0SSuyog Pawar void ihevce_frame_init(
2742*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt,
2743*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_inp_prms,
2744*c83a76b0SSuyog Pawar me_enc_rdopt_ctxt_t *ps_cur_out_me_prms,
2745*c83a76b0SSuyog Pawar WORD32 i4_cur_frame_qp,
2746*c83a76b0SSuyog Pawar WORD32 i4_me_frm_id,
2747*c83a76b0SSuyog Pawar WORD32 i4_thrd_id)
2748*c83a76b0SSuyog Pawar {
2749*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp;
2750*c83a76b0SSuyog Pawar WORD32 first_field = 1;
2751*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_master_ctxt;
2752*c83a76b0SSuyog Pawar
2753*c83a76b0SSuyog Pawar (void)i4_thrd_id;
2754*c83a76b0SSuyog Pawar (void)ps_cur_out_me_prms;
2755*c83a76b0SSuyog Pawar ps_curr_inp = ps_curr_inp_prms->ps_curr_inp;
2756*c83a76b0SSuyog Pawar
2757*c83a76b0SSuyog Pawar ps_master_ctxt = (me_master_ctxt_t *)ps_enc_ctxt->s_module_ctxt.pv_me_ctxt;
2758*c83a76b0SSuyog Pawar
2759*c83a76b0SSuyog Pawar /* get frame level lambda params */
2760*c83a76b0SSuyog Pawar ihevce_get_frame_lambda_prms(
2761*c83a76b0SSuyog Pawar ps_enc_ctxt,
2762*c83a76b0SSuyog Pawar ps_curr_inp_prms,
2763*c83a76b0SSuyog Pawar i4_cur_frame_qp,
2764*c83a76b0SSuyog Pawar first_field,
2765*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_is_ref_pic,
2766*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_temporal_lyr_id,
2767*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.f_i_pic_lamda_modifier,
2768*c83a76b0SSuyog Pawar 0,
2769*c83a76b0SSuyog Pawar ENC_LAMBDA_TYPE);
2770*c83a76b0SSuyog Pawar
2771*c83a76b0SSuyog Pawar if(1 == ps_curr_inp_prms->i4_frm_proc_valid_flag)
2772*c83a76b0SSuyog Pawar {
2773*c83a76b0SSuyog Pawar UWORD8 i1_cu_qp_delta_enabled_flag =
2774*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_cu_level_rc;
2775*c83a76b0SSuyog Pawar
2776*c83a76b0SSuyog Pawar /* picture level init of ME */
2777*c83a76b0SSuyog Pawar ihevce_me_frame_init(
2778*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_me_ctxt,
2779*c83a76b0SSuyog Pawar ps_cur_out_me_prms,
2780*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms,
2781*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms,
2782*c83a76b0SSuyog Pawar &ps_curr_inp_prms->as_lambda_prms[0],
2783*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0,
2784*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1,
2785*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l0_active,
2786*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_num_ref_l1_active,
2787*c83a76b0SSuyog Pawar &ps_cur_out_me_prms->aps_ref_list[0][LIST_0][0],
2788*c83a76b0SSuyog Pawar &ps_cur_out_me_prms->aps_ref_list[0][LIST_1][0],
2789*c83a76b0SSuyog Pawar ps_cur_out_me_prms->aps_ref_list[0],
2790*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_func_selector,
2791*c83a76b0SSuyog Pawar ps_curr_inp,
2792*c83a76b0SSuyog Pawar ps_curr_inp_prms->pv_me_lyr_ctxt,
2793*c83a76b0SSuyog Pawar i4_me_frm_id,
2794*c83a76b0SSuyog Pawar i4_thrd_id,
2795*c83a76b0SSuyog Pawar i4_cur_frame_qp,
2796*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_temporal_lyr_id,
2797*c83a76b0SSuyog Pawar i1_cu_qp_delta_enabled_flag,
2798*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id]->pv_dep_mngr_encloop_dep_me);
2799*c83a76b0SSuyog Pawar
2800*c83a76b0SSuyog Pawar /* -------------------------------------------------------- */
2801*c83a76b0SSuyog Pawar /* Preparing Job Queue for ME and each instance of enc_loop */
2802*c83a76b0SSuyog Pawar /* -------------------------------------------------------- */
2803*c83a76b0SSuyog Pawar ihevce_prepare_job_queue(ps_enc_ctxt, ps_curr_inp, i4_me_frm_id);
2804*c83a76b0SSuyog Pawar
2805*c83a76b0SSuyog Pawar /* Dep. Mngr : Reset the num ctb processed in every row for ENC sync */
2806*c83a76b0SSuyog Pawar ihevce_dmgr_rst_row_row_sync(
2807*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id]->pv_dep_mngr_encloop_dep_me);
2808*c83a76b0SSuyog Pawar }
2809*c83a76b0SSuyog Pawar }
2810*c83a76b0SSuyog Pawar
2811*c83a76b0SSuyog Pawar /****************************************************************************
2812*c83a76b0SSuyog Pawar Function Name : ihevce_rc_close
2813*c83a76b0SSuyog Pawar Description : closing the Rate control by passing the stored data in to the stat file for 2 pass encoding.
2814*c83a76b0SSuyog Pawar Inputs :
2815*c83a76b0SSuyog Pawar Globals :
2816*c83a76b0SSuyog Pawar Processing :
2817*c83a76b0SSuyog Pawar Outputs :
2818*c83a76b0SSuyog Pawar Returns :
2819*c83a76b0SSuyog Pawar Issues :
2820*c83a76b0SSuyog Pawar Revision History:
2821*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
2822*c83a76b0SSuyog Pawar *****************************************************************************/
2823*c83a76b0SSuyog Pawar
ihevce_rc_close(enc_ctxt_t * ps_enc_ctxt,WORD32 i4_enc_frm_id_rc,WORD32 i4_store_retrive,WORD32 i4_update_cnt,WORD32 i4_bit_rate_idx)2824*c83a76b0SSuyog Pawar void ihevce_rc_close(
2825*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt,
2826*c83a76b0SSuyog Pawar WORD32 i4_enc_frm_id_rc,
2827*c83a76b0SSuyog Pawar WORD32 i4_store_retrive,
2828*c83a76b0SSuyog Pawar WORD32 i4_update_cnt,
2829*c83a76b0SSuyog Pawar WORD32 i4_bit_rate_idx)
2830*c83a76b0SSuyog Pawar {
2831*c83a76b0SSuyog Pawar rc_bits_sad_t s_rc_frame_stat;
2832*c83a76b0SSuyog Pawar WORD32 out_buf_id;
2833*c83a76b0SSuyog Pawar WORD32 i4_pic_type, k;
2834*c83a76b0SSuyog Pawar WORD32 cur_qp;
2835*c83a76b0SSuyog Pawar ihevce_lap_output_params_t s_lap_out;
2836*c83a76b0SSuyog Pawar rc_lap_out_params_t s_rc_lap_out;
2837*c83a76b0SSuyog Pawar
2838*c83a76b0SSuyog Pawar for(k = 0; k < i4_update_cnt; k++) //ELP_RC
2839*c83a76b0SSuyog Pawar {
2840*c83a76b0SSuyog Pawar ihevce_rc_store_retrive_update_info(
2841*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i4_bit_rate_idx],
2842*c83a76b0SSuyog Pawar &s_rc_frame_stat,
2843*c83a76b0SSuyog Pawar i4_enc_frm_id_rc,
2844*c83a76b0SSuyog Pawar i4_bit_rate_idx,
2845*c83a76b0SSuyog Pawar 2,
2846*c83a76b0SSuyog Pawar &out_buf_id,
2847*c83a76b0SSuyog Pawar &i4_pic_type,
2848*c83a76b0SSuyog Pawar &cur_qp,
2849*c83a76b0SSuyog Pawar (void *)&s_lap_out,
2850*c83a76b0SSuyog Pawar (void *)&s_rc_lap_out);
2851*c83a76b0SSuyog Pawar
2852*c83a76b0SSuyog Pawar ihevce_rc_update_pic_info(
2853*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i4_bit_rate_idx],
2854*c83a76b0SSuyog Pawar (s_rc_frame_stat.u4_total_texture_bits +
2855*c83a76b0SSuyog Pawar s_rc_frame_stat.u4_total_header_bits), //pass total bits
2856*c83a76b0SSuyog Pawar s_rc_frame_stat.u4_total_header_bits,
2857*c83a76b0SSuyog Pawar s_rc_frame_stat.u4_total_sad,
2858*c83a76b0SSuyog Pawar s_rc_frame_stat.u4_total_intra_sad,
2859*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)i4_pic_type,
2860*c83a76b0SSuyog Pawar cur_qp,
2861*c83a76b0SSuyog Pawar 0,
2862*c83a76b0SSuyog Pawar s_rc_frame_stat.i4_qp_normalized_8x8_cu_sum,
2863*c83a76b0SSuyog Pawar s_rc_frame_stat.i4_8x8_cu_sum,
2864*c83a76b0SSuyog Pawar s_rc_frame_stat.i8_sad_by_qscale,
2865*c83a76b0SSuyog Pawar &s_lap_out,
2866*c83a76b0SSuyog Pawar &s_rc_lap_out,
2867*c83a76b0SSuyog Pawar out_buf_id,
2868*c83a76b0SSuyog Pawar s_rc_frame_stat.u4_open_loop_intra_sad,
2869*c83a76b0SSuyog Pawar s_rc_frame_stat.i8_total_ssd_frame,
2870*c83a76b0SSuyog Pawar i4_enc_frm_id_rc); //ps_curr_out->i4_inp_timestamp_low)
2871*c83a76b0SSuyog Pawar i4_enc_frm_id_rc++;
2872*c83a76b0SSuyog Pawar i4_enc_frm_id_rc = (i4_enc_frm_id_rc % ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc);
2873*c83a76b0SSuyog Pawar }
2874*c83a76b0SSuyog Pawar }
2875*c83a76b0SSuyog Pawar
2876*c83a76b0SSuyog Pawar /*!
2877*c83a76b0SSuyog Pawar ******************************************************************************
2878*c83a76b0SSuyog Pawar * \if Function name : ihevce_enc_frm_proc_slave_thrd \endif
2879*c83a76b0SSuyog Pawar *
2880*c83a76b0SSuyog Pawar * \brief
2881*c83a76b0SSuyog Pawar * Enocde Frame processing slave thread entry point function
2882*c83a76b0SSuyog Pawar *
2883*c83a76b0SSuyog Pawar * \param[in] Frame processing thread context pointer
2884*c83a76b0SSuyog Pawar *
2885*c83a76b0SSuyog Pawar * \return
2886*c83a76b0SSuyog Pawar * None
2887*c83a76b0SSuyog Pawar *
2888*c83a76b0SSuyog Pawar * \author
2889*c83a76b0SSuyog Pawar * Ittiam
2890*c83a76b0SSuyog Pawar *
2891*c83a76b0SSuyog Pawar *****************************************************************************
2892*c83a76b0SSuyog Pawar */
ihevce_enc_frm_proc_slave_thrd(void * pv_frm_proc_thrd_ctxt)2893*c83a76b0SSuyog Pawar WORD32 ihevce_enc_frm_proc_slave_thrd(void *pv_frm_proc_thrd_ctxt)
2894*c83a76b0SSuyog Pawar {
2895*c83a76b0SSuyog Pawar frm_proc_thrd_ctxt_t *ps_thrd_ctxt;
2896*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt;
2897*c83a76b0SSuyog Pawar WORD32 i4_me_end_flag, i4_enc_end_flag;
2898*c83a76b0SSuyog Pawar WORD32 i4_thrd_id;
2899*c83a76b0SSuyog Pawar ihevce_hle_ctxt_t *ps_hle_ctxt;
2900*c83a76b0SSuyog Pawar WORD32 i4_num_bitrates; //number of bit-rates instances running
2901*c83a76b0SSuyog Pawar WORD32 i; //ctr
2902*c83a76b0SSuyog Pawar void *pv_dep_mngr_prev_frame_me_done;
2903*c83a76b0SSuyog Pawar void *pv_dep_mngr_prev_frame_done;
2904*c83a76b0SSuyog Pawar WORD32 i4_resolution_id;
2905*c83a76b0SSuyog Pawar WORD32 i4_enc_frm_id_rc = 0;
2906*c83a76b0SSuyog Pawar WORD32 i4_enc_frm_id = 0;
2907*c83a76b0SSuyog Pawar WORD32 i4_me_frm_id = 0;
2908*c83a76b0SSuyog Pawar
2909*c83a76b0SSuyog Pawar ps_thrd_ctxt = (frm_proc_thrd_ctxt_t *)pv_frm_proc_thrd_ctxt;
2910*c83a76b0SSuyog Pawar ps_hle_ctxt = ps_thrd_ctxt->ps_hle_ctxt;
2911*c83a76b0SSuyog Pawar ps_enc_ctxt = (enc_ctxt_t *)ps_thrd_ctxt->pv_enc_ctxt; /*Changed for mres*/
2912*c83a76b0SSuyog Pawar i4_thrd_id = ps_thrd_ctxt->i4_thrd_id;
2913*c83a76b0SSuyog Pawar i4_me_end_flag = 0;
2914*c83a76b0SSuyog Pawar i4_enc_end_flag = 0;
2915*c83a76b0SSuyog Pawar i4_num_bitrates = ps_enc_ctxt->i4_num_bitrates;
2916*c83a76b0SSuyog Pawar i4_resolution_id = ps_enc_ctxt->i4_resolution_id;
2917*c83a76b0SSuyog Pawar
2918*c83a76b0SSuyog Pawar /*pv_dep_mngr_prev_frame_me_done =
2919*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_me_done;*/
2920*c83a76b0SSuyog Pawar
2921*c83a76b0SSuyog Pawar while((0 == i4_me_end_flag) && (0 == i4_enc_end_flag))
2922*c83a76b0SSuyog Pawar {
2923*c83a76b0SSuyog Pawar WORD32 result;
2924*c83a76b0SSuyog Pawar WORD32 ai4_in_buf_id[MAX_NUM_ME_PARALLEL];
2925*c83a76b0SSuyog Pawar me_enc_rdopt_ctxt_t *ps_curr_out_me;
2926*c83a76b0SSuyog Pawar
2927*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_multi_thrd.i4_num_me_frm_pllel)
2928*c83a76b0SSuyog Pawar {
2929*c83a76b0SSuyog Pawar pv_dep_mngr_prev_frame_me_done =
2930*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_me_done[0];
2931*c83a76b0SSuyog Pawar }
2932*c83a76b0SSuyog Pawar else
2933*c83a76b0SSuyog Pawar {
2934*c83a76b0SSuyog Pawar pv_dep_mngr_prev_frame_me_done =
2935*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_me_done[i4_me_frm_id];
2936*c83a76b0SSuyog Pawar }
2937*c83a76b0SSuyog Pawar
2938*c83a76b0SSuyog Pawar /* Wait till the previous frame ME is completly done*/
2939*c83a76b0SSuyog Pawar {
2940*c83a76b0SSuyog Pawar ihevce_dmgr_chk_frm_frm_sync(pv_dep_mngr_prev_frame_me_done, ps_thrd_ctxt->i4_thrd_id);
2941*c83a76b0SSuyog Pawar }
2942*c83a76b0SSuyog Pawar
2943*c83a76b0SSuyog Pawar /****** Lock the critical section ******/
2944*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.apv_mutex_handle[i4_me_frm_id])
2945*c83a76b0SSuyog Pawar {
2946*c83a76b0SSuyog Pawar result = osal_mutex_lock(ps_enc_ctxt->s_multi_thrd.apv_mutex_handle[i4_me_frm_id]);
2947*c83a76b0SSuyog Pawar
2948*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result)
2949*c83a76b0SSuyog Pawar return 0;
2950*c83a76b0SSuyog Pawar }
2951*c83a76b0SSuyog Pawar
2952*c83a76b0SSuyog Pawar {
2953*c83a76b0SSuyog Pawar /************************************/
2954*c83a76b0SSuyog Pawar /****** ENTER CRITICAL SECTION ******/
2955*c83a76b0SSuyog Pawar /************************************/
2956*c83a76b0SSuyog Pawar
2957*c83a76b0SSuyog Pawar /* First slave getting the mutex lock will act as master and does ME init
2958*c83a76b0SSuyog Pawar * of current frame and other slaves skip it
2959*c83a76b0SSuyog Pawar */
2960*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.ai4_me_master_done_flag[i4_me_frm_id] == 0)
2961*c83a76b0SSuyog Pawar {
2962*c83a76b0SSuyog Pawar WORD32 i4_ref_cur_qp; //current frame Qp for reference bit-rate instance
2963*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp = NULL;
2964*c83a76b0SSuyog Pawar
2965*c83a76b0SSuyog Pawar if(0 == i4_me_end_flag)
2966*c83a76b0SSuyog Pawar {
2967*c83a76b0SSuyog Pawar /* ------- get the input prms buffer from pre encode que ------------ */
2968*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id] =
2969*c83a76b0SSuyog Pawar (pre_enc_me_ctxt_t *)ihevce_q_get_filled_buff(
2970*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
2971*c83a76b0SSuyog Pawar IHEVCE_PRE_ENC_ME_Q,
2972*c83a76b0SSuyog Pawar &ai4_in_buf_id[i4_me_frm_id],
2973*c83a76b0SSuyog Pawar BUFF_QUE_BLOCKING_MODE);
2974*c83a76b0SSuyog Pawar /*always buffer must be available*/
2975*c83a76b0SSuyog Pawar ASSERT(ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id] != NULL);
2976*c83a76b0SSuyog Pawar
2977*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.is_in_buf_freed[i4_enc_frm_id] = 0;
2978*c83a76b0SSuyog Pawar
2979*c83a76b0SSuyog Pawar /* ------- get the input prms buffer from L0 IPE queue ------------ */
2980*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_L0_ipe_inp_prms[i4_me_frm_id] =
2981*c83a76b0SSuyog Pawar (pre_enc_L0_ipe_encloop_ctxt_t *)ihevce_q_get_filled_buff(
2982*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
2983*c83a76b0SSuyog Pawar IHEVCE_L0_IPE_ENC_Q,
2984*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.ai4_in_frm_l0_ipe_id[i4_me_frm_id],
2985*c83a76b0SSuyog Pawar BUFF_QUE_BLOCKING_MODE);
2986*c83a76b0SSuyog Pawar
2987*c83a76b0SSuyog Pawar /*always buffer must be available*/
2988*c83a76b0SSuyog Pawar ASSERT(ps_enc_ctxt->s_multi_thrd.aps_cur_L0_ipe_inp_prms[i4_me_frm_id] != NULL);
2989*c83a76b0SSuyog Pawar
2990*c83a76b0SSuyog Pawar /* ------- get the free buffer from me_enc que ------------ */
2991*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id] =
2992*c83a76b0SSuyog Pawar (me_enc_rdopt_ctxt_t *)ihevce_q_get_free_buff(
2993*c83a76b0SSuyog Pawar ps_enc_ctxt,
2994*c83a76b0SSuyog Pawar IHEVCE_ME_ENC_RDOPT_Q,
2995*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.ai4_me_out_buf_id[i4_me_frm_id],
2996*c83a76b0SSuyog Pawar BUFF_QUE_BLOCKING_MODE);
2997*c83a76b0SSuyog Pawar
2998*c83a76b0SSuyog Pawar /*always buffer must be available*/
2999*c83a76b0SSuyog Pawar ASSERT(ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id] != NULL);
3000*c83a76b0SSuyog Pawar }
3001*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id] &&
3002*c83a76b0SSuyog Pawar NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id] &&
3003*c83a76b0SSuyog Pawar NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_L0_ipe_inp_prms[i4_me_frm_id])
3004*c83a76b0SSuyog Pawar {
3005*c83a76b0SSuyog Pawar ps_curr_inp =
3006*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]->ps_curr_inp;
3007*c83a76b0SSuyog Pawar
3008*c83a76b0SSuyog Pawar ps_curr_out_me = ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id];
3009*c83a76b0SSuyog Pawar
3010*c83a76b0SSuyog Pawar ps_curr_out_me->ps_curr_inp_from_l0_ipe_prms =
3011*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_L0_ipe_inp_prms[i4_me_frm_id];
3012*c83a76b0SSuyog Pawar
3013*c83a76b0SSuyog Pawar /*initialization of curr out me*/
3014*c83a76b0SSuyog Pawar ps_curr_out_me->ps_curr_inp_from_me_prms =
3015*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id];
3016*c83a76b0SSuyog Pawar
3017*c83a76b0SSuyog Pawar ps_curr_out_me->curr_inp_from_me_buf_id = ai4_in_buf_id[i4_me_frm_id];
3018*c83a76b0SSuyog Pawar
3019*c83a76b0SSuyog Pawar ps_curr_out_me->i4_buf_id =
3020*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ai4_me_out_buf_id[i4_me_frm_id];
3021*c83a76b0SSuyog Pawar
3022*c83a76b0SSuyog Pawar ps_curr_out_me->ps_curr_inp =
3023*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]->ps_curr_inp;
3024*c83a76b0SSuyog Pawar
3025*c83a76b0SSuyog Pawar ps_curr_out_me->curr_inp_buf_id =
3026*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]->curr_inp_buf_id;
3027*c83a76b0SSuyog Pawar
3028*c83a76b0SSuyog Pawar ps_curr_out_me->curr_inp_from_l0_ipe_buf_id =
3029*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ai4_in_frm_l0_ipe_id[i4_me_frm_id];
3030*c83a76b0SSuyog Pawar
3031*c83a76b0SSuyog Pawar ps_curr_out_me->i4_frm_proc_valid_flag =
3032*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]
3033*c83a76b0SSuyog Pawar ->i4_frm_proc_valid_flag;
3034*c83a76b0SSuyog Pawar
3035*c83a76b0SSuyog Pawar ps_curr_out_me->i4_end_flag =
3036*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]->i4_end_flag;
3037*c83a76b0SSuyog Pawar
3038*c83a76b0SSuyog Pawar /* do the processing if input frm data is valid */
3039*c83a76b0SSuyog Pawar if(1 == ps_curr_inp->s_input_buf.i4_inp_frm_data_valid_flag)
3040*c83a76b0SSuyog Pawar {
3041*c83a76b0SSuyog Pawar /* slice header will be populated in pre-enocde stage */
3042*c83a76b0SSuyog Pawar memcpy(
3043*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id]
3044*c83a76b0SSuyog Pawar ->s_slice_hdr,
3045*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]
3046*c83a76b0SSuyog Pawar ->s_slice_hdr,
3047*c83a76b0SSuyog Pawar sizeof(slice_header_t));
3048*c83a76b0SSuyog Pawar
3049*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]
3050*c83a76b0SSuyog Pawar ->i4_frm_proc_valid_flag)
3051*c83a76b0SSuyog Pawar {
3052*c83a76b0SSuyog Pawar WORD32 ctr;
3053*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_frm_recon;
3054*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_bitrates; i++)
3055*c83a76b0SSuyog Pawar {
3056*c83a76b0SSuyog Pawar /* run a loop to free the non used reference pics */
3057*c83a76b0SSuyog Pawar /* This is done here because its assured that recon buf
3058*c83a76b0SSuyog Pawar * between app and encode loop is set as produced
3059*c83a76b0SSuyog Pawar */
3060*c83a76b0SSuyog Pawar {
3061*c83a76b0SSuyog Pawar WORD32 i4_free_id;
3062*c83a76b0SSuyog Pawar i4_free_id = ihevce_find_free_indx(
3063*c83a76b0SSuyog Pawar ps_enc_ctxt->pps_recon_buf_q[i],
3064*c83a76b0SSuyog Pawar ps_enc_ctxt->ai4_num_buf_recon_q[i]);
3065*c83a76b0SSuyog Pawar
3066*c83a76b0SSuyog Pawar if(i4_free_id != -1)
3067*c83a76b0SSuyog Pawar {
3068*c83a76b0SSuyog Pawar ps_enc_ctxt->pps_recon_buf_q[i][i4_free_id]->i4_is_free = 1;
3069*c83a76b0SSuyog Pawar ps_enc_ctxt->pps_recon_buf_q[i][i4_free_id]->i4_poc = -1;
3070*c83a76b0SSuyog Pawar }
3071*c83a76b0SSuyog Pawar }
3072*c83a76b0SSuyog Pawar
3073*c83a76b0SSuyog Pawar ps_frm_recon = NULL;
3074*c83a76b0SSuyog Pawar for(ctr = 0; ctr < ps_enc_ctxt->ai4_num_buf_recon_q[i]; ctr++)
3075*c83a76b0SSuyog Pawar {
3076*c83a76b0SSuyog Pawar if(ps_enc_ctxt->pps_recon_buf_q[i][ctr]->i4_is_free)
3077*c83a76b0SSuyog Pawar {
3078*c83a76b0SSuyog Pawar ps_frm_recon = ps_enc_ctxt->pps_recon_buf_q[i][ctr];
3079*c83a76b0SSuyog Pawar break;
3080*c83a76b0SSuyog Pawar }
3081*c83a76b0SSuyog Pawar }
3082*c83a76b0SSuyog Pawar ASSERT(ps_frm_recon != NULL);
3083*c83a76b0SSuyog Pawar
3084*c83a76b0SSuyog Pawar ps_frm_recon->i4_is_free = 0;
3085*c83a76b0SSuyog Pawar ps_frm_recon->i4_non_ref_free_flag = 0;
3086*c83a76b0SSuyog Pawar ps_frm_recon->i4_topfield_first =
3087*c83a76b0SSuyog Pawar ps_curr_inp->s_input_buf.i4_topfield_first;
3088*c83a76b0SSuyog Pawar ps_frm_recon->i4_poc = ps_curr_inp->s_lap_out.i4_poc;
3089*c83a76b0SSuyog Pawar ps_frm_recon->i4_pic_type = ps_curr_inp->s_lap_out.i4_pic_type;
3090*c83a76b0SSuyog Pawar ps_frm_recon->i4_display_num =
3091*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_display_num;
3092*c83a76b0SSuyog Pawar ps_frm_recon->i4_idr_gop_num =
3093*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_idr_gop_num;
3094*c83a76b0SSuyog Pawar ps_frm_recon->i4_bottom_field =
3095*c83a76b0SSuyog Pawar ps_curr_inp->s_input_buf.i4_bottom_field;
3096*c83a76b0SSuyog Pawar ps_frm_recon->i4_is_reference =
3097*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_is_ref_pic;
3098*c83a76b0SSuyog Pawar
3099*c83a76b0SSuyog Pawar {
3100*c83a76b0SSuyog Pawar WORD32 sei_hash_enabled;
3101*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
3102*c83a76b0SSuyog Pawar sei_hash_enabled = (ps_enc_ctxt->ps_stat_prms->s_out_strm_prms
3103*c83a76b0SSuyog Pawar .i4_sei_enable_flag == 1) &&
3104*c83a76b0SSuyog Pawar (ps_enc_ctxt->ps_stat_prms->s_out_strm_prms
3105*c83a76b0SSuyog Pawar .i4_decoded_pic_hash_sei_flag != 0);
3106*c83a76b0SSuyog Pawar #else
3107*c83a76b0SSuyog Pawar sei_hash_enabled = 0;
3108*c83a76b0SSuyog Pawar #endif
3109*c83a76b0SSuyog Pawar /* Deblock a picture for all reference frames unconditionally. */
3110*c83a76b0SSuyog Pawar /* Deblock non ref if psnr compute or save recon is enabled */
3111*c83a76b0SSuyog Pawar ps_frm_recon->i4_deblk_pad_hpel_cur_pic =
3112*c83a76b0SSuyog Pawar ps_frm_recon->i4_is_reference ||
3113*c83a76b0SSuyog Pawar (ps_enc_ctxt->ps_stat_prms->i4_save_recon) ||
3114*c83a76b0SSuyog Pawar (1 == sei_hash_enabled);
3115*c83a76b0SSuyog Pawar }
3116*c83a76b0SSuyog Pawar
3117*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_y_ht =
3118*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_ht;
3119*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_uv_ht =
3120*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_ht >>
3121*c83a76b0SSuyog Pawar ((ps_enc_ctxt->s_runtime_src_prms.i4_chr_format ==
3122*c83a76b0SSuyog Pawar IV_YUV_422SP_UV)
3123*c83a76b0SSuyog Pawar ? 0
3124*c83a76b0SSuyog Pawar : 1);
3125*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_y_wd =
3126*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd;
3127*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_uv_wd =
3128*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd;
3129*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_y_strd =
3130*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd +
3131*c83a76b0SSuyog Pawar (PAD_HORZ << 1);
3132*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_uv_strd =
3133*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd +
3134*c83a76b0SSuyog Pawar (PAD_HORZ << 1);
3135*c83a76b0SSuyog Pawar
3136*c83a76b0SSuyog Pawar /* reset the row_frm dep mngr for ME reverse sync for reference bitrate */
3137*c83a76b0SSuyog Pawar if(i == 0)
3138*c83a76b0SSuyog Pawar {
3139*c83a76b0SSuyog Pawar ihevce_dmgr_map_rst_sync(ps_frm_recon->pv_dep_mngr_recon);
3140*c83a76b0SSuyog Pawar }
3141*c83a76b0SSuyog Pawar
3142*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_frm_recon[i4_enc_frm_id][i] =
3143*c83a76b0SSuyog Pawar ps_frm_recon;
3144*c83a76b0SSuyog Pawar }
3145*c83a76b0SSuyog Pawar }
3146*c83a76b0SSuyog Pawar /* Reference buffer management and reference list creation */
3147*c83a76b0SSuyog Pawar /* This needs to be created for each bit-rate since the reconstructed output is
3148*c83a76b0SSuyog Pawar different for all bit-rates. ME uses only 0th instnace ref list */
3149*c83a76b0SSuyog Pawar for(i = i4_num_bitrates - 1; i >= 0; i--)
3150*c83a76b0SSuyog Pawar {
3151*c83a76b0SSuyog Pawar ihevce_manage_ref_pics(
3152*c83a76b0SSuyog Pawar ps_enc_ctxt,
3153*c83a76b0SSuyog Pawar ps_curr_inp,
3154*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id]
3155*c83a76b0SSuyog Pawar ->s_slice_hdr,
3156*c83a76b0SSuyog Pawar i4_me_frm_id,
3157*c83a76b0SSuyog Pawar i4_thrd_id,
3158*c83a76b0SSuyog Pawar i); /* bitrate instance ID */
3159*c83a76b0SSuyog Pawar }
3160*c83a76b0SSuyog Pawar /*query of qp to be moved just before encoding starts*/
3161*c83a76b0SSuyog Pawar i4_ref_cur_qp = ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]
3162*c83a76b0SSuyog Pawar ->i4_curr_frm_qp;
3163*c83a76b0SSuyog Pawar /* The Qp populated in Pre enc stage needs to overwritten with Qp
3164*c83a76b0SSuyog Pawar queried from rate control*/
3165*c83a76b0SSuyog Pawar }
3166*c83a76b0SSuyog Pawar else
3167*c83a76b0SSuyog Pawar {
3168*c83a76b0SSuyog Pawar i4_ref_cur_qp = 0;
3169*c83a76b0SSuyog Pawar }
3170*c83a76b0SSuyog Pawar
3171*c83a76b0SSuyog Pawar /* call the core encoding loop */
3172*c83a76b0SSuyog Pawar ihevce_frame_init(
3173*c83a76b0SSuyog Pawar ps_enc_ctxt,
3174*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id],
3175*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id],
3176*c83a76b0SSuyog Pawar i4_ref_cur_qp,
3177*c83a76b0SSuyog Pawar i4_me_frm_id,
3178*c83a76b0SSuyog Pawar i4_thrd_id);
3179*c83a76b0SSuyog Pawar }
3180*c83a76b0SSuyog Pawar
3181*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ai4_me_master_done_flag[i4_me_frm_id] = 1;
3182*c83a76b0SSuyog Pawar }
3183*c83a76b0SSuyog Pawar }
3184*c83a76b0SSuyog Pawar
3185*c83a76b0SSuyog Pawar /************************************/
3186*c83a76b0SSuyog Pawar /****** EXIT CRITICAL SECTION ******/
3187*c83a76b0SSuyog Pawar /************************************/
3188*c83a76b0SSuyog Pawar
3189*c83a76b0SSuyog Pawar /****** Unlock the critical section ******/
3190*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.apv_mutex_handle[i4_me_frm_id])
3191*c83a76b0SSuyog Pawar {
3192*c83a76b0SSuyog Pawar result = osal_mutex_unlock(ps_enc_ctxt->s_multi_thrd.apv_mutex_handle[i4_me_frm_id]);
3193*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result)
3194*c83a76b0SSuyog Pawar return 0;
3195*c83a76b0SSuyog Pawar }
3196*c83a76b0SSuyog Pawar
3197*c83a76b0SSuyog Pawar if((1 == ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_mres_single_out) &&
3198*c83a76b0SSuyog Pawar (1 == ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]
3199*c83a76b0SSuyog Pawar ->ps_curr_inp->s_lap_out.i4_first_frm_new_res))
3200*c83a76b0SSuyog Pawar {
3201*c83a76b0SSuyog Pawar /* Reset the enc frame rc id whenver change in resolution happens */
3202*c83a76b0SSuyog Pawar i4_enc_frm_id_rc = 0;
3203*c83a76b0SSuyog Pawar }
3204*c83a76b0SSuyog Pawar
3205*c83a76b0SSuyog Pawar /*update end flag for each thread */
3206*c83a76b0SSuyog Pawar i4_me_end_flag = ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]->i4_end_flag;
3207*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id] &&
3208*c83a76b0SSuyog Pawar NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id] &&
3209*c83a76b0SSuyog Pawar NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_L0_ipe_inp_prms[i4_me_frm_id])
3210*c83a76b0SSuyog Pawar {
3211*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_inp_prms;
3212*c83a76b0SSuyog Pawar pre_enc_L0_ipe_encloop_ctxt_t *ps_curr_L0_IPE_inp_prms;
3213*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp;
3214*c83a76b0SSuyog Pawar
3215*c83a76b0SSuyog Pawar /* get the current buffer pointer */
3216*c83a76b0SSuyog Pawar ps_curr_inp_prms = ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id];
3217*c83a76b0SSuyog Pawar ps_curr_L0_IPE_inp_prms =
3218*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_L0_ipe_inp_prms[i4_me_frm_id];
3219*c83a76b0SSuyog Pawar ps_curr_inp = ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]->ps_curr_inp;
3220*c83a76b0SSuyog Pawar if(i4_thrd_id == 0)
3221*c83a76b0SSuyog Pawar {
3222*c83a76b0SSuyog Pawar PROFILE_START(&ps_hle_ctxt->profile_enc_me[ps_enc_ctxt->i4_resolution_id]);
3223*c83a76b0SSuyog Pawar }
3224*c83a76b0SSuyog Pawar
3225*c83a76b0SSuyog Pawar /* -------------------------------------------------- */
3226*c83a76b0SSuyog Pawar /* Motion estimation (enc layer) of entire frame */
3227*c83a76b0SSuyog Pawar /* -------------------------------------------------- */
3228*c83a76b0SSuyog Pawar if((i4_me_end_flag == 0) &&
3229*c83a76b0SSuyog Pawar (1 ==
3230*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]->i4_frm_proc_valid_flag))
3231*c83a76b0SSuyog Pawar {
3232*c83a76b0SSuyog Pawar /* Init i4_is_prev_frame_reference for the next P-frame */
3233*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_master_ctxt =
3234*c83a76b0SSuyog Pawar (me_master_ctxt_t *)ps_enc_ctxt->s_module_ctxt.pv_me_ctxt;
3235*c83a76b0SSuyog Pawar
3236*c83a76b0SSuyog Pawar /* get the current thread ctxt pointer */
3237*c83a76b0SSuyog Pawar me_ctxt_t *ps_ctxt = ps_master_ctxt->aps_me_ctxt[i4_thrd_id];
3238*c83a76b0SSuyog Pawar
3239*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_frm_ctxt = ps_ctxt->aps_me_frm_prms[i4_me_frm_id];
3240*c83a76b0SSuyog Pawar
3241*c83a76b0SSuyog Pawar if(ISLICE != ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]
3242*c83a76b0SSuyog Pawar ->s_slice_hdr.i1_slice_type)
3243*c83a76b0SSuyog Pawar {
3244*c83a76b0SSuyog Pawar ihevce_me_process(
3245*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_me_ctxt,
3246*c83a76b0SSuyog Pawar ps_curr_inp,
3247*c83a76b0SSuyog Pawar ps_curr_inp_prms->ps_ctb_analyse,
3248*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id],
3249*c83a76b0SSuyog Pawar ps_curr_inp_prms->plf_intra_8x8_cost,
3250*c83a76b0SSuyog Pawar ps_curr_L0_IPE_inp_prms->ps_ipe_analyse_ctb,
3251*c83a76b0SSuyog Pawar ps_curr_L0_IPE_inp_prms,
3252*c83a76b0SSuyog Pawar ps_curr_inp_prms->pv_me_lyr_ctxt,
3253*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd,
3254*c83a76b0SSuyog Pawar ((ps_enc_ctxt->s_multi_thrd.i4_num_me_frm_pllel == 1) ? 0 : 1),
3255*c83a76b0SSuyog Pawar i4_thrd_id,
3256*c83a76b0SSuyog Pawar i4_me_frm_id);
3257*c83a76b0SSuyog Pawar }
3258*c83a76b0SSuyog Pawar else
3259*c83a76b0SSuyog Pawar {
3260*c83a76b0SSuyog Pawar /* Init i4_is_prev_frame_reference for the next P-frame */
3261*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_master_ctxt =
3262*c83a76b0SSuyog Pawar (me_master_ctxt_t *)ps_enc_ctxt->s_module_ctxt.pv_me_ctxt;
3263*c83a76b0SSuyog Pawar
3264*c83a76b0SSuyog Pawar /* get the current thread ctxt pointer */
3265*c83a76b0SSuyog Pawar me_ctxt_t *ps_ctxt = ps_master_ctxt->aps_me_ctxt[i4_thrd_id];
3266*c83a76b0SSuyog Pawar
3267*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_frm_ctxt = ps_ctxt->aps_me_frm_prms[i4_me_frm_id];
3268*c83a76b0SSuyog Pawar
3269*c83a76b0SSuyog Pawar multi_thrd_ctxt_t *ps_multi_thrd_ctxt = &ps_enc_ctxt->s_multi_thrd;
3270*c83a76b0SSuyog Pawar
3271*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.i4_num_me_frm_pllel != 1)
3272*c83a76b0SSuyog Pawar {
3273*c83a76b0SSuyog Pawar ps_frm_ctxt->i4_is_prev_frame_reference = 0;
3274*c83a76b0SSuyog Pawar }
3275*c83a76b0SSuyog Pawar else
3276*c83a76b0SSuyog Pawar {
3277*c83a76b0SSuyog Pawar ps_frm_ctxt->i4_is_prev_frame_reference =
3278*c83a76b0SSuyog Pawar ps_multi_thrd_ctxt->aps_cur_inp_me_prms[i4_me_frm_id]
3279*c83a76b0SSuyog Pawar ->ps_curr_inp->s_lap_out.i4_is_ref_pic;
3280*c83a76b0SSuyog Pawar }
3281*c83a76b0SSuyog Pawar }
3282*c83a76b0SSuyog Pawar }
3283*c83a76b0SSuyog Pawar if(i4_thrd_id == 0)
3284*c83a76b0SSuyog Pawar {
3285*c83a76b0SSuyog Pawar PROFILE_STOP(&ps_hle_ctxt->profile_enc_me[ps_enc_ctxt->i4_resolution_id], NULL);
3286*c83a76b0SSuyog Pawar }
3287*c83a76b0SSuyog Pawar }
3288*c83a76b0SSuyog Pawar /************************************/
3289*c83a76b0SSuyog Pawar /****** ENTER CRITICAL SECTION *****/
3290*c83a76b0SSuyog Pawar /************************************/
3291*c83a76b0SSuyog Pawar {
3292*c83a76b0SSuyog Pawar WORD32 result_frame_init;
3293*c83a76b0SSuyog Pawar void *pv_mutex_handle_frame_init;
3294*c83a76b0SSuyog Pawar
3295*c83a76b0SSuyog Pawar /* Create mutex for locking non-reentrant sections */
3296*c83a76b0SSuyog Pawar pv_mutex_handle_frame_init =
3297*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.apv_mutex_handle_me_end[i4_me_frm_id];
3298*c83a76b0SSuyog Pawar
3299*c83a76b0SSuyog Pawar /****** Lock the critical section ******/
3300*c83a76b0SSuyog Pawar if(NULL != pv_mutex_handle_frame_init)
3301*c83a76b0SSuyog Pawar {
3302*c83a76b0SSuyog Pawar result_frame_init = osal_mutex_lock(pv_mutex_handle_frame_init);
3303*c83a76b0SSuyog Pawar
3304*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result_frame_init)
3305*c83a76b0SSuyog Pawar return 0;
3306*c83a76b0SSuyog Pawar }
3307*c83a76b0SSuyog Pawar }
3308*c83a76b0SSuyog Pawar
3309*c83a76b0SSuyog Pawar if(0 == ps_enc_ctxt->s_multi_thrd.ai4_me_enc_buff_prod_flag[i4_me_frm_id])
3310*c83a76b0SSuyog Pawar {
3311*c83a76b0SSuyog Pawar /* ------- set buffer produced from me_enc que ------------ */
3312*c83a76b0SSuyog Pawar ihevce_q_set_buff_prod(
3313*c83a76b0SSuyog Pawar ps_enc_ctxt,
3314*c83a76b0SSuyog Pawar IHEVCE_ME_ENC_RDOPT_Q,
3315*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ai4_me_out_buf_id[i4_me_frm_id]);
3316*c83a76b0SSuyog Pawar
3317*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ai4_me_enc_buff_prod_flag[i4_me_frm_id] = 1;
3318*c83a76b0SSuyog Pawar }
3319*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id] &&
3320*c83a76b0SSuyog Pawar NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id])
3321*c83a76b0SSuyog Pawar {
3322*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp;
3323*c83a76b0SSuyog Pawar
3324*c83a76b0SSuyog Pawar WORD32 first_field = 1;
3325*c83a76b0SSuyog Pawar
3326*c83a76b0SSuyog Pawar /* Increment the counter to keep track of no of threads exiting the current mutex*/
3327*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.me_num_thrds_exited[i4_me_frm_id]++;
3328*c83a76b0SSuyog Pawar
3329*c83a76b0SSuyog Pawar ps_curr_inp = ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]->ps_curr_inp;
3330*c83a76b0SSuyog Pawar /* Last slave thread will reset the master done frame init flag and set the prev
3331*c83a76b0SSuyog Pawar * frame me done flag for curr frame
3332*c83a76b0SSuyog Pawar */
3333*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.me_num_thrds_exited[i4_me_frm_id] ==
3334*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds)
3335*c83a76b0SSuyog Pawar {
3336*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.me_num_thrds_exited[i4_me_frm_id] = 0;
3337*c83a76b0SSuyog Pawar
3338*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ai4_me_master_done_flag[i4_me_frm_id] = 0;
3339*c83a76b0SSuyog Pawar
3340*c83a76b0SSuyog Pawar /* Update Dyn. Vert. Search prms for P Pic. */
3341*c83a76b0SSuyog Pawar if(IV_P_FRAME == ps_curr_inp->s_lap_out.i4_pic_type)
3342*c83a76b0SSuyog Pawar {
3343*c83a76b0SSuyog Pawar WORD32 i4_idx_dvsr_p = ps_enc_ctxt->s_multi_thrd.i4_idx_dvsr_p;
3344*c83a76b0SSuyog Pawar /* Sanity Check */
3345*c83a76b0SSuyog Pawar ASSERT(ps_curr_inp->s_lap_out.i4_pic_type < IV_IP_FRAME);
3346*c83a76b0SSuyog Pawar
3347*c83a76b0SSuyog Pawar /* Frame END processing for Dynamic Vertival Search */
3348*c83a76b0SSuyog Pawar ihevce_l0_me_frame_end(
3349*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_me_ctxt,
3350*c83a76b0SSuyog Pawar i4_idx_dvsr_p,
3351*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_display_num,
3352*c83a76b0SSuyog Pawar i4_me_frm_id);
3353*c83a76b0SSuyog Pawar
3354*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_idx_dvsr_p++;
3355*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.i4_idx_dvsr_p == NUM_SG_INTERLEAVED)
3356*c83a76b0SSuyog Pawar {
3357*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_idx_dvsr_p = 0;
3358*c83a76b0SSuyog Pawar }
3359*c83a76b0SSuyog Pawar }
3360*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id]
3361*c83a76b0SSuyog Pawar ->i4_frm_proc_valid_flag)
3362*c83a76b0SSuyog Pawar {
3363*c83a76b0SSuyog Pawar /* Init i4_is_prev_frame_reference for the next P-frame */
3364*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_master_ctxt =
3365*c83a76b0SSuyog Pawar (me_master_ctxt_t *)ps_enc_ctxt->s_module_ctxt.pv_me_ctxt;
3366*c83a76b0SSuyog Pawar
3367*c83a76b0SSuyog Pawar /* get the current thread ctxt pointer */
3368*c83a76b0SSuyog Pawar me_ctxt_t *ps_ctxt = ps_master_ctxt->aps_me_ctxt[i4_thrd_id];
3369*c83a76b0SSuyog Pawar
3370*c83a76b0SSuyog Pawar me_frm_ctxt_t *ps_frm_ctxt = ps_ctxt->aps_me_frm_prms[i4_me_frm_id];
3371*c83a76b0SSuyog Pawar
3372*c83a76b0SSuyog Pawar ps_frm_ctxt->ps_curr_descr->aps_layers[0]->i4_non_ref_free = 1;
3373*c83a76b0SSuyog Pawar }
3374*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_me_prms[i4_me_frm_id] = NULL;
3375*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_out_me_prms[i4_me_frm_id] = NULL;
3376*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_L0_ipe_inp_prms[i4_me_frm_id] = NULL;
3377*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ai4_me_enc_buff_prod_flag[i4_me_frm_id] = 0;
3378*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ai4_me_master_done_flag[i4_me_frm_id] = 0;
3379*c83a76b0SSuyog Pawar
3380*c83a76b0SSuyog Pawar /* Set me processing done for curr frame in the dependency manager */
3381*c83a76b0SSuyog Pawar ihevce_dmgr_update_frm_frm_sync(pv_dep_mngr_prev_frame_me_done);
3382*c83a76b0SSuyog Pawar }
3383*c83a76b0SSuyog Pawar }
3384*c83a76b0SSuyog Pawar /************************************/
3385*c83a76b0SSuyog Pawar /****** EXIT CRITICAL SECTION ******/
3386*c83a76b0SSuyog Pawar /************************************/
3387*c83a76b0SSuyog Pawar
3388*c83a76b0SSuyog Pawar {
3389*c83a76b0SSuyog Pawar void *pv_mutex_handle_frame_init;
3390*c83a76b0SSuyog Pawar
3391*c83a76b0SSuyog Pawar /* Create mutex for locking non-reentrant sections */
3392*c83a76b0SSuyog Pawar pv_mutex_handle_frame_init =
3393*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.apv_mutex_handle_me_end[i4_me_frm_id];
3394*c83a76b0SSuyog Pawar /****** Unlock the critical section ******/
3395*c83a76b0SSuyog Pawar if(NULL != pv_mutex_handle_frame_init)
3396*c83a76b0SSuyog Pawar {
3397*c83a76b0SSuyog Pawar result = osal_mutex_unlock(pv_mutex_handle_frame_init);
3398*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result)
3399*c83a76b0SSuyog Pawar return 0;
3400*c83a76b0SSuyog Pawar }
3401*c83a76b0SSuyog Pawar }
3402*c83a76b0SSuyog Pawar /* -------------------------------------------- */
3403*c83a76b0SSuyog Pawar /* Encode Loop of entire frame */
3404*c83a76b0SSuyog Pawar /* -------------------------------------------- */
3405*c83a76b0SSuyog Pawar ASSERT(ps_enc_ctxt->s_multi_thrd.i4_num_enc_loop_frm_pllel <= MAX_NUM_ENC_LOOP_PARALLEL);
3406*c83a76b0SSuyog Pawar
3407*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_multi_thrd.i4_num_enc_loop_frm_pllel)
3408*c83a76b0SSuyog Pawar {
3409*c83a76b0SSuyog Pawar pv_dep_mngr_prev_frame_done = ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_done[0];
3410*c83a76b0SSuyog Pawar }
3411*c83a76b0SSuyog Pawar else
3412*c83a76b0SSuyog Pawar {
3413*c83a76b0SSuyog Pawar pv_dep_mngr_prev_frame_done =
3414*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_done[i4_enc_frm_id];
3415*c83a76b0SSuyog Pawar }
3416*c83a76b0SSuyog Pawar /* Wait till the prev frame enc loop is completed*/
3417*c83a76b0SSuyog Pawar {
3418*c83a76b0SSuyog Pawar ihevce_dmgr_chk_frm_frm_sync(pv_dep_mngr_prev_frame_done, ps_thrd_ctxt->i4_thrd_id);
3419*c83a76b0SSuyog Pawar }
3420*c83a76b0SSuyog Pawar
3421*c83a76b0SSuyog Pawar /************************************/
3422*c83a76b0SSuyog Pawar /****** ENTER CRITICAL SECTION ******/
3423*c83a76b0SSuyog Pawar /************************************/
3424*c83a76b0SSuyog Pawar {
3425*c83a76b0SSuyog Pawar WORD32 result_frame_init;
3426*c83a76b0SSuyog Pawar void *pv_mutex_handle_frame_init;
3427*c83a76b0SSuyog Pawar
3428*c83a76b0SSuyog Pawar /* Create mutex for locking non-reentrant sections */
3429*c83a76b0SSuyog Pawar pv_mutex_handle_frame_init =
3430*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.apv_mutex_handle_frame_init[i4_enc_frm_id];
3431*c83a76b0SSuyog Pawar
3432*c83a76b0SSuyog Pawar /****** Lock the critical section ******/
3433*c83a76b0SSuyog Pawar if(NULL != pv_mutex_handle_frame_init)
3434*c83a76b0SSuyog Pawar {
3435*c83a76b0SSuyog Pawar result_frame_init = osal_mutex_lock(pv_mutex_handle_frame_init);
3436*c83a76b0SSuyog Pawar
3437*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result_frame_init)
3438*c83a76b0SSuyog Pawar return 0;
3439*c83a76b0SSuyog Pawar }
3440*c83a76b0SSuyog Pawar }
3441*c83a76b0SSuyog Pawar
3442*c83a76b0SSuyog Pawar {
3443*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp = NULL;
3444*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_inp_from_me = NULL;
3445*c83a76b0SSuyog Pawar me_enc_rdopt_ctxt_t *ps_curr_inp_enc = NULL;
3446*c83a76b0SSuyog Pawar pre_enc_L0_ipe_encloop_ctxt_t *ps_curr_L0_IPE_inp_prms = NULL;
3447*c83a76b0SSuyog Pawar recon_pic_buf_t *(*aps_ref_list)[HEVCE_MAX_REF_PICS * 2];
3448*c83a76b0SSuyog Pawar WORD32 ai4_cur_qp[IHEVCE_MAX_NUM_BITRATES] = { 0 };
3449*c83a76b0SSuyog Pawar WORD32 i4_field_pic = ps_enc_ctxt->s_runtime_src_prms.i4_field_pic;
3450*c83a76b0SSuyog Pawar WORD32 first_field = 1;
3451*c83a76b0SSuyog Pawar WORD32 result_frame_init;
3452*c83a76b0SSuyog Pawar void *pv_mutex_handle_frame_init;
3453*c83a76b0SSuyog Pawar
3454*c83a76b0SSuyog Pawar /* Create mutex for locking non-reentrant sections */
3455*c83a76b0SSuyog Pawar pv_mutex_handle_frame_init =
3456*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.apv_mutex_handle_frame_init[i4_enc_frm_id];
3457*c83a76b0SSuyog Pawar
3458*c83a76b0SSuyog Pawar //aquire and initialize -> output and recon buffers
3459*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.enc_master_done_frame_init[i4_enc_frm_id] == 0)
3460*c83a76b0SSuyog Pawar {
3461*c83a76b0SSuyog Pawar WORD32
3462*c83a76b0SSuyog Pawar i4_bitrate_ctr; //bit-rate instance counter (for loop variable) [0->reference bit-rate, 1,2->auxiliarty bit-rates]
3463*c83a76b0SSuyog Pawar /* ------- get the input prms buffer from me que ------------ */
3464*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id] =
3465*c83a76b0SSuyog Pawar (me_enc_rdopt_ctxt_t *)ihevce_q_get_filled_buff(
3466*c83a76b0SSuyog Pawar ps_enc_ctxt,
3467*c83a76b0SSuyog Pawar IHEVCE_ME_ENC_RDOPT_Q,
3468*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.i4_enc_in_buf_id[i4_enc_frm_id],
3469*c83a76b0SSuyog Pawar BUFF_QUE_BLOCKING_MODE);
3470*c83a76b0SSuyog Pawar i4_enc_end_flag =
3471*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]->i4_end_flag;
3472*c83a76b0SSuyog Pawar
3473*c83a76b0SSuyog Pawar ASSERT(ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id] != NULL);
3474*c83a76b0SSuyog Pawar
3475*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id] != NULL)
3476*c83a76b0SSuyog Pawar {
3477*c83a76b0SSuyog Pawar ps_curr_inp =
3478*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]->ps_curr_inp;
3479*c83a76b0SSuyog Pawar ps_curr_inp_from_me =
3480*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3481*c83a76b0SSuyog Pawar ->ps_curr_inp_from_me_prms;
3482*c83a76b0SSuyog Pawar ps_curr_inp_enc = ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id];
3483*c83a76b0SSuyog Pawar ps_curr_L0_IPE_inp_prms =
3484*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3485*c83a76b0SSuyog Pawar ->ps_curr_inp_from_l0_ipe_prms;
3486*c83a76b0SSuyog Pawar
3487*c83a76b0SSuyog Pawar for(i4_bitrate_ctr = 0; i4_bitrate_ctr < i4_num_bitrates; i4_bitrate_ctr++)
3488*c83a76b0SSuyog Pawar {
3489*c83a76b0SSuyog Pawar iv_enc_recon_data_buffs_t
3490*c83a76b0SSuyog Pawar *ps_recon_out[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES] = {
3491*c83a76b0SSuyog Pawar { NULL }
3492*c83a76b0SSuyog Pawar };
3493*c83a76b0SSuyog Pawar frm_proc_ent_cod_ctxt_t *ps_curr_out[MAX_NUM_ENC_LOOP_PARALLEL]
3494*c83a76b0SSuyog Pawar [IHEVCE_MAX_NUM_BITRATES] = { { NULL } };
3495*c83a76b0SSuyog Pawar
3496*c83a76b0SSuyog Pawar /* ------- get free output buffer from Frame buffer que ---------- */
3497*c83a76b0SSuyog Pawar /* There is a separate queue for each bit-rate instnace. The output
3498*c83a76b0SSuyog Pawar buffer is acquired from the corresponding queue based on the
3499*c83a76b0SSuyog Pawar bitrate instnace */
3500*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr] =
3501*c83a76b0SSuyog Pawar (frm_proc_ent_cod_ctxt_t *)ihevce_q_get_free_buff(
3502*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
3503*c83a76b0SSuyog Pawar IHEVCE_FRM_PRS_ENT_COD_Q +
3504*c83a76b0SSuyog Pawar i4_bitrate_ctr, /*decides the buffer queue */
3505*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.out_buf_id[i4_enc_frm_id][i4_bitrate_ctr],
3506*c83a76b0SSuyog Pawar BUFF_QUE_BLOCKING_MODE);
3507*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.is_out_buf_freed[i4_enc_frm_id][i4_bitrate_ctr] =
3508*c83a76b0SSuyog Pawar 0;
3509*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
3510*c83a76b0SSuyog Pawar .ps_curr_out_enc_grp[i4_enc_frm_id][i4_bitrate_ctr] =
3511*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr];
3512*c83a76b0SSuyog Pawar //ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_enc_order_num = ps_curr_inp->s_lap_out.i4_enc_order_num;
3513*c83a76b0SSuyog Pawar /*registered User Data Call*/
3514*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
3515*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_sei_payload_enable_flag)
3516*c83a76b0SSuyog Pawar {
3517*c83a76b0SSuyog Pawar ihevce_fill_sei_payload(
3518*c83a76b0SSuyog Pawar ps_enc_ctxt,
3519*c83a76b0SSuyog Pawar ps_curr_inp,
3520*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]);
3521*c83a76b0SSuyog Pawar }
3522*c83a76b0SSuyog Pawar
3523*c83a76b0SSuyog Pawar #endif
3524*c83a76b0SSuyog Pawar /*derive end flag and input valid flag in output buffer */
3525*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id])
3526*c83a76b0SSuyog Pawar {
3527*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_end_flag =
3528*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3529*c83a76b0SSuyog Pawar ->i4_end_flag;
3530*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_frm_proc_valid_flag =
3531*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3532*c83a76b0SSuyog Pawar ->i4_frm_proc_valid_flag;
3533*c83a76b0SSuyog Pawar
3534*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_out_flush_flag =
3535*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3536*c83a76b0SSuyog Pawar ->ps_curr_inp->s_lap_out.i4_out_flush_flag;
3537*c83a76b0SSuyog Pawar }
3538*c83a76b0SSuyog Pawar
3539*c83a76b0SSuyog Pawar /*derive other parameters in output buffer */
3540*c83a76b0SSuyog Pawar if(NULL != ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr] &&
3541*c83a76b0SSuyog Pawar (NULL != ps_curr_inp_from_me) &&
3542*c83a76b0SSuyog Pawar (1 == ps_curr_inp->s_input_buf.i4_inp_frm_data_valid_flag) &&
3543*c83a76b0SSuyog Pawar (i4_enc_end_flag == 0))
3544*c83a76b0SSuyog Pawar {
3545*c83a76b0SSuyog Pawar /* copy the time stamps from inp to entropy inp */
3546*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_inp_timestamp_low =
3547*c83a76b0SSuyog Pawar ps_curr_inp_from_me->i4_inp_timestamp_low;
3548*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_inp_timestamp_high =
3549*c83a76b0SSuyog Pawar ps_curr_inp_from_me->i4_inp_timestamp_high;
3550*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->pv_app_frm_ctxt =
3551*c83a76b0SSuyog Pawar ps_curr_inp_from_me->pv_app_frm_ctxt;
3552*c83a76b0SSuyog Pawar
3553*c83a76b0SSuyog Pawar /*copy slice header params from temp structure to output buffer */
3554*c83a76b0SSuyog Pawar memcpy(
3555*c83a76b0SSuyog Pawar &ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->s_slice_hdr,
3556*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3557*c83a76b0SSuyog Pawar ->s_slice_hdr,
3558*c83a76b0SSuyog Pawar sizeof(slice_header_t));
3559*c83a76b0SSuyog Pawar
3560*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]
3561*c83a76b0SSuyog Pawar ->s_slice_hdr.pu4_entry_point_offset =
3562*c83a76b0SSuyog Pawar &ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]
3563*c83a76b0SSuyog Pawar ->ai4_entry_point_offset[0];
3564*c83a76b0SSuyog Pawar
3565*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_slice_nal_type =
3566*c83a76b0SSuyog Pawar ps_curr_inp_from_me->i4_slice_nal_type;
3567*c83a76b0SSuyog Pawar
3568*c83a76b0SSuyog Pawar /* populate sps, vps and pps pointers for the entropy input params */
3569*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->ps_pps =
3570*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_pps[i4_bitrate_ctr];
3571*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->ps_sps =
3572*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_sps[i4_bitrate_ctr];
3573*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->ps_vps =
3574*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_vps[i4_bitrate_ctr];
3575*c83a76b0SSuyog Pawar
3576*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
3577*c83a76b0SSuyog Pawar /* SEI header will be populated in pre-enocde stage */
3578*c83a76b0SSuyog Pawar memcpy(
3579*c83a76b0SSuyog Pawar &ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->s_sei,
3580*c83a76b0SSuyog Pawar &ps_curr_inp_from_me->s_sei,
3581*c83a76b0SSuyog Pawar sizeof(sei_params_t));
3582*c83a76b0SSuyog Pawar
3583*c83a76b0SSuyog Pawar #endif
3584*c83a76b0SSuyog Pawar /*AUD and EOS presnt flags are populated*/
3585*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->i1_aud_present_flag =
3586*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_aud_enable_flags;
3587*c83a76b0SSuyog Pawar
3588*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->i1_eos_present_flag =
3589*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_eos_enable_flags;
3590*c83a76b0SSuyog Pawar
3591*c83a76b0SSuyog Pawar /* Information required for SEI Picture timing info */
3592*c83a76b0SSuyog Pawar {
3593*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_display_num =
3594*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_display_num;
3595*c83a76b0SSuyog Pawar }
3596*c83a76b0SSuyog Pawar
3597*c83a76b0SSuyog Pawar /* The Qp populated in Pre enc stage needs to overwritten with Qp
3598*c83a76b0SSuyog Pawar queried from rate control*/
3599*c83a76b0SSuyog Pawar ps_curr_out[i4_enc_frm_id][i4_bitrate_ctr]
3600*c83a76b0SSuyog Pawar ->s_slice_hdr.i1_slice_qp_delta =
3601*c83a76b0SSuyog Pawar (WORD8)ps_curr_inp_from_me->i4_curr_frm_qp -
3602*c83a76b0SSuyog Pawar ps_enc_ctxt->as_pps[i4_bitrate_ctr].i1_pic_init_qp;
3603*c83a76b0SSuyog Pawar }
3604*c83a76b0SSuyog Pawar
3605*c83a76b0SSuyog Pawar /* ------- get a filled descriptor from output Que ------------ */
3606*c83a76b0SSuyog Pawar if(/*(1 == ps_curr_inp->s_input_buf.i4_inp_frm_data_valid_flag) &&*/
3607*c83a76b0SSuyog Pawar (ps_enc_ctxt->ps_stat_prms->i4_save_recon != 0))
3608*c83a76b0SSuyog Pawar {
3609*c83a76b0SSuyog Pawar /*swaping of buf_id for 0th and reference bitrate location, as encoder
3610*c83a76b0SSuyog Pawar assumes always 0th loc for reference bitrate and app must receive in
3611*c83a76b0SSuyog Pawar the configured order*/
3612*c83a76b0SSuyog Pawar WORD32 i4_recon_buf_id = i4_bitrate_ctr;
3613*c83a76b0SSuyog Pawar if(i4_bitrate_ctr == 0)
3614*c83a76b0SSuyog Pawar {
3615*c83a76b0SSuyog Pawar i4_recon_buf_id = ps_enc_ctxt->i4_ref_mbr_id;
3616*c83a76b0SSuyog Pawar }
3617*c83a76b0SSuyog Pawar else if(i4_bitrate_ctr == ps_enc_ctxt->i4_ref_mbr_id)
3618*c83a76b0SSuyog Pawar {
3619*c83a76b0SSuyog Pawar i4_recon_buf_id = 0;
3620*c83a76b0SSuyog Pawar }
3621*c83a76b0SSuyog Pawar
3622*c83a76b0SSuyog Pawar /* ------- get free Recon buffer from Frame buffer que ---------- */
3623*c83a76b0SSuyog Pawar /* There is a separate queue for each bit-rate instnace. The recon
3624*c83a76b0SSuyog Pawar buffer is acquired from the corresponding queue based on the
3625*c83a76b0SSuyog Pawar bitrate instnace */
3626*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr] =
3627*c83a76b0SSuyog Pawar (iv_enc_recon_data_buffs_t *)ihevce_q_get_filled_buff(
3628*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
3629*c83a76b0SSuyog Pawar IHEVCE_RECON_DATA_Q +
3630*c83a76b0SSuyog Pawar i4_recon_buf_id, /*decides the buffer queue */
3631*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd
3632*c83a76b0SSuyog Pawar .recon_buf_id[i4_enc_frm_id][i4_bitrate_ctr],
3633*c83a76b0SSuyog Pawar BUFF_QUE_BLOCKING_MODE);
3634*c83a76b0SSuyog Pawar
3635*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
3636*c83a76b0SSuyog Pawar .is_recon_dumped[i4_enc_frm_id][i4_bitrate_ctr] = 0;
3637*c83a76b0SSuyog Pawar ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr] =
3638*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
3639*c83a76b0SSuyog Pawar .ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr];
3640*c83a76b0SSuyog Pawar
3641*c83a76b0SSuyog Pawar ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_end_flag =
3642*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3643*c83a76b0SSuyog Pawar ->i4_end_flag;
3644*c83a76b0SSuyog Pawar }
3645*c83a76b0SSuyog Pawar
3646*c83a76b0SSuyog Pawar } //bitrate ctr
3647*c83a76b0SSuyog Pawar }
3648*c83a76b0SSuyog Pawar }
3649*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id] != NULL)
3650*c83a76b0SSuyog Pawar {
3651*c83a76b0SSuyog Pawar ps_curr_inp =
3652*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]->ps_curr_inp;
3653*c83a76b0SSuyog Pawar ps_curr_inp_from_me = ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3654*c83a76b0SSuyog Pawar ->ps_curr_inp_from_me_prms;
3655*c83a76b0SSuyog Pawar ps_curr_inp_enc = ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id];
3656*c83a76b0SSuyog Pawar ps_curr_L0_IPE_inp_prms =
3657*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3658*c83a76b0SSuyog Pawar ->ps_curr_inp_from_l0_ipe_prms;
3659*c83a76b0SSuyog Pawar }
3660*c83a76b0SSuyog Pawar if((NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]) &&
3661*c83a76b0SSuyog Pawar ((1 == ps_curr_inp_enc->i4_frm_proc_valid_flag) &&
3662*c83a76b0SSuyog Pawar (ps_enc_ctxt->s_multi_thrd.enc_master_done_frame_init[i4_enc_frm_id] == 0)))
3663*c83a76b0SSuyog Pawar {
3664*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_bitrates; i++)
3665*c83a76b0SSuyog Pawar {
3666*c83a76b0SSuyog Pawar aps_ref_list = ps_curr_inp_enc->aps_ref_list[i];
3667*c83a76b0SSuyog Pawar /* acquire mutex lock for rate control calls */
3668*c83a76b0SSuyog Pawar osal_mutex_lock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
3669*c83a76b0SSuyog Pawar
3670*c83a76b0SSuyog Pawar /*utlize the satd data from pre enc stage to get more accurate estimate SAD for I pic*/
3671*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_pic_type == IV_I_FRAME ||
3672*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_pic_type == IV_IDR_FRAME)
3673*c83a76b0SSuyog Pawar {
3674*c83a76b0SSuyog Pawar ihevce_rc_update_cur_frm_intra_satd(
3675*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i],
3676*c83a76b0SSuyog Pawar ps_curr_inp_from_me->i8_frame_acc_satd_cost,
3677*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_active_enc_frame_id);
3678*c83a76b0SSuyog Pawar }
3679*c83a76b0SSuyog Pawar
3680*c83a76b0SSuyog Pawar /*pels assuming satd/act is obtained for entire frame*/
3681*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i4_num_pels_in_frame_considered =
3682*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht *
3683*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd;
3684*c83a76b0SSuyog Pawar
3685*c83a76b0SSuyog Pawar /*Service pending request to change average bitrate if any*/
3686*c83a76b0SSuyog Pawar {
3687*c83a76b0SSuyog Pawar LWORD64 i8_new_bitrate =
3688*c83a76b0SSuyog Pawar ihevce_rc_get_new_bitrate(ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0]);
3689*c83a76b0SSuyog Pawar LWORD64 i8_new_peak_bitrate = ihevce_rc_get_new_peak_bitrate(
3690*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0]);
3691*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3692*c83a76b0SSuyog Pawar ->i8_buf_level_bitrate_change = -1;
3693*c83a76b0SSuyog Pawar if((i8_new_bitrate != -1) &&
3694*c83a76b0SSuyog Pawar (i8_new_peak_bitrate != -1)) /*-1 indicates no pending request*/
3695*c83a76b0SSuyog Pawar {
3696*c83a76b0SSuyog Pawar LWORD64 buffer_level = ihevce_rc_change_avg_bitrate(
3697*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0]);
3698*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3699*c83a76b0SSuyog Pawar ->i8_buf_level_bitrate_change = buffer_level;
3700*c83a76b0SSuyog Pawar }
3701*c83a76b0SSuyog Pawar }
3702*c83a76b0SSuyog Pawar
3703*c83a76b0SSuyog Pawar if((1 == ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_mres_single_out) &&
3704*c83a76b0SSuyog Pawar (1 == ps_curr_inp->s_lap_out.i4_first_frm_new_res))
3705*c83a76b0SSuyog Pawar {
3706*c83a76b0SSuyog Pawar /* Whenver change in resolution happens change the buffer level */
3707*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3708*c83a76b0SSuyog Pawar ->i8_buf_level_bitrate_change = 0;
3709*c83a76b0SSuyog Pawar }
3710*c83a76b0SSuyog Pawar #if 1 //KISH ELP
3711*c83a76b0SSuyog Pawar {
3712*c83a76b0SSuyog Pawar rc_bits_sad_t as_rc_frame_stat[IHEVCE_MAX_NUM_BITRATES];
3713*c83a76b0SSuyog Pawar
3714*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ai4_rc_query[i] ==
3715*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc) //KISH
3716*c83a76b0SSuyog Pawar {
3717*c83a76b0SSuyog Pawar WORD32 out_buf_id[IHEVCE_MAX_NUM_BITRATES];
3718*c83a76b0SSuyog Pawar WORD32 i4_pic_type;
3719*c83a76b0SSuyog Pawar WORD32 cur_qp[IHEVCE_MAX_NUM_BITRATES];
3720*c83a76b0SSuyog Pawar ihevce_lap_output_params_t s_lap_out;
3721*c83a76b0SSuyog Pawar
3722*c83a76b0SSuyog Pawar rc_lap_out_params_t s_rc_lap_out;
3723*c83a76b0SSuyog Pawar WORD32 i4_suppress_bpic_update;
3724*c83a76b0SSuyog Pawar
3725*c83a76b0SSuyog Pawar ihevce_rc_store_retrive_update_info(
3726*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i],
3727*c83a76b0SSuyog Pawar &as_rc_frame_stat[i],
3728*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_active_enc_frame_id,
3729*c83a76b0SSuyog Pawar i,
3730*c83a76b0SSuyog Pawar 2,
3731*c83a76b0SSuyog Pawar &out_buf_id[i],
3732*c83a76b0SSuyog Pawar &i4_pic_type,
3733*c83a76b0SSuyog Pawar &cur_qp[i],
3734*c83a76b0SSuyog Pawar (void *)&s_lap_out,
3735*c83a76b0SSuyog Pawar (void *)&s_rc_lap_out);
3736*c83a76b0SSuyog Pawar
3737*c83a76b0SSuyog Pawar i4_suppress_bpic_update =
3738*c83a76b0SSuyog Pawar (WORD32)(s_rc_lap_out.i4_rc_temporal_lyr_id > 1);
3739*c83a76b0SSuyog Pawar /*RC inter face update before update to happen only for ELP disabled */
3740*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc)
3741*c83a76b0SSuyog Pawar {
3742*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
3743*c83a76b0SSuyog Pawar ihevce_rc_interface_update(
3744*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i],
3745*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)s_rc_lap_out.i4_rc_pic_type,
3746*c83a76b0SSuyog Pawar &s_rc_lap_out,
3747*c83a76b0SSuyog Pawar cur_qp[i],
3748*c83a76b0SSuyog Pawar i4_enc_frm_id_rc);
3749*c83a76b0SSuyog Pawar }
3750*c83a76b0SSuyog Pawar
3751*c83a76b0SSuyog Pawar ihevce_rc_update_pic_info(
3752*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i],
3753*c83a76b0SSuyog Pawar (as_rc_frame_stat[i].u4_total_texture_bits +
3754*c83a76b0SSuyog Pawar as_rc_frame_stat[i].u4_total_header_bits), //pass total bits
3755*c83a76b0SSuyog Pawar as_rc_frame_stat[i].u4_total_header_bits,
3756*c83a76b0SSuyog Pawar as_rc_frame_stat[i].u4_total_sad,
3757*c83a76b0SSuyog Pawar as_rc_frame_stat[i].u4_total_intra_sad,
3758*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)i4_pic_type,
3759*c83a76b0SSuyog Pawar cur_qp[i],
3760*c83a76b0SSuyog Pawar i4_suppress_bpic_update,
3761*c83a76b0SSuyog Pawar as_rc_frame_stat[i].i4_qp_normalized_8x8_cu_sum,
3762*c83a76b0SSuyog Pawar as_rc_frame_stat[i].i4_8x8_cu_sum,
3763*c83a76b0SSuyog Pawar as_rc_frame_stat[i].i8_sad_by_qscale,
3764*c83a76b0SSuyog Pawar &s_lap_out,
3765*c83a76b0SSuyog Pawar &s_rc_lap_out,
3766*c83a76b0SSuyog Pawar out_buf_id[i],
3767*c83a76b0SSuyog Pawar as_rc_frame_stat[i].u4_open_loop_intra_sad,
3768*c83a76b0SSuyog Pawar as_rc_frame_stat[i].i8_total_ssd_frame,
3769*c83a76b0SSuyog Pawar ps_enc_ctxt
3770*c83a76b0SSuyog Pawar ->i4_active_enc_frame_id); //ps_curr_out->i4_inp_timestamp_low)
3771*c83a76b0SSuyog Pawar
3772*c83a76b0SSuyog Pawar //DBG_PRINTF("\n Sad = %d \t total bits = %d ", s_rc_frame_stat.u4_total_sad, (s_rc_frame_stat.u4_total_texture_bits + s_rc_frame_stat.u4_total_header_bits));
3773*c83a76b0SSuyog Pawar /*populate qp for pre enc*/
3774*c83a76b0SSuyog Pawar
3775*c83a76b0SSuyog Pawar //g_count--;
3776*c83a76b0SSuyog Pawar ps_enc_ctxt->ai4_rc_query[i]--;
3777*c83a76b0SSuyog Pawar
3778*c83a76b0SSuyog Pawar if(i == (i4_num_bitrates - 1))
3779*c83a76b0SSuyog Pawar {
3780*c83a76b0SSuyog Pawar ihevce_rc_cal_pre_enc_qp(
3781*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0]);
3782*c83a76b0SSuyog Pawar
3783*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_active_enc_frame_id++;
3784*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_active_enc_frame_id =
3785*c83a76b0SSuyog Pawar (ps_enc_ctxt->i4_active_enc_frame_id %
3786*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc);
3787*c83a76b0SSuyog Pawar }
3788*c83a76b0SSuyog Pawar }
3789*c83a76b0SSuyog Pawar }
3790*c83a76b0SSuyog Pawar #endif
3791*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ai4_rc_query[i] < ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc)
3792*c83a76b0SSuyog Pawar {
3793*c83a76b0SSuyog Pawar /*HEVC_RC query rate control for qp*/
3794*c83a76b0SSuyog Pawar ai4_cur_qp[i] = ihevce_rc_get_pic_quant(
3795*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i],
3796*c83a76b0SSuyog Pawar &ps_curr_inp->s_rc_lap_out,
3797*c83a76b0SSuyog Pawar ENC_GET_QP,
3798*c83a76b0SSuyog Pawar i4_enc_frm_id_rc,
3799*c83a76b0SSuyog Pawar 0,
3800*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.ai4_frame_bits_estimated[i]);
3801*c83a76b0SSuyog Pawar
3802*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i4_orig_rc_qp = ai4_cur_qp[i];
3803*c83a76b0SSuyog Pawar
3804*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_in_frame_rc_enabled = 0;
3805*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3806*c83a76b0SSuyog Pawar ->i4_sub_pic_level_rc = 0;
3807*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3808*c83a76b0SSuyog Pawar ->ai4_frame_bits_estimated =
3809*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.ai4_frame_bits_estimated[i];
3810*c83a76b0SSuyog Pawar
3811*c83a76b0SSuyog Pawar {
3812*c83a76b0SSuyog Pawar ps_enc_ctxt->ai4_rc_query[i]++;
3813*c83a76b0SSuyog Pawar }
3814*c83a76b0SSuyog Pawar }
3815*c83a76b0SSuyog Pawar
3816*c83a76b0SSuyog Pawar /* SGI & Enc Loop Parallelism related changes*/
3817*c83a76b0SSuyog Pawar ihevce_rc_interface_update(
3818*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i],
3819*c83a76b0SSuyog Pawar (IV_PICTURE_CODING_TYPE_T)ps_curr_inp->s_lap_out.i4_pic_type,
3820*c83a76b0SSuyog Pawar &ps_curr_inp->s_rc_lap_out,
3821*c83a76b0SSuyog Pawar ai4_cur_qp[i],
3822*c83a76b0SSuyog Pawar i4_enc_frm_id_rc);
3823*c83a76b0SSuyog Pawar
3824*c83a76b0SSuyog Pawar //DBG_PRINTF("HEVC_QP = %d MPEG2_QP = %d\n",cur_qp,gu1_HEVCToMpeg2Quant[cur_qp]);//i_model_print
3825*c83a76b0SSuyog Pawar
3826*c83a76b0SSuyog Pawar /* release mutex lock after rate control calls */
3827*c83a76b0SSuyog Pawar osal_mutex_unlock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
3828*c83a76b0SSuyog Pawar
3829*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3830*c83a76b0SSuyog Pawar ->s_slice_hdr.i1_slice_qp_delta =
3831*c83a76b0SSuyog Pawar (WORD8)ai4_cur_qp[i] - ps_enc_ctxt->as_pps[i].i1_pic_init_qp;
3832*c83a76b0SSuyog Pawar
3833*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.cur_qp[i4_enc_frm_id][i] = ai4_cur_qp[i];
3834*c83a76b0SSuyog Pawar
3835*c83a76b0SSuyog Pawar /* For interlace pictures, first_field depends on topfield_first and bottom field */
3836*c83a76b0SSuyog Pawar if(i4_field_pic)
3837*c83a76b0SSuyog Pawar {
3838*c83a76b0SSuyog Pawar first_field =
3839*c83a76b0SSuyog Pawar (ps_curr_inp->s_input_buf.i4_topfield_first ^
3840*c83a76b0SSuyog Pawar ps_curr_inp->s_input_buf.i4_bottom_field);
3841*c83a76b0SSuyog Pawar }
3842*c83a76b0SSuyog Pawar /* get frame level lambda params */
3843*c83a76b0SSuyog Pawar ihevce_get_frame_lambda_prms(
3844*c83a76b0SSuyog Pawar ps_enc_ctxt,
3845*c83a76b0SSuyog Pawar ps_curr_inp_from_me,
3846*c83a76b0SSuyog Pawar ai4_cur_qp[i],
3847*c83a76b0SSuyog Pawar first_field,
3848*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_is_ref_pic,
3849*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_temporal_lyr_id,
3850*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.f_i_pic_lamda_modifier,
3851*c83a76b0SSuyog Pawar i,
3852*c83a76b0SSuyog Pawar ENC_LOOP_LAMBDA_TYPE);
3853*c83a76b0SSuyog Pawar
3854*c83a76b0SSuyog Pawar #if ADAPT_COLOCATED_FROM_L0_FLAG
3855*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_frm_recon[i4_enc_frm_id][i]->i4_frame_qp =
3856*c83a76b0SSuyog Pawar ai4_cur_qp[i];
3857*c83a76b0SSuyog Pawar #endif
3858*c83a76b0SSuyog Pawar } //bitrate counter ends
3859*c83a76b0SSuyog Pawar
3860*c83a76b0SSuyog Pawar /* Reset the Dependency Mngrs local to EncLoop., ie CU_TopRight and Dblk */
3861*c83a76b0SSuyog Pawar ihevce_enc_loop_dep_mngr_frame_reset(
3862*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt, i4_enc_frm_id);
3863*c83a76b0SSuyog Pawar }
3864*c83a76b0SSuyog Pawar
3865*c83a76b0SSuyog Pawar {
3866*c83a76b0SSuyog Pawar /*Set the master done flag for frame init so that other
3867*c83a76b0SSuyog Pawar * threads can skip it
3868*c83a76b0SSuyog Pawar */
3869*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.enc_master_done_frame_init[i4_enc_frm_id] = 1;
3870*c83a76b0SSuyog Pawar }
3871*c83a76b0SSuyog Pawar
3872*c83a76b0SSuyog Pawar /************************************/
3873*c83a76b0SSuyog Pawar /****** EXIT CRITICAL SECTION ******/
3874*c83a76b0SSuyog Pawar /************************************/
3875*c83a76b0SSuyog Pawar
3876*c83a76b0SSuyog Pawar /****** Unlock the critical section ******/
3877*c83a76b0SSuyog Pawar if(NULL != pv_mutex_handle_frame_init)
3878*c83a76b0SSuyog Pawar {
3879*c83a76b0SSuyog Pawar result_frame_init = osal_mutex_unlock(pv_mutex_handle_frame_init);
3880*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result_frame_init)
3881*c83a76b0SSuyog Pawar return 0;
3882*c83a76b0SSuyog Pawar }
3883*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_encode = 1;
3884*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_num_re_enc = 0;
3885*c83a76b0SSuyog Pawar /************************************/
3886*c83a76b0SSuyog Pawar /****** Do Enc loop process ******/
3887*c83a76b0SSuyog Pawar /************************************/
3888*c83a76b0SSuyog Pawar /* Each thread will run the enc-loop.
3889*c83a76b0SSuyog Pawar Each thread will initialize it's own enc_loop context and do the processing.
3890*c83a76b0SSuyog Pawar Each thread will run all the bit-rate instances one after another */
3891*c83a76b0SSuyog Pawar if((i4_enc_end_flag == 0) &&
3892*c83a76b0SSuyog Pawar (NULL != ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]) &&
3893*c83a76b0SSuyog Pawar (1 == ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3894*c83a76b0SSuyog Pawar ->i4_frm_proc_valid_flag))
3895*c83a76b0SSuyog Pawar {
3896*c83a76b0SSuyog Pawar while(1)
3897*c83a76b0SSuyog Pawar {
3898*c83a76b0SSuyog Pawar ctb_enc_loop_out_t *ps_ctb_enc_loop_frm[IHEVCE_MAX_NUM_BITRATES];
3899*c83a76b0SSuyog Pawar cu_enc_loop_out_t *ps_cu_enc_loop_frm[IHEVCE_MAX_NUM_BITRATES];
3900*c83a76b0SSuyog Pawar tu_enc_loop_out_t *ps_tu_frm[IHEVCE_MAX_NUM_BITRATES];
3901*c83a76b0SSuyog Pawar pu_t *ps_pu_frm[IHEVCE_MAX_NUM_BITRATES];
3902*c83a76b0SSuyog Pawar UWORD8 *pu1_frm_coeffs[IHEVCE_MAX_NUM_BITRATES];
3903*c83a76b0SSuyog Pawar me_master_ctxt_t *ps_master_me_ctxt =
3904*c83a76b0SSuyog Pawar (me_master_ctxt_t *)ps_enc_ctxt->s_module_ctxt.pv_me_ctxt;
3905*c83a76b0SSuyog Pawar ihevce_enc_loop_master_ctxt_t *ps_master_ctxt =
3906*c83a76b0SSuyog Pawar (ihevce_enc_loop_master_ctxt_t *)ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt;
3907*c83a76b0SSuyog Pawar
3908*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_bitrates; i++)
3909*c83a76b0SSuyog Pawar {
3910*c83a76b0SSuyog Pawar if(i4_thrd_id == 0)
3911*c83a76b0SSuyog Pawar {
3912*c83a76b0SSuyog Pawar PROFILE_START(
3913*c83a76b0SSuyog Pawar &ps_hle_ctxt->profile_enc[ps_enc_ctxt->i4_resolution_id][i]);
3914*c83a76b0SSuyog Pawar }
3915*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id])
3916*c83a76b0SSuyog Pawar {
3917*c83a76b0SSuyog Pawar ps_ctb_enc_loop_frm[i] =
3918*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3919*c83a76b0SSuyog Pawar ->ps_frm_ctb_data;
3920*c83a76b0SSuyog Pawar ps_cu_enc_loop_frm[i] =
3921*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3922*c83a76b0SSuyog Pawar ->ps_frm_cu_data;
3923*c83a76b0SSuyog Pawar ps_tu_frm[i] =
3924*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3925*c83a76b0SSuyog Pawar ->ps_frm_tu_data;
3926*c83a76b0SSuyog Pawar ps_pu_frm[i] =
3927*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3928*c83a76b0SSuyog Pawar ->ps_frm_pu_data;
3929*c83a76b0SSuyog Pawar pu1_frm_coeffs[i] = (UWORD8 *)ps_enc_ctxt->s_multi_thrd
3930*c83a76b0SSuyog Pawar .ps_curr_out_enc_grp[i4_enc_frm_id][i]
3931*c83a76b0SSuyog Pawar ->pv_coeff_data;
3932*c83a76b0SSuyog Pawar }
3933*c83a76b0SSuyog Pawar /*derive reference picture list based on ping or pong instnace */
3934*c83a76b0SSuyog Pawar aps_ref_list = ps_curr_inp_enc->aps_ref_list[i];
3935*c83a76b0SSuyog Pawar
3936*c83a76b0SSuyog Pawar /* Always consider chroma cost when computing cost for derived instance */
3937*c83a76b0SSuyog Pawar ps_master_ctxt->aps_enc_loop_thrd_ctxt[i4_thrd_id]->i4_consider_chroma_cost =
3938*c83a76b0SSuyog Pawar 1;
3939*c83a76b0SSuyog Pawar
3940*c83a76b0SSuyog Pawar /*************************
3941*c83a76b0SSuyog Pawar * MULTI BITRATE CODE START
3942*c83a76b0SSuyog Pawar **************************/
3943*c83a76b0SSuyog Pawar if(i4_num_bitrates > 1)
3944*c83a76b0SSuyog Pawar {
3945*c83a76b0SSuyog Pawar ihevce_mbr_quality_tool_set_configuration(
3946*c83a76b0SSuyog Pawar ps_master_ctxt->aps_enc_loop_thrd_ctxt[i4_thrd_id],
3947*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms);
3948*c83a76b0SSuyog Pawar }
3949*c83a76b0SSuyog Pawar /************************
3950*c83a76b0SSuyog Pawar * MULTI BITRATE CODE END
3951*c83a76b0SSuyog Pawar *************************/
3952*c83a76b0SSuyog Pawar /* picture level init of Encode loop module */
3953*c83a76b0SSuyog Pawar ihevce_enc_loop_frame_init(
3954*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt,
3955*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.cur_qp[i4_enc_frm_id][i],
3956*c83a76b0SSuyog Pawar aps_ref_list,
3957*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_frm_recon[i4_enc_frm_id][i],
3958*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
3959*c83a76b0SSuyog Pawar ->s_slice_hdr,
3960*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]->ps_pps,
3961*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]->ps_sps,
3962*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]->ps_vps,
3963*c83a76b0SSuyog Pawar ps_curr_inp_enc->ps_curr_inp->s_lap_out.i1_weighted_pred_flag,
3964*c83a76b0SSuyog Pawar ps_curr_inp_enc->ps_curr_inp->s_lap_out.i1_weighted_bipred_flag,
3965*c83a76b0SSuyog Pawar ps_curr_inp_enc->ps_curr_inp->s_lap_out.i4_log2_luma_wght_denom,
3966*c83a76b0SSuyog Pawar ps_curr_inp_enc->ps_curr_inp->s_lap_out.i4_log2_chroma_wght_denom,
3967*c83a76b0SSuyog Pawar ps_curr_inp_enc->ps_curr_inp->s_lap_out.i4_poc,
3968*c83a76b0SSuyog Pawar ps_curr_inp_enc->ps_curr_inp->s_lap_out.i4_display_num,
3969*c83a76b0SSuyog Pawar ps_enc_ctxt,
3970*c83a76b0SSuyog Pawar ps_curr_inp_enc,
3971*c83a76b0SSuyog Pawar i,
3972*c83a76b0SSuyog Pawar i4_thrd_id,
3973*c83a76b0SSuyog Pawar i4_enc_frm_id, // update this to enc_loop_ctxt struct
3974*c83a76b0SSuyog Pawar i4_num_bitrates,
3975*c83a76b0SSuyog Pawar ps_curr_inp_enc->ps_curr_inp->s_lap_out.i4_quality_preset,
3976*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
3977*c83a76b0SSuyog Pawar ->pv_dep_mngr_encloop_dep_me);
3978*c83a76b0SSuyog Pawar
3979*c83a76b0SSuyog Pawar ihevce_enc_loop_process(
3980*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt,
3981*c83a76b0SSuyog Pawar ps_curr_inp,
3982*c83a76b0SSuyog Pawar ps_curr_inp_from_me->ps_ctb_analyse,
3983*c83a76b0SSuyog Pawar ps_curr_L0_IPE_inp_prms->ps_ipe_analyse_ctb,
3984*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_frm_recon[i4_enc_frm_id][i],
3985*c83a76b0SSuyog Pawar ps_curr_inp_enc->ps_cur_ctb_cu_tree,
3986*c83a76b0SSuyog Pawar ps_ctb_enc_loop_frm[i],
3987*c83a76b0SSuyog Pawar ps_cu_enc_loop_frm[i],
3988*c83a76b0SSuyog Pawar ps_tu_frm[i],
3989*c83a76b0SSuyog Pawar ps_pu_frm[i],
3990*c83a76b0SSuyog Pawar pu1_frm_coeffs[i],
3991*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms,
3992*c83a76b0SSuyog Pawar &ps_curr_inp_from_me->as_lambda_prms[i],
3993*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd,
3994*c83a76b0SSuyog Pawar i4_thrd_id,
3995*c83a76b0SSuyog Pawar i4_enc_frm_id,
3996*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_pass_prms.i4_pass);
3997*c83a76b0SSuyog Pawar if(i4_thrd_id == 0)
3998*c83a76b0SSuyog Pawar {
3999*c83a76b0SSuyog Pawar PROFILE_STOP(
4000*c83a76b0SSuyog Pawar &ps_hle_ctxt->profile_enc[ps_enc_ctxt->i4_resolution_id][i], NULL);
4001*c83a76b0SSuyog Pawar }
4002*c83a76b0SSuyog Pawar } //loop over bitrate ends
4003*c83a76b0SSuyog Pawar {
4004*c83a76b0SSuyog Pawar break;
4005*c83a76b0SSuyog Pawar }
4006*c83a76b0SSuyog Pawar } /*end of while(ps_enc_ctxt->s_multi_thrd.ai4_encode[i4_enc_frm_id] == 1)*/
4007*c83a76b0SSuyog Pawar }
4008*c83a76b0SSuyog Pawar
4009*c83a76b0SSuyog Pawar /************************************/
4010*c83a76b0SSuyog Pawar /****** ENTER CRITICAL SECTION ******/
4011*c83a76b0SSuyog Pawar /************************************/
4012*c83a76b0SSuyog Pawar
4013*c83a76b0SSuyog Pawar /****** Lock the critical section ******/
4014*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id])
4015*c83a76b0SSuyog Pawar {
4016*c83a76b0SSuyog Pawar result = osal_mutex_lock(
4017*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id]);
4018*c83a76b0SSuyog Pawar
4019*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result)
4020*c83a76b0SSuyog Pawar return 0;
4021*c83a76b0SSuyog Pawar }
4022*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id] != NULL)
4023*c83a76b0SSuyog Pawar {
4024*c83a76b0SSuyog Pawar /* Increment the counter to keep track of no of threads exiting the current mutex*/
4025*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.num_thrds_exited[i4_enc_frm_id]++;
4026*c83a76b0SSuyog Pawar
4027*c83a76b0SSuyog Pawar /* If the end frame is reached force the last slave to enter the next critical section*/
4028*c83a76b0SSuyog Pawar if(i4_enc_end_flag == 1)
4029*c83a76b0SSuyog Pawar {
4030*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.num_thrds_done ==
4031*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds - 1)
4032*c83a76b0SSuyog Pawar {
4033*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.num_thrds_exited[i4_enc_frm_id] =
4034*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds;
4035*c83a76b0SSuyog Pawar }
4036*c83a76b0SSuyog Pawar }
4037*c83a76b0SSuyog Pawar
4038*c83a76b0SSuyog Pawar {
4039*c83a76b0SSuyog Pawar /*Last slave thread comming out of enc loop will execute next critical section*/
4040*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.num_thrds_exited[i4_enc_frm_id] ==
4041*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds)
4042*c83a76b0SSuyog Pawar {
4043*c83a76b0SSuyog Pawar iv_enc_recon_data_buffs_t *ps_recon_out_temp = NULL;
4044*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_frm_recon_temp = NULL;
4045*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp;
4046*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out_next_encode;
4047*c83a76b0SSuyog Pawar
4048*c83a76b0SSuyog Pawar WORD32 ai4_act_qp[IHEVCE_MAX_NUM_BITRATES];
4049*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.num_thrds_exited[i4_enc_frm_id] = 0;
4050*c83a76b0SSuyog Pawar
4051*c83a76b0SSuyog Pawar ps_curr_inp = ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
4052*c83a76b0SSuyog Pawar ->ps_curr_inp;
4053*c83a76b0SSuyog Pawar
4054*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_bitrates; i++)
4055*c83a76b0SSuyog Pawar {
4056*c83a76b0SSuyog Pawar {
4057*c83a76b0SSuyog Pawar WORD32 j, i4_avg_QP;
4058*c83a76b0SSuyog Pawar ihevce_enc_loop_master_ctxt_t *ps_master_ctxt =
4059*c83a76b0SSuyog Pawar (ihevce_enc_loop_master_ctxt_t *)
4060*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt;
4061*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt, *ps_ctxt_temp;
4062*c83a76b0SSuyog Pawar ihevce_enc_loop_ctxt_t *ps_ctxt_last_thrd;
4063*c83a76b0SSuyog Pawar LWORD64 i8_total_cu_bits_into_qscale = 0, i8_total_cu_bits = 0;
4064*c83a76b0SSuyog Pawar UWORD32 total_frame_intra_sad = 0;
4065*c83a76b0SSuyog Pawar UWORD32 total_frame_inter_sad = 0;
4066*c83a76b0SSuyog Pawar UWORD32 total_frame_sad = 0;
4067*c83a76b0SSuyog Pawar
4068*c83a76b0SSuyog Pawar LWORD64 total_frame_intra_cost = 0;
4069*c83a76b0SSuyog Pawar LWORD64 total_frame_inter_cost = 0;
4070*c83a76b0SSuyog Pawar LWORD64 total_frame_cost = 0;
4071*c83a76b0SSuyog Pawar
4072*c83a76b0SSuyog Pawar ps_ctxt_last_thrd =
4073*c83a76b0SSuyog Pawar ps_master_ctxt->aps_enc_loop_thrd_ctxt[i4_thrd_id];
4074*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.i4_in_frame_rc_enabled)
4075*c83a76b0SSuyog Pawar {
4076*c83a76b0SSuyog Pawar WORD32 i4_total_ctb =
4077*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_horz *
4078*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_vert;
4079*c83a76b0SSuyog Pawar
4080*c83a76b0SSuyog Pawar ai4_act_qp[i] =
4081*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4082*c83a76b0SSuyog Pawar .ai4_curr_qp_acc[ps_ctxt_last_thrd->i4_enc_frm_id][i] /
4083*c83a76b0SSuyog Pawar i4_total_ctb;
4084*c83a76b0SSuyog Pawar }
4085*c83a76b0SSuyog Pawar else
4086*c83a76b0SSuyog Pawar {
4087*c83a76b0SSuyog Pawar ai4_act_qp[i] =
4088*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.cur_qp[i4_enc_frm_id][i];
4089*c83a76b0SSuyog Pawar }
4090*c83a76b0SSuyog Pawar
4091*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4092*c83a76b0SSuyog Pawar .ai4_curr_qp_acc[ps_ctxt_last_thrd->i4_enc_frm_id][i] = 0;
4093*c83a76b0SSuyog Pawar
4094*c83a76b0SSuyog Pawar /*Reset all the values of sub pic rc to default after the frame is completed */
4095*c83a76b0SSuyog Pawar {
4096*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4097*c83a76b0SSuyog Pawar .ai4_acc_ctb_ctr[ps_ctxt_last_thrd->i4_enc_frm_id][i] = 0;
4098*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4099*c83a76b0SSuyog Pawar .ai4_ctb_ctr[ps_ctxt_last_thrd->i4_enc_frm_id][i] = 0;
4100*c83a76b0SSuyog Pawar
4101*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4102*c83a76b0SSuyog Pawar .ai4_threshold_reached[ps_ctxt_last_thrd->i4_enc_frm_id][i] =
4103*c83a76b0SSuyog Pawar 0;
4104*c83a76b0SSuyog Pawar
4105*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4106*c83a76b0SSuyog Pawar .ai4_curr_qp_estimated[ps_ctxt_last_thrd->i4_enc_frm_id][i] =
4107*c83a76b0SSuyog Pawar (1 << QP_LEVEL_MOD_ACT_FACTOR);
4108*c83a76b0SSuyog Pawar
4109*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4110*c83a76b0SSuyog Pawar .af_acc_hdr_bits_scale_err[ps_ctxt_last_thrd->i4_enc_frm_id]
4111*c83a76b0SSuyog Pawar [i] = 0;
4112*c83a76b0SSuyog Pawar }
4113*c83a76b0SSuyog Pawar for(j = 0; j < ps_master_ctxt->i4_num_proc_thrds; j++)
4114*c83a76b0SSuyog Pawar {
4115*c83a76b0SSuyog Pawar /* ENC_LOOP state structure */
4116*c83a76b0SSuyog Pawar ps_ctxt = ps_master_ctxt->aps_enc_loop_thrd_ctxt[j];
4117*c83a76b0SSuyog Pawar
4118*c83a76b0SSuyog Pawar total_frame_intra_sad +=
4119*c83a76b0SSuyog Pawar ps_ctxt
4120*c83a76b0SSuyog Pawar ->aaps_enc_loop_rc_params[ps_ctxt_last_thrd
4121*c83a76b0SSuyog Pawar ->i4_enc_frm_id][i]
4122*c83a76b0SSuyog Pawar ->u4_frame_intra_sad_acc;
4123*c83a76b0SSuyog Pawar total_frame_inter_sad +=
4124*c83a76b0SSuyog Pawar ps_ctxt
4125*c83a76b0SSuyog Pawar ->aaps_enc_loop_rc_params[ps_ctxt_last_thrd
4126*c83a76b0SSuyog Pawar ->i4_enc_frm_id][i]
4127*c83a76b0SSuyog Pawar ->u4_frame_inter_sad_acc;
4128*c83a76b0SSuyog Pawar total_frame_sad +=
4129*c83a76b0SSuyog Pawar ps_ctxt
4130*c83a76b0SSuyog Pawar ->aaps_enc_loop_rc_params[ps_ctxt_last_thrd
4131*c83a76b0SSuyog Pawar ->i4_enc_frm_id][i]
4132*c83a76b0SSuyog Pawar ->u4_frame_sad_acc;
4133*c83a76b0SSuyog Pawar
4134*c83a76b0SSuyog Pawar total_frame_intra_cost +=
4135*c83a76b0SSuyog Pawar ps_ctxt
4136*c83a76b0SSuyog Pawar ->aaps_enc_loop_rc_params[ps_ctxt_last_thrd
4137*c83a76b0SSuyog Pawar ->i4_enc_frm_id][i]
4138*c83a76b0SSuyog Pawar ->i8_frame_intra_cost_acc;
4139*c83a76b0SSuyog Pawar total_frame_inter_cost +=
4140*c83a76b0SSuyog Pawar ps_ctxt
4141*c83a76b0SSuyog Pawar ->aaps_enc_loop_rc_params[ps_ctxt_last_thrd
4142*c83a76b0SSuyog Pawar ->i4_enc_frm_id][i]
4143*c83a76b0SSuyog Pawar ->i8_frame_inter_cost_acc;
4144*c83a76b0SSuyog Pawar total_frame_cost +=
4145*c83a76b0SSuyog Pawar ps_ctxt
4146*c83a76b0SSuyog Pawar ->aaps_enc_loop_rc_params[ps_ctxt_last_thrd
4147*c83a76b0SSuyog Pawar ->i4_enc_frm_id][i]
4148*c83a76b0SSuyog Pawar ->i8_frame_cost_acc;
4149*c83a76b0SSuyog Pawar /*Reset thrd id flag once the frame is completed */
4150*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4151*c83a76b0SSuyog Pawar .ai4_thrd_id_valid_flag[ps_ctxt_last_thrd->i4_enc_frm_id][i]
4152*c83a76b0SSuyog Pawar [j] = -1;
4153*c83a76b0SSuyog Pawar }
4154*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4155*c83a76b0SSuyog Pawar ->s_pic_level_info.u4_frame_sad = total_frame_sad;
4156*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4157*c83a76b0SSuyog Pawar ->s_pic_level_info.u4_frame_intra_sad = total_frame_intra_sad;
4158*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4159*c83a76b0SSuyog Pawar ->s_pic_level_info.u4_frame_inter_sad = total_frame_inter_sad;
4160*c83a76b0SSuyog Pawar
4161*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4162*c83a76b0SSuyog Pawar ->s_pic_level_info.i8_frame_cost = total_frame_cost;
4163*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4164*c83a76b0SSuyog Pawar ->s_pic_level_info.i8_frame_intra_cost = total_frame_intra_cost;
4165*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4166*c83a76b0SSuyog Pawar ->s_pic_level_info.i8_frame_inter_cost = total_frame_inter_cost;
4167*c83a76b0SSuyog Pawar }
4168*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ai4_produce_outbuf[i4_enc_frm_id][i] = 1;
4169*c83a76b0SSuyog Pawar ps_recon_out_temp =
4170*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_recon_out[i4_enc_frm_id][i];
4171*c83a76b0SSuyog Pawar ps_frm_recon_temp =
4172*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_frm_recon[i4_enc_frm_id][i];
4173*c83a76b0SSuyog Pawar
4174*c83a76b0SSuyog Pawar /* end of frame processing only if current input is valid */
4175*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id]
4176*c83a76b0SSuyog Pawar ->i4_frm_proc_valid_flag)
4177*c83a76b0SSuyog Pawar {
4178*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
4179*c83a76b0SSuyog Pawar /* Calculate the SEI Hash if enabled */
4180*c83a76b0SSuyog Pawar if(0 !=
4181*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4182*c83a76b0SSuyog Pawar ->s_sei.i1_decoded_pic_hash_sei_flag)
4183*c83a76b0SSuyog Pawar {
4184*c83a76b0SSuyog Pawar void *pv_y_buf;
4185*c83a76b0SSuyog Pawar void *pv_u_buf;
4186*c83a76b0SSuyog Pawar
4187*c83a76b0SSuyog Pawar {
4188*c83a76b0SSuyog Pawar pv_y_buf = ps_frm_recon_temp->s_yuv_buf_desc.pv_y_buf;
4189*c83a76b0SSuyog Pawar pv_u_buf = ps_frm_recon_temp->s_yuv_buf_desc.pv_u_buf;
4190*c83a76b0SSuyog Pawar }
4191*c83a76b0SSuyog Pawar
4192*c83a76b0SSuyog Pawar ihevce_populate_hash_sei(
4193*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd
4194*c83a76b0SSuyog Pawar .ps_curr_out_enc_grp[i4_enc_frm_id][i]
4195*c83a76b0SSuyog Pawar ->s_sei,
4196*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms
4197*c83a76b0SSuyog Pawar .i4_internal_bit_depth,
4198*c83a76b0SSuyog Pawar pv_y_buf,
4199*c83a76b0SSuyog Pawar ps_frm_recon_temp->s_yuv_buf_desc.i4_y_wd,
4200*c83a76b0SSuyog Pawar ps_frm_recon_temp->s_yuv_buf_desc.i4_y_ht,
4201*c83a76b0SSuyog Pawar ps_frm_recon_temp->s_yuv_buf_desc.i4_y_strd,
4202*c83a76b0SSuyog Pawar pv_u_buf,
4203*c83a76b0SSuyog Pawar ps_frm_recon_temp->s_yuv_buf_desc.i4_uv_wd,
4204*c83a76b0SSuyog Pawar ps_frm_recon_temp->s_yuv_buf_desc.i4_uv_ht,
4205*c83a76b0SSuyog Pawar ps_frm_recon_temp->s_yuv_buf_desc.i4_uv_strd,
4206*c83a76b0SSuyog Pawar 0,
4207*c83a76b0SSuyog Pawar 0);
4208*c83a76b0SSuyog Pawar }
4209*c83a76b0SSuyog Pawar #endif
4210*c83a76b0SSuyog Pawar /* Sending qp, poc and pic-type to entropy thread for printing on console */
4211*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->i4_log_dump_level != 0)
4212*c83a76b0SSuyog Pawar {
4213*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4214*c83a76b0SSuyog Pawar ->i4_qp =
4215*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.cur_qp[i4_enc_frm_id][i];
4216*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4217*c83a76b0SSuyog Pawar ->i4_poc = ps_curr_inp->s_lap_out.i4_poc;
4218*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4219*c83a76b0SSuyog Pawar ->i4_pic_type = ps_curr_inp->s_lap_out.i4_pic_type;
4220*c83a76b0SSuyog Pawar }
4221*c83a76b0SSuyog Pawar
4222*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4223*c83a76b0SSuyog Pawar ->i4_is_I_scenecut =
4224*c83a76b0SSuyog Pawar ((ps_curr_inp->s_lap_out.i4_scene_type == 1) &&
4225*c83a76b0SSuyog Pawar (ps_curr_inp->s_lap_out.i4_pic_type == IV_IDR_FRAME ||
4226*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_pic_type == IV_I_FRAME));
4227*c83a76b0SSuyog Pawar
4228*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4229*c83a76b0SSuyog Pawar ->i4_is_non_I_scenecut =
4230*c83a76b0SSuyog Pawar ((ps_curr_inp->s_lap_out.i4_scene_type ==
4231*c83a76b0SSuyog Pawar SCENE_TYPE_SCENE_CUT) &&
4232*c83a76b0SSuyog Pawar (ps_enc_ctxt->s_multi_thrd
4233*c83a76b0SSuyog Pawar .ps_curr_out_enc_grp[i4_enc_frm_id][i]
4234*c83a76b0SSuyog Pawar ->i4_is_I_scenecut == 0));
4235*c83a76b0SSuyog Pawar
4236*c83a76b0SSuyog Pawar /*ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]->i4_is_I_only_scd = ps_curr_inp->s_lap_out.i4_is_I_only_scd;
4237*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]->i4_is_non_I_scd = ps_curr_inp->s_lap_out.i4_is_non_I_scd;
4238*c83a76b0SSuyog Pawar
4239*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]->i4_is_model_valid = ps_curr_inp->s_lap_out.i4_is_model_valid;*/
4240*c83a76b0SSuyog Pawar
4241*c83a76b0SSuyog Pawar /* -------------------------------------------- */
4242*c83a76b0SSuyog Pawar /* MSE Computation for PSNR */
4243*c83a76b0SSuyog Pawar /* -------------------------------------------- */
4244*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->i4_log_dump_level != 0)
4245*c83a76b0SSuyog Pawar {
4246*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4247*c83a76b0SSuyog Pawar ->i4_qp =
4248*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.cur_qp[i4_enc_frm_id][i];
4249*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4250*c83a76b0SSuyog Pawar ->i4_poc = ps_curr_inp->s_lap_out.i4_poc;
4251*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4252*c83a76b0SSuyog Pawar ->i4_pic_type = ps_curr_inp->s_lap_out.i4_pic_type;
4253*c83a76b0SSuyog Pawar }
4254*c83a76b0SSuyog Pawar
4255*c83a76b0SSuyog Pawar /* if non reference B picture */
4256*c83a76b0SSuyog Pawar if(0 == ps_frm_recon_temp->i4_is_reference)
4257*c83a76b0SSuyog Pawar {
4258*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i]
4259*c83a76b0SSuyog Pawar ->i4_pic_type += 2;
4260*c83a76b0SSuyog Pawar }
4261*c83a76b0SSuyog Pawar
4262*c83a76b0SSuyog Pawar #define FORCE_EXT_REF_PIC 0
4263*c83a76b0SSuyog Pawar
4264*c83a76b0SSuyog Pawar /* -------------------------------------------- */
4265*c83a76b0SSuyog Pawar /* Dumping of recon to App Queue */
4266*c83a76b0SSuyog Pawar /* -------------------------------------------- */
4267*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->ps_stat_prms->i4_save_recon)
4268*c83a76b0SSuyog Pawar {
4269*c83a76b0SSuyog Pawar {
4270*c83a76b0SSuyog Pawar WORD32 i, j;
4271*c83a76b0SSuyog Pawar UWORD8 *pu1_recon;
4272*c83a76b0SSuyog Pawar UWORD8 *pu1_chrm_buf_u;
4273*c83a76b0SSuyog Pawar UWORD8 *pu1_chrm_buf_v;
4274*c83a76b0SSuyog Pawar UWORD8 *pu1_curr_recon;
4275*c83a76b0SSuyog Pawar
4276*c83a76b0SSuyog Pawar pu1_recon =
4277*c83a76b0SSuyog Pawar (UWORD8 *)ps_frm_recon_temp->s_yuv_buf_desc.pv_y_buf;
4278*c83a76b0SSuyog Pawar
4279*c83a76b0SSuyog Pawar /** Copying Luma into recon buffer **/
4280*c83a76b0SSuyog Pawar pu1_curr_recon = (UWORD8 *)ps_recon_out_temp->pv_y_buf;
4281*c83a76b0SSuyog Pawar
4282*c83a76b0SSuyog Pawar for(j = 0; j < ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht;
4283*c83a76b0SSuyog Pawar j++)
4284*c83a76b0SSuyog Pawar {
4285*c83a76b0SSuyog Pawar memcpy(
4286*c83a76b0SSuyog Pawar pu1_curr_recon,
4287*c83a76b0SSuyog Pawar pu1_recon,
4288*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd);
4289*c83a76b0SSuyog Pawar
4290*c83a76b0SSuyog Pawar pu1_recon +=
4291*c83a76b0SSuyog Pawar ps_frm_recon_temp->s_yuv_buf_desc.i4_y_strd;
4292*c83a76b0SSuyog Pawar pu1_curr_recon +=
4293*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd;
4294*c83a76b0SSuyog Pawar }
4295*c83a76b0SSuyog Pawar
4296*c83a76b0SSuyog Pawar /* recon chroma is converted from Semiplanar to Planar for dumping */
4297*c83a76b0SSuyog Pawar pu1_recon =
4298*c83a76b0SSuyog Pawar (UWORD8 *)ps_frm_recon_temp->s_yuv_buf_desc.pv_u_buf;
4299*c83a76b0SSuyog Pawar pu1_chrm_buf_u = (UWORD8 *)ps_recon_out_temp->pv_cb_buf;
4300*c83a76b0SSuyog Pawar pu1_chrm_buf_v =
4301*c83a76b0SSuyog Pawar pu1_chrm_buf_u +
4302*c83a76b0SSuyog Pawar ((ps_curr_inp->s_lap_out.s_input_buf.i4_uv_wd >> 1) *
4303*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht);
4304*c83a76b0SSuyog Pawar
4305*c83a76b0SSuyog Pawar for(j = 0; j < ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht;
4306*c83a76b0SSuyog Pawar j++)
4307*c83a76b0SSuyog Pawar {
4308*c83a76b0SSuyog Pawar for(i = 0;
4309*c83a76b0SSuyog Pawar i<ps_curr_inp->s_lap_out.s_input_buf.i4_uv_wd>> 1;
4310*c83a76b0SSuyog Pawar i++)
4311*c83a76b0SSuyog Pawar {
4312*c83a76b0SSuyog Pawar *pu1_chrm_buf_u++ = *pu1_recon++;
4313*c83a76b0SSuyog Pawar *pu1_chrm_buf_v++ = *pu1_recon++;
4314*c83a76b0SSuyog Pawar }
4315*c83a76b0SSuyog Pawar
4316*c83a76b0SSuyog Pawar pu1_recon -=
4317*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_wd;
4318*c83a76b0SSuyog Pawar pu1_recon +=
4319*c83a76b0SSuyog Pawar ps_frm_recon_temp->s_yuv_buf_desc.i4_uv_strd;
4320*c83a76b0SSuyog Pawar }
4321*c83a76b0SSuyog Pawar
4322*c83a76b0SSuyog Pawar /* set the POC and number of bytes in Y & UV buf */
4323*c83a76b0SSuyog Pawar ps_recon_out_temp->i4_poc = ps_frm_recon_temp->i4_poc;
4324*c83a76b0SSuyog Pawar ps_recon_out_temp->i4_y_pixels =
4325*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht *
4326*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd;
4327*c83a76b0SSuyog Pawar ps_recon_out_temp->i4_uv_pixels =
4328*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_wd *
4329*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht;
4330*c83a76b0SSuyog Pawar }
4331*c83a76b0SSuyog Pawar }
4332*c83a76b0SSuyog Pawar ps_frm_recon_temp->i4_non_ref_free_flag = 1;
4333*c83a76b0SSuyog Pawar /* -------------------------------------------- */
4334*c83a76b0SSuyog Pawar /* End of picture updates */
4335*c83a76b0SSuyog Pawar /* -------------------------------------------- */
4336*c83a76b0SSuyog Pawar }
4337*c83a76b0SSuyog Pawar
4338*c83a76b0SSuyog Pawar /* After the MSE (or PSNR) computation is done we will update
4339*c83a76b0SSuyog Pawar these data in output buffer structure and then signal entropy
4340*c83a76b0SSuyog Pawar thread that the buffer is produced. */
4341*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.ai4_produce_outbuf[i4_enc_frm_id][i] == 1)
4342*c83a76b0SSuyog Pawar {
4343*c83a76b0SSuyog Pawar /* set the output buffer as produced */
4344*c83a76b0SSuyog Pawar ihevce_q_set_buff_prod(
4345*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
4346*c83a76b0SSuyog Pawar IHEVCE_FRM_PRS_ENT_COD_Q + i,
4347*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.out_buf_id[i4_enc_frm_id][i]);
4348*c83a76b0SSuyog Pawar
4349*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.is_out_buf_freed[i4_enc_frm_id][i] = 1;
4350*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ai4_produce_outbuf[i4_enc_frm_id][i] = 0;
4351*c83a76b0SSuyog Pawar }
4352*c83a76b0SSuyog Pawar
4353*c83a76b0SSuyog Pawar } //bit-rate counter ends
4354*c83a76b0SSuyog Pawar /* -------------------------------------------- */
4355*c83a76b0SSuyog Pawar /* Frame level RC update */
4356*c83a76b0SSuyog Pawar /* -------------------------------------------- */
4357*c83a76b0SSuyog Pawar /* Query enc_loop to get the Parameters for Rate control */
4358*c83a76b0SSuyog Pawar if(1 == ps_curr_inp->s_input_buf.i4_inp_frm_data_valid_flag)
4359*c83a76b0SSuyog Pawar {
4360*c83a76b0SSuyog Pawar frm_proc_ent_cod_ctxt_t *ps_curr_out = NULL;
4361*c83a76b0SSuyog Pawar /*HEVC_RC*/
4362*c83a76b0SSuyog Pawar rc_bits_sad_t as_rc_frame_stat[IHEVCE_MAX_NUM_BITRATES];
4363*c83a76b0SSuyog Pawar osal_mutex_lock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
4364*c83a76b0SSuyog Pawar
4365*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_bitrates; i++)
4366*c83a76b0SSuyog Pawar {
4367*c83a76b0SSuyog Pawar /*each bit-rate RC params are collated by master thread */
4368*c83a76b0SSuyog Pawar ihevce_enc_loop_get_frame_rc_prms(
4369*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt,
4370*c83a76b0SSuyog Pawar &as_rc_frame_stat[i],
4371*c83a76b0SSuyog Pawar i,
4372*c83a76b0SSuyog Pawar i4_enc_frm_id);
4373*c83a76b0SSuyog Pawar
4374*c83a76b0SSuyog Pawar /*update bits estimate on rd opt thread so that mismatch between rdopt and entropy can be taken care of*/
4375*c83a76b0SSuyog Pawar ps_curr_out =
4376*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i];
4377*c83a76b0SSuyog Pawar
4378*c83a76b0SSuyog Pawar ps_rc_lap_out_next_encode =
4379*c83a76b0SSuyog Pawar (rc_lap_out_params_t *)
4380*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ps_rc_lap_out_next_encode;
4381*c83a76b0SSuyog Pawar
4382*c83a76b0SSuyog Pawar ps_curr_out->i4_is_end_of_idr_gop = 0;
4383*c83a76b0SSuyog Pawar
4384*c83a76b0SSuyog Pawar if(NULL != ps_rc_lap_out_next_encode)
4385*c83a76b0SSuyog Pawar {
4386*c83a76b0SSuyog Pawar if(ps_rc_lap_out_next_encode->i4_rc_pic_type == IV_IDR_FRAME)
4387*c83a76b0SSuyog Pawar {
4388*c83a76b0SSuyog Pawar /*If the next pic is IDR, then signal end of gopf for current frame*/
4389*c83a76b0SSuyog Pawar ps_curr_out->i4_is_end_of_idr_gop = 1;
4390*c83a76b0SSuyog Pawar }
4391*c83a76b0SSuyog Pawar }
4392*c83a76b0SSuyog Pawar else if(NULL == ps_rc_lap_out_next_encode)
4393*c83a76b0SSuyog Pawar {
4394*c83a76b0SSuyog Pawar /*If the lap out next is NULL, then end of sequence reached*/
4395*c83a76b0SSuyog Pawar ps_curr_out->i4_is_end_of_idr_gop = 1;
4396*c83a76b0SSuyog Pawar }
4397*c83a76b0SSuyog Pawar
4398*c83a76b0SSuyog Pawar if(NULL == ps_curr_out)
4399*c83a76b0SSuyog Pawar {
4400*c83a76b0SSuyog Pawar DBG_PRINTF("error in getting curr out in encode loop\n");
4401*c83a76b0SSuyog Pawar }
4402*c83a76b0SSuyog Pawar
4403*c83a76b0SSuyog Pawar //DBG_PRINTF("\nRDOPT head = %d RDOPT text = %d\n",s_rc_frame_stat.u4_total_header_bits,s_rc_frame_stat.u4_total_texture_bits);
4404*c83a76b0SSuyog Pawar /* acquire mutex lock for rate control calls */
4405*c83a76b0SSuyog Pawar
4406*c83a76b0SSuyog Pawar /* Note : u4_total_intra_sad coming out of enc_loop */
4407*c83a76b0SSuyog Pawar /* will not be accurate becos of intra gating */
4408*c83a76b0SSuyog Pawar /* need to access the importance of this sad in RC */
4409*c83a76b0SSuyog Pawar
4410*c83a76b0SSuyog Pawar //Store the rc update parameters for deterministic Enc loop parallelism
4411*c83a76b0SSuyog Pawar
4412*c83a76b0SSuyog Pawar {
4413*c83a76b0SSuyog Pawar ihevce_rc_store_retrive_update_info(
4414*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i],
4415*c83a76b0SSuyog Pawar &as_rc_frame_stat[i],
4416*c83a76b0SSuyog Pawar i4_enc_frm_id_rc,
4417*c83a76b0SSuyog Pawar i,
4418*c83a76b0SSuyog Pawar 1,
4419*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.out_buf_id[i4_enc_frm_id][i],
4420*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.i4_pic_type,
4421*c83a76b0SSuyog Pawar &ai4_act_qp[i],
4422*c83a76b0SSuyog Pawar (void *)&ps_curr_inp->s_lap_out,
4423*c83a76b0SSuyog Pawar (void *)&ps_curr_inp->s_rc_lap_out); // STORE
4424*c83a76b0SSuyog Pawar }
4425*c83a76b0SSuyog Pawar }
4426*c83a76b0SSuyog Pawar
4427*c83a76b0SSuyog Pawar /* release mutex lock after rate control calls */
4428*c83a76b0SSuyog Pawar osal_mutex_unlock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
4429*c83a76b0SSuyog Pawar }
4430*c83a76b0SSuyog Pawar if((ps_enc_ctxt->ps_stat_prms->i4_save_recon != 0) /*&&
4431*c83a76b0SSuyog Pawar (1 == ps_curr_inp->s_input_buf.s_input_buf.i4_inp_frm_data_valid_flag)*/)
4432*c83a76b0SSuyog Pawar {
4433*c83a76b0SSuyog Pawar WORD32 i4_bitrate_ctr;
4434*c83a76b0SSuyog Pawar for(i4_bitrate_ctr = 0; i4_bitrate_ctr < i4_num_bitrates;
4435*c83a76b0SSuyog Pawar i4_bitrate_ctr++)
4436*c83a76b0SSuyog Pawar {
4437*c83a76b0SSuyog Pawar /*swaping of buf_id for 0th and reference bitrate location, as encoder
4438*c83a76b0SSuyog Pawar assumes always 0th loc for reference bitrate and app must receive in
4439*c83a76b0SSuyog Pawar the configured order*/
4440*c83a76b0SSuyog Pawar WORD32 i4_recon_buf_id = i4_bitrate_ctr;
4441*c83a76b0SSuyog Pawar if(i4_bitrate_ctr == 0)
4442*c83a76b0SSuyog Pawar {
4443*c83a76b0SSuyog Pawar i4_recon_buf_id = ps_enc_ctxt->i4_ref_mbr_id;
4444*c83a76b0SSuyog Pawar }
4445*c83a76b0SSuyog Pawar else if(i4_bitrate_ctr == ps_enc_ctxt->i4_ref_mbr_id)
4446*c83a76b0SSuyog Pawar {
4447*c83a76b0SSuyog Pawar i4_recon_buf_id = 0;
4448*c83a76b0SSuyog Pawar }
4449*c83a76b0SSuyog Pawar
4450*c83a76b0SSuyog Pawar /* Call back to Apln. saying recon buffer is produced */
4451*c83a76b0SSuyog Pawar ps_hle_ctxt->ihevce_output_recon_fill_done(
4452*c83a76b0SSuyog Pawar ps_hle_ctxt->pv_recon_cb_handle,
4453*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4454*c83a76b0SSuyog Pawar .ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr],
4455*c83a76b0SSuyog Pawar i4_recon_buf_id, /* br instance */
4456*c83a76b0SSuyog Pawar i4_resolution_id /* res_intance */);
4457*c83a76b0SSuyog Pawar
4458*c83a76b0SSuyog Pawar /* --- release the current recon buffer ---- */
4459*c83a76b0SSuyog Pawar ihevce_q_rel_buf(
4460*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
4461*c83a76b0SSuyog Pawar (IHEVCE_RECON_DATA_Q + i4_recon_buf_id),
4462*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4463*c83a76b0SSuyog Pawar .recon_buf_id[i4_enc_frm_id][i4_bitrate_ctr]);
4464*c83a76b0SSuyog Pawar
4465*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd
4466*c83a76b0SSuyog Pawar .is_recon_dumped[i4_enc_frm_id][i4_bitrate_ctr] = 1;
4467*c83a76b0SSuyog Pawar }
4468*c83a76b0SSuyog Pawar }
4469*c83a76b0SSuyog Pawar
4470*c83a76b0SSuyog Pawar if(i4_enc_end_flag == 1)
4471*c83a76b0SSuyog Pawar {
4472*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.is_in_buf_freed[i4_enc_frm_id] == 0)
4473*c83a76b0SSuyog Pawar {
4474*c83a76b0SSuyog Pawar /* release the pre_enc/enc queue buffer */
4475*c83a76b0SSuyog Pawar ihevce_q_rel_buf(
4476*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
4477*c83a76b0SSuyog Pawar IHEVCE_PRE_ENC_ME_Q,
4478*c83a76b0SSuyog Pawar ps_curr_inp_enc->curr_inp_from_me_buf_id);
4479*c83a76b0SSuyog Pawar
4480*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.is_in_buf_freed[i4_enc_frm_id] = 1;
4481*c83a76b0SSuyog Pawar }
4482*c83a76b0SSuyog Pawar }
4483*c83a76b0SSuyog Pawar /* release encoder owned input buffer*/
4484*c83a76b0SSuyog Pawar ihevce_q_rel_buf(
4485*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
4486*c83a76b0SSuyog Pawar IHEVCE_INPUT_DATA_CTRL_Q,
4487*c83a76b0SSuyog Pawar ps_curr_inp_enc->curr_inp_buf_id);
4488*c83a76b0SSuyog Pawar /* release the pre_enc/enc queue buffer */
4489*c83a76b0SSuyog Pawar ihevce_q_rel_buf(
4490*c83a76b0SSuyog Pawar ps_enc_ctxt,
4491*c83a76b0SSuyog Pawar IHEVCE_PRE_ENC_ME_Q,
4492*c83a76b0SSuyog Pawar ps_curr_inp_enc->curr_inp_from_me_buf_id);
4493*c83a76b0SSuyog Pawar
4494*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.is_in_buf_freed[i4_enc_frm_id] = 1;
4495*c83a76b0SSuyog Pawar
4496*c83a76b0SSuyog Pawar /* release the pre_enc/enc queue buffer */
4497*c83a76b0SSuyog Pawar ihevce_q_rel_buf(
4498*c83a76b0SSuyog Pawar ps_enc_ctxt,
4499*c83a76b0SSuyog Pawar IHEVCE_L0_IPE_ENC_Q,
4500*c83a76b0SSuyog Pawar ps_curr_inp_enc->curr_inp_from_l0_ipe_buf_id);
4501*c83a76b0SSuyog Pawar
4502*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.is_L0_ipe_in_buf_freed[i4_enc_frm_id] = 1;
4503*c83a76b0SSuyog Pawar /* release the me/enc queue buffer */
4504*c83a76b0SSuyog Pawar ihevce_q_rel_buf(
4505*c83a76b0SSuyog Pawar ps_enc_ctxt,
4506*c83a76b0SSuyog Pawar IHEVCE_ME_ENC_RDOPT_Q,
4507*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_enc_in_buf_id[i4_enc_frm_id]);
4508*c83a76b0SSuyog Pawar
4509*c83a76b0SSuyog Pawar /* reset the pointers to NULL */
4510*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id] = NULL;
4511*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.enc_master_done_frame_init[i4_enc_frm_id] = 0;
4512*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_bitrates; i++)
4513*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i] = NULL;
4514*c83a76b0SSuyog Pawar
4515*c83a76b0SSuyog Pawar /* Set the prev_frame_done variable to 1 to indicate that
4516*c83a76b0SSuyog Pawar *prev frame is done */
4517*c83a76b0SSuyog Pawar ihevce_dmgr_update_frm_frm_sync(pv_dep_mngr_prev_frame_done);
4518*c83a76b0SSuyog Pawar }
4519*c83a76b0SSuyog Pawar }
4520*c83a76b0SSuyog Pawar }
4521*c83a76b0SSuyog Pawar else
4522*c83a76b0SSuyog Pawar {
4523*c83a76b0SSuyog Pawar /* Increment the counter to keep track of no of threads exiting the current mutex*/
4524*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.num_thrds_exited[i4_enc_frm_id]++;
4525*c83a76b0SSuyog Pawar /*Last slave thread comming out of enc loop will execute next critical section*/
4526*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.num_thrds_exited[i4_enc_frm_id] ==
4527*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds)
4528*c83a76b0SSuyog Pawar {
4529*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.num_thrds_exited[i4_enc_frm_id] = 0;
4530*c83a76b0SSuyog Pawar
4531*c83a76b0SSuyog Pawar /* reset the pointers to NULL */
4532*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.aps_cur_inp_enc_prms[i4_enc_frm_id] = NULL;
4533*c83a76b0SSuyog Pawar
4534*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.enc_master_done_frame_init[i4_enc_frm_id] = 0;
4535*c83a76b0SSuyog Pawar
4536*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_bitrates; i++)
4537*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[i4_enc_frm_id][i] = NULL;
4538*c83a76b0SSuyog Pawar
4539*c83a76b0SSuyog Pawar /* Set the prev_frame_done variable to 1 to indicate that
4540*c83a76b0SSuyog Pawar *prev frame is done
4541*c83a76b0SSuyog Pawar */
4542*c83a76b0SSuyog Pawar ihevce_dmgr_update_frm_frm_sync(pv_dep_mngr_prev_frame_done);
4543*c83a76b0SSuyog Pawar }
4544*c83a76b0SSuyog Pawar }
4545*c83a76b0SSuyog Pawar
4546*c83a76b0SSuyog Pawar /* Toggle the ping pong flag of the thread exiting curr frame*/
4547*c83a76b0SSuyog Pawar /*ps_enc_ctxt->s_multi_thrd.ping_pong[ps_thrd_ctxt->i4_thrd_id] =
4548*c83a76b0SSuyog Pawar !ps_enc_ctxt->s_multi_thrd.ping_pong[ps_thrd_ctxt->i4_thrd_id];*/
4549*c83a76b0SSuyog Pawar }
4550*c83a76b0SSuyog Pawar
4551*c83a76b0SSuyog Pawar /************************************/
4552*c83a76b0SSuyog Pawar /****** EXIT CRITICAL SECTION ******/
4553*c83a76b0SSuyog Pawar /************************************/
4554*c83a76b0SSuyog Pawar /****** Unlock the critical section ******/
4555*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id])
4556*c83a76b0SSuyog Pawar {
4557*c83a76b0SSuyog Pawar result = osal_mutex_unlock(
4558*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id]);
4559*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result)
4560*c83a76b0SSuyog Pawar return 0;
4561*c83a76b0SSuyog Pawar }
4562*c83a76b0SSuyog Pawar
4563*c83a76b0SSuyog Pawar if((0 == i4_me_end_flag) && (0 == i4_enc_end_flag))
4564*c83a76b0SSuyog Pawar {
4565*c83a76b0SSuyog Pawar i4_enc_frm_id++;
4566*c83a76b0SSuyog Pawar i4_enc_frm_id_rc++;
4567*c83a76b0SSuyog Pawar
4568*c83a76b0SSuyog Pawar if(i4_enc_frm_id == NUM_ME_ENC_BUFS)
4569*c83a76b0SSuyog Pawar {
4570*c83a76b0SSuyog Pawar i4_enc_frm_id = 0;
4571*c83a76b0SSuyog Pawar }
4572*c83a76b0SSuyog Pawar
4573*c83a76b0SSuyog Pawar if(i4_enc_frm_id_rc == ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc)
4574*c83a76b0SSuyog Pawar {
4575*c83a76b0SSuyog Pawar i4_enc_frm_id_rc = 0;
4576*c83a76b0SSuyog Pawar }
4577*c83a76b0SSuyog Pawar i4_me_frm_id++;
4578*c83a76b0SSuyog Pawar
4579*c83a76b0SSuyog Pawar if(i4_me_frm_id == NUM_ME_ENC_BUFS)
4580*c83a76b0SSuyog Pawar i4_me_frm_id = 0;
4581*c83a76b0SSuyog Pawar }
4582*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_multi_thrd.i4_force_end_flag)
4583*c83a76b0SSuyog Pawar {
4584*c83a76b0SSuyog Pawar i4_me_end_flag = 1;
4585*c83a76b0SSuyog Pawar i4_enc_end_flag = 1;
4586*c83a76b0SSuyog Pawar }
4587*c83a76b0SSuyog Pawar }
4588*c83a76b0SSuyog Pawar
4589*c83a76b0SSuyog Pawar /****** Lock the critical section ******/
4590*c83a76b0SSuyog Pawar
4591*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id])
4592*c83a76b0SSuyog Pawar {
4593*c83a76b0SSuyog Pawar WORD32 result;
4594*c83a76b0SSuyog Pawar
4595*c83a76b0SSuyog Pawar result =
4596*c83a76b0SSuyog Pawar osal_mutex_lock(ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id]);
4597*c83a76b0SSuyog Pawar
4598*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result)
4599*c83a76b0SSuyog Pawar return 0;
4600*c83a76b0SSuyog Pawar }
4601*c83a76b0SSuyog Pawar
4602*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.num_thrds_done ==
4603*c83a76b0SSuyog Pawar (ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds - 1))
4604*c83a76b0SSuyog Pawar {
4605*c83a76b0SSuyog Pawar if(1 != ps_enc_ctxt->s_multi_thrd.i4_force_end_flag)
4606*c83a76b0SSuyog Pawar {
4607*c83a76b0SSuyog Pawar osal_mutex_lock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
4608*c83a76b0SSuyog Pawar for(i = 0; i < ps_enc_ctxt->i4_num_bitrates; i++)
4609*c83a76b0SSuyog Pawar {
4610*c83a76b0SSuyog Pawar ihevce_rc_close(
4611*c83a76b0SSuyog Pawar ps_enc_ctxt,
4612*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_active_enc_frame_id,
4613*c83a76b0SSuyog Pawar 2,
4614*c83a76b0SSuyog Pawar MIN(ps_enc_ctxt->ai4_rc_query[i], ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc),
4615*c83a76b0SSuyog Pawar i);
4616*c83a76b0SSuyog Pawar }
4617*c83a76b0SSuyog Pawar osal_mutex_unlock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
4618*c83a76b0SSuyog Pawar }
4619*c83a76b0SSuyog Pawar }
4620*c83a76b0SSuyog Pawar
4621*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.num_thrds_done++;
4622*c83a76b0SSuyog Pawar
4623*c83a76b0SSuyog Pawar /****** UnLock the critical section ******/
4624*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id])
4625*c83a76b0SSuyog Pawar {
4626*c83a76b0SSuyog Pawar WORD32 result;
4627*c83a76b0SSuyog Pawar
4628*c83a76b0SSuyog Pawar result =
4629*c83a76b0SSuyog Pawar osal_mutex_unlock(ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id]);
4630*c83a76b0SSuyog Pawar
4631*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result)
4632*c83a76b0SSuyog Pawar return 0;
4633*c83a76b0SSuyog Pawar }
4634*c83a76b0SSuyog Pawar
4635*c83a76b0SSuyog Pawar /****** Lock the critical section ******/
4636*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id])
4637*c83a76b0SSuyog Pawar {
4638*c83a76b0SSuyog Pawar WORD32 result;
4639*c83a76b0SSuyog Pawar result =
4640*c83a76b0SSuyog Pawar osal_mutex_lock(ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id]);
4641*c83a76b0SSuyog Pawar
4642*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result)
4643*c83a76b0SSuyog Pawar return 0;
4644*c83a76b0SSuyog Pawar }
4645*c83a76b0SSuyog Pawar if((ps_enc_ctxt->s_multi_thrd.num_thrds_done ==
4646*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds) &&
4647*c83a76b0SSuyog Pawar (ps_enc_ctxt->s_multi_thrd.i4_force_end_flag))
4648*c83a76b0SSuyog Pawar {
4649*c83a76b0SSuyog Pawar WORD32 num_bufs_preenc_me_que, num_bufs_L0_ipe_enc;
4650*c83a76b0SSuyog Pawar WORD32 buf_id_ctr, frm_id_ctr;
4651*c83a76b0SSuyog Pawar frm_proc_ent_cod_ctxt_t *ps_curr_out_enc_ent[IHEVCE_MAX_NUM_BITRATES];
4652*c83a76b0SSuyog Pawar WORD32 out_buf_id_enc_ent[IHEVCE_MAX_NUM_BITRATES];
4653*c83a76b0SSuyog Pawar
4654*c83a76b0SSuyog Pawar if(ps_enc_ctxt->s_multi_thrd.i4_num_enc_loop_frm_pllel > 1)
4655*c83a76b0SSuyog Pawar {
4656*c83a76b0SSuyog Pawar num_bufs_preenc_me_que = (MAX_L0_IPE_ENC_STAGGER - 1) + MIN_L1_L0_STAGGER_NON_SEQ +
4657*c83a76b0SSuyog Pawar NUM_BUFS_DECOMP_HME +
4658*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_lap_prms.i4_rc_look_ahead_pics;
4659*c83a76b0SSuyog Pawar
4660*c83a76b0SSuyog Pawar num_bufs_L0_ipe_enc = MAX_L0_IPE_ENC_STAGGER;
4661*c83a76b0SSuyog Pawar }
4662*c83a76b0SSuyog Pawar else
4663*c83a76b0SSuyog Pawar {
4664*c83a76b0SSuyog Pawar num_bufs_preenc_me_que = (MIN_L0_IPE_ENC_STAGGER - 1) + MIN_L1_L0_STAGGER_NON_SEQ +
4665*c83a76b0SSuyog Pawar NUM_BUFS_DECOMP_HME +
4666*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_lap_prms.i4_rc_look_ahead_pics;
4667*c83a76b0SSuyog Pawar
4668*c83a76b0SSuyog Pawar num_bufs_L0_ipe_enc = MIN_L0_IPE_ENC_STAGGER;
4669*c83a76b0SSuyog Pawar }
4670*c83a76b0SSuyog Pawar for(buf_id_ctr = 0; buf_id_ctr < num_bufs_preenc_me_que; buf_id_ctr++)
4671*c83a76b0SSuyog Pawar {
4672*c83a76b0SSuyog Pawar /* release encoder owned input buffer*/
4673*c83a76b0SSuyog Pawar ihevce_q_rel_buf((void *)ps_enc_ctxt, IHEVCE_PRE_ENC_ME_Q, buf_id_ctr);
4674*c83a76b0SSuyog Pawar }
4675*c83a76b0SSuyog Pawar for(buf_id_ctr = 0; buf_id_ctr < num_bufs_L0_ipe_enc; buf_id_ctr++)
4676*c83a76b0SSuyog Pawar {
4677*c83a76b0SSuyog Pawar /* release encoder owned input buffer*/
4678*c83a76b0SSuyog Pawar ihevce_q_rel_buf((void *)ps_enc_ctxt, IHEVCE_L0_IPE_ENC_Q, buf_id_ctr);
4679*c83a76b0SSuyog Pawar }
4680*c83a76b0SSuyog Pawar for(frm_id_ctr = 0; frm_id_ctr < NUM_ME_ENC_BUFS; frm_id_ctr++)
4681*c83a76b0SSuyog Pawar {
4682*c83a76b0SSuyog Pawar for(i = 0; i < ps_enc_ctxt->i4_num_bitrates; i++)
4683*c83a76b0SSuyog Pawar {
4684*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[frm_id_ctr][i])
4685*c83a76b0SSuyog Pawar {
4686*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[frm_id_ctr][i]
4687*c83a76b0SSuyog Pawar ->i4_frm_proc_valid_flag = 0;
4688*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_curr_out_enc_grp[frm_id_ctr][i]->i4_end_flag = 1;
4689*c83a76b0SSuyog Pawar /* set the output buffer as produced */
4690*c83a76b0SSuyog Pawar ihevce_q_set_buff_prod(
4691*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
4692*c83a76b0SSuyog Pawar IHEVCE_FRM_PRS_ENT_COD_Q + i,
4693*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.out_buf_id[frm_id_ctr][i]);
4694*c83a76b0SSuyog Pawar }
4695*c83a76b0SSuyog Pawar }
4696*c83a76b0SSuyog Pawar }
4697*c83a76b0SSuyog Pawar for(buf_id_ctr = 0; buf_id_ctr < NUM_FRMPROC_ENTCOD_BUFS;
4698*c83a76b0SSuyog Pawar buf_id_ctr++) /*** Set buffer produced for NUM_FRMPROC_ENTCOD_BUFS buffers for entropy to exit ***/
4699*c83a76b0SSuyog Pawar {
4700*c83a76b0SSuyog Pawar for(i = 0; i < ps_enc_ctxt->i4_num_bitrates; i++)
4701*c83a76b0SSuyog Pawar {
4702*c83a76b0SSuyog Pawar ps_curr_out_enc_ent[i] = (frm_proc_ent_cod_ctxt_t *)ihevce_q_get_free_buff(
4703*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
4704*c83a76b0SSuyog Pawar IHEVCE_FRM_PRS_ENT_COD_Q + i, /*decides the buffer queue */
4705*c83a76b0SSuyog Pawar &out_buf_id_enc_ent[i],
4706*c83a76b0SSuyog Pawar BUFF_QUE_NON_BLOCKING_MODE);
4707*c83a76b0SSuyog Pawar if(NULL != ps_curr_out_enc_ent[i])
4708*c83a76b0SSuyog Pawar {
4709*c83a76b0SSuyog Pawar ps_curr_out_enc_ent[i]->i4_frm_proc_valid_flag = 0;
4710*c83a76b0SSuyog Pawar ps_curr_out_enc_ent[i]->i4_end_flag = 1;
4711*c83a76b0SSuyog Pawar /* set the output buffer as produced */
4712*c83a76b0SSuyog Pawar ihevce_q_set_buff_prod(
4713*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt, IHEVCE_FRM_PRS_ENT_COD_Q + i, out_buf_id_enc_ent[i]);
4714*c83a76b0SSuyog Pawar }
4715*c83a76b0SSuyog Pawar }
4716*c83a76b0SSuyog Pawar }
4717*c83a76b0SSuyog Pawar }
4718*c83a76b0SSuyog Pawar
4719*c83a76b0SSuyog Pawar /* The last thread coming out of Enc. Proc. */
4720*c83a76b0SSuyog Pawar /* Release all the Recon buffers the application might have queued in */
4721*c83a76b0SSuyog Pawar if((ps_enc_ctxt->s_multi_thrd.num_thrds_done ==
4722*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds) &&
4723*c83a76b0SSuyog Pawar (ps_enc_ctxt->ps_stat_prms->i4_save_recon != 0) &&
4724*c83a76b0SSuyog Pawar (ps_enc_ctxt->s_multi_thrd.i4_is_recon_free_done == 0))
4725*c83a76b0SSuyog Pawar {
4726*c83a76b0SSuyog Pawar WORD32 i4_bitrate_ctr;
4727*c83a76b0SSuyog Pawar
4728*c83a76b0SSuyog Pawar for(i4_bitrate_ctr = 0; i4_bitrate_ctr < i4_num_bitrates; i4_bitrate_ctr++)
4729*c83a76b0SSuyog Pawar {
4730*c83a76b0SSuyog Pawar WORD32 end_flag = 0;
4731*c83a76b0SSuyog Pawar while(0 == end_flag)
4732*c83a76b0SSuyog Pawar {
4733*c83a76b0SSuyog Pawar /*swaping of buf_id for 0th and reference bitrate location, as encoder
4734*c83a76b0SSuyog Pawar assumes always 0th loc for reference bitrate and app must receive in
4735*c83a76b0SSuyog Pawar the configured order*/
4736*c83a76b0SSuyog Pawar WORD32 i4_recon_buf_id = i4_bitrate_ctr;
4737*c83a76b0SSuyog Pawar if(i4_bitrate_ctr == 0)
4738*c83a76b0SSuyog Pawar {
4739*c83a76b0SSuyog Pawar i4_recon_buf_id = ps_enc_ctxt->i4_ref_mbr_id;
4740*c83a76b0SSuyog Pawar }
4741*c83a76b0SSuyog Pawar else if(i4_bitrate_ctr == ps_enc_ctxt->i4_ref_mbr_id)
4742*c83a76b0SSuyog Pawar {
4743*c83a76b0SSuyog Pawar i4_recon_buf_id = 0;
4744*c83a76b0SSuyog Pawar }
4745*c83a76b0SSuyog Pawar
4746*c83a76b0SSuyog Pawar /* ------- get free Recon buffer from Frame buffer que ---------- */
4747*c83a76b0SSuyog Pawar /* There is a separate queue for each bit-rate instnace. The recon
4748*c83a76b0SSuyog Pawar buffer is acquired from the corresponding queue based on the
4749*c83a76b0SSuyog Pawar bitrate instnace */
4750*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr] =
4751*c83a76b0SSuyog Pawar (iv_enc_recon_data_buffs_t *)ihevce_q_get_filled_buff(
4752*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
4753*c83a76b0SSuyog Pawar IHEVCE_RECON_DATA_Q + i4_recon_buf_id, /*decides the buffer queue */
4754*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd.recon_buf_id[i4_enc_frm_id][i4_bitrate_ctr],
4755*c83a76b0SSuyog Pawar BUFF_QUE_BLOCKING_MODE);
4756*c83a76b0SSuyog Pawar
4757*c83a76b0SSuyog Pawar /* Update the end_flag from application */
4758*c83a76b0SSuyog Pawar end_flag = ps_enc_ctxt->s_multi_thrd.ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr]
4759*c83a76b0SSuyog Pawar ->i4_is_last_buf;
4760*c83a76b0SSuyog Pawar
4761*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_end_flag =
4762*c83a76b0SSuyog Pawar 1;
4763*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_y_pixels =
4764*c83a76b0SSuyog Pawar 0;
4765*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr]->i4_uv_pixels =
4766*c83a76b0SSuyog Pawar 0;
4767*c83a76b0SSuyog Pawar
4768*c83a76b0SSuyog Pawar /* Call back to Apln. saying recon buffer is produced */
4769*c83a76b0SSuyog Pawar ps_hle_ctxt->ihevce_output_recon_fill_done(
4770*c83a76b0SSuyog Pawar ps_hle_ctxt->pv_recon_cb_handle,
4771*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.ps_recon_out[i4_enc_frm_id][i4_bitrate_ctr],
4772*c83a76b0SSuyog Pawar i4_recon_buf_id, /* br instance */
4773*c83a76b0SSuyog Pawar i4_resolution_id /* res_intance */);
4774*c83a76b0SSuyog Pawar
4775*c83a76b0SSuyog Pawar /* --- release the current recon buffer ---- */
4776*c83a76b0SSuyog Pawar ihevce_q_rel_buf(
4777*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
4778*c83a76b0SSuyog Pawar (IHEVCE_RECON_DATA_Q + i4_recon_buf_id),
4779*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.recon_buf_id[i4_enc_frm_id][i4_bitrate_ctr]);
4780*c83a76b0SSuyog Pawar }
4781*c83a76b0SSuyog Pawar }
4782*c83a76b0SSuyog Pawar /* Set the recon free done flag */
4783*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_is_recon_free_done = 1;
4784*c83a76b0SSuyog Pawar }
4785*c83a76b0SSuyog Pawar
4786*c83a76b0SSuyog Pawar /****** UnLock the critical section ******/
4787*c83a76b0SSuyog Pawar if(NULL != ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id])
4788*c83a76b0SSuyog Pawar {
4789*c83a76b0SSuyog Pawar WORD32 result;
4790*c83a76b0SSuyog Pawar result =
4791*c83a76b0SSuyog Pawar osal_mutex_unlock(ps_enc_ctxt->s_multi_thrd.apv_post_enc_mutex_handle[i4_enc_frm_id]);
4792*c83a76b0SSuyog Pawar
4793*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != result)
4794*c83a76b0SSuyog Pawar return 0;
4795*c83a76b0SSuyog Pawar }
4796*c83a76b0SSuyog Pawar
4797*c83a76b0SSuyog Pawar return (0);
4798*c83a76b0SSuyog Pawar }
4799*c83a76b0SSuyog Pawar
4800*c83a76b0SSuyog Pawar /*!
4801*c83a76b0SSuyog Pawar ******************************************************************************
4802*c83a76b0SSuyog Pawar * \if Function name : ihevce_set_pre_enc_prms \endif
4803*c83a76b0SSuyog Pawar *
4804*c83a76b0SSuyog Pawar * \brief
4805*c83a76b0SSuyog Pawar * Set CTB parameters
4806*c83a76b0SSuyog Pawar * Set ME params
4807*c83a76b0SSuyog Pawar * Set pps, sps, vps, vui params
4808*c83a76b0SSuyog Pawar * Do RC init
4809*c83a76b0SSuyog Pawar *
4810*c83a76b0SSuyog Pawar * \param[in] Encoder context pointer
4811*c83a76b0SSuyog Pawar *
4812*c83a76b0SSuyog Pawar * \return
4813*c83a76b0SSuyog Pawar * None
4814*c83a76b0SSuyog Pawar *
4815*c83a76b0SSuyog Pawar * \author
4816*c83a76b0SSuyog Pawar * Ittiam
4817*c83a76b0SSuyog Pawar *
4818*c83a76b0SSuyog Pawar *****************************************************************************
4819*c83a76b0SSuyog Pawar */
ihevce_set_pre_enc_prms(enc_ctxt_t * ps_enc_ctxt)4820*c83a76b0SSuyog Pawar void ihevce_set_pre_enc_prms(enc_ctxt_t *ps_enc_ctxt)
4821*c83a76b0SSuyog Pawar {
4822*c83a76b0SSuyog Pawar WORD32 i;
4823*c83a76b0SSuyog Pawar WORD32 i4_num_instance,
4824*c83a76b0SSuyog Pawar i4_resolution_id = ps_enc_ctxt->i4_resolution_id; //number of bit-rate instances
4825*c83a76b0SSuyog Pawar
4826*c83a76b0SSuyog Pawar i4_num_instance = ps_enc_ctxt->i4_num_bitrates;
4827*c83a76b0SSuyog Pawar
4828*c83a76b0SSuyog Pawar #if PIC_ALIGN_CTB_SIZE
4829*c83a76b0SSuyog Pawar
4830*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd =
4831*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_width +
4832*c83a76b0SSuyog Pawar SET_CTB_ALIGN(
4833*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_width,
4834*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size);
4835*c83a76b0SSuyog Pawar
4836*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_horz =
4837*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd / ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size;
4838*c83a76b0SSuyog Pawar
4839*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_ht =
4840*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_height +
4841*c83a76b0SSuyog Pawar SET_CTB_ALIGN(
4842*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_height,
4843*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size);
4844*c83a76b0SSuyog Pawar
4845*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_vert =
4846*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_ht / ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size;
4847*c83a76b0SSuyog Pawar #else // PIC_ALIGN_CTB_SIZE
4848*c83a76b0SSuyog Pawar /* Allign the frame width to min CU size */
4849*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd =
4850*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_width +
4851*c83a76b0SSuyog Pawar SET_CTB_ALIGN(
4852*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_width,
4853*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_min_cu_size);
4854*c83a76b0SSuyog Pawar
4855*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_horz =
4856*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd / ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size;
4857*c83a76b0SSuyog Pawar
4858*c83a76b0SSuyog Pawar if((ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd %
4859*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size) != 0)
4860*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_horz =
4861*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_horz + 1;
4862*c83a76b0SSuyog Pawar
4863*c83a76b0SSuyog Pawar /* Allign the frame hieght to min CU size */
4864*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_ht =
4865*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_height +
4866*c83a76b0SSuyog Pawar SET_CTB_ALIGN(
4867*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_height,
4868*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_min_cu_size);
4869*c83a76b0SSuyog Pawar
4870*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_vert =
4871*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_ht / ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size;
4872*c83a76b0SSuyog Pawar
4873*c83a76b0SSuyog Pawar if((ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_ht %
4874*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size) != 0)
4875*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_vert =
4876*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_vert + 1;
4877*c83a76b0SSuyog Pawar
4878*c83a76b0SSuyog Pawar #endif // PIC_ALIGN_CTB_SIZE
4879*c83a76b0SSuyog Pawar
4880*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_max_cus_in_row = ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_horz *
4881*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_cus_in_ctb;
4882*c83a76b0SSuyog Pawar
4883*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_max_pus_in_row = ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_horz *
4884*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_pus_in_ctb;
4885*c83a76b0SSuyog Pawar
4886*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_max_tus_in_row = ps_enc_ctxt->s_frm_ctb_prms.i4_num_ctbs_horz *
4887*c83a76b0SSuyog Pawar ps_enc_ctxt->s_frm_ctb_prms.i4_num_tus_in_ctb;
4888*c83a76b0SSuyog Pawar ihevce_coarse_me_set_resolution(
4889*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt,
4890*c83a76b0SSuyog Pawar 1,
4891*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd,
4892*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_ht);
4893*c83a76b0SSuyog Pawar
4894*c83a76b0SSuyog Pawar /*if Resolution need to be changed dynamically then needs to go to encode group */
4895*c83a76b0SSuyog Pawar ihevce_me_set_resolution(
4896*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_me_ctxt,
4897*c83a76b0SSuyog Pawar 1,
4898*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_wd,
4899*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms.i4_cu_aligned_pic_ht);
4900*c83a76b0SSuyog Pawar i4_num_instance = ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
4901*c83a76b0SSuyog Pawar .i4_num_bitrate_instances;
4902*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_instance; i++)
4903*c83a76b0SSuyog Pawar {
4904*c83a76b0SSuyog Pawar WORD32 i4_id;
4905*c83a76b0SSuyog Pawar /*swaping of buf_id for 0th and reference bitrate location, as encoder
4906*c83a76b0SSuyog Pawar assumes always 0th loc for reference bitrate and app must receive in
4907*c83a76b0SSuyog Pawar the configured order*/
4908*c83a76b0SSuyog Pawar if(i == 0)
4909*c83a76b0SSuyog Pawar {
4910*c83a76b0SSuyog Pawar i4_id = ps_enc_ctxt->i4_ref_mbr_id;
4911*c83a76b0SSuyog Pawar }
4912*c83a76b0SSuyog Pawar else if(i == ps_enc_ctxt->i4_ref_mbr_id)
4913*c83a76b0SSuyog Pawar {
4914*c83a76b0SSuyog Pawar i4_id = 0;
4915*c83a76b0SSuyog Pawar }
4916*c83a76b0SSuyog Pawar else
4917*c83a76b0SSuyog Pawar {
4918*c83a76b0SSuyog Pawar i4_id = i;
4919*c83a76b0SSuyog Pawar }
4920*c83a76b0SSuyog Pawar /* populate vps based on encoder configuration and tools */
4921*c83a76b0SSuyog Pawar ihevce_populate_vps(
4922*c83a76b0SSuyog Pawar ps_enc_ctxt,
4923*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_vps[i],
4924*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_src_prms,
4925*c83a76b0SSuyog Pawar &ps_enc_ctxt->ps_stat_prms->s_out_strm_prms,
4926*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_coding_prms,
4927*c83a76b0SSuyog Pawar &ps_enc_ctxt->ps_stat_prms->s_config_prms,
4928*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms,
4929*c83a76b0SSuyog Pawar i4_resolution_id);
4930*c83a76b0SSuyog Pawar
4931*c83a76b0SSuyog Pawar /* populate sps based on encoder configuration and tools */
4932*c83a76b0SSuyog Pawar ihevce_populate_sps(
4933*c83a76b0SSuyog Pawar ps_enc_ctxt,
4934*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_sps[i],
4935*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_vps[i],
4936*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_src_prms,
4937*c83a76b0SSuyog Pawar &ps_enc_ctxt->ps_stat_prms->s_out_strm_prms,
4938*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_coding_prms,
4939*c83a76b0SSuyog Pawar &ps_enc_ctxt->ps_stat_prms->s_config_prms,
4940*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms,
4941*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms,
4942*c83a76b0SSuyog Pawar i4_resolution_id);
4943*c83a76b0SSuyog Pawar
4944*c83a76b0SSuyog Pawar /* populate pps based on encoder configuration and tools */
4945*c83a76b0SSuyog Pawar ihevce_populate_pps(
4946*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_pps[i],
4947*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_sps[i],
4948*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_src_prms,
4949*c83a76b0SSuyog Pawar &ps_enc_ctxt->ps_stat_prms->s_out_strm_prms,
4950*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_coding_prms,
4951*c83a76b0SSuyog Pawar &ps_enc_ctxt->ps_stat_prms->s_config_prms,
4952*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms,
4953*c83a76b0SSuyog Pawar i4_id,
4954*c83a76b0SSuyog Pawar i4_resolution_id,
4955*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_tile_params_base,
4956*c83a76b0SSuyog Pawar &ps_enc_ctxt->ai4_column_width_array[0],
4957*c83a76b0SSuyog Pawar &ps_enc_ctxt->ai4_row_height_array[0]);
4958*c83a76b0SSuyog Pawar
4959*c83a76b0SSuyog Pawar // if(ps_enc_ctxt->as_sps[i].i1_vui_parameters_present_flag == 1)
4960*c83a76b0SSuyog Pawar {
4961*c83a76b0SSuyog Pawar WORD32 error_code = ihevce_populate_vui(
4962*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_sps[i].s_vui_parameters,
4963*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_sps[i],
4964*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_src_prms,
4965*c83a76b0SSuyog Pawar &ps_enc_ctxt->ps_stat_prms->s_vui_sei_prms,
4966*c83a76b0SSuyog Pawar i4_resolution_id,
4967*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_tgt_params,
4968*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms,
4969*c83a76b0SSuyog Pawar i4_id);
4970*c83a76b0SSuyog Pawar if (error_code)
4971*c83a76b0SSuyog Pawar {
4972*c83a76b0SSuyog Pawar ((ihevce_hle_ctxt_t *)ps_enc_ctxt->pv_hle_ctxt)->i4_error_code = error_code;
4973*c83a76b0SSuyog Pawar return;
4974*c83a76b0SSuyog Pawar }
4975*c83a76b0SSuyog Pawar }
4976*c83a76b0SSuyog Pawar }
4977*c83a76b0SSuyog Pawar
4978*c83a76b0SSuyog Pawar osal_mutex_lock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
4979*c83a76b0SSuyog Pawar /* run the loop over all bit-rate instnaces */
4980*c83a76b0SSuyog Pawar for(i = 0; i < i4_num_instance; i++)
4981*c83a76b0SSuyog Pawar {
4982*c83a76b0SSuyog Pawar /*HEVC_RC Do one time initialization of rate control*/
4983*c83a76b0SSuyog Pawar ihevce_rc_init(
4984*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i],
4985*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_src_prms,
4986*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_tgt_params,
4987*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_rc_quant,
4988*c83a76b0SSuyog Pawar &ps_enc_ctxt->ps_stat_prms->s_sys_api,
4989*c83a76b0SSuyog Pawar &ps_enc_ctxt->ps_stat_prms->s_lap_prms,
4990*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc);
4991*c83a76b0SSuyog Pawar
4992*c83a76b0SSuyog Pawar ihevce_vbv_complaince_init_level(
4993*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i],
4994*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_sps[i].s_vui_parameters);
4995*c83a76b0SSuyog Pawar }
4996*c83a76b0SSuyog Pawar osal_mutex_unlock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
4997*c83a76b0SSuyog Pawar }
4998*c83a76b0SSuyog Pawar
4999*c83a76b0SSuyog Pawar /*!
5000*c83a76b0SSuyog Pawar ******************************************************************************
5001*c83a76b0SSuyog Pawar * \if Function name : ihevce_pre_enc_init \endif
5002*c83a76b0SSuyog Pawar *
5003*c83a76b0SSuyog Pawar * \brief
5004*c83a76b0SSuyog Pawar * set out_buf params
5005*c83a76b0SSuyog Pawar * Calculate end_flag if flushmode on
5006*c83a76b0SSuyog Pawar * Slice initialization
5007*c83a76b0SSuyog Pawar * Populate SIE params
5008*c83a76b0SSuyog Pawar * reference list creation
5009*c83a76b0SSuyog Pawar *
5010*c83a76b0SSuyog Pawar * \param[in] Encoder context pointer
5011*c83a76b0SSuyog Pawar *
5012*c83a76b0SSuyog Pawar * \return
5013*c83a76b0SSuyog Pawar * None
5014*c83a76b0SSuyog Pawar *
5015*c83a76b0SSuyog Pawar * \author
5016*c83a76b0SSuyog Pawar * Ittiam
5017*c83a76b0SSuyog Pawar *
5018*c83a76b0SSuyog Pawar *****************************************************************************
5019*c83a76b0SSuyog Pawar */
ihevce_pre_enc_init(enc_ctxt_t * ps_enc_ctxt,ihevce_lap_enc_buf_t * ps_curr_inp,pre_enc_me_ctxt_t * ps_curr_out,WORD32 * pi4_end_flag_ret,WORD32 * pi4_cur_qp_ret,WORD32 * pi4_decomp_lyr_idx,WORD32 i4_ping_pong)5020*c83a76b0SSuyog Pawar void ihevce_pre_enc_init(
5021*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt,
5022*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp,
5023*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_out,
5024*c83a76b0SSuyog Pawar WORD32 *pi4_end_flag_ret,
5025*c83a76b0SSuyog Pawar WORD32 *pi4_cur_qp_ret,
5026*c83a76b0SSuyog Pawar WORD32 *pi4_decomp_lyr_idx,
5027*c83a76b0SSuyog Pawar WORD32 i4_ping_pong)
5028*c83a76b0SSuyog Pawar {
5029*c83a76b0SSuyog Pawar WORD32 end_flag = 0;
5030*c83a76b0SSuyog Pawar WORD32 cur_qp;
5031*c83a76b0SSuyog Pawar //recon_pic_buf_t *ps_frm_recon;
5032*c83a76b0SSuyog Pawar WORD32 first_field = 1;
5033*c83a76b0SSuyog Pawar WORD32 i4_field_pic = ps_enc_ctxt->s_runtime_src_prms.i4_field_pic;
5034*c83a76b0SSuyog Pawar WORD32 i4_decomp_lyrs_idx = 0;
5035*c83a76b0SSuyog Pawar WORD32 i4_resolution_id = ps_enc_ctxt->i4_resolution_id;
5036*c83a76b0SSuyog Pawar WORD32 slice_type = ISLICE;
5037*c83a76b0SSuyog Pawar WORD32 nal_type;
5038*c83a76b0SSuyog Pawar WORD32 min_cu_size;
5039*c83a76b0SSuyog Pawar
5040*c83a76b0SSuyog Pawar WORD32 stasino_enabled;
5041*c83a76b0SSuyog Pawar
5042*c83a76b0SSuyog Pawar /* copy the time stamps from inp to entropy inp */
5043*c83a76b0SSuyog Pawar ps_curr_out->i4_inp_timestamp_low = ps_curr_inp->s_input_buf.i4_inp_timestamp_low;
5044*c83a76b0SSuyog Pawar ps_curr_out->i4_inp_timestamp_high = ps_curr_inp->s_input_buf.i4_inp_timestamp_high;
5045*c83a76b0SSuyog Pawar ps_curr_out->pv_app_frm_ctxt = ps_curr_inp->s_input_buf.pv_app_frm_ctxt;
5046*c83a76b0SSuyog Pawar
5047*c83a76b0SSuyog Pawar /* get the min cu size from config params */
5048*c83a76b0SSuyog Pawar min_cu_size = ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_min_log2_cu_size;
5049*c83a76b0SSuyog Pawar
5050*c83a76b0SSuyog Pawar min_cu_size = 1 << min_cu_size;
5051*c83a76b0SSuyog Pawar
5052*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd =
5053*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd +
5054*c83a76b0SSuyog Pawar SET_CTB_ALIGN(ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd, min_cu_size);
5055*c83a76b0SSuyog Pawar
5056*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht =
5057*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht +
5058*c83a76b0SSuyog Pawar SET_CTB_ALIGN(ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht, min_cu_size);
5059*c83a76b0SSuyog Pawar
5060*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_wd =
5061*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_wd +
5062*c83a76b0SSuyog Pawar SET_CTB_ALIGN(ps_curr_inp->s_lap_out.s_input_buf.i4_uv_wd, min_cu_size);
5063*c83a76b0SSuyog Pawar
5064*c83a76b0SSuyog Pawar if(IV_YUV_420SP_UV == ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format)
5065*c83a76b0SSuyog Pawar {
5066*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht =
5067*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht +
5068*c83a76b0SSuyog Pawar SET_CTB_ALIGN(ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht, (min_cu_size >> 1));
5069*c83a76b0SSuyog Pawar }
5070*c83a76b0SSuyog Pawar else if(IV_YUV_422SP_UV == ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format)
5071*c83a76b0SSuyog Pawar {
5072*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht =
5073*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht +
5074*c83a76b0SSuyog Pawar SET_CTB_ALIGN(ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht, min_cu_size);
5075*c83a76b0SSuyog Pawar }
5076*c83a76b0SSuyog Pawar
5077*c83a76b0SSuyog Pawar /* update the END flag from LAP out */
5078*c83a76b0SSuyog Pawar end_flag = ps_curr_inp->s_lap_out.i4_end_flag;
5079*c83a76b0SSuyog Pawar ps_curr_out->i4_end_flag = end_flag;
5080*c83a76b0SSuyog Pawar ps_enc_ctxt->s_multi_thrd.i4_last_pic_flag = end_flag;
5081*c83a76b0SSuyog Pawar
5082*c83a76b0SSuyog Pawar /* ----------------------------------------------------------------------*/
5083*c83a76b0SSuyog Pawar /* Slice initialization for current frame; Required for entropy context */
5084*c83a76b0SSuyog Pawar /* ----------------------------------------------------------------------*/
5085*c83a76b0SSuyog Pawar {
5086*c83a76b0SSuyog Pawar WORD32 cur_poc = ps_curr_inp->s_lap_out.i4_poc;
5087*c83a76b0SSuyog Pawar
5088*c83a76b0SSuyog Pawar /* max merge candidates derived based on quality preset for now */
5089*c83a76b0SSuyog Pawar WORD32 max_merge_candidates = 2;
5090*c83a76b0SSuyog Pawar
5091*c83a76b0SSuyog Pawar /* pocs less than random acess poc tagged for discard as they */
5092*c83a76b0SSuyog Pawar /* could be refering to pics before the cra. */
5093*c83a76b0SSuyog Pawar
5094*c83a76b0SSuyog Pawar /* CRA case: as the leading pictures can refer the picture precedes the associated
5095*c83a76b0SSuyog Pawar IRAP(CRA) in decoding order, hence make it Random access skipped leading pictures (RASL)*/
5096*c83a76b0SSuyog Pawar
5097*c83a76b0SSuyog Pawar if((1 == ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_enable_temporal_scalability) &&
5098*c83a76b0SSuyog Pawar (ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_temporal_layers ==
5099*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_temporal_lyr_id)) //TEMPORALA_SCALABILITY CHANGES
5100*c83a76b0SSuyog Pawar {
5101*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_assoc_IRAP_poc)
5102*c83a76b0SSuyog Pawar {
5103*c83a76b0SSuyog Pawar nal_type = (cur_poc < ps_curr_inp->s_lap_out.i4_assoc_IRAP_poc)
5104*c83a76b0SSuyog Pawar ? (ps_curr_inp->s_lap_out.i4_is_ref_pic ? NAL_RASL_R : NAL_RASL_N)
5105*c83a76b0SSuyog Pawar : (ps_curr_inp->s_lap_out.i4_is_ref_pic ? NAL_TSA_R : NAL_TSA_N);
5106*c83a76b0SSuyog Pawar }
5107*c83a76b0SSuyog Pawar /* IDR case: as the leading pictures can't refer the picture precedes the associated
5108*c83a76b0SSuyog Pawar IRAP(IDR) in decoding order, hence make it Random access decodable leading pictures (RADL)*/
5109*c83a76b0SSuyog Pawar else
5110*c83a76b0SSuyog Pawar {
5111*c83a76b0SSuyog Pawar nal_type = (cur_poc < ps_curr_inp->s_lap_out.i4_assoc_IRAP_poc)
5112*c83a76b0SSuyog Pawar ? (ps_curr_inp->s_lap_out.i4_is_ref_pic ? NAL_RADL_R : NAL_RADL_N)
5113*c83a76b0SSuyog Pawar : (ps_curr_inp->s_lap_out.i4_is_ref_pic ? NAL_TSA_R : NAL_TSA_N);
5114*c83a76b0SSuyog Pawar }
5115*c83a76b0SSuyog Pawar }
5116*c83a76b0SSuyog Pawar else
5117*c83a76b0SSuyog Pawar {
5118*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_assoc_IRAP_poc)
5119*c83a76b0SSuyog Pawar {
5120*c83a76b0SSuyog Pawar nal_type = (cur_poc < ps_curr_inp->s_lap_out.i4_assoc_IRAP_poc)
5121*c83a76b0SSuyog Pawar ? (ps_curr_inp->s_lap_out.i4_is_ref_pic ? NAL_RASL_R : NAL_RASL_N)
5122*c83a76b0SSuyog Pawar : (ps_curr_inp->s_lap_out.i4_is_ref_pic ? NAL_TRAIL_R : NAL_TRAIL_N);
5123*c83a76b0SSuyog Pawar }
5124*c83a76b0SSuyog Pawar /* IDR case: as the leading pictures can't refer the picture precedes the associated
5125*c83a76b0SSuyog Pawar IRAP(IDR) in decoding order, hence make it Random access decodable leading pictures (RADL)*/
5126*c83a76b0SSuyog Pawar else
5127*c83a76b0SSuyog Pawar {
5128*c83a76b0SSuyog Pawar nal_type = (cur_poc < ps_curr_inp->s_lap_out.i4_assoc_IRAP_poc)
5129*c83a76b0SSuyog Pawar ? (ps_curr_inp->s_lap_out.i4_is_ref_pic ? NAL_RADL_R : NAL_RADL_N)
5130*c83a76b0SSuyog Pawar : (ps_curr_inp->s_lap_out.i4_is_ref_pic ? NAL_TRAIL_R : NAL_TRAIL_N);
5131*c83a76b0SSuyog Pawar }
5132*c83a76b0SSuyog Pawar }
5133*c83a76b0SSuyog Pawar
5134*c83a76b0SSuyog Pawar switch(ps_curr_inp->s_lap_out.i4_pic_type)
5135*c83a76b0SSuyog Pawar {
5136*c83a76b0SSuyog Pawar case IV_IDR_FRAME:
5137*c83a76b0SSuyog Pawar /* IDR pic */
5138*c83a76b0SSuyog Pawar slice_type = ISLICE;
5139*c83a76b0SSuyog Pawar nal_type = NAL_IDR_W_LP;
5140*c83a76b0SSuyog Pawar cur_poc = 0;
5141*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_cra_poc = cur_poc;
5142*c83a76b0SSuyog Pawar break;
5143*c83a76b0SSuyog Pawar
5144*c83a76b0SSuyog Pawar case IV_I_FRAME:
5145*c83a76b0SSuyog Pawar slice_type = ISLICE;
5146*c83a76b0SSuyog Pawar
5147*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_is_cra_pic)
5148*c83a76b0SSuyog Pawar {
5149*c83a76b0SSuyog Pawar nal_type = NAL_CRA;
5150*c83a76b0SSuyog Pawar }
5151*c83a76b0SSuyog Pawar
5152*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_cra_poc = cur_poc;
5153*c83a76b0SSuyog Pawar break;
5154*c83a76b0SSuyog Pawar
5155*c83a76b0SSuyog Pawar case IV_P_FRAME:
5156*c83a76b0SSuyog Pawar slice_type = PSLICE;
5157*c83a76b0SSuyog Pawar break;
5158*c83a76b0SSuyog Pawar
5159*c83a76b0SSuyog Pawar case IV_B_FRAME:
5160*c83a76b0SSuyog Pawar /* TODO : Mark the nal type as NAL_TRAIL_N for non ref pics */
5161*c83a76b0SSuyog Pawar slice_type = BSLICE;
5162*c83a76b0SSuyog Pawar break;
5163*c83a76b0SSuyog Pawar
5164*c83a76b0SSuyog Pawar default:
5165*c83a76b0SSuyog Pawar /* This should never occur */
5166*c83a76b0SSuyog Pawar ASSERT(0);
5167*c83a76b0SSuyog Pawar }
5168*c83a76b0SSuyog Pawar
5169*c83a76b0SSuyog Pawar /* number of merge candidates and error metric chosen based on quality preset */
5170*c83a76b0SSuyog Pawar switch(ps_curr_inp->s_lap_out.i4_quality_preset)
5171*c83a76b0SSuyog Pawar {
5172*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P0:
5173*c83a76b0SSuyog Pawar max_merge_candidates = 5;
5174*c83a76b0SSuyog Pawar break;
5175*c83a76b0SSuyog Pawar
5176*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P2:
5177*c83a76b0SSuyog Pawar max_merge_candidates = 5;
5178*c83a76b0SSuyog Pawar break;
5179*c83a76b0SSuyog Pawar
5180*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P3:
5181*c83a76b0SSuyog Pawar max_merge_candidates = 3;
5182*c83a76b0SSuyog Pawar break;
5183*c83a76b0SSuyog Pawar
5184*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P4:
5185*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P5:
5186*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P6:
5187*c83a76b0SSuyog Pawar case IHEVCE_QUALITY_P7:
5188*c83a76b0SSuyog Pawar max_merge_candidates = 2;
5189*c83a76b0SSuyog Pawar break;
5190*c83a76b0SSuyog Pawar
5191*c83a76b0SSuyog Pawar default:
5192*c83a76b0SSuyog Pawar ASSERT(0);
5193*c83a76b0SSuyog Pawar }
5194*c83a76b0SSuyog Pawar
5195*c83a76b0SSuyog Pawar /* acquire mutex lock for rate control calls */
5196*c83a76b0SSuyog Pawar osal_mutex_lock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
5197*c83a76b0SSuyog Pawar {
5198*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i4_num_pels_in_frame_considered =
5199*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht *
5200*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd;
5201*c83a76b0SSuyog Pawar
5202*c83a76b0SSuyog Pawar /*initialize the frame info stat inside LAP out, Data inside this will be populated in ihevce_rc_get_bpp_based_frame_qp call*/
5203*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ps_frame_info = &ps_curr_inp->s_frame_info;
5204*c83a76b0SSuyog Pawar
5205*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i4_is_bottom_field = ps_curr_inp->s_input_buf.i4_bottom_field;
5206*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_rate_control_mode == 3)
5207*c83a76b0SSuyog Pawar {
5208*c83a76b0SSuyog Pawar /*for constant qp use same qp*/
5209*c83a76b0SSuyog Pawar /*HEVC_RC query rate control for qp*/
5210*c83a76b0SSuyog Pawar cur_qp = ihevce_rc_pre_enc_qp_query(
5211*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0],
5212*c83a76b0SSuyog Pawar &ps_curr_inp->s_rc_lap_out,
5213*c83a76b0SSuyog Pawar 0);
5214*c83a76b0SSuyog Pawar }
5215*c83a76b0SSuyog Pawar else
5216*c83a76b0SSuyog Pawar {
5217*c83a76b0SSuyog Pawar cur_qp = ihevce_rc_get_bpp_based_frame_qp(
5218*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0], &ps_curr_inp->s_rc_lap_out);
5219*c83a76b0SSuyog Pawar }
5220*c83a76b0SSuyog Pawar }
5221*c83a76b0SSuyog Pawar /* release mutex lock after rate control calls */
5222*c83a76b0SSuyog Pawar osal_mutex_unlock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
5223*c83a76b0SSuyog Pawar
5224*c83a76b0SSuyog Pawar /* store the QP in output prms */
5225*c83a76b0SSuyog Pawar /* The same qp is also used in enc thread only for ME*/
5226*c83a76b0SSuyog Pawar ps_curr_out->i4_curr_frm_qp = cur_qp;
5227*c83a76b0SSuyog Pawar
5228*c83a76b0SSuyog Pawar /* slice header entropy syn memory is not valid in pre encode stage */
5229*c83a76b0SSuyog Pawar ps_curr_out->s_slice_hdr.pu4_entry_point_offset = NULL;
5230*c83a76b0SSuyog Pawar
5231*c83a76b0SSuyog Pawar /* derive the flag which indicates if stasino is enabled */
5232*c83a76b0SSuyog Pawar stasino_enabled = (ps_enc_ctxt->s_runtime_coding_prms.i4_vqet &
5233*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_NOISE_PRESERVATION)) &&
5234*c83a76b0SSuyog Pawar (ps_enc_ctxt->s_runtime_coding_prms.i4_vqet &
5235*c83a76b0SSuyog Pawar (1 << BITPOS_IN_VQ_TOGGLE_FOR_CONTROL_TOGGLER));
5236*c83a76b0SSuyog Pawar
5237*c83a76b0SSuyog Pawar /* initialize the slice header */
5238*c83a76b0SSuyog Pawar ihevce_populate_slice_header(
5239*c83a76b0SSuyog Pawar &ps_curr_out->s_slice_hdr,
5240*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_pps[0],
5241*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_sps[0],
5242*c83a76b0SSuyog Pawar nal_type,
5243*c83a76b0SSuyog Pawar slice_type,
5244*c83a76b0SSuyog Pawar 0,
5245*c83a76b0SSuyog Pawar 0,
5246*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_poc,
5247*c83a76b0SSuyog Pawar cur_qp,
5248*c83a76b0SSuyog Pawar max_merge_candidates,
5249*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_pass_prms.i4_pass,
5250*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
5251*c83a76b0SSuyog Pawar .i4_quality_preset,
5252*c83a76b0SSuyog Pawar stasino_enabled);
5253*c83a76b0SSuyog Pawar
5254*c83a76b0SSuyog Pawar ps_curr_out->i4_slice_nal_type = nal_type;
5255*c83a76b0SSuyog Pawar
5256*c83a76b0SSuyog Pawar ps_curr_out->s_slice_hdr.u4_nuh_temporal_id = 0;
5257*c83a76b0SSuyog Pawar
5258*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_enable_temporal_scalability)
5259*c83a76b0SSuyog Pawar {
5260*c83a76b0SSuyog Pawar ps_curr_out->s_slice_hdr.u4_nuh_temporal_id =
5261*c83a76b0SSuyog Pawar (ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_temporal_layers ==
5262*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_temporal_lyr_id); //TEMPORALA_SCALABILITY CHANGES
5263*c83a76b0SSuyog Pawar }
5264*c83a76b0SSuyog Pawar
5265*c83a76b0SSuyog Pawar /* populate sps, vps and pps pointers for the entropy input params */
5266*c83a76b0SSuyog Pawar ps_curr_out->ps_pps = &ps_enc_ctxt->as_pps[0];
5267*c83a76b0SSuyog Pawar ps_curr_out->ps_sps = &ps_enc_ctxt->as_sps[0];
5268*c83a76b0SSuyog Pawar ps_curr_out->ps_vps = &ps_enc_ctxt->as_vps[0];
5269*c83a76b0SSuyog Pawar }
5270*c83a76b0SSuyog Pawar
5271*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
5272*c83a76b0SSuyog Pawar /* By default, Sei messages are set to 0, to avoid unintialised memory access */
5273*c83a76b0SSuyog Pawar memset(&ps_curr_out->s_sei, 0, sizeof(sei_params_t));
5274*c83a76b0SSuyog Pawar
5275*c83a76b0SSuyog Pawar /* VUI, SEI flags reset */
5276*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i1_sei_parameters_present_flag = 0;
5277*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i1_buf_period_params_present_flag = 0;
5278*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i1_pic_timing_params_present_flag = 0;
5279*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i1_recovery_point_params_present_flag = 0;
5280*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i1_decoded_pic_hash_sei_flag = 0;
5281*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i4_sei_mastering_disp_colour_vol_params_present_flags = 0;
5282*c83a76b0SSuyog Pawar
5283*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_sei_enable_flag == 1)
5284*c83a76b0SSuyog Pawar {
5285*c83a76b0SSuyog Pawar /* insert buffering period, display volume, recovery point only at irap points */
5286*c83a76b0SSuyog Pawar WORD32 insert_per_irap =
5287*c83a76b0SSuyog Pawar ((slice_type == ISLICE) &&
5288*c83a76b0SSuyog Pawar (((NAL_IDR_N_LP == nal_type) || (NAL_CRA == nal_type)) || (NAL_IDR_W_LP == nal_type)));
5289*c83a76b0SSuyog Pawar
5290*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i1_sei_parameters_present_flag = 1;
5291*c83a76b0SSuyog Pawar
5292*c83a76b0SSuyog Pawar /* populate Sei buffering period based on encoder configuration and tools */
5293*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_sei_buffer_period_flags == 1)
5294*c83a76b0SSuyog Pawar {
5295*c83a76b0SSuyog Pawar ihevce_populate_buffering_period_sei(
5296*c83a76b0SSuyog Pawar &ps_curr_out->s_sei,
5297*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_sps[0].s_vui_parameters,
5298*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_sps[0],
5299*c83a76b0SSuyog Pawar &ps_enc_ctxt->ps_stat_prms->s_vui_sei_prms);
5300*c83a76b0SSuyog Pawar
5301*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i1_buf_period_params_present_flag = insert_per_irap;
5302*c83a76b0SSuyog Pawar
5303*c83a76b0SSuyog Pawar ihevce_populate_active_parameter_set_sei(
5304*c83a76b0SSuyog Pawar &ps_curr_out->s_sei, &ps_enc_ctxt->as_vps[0], &ps_enc_ctxt->as_sps[0]);
5305*c83a76b0SSuyog Pawar }
5306*c83a76b0SSuyog Pawar
5307*c83a76b0SSuyog Pawar /* populate Sei picture timing based on encoder configuration and tools */
5308*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_sei_pic_timing_flags == 1)
5309*c83a76b0SSuyog Pawar {
5310*c83a76b0SSuyog Pawar ihevce_populate_picture_timing_sei(
5311*c83a76b0SSuyog Pawar &ps_curr_out->s_sei,
5312*c83a76b0SSuyog Pawar &ps_enc_ctxt->as_sps[0].s_vui_parameters,
5313*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_runtime_src_prms,
5314*c83a76b0SSuyog Pawar ps_curr_inp->s_input_buf.i4_bottom_field);
5315*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i1_pic_timing_params_present_flag = 1;
5316*c83a76b0SSuyog Pawar }
5317*c83a76b0SSuyog Pawar
5318*c83a76b0SSuyog Pawar /* populate Sei recovery point based on encoder configuration and tools */
5319*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_sei_recovery_point_flags == 1)
5320*c83a76b0SSuyog Pawar {
5321*c83a76b0SSuyog Pawar ihevce_populate_recovery_point_sei(
5322*c83a76b0SSuyog Pawar &ps_curr_out->s_sei, &ps_enc_ctxt->ps_stat_prms->s_vui_sei_prms);
5323*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i1_recovery_point_params_present_flag = insert_per_irap;
5324*c83a76b0SSuyog Pawar }
5325*c83a76b0SSuyog Pawar
5326*c83a76b0SSuyog Pawar /* populate mastering_display_colour_volume parameters */
5327*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_sei_mastering_disp_colour_vol_flags == 1)
5328*c83a76b0SSuyog Pawar {
5329*c83a76b0SSuyog Pawar ihevce_populate_mastering_disp_col_vol_sei(
5330*c83a76b0SSuyog Pawar &ps_curr_out->s_sei, &ps_enc_ctxt->ps_stat_prms->s_out_strm_prms);
5331*c83a76b0SSuyog Pawar
5332*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i4_sei_mastering_disp_colour_vol_params_present_flags =
5333*c83a76b0SSuyog Pawar insert_per_irap;
5334*c83a76b0SSuyog Pawar }
5335*c83a76b0SSuyog Pawar
5336*c83a76b0SSuyog Pawar /* populate SEI Hash Flag based on encoder configuration */
5337*c83a76b0SSuyog Pawar if(0 != ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_decoded_pic_hash_sei_flag)
5338*c83a76b0SSuyog Pawar {
5339*c83a76b0SSuyog Pawar /* Sanity checks */
5340*c83a76b0SSuyog Pawar ASSERT(0 != ps_enc_ctxt->as_sps[0].i1_chroma_format_idc);
5341*c83a76b0SSuyog Pawar
5342*c83a76b0SSuyog Pawar ASSERT(
5343*c83a76b0SSuyog Pawar (0 < ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_decoded_pic_hash_sei_flag) &&
5344*c83a76b0SSuyog Pawar (4 > ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_decoded_pic_hash_sei_flag));
5345*c83a76b0SSuyog Pawar
5346*c83a76b0SSuyog Pawar /* MD5 is not supported now! picture_md5[cIdx][i] pblm */
5347*c83a76b0SSuyog Pawar ASSERT(1 != ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_decoded_pic_hash_sei_flag);
5348*c83a76b0SSuyog Pawar
5349*c83a76b0SSuyog Pawar ps_curr_out->s_sei.i1_decoded_pic_hash_sei_flag =
5350*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_out_strm_prms.i4_decoded_pic_hash_sei_flag;
5351*c83a76b0SSuyog Pawar }
5352*c83a76b0SSuyog Pawar }
5353*c83a76b0SSuyog Pawar #endif
5354*c83a76b0SSuyog Pawar
5355*c83a76b0SSuyog Pawar /* For interlace pictures, first_field depends on topfield_first and bottom field */
5356*c83a76b0SSuyog Pawar if(i4_field_pic)
5357*c83a76b0SSuyog Pawar {
5358*c83a76b0SSuyog Pawar first_field =
5359*c83a76b0SSuyog Pawar (ps_curr_inp->s_input_buf.i4_topfield_first ^ ps_curr_inp->s_input_buf.i4_bottom_field);
5360*c83a76b0SSuyog Pawar }
5361*c83a76b0SSuyog Pawar
5362*c83a76b0SSuyog Pawar /* get frame level lambda params */
5363*c83a76b0SSuyog Pawar ihevce_get_frame_lambda_prms(
5364*c83a76b0SSuyog Pawar ps_enc_ctxt,
5365*c83a76b0SSuyog Pawar ps_curr_out,
5366*c83a76b0SSuyog Pawar cur_qp,
5367*c83a76b0SSuyog Pawar first_field,
5368*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_is_ref_pic,
5369*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_temporal_lyr_id,
5370*c83a76b0SSuyog Pawar lamda_modifier_for_I_pic[4] /*mean TRF*/,
5371*c83a76b0SSuyog Pawar 0,
5372*c83a76b0SSuyog Pawar PRE_ENC_LAMBDA_TYPE);
5373*c83a76b0SSuyog Pawar /* Coarse ME and Decomp buffers sharing */
5374*c83a76b0SSuyog Pawar {
5375*c83a76b0SSuyog Pawar UWORD8 *apu1_lyr_bufs[MAX_NUM_HME_LAYERS];
5376*c83a76b0SSuyog Pawar WORD32 ai4_lyr_buf_strd[MAX_NUM_HME_LAYERS];
5377*c83a76b0SSuyog Pawar
5378*c83a76b0SSuyog Pawar /* get the Decomposition frame buffer from ME */
5379*c83a76b0SSuyog Pawar i4_decomp_lyrs_idx = ihevce_coarse_me_get_lyr_buf_desc(
5380*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt, &apu1_lyr_bufs[0], &ai4_lyr_buf_strd[0]);
5381*c83a76b0SSuyog Pawar /* register the buffers with decomp module along with frame init */
5382*c83a76b0SSuyog Pawar ihevce_decomp_pre_intra_frame_init(
5383*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_decomp_pre_intra_ctxt,
5384*c83a76b0SSuyog Pawar &apu1_lyr_bufs[0],
5385*c83a76b0SSuyog Pawar &ai4_lyr_buf_strd[0],
5386*c83a76b0SSuyog Pawar ps_curr_out->ps_layer1_buf,
5387*c83a76b0SSuyog Pawar ps_curr_out->ps_layer2_buf,
5388*c83a76b0SSuyog Pawar ps_curr_out->ps_ed_ctb_l1,
5389*c83a76b0SSuyog Pawar ps_curr_out->as_lambda_prms[0].i4_ol_sad_lambda_qf,
5390*c83a76b0SSuyog Pawar ps_curr_out->ps_ctb_analyse);
5391*c83a76b0SSuyog Pawar }
5392*c83a76b0SSuyog Pawar
5393*c83a76b0SSuyog Pawar /* -------------------------------------------------------- */
5394*c83a76b0SSuyog Pawar /* Preparing Pre encode Passes Job Queue */
5395*c83a76b0SSuyog Pawar /* -------------------------------------------------------- */
5396*c83a76b0SSuyog Pawar ihevce_prepare_pre_enc_job_queue(ps_enc_ctxt, ps_curr_inp, i4_ping_pong);
5397*c83a76b0SSuyog Pawar
5398*c83a76b0SSuyog Pawar /*assign return variables */
5399*c83a76b0SSuyog Pawar *pi4_end_flag_ret = end_flag;
5400*c83a76b0SSuyog Pawar *pi4_cur_qp_ret = cur_qp;
5401*c83a76b0SSuyog Pawar *pi4_decomp_lyr_idx = i4_decomp_lyrs_idx;
5402*c83a76b0SSuyog Pawar //*pps_frm_recon_ret = ps_frm_recon;
5403*c83a76b0SSuyog Pawar }
5404*c83a76b0SSuyog Pawar
5405*c83a76b0SSuyog Pawar /*!
5406*c83a76b0SSuyog Pawar ******************************************************************************
5407*c83a76b0SSuyog Pawar * \if Function name : ihevce_pre_enc_coarse_me_init \endif
5408*c83a76b0SSuyog Pawar *
5409*c83a76b0SSuyog Pawar * \brief
5410*c83a76b0SSuyog Pawar * set out_buf params
5411*c83a76b0SSuyog Pawar * Calculate end_flag if flushmode on
5412*c83a76b0SSuyog Pawar * Slice initialization
5413*c83a76b0SSuyog Pawar * Populate SIE params
5414*c83a76b0SSuyog Pawar * reference list creation
5415*c83a76b0SSuyog Pawar *
5416*c83a76b0SSuyog Pawar * \param[in] Encoder context pointer
5417*c83a76b0SSuyog Pawar *
5418*c83a76b0SSuyog Pawar * \return
5419*c83a76b0SSuyog Pawar * None
5420*c83a76b0SSuyog Pawar *
5421*c83a76b0SSuyog Pawar * \author
5422*c83a76b0SSuyog Pawar * Ittiam
5423*c83a76b0SSuyog Pawar *
5424*c83a76b0SSuyog Pawar *****************************************************************************
5425*c83a76b0SSuyog Pawar */
ihevce_pre_enc_coarse_me_init(enc_ctxt_t * ps_enc_ctxt,ihevce_lap_enc_buf_t * ps_curr_inp,pre_enc_me_ctxt_t * ps_curr_out,recon_pic_buf_t ** pps_frm_recon_ret,WORD32 i4_decomp_lyrs_idx,WORD32 i4_cur_qp,WORD32 i4_ping_pong)5426*c83a76b0SSuyog Pawar void ihevce_pre_enc_coarse_me_init(
5427*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt,
5428*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp,
5429*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_out,
5430*c83a76b0SSuyog Pawar recon_pic_buf_t **pps_frm_recon_ret,
5431*c83a76b0SSuyog Pawar WORD32 i4_decomp_lyrs_idx,
5432*c83a76b0SSuyog Pawar WORD32 i4_cur_qp,
5433*c83a76b0SSuyog Pawar WORD32 i4_ping_pong)
5434*c83a76b0SSuyog Pawar
5435*c83a76b0SSuyog Pawar {
5436*c83a76b0SSuyog Pawar /* local variables */
5437*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_frm_recon;
5438*c83a76b0SSuyog Pawar coarse_me_master_ctxt_t *ps_ctxt = NULL;
5439*c83a76b0SSuyog Pawar ps_ctxt = (coarse_me_master_ctxt_t *)ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt;
5440*c83a76b0SSuyog Pawar /* Reference buffer management and reference list creation for pre enc group */
5441*c83a76b0SSuyog Pawar ihevce_pre_enc_manage_ref_pics(ps_enc_ctxt, ps_curr_inp, ps_curr_out, i4_ping_pong);
5442*c83a76b0SSuyog Pawar
5443*c83a76b0SSuyog Pawar /* get a free recon buffer for current picture */
5444*c83a76b0SSuyog Pawar {
5445*c83a76b0SSuyog Pawar WORD32 ctr;
5446*c83a76b0SSuyog Pawar
5447*c83a76b0SSuyog Pawar ps_frm_recon = NULL;
5448*c83a76b0SSuyog Pawar for(ctr = 0; ctr < ps_enc_ctxt->i4_pre_enc_num_buf_recon_q; ctr++)
5449*c83a76b0SSuyog Pawar {
5450*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->pps_pre_enc_recon_buf_q[ctr]->i4_is_free)
5451*c83a76b0SSuyog Pawar {
5452*c83a76b0SSuyog Pawar ps_frm_recon = ps_enc_ctxt->pps_pre_enc_recon_buf_q[ctr];
5453*c83a76b0SSuyog Pawar break;
5454*c83a76b0SSuyog Pawar }
5455*c83a76b0SSuyog Pawar }
5456*c83a76b0SSuyog Pawar }
5457*c83a76b0SSuyog Pawar /* should not be NULL */
5458*c83a76b0SSuyog Pawar ASSERT(ps_frm_recon != NULL);
5459*c83a76b0SSuyog Pawar
5460*c83a76b0SSuyog Pawar /* populate reference /recon params based on LAP output */
5461*c83a76b0SSuyog Pawar ps_frm_recon->i4_is_free = 0;
5462*c83a76b0SSuyog Pawar /* top first field is set to 1 by application */
5463*c83a76b0SSuyog Pawar ps_frm_recon->i4_topfield_first = ps_curr_inp->s_input_buf.i4_topfield_first;
5464*c83a76b0SSuyog Pawar ps_frm_recon->i4_poc = ps_curr_inp->s_lap_out.i4_poc;
5465*c83a76b0SSuyog Pawar ps_frm_recon->i4_pic_type = ps_curr_inp->s_lap_out.i4_pic_type;
5466*c83a76b0SSuyog Pawar ps_frm_recon->i4_display_num = ps_curr_inp->s_lap_out.i4_display_num;
5467*c83a76b0SSuyog Pawar /* bottom field is toggled for every field by application */
5468*c83a76b0SSuyog Pawar ps_frm_recon->i4_bottom_field = ps_curr_inp->s_input_buf.i4_bottom_field;
5469*c83a76b0SSuyog Pawar
5470*c83a76b0SSuyog Pawar /* Reference picture property is given by LAP */
5471*c83a76b0SSuyog Pawar ps_frm_recon->i4_is_reference = ps_curr_inp->s_lap_out.i4_is_ref_pic;
5472*c83a76b0SSuyog Pawar
5473*c83a76b0SSuyog Pawar /* Deblock a picture for all reference frames unconditionally. */
5474*c83a76b0SSuyog Pawar /* Deblock non ref if psnr compute or save recon is enabled */
5475*c83a76b0SSuyog Pawar ps_frm_recon->i4_deblk_pad_hpel_cur_pic = ps_frm_recon->i4_is_reference ||
5476*c83a76b0SSuyog Pawar (ps_enc_ctxt->ps_stat_prms->i4_save_recon);
5477*c83a76b0SSuyog Pawar
5478*c83a76b0SSuyog Pawar /* set the width, height and stride to defalut values */
5479*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_y_ht = 0;
5480*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_uv_ht = 0;
5481*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_y_wd = 0;
5482*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_uv_wd = 0;
5483*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_y_strd = 0;
5484*c83a76b0SSuyog Pawar ps_frm_recon->s_yuv_buf_desc.i4_uv_strd = 0;
5485*c83a76b0SSuyog Pawar
5486*c83a76b0SSuyog Pawar /* register the Layer1 MV bank pointer with ME module */
5487*c83a76b0SSuyog Pawar ihevce_coarse_me_set_lyr1_mv_bank(
5488*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt,
5489*c83a76b0SSuyog Pawar ps_curr_inp,
5490*c83a76b0SSuyog Pawar ps_curr_out->pv_me_mv_bank,
5491*c83a76b0SSuyog Pawar ps_curr_out->pv_me_ref_idx,
5492*c83a76b0SSuyog Pawar i4_decomp_lyrs_idx);
5493*c83a76b0SSuyog Pawar
5494*c83a76b0SSuyog Pawar /* Coarse picture level init of ME */
5495*c83a76b0SSuyog Pawar ihevce_coarse_me_frame_init(
5496*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt,
5497*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms,
5498*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms,
5499*c83a76b0SSuyog Pawar &ps_curr_out->as_lambda_prms[0],
5500*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0,
5501*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1,
5502*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l0_active,
5503*c83a76b0SSuyog Pawar ps_enc_ctxt->i4_pre_enc_num_ref_l1_active,
5504*c83a76b0SSuyog Pawar &ps_enc_ctxt->aps_pre_enc_ref_lists[i4_ping_pong][LIST_0][0],
5505*c83a76b0SSuyog Pawar &ps_enc_ctxt->aps_pre_enc_ref_lists[i4_ping_pong][LIST_1][0],
5506*c83a76b0SSuyog Pawar ps_curr_inp,
5507*c83a76b0SSuyog Pawar i4_cur_qp,
5508*c83a76b0SSuyog Pawar ps_curr_out->ps_layer1_buf,
5509*c83a76b0SSuyog Pawar ps_curr_out->ps_ed_ctb_l1,
5510*c83a76b0SSuyog Pawar ps_curr_out->pu1_me_reverse_map_info,
5511*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.i4_temporal_lyr_id);
5512*c83a76b0SSuyog Pawar
5513*c83a76b0SSuyog Pawar /*assign return variables */
5514*c83a76b0SSuyog Pawar *pps_frm_recon_ret = ps_frm_recon;
5515*c83a76b0SSuyog Pawar }
5516*c83a76b0SSuyog Pawar
5517*c83a76b0SSuyog Pawar /*!
5518*c83a76b0SSuyog Pawar ******************************************************************************
5519*c83a76b0SSuyog Pawar * \brief
5520*c83a76b0SSuyog Pawar * Function to calculate modulation based on spatial variance across lap period
5521*c83a76b0SSuyog Pawar *
5522*c83a76b0SSuyog Pawar *****************************************************************************
5523*c83a76b0SSuyog Pawar */
ihevce_variance_calc_acc_activity(enc_ctxt_t * ps_enc_ctxt,WORD32 i4_cur_ipe_idx)5524*c83a76b0SSuyog Pawar void ihevce_variance_calc_acc_activity(enc_ctxt_t *ps_enc_ctxt, WORD32 i4_cur_ipe_idx)
5525*c83a76b0SSuyog Pawar {
5526*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_out = ps_enc_ctxt->s_multi_thrd.aps_curr_out_pre_enc[i4_cur_ipe_idx];
5527*c83a76b0SSuyog Pawar WORD32 is_curr_bslice = (ps_curr_out->s_slice_hdr.i1_slice_type == BSLICE);
5528*c83a76b0SSuyog Pawar #if MODULATION_OVER_LAP
5529*c83a76b0SSuyog Pawar WORD32 loop_lap2 = MAX(1, ps_enc_ctxt->s_multi_thrd.i4_delay_pre_me_btw_l0_ipe - 1);
5530*c83a76b0SSuyog Pawar #else
5531*c83a76b0SSuyog Pawar WORD32 loop_lap2 = 1;
5532*c83a76b0SSuyog Pawar #endif
5533*c83a76b0SSuyog Pawar WORD32 i4_delay_loop = ps_enc_ctxt->s_multi_thrd.i4_max_delay_pre_me_btw_l0_ipe;
5534*c83a76b0SSuyog Pawar WORD32 i, j;
5535*c83a76b0SSuyog Pawar
5536*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_8x8_sum_act_sqr = 0;
5537*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_8x8_sum_act_for_strength = 0;
5538*c83a76b0SSuyog Pawar for(i = 0; i < 2; i++)
5539*c83a76b0SSuyog Pawar {
5540*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_8x8_sum_act[i] = 0;
5541*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_8x8_num_blks[i] = 0;
5542*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_16x16_sum_act[i] = 0;
5543*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_16x16_num_blks[i] = 0;
5544*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_32x32_sum_act[i] = 0;
5545*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_32x32_num_blks[i] = 0;
5546*c83a76b0SSuyog Pawar }
5547*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_16x16_sum_act[i] = 0;
5548*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_16x16_num_blks[i] = 0;
5549*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_32x32_sum_act[i] = 0;
5550*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_32x32_num_blks[i] = 0;
5551*c83a76b0SSuyog Pawar
5552*c83a76b0SSuyog Pawar if(!is_curr_bslice)
5553*c83a76b0SSuyog Pawar {
5554*c83a76b0SSuyog Pawar for(i = 0; i < loop_lap2; i++)
5555*c83a76b0SSuyog Pawar {
5556*c83a76b0SSuyog Pawar WORD32 ipe_idx_tmp = (i4_cur_ipe_idx + i) % i4_delay_loop;
5557*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_in = ps_enc_ctxt->s_multi_thrd.aps_curr_inp_pre_enc[ipe_idx_tmp];
5558*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_out = ps_enc_ctxt->s_multi_thrd.aps_curr_out_pre_enc[ipe_idx_tmp];
5559*c83a76b0SSuyog Pawar UWORD8 is_bslice = (ps_out->s_slice_hdr.i1_slice_type == BSLICE);
5560*c83a76b0SSuyog Pawar
5561*c83a76b0SSuyog Pawar if(!is_bslice)
5562*c83a76b0SSuyog Pawar {
5563*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_8x8_sum_act_sqr += ps_out->u8_curr_frame_8x8_sum_act_sqr;
5564*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_8x8_sum_act_for_strength += ps_out->i4_curr_frame_8x8_sum_act_for_strength[0];
5565*c83a76b0SSuyog Pawar for(j = 0; j < 2; j++)
5566*c83a76b0SSuyog Pawar {
5567*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_8x8_sum_act[j] += ps_out->i8_curr_frame_8x8_sum_act[j];
5568*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_8x8_num_blks[j] += ps_out->i4_curr_frame_8x8_num_blks[j];
5569*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_16x16_sum_act[j] += ps_out->i8_curr_frame_16x16_sum_act[j];
5570*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_16x16_num_blks[j] += ps_out->i4_curr_frame_16x16_num_blks[j];
5571*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_32x32_sum_act[j] += ps_out->i8_curr_frame_32x32_sum_act[j];
5572*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_32x32_num_blks[j] += ps_out->i4_curr_frame_32x32_num_blks[j];
5573*c83a76b0SSuyog Pawar }
5574*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_16x16_sum_act[j] += ps_out->i8_curr_frame_16x16_sum_act[j];
5575*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_16x16_num_blks[j] += ps_out->i4_curr_frame_16x16_num_blks[j];
5576*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_32x32_sum_act[j] += ps_out->i8_curr_frame_32x32_sum_act[j];
5577*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_32x32_num_blks[j] += ps_out->i4_curr_frame_32x32_num_blks[j];
5578*c83a76b0SSuyog Pawar }
5579*c83a76b0SSuyog Pawar if(NULL == ps_in->s_rc_lap_out.ps_rc_lap_out_next_encode)
5580*c83a76b0SSuyog Pawar break;
5581*c83a76b0SSuyog Pawar }
5582*c83a76b0SSuyog Pawar
5583*c83a76b0SSuyog Pawar for(j = 0; j < 3; j++)
5584*c83a76b0SSuyog Pawar {
5585*c83a76b0SSuyog Pawar if(j < 2)
5586*c83a76b0SSuyog Pawar ASSERT(0 != ps_curr_out->i4_acc_frame_8x8_num_blks[j]);
5587*c83a76b0SSuyog Pawar ASSERT(0 != ps_curr_out->i4_acc_frame_16x16_num_blks[j]);
5588*c83a76b0SSuyog Pawar ASSERT(0 != ps_curr_out->i4_acc_frame_32x32_num_blks[j]);
5589*c83a76b0SSuyog Pawar
5590*c83a76b0SSuyog Pawar #define AVG_ACTIVITY(a, b, c) a = ((b + (c >> 1)) / c)
5591*c83a76b0SSuyog Pawar
5592*c83a76b0SSuyog Pawar if(j < 2)
5593*c83a76b0SSuyog Pawar {
5594*c83a76b0SSuyog Pawar if(0 == ps_curr_out->i4_acc_frame_8x8_num_blks[j])
5595*c83a76b0SSuyog Pawar {
5596*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_8x8_avg_act[j] = 0;
5597*c83a76b0SSuyog Pawar }
5598*c83a76b0SSuyog Pawar else
5599*c83a76b0SSuyog Pawar {
5600*c83a76b0SSuyog Pawar AVG_ACTIVITY(ps_curr_out->i8_curr_frame_8x8_sum_act_for_strength,
5601*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_8x8_sum_act_for_strength,
5602*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_8x8_num_blks[j]);
5603*c83a76b0SSuyog Pawar AVG_ACTIVITY(ps_curr_out->i8_curr_frame_8x8_avg_act[j],
5604*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_8x8_sum_act[j],
5605*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_8x8_num_blks[j]);
5606*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_8x8_log_avg[j] =
5607*c83a76b0SSuyog Pawar fast_log2(1 + ps_curr_out->i8_curr_frame_8x8_avg_act[j]);
5608*c83a76b0SSuyog Pawar }
5609*c83a76b0SSuyog Pawar }
5610*c83a76b0SSuyog Pawar
5611*c83a76b0SSuyog Pawar if(0 == ps_curr_out->i4_acc_frame_16x16_num_blks[j])
5612*c83a76b0SSuyog Pawar {
5613*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_16x16_avg_act[j] = 0;
5614*c83a76b0SSuyog Pawar }
5615*c83a76b0SSuyog Pawar else
5616*c83a76b0SSuyog Pawar {
5617*c83a76b0SSuyog Pawar AVG_ACTIVITY(ps_curr_out->i8_curr_frame_16x16_avg_act[j],
5618*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_16x16_sum_act[j],
5619*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_16x16_num_blks[j]);
5620*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_16x16_log_avg[j] =
5621*c83a76b0SSuyog Pawar fast_log2(1 + ps_curr_out->i8_curr_frame_16x16_avg_act[j]);
5622*c83a76b0SSuyog Pawar }
5623*c83a76b0SSuyog Pawar
5624*c83a76b0SSuyog Pawar if(0 == ps_curr_out->i4_acc_frame_32x32_num_blks[j])
5625*c83a76b0SSuyog Pawar {
5626*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_32x32_avg_act[j] = 0;
5627*c83a76b0SSuyog Pawar }
5628*c83a76b0SSuyog Pawar else
5629*c83a76b0SSuyog Pawar {
5630*c83a76b0SSuyog Pawar AVG_ACTIVITY(ps_curr_out->i8_curr_frame_32x32_avg_act[j],
5631*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_frame_32x32_sum_act[j],
5632*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_32x32_num_blks[j]);
5633*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_32x32_log_avg[j] =
5634*c83a76b0SSuyog Pawar fast_log2(1 + ps_curr_out->i8_curr_frame_32x32_avg_act[j]);
5635*c83a76b0SSuyog Pawar }
5636*c83a76b0SSuyog Pawar }
5637*c83a76b0SSuyog Pawar
5638*c83a76b0SSuyog Pawar /* store the avg activity for B pictures */
5639*c83a76b0SSuyog Pawar #if POW_OPT
5640*c83a76b0SSuyog Pawar ps_enc_ctxt->ald_lap2_8x8_log_avg_act_from_T0[0] = ps_curr_out->ld_curr_frame_8x8_log_avg[0];
5641*c83a76b0SSuyog Pawar ps_enc_ctxt->ald_lap2_8x8_log_avg_act_from_T0[1] = ps_curr_out->ld_curr_frame_8x8_log_avg[1];
5642*c83a76b0SSuyog Pawar ps_enc_ctxt->ald_lap2_16x16_log_avg_act_from_T0[0] = ps_curr_out->ld_curr_frame_16x16_log_avg[0];
5643*c83a76b0SSuyog Pawar ps_enc_ctxt->ald_lap2_16x16_log_avg_act_from_T0[1] = ps_curr_out->ld_curr_frame_16x16_log_avg[1];
5644*c83a76b0SSuyog Pawar ps_enc_ctxt->ald_lap2_16x16_log_avg_act_from_T0[2] = ps_curr_out->ld_curr_frame_16x16_log_avg[2];
5645*c83a76b0SSuyog Pawar ps_enc_ctxt->ald_lap2_32x32_log_avg_act_from_T0[0] = ps_curr_out->ld_curr_frame_32x32_log_avg[0];
5646*c83a76b0SSuyog Pawar ps_enc_ctxt->ald_lap2_32x32_log_avg_act_from_T0[1] = ps_curr_out->ld_curr_frame_32x32_log_avg[1];
5647*c83a76b0SSuyog Pawar ps_enc_ctxt->ald_lap2_32x32_log_avg_act_from_T0[2] = ps_curr_out->ld_curr_frame_32x32_log_avg[2];
5648*c83a76b0SSuyog Pawar #else
5649*c83a76b0SSuyog Pawar ps_enc_ctxt->ai8_lap2_8x8_avg_act_from_T0[0] = ps_curr_out->i8_curr_frame_8x8_avg_act[0];
5650*c83a76b0SSuyog Pawar ps_enc_ctxt->ai8_lap2_8x8_avg_act_from_T0[1] = ps_curr_out->i8_curr_frame_8x8_avg_act[1];
5651*c83a76b0SSuyog Pawar ps_enc_ctxt->ai8_lap2_16x16_avg_act_from_T0[0] = ps_curr_out->i8_curr_frame_16x16_avg_act[0];
5652*c83a76b0SSuyog Pawar ps_enc_ctxt->ai8_lap2_16x16_avg_act_from_T0[1] = ps_curr_out->i8_curr_frame_16x16_avg_act[1];
5653*c83a76b0SSuyog Pawar ps_enc_ctxt->ai8_lap2_16x16_avg_act_from_T0[2] = ps_curr_out->i8_curr_frame_16x16_avg_act[2];
5654*c83a76b0SSuyog Pawar ps_enc_ctxt->ai8_lap2_32x32_avg_act_from_T0[0] = ps_curr_out->i8_curr_frame_32x32_avg_act[0];
5655*c83a76b0SSuyog Pawar ps_enc_ctxt->ai8_lap2_32x32_avg_act_from_T0[1] = ps_curr_out->i8_curr_frame_32x32_avg_act[1];
5656*c83a76b0SSuyog Pawar ps_enc_ctxt->ai8_lap2_32x32_avg_act_from_T0[2] = ps_curr_out->i8_curr_frame_32x32_avg_act[2];
5657*c83a76b0SSuyog Pawar #endif
5658*c83a76b0SSuyog Pawar
5659*c83a76b0SSuyog Pawar /* calculate modulation index */
5660*c83a76b0SSuyog Pawar {
5661*c83a76b0SSuyog Pawar LWORD64 i8_mean, i8_mean_sqr, i8_variance;
5662*c83a76b0SSuyog Pawar LWORD64 i8_deviation;
5663*c83a76b0SSuyog Pawar WORD32 i4_mod_factor;
5664*c83a76b0SSuyog Pawar float f_strength;
5665*c83a76b0SSuyog Pawar
5666*c83a76b0SSuyog Pawar if(ps_curr_out->i4_acc_frame_8x8_num_blks[0] > 0)
5667*c83a76b0SSuyog Pawar {
5668*c83a76b0SSuyog Pawar #if STRENGTH_BASED_ON_CURR_FRM
5669*c83a76b0SSuyog Pawar AVG_ACTIVITY(i8_mean_sqr, ps_curr_out->i8_curr_frame_8x8_sum_act_sqr,
5670*c83a76b0SSuyog Pawar ps_curr_out->i4_curr_frame_8x8_num_blks[0]);
5671*c83a76b0SSuyog Pawar #else
5672*c83a76b0SSuyog Pawar AVG_ACTIVITY(i8_mean_sqr, ps_curr_out->i8_acc_frame_8x8_sum_act_sqr,
5673*c83a76b0SSuyog Pawar ps_curr_out->i4_acc_frame_8x8_num_blks[0]);
5674*c83a76b0SSuyog Pawar #endif
5675*c83a76b0SSuyog Pawar i8_mean = ps_curr_out->i8_curr_frame_8x8_sum_act_for_strength;
5676*c83a76b0SSuyog Pawar i8_variance = i8_mean_sqr - (i8_mean * i8_mean);
5677*c83a76b0SSuyog Pawar i8_deviation = sqrt(i8_variance);
5678*c83a76b0SSuyog Pawar
5679*c83a76b0SSuyog Pawar #if STRENGTH_BASED_ON_DEVIATION
5680*c83a76b0SSuyog Pawar if(i8_deviation <= REF_MOD_DEVIATION)
5681*c83a76b0SSuyog Pawar {
5682*c83a76b0SSuyog Pawar f_strength = ((i8_deviation - BELOW_REF_DEVIATION) * REF_MOD_STRENGTH) / (REF_MOD_DEVIATION - BELOW_REF_DEVIATION);
5683*c83a76b0SSuyog Pawar }
5684*c83a76b0SSuyog Pawar else
5685*c83a76b0SSuyog Pawar {
5686*c83a76b0SSuyog Pawar f_strength = ((i8_deviation - ABOVE_REF_DEVIATION) * REF_MOD_STRENGTH) / (REF_MOD_DEVIATION - ABOVE_REF_DEVIATION);
5687*c83a76b0SSuyog Pawar }
5688*c83a76b0SSuyog Pawar #else
5689*c83a76b0SSuyog Pawar f_strength = ((i8_mean_sqr / (float)(i8_mean * i8_mean)) - 1.0) * REF_MOD_STRENGTH / REF_MOD_VARIANCE;
5690*c83a76b0SSuyog Pawar #endif
5691*c83a76b0SSuyog Pawar i4_mod_factor = (WORD32)(i8_deviation / 60);
5692*c83a76b0SSuyog Pawar f_strength = CLIP3(f_strength, 0.0, REF_MAX_STRENGTH);
5693*c83a76b0SSuyog Pawar }
5694*c83a76b0SSuyog Pawar else
5695*c83a76b0SSuyog Pawar {
5696*c83a76b0SSuyog Pawar /* If not sufficient blocks are present, turn modulation index to 1 */
5697*c83a76b0SSuyog Pawar i4_mod_factor = 1;
5698*c83a76b0SSuyog Pawar f_strength = 0;
5699*c83a76b0SSuyog Pawar }
5700*c83a76b0SSuyog Pawar ps_curr_out->ai4_mod_factor_derived_by_variance[0] = i4_mod_factor;
5701*c83a76b0SSuyog Pawar ps_curr_out->ai4_mod_factor_derived_by_variance[1] = i4_mod_factor;
5702*c83a76b0SSuyog Pawar ps_curr_out->f_strength = f_strength;
5703*c83a76b0SSuyog Pawar
5704*c83a76b0SSuyog Pawar ps_enc_ctxt->ai4_mod_factor_derived_by_variance[0] = i4_mod_factor;
5705*c83a76b0SSuyog Pawar ps_enc_ctxt->ai4_mod_factor_derived_by_variance[1] = i4_mod_factor;
5706*c83a76b0SSuyog Pawar ps_enc_ctxt->f_strength = f_strength;
5707*c83a76b0SSuyog Pawar }
5708*c83a76b0SSuyog Pawar }
5709*c83a76b0SSuyog Pawar else
5710*c83a76b0SSuyog Pawar {
5711*c83a76b0SSuyog Pawar ps_curr_out->ai4_mod_factor_derived_by_variance[0] = ps_enc_ctxt->ai4_mod_factor_derived_by_variance[0];
5712*c83a76b0SSuyog Pawar ps_curr_out->ai4_mod_factor_derived_by_variance[1] = ps_enc_ctxt->ai4_mod_factor_derived_by_variance[1];
5713*c83a76b0SSuyog Pawar ps_curr_out->f_strength = ps_enc_ctxt->f_strength;
5714*c83a76b0SSuyog Pawar
5715*c83a76b0SSuyog Pawar /* copy the prev avg activity from Tid 0 for B pictures*/
5716*c83a76b0SSuyog Pawar #if POW_OPT
5717*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_8x8_log_avg[0] = ps_enc_ctxt->ald_lap2_8x8_log_avg_act_from_T0[0];
5718*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_8x8_log_avg[1] = ps_enc_ctxt->ald_lap2_8x8_log_avg_act_from_T0[1];
5719*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_16x16_log_avg[0] = ps_enc_ctxt->ald_lap2_16x16_log_avg_act_from_T0[0];
5720*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_16x16_log_avg[1] = ps_enc_ctxt->ald_lap2_16x16_log_avg_act_from_T0[1];
5721*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_16x16_log_avg[2] = ps_enc_ctxt->ald_lap2_16x16_log_avg_act_from_T0[2];
5722*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_32x32_log_avg[0] = ps_enc_ctxt->ald_lap2_32x32_log_avg_act_from_T0[0];
5723*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_32x32_log_avg[1] = ps_enc_ctxt->ald_lap2_32x32_log_avg_act_from_T0[1];
5724*c83a76b0SSuyog Pawar ps_curr_out->ld_curr_frame_32x32_log_avg[2] = ps_enc_ctxt->ald_lap2_32x32_log_avg_act_from_T0[2];
5725*c83a76b0SSuyog Pawar #else
5726*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_8x8_avg_act[0] = ps_enc_ctxt->ai8_lap2_8x8_avg_act_from_T0[0];
5727*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_8x8_avg_act[1] = ps_enc_ctxt->ai8_lap2_8x8_avg_act_from_T0[1];
5728*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_16x16_avg_act[0] = ps_enc_ctxt->ai8_lap2_16x16_avg_act_from_T0[0];
5729*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_16x16_avg_act[1] = ps_enc_ctxt->ai8_lap2_16x16_avg_act_from_T0[1];
5730*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_16x16_avg_act[2] = ps_enc_ctxt->ai8_lap2_16x16_avg_act_from_T0[2];
5731*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_32x32_avg_act[0] = ps_enc_ctxt->ai8_lap2_32x32_avg_act_from_T0[0];
5732*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_32x32_avg_act[1] = ps_enc_ctxt->ai8_lap2_32x32_avg_act_from_T0[1];
5733*c83a76b0SSuyog Pawar ps_curr_out->i8_curr_frame_32x32_avg_act[2] = ps_enc_ctxt->ai8_lap2_32x32_avg_act_from_T0[2];
5734*c83a76b0SSuyog Pawar #endif
5735*c83a76b0SSuyog Pawar }
5736*c83a76b0SSuyog Pawar #undef AVG_ACTIVITY
5737*c83a76b0SSuyog Pawar }
5738*c83a76b0SSuyog Pawar
5739*c83a76b0SSuyog Pawar /*!
5740*c83a76b0SSuyog Pawar ******************************************************************************
5741*c83a76b0SSuyog Pawar * \if Function name : ihevce_pre_enc_process_frame_thrd \endif
5742*c83a76b0SSuyog Pawar *
5743*c83a76b0SSuyog Pawar * \brief
5744*c83a76b0SSuyog Pawar * Pre-Encode Frame processing thread interface function
5745*c83a76b0SSuyog Pawar *
5746*c83a76b0SSuyog Pawar * \param[in] High level encoder context pointer
5747*c83a76b0SSuyog Pawar *
5748*c83a76b0SSuyog Pawar * \return
5749*c83a76b0SSuyog Pawar * None
5750*c83a76b0SSuyog Pawar *
5751*c83a76b0SSuyog Pawar * \author
5752*c83a76b0SSuyog Pawar * Ittiam
5753*c83a76b0SSuyog Pawar *
5754*c83a76b0SSuyog Pawar *****************************************************************************
5755*c83a76b0SSuyog Pawar */
ihevce_pre_enc_process_frame_thrd(void * pv_frm_proc_thrd_ctxt)5756*c83a76b0SSuyog Pawar WORD32 ihevce_pre_enc_process_frame_thrd(void *pv_frm_proc_thrd_ctxt)
5757*c83a76b0SSuyog Pawar {
5758*c83a76b0SSuyog Pawar frm_proc_thrd_ctxt_t *ps_thrd_ctxt = (frm_proc_thrd_ctxt_t *)pv_frm_proc_thrd_ctxt;
5759*c83a76b0SSuyog Pawar ihevce_hle_ctxt_t *ps_hle_ctxt = ps_thrd_ctxt->ps_hle_ctxt;
5760*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt = (enc_ctxt_t *)ps_thrd_ctxt->pv_enc_ctxt;
5761*c83a76b0SSuyog Pawar multi_thrd_ctxt_t *ps_multi_thrd = &ps_enc_ctxt->s_multi_thrd;
5762*c83a76b0SSuyog Pawar WORD32 i4_thrd_id = ps_thrd_ctxt->i4_thrd_id;
5763*c83a76b0SSuyog Pawar WORD32 i4_resolution_id = ps_enc_ctxt->i4_resolution_id;
5764*c83a76b0SSuyog Pawar WORD32 i4_end_flag = 0;
5765*c83a76b0SSuyog Pawar WORD32 i4_out_flush_flag = 0;
5766*c83a76b0SSuyog Pawar WORD32 i4_cur_decomp_idx = 0;
5767*c83a76b0SSuyog Pawar WORD32 i4_cur_coarse_me_idx = 0;
5768*c83a76b0SSuyog Pawar WORD32 i4_cur_ipe_idx = 0;
5769*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_lap_inp_buf = NULL;
5770*c83a76b0SSuyog Pawar void *pv_dep_mngr_prev_frame_pre_enc_l1 = ps_multi_thrd->pv_dep_mngr_prev_frame_pre_enc_l1;
5771*c83a76b0SSuyog Pawar void *pv_dep_mngr_prev_frame_pre_enc_l0 = ps_multi_thrd->pv_dep_mngr_prev_frame_pre_enc_l0;
5772*c83a76b0SSuyog Pawar void *pv_dep_mngr_prev_frame_pre_enc_coarse_me =
5773*c83a76b0SSuyog Pawar ps_multi_thrd->pv_dep_mngr_prev_frame_pre_enc_coarse_me;
5774*c83a76b0SSuyog Pawar WORD32 i4_num_buf_prod_for_l0_ipe = 0;
5775*c83a76b0SSuyog Pawar WORD32 i4_decomp_end_flag = 0;
5776*c83a76b0SSuyog Pawar
5777*c83a76b0SSuyog Pawar (void)ps_hle_ctxt;
5778*c83a76b0SSuyog Pawar (void)i4_resolution_id;
5779*c83a76b0SSuyog Pawar
5780*c83a76b0SSuyog Pawar /* ---------- Processing Loop until Flush command is received --------- */
5781*c83a76b0SSuyog Pawar while(0 == i4_end_flag)
5782*c83a76b0SSuyog Pawar {
5783*c83a76b0SSuyog Pawar /* Wait till previous frame(instance)'s decomp_intra is processed */
5784*c83a76b0SSuyog Pawar {
5785*c83a76b0SSuyog Pawar ihevce_dmgr_chk_frm_frm_sync(pv_dep_mngr_prev_frame_pre_enc_l1, i4_thrd_id);
5786*c83a76b0SSuyog Pawar }
5787*c83a76b0SSuyog Pawar
5788*c83a76b0SSuyog Pawar /* ----------------------------------------------------------- */
5789*c83a76b0SSuyog Pawar /* decomp pre_intra init */
5790*c83a76b0SSuyog Pawar /* ----------------------------------------------------------- */
5791*c83a76b0SSuyog Pawar
5792*c83a76b0SSuyog Pawar /****** Lock the critical section for decomp pre_intra init ******/
5793*c83a76b0SSuyog Pawar {
5794*c83a76b0SSuyog Pawar WORD32 i4_status;
5795*c83a76b0SSuyog Pawar
5796*c83a76b0SSuyog Pawar i4_status = osal_mutex_lock(ps_multi_thrd->pv_mutex_hdl_pre_enc_init);
5797*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
5798*c83a76b0SSuyog Pawar return 0;
5799*c83a76b0SSuyog Pawar }
5800*c83a76b0SSuyog Pawar
5801*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_decomp_coarse_me_complete_flag[i4_cur_decomp_idx] = 0;
5802*c83a76b0SSuyog Pawar
5803*c83a76b0SSuyog Pawar /* init */
5804*c83a76b0SSuyog Pawar if((ps_multi_thrd->ai4_pre_enc_init_done[i4_cur_decomp_idx] == 0) &&
5805*c83a76b0SSuyog Pawar (0 == i4_decomp_end_flag))
5806*c83a76b0SSuyog Pawar {
5807*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp = NULL;
5808*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_out = NULL;
5809*c83a76b0SSuyog Pawar WORD32 in_buf_id;
5810*c83a76b0SSuyog Pawar WORD32 out_buf_id;
5811*c83a76b0SSuyog Pawar
5812*c83a76b0SSuyog Pawar do
5813*c83a76b0SSuyog Pawar {
5814*c83a76b0SSuyog Pawar ps_lap_inp_buf = NULL;
5815*c83a76b0SSuyog Pawar if(0 == ps_multi_thrd->i4_last_inp_buf)
5816*c83a76b0SSuyog Pawar {
5817*c83a76b0SSuyog Pawar /* ------- get input buffer input data que ---------- */
5818*c83a76b0SSuyog Pawar ps_lap_inp_buf = (ihevce_lap_enc_buf_t *)ihevce_q_get_filled_buff(
5819*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
5820*c83a76b0SSuyog Pawar IHEVCE_INPUT_DATA_CTRL_Q,
5821*c83a76b0SSuyog Pawar &in_buf_id,
5822*c83a76b0SSuyog Pawar BUFF_QUE_BLOCKING_MODE);
5823*c83a76b0SSuyog Pawar ps_multi_thrd->i4_last_inp_buf = ihevce_check_last_inp_buf(
5824*c83a76b0SSuyog Pawar (WORD32 *)ps_lap_inp_buf->s_input_buf.pv_synch_ctrl_bufs);
5825*c83a76b0SSuyog Pawar }
5826*c83a76b0SSuyog Pawar
5827*c83a76b0SSuyog Pawar ps_curr_inp =
5828*c83a76b0SSuyog Pawar ihevce_lap_process(ps_enc_ctxt->pv_lap_interface_ctxt, ps_lap_inp_buf);
5829*c83a76b0SSuyog Pawar
5830*c83a76b0SSuyog Pawar } while(NULL == ps_curr_inp);
5831*c83a76b0SSuyog Pawar
5832*c83a76b0SSuyog Pawar /* set the flag saying init is done so that other cores dont do it */
5833*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_pre_enc_init_done[i4_cur_decomp_idx] = 1;
5834*c83a76b0SSuyog Pawar
5835*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_decomp_idx] = ps_curr_inp;
5836*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_in_buf_id_pre_enc[i4_cur_decomp_idx] =
5837*c83a76b0SSuyog Pawar ps_curr_inp->s_input_buf.i4_buf_id;
5838*c83a76b0SSuyog Pawar
5839*c83a76b0SSuyog Pawar /* ------- get free output buffer from pre-enc/enc buffer que ---------- */
5840*c83a76b0SSuyog Pawar ps_curr_out = (pre_enc_me_ctxt_t *)ihevce_q_get_free_buff(
5841*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt, IHEVCE_PRE_ENC_ME_Q, &out_buf_id, BUFF_QUE_BLOCKING_MODE);
5842*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_decomp_idx] = ps_curr_out;
5843*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_out_buf_id_pre_enc[i4_cur_decomp_idx] = out_buf_id;
5844*c83a76b0SSuyog Pawar
5845*c83a76b0SSuyog Pawar if((NULL != ps_curr_inp) && (NULL != ps_curr_out))
5846*c83a76b0SSuyog Pawar {
5847*c83a76b0SSuyog Pawar /* by default last picture to be encoded flag is set to 0 */
5848*c83a76b0SSuyog Pawar /* this flag will be used by slave threads to exit at the end */
5849*c83a76b0SSuyog Pawar ps_multi_thrd->i4_last_pic_flag = 0;
5850*c83a76b0SSuyog Pawar
5851*c83a76b0SSuyog Pawar /* store the buffer id */
5852*c83a76b0SSuyog Pawar ps_curr_out->i4_buf_id = out_buf_id;
5853*c83a76b0SSuyog Pawar
5854*c83a76b0SSuyog Pawar ps_curr_out->i8_acc_num_blks_high_sad = 0;
5855*c83a76b0SSuyog Pawar ps_curr_out->i8_total_blks = 0;
5856*c83a76b0SSuyog Pawar ps_curr_out->i4_is_high_complex_region = -1;
5857*c83a76b0SSuyog Pawar
5858*c83a76b0SSuyog Pawar /* set the parameters for sync b/w pre-encode and encode threads */
5859*c83a76b0SSuyog Pawar ps_curr_out->i4_end_flag = ps_curr_inp->s_lap_out.i4_end_flag;
5860*c83a76b0SSuyog Pawar ps_curr_out->i4_frm_proc_valid_flag = 1;
5861*c83a76b0SSuyog Pawar if(ps_curr_out->i4_end_flag)
5862*c83a76b0SSuyog Pawar {
5863*c83a76b0SSuyog Pawar ps_curr_out->i4_frm_proc_valid_flag =
5864*c83a76b0SSuyog Pawar ps_curr_inp->s_input_buf.i4_inp_frm_data_valid_flag;
5865*c83a76b0SSuyog Pawar ps_multi_thrd->i4_last_pic_flag = 1;
5866*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_end_flag_pre_enc[i4_cur_decomp_idx] = 1;
5867*c83a76b0SSuyog Pawar }
5868*c83a76b0SSuyog Pawar if(ps_curr_inp->s_lap_out.i4_out_flush_flag)
5869*c83a76b0SSuyog Pawar {
5870*c83a76b0SSuyog Pawar ps_curr_out->i4_frm_proc_valid_flag =
5871*c83a76b0SSuyog Pawar ps_curr_inp->s_input_buf.i4_inp_frm_data_valid_flag;
5872*c83a76b0SSuyog Pawar }
5873*c83a76b0SSuyog Pawar
5874*c83a76b0SSuyog Pawar /* do the init processing if input frm data is valid */
5875*c83a76b0SSuyog Pawar if(1 == ps_curr_inp->s_input_buf.i4_inp_frm_data_valid_flag)
5876*c83a76b0SSuyog Pawar {
5877*c83a76b0SSuyog Pawar WORD32 end_flag = ps_multi_thrd->ai4_end_flag_pre_enc[i4_cur_decomp_idx];
5878*c83a76b0SSuyog Pawar WORD32 cur_qp = 0, count;
5879*c83a76b0SSuyog Pawar
5880*c83a76b0SSuyog Pawar ihevce_pre_enc_init(
5881*c83a76b0SSuyog Pawar ps_enc_ctxt,
5882*c83a76b0SSuyog Pawar ps_curr_inp,
5883*c83a76b0SSuyog Pawar ps_curr_out,
5884*c83a76b0SSuyog Pawar &end_flag,
5885*c83a76b0SSuyog Pawar &cur_qp,
5886*c83a76b0SSuyog Pawar &ps_multi_thrd->ai4_decomp_lyr_buf_idx[i4_cur_decomp_idx],
5887*c83a76b0SSuyog Pawar i4_cur_decomp_idx);
5888*c83a76b0SSuyog Pawar
5889*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_end_flag_pre_enc[i4_cur_decomp_idx] = end_flag;
5890*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_cur_frame_qp_pre_enc[i4_cur_decomp_idx] = cur_qp;
5891*c83a76b0SSuyog Pawar
5892*c83a76b0SSuyog Pawar for(count = 0; count < ((HEVCE_MAX_HEIGHT >> 1) / 8); count++)
5893*c83a76b0SSuyog Pawar {
5894*c83a76b0SSuyog Pawar ps_multi_thrd->aai4_l1_pre_intra_done[i4_cur_decomp_idx][count] = 0;
5895*c83a76b0SSuyog Pawar }
5896*c83a76b0SSuyog Pawar }
5897*c83a76b0SSuyog Pawar }
5898*c83a76b0SSuyog Pawar }
5899*c83a76b0SSuyog Pawar else if(1 == i4_decomp_end_flag)
5900*c83a76b0SSuyog Pawar {
5901*c83a76b0SSuyog Pawar /* Once end is reached all subsequent flags are set to 1 to indicate end */
5902*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_end_flag_pre_enc[i4_cur_decomp_idx] = 1;
5903*c83a76b0SSuyog Pawar }
5904*c83a76b0SSuyog Pawar
5905*c83a76b0SSuyog Pawar /****** UnLock the critical section after decomp pre_intra init ******/
5906*c83a76b0SSuyog Pawar {
5907*c83a76b0SSuyog Pawar WORD32 i4_status;
5908*c83a76b0SSuyog Pawar i4_status = osal_mutex_unlock(ps_multi_thrd->pv_mutex_hdl_pre_enc_init);
5909*c83a76b0SSuyog Pawar
5910*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
5911*c83a76b0SSuyog Pawar return 0;
5912*c83a76b0SSuyog Pawar }
5913*c83a76b0SSuyog Pawar if(i4_thrd_id == 0)
5914*c83a76b0SSuyog Pawar {
5915*c83a76b0SSuyog Pawar PROFILE_START(&ps_hle_ctxt->profile_pre_enc_l1l2[i4_resolution_id]);
5916*c83a76b0SSuyog Pawar }
5917*c83a76b0SSuyog Pawar /* ------------------------------------------------------------ */
5918*c83a76b0SSuyog Pawar /* Layer Decomp and Pre Intra Analysis */
5919*c83a76b0SSuyog Pawar /* ------------------------------------------------------------ */
5920*c83a76b0SSuyog Pawar if(0 == i4_decomp_end_flag)
5921*c83a76b0SSuyog Pawar {
5922*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_out = ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_decomp_idx];
5923*c83a76b0SSuyog Pawar
5924*c83a76b0SSuyog Pawar if(1 == ps_curr_out->i4_frm_proc_valid_flag)
5925*c83a76b0SSuyog Pawar {
5926*c83a76b0SSuyog Pawar ihevce_decomp_pre_intra_process(
5927*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_decomp_pre_intra_ctxt,
5928*c83a76b0SSuyog Pawar &ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_decomp_idx]->s_lap_out,
5929*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms,
5930*c83a76b0SSuyog Pawar ps_multi_thrd,
5931*c83a76b0SSuyog Pawar i4_thrd_id,
5932*c83a76b0SSuyog Pawar i4_cur_decomp_idx);
5933*c83a76b0SSuyog Pawar }
5934*c83a76b0SSuyog Pawar }
5935*c83a76b0SSuyog Pawar
5936*c83a76b0SSuyog Pawar /* ------------------------------------------------------------ */
5937*c83a76b0SSuyog Pawar /* Layer Decomp and Pre Intra Deinit */
5938*c83a76b0SSuyog Pawar /* ------------------------------------------------------------ */
5939*c83a76b0SSuyog Pawar
5940*c83a76b0SSuyog Pawar /****** Lock the critical section for decomp deinit ******/
5941*c83a76b0SSuyog Pawar {
5942*c83a76b0SSuyog Pawar WORD32 i4_status;
5943*c83a76b0SSuyog Pawar i4_status = osal_mutex_lock(ps_multi_thrd->pv_mutex_hdl_pre_enc_decomp_deinit);
5944*c83a76b0SSuyog Pawar
5945*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
5946*c83a76b0SSuyog Pawar return 0;
5947*c83a76b0SSuyog Pawar }
5948*c83a76b0SSuyog Pawar
5949*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_decomp[i4_cur_decomp_idx]++;
5950*c83a76b0SSuyog Pawar i4_decomp_end_flag = ps_multi_thrd->ai4_end_flag_pre_enc[i4_cur_decomp_idx];
5951*c83a76b0SSuyog Pawar
5952*c83a76b0SSuyog Pawar /* check for last thread condition */
5953*c83a76b0SSuyog Pawar if(ps_multi_thrd->ai4_num_thrds_processed_decomp[i4_cur_decomp_idx] ==
5954*c83a76b0SSuyog Pawar ps_multi_thrd->i4_num_pre_enc_proc_thrds)
5955*c83a76b0SSuyog Pawar {
5956*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_decomp[i4_cur_decomp_idx] = 0;
5957*c83a76b0SSuyog Pawar
5958*c83a76b0SSuyog Pawar /* reset the init flag so that init happens by the first thread for the next frame
5959*c83a76b0SSuyog Pawar of same ping_pong instance */
5960*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_pre_enc_init_done[i4_cur_decomp_idx] = 0;
5961*c83a76b0SSuyog Pawar
5962*c83a76b0SSuyog Pawar /* update the pre enc l1 done in dep manager */
5963*c83a76b0SSuyog Pawar ihevce_dmgr_update_frm_frm_sync(pv_dep_mngr_prev_frame_pre_enc_l1);
5964*c83a76b0SSuyog Pawar }
5965*c83a76b0SSuyog Pawar
5966*c83a76b0SSuyog Pawar /* index increment */
5967*c83a76b0SSuyog Pawar i4_cur_decomp_idx = i4_cur_decomp_idx + 1;
5968*c83a76b0SSuyog Pawar
5969*c83a76b0SSuyog Pawar /* wrap around case */
5970*c83a76b0SSuyog Pawar if(i4_cur_decomp_idx >= ps_multi_thrd->i4_max_delay_pre_me_btw_l0_ipe)
5971*c83a76b0SSuyog Pawar {
5972*c83a76b0SSuyog Pawar i4_cur_decomp_idx = 0;
5973*c83a76b0SSuyog Pawar }
5974*c83a76b0SSuyog Pawar
5975*c83a76b0SSuyog Pawar /****** UnLock the critical section after decomp pre_intra deinit ******/
5976*c83a76b0SSuyog Pawar {
5977*c83a76b0SSuyog Pawar WORD32 i4_status;
5978*c83a76b0SSuyog Pawar i4_status = osal_mutex_unlock(ps_multi_thrd->pv_mutex_hdl_pre_enc_decomp_deinit);
5979*c83a76b0SSuyog Pawar
5980*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
5981*c83a76b0SSuyog Pawar return 0;
5982*c83a76b0SSuyog Pawar }
5983*c83a76b0SSuyog Pawar
5984*c83a76b0SSuyog Pawar /* ------------------------------------------------------------ */
5985*c83a76b0SSuyog Pawar /* HME Init */
5986*c83a76b0SSuyog Pawar /* ------------------------------------------------------------ */
5987*c83a76b0SSuyog Pawar
5988*c83a76b0SSuyog Pawar /* Wait till previous frame(instance)'s coarse_me is processed */
5989*c83a76b0SSuyog Pawar {
5990*c83a76b0SSuyog Pawar ihevce_dmgr_chk_frm_frm_sync(pv_dep_mngr_prev_frame_pre_enc_coarse_me, i4_thrd_id);
5991*c83a76b0SSuyog Pawar }
5992*c83a76b0SSuyog Pawar
5993*c83a76b0SSuyog Pawar /****** Lock the critical section for hme init ******/
5994*c83a76b0SSuyog Pawar {
5995*c83a76b0SSuyog Pawar WORD32 i4_status;
5996*c83a76b0SSuyog Pawar
5997*c83a76b0SSuyog Pawar i4_status = osal_mutex_lock(ps_multi_thrd->pv_mutex_hdl_pre_enc_hme_init);
5998*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
5999*c83a76b0SSuyog Pawar return 0;
6000*c83a76b0SSuyog Pawar }
6001*c83a76b0SSuyog Pawar
6002*c83a76b0SSuyog Pawar if(0 == ps_multi_thrd->ai4_pre_enc_hme_init_done[i4_cur_coarse_me_idx])
6003*c83a76b0SSuyog Pawar {
6004*c83a76b0SSuyog Pawar /* do the init processing if input frm data is valid */
6005*c83a76b0SSuyog Pawar if(1 ==
6006*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_coarse_me_idx]->i4_frm_proc_valid_flag)
6007*c83a76b0SSuyog Pawar {
6008*c83a76b0SSuyog Pawar recon_pic_buf_t *ps_frm_recon = NULL;
6009*c83a76b0SSuyog Pawar
6010*c83a76b0SSuyog Pawar /* DPB management for coarse me + HME init */
6011*c83a76b0SSuyog Pawar ihevce_pre_enc_coarse_me_init(
6012*c83a76b0SSuyog Pawar ps_enc_ctxt,
6013*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_coarse_me_idx],
6014*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_coarse_me_idx],
6015*c83a76b0SSuyog Pawar &ps_frm_recon,
6016*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_decomp_lyr_buf_idx[i4_cur_coarse_me_idx],
6017*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_cur_frame_qp_pre_enc[i4_cur_coarse_me_idx],
6018*c83a76b0SSuyog Pawar i4_cur_coarse_me_idx);
6019*c83a76b0SSuyog Pawar }
6020*c83a76b0SSuyog Pawar
6021*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_pre_enc_hme_init_done[i4_cur_coarse_me_idx] = 1;
6022*c83a76b0SSuyog Pawar }
6023*c83a76b0SSuyog Pawar
6024*c83a76b0SSuyog Pawar /****** Unlock the critical section for hme init ******/
6025*c83a76b0SSuyog Pawar {
6026*c83a76b0SSuyog Pawar WORD32 i4_status;
6027*c83a76b0SSuyog Pawar
6028*c83a76b0SSuyog Pawar i4_status = osal_mutex_unlock(ps_multi_thrd->pv_mutex_hdl_pre_enc_hme_init);
6029*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
6030*c83a76b0SSuyog Pawar return 0;
6031*c83a76b0SSuyog Pawar }
6032*c83a76b0SSuyog Pawar
6033*c83a76b0SSuyog Pawar /* ------------------------------------------------------------ */
6034*c83a76b0SSuyog Pawar /* Coarse Motion estimation and early intra-inter decision */
6035*c83a76b0SSuyog Pawar /* ------------------------------------------------------------ */
6036*c83a76b0SSuyog Pawar if(1 == ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_coarse_me_idx]->i4_frm_proc_valid_flag)
6037*c83a76b0SSuyog Pawar {
6038*c83a76b0SSuyog Pawar ihevce_coarse_me_process(
6039*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt,
6040*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_coarse_me_idx],
6041*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd,
6042*c83a76b0SSuyog Pawar i4_thrd_id,
6043*c83a76b0SSuyog Pawar i4_cur_coarse_me_idx);
6044*c83a76b0SSuyog Pawar }
6045*c83a76b0SSuyog Pawar
6046*c83a76b0SSuyog Pawar /* update the end flag */
6047*c83a76b0SSuyog Pawar i4_end_flag = ps_multi_thrd->ai4_end_flag_pre_enc[i4_cur_coarse_me_idx];
6048*c83a76b0SSuyog Pawar i4_out_flush_flag =
6049*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_coarse_me_idx]->s_lap_out.i4_out_flush_flag;
6050*c83a76b0SSuyog Pawar
6051*c83a76b0SSuyog Pawar /****** Lock the critical section for hme deinit ******/
6052*c83a76b0SSuyog Pawar {
6053*c83a76b0SSuyog Pawar WORD32 i4_status;
6054*c83a76b0SSuyog Pawar i4_status = osal_mutex_lock(ps_multi_thrd->pv_mutex_hdl_pre_enc_hme_deinit);
6055*c83a76b0SSuyog Pawar
6056*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
6057*c83a76b0SSuyog Pawar return 0;
6058*c83a76b0SSuyog Pawar }
6059*c83a76b0SSuyog Pawar
6060*c83a76b0SSuyog Pawar /* last thread finishing pre_enc_process will update the flag indicating
6061*c83a76b0SSuyog Pawar decomp and coarse ME is done. So that the next frame (next ping_pong instance)
6062*c83a76b0SSuyog Pawar can start immediately after finishing current frame's IPE */
6063*c83a76b0SSuyog Pawar if(1 == ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_coarse_me_idx]->i4_frm_proc_valid_flag)
6064*c83a76b0SSuyog Pawar {
6065*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_coarse_me[i4_cur_coarse_me_idx]++;
6066*c83a76b0SSuyog Pawar
6067*c83a76b0SSuyog Pawar /* ------------------------------------------------------------ */
6068*c83a76b0SSuyog Pawar /* Update qp used in based in L1 satd/act in case of scene cut */
6069*c83a76b0SSuyog Pawar /* ------------------------------------------------------------ */
6070*c83a76b0SSuyog Pawar {
6071*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp =
6072*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_coarse_me_idx];
6073*c83a76b0SSuyog Pawar
6074*c83a76b0SSuyog Pawar if(1 == ps_curr_inp->s_input_buf.i4_inp_frm_data_valid_flag)
6075*c83a76b0SSuyog Pawar {
6076*c83a76b0SSuyog Pawar WORD32 i4_prev_coarse_me_idx;
6077*c83a76b0SSuyog Pawar
6078*c83a76b0SSuyog Pawar /* wrap around case */
6079*c83a76b0SSuyog Pawar if(i4_cur_coarse_me_idx == 0)
6080*c83a76b0SSuyog Pawar {
6081*c83a76b0SSuyog Pawar i4_prev_coarse_me_idx = ps_multi_thrd->i4_max_delay_pre_me_btw_l0_ipe - 1;
6082*c83a76b0SSuyog Pawar }
6083*c83a76b0SSuyog Pawar else
6084*c83a76b0SSuyog Pawar {
6085*c83a76b0SSuyog Pawar i4_prev_coarse_me_idx = i4_cur_coarse_me_idx - 1;
6086*c83a76b0SSuyog Pawar }
6087*c83a76b0SSuyog Pawar
6088*c83a76b0SSuyog Pawar ihevce_update_qp_L1_sad_based(
6089*c83a76b0SSuyog Pawar ps_enc_ctxt,
6090*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_coarse_me_idx],
6091*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_prev_coarse_me_idx],
6092*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_coarse_me_idx],
6093*c83a76b0SSuyog Pawar ((ps_multi_thrd->ai4_num_thrds_processed_coarse_me[i4_cur_coarse_me_idx] ==
6094*c83a76b0SSuyog Pawar ps_multi_thrd->i4_num_pre_enc_proc_thrds)));
6095*c83a76b0SSuyog Pawar }
6096*c83a76b0SSuyog Pawar }
6097*c83a76b0SSuyog Pawar /* check for last thread condition */
6098*c83a76b0SSuyog Pawar if(ps_multi_thrd->ai4_num_thrds_processed_coarse_me[i4_cur_coarse_me_idx] ==
6099*c83a76b0SSuyog Pawar ps_multi_thrd->i4_num_pre_enc_proc_thrds)
6100*c83a76b0SSuyog Pawar {
6101*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp =
6102*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_coarse_me_idx];
6103*c83a76b0SSuyog Pawar
6104*c83a76b0SSuyog Pawar /* Frame END processing */
6105*c83a76b0SSuyog Pawar ihevce_coarse_me_frame_end(ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt);
6106*c83a76b0SSuyog Pawar
6107*c83a76b0SSuyog Pawar if(1 == ps_curr_inp->s_input_buf.i4_inp_frm_data_valid_flag)
6108*c83a76b0SSuyog Pawar {
6109*c83a76b0SSuyog Pawar WORD32 i4_enable_noise_detection = 0;
6110*c83a76b0SSuyog Pawar WORD32 i4_vqet = ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_vqet;
6111*c83a76b0SSuyog Pawar
6112*c83a76b0SSuyog Pawar if(i4_vqet & (1 << BITPOS_IN_VQ_TOGGLE_FOR_CONTROL_TOGGLER))
6113*c83a76b0SSuyog Pawar {
6114*c83a76b0SSuyog Pawar if(i4_vqet & (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_NOISE_PRESERVATION))
6115*c83a76b0SSuyog Pawar {
6116*c83a76b0SSuyog Pawar i4_enable_noise_detection = 1;
6117*c83a76b0SSuyog Pawar }
6118*c83a76b0SSuyog Pawar }
6119*c83a76b0SSuyog Pawar
6120*c83a76b0SSuyog Pawar if(1 != ((ps_curr_inp->s_lap_out.i4_pic_type == IV_B_FRAME) &&
6121*c83a76b0SSuyog Pawar (ps_enc_ctxt->s_lap_stat_prms.ai4_quality_preset[i4_resolution_id] ==
6122*c83a76b0SSuyog Pawar IHEVCE_QUALITY_P6)))
6123*c83a76b0SSuyog Pawar {
6124*c83a76b0SSuyog Pawar ihevce_decomp_pre_intra_curr_frame_pre_intra_deinit(
6125*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_decomp_pre_intra_ctxt,
6126*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_coarse_me_idx],
6127*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms);
6128*c83a76b0SSuyog Pawar }
6129*c83a76b0SSuyog Pawar }
6130*c83a76b0SSuyog Pawar
6131*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_decomp_coarse_me_complete_flag[i4_cur_coarse_me_idx] = 1;
6132*c83a76b0SSuyog Pawar
6133*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_coarse_me[i4_cur_coarse_me_idx] = 0;
6134*c83a76b0SSuyog Pawar
6135*c83a76b0SSuyog Pawar /* get the layer 1 ctxt to be passed on to encode group */
6136*c83a76b0SSuyog Pawar ihevce_coarse_me_get_lyr1_ctxt(
6137*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt,
6138*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_coarse_me_idx]->pv_me_lyr_ctxt,
6139*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_coarse_me_idx]->pv_me_lyr_bnk_ctxt);
6140*c83a76b0SSuyog Pawar
6141*c83a76b0SSuyog Pawar /* reset the init flag so that init happens by the first thread for the next frame
6142*c83a76b0SSuyog Pawar of same ping_pong instance */
6143*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_pre_enc_hme_init_done[i4_cur_coarse_me_idx] = 0;
6144*c83a76b0SSuyog Pawar
6145*c83a76b0SSuyog Pawar /* update the pre enc l1 done in dep manager */
6146*c83a76b0SSuyog Pawar ihevce_dmgr_update_frm_frm_sync(pv_dep_mngr_prev_frame_pre_enc_coarse_me);
6147*c83a76b0SSuyog Pawar }
6148*c83a76b0SSuyog Pawar
6149*c83a76b0SSuyog Pawar i4_num_buf_prod_for_l0_ipe++;
6150*c83a76b0SSuyog Pawar
6151*c83a76b0SSuyog Pawar /* index increment */
6152*c83a76b0SSuyog Pawar i4_cur_coarse_me_idx = i4_cur_coarse_me_idx + 1;
6153*c83a76b0SSuyog Pawar
6154*c83a76b0SSuyog Pawar /* wrap around case */
6155*c83a76b0SSuyog Pawar if(i4_cur_coarse_me_idx >= ps_multi_thrd->i4_max_delay_pre_me_btw_l0_ipe)
6156*c83a76b0SSuyog Pawar {
6157*c83a76b0SSuyog Pawar i4_cur_coarse_me_idx = 0;
6158*c83a76b0SSuyog Pawar }
6159*c83a76b0SSuyog Pawar }
6160*c83a76b0SSuyog Pawar else
6161*c83a76b0SSuyog Pawar {
6162*c83a76b0SSuyog Pawar /* for invalid frame set the processed flag to 1 for L0 IPE */
6163*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_decomp_coarse_me_complete_flag[i4_cur_coarse_me_idx] = 1;
6164*c83a76b0SSuyog Pawar
6165*c83a76b0SSuyog Pawar if(1 == i4_out_flush_flag)
6166*c83a76b0SSuyog Pawar {
6167*c83a76b0SSuyog Pawar /* update the num thrds who have finished pre-enc processing */
6168*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_coarse_me[i4_cur_coarse_me_idx]++;
6169*c83a76b0SSuyog Pawar
6170*c83a76b0SSuyog Pawar if(ps_multi_thrd->ai4_num_thrds_processed_coarse_me[i4_cur_coarse_me_idx] ==
6171*c83a76b0SSuyog Pawar ps_multi_thrd->i4_num_pre_enc_proc_thrds)
6172*c83a76b0SSuyog Pawar {
6173*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_decomp_coarse_me_complete_flag[i4_cur_coarse_me_idx] = 1;
6174*c83a76b0SSuyog Pawar
6175*c83a76b0SSuyog Pawar /* reset num thread finished counter */
6176*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_coarse_me[i4_cur_coarse_me_idx] = 0;
6177*c83a76b0SSuyog Pawar
6178*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_pre_enc_hme_init_done[i4_cur_coarse_me_idx] = 0;
6179*c83a76b0SSuyog Pawar
6180*c83a76b0SSuyog Pawar /* update flag indicating coarse_me and decomp is done */
6181*c83a76b0SSuyog Pawar ihevce_dmgr_update_frm_frm_sync(pv_dep_mngr_prev_frame_pre_enc_coarse_me);
6182*c83a76b0SSuyog Pawar }
6183*c83a76b0SSuyog Pawar }
6184*c83a76b0SSuyog Pawar
6185*c83a76b0SSuyog Pawar i4_num_buf_prod_for_l0_ipe++;
6186*c83a76b0SSuyog Pawar
6187*c83a76b0SSuyog Pawar /* index increment */
6188*c83a76b0SSuyog Pawar i4_cur_coarse_me_idx = i4_cur_coarse_me_idx + 1;
6189*c83a76b0SSuyog Pawar
6190*c83a76b0SSuyog Pawar /* wrap around case */
6191*c83a76b0SSuyog Pawar if(i4_cur_coarse_me_idx >= ps_multi_thrd->i4_max_delay_pre_me_btw_l0_ipe)
6192*c83a76b0SSuyog Pawar {
6193*c83a76b0SSuyog Pawar i4_cur_coarse_me_idx = 0;
6194*c83a76b0SSuyog Pawar }
6195*c83a76b0SSuyog Pawar }
6196*c83a76b0SSuyog Pawar
6197*c83a76b0SSuyog Pawar /****** UnLock the critical section after hme deinit ******/
6198*c83a76b0SSuyog Pawar {
6199*c83a76b0SSuyog Pawar WORD32 i4_status;
6200*c83a76b0SSuyog Pawar i4_status =
6201*c83a76b0SSuyog Pawar osal_mutex_unlock(ps_enc_ctxt->s_multi_thrd.pv_mutex_hdl_pre_enc_hme_deinit);
6202*c83a76b0SSuyog Pawar
6203*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
6204*c83a76b0SSuyog Pawar return 0;
6205*c83a76b0SSuyog Pawar }
6206*c83a76b0SSuyog Pawar
6207*c83a76b0SSuyog Pawar if(i4_thrd_id == 0)
6208*c83a76b0SSuyog Pawar {
6209*c83a76b0SSuyog Pawar PROFILE_STOP(&ps_hle_ctxt->profile_pre_enc_l1l2[i4_resolution_id], NULL);
6210*c83a76b0SSuyog Pawar }
6211*c83a76b0SSuyog Pawar
6212*c83a76b0SSuyog Pawar /* ----------------------------------------------------------- */
6213*c83a76b0SSuyog Pawar /* IPE init and process */
6214*c83a76b0SSuyog Pawar /* ----------------------------------------------------------- */
6215*c83a76b0SSuyog Pawar if(i4_thrd_id == 0)
6216*c83a76b0SSuyog Pawar {
6217*c83a76b0SSuyog Pawar PROFILE_START(&ps_hle_ctxt->profile_pre_enc_l0ipe[i4_resolution_id]);
6218*c83a76b0SSuyog Pawar }
6219*c83a76b0SSuyog Pawar if(i4_num_buf_prod_for_l0_ipe >= ps_multi_thrd->i4_delay_pre_me_btw_l0_ipe || i4_end_flag ||
6220*c83a76b0SSuyog Pawar i4_out_flush_flag)
6221*c83a76b0SSuyog Pawar {
6222*c83a76b0SSuyog Pawar do
6223*c83a76b0SSuyog Pawar {
6224*c83a76b0SSuyog Pawar /* Wait till previous frame(instance)'s IPE is processed */
6225*c83a76b0SSuyog Pawar {
6226*c83a76b0SSuyog Pawar ihevce_dmgr_chk_frm_frm_sync(pv_dep_mngr_prev_frame_pre_enc_l0, i4_thrd_id);
6227*c83a76b0SSuyog Pawar }
6228*c83a76b0SSuyog Pawar
6229*c83a76b0SSuyog Pawar /* Wait till current frame(instance)'s L1 and below layers are processed */
6230*c83a76b0SSuyog Pawar {
6231*c83a76b0SSuyog Pawar volatile WORD32 *pi4_cur_l1_complete =
6232*c83a76b0SSuyog Pawar &ps_multi_thrd->ai4_decomp_coarse_me_complete_flag[i4_cur_ipe_idx];
6233*c83a76b0SSuyog Pawar
6234*c83a76b0SSuyog Pawar while(1)
6235*c83a76b0SSuyog Pawar {
6236*c83a76b0SSuyog Pawar if(*pi4_cur_l1_complete)
6237*c83a76b0SSuyog Pawar break;
6238*c83a76b0SSuyog Pawar }
6239*c83a76b0SSuyog Pawar }
6240*c83a76b0SSuyog Pawar
6241*c83a76b0SSuyog Pawar /* ----------------------------------------------------------- */
6242*c83a76b0SSuyog Pawar /* L0 IPE qp init */
6243*c83a76b0SSuyog Pawar /* ----------------------------------------------------------- */
6244*c83a76b0SSuyog Pawar
6245*c83a76b0SSuyog Pawar /****** Lock the critical section for init ******/
6246*c83a76b0SSuyog Pawar {
6247*c83a76b0SSuyog Pawar WORD32 i4_status;
6248*c83a76b0SSuyog Pawar i4_status = osal_mutex_lock(ps_multi_thrd->pv_mutex_hdl_l0_ipe_init);
6249*c83a76b0SSuyog Pawar
6250*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
6251*c83a76b0SSuyog Pawar return 0;
6252*c83a76b0SSuyog Pawar }
6253*c83a76b0SSuyog Pawar
6254*c83a76b0SSuyog Pawar /* first thread that enters will calculate qp and write that to shared variable
6255*c83a76b0SSuyog Pawar that will be accessed by other threads */
6256*c83a76b0SSuyog Pawar if(ps_multi_thrd->ai4_num_thrds_processed_L0_ipe_qp_init[i4_cur_ipe_idx] == 0)
6257*c83a76b0SSuyog Pawar {
6258*c83a76b0SSuyog Pawar volatile WORD32 i4_is_qp_valid = -1;
6259*c83a76b0SSuyog Pawar WORD32 i4_update_qp;
6260*c83a76b0SSuyog Pawar WORD32 i4_cur_q_scale;
6261*c83a76b0SSuyog Pawar
6262*c83a76b0SSuyog Pawar i4_cur_q_scale =
6263*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx]->i4_curr_frm_qp;
6264*c83a76b0SSuyog Pawar i4_cur_q_scale = ps_enc_ctxt->s_rc_quant.pi4_qp_to_qscale[i4_cur_q_scale];
6265*c83a76b0SSuyog Pawar i4_cur_q_scale = (i4_cur_q_scale + (1 << (QSCALE_Q_FAC_3 - 1))) >>
6266*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3;
6267*c83a76b0SSuyog Pawar /* Get free buffer to store L0 IPE output to enc loop */
6268*c83a76b0SSuyog Pawar ps_multi_thrd->ps_L0_IPE_curr_out_pre_enc =
6269*c83a76b0SSuyog Pawar (pre_enc_L0_ipe_encloop_ctxt_t *)ihevce_q_get_free_buff(
6270*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
6271*c83a76b0SSuyog Pawar IHEVCE_L0_IPE_ENC_Q,
6272*c83a76b0SSuyog Pawar &ps_multi_thrd->i4_L0_IPE_out_buf_id,
6273*c83a76b0SSuyog Pawar BUFF_QUE_BLOCKING_MODE);
6274*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_pass_prms.i4_pass != 2 &&
6275*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_rate_control_mode != 3)
6276*c83a76b0SSuyog Pawar {
6277*c83a76b0SSuyog Pawar complexity_RC_reset_marking(
6278*c83a76b0SSuyog Pawar ps_enc_ctxt, i4_cur_ipe_idx, (i4_end_flag || i4_out_flush_flag));
6279*c83a76b0SSuyog Pawar }
6280*c83a76b0SSuyog Pawar if(1 == ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6281*c83a76b0SSuyog Pawar ->s_input_buf.i4_inp_frm_data_valid_flag)
6282*c83a76b0SSuyog Pawar {
6283*c83a76b0SSuyog Pawar while(i4_is_qp_valid == -1)
6284*c83a76b0SSuyog Pawar {
6285*c83a76b0SSuyog Pawar /*this rate control call is outside mutex lock to avoid deadlock. If this acquires mutex lock enc will not be able to
6286*c83a76b0SSuyog Pawar populate qp*/
6287*c83a76b0SSuyog Pawar i4_is_qp_valid = ihevce_rc_check_is_pre_enc_qp_valid(
6288*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0],
6289*c83a76b0SSuyog Pawar (volatile WORD32 *)&ps_enc_ctxt->s_multi_thrd.i4_force_end_flag);
6290*c83a76b0SSuyog Pawar if(1 == ps_enc_ctxt->s_multi_thrd.i4_force_end_flag)
6291*c83a76b0SSuyog Pawar {
6292*c83a76b0SSuyog Pawar /*** For force end condition break from this loop ***/
6293*c83a76b0SSuyog Pawar i4_is_qp_valid = 1;
6294*c83a76b0SSuyog Pawar break;
6295*c83a76b0SSuyog Pawar }
6296*c83a76b0SSuyog Pawar }
6297*c83a76b0SSuyog Pawar
6298*c83a76b0SSuyog Pawar /*lock rate control context*/
6299*c83a76b0SSuyog Pawar osal_mutex_lock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
6300*c83a76b0SSuyog Pawar
6301*c83a76b0SSuyog Pawar /* Qp query has to happen irrespective of using it or not since producer consumer logic will be disturbed */
6302*c83a76b0SSuyog Pawar i4_update_qp = ihevce_rc_pre_enc_qp_query(
6303*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0],
6304*c83a76b0SSuyog Pawar &ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]->s_rc_lap_out,
6305*c83a76b0SSuyog Pawar 0);
6306*c83a76b0SSuyog Pawar
6307*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_rate_control_mode != 3)
6308*c83a76b0SSuyog Pawar {
6309*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6310*c83a76b0SSuyog Pawar ->s_rc_lap_out.i8_frm_satd_act_accum_L0_frm_L1 =
6311*c83a76b0SSuyog Pawar ihevce_get_L0_satd_based_on_L1(
6312*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6313*c83a76b0SSuyog Pawar ->s_rc_lap_out.i8_frame_satd_by_act_L1_accum,
6314*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6315*c83a76b0SSuyog Pawar ->s_rc_lap_out.i4_num_pels_in_frame_considered,
6316*c83a76b0SSuyog Pawar i4_cur_q_scale);
6317*c83a76b0SSuyog Pawar
6318*c83a76b0SSuyog Pawar if(ps_enc_ctxt->ps_stat_prms->s_pass_prms.i4_pass != 2)
6319*c83a76b0SSuyog Pawar {
6320*c83a76b0SSuyog Pawar if(ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6321*c83a76b0SSuyog Pawar ->s_rc_lap_out.i4_rc_scene_type ==
6322*c83a76b0SSuyog Pawar SCENE_TYPE_SCENE_CUT ||
6323*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6324*c83a76b0SSuyog Pawar ->s_rc_lap_out.i4_is_I_only_scd ||
6325*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6326*c83a76b0SSuyog Pawar ->s_rc_lap_out.i4_is_non_I_scd == 1)
6327*c83a76b0SSuyog Pawar {
6328*c83a76b0SSuyog Pawar float i_to_avg_rest_ratio;
6329*c83a76b0SSuyog Pawar WORD32 i4_count = 0;
6330*c83a76b0SSuyog Pawar
6331*c83a76b0SSuyog Pawar while(1)
6332*c83a76b0SSuyog Pawar {
6333*c83a76b0SSuyog Pawar i_to_avg_rest_ratio = ihevce_get_i_to_avg_ratio(
6334*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0],
6335*c83a76b0SSuyog Pawar &ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6336*c83a76b0SSuyog Pawar ->s_rc_lap_out,
6337*c83a76b0SSuyog Pawar 1,
6338*c83a76b0SSuyog Pawar 0,
6339*c83a76b0SSuyog Pawar 0,
6340*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6341*c83a76b0SSuyog Pawar ->s_rc_lap_out.ai4_offsets,
6342*c83a76b0SSuyog Pawar 0);
6343*c83a76b0SSuyog Pawar /* HEVC_RC query rate control for qp */
6344*c83a76b0SSuyog Pawar i4_update_qp = ihevce_get_L0_est_satd_based_scd_qp(
6345*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0],
6346*c83a76b0SSuyog Pawar &ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6347*c83a76b0SSuyog Pawar ->s_rc_lap_out,
6348*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6349*c83a76b0SSuyog Pawar ->s_rc_lap_out.i8_frm_satd_act_accum_L0_frm_L1,
6350*c83a76b0SSuyog Pawar i_to_avg_rest_ratio);
6351*c83a76b0SSuyog Pawar
6352*c83a76b0SSuyog Pawar ihevce_set_L0_scd_qp(
6353*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[0],
6354*c83a76b0SSuyog Pawar i4_update_qp);
6355*c83a76b0SSuyog Pawar
6356*c83a76b0SSuyog Pawar if(ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6357*c83a76b0SSuyog Pawar ->s_lap_out.i4_pic_type != IV_IDR_FRAME &&
6358*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6359*c83a76b0SSuyog Pawar ->s_lap_out.i4_pic_type != IV_I_FRAME)
6360*c83a76b0SSuyog Pawar {
6361*c83a76b0SSuyog Pawar i4_update_qp +=
6362*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6363*c83a76b0SSuyog Pawar ->s_lap_out.i4_temporal_lyr_id +
6364*c83a76b0SSuyog Pawar 1;
6365*c83a76b0SSuyog Pawar
6366*c83a76b0SSuyog Pawar i4_update_qp =
6367*c83a76b0SSuyog Pawar CLIP3(i4_update_qp, MIN_HEVC_QP, MAX_HEVC_QP);
6368*c83a76b0SSuyog Pawar }
6369*c83a76b0SSuyog Pawar
6370*c83a76b0SSuyog Pawar i4_count++;
6371*c83a76b0SSuyog Pawar if((i4_update_qp ==
6372*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6373*c83a76b0SSuyog Pawar ->s_rc_lap_out.i4_L0_qp) ||
6374*c83a76b0SSuyog Pawar i4_count > 4)
6375*c83a76b0SSuyog Pawar break;
6376*c83a76b0SSuyog Pawar
6377*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6378*c83a76b0SSuyog Pawar ->s_rc_lap_out.i4_L0_qp = i4_update_qp;
6379*c83a76b0SSuyog Pawar }
6380*c83a76b0SSuyog Pawar }
6381*c83a76b0SSuyog Pawar }
6382*c83a76b0SSuyog Pawar else
6383*c83a76b0SSuyog Pawar {
6384*c83a76b0SSuyog Pawar //i4_update_qp = ihevce_get_first_pass_qp(ps_enc_ctxt->s_multi_thrd.aps_curr_inp_pre_enc[i4_cur_ipe_idx]->s_lap_out.pv_frame_info);
6385*c83a76b0SSuyog Pawar i4_update_qp = ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6386*c83a76b0SSuyog Pawar ->s_rc_lap_out.ps_frame_info->i4_rc_hevc_qp;
6387*c83a76b0SSuyog Pawar }
6388*c83a76b0SSuyog Pawar }
6389*c83a76b0SSuyog Pawar
6390*c83a76b0SSuyog Pawar {
6391*c83a76b0SSuyog Pawar WORD32 i4_index = 0;
6392*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_temp =
6393*c83a76b0SSuyog Pawar &ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]->s_rc_lap_out;
6394*c83a76b0SSuyog Pawar WORD32 i4_offset;
6395*c83a76b0SSuyog Pawar
6396*c83a76b0SSuyog Pawar if(ps_rc_lap_temp->i4_rc_pic_type != IV_IDR_FRAME &&
6397*c83a76b0SSuyog Pawar ps_rc_lap_temp->i4_rc_pic_type != IV_I_FRAME)
6398*c83a76b0SSuyog Pawar {
6399*c83a76b0SSuyog Pawar i4_index = ps_rc_lap_temp->i4_rc_temporal_lyr_id + 1;
6400*c83a76b0SSuyog Pawar }
6401*c83a76b0SSuyog Pawar i4_offset = ps_rc_lap_temp->ai4_offsets[i4_index];
6402*c83a76b0SSuyog Pawar ASSERT(i4_offset >= 0);
6403*c83a76b0SSuyog Pawar /* Map the current frame Qp to L0 Qp */
6404*c83a76b0SSuyog Pawar ps_rc_lap_temp->i4_L0_qp = i4_update_qp - i4_offset;
6405*c83a76b0SSuyog Pawar }
6406*c83a76b0SSuyog Pawar osal_mutex_unlock(ps_enc_ctxt->pv_rc_mutex_lock_hdl);
6407*c83a76b0SSuyog Pawar ASSERT(ps_multi_thrd->i4_qp_update_l0_ipe == -1);
6408*c83a76b0SSuyog Pawar ps_multi_thrd->i4_qp_update_l0_ipe = i4_update_qp;
6409*c83a76b0SSuyog Pawar ps_multi_thrd->i4_rc_l0_qp = i4_update_qp;
6410*c83a76b0SSuyog Pawar }
6411*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6412*c83a76b0SSuyog Pawar ->s_lap_out.f_i_pic_lamda_modifier = CONST_LAMDA_MOD_VAL;
6413*c83a76b0SSuyog Pawar }
6414*c83a76b0SSuyog Pawar /* update qp only if it is not scene cut since it has already been
6415*c83a76b0SSuyog Pawar populated in L1 for scene cut frames */
6416*c83a76b0SSuyog Pawar if(1 == ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6417*c83a76b0SSuyog Pawar ->s_input_buf.i4_inp_frm_data_valid_flag &&
6418*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_rate_control_mode != 3)
6419*c83a76b0SSuyog Pawar {
6420*c83a76b0SSuyog Pawar /*get relevant lambda params*/
6421*c83a76b0SSuyog Pawar ihevce_get_frame_lambda_prms(
6422*c83a76b0SSuyog Pawar ps_enc_ctxt,
6423*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx],
6424*c83a76b0SSuyog Pawar ps_multi_thrd->i4_qp_update_l0_ipe,
6425*c83a76b0SSuyog Pawar ps_enc_ctxt->s_runtime_src_prms.i4_field_pic,
6426*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]->s_lap_out.i4_is_ref_pic,
6427*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6428*c83a76b0SSuyog Pawar ->s_lap_out.i4_temporal_lyr_id,
6429*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6430*c83a76b0SSuyog Pawar ->s_lap_out.f_i_pic_lamda_modifier,
6431*c83a76b0SSuyog Pawar 0,
6432*c83a76b0SSuyog Pawar PRE_ENC_LAMBDA_TYPE);
6433*c83a76b0SSuyog Pawar
6434*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx]->i4_curr_frm_qp =
6435*c83a76b0SSuyog Pawar ps_multi_thrd->i4_qp_update_l0_ipe;
6436*c83a76b0SSuyog Pawar }
6437*c83a76b0SSuyog Pawar /* Compute accumulated activity and strength */
6438*c83a76b0SSuyog Pawar if(1 == ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6439*c83a76b0SSuyog Pawar ->s_input_buf.i4_inp_frm_data_valid_flag &&
6440*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_L0_ipe_qp_init[i4_cur_ipe_idx] == 0)
6441*c83a76b0SSuyog Pawar {
6442*c83a76b0SSuyog Pawar ihevce_variance_calc_acc_activity(ps_enc_ctxt, i4_cur_ipe_idx);
6443*c83a76b0SSuyog Pawar }
6444*c83a76b0SSuyog Pawar
6445*c83a76b0SSuyog Pawar /* Mark qp as read by last thread */
6446*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_L0_ipe_qp_init[i4_cur_ipe_idx]++;
6447*c83a76b0SSuyog Pawar if(ps_multi_thrd->ai4_num_thrds_processed_L0_ipe_qp_init[i4_cur_ipe_idx] ==
6448*c83a76b0SSuyog Pawar ps_multi_thrd->i4_num_pre_enc_proc_thrds)
6449*c83a76b0SSuyog Pawar {
6450*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_L0_ipe_qp_init[i4_cur_ipe_idx] = 0;
6451*c83a76b0SSuyog Pawar ps_multi_thrd->i4_qp_update_l0_ipe = -1;
6452*c83a76b0SSuyog Pawar }
6453*c83a76b0SSuyog Pawar
6454*c83a76b0SSuyog Pawar /****** UnLock the critical section after deinit ******/
6455*c83a76b0SSuyog Pawar {
6456*c83a76b0SSuyog Pawar WORD32 i4_status;
6457*c83a76b0SSuyog Pawar i4_status = osal_mutex_unlock(ps_multi_thrd->pv_mutex_hdl_l0_ipe_init);
6458*c83a76b0SSuyog Pawar
6459*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
6460*c83a76b0SSuyog Pawar return 0;
6461*c83a76b0SSuyog Pawar }
6462*c83a76b0SSuyog Pawar
6463*c83a76b0SSuyog Pawar if(1 == ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6464*c83a76b0SSuyog Pawar ->s_input_buf.i4_inp_frm_data_valid_flag)
6465*c83a76b0SSuyog Pawar {
6466*c83a76b0SSuyog Pawar WORD32 i4_slice_type =
6467*c83a76b0SSuyog Pawar (WORD32)ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx]
6468*c83a76b0SSuyog Pawar ->s_slice_hdr.i1_slice_type;
6469*c83a76b0SSuyog Pawar WORD32 i4_quality_preset =
6470*c83a76b0SSuyog Pawar (WORD32)ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6471*c83a76b0SSuyog Pawar ->s_lap_out.i4_quality_preset;
6472*c83a76b0SSuyog Pawar WORD32 i4_temporal_layer_id =
6473*c83a76b0SSuyog Pawar (WORD32)ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]
6474*c83a76b0SSuyog Pawar ->s_lap_out.i4_temporal_lyr_id;
6475*c83a76b0SSuyog Pawar #if DISABLE_L0_IPE_INTRA_IN_BPICS
6476*c83a76b0SSuyog Pawar if(1 != ((i4_quality_preset == IHEVCE_QUALITY_P6) &&
6477*c83a76b0SSuyog Pawar (i4_temporal_layer_id > TEMPORAL_LAYER_DISABLE)))
6478*c83a76b0SSuyog Pawar #endif
6479*c83a76b0SSuyog Pawar {
6480*c83a76b0SSuyog Pawar UWORD8 i1_cu_qp_delta_enabled_flag =
6481*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_cu_level_rc;
6482*c83a76b0SSuyog Pawar
6483*c83a76b0SSuyog Pawar ihevce_populate_ipe_frame_init(
6484*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_ipe_ctxt,
6485*c83a76b0SSuyog Pawar ps_enc_ctxt->ps_stat_prms,
6486*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx]->i4_curr_frm_qp,
6487*c83a76b0SSuyog Pawar i4_slice_type,
6488*c83a76b0SSuyog Pawar i4_thrd_id,
6489*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx],
6490*c83a76b0SSuyog Pawar i1_cu_qp_delta_enabled_flag,
6491*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_rc_quant,
6492*c83a76b0SSuyog Pawar i4_quality_preset,
6493*c83a76b0SSuyog Pawar i4_temporal_layer_id,
6494*c83a76b0SSuyog Pawar &ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx]->s_lap_out);
6495*c83a76b0SSuyog Pawar
6496*c83a76b0SSuyog Pawar ihevce_ipe_process(
6497*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_ipe_ctxt,
6498*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_frm_ctb_prms,
6499*c83a76b0SSuyog Pawar &ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx]->as_lambda_prms[0],
6500*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx],
6501*c83a76b0SSuyog Pawar ps_multi_thrd->ps_L0_IPE_curr_out_pre_enc,
6502*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx]->ps_ctb_analyse,
6503*c83a76b0SSuyog Pawar ps_multi_thrd->ps_L0_IPE_curr_out_pre_enc->ps_ipe_analyse_ctb,
6504*c83a76b0SSuyog Pawar &ps_enc_ctxt->s_multi_thrd,
6505*c83a76b0SSuyog Pawar i4_slice_type,
6506*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx]->ps_layer1_buf,
6507*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx]->ps_layer2_buf,
6508*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx]->ps_ed_ctb_l1,
6509*c83a76b0SSuyog Pawar i4_thrd_id,
6510*c83a76b0SSuyog Pawar i4_cur_ipe_idx);
6511*c83a76b0SSuyog Pawar }
6512*c83a76b0SSuyog Pawar }
6513*c83a76b0SSuyog Pawar
6514*c83a76b0SSuyog Pawar /* ----------------------------------------------------------- */
6515*c83a76b0SSuyog Pawar /* pre-enc de-init */
6516*c83a76b0SSuyog Pawar /* ----------------------------------------------------------- */
6517*c83a76b0SSuyog Pawar
6518*c83a76b0SSuyog Pawar /****** Lock the critical section for deinit ******/
6519*c83a76b0SSuyog Pawar {
6520*c83a76b0SSuyog Pawar WORD32 i4_status;
6521*c83a76b0SSuyog Pawar i4_status = osal_mutex_lock(ps_multi_thrd->pv_mutex_hdl_pre_enc_deinit);
6522*c83a76b0SSuyog Pawar
6523*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
6524*c83a76b0SSuyog Pawar return 0;
6525*c83a76b0SSuyog Pawar }
6526*c83a76b0SSuyog Pawar
6527*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_pre_enc[i4_cur_ipe_idx]++;
6528*c83a76b0SSuyog Pawar if(ps_multi_thrd->ai4_num_thrds_processed_pre_enc[i4_cur_ipe_idx] ==
6529*c83a76b0SSuyog Pawar ps_multi_thrd->i4_num_pre_enc_proc_thrds)
6530*c83a76b0SSuyog Pawar {
6531*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_pre_enc_deinit_done[i4_cur_ipe_idx] = 0;
6532*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_num_thrds_processed_pre_enc[i4_cur_ipe_idx] = 0;
6533*c83a76b0SSuyog Pawar
6534*c83a76b0SSuyog Pawar /* reset the init flag so that init happens by the first thread for the
6535*c83a76b0SSuyog Pawar next frame of same ping_pnog instnace */
6536*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_pre_enc_init_done[i4_cur_ipe_idx] = 0;
6537*c83a76b0SSuyog Pawar }
6538*c83a76b0SSuyog Pawar
6539*c83a76b0SSuyog Pawar /* de-init */
6540*c83a76b0SSuyog Pawar if(0 == ps_multi_thrd->ai4_pre_enc_deinit_done[i4_cur_ipe_idx])
6541*c83a76b0SSuyog Pawar {
6542*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp =
6543*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_inp_pre_enc[i4_cur_ipe_idx];
6544*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_out =
6545*c83a76b0SSuyog Pawar ps_multi_thrd->aps_curr_out_pre_enc[i4_cur_ipe_idx];
6546*c83a76b0SSuyog Pawar
6547*c83a76b0SSuyog Pawar /* set the flag saying de init is done so that other cores dont do it */
6548*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_pre_enc_deinit_done[i4_cur_ipe_idx] = 1;
6549*c83a76b0SSuyog Pawar
6550*c83a76b0SSuyog Pawar if(1 == ps_curr_out->i4_frm_proc_valid_flag)
6551*c83a76b0SSuyog Pawar {
6552*c83a76b0SSuyog Pawar LWORD64 frame_acc_satd_by_modqp;
6553*c83a76b0SSuyog Pawar float L1_full_processed_ratio;
6554*c83a76b0SSuyog Pawar
6555*c83a76b0SSuyog Pawar if(ps_curr_inp->s_rc_lap_out.i8_satd_by_act_L1_accum_evaluated)
6556*c83a76b0SSuyog Pawar {
6557*c83a76b0SSuyog Pawar L1_full_processed_ratio =
6558*c83a76b0SSuyog Pawar ((float)ps_curr_inp->s_rc_lap_out.i8_frame_satd_by_act_L1_accum /
6559*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_satd_by_act_L1_accum_evaluated);
6560*c83a76b0SSuyog Pawar }
6561*c83a76b0SSuyog Pawar else
6562*c83a76b0SSuyog Pawar {
6563*c83a76b0SSuyog Pawar L1_full_processed_ratio = 1.0;
6564*c83a76b0SSuyog Pawar }
6565*c83a76b0SSuyog Pawar /* Get frame-level satd cost and mode bit cost from IPE */
6566*c83a76b0SSuyog Pawar ps_curr_out->i8_frame_acc_satd_cost = ihevce_ipe_get_frame_intra_satd_cost(
6567*c83a76b0SSuyog Pawar ps_enc_ctxt->s_module_ctxt.pv_ipe_ctxt,
6568*c83a76b0SSuyog Pawar &frame_acc_satd_by_modqp,
6569*c83a76b0SSuyog Pawar &ps_curr_inp->s_rc_lap_out.i8_est_I_pic_header_bits,
6570*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.i8_frame_level_activity_fact,
6571*c83a76b0SSuyog Pawar &ps_curr_inp->s_lap_out.i8_frame_l0_acc_satd);
6572*c83a76b0SSuyog Pawar
6573*c83a76b0SSuyog Pawar if((ps_curr_inp->s_lap_out.i4_quality_preset == IHEVCE_QUALITY_P6) &&
6574*c83a76b0SSuyog Pawar (ps_curr_inp->s_lap_out.i4_temporal_lyr_id > TEMPORAL_LAYER_DISABLE))
6575*c83a76b0SSuyog Pawar {
6576*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_est_I_pic_header_bits = -1;
6577*c83a76b0SSuyog Pawar }
6578*c83a76b0SSuyog Pawar
6579*c83a76b0SSuyog Pawar {
6580*c83a76b0SSuyog Pawar WORD32 i4_cur_q_scale = (ps_enc_ctxt->s_rc_quant.pi4_qp_to_qscale
6581*c83a76b0SSuyog Pawar [ps_enc_ctxt->s_multi_thrd.i4_rc_l0_qp +
6582*c83a76b0SSuyog Pawar ps_enc_ctxt->s_rc_quant.i1_qp_offset] +
6583*c83a76b0SSuyog Pawar (1 << (QSCALE_Q_FAC_3 - 1))) >>
6584*c83a76b0SSuyog Pawar QSCALE_Q_FAC_3;
6585*c83a76b0SSuyog Pawar
6586*c83a76b0SSuyog Pawar /* calculate satd/act_fac = satd/qm * (qp_used_at_L0_analysis) */
6587*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_frame_satd_act_accum =
6588*c83a76b0SSuyog Pawar frame_acc_satd_by_modqp * i4_cur_q_scale;
6589*c83a76b0SSuyog Pawar }
6590*c83a76b0SSuyog Pawar
6591*c83a76b0SSuyog Pawar /* Because of early intra inter decision, L0 intra analysis might not happen for entire frame, correct the error
6592*c83a76b0SSuyog Pawar based on L1 data */
6593*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_est_I_pic_header_bits = (LWORD64)(
6594*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_est_I_pic_header_bits *
6595*c83a76b0SSuyog Pawar L1_full_processed_ratio);
6596*c83a76b0SSuyog Pawar
6597*c83a76b0SSuyog Pawar if(L1_full_processed_ratio < 1.5)
6598*c83a76b0SSuyog Pawar {
6599*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_frame_satd_act_accum = (LWORD64)(
6600*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_frame_satd_act_accum *
6601*c83a76b0SSuyog Pawar L1_full_processed_ratio);
6602*c83a76b0SSuyog Pawar }
6603*c83a76b0SSuyog Pawar else
6604*c83a76b0SSuyog Pawar {
6605*c83a76b0SSuyog Pawar /* This is the case when too many candidates would not have gone through intra analysis, scaling based on L1 is found to be inappropriate,
6606*c83a76b0SSuyog Pawar Hence directly estimating L0 satd from L1 satd */
6607*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_frame_satd_act_accum =
6608*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_frm_satd_act_accum_L0_frm_L1;
6609*c83a76b0SSuyog Pawar }
6610*c83a76b0SSuyog Pawar }
6611*c83a76b0SSuyog Pawar
6612*c83a76b0SSuyog Pawar /* register the current input buffer to be cnosumed by encode group threads */
6613*c83a76b0SSuyog Pawar ps_curr_out->curr_inp_buf_id =
6614*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_in_buf_id_pre_enc[i4_cur_ipe_idx];
6615*c83a76b0SSuyog Pawar ps_curr_out->ps_curr_inp = ps_curr_inp;
6616*c83a76b0SSuyog Pawar
6617*c83a76b0SSuyog Pawar /* set the output buffer as produced */
6618*c83a76b0SSuyog Pawar ihevce_q_set_buff_prod(
6619*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
6620*c83a76b0SSuyog Pawar IHEVCE_PRE_ENC_ME_Q,
6621*c83a76b0SSuyog Pawar ps_multi_thrd->ai4_out_buf_id_pre_enc[i4_cur_ipe_idx]);
6622*c83a76b0SSuyog Pawar
6623*c83a76b0SSuyog Pawar /* set the output buffer of L0 IPE as produced */
6624*c83a76b0SSuyog Pawar ihevce_q_set_buff_prod(
6625*c83a76b0SSuyog Pawar (void *)ps_enc_ctxt,
6626*c83a76b0SSuyog Pawar IHEVCE_L0_IPE_ENC_Q,
6627*c83a76b0SSuyog Pawar ps_multi_thrd->i4_L0_IPE_out_buf_id);
6628*c83a76b0SSuyog Pawar
6629*c83a76b0SSuyog Pawar /* update flag indicating ipe is done */
6630*c83a76b0SSuyog Pawar ihevce_dmgr_update_frm_frm_sync(pv_dep_mngr_prev_frame_pre_enc_l0);
6631*c83a76b0SSuyog Pawar }
6632*c83a76b0SSuyog Pawar
6633*c83a76b0SSuyog Pawar {
6634*c83a76b0SSuyog Pawar /* index increment */
6635*c83a76b0SSuyog Pawar i4_cur_ipe_idx = i4_cur_ipe_idx + 1;
6636*c83a76b0SSuyog Pawar
6637*c83a76b0SSuyog Pawar /* wrap around case */
6638*c83a76b0SSuyog Pawar if(i4_cur_ipe_idx >= ps_multi_thrd->i4_max_delay_pre_me_btw_l0_ipe)
6639*c83a76b0SSuyog Pawar {
6640*c83a76b0SSuyog Pawar i4_cur_ipe_idx = 0;
6641*c83a76b0SSuyog Pawar }
6642*c83a76b0SSuyog Pawar
6643*c83a76b0SSuyog Pawar i4_num_buf_prod_for_l0_ipe--;
6644*c83a76b0SSuyog Pawar }
6645*c83a76b0SSuyog Pawar /*NOTE: update of above indices should mark end if ipe.do not access below this*/
6646*c83a76b0SSuyog Pawar
6647*c83a76b0SSuyog Pawar /****** UnLock the critical section after deinit ******/
6648*c83a76b0SSuyog Pawar {
6649*c83a76b0SSuyog Pawar WORD32 i4_status;
6650*c83a76b0SSuyog Pawar i4_status = osal_mutex_unlock(ps_multi_thrd->pv_mutex_hdl_pre_enc_deinit);
6651*c83a76b0SSuyog Pawar
6652*c83a76b0SSuyog Pawar if(OSAL_SUCCESS != i4_status)
6653*c83a76b0SSuyog Pawar return 0;
6654*c83a76b0SSuyog Pawar }
6655*c83a76b0SSuyog Pawar
6656*c83a76b0SSuyog Pawar if(1 == ps_multi_thrd->i4_force_end_flag)
6657*c83a76b0SSuyog Pawar {
6658*c83a76b0SSuyog Pawar i4_end_flag = 1;
6659*c83a76b0SSuyog Pawar break;
6660*c83a76b0SSuyog Pawar }
6661*c83a76b0SSuyog Pawar } while((i4_end_flag || i4_out_flush_flag) && i4_num_buf_prod_for_l0_ipe);
6662*c83a76b0SSuyog Pawar }
6663*c83a76b0SSuyog Pawar if(i4_thrd_id == 0)
6664*c83a76b0SSuyog Pawar {
6665*c83a76b0SSuyog Pawar PROFILE_STOP(&ps_hle_ctxt->profile_pre_enc_l0ipe[i4_resolution_id], NULL);
6666*c83a76b0SSuyog Pawar }
6667*c83a76b0SSuyog Pawar }
6668*c83a76b0SSuyog Pawar
6669*c83a76b0SSuyog Pawar return 0;
6670*c83a76b0SSuyog Pawar }
6671*c83a76b0SSuyog Pawar
calc_l1_level_hme_intra_sad_different_qp(enc_ctxt_t * ps_enc_ctxt,pre_enc_me_ctxt_t * ps_curr_out,ihevce_lap_enc_buf_t * ps_curr_inp,WORD32 i4_tot_ctb_l1_x,WORD32 i4_tot_ctb_l1_y)6672*c83a76b0SSuyog Pawar void calc_l1_level_hme_intra_sad_different_qp(
6673*c83a76b0SSuyog Pawar enc_ctxt_t *ps_enc_ctxt,
6674*c83a76b0SSuyog Pawar pre_enc_me_ctxt_t *ps_curr_out,
6675*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp,
6676*c83a76b0SSuyog Pawar WORD32 i4_tot_ctb_l1_x,
6677*c83a76b0SSuyog Pawar WORD32 i4_tot_ctb_l1_y)
6678*c83a76b0SSuyog Pawar {
6679*c83a76b0SSuyog Pawar ihevce_ed_ctb_l1_t *ps_ed_ctb_l1;
6680*c83a76b0SSuyog Pawar WORD32 i4_qp_counter, i4_qp_start = 0, i4_qp_end = 0, i, i4_j, i4_new_frame_qp;
6681*c83a76b0SSuyog Pawar LWORD64 i8_l1_intra_sad_nc_accounted = 0, cur_intra_sad, raw_hme_sad = 0;
6682*c83a76b0SSuyog Pawar LWORD64 cur_hme_sad = 0, cur_hme_sad_for_offset = 0, acc_hme_l1_sad = 0,
6683*c83a76b0SSuyog Pawar acc_hme_l1_sad_for_offset = 0;
6684*c83a76b0SSuyog Pawar i4_qp_start = 1;
6685*c83a76b0SSuyog Pawar i4_qp_end = 51;
6686*c83a76b0SSuyog Pawar
6687*c83a76b0SSuyog Pawar for(i4_qp_counter = i4_qp_start; i4_qp_counter <= i4_qp_end; i4_qp_counter = i4_qp_counter + 3)
6688*c83a76b0SSuyog Pawar {
6689*c83a76b0SSuyog Pawar i8_l1_intra_sad_nc_accounted = 0;
6690*c83a76b0SSuyog Pawar cur_intra_sad = 0;
6691*c83a76b0SSuyog Pawar raw_hme_sad = 0;
6692*c83a76b0SSuyog Pawar cur_hme_sad = 0;
6693*c83a76b0SSuyog Pawar cur_hme_sad_for_offset = 0;
6694*c83a76b0SSuyog Pawar acc_hme_l1_sad = 0;
6695*c83a76b0SSuyog Pawar ps_ed_ctb_l1 = ps_curr_out->ps_ed_ctb_l1;
6696*c83a76b0SSuyog Pawar i4_new_frame_qp = i4_qp_counter;
6697*c83a76b0SSuyog Pawar acc_hme_l1_sad = 0;
6698*c83a76b0SSuyog Pawar
6699*c83a76b0SSuyog Pawar for(i = 0; i < (i4_tot_ctb_l1_x * i4_tot_ctb_l1_y); i += 1)
6700*c83a76b0SSuyog Pawar {
6701*c83a76b0SSuyog Pawar for(i4_j = 0; i4_j < 16; i4_j++)
6702*c83a76b0SSuyog Pawar {
6703*c83a76b0SSuyog Pawar if(ps_ed_ctb_l1->i4_best_sad_8x8_l1_ipe[i4_j] != -1)
6704*c83a76b0SSuyog Pawar {
6705*c83a76b0SSuyog Pawar ASSERT(ps_ed_ctb_l1->i4_best_sad_8x8_l1_ipe[i4_j] >= 0);
6706*c83a76b0SSuyog Pawar if(ps_curr_inp->s_rc_lap_out.i4_rc_pic_type != IV_I_FRAME &&
6707*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i4_rc_pic_type != IV_IDR_FRAME)
6708*c83a76b0SSuyog Pawar {
6709*c83a76b0SSuyog Pawar /*When l1 is disabled for B pics i4_best_sad_8x8_l1_ipe is set to max value always,
6710*c83a76b0SSuyog Pawar so will enter this path even for incomplete ctb, hence the assert holdsto good only for P pic */
6711*c83a76b0SSuyog Pawar if(ps_curr_inp->s_rc_lap_out.i4_rc_quality_preset == IHEVCE_QUALITY_P6)
6712*c83a76b0SSuyog Pawar {
6713*c83a76b0SSuyog Pawar if(ps_curr_inp->s_rc_lap_out.i4_rc_pic_type == IV_P_FRAME)
6714*c83a76b0SSuyog Pawar {
6715*c83a76b0SSuyog Pawar ASSERT(ps_ed_ctb_l1->i4_best_sad_8x8_l1_me[i4_j] >= 0);
6716*c83a76b0SSuyog Pawar ASSERT(ps_ed_ctb_l1->i4_best_sad_8x8_l1_me_for_decide[i4_j] >= 0);
6717*c83a76b0SSuyog Pawar }
6718*c83a76b0SSuyog Pawar }
6719*c83a76b0SSuyog Pawar else
6720*c83a76b0SSuyog Pawar {
6721*c83a76b0SSuyog Pawar ASSERT(ps_ed_ctb_l1->i4_best_sad_8x8_l1_me[i4_j] >= 0);
6722*c83a76b0SSuyog Pawar ASSERT(ps_ed_ctb_l1->i4_best_sad_8x8_l1_me_for_decide[i4_j] >= 0);
6723*c83a76b0SSuyog Pawar }
6724*c83a76b0SSuyog Pawar
6725*c83a76b0SSuyog Pawar #if 1 //DISABLE_L1_L2_IPE_INTRA_IN_BPICS && RC_DEPENDENCY_FOR_BPIC
6726*c83a76b0SSuyog Pawar if((ps_ed_ctb_l1->i4_best_sad_8x8_l1_me[i4_j] != -1))
6727*c83a76b0SSuyog Pawar #endif
6728*c83a76b0SSuyog Pawar {
6729*c83a76b0SSuyog Pawar cur_hme_sad = ps_ed_ctb_l1->i4_best_sad_8x8_l1_me[i4_j] -
6730*c83a76b0SSuyog Pawar (QP2QUANT_MD[i4_new_frame_qp] << 3);
6731*c83a76b0SSuyog Pawar }
6732*c83a76b0SSuyog Pawar raw_hme_sad += ps_ed_ctb_l1->i4_best_sad_8x8_l1_me[i4_j];
6733*c83a76b0SSuyog Pawar
6734*c83a76b0SSuyog Pawar if(cur_hme_sad > 0)
6735*c83a76b0SSuyog Pawar acc_hme_l1_sad += cur_hme_sad;
6736*c83a76b0SSuyog Pawar }
6737*c83a76b0SSuyog Pawar if(cur_hme_sad_for_offset > 0)
6738*c83a76b0SSuyog Pawar {
6739*c83a76b0SSuyog Pawar acc_hme_l1_sad_for_offset += cur_hme_sad_for_offset;
6740*c83a76b0SSuyog Pawar }
6741*c83a76b0SSuyog Pawar ASSERT(ps_ed_ctb_l1->i4_best_sad_8x8_l1_ipe[i4_j] >= 0);
6742*c83a76b0SSuyog Pawar /*intra sad is scaled by 1.17 to be account for 1/3 vs 1/6th rounding*/
6743*c83a76b0SSuyog Pawar cur_intra_sad = (LWORD64)(
6744*c83a76b0SSuyog Pawar (ps_ed_ctb_l1->i4_best_sad_8x8_l1_ipe[i4_j] * 1.17) -
6745*c83a76b0SSuyog Pawar (QP2QUANT_MD[i4_new_frame_qp] << 3));
6746*c83a76b0SSuyog Pawar
6747*c83a76b0SSuyog Pawar if(cur_intra_sad > 0)
6748*c83a76b0SSuyog Pawar i8_l1_intra_sad_nc_accounted += cur_intra_sad;
6749*c83a76b0SSuyog Pawar }
6750*c83a76b0SSuyog Pawar }
6751*c83a76b0SSuyog Pawar ps_ed_ctb_l1 += 1;
6752*c83a76b0SSuyog Pawar }
6753*c83a76b0SSuyog Pawar if((ps_curr_inp->s_rc_lap_out.i4_rc_quality_preset == IHEVCE_QUALITY_P6) &&
6754*c83a76b0SSuyog Pawar (ps_curr_inp->s_rc_lap_out.i4_rc_pic_type == IV_B_FRAME))
6755*c83a76b0SSuyog Pawar {
6756*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_pre_intra_sad[i4_qp_counter] = -1;
6757*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_pre_intra_sad[i4_qp_counter + 1] = -1;
6758*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_pre_intra_sad[i4_qp_counter + 2] = -1;
6759*c83a76b0SSuyog Pawar }
6760*c83a76b0SSuyog Pawar else
6761*c83a76b0SSuyog Pawar {
6762*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_pre_intra_sad[i4_qp_counter] =
6763*c83a76b0SSuyog Pawar i8_l1_intra_sad_nc_accounted;
6764*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_pre_intra_sad[i4_qp_counter + 1] =
6765*c83a76b0SSuyog Pawar i8_l1_intra_sad_nc_accounted;
6766*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_pre_intra_sad[i4_qp_counter + 2] =
6767*c83a76b0SSuyog Pawar i8_l1_intra_sad_nc_accounted;
6768*c83a76b0SSuyog Pawar }
6769*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_frame_acc_coarse_me_sad[i4_qp_counter] = acc_hme_l1_sad;
6770*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_frame_acc_coarse_me_sad[i4_qp_counter + 1] = acc_hme_l1_sad;
6771*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.ai8_frame_acc_coarse_me_sad[i4_qp_counter + 2] = acc_hme_l1_sad;
6772*c83a76b0SSuyog Pawar ps_curr_inp->s_rc_lap_out.i8_raw_l1_coarse_me_sad = raw_hme_sad;
6773*c83a76b0SSuyog Pawar }
6774*c83a76b0SSuyog Pawar }
6775