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
24*c83a76b0SSuyog Pawar * ihevce_lap_interface.c
25*c83a76b0SSuyog Pawar *
26*c83a76b0SSuyog Pawar * @brief
27*c83a76b0SSuyog Pawar * This file contains function definitions related to look-ahead processing
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * @author
30*c83a76b0SSuyog Pawar * ittiam
31*c83a76b0SSuyog Pawar *
32*c83a76b0SSuyog Pawar * @par List of Functions:
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar ******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar
37*c83a76b0SSuyog Pawar /*****************************************************************************/
38*c83a76b0SSuyog Pawar /* File Includes */
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar
41*c83a76b0SSuyog Pawar /* System Include Files */
42*c83a76b0SSuyog Pawar #include <stdio.h>
43*c83a76b0SSuyog Pawar #include <string.h>
44*c83a76b0SSuyog Pawar #include <stdlib.h>
45*c83a76b0SSuyog Pawar #include <assert.h>
46*c83a76b0SSuyog Pawar
47*c83a76b0SSuyog Pawar /* User Include Files */
48*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
49*c83a76b0SSuyog Pawar #include "itt_video_api.h"
50*c83a76b0SSuyog Pawar #include "ihevce_api.h"
51*c83a76b0SSuyog Pawar
52*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
53*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
54*c83a76b0SSuyog Pawar #include "rc_look_ahead_params.h"
55*c83a76b0SSuyog Pawar
56*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
57*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
58*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
59*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
60*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
61*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
62*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
63*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
64*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
65*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
66*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
67*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
68*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
69*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
70*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
71*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
72*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
73*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
74*c83a76b0SSuyog Pawar
75*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
76*c83a76b0SSuyog Pawar #include "ihevce_api.h"
77*c83a76b0SSuyog Pawar #include "ihevce_hle_interface.h"
78*c83a76b0SSuyog Pawar #include "ihevce_hle_q_func.h"
79*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
80*c83a76b0SSuyog Pawar #include "ihevce_lap_interface.h"
81*c83a76b0SSuyog Pawar #include "ihevce_lap_structs.h"
82*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
83*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
84*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
85*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
86*c83a76b0SSuyog Pawar #include "ihevce_rc_enc_structs.h"
87*c83a76b0SSuyog Pawar #include "ihevce_rc_interface.h"
88*c83a76b0SSuyog Pawar #include "ihevce_buffer_que_interface.h"
89*c83a76b0SSuyog Pawar
90*c83a76b0SSuyog Pawar /*****************************************************************************/
91*c83a76b0SSuyog Pawar /* Globals */
92*c83a76b0SSuyog Pawar /*****************************************************************************/
93*c83a76b0SSuyog Pawar WORD32 gau1_order_insert_pic_type[MAX_TEMPORAL_LAYERS][8] = {
94*c83a76b0SSuyog Pawar { P_PIC, B_PIC, P_PIC, B_PIC, P_PIC, B_PIC, P_PIC, B_PIC },
95*c83a76b0SSuyog Pawar { P_PIC, B_PIC, B1_PIC, B1_PIC, P_PIC, B_PIC, B1_PIC, B1_PIC },
96*c83a76b0SSuyog Pawar { P_PIC, B_PIC, B1_PIC, B2_PIC, B2_PIC, B1_PIC, B2_PIC, B2_PIC },
97*c83a76b0SSuyog Pawar };
98*c83a76b0SSuyog Pawar
99*c83a76b0SSuyog Pawar UWORD8 gau1_use_by_cur_pic_flag[MAX_REF_PICS] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 };
100*c83a76b0SSuyog Pawar
101*c83a76b0SSuyog Pawar /*****************************************************************************/
102*c83a76b0SSuyog Pawar /* Function Definitions */
103*c83a76b0SSuyog Pawar /*****************************************************************************/
104*c83a76b0SSuyog Pawar
105*c83a76b0SSuyog Pawar /*!
106*c83a76b0SSuyog Pawar ************************************************************************
107*c83a76b0SSuyog Pawar * \brief
108*c83a76b0SSuyog Pawar * return number of records used by LAP
109*c83a76b0SSuyog Pawar *
110*c83a76b0SSuyog Pawar ************************************************************************
111*c83a76b0SSuyog Pawar */
ihevce_lap_get_num_mem_recs(void)112*c83a76b0SSuyog Pawar WORD32 ihevce_lap_get_num_mem_recs(void)
113*c83a76b0SSuyog Pawar {
114*c83a76b0SSuyog Pawar return (NUM_LAP_MEM_RECS);
115*c83a76b0SSuyog Pawar }
116*c83a76b0SSuyog Pawar
117*c83a76b0SSuyog Pawar /*!
118*c83a76b0SSuyog Pawar ************************************************************************
119*c83a76b0SSuyog Pawar * @brief
120*c83a76b0SSuyog Pawar * return each record attributes of LAP
121*c83a76b0SSuyog Pawar ************************************************************************
122*c83a76b0SSuyog Pawar */
ihevce_lap_get_mem_recs(iv_mem_rec_t * ps_mem_tab,WORD32 i4_mem_space)123*c83a76b0SSuyog Pawar WORD32 ihevce_lap_get_mem_recs(iv_mem_rec_t *ps_mem_tab, WORD32 i4_mem_space)
124*c83a76b0SSuyog Pawar {
125*c83a76b0SSuyog Pawar /* number of NODE memory */
126*c83a76b0SSuyog Pawar WORD32 max_nodes = MAX_SUB_GOP_SIZE - 1;
127*c83a76b0SSuyog Pawar
128*c83a76b0SSuyog Pawar ps_mem_tab[LAP_CTXT].i4_mem_size = sizeof(lap_struct_t);
129*c83a76b0SSuyog Pawar ps_mem_tab[LAP_CTXT].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
130*c83a76b0SSuyog Pawar ps_mem_tab[LAP_CTXT].i4_mem_alignment = 8;
131*c83a76b0SSuyog Pawar
132*c83a76b0SSuyog Pawar /* Node memory for 2 sub-gops*/
133*c83a76b0SSuyog Pawar ps_mem_tab[LAP_NODE_MEM].i4_mem_size = (max_nodes * sizeof(ihevce_encode_node_t));
134*c83a76b0SSuyog Pawar
135*c83a76b0SSuyog Pawar ps_mem_tab[LAP_NODE_MEM].e_mem_type = (IV_MEM_TYPE_T)i4_mem_space;
136*c83a76b0SSuyog Pawar
137*c83a76b0SSuyog Pawar ps_mem_tab[LAP_NODE_MEM].i4_mem_alignment = 8;
138*c83a76b0SSuyog Pawar
139*c83a76b0SSuyog Pawar return (NUM_LAP_MEM_RECS);
140*c83a76b0SSuyog Pawar }
141*c83a76b0SSuyog Pawar
142*c83a76b0SSuyog Pawar /*!
143*c83a76b0SSuyog Pawar ************************************************************************
144*c83a76b0SSuyog Pawar * @brief
145*c83a76b0SSuyog Pawar * Init LAP structure
146*c83a76b0SSuyog Pawar ************************************************************************
147*c83a76b0SSuyog Pawar */
ihevce_lap_init(iv_mem_rec_t * ps_mem_tab,ihevce_lap_static_params_t * ps_lap_params,ihevce_static_cfg_params_t * ps_static_cfg_prms)148*c83a76b0SSuyog Pawar void *ihevce_lap_init(
149*c83a76b0SSuyog Pawar iv_mem_rec_t *ps_mem_tab,
150*c83a76b0SSuyog Pawar ihevce_lap_static_params_t *ps_lap_params,
151*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *ps_static_cfg_prms)
152*c83a76b0SSuyog Pawar {
153*c83a76b0SSuyog Pawar WORD32 i4_src_interlace_field;
154*c83a76b0SSuyog Pawar WORD32 i4_max_temporal_layers;
155*c83a76b0SSuyog Pawar ihevce_encode_node_t *ps_encode_node_struct;
156*c83a76b0SSuyog Pawar lap_struct_t *ps_lap_struct = (lap_struct_t *)ps_mem_tab[LAP_CTXT].pv_base;
157*c83a76b0SSuyog Pawar ihevce_lap_static_params_t *ps_lap_static_params = &ps_lap_struct->s_lap_static_params;
158*c83a76b0SSuyog Pawar ps_lap_struct->aps_encode_node[0] = (ihevce_encode_node_t *)ps_mem_tab[LAP_NODE_MEM].pv_base;
159*c83a76b0SSuyog Pawar
160*c83a76b0SSuyog Pawar memcpy(
161*c83a76b0SSuyog Pawar &ps_lap_struct->s_static_cfg_params,
162*c83a76b0SSuyog Pawar ps_static_cfg_prms,
163*c83a76b0SSuyog Pawar sizeof(ihevce_static_cfg_params_t));
164*c83a76b0SSuyog Pawar memmove(ps_lap_static_params, ps_lap_params, sizeof(ihevce_lap_static_params_t));
165*c83a76b0SSuyog Pawar ps_lap_static_params->e_arch_type = ps_static_cfg_prms->e_arch_type;
166*c83a76b0SSuyog Pawar
167*c83a76b0SSuyog Pawar /* Set the array to zero */
168*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ai4_capture_order_poc[0], 0, MAX_NUM_ENC_NODES * sizeof(WORD32));
169*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ai4_encode_order_poc[0], 0, MAX_NUM_ENC_NODES * sizeof(WORD32));
170*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ref_poc_array[0], 0xFF, sizeof(ps_lap_struct->ref_poc_array));
171*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ai4_pic_type_to_be_removed, 0, NUM_LAP2_LOOK_AHEAD * sizeof(WORD32));
172*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ai4_num_buffer[0], 0, sizeof(ps_lap_struct->ai4_num_buffer));
173*c83a76b0SSuyog Pawar
174*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_poc = 0;
175*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_poc = 0;
176*c83a76b0SSuyog Pawar
177*c83a76b0SSuyog Pawar i4_max_temporal_layers = ps_lap_static_params->i4_max_temporal_layers;
178*c83a76b0SSuyog Pawar i4_src_interlace_field = ps_lap_static_params->i4_src_interlace_field;
179*c83a76b0SSuyog Pawar ps_lap_struct->i4_max_idr_period =
180*c83a76b0SSuyog Pawar ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period;
181*c83a76b0SSuyog Pawar ps_lap_struct->i4_min_idr_period =
182*c83a76b0SSuyog Pawar ps_static_cfg_prms->s_coding_tools_prms.i4_min_closed_gop_period;
183*c83a76b0SSuyog Pawar ps_lap_struct->i4_max_cra_period =
184*c83a76b0SSuyog Pawar ps_static_cfg_prms->s_coding_tools_prms.i4_max_cra_open_gop_period;
185*c83a76b0SSuyog Pawar ps_lap_struct->i4_max_i_period =
186*c83a76b0SSuyog Pawar ps_static_cfg_prms->s_coding_tools_prms.i4_max_i_open_gop_period;
187*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter = 0;
188*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter = 0;
189*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = 0;
190*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_gop_num = -1;
191*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_ref_pics = 0;
192*c83a76b0SSuyog Pawar ps_lap_struct->i4_display_num = 0;
193*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided = 0;
194*c83a76b0SSuyog Pawar ps_lap_struct->i4_next_start_ctr = 0;
195*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[0] = PIC_TYPE_IDR;
196*c83a76b0SSuyog Pawar
197*c83a76b0SSuyog Pawar ps_lap_struct->i4_enable_logo = ps_lap_static_params->i4_enable_logo;
198*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_i_pic_flag = 0;
199*c83a76b0SSuyog Pawar ps_lap_struct->i4_force_end_flag = 0;
200*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_size = (1 << i4_max_temporal_layers);
201*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_size_idr =
202*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_size + (i4_max_temporal_layers > 0);
203*c83a76b0SSuyog Pawar
204*c83a76b0SSuyog Pawar ps_lap_struct->i4_is_all_i_pic_in_seq = 0;
205*c83a76b0SSuyog Pawar
206*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_max_idr_period == 1 || ps_lap_struct->i4_max_cra_period == 1 ||
207*c83a76b0SSuyog Pawar ps_lap_struct->i4_max_i_period == 1)
208*c83a76b0SSuyog Pawar {
209*c83a76b0SSuyog Pawar ps_lap_struct->i4_is_all_i_pic_in_seq = 1;
210*c83a76b0SSuyog Pawar }
211*c83a76b0SSuyog Pawar
212*c83a76b0SSuyog Pawar if(1 == i4_src_interlace_field && (!ps_lap_struct->i4_is_all_i_pic_in_seq))
213*c83a76b0SSuyog Pawar {
214*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_size <<= 1;
215*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_size_idr <<= 1;
216*c83a76b0SSuyog Pawar }
217*c83a76b0SSuyog Pawar
218*c83a76b0SSuyog Pawar ps_lap_struct->i4_fixed_open_gop_period = 1;
219*c83a76b0SSuyog Pawar ps_lap_struct->i4_fixed_i_period = 1;
220*c83a76b0SSuyog Pawar
221*c83a76b0SSuyog Pawar if(ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period <=
222*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_size)
223*c83a76b0SSuyog Pawar {
224*c83a76b0SSuyog Pawar ps_lap_struct->i4_min_idr_period =
225*c83a76b0SSuyog Pawar ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period;
226*c83a76b0SSuyog Pawar }
227*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_max_idr_period)
228*c83a76b0SSuyog Pawar {
229*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_max_cra_period)
230*c83a76b0SSuyog Pawar {
231*c83a76b0SSuyog Pawar ps_lap_struct->i4_gop_period = ps_lap_struct->i4_max_cra_period;
232*c83a76b0SSuyog Pawar }
233*c83a76b0SSuyog Pawar else if(ps_lap_struct->i4_max_i_period)
234*c83a76b0SSuyog Pawar {
235*c83a76b0SSuyog Pawar ps_lap_struct->i4_gop_period = ps_lap_struct->i4_max_i_period;
236*c83a76b0SSuyog Pawar }
237*c83a76b0SSuyog Pawar else
238*c83a76b0SSuyog Pawar {
239*c83a76b0SSuyog Pawar ps_lap_struct->i4_gop_period = ps_lap_struct->i4_max_idr_period;
240*c83a76b0SSuyog Pawar }
241*c83a76b0SSuyog Pawar }
242*c83a76b0SSuyog Pawar else
243*c83a76b0SSuyog Pawar {
244*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_max_i_period)
245*c83a76b0SSuyog Pawar {
246*c83a76b0SSuyog Pawar ps_lap_struct->i4_gop_period = ps_lap_struct->i4_max_i_period;
247*c83a76b0SSuyog Pawar }
248*c83a76b0SSuyog Pawar else if(ps_lap_struct->i4_max_cra_period)
249*c83a76b0SSuyog Pawar {
250*c83a76b0SSuyog Pawar ps_lap_struct->i4_gop_period = ps_lap_struct->i4_max_cra_period;
251*c83a76b0SSuyog Pawar }
252*c83a76b0SSuyog Pawar }
253*c83a76b0SSuyog Pawar
254*c83a76b0SSuyog Pawar if(!ps_lap_struct->i4_max_i_period)
255*c83a76b0SSuyog Pawar {
256*c83a76b0SSuyog Pawar ps_lap_struct->i4_max_i_period =
257*c83a76b0SSuyog Pawar 2 * MAX(ps_lap_struct->i4_max_idr_period, ps_lap_struct->i4_max_cra_period);
258*c83a76b0SSuyog Pawar }
259*c83a76b0SSuyog Pawar
260*c83a76b0SSuyog Pawar ps_lap_struct->i4_no_back_to_back_i_avoidance = 0;
261*c83a76b0SSuyog Pawar
262*c83a76b0SSuyog Pawar /*Infinite GOP case*/
263*c83a76b0SSuyog Pawar if(!ps_lap_struct->i4_gop_period)
264*c83a76b0SSuyog Pawar {
265*c83a76b0SSuyog Pawar /*max signed 32 bit value which will be ~ 414 days considering 60frames/fields per second*/
266*c83a76b0SSuyog Pawar ps_lap_struct->i4_max_i_period = 0x7fffffff;
267*c83a76b0SSuyog Pawar ps_lap_struct->i4_gop_period =
268*c83a76b0SSuyog Pawar (INFINITE_GOP_CDR_TIME_S * (ps_static_cfg_prms->s_src_prms.i4_frm_rate_num /
269*c83a76b0SSuyog Pawar ps_static_cfg_prms->s_src_prms.i4_frm_rate_denom));
270*c83a76b0SSuyog Pawar }
271*c83a76b0SSuyog Pawar
272*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_gop_period < (2 * ps_lap_struct->i4_sub_gop_size))
273*c83a76b0SSuyog Pawar {
274*c83a76b0SSuyog Pawar ps_lap_struct->i4_no_back_to_back_i_avoidance = 1;
275*c83a76b0SSuyog Pawar }
276*c83a76b0SSuyog Pawar
277*c83a76b0SSuyog Pawar ps_lap_struct->i4_rc_lap_period =
278*c83a76b0SSuyog Pawar ps_static_cfg_prms->s_lap_prms.i4_rc_look_ahead_pics + MIN_L1_L0_STAGGER_NON_SEQ;
279*c83a76b0SSuyog Pawar ps_lap_struct->pv_prev_inp_buf = NULL;
280*c83a76b0SSuyog Pawar ps_lap_struct->i4_buf_deq_idx = 0;
281*c83a76b0SSuyog Pawar ps_lap_struct->i4_deq_idx = 0;
282*c83a76b0SSuyog Pawar ps_lap_struct->i4_enq_idx = 0;
283*c83a76b0SSuyog Pawar ps_lap_struct->i4_lap2_counter = 0;
284*c83a76b0SSuyog Pawar ps_lap_struct->i4_dyn_sub_gop_size = ps_lap_struct->i4_sub_gop_size;
285*c83a76b0SSuyog Pawar ps_lap_struct->i4_buf_enq_idx = 0;
286*c83a76b0SSuyog Pawar ps_lap_struct->i4_lap_out_idx = 0;
287*c83a76b0SSuyog Pawar ps_lap_struct->i4_capture_idx = 0;
288*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_flag = 1;
289*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_bufs_encode_order = 0;
290*c83a76b0SSuyog Pawar ps_lap_struct->end_flag = 0;
291*c83a76b0SSuyog Pawar ps_lap_struct->i4_immediate_idr_case = 0;
292*c83a76b0SSuyog Pawar ps_lap_struct->i4_max_buf_in_enc_order = 0;
293*c83a76b0SSuyog Pawar ps_lap_struct->i4_end_flag_pic_idx = 0;
294*c83a76b0SSuyog Pawar memset(
295*c83a76b0SSuyog Pawar &ps_lap_struct->api4_encode_order_array[0],
296*c83a76b0SSuyog Pawar 0,
297*c83a76b0SSuyog Pawar sizeof(ihevce_lap_enc_buf_t *) * MAX_NUM_ENC_NODES);
298*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_pic_idx = 0;
299*c83a76b0SSuyog Pawar ps_lap_struct->i4_force_idr_pos = 0;
300*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_dummy_pic = 0;
301*c83a76b0SSuyog Pawar ps_lap_struct->i4_lap_encode_idx = 0;
302*c83a76b0SSuyog Pawar ps_lap_struct->i4_deq_lap_buf = 0;
303*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_end = 0;
304*c83a76b0SSuyog Pawar
305*c83a76b0SSuyog Pawar {
306*c83a76b0SSuyog Pawar WORD32 node_offset, curr_layer;
307*c83a76b0SSuyog Pawar WORD32 i;
308*c83a76b0SSuyog Pawar /*intialization of aps_lap_inp_buf*/
309*c83a76b0SSuyog Pawar for(i = 0; i < MAX_QUEUE_LENGTH; i++)
310*c83a76b0SSuyog Pawar {
311*c83a76b0SSuyog Pawar ps_lap_struct->aps_lap_inp_buf[i] = NULL;
312*c83a76b0SSuyog Pawar }
313*c83a76b0SSuyog Pawar
314*c83a76b0SSuyog Pawar /* init capture order and encode order pointer */
315*c83a76b0SSuyog Pawar ps_lap_struct->pi4_capture_poc_ptr = &ps_lap_struct->ai4_capture_order_poc[0];
316*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr = &ps_lap_struct->ai4_encode_order_poc[0];
317*c83a76b0SSuyog Pawar
318*c83a76b0SSuyog Pawar /* init all the buffer status to default values */
319*c83a76b0SSuyog Pawar ps_encode_node_struct = ps_lap_struct->aps_encode_node[0];
320*c83a76b0SSuyog Pawar
321*c83a76b0SSuyog Pawar ps_encode_node_struct->pv_left_node = NULL;
322*c83a76b0SSuyog Pawar ps_encode_node_struct->pv_right_node = NULL;
323*c83a76b0SSuyog Pawar
324*c83a76b0SSuyog Pawar /* Initialise the tree */
325*c83a76b0SSuyog Pawar node_offset = 1;
326*c83a76b0SSuyog Pawar curr_layer = 0;
327*c83a76b0SSuyog Pawar ihevce_populate_tree_nodes(
328*c83a76b0SSuyog Pawar ps_encode_node_struct,
329*c83a76b0SSuyog Pawar ps_encode_node_struct,
330*c83a76b0SSuyog Pawar &node_offset,
331*c83a76b0SSuyog Pawar curr_layer,
332*c83a76b0SSuyog Pawar ps_lap_static_params->i4_max_temporal_layers);
333*c83a76b0SSuyog Pawar }
334*c83a76b0SSuyog Pawar
335*c83a76b0SSuyog Pawar ps_mem_tab += NUM_LAP_MEM_RECS;
336*c83a76b0SSuyog Pawar
337*c83a76b0SSuyog Pawar return ((void *)ps_lap_struct);
338*c83a76b0SSuyog Pawar }
339*c83a76b0SSuyog Pawar
340*c83a76b0SSuyog Pawar /*!
341*c83a76b0SSuyog Pawar ******************************************************************************
342*c83a76b0SSuyog Pawar * \if Function name : ihevce_populate_tree_nodes \endif
343*c83a76b0SSuyog Pawar *
344*c83a76b0SSuyog Pawar * \brief
345*c83a76b0SSuyog Pawar * LAP populate nodes function
346*c83a76b0SSuyog Pawar *
347*c83a76b0SSuyog Pawar * \param[in] encode_parent_node_t node pointer to base
348*c83a76b0SSuyog Pawar * encode_node_t node pointer to current buffer
349*c83a76b0SSuyog Pawar * loop_count layer count
350*c83a76b0SSuyog Pawar * hier_layer total layers
351*c83a76b0SSuyog Pawar * \return
352*c83a76b0SSuyog Pawar * None
353*c83a76b0SSuyog Pawar *
354*c83a76b0SSuyog Pawar * \author
355*c83a76b0SSuyog Pawar * Ittiam
356*c83a76b0SSuyog Pawar *
357*c83a76b0SSuyog Pawar *****************************************************************************
358*c83a76b0SSuyog Pawar */
ihevce_populate_tree_nodes(ihevce_encode_node_t * encode_parent_node_t,ihevce_encode_node_t * encode_node_t,WORD32 * loop_count,WORD32 layer,WORD32 hier_layer)359*c83a76b0SSuyog Pawar void ihevce_populate_tree_nodes(
360*c83a76b0SSuyog Pawar ihevce_encode_node_t *encode_parent_node_t,
361*c83a76b0SSuyog Pawar ihevce_encode_node_t *encode_node_t,
362*c83a76b0SSuyog Pawar WORD32 *loop_count,
363*c83a76b0SSuyog Pawar WORD32 layer,
364*c83a76b0SSuyog Pawar WORD32 hier_layer)
365*c83a76b0SSuyog Pawar {
366*c83a76b0SSuyog Pawar /* If only I/P pictures, return NULL from the child nodes*/
367*c83a76b0SSuyog Pawar if(hier_layer == 0)
368*c83a76b0SSuyog Pawar {
369*c83a76b0SSuyog Pawar encode_node_t->pv_left_node = NULL;
370*c83a76b0SSuyog Pawar encode_node_t->pv_right_node = NULL;
371*c83a76b0SSuyog Pawar return;
372*c83a76b0SSuyog Pawar }
373*c83a76b0SSuyog Pawar if(layer == hier_layer)
374*c83a76b0SSuyog Pawar return;
375*c83a76b0SSuyog Pawar
376*c83a76b0SSuyog Pawar layer = layer + 1;
377*c83a76b0SSuyog Pawar
378*c83a76b0SSuyog Pawar /* If the layers are not exhausted */
379*c83a76b0SSuyog Pawar if(layer < hier_layer)
380*c83a76b0SSuyog Pawar {
381*c83a76b0SSuyog Pawar encode_node_t->pv_left_node = encode_parent_node_t + (*loop_count);
382*c83a76b0SSuyog Pawar encode_node_t->pv_right_node = encode_parent_node_t + (*loop_count + 1);
383*c83a76b0SSuyog Pawar (*loop_count) = (*loop_count) + 2;
384*c83a76b0SSuyog Pawar }
385*c83a76b0SSuyog Pawar else
386*c83a76b0SSuyog Pawar {
387*c83a76b0SSuyog Pawar encode_node_t->pv_left_node = NULL;
388*c83a76b0SSuyog Pawar encode_node_t->pv_right_node = NULL;
389*c83a76b0SSuyog Pawar }
390*c83a76b0SSuyog Pawar
391*c83a76b0SSuyog Pawar /* Populate Left tree nodes */
392*c83a76b0SSuyog Pawar ihevce_populate_tree_nodes(
393*c83a76b0SSuyog Pawar encode_parent_node_t,
394*c83a76b0SSuyog Pawar (ihevce_encode_node_t *)encode_node_t->pv_left_node,
395*c83a76b0SSuyog Pawar loop_count,
396*c83a76b0SSuyog Pawar layer,
397*c83a76b0SSuyog Pawar hier_layer);
398*c83a76b0SSuyog Pawar
399*c83a76b0SSuyog Pawar /* Populate right tree nodes */
400*c83a76b0SSuyog Pawar ihevce_populate_tree_nodes(
401*c83a76b0SSuyog Pawar encode_parent_node_t,
402*c83a76b0SSuyog Pawar (ihevce_encode_node_t *)encode_node_t->pv_right_node,
403*c83a76b0SSuyog Pawar loop_count,
404*c83a76b0SSuyog Pawar layer,
405*c83a76b0SSuyog Pawar hier_layer);
406*c83a76b0SSuyog Pawar }
407*c83a76b0SSuyog Pawar
408*c83a76b0SSuyog Pawar /*!
409*c83a76b0SSuyog Pawar ************************************************************************
410*c83a76b0SSuyog Pawar * \brief
411*c83a76b0SSuyog Pawar * pad input when its dimensions are not aligned to LCU size
412*c83a76b0SSuyog Pawar ************************************************************************
413*c83a76b0SSuyog Pawar */
ihevce_lap_pad_input_bufs(ihevce_lap_enc_buf_t * ps_curr_inp,WORD32 align_pic_wd,WORD32 align_pic_ht)414*c83a76b0SSuyog Pawar void ihevce_lap_pad_input_bufs(
415*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_curr_inp, WORD32 align_pic_wd, WORD32 align_pic_ht)
416*c83a76b0SSuyog Pawar {
417*c83a76b0SSuyog Pawar /* local variables */
418*c83a76b0SSuyog Pawar WORD32 ctr_horz, ctr_vert;
419*c83a76b0SSuyog Pawar
420*c83a76b0SSuyog Pawar /* ------- Horizontal Right Padding ------ */
421*c83a76b0SSuyog Pawar if(align_pic_wd != ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd)
422*c83a76b0SSuyog Pawar {
423*c83a76b0SSuyog Pawar UWORD8 *pu1_inp;
424*c83a76b0SSuyog Pawar UWORD16 *pu2_inp;
425*c83a76b0SSuyog Pawar WORD32 pad_wd;
426*c83a76b0SSuyog Pawar WORD32 pad_ht;
427*c83a76b0SSuyog Pawar
428*c83a76b0SSuyog Pawar /* ------------- LUMA ----------------------------- */
429*c83a76b0SSuyog Pawar /* derive the pointers and dimensions to be padded */
430*c83a76b0SSuyog Pawar pad_ht = ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht;
431*c83a76b0SSuyog Pawar pad_wd = align_pic_wd - ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd;
432*c83a76b0SSuyog Pawar pu1_inp = (UWORD8 *)ps_curr_inp->s_lap_out.s_input_buf.pv_y_buf;
433*c83a76b0SSuyog Pawar pu1_inp += ps_curr_inp->s_lap_out.s_input_buf.i4_y_wd;
434*c83a76b0SSuyog Pawar
435*c83a76b0SSuyog Pawar /* loops for padding the right region for entire pic */
436*c83a76b0SSuyog Pawar for(ctr_vert = 0; ctr_vert < pad_ht; ctr_vert++)
437*c83a76b0SSuyog Pawar {
438*c83a76b0SSuyog Pawar for(ctr_horz = 0; ctr_horz < pad_wd; ctr_horz++)
439*c83a76b0SSuyog Pawar {
440*c83a76b0SSuyog Pawar /* last pixel is replicated */
441*c83a76b0SSuyog Pawar pu1_inp[ctr_horz] = pu1_inp[-1];
442*c83a76b0SSuyog Pawar }
443*c83a76b0SSuyog Pawar
444*c83a76b0SSuyog Pawar /* row level increments */
445*c83a76b0SSuyog Pawar pu1_inp += ps_curr_inp->s_lap_out.s_input_buf.i4_y_strd;
446*c83a76b0SSuyog Pawar }
447*c83a76b0SSuyog Pawar
448*c83a76b0SSuyog Pawar /* ------------- CHROMA ---------------------------- */
449*c83a76b0SSuyog Pawar /* derive the pointers and dimensions to be padded */
450*c83a76b0SSuyog Pawar pad_ht = ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht;
451*c83a76b0SSuyog Pawar pad_wd = align_pic_wd - ps_curr_inp->s_lap_out.s_input_buf.i4_uv_wd;
452*c83a76b0SSuyog Pawar pad_wd >>= 1;
453*c83a76b0SSuyog Pawar pu1_inp = (UWORD8 *)ps_curr_inp->s_lap_out.s_input_buf.pv_u_buf;
454*c83a76b0SSuyog Pawar pu2_inp = (UWORD16 *)(pu1_inp + ps_curr_inp->s_lap_out.s_input_buf.i4_uv_wd);
455*c83a76b0SSuyog Pawar
456*c83a76b0SSuyog Pawar /* loops for padding the right region for entire pic */
457*c83a76b0SSuyog Pawar for(ctr_vert = 0; ctr_vert < pad_ht; ctr_vert++)
458*c83a76b0SSuyog Pawar {
459*c83a76b0SSuyog Pawar for(ctr_horz = 0; ctr_horz < pad_wd; ctr_horz++)
460*c83a76b0SSuyog Pawar {
461*c83a76b0SSuyog Pawar /* last pixel is replicated, cb and cr pixel interleaved */
462*c83a76b0SSuyog Pawar pu2_inp[ctr_horz] = pu2_inp[-1];
463*c83a76b0SSuyog Pawar }
464*c83a76b0SSuyog Pawar
465*c83a76b0SSuyog Pawar /* row level increments */
466*c83a76b0SSuyog Pawar pu2_inp += (ps_curr_inp->s_lap_out.s_input_buf.i4_uv_strd >> 1);
467*c83a76b0SSuyog Pawar }
468*c83a76b0SSuyog Pawar }
469*c83a76b0SSuyog Pawar
470*c83a76b0SSuyog Pawar /* ------- Vertical Bottom Padding ------ */
471*c83a76b0SSuyog Pawar if(align_pic_ht != ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht)
472*c83a76b0SSuyog Pawar {
473*c83a76b0SSuyog Pawar UWORD8 *pu1_inp, *pu1_src;
474*c83a76b0SSuyog Pawar WORD32 pad_ht;
475*c83a76b0SSuyog Pawar
476*c83a76b0SSuyog Pawar /* ------------- LUMA ----------------------------- */
477*c83a76b0SSuyog Pawar /* derive the pointers and dimensions to be padded */
478*c83a76b0SSuyog Pawar pad_ht = align_pic_ht - ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht;
479*c83a76b0SSuyog Pawar pu1_inp = (UWORD8 *)ps_curr_inp->s_lap_out.s_input_buf.pv_y_buf;
480*c83a76b0SSuyog Pawar pu1_inp += ps_curr_inp->s_lap_out.s_input_buf.i4_y_ht *
481*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_y_strd;
482*c83a76b0SSuyog Pawar
483*c83a76b0SSuyog Pawar /* get the pointer of last row */
484*c83a76b0SSuyog Pawar pu1_src = pu1_inp - ps_curr_inp->s_lap_out.s_input_buf.i4_y_strd;
485*c83a76b0SSuyog Pawar
486*c83a76b0SSuyog Pawar /* loops for padding the bottom region for entire row */
487*c83a76b0SSuyog Pawar for(ctr_vert = 0; ctr_vert < pad_ht; ctr_vert++)
488*c83a76b0SSuyog Pawar {
489*c83a76b0SSuyog Pawar /* copy the eniter orw including horz padd region */
490*c83a76b0SSuyog Pawar memcpy(pu1_inp, pu1_src, align_pic_wd);
491*c83a76b0SSuyog Pawar
492*c83a76b0SSuyog Pawar /* row level increments */
493*c83a76b0SSuyog Pawar pu1_inp += ps_curr_inp->s_lap_out.s_input_buf.i4_y_strd;
494*c83a76b0SSuyog Pawar }
495*c83a76b0SSuyog Pawar
496*c83a76b0SSuyog Pawar /* ------------- CHROMA ----------------------------- */
497*c83a76b0SSuyog Pawar /* derive the pointers and dimensions to be padded */
498*c83a76b0SSuyog Pawar pad_ht = (align_pic_ht >> 1) - ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht;
499*c83a76b0SSuyog Pawar pu1_inp = (UWORD8 *)ps_curr_inp->s_lap_out.s_input_buf.pv_u_buf;
500*c83a76b0SSuyog Pawar pu1_inp += ps_curr_inp->s_lap_out.s_input_buf.i4_uv_ht *
501*c83a76b0SSuyog Pawar ps_curr_inp->s_lap_out.s_input_buf.i4_uv_strd;
502*c83a76b0SSuyog Pawar
503*c83a76b0SSuyog Pawar /* get the pointer of last row */
504*c83a76b0SSuyog Pawar pu1_src = pu1_inp - ps_curr_inp->s_lap_out.s_input_buf.i4_uv_strd;
505*c83a76b0SSuyog Pawar
506*c83a76b0SSuyog Pawar /* loops for padding the bottom region for entire row */
507*c83a76b0SSuyog Pawar for(ctr_vert = 0; ctr_vert < pad_ht; ctr_vert++)
508*c83a76b0SSuyog Pawar {
509*c83a76b0SSuyog Pawar /* copy the eniter orw including horz padd region */
510*c83a76b0SSuyog Pawar memcpy(pu1_inp, pu1_src, align_pic_wd);
511*c83a76b0SSuyog Pawar
512*c83a76b0SSuyog Pawar /* row level increments */
513*c83a76b0SSuyog Pawar pu1_inp += ps_curr_inp->s_lap_out.s_input_buf.i4_uv_strd;
514*c83a76b0SSuyog Pawar }
515*c83a76b0SSuyog Pawar }
516*c83a76b0SSuyog Pawar return;
517*c83a76b0SSuyog Pawar }
518*c83a76b0SSuyog Pawar
519*c83a76b0SSuyog Pawar /*!
520*c83a76b0SSuyog Pawar ************************************************************************
521*c83a76b0SSuyog Pawar * \brief
522*c83a76b0SSuyog Pawar * check for last inp buf
523*c83a76b0SSuyog Pawar ************************************************************************
524*c83a76b0SSuyog Pawar */
ihevce_check_last_inp_buf(WORD32 * pi4_cmd_buf)525*c83a76b0SSuyog Pawar WORD32 ihevce_check_last_inp_buf(WORD32 *pi4_cmd_buf)
526*c83a76b0SSuyog Pawar {
527*c83a76b0SSuyog Pawar WORD32 cmd = (*pi4_cmd_buf) & (IHEVCE_COMMANDS_TAG_MASK);
528*c83a76b0SSuyog Pawar
529*c83a76b0SSuyog Pawar if(IHEVCE_SYNCH_API_FLUSH_TAG == cmd)
530*c83a76b0SSuyog Pawar return 1;
531*c83a76b0SSuyog Pawar return 0;
532*c83a76b0SSuyog Pawar }
533*c83a76b0SSuyog Pawar
534*c83a76b0SSuyog Pawar /*!
535*c83a76b0SSuyog Pawar ************************************************************************
536*c83a76b0SSuyog Pawar * \brief
537*c83a76b0SSuyog Pawar * lap parse sync commands
538*c83a76b0SSuyog Pawar ************************************************************************
539*c83a76b0SSuyog Pawar */
ihevce_lap_parse_sync_cmd(ihevce_hle_ctxt_t * ps_hle_ctxt,ihevce_static_cfg_params_t * ps_static_cfg_prms,WORD32 * pi4_cmd_buf,ihevce_lap_enc_buf_t * ps_lap_inp_buf,WORD32 * pi4_flush_check,WORD32 * pi4_force_idr_check)540*c83a76b0SSuyog Pawar void ihevce_lap_parse_sync_cmd(
541*c83a76b0SSuyog Pawar ihevce_hle_ctxt_t *ps_hle_ctxt,
542*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *ps_static_cfg_prms,
543*c83a76b0SSuyog Pawar WORD32 *pi4_cmd_buf,
544*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_lap_inp_buf,
545*c83a76b0SSuyog Pawar WORD32 *pi4_flush_check,
546*c83a76b0SSuyog Pawar WORD32 *pi4_force_idr_check)
547*c83a76b0SSuyog Pawar {
548*c83a76b0SSuyog Pawar WORD32 *pi4_tag_parse = pi4_cmd_buf;
549*c83a76b0SSuyog Pawar WORD32 i4_cmd_size = ps_lap_inp_buf->s_input_buf.i4_cmd_buf_size;
550*c83a76b0SSuyog Pawar WORD32 i4_buf_id = ps_lap_inp_buf->s_input_buf.i4_buf_id;
551*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
552*c83a76b0SSuyog Pawar UWORD32 u4_num_sei = 0;
553*c83a76b0SSuyog Pawar #endif
554*c83a76b0SSuyog Pawar WORD32 i4_end_flag = 0;
555*c83a76b0SSuyog Pawar
556*c83a76b0SSuyog Pawar while(i4_cmd_size >= 4)
557*c83a76b0SSuyog Pawar {
558*c83a76b0SSuyog Pawar switch((*pi4_tag_parse) & (IHEVCE_COMMANDS_TAG_MASK))
559*c83a76b0SSuyog Pawar {
560*c83a76b0SSuyog Pawar case IHEVCE_SYNCH_API_FLUSH_TAG:
561*c83a76b0SSuyog Pawar if(i4_cmd_size < 8 || pi4_tag_parse[1])
562*c83a76b0SSuyog Pawar {
563*c83a76b0SSuyog Pawar ps_hle_ctxt->ihevce_cmds_error_report(
564*c83a76b0SSuyog Pawar ps_hle_ctxt->pv_cmd_err_cb_handle,
565*c83a76b0SSuyog Pawar IHEVCE_SYNCH_ERR_LENGTH_NOT_ZERO,
566*c83a76b0SSuyog Pawar 1,
567*c83a76b0SSuyog Pawar i4_buf_id);
568*c83a76b0SSuyog Pawar return;
569*c83a76b0SSuyog Pawar }
570*c83a76b0SSuyog Pawar (*pi4_flush_check) = 1;
571*c83a76b0SSuyog Pawar pi4_tag_parse += 2;
572*c83a76b0SSuyog Pawar i4_cmd_size -= 8;
573*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
574*c83a76b0SSuyog Pawar u4_num_sei++;
575*c83a76b0SSuyog Pawar #endif
576*c83a76b0SSuyog Pawar break;
577*c83a76b0SSuyog Pawar case IHEVCE_SYNCH_API_FORCE_IDR_TAG:
578*c83a76b0SSuyog Pawar if(i4_cmd_size < 8 || pi4_tag_parse[1])
579*c83a76b0SSuyog Pawar {
580*c83a76b0SSuyog Pawar ps_hle_ctxt->ihevce_cmds_error_report(
581*c83a76b0SSuyog Pawar ps_hle_ctxt->pv_cmd_err_cb_handle,
582*c83a76b0SSuyog Pawar IHEVCE_SYNCH_ERR_LENGTH_NOT_ZERO,
583*c83a76b0SSuyog Pawar 1,
584*c83a76b0SSuyog Pawar i4_buf_id);
585*c83a76b0SSuyog Pawar return;
586*c83a76b0SSuyog Pawar }
587*c83a76b0SSuyog Pawar (*pi4_force_idr_check) = 1;
588*c83a76b0SSuyog Pawar pi4_tag_parse += 2;
589*c83a76b0SSuyog Pawar i4_cmd_size -= 8;
590*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
591*c83a76b0SSuyog Pawar u4_num_sei++;
592*c83a76b0SSuyog Pawar #endif
593*c83a76b0SSuyog Pawar break;
594*c83a76b0SSuyog Pawar case IHEVCE_SYNCH_API_END_TAG:
595*c83a76b0SSuyog Pawar i4_end_flag = 1;
596*c83a76b0SSuyog Pawar i4_cmd_size -= 4;
597*c83a76b0SSuyog Pawar break;
598*c83a76b0SSuyog Pawar default:
599*c83a76b0SSuyog Pawar ps_hle_ctxt->ihevce_cmds_error_report(
600*c83a76b0SSuyog Pawar ps_hle_ctxt->pv_cmd_err_cb_handle, IHEVCE_SYNCH_ERR_TLV_ERROR, 1, i4_buf_id);
601*c83a76b0SSuyog Pawar i4_end_flag = 1;
602*c83a76b0SSuyog Pawar }
603*c83a76b0SSuyog Pawar if(i4_end_flag)
604*c83a76b0SSuyog Pawar break;
605*c83a76b0SSuyog Pawar }
606*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
607*c83a76b0SSuyog Pawar if(u4_num_sei > MAX_NUMBER_OF_SEI_PAYLOAD) //Checking for max number of SEI messages.
608*c83a76b0SSuyog Pawar ps_hle_ctxt->ihevce_cmds_error_report(
609*c83a76b0SSuyog Pawar ps_hle_ctxt->pv_cmd_err_cb_handle, IHEVCE_SYNCH_ERR_TOO_MANY_SEI_MSG, 1, i4_buf_id);
610*c83a76b0SSuyog Pawar #endif
611*c83a76b0SSuyog Pawar
612*c83a76b0SSuyog Pawar if(!i4_end_flag)
613*c83a76b0SSuyog Pawar ps_hle_ctxt->ihevce_cmds_error_report(
614*c83a76b0SSuyog Pawar ps_hle_ctxt->pv_cmd_err_cb_handle, IHEVCE_SYNCH_ERR_NO_END_TAG, 1, i4_buf_id);
615*c83a76b0SSuyog Pawar }
616*c83a76b0SSuyog Pawar
617*c83a76b0SSuyog Pawar /*!
618*c83a76b0SSuyog Pawar ************************************************************************
619*c83a76b0SSuyog Pawar * \brief
620*c83a76b0SSuyog Pawar * lap parse Async commands
621*c83a76b0SSuyog Pawar ************************************************************************
622*c83a76b0SSuyog Pawar */
ihevce_lap_parse_async_cmd(ihevce_hle_ctxt_t * ps_hle_ctxt,WORD32 * pi4_cmd_buf,WORD32 i4_length,WORD32 i4_buf_id,WORD32 * pi4_num_set_bitrate_cmds,ihevce_dyn_config_prms_t * ps_dyn_br)623*c83a76b0SSuyog Pawar void ihevce_lap_parse_async_cmd(
624*c83a76b0SSuyog Pawar ihevce_hle_ctxt_t *ps_hle_ctxt,
625*c83a76b0SSuyog Pawar WORD32 *pi4_cmd_buf,
626*c83a76b0SSuyog Pawar WORD32 i4_length,
627*c83a76b0SSuyog Pawar WORD32 i4_buf_id,
628*c83a76b0SSuyog Pawar WORD32 *pi4_num_set_bitrate_cmds,
629*c83a76b0SSuyog Pawar ihevce_dyn_config_prms_t *ps_dyn_br)
630*c83a76b0SSuyog Pawar {
631*c83a76b0SSuyog Pawar WORD32 i4_end_flag = 0;
632*c83a76b0SSuyog Pawar WORD32 *pi4_tag_parse = pi4_cmd_buf;
633*c83a76b0SSuyog Pawar
634*c83a76b0SSuyog Pawar while(i4_length >= 4)
635*c83a76b0SSuyog Pawar {
636*c83a76b0SSuyog Pawar switch(*pi4_tag_parse)
637*c83a76b0SSuyog Pawar {
638*c83a76b0SSuyog Pawar case IHEVCE_ASYNCH_API_SETBITRATE_TAG:
639*c83a76b0SSuyog Pawar if(i4_length < (8 + sizeof(ihevce_dyn_config_prms_t)) ||
640*c83a76b0SSuyog Pawar pi4_tag_parse[1] != sizeof(ihevce_dyn_config_prms_t))
641*c83a76b0SSuyog Pawar {
642*c83a76b0SSuyog Pawar ps_hle_ctxt->ihevce_cmds_error_report(
643*c83a76b0SSuyog Pawar ps_hle_ctxt->pv_cmd_err_cb_handle, IHEVCE_ASYNCH_ERR_BR_NOT_BYTE, 1, i4_buf_id);
644*c83a76b0SSuyog Pawar return;
645*c83a76b0SSuyog Pawar }
646*c83a76b0SSuyog Pawar memcpy(
647*c83a76b0SSuyog Pawar (void *)ps_dyn_br, (void *)(pi4_tag_parse + 2), sizeof(ihevce_dyn_config_prms_t));
648*c83a76b0SSuyog Pawar pi4_tag_parse += (2 + (sizeof(ihevce_dyn_config_prms_t) >> 2));
649*c83a76b0SSuyog Pawar i4_length -= (8 + sizeof(ihevce_dyn_config_prms_t));
650*c83a76b0SSuyog Pawar *pi4_num_set_bitrate_cmds += 1;
651*c83a76b0SSuyog Pawar ps_dyn_br++;
652*c83a76b0SSuyog Pawar break;
653*c83a76b0SSuyog Pawar case IHEVCE_ASYNCH_API_END_TAG:
654*c83a76b0SSuyog Pawar i4_end_flag = 1;
655*c83a76b0SSuyog Pawar i4_length -= 4;
656*c83a76b0SSuyog Pawar break;
657*c83a76b0SSuyog Pawar default:
658*c83a76b0SSuyog Pawar ps_hle_ctxt->ihevce_cmds_error_report(
659*c83a76b0SSuyog Pawar ps_hle_ctxt->pv_cmd_err_cb_handle, IHEVCE_ASYNCH_ERR_TLV_ERROR, 1, i4_buf_id);
660*c83a76b0SSuyog Pawar i4_end_flag = 1;
661*c83a76b0SSuyog Pawar }
662*c83a76b0SSuyog Pawar if(i4_end_flag)
663*c83a76b0SSuyog Pawar break;
664*c83a76b0SSuyog Pawar }
665*c83a76b0SSuyog Pawar if(!i4_end_flag)
666*c83a76b0SSuyog Pawar ps_hle_ctxt->ihevce_cmds_error_report(
667*c83a76b0SSuyog Pawar ps_hle_ctxt->pv_cmd_err_cb_handle, IHEVCE_ASYNCH_ERR_NO_END_TAG, 1, i4_buf_id);
668*c83a76b0SSuyog Pawar }
669*c83a76b0SSuyog Pawar
670*c83a76b0SSuyog Pawar /*!
671*c83a76b0SSuyog Pawar ************************************************************************
672*c83a76b0SSuyog Pawar * \brief
673*c83a76b0SSuyog Pawar * ref pics weight offset calculation
674*c83a76b0SSuyog Pawar ************************************************************************
675*c83a76b0SSuyog Pawar */
ref_pics_weight_offset_calc(ihevce_lap_output_params_t * ps_lap_out,lap_struct_t * ps_lap_struct)676*c83a76b0SSuyog Pawar void ref_pics_weight_offset_calc(ihevce_lap_output_params_t *ps_lap_out, lap_struct_t *ps_lap_struct)
677*c83a76b0SSuyog Pawar {
678*c83a76b0SSuyog Pawar WORD32 i, j;
679*c83a76b0SSuyog Pawar WORD32 *ref_poc_array = ps_lap_struct->ref_poc_array;
680*c83a76b0SSuyog Pawar WORD32 ai4_delta_poc[MAX_REF_PICS];
681*c83a76b0SSuyog Pawar WORD32 ref_poc_arr_sort[MAX_REF_PICS];
682*c83a76b0SSuyog Pawar
683*c83a76b0SSuyog Pawar /* Default weighted pred parameters populated for now */
684*c83a76b0SSuyog Pawar ps_lap_out->i4_log2_luma_wght_denom = DENOM_DEFAULT;
685*c83a76b0SSuyog Pawar ps_lap_out->i4_log2_chroma_wght_denom = DENOM_DEFAULT;
686*c83a76b0SSuyog Pawar
687*c83a76b0SSuyog Pawar /* sort the ref_poc_array based on delta as
688*c83a76b0SSuyog Pawar * in case weighted pred dup pics are inserted and it should consider
689*c83a76b0SSuyog Pawar * the neighbors first for prediction than farthest */
690*c83a76b0SSuyog Pawar for(i = 0; i < ps_lap_struct->i4_curr_ref_pics; i++)
691*c83a76b0SSuyog Pawar {
692*c83a76b0SSuyog Pawar ai4_delta_poc[i] = ref_poc_array[i] - ps_lap_out->i4_poc;
693*c83a76b0SSuyog Pawar }
694*c83a76b0SSuyog Pawar
695*c83a76b0SSuyog Pawar for(i = 0; i < ps_lap_struct->i4_curr_ref_pics; i++)
696*c83a76b0SSuyog Pawar {
697*c83a76b0SSuyog Pawar WORD32 i4_min, temp;
698*c83a76b0SSuyog Pawar i4_min = i;
699*c83a76b0SSuyog Pawar for(j = i; j < ps_lap_struct->i4_curr_ref_pics; j++)
700*c83a76b0SSuyog Pawar {
701*c83a76b0SSuyog Pawar if(abs(ai4_delta_poc[j]) <= abs(ai4_delta_poc[i4_min]))
702*c83a76b0SSuyog Pawar {
703*c83a76b0SSuyog Pawar i4_min = j;
704*c83a76b0SSuyog Pawar }
705*c83a76b0SSuyog Pawar }
706*c83a76b0SSuyog Pawar temp = ai4_delta_poc[i];
707*c83a76b0SSuyog Pawar ai4_delta_poc[i] = ai4_delta_poc[i4_min];
708*c83a76b0SSuyog Pawar ai4_delta_poc[i4_min] = temp;
709*c83a76b0SSuyog Pawar ref_poc_arr_sort[i] = ai4_delta_poc[i] + ps_lap_out->i4_poc;
710*c83a76b0SSuyog Pawar }
711*c83a76b0SSuyog Pawar
712*c83a76b0SSuyog Pawar for(i = 0; i < ps_lap_struct->i4_curr_ref_pics; i++)
713*c83a76b0SSuyog Pawar {
714*c83a76b0SSuyog Pawar ps_lap_out->as_ref_pics[i].i4_ref_pic_delta_poc = ref_poc_arr_sort[i] - ps_lap_out->i4_poc;
715*c83a76b0SSuyog Pawar ASSERT(ps_lap_out->as_ref_pics[i].i4_ref_pic_delta_poc);
716*c83a76b0SSuyog Pawar
717*c83a76b0SSuyog Pawar /* Enable flag for the reference pics to be used by curr pic */
718*c83a76b0SSuyog Pawar ps_lap_out->as_ref_pics[i].i4_used_by_cur_pic_flag = gau1_use_by_cur_pic_flag[i];
719*c83a76b0SSuyog Pawar
720*c83a76b0SSuyog Pawar /* Currently no weighted prediction offset added */
721*c83a76b0SSuyog Pawar ps_lap_out->as_ref_pics[i].i4_num_duplicate_entries_in_ref_list = 1;
722*c83a76b0SSuyog Pawar }
723*c83a76b0SSuyog Pawar return;
724*c83a76b0SSuyog Pawar }
725*c83a76b0SSuyog Pawar
726*c83a76b0SSuyog Pawar /*!
727*c83a76b0SSuyog Pawar ************************************************************************
728*c83a76b0SSuyog Pawar * \brief
729*c83a76b0SSuyog Pawar * ref b picture population
730*c83a76b0SSuyog Pawar ************************************************************************
731*c83a76b0SSuyog Pawar */
ref_b_pic_population(WORD32 curr_layer,ihevce_lap_enc_buf_t * ps_lap_inp,lap_struct_t * ps_lap_struct)732*c83a76b0SSuyog Pawar void ref_b_pic_population(
733*c83a76b0SSuyog Pawar WORD32 curr_layer, ihevce_lap_enc_buf_t *ps_lap_inp, lap_struct_t *ps_lap_struct)
734*c83a76b0SSuyog Pawar {
735*c83a76b0SSuyog Pawar ihevce_lap_output_params_t *ps_lap_out = &ps_lap_inp->s_lap_out;
736*c83a76b0SSuyog Pawar WORD32 *ref_poc_array = ps_lap_struct->ref_poc_array;
737*c83a76b0SSuyog Pawar WORD32 *p_ref_poc_array = ref_poc_array;
738*c83a76b0SSuyog Pawar WORD32 i4_interlace_field = ps_lap_struct->s_lap_static_params.i4_src_interlace_field;
739*c83a76b0SSuyog Pawar WORD32 i4_max_ref_pics = ps_lap_struct->s_lap_static_params.i4_max_reference_frames;
740*c83a76b0SSuyog Pawar WORD32 max_temporal_layers = ps_lap_struct->s_lap_static_params.i4_max_temporal_layers;
741*c83a76b0SSuyog Pawar
742*c83a76b0SSuyog Pawar /* LAP output structure */
743*c83a76b0SSuyog Pawar ps_lap_out->i4_poc = ps_lap_struct->pi4_encode_poc_ptr[0];
744*c83a76b0SSuyog Pawar ps_lap_out->i4_idr_gop_num = ps_lap_struct->i4_idr_gop_num;
745*c83a76b0SSuyog Pawar ps_lap_out->i4_assoc_IRAP_poc = ps_lap_struct->i4_assoc_IRAP_poc;
746*c83a76b0SSuyog Pawar ps_lap_out->i4_temporal_lyr_id = curr_layer;
747*c83a76b0SSuyog Pawar ps_lap_out->i4_pic_type = IV_B_FRAME;
748*c83a76b0SSuyog Pawar
749*c83a76b0SSuyog Pawar if((ps_lap_out->i4_poc > ps_lap_struct->i4_cra_poc) &&
750*c83a76b0SSuyog Pawar (ref_poc_array[0] < ps_lap_struct->i4_cra_poc) && ps_lap_struct->i4_cra_i_pic_flag)
751*c83a76b0SSuyog Pawar {
752*c83a76b0SSuyog Pawar ref_poc_array[0] = ps_lap_struct->i4_cra_poc;
753*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_ref_pics = 1;
754*c83a76b0SSuyog Pawar }
755*c83a76b0SSuyog Pawar
756*c83a76b0SSuyog Pawar ps_lap_out->i4_num_ref_pics = ps_lap_struct->i4_curr_ref_pics;
757*c83a76b0SSuyog Pawar
758*c83a76b0SSuyog Pawar /* Default: Cur pic is ref pic*/
759*c83a76b0SSuyog Pawar ps_lap_out->i4_is_ref_pic = 1;
760*c83a76b0SSuyog Pawar
761*c83a76b0SSuyog Pawar if(1 == i4_interlace_field)
762*c83a76b0SSuyog Pawar {
763*c83a76b0SSuyog Pawar WORD32 i4_bottom_field = ps_lap_inp->s_input_buf.i4_bottom_field;
764*c83a76b0SSuyog Pawar WORD32 first_field = (ps_lap_inp->s_input_buf.i4_topfield_first ^ i4_bottom_field);
765*c83a76b0SSuyog Pawar
766*c83a76b0SSuyog Pawar /*If current pic is top field B picture and is present in top hierarchical layer */
767*c83a76b0SSuyog Pawar /* Dereference the curr pic */
768*c83a76b0SSuyog Pawar if(ps_lap_out->i4_temporal_lyr_id == max_temporal_layers)
769*c83a76b0SSuyog Pawar {
770*c83a76b0SSuyog Pawar if(0 == first_field)
771*c83a76b0SSuyog Pawar ps_lap_out->i4_is_ref_pic = 0;
772*c83a76b0SSuyog Pawar else
773*c83a76b0SSuyog Pawar ps_lap_out->i4_is_ref_pic = 2;
774*c83a76b0SSuyog Pawar }
775*c83a76b0SSuyog Pawar }
776*c83a76b0SSuyog Pawar else
777*c83a76b0SSuyog Pawar {
778*c83a76b0SSuyog Pawar /*If progressive B picture and is present in top hierarchical layer */
779*c83a76b0SSuyog Pawar if(ps_lap_out->i4_temporal_lyr_id >= max_temporal_layers)
780*c83a76b0SSuyog Pawar {
781*c83a76b0SSuyog Pawar ps_lap_out->i4_temporal_lyr_id = max_temporal_layers;
782*c83a76b0SSuyog Pawar ps_lap_out->i4_is_ref_pic = 0;
783*c83a76b0SSuyog Pawar }
784*c83a76b0SSuyog Pawar }
785*c83a76b0SSuyog Pawar
786*c83a76b0SSuyog Pawar ref_pics_weight_offset_calc(ps_lap_out, ps_lap_struct);
787*c83a76b0SSuyog Pawar
788*c83a76b0SSuyog Pawar /* Updating number of current reference Pictures for the Given Picture */
789*c83a76b0SSuyog Pawar /* If the current frame is n-layer B frame, donot increment*/
790*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_curr_ref_pics < i4_max_ref_pics)
791*c83a76b0SSuyog Pawar {
792*c83a76b0SSuyog Pawar if(ps_lap_out->i4_is_ref_pic)
793*c83a76b0SSuyog Pawar {
794*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_ref_pics++;
795*c83a76b0SSuyog Pawar }
796*c83a76b0SSuyog Pawar }
797*c83a76b0SSuyog Pawar
798*c83a76b0SSuyog Pawar /* Arrange the reference array in ascending order */
799*c83a76b0SSuyog Pawar {
800*c83a76b0SSuyog Pawar WORD32 i, j, temp;
801*c83a76b0SSuyog Pawar for(i = 0; i < (ps_lap_struct->i4_curr_ref_pics - 1); i++)
802*c83a76b0SSuyog Pawar {
803*c83a76b0SSuyog Pawar for(j = i + 1; j < ps_lap_struct->i4_curr_ref_pics; j++)
804*c83a76b0SSuyog Pawar {
805*c83a76b0SSuyog Pawar if(ref_poc_array[i] > ref_poc_array[j])
806*c83a76b0SSuyog Pawar {
807*c83a76b0SSuyog Pawar temp = ref_poc_array[i];
808*c83a76b0SSuyog Pawar ref_poc_array[i] = ref_poc_array[j];
809*c83a76b0SSuyog Pawar ref_poc_array[j] = temp;
810*c83a76b0SSuyog Pawar }
811*c83a76b0SSuyog Pawar }
812*c83a76b0SSuyog Pawar }
813*c83a76b0SSuyog Pawar }
814*c83a76b0SSuyog Pawar
815*c83a76b0SSuyog Pawar {
816*c83a76b0SSuyog Pawar WORD32 ref = ps_lap_out->i4_poc;
817*c83a76b0SSuyog Pawar if(ps_lap_out->i4_is_ref_pic && ref > *p_ref_poc_array)
818*c83a76b0SSuyog Pawar {
819*c83a76b0SSuyog Pawar *p_ref_poc_array = ref;
820*c83a76b0SSuyog Pawar }
821*c83a76b0SSuyog Pawar }
822*c83a76b0SSuyog Pawar
823*c83a76b0SSuyog Pawar return;
824*c83a76b0SSuyog Pawar }
825*c83a76b0SSuyog Pawar
826*c83a76b0SSuyog Pawar /*!
827*c83a76b0SSuyog Pawar ************************************************************************
828*c83a76b0SSuyog Pawar * \brief
829*c83a76b0SSuyog Pawar * ref i/p pic population
830*c83a76b0SSuyog Pawar ************************************************************************
831*c83a76b0SSuyog Pawar */
ref_pic_population(ihevce_lap_enc_buf_t * ps_lap_inp,lap_struct_t * ps_lap_struct)832*c83a76b0SSuyog Pawar void ref_pic_population(ihevce_lap_enc_buf_t *ps_lap_inp, lap_struct_t *ps_lap_struct)
833*c83a76b0SSuyog Pawar {
834*c83a76b0SSuyog Pawar ihevce_lap_output_params_t *ps_lap_out = &ps_lap_inp->s_lap_out;
835*c83a76b0SSuyog Pawar WORD32 *ref_poc_array = ps_lap_struct->ref_poc_array;
836*c83a76b0SSuyog Pawar WORD32 *p_ref_poc_array = ref_poc_array;
837*c83a76b0SSuyog Pawar WORD32 i4_max_ref_pics = ps_lap_struct->s_lap_static_params.i4_max_reference_frames;
838*c83a76b0SSuyog Pawar
839*c83a76b0SSuyog Pawar /* Update the POC position */
840*c83a76b0SSuyog Pawar ps_lap_out->i4_poc = ps_lap_struct->pi4_encode_poc_ptr[0];
841*c83a76b0SSuyog Pawar
842*c83a76b0SSuyog Pawar /* picture after CRA can't refer pic before CRA*/
843*c83a76b0SSuyog Pawar if((ps_lap_out->i4_poc > ps_lap_struct->i4_cra_poc) &&
844*c83a76b0SSuyog Pawar (ref_poc_array[0] <= ps_lap_struct->i4_cra_poc) && ps_lap_struct->i4_cra_i_pic_flag)
845*c83a76b0SSuyog Pawar {
846*c83a76b0SSuyog Pawar ref_poc_array[0] = ps_lap_struct->i4_cra_poc;
847*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_ref_pics = 1;
848*c83a76b0SSuyog Pawar }
849*c83a76b0SSuyog Pawar
850*c83a76b0SSuyog Pawar /* For every IDR period, set pic type as IDR frame and reset reference POC array to 0*/
851*c83a76b0SSuyog Pawar if(IV_IDR_FRAME == ps_lap_out->i4_pic_type)
852*c83a76b0SSuyog Pawar {
853*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_gop_num++;
854*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_ref_pics = 0;
855*c83a76b0SSuyog Pawar ps_lap_out->i4_num_ref_pics = 0;
856*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_i_pic_flag = 1;
857*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_poc = ps_lap_out->i4_poc;
858*c83a76b0SSuyog Pawar
859*c83a76b0SSuyog Pawar memset(ps_lap_struct->ref_poc_array, 0xFF, sizeof(WORD32) * MAX_REF_PICS);
860*c83a76b0SSuyog Pawar }
861*c83a76b0SSuyog Pawar else if(IV_I_FRAME == ps_lap_out->i4_pic_type)
862*c83a76b0SSuyog Pawar {
863*c83a76b0SSuyog Pawar /* For the I-frames after CRA Frame, no pictures should be referenced */
864*c83a76b0SSuyog Pawar if((1 == ps_lap_struct->i4_cra_i_pic_flag) && ps_lap_out->i4_is_cra_pic)
865*c83a76b0SSuyog Pawar {
866*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_ref_pics = 0;
867*c83a76b0SSuyog Pawar ps_lap_out->i4_num_ref_pics = 0;
868*c83a76b0SSuyog Pawar }
869*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_poc = ps_lap_out->i4_poc;
870*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_i_pic_flag = ps_lap_out->i4_is_cra_pic;
871*c83a76b0SSuyog Pawar }
872*c83a76b0SSuyog Pawar else if(IV_P_FRAME == ps_lap_out->i4_pic_type)
873*c83a76b0SSuyog Pawar {
874*c83a76b0SSuyog Pawar /* If the current POC is the P POC after CRA I POC */
875*c83a76b0SSuyog Pawar if(1 == ps_lap_struct->i4_cra_i_pic_flag)
876*c83a76b0SSuyog Pawar {
877*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_ref_pics = 1;
878*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_i_pic_flag = 0;
879*c83a76b0SSuyog Pawar }
880*c83a76b0SSuyog Pawar }
881*c83a76b0SSuyog Pawar
882*c83a76b0SSuyog Pawar if(ps_lap_out->i4_pic_type == IV_IDR_FRAME ||
883*c83a76b0SSuyog Pawar (ps_lap_out->i4_pic_type == IV_I_FRAME && ps_lap_out->i4_is_cra_pic))
884*c83a76b0SSuyog Pawar {
885*c83a76b0SSuyog Pawar ps_lap_struct->i4_assoc_IRAP_poc = ps_lap_out->i4_poc;
886*c83a76b0SSuyog Pawar }
887*c83a76b0SSuyog Pawar
888*c83a76b0SSuyog Pawar /*Update ps_lap_out*/
889*c83a76b0SSuyog Pawar ps_lap_out->i4_idr_gop_num = ps_lap_struct->i4_idr_gop_num;
890*c83a76b0SSuyog Pawar ps_lap_out->i4_is_ref_pic = 1;
891*c83a76b0SSuyog Pawar ps_lap_out->i4_assoc_IRAP_poc = ps_lap_struct->i4_assoc_IRAP_poc;
892*c83a76b0SSuyog Pawar
893*c83a76b0SSuyog Pawar /* Reference POCS */
894*c83a76b0SSuyog Pawar ps_lap_out->i4_num_ref_pics = ps_lap_struct->i4_curr_ref_pics;
895*c83a76b0SSuyog Pawar
896*c83a76b0SSuyog Pawar /* I and P frames are always mapped to layer zero*/
897*c83a76b0SSuyog Pawar ps_lap_out->i4_temporal_lyr_id = 0;
898*c83a76b0SSuyog Pawar
899*c83a76b0SSuyog Pawar ref_pics_weight_offset_calc(ps_lap_out, ps_lap_struct);
900*c83a76b0SSuyog Pawar
901*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_curr_ref_pics < i4_max_ref_pics)
902*c83a76b0SSuyog Pawar {
903*c83a76b0SSuyog Pawar if(ps_lap_out->i4_is_ref_pic)
904*c83a76b0SSuyog Pawar {
905*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_ref_pics++;
906*c83a76b0SSuyog Pawar }
907*c83a76b0SSuyog Pawar }
908*c83a76b0SSuyog Pawar
909*c83a76b0SSuyog Pawar /* Arrange the reference array in ascending order */
910*c83a76b0SSuyog Pawar {
911*c83a76b0SSuyog Pawar WORD32 i, j, temp;
912*c83a76b0SSuyog Pawar for(i = 0; i < (ps_lap_struct->i4_curr_ref_pics - 1); i++)
913*c83a76b0SSuyog Pawar {
914*c83a76b0SSuyog Pawar for(j = i + 1; j < (ps_lap_struct->i4_curr_ref_pics); j++)
915*c83a76b0SSuyog Pawar {
916*c83a76b0SSuyog Pawar if(ref_poc_array[i] > ref_poc_array[j])
917*c83a76b0SSuyog Pawar {
918*c83a76b0SSuyog Pawar temp = ref_poc_array[i];
919*c83a76b0SSuyog Pawar ref_poc_array[i] = ref_poc_array[j];
920*c83a76b0SSuyog Pawar ref_poc_array[j] = temp;
921*c83a76b0SSuyog Pawar }
922*c83a76b0SSuyog Pawar }
923*c83a76b0SSuyog Pawar }
924*c83a76b0SSuyog Pawar }
925*c83a76b0SSuyog Pawar
926*c83a76b0SSuyog Pawar {
927*c83a76b0SSuyog Pawar /* add the current pictute at the start of the reference queue */
928*c83a76b0SSuyog Pawar /*For I and P pictures, all the previous frames are reference frames */
929*c83a76b0SSuyog Pawar /* If the current ref POC is greater than the least POC in reference array*/
930*c83a76b0SSuyog Pawar /* Then fill the reference array */
931*c83a76b0SSuyog Pawar
932*c83a76b0SSuyog Pawar WORD32 ref = ps_lap_out->i4_poc;
933*c83a76b0SSuyog Pawar
934*c83a76b0SSuyog Pawar if(ps_lap_out->i4_is_ref_pic && ref > *p_ref_poc_array)
935*c83a76b0SSuyog Pawar {
936*c83a76b0SSuyog Pawar *p_ref_poc_array = ref;
937*c83a76b0SSuyog Pawar }
938*c83a76b0SSuyog Pawar }
939*c83a76b0SSuyog Pawar
940*c83a76b0SSuyog Pawar return;
941*c83a76b0SSuyog Pawar }
942*c83a76b0SSuyog Pawar
943*c83a76b0SSuyog Pawar /*!
944*c83a76b0SSuyog Pawar ************************************************************************
945*c83a76b0SSuyog Pawar * \brief
946*c83a76b0SSuyog Pawar * determine next sub-gop state
947*c83a76b0SSuyog Pawar ************************************************************************
948*c83a76b0SSuyog Pawar */
ihevce_determine_next_sub_gop_state(lap_struct_t * ps_lap_struct)949*c83a76b0SSuyog Pawar void ihevce_determine_next_sub_gop_state(lap_struct_t *ps_lap_struct)
950*c83a76b0SSuyog Pawar {
951*c83a76b0SSuyog Pawar WORD32 i4_num_b_frames = -1;
952*c83a76b0SSuyog Pawar WORD32 i4_sd = ps_lap_struct->i4_sub_gop_size;
953*c83a76b0SSuyog Pawar WORD32 i4_sd_idr = ps_lap_struct->i4_sub_gop_size_idr;
954*c83a76b0SSuyog Pawar WORD32 i4_Midr = ps_lap_struct->i4_max_idr_period;
955*c83a76b0SSuyog Pawar WORD32 i4_midr = ps_lap_struct->i4_min_idr_period;
956*c83a76b0SSuyog Pawar WORD32 i4_Mcra = ps_lap_struct->i4_max_cra_period;
957*c83a76b0SSuyog Pawar WORD32 i4_Mi = ps_lap_struct->i4_max_i_period;
958*c83a76b0SSuyog Pawar WORD32 i4_Cd = ps_lap_struct->i4_idr_counter;
959*c83a76b0SSuyog Pawar WORD32 i4_Cc = ps_lap_struct->i4_cra_counter;
960*c83a76b0SSuyog Pawar WORD32 i4_Ci = ps_lap_struct->i4_i_counter;
961*c83a76b0SSuyog Pawar
962*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_force_idr_pos)
963*c83a76b0SSuyog Pawar {
964*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided = 1;
965*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[0] = PIC_TYPE_IDR;
966*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter = 0;
967*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter = 0;
968*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = 0;
969*c83a76b0SSuyog Pawar ps_lap_struct->i4_force_idr_pos = 0;
970*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_pic_idx = 0;
971*c83a76b0SSuyog Pawar }
972*c83a76b0SSuyog Pawar
973*c83a76b0SSuyog Pawar if(i4_Midr)
974*c83a76b0SSuyog Pawar ASSERT(i4_Cd < i4_Midr);
975*c83a76b0SSuyog Pawar
976*c83a76b0SSuyog Pawar if(i4_Mcra)
977*c83a76b0SSuyog Pawar ASSERT(i4_Cc < i4_Mcra);
978*c83a76b0SSuyog Pawar
979*c83a76b0SSuyog Pawar if(i4_Mi)
980*c83a76b0SSuyog Pawar ASSERT(i4_Ci < i4_Mi);
981*c83a76b0SSuyog Pawar
982*c83a76b0SSuyog Pawar /*if all are i pictures */
983*c83a76b0SSuyog Pawar if((i4_Midr == 1) || (i4_Mcra == 1) || (i4_Mi == 1))
984*c83a76b0SSuyog Pawar {
985*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided = 1;
986*c83a76b0SSuyog Pawar if((i4_Midr == 1) || ((i4_Cd + i4_sd) == i4_Midr))
987*c83a76b0SSuyog Pawar {
988*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[1] = PIC_TYPE_IDR;
989*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter = 0;
990*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter = 0;
991*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = 0;
992*c83a76b0SSuyog Pawar }
993*c83a76b0SSuyog Pawar else if((i4_Mcra == 1) || ((i4_Cc + i4_sd) == i4_Mcra))
994*c83a76b0SSuyog Pawar {
995*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[1] = PIC_TYPE_CRA;
996*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter += 1;
997*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter = 0;
998*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = 0;
999*c83a76b0SSuyog Pawar }
1000*c83a76b0SSuyog Pawar else
1001*c83a76b0SSuyog Pawar {
1002*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[1] = PIC_TYPE_I;
1003*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter += 1;
1004*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter += 1;
1005*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = 0;
1006*c83a76b0SSuyog Pawar }
1007*c83a76b0SSuyog Pawar return;
1008*c83a76b0SSuyog Pawar }
1009*c83a76b0SSuyog Pawar
1010*c83a76b0SSuyog Pawar if((i4_Cd + i4_sd_idr >= i4_Midr) && i4_Midr)
1011*c83a76b0SSuyog Pawar {
1012*c83a76b0SSuyog Pawar /*if idr falls already on sub-gop aligned w.r.t Midr or if strict idr use case*/
1013*c83a76b0SSuyog Pawar if(i4_sd_idr != i4_sd)
1014*c83a76b0SSuyog Pawar {
1015*c83a76b0SSuyog Pawar i4_num_b_frames = i4_Midr - i4_Cd - 2;
1016*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ai1_pic_type[1], PIC_TYPE_B, i4_num_b_frames);
1017*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[i4_num_b_frames + 1] = PIC_TYPE_P;
1018*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[i4_num_b_frames + 2] = PIC_TYPE_IDR;
1019*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided = i4_num_b_frames + 2;
1020*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter = 0;
1021*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter = 0;
1022*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = 0;
1023*c83a76b0SSuyog Pawar }
1024*c83a76b0SSuyog Pawar else
1025*c83a76b0SSuyog Pawar {
1026*c83a76b0SSuyog Pawar i4_num_b_frames = 0;
1027*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[1] = PIC_TYPE_IDR;
1028*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided = 1;
1029*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter = 0;
1030*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter = 0;
1031*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = 0;
1032*c83a76b0SSuyog Pawar }
1033*c83a76b0SSuyog Pawar }
1034*c83a76b0SSuyog Pawar /*if next sub gop is going to have CRA as Cc reaches Mcra*/
1035*c83a76b0SSuyog Pawar else if(((i4_Cc + i4_sd) >= i4_Mcra) && i4_Mcra)
1036*c83a76b0SSuyog Pawar {
1037*c83a76b0SSuyog Pawar if(((i4_Cc + i4_sd) == i4_Mcra) || (1 == ps_lap_struct->i4_fixed_open_gop_period))
1038*c83a76b0SSuyog Pawar {
1039*c83a76b0SSuyog Pawar i4_num_b_frames = i4_Mcra - i4_Cc - 1;
1040*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ai1_pic_type[1], PIC_TYPE_B, i4_num_b_frames);
1041*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[i4_num_b_frames + 1] = PIC_TYPE_CRA;
1042*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided = i4_num_b_frames + 1;
1043*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter += ps_lap_struct->i4_num_frm_type_decided;
1044*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter = 0;
1045*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = 0;
1046*c83a76b0SSuyog Pawar }
1047*c83a76b0SSuyog Pawar else
1048*c83a76b0SSuyog Pawar {
1049*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[0] = PIC_TYPE_CRA;
1050*c83a76b0SSuyog Pawar i4_num_b_frames = i4_sd - 1;
1051*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ai1_pic_type[1], PIC_TYPE_B, i4_num_b_frames);
1052*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[i4_num_b_frames + 1] = PIC_TYPE_P;
1053*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided = i4_num_b_frames + 1;
1054*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter += ps_lap_struct->i4_num_frm_type_decided;
1055*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter = ps_lap_struct->i4_num_frm_type_decided;
1056*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = ps_lap_struct->i4_num_frm_type_decided;
1057*c83a76b0SSuyog Pawar }
1058*c83a76b0SSuyog Pawar }
1059*c83a76b0SSuyog Pawar /*if next sub gop is going to have I_slice as Ci reaches Mi*/
1060*c83a76b0SSuyog Pawar else if((i4_Ci + i4_sd >= i4_Mi) && i4_Mi)
1061*c83a76b0SSuyog Pawar {
1062*c83a76b0SSuyog Pawar if(((i4_Ci + i4_sd) == i4_Mi) || (1 == ps_lap_struct->i4_fixed_i_period))
1063*c83a76b0SSuyog Pawar {
1064*c83a76b0SSuyog Pawar i4_num_b_frames = i4_Mi - i4_Ci - 1;
1065*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ai1_pic_type[1], PIC_TYPE_B, i4_num_b_frames);
1066*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[i4_num_b_frames + 1] = PIC_TYPE_I;
1067*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided = i4_num_b_frames + 1;
1068*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter += ps_lap_struct->i4_num_frm_type_decided;
1069*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter += ps_lap_struct->i4_num_frm_type_decided;
1070*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = 0;
1071*c83a76b0SSuyog Pawar }
1072*c83a76b0SSuyog Pawar else
1073*c83a76b0SSuyog Pawar {
1074*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[0] = PIC_TYPE_I;
1075*c83a76b0SSuyog Pawar i4_num_b_frames = i4_sd - 1;
1076*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ai1_pic_type[1], PIC_TYPE_B, i4_num_b_frames);
1077*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[i4_num_b_frames + 1] = PIC_TYPE_P;
1078*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided = i4_num_b_frames + 1;
1079*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter += ps_lap_struct->i4_num_frm_type_decided;
1080*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter += ps_lap_struct->i4_num_frm_type_decided;
1081*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter = ps_lap_struct->i4_num_frm_type_decided;
1082*c83a76b0SSuyog Pawar }
1083*c83a76b0SSuyog Pawar }
1084*c83a76b0SSuyog Pawar /* if next sub-gop is not going to be idr,cra,I*/
1085*c83a76b0SSuyog Pawar else
1086*c83a76b0SSuyog Pawar {
1087*c83a76b0SSuyog Pawar i4_num_b_frames = i4_sd - 1;
1088*c83a76b0SSuyog Pawar memset(&ps_lap_struct->ai1_pic_type[1], PIC_TYPE_B, i4_num_b_frames);
1089*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[i4_num_b_frames + 1] = PIC_TYPE_P;
1090*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided = i4_num_b_frames + 1;
1091*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_counter += ps_lap_struct->i4_num_frm_type_decided;
1092*c83a76b0SSuyog Pawar ps_lap_struct->i4_cra_counter += ps_lap_struct->i4_num_frm_type_decided;
1093*c83a76b0SSuyog Pawar ps_lap_struct->i4_i_counter += ps_lap_struct->i4_num_frm_type_decided;
1094*c83a76b0SSuyog Pawar }
1095*c83a76b0SSuyog Pawar ASSERT(i4_num_b_frames != -1);
1096*c83a76b0SSuyog Pawar
1097*c83a76b0SSuyog Pawar return;
1098*c83a76b0SSuyog Pawar }
1099*c83a76b0SSuyog Pawar
1100*c83a76b0SSuyog Pawar /*!
1101*c83a76b0SSuyog Pawar ************************************************************************
1102*c83a76b0SSuyog Pawar * \brief
1103*c83a76b0SSuyog Pawar * assign pic type to input buf
1104*c83a76b0SSuyog Pawar ************************************************************************
1105*c83a76b0SSuyog Pawar */
ihevce_assign_pic_type(lap_struct_t * ps_lap_struct,ihevce_lap_enc_buf_t * ps_lap_inp_buf)1106*c83a76b0SSuyog Pawar void ihevce_assign_pic_type(lap_struct_t *ps_lap_struct, ihevce_lap_enc_buf_t *ps_lap_inp_buf)
1107*c83a76b0SSuyog Pawar {
1108*c83a76b0SSuyog Pawar WORD8 pic_type = ps_lap_struct->ai1_pic_type[ps_lap_struct->i4_next_start_ctr];
1109*c83a76b0SSuyog Pawar
1110*c83a76b0SSuyog Pawar switch(pic_type)
1111*c83a76b0SSuyog Pawar {
1112*c83a76b0SSuyog Pawar case PIC_TYPE_I:
1113*c83a76b0SSuyog Pawar {
1114*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_pic_type = IV_I_FRAME;
1115*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_is_cra_pic = 0;
1116*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_is_I_in_any_field = 1;
1117*c83a76b0SSuyog Pawar break;
1118*c83a76b0SSuyog Pawar }
1119*c83a76b0SSuyog Pawar case PIC_TYPE_P:
1120*c83a76b0SSuyog Pawar {
1121*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_pic_type = IV_P_FRAME;
1122*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_is_cra_pic = 0;
1123*c83a76b0SSuyog Pawar break;
1124*c83a76b0SSuyog Pawar }
1125*c83a76b0SSuyog Pawar case PIC_TYPE_B:
1126*c83a76b0SSuyog Pawar {
1127*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_pic_type = IV_B_FRAME;
1128*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_is_cra_pic = 0;
1129*c83a76b0SSuyog Pawar break;
1130*c83a76b0SSuyog Pawar }
1131*c83a76b0SSuyog Pawar case PIC_TYPE_IDR:
1132*c83a76b0SSuyog Pawar {
1133*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_poc = 0;
1134*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_pic_type = IV_IDR_FRAME;
1135*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_is_cra_pic = 0;
1136*c83a76b0SSuyog Pawar break;
1137*c83a76b0SSuyog Pawar }
1138*c83a76b0SSuyog Pawar case PIC_TYPE_CRA:
1139*c83a76b0SSuyog Pawar {
1140*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_pic_type = IV_I_FRAME;
1141*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_is_I_in_any_field = 1;
1142*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_is_cra_pic = 1;
1143*c83a76b0SSuyog Pawar break;
1144*c83a76b0SSuyog Pawar }
1145*c83a76b0SSuyog Pawar default:
1146*c83a76b0SSuyog Pawar ASSERT(0);
1147*c83a76b0SSuyog Pawar }
1148*c83a76b0SSuyog Pawar return;
1149*c83a76b0SSuyog Pawar }
1150*c83a76b0SSuyog Pawar
1151*c83a76b0SSuyog Pawar /*!
1152*c83a76b0SSuyog Pawar ************************************************************************
1153*c83a76b0SSuyog Pawar * \brief
1154*c83a76b0SSuyog Pawar * capture order traversal nodes
1155*c83a76b0SSuyog Pawar ************************************************************************
1156*c83a76b0SSuyog Pawar */
ihevce_encode_order_traversal_nodes(ihevce_encode_node_t * encode_node_t,ihevce_lap_enc_buf_t ** encode_order,WORD32 * loop_count,WORD32 curr_layer,lap_struct_t * ps_lap_struct)1157*c83a76b0SSuyog Pawar void ihevce_encode_order_traversal_nodes(
1158*c83a76b0SSuyog Pawar ihevce_encode_node_t *encode_node_t,
1159*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t **encode_order,
1160*c83a76b0SSuyog Pawar WORD32 *loop_count,
1161*c83a76b0SSuyog Pawar WORD32 curr_layer,
1162*c83a76b0SSuyog Pawar lap_struct_t *ps_lap_struct)
1163*c83a76b0SSuyog Pawar {
1164*c83a76b0SSuyog Pawar if(encode_node_t == NULL)
1165*c83a76b0SSuyog Pawar return;
1166*c83a76b0SSuyog Pawar
1167*c83a76b0SSuyog Pawar encode_order[*loop_count] = (ihevce_lap_enc_buf_t *)encode_node_t->ps_lap_top_buff;
1168*c83a76b0SSuyog Pawar
1169*c83a76b0SSuyog Pawar if(encode_order[*loop_count] != NULL)
1170*c83a76b0SSuyog Pawar {
1171*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_lap_inp;
1172*c83a76b0SSuyog Pawar
1173*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr[0] = encode_node_t->data;
1174*c83a76b0SSuyog Pawar ref_b_pic_population(curr_layer, encode_order[*loop_count], ps_lap_struct);
1175*c83a76b0SSuyog Pawar
1176*c83a76b0SSuyog Pawar ps_lap_inp = (ihevce_lap_enc_buf_t *)encode_order[*loop_count];
1177*c83a76b0SSuyog Pawar ihevce_rc_populate_common_params(&ps_lap_inp->s_lap_out, &ps_lap_inp->s_rc_lap_out);
1178*c83a76b0SSuyog Pawar
1179*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr++;
1180*c83a76b0SSuyog Pawar }
1181*c83a76b0SSuyog Pawar
1182*c83a76b0SSuyog Pawar (*loop_count) = (*loop_count) + 1;
1183*c83a76b0SSuyog Pawar
1184*c83a76b0SSuyog Pawar /* Pre-order Left-node traversal*/
1185*c83a76b0SSuyog Pawar ihevce_encode_order_traversal_nodes(
1186*c83a76b0SSuyog Pawar (ihevce_encode_node_t *)encode_node_t->pv_left_node,
1187*c83a76b0SSuyog Pawar encode_order,
1188*c83a76b0SSuyog Pawar loop_count,
1189*c83a76b0SSuyog Pawar curr_layer + 1,
1190*c83a76b0SSuyog Pawar ps_lap_struct);
1191*c83a76b0SSuyog Pawar
1192*c83a76b0SSuyog Pawar /* Pre-order Right-node traversal*/
1193*c83a76b0SSuyog Pawar ihevce_encode_order_traversal_nodes(
1194*c83a76b0SSuyog Pawar (ihevce_encode_node_t *)encode_node_t->pv_right_node,
1195*c83a76b0SSuyog Pawar encode_order,
1196*c83a76b0SSuyog Pawar loop_count,
1197*c83a76b0SSuyog Pawar curr_layer + 1,
1198*c83a76b0SSuyog Pawar ps_lap_struct);
1199*c83a76b0SSuyog Pawar }
1200*c83a76b0SSuyog Pawar
1201*c83a76b0SSuyog Pawar /*!
1202*c83a76b0SSuyog Pawar ************************************************************************
1203*c83a76b0SSuyog Pawar * \brief
1204*c83a76b0SSuyog Pawar * capture order traversal nodes
1205*c83a76b0SSuyog Pawar ************************************************************************
1206*c83a76b0SSuyog Pawar */
ihevce_capture_order_traversal_nodes(ihevce_encode_node_t * encode_node_t,ihevce_lap_enc_buf_t ** api4_capture_order_array,WORD32 * capture_order_poc_array,WORD32 * loop_count,WORD32 i4_interlace_field)1207*c83a76b0SSuyog Pawar void ihevce_capture_order_traversal_nodes(
1208*c83a76b0SSuyog Pawar ihevce_encode_node_t *encode_node_t,
1209*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t **api4_capture_order_array,
1210*c83a76b0SSuyog Pawar WORD32 *capture_order_poc_array,
1211*c83a76b0SSuyog Pawar WORD32 *loop_count,
1212*c83a76b0SSuyog Pawar WORD32 i4_interlace_field)
1213*c83a76b0SSuyog Pawar {
1214*c83a76b0SSuyog Pawar if(encode_node_t == NULL)
1215*c83a76b0SSuyog Pawar return;
1216*c83a76b0SSuyog Pawar
1217*c83a76b0SSuyog Pawar /* Inorder Insertion for the left-child node */
1218*c83a76b0SSuyog Pawar ihevce_capture_order_traversal_nodes(
1219*c83a76b0SSuyog Pawar (ihevce_encode_node_t *)encode_node_t->pv_left_node,
1220*c83a76b0SSuyog Pawar api4_capture_order_array,
1221*c83a76b0SSuyog Pawar capture_order_poc_array,
1222*c83a76b0SSuyog Pawar loop_count,
1223*c83a76b0SSuyog Pawar i4_interlace_field);
1224*c83a76b0SSuyog Pawar
1225*c83a76b0SSuyog Pawar if(i4_interlace_field)
1226*c83a76b0SSuyog Pawar {
1227*c83a76b0SSuyog Pawar encode_node_t->ps_lap_top_buff =
1228*c83a76b0SSuyog Pawar (ihevce_lap_enc_buf_t *)api4_capture_order_array[*loop_count];
1229*c83a76b0SSuyog Pawar encode_node_t->data = capture_order_poc_array[*loop_count];
1230*c83a76b0SSuyog Pawar encode_node_t->ps_lap_bottom_buff =
1231*c83a76b0SSuyog Pawar (ihevce_lap_enc_buf_t *)api4_capture_order_array[*loop_count + 1];
1232*c83a76b0SSuyog Pawar }
1233*c83a76b0SSuyog Pawar else
1234*c83a76b0SSuyog Pawar {
1235*c83a76b0SSuyog Pawar encode_node_t->ps_lap_top_buff =
1236*c83a76b0SSuyog Pawar (ihevce_lap_enc_buf_t *)api4_capture_order_array[*loop_count];
1237*c83a76b0SSuyog Pawar encode_node_t->data = capture_order_poc_array[*loop_count];
1238*c83a76b0SSuyog Pawar }
1239*c83a76b0SSuyog Pawar if(i4_interlace_field)
1240*c83a76b0SSuyog Pawar (*loop_count) = (*loop_count) + 2;
1241*c83a76b0SSuyog Pawar else
1242*c83a76b0SSuyog Pawar (*loop_count) = (*loop_count) + 1;
1243*c83a76b0SSuyog Pawar
1244*c83a76b0SSuyog Pawar /* Inorder Insertion for the right-child node */
1245*c83a76b0SSuyog Pawar ihevce_capture_order_traversal_nodes(
1246*c83a76b0SSuyog Pawar (ihevce_encode_node_t *)encode_node_t->pv_right_node,
1247*c83a76b0SSuyog Pawar api4_capture_order_array,
1248*c83a76b0SSuyog Pawar capture_order_poc_array,
1249*c83a76b0SSuyog Pawar loop_count,
1250*c83a76b0SSuyog Pawar i4_interlace_field);
1251*c83a76b0SSuyog Pawar }
1252*c83a76b0SSuyog Pawar
1253*c83a76b0SSuyog Pawar /*!
1254*c83a76b0SSuyog Pawar ************************************************************************
1255*c83a76b0SSuyog Pawar * \brief
1256*c83a76b0SSuyog Pawar * I/P pic population
1257*c83a76b0SSuyog Pawar ************************************************************************
1258*c83a76b0SSuyog Pawar */
ihevce_ip_pic_population(ihevce_encode_node_t * ps_encode_node,lap_struct_t * ps_lap_struct,WORD32 i4_first_gop)1259*c83a76b0SSuyog Pawar void ihevce_ip_pic_population(
1260*c83a76b0SSuyog Pawar ihevce_encode_node_t *ps_encode_node, lap_struct_t *ps_lap_struct, WORD32 i4_first_gop)
1261*c83a76b0SSuyog Pawar {
1262*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_lap_inp = NULL;
1263*c83a76b0SSuyog Pawar WORD32 hier_layer = ps_lap_struct->s_lap_static_params.i4_max_temporal_layers;
1264*c83a76b0SSuyog Pawar WORD32 sub_gop_size = ps_lap_struct->i4_dyn_sub_gop_size;
1265*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t **api4_capture_order_array = ps_lap_struct->api4_capture_order_array;
1266*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t **api4_encode_order_array = ps_lap_struct->api4_encode_order_array;
1267*c83a76b0SSuyog Pawar WORD32 *ai4_capture_order_poc = ps_lap_struct->pi4_capture_poc_ptr;
1268*c83a76b0SSuyog Pawar
1269*c83a76b0SSuyog Pawar /* Populate the encode order POC dependent on IDR frames and Interlace Field*/
1270*c83a76b0SSuyog Pawar if(1 == ps_lap_struct->i4_idr_flag)
1271*c83a76b0SSuyog Pawar {
1272*c83a76b0SSuyog Pawar if(i4_first_gop)
1273*c83a76b0SSuyog Pawar {
1274*c83a76b0SSuyog Pawar api4_encode_order_array[0] = api4_capture_order_array[0];
1275*c83a76b0SSuyog Pawar
1276*c83a76b0SSuyog Pawar if(api4_encode_order_array[0] != NULL)
1277*c83a76b0SSuyog Pawar {
1278*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr[0] = ai4_capture_order_poc[0];
1279*c83a76b0SSuyog Pawar ref_pic_population(api4_encode_order_array[0], ps_lap_struct);
1280*c83a76b0SSuyog Pawar
1281*c83a76b0SSuyog Pawar ps_lap_inp = api4_encode_order_array[0];
1282*c83a76b0SSuyog Pawar ihevce_rc_populate_common_params(&ps_lap_inp->s_lap_out, &ps_lap_inp->s_rc_lap_out);
1283*c83a76b0SSuyog Pawar
1284*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr++;
1285*c83a76b0SSuyog Pawar }
1286*c83a76b0SSuyog Pawar
1287*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_immediate_idr_case != 1)
1288*c83a76b0SSuyog Pawar {
1289*c83a76b0SSuyog Pawar api4_encode_order_array[1] = api4_capture_order_array[sub_gop_size];
1290*c83a76b0SSuyog Pawar
1291*c83a76b0SSuyog Pawar if(api4_encode_order_array[1] != NULL)
1292*c83a76b0SSuyog Pawar {
1293*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr[0] = ai4_capture_order_poc[sub_gop_size];
1294*c83a76b0SSuyog Pawar ref_pic_population(api4_encode_order_array[1], ps_lap_struct);
1295*c83a76b0SSuyog Pawar
1296*c83a76b0SSuyog Pawar ps_lap_inp = api4_encode_order_array[1];
1297*c83a76b0SSuyog Pawar ihevce_rc_populate_common_params(
1298*c83a76b0SSuyog Pawar &ps_lap_inp->s_lap_out, &ps_lap_inp->s_rc_lap_out);
1299*c83a76b0SSuyog Pawar
1300*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr++;
1301*c83a76b0SSuyog Pawar }
1302*c83a76b0SSuyog Pawar }
1303*c83a76b0SSuyog Pawar }
1304*c83a76b0SSuyog Pawar else
1305*c83a76b0SSuyog Pawar {
1306*c83a76b0SSuyog Pawar api4_encode_order_array[0] = api4_capture_order_array[sub_gop_size - 1];
1307*c83a76b0SSuyog Pawar
1308*c83a76b0SSuyog Pawar if(api4_encode_order_array[0] != NULL)
1309*c83a76b0SSuyog Pawar {
1310*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr[0] = ai4_capture_order_poc[sub_gop_size - 1];
1311*c83a76b0SSuyog Pawar ref_pic_population(api4_encode_order_array[0], ps_lap_struct);
1312*c83a76b0SSuyog Pawar
1313*c83a76b0SSuyog Pawar ps_lap_inp = api4_encode_order_array[0];
1314*c83a76b0SSuyog Pawar ihevce_rc_populate_common_params(&ps_lap_inp->s_lap_out, &ps_lap_inp->s_rc_lap_out);
1315*c83a76b0SSuyog Pawar
1316*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr++;
1317*c83a76b0SSuyog Pawar }
1318*c83a76b0SSuyog Pawar }
1319*c83a76b0SSuyog Pawar }
1320*c83a76b0SSuyog Pawar else
1321*c83a76b0SSuyog Pawar {
1322*c83a76b0SSuyog Pawar api4_encode_order_array[0] = api4_capture_order_array[sub_gop_size - 1];
1323*c83a76b0SSuyog Pawar
1324*c83a76b0SSuyog Pawar if(api4_encode_order_array[0] != NULL)
1325*c83a76b0SSuyog Pawar {
1326*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr[0] = ai4_capture_order_poc[sub_gop_size - 1];
1327*c83a76b0SSuyog Pawar ref_pic_population(api4_encode_order_array[0], ps_lap_struct);
1328*c83a76b0SSuyog Pawar
1329*c83a76b0SSuyog Pawar ps_lap_inp = api4_encode_order_array[0];
1330*c83a76b0SSuyog Pawar ihevce_rc_populate_common_params(&ps_lap_inp->s_lap_out, &ps_lap_inp->s_rc_lap_out);
1331*c83a76b0SSuyog Pawar
1332*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr++;
1333*c83a76b0SSuyog Pawar }
1334*c83a76b0SSuyog Pawar }
1335*c83a76b0SSuyog Pawar return;
1336*c83a76b0SSuyog Pawar }
1337*c83a76b0SSuyog Pawar
1338*c83a76b0SSuyog Pawar /*!
1339*c83a76b0SSuyog Pawar ************************************************************************
1340*c83a76b0SSuyog Pawar * \brief
1341*c83a76b0SSuyog Pawar * B pic population
1342*c83a76b0SSuyog Pawar ************************************************************************
1343*c83a76b0SSuyog Pawar */
ihevce_b_pic_population(ihevce_encode_node_t * ps_encode_node,lap_struct_t * ps_lap_struct)1344*c83a76b0SSuyog Pawar void ihevce_b_pic_population(ihevce_encode_node_t *ps_encode_node, lap_struct_t *ps_lap_struct)
1345*c83a76b0SSuyog Pawar {
1346*c83a76b0SSuyog Pawar WORD32 interlace_field = ps_lap_struct->s_lap_static_params.i4_src_interlace_field;
1347*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t **api4_encode_order_array = ps_lap_struct->api4_encode_order_array;
1348*c83a76b0SSuyog Pawar WORD32 *capture_order_poc_array = ps_lap_struct->pi4_capture_poc_ptr;
1349*c83a76b0SSuyog Pawar WORD32 loop_count = 0;
1350*c83a76b0SSuyog Pawar
1351*c83a76b0SSuyog Pawar /* encoder_order offset changed dependent on IDR and Interlace Field */
1352*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_idr_flag)
1353*c83a76b0SSuyog Pawar loop_count = 1 + interlace_field;
1354*c83a76b0SSuyog Pawar
1355*c83a76b0SSuyog Pawar /* Inorder Insertion of POC in tree, for capture order */
1356*c83a76b0SSuyog Pawar ihevce_capture_order_traversal_nodes(
1357*c83a76b0SSuyog Pawar ps_encode_node,
1358*c83a76b0SSuyog Pawar &ps_lap_struct->api4_capture_order_array[0],
1359*c83a76b0SSuyog Pawar capture_order_poc_array,
1360*c83a76b0SSuyog Pawar &loop_count,
1361*c83a76b0SSuyog Pawar interlace_field);
1362*c83a76b0SSuyog Pawar
1363*c83a76b0SSuyog Pawar /* encoder_order offset changed dependent on IDR and Interlace Field */
1364*c83a76b0SSuyog Pawar /* If the gop_size is multiple of CRA period , decrement loop count */
1365*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_idr_flag)
1366*c83a76b0SSuyog Pawar loop_count = 2 + (interlace_field * 2);
1367*c83a76b0SSuyog Pawar else
1368*c83a76b0SSuyog Pawar loop_count = 1 + interlace_field;
1369*c83a76b0SSuyog Pawar
1370*c83a76b0SSuyog Pawar /* Pre-order traversal of the tree to get encode-order POCs*/
1371*c83a76b0SSuyog Pawar ihevce_encode_order_traversal_nodes(
1372*c83a76b0SSuyog Pawar ps_encode_node, api4_encode_order_array, &loop_count, 1, ps_lap_struct);
1373*c83a76b0SSuyog Pawar
1374*c83a76b0SSuyog Pawar return;
1375*c83a76b0SSuyog Pawar }
1376*c83a76b0SSuyog Pawar
1377*c83a76b0SSuyog Pawar /*!
1378*c83a76b0SSuyog Pawar ************************************************************************
1379*c83a76b0SSuyog Pawar * \brief
1380*c83a76b0SSuyog Pawar * rc_update_model_control_by_lap_for_modified_sub_gop
1381*c83a76b0SSuyog Pawar ************************************************************************
1382*c83a76b0SSuyog Pawar */
rc_update_model_control_by_lap_for_modified_sub_gop(lap_struct_t * ps_lap_struct,ihevce_lap_enc_buf_t * ps_lap_out_buf)1383*c83a76b0SSuyog Pawar void rc_update_model_control_by_lap_for_modified_sub_gop(
1384*c83a76b0SSuyog Pawar lap_struct_t *ps_lap_struct, ihevce_lap_enc_buf_t *ps_lap_out_buf)
1385*c83a76b0SSuyog Pawar {
1386*c83a76b0SSuyog Pawar ihevce_lap_output_params_t *ps_lap_out = &ps_lap_out_buf->s_lap_out;
1387*c83a76b0SSuyog Pawar
1388*c83a76b0SSuyog Pawar /* model update flag for rc*/
1389*c83a76b0SSuyog Pawar if(ps_lap_out->i4_pic_type == IV_P_FRAME)
1390*c83a76b0SSuyog Pawar {
1391*c83a76b0SSuyog Pawar WORD32 i4_loop = 0;
1392*c83a76b0SSuyog Pawar WORD32 i4_min_delta_poc = 0x7FFFFFFF;
1393*c83a76b0SSuyog Pawar
1394*c83a76b0SSuyog Pawar for(i4_loop = 0; i4_loop < ps_lap_out->i4_num_ref_pics; i4_loop++)
1395*c83a76b0SSuyog Pawar {
1396*c83a76b0SSuyog Pawar if(i4_min_delta_poc > ABS(ps_lap_out->as_ref_pics[i4_loop].i4_ref_pic_delta_poc))
1397*c83a76b0SSuyog Pawar {
1398*c83a76b0SSuyog Pawar i4_min_delta_poc = ABS(ps_lap_out->as_ref_pics[i4_loop].i4_ref_pic_delta_poc);
1399*c83a76b0SSuyog Pawar }
1400*c83a76b0SSuyog Pawar }
1401*c83a76b0SSuyog Pawar }
1402*c83a76b0SSuyog Pawar
1403*c83a76b0SSuyog Pawar if(ps_lap_out->i4_pic_type == IV_B_FRAME)
1404*c83a76b0SSuyog Pawar {
1405*c83a76b0SSuyog Pawar WORD32 i4_loop = 0;
1406*c83a76b0SSuyog Pawar WORD32 i4_min_delta_poc = 0x7FFFFFFF;
1407*c83a76b0SSuyog Pawar WORD32 i4_min_delta_poc_for_b =
1408*c83a76b0SSuyog Pawar (1 << ps_lap_struct->s_lap_static_params.i4_max_temporal_layers) /
1409*c83a76b0SSuyog Pawar (ps_lap_out->i4_temporal_lyr_id + 1);
1410*c83a76b0SSuyog Pawar
1411*c83a76b0SSuyog Pawar for(i4_loop = 0; i4_loop < ps_lap_out->i4_num_ref_pics; i4_loop++)
1412*c83a76b0SSuyog Pawar {
1413*c83a76b0SSuyog Pawar if(i4_min_delta_poc > ABS(ps_lap_out->as_ref_pics[i4_loop].i4_ref_pic_delta_poc))
1414*c83a76b0SSuyog Pawar {
1415*c83a76b0SSuyog Pawar i4_min_delta_poc = ABS(ps_lap_out->as_ref_pics[i4_loop].i4_ref_pic_delta_poc);
1416*c83a76b0SSuyog Pawar }
1417*c83a76b0SSuyog Pawar }
1418*c83a76b0SSuyog Pawar }
1419*c83a76b0SSuyog Pawar return;
1420*c83a76b0SSuyog Pawar }
1421*c83a76b0SSuyog Pawar
1422*c83a76b0SSuyog Pawar /*!
1423*c83a76b0SSuyog Pawar ************************************************************************
1424*c83a76b0SSuyog Pawar * \brief
1425*c83a76b0SSuyog Pawar * Update num of pic type for rc
1426*c83a76b0SSuyog Pawar ************************************************************************
1427*c83a76b0SSuyog Pawar */
update_rc_num_pic_type(lap_struct_t * ps_lap_struct,ihevce_lap_enc_buf_t * ps_lap_out_buf)1428*c83a76b0SSuyog Pawar void update_rc_num_pic_type(lap_struct_t *ps_lap_struct, ihevce_lap_enc_buf_t *ps_lap_out_buf)
1429*c83a76b0SSuyog Pawar {
1430*c83a76b0SSuyog Pawar WORD32 i4_field_flag = ps_lap_struct->s_lap_static_params.i4_src_interlace_field;
1431*c83a76b0SSuyog Pawar rc_lap_out_params_t *ps_rc_lap_out = &ps_lap_out_buf->s_rc_lap_out;
1432*c83a76b0SSuyog Pawar
1433*c83a76b0SSuyog Pawar ps_lap_struct->i4_lap2_counter++;
1434*c83a76b0SSuyog Pawar
1435*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_pic_type == IV_I_FRAME ||
1436*c83a76b0SSuyog Pawar ps_lap_out_buf->s_lap_out.i4_pic_type == IV_IDR_FRAME)
1437*c83a76b0SSuyog Pawar {
1438*c83a76b0SSuyog Pawar ps_lap_struct->ai4_pic_type_to_be_removed[ps_lap_struct->i4_enq_idx] = I_PIC;
1439*c83a76b0SSuyog Pawar GET_IDX_CIRCULAR_BUF(ps_lap_struct->i4_enq_idx, 1, NUM_LAP2_LOOK_AHEAD);
1440*c83a76b0SSuyog Pawar }
1441*c83a76b0SSuyog Pawar else if(ps_lap_out_buf->s_lap_out.i4_pic_type == IV_P_FRAME)
1442*c83a76b0SSuyog Pawar {
1443*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_first_field)
1444*c83a76b0SSuyog Pawar {
1445*c83a76b0SSuyog Pawar ps_lap_struct->ai4_pic_type_to_be_removed[ps_lap_struct->i4_enq_idx] = P_PIC;
1446*c83a76b0SSuyog Pawar }
1447*c83a76b0SSuyog Pawar else
1448*c83a76b0SSuyog Pawar {
1449*c83a76b0SSuyog Pawar ps_lap_struct->ai4_pic_type_to_be_removed[ps_lap_struct->i4_enq_idx] = P1_PIC;
1450*c83a76b0SSuyog Pawar }
1451*c83a76b0SSuyog Pawar GET_IDX_CIRCULAR_BUF(ps_lap_struct->i4_enq_idx, 1, NUM_LAP2_LOOK_AHEAD);
1452*c83a76b0SSuyog Pawar }
1453*c83a76b0SSuyog Pawar else if(ps_lap_out_buf->s_lap_out.i4_pic_type == IV_B_FRAME)
1454*c83a76b0SSuyog Pawar {
1455*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_temporal_lyr_id == 1)
1456*c83a76b0SSuyog Pawar {
1457*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_first_field)
1458*c83a76b0SSuyog Pawar {
1459*c83a76b0SSuyog Pawar ps_lap_struct->ai4_pic_type_to_be_removed[ps_lap_struct->i4_enq_idx] = B_PIC;
1460*c83a76b0SSuyog Pawar }
1461*c83a76b0SSuyog Pawar else
1462*c83a76b0SSuyog Pawar {
1463*c83a76b0SSuyog Pawar ps_lap_struct->ai4_pic_type_to_be_removed[ps_lap_struct->i4_enq_idx] = BB_PIC;
1464*c83a76b0SSuyog Pawar }
1465*c83a76b0SSuyog Pawar GET_IDX_CIRCULAR_BUF(ps_lap_struct->i4_enq_idx, 1, NUM_LAP2_LOOK_AHEAD);
1466*c83a76b0SSuyog Pawar }
1467*c83a76b0SSuyog Pawar else if(ps_lap_out_buf->s_lap_out.i4_temporal_lyr_id == 2)
1468*c83a76b0SSuyog Pawar {
1469*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_first_field)
1470*c83a76b0SSuyog Pawar {
1471*c83a76b0SSuyog Pawar ps_lap_struct->ai4_pic_type_to_be_removed[ps_lap_struct->i4_enq_idx] = B1_PIC;
1472*c83a76b0SSuyog Pawar }
1473*c83a76b0SSuyog Pawar else
1474*c83a76b0SSuyog Pawar {
1475*c83a76b0SSuyog Pawar ps_lap_struct->ai4_pic_type_to_be_removed[ps_lap_struct->i4_enq_idx] = B11_PIC;
1476*c83a76b0SSuyog Pawar }
1477*c83a76b0SSuyog Pawar GET_IDX_CIRCULAR_BUF(ps_lap_struct->i4_enq_idx, 1, NUM_LAP2_LOOK_AHEAD);
1478*c83a76b0SSuyog Pawar }
1479*c83a76b0SSuyog Pawar else if(ps_lap_out_buf->s_lap_out.i4_temporal_lyr_id == 3)
1480*c83a76b0SSuyog Pawar {
1481*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_first_field)
1482*c83a76b0SSuyog Pawar {
1483*c83a76b0SSuyog Pawar ps_lap_struct->ai4_pic_type_to_be_removed[ps_lap_struct->i4_enq_idx] = B2_PIC;
1484*c83a76b0SSuyog Pawar }
1485*c83a76b0SSuyog Pawar else
1486*c83a76b0SSuyog Pawar {
1487*c83a76b0SSuyog Pawar ps_lap_struct->ai4_pic_type_to_be_removed[ps_lap_struct->i4_enq_idx] = B22_PIC;
1488*c83a76b0SSuyog Pawar }
1489*c83a76b0SSuyog Pawar GET_IDX_CIRCULAR_BUF(ps_lap_struct->i4_enq_idx, 1, NUM_LAP2_LOOK_AHEAD);
1490*c83a76b0SSuyog Pawar }
1491*c83a76b0SSuyog Pawar else
1492*c83a76b0SSuyog Pawar {
1493*c83a76b0SSuyog Pawar ASSERT(0);
1494*c83a76b0SSuyog Pawar }
1495*c83a76b0SSuyog Pawar }
1496*c83a76b0SSuyog Pawar else
1497*c83a76b0SSuyog Pawar {
1498*c83a76b0SSuyog Pawar ASSERT(0);
1499*c83a76b0SSuyog Pawar }
1500*c83a76b0SSuyog Pawar
1501*c83a76b0SSuyog Pawar if(!ps_lap_struct->i4_rc_lap_period)
1502*c83a76b0SSuyog Pawar {
1503*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_rc_lap_period < ps_lap_struct->i4_gop_period)
1504*c83a76b0SSuyog Pawar {
1505*c83a76b0SSuyog Pawar WORD32 i4_loop;
1506*c83a76b0SSuyog Pawar WORD32 idx = 0;
1507*c83a76b0SSuyog Pawar WORD32 i4_max_temporal_layer =
1508*c83a76b0SSuyog Pawar ps_lap_struct->s_lap_static_params.i4_max_temporal_layers;
1509*c83a76b0SSuyog Pawar
1510*c83a76b0SSuyog Pawar for(i4_loop = 0;
1511*c83a76b0SSuyog Pawar i4_loop < (ps_lap_struct->i4_gop_period - ps_lap_struct->i4_rc_lap_period);
1512*c83a76b0SSuyog Pawar i4_loop++)
1513*c83a76b0SSuyog Pawar {
1514*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_next_sc_i_in_rc_look_ahead++;
1515*c83a76b0SSuyog Pawar
1516*c83a76b0SSuyog Pawar if(i4_max_temporal_layer == 0)
1517*c83a76b0SSuyog Pawar {
1518*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_is_all_i_pic_in_seq)
1519*c83a76b0SSuyog Pawar {
1520*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type[I_PIC]++;
1521*c83a76b0SSuyog Pawar }
1522*c83a76b0SSuyog Pawar else
1523*c83a76b0SSuyog Pawar {
1524*c83a76b0SSuyog Pawar /*second field*/
1525*c83a76b0SSuyog Pawar if((i4_loop & 1) && i4_field_flag)
1526*c83a76b0SSuyog Pawar {
1527*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type[P1_PIC]++;
1528*c83a76b0SSuyog Pawar }
1529*c83a76b0SSuyog Pawar else
1530*c83a76b0SSuyog Pawar {
1531*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type[P_PIC]++;
1532*c83a76b0SSuyog Pawar }
1533*c83a76b0SSuyog Pawar }
1534*c83a76b0SSuyog Pawar }
1535*c83a76b0SSuyog Pawar else
1536*c83a76b0SSuyog Pawar {
1537*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type
1538*c83a76b0SSuyog Pawar [gau1_order_insert_pic_type[i4_max_temporal_layer - 1][idx]]++;
1539*c83a76b0SSuyog Pawar
1540*c83a76b0SSuyog Pawar GET_IDX_CIRCULAR_BUF(idx, 1, (8 << i4_field_flag));
1541*c83a76b0SSuyog Pawar }
1542*c83a76b0SSuyog Pawar }
1543*c83a76b0SSuyog Pawar }
1544*c83a76b0SSuyog Pawar }
1545*c83a76b0SSuyog Pawar else
1546*c83a76b0SSuyog Pawar {
1547*c83a76b0SSuyog Pawar ASSERT(ps_lap_struct->i4_lap2_counter <= ps_lap_struct->i4_rc_lap_period);
1548*c83a76b0SSuyog Pawar
1549*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_lap2_counter == ps_lap_struct->i4_rc_lap_period)
1550*c83a76b0SSuyog Pawar {
1551*c83a76b0SSuyog Pawar WORD32 i4_loop, i4_period, i4_next_i_pic = 0;
1552*c83a76b0SSuyog Pawar WORD32 i4_stop_count = 0;
1553*c83a76b0SSuyog Pawar WORD32 i4_temp_deq = ps_lap_struct->i4_deq_idx;
1554*c83a76b0SSuyog Pawar WORD32 i4_first_pic_type = ps_lap_struct->ai4_pic_type_to_be_removed[i4_temp_deq];
1555*c83a76b0SSuyog Pawar
1556*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_rc_lap_period >= ps_lap_struct->i4_gop_period)
1557*c83a76b0SSuyog Pawar {
1558*c83a76b0SSuyog Pawar i4_period = ps_lap_struct->i4_gop_period;
1559*c83a76b0SSuyog Pawar }
1560*c83a76b0SSuyog Pawar else
1561*c83a76b0SSuyog Pawar {
1562*c83a76b0SSuyog Pawar i4_period = ps_lap_struct->i4_rc_lap_period;
1563*c83a76b0SSuyog Pawar }
1564*c83a76b0SSuyog Pawar
1565*c83a76b0SSuyog Pawar for(i4_loop = 0; i4_loop < i4_period; i4_loop++)
1566*c83a76b0SSuyog Pawar {
1567*c83a76b0SSuyog Pawar if(ps_lap_struct->ai4_pic_type_to_be_removed[i4_temp_deq] == I_PIC && i4_loop &&
1568*c83a76b0SSuyog Pawar i4_first_pic_type == I_PIC)
1569*c83a76b0SSuyog Pawar {
1570*c83a76b0SSuyog Pawar i4_stop_count = 1;
1571*c83a76b0SSuyog Pawar }
1572*c83a76b0SSuyog Pawar
1573*c83a76b0SSuyog Pawar if(!i4_stop_count)
1574*c83a76b0SSuyog Pawar {
1575*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_next_sc_i_in_rc_look_ahead++;
1576*c83a76b0SSuyog Pawar }
1577*c83a76b0SSuyog Pawar
1578*c83a76b0SSuyog Pawar ps_rc_lap_out
1579*c83a76b0SSuyog Pawar ->ai4_num_pic_type[ps_lap_struct->ai4_pic_type_to_be_removed[i4_temp_deq]]++;
1580*c83a76b0SSuyog Pawar
1581*c83a76b0SSuyog Pawar GET_IDX_CIRCULAR_BUF(i4_temp_deq, 1, NUM_LAP2_LOOK_AHEAD);
1582*c83a76b0SSuyog Pawar }
1583*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_rc_lap_period < ps_lap_struct->i4_gop_period)
1584*c83a76b0SSuyog Pawar {
1585*c83a76b0SSuyog Pawar WORD32 i4_loop;
1586*c83a76b0SSuyog Pawar WORD32 idx = 0;
1587*c83a76b0SSuyog Pawar WORD32 i4_max_temporal_layer =
1588*c83a76b0SSuyog Pawar ps_lap_struct->s_lap_static_params.i4_max_temporal_layers;
1589*c83a76b0SSuyog Pawar
1590*c83a76b0SSuyog Pawar for(i4_loop = 0;
1591*c83a76b0SSuyog Pawar i4_loop < (ps_lap_struct->i4_gop_period - ps_lap_struct->i4_rc_lap_period) &&
1592*c83a76b0SSuyog Pawar (!i4_next_i_pic);
1593*c83a76b0SSuyog Pawar i4_loop++)
1594*c83a76b0SSuyog Pawar {
1595*c83a76b0SSuyog Pawar if(!i4_stop_count)
1596*c83a76b0SSuyog Pawar {
1597*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_next_sc_i_in_rc_look_ahead++;
1598*c83a76b0SSuyog Pawar }
1599*c83a76b0SSuyog Pawar
1600*c83a76b0SSuyog Pawar if(i4_max_temporal_layer == 0)
1601*c83a76b0SSuyog Pawar {
1602*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_is_all_i_pic_in_seq)
1603*c83a76b0SSuyog Pawar {
1604*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type[I_PIC]++;
1605*c83a76b0SSuyog Pawar }
1606*c83a76b0SSuyog Pawar else
1607*c83a76b0SSuyog Pawar {
1608*c83a76b0SSuyog Pawar /*second field*/
1609*c83a76b0SSuyog Pawar if((i4_loop & 1) && i4_field_flag)
1610*c83a76b0SSuyog Pawar {
1611*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type[P1_PIC]++;
1612*c83a76b0SSuyog Pawar }
1613*c83a76b0SSuyog Pawar else
1614*c83a76b0SSuyog Pawar {
1615*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type[P_PIC]++;
1616*c83a76b0SSuyog Pawar }
1617*c83a76b0SSuyog Pawar }
1618*c83a76b0SSuyog Pawar }
1619*c83a76b0SSuyog Pawar else
1620*c83a76b0SSuyog Pawar {
1621*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type
1622*c83a76b0SSuyog Pawar [gau1_order_insert_pic_type[i4_max_temporal_layer - 1][idx]]++;
1623*c83a76b0SSuyog Pawar GET_IDX_CIRCULAR_BUF(idx, 1, (8 << i4_field_flag));
1624*c83a76b0SSuyog Pawar }
1625*c83a76b0SSuyog Pawar }
1626*c83a76b0SSuyog Pawar }
1627*c83a76b0SSuyog Pawar /*remove one pic type*/
1628*c83a76b0SSuyog Pawar GET_IDX_CIRCULAR_BUF(ps_lap_struct->i4_deq_idx, 1, NUM_LAP2_LOOK_AHEAD);
1629*c83a76b0SSuyog Pawar ps_lap_struct->i4_lap2_counter--;
1630*c83a76b0SSuyog Pawar }
1631*c83a76b0SSuyog Pawar }
1632*c83a76b0SSuyog Pawar
1633*c83a76b0SSuyog Pawar {
1634*c83a76b0SSuyog Pawar WORD32 i4_loop;
1635*c83a76b0SSuyog Pawar WORD32 idx = 0;
1636*c83a76b0SSuyog Pawar WORD32 i4_max_temporal_layer = ps_lap_struct->s_lap_static_params.i4_max_temporal_layers;
1637*c83a76b0SSuyog Pawar WORD32 i4_num_pictype = 0;
1638*c83a76b0SSuyog Pawar
1639*c83a76b0SSuyog Pawar for(i4_loop = 0; i4_loop < MAX_PIC_TYPE; i4_loop++)
1640*c83a76b0SSuyog Pawar {
1641*c83a76b0SSuyog Pawar i4_num_pictype += ps_rc_lap_out->ai4_num_pic_type[i4_loop];
1642*c83a76b0SSuyog Pawar }
1643*c83a76b0SSuyog Pawar
1644*c83a76b0SSuyog Pawar if(!i4_num_pictype)
1645*c83a76b0SSuyog Pawar {
1646*c83a76b0SSuyog Pawar ps_rc_lap_out->i4_next_sc_i_in_rc_look_ahead = ps_lap_struct->i4_gop_period;
1647*c83a76b0SSuyog Pawar
1648*c83a76b0SSuyog Pawar for(i4_loop = 0; i4_loop < (ps_lap_struct->i4_gop_period); i4_loop++)
1649*c83a76b0SSuyog Pawar {
1650*c83a76b0SSuyog Pawar if(i4_max_temporal_layer == 0)
1651*c83a76b0SSuyog Pawar {
1652*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_is_all_i_pic_in_seq)
1653*c83a76b0SSuyog Pawar {
1654*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type[I_PIC]++;
1655*c83a76b0SSuyog Pawar }
1656*c83a76b0SSuyog Pawar else
1657*c83a76b0SSuyog Pawar {
1658*c83a76b0SSuyog Pawar /*second field*/
1659*c83a76b0SSuyog Pawar if((i4_loop & 1) && i4_field_flag)
1660*c83a76b0SSuyog Pawar {
1661*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type[P1_PIC]++;
1662*c83a76b0SSuyog Pawar }
1663*c83a76b0SSuyog Pawar else
1664*c83a76b0SSuyog Pawar {
1665*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type[P_PIC]++;
1666*c83a76b0SSuyog Pawar }
1667*c83a76b0SSuyog Pawar }
1668*c83a76b0SSuyog Pawar }
1669*c83a76b0SSuyog Pawar else
1670*c83a76b0SSuyog Pawar {
1671*c83a76b0SSuyog Pawar ps_rc_lap_out->ai4_num_pic_type
1672*c83a76b0SSuyog Pawar [gau1_order_insert_pic_type[i4_max_temporal_layer - 1][idx]]++;
1673*c83a76b0SSuyog Pawar
1674*c83a76b0SSuyog Pawar GET_IDX_CIRCULAR_BUF(idx, 1, (8 << i4_field_flag));
1675*c83a76b0SSuyog Pawar }
1676*c83a76b0SSuyog Pawar }
1677*c83a76b0SSuyog Pawar }
1678*c83a76b0SSuyog Pawar }
1679*c83a76b0SSuyog Pawar /*FOR RC : ensure at least 1 I pic in the gop period at any case*/
1680*c83a76b0SSuyog Pawar if(!ps_rc_lap_out->ai4_num_pic_type[I_PIC])
1681*c83a76b0SSuyog Pawar {
1682*c83a76b0SSuyog Pawar ASSERT(ps_rc_lap_out->ai4_num_pic_type[P_PIC]);
1683*c83a76b0SSuyog Pawar ps_lap_out_buf->s_rc_lap_out.ai4_num_pic_type[P_PIC]--;
1684*c83a76b0SSuyog Pawar ps_lap_out_buf->s_rc_lap_out.ai4_num_pic_type[I_PIC]++;
1685*c83a76b0SSuyog Pawar }
1686*c83a76b0SSuyog Pawar return;
1687*c83a76b0SSuyog Pawar }
1688*c83a76b0SSuyog Pawar
1689*c83a76b0SSuyog Pawar /*!
1690*c83a76b0SSuyog Pawar ************************************************************************
1691*c83a76b0SSuyog Pawar * \brief
1692*c83a76b0SSuyog Pawar * pre rel lap output update
1693*c83a76b0SSuyog Pawar ************************************************************************
1694*c83a76b0SSuyog Pawar */
ihevce_pre_rel_lapout_update(lap_struct_t * ps_lap_struct,ihevce_lap_enc_buf_t * ps_lap_out_buf)1695*c83a76b0SSuyog Pawar void ihevce_pre_rel_lapout_update(lap_struct_t *ps_lap_struct, ihevce_lap_enc_buf_t *ps_lap_out_buf)
1696*c83a76b0SSuyog Pawar {
1697*c83a76b0SSuyog Pawar WORD32 i4_first_field = 1;
1698*c83a76b0SSuyog Pawar WORD32 i4_field = ps_lap_struct->s_lap_static_params.i4_src_interlace_field;
1699*c83a76b0SSuyog Pawar
1700*c83a76b0SSuyog Pawar if(i4_field)
1701*c83a76b0SSuyog Pawar {
1702*c83a76b0SSuyog Pawar i4_first_field = ps_lap_out_buf->s_lap_out.i4_first_field;
1703*c83a76b0SSuyog Pawar }
1704*c83a76b0SSuyog Pawar
1705*c83a76b0SSuyog Pawar ps_lap_out_buf->s_lap_out.i4_used = 0;
1706*c83a76b0SSuyog Pawar
1707*c83a76b0SSuyog Pawar rc_update_model_control_by_lap_for_modified_sub_gop(ps_lap_struct, ps_lap_out_buf);
1708*c83a76b0SSuyog Pawar update_rc_num_pic_type(ps_lap_struct, ps_lap_out_buf);
1709*c83a76b0SSuyog Pawar
1710*c83a76b0SSuyog Pawar /* curr buf next is null, prev buf next is curr and prev buff equal to curr*/
1711*c83a76b0SSuyog Pawar
1712*c83a76b0SSuyog Pawar ps_lap_out_buf->s_rc_lap_out.ps_rc_lap_out_next_encode = NULL;
1713*c83a76b0SSuyog Pawar if(ps_lap_struct->pv_prev_inp_buf != NULL &&
1714*c83a76b0SSuyog Pawar ps_lap_struct->s_lap_static_params.s_lap_params.i4_rc_look_ahead_pics)
1715*c83a76b0SSuyog Pawar {
1716*c83a76b0SSuyog Pawar ((ihevce_lap_enc_buf_t *)ps_lap_struct->pv_prev_inp_buf)
1717*c83a76b0SSuyog Pawar ->s_rc_lap_out.ps_rc_lap_out_next_encode = (void *)&ps_lap_out_buf->s_rc_lap_out;
1718*c83a76b0SSuyog Pawar }
1719*c83a76b0SSuyog Pawar
1720*c83a76b0SSuyog Pawar ps_lap_struct->pv_prev_inp_buf = (void *)ps_lap_out_buf;
1721*c83a76b0SSuyog Pawar ps_lap_out_buf->s_lap_out.i4_is_prev_pic_in_Tid0_same_scene = 1;
1722*c83a76b0SSuyog Pawar
1723*c83a76b0SSuyog Pawar /*with force idr below check is not valid*/
1724*c83a76b0SSuyog Pawar #if(!FORCE_IDR_TEST)
1725*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_max_idr_period == ps_lap_struct->i4_min_idr_period)
1726*c83a76b0SSuyog Pawar {
1727*c83a76b0SSuyog Pawar if(!ps_lap_out_buf->s_lap_out.i4_poc)
1728*c83a76b0SSuyog Pawar {
1729*c83a76b0SSuyog Pawar ASSERT(ps_lap_struct->i4_max_prev_poc == (ps_lap_struct->i4_max_idr_period - 1));
1730*c83a76b0SSuyog Pawar ps_lap_struct->i4_max_prev_poc = 0;
1731*c83a76b0SSuyog Pawar }
1732*c83a76b0SSuyog Pawar }
1733*c83a76b0SSuyog Pawar #endif
1734*c83a76b0SSuyog Pawar
1735*c83a76b0SSuyog Pawar /*assert if num of reference frame is zero in case of P or B frame*/
1736*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_pic_type == IV_P_FRAME ||
1737*c83a76b0SSuyog Pawar ps_lap_out_buf->s_lap_out.i4_pic_type == IV_B_FRAME)
1738*c83a76b0SSuyog Pawar {
1739*c83a76b0SSuyog Pawar ASSERT(ps_lap_out_buf->s_lap_out.i4_num_ref_pics != 0);
1740*c83a76b0SSuyog Pawar }
1741*c83a76b0SSuyog Pawar
1742*c83a76b0SSuyog Pawar /*assert if poc = 0 and pictype is not an idr*/
1743*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_pic_type != IV_IDR_FRAME &&
1744*c83a76b0SSuyog Pawar ps_lap_out_buf->s_lap_out.i4_poc == 0)
1745*c83a76b0SSuyog Pawar {
1746*c83a76b0SSuyog Pawar ASSERT(0);
1747*c83a76b0SSuyog Pawar }
1748*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_pic_type == IV_IDR_FRAME &&
1749*c83a76b0SSuyog Pawar ps_lap_out_buf->s_lap_out.i4_poc != 0)
1750*c83a76b0SSuyog Pawar {
1751*c83a76b0SSuyog Pawar ASSERT(0);
1752*c83a76b0SSuyog Pawar }
1753*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_poc < 0)
1754*c83a76b0SSuyog Pawar {
1755*c83a76b0SSuyog Pawar ASSERT(0);
1756*c83a76b0SSuyog Pawar }
1757*c83a76b0SSuyog Pawar
1758*c83a76b0SSuyog Pawar #if(!FORCE_IDR_TEST)
1759*c83a76b0SSuyog Pawar if((!ps_lap_struct->i4_max_idr_period) && ps_lap_out_buf->s_lap_out.i4_display_num != 0)
1760*c83a76b0SSuyog Pawar {
1761*c83a76b0SSuyog Pawar ASSERT(ps_lap_out_buf->s_lap_out.i4_pic_type != IV_IDR_FRAME);
1762*c83a76b0SSuyog Pawar }
1763*c83a76b0SSuyog Pawar #endif
1764*c83a76b0SSuyog Pawar if(!ps_lap_struct->i4_max_cra_period)
1765*c83a76b0SSuyog Pawar {
1766*c83a76b0SSuyog Pawar ASSERT(ps_lap_out_buf->s_lap_out.i4_is_cra_pic != 1);
1767*c83a76b0SSuyog Pawar }
1768*c83a76b0SSuyog Pawar
1769*c83a76b0SSuyog Pawar if(ps_lap_out_buf->s_lap_out.i4_force_idr_flag)
1770*c83a76b0SSuyog Pawar {
1771*c83a76b0SSuyog Pawar ASSERT(ps_lap_out_buf->s_lap_out.i4_pic_type == IV_IDR_FRAME);
1772*c83a76b0SSuyog Pawar }
1773*c83a76b0SSuyog Pawar ps_lap_out_buf->s_lap_out.i4_curr_frm_qp = -1;
1774*c83a76b0SSuyog Pawar }
1775*c83a76b0SSuyog Pawar
1776*c83a76b0SSuyog Pawar /*!
1777*c83a76b0SSuyog Pawar ************************************************************************
1778*c83a76b0SSuyog Pawar * \brief
1779*c83a76b0SSuyog Pawar * lap queue input
1780*c83a76b0SSuyog Pawar ************************************************************************
1781*c83a76b0SSuyog Pawar */
ihevce_lap_queue_input(lap_struct_t * ps_lap_struct,ihevce_lap_enc_buf_t * ps_input_lap_enc_buf,WORD32 * pi4_tree_num)1782*c83a76b0SSuyog Pawar void ihevce_lap_queue_input(
1783*c83a76b0SSuyog Pawar lap_struct_t *ps_lap_struct, ihevce_lap_enc_buf_t *ps_input_lap_enc_buf, WORD32 *pi4_tree_num)
1784*c83a76b0SSuyog Pawar {
1785*c83a76b0SSuyog Pawar ihevce_encode_node_t *ps_encode_node =
1786*c83a76b0SSuyog Pawar (ihevce_encode_node_t *)ps_lap_struct->aps_encode_node[*pi4_tree_num];
1787*c83a76b0SSuyog Pawar
1788*c83a76b0SSuyog Pawar WORD32 i4_capture_idx = ps_lap_struct->i4_capture_idx;
1789*c83a76b0SSuyog Pawar
1790*c83a76b0SSuyog Pawar /* Static Lap parameters */
1791*c83a76b0SSuyog Pawar ihevce_lap_static_params_t *ps_lap_static_params =
1792*c83a76b0SSuyog Pawar (ihevce_lap_static_params_t *)&ps_lap_struct->s_lap_static_params;
1793*c83a76b0SSuyog Pawar
1794*c83a76b0SSuyog Pawar WORD32 hier_layer = ps_lap_static_params->i4_max_temporal_layers;
1795*c83a76b0SSuyog Pawar WORD32 sub_gop_size = ps_lap_struct->i4_dyn_sub_gop_size;
1796*c83a76b0SSuyog Pawar
1797*c83a76b0SSuyog Pawar /* queue the current input in capture array */
1798*c83a76b0SSuyog Pawar {
1799*c83a76b0SSuyog Pawar WORD32 first_gop_flag;
1800*c83a76b0SSuyog Pawar
1801*c83a76b0SSuyog Pawar if(!i4_capture_idx)
1802*c83a76b0SSuyog Pawar {
1803*c83a76b0SSuyog Pawar memset(
1804*c83a76b0SSuyog Pawar &ps_lap_struct->api4_capture_order_array[0],
1805*c83a76b0SSuyog Pawar 0,
1806*c83a76b0SSuyog Pawar sizeof(ihevce_lap_enc_buf_t *) * MAX_NUM_ENC_NODES);
1807*c83a76b0SSuyog Pawar }
1808*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[i4_capture_idx] = ps_input_lap_enc_buf;
1809*c83a76b0SSuyog Pawar
1810*c83a76b0SSuyog Pawar if(ps_input_lap_enc_buf != NULL)
1811*c83a76b0SSuyog Pawar {
1812*c83a76b0SSuyog Pawar if(ps_input_lap_enc_buf->s_lap_out.i4_end_flag == 1)
1813*c83a76b0SSuyog Pawar ps_lap_struct->i4_end_flag_pic_idx = i4_capture_idx;
1814*c83a76b0SSuyog Pawar ps_lap_struct->ai4_capture_order_poc[i4_capture_idx] = ps_lap_struct->i4_curr_poc++;
1815*c83a76b0SSuyog Pawar }
1816*c83a76b0SSuyog Pawar
1817*c83a76b0SSuyog Pawar if((1 == ps_lap_struct->i4_num_dummy_pic) && (ps_lap_struct->i4_sub_gop_end == 0))
1818*c83a76b0SSuyog Pawar {
1819*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_end = i4_capture_idx - 1;
1820*c83a76b0SSuyog Pawar }
1821*c83a76b0SSuyog Pawar i4_capture_idx++;
1822*c83a76b0SSuyog Pawar
1823*c83a76b0SSuyog Pawar /* to take care of buffering 1 extra picture at start or at IDR interval*/
1824*c83a76b0SSuyog Pawar if(!ps_lap_struct->i4_is_all_i_pic_in_seq)
1825*c83a76b0SSuyog Pawar {
1826*c83a76b0SSuyog Pawar if(ps_lap_static_params->i4_src_interlace_field && sub_gop_size <= 2)
1827*c83a76b0SSuyog Pawar {
1828*c83a76b0SSuyog Pawar first_gop_flag = 0;
1829*c83a76b0SSuyog Pawar }
1830*c83a76b0SSuyog Pawar else
1831*c83a76b0SSuyog Pawar {
1832*c83a76b0SSuyog Pawar first_gop_flag = ps_lap_struct->i4_idr_flag
1833*c83a76b0SSuyog Pawar << ps_lap_static_params->i4_src_interlace_field;
1834*c83a76b0SSuyog Pawar }
1835*c83a76b0SSuyog Pawar }
1836*c83a76b0SSuyog Pawar else
1837*c83a76b0SSuyog Pawar {
1838*c83a76b0SSuyog Pawar first_gop_flag = ps_lap_struct->i4_idr_flag;
1839*c83a76b0SSuyog Pawar }
1840*c83a76b0SSuyog Pawar
1841*c83a76b0SSuyog Pawar /* For every IDR period, set idr_flag and reset POC value and gop_size to 0*/
1842*c83a76b0SSuyog Pawar if(ps_input_lap_enc_buf != NULL)
1843*c83a76b0SSuyog Pawar {
1844*c83a76b0SSuyog Pawar if((!first_gop_flag) && (ps_input_lap_enc_buf->s_lap_out.i4_pic_type == IV_IDR_FRAME))
1845*c83a76b0SSuyog Pawar {
1846*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr = &ps_lap_struct->ai4_encode_order_poc[0];
1847*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_flag = 1;
1848*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_poc = 0;
1849*c83a76b0SSuyog Pawar ps_lap_struct->ai4_capture_order_poc[i4_capture_idx - 1] =
1850*c83a76b0SSuyog Pawar ps_lap_struct->i4_curr_poc++;
1851*c83a76b0SSuyog Pawar }
1852*c83a76b0SSuyog Pawar }
1853*c83a76b0SSuyog Pawar
1854*c83a76b0SSuyog Pawar if(first_gop_flag &&
1855*c83a76b0SSuyog Pawar (ps_lap_struct->i4_is_all_i_pic_in_seq || ps_lap_struct->i4_immediate_idr_case))
1856*c83a76b0SSuyog Pawar {
1857*c83a76b0SSuyog Pawar sub_gop_size = 0;
1858*c83a76b0SSuyog Pawar }
1859*c83a76b0SSuyog Pawar
1860*c83a76b0SSuyog Pawar if(!first_gop_flag && ps_lap_struct->i4_immediate_idr_case &&
1861*c83a76b0SSuyog Pawar (i4_capture_idx != (sub_gop_size + first_gop_flag)))
1862*c83a76b0SSuyog Pawar {
1863*c83a76b0SSuyog Pawar sub_gop_size = 1 << ps_lap_static_params->i4_src_interlace_field;
1864*c83a76b0SSuyog Pawar ps_lap_struct->i4_dyn_sub_gop_size = 1 << ps_lap_static_params->i4_src_interlace_field;
1865*c83a76b0SSuyog Pawar }
1866*c83a76b0SSuyog Pawar
1867*c83a76b0SSuyog Pawar /* reset the queue idx end of every gop */
1868*c83a76b0SSuyog Pawar if(i4_capture_idx == (sub_gop_size + first_gop_flag))
1869*c83a76b0SSuyog Pawar {
1870*c83a76b0SSuyog Pawar ps_lap_struct->pi4_encode_poc_ptr = &ps_lap_struct->ai4_encode_order_poc[0];
1871*c83a76b0SSuyog Pawar
1872*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_end_flag_pic_idx && (1 != sub_gop_size))
1873*c83a76b0SSuyog Pawar {
1874*c83a76b0SSuyog Pawar WORD32 i4_temp_poc = 0;
1875*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_temp_lap_enc_buf = NULL;
1876*c83a76b0SSuyog Pawar
1877*c83a76b0SSuyog Pawar /*swap the lap enc buf and poc*/
1878*c83a76b0SSuyog Pawar ps_temp_lap_enc_buf =
1879*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[ps_lap_struct->i4_end_flag_pic_idx - 1];
1880*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[ps_lap_struct->i4_end_flag_pic_idx - 1] =
1881*c83a76b0SSuyog Pawar NULL;
1882*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[i4_capture_idx - 2] =
1883*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[ps_lap_struct->i4_end_flag_pic_idx];
1884*c83a76b0SSuyog Pawar
1885*c83a76b0SSuyog Pawar if((i4_capture_idx - 2) != ps_lap_struct->i4_end_flag_pic_idx)
1886*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[ps_lap_struct->i4_end_flag_pic_idx] =
1887*c83a76b0SSuyog Pawar NULL;
1888*c83a76b0SSuyog Pawar
1889*c83a76b0SSuyog Pawar ps_temp_lap_enc_buf->s_lap_out.i4_pic_type = IV_P_FRAME;
1890*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[i4_capture_idx - 1] = ps_temp_lap_enc_buf;
1891*c83a76b0SSuyog Pawar
1892*c83a76b0SSuyog Pawar i4_temp_poc =
1893*c83a76b0SSuyog Pawar ps_lap_struct->ai4_capture_order_poc[ps_lap_struct->i4_end_flag_pic_idx - 1];
1894*c83a76b0SSuyog Pawar ps_lap_struct->ai4_capture_order_poc[i4_capture_idx - 2] =
1895*c83a76b0SSuyog Pawar ps_lap_struct->ai4_capture_order_poc[ps_lap_struct->i4_end_flag_pic_idx];
1896*c83a76b0SSuyog Pawar
1897*c83a76b0SSuyog Pawar ps_lap_struct->ai4_capture_order_poc[i4_capture_idx - 1] = i4_temp_poc;
1898*c83a76b0SSuyog Pawar }
1899*c83a76b0SSuyog Pawar
1900*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_num_dummy_pic)
1901*c83a76b0SSuyog Pawar {
1902*c83a76b0SSuyog Pawar WORD32 pic_idx;
1903*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_temp_lap_enc_buf = NULL;
1904*c83a76b0SSuyog Pawar static const WORD32 subgop_temporal_layer3[8] = { 7, 3, 1, 0, 2, 5, 4, 6 };
1905*c83a76b0SSuyog Pawar static const WORD32 subgop_temporal_layer2[4] = { 3, 1, 0, 2 };
1906*c83a76b0SSuyog Pawar const WORD32 *subgop_pic_idx = (ps_lap_static_params->i4_max_temporal_layers == 2)
1907*c83a76b0SSuyog Pawar ? &subgop_temporal_layer2[0]
1908*c83a76b0SSuyog Pawar : &subgop_temporal_layer3[0];
1909*c83a76b0SSuyog Pawar WORD32 max_pic_count = ps_lap_struct->i4_sub_gop_end + 1;
1910*c83a76b0SSuyog Pawar
1911*c83a76b0SSuyog Pawar for(pic_idx = 0; pic_idx < max_pic_count; pic_idx++)
1912*c83a76b0SSuyog Pawar {
1913*c83a76b0SSuyog Pawar WORD32 i4_temp_idx = ps_lap_static_params->i4_max_temporal_layers > 1
1914*c83a76b0SSuyog Pawar ? subgop_pic_idx[pic_idx]
1915*c83a76b0SSuyog Pawar : 1;
1916*c83a76b0SSuyog Pawar
1917*c83a76b0SSuyog Pawar if(NULL == ps_lap_struct->api4_capture_order_array[i4_temp_idx])
1918*c83a76b0SSuyog Pawar {
1919*c83a76b0SSuyog Pawar ps_temp_lap_enc_buf =
1920*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[ps_lap_struct->i4_sub_gop_end];
1921*c83a76b0SSuyog Pawar if(pic_idx == 0)
1922*c83a76b0SSuyog Pawar {
1923*c83a76b0SSuyog Pawar ps_temp_lap_enc_buf->s_lap_out.i4_pic_type = IV_P_FRAME;
1924*c83a76b0SSuyog Pawar }
1925*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[i4_temp_idx] = ps_temp_lap_enc_buf;
1926*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[ps_lap_struct->i4_sub_gop_end] =
1927*c83a76b0SSuyog Pawar NULL;
1928*c83a76b0SSuyog Pawar
1929*c83a76b0SSuyog Pawar ps_lap_struct->ai4_capture_order_poc[i4_temp_idx] =
1930*c83a76b0SSuyog Pawar ps_lap_struct->ai4_capture_order_poc[ps_lap_struct->i4_sub_gop_end];
1931*c83a76b0SSuyog Pawar ps_lap_struct->ai4_capture_order_poc[ps_lap_struct->i4_sub_gop_end] = 0;
1932*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_end--;
1933*c83a76b0SSuyog Pawar }
1934*c83a76b0SSuyog Pawar }
1935*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_end = 0;
1936*c83a76b0SSuyog Pawar }
1937*c83a76b0SSuyog Pawar i4_capture_idx = 0;
1938*c83a76b0SSuyog Pawar
1939*c83a76b0SSuyog Pawar /* add the number of pics in sub gop to the gop counter */
1940*c83a76b0SSuyog Pawar /* Get reordered Buffer for encoder, wait till all sub-gop buffers are output */
1941*c83a76b0SSuyog Pawar
1942*c83a76b0SSuyog Pawar /* Popluate I/P pictures */
1943*c83a76b0SSuyog Pawar ihevce_ip_pic_population(ps_encode_node, ps_lap_struct, first_gop_flag);
1944*c83a76b0SSuyog Pawar
1945*c83a76b0SSuyog Pawar /* For hierarchical layers, Populate B picture */
1946*c83a76b0SSuyog Pawar if((hier_layer > 0) &&
1947*c83a76b0SSuyog Pawar sub_gop_size > (1 << ps_lap_static_params->i4_src_interlace_field))
1948*c83a76b0SSuyog Pawar {
1949*c83a76b0SSuyog Pawar ihevce_b_pic_population(ps_encode_node, ps_lap_struct);
1950*c83a76b0SSuyog Pawar }
1951*c83a76b0SSuyog Pawar
1952*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_bufs_encode_order = sub_gop_size + first_gop_flag;
1953*c83a76b0SSuyog Pawar
1954*c83a76b0SSuyog Pawar /* correction of encode order in case of multiple non reference B*/
1955*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_dyn_sub_gop_size > ps_lap_struct->i4_sub_gop_size)
1956*c83a76b0SSuyog Pawar {
1957*c83a76b0SSuyog Pawar WORD32 i4_loop;
1958*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_lap_enc_buf, *ps_lap_enc_buf_tmp[MAX_NUM_ENC_NODES];
1959*c83a76b0SSuyog Pawar WORD32 i4_enc_cnt, i4_cap_cnt;
1960*c83a76b0SSuyog Pawar
1961*c83a76b0SSuyog Pawar i4_cap_cnt = first_gop_flag;
1962*c83a76b0SSuyog Pawar i4_enc_cnt = 0;
1963*c83a76b0SSuyog Pawar
1964*c83a76b0SSuyog Pawar for(i4_loop = 0; i4_loop < ps_lap_struct->i4_num_bufs_encode_order; i4_loop++)
1965*c83a76b0SSuyog Pawar {
1966*c83a76b0SSuyog Pawar ps_lap_enc_buf = ps_lap_struct->api4_encode_order_array[i4_loop];
1967*c83a76b0SSuyog Pawar
1968*c83a76b0SSuyog Pawar if(ps_lap_enc_buf != NULL && !ps_lap_enc_buf->s_lap_out.i4_is_ref_pic &&
1969*c83a76b0SSuyog Pawar (ps_lap_enc_buf->s_lap_out.i4_temporal_lyr_id ==
1970*c83a76b0SSuyog Pawar ps_lap_struct->s_lap_static_params.i4_max_temporal_layers))
1971*c83a76b0SSuyog Pawar {
1972*c83a76b0SSuyog Pawar if(ps_lap_enc_buf != ps_lap_struct->api4_capture_order_array[i4_cap_cnt])
1973*c83a76b0SSuyog Pawar {
1974*c83a76b0SSuyog Pawar ps_lap_enc_buf_tmp[i4_enc_cnt] =
1975*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[i4_cap_cnt];
1976*c83a76b0SSuyog Pawar i4_enc_cnt++;
1977*c83a76b0SSuyog Pawar i4_loop++;
1978*c83a76b0SSuyog Pawar }
1979*c83a76b0SSuyog Pawar i4_cap_cnt += 2;
1980*c83a76b0SSuyog Pawar ps_lap_enc_buf_tmp[i4_enc_cnt] = ps_lap_enc_buf;
1981*c83a76b0SSuyog Pawar i4_enc_cnt++;
1982*c83a76b0SSuyog Pawar ps_lap_enc_buf_tmp[i4_enc_cnt] =
1983*c83a76b0SSuyog Pawar ps_lap_struct->api4_capture_order_array[i4_cap_cnt];
1984*c83a76b0SSuyog Pawar i4_enc_cnt++;
1985*c83a76b0SSuyog Pawar i4_cap_cnt += 2;
1986*c83a76b0SSuyog Pawar i4_loop++;
1987*c83a76b0SSuyog Pawar }
1988*c83a76b0SSuyog Pawar else
1989*c83a76b0SSuyog Pawar {
1990*c83a76b0SSuyog Pawar ps_lap_enc_buf_tmp[i4_enc_cnt] = ps_lap_enc_buf;
1991*c83a76b0SSuyog Pawar i4_enc_cnt++;
1992*c83a76b0SSuyog Pawar }
1993*c83a76b0SSuyog Pawar }
1994*c83a76b0SSuyog Pawar for(i4_loop = 0; i4_loop < ps_lap_struct->i4_num_bufs_encode_order; i4_loop++)
1995*c83a76b0SSuyog Pawar {
1996*c83a76b0SSuyog Pawar ps_lap_struct->api4_encode_order_array[i4_loop] = ps_lap_enc_buf_tmp[i4_loop];
1997*c83a76b0SSuyog Pawar }
1998*c83a76b0SSuyog Pawar }
1999*c83a76b0SSuyog Pawar
2000*c83a76b0SSuyog Pawar /* reset the IDR flag */
2001*c83a76b0SSuyog Pawar ps_lap_struct->i4_idr_flag = 0;
2002*c83a76b0SSuyog Pawar ps_lap_struct->i4_dyn_sub_gop_size = ps_lap_struct->i4_sub_gop_size;
2003*c83a76b0SSuyog Pawar
2004*c83a76b0SSuyog Pawar /*Copy encode array to lap output buf*/
2005*c83a76b0SSuyog Pawar memcpy(
2006*c83a76b0SSuyog Pawar &ps_lap_struct->api4_lap_out_buf[ps_lap_struct->i4_lap_encode_idx],
2007*c83a76b0SSuyog Pawar &ps_lap_struct->api4_encode_order_array[0],
2008*c83a76b0SSuyog Pawar sizeof(ihevce_lap_enc_buf_t *) * ps_lap_struct->i4_num_bufs_encode_order);
2009*c83a76b0SSuyog Pawar
2010*c83a76b0SSuyog Pawar memset(
2011*c83a76b0SSuyog Pawar &ps_lap_struct->api4_encode_order_array[0],
2012*c83a76b0SSuyog Pawar 0,
2013*c83a76b0SSuyog Pawar sizeof(ihevce_lap_enc_buf_t *) * ps_lap_struct->i4_num_bufs_encode_order);
2014*c83a76b0SSuyog Pawar
2015*c83a76b0SSuyog Pawar ps_lap_struct->ai4_num_buffer[ps_lap_struct->i4_lap_encode_idx] =
2016*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_bufs_encode_order - ps_lap_struct->i4_num_dummy_pic;
2017*c83a76b0SSuyog Pawar
2018*c83a76b0SSuyog Pawar ps_lap_struct->i4_lap_encode_idx++;
2019*c83a76b0SSuyog Pawar ps_lap_struct->i4_lap_encode_idx &= (MAX_SUBGOP_IN_ENCODE_QUEUE - 1);
2020*c83a76b0SSuyog Pawar }
2021*c83a76b0SSuyog Pawar
2022*c83a76b0SSuyog Pawar /* store the capture index */
2023*c83a76b0SSuyog Pawar ps_lap_struct->i4_capture_idx = i4_capture_idx;
2024*c83a76b0SSuyog Pawar ps_lap_struct->i4_immediate_idr_case = 0;
2025*c83a76b0SSuyog Pawar }
2026*c83a76b0SSuyog Pawar return;
2027*c83a76b0SSuyog Pawar }
2028*c83a76b0SSuyog Pawar
2029*c83a76b0SSuyog Pawar /*!
2030*c83a76b0SSuyog Pawar ************************************************************************
2031*c83a76b0SSuyog Pawar * \brief
2032*c83a76b0SSuyog Pawar * lap process
2033*c83a76b0SSuyog Pawar ************************************************************************
2034*c83a76b0SSuyog Pawar */
ihevce_lap_process(void * pv_interface_ctxt,ihevce_lap_enc_buf_t * ps_curr_inp)2035*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ihevce_lap_process(void *pv_interface_ctxt, ihevce_lap_enc_buf_t *ps_curr_inp)
2036*c83a76b0SSuyog Pawar {
2037*c83a76b0SSuyog Pawar lap_intface_t *ps_lap_interface = (lap_intface_t *)pv_interface_ctxt;
2038*c83a76b0SSuyog Pawar lap_struct_t *ps_lap_struct = (lap_struct_t *)ps_lap_interface->pv_lap_module_ctxt;
2039*c83a76b0SSuyog Pawar ihevce_hle_ctxt_t *ps_hle_ctxt = (ihevce_hle_ctxt_t *)ps_lap_interface->pv_hle_ctxt;
2040*c83a76b0SSuyog Pawar ihevce_lap_enc_buf_t *ps_lap_inp_buf = ps_curr_inp;
2041*c83a76b0SSuyog Pawar ihevce_tgt_params_t *ps_tgt_params =
2042*c83a76b0SSuyog Pawar &ps_lap_struct->s_static_cfg_params.s_tgt_lyr_prms.as_tgt_params[0];
2043*c83a76b0SSuyog Pawar WORD32 i4_field_flag = ps_lap_struct->s_lap_static_params.i4_src_interlace_field;
2044*c83a76b0SSuyog Pawar WORD32 i4_flush_check = 0;
2045*c83a76b0SSuyog Pawar WORD32 i4_force_idr_check = 0;
2046*c83a76b0SSuyog Pawar WORD32 i4_tree_num = 0;
2047*c83a76b0SSuyog Pawar iv_input_ctrl_buffs_t *ps_ctrl_buf = NULL;
2048*c83a76b0SSuyog Pawar WORD32 buf_id = 0;
2049*c83a76b0SSuyog Pawar WORD32 i4_lap_window_size = 1 << ps_lap_struct->s_lap_static_params.i4_max_temporal_layers;
2050*c83a76b0SSuyog Pawar
2051*c83a76b0SSuyog Pawar ps_lap_interface->i4_ctrl_in_que_blocking_mode = BUFF_QUE_NON_BLOCKING_MODE;
2052*c83a76b0SSuyog Pawar
2053*c83a76b0SSuyog Pawar /* ----------- LAP processing ----------- */
2054*c83a76b0SSuyog Pawar if(ps_lap_struct->end_flag != 1)
2055*c83a76b0SSuyog Pawar {
2056*c83a76b0SSuyog Pawar ASSERT(NULL != ps_curr_inp);
2057*c83a76b0SSuyog Pawar
2058*c83a76b0SSuyog Pawar /* ---------- get the filled control command buffer ------------ */
2059*c83a76b0SSuyog Pawar ps_ctrl_buf = (iv_input_ctrl_buffs_t *)ihevce_q_get_filled_buff(
2060*c83a76b0SSuyog Pawar ps_hle_ctxt->apv_enc_hdl[0],
2061*c83a76b0SSuyog Pawar ps_lap_interface->i4_ctrl_in_que_id,
2062*c83a76b0SSuyog Pawar &buf_id,
2063*c83a76b0SSuyog Pawar ps_lap_interface->i4_ctrl_in_que_blocking_mode);
2064*c83a76b0SSuyog Pawar
2065*c83a76b0SSuyog Pawar /* ----------- check the command ---------------------- */
2066*c83a76b0SSuyog Pawar if(NULL != ps_ctrl_buf)
2067*c83a76b0SSuyog Pawar {
2068*c83a76b0SSuyog Pawar /* check for async errors */
2069*c83a76b0SSuyog Pawar ihevce_dyn_config_prms_t as_dyn_br[MAX_NUM_DYN_BITRATE_CMDS];
2070*c83a76b0SSuyog Pawar WORD32 i4_num_set_bitrate_cmds = 0;
2071*c83a76b0SSuyog Pawar WORD32 bitrt_ctr = 0;
2072*c83a76b0SSuyog Pawar
2073*c83a76b0SSuyog Pawar ihevce_lap_parse_async_cmd(
2074*c83a76b0SSuyog Pawar ps_hle_ctxt,
2075*c83a76b0SSuyog Pawar (WORD32 *)ps_ctrl_buf->pv_asynch_ctrl_bufs,
2076*c83a76b0SSuyog Pawar ps_ctrl_buf->i4_cmd_buf_size,
2077*c83a76b0SSuyog Pawar ps_ctrl_buf->i4_buf_id,
2078*c83a76b0SSuyog Pawar &i4_num_set_bitrate_cmds,
2079*c83a76b0SSuyog Pawar &as_dyn_br[0]);
2080*c83a76b0SSuyog Pawar
2081*c83a76b0SSuyog Pawar /* Call the call back function to register the new bitrate */
2082*c83a76b0SSuyog Pawar for(bitrt_ctr = 0; bitrt_ctr < i4_num_set_bitrate_cmds; bitrt_ctr++)
2083*c83a76b0SSuyog Pawar {
2084*c83a76b0SSuyog Pawar ps_lap_interface->ihevce_dyn_bitrate_cb(
2085*c83a76b0SSuyog Pawar (void *)ps_hle_ctxt, (void *)&as_dyn_br[bitrt_ctr]);
2086*c83a76b0SSuyog Pawar }
2087*c83a76b0SSuyog Pawar
2088*c83a76b0SSuyog Pawar /* release async ctrl buffer*/
2089*c83a76b0SSuyog Pawar ihevce_q_rel_buf(
2090*c83a76b0SSuyog Pawar ps_hle_ctxt->apv_enc_hdl[0], IHEVCE_INPUT_ASYNCH_CTRL_Q, ps_ctrl_buf->i4_buf_id);
2091*c83a76b0SSuyog Pawar }
2092*c83a76b0SSuyog Pawar
2093*c83a76b0SSuyog Pawar {
2094*c83a76b0SSuyog Pawar WORD32 *pi4_cmd_buf = (WORD32 *)ps_lap_inp_buf->s_input_buf.pv_synch_ctrl_bufs;
2095*c83a76b0SSuyog Pawar
2096*c83a76b0SSuyog Pawar /* check for sync cmd buffer error */
2097*c83a76b0SSuyog Pawar /* check FLUSH comand and Force IDR in the complete buffer */
2098*c83a76b0SSuyog Pawar i4_flush_check = 0;
2099*c83a76b0SSuyog Pawar i4_force_idr_check = 0;
2100*c83a76b0SSuyog Pawar ihevce_lap_parse_sync_cmd(
2101*c83a76b0SSuyog Pawar ps_hle_ctxt,
2102*c83a76b0SSuyog Pawar &ps_lap_struct->s_static_cfg_params,
2103*c83a76b0SSuyog Pawar pi4_cmd_buf,
2104*c83a76b0SSuyog Pawar ps_lap_inp_buf,
2105*c83a76b0SSuyog Pawar &i4_flush_check,
2106*c83a76b0SSuyog Pawar &i4_force_idr_check);
2107*c83a76b0SSuyog Pawar
2108*c83a76b0SSuyog Pawar if(i4_flush_check)
2109*c83a76b0SSuyog Pawar ps_lap_struct->end_flag = 1;
2110*c83a76b0SSuyog Pawar
2111*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_out_flush_flag = 0;
2112*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_end_flag = ps_lap_struct->end_flag;
2113*c83a76b0SSuyog Pawar
2114*c83a76b0SSuyog Pawar /* check if input buffer is a valid buffer */
2115*c83a76b0SSuyog Pawar if(1 == ps_lap_inp_buf->s_input_buf.i4_inp_frm_data_valid_flag)
2116*c83a76b0SSuyog Pawar {
2117*c83a76b0SSuyog Pawar /* Initialise laps input buffer descriptors */
2118*c83a76b0SSuyog Pawar memset(&ps_lap_inp_buf->s_lap_out, 0, sizeof(ihevce_lap_output_params_t));
2119*c83a76b0SSuyog Pawar memset(&ps_lap_inp_buf->s_rc_lap_out, 0, sizeof(rc_lap_out_params_t));
2120*c83a76b0SSuyog Pawar /* Default initialization of lapout parameters */
2121*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_scene_type = SCENE_TYPE_NORMAL;
2122*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.u4_scene_num = 0;
2123*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_display_num = ps_lap_struct->i4_display_num;
2124*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_quality_preset = ps_tgt_params->i4_quality_preset;
2125*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i1_weighted_pred_flag = 0;
2126*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i1_weighted_bipred_flag = 0;
2127*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_log2_luma_wght_denom = DENOM_DEFAULT;
2128*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_log2_chroma_wght_denom = DENOM_DEFAULT;
2129*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.as_ref_pics[0].i4_num_duplicate_entries_in_ref_list = 1;
2130*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.as_ref_pics[0].i4_used_by_cur_pic_flag = 1;
2131*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.as_ref_pics[0].as_wght_off[0].u1_luma_weight_enable_flag =
2132*c83a76b0SSuyog Pawar 0;
2133*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.as_ref_pics[0]
2134*c83a76b0SSuyog Pawar .as_wght_off[0]
2135*c83a76b0SSuyog Pawar .u1_chroma_weight_enable_flag = 0;
2136*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_first_field = 1;
2137*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_force_idr_flag = 0;
2138*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_curr_frm_qp = ps_tgt_params->ai4_frame_qp[0];
2139*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_used = 1;
2140*c83a76b0SSuyog Pawar if(i4_force_idr_check)
2141*c83a76b0SSuyog Pawar {
2142*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_force_idr_flag = 1;
2143*c83a76b0SSuyog Pawar }
2144*c83a76b0SSuyog Pawar /* Populate input params in lap out struct */
2145*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_input_buf.pv_y_buf =
2146*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_input_buf.s_input_buf.pv_y_buf;
2147*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_input_buf.pv_u_buf =
2148*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_input_buf.s_input_buf.pv_u_buf;
2149*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_input_buf.pv_v_buf =
2150*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_input_buf.s_input_buf.pv_v_buf;
2151*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_input_buf.i4_y_wd =
2152*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_input_buf.s_input_buf.i4_y_wd;
2153*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_input_buf.i4_y_ht =
2154*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_input_buf.s_input_buf.i4_y_ht;
2155*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_input_buf.i4_y_strd =
2156*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_input_buf.s_input_buf.i4_y_strd;
2157*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_input_buf.i4_uv_wd =
2158*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_input_buf.s_input_buf.i4_uv_wd;
2159*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_input_buf.i4_uv_ht =
2160*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_input_buf.s_input_buf.i4_uv_ht;
2161*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_input_buf.i4_uv_strd =
2162*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_input_buf.s_input_buf.i4_uv_strd;
2163*c83a76b0SSuyog Pawar
2164*c83a76b0SSuyog Pawar ps_lap_struct->i4_display_num++;
2165*c83a76b0SSuyog Pawar ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_enq_idx] = ps_lap_inp_buf;
2166*c83a76b0SSuyog Pawar /* update first field flag */
2167*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_first_field = 1;
2168*c83a76b0SSuyog Pawar if(i4_field_flag)
2169*c83a76b0SSuyog Pawar {
2170*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_first_field =
2171*c83a76b0SSuyog Pawar (ps_lap_inp_buf->s_input_buf.i4_topfield_first ^
2172*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_input_buf.i4_bottom_field);
2173*c83a76b0SSuyog Pawar }
2174*c83a76b0SSuyog Pawar
2175*c83a76b0SSuyog Pawar /* force idr in case interlace input can be taken only for first field */
2176*c83a76b0SSuyog Pawar if(!ps_lap_inp_buf->s_lap_out.i4_first_field)
2177*c83a76b0SSuyog Pawar {
2178*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.i4_force_idr_flag = 0;
2179*c83a76b0SSuyog Pawar }
2180*c83a76b0SSuyog Pawar
2181*c83a76b0SSuyog Pawar if((i4_lap_window_size > 1) &&
2182*c83a76b0SSuyog Pawar (ps_lap_struct->ai1_pic_type[ps_lap_struct->i4_next_start_ctr] != PIC_TYPE_IDR))
2183*c83a76b0SSuyog Pawar {
2184*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_pic_idx++;
2185*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_sub_gop_pic_idx > i4_lap_window_size)
2186*c83a76b0SSuyog Pawar {
2187*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_pic_idx =
2188*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_pic_idx - i4_lap_window_size;
2189*c83a76b0SSuyog Pawar }
2190*c83a76b0SSuyog Pawar }
2191*c83a76b0SSuyog Pawar else if(1 == i4_lap_window_size)
2192*c83a76b0SSuyog Pawar {
2193*c83a76b0SSuyog Pawar ps_lap_struct->i4_sub_gop_pic_idx = 1;
2194*c83a76b0SSuyog Pawar }
2195*c83a76b0SSuyog Pawar
2196*c83a76b0SSuyog Pawar if(i4_force_idr_check &&
2197*c83a76b0SSuyog Pawar (ps_lap_struct->ai1_pic_type[ps_lap_struct->i4_next_start_ctr] != PIC_TYPE_IDR))
2198*c83a76b0SSuyog Pawar {
2199*c83a76b0SSuyog Pawar ps_lap_struct->i4_force_idr_pos = ps_lap_struct->i4_sub_gop_pic_idx;
2200*c83a76b0SSuyog Pawar }
2201*c83a76b0SSuyog Pawar
2202*c83a76b0SSuyog Pawar /* store pictype for next subgop */
2203*c83a76b0SSuyog Pawar if((0 == ps_lap_struct->i4_num_frm_type_decided) &&
2204*c83a76b0SSuyog Pawar (ps_lap_struct->i4_force_idr_pos == 0))
2205*c83a76b0SSuyog Pawar {
2206*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[0] =
2207*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[ps_lap_struct->i4_next_start_ctr];
2208*c83a76b0SSuyog Pawar
2209*c83a76b0SSuyog Pawar ihevce_determine_next_sub_gop_state(ps_lap_struct);
2210*c83a76b0SSuyog Pawar
2211*c83a76b0SSuyog Pawar ps_lap_struct->i4_next_start_ctr = 0;
2212*c83a76b0SSuyog Pawar }
2213*c83a76b0SSuyog Pawar else if(
2214*c83a76b0SSuyog Pawar i4_force_idr_check &&
2215*c83a76b0SSuyog Pawar (ps_lap_struct->i4_force_idr_pos <= ps_lap_struct->i4_sub_gop_size))
2216*c83a76b0SSuyog Pawar {
2217*c83a76b0SSuyog Pawar /*check force idr pos is 1st pic in sub-gop then don't add dummy pics*/
2218*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_force_idr_pos != 1)
2219*c83a76b0SSuyog Pawar {
2220*c83a76b0SSuyog Pawar WORD32 sub_gop_pos = ps_lap_struct->i4_force_idr_pos;
2221*c83a76b0SSuyog Pawar while(sub_gop_pos <= ps_lap_struct->i4_sub_gop_size)
2222*c83a76b0SSuyog Pawar {
2223*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_dummy_pic++;
2224*c83a76b0SSuyog Pawar ihevce_lap_queue_input(ps_lap_struct, NULL, &i4_tree_num);
2225*c83a76b0SSuyog Pawar sub_gop_pos++;
2226*c83a76b0SSuyog Pawar }
2227*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_dummy_pic = 0;
2228*c83a76b0SSuyog Pawar }
2229*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[0] =
2230*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[ps_lap_struct->i4_next_start_ctr];
2231*c83a76b0SSuyog Pawar
2232*c83a76b0SSuyog Pawar ihevce_determine_next_sub_gop_state(ps_lap_struct);
2233*c83a76b0SSuyog Pawar
2234*c83a76b0SSuyog Pawar ps_lap_struct->i4_next_start_ctr = 0;
2235*c83a76b0SSuyog Pawar }
2236*c83a76b0SSuyog Pawar
2237*c83a76b0SSuyog Pawar if(/*ps_lap_struct->i4_init_delay_over &&*/ 0 !=
2238*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided)
2239*c83a76b0SSuyog Pawar {
2240*c83a76b0SSuyog Pawar ihevce_assign_pic_type(
2241*c83a76b0SSuyog Pawar ps_lap_struct,
2242*c83a76b0SSuyog Pawar ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_deq_idx]);
2243*c83a76b0SSuyog Pawar
2244*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided--;
2245*c83a76b0SSuyog Pawar
2246*c83a76b0SSuyog Pawar if(NULL != ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_deq_idx])
2247*c83a76b0SSuyog Pawar {
2248*c83a76b0SSuyog Pawar /*special case of two consequetive idr at the start of encode or due to force idr*/
2249*c83a76b0SSuyog Pawar ps_lap_struct->i4_immediate_idr_case =
2250*c83a76b0SSuyog Pawar ps_lap_struct->i4_is_all_i_pic_in_seq;
2251*c83a76b0SSuyog Pawar if(ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_deq_idx]
2252*c83a76b0SSuyog Pawar ->s_lap_out.i4_pic_type == IV_IDR_FRAME)
2253*c83a76b0SSuyog Pawar {
2254*c83a76b0SSuyog Pawar ps_lap_struct->i4_immediate_idr_case = 1;
2255*c83a76b0SSuyog Pawar }
2256*c83a76b0SSuyog Pawar else
2257*c83a76b0SSuyog Pawar {
2258*c83a76b0SSuyog Pawar WORD32 i4_prev_idx = ps_lap_struct->i4_buf_deq_idx > 0
2259*c83a76b0SSuyog Pawar ? ps_lap_struct->i4_buf_deq_idx - 1
2260*c83a76b0SSuyog Pawar : ps_lap_struct->i4_buf_deq_idx;
2261*c83a76b0SSuyog Pawar /*field case of single IDR field followed by P*/
2262*c83a76b0SSuyog Pawar if(NULL != ps_lap_struct->aps_lap_inp_buf[i4_prev_idx] &&
2263*c83a76b0SSuyog Pawar i4_field_flag &&
2264*c83a76b0SSuyog Pawar ps_lap_struct->aps_lap_inp_buf[i4_prev_idx]->s_lap_out.i4_pic_type ==
2265*c83a76b0SSuyog Pawar IV_IDR_FRAME &&
2266*c83a76b0SSuyog Pawar !ps_lap_struct->i4_num_frm_type_decided)
2267*c83a76b0SSuyog Pawar {
2268*c83a76b0SSuyog Pawar ps_lap_struct->i4_immediate_idr_case = 1;
2269*c83a76b0SSuyog Pawar }
2270*c83a76b0SSuyog Pawar }
2271*c83a76b0SSuyog Pawar }
2272*c83a76b0SSuyog Pawar
2273*c83a76b0SSuyog Pawar /* Queue in the current input Buffer to LAP que */
2274*c83a76b0SSuyog Pawar ihevce_lap_queue_input(
2275*c83a76b0SSuyog Pawar ps_lap_struct,
2276*c83a76b0SSuyog Pawar ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_deq_idx],
2277*c83a76b0SSuyog Pawar &i4_tree_num);
2278*c83a76b0SSuyog Pawar
2279*c83a76b0SSuyog Pawar ps_lap_struct->i4_next_start_ctr++;
2280*c83a76b0SSuyog Pawar ps_lap_struct->i4_buf_deq_idx++;
2281*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_buf_deq_idx >= MAX_QUEUE_LENGTH)
2282*c83a76b0SSuyog Pawar ps_lap_struct->i4_buf_deq_idx = 0;
2283*c83a76b0SSuyog Pawar }
2284*c83a76b0SSuyog Pawar
2285*c83a76b0SSuyog Pawar ps_lap_struct->i4_buf_enq_idx++;
2286*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_buf_enq_idx >= MAX_QUEUE_LENGTH)
2287*c83a76b0SSuyog Pawar ps_lap_struct->i4_buf_enq_idx = 0;
2288*c83a76b0SSuyog Pawar } /* end if for valid input buffer check*/
2289*c83a76b0SSuyog Pawar }
2290*c83a76b0SSuyog Pawar
2291*c83a76b0SSuyog Pawar /* source pixel padding if width/height is not aligned to 8 pixel */
2292*c83a76b0SSuyog Pawar if(ps_lap_inp_buf->s_input_buf.i4_inp_frm_data_valid_flag)
2293*c83a76b0SSuyog Pawar {
2294*c83a76b0SSuyog Pawar ihevce_src_params_t *ps_src_prms = &ps_lap_struct->s_static_cfg_params.s_src_prms;
2295*c83a76b0SSuyog Pawar WORD32 i4_align_wd = ps_src_prms->i4_width;
2296*c83a76b0SSuyog Pawar WORD32 i4_align_ht = ps_src_prms->i4_height;
2297*c83a76b0SSuyog Pawar WORD32 min_cu_size =
2298*c83a76b0SSuyog Pawar (1 << ps_lap_struct->s_static_cfg_params.s_config_prms.i4_min_log2_cu_size);
2299*c83a76b0SSuyog Pawar
2300*c83a76b0SSuyog Pawar i4_align_wd += SET_CTB_ALIGN(ps_src_prms->i4_width, min_cu_size);
2301*c83a76b0SSuyog Pawar i4_align_ht += SET_CTB_ALIGN(ps_src_prms->i4_height, min_cu_size);
2302*c83a76b0SSuyog Pawar
2303*c83a76b0SSuyog Pawar ihevce_lap_pad_input_bufs(ps_lap_inp_buf, i4_align_wd, i4_align_ht);
2304*c83a76b0SSuyog Pawar }
2305*c83a76b0SSuyog Pawar {
2306*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_logo_ctxt.logo_width = 0;
2307*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_logo_ctxt.logo_height = 0;
2308*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_logo_ctxt.logo_x_offset = 0;
2309*c83a76b0SSuyog Pawar ps_lap_inp_buf->s_lap_out.s_logo_ctxt.logo_y_offset = 0;
2310*c83a76b0SSuyog Pawar }
2311*c83a76b0SSuyog Pawar }
2312*c83a76b0SSuyog Pawar
2313*c83a76b0SSuyog Pawar if(ps_lap_struct->end_flag == 1)
2314*c83a76b0SSuyog Pawar {
2315*c83a76b0SSuyog Pawar ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_enq_idx] = ps_lap_inp_buf;
2316*c83a76b0SSuyog Pawar
2317*c83a76b0SSuyog Pawar /*to be filed*/
2318*c83a76b0SSuyog Pawar if(0 == ps_lap_struct->i4_num_frm_type_decided)
2319*c83a76b0SSuyog Pawar {
2320*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[0] =
2321*c83a76b0SSuyog Pawar ps_lap_struct->ai1_pic_type[ps_lap_struct->i4_next_start_ctr];
2322*c83a76b0SSuyog Pawar
2323*c83a76b0SSuyog Pawar ihevce_determine_next_sub_gop_state(ps_lap_struct);
2324*c83a76b0SSuyog Pawar
2325*c83a76b0SSuyog Pawar ps_lap_struct->i4_next_start_ctr = 0;
2326*c83a76b0SSuyog Pawar }
2327*c83a76b0SSuyog Pawar
2328*c83a76b0SSuyog Pawar if(NULL != ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_deq_idx])
2329*c83a76b0SSuyog Pawar {
2330*c83a76b0SSuyog Pawar ihevce_assign_pic_type(
2331*c83a76b0SSuyog Pawar ps_lap_struct, ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_deq_idx]);
2332*c83a76b0SSuyog Pawar }
2333*c83a76b0SSuyog Pawar
2334*c83a76b0SSuyog Pawar ps_lap_struct->i4_num_frm_type_decided--;
2335*c83a76b0SSuyog Pawar
2336*c83a76b0SSuyog Pawar if(NULL != ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_deq_idx])
2337*c83a76b0SSuyog Pawar {
2338*c83a76b0SSuyog Pawar /*special case of two consequetive idr at the start of encode or due to force idr*/
2339*c83a76b0SSuyog Pawar ps_lap_struct->i4_immediate_idr_case = ps_lap_struct->i4_is_all_i_pic_in_seq;
2340*c83a76b0SSuyog Pawar
2341*c83a76b0SSuyog Pawar if(ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_deq_idx]
2342*c83a76b0SSuyog Pawar ->s_lap_out.i4_pic_type == IV_IDR_FRAME)
2343*c83a76b0SSuyog Pawar {
2344*c83a76b0SSuyog Pawar ps_lap_struct->i4_immediate_idr_case = 1;
2345*c83a76b0SSuyog Pawar }
2346*c83a76b0SSuyog Pawar else
2347*c83a76b0SSuyog Pawar {
2348*c83a76b0SSuyog Pawar WORD32 i4_prev_idx = ps_lap_struct->i4_buf_deq_idx > 0
2349*c83a76b0SSuyog Pawar ? ps_lap_struct->i4_buf_deq_idx - 1
2350*c83a76b0SSuyog Pawar : ps_lap_struct->i4_buf_deq_idx;
2351*c83a76b0SSuyog Pawar /*field case of single IDR field followed by P*/
2352*c83a76b0SSuyog Pawar if(NULL != ps_lap_struct->aps_lap_inp_buf[i4_prev_idx] && i4_field_flag &&
2353*c83a76b0SSuyog Pawar ps_lap_struct->aps_lap_inp_buf[i4_prev_idx]->s_lap_out.i4_pic_type ==
2354*c83a76b0SSuyog Pawar IV_IDR_FRAME &&
2355*c83a76b0SSuyog Pawar !ps_lap_struct->i4_num_frm_type_decided)
2356*c83a76b0SSuyog Pawar {
2357*c83a76b0SSuyog Pawar ps_lap_struct->i4_immediate_idr_case = 1;
2358*c83a76b0SSuyog Pawar }
2359*c83a76b0SSuyog Pawar }
2360*c83a76b0SSuyog Pawar }
2361*c83a76b0SSuyog Pawar /* Queue in the current input Buffer to LAP que */
2362*c83a76b0SSuyog Pawar ihevce_lap_queue_input(
2363*c83a76b0SSuyog Pawar ps_lap_struct,
2364*c83a76b0SSuyog Pawar ps_lap_struct->aps_lap_inp_buf[ps_lap_struct->i4_buf_deq_idx],
2365*c83a76b0SSuyog Pawar &i4_tree_num);
2366*c83a76b0SSuyog Pawar ps_lap_struct->i4_max_buf_in_enc_order =
2367*c83a76b0SSuyog Pawar ps_lap_struct->ai4_num_buffer[ps_lap_struct->i4_deq_lap_buf];
2368*c83a76b0SSuyog Pawar ps_lap_struct->i4_next_start_ctr++;
2369*c83a76b0SSuyog Pawar ps_lap_struct->i4_buf_deq_idx++;
2370*c83a76b0SSuyog Pawar
2371*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_buf_deq_idx >= MAX_QUEUE_LENGTH)
2372*c83a76b0SSuyog Pawar ps_lap_struct->i4_buf_deq_idx = 0;
2373*c83a76b0SSuyog Pawar
2374*c83a76b0SSuyog Pawar ps_lap_struct->i4_buf_enq_idx++;
2375*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_buf_enq_idx >= MAX_QUEUE_LENGTH)
2376*c83a76b0SSuyog Pawar ps_lap_struct->i4_buf_enq_idx = 0;
2377*c83a76b0SSuyog Pawar }
2378*c83a76b0SSuyog Pawar
2379*c83a76b0SSuyog Pawar if(1 == ps_lap_struct->i4_force_end_flag)
2380*c83a76b0SSuyog Pawar {
2381*c83a76b0SSuyog Pawar ihevce_force_end(ps_hle_ctxt);
2382*c83a76b0SSuyog Pawar }
2383*c83a76b0SSuyog Pawar
2384*c83a76b0SSuyog Pawar /*return encode order pic to pre enc*/
2385*c83a76b0SSuyog Pawar ps_lap_inp_buf = NULL;
2386*c83a76b0SSuyog Pawar
2387*c83a76b0SSuyog Pawar if(NULL !=
2388*c83a76b0SSuyog Pawar ps_lap_struct->api4_lap_out_buf[ps_lap_struct->i4_deq_lap_buf][ps_lap_struct->i4_lap_out_idx])
2389*c83a76b0SSuyog Pawar {
2390*c83a76b0SSuyog Pawar ps_lap_inp_buf =
2391*c83a76b0SSuyog Pawar ps_lap_struct
2392*c83a76b0SSuyog Pawar ->api4_lap_out_buf[ps_lap_struct->i4_deq_lap_buf][ps_lap_struct->i4_lap_out_idx];
2393*c83a76b0SSuyog Pawar ps_lap_struct
2394*c83a76b0SSuyog Pawar ->api4_lap_out_buf[ps_lap_struct->i4_deq_lap_buf][ps_lap_struct->i4_lap_out_idx] = NULL;
2395*c83a76b0SSuyog Pawar if(!ps_lap_inp_buf->s_lap_out.i4_end_flag)
2396*c83a76b0SSuyog Pawar ihevce_pre_rel_lapout_update(ps_lap_struct, ps_lap_inp_buf);
2397*c83a76b0SSuyog Pawar
2398*c83a76b0SSuyog Pawar ps_lap_struct->i4_max_buf_in_enc_order =
2399*c83a76b0SSuyog Pawar ps_lap_struct->ai4_num_buffer[ps_lap_struct->i4_deq_lap_buf];
2400*c83a76b0SSuyog Pawar }
2401*c83a76b0SSuyog Pawar
2402*c83a76b0SSuyog Pawar ps_lap_struct->i4_lap_out_idx++;
2403*c83a76b0SSuyog Pawar if(ps_lap_struct->i4_lap_out_idx == ps_lap_struct->i4_max_buf_in_enc_order)
2404*c83a76b0SSuyog Pawar {
2405*c83a76b0SSuyog Pawar if(ps_lap_struct->ai4_num_buffer[ps_lap_struct->i4_deq_lap_buf])
2406*c83a76b0SSuyog Pawar {
2407*c83a76b0SSuyog Pawar ps_lap_struct->ai4_num_buffer[ps_lap_struct->i4_deq_lap_buf] = 0;
2408*c83a76b0SSuyog Pawar ps_lap_struct->i4_deq_lap_buf++;
2409*c83a76b0SSuyog Pawar ps_lap_struct->i4_deq_lap_buf &= (MAX_SUBGOP_IN_ENCODE_QUEUE - 1);
2410*c83a76b0SSuyog Pawar }
2411*c83a76b0SSuyog Pawar
2412*c83a76b0SSuyog Pawar ps_lap_struct->i4_lap_out_idx = 0;
2413*c83a76b0SSuyog Pawar }
2414*c83a76b0SSuyog Pawar
2415*c83a76b0SSuyog Pawar return (ps_lap_inp_buf);
2416*c83a76b0SSuyog Pawar }
2417*c83a76b0SSuyog Pawar
2418*c83a76b0SSuyog Pawar /*!
2419*c83a76b0SSuyog Pawar ************************************************************************
2420*c83a76b0SSuyog Pawar * \brief
2421*c83a76b0SSuyog Pawar * lap get input buffer requirement count
2422*c83a76b0SSuyog Pawar ************************************************************************
2423*c83a76b0SSuyog Pawar */
ihevce_lap_get_num_ip_bufs(ihevce_lap_static_params_t * ps_lap_stat_prms)2424*c83a76b0SSuyog Pawar WORD32 ihevce_lap_get_num_ip_bufs(ihevce_lap_static_params_t *ps_lap_stat_prms)
2425*c83a76b0SSuyog Pawar {
2426*c83a76b0SSuyog Pawar WORD32 i4_lap_window_size = 1;
2427*c83a76b0SSuyog Pawar WORD32 gop_delay = 1 << ps_lap_stat_prms->i4_max_temporal_layers;
2428*c83a76b0SSuyog Pawar
2429*c83a76b0SSuyog Pawar if(ps_lap_stat_prms->s_lap_params.i4_rc_look_ahead_pics != 0)
2430*c83a76b0SSuyog Pawar {
2431*c83a76b0SSuyog Pawar i4_lap_window_size = 1 + ps_lap_stat_prms->s_lap_params.i4_rc_look_ahead_pics;
2432*c83a76b0SSuyog Pawar }
2433*c83a76b0SSuyog Pawar
2434*c83a76b0SSuyog Pawar gop_delay += (i4_lap_window_size);
2435*c83a76b0SSuyog Pawar return gop_delay;
2436*c83a76b0SSuyog Pawar }
2437