xref: /aosp_15_r20/external/libavc/encoder/svc/isvce_process.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker *  isvce_process.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker *  Contains functions for codec thread
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * @author
30*495ae853SAndroid Build Coastguard Worker *  Harish
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
33*495ae853SAndroid Build Coastguard Worker * - isvce_generate_sps_pps()
34*495ae853SAndroid Build Coastguard Worker * - isvce_init_entropy_ctxt()
35*495ae853SAndroid Build Coastguard Worker * - isvce_entropy()
36*495ae853SAndroid Build Coastguard Worker * - isvce_pack_header_data()
37*495ae853SAndroid Build Coastguard Worker * - isvce_update_proc_ctxt()
38*495ae853SAndroid Build Coastguard Worker * - isvce_init_proc_ctxt()
39*495ae853SAndroid Build Coastguard Worker * - isvce_pad_recon_buffer()
40*495ae853SAndroid Build Coastguard Worker * - isvce_dblk_n_mbs()
41*495ae853SAndroid Build Coastguard Worker * - isvce_process()
42*495ae853SAndroid Build Coastguard Worker * - isvce_set_rc_pic_params()
43*495ae853SAndroid Build Coastguard Worker * - isvce_update_rc_post_enc()
44*495ae853SAndroid Build Coastguard Worker * - isvce_isvce_isvce_process_ctxt_thread()
45*495ae853SAndroid Build Coastguard Worker *
46*495ae853SAndroid Build Coastguard Worker * @remarks
47*495ae853SAndroid Build Coastguard Worker *  None
48*495ae853SAndroid Build Coastguard Worker *
49*495ae853SAndroid Build Coastguard Worker *******************************************************************************
50*495ae853SAndroid Build Coastguard Worker */
51*495ae853SAndroid Build Coastguard Worker 
52*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
53*495ae853SAndroid Build Coastguard Worker #include <stddef.h>
54*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
55*495ae853SAndroid Build Coastguard Worker #include <string.h>
56*495ae853SAndroid Build Coastguard Worker #include <limits.h>
57*495ae853SAndroid Build Coastguard Worker #include <assert.h>
58*495ae853SAndroid Build Coastguard Worker #include <math.h>
59*495ae853SAndroid Build Coastguard Worker #include <stdbool.h>
60*495ae853SAndroid Build Coastguard Worker 
61*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
62*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264_buf_mgr.h */
63*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264_list.h */
64*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
65*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264_common_tables.h */
66*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
67*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
68*495ae853SAndroid Build Coastguard Worker #include "ih264_buf_mgr.h"
69*495ae853SAndroid Build Coastguard Worker #include "ih264_common_tables.h"
70*495ae853SAndroid Build Coastguard Worker #include "ih264_list.h"
71*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
72*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_data.h"
73*495ae853SAndroid Build Coastguard Worker #include "ih264_size_defs.h"
74*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264e_cabac_structs.h */
75*495ae853SAndroid Build Coastguard Worker #include "ih264_cabac_tables.h"
76*495ae853SAndroid Build Coastguard Worker /* Dependencies of ime_structs.h */
77*495ae853SAndroid Build Coastguard Worker #include "ime_defs.h"
78*495ae853SAndroid Build Coastguard Worker #include "ime_distortion_metrics.h"
79*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264e_structs.h */
80*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
81*495ae853SAndroid Build Coastguard Worker #include "ive2.h"
82*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
83*495ae853SAndroid Build Coastguard Worker #include "ih264_deblk_edge_filters.h"
84*495ae853SAndroid Build Coastguard Worker #include "ih264_inter_pred_filters.h"
85*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
86*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_quant_itrans_iquant.h"
87*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264e_bitstream.h */
88*495ae853SAndroid Build Coastguard Worker #include "ih264e_error.h"
89*495ae853SAndroid Build Coastguard Worker #include "ih264e_bitstream.h"
90*495ae853SAndroid Build Coastguard Worker #include "ih264e_cabac_structs.h"
91*495ae853SAndroid Build Coastguard Worker #include "irc_cntrl_param.h"
92*495ae853SAndroid Build Coastguard Worker #include "irc_frame_info_collector.h"
93*495ae853SAndroid Build Coastguard Worker #include "ime_statistics.h"
94*495ae853SAndroid Build Coastguard Worker #include "ime_structs.h"
95*495ae853SAndroid Build Coastguard Worker /* Dependencies of 'ih264e_utils.h' */
96*495ae853SAndroid Build Coastguard Worker #include "ih264e_defs.h"
97*495ae853SAndroid Build Coastguard Worker #include "ih264e_structs.h"
98*495ae853SAndroid Build Coastguard Worker #include "ih264e_utils.h"
99*495ae853SAndroid Build Coastguard Worker #include "ime.h"
100*495ae853SAndroid Build Coastguard Worker #include "isvce_cabac.h"
101*495ae853SAndroid Build Coastguard Worker #include "isvce_cavlc.h"
102*495ae853SAndroid Build Coastguard Worker #include "isvce_deblk.h"
103*495ae853SAndroid Build Coastguard Worker #include "isvce_defs.h"
104*495ae853SAndroid Build Coastguard Worker #include "isvce_downscaler.h"
105*495ae853SAndroid Build Coastguard Worker #include "isvce_encode_header.h"
106*495ae853SAndroid Build Coastguard Worker #include "isvce_ibl_eval.h"
107*495ae853SAndroid Build Coastguard Worker #include "isvce_ilp_mv.h"
108*495ae853SAndroid Build Coastguard Worker #include "isvce_intra_modes_eval.h"
109*495ae853SAndroid Build Coastguard Worker #include "isvce_me.h"
110*495ae853SAndroid Build Coastguard Worker #include "isvce_rate_control.h"
111*495ae853SAndroid Build Coastguard Worker #include "isvce_residual_pred.h"
112*495ae853SAndroid Build Coastguard Worker #include "isvce_sub_pic_rc.h"
113*495ae853SAndroid Build Coastguard Worker #include "isvce_utils.h"
114*495ae853SAndroid Build Coastguard Worker 
115*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
116*495ae853SAndroid Build Coastguard Worker /* Function Definitions                                                      */
117*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
118*495ae853SAndroid Build Coastguard Worker 
119*495ae853SAndroid Build Coastguard Worker /**
120*495ae853SAndroid Build Coastguard Worker ******************************************************************************
121*495ae853SAndroid Build Coastguard Worker *
122*495ae853SAndroid Build Coastguard Worker *  @brief This function generates sps, pps set on request
123*495ae853SAndroid Build Coastguard Worker *
124*495ae853SAndroid Build Coastguard Worker *  @par   Description
125*495ae853SAndroid Build Coastguard Worker *  When the encoder is set in header generation mode, the following function
126*495ae853SAndroid Build Coastguard Worker *  is called. This generates sps and pps headers and returns the control back
127*495ae853SAndroid Build Coastguard Worker *  to caller.
128*495ae853SAndroid Build Coastguard Worker *
129*495ae853SAndroid Build Coastguard Worker *  @param[in]    ps_codec
130*495ae853SAndroid Build Coastguard Worker *  pointer to codec context
131*495ae853SAndroid Build Coastguard Worker *
132*495ae853SAndroid Build Coastguard Worker *  @return      success or failure error code
133*495ae853SAndroid Build Coastguard Worker *
134*495ae853SAndroid Build Coastguard Worker ******************************************************************************
135*495ae853SAndroid Build Coastguard Worker */
isvce_generate_sps_pps(isvce_codec_t * ps_codec,isvce_inp_buf_t * ps_inp_buf)136*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_generate_sps_pps(isvce_codec_t *ps_codec, isvce_inp_buf_t *ps_inp_buf)
137*495ae853SAndroid Build Coastguard Worker {
138*495ae853SAndroid Build Coastguard Worker     sps_t *ps_sps;
139*495ae853SAndroid Build Coastguard Worker     pps_t *ps_pps;
140*495ae853SAndroid Build Coastguard Worker     subset_sps_t *ps_subset_sps;
141*495ae853SAndroid Build Coastguard Worker 
142*495ae853SAndroid Build Coastguard Worker     WORD32 i;
143*495ae853SAndroid Build Coastguard Worker 
144*495ae853SAndroid Build Coastguard Worker     isvce_process_ctxt_t *ps_proc = ps_codec->as_process;
145*495ae853SAndroid Build Coastguard Worker     isvce_entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy;
146*495ae853SAndroid Build Coastguard Worker     bitstrm_t *ps_bitstrm = ps_entropy->ps_bitstrm;
147*495ae853SAndroid Build Coastguard Worker     isvce_out_buf_t *ps_out_buf = ps_codec->as_out_buf;
148*495ae853SAndroid Build Coastguard Worker 
149*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_profile_idc = IH264_PROFILE_BASELINE;
150*495ae853SAndroid Build Coastguard Worker 
151*495ae853SAndroid Build Coastguard Worker     ASSERT(1 == MAX_CTXT_SETS);
152*495ae853SAndroid Build Coastguard Worker 
153*495ae853SAndroid Build Coastguard Worker     ih264e_bitstrm_init(ps_bitstrm, ps_out_buf->as_bits_buf[ps_proc->u1_spatial_layer_id].pv_buf,
154*495ae853SAndroid Build Coastguard Worker                         ps_out_buf->as_bits_buf[ps_proc->u1_spatial_layer_id].u4_bufsize);
155*495ae853SAndroid Build Coastguard Worker 
156*495ae853SAndroid Build Coastguard Worker     ps_sps = ps_codec->ps_sps_base;
157*495ae853SAndroid Build Coastguard Worker     isvce_populate_sps(ps_codec, ps_sps, 0, u1_profile_idc, ps_inp_buf, 0);
158*495ae853SAndroid Build Coastguard Worker 
159*495ae853SAndroid Build Coastguard Worker     ps_pps = ps_codec->ps_pps_base;
160*495ae853SAndroid Build Coastguard Worker     isvce_populate_pps(ps_codec, ps_pps, 0, 0, 0);
161*495ae853SAndroid Build Coastguard Worker 
162*495ae853SAndroid Build Coastguard Worker     for(i = 1; i < ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers; i++)
163*495ae853SAndroid Build Coastguard Worker     {
164*495ae853SAndroid Build Coastguard Worker         ps_subset_sps = ps_codec->ps_subset_sps_base + i;
165*495ae853SAndroid Build Coastguard Worker         isvce_populate_subset_sps(ps_codec, ps_subset_sps, i, ps_inp_buf, i);
166*495ae853SAndroid Build Coastguard Worker 
167*495ae853SAndroid Build Coastguard Worker         ps_pps = ps_codec->ps_pps_base + i;
168*495ae853SAndroid Build Coastguard Worker         isvce_populate_pps(ps_codec, ps_pps, i, i, i);
169*495ae853SAndroid Build Coastguard Worker     }
170*495ae853SAndroid Build Coastguard Worker 
171*495ae853SAndroid Build Coastguard Worker     ps_entropy->i4_error_code = IH264E_SUCCESS;
172*495ae853SAndroid Build Coastguard Worker 
173*495ae853SAndroid Build Coastguard Worker     ps_entropy->i4_error_code = isvce_generate_sps(ps_bitstrm, ps_sps, NAL_SPS);
174*495ae853SAndroid Build Coastguard Worker     if(ps_entropy->i4_error_code != IH264E_SUCCESS)
175*495ae853SAndroid Build Coastguard Worker     {
176*495ae853SAndroid Build Coastguard Worker         return ps_entropy->i4_error_code;
177*495ae853SAndroid Build Coastguard Worker     }
178*495ae853SAndroid Build Coastguard Worker 
179*495ae853SAndroid Build Coastguard Worker     ps_pps = ps_codec->ps_pps_base;
180*495ae853SAndroid Build Coastguard Worker     ps_entropy->i4_error_code = isvce_generate_pps(ps_bitstrm, ps_pps, ps_sps);
181*495ae853SAndroid Build Coastguard Worker 
182*495ae853SAndroid Build Coastguard Worker     for(i = 1; i < ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers; i++)
183*495ae853SAndroid Build Coastguard Worker     {
184*495ae853SAndroid Build Coastguard Worker         ps_subset_sps = ps_codec->ps_subset_sps_base + i;
185*495ae853SAndroid Build Coastguard Worker         isvce_generate_subset_sps(ps_bitstrm, ps_subset_sps);
186*495ae853SAndroid Build Coastguard Worker 
187*495ae853SAndroid Build Coastguard Worker         /* populate pps header */
188*495ae853SAndroid Build Coastguard Worker         ps_pps = ps_codec->ps_pps_base + i;
189*495ae853SAndroid Build Coastguard Worker         isvce_generate_pps(ps_bitstrm, ps_pps, &ps_subset_sps->s_sps);
190*495ae853SAndroid Build Coastguard Worker     }
191*495ae853SAndroid Build Coastguard Worker 
192*495ae853SAndroid Build Coastguard Worker     /* queue output buffer */
193*495ae853SAndroid Build Coastguard Worker     ps_out_buf->as_bits_buf[ps_proc->u1_spatial_layer_id].u4_bytes = ps_bitstrm->u4_strm_buf_offset;
194*495ae853SAndroid Build Coastguard Worker 
195*495ae853SAndroid Build Coastguard Worker     return ps_entropy->i4_error_code;
196*495ae853SAndroid Build Coastguard Worker }
197*495ae853SAndroid Build Coastguard Worker 
198*495ae853SAndroid Build Coastguard Worker /**
199*495ae853SAndroid Build Coastguard Worker *******************************************************************************
200*495ae853SAndroid Build Coastguard Worker *
201*495ae853SAndroid Build Coastguard Worker * @brief   initialize entropy context.
202*495ae853SAndroid Build Coastguard Worker *
203*495ae853SAndroid Build Coastguard Worker * @par Description:
204*495ae853SAndroid Build Coastguard Worker *  Before invoking the call to perform to entropy coding the entropy context
205*495ae853SAndroid Build Coastguard Worker *  associated with the job needs to be initialized. This involves the start
206*495ae853SAndroid Build Coastguard Worker *  mb address, end mb address, slice index and the pointer to location at
207*495ae853SAndroid Build Coastguard Worker *  which the mb residue info and mb header info are packed.
208*495ae853SAndroid Build Coastguard Worker *
209*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc
210*495ae853SAndroid Build Coastguard Worker *  Pointer to the current process context
211*495ae853SAndroid Build Coastguard Worker *
212*495ae853SAndroid Build Coastguard Worker * @returns error status
213*495ae853SAndroid Build Coastguard Worker *
214*495ae853SAndroid Build Coastguard Worker * @remarks none
215*495ae853SAndroid Build Coastguard Worker *
216*495ae853SAndroid Build Coastguard Worker *******************************************************************************
217*495ae853SAndroid Build Coastguard Worker */
isvce_init_entropy_ctxt(isvce_process_ctxt_t * ps_proc)218*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_init_entropy_ctxt(isvce_process_ctxt_t *ps_proc)
219*495ae853SAndroid Build Coastguard Worker {
220*495ae853SAndroid Build Coastguard Worker     /* codec context */
221*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
222*495ae853SAndroid Build Coastguard Worker 
223*495ae853SAndroid Build Coastguard Worker     /* entropy ctxt */
224*495ae853SAndroid Build Coastguard Worker     isvce_entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy;
225*495ae853SAndroid Build Coastguard Worker 
226*495ae853SAndroid Build Coastguard Worker     /* start address */
227*495ae853SAndroid Build Coastguard Worker     ps_entropy->i4_mb_start_add = ps_entropy->i4_mb_y * ps_entropy->i4_wd_mbs + ps_entropy->i4_mb_x;
228*495ae853SAndroid Build Coastguard Worker 
229*495ae853SAndroid Build Coastguard Worker     /* end address */
230*495ae853SAndroid Build Coastguard Worker     ps_entropy->i4_mb_end_add = ps_entropy->i4_mb_start_add + ps_entropy->i4_mb_cnt;
231*495ae853SAndroid Build Coastguard Worker 
232*495ae853SAndroid Build Coastguard Worker     /* slice index */
233*495ae853SAndroid Build Coastguard Worker     ps_entropy->i4_cur_slice_idx = ps_proc->pu1_slice_idx[ps_entropy->i4_mb_start_add];
234*495ae853SAndroid Build Coastguard Worker 
235*495ae853SAndroid Build Coastguard Worker     /* sof */
236*495ae853SAndroid Build Coastguard Worker     /* @ start of frame or start of a new slice, set sof flag */
237*495ae853SAndroid Build Coastguard Worker     if(ps_entropy->i4_mb_start_add == 0)
238*495ae853SAndroid Build Coastguard Worker     {
239*495ae853SAndroid Build Coastguard Worker         ps_entropy->i4_sof = 1;
240*495ae853SAndroid Build Coastguard Worker     }
241*495ae853SAndroid Build Coastguard Worker 
242*495ae853SAndroid Build Coastguard Worker     if(ps_entropy->i4_mb_x == 0)
243*495ae853SAndroid Build Coastguard Worker     {
244*495ae853SAndroid Build Coastguard Worker         /* packed mb coeff data */
245*495ae853SAndroid Build Coastguard Worker         ps_entropy->pv_mb_coeff_data = ((UWORD8 *) ps_entropy->pv_pic_mb_coeff_data) +
246*495ae853SAndroid Build Coastguard Worker                                        ps_entropy->i4_mb_y * ps_codec->u4_size_coeff_data;
247*495ae853SAndroid Build Coastguard Worker 
248*495ae853SAndroid Build Coastguard Worker         /* packed mb header data */
249*495ae853SAndroid Build Coastguard Worker         ps_entropy->pv_mb_header_data = ((UWORD8 *) ps_entropy->pv_pic_mb_header_data) +
250*495ae853SAndroid Build Coastguard Worker                                         ps_entropy->i4_mb_y * ps_codec->u4_size_header_data;
251*495ae853SAndroid Build Coastguard Worker     }
252*495ae853SAndroid Build Coastguard Worker 
253*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
254*495ae853SAndroid Build Coastguard Worker }
255*495ae853SAndroid Build Coastguard Worker 
256*495ae853SAndroid Build Coastguard Worker /**
257*495ae853SAndroid Build Coastguard Worker *******************************************************************************
258*495ae853SAndroid Build Coastguard Worker *
259*495ae853SAndroid Build Coastguard Worker * @brief
260*495ae853SAndroid Build Coastguard Worker *  Function to update rc context after encoding
261*495ae853SAndroid Build Coastguard Worker *
262*495ae853SAndroid Build Coastguard Worker * @par   Description
263*495ae853SAndroid Build Coastguard Worker *  This function updates the rate control context after the frame is encoded.
264*495ae853SAndroid Build Coastguard Worker *  Number of bits consumed by the current frame, frame distortion, frame cost,
265*495ae853SAndroid Build Coastguard Worker *  number of intra/inter mb's, ... are passed on to rate control context for
266*495ae853SAndroid Build Coastguard Worker *  updating the rc model.
267*495ae853SAndroid Build Coastguard Worker *
268*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
269*495ae853SAndroid Build Coastguard Worker *  Handle to codec context
270*495ae853SAndroid Build Coastguard Worker *
271*495ae853SAndroid Build Coastguard Worker * @param[in] ctxt_sel
272*495ae853SAndroid Build Coastguard Worker *  frame context selector
273*495ae853SAndroid Build Coastguard Worker *
274*495ae853SAndroid Build Coastguard Worker * @param[in] pic_cnt
275*495ae853SAndroid Build Coastguard Worker *  pic count
276*495ae853SAndroid Build Coastguard Worker *
277*495ae853SAndroid Build Coastguard Worker * @returns i4_stuffing_byte
278*495ae853SAndroid Build Coastguard Worker *  number of stuffing bytes (if necessary)
279*495ae853SAndroid Build Coastguard Worker *
280*495ae853SAndroid Build Coastguard Worker * @remarks
281*495ae853SAndroid Build Coastguard Worker *
282*495ae853SAndroid Build Coastguard Worker *******************************************************************************
283*495ae853SAndroid Build Coastguard Worker */
isvce_update_rc_post_enc(isvce_codec_t * ps_codec,WORD32 ctxt_sel,WORD32 i4_is_first_frm)284*495ae853SAndroid Build Coastguard Worker WORD32 isvce_update_rc_post_enc(isvce_codec_t *ps_codec, WORD32 ctxt_sel, WORD32 i4_is_first_frm)
285*495ae853SAndroid Build Coastguard Worker {
286*495ae853SAndroid Build Coastguard Worker     WORD32 i4_proc_ctxt_sel_base = ctxt_sel ? (MAX_PROCESS_CTXT / 2) : 0;
287*495ae853SAndroid Build Coastguard Worker 
288*495ae853SAndroid Build Coastguard Worker     isvce_process_ctxt_t *ps_proc = &ps_codec->as_process[i4_proc_ctxt_sel_base];
289*495ae853SAndroid Build Coastguard Worker 
290*495ae853SAndroid Build Coastguard Worker #if ENABLE_RE_ENC_AS_SKIP
291*495ae853SAndroid Build Coastguard Worker     isvce_entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy;
292*495ae853SAndroid Build Coastguard Worker 
293*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_is_post_enc_skip = 0;
294*495ae853SAndroid Build Coastguard Worker #endif
295*495ae853SAndroid Build Coastguard Worker 
296*495ae853SAndroid Build Coastguard Worker     /* frame qp */
297*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_frame_qp = ps_codec->au4_frame_qp[ps_proc->u1_spatial_layer_id];
298*495ae853SAndroid Build Coastguard Worker 
299*495ae853SAndroid Build Coastguard Worker     /* cbr rc return status */
300*495ae853SAndroid Build Coastguard Worker     WORD32 i4_stuffing_byte = 0;
301*495ae853SAndroid Build Coastguard Worker 
302*495ae853SAndroid Build Coastguard Worker     /* current frame stats */
303*495ae853SAndroid Build Coastguard Worker     frame_info_t s_frame_info;
304*495ae853SAndroid Build Coastguard Worker     picture_type_e rc_pic_type = I_PIC;
305*495ae853SAndroid Build Coastguard Worker 
306*495ae853SAndroid Build Coastguard Worker     /* temp var */
307*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
308*495ae853SAndroid Build Coastguard Worker 
309*495ae853SAndroid Build Coastguard Worker     /********************************************************************/
310*495ae853SAndroid Build Coastguard Worker     /*                            BEGIN INIT                            */
311*495ae853SAndroid Build Coastguard Worker     /********************************************************************/
312*495ae853SAndroid Build Coastguard Worker 
313*495ae853SAndroid Build Coastguard Worker     /* init frame info */
314*495ae853SAndroid Build Coastguard Worker     irc_init_frame_info(&s_frame_info);
315*495ae853SAndroid Build Coastguard Worker 
316*495ae853SAndroid Build Coastguard Worker     /* get frame info */
317*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < (WORD32) ps_codec->s_cfg.u4_num_cores; i++)
318*495ae853SAndroid Build Coastguard Worker     {
319*495ae853SAndroid Build Coastguard Worker         /*****************************************************************/
320*495ae853SAndroid Build Coastguard Worker         /* One frame can be encoded by max of u4_num_cores threads       */
321*495ae853SAndroid Build Coastguard Worker         /* Accumulating the num mbs, sad, qp and intra_mb_cost from      */
322*495ae853SAndroid Build Coastguard Worker         /* u4_num_cores threads                                          */
323*495ae853SAndroid Build Coastguard Worker         /*****************************************************************/
324*495ae853SAndroid Build Coastguard Worker         for(j = 0; j < MAX_MB_TYPE; j++)
325*495ae853SAndroid Build Coastguard Worker         {
326*495ae853SAndroid Build Coastguard Worker             s_frame_info.num_mbs[j] += ps_proc[i].s_frame_info.num_mbs[j];
327*495ae853SAndroid Build Coastguard Worker 
328*495ae853SAndroid Build Coastguard Worker             s_frame_info.tot_mb_sad[j] += ps_proc[i].s_frame_info.tot_mb_sad[j];
329*495ae853SAndroid Build Coastguard Worker 
330*495ae853SAndroid Build Coastguard Worker             s_frame_info.qp_sum[j] += ps_proc[i].s_frame_info.qp_sum[j];
331*495ae853SAndroid Build Coastguard Worker         }
332*495ae853SAndroid Build Coastguard Worker 
333*495ae853SAndroid Build Coastguard Worker         s_frame_info.intra_mb_cost_sum += ps_proc[i].s_frame_info.intra_mb_cost_sum;
334*495ae853SAndroid Build Coastguard Worker 
335*495ae853SAndroid Build Coastguard Worker         s_frame_info.activity_sum += ps_proc[i].s_frame_info.activity_sum;
336*495ae853SAndroid Build Coastguard Worker 
337*495ae853SAndroid Build Coastguard Worker         /*****************************************************************/
338*495ae853SAndroid Build Coastguard Worker         /* gather number of residue and header bits consumed by the frame*/
339*495ae853SAndroid Build Coastguard Worker         /*****************************************************************/
340*495ae853SAndroid Build Coastguard Worker         isvce_update_rc_bits_info(&s_frame_info, &ps_proc[i].s_entropy);
341*495ae853SAndroid Build Coastguard Worker     }
342*495ae853SAndroid Build Coastguard Worker 
343*495ae853SAndroid Build Coastguard Worker     /* get pic type */
344*495ae853SAndroid Build Coastguard Worker     switch(ps_codec->pic_type)
345*495ae853SAndroid Build Coastguard Worker     {
346*495ae853SAndroid Build Coastguard Worker         case PIC_I:
347*495ae853SAndroid Build Coastguard Worker         case PIC_IDR:
348*495ae853SAndroid Build Coastguard Worker             rc_pic_type = I_PIC;
349*495ae853SAndroid Build Coastguard Worker             break;
350*495ae853SAndroid Build Coastguard Worker         case PIC_P:
351*495ae853SAndroid Build Coastguard Worker             rc_pic_type = P_PIC;
352*495ae853SAndroid Build Coastguard Worker             break;
353*495ae853SAndroid Build Coastguard Worker         case PIC_B:
354*495ae853SAndroid Build Coastguard Worker             rc_pic_type = B_PIC;
355*495ae853SAndroid Build Coastguard Worker             break;
356*495ae853SAndroid Build Coastguard Worker         default:
357*495ae853SAndroid Build Coastguard Worker             assert(0);
358*495ae853SAndroid Build Coastguard Worker             break;
359*495ae853SAndroid Build Coastguard Worker     }
360*495ae853SAndroid Build Coastguard Worker 
361*495ae853SAndroid Build Coastguard Worker     /* update rc lib with current frame stats */
362*495ae853SAndroid Build Coastguard Worker     i4_stuffing_byte = isvce_rc_post_enc(
363*495ae853SAndroid Build Coastguard Worker         ps_codec->s_rate_control.apps_rate_control_api[ps_proc->u1_spatial_layer_id],
364*495ae853SAndroid Build Coastguard Worker         &(s_frame_info), ps_codec->s_rate_control.pps_pd_frm_rate,
365*495ae853SAndroid Build Coastguard Worker         ps_codec->s_rate_control.pps_time_stamp, ps_codec->s_rate_control.pps_frame_time,
366*495ae853SAndroid Build Coastguard Worker         (ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs), &rc_pic_type, i4_is_first_frm,
367*495ae853SAndroid Build Coastguard Worker         &ps_codec->s_rate_control.post_encode_skip[ctxt_sel], u1_frame_qp,
368*495ae853SAndroid Build Coastguard Worker         &ps_codec->s_rate_control.ai4_num_intra_in_prev_frame[ps_proc->u1_spatial_layer_id],
369*495ae853SAndroid Build Coastguard Worker         &ps_codec->s_rate_control.ai4_avg_activity[ps_proc->u1_spatial_layer_id]
370*495ae853SAndroid Build Coastguard Worker #if ENABLE_RE_ENC_AS_SKIP
371*495ae853SAndroid Build Coastguard Worker         ,
372*495ae853SAndroid Build Coastguard Worker         &u1_is_post_enc_skip
373*495ae853SAndroid Build Coastguard Worker #endif
374*495ae853SAndroid Build Coastguard Worker     );
375*495ae853SAndroid Build Coastguard Worker 
376*495ae853SAndroid Build Coastguard Worker #if ENABLE_RE_ENC_AS_SKIP
377*495ae853SAndroid Build Coastguard Worker     if(u1_is_post_enc_skip)
378*495ae853SAndroid Build Coastguard Worker     {
379*495ae853SAndroid Build Coastguard Worker         buffer_container_t s_dst;
380*495ae853SAndroid Build Coastguard Worker 
381*495ae853SAndroid Build Coastguard Worker         WORD32 i;
382*495ae853SAndroid Build Coastguard Worker 
383*495ae853SAndroid Build Coastguard Worker         isa_dependent_fxns_t *ps_isa_dependent_fxns = &ps_codec->s_isa_dependent_fxns;
384*495ae853SAndroid Build Coastguard Worker         mem_fxns_t *ps_mem_fxns = &ps_isa_dependent_fxns->s_mem_fxns;
385*495ae853SAndroid Build Coastguard Worker         svc_ilp_data_t *ps_svc_ilp_data = &ps_codec->s_svc_ilp_data;
386*495ae853SAndroid Build Coastguard Worker 
387*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_spatial_layer_id = ps_proc->u1_spatial_layer_id;
388*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_num_spatial_layers = ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers;
389*495ae853SAndroid Build Coastguard Worker 
390*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_wd = ps_codec->s_cfg.u4_wd;
391*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_ht = ps_codec->s_cfg.u4_ht;
392*495ae853SAndroid Build Coastguard Worker         DOUBLE d_spatial_res_ratio = ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio;
393*495ae853SAndroid Build Coastguard Worker 
394*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_wd =
395*495ae853SAndroid Build Coastguard Worker             (WORD32) (((DOUBLE) u4_wd /
396*495ae853SAndroid Build Coastguard Worker                        pow(d_spatial_res_ratio, u1_num_spatial_layers - u1_spatial_layer_id - 1)) +
397*495ae853SAndroid Build Coastguard Worker                       0.99);
398*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_ht =
399*495ae853SAndroid Build Coastguard Worker             (WORD32) (((DOUBLE) u4_ht /
400*495ae853SAndroid Build Coastguard Worker                        pow(d_spatial_res_ratio, u1_num_spatial_layers - u1_spatial_layer_id - 1)) +
401*495ae853SAndroid Build Coastguard Worker                       0.99);
402*495ae853SAndroid Build Coastguard Worker 
403*495ae853SAndroid Build Coastguard Worker         if(CABAC == ps_entropy->u1_entropy_coding_mode_flag)
404*495ae853SAndroid Build Coastguard Worker         {
405*495ae853SAndroid Build Coastguard Worker             isvce_reencode_as_skip_frame_cabac(ps_entropy);
406*495ae853SAndroid Build Coastguard Worker         }
407*495ae853SAndroid Build Coastguard Worker         else
408*495ae853SAndroid Build Coastguard Worker         {
409*495ae853SAndroid Build Coastguard Worker             isvce_reencode_as_skip_frame_cavlc(ps_entropy);
410*495ae853SAndroid Build Coastguard Worker         }
411*495ae853SAndroid Build Coastguard Worker 
412*495ae853SAndroid Build Coastguard Worker         if(u1_num_spatial_layers > 1)
413*495ae853SAndroid Build Coastguard Worker         {
414*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < ps_proc->i4_ht_mbs; i++)
415*495ae853SAndroid Build Coastguard Worker             {
416*495ae853SAndroid Build Coastguard Worker                 for(j = 0; j < ps_proc->i4_wd_mbs; j++)
417*495ae853SAndroid Build Coastguard Worker                 {
418*495ae853SAndroid Build Coastguard Worker                     isvce_update_ibl_info(ps_proc->ps_intra_pred_ctxt, u1_num_spatial_layers,
419*495ae853SAndroid Build Coastguard Worker                                           u1_spatial_layer_id, PSKIP, j, i, 0);
420*495ae853SAndroid Build Coastguard Worker                 }
421*495ae853SAndroid Build Coastguard Worker             }
422*495ae853SAndroid Build Coastguard Worker 
423*495ae853SAndroid Build Coastguard Worker             if(ENABLE_ILP_MV)
424*495ae853SAndroid Build Coastguard Worker             {
425*495ae853SAndroid Build Coastguard Worker                 svc_layer_data_t *ps_layer_data;
426*495ae853SAndroid Build Coastguard Worker 
427*495ae853SAndroid Build Coastguard Worker                 svc_au_data_t *ps_svc_au_data = ps_svc_ilp_data->ps_svc_au_data;
428*495ae853SAndroid Build Coastguard Worker 
429*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_num_mbs = ps_proc->i4_ht_mbs * ps_proc->i4_wd_mbs;
430*495ae853SAndroid Build Coastguard Worker 
431*495ae853SAndroid Build Coastguard Worker                 ps_layer_data = &ps_svc_au_data->ps_svc_layer_data[ps_entropy->u1_spatial_layer_id];
432*495ae853SAndroid Build Coastguard Worker 
433*495ae853SAndroid Build Coastguard Worker                 memset(ps_layer_data->ps_mb_info, 0,
434*495ae853SAndroid Build Coastguard Worker                        i4_num_mbs * sizeof(ps_layer_data->ps_mb_info[0]));
435*495ae853SAndroid Build Coastguard Worker 
436*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i < i4_num_mbs; i++)
437*495ae853SAndroid Build Coastguard Worker                 {
438*495ae853SAndroid Build Coastguard Worker                     ps_layer_data->pu4_num_pus_in_mb[i] = 1;
439*495ae853SAndroid Build Coastguard Worker                 }
440*495ae853SAndroid Build Coastguard Worker             }
441*495ae853SAndroid Build Coastguard Worker         }
442*495ae853SAndroid Build Coastguard Worker 
443*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < NUM_SP_COMPONENTS; i++)
444*495ae853SAndroid Build Coastguard Worker         {
445*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_is_chroma = (Y != ((COMPONENT_TYPE) i));
446*495ae853SAndroid Build Coastguard Worker             WORD32 i4_src_strd = ps_proc->aps_ref_pic[0]
447*495ae853SAndroid Build Coastguard Worker                                      ->ps_layer_yuv_buf_props[u1_spatial_layer_id]
448*495ae853SAndroid Build Coastguard Worker                                      .as_component_bufs[i]
449*495ae853SAndroid Build Coastguard Worker                                      .i4_data_stride;
450*495ae853SAndroid Build Coastguard Worker             WORD32 i4_dst_strd = ps_proc->ps_cur_pic->ps_layer_yuv_buf_props[u1_spatial_layer_id]
451*495ae853SAndroid Build Coastguard Worker                                      .as_component_bufs[i]
452*495ae853SAndroid Build Coastguard Worker                                      .i4_data_stride;
453*495ae853SAndroid Build Coastguard Worker 
454*495ae853SAndroid Build Coastguard Worker             if(u1_spatial_layer_id < (u1_num_spatial_layers - 1))
455*495ae853SAndroid Build Coastguard Worker             {
456*495ae853SAndroid Build Coastguard Worker                 s_dst.i4_data_stride = ps_svc_ilp_data->ps_intra_recon_bufs[u1_spatial_layer_id]
457*495ae853SAndroid Build Coastguard Worker                                            .as_component_bufs[i]
458*495ae853SAndroid Build Coastguard Worker                                            .i4_data_stride;
459*495ae853SAndroid Build Coastguard Worker                 s_dst.pv_data =
460*495ae853SAndroid Build Coastguard Worker                     ((UWORD8 *) ps_svc_ilp_data->ps_intra_recon_bufs[u1_spatial_layer_id]
461*495ae853SAndroid Build Coastguard Worker                          .as_component_bufs[i]
462*495ae853SAndroid Build Coastguard Worker                          .pv_data);
463*495ae853SAndroid Build Coastguard Worker 
464*495ae853SAndroid Build Coastguard Worker                 ps_mem_fxns->pf_memset_2d((UWORD8 *) s_dst.pv_data, s_dst.i4_data_stride, 0,
465*495ae853SAndroid Build Coastguard Worker                                           i4_layer_luma_wd, (i4_layer_luma_ht >> u1_is_chroma));
466*495ae853SAndroid Build Coastguard Worker 
467*495ae853SAndroid Build Coastguard Worker                 if(ENABLE_RESIDUAL_PREDICTION)
468*495ae853SAndroid Build Coastguard Worker                 {
469*495ae853SAndroid Build Coastguard Worker                     WORD16 *pi2_res;
470*495ae853SAndroid Build Coastguard Worker                     yuv_buf_props_t *ps_residual_buf =
471*495ae853SAndroid Build Coastguard Worker                         &ps_codec->s_svc_ilp_data.ps_residual_bufs[u1_spatial_layer_id];
472*495ae853SAndroid Build Coastguard Worker 
473*495ae853SAndroid Build Coastguard Worker                     pi2_res = ps_residual_buf->as_component_bufs[u1_is_chroma].pv_data;
474*495ae853SAndroid Build Coastguard Worker 
475*495ae853SAndroid Build Coastguard Worker                     ps_mem_fxns->pf_memset_2d(
476*495ae853SAndroid Build Coastguard Worker                         (UWORD8 *) pi2_res,
477*495ae853SAndroid Build Coastguard Worker                         ps_residual_buf->as_component_bufs[u1_is_chroma].i4_data_stride *
478*495ae853SAndroid Build Coastguard Worker                             (sizeof(WORD16) / sizeof(UWORD8)),
479*495ae853SAndroid Build Coastguard Worker                         0,
480*495ae853SAndroid Build Coastguard Worker                         ps_residual_buf->as_component_bufs[u1_is_chroma].i4_data_stride *
481*495ae853SAndroid Build Coastguard Worker                             (sizeof(WORD16) / sizeof(UWORD8)),
482*495ae853SAndroid Build Coastguard Worker                         i4_layer_luma_ht >> u1_is_chroma);
483*495ae853SAndroid Build Coastguard Worker                 }
484*495ae853SAndroid Build Coastguard Worker             }
485*495ae853SAndroid Build Coastguard Worker 
486*495ae853SAndroid Build Coastguard Worker             ps_mem_fxns->pf_copy_2d(
487*495ae853SAndroid Build Coastguard Worker                 (UWORD8 *) (ps_proc->ps_cur_pic->ps_layer_yuv_buf_props[u1_spatial_layer_id]
488*495ae853SAndroid Build Coastguard Worker                                 .as_component_bufs[i]
489*495ae853SAndroid Build Coastguard Worker                                 .pv_data) -
490*495ae853SAndroid Build Coastguard Worker                     PAD_LEFT - (PAD_TOP * i4_dst_strd),
491*495ae853SAndroid Build Coastguard Worker                 i4_dst_strd,
492*495ae853SAndroid Build Coastguard Worker                 (UWORD8 *) (ps_proc->aps_ref_pic[0]
493*495ae853SAndroid Build Coastguard Worker                                 ->ps_layer_yuv_buf_props[u1_spatial_layer_id]
494*495ae853SAndroid Build Coastguard Worker                                 .as_component_bufs[i]
495*495ae853SAndroid Build Coastguard Worker                                 .pv_data) -
496*495ae853SAndroid Build Coastguard Worker                     PAD_LEFT - (PAD_TOP * i4_src_strd),
497*495ae853SAndroid Build Coastguard Worker                 i4_src_strd, (i4_layer_luma_wd + PAD_WD),
498*495ae853SAndroid Build Coastguard Worker                 (i4_layer_luma_ht >> u1_is_chroma) + PAD_HT);
499*495ae853SAndroid Build Coastguard Worker         }
500*495ae853SAndroid Build Coastguard Worker 
501*495ae853SAndroid Build Coastguard Worker         RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
502*495ae853SAndroid Build Coastguard Worker     }
503*495ae853SAndroid Build Coastguard Worker 
504*495ae853SAndroid Build Coastguard Worker #endif
505*495ae853SAndroid Build Coastguard Worker     return i4_stuffing_byte;
506*495ae853SAndroid Build Coastguard Worker }
507*495ae853SAndroid Build Coastguard Worker 
508*495ae853SAndroid Build Coastguard Worker /**
509*495ae853SAndroid Build Coastguard Worker *******************************************************************************
510*495ae853SAndroid Build Coastguard Worker *
511*495ae853SAndroid Build Coastguard Worker * @brief entry point for entropy coding
512*495ae853SAndroid Build Coastguard Worker *
513*495ae853SAndroid Build Coastguard Worker * @par Description
514*495ae853SAndroid Build Coastguard Worker *  This function calls lower level functions to perform entropy coding for a
515*495ae853SAndroid Build Coastguard Worker *  group (n rows) of mb's. After encoding 1 row of mb's,  the function takes
516*495ae853SAndroid Build Coastguard Worker *  back the control, updates the ctxt and calls lower level functions again.
517*495ae853SAndroid Build Coastguard Worker *  This process is repeated till all the rows or group of mb's (which ever is
518*495ae853SAndroid Build Coastguard Worker *  minimum) are coded
519*495ae853SAndroid Build Coastguard Worker *
520*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc
521*495ae853SAndroid Build Coastguard Worker *  process context
522*495ae853SAndroid Build Coastguard Worker *
523*495ae853SAndroid Build Coastguard Worker * @returns  error status
524*495ae853SAndroid Build Coastguard Worker *
525*495ae853SAndroid Build Coastguard Worker * @remarks
526*495ae853SAndroid Build Coastguard Worker *
527*495ae853SAndroid Build Coastguard Worker *******************************************************************************
528*495ae853SAndroid Build Coastguard Worker */
isvce_entropy(isvce_process_ctxt_t * ps_proc)529*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_entropy(isvce_process_ctxt_t *ps_proc)
530*495ae853SAndroid Build Coastguard Worker {
531*495ae853SAndroid Build Coastguard Worker     svc_nalu_ext_t *aps_svc_nalu_ext[2];
532*495ae853SAndroid Build Coastguard Worker     isvce_out_buf_t s_out_buf;
533*495ae853SAndroid Build Coastguard Worker     sei_params_t s_sei;
534*495ae853SAndroid Build Coastguard Worker     nalu_info_t *ps_slice_nalu_info;
535*495ae853SAndroid Build Coastguard Worker     nalu_info_t *ps_non_vcl_nalu_info;
536*495ae853SAndroid Build Coastguard Worker 
537*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_proc_map;
538*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_entropy_map_curr;
539*495ae853SAndroid Build Coastguard Worker     WORD32 i4_wd_mbs, i4_ht_mbs;
540*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_mb_cnt, u4_mb_idx, u4_mb_end_idx, u4_insert_per_idr;
541*495ae853SAndroid Build Coastguard Worker     WORD32 bitstream_start_offset, bitstream_end_offset;
542*495ae853SAndroid Build Coastguard Worker 
543*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
544*495ae853SAndroid Build Coastguard Worker     isvce_entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy;
545*495ae853SAndroid Build Coastguard Worker     isvce_cabac_ctxt_t *ps_cabac_ctxt = ps_entropy->ps_cabac;
546*495ae853SAndroid Build Coastguard Worker     sps_t *ps_sps = ps_entropy->ps_sps_base;
547*495ae853SAndroid Build Coastguard Worker     subset_sps_t *ps_subset_sps = ps_entropy->ps_subset_sps_base;
548*495ae853SAndroid Build Coastguard Worker     pps_t *ps_pps = ps_entropy->ps_pps_base;
549*495ae853SAndroid Build Coastguard Worker     slice_header_t *ps_slice_hdr =
550*495ae853SAndroid Build Coastguard Worker         ps_entropy->ps_slice_hdr_base + (ps_entropy->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
551*495ae853SAndroid Build Coastguard Worker     svc_slice_header_t *ps_svc_slice_hdr = NULL;
552*495ae853SAndroid Build Coastguard Worker     bitstrm_t *ps_bitstrm = ps_entropy->ps_bitstrm;
553*495ae853SAndroid Build Coastguard Worker #if ENABLE_RE_ENC_AS_SKIP
554*495ae853SAndroid Build Coastguard Worker     bitstrm_t *ps_bitstrm_after_slice_hdr = ps_entropy->ps_bitstrm_after_slice_hdr;
555*495ae853SAndroid Build Coastguard Worker #endif
556*495ae853SAndroid Build Coastguard Worker     nalu_descriptors_t *ps_nalu_descriptor =
557*495ae853SAndroid Build Coastguard Worker         &ps_codec->as_nalu_descriptors[ps_proc->u1_spatial_layer_id];
558*495ae853SAndroid Build Coastguard Worker 
559*495ae853SAndroid Build Coastguard Worker     WORD32 i4_slice_type = ps_proc->i4_slice_type;
560*495ae853SAndroid Build Coastguard Worker     WORD32 ctxt_sel = ps_proc->i4_encode_api_call_cnt % MAX_CTXT_SETS;
561*495ae853SAndroid Build Coastguard Worker 
562*495ae853SAndroid Build Coastguard Worker     aps_svc_nalu_ext[0] =
563*495ae853SAndroid Build Coastguard Worker         ps_entropy->ps_svc_nalu_ext_base + (ps_entropy->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
564*495ae853SAndroid Build Coastguard Worker     aps_svc_nalu_ext[1] = ps_entropy->ps_svc_nalu_ext_base + 1 +
565*495ae853SAndroid Build Coastguard Worker                           (ps_entropy->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
566*495ae853SAndroid Build Coastguard Worker 
567*495ae853SAndroid Build Coastguard Worker     /********************************************************************/
568*495ae853SAndroid Build Coastguard Worker     /*                            BEGIN INIT                            */
569*495ae853SAndroid Build Coastguard Worker     /********************************************************************/
570*495ae853SAndroid Build Coastguard Worker 
571*495ae853SAndroid Build Coastguard Worker     /* entropy encode start address */
572*495ae853SAndroid Build Coastguard Worker     u4_mb_idx = ps_entropy->i4_mb_start_add;
573*495ae853SAndroid Build Coastguard Worker 
574*495ae853SAndroid Build Coastguard Worker     /* entropy encode end address */
575*495ae853SAndroid Build Coastguard Worker     u4_mb_end_idx = ps_entropy->i4_mb_end_add;
576*495ae853SAndroid Build Coastguard Worker 
577*495ae853SAndroid Build Coastguard Worker     /* width in mbs */
578*495ae853SAndroid Build Coastguard Worker     i4_wd_mbs = ps_entropy->i4_wd_mbs;
579*495ae853SAndroid Build Coastguard Worker 
580*495ae853SAndroid Build Coastguard Worker     /* height in mbs */
581*495ae853SAndroid Build Coastguard Worker     i4_ht_mbs = ps_entropy->i4_ht_mbs;
582*495ae853SAndroid Build Coastguard Worker 
583*495ae853SAndroid Build Coastguard Worker     /* total mb cnt */
584*495ae853SAndroid Build Coastguard Worker     u4_mb_cnt = i4_wd_mbs * i4_ht_mbs;
585*495ae853SAndroid Build Coastguard Worker 
586*495ae853SAndroid Build Coastguard Worker     /* proc map */
587*495ae853SAndroid Build Coastguard Worker     pu1_proc_map = ps_proc->pu1_proc_map + ps_entropy->i4_mb_y * i4_wd_mbs;
588*495ae853SAndroid Build Coastguard Worker 
589*495ae853SAndroid Build Coastguard Worker     /* entropy map */
590*495ae853SAndroid Build Coastguard Worker     pu1_entropy_map_curr = ps_entropy->pu1_entropy_map + ps_entropy->i4_mb_y * i4_wd_mbs;
591*495ae853SAndroid Build Coastguard Worker 
592*495ae853SAndroid Build Coastguard Worker     /********************************************************************/
593*495ae853SAndroid Build Coastguard Worker     /* @ start of frame / slice,                                        */
594*495ae853SAndroid Build Coastguard Worker     /*      initialize the output buffer,                               */
595*495ae853SAndroid Build Coastguard Worker     /*      initialize the bit stream buffer,                           */
596*495ae853SAndroid Build Coastguard Worker     /*      check if sps and pps headers have to be generated,          */
597*495ae853SAndroid Build Coastguard Worker     /*      populate and generate slice header                          */
598*495ae853SAndroid Build Coastguard Worker     /********************************************************************/
599*495ae853SAndroid Build Coastguard Worker     if(ps_entropy->i4_sof)
600*495ae853SAndroid Build Coastguard Worker     {
601*495ae853SAndroid Build Coastguard Worker         /********************************************************************/
602*495ae853SAndroid Build Coastguard Worker         /*      initialize the output buffer                                */
603*495ae853SAndroid Build Coastguard Worker         /********************************************************************/
604*495ae853SAndroid Build Coastguard Worker         s_out_buf = ps_codec->as_out_buf[ctxt_sel];
605*495ae853SAndroid Build Coastguard Worker 
606*495ae853SAndroid Build Coastguard Worker         /* is last frame to encode */
607*495ae853SAndroid Build Coastguard Worker         s_out_buf.u4_is_last = ps_entropy->u4_is_last;
608*495ae853SAndroid Build Coastguard Worker 
609*495ae853SAndroid Build Coastguard Worker         /* frame idx */
610*495ae853SAndroid Build Coastguard Worker         s_out_buf.u4_timestamp_high = ps_entropy->u4_timestamp_high;
611*495ae853SAndroid Build Coastguard Worker         s_out_buf.u4_timestamp_low = ps_entropy->u4_timestamp_low;
612*495ae853SAndroid Build Coastguard Worker 
613*495ae853SAndroid Build Coastguard Worker         /********************************************************************/
614*495ae853SAndroid Build Coastguard Worker         /*      initialize the bit stream buffer                            */
615*495ae853SAndroid Build Coastguard Worker         /********************************************************************/
616*495ae853SAndroid Build Coastguard Worker         ih264e_bitstrm_init(ps_bitstrm, s_out_buf.as_bits_buf[ps_proc->u1_spatial_layer_id].pv_buf,
617*495ae853SAndroid Build Coastguard Worker                             s_out_buf.as_bits_buf[ps_proc->u1_spatial_layer_id].u4_bufsize);
618*495ae853SAndroid Build Coastguard Worker 
619*495ae853SAndroid Build Coastguard Worker         /********************************************************************/
620*495ae853SAndroid Build Coastguard Worker         /*                    BEGIN HEADER GENERATION                       */
621*495ae853SAndroid Build Coastguard Worker         /********************************************************************/
622*495ae853SAndroid Build Coastguard Worker         if(1 == ps_entropy->i4_gen_header)
623*495ae853SAndroid Build Coastguard Worker         {
624*495ae853SAndroid Build Coastguard Worker             WORD32 i;
625*495ae853SAndroid Build Coastguard Worker 
626*495ae853SAndroid Build Coastguard Worker             ps_non_vcl_nalu_info = isvce_get_next_nalu_info_buf(ps_nalu_descriptor);
627*495ae853SAndroid Build Coastguard Worker             isvce_nalu_info_buf_init(ps_non_vcl_nalu_info,
628*495ae853SAndroid Build Coastguard Worker                                      -((WORD32) isvce_get_num_bits(ps_bitstrm)), NAL_SPS,
629*495ae853SAndroid Build Coastguard Worker                                      ps_proc->u1_spatial_layer_id,
630*495ae853SAndroid Build Coastguard Worker                                      ps_proc->ps_cur_pic->i1_temporal_id, 1, !!ps_proc->u4_is_idr);
631*495ae853SAndroid Build Coastguard Worker 
632*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code = isvce_generate_sps(ps_bitstrm, ps_sps, NAL_SPS);
633*495ae853SAndroid Build Coastguard Worker             RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
634*495ae853SAndroid Build Coastguard Worker 
635*495ae853SAndroid Build Coastguard Worker             ps_non_vcl_nalu_info->i8_num_bits += isvce_get_num_bits(ps_bitstrm);
636*495ae853SAndroid Build Coastguard Worker             isvce_update_nalu_count(ps_nalu_descriptor);
637*495ae853SAndroid Build Coastguard Worker 
638*495ae853SAndroid Build Coastguard Worker             for(i = 1; i < ps_proc->s_svc_params.u1_num_spatial_layers; i++)
639*495ae853SAndroid Build Coastguard Worker             {
640*495ae853SAndroid Build Coastguard Worker                 ps_subset_sps = ps_entropy->ps_subset_sps_base + i;
641*495ae853SAndroid Build Coastguard Worker 
642*495ae853SAndroid Build Coastguard Worker                 ps_non_vcl_nalu_info = isvce_get_next_nalu_info_buf(ps_nalu_descriptor);
643*495ae853SAndroid Build Coastguard Worker                 isvce_nalu_info_buf_init(
644*495ae853SAndroid Build Coastguard Worker                     ps_non_vcl_nalu_info, -((WORD32) isvce_get_num_bits(ps_bitstrm)),
645*495ae853SAndroid Build Coastguard Worker                     NAL_SUBSET_SPS, ps_proc->u1_spatial_layer_id,
646*495ae853SAndroid Build Coastguard Worker                     ps_proc->ps_cur_pic->i1_temporal_id, 1, !!ps_proc->u4_is_idr);
647*495ae853SAndroid Build Coastguard Worker 
648*495ae853SAndroid Build Coastguard Worker                 ps_entropy->i4_error_code = isvce_generate_subset_sps(ps_bitstrm, ps_subset_sps);
649*495ae853SAndroid Build Coastguard Worker 
650*495ae853SAndroid Build Coastguard Worker                 ps_non_vcl_nalu_info->i8_num_bits += isvce_get_num_bits(ps_bitstrm);
651*495ae853SAndroid Build Coastguard Worker                 isvce_update_nalu_count(ps_nalu_descriptor);
652*495ae853SAndroid Build Coastguard Worker             }
653*495ae853SAndroid Build Coastguard Worker 
654*495ae853SAndroid Build Coastguard Worker             ps_non_vcl_nalu_info = isvce_get_next_nalu_info_buf(ps_nalu_descriptor);
655*495ae853SAndroid Build Coastguard Worker             isvce_nalu_info_buf_init(ps_non_vcl_nalu_info,
656*495ae853SAndroid Build Coastguard Worker                                      -((WORD32) isvce_get_num_bits(ps_bitstrm)), NAL_PPS,
657*495ae853SAndroid Build Coastguard Worker                                      ps_proc->u1_spatial_layer_id,
658*495ae853SAndroid Build Coastguard Worker                                      ps_proc->ps_cur_pic->i1_temporal_id, 1, !!ps_proc->u4_is_idr);
659*495ae853SAndroid Build Coastguard Worker 
660*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code = isvce_generate_pps(ps_bitstrm, ps_pps, ps_sps);
661*495ae853SAndroid Build Coastguard Worker             RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
662*495ae853SAndroid Build Coastguard Worker 
663*495ae853SAndroid Build Coastguard Worker             ps_non_vcl_nalu_info->i8_num_bits += isvce_get_num_bits(ps_bitstrm);
664*495ae853SAndroid Build Coastguard Worker             isvce_update_nalu_count(ps_nalu_descriptor);
665*495ae853SAndroid Build Coastguard Worker 
666*495ae853SAndroid Build Coastguard Worker             for(i = 1; i < ps_proc->s_svc_params.u1_num_spatial_layers; i++)
667*495ae853SAndroid Build Coastguard Worker             {
668*495ae853SAndroid Build Coastguard Worker                 ps_pps = ps_entropy->ps_pps_base + i;
669*495ae853SAndroid Build Coastguard Worker                 ps_subset_sps = ps_entropy->ps_subset_sps_base + i;
670*495ae853SAndroid Build Coastguard Worker 
671*495ae853SAndroid Build Coastguard Worker                 ps_non_vcl_nalu_info = isvce_get_next_nalu_info_buf(ps_nalu_descriptor);
672*495ae853SAndroid Build Coastguard Worker                 isvce_nalu_info_buf_init(
673*495ae853SAndroid Build Coastguard Worker                     ps_non_vcl_nalu_info, -((WORD32) isvce_get_num_bits(ps_bitstrm)), NAL_PPS,
674*495ae853SAndroid Build Coastguard Worker                     ps_proc->u1_spatial_layer_id, ps_proc->ps_cur_pic->i1_temporal_id, 1,
675*495ae853SAndroid Build Coastguard Worker                     !!ps_proc->u4_is_idr);
676*495ae853SAndroid Build Coastguard Worker 
677*495ae853SAndroid Build Coastguard Worker                 ps_entropy->i4_error_code =
678*495ae853SAndroid Build Coastguard Worker                     isvce_generate_pps(ps_bitstrm, ps_pps, &ps_subset_sps->s_sps);
679*495ae853SAndroid Build Coastguard Worker 
680*495ae853SAndroid Build Coastguard Worker                 RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
681*495ae853SAndroid Build Coastguard Worker 
682*495ae853SAndroid Build Coastguard Worker                 ps_non_vcl_nalu_info->i8_num_bits += isvce_get_num_bits(ps_bitstrm);
683*495ae853SAndroid Build Coastguard Worker                 isvce_update_nalu_count(ps_nalu_descriptor);
684*495ae853SAndroid Build Coastguard Worker             }
685*495ae853SAndroid Build Coastguard Worker 
686*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_gen_header = 0;
687*495ae853SAndroid Build Coastguard Worker         }
688*495ae853SAndroid Build Coastguard Worker 
689*495ae853SAndroid Build Coastguard Worker         ps_svc_slice_hdr = ps_entropy->ps_svc_slice_hdr_base +
690*495ae853SAndroid Build Coastguard Worker                            (ps_entropy->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
691*495ae853SAndroid Build Coastguard Worker 
692*495ae853SAndroid Build Coastguard Worker         if((ps_codec->s_cfg.s_svc_params.u1_num_temporal_layers > 1) ||
693*495ae853SAndroid Build Coastguard Worker            (ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers > 1))
694*495ae853SAndroid Build Coastguard Worker         {
695*495ae853SAndroid Build Coastguard Worker             isvce_populate_svc_nalu_extension(ps_proc, aps_svc_nalu_ext[0], NAL_PREFIX,
696*495ae853SAndroid Build Coastguard Worker                                               ps_proc->u4_is_idr);
697*495ae853SAndroid Build Coastguard Worker 
698*495ae853SAndroid Build Coastguard Worker             if(ps_proc->u1_spatial_layer_id > 0)
699*495ae853SAndroid Build Coastguard Worker             {
700*495ae853SAndroid Build Coastguard Worker                 isvce_populate_svc_nalu_extension(ps_proc, aps_svc_nalu_ext[1],
701*495ae853SAndroid Build Coastguard Worker                                                   NAL_CODED_SLICE_EXTENSION, ps_proc->u4_is_idr);
702*495ae853SAndroid Build Coastguard Worker             }
703*495ae853SAndroid Build Coastguard Worker         }
704*495ae853SAndroid Build Coastguard Worker         else
705*495ae853SAndroid Build Coastguard Worker         {
706*495ae853SAndroid Build Coastguard Worker             isvce_populate_svc_nalu_extension(ps_proc, aps_svc_nalu_ext[0], NAL_PREFIX,
707*495ae853SAndroid Build Coastguard Worker                                               ps_proc->u4_is_idr);
708*495ae853SAndroid Build Coastguard Worker         }
709*495ae853SAndroid Build Coastguard Worker 
710*495ae853SAndroid Build Coastguard Worker         if(ps_proc->u1_spatial_layer_id > 0)
711*495ae853SAndroid Build Coastguard Worker         {
712*495ae853SAndroid Build Coastguard Worker             ps_subset_sps = ps_entropy->ps_subset_sps_base + ps_proc->u1_spatial_layer_id;
713*495ae853SAndroid Build Coastguard Worker             ps_pps = ps_entropy->ps_pps_base + ps_proc->u1_spatial_layer_id;
714*495ae853SAndroid Build Coastguard Worker 
715*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code = isvce_populate_svc_slice(
716*495ae853SAndroid Build Coastguard Worker                 ps_proc, ps_svc_slice_hdr, ps_pps, ps_subset_sps, aps_svc_nalu_ext[1]);
717*495ae853SAndroid Build Coastguard Worker 
718*495ae853SAndroid Build Coastguard Worker             RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
719*495ae853SAndroid Build Coastguard Worker 
720*495ae853SAndroid Build Coastguard Worker             ps_slice_hdr = &ps_svc_slice_hdr->s_slice_header;
721*495ae853SAndroid Build Coastguard Worker         }
722*495ae853SAndroid Build Coastguard Worker         else
723*495ae853SAndroid Build Coastguard Worker         {
724*495ae853SAndroid Build Coastguard Worker             ps_pps = ps_entropy->ps_pps_base;
725*495ae853SAndroid Build Coastguard Worker             ps_sps = ps_entropy->ps_sps_base;
726*495ae853SAndroid Build Coastguard Worker 
727*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code = isvce_populate_slice_header(
728*495ae853SAndroid Build Coastguard Worker                 ps_proc, ps_slice_hdr, ps_pps, ps_sps, aps_svc_nalu_ext[0]->u1_idr_flag);
729*495ae853SAndroid Build Coastguard Worker 
730*495ae853SAndroid Build Coastguard Worker             RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
731*495ae853SAndroid Build Coastguard Worker         }
732*495ae853SAndroid Build Coastguard Worker 
733*495ae853SAndroid Build Coastguard Worker         /* generate sei */
734*495ae853SAndroid Build Coastguard Worker         u4_insert_per_idr = (NAL_SLICE_IDR == ps_slice_hdr->i1_nal_unit_type);
735*495ae853SAndroid Build Coastguard Worker 
736*495ae853SAndroid Build Coastguard Worker         memset(&s_sei, 0, sizeof(sei_params_t));
737*495ae853SAndroid Build Coastguard Worker         s_sei.u1_sei_mdcv_params_present_flag =
738*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.s_sei.u1_sei_mdcv_params_present_flag;
739*495ae853SAndroid Build Coastguard Worker         s_sei.s_sei_mdcv_params = ps_codec->s_cfg.s_sei.s_sei_mdcv_params;
740*495ae853SAndroid Build Coastguard Worker         s_sei.u1_sei_cll_params_present_flag = ps_codec->s_cfg.s_sei.u1_sei_cll_params_present_flag;
741*495ae853SAndroid Build Coastguard Worker         s_sei.s_sei_cll_params = ps_codec->s_cfg.s_sei.s_sei_cll_params;
742*495ae853SAndroid Build Coastguard Worker         s_sei.u1_sei_ave_params_present_flag = ps_codec->s_cfg.s_sei.u1_sei_ave_params_present_flag;
743*495ae853SAndroid Build Coastguard Worker         s_sei.s_sei_ave_params = ps_codec->s_cfg.s_sei.s_sei_ave_params;
744*495ae853SAndroid Build Coastguard Worker         s_sei.u1_sei_ccv_params_present_flag = 0;
745*495ae853SAndroid Build Coastguard Worker         s_sei.s_sei_ccv_params =
746*495ae853SAndroid Build Coastguard Worker             ps_codec->as_inp_list[ps_codec->i4_poc % SVC_MAX_NUM_INP_FRAMES].s_inp_props.s_sei_ccv;
747*495ae853SAndroid Build Coastguard Worker 
748*495ae853SAndroid Build Coastguard Worker         if((1 == ps_sps->i1_vui_parameters_present_flag) &&
749*495ae853SAndroid Build Coastguard Worker            (1 == ps_codec->s_cfg.s_vui.u1_video_signal_type_present_flag) &&
750*495ae853SAndroid Build Coastguard Worker            (1 == ps_codec->s_cfg.s_vui.u1_colour_description_present_flag) &&
751*495ae853SAndroid Build Coastguard Worker            (2 != ps_codec->s_cfg.s_vui.u1_colour_primaries) &&
752*495ae853SAndroid Build Coastguard Worker            (2 != ps_codec->s_cfg.s_vui.u1_matrix_coefficients) &&
753*495ae853SAndroid Build Coastguard Worker            (2 != ps_codec->s_cfg.s_vui.u1_transfer_characteristics) &&
754*495ae853SAndroid Build Coastguard Worker            (4 != ps_codec->s_cfg.s_vui.u1_transfer_characteristics) &&
755*495ae853SAndroid Build Coastguard Worker            (5 != ps_codec->s_cfg.s_vui.u1_transfer_characteristics))
756*495ae853SAndroid Build Coastguard Worker         {
757*495ae853SAndroid Build Coastguard Worker             s_sei.u1_sei_ccv_params_present_flag =
758*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_inp_list[ps_codec->i4_poc % SVC_MAX_NUM_INP_FRAMES]
759*495ae853SAndroid Build Coastguard Worker                     .s_inp_props.u1_sei_ccv_params_present_flag;
760*495ae853SAndroid Build Coastguard Worker         }
761*495ae853SAndroid Build Coastguard Worker 
762*495ae853SAndroid Build Coastguard Worker         if((1 == s_sei.u1_sei_mdcv_params_present_flag && u4_insert_per_idr) ||
763*495ae853SAndroid Build Coastguard Worker            (1 == s_sei.u1_sei_cll_params_present_flag && u4_insert_per_idr) ||
764*495ae853SAndroid Build Coastguard Worker            (1 == s_sei.u1_sei_ave_params_present_flag && u4_insert_per_idr) ||
765*495ae853SAndroid Build Coastguard Worker            (1 == s_sei.u1_sei_ccv_params_present_flag))
766*495ae853SAndroid Build Coastguard Worker         {
767*495ae853SAndroid Build Coastguard Worker             ps_non_vcl_nalu_info = isvce_get_next_nalu_info_buf(ps_nalu_descriptor);
768*495ae853SAndroid Build Coastguard Worker             isvce_nalu_info_buf_init(ps_non_vcl_nalu_info,
769*495ae853SAndroid Build Coastguard Worker                                      -((WORD32) isvce_get_num_bits(ps_bitstrm)), NAL_SEI,
770*495ae853SAndroid Build Coastguard Worker                                      ps_proc->u1_spatial_layer_id,
771*495ae853SAndroid Build Coastguard Worker                                      ps_proc->ps_cur_pic->i1_temporal_id, 1, !!ps_proc->u4_is_idr);
772*495ae853SAndroid Build Coastguard Worker 
773*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code = ih264e_generate_sei(ps_bitstrm, &s_sei, u4_insert_per_idr);
774*495ae853SAndroid Build Coastguard Worker             RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
775*495ae853SAndroid Build Coastguard Worker 
776*495ae853SAndroid Build Coastguard Worker             ps_non_vcl_nalu_info->i8_num_bits += isvce_get_num_bits(ps_bitstrm);
777*495ae853SAndroid Build Coastguard Worker             isvce_update_nalu_count(ps_nalu_descriptor);
778*495ae853SAndroid Build Coastguard Worker         }
779*495ae853SAndroid Build Coastguard Worker 
780*495ae853SAndroid Build Coastguard Worker         ps_codec->as_inp_list[ps_codec->i4_poc % SVC_MAX_NUM_INP_FRAMES]
781*495ae853SAndroid Build Coastguard Worker             .s_inp_props.u1_sei_ccv_params_present_flag = 0;
782*495ae853SAndroid Build Coastguard Worker 
783*495ae853SAndroid Build Coastguard Worker         if((ps_proc->u1_spatial_layer_id == 0) &&
784*495ae853SAndroid Build Coastguard Worker            (ps_codec->s_cfg.s_svc_params.u1_num_temporal_layers > 1 ||
785*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers > 1))
786*495ae853SAndroid Build Coastguard Worker         {
787*495ae853SAndroid Build Coastguard Worker             ps_non_vcl_nalu_info = isvce_get_next_nalu_info_buf(ps_nalu_descriptor);
788*495ae853SAndroid Build Coastguard Worker             isvce_nalu_info_buf_init(ps_non_vcl_nalu_info,
789*495ae853SAndroid Build Coastguard Worker                                      -((WORD32) isvce_get_num_bits(ps_bitstrm)), NAL_PREFIX,
790*495ae853SAndroid Build Coastguard Worker                                      ps_proc->u1_spatial_layer_id,
791*495ae853SAndroid Build Coastguard Worker                                      ps_proc->ps_cur_pic->i1_temporal_id, 1, !!ps_proc->u4_is_idr);
792*495ae853SAndroid Build Coastguard Worker 
793*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code =
794*495ae853SAndroid Build Coastguard Worker                 isvce_generate_svc_nalu_extension(ps_bitstrm, aps_svc_nalu_ext[0], NAL_PREFIX);
795*495ae853SAndroid Build Coastguard Worker 
796*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code = isvce_generate_prefix_nal(
797*495ae853SAndroid Build Coastguard Worker                 ps_bitstrm, aps_svc_nalu_ext[0], ps_slice_hdr, ps_sps->u1_max_num_ref_frames,
798*495ae853SAndroid Build Coastguard Worker                 ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers);
799*495ae853SAndroid Build Coastguard Worker             RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
800*495ae853SAndroid Build Coastguard Worker 
801*495ae853SAndroid Build Coastguard Worker             ps_non_vcl_nalu_info->i8_num_bits += isvce_get_num_bits(ps_bitstrm);
802*495ae853SAndroid Build Coastguard Worker             isvce_update_nalu_count(ps_nalu_descriptor);
803*495ae853SAndroid Build Coastguard Worker         }
804*495ae853SAndroid Build Coastguard Worker 
805*495ae853SAndroid Build Coastguard Worker         ps_slice_nalu_info = isvce_get_next_nalu_info_buf(ps_nalu_descriptor);
806*495ae853SAndroid Build Coastguard Worker         isvce_nalu_info_buf_init(ps_slice_nalu_info, -((WORD32) isvce_get_num_bits(ps_bitstrm)),
807*495ae853SAndroid Build Coastguard Worker                                  ps_slice_hdr->i1_nal_unit_type, ps_proc->u1_spatial_layer_id,
808*495ae853SAndroid Build Coastguard Worker                                  ps_proc->ps_cur_pic->i1_temporal_id, 1, !!ps_proc->u4_is_idr);
809*495ae853SAndroid Build Coastguard Worker 
810*495ae853SAndroid Build Coastguard Worker         if(ps_proc->u1_spatial_layer_id > 0)
811*495ae853SAndroid Build Coastguard Worker         {
812*495ae853SAndroid Build Coastguard Worker             ps_subset_sps = ps_entropy->ps_subset_sps_base + ps_proc->u1_spatial_layer_id;
813*495ae853SAndroid Build Coastguard Worker             ps_pps = ps_entropy->ps_pps_base + ps_proc->u1_spatial_layer_id;
814*495ae853SAndroid Build Coastguard Worker 
815*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code = isvce_generate_svc_nalu_extension(
816*495ae853SAndroid Build Coastguard Worker                 ps_bitstrm, aps_svc_nalu_ext[1], NAL_CODED_SLICE_EXTENSION);
817*495ae853SAndroid Build Coastguard Worker 
818*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code = isvce_generate_slice_header_svc(
819*495ae853SAndroid Build Coastguard Worker                 ps_bitstrm, ps_pps, aps_svc_nalu_ext[1], ps_svc_slice_hdr, ps_subset_sps);
820*495ae853SAndroid Build Coastguard Worker 
821*495ae853SAndroid Build Coastguard Worker             RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
822*495ae853SAndroid Build Coastguard Worker         }
823*495ae853SAndroid Build Coastguard Worker         else
824*495ae853SAndroid Build Coastguard Worker         {
825*495ae853SAndroid Build Coastguard Worker             /* generate slice header */
826*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code = isvce_generate_slice_header(
827*495ae853SAndroid Build Coastguard Worker                 ps_bitstrm, ps_slice_hdr, ps_pps, ps_sps, aps_svc_nalu_ext[0]->u1_idr_flag);
828*495ae853SAndroid Build Coastguard Worker 
829*495ae853SAndroid Build Coastguard Worker             RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
830*495ae853SAndroid Build Coastguard Worker         }
831*495ae853SAndroid Build Coastguard Worker 
832*495ae853SAndroid Build Coastguard Worker         /* once start of frame / slice is done, you can reset it */
833*495ae853SAndroid Build Coastguard Worker         /* it is the responsibility of the caller to set this flag */
834*495ae853SAndroid Build Coastguard Worker         ps_entropy->i4_sof = 0;
835*495ae853SAndroid Build Coastguard Worker 
836*495ae853SAndroid Build Coastguard Worker         if(CABAC == ps_entropy->u1_entropy_coding_mode_flag)
837*495ae853SAndroid Build Coastguard Worker         {
838*495ae853SAndroid Build Coastguard Worker             BITSTREAM_BYTE_ALIGN(ps_bitstrm);
839*495ae853SAndroid Build Coastguard Worker             BITSTREAM_FLUSH(ps_bitstrm, ps_entropy->i4_error_code);
840*495ae853SAndroid Build Coastguard Worker             isvce_init_cabac_ctxt(ps_entropy, ps_slice_hdr);
841*495ae853SAndroid Build Coastguard Worker         }
842*495ae853SAndroid Build Coastguard Worker 
843*495ae853SAndroid Build Coastguard Worker #if ENABLE_RE_ENC_AS_SKIP
844*495ae853SAndroid Build Coastguard Worker         ps_bitstrm_after_slice_hdr[0] = ps_bitstrm[0];
845*495ae853SAndroid Build Coastguard Worker #endif
846*495ae853SAndroid Build Coastguard Worker     }
847*495ae853SAndroid Build Coastguard Worker 
848*495ae853SAndroid Build Coastguard Worker     /* begin entropy coding for the mb set */
849*495ae853SAndroid Build Coastguard Worker     while(u4_mb_idx < u4_mb_end_idx)
850*495ae853SAndroid Build Coastguard Worker     {
851*495ae853SAndroid Build Coastguard Worker         mb_bits_info_t s_mb_bits = {
852*495ae853SAndroid Build Coastguard Worker             .i8_header_bits = -((WORD64) ps_entropy->u4_header_bits[i4_slice_type == PSLICE]),
853*495ae853SAndroid Build Coastguard Worker             .i8_texture_bits = -((WORD64) ps_entropy->u4_residue_bits[i4_slice_type == PSLICE])};
854*495ae853SAndroid Build Coastguard Worker 
855*495ae853SAndroid Build Coastguard Worker         /* init ptrs/indices */
856*495ae853SAndroid Build Coastguard Worker         if(ps_entropy->i4_mb_x == i4_wd_mbs)
857*495ae853SAndroid Build Coastguard Worker         {
858*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_mb_y++;
859*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_mb_x = 0;
860*495ae853SAndroid Build Coastguard Worker 
861*495ae853SAndroid Build Coastguard Worker             /* packed mb coeff data */
862*495ae853SAndroid Build Coastguard Worker             ps_entropy->pv_mb_coeff_data = ((UWORD8 *) ps_entropy->pv_pic_mb_coeff_data) +
863*495ae853SAndroid Build Coastguard Worker                                            ps_entropy->i4_mb_y * ps_codec->u4_size_coeff_data;
864*495ae853SAndroid Build Coastguard Worker 
865*495ae853SAndroid Build Coastguard Worker             /* packed mb header data */
866*495ae853SAndroid Build Coastguard Worker             ps_entropy->pv_mb_header_data = ((UWORD8 *) ps_entropy->pv_pic_mb_header_data) +
867*495ae853SAndroid Build Coastguard Worker                                             ps_entropy->i4_mb_y * ps_codec->u4_size_header_data;
868*495ae853SAndroid Build Coastguard Worker 
869*495ae853SAndroid Build Coastguard Worker             /* proc map */
870*495ae853SAndroid Build Coastguard Worker             pu1_proc_map = ps_proc->pu1_proc_map + ps_entropy->i4_mb_y * i4_wd_mbs;
871*495ae853SAndroid Build Coastguard Worker 
872*495ae853SAndroid Build Coastguard Worker             /* entropy map */
873*495ae853SAndroid Build Coastguard Worker             pu1_entropy_map_curr = ps_entropy->pu1_entropy_map + ps_entropy->i4_mb_y * i4_wd_mbs;
874*495ae853SAndroid Build Coastguard Worker         }
875*495ae853SAndroid Build Coastguard Worker 
876*495ae853SAndroid Build Coastguard Worker         DEBUG("\nmb indices x, y %d, %d", ps_entropy->i4_mb_x, ps_entropy->i4_mb_y);
877*495ae853SAndroid Build Coastguard Worker         ENTROPY_TRACE("mb index x %d", ps_entropy->i4_mb_x);
878*495ae853SAndroid Build Coastguard Worker         ENTROPY_TRACE("mb index y %d", ps_entropy->i4_mb_y);
879*495ae853SAndroid Build Coastguard Worker 
880*495ae853SAndroid Build Coastguard Worker         /* wait until the curr mb is core coded */
881*495ae853SAndroid Build Coastguard Worker         /* The wait for curr mb to be core coded is essential when entropy is
882*495ae853SAndroid Build Coastguard Worker          * launched as a separate job
883*495ae853SAndroid Build Coastguard Worker          */
884*495ae853SAndroid Build Coastguard Worker         while(1)
885*495ae853SAndroid Build Coastguard Worker         {
886*495ae853SAndroid Build Coastguard Worker             volatile UWORD8 *pu1_buf1;
887*495ae853SAndroid Build Coastguard Worker             WORD32 idx = ps_entropy->i4_mb_x;
888*495ae853SAndroid Build Coastguard Worker 
889*495ae853SAndroid Build Coastguard Worker             pu1_buf1 = pu1_proc_map + idx;
890*495ae853SAndroid Build Coastguard Worker             if(*pu1_buf1) break;
891*495ae853SAndroid Build Coastguard Worker             ithread_yield();
892*495ae853SAndroid Build Coastguard Worker         }
893*495ae853SAndroid Build Coastguard Worker 
894*495ae853SAndroid Build Coastguard Worker         /* write mb layer */
895*495ae853SAndroid Build Coastguard Worker         ps_entropy->i4_error_code =
896*495ae853SAndroid Build Coastguard Worker             ps_codec->pf_write_mb_syntax_layer[ps_entropy->u1_entropy_coding_mode_flag]
897*495ae853SAndroid Build Coastguard Worker                                               [i4_slice_type](ps_entropy);
898*495ae853SAndroid Build Coastguard Worker         RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
899*495ae853SAndroid Build Coastguard Worker 
900*495ae853SAndroid Build Coastguard Worker         /* Starting bitstream offset for header in bits */
901*495ae853SAndroid Build Coastguard Worker         bitstream_start_offset = isvce_get_num_bits(ps_bitstrm);
902*495ae853SAndroid Build Coastguard Worker 
903*495ae853SAndroid Build Coastguard Worker         /* set entropy map */
904*495ae853SAndroid Build Coastguard Worker         pu1_entropy_map_curr[ps_entropy->i4_mb_x] = 1;
905*495ae853SAndroid Build Coastguard Worker         ASSERT(ps_entropy->i4_mb_x < i4_wd_mbs);
906*495ae853SAndroid Build Coastguard Worker 
907*495ae853SAndroid Build Coastguard Worker         u4_mb_idx++;
908*495ae853SAndroid Build Coastguard Worker         ps_entropy->i4_mb_x++;
909*495ae853SAndroid Build Coastguard Worker         /* check for eof */
910*495ae853SAndroid Build Coastguard Worker         if(CABAC == ps_entropy->u1_entropy_coding_mode_flag)
911*495ae853SAndroid Build Coastguard Worker         {
912*495ae853SAndroid Build Coastguard Worker             if(ps_entropy->i4_mb_x < i4_wd_mbs)
913*495ae853SAndroid Build Coastguard Worker             {
914*495ae853SAndroid Build Coastguard Worker                 isvce_cabac_encode_terminate(ps_cabac_ctxt, 0);
915*495ae853SAndroid Build Coastguard Worker             }
916*495ae853SAndroid Build Coastguard Worker         }
917*495ae853SAndroid Build Coastguard Worker 
918*495ae853SAndroid Build Coastguard Worker         if(ps_entropy->i4_mb_x == i4_wd_mbs)
919*495ae853SAndroid Build Coastguard Worker         {
920*495ae853SAndroid Build Coastguard Worker             /* if slices are enabled */
921*495ae853SAndroid Build Coastguard Worker             if(ps_codec->s_cfg.e_slice_mode == IVE_SLICE_MODE_BLOCKS)
922*495ae853SAndroid Build Coastguard Worker             {
923*495ae853SAndroid Build Coastguard Worker                 /* current slice index */
924*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_curr_slice_idx = ps_entropy->i4_cur_slice_idx;
925*495ae853SAndroid Build Coastguard Worker 
926*495ae853SAndroid Build Coastguard Worker                 /* slice map */
927*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_slice_idx = ps_entropy->pu1_slice_idx;
928*495ae853SAndroid Build Coastguard Worker 
929*495ae853SAndroid Build Coastguard Worker                 /* No need to open a slice at end of frame. The current slice can be
930*495ae853SAndroid Build Coastguard Worker                  * closed at the time of signaling eof flag.
931*495ae853SAndroid Build Coastguard Worker                  */
932*495ae853SAndroid Build Coastguard Worker                 if((u4_mb_idx != u4_mb_cnt) && (i4_curr_slice_idx != pu1_slice_idx[u4_mb_idx]))
933*495ae853SAndroid Build Coastguard Worker                 {
934*495ae853SAndroid Build Coastguard Worker                     if(CAVLC == ps_entropy->u1_entropy_coding_mode_flag)
935*495ae853SAndroid Build Coastguard Worker                     { /* mb skip run */
936*495ae853SAndroid Build Coastguard Worker                         if((i4_slice_type != ISLICE) && *ps_entropy->pi4_mb_skip_run)
937*495ae853SAndroid Build Coastguard Worker                         {
938*495ae853SAndroid Build Coastguard Worker                             if(*ps_entropy->pi4_mb_skip_run)
939*495ae853SAndroid Build Coastguard Worker                             {
940*495ae853SAndroid Build Coastguard Worker                                 PUT_BITS_UEV(ps_bitstrm, *ps_entropy->pi4_mb_skip_run,
941*495ae853SAndroid Build Coastguard Worker                                              ps_entropy->i4_error_code, "mb skip run");
942*495ae853SAndroid Build Coastguard Worker                                 *ps_entropy->pi4_mb_skip_run = 0;
943*495ae853SAndroid Build Coastguard Worker                                 RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
944*495ae853SAndroid Build Coastguard Worker                             }
945*495ae853SAndroid Build Coastguard Worker                         }
946*495ae853SAndroid Build Coastguard Worker                         /* put rbsp trailing bits for the previous slice */
947*495ae853SAndroid Build Coastguard Worker                         ps_entropy->i4_error_code = ih264e_put_rbsp_trailing_bits(ps_bitstrm);
948*495ae853SAndroid Build Coastguard Worker                         RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
949*495ae853SAndroid Build Coastguard Worker                     }
950*495ae853SAndroid Build Coastguard Worker                     else
951*495ae853SAndroid Build Coastguard Worker                     {
952*495ae853SAndroid Build Coastguard Worker                         isvce_cabac_encode_terminate(ps_cabac_ctxt, 1);
953*495ae853SAndroid Build Coastguard Worker                     }
954*495ae853SAndroid Build Coastguard Worker 
955*495ae853SAndroid Build Coastguard Worker                     /* update slice header pointer */
956*495ae853SAndroid Build Coastguard Worker                     i4_curr_slice_idx = pu1_slice_idx[u4_mb_idx];
957*495ae853SAndroid Build Coastguard Worker                     ps_entropy->i4_cur_slice_idx = i4_curr_slice_idx;
958*495ae853SAndroid Build Coastguard Worker                     ps_slice_hdr =
959*495ae853SAndroid Build Coastguard Worker                         ps_entropy->ps_slice_hdr_base + (i4_curr_slice_idx % SVC_MAX_SLICE_HDR_CNT);
960*495ae853SAndroid Build Coastguard Worker 
961*495ae853SAndroid Build Coastguard Worker                     ps_entropy->u1_spatial_layer_id = ps_proc->u1_spatial_layer_id;
962*495ae853SAndroid Build Coastguard Worker 
963*495ae853SAndroid Build Coastguard Worker                     /* populate slice header */
964*495ae853SAndroid Build Coastguard Worker                     ps_entropy->i4_mb_start_add = u4_mb_idx;
965*495ae853SAndroid Build Coastguard Worker 
966*495ae853SAndroid Build Coastguard Worker                     /* generate slice header */
967*495ae853SAndroid Build Coastguard Worker                     if(ps_proc->u1_spatial_layer_id > 0)
968*495ae853SAndroid Build Coastguard Worker                     {
969*495ae853SAndroid Build Coastguard Worker                         ps_entropy->i4_error_code =
970*495ae853SAndroid Build Coastguard Worker                             isvce_generate_slice_header_svc(ps_bitstrm, ps_pps, aps_svc_nalu_ext[1],
971*495ae853SAndroid Build Coastguard Worker                                                             ps_svc_slice_hdr, ps_subset_sps);
972*495ae853SAndroid Build Coastguard Worker 
973*495ae853SAndroid Build Coastguard Worker                         RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
974*495ae853SAndroid Build Coastguard Worker 
975*495ae853SAndroid Build Coastguard Worker                         ps_slice_hdr = &ps_svc_slice_hdr->s_slice_header;
976*495ae853SAndroid Build Coastguard Worker                     }
977*495ae853SAndroid Build Coastguard Worker                     else
978*495ae853SAndroid Build Coastguard Worker                     {
979*495ae853SAndroid Build Coastguard Worker                         ps_entropy->i4_error_code =
980*495ae853SAndroid Build Coastguard Worker                             isvce_populate_slice_header(ps_proc, ps_slice_hdr, ps_pps, ps_sps,
981*495ae853SAndroid Build Coastguard Worker                                                         aps_svc_nalu_ext[0]->u1_idr_flag);
982*495ae853SAndroid Build Coastguard Worker 
983*495ae853SAndroid Build Coastguard Worker                         RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
984*495ae853SAndroid Build Coastguard Worker 
985*495ae853SAndroid Build Coastguard Worker                         ps_entropy->i4_error_code =
986*495ae853SAndroid Build Coastguard Worker                             isvce_generate_slice_header(ps_bitstrm, ps_slice_hdr, ps_pps, ps_sps,
987*495ae853SAndroid Build Coastguard Worker                                                         aps_svc_nalu_ext[0]->u1_idr_flag);
988*495ae853SAndroid Build Coastguard Worker 
989*495ae853SAndroid Build Coastguard Worker                         RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
990*495ae853SAndroid Build Coastguard Worker                     }
991*495ae853SAndroid Build Coastguard Worker 
992*495ae853SAndroid Build Coastguard Worker                     if(CABAC == ps_entropy->u1_entropy_coding_mode_flag)
993*495ae853SAndroid Build Coastguard Worker                     {
994*495ae853SAndroid Build Coastguard Worker                         BITSTREAM_BYTE_ALIGN(ps_bitstrm);
995*495ae853SAndroid Build Coastguard Worker                         BITSTREAM_FLUSH(ps_bitstrm, ps_entropy->i4_error_code);
996*495ae853SAndroid Build Coastguard Worker                         isvce_init_cabac_ctxt(ps_entropy, ps_slice_hdr);
997*495ae853SAndroid Build Coastguard Worker                     }
998*495ae853SAndroid Build Coastguard Worker                 }
999*495ae853SAndroid Build Coastguard Worker                 else
1000*495ae853SAndroid Build Coastguard Worker                 {
1001*495ae853SAndroid Build Coastguard Worker                     if(CABAC == ps_entropy->u1_entropy_coding_mode_flag && u4_mb_idx != u4_mb_cnt)
1002*495ae853SAndroid Build Coastguard Worker                     {
1003*495ae853SAndroid Build Coastguard Worker                         isvce_cabac_encode_terminate(ps_cabac_ctxt, 0);
1004*495ae853SAndroid Build Coastguard Worker                     }
1005*495ae853SAndroid Build Coastguard Worker                 }
1006*495ae853SAndroid Build Coastguard Worker             }
1007*495ae853SAndroid Build Coastguard Worker         }
1008*495ae853SAndroid Build Coastguard Worker 
1009*495ae853SAndroid Build Coastguard Worker         /* Ending bitstream offset for header in bits */
1010*495ae853SAndroid Build Coastguard Worker         bitstream_end_offset = isvce_get_num_bits(ps_bitstrm);
1011*495ae853SAndroid Build Coastguard Worker         ps_entropy->u4_header_bits[i4_slice_type == PSLICE] +=
1012*495ae853SAndroid Build Coastguard Worker             bitstream_end_offset - bitstream_start_offset;
1013*495ae853SAndroid Build Coastguard Worker 
1014*495ae853SAndroid Build Coastguard Worker         {
1015*495ae853SAndroid Build Coastguard Worker             svc_sub_pic_rc_ctxt_t *ps_sub_pic_rc_ctxt = ps_proc->ps_sub_pic_rc_ctxt;
1016*495ae853SAndroid Build Coastguard Worker             svc_sub_pic_rc_entropy_variables_t *ps_sub_pic_rc_variables =
1017*495ae853SAndroid Build Coastguard Worker                 &ps_sub_pic_rc_ctxt->s_sub_pic_rc_entropy_variables;
1018*495ae853SAndroid Build Coastguard Worker 
1019*495ae853SAndroid Build Coastguard Worker             s_mb_bits.i8_header_bits += ps_entropy->u4_header_bits[i4_slice_type == PSLICE];
1020*495ae853SAndroid Build Coastguard Worker             s_mb_bits.i8_texture_bits += ps_entropy->u4_residue_bits[i4_slice_type == PSLICE];
1021*495ae853SAndroid Build Coastguard Worker 
1022*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->s_mb_bits = s_mb_bits;
1023*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->u1_spatial_layer_id = ps_proc->u1_spatial_layer_id;
1024*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->s_mb_pos.i4_abscissa = ps_entropy->i4_mb_x - 1;
1025*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->s_mb_pos.i4_ordinate = ps_entropy->i4_mb_y;
1026*495ae853SAndroid Build Coastguard Worker 
1027*495ae853SAndroid Build Coastguard Worker             isvce_sub_pic_rc_get_entropy_data(ps_proc->ps_sub_pic_rc_ctxt);
1028*495ae853SAndroid Build Coastguard Worker         }
1029*495ae853SAndroid Build Coastguard Worker     }
1030*495ae853SAndroid Build Coastguard Worker 
1031*495ae853SAndroid Build Coastguard Worker     /* check for eof */
1032*495ae853SAndroid Build Coastguard Worker     if(u4_mb_idx == u4_mb_cnt)
1033*495ae853SAndroid Build Coastguard Worker     {
1034*495ae853SAndroid Build Coastguard Worker         /* set end of frame flag */
1035*495ae853SAndroid Build Coastguard Worker         ps_entropy->i4_eof = 1;
1036*495ae853SAndroid Build Coastguard Worker     }
1037*495ae853SAndroid Build Coastguard Worker     else
1038*495ae853SAndroid Build Coastguard Worker     {
1039*495ae853SAndroid Build Coastguard Worker         if(CABAC == ps_entropy->u1_entropy_coding_mode_flag &&
1040*495ae853SAndroid Build Coastguard Worker            ps_codec->s_cfg.e_slice_mode != IVE_SLICE_MODE_BLOCKS)
1041*495ae853SAndroid Build Coastguard Worker         {
1042*495ae853SAndroid Build Coastguard Worker             isvce_cabac_encode_terminate(ps_cabac_ctxt, 0);
1043*495ae853SAndroid Build Coastguard Worker         }
1044*495ae853SAndroid Build Coastguard Worker     }
1045*495ae853SAndroid Build Coastguard Worker 
1046*495ae853SAndroid Build Coastguard Worker     if(ps_entropy->i4_eof)
1047*495ae853SAndroid Build Coastguard Worker     {
1048*495ae853SAndroid Build Coastguard Worker         if(CAVLC == ps_entropy->u1_entropy_coding_mode_flag)
1049*495ae853SAndroid Build Coastguard Worker         {
1050*495ae853SAndroid Build Coastguard Worker             /* mb skip run */
1051*495ae853SAndroid Build Coastguard Worker             if((i4_slice_type != ISLICE) && *ps_entropy->pi4_mb_skip_run)
1052*495ae853SAndroid Build Coastguard Worker             {
1053*495ae853SAndroid Build Coastguard Worker                 if(*ps_entropy->pi4_mb_skip_run)
1054*495ae853SAndroid Build Coastguard Worker                 {
1055*495ae853SAndroid Build Coastguard Worker                     PUT_BITS_UEV(ps_bitstrm, *ps_entropy->pi4_mb_skip_run,
1056*495ae853SAndroid Build Coastguard Worker                                  ps_entropy->i4_error_code, "mb skip run");
1057*495ae853SAndroid Build Coastguard Worker                     *ps_entropy->pi4_mb_skip_run = 0;
1058*495ae853SAndroid Build Coastguard Worker                     RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
1059*495ae853SAndroid Build Coastguard Worker                 }
1060*495ae853SAndroid Build Coastguard Worker             }
1061*495ae853SAndroid Build Coastguard Worker             /* put rbsp trailing bits */
1062*495ae853SAndroid Build Coastguard Worker             ps_entropy->i4_error_code = ih264e_put_rbsp_trailing_bits(ps_bitstrm);
1063*495ae853SAndroid Build Coastguard Worker             RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
1064*495ae853SAndroid Build Coastguard Worker         }
1065*495ae853SAndroid Build Coastguard Worker         else
1066*495ae853SAndroid Build Coastguard Worker         {
1067*495ae853SAndroid Build Coastguard Worker             isvce_cabac_encode_terminate(ps_cabac_ctxt, 1);
1068*495ae853SAndroid Build Coastguard Worker         }
1069*495ae853SAndroid Build Coastguard Worker 
1070*495ae853SAndroid Build Coastguard Worker         /* update current frame stats to rc library */
1071*495ae853SAndroid Build Coastguard Worker         /* number of bytes to stuff */
1072*495ae853SAndroid Build Coastguard Worker         {
1073*495ae853SAndroid Build Coastguard Worker             WORD32 i4_stuff_bytes;
1074*495ae853SAndroid Build Coastguard Worker 
1075*495ae853SAndroid Build Coastguard Worker             /* update */
1076*495ae853SAndroid Build Coastguard Worker             i4_stuff_bytes = isvce_update_rc_post_enc(ps_codec, ctxt_sel, (ps_codec->i4_poc == 0));
1077*495ae853SAndroid Build Coastguard Worker 
1078*495ae853SAndroid Build Coastguard Worker             if(ps_proc->u1_spatial_layer_id == (ps_proc->s_svc_params.u1_num_spatial_layers - 1))
1079*495ae853SAndroid Build Coastguard Worker             {
1080*495ae853SAndroid Build Coastguard Worker                 /* cbr rc - house keeping */
1081*495ae853SAndroid Build Coastguard Worker                 if(ps_codec->s_rate_control.post_encode_skip[ctxt_sel])
1082*495ae853SAndroid Build Coastguard Worker                 {
1083*495ae853SAndroid Build Coastguard Worker                     ps_entropy->ps_bitstrm->u4_strm_buf_offset = 0;
1084*495ae853SAndroid Build Coastguard Worker                 }
1085*495ae853SAndroid Build Coastguard Worker                 else if(i4_stuff_bytes > 0)
1086*495ae853SAndroid Build Coastguard Worker                 {
1087*495ae853SAndroid Build Coastguard Worker                     /* add filler nal units */
1088*495ae853SAndroid Build Coastguard Worker                     ps_entropy->i4_error_code =
1089*495ae853SAndroid Build Coastguard Worker                         ih264e_add_filler_nal_unit(ps_bitstrm, i4_stuff_bytes);
1090*495ae853SAndroid Build Coastguard Worker                     RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
1091*495ae853SAndroid Build Coastguard Worker                 }
1092*495ae853SAndroid Build Coastguard Worker             }
1093*495ae853SAndroid Build Coastguard Worker         }
1094*495ae853SAndroid Build Coastguard Worker 
1095*495ae853SAndroid Build Coastguard Worker         /*
1096*495ae853SAndroid Build Coastguard Worker          *Frame number is to be incremented only if the current frame is a
1097*495ae853SAndroid Build Coastguard Worker          * reference frame. After each successful frame encode, we increment
1098*495ae853SAndroid Build Coastguard Worker          * frame number by 1
1099*495ae853SAndroid Build Coastguard Worker          */
1100*495ae853SAndroid Build Coastguard Worker         if(!ps_codec->s_rate_control.post_encode_skip[ctxt_sel] && ps_codec->u4_is_curr_frm_ref &&
1101*495ae853SAndroid Build Coastguard Worker            (ps_proc->u1_spatial_layer_id == ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers - 1))
1102*495ae853SAndroid Build Coastguard Worker         {
1103*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_frame_num++;
1104*495ae853SAndroid Build Coastguard Worker         }
1105*495ae853SAndroid Build Coastguard Worker 
1106*495ae853SAndroid Build Coastguard Worker         /********************************************************************/
1107*495ae853SAndroid Build Coastguard Worker         /*      signal the output                                           */
1108*495ae853SAndroid Build Coastguard Worker         /********************************************************************/
1109*495ae853SAndroid Build Coastguard Worker         ps_codec->as_out_buf[ctxt_sel].as_bits_buf[ps_entropy->u1_spatial_layer_id].u4_bytes =
1110*495ae853SAndroid Build Coastguard Worker             ps_bitstrm->u4_strm_buf_offset;
1111*495ae853SAndroid Build Coastguard Worker 
1112*495ae853SAndroid Build Coastguard Worker         ps_slice_nalu_info = isvce_get_next_nalu_info_buf(ps_nalu_descriptor);
1113*495ae853SAndroid Build Coastguard Worker         ps_slice_nalu_info->i8_num_bits += isvce_get_num_bits(ps_bitstrm);
1114*495ae853SAndroid Build Coastguard Worker         isvce_update_nalu_count(ps_nalu_descriptor);
1115*495ae853SAndroid Build Coastguard Worker 
1116*495ae853SAndroid Build Coastguard Worker         DEBUG("entropy status %x", ps_entropy->i4_error_code);
1117*495ae853SAndroid Build Coastguard Worker         ps_entropy->i4_eof = 0;
1118*495ae853SAndroid Build Coastguard Worker     }
1119*495ae853SAndroid Build Coastguard Worker 
1120*495ae853SAndroid Build Coastguard Worker     /* Dont execute any further instructions until store synchronization took
1121*495ae853SAndroid Build Coastguard Worker      * place */
1122*495ae853SAndroid Build Coastguard Worker     DATA_SYNC();
1123*495ae853SAndroid Build Coastguard Worker 
1124*495ae853SAndroid Build Coastguard Worker     /* allow threads to dequeue entropy jobs */
1125*495ae853SAndroid Build Coastguard Worker     ps_codec->ae_entropy_thread_exit_state[ctxt_sel] = INACTIVE;
1126*495ae853SAndroid Build Coastguard Worker 
1127*495ae853SAndroid Build Coastguard Worker     return ps_entropy->i4_error_code;
1128*495ae853SAndroid Build Coastguard Worker }
1129*495ae853SAndroid Build Coastguard Worker 
1130*495ae853SAndroid Build Coastguard Worker /**
1131*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1132*495ae853SAndroid Build Coastguard Worker *
1133*495ae853SAndroid Build Coastguard Worker * @brief Packs header information of a mb in to a buffer
1134*495ae853SAndroid Build Coastguard Worker *
1135*495ae853SAndroid Build Coastguard Worker * @par Description:
1136*495ae853SAndroid Build Coastguard Worker *  After the deciding the mode info of a macroblock, the syntax elements
1137*495ae853SAndroid Build Coastguard Worker *  associated with the mb are packed and stored. The entropy thread unpacks
1138*495ae853SAndroid Build Coastguard Worker *  this buffer and generates the end bit stream.
1139*495ae853SAndroid Build Coastguard Worker *
1140*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc
1141*495ae853SAndroid Build Coastguard Worker *  Pointer to the current process context
1142*495ae853SAndroid Build Coastguard Worker *
1143*495ae853SAndroid Build Coastguard Worker * @returns error status
1144*495ae853SAndroid Build Coastguard Worker *
1145*495ae853SAndroid Build Coastguard Worker * @remarks none
1146*495ae853SAndroid Build Coastguard Worker *
1147*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1148*495ae853SAndroid Build Coastguard Worker */
isvce_pack_header_data(isvce_process_ctxt_t * ps_proc)1149*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_pack_header_data(isvce_process_ctxt_t *ps_proc)
1150*495ae853SAndroid Build Coastguard Worker {
1151*495ae853SAndroid Build Coastguard Worker     /* curr mb type */
1152*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_mb_type = ps_proc->ps_mb_info->u2_mb_type;
1153*495ae853SAndroid Build Coastguard Worker 
1154*495ae853SAndroid Build Coastguard Worker     /* pack mb syntax layer of curr mb (used for entropy coding) */
1155*495ae853SAndroid Build Coastguard Worker     if(u4_mb_type == I4x4)
1156*495ae853SAndroid Build Coastguard Worker     {
1157*495ae853SAndroid Build Coastguard Worker         /* pointer to mb header storage space */
1158*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
1159*495ae853SAndroid Build Coastguard Worker         isvce_mb_hdr_i4x4_t *ps_mb_hdr = (isvce_mb_hdr_i4x4_t *) ps_proc->pv_mb_header_data;
1160*495ae853SAndroid Build Coastguard Worker 
1161*495ae853SAndroid Build Coastguard Worker         /* temp var */
1162*495ae853SAndroid Build Coastguard Worker         WORD32 i4, byte;
1163*495ae853SAndroid Build Coastguard Worker 
1164*495ae853SAndroid Build Coastguard Worker         /* mb type plus mode */
1165*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_type_mode = (ps_proc->u1_c_i8_mode << 6) + u4_mb_type;
1166*495ae853SAndroid Build Coastguard Worker 
1167*495ae853SAndroid Build Coastguard Worker         /* cbp */
1168*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
1169*495ae853SAndroid Build Coastguard Worker 
1170*495ae853SAndroid Build Coastguard Worker         /* mb qp delta */
1171*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_qp = ps_proc->u1_mb_qp;
1172*495ae853SAndroid Build Coastguard Worker 
1173*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_residual_prediction_flag =
1174*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_residual_prediction_flag;
1175*495ae853SAndroid Build Coastguard Worker 
1176*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_base_mode_flag = ps_proc->ps_mb_info->u1_base_mode_flag;
1177*495ae853SAndroid Build Coastguard Worker 
1178*495ae853SAndroid Build Coastguard Worker         /* sub mb modes */
1179*495ae853SAndroid Build Coastguard Worker         for(i4 = 0; i4 < 16; i4++)
1180*495ae853SAndroid Build Coastguard Worker         {
1181*495ae853SAndroid Build Coastguard Worker             byte = 0;
1182*495ae853SAndroid Build Coastguard Worker 
1183*495ae853SAndroid Build Coastguard Worker             if(ps_proc->au1_predicted_intra_luma_mb_4x4_modes[i4] ==
1184*495ae853SAndroid Build Coastguard Worker                ps_proc->au1_intra_luma_mb_4x4_modes[i4])
1185*495ae853SAndroid Build Coastguard Worker             {
1186*495ae853SAndroid Build Coastguard Worker                 byte |= 1;
1187*495ae853SAndroid Build Coastguard Worker             }
1188*495ae853SAndroid Build Coastguard Worker             else
1189*495ae853SAndroid Build Coastguard Worker             {
1190*495ae853SAndroid Build Coastguard Worker                 if(ps_proc->au1_intra_luma_mb_4x4_modes[i4] <
1191*495ae853SAndroid Build Coastguard Worker                    ps_proc->au1_predicted_intra_luma_mb_4x4_modes[i4])
1192*495ae853SAndroid Build Coastguard Worker                 {
1193*495ae853SAndroid Build Coastguard Worker                     byte |= (ps_proc->au1_intra_luma_mb_4x4_modes[i4] << 1);
1194*495ae853SAndroid Build Coastguard Worker                 }
1195*495ae853SAndroid Build Coastguard Worker                 else
1196*495ae853SAndroid Build Coastguard Worker                 {
1197*495ae853SAndroid Build Coastguard Worker                     byte |= (ps_proc->au1_intra_luma_mb_4x4_modes[i4] - 1) << 1;
1198*495ae853SAndroid Build Coastguard Worker                 }
1199*495ae853SAndroid Build Coastguard Worker             }
1200*495ae853SAndroid Build Coastguard Worker 
1201*495ae853SAndroid Build Coastguard Worker             i4++;
1202*495ae853SAndroid Build Coastguard Worker 
1203*495ae853SAndroid Build Coastguard Worker             if(ps_proc->au1_predicted_intra_luma_mb_4x4_modes[i4] ==
1204*495ae853SAndroid Build Coastguard Worker                ps_proc->au1_intra_luma_mb_4x4_modes[i4])
1205*495ae853SAndroid Build Coastguard Worker             {
1206*495ae853SAndroid Build Coastguard Worker                 byte |= 16;
1207*495ae853SAndroid Build Coastguard Worker             }
1208*495ae853SAndroid Build Coastguard Worker             else
1209*495ae853SAndroid Build Coastguard Worker             {
1210*495ae853SAndroid Build Coastguard Worker                 if(ps_proc->au1_intra_luma_mb_4x4_modes[i4] <
1211*495ae853SAndroid Build Coastguard Worker                    ps_proc->au1_predicted_intra_luma_mb_4x4_modes[i4])
1212*495ae853SAndroid Build Coastguard Worker                 {
1213*495ae853SAndroid Build Coastguard Worker                     byte |= (ps_proc->au1_intra_luma_mb_4x4_modes[i4] << 5);
1214*495ae853SAndroid Build Coastguard Worker                 }
1215*495ae853SAndroid Build Coastguard Worker                 else
1216*495ae853SAndroid Build Coastguard Worker                 {
1217*495ae853SAndroid Build Coastguard Worker                     byte |= (ps_proc->au1_intra_luma_mb_4x4_modes[i4] - 1) << 5;
1218*495ae853SAndroid Build Coastguard Worker                 }
1219*495ae853SAndroid Build Coastguard Worker             }
1220*495ae853SAndroid Build Coastguard Worker 
1221*495ae853SAndroid Build Coastguard Worker             ps_mb_hdr->au1_sub_blk_modes[i4 >> 1] = byte;
1222*495ae853SAndroid Build Coastguard Worker         }
1223*495ae853SAndroid Build Coastguard Worker 
1224*495ae853SAndroid Build Coastguard Worker         /* end of mb layer */
1225*495ae853SAndroid Build Coastguard Worker         pu1_ptr += sizeof(isvce_mb_hdr_i4x4_t);
1226*495ae853SAndroid Build Coastguard Worker         ps_proc->pv_mb_header_data = pu1_ptr;
1227*495ae853SAndroid Build Coastguard Worker     }
1228*495ae853SAndroid Build Coastguard Worker     else if(u4_mb_type == I16x16)
1229*495ae853SAndroid Build Coastguard Worker     {
1230*495ae853SAndroid Build Coastguard Worker         /* pointer to mb header storage space */
1231*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
1232*495ae853SAndroid Build Coastguard Worker         isvce_mb_hdr_i16x16_t *ps_mb_hdr = (isvce_mb_hdr_i16x16_t *) ps_proc->pv_mb_header_data;
1233*495ae853SAndroid Build Coastguard Worker 
1234*495ae853SAndroid Build Coastguard Worker         /* mb type plus mode */
1235*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_type_mode =
1236*495ae853SAndroid Build Coastguard Worker             (ps_proc->u1_c_i8_mode << 6) + (ps_proc->u1_l_i16_mode << 4) + u4_mb_type;
1237*495ae853SAndroid Build Coastguard Worker 
1238*495ae853SAndroid Build Coastguard Worker         /* cbp */
1239*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
1240*495ae853SAndroid Build Coastguard Worker 
1241*495ae853SAndroid Build Coastguard Worker         /* mb qp delta */
1242*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_qp = ps_proc->u1_mb_qp;
1243*495ae853SAndroid Build Coastguard Worker 
1244*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_residual_prediction_flag =
1245*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_residual_prediction_flag;
1246*495ae853SAndroid Build Coastguard Worker 
1247*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_base_mode_flag = ps_proc->ps_mb_info->u1_base_mode_flag;
1248*495ae853SAndroid Build Coastguard Worker 
1249*495ae853SAndroid Build Coastguard Worker         /* end of mb layer */
1250*495ae853SAndroid Build Coastguard Worker         pu1_ptr += sizeof(isvce_mb_hdr_i16x16_t);
1251*495ae853SAndroid Build Coastguard Worker         ps_proc->pv_mb_header_data = pu1_ptr;
1252*495ae853SAndroid Build Coastguard Worker     }
1253*495ae853SAndroid Build Coastguard Worker     else if(u4_mb_type == P16x16)
1254*495ae853SAndroid Build Coastguard Worker     {
1255*495ae853SAndroid Build Coastguard Worker         /* pointer to mb header storage space */
1256*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
1257*495ae853SAndroid Build Coastguard Worker         isvce_mb_hdr_p16x16_t *ps_mb_hdr = (isvce_mb_hdr_p16x16_t *) ps_proc->pv_mb_header_data;
1258*495ae853SAndroid Build Coastguard Worker 
1259*495ae853SAndroid Build Coastguard Worker         /* mb type */
1260*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;
1261*495ae853SAndroid Build Coastguard Worker 
1262*495ae853SAndroid Build Coastguard Worker         /* cbp */
1263*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
1264*495ae853SAndroid Build Coastguard Worker 
1265*495ae853SAndroid Build Coastguard Worker         /* mb qp delta */
1266*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_qp = ps_proc->u1_mb_qp;
1267*495ae853SAndroid Build Coastguard Worker 
1268*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_residual_prediction_flag =
1269*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_residual_prediction_flag;
1270*495ae853SAndroid Build Coastguard Worker 
1271*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_base_mode_flag = ps_proc->ps_mb_info->u1_base_mode_flag;
1272*495ae853SAndroid Build Coastguard Worker 
1273*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->u1_mvp_idx = ps_proc->ps_mb_info->as_pu->au1_mvp_idx[L0];
1274*495ae853SAndroid Build Coastguard Worker 
1275*495ae853SAndroid Build Coastguard Worker         if(0 == ps_proc->ps_mb_info->as_pu->au1_mvp_idx[L0])
1276*495ae853SAndroid Build Coastguard Worker         {
1277*495ae853SAndroid Build Coastguard Worker             ps_mb_hdr->ai2_mvd[0] = ps_proc->ps_mb_info->as_pu->as_me_info[L0].s_mv.i2_mvx -
1278*495ae853SAndroid Build Coastguard Worker                                     ps_proc->ps_pred_mv[L0].s_mv.i2_mvx;
1279*495ae853SAndroid Build Coastguard Worker             ps_mb_hdr->ai2_mvd[1] = ps_proc->ps_mb_info->as_pu->as_me_info[L0].s_mv.i2_mvy -
1280*495ae853SAndroid Build Coastguard Worker                                     ps_proc->ps_pred_mv[L0].s_mv.i2_mvy;
1281*495ae853SAndroid Build Coastguard Worker         }
1282*495ae853SAndroid Build Coastguard Worker         else
1283*495ae853SAndroid Build Coastguard Worker         {
1284*495ae853SAndroid Build Coastguard Worker             ps_mb_hdr->ai2_mvd[0] = ps_proc->ps_mb_info->as_pu->as_me_info[L0].s_mv.i2_mvx -
1285*495ae853SAndroid Build Coastguard Worker                                     ps_proc->ps_ilp_mv->as_mv[0][L0].s_mv.i2_mvx;
1286*495ae853SAndroid Build Coastguard Worker             ps_mb_hdr->ai2_mvd[1] = ps_proc->ps_mb_info->as_pu->as_me_info[L0].s_mv.i2_mvy -
1287*495ae853SAndroid Build Coastguard Worker                                     ps_proc->ps_ilp_mv->as_mv[0][L0].s_mv.i2_mvy;
1288*495ae853SAndroid Build Coastguard Worker         }
1289*495ae853SAndroid Build Coastguard Worker 
1290*495ae853SAndroid Build Coastguard Worker         /* end of mb layer */
1291*495ae853SAndroid Build Coastguard Worker         pu1_ptr += sizeof(isvce_mb_hdr_p16x16_t);
1292*495ae853SAndroid Build Coastguard Worker         ps_proc->pv_mb_header_data = pu1_ptr;
1293*495ae853SAndroid Build Coastguard Worker     }
1294*495ae853SAndroid Build Coastguard Worker     else if(u4_mb_type == PSKIP)
1295*495ae853SAndroid Build Coastguard Worker     {
1296*495ae853SAndroid Build Coastguard Worker         /* pointer to mb header storage space */
1297*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
1298*495ae853SAndroid Build Coastguard Worker         isvce_mb_hdr_pskip_t *ps_mb_hdr = (isvce_mb_hdr_pskip_t *) ps_proc->pv_mb_header_data;
1299*495ae853SAndroid Build Coastguard Worker 
1300*495ae853SAndroid Build Coastguard Worker         /* mb type */
1301*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;
1302*495ae853SAndroid Build Coastguard Worker 
1303*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_residual_prediction_flag =
1304*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_residual_prediction_flag;
1305*495ae853SAndroid Build Coastguard Worker 
1306*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_base_mode_flag = ps_proc->ps_mb_info->u1_base_mode_flag;
1307*495ae853SAndroid Build Coastguard Worker 
1308*495ae853SAndroid Build Coastguard Worker         /* end of mb layer */
1309*495ae853SAndroid Build Coastguard Worker         pu1_ptr += sizeof(isvce_mb_hdr_pskip_t);
1310*495ae853SAndroid Build Coastguard Worker         ps_proc->pv_mb_header_data = pu1_ptr;
1311*495ae853SAndroid Build Coastguard Worker     }
1312*495ae853SAndroid Build Coastguard Worker     else if(u4_mb_type == B16x16)
1313*495ae853SAndroid Build Coastguard Worker     {
1314*495ae853SAndroid Build Coastguard Worker         WORD32 i;
1315*495ae853SAndroid Build Coastguard Worker 
1316*495ae853SAndroid Build Coastguard Worker         /* pointer to mb header storage space */
1317*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
1318*495ae853SAndroid Build Coastguard Worker         isvce_mb_hdr_b16x16_t *ps_mb_hdr = (isvce_mb_hdr_b16x16_t *) ps_proc->pv_mb_header_data;
1319*495ae853SAndroid Build Coastguard Worker 
1320*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_pred_mode = ps_proc->ps_mb_info->as_pu->u1_pred_mode;
1321*495ae853SAndroid Build Coastguard Worker 
1322*495ae853SAndroid Build Coastguard Worker         /* mb type plus mode */
1323*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_type_mode = (u4_pred_mode << 4) + u4_mb_type;
1324*495ae853SAndroid Build Coastguard Worker 
1325*495ae853SAndroid Build Coastguard Worker         /* cbp */
1326*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
1327*495ae853SAndroid Build Coastguard Worker 
1328*495ae853SAndroid Build Coastguard Worker         /* mb qp delta */
1329*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_qp = ps_proc->u1_mb_qp;
1330*495ae853SAndroid Build Coastguard Worker 
1331*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_residual_prediction_flag =
1332*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_residual_prediction_flag;
1333*495ae853SAndroid Build Coastguard Worker 
1334*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_base_mode_flag = ps_proc->ps_mb_info->u1_base_mode_flag;
1335*495ae853SAndroid Build Coastguard Worker 
1336*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < NUM_PRED_DIRS; i++)
1337*495ae853SAndroid Build Coastguard Worker         {
1338*495ae853SAndroid Build Coastguard Worker             PRED_MODE_T e_pred_mode = (PRED_MODE_T) i;
1339*495ae853SAndroid Build Coastguard Worker             PRED_MODE_T e_cmpl_pred_mode = (e_pred_mode == L0) ? L1 : L0;
1340*495ae853SAndroid Build Coastguard Worker 
1341*495ae853SAndroid Build Coastguard Worker             if(u4_pred_mode != e_pred_mode)
1342*495ae853SAndroid Build Coastguard Worker             {
1343*495ae853SAndroid Build Coastguard Worker                 ps_mb_hdr->au1_mvp_idx[e_cmpl_pred_mode] =
1344*495ae853SAndroid Build Coastguard Worker                     ps_proc->ps_mb_info->as_pu->au1_mvp_idx[e_cmpl_pred_mode];
1345*495ae853SAndroid Build Coastguard Worker 
1346*495ae853SAndroid Build Coastguard Worker                 if(0 == ps_proc->ps_mb_info->as_pu->au1_mvp_idx[e_cmpl_pred_mode])
1347*495ae853SAndroid Build Coastguard Worker                 {
1348*495ae853SAndroid Build Coastguard Worker                     ps_mb_hdr->ai2_mvd[e_cmpl_pred_mode][0] =
1349*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_mb_info->as_pu->as_me_info[e_cmpl_pred_mode].s_mv.i2_mvx -
1350*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_pred_mv[e_cmpl_pred_mode].s_mv.i2_mvx;
1351*495ae853SAndroid Build Coastguard Worker                     ps_mb_hdr->ai2_mvd[e_cmpl_pred_mode][1] =
1352*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_mb_info->as_pu->as_me_info[e_cmpl_pred_mode].s_mv.i2_mvy -
1353*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_pred_mv[e_cmpl_pred_mode].s_mv.i2_mvy;
1354*495ae853SAndroid Build Coastguard Worker                 }
1355*495ae853SAndroid Build Coastguard Worker                 else
1356*495ae853SAndroid Build Coastguard Worker                 {
1357*495ae853SAndroid Build Coastguard Worker                     ps_mb_hdr->ai2_mvd[e_cmpl_pred_mode][0] =
1358*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_mb_info->as_pu->as_me_info[e_cmpl_pred_mode].s_mv.i2_mvx -
1359*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_ilp_mv->as_mv[0][e_cmpl_pred_mode].s_mv.i2_mvx;
1360*495ae853SAndroid Build Coastguard Worker                     ps_mb_hdr->ai2_mvd[e_cmpl_pred_mode][1] =
1361*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_mb_info->as_pu->as_me_info[e_cmpl_pred_mode].s_mv.i2_mvy -
1362*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_ilp_mv->as_mv[0][e_cmpl_pred_mode].s_mv.i2_mvy;
1363*495ae853SAndroid Build Coastguard Worker                 }
1364*495ae853SAndroid Build Coastguard Worker             }
1365*495ae853SAndroid Build Coastguard Worker         }
1366*495ae853SAndroid Build Coastguard Worker 
1367*495ae853SAndroid Build Coastguard Worker         /* end of mb layer */
1368*495ae853SAndroid Build Coastguard Worker         pu1_ptr += sizeof(isvce_mb_hdr_b16x16_t);
1369*495ae853SAndroid Build Coastguard Worker         ps_proc->pv_mb_header_data = pu1_ptr;
1370*495ae853SAndroid Build Coastguard Worker     }
1371*495ae853SAndroid Build Coastguard Worker     else if(u4_mb_type == BDIRECT)
1372*495ae853SAndroid Build Coastguard Worker     {
1373*495ae853SAndroid Build Coastguard Worker         /* pointer to mb header storage space */
1374*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
1375*495ae853SAndroid Build Coastguard Worker         isvce_mb_hdr_bdirect_t *ps_mb_hdr = (isvce_mb_hdr_bdirect_t *) ps_proc->pv_mb_header_data;
1376*495ae853SAndroid Build Coastguard Worker 
1377*495ae853SAndroid Build Coastguard Worker         /* mb type plus mode */
1378*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;
1379*495ae853SAndroid Build Coastguard Worker 
1380*495ae853SAndroid Build Coastguard Worker         /* cbp */
1381*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
1382*495ae853SAndroid Build Coastguard Worker 
1383*495ae853SAndroid Build Coastguard Worker         /* mb qp delta */
1384*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_qp = ps_proc->u1_mb_qp;
1385*495ae853SAndroid Build Coastguard Worker 
1386*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_residual_prediction_flag =
1387*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_residual_prediction_flag;
1388*495ae853SAndroid Build Coastguard Worker 
1389*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_base_mode_flag = ps_proc->ps_mb_info->u1_base_mode_flag;
1390*495ae853SAndroid Build Coastguard Worker 
1391*495ae853SAndroid Build Coastguard Worker         /* end of mb layer */
1392*495ae853SAndroid Build Coastguard Worker         pu1_ptr += sizeof(isvce_mb_hdr_bdirect_t);
1393*495ae853SAndroid Build Coastguard Worker         ps_proc->pv_mb_header_data = pu1_ptr;
1394*495ae853SAndroid Build Coastguard Worker     }
1395*495ae853SAndroid Build Coastguard Worker     else if(u4_mb_type == BSKIP)
1396*495ae853SAndroid Build Coastguard Worker     {
1397*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_pred_mode = ps_proc->ps_mb_info->as_pu->u1_pred_mode;
1398*495ae853SAndroid Build Coastguard Worker 
1399*495ae853SAndroid Build Coastguard Worker         /* pointer to mb header storage space */
1400*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
1401*495ae853SAndroid Build Coastguard Worker         isvce_mb_hdr_bskip_t *ps_mb_hdr = (isvce_mb_hdr_bskip_t *) ps_proc->pv_mb_header_data;
1402*495ae853SAndroid Build Coastguard Worker 
1403*495ae853SAndroid Build Coastguard Worker         /* mb type plus mode */
1404*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_type_mode = (u4_pred_mode << 4) + u4_mb_type;
1405*495ae853SAndroid Build Coastguard Worker 
1406*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_residual_prediction_flag =
1407*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_residual_prediction_flag;
1408*495ae853SAndroid Build Coastguard Worker 
1409*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_base_mode_flag = ps_proc->ps_mb_info->u1_base_mode_flag;
1410*495ae853SAndroid Build Coastguard Worker 
1411*495ae853SAndroid Build Coastguard Worker         /* end of mb layer */
1412*495ae853SAndroid Build Coastguard Worker         pu1_ptr += sizeof(isvce_mb_hdr_bskip_t);
1413*495ae853SAndroid Build Coastguard Worker         ps_proc->pv_mb_header_data = pu1_ptr;
1414*495ae853SAndroid Build Coastguard Worker     }
1415*495ae853SAndroid Build Coastguard Worker     else if(u4_mb_type == BASE_MODE)
1416*495ae853SAndroid Build Coastguard Worker     {
1417*495ae853SAndroid Build Coastguard Worker         isvce_mb_hdr_base_mode_t *ps_mb_hdr =
1418*495ae853SAndroid Build Coastguard Worker             (isvce_mb_hdr_base_mode_t *) ps_proc->pv_mb_header_data;
1419*495ae853SAndroid Build Coastguard Worker 
1420*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
1421*495ae853SAndroid Build Coastguard Worker 
1422*495ae853SAndroid Build Coastguard Worker         ASSERT(ps_proc->ps_mb_info->u1_base_mode_flag == 1);
1423*495ae853SAndroid Build Coastguard Worker 
1424*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;
1425*495ae853SAndroid Build Coastguard Worker 
1426*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;
1427*495ae853SAndroid Build Coastguard Worker 
1428*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_mb_qp = ps_proc->u1_mb_qp;
1429*495ae853SAndroid Build Coastguard Worker 
1430*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_residual_prediction_flag =
1431*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_residual_prediction_flag;
1432*495ae853SAndroid Build Coastguard Worker 
1433*495ae853SAndroid Build Coastguard Worker         ps_mb_hdr->common.u1_base_mode_flag = ps_proc->ps_mb_info->u1_base_mode_flag;
1434*495ae853SAndroid Build Coastguard Worker 
1435*495ae853SAndroid Build Coastguard Worker         pu1_ptr += sizeof(isvce_mb_hdr_base_mode_t);
1436*495ae853SAndroid Build Coastguard Worker         ps_proc->pv_mb_header_data = pu1_ptr;
1437*495ae853SAndroid Build Coastguard Worker     }
1438*495ae853SAndroid Build Coastguard Worker 
1439*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
1440*495ae853SAndroid Build Coastguard Worker }
1441*495ae853SAndroid Build Coastguard Worker 
1442*495ae853SAndroid Build Coastguard Worker /**
1443*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1444*495ae853SAndroid Build Coastguard Worker *
1445*495ae853SAndroid Build Coastguard Worker * @brief   update process context after encoding an mb. This involves preserving
1446*495ae853SAndroid Build Coastguard Worker * the current mb information for later use, initialize the proc ctxt elements to
1447*495ae853SAndroid Build Coastguard Worker * encode next mb.
1448*495ae853SAndroid Build Coastguard Worker *
1449*495ae853SAndroid Build Coastguard Worker * @par Description:
1450*495ae853SAndroid Build Coastguard Worker *  This function performs house keeping tasks after encoding an mb.
1451*495ae853SAndroid Build Coastguard Worker *  After encoding an mb, various elements of the process context needs to be
1452*495ae853SAndroid Build Coastguard Worker *  updated to encode the next mb. For instance, the source, recon and reference
1453*495ae853SAndroid Build Coastguard Worker *  pointers, mb indices have to be adjusted to the next mb. The slice index of
1454*495ae853SAndroid Build Coastguard Worker *  the current mb needs to be updated. If mb qp modulation is enabled, then if
1455*495ae853SAndroid Build Coastguard Worker *  the qp changes the quant param structure needs to be updated. Also to
1456*495ae853SAndroid Build Coastguard Worker *encoding the next mb, the current mb info is used as part of mode prediction or
1457*495ae853SAndroid Build Coastguard Worker *mv prediction. Hence the current mb info has to preserved at top/top left/left
1458*495ae853SAndroid Build Coastguard Worker *  locations.
1459*495ae853SAndroid Build Coastguard Worker *
1460*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc
1461*495ae853SAndroid Build Coastguard Worker *  Pointer to the current process context
1462*495ae853SAndroid Build Coastguard Worker *
1463*495ae853SAndroid Build Coastguard Worker * @returns none
1464*495ae853SAndroid Build Coastguard Worker *
1465*495ae853SAndroid Build Coastguard Worker * @remarks none
1466*495ae853SAndroid Build Coastguard Worker *
1467*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1468*495ae853SAndroid Build Coastguard Worker */
isvce_update_proc_ctxt(isvce_process_ctxt_t * ps_proc)1469*495ae853SAndroid Build Coastguard Worker WORD32 isvce_update_proc_ctxt(isvce_process_ctxt_t *ps_proc)
1470*495ae853SAndroid Build Coastguard Worker {
1471*495ae853SAndroid Build Coastguard Worker     /* error status */
1472*495ae853SAndroid Build Coastguard Worker     WORD32 error_status = IH264_SUCCESS;
1473*495ae853SAndroid Build Coastguard Worker 
1474*495ae853SAndroid Build Coastguard Worker     /* codec context */
1475*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
1476*495ae853SAndroid Build Coastguard Worker     isa_dependent_fxns_t *ps_isa_dependent_fxns = &ps_codec->s_isa_dependent_fxns;
1477*495ae853SAndroid Build Coastguard Worker     mem_fxns_t *ps_mem_fxns = &ps_isa_dependent_fxns->s_mem_fxns;
1478*495ae853SAndroid Build Coastguard Worker 
1479*495ae853SAndroid Build Coastguard Worker     /* curr mb indices */
1480*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_x = ps_proc->i4_mb_x;
1481*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_y = ps_proc->i4_mb_y;
1482*495ae853SAndroid Build Coastguard Worker 
1483*495ae853SAndroid Build Coastguard Worker     /* mb syntax elements of neighbors */
1484*495ae853SAndroid Build Coastguard Worker     isvce_mb_info_t *ps_left_syn = ps_proc->s_nbr_info.ps_left_mb_info;
1485*495ae853SAndroid Build Coastguard Worker     isvce_mb_info_t *ps_top_syn =
1486*495ae853SAndroid Build Coastguard Worker         ps_proc->s_nbr_info_base.ps_layer_nbr_info[ps_proc->u1_spatial_layer_id]
1487*495ae853SAndroid Build Coastguard Worker             .ps_top_row_mb_info +
1488*495ae853SAndroid Build Coastguard Worker         i4_mb_x + i4_mb_y * ps_proc->i4_wd_mbs;
1489*495ae853SAndroid Build Coastguard Worker 
1490*495ae853SAndroid Build Coastguard Worker     /* curr mb type */
1491*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_mb_type = ps_proc->ps_mb_info->u2_mb_type;
1492*495ae853SAndroid Build Coastguard Worker 
1493*495ae853SAndroid Build Coastguard Worker     /* curr mb type */
1494*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_is_intra = ps_proc->ps_mb_info->u1_is_intra;
1495*495ae853SAndroid Build Coastguard Worker 
1496*495ae853SAndroid Build Coastguard Worker     /* width in mbs */
1497*495ae853SAndroid Build Coastguard Worker     WORD32 i4_wd_mbs = ps_proc->i4_wd_mbs;
1498*495ae853SAndroid Build Coastguard Worker 
1499*495ae853SAndroid Build Coastguard Worker     /*height in mbs*/
1500*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ht_mbs = ps_proc->i4_ht_mbs;
1501*495ae853SAndroid Build Coastguard Worker 
1502*495ae853SAndroid Build Coastguard Worker     /* proc map */
1503*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_proc_map = ps_proc->pu1_proc_map + (i4_mb_y * i4_wd_mbs);
1504*495ae853SAndroid Build Coastguard Worker 
1505*495ae853SAndroid Build Coastguard Worker     /* deblk context */
1506*495ae853SAndroid Build Coastguard Worker     isvce_deblk_ctxt_t *ps_deblk = &ps_proc->s_deblk_ctxt;
1507*495ae853SAndroid Build Coastguard Worker 
1508*495ae853SAndroid Build Coastguard Worker     /* deblk bs context */
1509*495ae853SAndroid Build Coastguard Worker     isvce_bs_ctxt_t *ps_bs = &(ps_deblk->s_bs_ctxt);
1510*495ae853SAndroid Build Coastguard Worker 
1511*495ae853SAndroid Build Coastguard Worker     /* sub mb modes */
1512*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_top_mb_intra_modes =
1513*495ae853SAndroid Build Coastguard Worker         (ps_proc->s_nbr_info_base.ps_layer_nbr_info[ps_proc->u1_spatial_layer_id]
1514*495ae853SAndroid Build Coastguard Worker              .ps_top_mb_intra_modes +
1515*495ae853SAndroid Build Coastguard Worker          i4_mb_x + i4_mb_y * ps_proc->i4_wd_mbs)
1516*495ae853SAndroid Build Coastguard Worker             ->au1_intra_modes;
1517*495ae853SAndroid Build Coastguard Worker 
1518*495ae853SAndroid Build Coastguard Worker     /*************************************************************/
1519*495ae853SAndroid Build Coastguard Worker     /* During MV prediction, when top right mb is not available, */
1520*495ae853SAndroid Build Coastguard Worker     /* top left mb info. is used for prediction. Hence the curr  */
1521*495ae853SAndroid Build Coastguard Worker     /* top, which will be top left for the next mb needs to be   */
1522*495ae853SAndroid Build Coastguard Worker     /* preserved before updating it with curr mb info.           */
1523*495ae853SAndroid Build Coastguard Worker     /*************************************************************/
1524*495ae853SAndroid Build Coastguard Worker 
1525*495ae853SAndroid Build Coastguard Worker     /*************************************************/
1526*495ae853SAndroid Build Coastguard Worker     /* update top and left with curr mb info results */
1527*495ae853SAndroid Build Coastguard Worker     /*************************************************/
1528*495ae853SAndroid Build Coastguard Worker     ps_left_syn[0] = ps_top_syn[0] = ps_proc->ps_mb_info[0];
1529*495ae853SAndroid Build Coastguard Worker     ps_left_syn->u2_mb_type = ps_top_syn->u2_mb_type = u4_mb_type;
1530*495ae853SAndroid Build Coastguard Worker     ps_left_syn->i4_mb_distortion = ps_top_syn->i4_mb_distortion = ps_proc->i4_mb_distortion;
1531*495ae853SAndroid Build Coastguard Worker 
1532*495ae853SAndroid Build Coastguard Worker     if(u4_is_intra)
1533*495ae853SAndroid Build Coastguard Worker     {
1534*495ae853SAndroid Build Coastguard Worker         /* mb / sub mb modes */
1535*495ae853SAndroid Build Coastguard Worker         if(I16x16 == u4_mb_type)
1536*495ae853SAndroid Build Coastguard Worker         {
1537*495ae853SAndroid Build Coastguard Worker             pu1_top_mb_intra_modes[0] =
1538*495ae853SAndroid Build Coastguard Worker                 ps_proc->s_nbr_info.ps_left_mb_intra_modes->au1_intra_modes[0] =
1539*495ae853SAndroid Build Coastguard Worker                     ps_proc->u1_l_i16_mode;
1540*495ae853SAndroid Build Coastguard Worker         }
1541*495ae853SAndroid Build Coastguard Worker         else if(I4x4 == u4_mb_type)
1542*495ae853SAndroid Build Coastguard Worker         {
1543*495ae853SAndroid Build Coastguard Worker             ps_mem_fxns->pf_mem_cpy_mul8(
1544*495ae853SAndroid Build Coastguard Worker                 ps_proc->s_nbr_info.ps_left_mb_intra_modes->au1_intra_modes,
1545*495ae853SAndroid Build Coastguard Worker                 ps_proc->au1_intra_luma_mb_4x4_modes, 16);
1546*495ae853SAndroid Build Coastguard Worker             ps_mem_fxns->pf_mem_cpy_mul8(pu1_top_mb_intra_modes,
1547*495ae853SAndroid Build Coastguard Worker                                          ps_proc->au1_intra_luma_mb_4x4_modes, 16);
1548*495ae853SAndroid Build Coastguard Worker         }
1549*495ae853SAndroid Build Coastguard Worker         else if(I8x8 == u4_mb_type)
1550*495ae853SAndroid Build Coastguard Worker         {
1551*495ae853SAndroid Build Coastguard Worker             memcpy(ps_proc->s_nbr_info.ps_left_mb_intra_modes->au1_intra_modes,
1552*495ae853SAndroid Build Coastguard Worker                    ps_proc->au1_intra_luma_mb_8x8_modes, 4);
1553*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_top_mb_intra_modes, ps_proc->au1_intra_luma_mb_8x8_modes, 4);
1554*495ae853SAndroid Build Coastguard Worker         }
1555*495ae853SAndroid Build Coastguard Worker 
1556*495ae853SAndroid Build Coastguard Worker         *ps_proc->pu4_mb_pu_cnt = 1;
1557*495ae853SAndroid Build Coastguard Worker     }
1558*495ae853SAndroid Build Coastguard Worker 
1559*495ae853SAndroid Build Coastguard Worker     /*
1560*495ae853SAndroid Build Coastguard Worker      * Mark that the MB has been coded intra
1561*495ae853SAndroid Build Coastguard Worker      * So that future AIRs can skip it
1562*495ae853SAndroid Build Coastguard Worker      */
1563*495ae853SAndroid Build Coastguard Worker     ps_proc->pu1_is_intra_coded[i4_mb_x + (i4_mb_y * i4_wd_mbs)] = u4_is_intra;
1564*495ae853SAndroid Build Coastguard Worker 
1565*495ae853SAndroid Build Coastguard Worker     /**************************************************/
1566*495ae853SAndroid Build Coastguard Worker     /* pack mb header info. for entropy coding        */
1567*495ae853SAndroid Build Coastguard Worker     /**************************************************/
1568*495ae853SAndroid Build Coastguard Worker     isvce_pack_header_data(ps_proc);
1569*495ae853SAndroid Build Coastguard Worker 
1570*495ae853SAndroid Build Coastguard Worker     /*
1571*495ae853SAndroid Build Coastguard Worker      * We need to sync the cache to make sure that the nmv content of proc
1572*495ae853SAndroid Build Coastguard Worker      * is updated to cache properly
1573*495ae853SAndroid Build Coastguard Worker      */
1574*495ae853SAndroid Build Coastguard Worker     DATA_SYNC();
1575*495ae853SAndroid Build Coastguard Worker 
1576*495ae853SAndroid Build Coastguard Worker     /* Just before finishing the row, enqueue the job in to entropy queue.
1577*495ae853SAndroid Build Coastguard Worker      * The master thread depending on its convenience shall dequeue it and
1578*495ae853SAndroid Build Coastguard Worker      * performs entropy.
1579*495ae853SAndroid Build Coastguard Worker      *
1580*495ae853SAndroid Build Coastguard Worker      * WARN !! Placing this block post proc map update can cause queuing of
1581*495ae853SAndroid Build Coastguard Worker      * entropy jobs in out of order.
1582*495ae853SAndroid Build Coastguard Worker      */
1583*495ae853SAndroid Build Coastguard Worker     if(i4_mb_x == i4_wd_mbs - 1)
1584*495ae853SAndroid Build Coastguard Worker     {
1585*495ae853SAndroid Build Coastguard Worker         /* job structures */
1586*495ae853SAndroid Build Coastguard Worker         job_t s_job;
1587*495ae853SAndroid Build Coastguard Worker 
1588*495ae853SAndroid Build Coastguard Worker         /* job class */
1589*495ae853SAndroid Build Coastguard Worker         s_job.i4_cmd = CMD_ENTROPY;
1590*495ae853SAndroid Build Coastguard Worker 
1591*495ae853SAndroid Build Coastguard Worker         /* number of mbs to be processed in the current job */
1592*495ae853SAndroid Build Coastguard Worker         s_job.i2_mb_cnt = ps_proc->i4_wd_mbs;
1593*495ae853SAndroid Build Coastguard Worker 
1594*495ae853SAndroid Build Coastguard Worker         /* job start index x */
1595*495ae853SAndroid Build Coastguard Worker         s_job.i2_mb_x = 0;
1596*495ae853SAndroid Build Coastguard Worker 
1597*495ae853SAndroid Build Coastguard Worker         /* job start index y */
1598*495ae853SAndroid Build Coastguard Worker         s_job.i2_mb_y = ps_proc->i4_mb_y;
1599*495ae853SAndroid Build Coastguard Worker 
1600*495ae853SAndroid Build Coastguard Worker         /* queue the job */
1601*495ae853SAndroid Build Coastguard Worker         error_status = ih264_list_queue(ps_proc->pv_entropy_jobq, &s_job, 1);
1602*495ae853SAndroid Build Coastguard Worker 
1603*495ae853SAndroid Build Coastguard Worker         if(error_status != IH264_SUCCESS)
1604*495ae853SAndroid Build Coastguard Worker         {
1605*495ae853SAndroid Build Coastguard Worker             return error_status;
1606*495ae853SAndroid Build Coastguard Worker         }
1607*495ae853SAndroid Build Coastguard Worker 
1608*495ae853SAndroid Build Coastguard Worker         if(ps_proc->i4_mb_y == (i4_ht_mbs - 1))
1609*495ae853SAndroid Build Coastguard Worker         {
1610*495ae853SAndroid Build Coastguard Worker             ih264_list_terminate(ps_codec->pv_entropy_jobq);
1611*495ae853SAndroid Build Coastguard Worker         }
1612*495ae853SAndroid Build Coastguard Worker     }
1613*495ae853SAndroid Build Coastguard Worker 
1614*495ae853SAndroid Build Coastguard Worker     /* update proc map */
1615*495ae853SAndroid Build Coastguard Worker     pu1_proc_map[i4_mb_x] = 1;
1616*495ae853SAndroid Build Coastguard Worker     ASSERT(i4_mb_x < i4_wd_mbs);
1617*495ae853SAndroid Build Coastguard Worker 
1618*495ae853SAndroid Build Coastguard Worker     /**************************************************/
1619*495ae853SAndroid Build Coastguard Worker     /* update proc ctxt elements for encoding next mb */
1620*495ae853SAndroid Build Coastguard Worker     /**************************************************/
1621*495ae853SAndroid Build Coastguard Worker     /* update indices */
1622*495ae853SAndroid Build Coastguard Worker     i4_mb_x++;
1623*495ae853SAndroid Build Coastguard Worker     ps_proc->i4_mb_x = i4_mb_x;
1624*495ae853SAndroid Build Coastguard Worker 
1625*495ae853SAndroid Build Coastguard Worker     if(ps_proc->i4_mb_x == i4_wd_mbs)
1626*495ae853SAndroid Build Coastguard Worker     {
1627*495ae853SAndroid Build Coastguard Worker         ps_proc->i4_mb_y++;
1628*495ae853SAndroid Build Coastguard Worker         ps_proc->i4_mb_x = 0;
1629*495ae853SAndroid Build Coastguard Worker     }
1630*495ae853SAndroid Build Coastguard Worker 
1631*495ae853SAndroid Build Coastguard Worker     /* update slice index */
1632*495ae853SAndroid Build Coastguard Worker     ps_proc->i4_cur_slice_idx =
1633*495ae853SAndroid Build Coastguard Worker         ps_proc->pu1_slice_idx[ps_proc->i4_mb_y * i4_wd_mbs + ps_proc->i4_mb_x];
1634*495ae853SAndroid Build Coastguard Worker 
1635*495ae853SAndroid Build Coastguard Worker     /* update buffers pointers */
1636*495ae853SAndroid Build Coastguard Worker     ps_proc->s_src_buf_props.as_component_bufs[0].pv_data =
1637*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->s_src_buf_props.as_component_bufs[0].pv_data) + MB_SIZE;
1638*495ae853SAndroid Build Coastguard Worker     ps_proc->s_rec_buf_props.as_component_bufs[0].pv_data =
1639*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->s_rec_buf_props.as_component_bufs[0].pv_data) + MB_SIZE;
1640*495ae853SAndroid Build Coastguard Worker     ps_proc->as_ref_buf_props[0].as_component_bufs[0].pv_data =
1641*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->as_ref_buf_props[0].as_component_bufs[0].pv_data) + MB_SIZE;
1642*495ae853SAndroid Build Coastguard Worker     ps_proc->as_ref_buf_props[1].as_component_bufs[0].pv_data =
1643*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->as_ref_buf_props[1].as_component_bufs[0].pv_data) + MB_SIZE;
1644*495ae853SAndroid Build Coastguard Worker 
1645*495ae853SAndroid Build Coastguard Worker     /*
1646*495ae853SAndroid Build Coastguard Worker      * Note: Although chroma mb size is 8, as the chroma buffers are
1647*495ae853SAndroid Build Coastguard Worker      * interleaved, the stride per MB is MB_SIZE
1648*495ae853SAndroid Build Coastguard Worker      */
1649*495ae853SAndroid Build Coastguard Worker     ps_proc->s_src_buf_props.as_component_bufs[1].pv_data =
1650*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->s_src_buf_props.as_component_bufs[1].pv_data) + MB_SIZE;
1651*495ae853SAndroid Build Coastguard Worker     ps_proc->s_rec_buf_props.as_component_bufs[1].pv_data =
1652*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->s_rec_buf_props.as_component_bufs[1].pv_data) + MB_SIZE;
1653*495ae853SAndroid Build Coastguard Worker     ps_proc->as_ref_buf_props[0].as_component_bufs[1].pv_data =
1654*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->as_ref_buf_props[0].as_component_bufs[1].pv_data) + MB_SIZE;
1655*495ae853SAndroid Build Coastguard Worker     ps_proc->as_ref_buf_props[1].as_component_bufs[1].pv_data =
1656*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->as_ref_buf_props[1].as_component_bufs[1].pv_data) + MB_SIZE;
1657*495ae853SAndroid Build Coastguard Worker 
1658*495ae853SAndroid Build Coastguard Worker     /* Reset cost, distortion params */
1659*495ae853SAndroid Build Coastguard Worker     ps_proc->i4_mb_cost = INT_MAX;
1660*495ae853SAndroid Build Coastguard Worker     ps_proc->i4_mb_distortion = SHRT_MAX;
1661*495ae853SAndroid Build Coastguard Worker 
1662*495ae853SAndroid Build Coastguard Worker     ps_proc->ps_mb_info++;
1663*495ae853SAndroid Build Coastguard Worker     ps_proc->pu4_mb_pu_cnt++;
1664*495ae853SAndroid Build Coastguard Worker 
1665*495ae853SAndroid Build Coastguard Worker     /* Update colocated pu */
1666*495ae853SAndroid Build Coastguard Worker     if(ps_proc->i4_slice_type == BSLICE)
1667*495ae853SAndroid Build Coastguard Worker     {
1668*495ae853SAndroid Build Coastguard Worker         ps_proc->ps_col_mb++;
1669*495ae853SAndroid Build Coastguard Worker     }
1670*495ae853SAndroid Build Coastguard Worker 
1671*495ae853SAndroid Build Coastguard Worker     if(ps_proc->u4_disable_deblock_level != 1)
1672*495ae853SAndroid Build Coastguard Worker     {
1673*495ae853SAndroid Build Coastguard Worker         ps_bs->i4_mb_x = ps_proc->i4_mb_x;
1674*495ae853SAndroid Build Coastguard Worker         ps_bs->i4_mb_y = ps_proc->i4_mb_y;
1675*495ae853SAndroid Build Coastguard Worker 
1676*495ae853SAndroid Build Coastguard Worker #ifndef N_MB_ENABLE /* For N MB processing update take place inside deblocking \
1677*495ae853SAndroid Build Coastguard Worker                        function */
1678*495ae853SAndroid Build Coastguard Worker         ASSERT(0);
1679*495ae853SAndroid Build Coastguard Worker         ps_deblk->i4_mb_x++;
1680*495ae853SAndroid Build Coastguard Worker 
1681*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_deblk->s_rec_pic_buf_props.as_component_bufs[0].pv_data) += MB_SIZE;
1682*495ae853SAndroid Build Coastguard Worker         /*
1683*495ae853SAndroid Build Coastguard Worker          * Note: Although chroma mb size is 8, as the chroma buffers are
1684*495ae853SAndroid Build Coastguard Worker          * interleaved, the stride per MB is MB_SIZE
1685*495ae853SAndroid Build Coastguard Worker          */
1686*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_deblk->s_rec_pic_buf_props.as_component_bufs[1].pv_data) += MB_SIZE;
1687*495ae853SAndroid Build Coastguard Worker #endif
1688*495ae853SAndroid Build Coastguard Worker     }
1689*495ae853SAndroid Build Coastguard Worker 
1690*495ae853SAndroid Build Coastguard Worker     return error_status;
1691*495ae853SAndroid Build Coastguard Worker }
1692*495ae853SAndroid Build Coastguard Worker 
1693*495ae853SAndroid Build Coastguard Worker /**
1694*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1695*495ae853SAndroid Build Coastguard Worker *
1696*495ae853SAndroid Build Coastguard Worker * @brief This function performs luma & chroma padding
1697*495ae853SAndroid Build Coastguard Worker *
1698*495ae853SAndroid Build Coastguard Worker * @par Description:
1699*495ae853SAndroid Build Coastguard Worker *
1700*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc
1701*495ae853SAndroid Build Coastguard Worker *  Process context corresponding to the job
1702*495ae853SAndroid Build Coastguard Worker *
1703*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_curr_pic_luma
1704*495ae853SAndroid Build Coastguard Worker *  Pointer to luma buffer
1705*495ae853SAndroid Build Coastguard Worker *
1706*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_curr_pic_chroma
1707*495ae853SAndroid Build Coastguard Worker *  Pointer to chroma buffer
1708*495ae853SAndroid Build Coastguard Worker *
1709*495ae853SAndroid Build Coastguard Worker * @param[in] i4_mb_x
1710*495ae853SAndroid Build Coastguard Worker *  mb index x
1711*495ae853SAndroid Build Coastguard Worker *
1712*495ae853SAndroid Build Coastguard Worker * @param[in] i4_mb_y
1713*495ae853SAndroid Build Coastguard Worker *  mb index y
1714*495ae853SAndroid Build Coastguard Worker *
1715*495ae853SAndroid Build Coastguard Worker *  @param[in] i4_pad_ht
1716*495ae853SAndroid Build Coastguard Worker *  number of rows to be padded
1717*495ae853SAndroid Build Coastguard Worker *
1718*495ae853SAndroid Build Coastguard Worker * @returns  error status
1719*495ae853SAndroid Build Coastguard Worker *
1720*495ae853SAndroid Build Coastguard Worker * @remarks none
1721*495ae853SAndroid Build Coastguard Worker *
1722*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1723*495ae853SAndroid Build Coastguard Worker */
isvce_pad_recon_buffer(isvce_process_ctxt_t * ps_proc,UWORD8 * pu1_curr_pic_luma,WORD32 i4_luma_stride,UWORD8 * pu1_curr_pic_chroma,WORD32 i4_chroma_stride,WORD32 i4_mb_x,WORD32 i4_mb_y,WORD32 i4_pad_ht)1724*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_pad_recon_buffer(isvce_process_ctxt_t *ps_proc, UWORD8 *pu1_curr_pic_luma,
1725*495ae853SAndroid Build Coastguard Worker                                       WORD32 i4_luma_stride, UWORD8 *pu1_curr_pic_chroma,
1726*495ae853SAndroid Build Coastguard Worker                                       WORD32 i4_chroma_stride, WORD32 i4_mb_x, WORD32 i4_mb_y,
1727*495ae853SAndroid Build Coastguard Worker                                       WORD32 i4_pad_ht)
1728*495ae853SAndroid Build Coastguard Worker {
1729*495ae853SAndroid Build Coastguard Worker     /* codec context */
1730*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
1731*495ae853SAndroid Build Coastguard Worker 
1732*495ae853SAndroid Build Coastguard Worker     if(i4_mb_x == 0)
1733*495ae853SAndroid Build Coastguard Worker     {
1734*495ae853SAndroid Build Coastguard Worker         /* padding left luma */
1735*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_left_luma(pu1_curr_pic_luma, i4_luma_stride, i4_pad_ht, PAD_LEFT);
1736*495ae853SAndroid Build Coastguard Worker 
1737*495ae853SAndroid Build Coastguard Worker         /* padding left chroma */
1738*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_left_chroma(pu1_curr_pic_chroma, i4_chroma_stride, i4_pad_ht >> 1,
1739*495ae853SAndroid Build Coastguard Worker                                      PAD_LEFT);
1740*495ae853SAndroid Build Coastguard Worker     }
1741*495ae853SAndroid Build Coastguard Worker     if(i4_mb_x == ps_proc->i4_wd_mbs - 1)
1742*495ae853SAndroid Build Coastguard Worker     {
1743*495ae853SAndroid Build Coastguard Worker         /* padding right luma */
1744*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_right_luma(pu1_curr_pic_luma + MB_SIZE, i4_luma_stride, i4_pad_ht,
1745*495ae853SAndroid Build Coastguard Worker                                     PAD_RIGHT);
1746*495ae853SAndroid Build Coastguard Worker 
1747*495ae853SAndroid Build Coastguard Worker         /* padding right chroma */
1748*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_right_chroma(pu1_curr_pic_chroma + MB_SIZE, i4_chroma_stride,
1749*495ae853SAndroid Build Coastguard Worker                                       i4_pad_ht >> 1, PAD_RIGHT);
1750*495ae853SAndroid Build Coastguard Worker 
1751*495ae853SAndroid Build Coastguard Worker         if(i4_mb_y == ps_proc->i4_ht_mbs - 1)
1752*495ae853SAndroid Build Coastguard Worker         {
1753*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_rec_luma =
1754*495ae853SAndroid Build Coastguard Worker                 pu1_curr_pic_luma + MB_SIZE + PAD_RIGHT + ((i4_pad_ht - 1) * i4_luma_stride);
1755*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_rec_chroma = pu1_curr_pic_chroma + MB_SIZE + PAD_RIGHT +
1756*495ae853SAndroid Build Coastguard Worker                                      (((i4_pad_ht >> 1) - 1) * i4_chroma_stride);
1757*495ae853SAndroid Build Coastguard Worker 
1758*495ae853SAndroid Build Coastguard Worker             /* padding bottom luma */
1759*495ae853SAndroid Build Coastguard Worker             ps_codec->pf_pad_bottom(pu1_rec_luma, i4_luma_stride, i4_luma_stride, PAD_BOT);
1760*495ae853SAndroid Build Coastguard Worker 
1761*495ae853SAndroid Build Coastguard Worker             /* padding bottom chroma */
1762*495ae853SAndroid Build Coastguard Worker             ps_codec->pf_pad_bottom(pu1_rec_chroma, i4_chroma_stride, i4_chroma_stride,
1763*495ae853SAndroid Build Coastguard Worker                                     (PAD_BOT >> 1));
1764*495ae853SAndroid Build Coastguard Worker         }
1765*495ae853SAndroid Build Coastguard Worker     }
1766*495ae853SAndroid Build Coastguard Worker 
1767*495ae853SAndroid Build Coastguard Worker     if(i4_mb_y == 0)
1768*495ae853SAndroid Build Coastguard Worker     {
1769*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_rec_luma = pu1_curr_pic_luma;
1770*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_rec_chroma = pu1_curr_pic_chroma;
1771*495ae853SAndroid Build Coastguard Worker         WORD32 wd = MB_SIZE;
1772*495ae853SAndroid Build Coastguard Worker 
1773*495ae853SAndroid Build Coastguard Worker         if(i4_mb_x == 0)
1774*495ae853SAndroid Build Coastguard Worker         {
1775*495ae853SAndroid Build Coastguard Worker             pu1_rec_luma -= PAD_LEFT;
1776*495ae853SAndroid Build Coastguard Worker             pu1_rec_chroma -= PAD_LEFT;
1777*495ae853SAndroid Build Coastguard Worker 
1778*495ae853SAndroid Build Coastguard Worker             wd += PAD_LEFT;
1779*495ae853SAndroid Build Coastguard Worker         }
1780*495ae853SAndroid Build Coastguard Worker         if(i4_mb_x == ps_proc->i4_wd_mbs - 1)
1781*495ae853SAndroid Build Coastguard Worker         {
1782*495ae853SAndroid Build Coastguard Worker             wd += PAD_RIGHT;
1783*495ae853SAndroid Build Coastguard Worker         }
1784*495ae853SAndroid Build Coastguard Worker 
1785*495ae853SAndroid Build Coastguard Worker         /* padding top luma */
1786*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_top(pu1_rec_luma, i4_luma_stride, wd, PAD_TOP);
1787*495ae853SAndroid Build Coastguard Worker 
1788*495ae853SAndroid Build Coastguard Worker         /* padding top chroma */
1789*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_top(pu1_rec_chroma, i4_chroma_stride, wd, (PAD_TOP >> 1));
1790*495ae853SAndroid Build Coastguard Worker     }
1791*495ae853SAndroid Build Coastguard Worker 
1792*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
1793*495ae853SAndroid Build Coastguard Worker }
1794*495ae853SAndroid Build Coastguard Worker 
1795*495ae853SAndroid Build Coastguard Worker /**
1796*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1797*495ae853SAndroid Build Coastguard Worker *
1798*495ae853SAndroid Build Coastguard Worker * @brief This function performs deblocking
1799*495ae853SAndroid Build Coastguard Worker *
1800*495ae853SAndroid Build Coastguard Worker * @par Description:
1801*495ae853SAndroid Build Coastguard Worker *
1802*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc
1803*495ae853SAndroid Build Coastguard Worker *  Process context corresponding to the job
1804*495ae853SAndroid Build Coastguard Worker *
1805*495ae853SAndroid Build Coastguard Worker * @returns  error status
1806*495ae853SAndroid Build Coastguard Worker *
1807*495ae853SAndroid Build Coastguard Worker * @remarks none
1808*495ae853SAndroid Build Coastguard Worker *
1809*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1810*495ae853SAndroid Build Coastguard Worker */
isvce_dblk_n_mbs(isvce_process_ctxt_t * ps_proc,UWORD8 u1_inter_layer_deblk_flag)1811*495ae853SAndroid Build Coastguard Worker static IH264E_ERROR_T isvce_dblk_n_mbs(isvce_process_ctxt_t *ps_proc,
1812*495ae853SAndroid Build Coastguard Worker                                        UWORD8 u1_inter_layer_deblk_flag)
1813*495ae853SAndroid Build Coastguard Worker {
1814*495ae853SAndroid Build Coastguard Worker     WORD32 i;
1815*495ae853SAndroid Build Coastguard Worker     WORD32 row, col;
1816*495ae853SAndroid Build Coastguard Worker 
1817*495ae853SAndroid Build Coastguard Worker     n_mb_process_ctxt_t *ps_n_mb_ctxt = &ps_proc->s_n_mb_ctxt;
1818*495ae853SAndroid Build Coastguard Worker     isvce_deblk_ctxt_t *ps_deblk = &ps_proc->s_deblk_ctxt;
1819*495ae853SAndroid Build Coastguard Worker 
1820*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_deblk_map = ps_proc->pu1_deblk_map + ps_deblk->i4_mb_y * ps_proc->i4_wd_mbs;
1821*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_deblk_map_prev_row = pu1_deblk_map - ps_proc->i4_wd_mbs;
1822*495ae853SAndroid Build Coastguard Worker     WORD32 u4_deblk_prev_row = 0;
1823*495ae853SAndroid Build Coastguard Worker     WORD32 i4_n_mbs = ps_n_mb_ctxt->i4_n_mbs;
1824*495ae853SAndroid Build Coastguard Worker     WORD32 i4_n_mb_process_count = 0;
1825*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_x = ps_proc->i4_mb_x;
1826*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_y = ps_proc->i4_mb_y;
1827*495ae853SAndroid Build Coastguard Worker 
1828*495ae853SAndroid Build Coastguard Worker     ASSERT(i4_n_mbs == ps_proc->i4_wd_mbs);
1829*495ae853SAndroid Build Coastguard Worker 
1830*495ae853SAndroid Build Coastguard Worker     if(ps_proc->u4_disable_deblock_level != 1)
1831*495ae853SAndroid Build Coastguard Worker     {
1832*495ae853SAndroid Build Coastguard Worker         if((i4_mb_y > 0) || (i4_mb_y == (ps_proc->i4_ht_mbs - 1)))
1833*495ae853SAndroid Build Coastguard Worker         {
1834*495ae853SAndroid Build Coastguard Worker             /* if number of mb's to be processed are less than 'N', go back.
1835*495ae853SAndroid Build Coastguard Worker              * exception to the above clause is end of row */
1836*495ae853SAndroid Build Coastguard Worker             if(((i4_mb_x - (ps_n_mb_ctxt->i4_mb_x - 1)) < i4_n_mbs) &&
1837*495ae853SAndroid Build Coastguard Worker                (i4_mb_x < (ps_proc->i4_wd_mbs - 1)))
1838*495ae853SAndroid Build Coastguard Worker             {
1839*495ae853SAndroid Build Coastguard Worker                 return IH264E_SUCCESS;
1840*495ae853SAndroid Build Coastguard Worker             }
1841*495ae853SAndroid Build Coastguard Worker             else
1842*495ae853SAndroid Build Coastguard Worker             {
1843*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_num_deblk_rows = 1;
1844*495ae853SAndroid Build Coastguard Worker 
1845*495ae853SAndroid Build Coastguard Worker                 if(i4_mb_y == (ps_proc->i4_ht_mbs - 1))
1846*495ae853SAndroid Build Coastguard Worker                 {
1847*495ae853SAndroid Build Coastguard Worker                     i4_num_deblk_rows += (ps_proc->i4_ht_mbs > 1);
1848*495ae853SAndroid Build Coastguard Worker                 }
1849*495ae853SAndroid Build Coastguard Worker 
1850*495ae853SAndroid Build Coastguard Worker                 if(1 == ps_proc->i4_ht_mbs)
1851*495ae853SAndroid Build Coastguard Worker                 {
1852*495ae853SAndroid Build Coastguard Worker                     ps_deblk->i4_mb_y = 0;
1853*495ae853SAndroid Build Coastguard Worker                     pu1_deblk_map_prev_row = pu1_deblk_map;
1854*495ae853SAndroid Build Coastguard Worker                 }
1855*495ae853SAndroid Build Coastguard Worker 
1856*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i < i4_num_deblk_rows; i++)
1857*495ae853SAndroid Build Coastguard Worker                 {
1858*495ae853SAndroid Build Coastguard Worker                     if(i == 1)
1859*495ae853SAndroid Build Coastguard Worker                     {
1860*495ae853SAndroid Build Coastguard Worker                         /* Deblock last row */
1861*495ae853SAndroid Build Coastguard Worker                         ps_n_mb_ctxt->i4_mb_x = 0;
1862*495ae853SAndroid Build Coastguard Worker                         ps_n_mb_ctxt->i4_mb_y = ps_proc->i4_mb_y;
1863*495ae853SAndroid Build Coastguard Worker                         ps_deblk->i4_mb_x = 0;
1864*495ae853SAndroid Build Coastguard Worker                         ps_deblk->i4_mb_y = ps_proc->i4_mb_y;
1865*495ae853SAndroid Build Coastguard Worker                         pu1_deblk_map_prev_row = pu1_deblk_map;
1866*495ae853SAndroid Build Coastguard Worker                         pu1_deblk_map += ps_proc->i4_wd_mbs;
1867*495ae853SAndroid Build Coastguard Worker                     }
1868*495ae853SAndroid Build Coastguard Worker 
1869*495ae853SAndroid Build Coastguard Worker                     i4_n_mb_process_count = MIN(i4_mb_x - (ps_n_mb_ctxt->i4_mb_x - 1), i4_n_mbs);
1870*495ae853SAndroid Build Coastguard Worker 
1871*495ae853SAndroid Build Coastguard Worker                     /* performing deblocking for required number of MBs */
1872*495ae853SAndroid Build Coastguard Worker                     u4_deblk_prev_row = 1;
1873*495ae853SAndroid Build Coastguard Worker 
1874*495ae853SAndroid Build Coastguard Worker                     /* checking whether the top rows are deblocked */
1875*495ae853SAndroid Build Coastguard Worker                     for(col = 0; col < i4_n_mb_process_count; col++)
1876*495ae853SAndroid Build Coastguard Worker                     {
1877*495ae853SAndroid Build Coastguard Worker                         u4_deblk_prev_row &= pu1_deblk_map_prev_row[ps_deblk->i4_mb_x + col];
1878*495ae853SAndroid Build Coastguard Worker                     }
1879*495ae853SAndroid Build Coastguard Worker 
1880*495ae853SAndroid Build Coastguard Worker                     /* checking whether the top right MB is deblocked */
1881*495ae853SAndroid Build Coastguard Worker                     if((ps_deblk->i4_mb_x + i4_n_mb_process_count) != ps_proc->i4_wd_mbs)
1882*495ae853SAndroid Build Coastguard Worker                     {
1883*495ae853SAndroid Build Coastguard Worker                         u4_deblk_prev_row &=
1884*495ae853SAndroid Build Coastguard Worker                             pu1_deblk_map_prev_row[ps_deblk->i4_mb_x + i4_n_mb_process_count];
1885*495ae853SAndroid Build Coastguard Worker                     }
1886*495ae853SAndroid Build Coastguard Worker 
1887*495ae853SAndroid Build Coastguard Worker                     /* Top or Top right MBs not deblocked */
1888*495ae853SAndroid Build Coastguard Worker                     if((u4_deblk_prev_row != 1) && (i4_mb_y > 0))
1889*495ae853SAndroid Build Coastguard Worker                     {
1890*495ae853SAndroid Build Coastguard Worker                         return IH264E_SUCCESS;
1891*495ae853SAndroid Build Coastguard Worker                     }
1892*495ae853SAndroid Build Coastguard Worker 
1893*495ae853SAndroid Build Coastguard Worker                     for(row = 0; row < i4_n_mb_process_count; row++)
1894*495ae853SAndroid Build Coastguard Worker                     {
1895*495ae853SAndroid Build Coastguard Worker                         isvce_deblock_mb(ps_proc, ps_deblk, u1_inter_layer_deblk_flag);
1896*495ae853SAndroid Build Coastguard Worker 
1897*495ae853SAndroid Build Coastguard Worker                         pu1_deblk_map[ps_deblk->i4_mb_x] = 1;
1898*495ae853SAndroid Build Coastguard Worker 
1899*495ae853SAndroid Build Coastguard Worker                         ps_deblk->i4_mb_x++;
1900*495ae853SAndroid Build Coastguard Worker                     }
1901*495ae853SAndroid Build Coastguard Worker                 }
1902*495ae853SAndroid Build Coastguard Worker             }
1903*495ae853SAndroid Build Coastguard Worker         }
1904*495ae853SAndroid Build Coastguard Worker     }
1905*495ae853SAndroid Build Coastguard Worker 
1906*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
1907*495ae853SAndroid Build Coastguard Worker }
1908*495ae853SAndroid Build Coastguard Worker 
1909*495ae853SAndroid Build Coastguard Worker /**
1910*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1911*495ae853SAndroid Build Coastguard Worker *
1912*495ae853SAndroid Build Coastguard Worker * @brief This function performs 'intra base' deblocking
1913*495ae853SAndroid Build Coastguard Worker *
1914*495ae853SAndroid Build Coastguard Worker * @par Description:
1915*495ae853SAndroid Build Coastguard Worker *
1916*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc
1917*495ae853SAndroid Build Coastguard Worker *  Process context corresponding to the job
1918*495ae853SAndroid Build Coastguard Worker *
1919*495ae853SAndroid Build Coastguard Worker * @returns  error status
1920*495ae853SAndroid Build Coastguard Worker *
1921*495ae853SAndroid Build Coastguard Worker * @remarks none
1922*495ae853SAndroid Build Coastguard Worker *
1923*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1924*495ae853SAndroid Build Coastguard Worker */
isvce_intra_base_dblk(isvce_process_ctxt_t * ps_proc)1925*495ae853SAndroid Build Coastguard Worker static IH264E_ERROR_T isvce_intra_base_dblk(isvce_process_ctxt_t *ps_proc)
1926*495ae853SAndroid Build Coastguard Worker {
1927*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
1928*495ae853SAndroid Build Coastguard Worker     isvce_deblk_ctxt_t *ps_deblk = &ps_proc->s_deblk_ctxt;
1929*495ae853SAndroid Build Coastguard Worker 
1930*495ae853SAndroid Build Coastguard Worker     IH264E_ERROR_T e_ret = IH264E_SUCCESS;
1931*495ae853SAndroid Build Coastguard Worker 
1932*495ae853SAndroid Build Coastguard Worker     if(ps_proc->u1_spatial_layer_id < (ps_proc->s_svc_params.u1_num_spatial_layers - 1))
1933*495ae853SAndroid Build Coastguard Worker     {
1934*495ae853SAndroid Build Coastguard Worker         ps_deblk->i4_mb_x = ps_proc->i4_mb_x;
1935*495ae853SAndroid Build Coastguard Worker         ps_deblk->i4_mb_y = ps_proc->i4_mb_y - 1;
1936*495ae853SAndroid Build Coastguard Worker 
1937*495ae853SAndroid Build Coastguard Worker         ps_deblk->s_rec_pic_buf_props =
1938*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id];
1939*495ae853SAndroid Build Coastguard Worker 
1940*495ae853SAndroid Build Coastguard Worker         e_ret = isvce_dblk_n_mbs(ps_proc, 1);
1941*495ae853SAndroid Build Coastguard Worker 
1942*495ae853SAndroid Build Coastguard Worker         ps_deblk->s_rec_pic_buf_props = ps_proc->s_rec_pic_buf_props;
1943*495ae853SAndroid Build Coastguard Worker     }
1944*495ae853SAndroid Build Coastguard Worker 
1945*495ae853SAndroid Build Coastguard Worker     return e_ret;
1946*495ae853SAndroid Build Coastguard Worker }
1947*495ae853SAndroid Build Coastguard Worker 
1948*495ae853SAndroid Build Coastguard Worker /**
1949*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1950*495ae853SAndroid Build Coastguard Worker *
1951*495ae853SAndroid Build Coastguard Worker * @brief This function performs luma & chroma core coding for a set of mb's.
1952*495ae853SAndroid Build Coastguard Worker *
1953*495ae853SAndroid Build Coastguard Worker * @par Description:
1954*495ae853SAndroid Build Coastguard Worker *  The mb to be coded is taken and is evaluated over a predefined set of modes
1955*495ae853SAndroid Build Coastguard Worker *  (intra (i16, i4, i8)/inter (mv, skip)) for best cost. The mode with least
1956*495ae853SAndroid Build Coastguard Worker *cost is selected and using intra/inter prediction filters, prediction is
1957*495ae853SAndroid Build Coastguard Worker *carried out. The deviation between src and pred signal constitutes error
1958*495ae853SAndroid Build Coastguard Worker *signal. This error signal is transformed (hierarchical transform if necessary)
1959*495ae853SAndroid Build Coastguard Worker *and quantized. The quantized residue is packed in to entropy buffer for entropy
1960*495ae853SAndroid Build Coastguard Worker *coding. This is repeated for all the mb's enlisted under the job.
1961*495ae853SAndroid Build Coastguard Worker *
1962*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc
1963*495ae853SAndroid Build Coastguard Worker *  Process context corresponding to the job
1964*495ae853SAndroid Build Coastguard Worker *
1965*495ae853SAndroid Build Coastguard Worker * @returns  error status
1966*495ae853SAndroid Build Coastguard Worker *
1967*495ae853SAndroid Build Coastguard Worker * @remarks none
1968*495ae853SAndroid Build Coastguard Worker *
1969*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1970*495ae853SAndroid Build Coastguard Worker */
isvce_process(isvce_process_ctxt_t * ps_proc)1971*495ae853SAndroid Build Coastguard Worker WORD32 isvce_process(isvce_process_ctxt_t *ps_proc)
1972*495ae853SAndroid Build Coastguard Worker {
1973*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cbp_l, u4_cbp_c;
1974*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_idx;
1975*495ae853SAndroid Build Coastguard Worker     WORD32 luma_idx, chroma_idx, is_intra;
1976*495ae853SAndroid Build Coastguard Worker 
1977*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
1978*495ae853SAndroid Build Coastguard Worker     isa_dependent_fxns_t *ps_isa_dependent_fxns = &ps_codec->s_isa_dependent_fxns;
1979*495ae853SAndroid Build Coastguard Worker     enc_loop_fxns_t *ps_enc_loop_fxns = &ps_isa_dependent_fxns->s_enc_loop_fxns;
1980*495ae853SAndroid Build Coastguard Worker 
1981*495ae853SAndroid Build Coastguard Worker     WORD32 error_status = IH264_SUCCESS;
1982*495ae853SAndroid Build Coastguard Worker     WORD32 i4_wd_mbs = ps_proc->i4_wd_mbs;
1983*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_cnt = ps_proc->i4_mb_cnt;
1984*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_valid_modes = 0;
1985*495ae853SAndroid Build Coastguard Worker     WORD32 i4_gate_threshold = 0;
1986*495ae853SAndroid Build Coastguard Worker     WORD32 ctxt_sel = ps_proc->i4_encode_api_call_cnt % MAX_CTXT_SETS;
1987*495ae853SAndroid Build Coastguard Worker     bool b_enable_intra4x4_eval = true;
1988*495ae853SAndroid Build Coastguard Worker 
1989*495ae853SAndroid Build Coastguard Worker     /*
1990*495ae853SAndroid Build Coastguard Worker      * list of modes for evaluation
1991*495ae853SAndroid Build Coastguard Worker      * -------------------------------------------------------------------------
1992*495ae853SAndroid Build Coastguard Worker      * Note on enabling I4x4 and I16x16
1993*495ae853SAndroid Build Coastguard Worker      * At very low QP's the hadamard transform in I16x16 will push up the maximum
1994*495ae853SAndroid Build Coastguard Worker      * coeff value very high. CAVLC may not be able to represent the value and
1995*495ae853SAndroid Build Coastguard Worker      * hence the stream may not be decodable in some clips.
1996*495ae853SAndroid Build Coastguard Worker      * Hence at low QPs, we will enable I4x4 and disable I16x16 irrespective of
1997*495ae853SAndroid Build Coastguard Worker      * preset.
1998*495ae853SAndroid Build Coastguard Worker      */
1999*495ae853SAndroid Build Coastguard Worker     if(ps_proc->i4_slice_type == ISLICE)
2000*495ae853SAndroid Build Coastguard Worker     {
2001*495ae853SAndroid Build Coastguard Worker         u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_16x16 ? (1 << I16x16) : 0;
2002*495ae853SAndroid Build Coastguard Worker 
2003*495ae853SAndroid Build Coastguard Worker         /* enable intra 8x8 */
2004*495ae853SAndroid Build Coastguard Worker         u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_8x8 ? (1 << I8x8) : 0;
2005*495ae853SAndroid Build Coastguard Worker 
2006*495ae853SAndroid Build Coastguard Worker         /* enable intra 4x4 */
2007*495ae853SAndroid Build Coastguard Worker         u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_4x4 ? (1 << I4x4) : 0;
2008*495ae853SAndroid Build Coastguard Worker         u4_valid_modes |= (ps_proc->u1_frame_qp <= 10) << I4x4;
2009*495ae853SAndroid Build Coastguard Worker     }
2010*495ae853SAndroid Build Coastguard Worker     else if(ps_proc->i4_slice_type == PSLICE)
2011*495ae853SAndroid Build Coastguard Worker     {
2012*495ae853SAndroid Build Coastguard Worker         u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_16x16 ? (1 << I16x16) : 0;
2013*495ae853SAndroid Build Coastguard Worker 
2014*495ae853SAndroid Build Coastguard Worker         /* enable intra 4x4 */
2015*495ae853SAndroid Build Coastguard Worker         if(ps_codec->s_cfg.u4_enc_speed_preset == IVE_SLOWEST)
2016*495ae853SAndroid Build Coastguard Worker         {
2017*495ae853SAndroid Build Coastguard Worker             u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_4x4 ? (1 << I4x4) : 0;
2018*495ae853SAndroid Build Coastguard Worker         }
2019*495ae853SAndroid Build Coastguard Worker         u4_valid_modes |= (ps_proc->u1_frame_qp <= 10) << I4x4;
2020*495ae853SAndroid Build Coastguard Worker 
2021*495ae853SAndroid Build Coastguard Worker         /* enable inter P16x16 */
2022*495ae853SAndroid Build Coastguard Worker         u4_valid_modes |= (1 << P16x16);
2023*495ae853SAndroid Build Coastguard Worker     }
2024*495ae853SAndroid Build Coastguard Worker     else if(ps_proc->i4_slice_type == BSLICE)
2025*495ae853SAndroid Build Coastguard Worker     {
2026*495ae853SAndroid Build Coastguard Worker         u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_16x16 ? (1 << I16x16) : 0;
2027*495ae853SAndroid Build Coastguard Worker 
2028*495ae853SAndroid Build Coastguard Worker         /* enable intra 4x4 */
2029*495ae853SAndroid Build Coastguard Worker         if(ps_codec->s_cfg.u4_enc_speed_preset == IVE_SLOWEST)
2030*495ae853SAndroid Build Coastguard Worker         {
2031*495ae853SAndroid Build Coastguard Worker             u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_4x4 ? (1 << I4x4) : 0;
2032*495ae853SAndroid Build Coastguard Worker         }
2033*495ae853SAndroid Build Coastguard Worker         u4_valid_modes |= (ps_proc->u1_frame_qp <= 10) << I4x4;
2034*495ae853SAndroid Build Coastguard Worker 
2035*495ae853SAndroid Build Coastguard Worker         /* enable inter B16x16 */
2036*495ae853SAndroid Build Coastguard Worker         u4_valid_modes |= (1 << B16x16);
2037*495ae853SAndroid Build Coastguard Worker     }
2038*495ae853SAndroid Build Coastguard Worker 
2039*495ae853SAndroid Build Coastguard Worker     ps_proc->s_entropy.i4_mb_x = ps_proc->i4_mb_x;
2040*495ae853SAndroid Build Coastguard Worker     ps_proc->s_entropy.i4_mb_y = ps_proc->i4_mb_y;
2041*495ae853SAndroid Build Coastguard Worker     ps_proc->s_entropy.i4_mb_cnt = MIN(ps_proc->i4_nmb_ntrpy, i4_wd_mbs - ps_proc->i4_mb_x);
2042*495ae853SAndroid Build Coastguard Worker 
2043*495ae853SAndroid Build Coastguard Worker     /* compute recon when :
2044*495ae853SAndroid Build Coastguard Worker      *   1. current frame is to be used as a reference
2045*495ae853SAndroid Build Coastguard Worker      *   2. dump recon for bit stream sanity check
2046*495ae853SAndroid Build Coastguard Worker      */
2047*495ae853SAndroid Build Coastguard Worker     ps_proc->u4_compute_recon = ((ps_proc->s_svc_params.u1_num_spatial_layers > 1) &&
2048*495ae853SAndroid Build Coastguard Worker                                  (ENABLE_RESIDUAL_PREDICTION || ENABLE_IBL_MODE)) ||
2049*495ae853SAndroid Build Coastguard Worker                                 ps_codec->u4_is_curr_frm_ref || ps_codec->s_cfg.u4_enable_recon;
2050*495ae853SAndroid Build Coastguard Worker 
2051*495ae853SAndroid Build Coastguard Worker     for(i4_mb_idx = 0; i4_mb_idx < i4_mb_cnt; i4_mb_idx++)
2052*495ae853SAndroid Build Coastguard Worker     {
2053*495ae853SAndroid Build Coastguard Worker         /* since we have not yet found sad, we have not yet got min sad */
2054*495ae853SAndroid Build Coastguard Worker         /* we need to initialize these variables for each MB */
2055*495ae853SAndroid Build Coastguard Worker         /* TODO how to get the min sad into the codec */
2056*495ae853SAndroid Build Coastguard Worker         ps_proc->u4_min_sad = ps_codec->s_cfg.i4_min_sad;
2057*495ae853SAndroid Build Coastguard Worker         ps_proc->u4_min_sad_reached = 0;
2058*495ae853SAndroid Build Coastguard Worker 
2059*495ae853SAndroid Build Coastguard Worker         ps_proc->ps_mb_info->u1_mb_qp = ps_proc->u1_mb_qp;
2060*495ae853SAndroid Build Coastguard Worker 
2061*495ae853SAndroid Build Coastguard Worker         /* wait until the proc of [top + 1] mb is computed.
2062*495ae853SAndroid Build Coastguard Worker          * We wait till the proc dependencies are satisfied */
2063*495ae853SAndroid Build Coastguard Worker         if(ps_proc->i4_mb_y > 0)
2064*495ae853SAndroid Build Coastguard Worker         {
2065*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_proc_map_top;
2066*495ae853SAndroid Build Coastguard Worker 
2067*495ae853SAndroid Build Coastguard Worker             pu1_proc_map_top = ps_proc->pu1_proc_map + ((ps_proc->i4_mb_y - 1) * i4_wd_mbs);
2068*495ae853SAndroid Build Coastguard Worker 
2069*495ae853SAndroid Build Coastguard Worker             while(1)
2070*495ae853SAndroid Build Coastguard Worker             {
2071*495ae853SAndroid Build Coastguard Worker                 volatile UWORD8 *pu1_buf;
2072*495ae853SAndroid Build Coastguard Worker                 WORD32 idx = MIN(i4_mb_cnt - 1, i4_mb_idx + 1);
2073*495ae853SAndroid Build Coastguard Worker 
2074*495ae853SAndroid Build Coastguard Worker                 idx = MIN(idx, ((WORD32) ps_codec->s_cfg.i4_wd_mbs - 1));
2075*495ae853SAndroid Build Coastguard Worker                 pu1_buf = pu1_proc_map_top + idx;
2076*495ae853SAndroid Build Coastguard Worker                 if(*pu1_buf) break;
2077*495ae853SAndroid Build Coastguard Worker                 ithread_yield();
2078*495ae853SAndroid Build Coastguard Worker             }
2079*495ae853SAndroid Build Coastguard Worker         }
2080*495ae853SAndroid Build Coastguard Worker 
2081*495ae853SAndroid Build Coastguard Worker         if(ENABLE_ILP_MV && (ps_proc->u1_spatial_layer_id > 0) &&
2082*495ae853SAndroid Build Coastguard Worker            (ps_proc->i4_slice_type != ISLICE))
2083*495ae853SAndroid Build Coastguard Worker         {
2084*495ae853SAndroid Build Coastguard Worker             svc_ilp_mv_ctxt_t *ps_svc_ilp_mv_ctxt = ps_proc->ps_svc_ilp_mv_ctxt;
2085*495ae853SAndroid Build Coastguard Worker             coordinates_t s_mb_pos = {ps_proc->i4_mb_x, ps_proc->i4_mb_y};
2086*495ae853SAndroid Build Coastguard Worker 
2087*495ae853SAndroid Build Coastguard Worker             ps_svc_ilp_mv_ctxt->s_ilp_mv_variables.ps_svc_ilp_data = &ps_codec->s_svc_ilp_data;
2088*495ae853SAndroid Build Coastguard Worker             ps_svc_ilp_mv_ctxt->s_ilp_mv_variables.s_mb_pos = s_mb_pos;
2089*495ae853SAndroid Build Coastguard Worker             ps_svc_ilp_mv_ctxt->s_ilp_mv_variables.u1_spatial_layer_id =
2090*495ae853SAndroid Build Coastguard Worker                 ps_proc->u1_spatial_layer_id;
2091*495ae853SAndroid Build Coastguard Worker 
2092*495ae853SAndroid Build Coastguard Worker             isvce_get_mb_ilp_mv(ps_svc_ilp_mv_ctxt);
2093*495ae853SAndroid Build Coastguard Worker 
2094*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_ilp_mv = &ps_svc_ilp_mv_ctxt->s_ilp_mv_outputs.s_ilp_mv;
2095*495ae853SAndroid Build Coastguard Worker             ps_proc->s_me_ctxt.ps_ilp_me_cands =
2096*495ae853SAndroid Build Coastguard Worker                 &ps_svc_ilp_mv_ctxt->s_ilp_mv_outputs.s_ilp_me_cands;
2097*495ae853SAndroid Build Coastguard Worker         }
2098*495ae853SAndroid Build Coastguard Worker         else
2099*495ae853SAndroid Build Coastguard Worker         {
2100*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_ilp_mv = NULL;
2101*495ae853SAndroid Build Coastguard Worker             ps_proc->s_me_ctxt.ps_ilp_me_cands = NULL;
2102*495ae853SAndroid Build Coastguard Worker         }
2103*495ae853SAndroid Build Coastguard Worker 
2104*495ae853SAndroid Build Coastguard Worker         ps_proc->ps_mb_info->u2_mb_type = INVALID_MB_TYPE;
2105*495ae853SAndroid Build Coastguard Worker         ps_proc->i4_mb_distortion = SHRT_MAX;
2106*495ae853SAndroid Build Coastguard Worker 
2107*495ae853SAndroid Build Coastguard Worker         {
2108*495ae853SAndroid Build Coastguard Worker             WORD32 i4_mb_id = ps_proc->i4_mb_x + ps_proc->i4_mb_y * i4_wd_mbs;
2109*495ae853SAndroid Build Coastguard Worker 
2110*495ae853SAndroid Build Coastguard Worker             WORD32 i4_air_enable_inter =
2111*495ae853SAndroid Build Coastguard Worker                 (ps_codec->s_cfg.e_air_mode == IVE_AIR_MODE_NONE) ||
2112*495ae853SAndroid Build Coastguard Worker                 (ps_codec->pu2_intr_rfrsh_map[i4_mb_id] != ps_codec->i4_air_pic_cnt);
2113*495ae853SAndroid Build Coastguard Worker 
2114*495ae853SAndroid Build Coastguard Worker             if((u4_valid_modes & (1 << P16x16)) || (u4_valid_modes & (1 << B16x16)))
2115*495ae853SAndroid Build Coastguard Worker             {
2116*495ae853SAndroid Build Coastguard Worker                 if(ps_proc->i4_mb_x % ps_proc->u4_nmb_me == 0)
2117*495ae853SAndroid Build Coastguard Worker                 {
2118*495ae853SAndroid Build Coastguard Worker                     isvce_compute_me_nmb(
2119*495ae853SAndroid Build Coastguard Worker                         ps_proc, MIN((WORD32) ps_proc->u4_nmb_me, i4_wd_mbs - ps_proc->i4_mb_x));
2120*495ae853SAndroid Build Coastguard Worker                 }
2121*495ae853SAndroid Build Coastguard Worker 
2122*495ae853SAndroid Build Coastguard Worker                 {
2123*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_mb_index = ps_proc->i4_mb_x % ps_proc->u4_nmb_me;
2124*495ae853SAndroid Build Coastguard Worker 
2125*495ae853SAndroid Build Coastguard Worker                     ps_proc->u4_min_sad_reached =
2126*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_nmb_info[u4_mb_index].u4_min_sad_reached;
2127*495ae853SAndroid Build Coastguard Worker                     ps_proc->u4_min_sad = ps_proc->ps_nmb_info[u4_mb_index].u4_min_sad;
2128*495ae853SAndroid Build Coastguard Worker 
2129*495ae853SAndroid Build Coastguard Worker                     ps_proc->ps_skip_mv = &(ps_proc->ps_nmb_info[u4_mb_index].as_skip_mv[0]);
2130*495ae853SAndroid Build Coastguard Worker                     ps_proc->ps_ngbr_avbl = &(ps_proc->ps_nmb_info[u4_mb_index].s_ngbr_avbl);
2131*495ae853SAndroid Build Coastguard Worker                     ps_proc->ps_pred_mv = &(ps_proc->ps_nmb_info[u4_mb_index].as_pred_mv[0]);
2132*495ae853SAndroid Build Coastguard Worker 
2133*495ae853SAndroid Build Coastguard Worker                     ps_proc->i4_mb_distortion = ps_proc->ps_nmb_info[u4_mb_index].i4_mb_distortion;
2134*495ae853SAndroid Build Coastguard Worker 
2135*495ae853SAndroid Build Coastguard Worker                     ps_proc->i4_mb_cost = ps_proc->ps_nmb_info[u4_mb_index].i4_mb_cost;
2136*495ae853SAndroid Build Coastguard Worker                     ps_proc->u4_min_sad = ps_proc->ps_nmb_info[u4_mb_index].u4_min_sad;
2137*495ae853SAndroid Build Coastguard Worker                     ps_proc->u4_min_sad_reached =
2138*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_nmb_info[u4_mb_index].u4_min_sad_reached;
2139*495ae853SAndroid Build Coastguard Worker                     ps_proc->ps_mb_info->u2_mb_type = ps_proc->ps_nmb_info[u4_mb_index].u4_mb_type;
2140*495ae853SAndroid Build Coastguard Worker 
2141*495ae853SAndroid Build Coastguard Worker                     ps_proc->pu1_best_subpel_buf =
2142*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_nmb_info[u4_mb_index].pu1_best_sub_pel_buf;
2143*495ae853SAndroid Build Coastguard Worker                     ps_proc->u4_bst_spel_buf_strd =
2144*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_nmb_info[u4_mb_index].u4_bst_spel_buf_strd;
2145*495ae853SAndroid Build Coastguard Worker                 }
2146*495ae853SAndroid Build Coastguard Worker 
2147*495ae853SAndroid Build Coastguard Worker                 isvce_derive_nghbr_avbl_of_mbs(ps_proc);
2148*495ae853SAndroid Build Coastguard Worker             }
2149*495ae853SAndroid Build Coastguard Worker             else
2150*495ae853SAndroid Build Coastguard Worker             {
2151*495ae853SAndroid Build Coastguard Worker                 ps_proc->ps_ngbr_avbl = &ps_proc->s_ngbr_avbl;
2152*495ae853SAndroid Build Coastguard Worker 
2153*495ae853SAndroid Build Coastguard Worker                 isvce_derive_nghbr_avbl_of_mbs(ps_proc);
2154*495ae853SAndroid Build Coastguard Worker             }
2155*495ae853SAndroid Build Coastguard Worker 
2156*495ae853SAndroid Build Coastguard Worker             /*
2157*495ae853SAndroid Build Coastguard Worker              * If air says intra, we need to force the following code path to evaluate
2158*495ae853SAndroid Build Coastguard Worker              * intra The easy way is just to say that the inter cost is too much
2159*495ae853SAndroid Build Coastguard Worker              */
2160*495ae853SAndroid Build Coastguard Worker             if(!i4_air_enable_inter)
2161*495ae853SAndroid Build Coastguard Worker             {
2162*495ae853SAndroid Build Coastguard Worker                 ps_proc->u4_min_sad_reached = 0;
2163*495ae853SAndroid Build Coastguard Worker                 ps_proc->i4_mb_cost = INT_MAX;
2164*495ae853SAndroid Build Coastguard Worker                 ps_proc->i4_mb_distortion = INT_MAX;
2165*495ae853SAndroid Build Coastguard Worker             }
2166*495ae853SAndroid Build Coastguard Worker             else if(ps_proc->ps_mb_info->u2_mb_type == PSKIP)
2167*495ae853SAndroid Build Coastguard Worker             {
2168*495ae853SAndroid Build Coastguard Worker                 ps_proc->ps_mb_info->u1_base_mode_flag = 0;
2169*495ae853SAndroid Build Coastguard Worker                 ps_proc->ps_mb_info->u1_residual_prediction_flag = 0;
2170*495ae853SAndroid Build Coastguard Worker                 goto UPDATE_MB_INFO;
2171*495ae853SAndroid Build Coastguard Worker             }
2172*495ae853SAndroid Build Coastguard Worker 
2173*495ae853SAndroid Build Coastguard Worker             /* If we already have the minimum sad, there is no point in searching for
2174*495ae853SAndroid Build Coastguard Worker              * sad again */
2175*495ae853SAndroid Build Coastguard Worker             if((ps_proc->u4_min_sad_reached == 0) ||
2176*495ae853SAndroid Build Coastguard Worker                (ps_codec->s_cfg.u4_enc_speed_preset != IVE_FASTEST))
2177*495ae853SAndroid Build Coastguard Worker             {
2178*495ae853SAndroid Build Coastguard Worker                 /* intra gating in inter slices */
2179*495ae853SAndroid Build Coastguard Worker                 /* No need of gating if we want to force intra, we need to find the
2180*495ae853SAndroid Build Coastguard Worker                  * threshold only if inter is enabled by AIR*/
2181*495ae853SAndroid Build Coastguard Worker                 if((ps_proc->i4_slice_type != ISLICE) &&
2182*495ae853SAndroid Build Coastguard Worker                    (FORCE_DISTORTION_BASED_INTRA_4X4_GATING ||
2183*495ae853SAndroid Build Coastguard Worker                     (i4_air_enable_inter && ps_codec->u4_inter_gate)))
2184*495ae853SAndroid Build Coastguard Worker                 {
2185*495ae853SAndroid Build Coastguard Worker                     WORD32 i4_distortion[4];
2186*495ae853SAndroid Build Coastguard Worker 
2187*495ae853SAndroid Build Coastguard Worker                     if((ps_proc->i4_mb_x > 0) && (ps_proc->i4_mb_y > 0))
2188*495ae853SAndroid Build Coastguard Worker                     {
2189*495ae853SAndroid Build Coastguard Worker                         i4_distortion[0] = ps_proc->s_nbr_info.ps_left_mb_info->i4_mb_distortion;
2190*495ae853SAndroid Build Coastguard Worker 
2191*495ae853SAndroid Build Coastguard Worker                         i4_distortion[1] = ps_proc->s_nbr_info.ps_top_row_mb_info[ps_proc->i4_mb_x]
2192*495ae853SAndroid Build Coastguard Worker                                                .i4_mb_distortion;
2193*495ae853SAndroid Build Coastguard Worker 
2194*495ae853SAndroid Build Coastguard Worker                         i4_distortion[2] =
2195*495ae853SAndroid Build Coastguard Worker                             ps_proc->s_nbr_info.ps_top_row_mb_info[ps_proc->i4_mb_x + 1]
2196*495ae853SAndroid Build Coastguard Worker                                 .i4_mb_distortion;
2197*495ae853SAndroid Build Coastguard Worker 
2198*495ae853SAndroid Build Coastguard Worker                         i4_distortion[3] =
2199*495ae853SAndroid Build Coastguard Worker                             ps_proc->s_nbr_info.ps_top_row_mb_info[ps_proc->i4_mb_x - 1]
2200*495ae853SAndroid Build Coastguard Worker                                 .i4_mb_distortion;
2201*495ae853SAndroid Build Coastguard Worker 
2202*495ae853SAndroid Build Coastguard Worker                         i4_gate_threshold = (i4_distortion[0] + i4_distortion[1] +
2203*495ae853SAndroid Build Coastguard Worker                                              i4_distortion[2] + i4_distortion[3]) /
2204*495ae853SAndroid Build Coastguard Worker                                             4;
2205*495ae853SAndroid Build Coastguard Worker                     }
2206*495ae853SAndroid Build Coastguard Worker                 }
2207*495ae853SAndroid Build Coastguard Worker 
2208*495ae853SAndroid Build Coastguard Worker                 b_enable_intra4x4_eval = true;
2209*495ae853SAndroid Build Coastguard Worker 
2210*495ae853SAndroid Build Coastguard Worker                 if(ENABLE_IBL_MODE && (ps_proc->u1_spatial_layer_id > 0) &&
2211*495ae853SAndroid Build Coastguard Worker                    (ps_proc->s_svc_params.d_spatial_res_ratio == 2.) && !ps_proc->ps_ilp_mv)
2212*495ae853SAndroid Build Coastguard Worker                 {
2213*495ae853SAndroid Build Coastguard Worker                     isvce_evaluate_IBL_mode(ps_proc);
2214*495ae853SAndroid Build Coastguard Worker                 }
2215*495ae853SAndroid Build Coastguard Worker                 else
2216*495ae853SAndroid Build Coastguard Worker                 {
2217*495ae853SAndroid Build Coastguard Worker                     ps_proc->ps_mb_info->u1_base_mode_flag = 0;
2218*495ae853SAndroid Build Coastguard Worker                 }
2219*495ae853SAndroid Build Coastguard Worker 
2220*495ae853SAndroid Build Coastguard Worker                 if(u4_valid_modes & (1 << I16x16))
2221*495ae853SAndroid Build Coastguard Worker                 {
2222*495ae853SAndroid Build Coastguard Worker                     isvce_evaluate_intra16x16_modes_for_least_cost_rdoptoff(ps_proc);
2223*495ae853SAndroid Build Coastguard Worker 
2224*495ae853SAndroid Build Coastguard Worker                     if(ENABLE_INTRA16X16_BASED_INTRA4X4_GATING &&
2225*495ae853SAndroid Build Coastguard Worker                        (ps_proc->i4_slice_type != ISLICE) &&
2226*495ae853SAndroid Build Coastguard Worker                        (ps_proc->ps_mb_info->u2_mb_type == I16x16))
2227*495ae853SAndroid Build Coastguard Worker                     {
2228*495ae853SAndroid Build Coastguard Worker                         b_enable_intra4x4_eval = false;
2229*495ae853SAndroid Build Coastguard Worker                     }
2230*495ae853SAndroid Build Coastguard Worker                 }
2231*495ae853SAndroid Build Coastguard Worker 
2232*495ae853SAndroid Build Coastguard Worker                 if(u4_valid_modes & (1 << I8x8))
2233*495ae853SAndroid Build Coastguard Worker                 {
2234*495ae853SAndroid Build Coastguard Worker                     isvce_evaluate_intra8x8_modes_for_least_cost_rdoptoff(ps_proc);
2235*495ae853SAndroid Build Coastguard Worker                 }
2236*495ae853SAndroid Build Coastguard Worker 
2237*495ae853SAndroid Build Coastguard Worker                 if(ENABLE_ILP_BASED_INTRA4X4_GATING && (ps_proc->i4_slice_type != ISLICE))
2238*495ae853SAndroid Build Coastguard Worker                 {
2239*495ae853SAndroid Build Coastguard Worker                     b_enable_intra4x4_eval =
2240*495ae853SAndroid Build Coastguard Worker                         !(ps_proc->ps_ilp_mv && (INVALID_MB_TYPE != ps_proc->ps_ilp_mv->e_mb_type));
2241*495ae853SAndroid Build Coastguard Worker                 }
2242*495ae853SAndroid Build Coastguard Worker 
2243*495ae853SAndroid Build Coastguard Worker                 /* If we are going to force intra we need to evaluate intra irrespective
2244*495ae853SAndroid Build Coastguard Worker                  * of gating */
2245*495ae853SAndroid Build Coastguard Worker                 if((!i4_air_enable_inter) ||
2246*495ae853SAndroid Build Coastguard Worker                    ((i4_gate_threshold + 16 * ((WORD32) ps_proc->u4_lambda)) <
2247*495ae853SAndroid Build Coastguard Worker                     ps_proc->i4_mb_distortion))
2248*495ae853SAndroid Build Coastguard Worker                 {
2249*495ae853SAndroid Build Coastguard Worker                     if(b_enable_intra4x4_eval && (u4_valid_modes & (1 << I4x4)))
2250*495ae853SAndroid Build Coastguard Worker                     {
2251*495ae853SAndroid Build Coastguard Worker                         if(!FORCE_FAST_INTRA4X4 &&
2252*495ae853SAndroid Build Coastguard Worker                            (ps_codec->s_cfg.u4_enc_speed_preset == IVE_SLOWEST))
2253*495ae853SAndroid Build Coastguard Worker                         {
2254*495ae853SAndroid Build Coastguard Worker                             isvce_evaluate_intra4x4_modes_for_least_cost_rdopton(ps_proc);
2255*495ae853SAndroid Build Coastguard Worker                         }
2256*495ae853SAndroid Build Coastguard Worker                         else
2257*495ae853SAndroid Build Coastguard Worker                         {
2258*495ae853SAndroid Build Coastguard Worker                             isvce_evaluate_intra4x4_modes_for_least_cost_rdoptoff(ps_proc);
2259*495ae853SAndroid Build Coastguard Worker                         }
2260*495ae853SAndroid Build Coastguard Worker                     }
2261*495ae853SAndroid Build Coastguard Worker                 }
2262*495ae853SAndroid Build Coastguard Worker             }
2263*495ae853SAndroid Build Coastguard Worker         }
2264*495ae853SAndroid Build Coastguard Worker 
2265*495ae853SAndroid Build Coastguard Worker         if(ps_proc->ps_mb_info->u2_mb_type == I4x4 || ps_proc->ps_mb_info->u2_mb_type == I16x16 ||
2266*495ae853SAndroid Build Coastguard Worker            ps_proc->ps_mb_info->u2_mb_type == I8x8)
2267*495ae853SAndroid Build Coastguard Worker         {
2268*495ae853SAndroid Build Coastguard Worker             luma_idx = ps_proc->ps_mb_info->u2_mb_type;
2269*495ae853SAndroid Build Coastguard Worker             chroma_idx = 0;
2270*495ae853SAndroid Build Coastguard Worker             is_intra = 1;
2271*495ae853SAndroid Build Coastguard Worker 
2272*495ae853SAndroid Build Coastguard Worker             isvce_evaluate_chroma_intra8x8_modes_for_least_cost_rdoptoff(ps_proc);
2273*495ae853SAndroid Build Coastguard Worker         }
2274*495ae853SAndroid Build Coastguard Worker         else if(ps_proc->ps_mb_info->u2_mb_type == BASE_MODE)
2275*495ae853SAndroid Build Coastguard Worker         {
2276*495ae853SAndroid Build Coastguard Worker             luma_idx = 3;
2277*495ae853SAndroid Build Coastguard Worker             chroma_idx = 1;
2278*495ae853SAndroid Build Coastguard Worker             is_intra = 1;
2279*495ae853SAndroid Build Coastguard Worker             ps_proc->u4_min_sad_reached = 0;
2280*495ae853SAndroid Build Coastguard Worker         }
2281*495ae853SAndroid Build Coastguard Worker         else
2282*495ae853SAndroid Build Coastguard Worker         {
2283*495ae853SAndroid Build Coastguard Worker             luma_idx = 3;
2284*495ae853SAndroid Build Coastguard Worker             chroma_idx = 1;
2285*495ae853SAndroid Build Coastguard Worker             is_intra = 0;
2286*495ae853SAndroid Build Coastguard Worker         }
2287*495ae853SAndroid Build Coastguard Worker 
2288*495ae853SAndroid Build Coastguard Worker         ps_proc->ps_mb_info->u1_is_intra = is_intra;
2289*495ae853SAndroid Build Coastguard Worker 
2290*495ae853SAndroid Build Coastguard Worker         if(is_intra)
2291*495ae853SAndroid Build Coastguard Worker         {
2292*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->as_pu->as_me_info[L0].i1_ref_idx = -1;
2293*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->as_pu->as_me_info[L0].s_mv.i2_mvx = 0;
2294*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->as_pu->as_me_info[L0].s_mv.i2_mvy = 0;
2295*495ae853SAndroid Build Coastguard Worker 
2296*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->as_pu->as_me_info[L1].i1_ref_idx = -1;
2297*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->as_pu->as_me_info[L1].s_mv.i2_mvx = 0;
2298*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->as_pu->as_me_info[L1].s_mv.i2_mvy = 0;
2299*495ae853SAndroid Build Coastguard Worker         }
2300*495ae853SAndroid Build Coastguard Worker         else
2301*495ae853SAndroid Build Coastguard Worker         {
2302*495ae853SAndroid Build Coastguard Worker             isvce_mv_pred(ps_proc, ps_proc->i4_slice_type);
2303*495ae853SAndroid Build Coastguard Worker         }
2304*495ae853SAndroid Build Coastguard Worker 
2305*495ae853SAndroid Build Coastguard Worker         if(ENABLE_RESIDUAL_PREDICTION && !is_intra && (ps_proc->u1_spatial_layer_id > 0) &&
2306*495ae853SAndroid Build Coastguard Worker            (ps_proc->i4_slice_type == PSLICE) && (ps_proc->ps_mb_info->u2_mb_type != PSKIP))
2307*495ae853SAndroid Build Coastguard Worker         {
2308*495ae853SAndroid Build Coastguard Worker             svc_res_pred_ctxt_t *ps_res_pred_ctxt = ps_proc->ps_res_pred_ctxt;
2309*495ae853SAndroid Build Coastguard Worker 
2310*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_res_pred_sad;
2311*495ae853SAndroid Build Coastguard Worker 
2312*495ae853SAndroid Build Coastguard Worker             isvce_me_ctxt_t *ps_me_ctxt = &ps_proc->s_me_ctxt;
2313*495ae853SAndroid Build Coastguard Worker             yuv_buf_props_t s_pred = ps_proc->s_src_buf_props;
2314*495ae853SAndroid Build Coastguard Worker 
2315*495ae853SAndroid Build Coastguard Worker             if(!(ps_proc->ps_mb_info->as_pu->as_me_info[L0].s_mv.i2_mvx % 4) &&
2316*495ae853SAndroid Build Coastguard Worker                !(ps_proc->ps_mb_info->as_pu->as_me_info[L0].s_mv.i2_mvy % 4))
2317*495ae853SAndroid Build Coastguard Worker             {
2318*495ae853SAndroid Build Coastguard Worker                 s_pred.as_component_bufs[Y].pv_data =
2319*495ae853SAndroid Build Coastguard Worker                     ps_me_ctxt->apu1_ref_buf_luma[L0] +
2320*495ae853SAndroid Build Coastguard Worker                     (ps_me_ctxt->as_mb_part[L0].s_mv_curr.i2_mvx >> 2) +
2321*495ae853SAndroid Build Coastguard Worker                     (ps_me_ctxt->as_mb_part[L0].s_mv_curr.i2_mvy >> 2) *
2322*495ae853SAndroid Build Coastguard Worker                         ps_me_ctxt->ai4_rec_strd[L0];
2323*495ae853SAndroid Build Coastguard Worker                 s_pred.as_component_bufs[Y].i4_data_stride = ps_me_ctxt->ai4_rec_strd[L0];
2324*495ae853SAndroid Build Coastguard Worker             }
2325*495ae853SAndroid Build Coastguard Worker             else
2326*495ae853SAndroid Build Coastguard Worker             {
2327*495ae853SAndroid Build Coastguard Worker                 s_pred.as_component_bufs[Y].pv_data = ps_proc->pu1_best_subpel_buf;
2328*495ae853SAndroid Build Coastguard Worker                 s_pred.as_component_bufs[Y].i4_data_stride = ps_proc->u4_bst_spel_buf_strd;
2329*495ae853SAndroid Build Coastguard Worker             }
2330*495ae853SAndroid Build Coastguard Worker 
2331*495ae853SAndroid Build Coastguard Worker             s_pred.as_component_bufs[U].pv_data = s_pred.as_component_bufs[V].pv_data = NULL;
2332*495ae853SAndroid Build Coastguard Worker 
2333*495ae853SAndroid Build Coastguard Worker             ps_res_pred_ctxt->s_res_pred_variables.ps_svc_ilp_data = &ps_codec->s_svc_ilp_data;
2334*495ae853SAndroid Build Coastguard Worker             ps_res_pred_ctxt->s_res_pred_variables.s_mb_pos.i4_abscissa = ps_proc->i4_mb_x;
2335*495ae853SAndroid Build Coastguard Worker             ps_res_pred_ctxt->s_res_pred_variables.s_mb_pos.i4_ordinate = ps_proc->i4_mb_y;
2336*495ae853SAndroid Build Coastguard Worker             ps_res_pred_ctxt->s_res_pred_variables.u1_spatial_layer_id =
2337*495ae853SAndroid Build Coastguard Worker                 ps_proc->u1_spatial_layer_id;
2338*495ae853SAndroid Build Coastguard Worker 
2339*495ae853SAndroid Build Coastguard Worker             if(ps_proc->s_svc_params.d_spatial_res_ratio == 2.)
2340*495ae853SAndroid Build Coastguard Worker             {
2341*495ae853SAndroid Build Coastguard Worker                 isvce_get_mb_residual_pred(ps_proc->ps_res_pred_ctxt);
2342*495ae853SAndroid Build Coastguard Worker             }
2343*495ae853SAndroid Build Coastguard Worker             else
2344*495ae853SAndroid Build Coastguard Worker             {
2345*495ae853SAndroid Build Coastguard Worker                 isvce_get_mb_residual_pred_non_dyadic(ps_proc->ps_res_pred_ctxt);
2346*495ae853SAndroid Build Coastguard Worker             }
2347*495ae853SAndroid Build Coastguard Worker 
2348*495ae853SAndroid Build Coastguard Worker             isvce_residual_pred_eval(ps_proc->ps_res_pred_ctxt, &ps_proc->s_src_buf_props, &s_pred,
2349*495ae853SAndroid Build Coastguard Worker                                      ps_proc->ps_mb_res_buf, &u4_res_pred_sad,
2350*495ae853SAndroid Build Coastguard Worker                                      &ps_proc->ps_mb_info->u1_residual_prediction_flag,
2351*495ae853SAndroid Build Coastguard Worker                                      ps_proc->i4_mb_distortion);
2352*495ae853SAndroid Build Coastguard Worker 
2353*495ae853SAndroid Build Coastguard Worker             if(ps_proc->ps_mb_info->u1_residual_prediction_flag)
2354*495ae853SAndroid Build Coastguard Worker             {
2355*495ae853SAndroid Build Coastguard Worker                 ps_proc->i4_mb_cost -= ps_proc->i4_mb_distortion;
2356*495ae853SAndroid Build Coastguard Worker                 ps_proc->i4_mb_cost += (WORD32) u4_res_pred_sad;
2357*495ae853SAndroid Build Coastguard Worker                 ps_proc->i4_mb_distortion = (WORD32) u4_res_pred_sad;
2358*495ae853SAndroid Build Coastguard Worker             }
2359*495ae853SAndroid Build Coastguard Worker         }
2360*495ae853SAndroid Build Coastguard Worker         else
2361*495ae853SAndroid Build Coastguard Worker         {
2362*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_residual_prediction_flag = 0;
2363*495ae853SAndroid Build Coastguard Worker         }
2364*495ae853SAndroid Build Coastguard Worker 
2365*495ae853SAndroid Build Coastguard Worker         if(isvce_is_ilp_mv_winning_mv(ps_proc->ps_mb_info, ps_proc->ps_ilp_mv))
2366*495ae853SAndroid Build Coastguard Worker         {
2367*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->as_pu->as_me_info[L0] = ps_proc->ps_ilp_mv->as_mv[0][L0];
2368*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->as_pu->as_me_info[L1] = ps_proc->ps_ilp_mv->as_mv[0][L1];
2369*495ae853SAndroid Build Coastguard Worker 
2370*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_base_mode_flag = 1;
2371*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u2_mb_type = BASE_MODE;
2372*495ae853SAndroid Build Coastguard Worker         }
2373*495ae853SAndroid Build Coastguard Worker         else if(ps_proc->ps_mb_info->u2_mb_type != BASE_MODE)
2374*495ae853SAndroid Build Coastguard Worker         {
2375*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u1_base_mode_flag = 0;
2376*495ae853SAndroid Build Coastguard Worker         }
2377*495ae853SAndroid Build Coastguard Worker 
2378*495ae853SAndroid Build Coastguard Worker         isvce_mvp_idx_eval(ps_proc->ps_mb_info, ps_proc->ps_pred_mv,
2379*495ae853SAndroid Build Coastguard Worker                            ps_proc->ps_ilp_mv ? ps_proc->ps_ilp_mv->as_mv[0] : NULL,
2380*495ae853SAndroid Build Coastguard Worker                            ps_proc->s_me_ctxt.pu1_mv_bits);
2381*495ae853SAndroid Build Coastguard Worker 
2382*495ae853SAndroid Build Coastguard Worker         /* 8x8 Tx is not supported, and I8x8 is also unsupported */
2383*495ae853SAndroid Build Coastguard Worker         ASSERT((luma_idx == 0) || (luma_idx == 1) || (luma_idx == 3));
2384*495ae853SAndroid Build Coastguard Worker         ps_proc->ps_mb_info->u1_tx_size = 4;
2385*495ae853SAndroid Build Coastguard Worker 
2386*495ae853SAndroid Build Coastguard Worker         /* Perform luma mb core coding */
2387*495ae853SAndroid Build Coastguard Worker         u4_cbp_l = (ps_enc_loop_fxns->apf_luma_energy_compaction)[luma_idx](ps_proc);
2388*495ae853SAndroid Build Coastguard Worker 
2389*495ae853SAndroid Build Coastguard Worker         /* Perform chroma mb core coding */
2390*495ae853SAndroid Build Coastguard Worker         u4_cbp_c = (ps_enc_loop_fxns->apf_chroma_energy_compaction)[chroma_idx](ps_proc);
2391*495ae853SAndroid Build Coastguard Worker 
2392*495ae853SAndroid Build Coastguard Worker         ps_proc->u4_cbp = (u4_cbp_c << 4) | u4_cbp_l;
2393*495ae853SAndroid Build Coastguard Worker         ps_proc->ps_mb_info->u4_cbp = (u4_cbp_c << 4) | u4_cbp_l;
2394*495ae853SAndroid Build Coastguard Worker         ps_proc->ps_mb_info->u4_csbp = isvce_calculate_csbp(ps_proc);
2395*495ae853SAndroid Build Coastguard Worker 
2396*495ae853SAndroid Build Coastguard Worker         if(ps_proc->ps_mb_info->u1_is_intra)
2397*495ae853SAndroid Build Coastguard Worker         {
2398*495ae853SAndroid Build Coastguard Worker             switch(ps_proc->ps_mb_info->u2_mb_type)
2399*495ae853SAndroid Build Coastguard Worker             {
2400*495ae853SAndroid Build Coastguard Worker                 case I16x16:
2401*495ae853SAndroid Build Coastguard Worker                 {
2402*495ae853SAndroid Build Coastguard Worker                     ps_proc->ps_mb_info->s_intra_pu.s_i16x16_mode_data.u1_mode =
2403*495ae853SAndroid Build Coastguard Worker                         ps_proc->u1_l_i16_mode;
2404*495ae853SAndroid Build Coastguard Worker 
2405*495ae853SAndroid Build Coastguard Worker                     break;
2406*495ae853SAndroid Build Coastguard Worker                 }
2407*495ae853SAndroid Build Coastguard Worker                 case I4x4:
2408*495ae853SAndroid Build Coastguard Worker                 {
2409*495ae853SAndroid Build Coastguard Worker                     WORD32 i;
2410*495ae853SAndroid Build Coastguard Worker 
2411*495ae853SAndroid Build Coastguard Worker                     for(i = 0; i < MAX_TU_IN_MB; i++)
2412*495ae853SAndroid Build Coastguard Worker                     {
2413*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_mb_info->s_intra_pu.as_i4x4_mode_data[i].u1_mode =
2414*495ae853SAndroid Build Coastguard Worker                             ps_proc->au1_intra_luma_mb_4x4_modes[i];
2415*495ae853SAndroid Build Coastguard Worker                         ps_proc->ps_mb_info->s_intra_pu.as_i4x4_mode_data[i].u1_predicted_mode =
2416*495ae853SAndroid Build Coastguard Worker                             ps_proc->au1_predicted_intra_luma_mb_4x4_modes[i];
2417*495ae853SAndroid Build Coastguard Worker                     }
2418*495ae853SAndroid Build Coastguard Worker 
2419*495ae853SAndroid Build Coastguard Worker                     break;
2420*495ae853SAndroid Build Coastguard Worker                 }
2421*495ae853SAndroid Build Coastguard Worker                 case BASE_MODE:
2422*495ae853SAndroid Build Coastguard Worker                 {
2423*495ae853SAndroid Build Coastguard Worker                     break;
2424*495ae853SAndroid Build Coastguard Worker                 }
2425*495ae853SAndroid Build Coastguard Worker                 default:
2426*495ae853SAndroid Build Coastguard Worker                 {
2427*495ae853SAndroid Build Coastguard Worker                     ASSERT(false);
2428*495ae853SAndroid Build Coastguard Worker                 }
2429*495ae853SAndroid Build Coastguard Worker             }
2430*495ae853SAndroid Build Coastguard Worker 
2431*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->s_intra_pu.u1_chroma_intra_mode = ps_proc->u1_c_i8_mode;
2432*495ae853SAndroid Build Coastguard Worker         }
2433*495ae853SAndroid Build Coastguard Worker 
2434*495ae853SAndroid Build Coastguard Worker         if(!ps_proc->ps_mb_info->u1_is_intra && !ps_proc->ps_mb_info->u1_residual_prediction_flag)
2435*495ae853SAndroid Build Coastguard Worker         {
2436*495ae853SAndroid Build Coastguard Worker             if(ps_proc->i4_slice_type == BSLICE)
2437*495ae853SAndroid Build Coastguard Worker             {
2438*495ae853SAndroid Build Coastguard Worker                 if(isvce_find_bskip_params(ps_proc, L0))
2439*495ae853SAndroid Build Coastguard Worker                 {
2440*495ae853SAndroid Build Coastguard Worker                     ps_proc->ps_mb_info->u2_mb_type = (ps_proc->u4_cbp) ? BDIRECT : BSKIP;
2441*495ae853SAndroid Build Coastguard Worker                 }
2442*495ae853SAndroid Build Coastguard Worker             }
2443*495ae853SAndroid Build Coastguard Worker             else if(!ps_proc->u4_cbp)
2444*495ae853SAndroid Build Coastguard Worker             {
2445*495ae853SAndroid Build Coastguard Worker                 if(isvce_find_pskip_params(ps_proc, L0))
2446*495ae853SAndroid Build Coastguard Worker                 {
2447*495ae853SAndroid Build Coastguard Worker                     ps_proc->ps_mb_info->u2_mb_type = PSKIP;
2448*495ae853SAndroid Build Coastguard Worker                 }
2449*495ae853SAndroid Build Coastguard Worker             }
2450*495ae853SAndroid Build Coastguard Worker         }
2451*495ae853SAndroid Build Coastguard Worker 
2452*495ae853SAndroid Build Coastguard Worker     UPDATE_MB_INFO:
2453*495ae853SAndroid Build Coastguard Worker         isvce_svc_ilp_buf_update(ps_proc);
2454*495ae853SAndroid Build Coastguard Worker 
2455*495ae853SAndroid Build Coastguard Worker         isvce_update_ibl_info(
2456*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_intra_pred_ctxt, ps_proc->s_svc_params.u1_num_spatial_layers,
2457*495ae853SAndroid Build Coastguard Worker             ps_proc->u1_spatial_layer_id, ps_proc->ps_mb_info->u2_mb_type, ps_proc->i4_mb_x,
2458*495ae853SAndroid Build Coastguard Worker             ps_proc->i4_mb_y, ps_proc->ps_mb_info->u1_base_mode_flag);
2459*495ae853SAndroid Build Coastguard Worker 
2460*495ae853SAndroid Build Coastguard Worker         isvce_update_res_pred_info(ps_proc);
2461*495ae853SAndroid Build Coastguard Worker 
2462*495ae853SAndroid Build Coastguard Worker         /* Update mb sad, mb qp and intra mb cost. Will be used by rate control */
2463*495ae853SAndroid Build Coastguard Worker         isvce_update_rc_mb_info(&ps_proc->s_frame_info, ps_proc);
2464*495ae853SAndroid Build Coastguard Worker 
2465*495ae853SAndroid Build Coastguard Worker         {
2466*495ae853SAndroid Build Coastguard Worker             svc_sub_pic_rc_ctxt_t *ps_sub_pic_rc_ctxt = ps_proc->ps_sub_pic_rc_ctxt;
2467*495ae853SAndroid Build Coastguard Worker             svc_sub_pic_rc_mb_variables_t *ps_sub_pic_rc_variables =
2468*495ae853SAndroid Build Coastguard Worker                 &ps_sub_pic_rc_ctxt->s_sub_pic_rc_variables.s_mb_variables;
2469*495ae853SAndroid Build Coastguard Worker 
2470*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->ps_mb_info = ps_proc->ps_mb_info;
2471*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->s_mb_pos.i4_abscissa = ps_proc->i4_mb_x;
2472*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->s_mb_pos.i4_ordinate = ps_proc->i4_mb_y;
2473*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->u4_cbp = ps_proc->u4_cbp;
2474*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->aps_mvps[0] = ps_proc->ps_pred_mv;
2475*495ae853SAndroid Build Coastguard Worker #if MAX_MVP_IDX == 1
2476*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->aps_mvps[1] =
2477*495ae853SAndroid Build Coastguard Worker                 ps_proc->ps_ilp_mv ? ps_proc->ps_ilp_mv->as_mv[0] : NULL;
2478*495ae853SAndroid Build Coastguard Worker #endif
2479*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->apu1_nnzs[Y] = (UWORD8 *) ps_proc->au4_nnz;
2480*495ae853SAndroid Build Coastguard Worker             ps_sub_pic_rc_variables->apu1_nnzs[UV] = ps_proc->au1_chroma_nnz;
2481*495ae853SAndroid Build Coastguard Worker 
2482*495ae853SAndroid Build Coastguard Worker             /* Quant coeffs are arranged TU by TU */
2483*495ae853SAndroid Build Coastguard Worker             switch(ps_proc->ps_mb_info->u2_mb_type)
2484*495ae853SAndroid Build Coastguard Worker             {
2485*495ae853SAndroid Build Coastguard Worker                 case I16x16:
2486*495ae853SAndroid Build Coastguard Worker                 case I4x4:
2487*495ae853SAndroid Build Coastguard Worker                 case P16x16:
2488*495ae853SAndroid Build Coastguard Worker                 case B16x16:
2489*495ae853SAndroid Build Coastguard Worker                 case BASE_MODE:
2490*495ae853SAndroid Build Coastguard Worker                 {
2491*495ae853SAndroid Build Coastguard Worker                     ps_sub_pic_rc_variables->as_quant_coeffs[Y].pv_data =
2492*495ae853SAndroid Build Coastguard Worker                         ps_proc->pi2_res_buf_intra_4x4;
2493*495ae853SAndroid Build Coastguard Worker                     ps_sub_pic_rc_variables->as_quant_coeffs[Y].i4_data_stride =
2494*495ae853SAndroid Build Coastguard Worker                         ps_proc->i4_res_strd;
2495*495ae853SAndroid Build Coastguard Worker                     ps_sub_pic_rc_variables->as_quant_coeffs[UV].pv_data = ps_proc->pi2_res_buf;
2496*495ae853SAndroid Build Coastguard Worker                     ps_sub_pic_rc_variables->as_quant_coeffs[UV].i4_data_stride =
2497*495ae853SAndroid Build Coastguard Worker                         ps_proc->i4_res_strd;
2498*495ae853SAndroid Build Coastguard Worker 
2499*495ae853SAndroid Build Coastguard Worker                     break;
2500*495ae853SAndroid Build Coastguard Worker                 }
2501*495ae853SAndroid Build Coastguard Worker                 case PSKIP:
2502*495ae853SAndroid Build Coastguard Worker                 case BSKIP:
2503*495ae853SAndroid Build Coastguard Worker                 {
2504*495ae853SAndroid Build Coastguard Worker                     ps_sub_pic_rc_variables->as_quant_coeffs[Y].pv_data = NULL;
2505*495ae853SAndroid Build Coastguard Worker                     ps_sub_pic_rc_variables->as_quant_coeffs[UV].pv_data = NULL;
2506*495ae853SAndroid Build Coastguard Worker 
2507*495ae853SAndroid Build Coastguard Worker                     break;
2508*495ae853SAndroid Build Coastguard Worker                 }
2509*495ae853SAndroid Build Coastguard Worker                 default:
2510*495ae853SAndroid Build Coastguard Worker                 {
2511*495ae853SAndroid Build Coastguard Worker                     ASSERT(false);
2512*495ae853SAndroid Build Coastguard Worker 
2513*495ae853SAndroid Build Coastguard Worker                     break;
2514*495ae853SAndroid Build Coastguard Worker                 }
2515*495ae853SAndroid Build Coastguard Worker             }
2516*495ae853SAndroid Build Coastguard Worker 
2517*495ae853SAndroid Build Coastguard Worker             isvce_sub_pic_rc_ctxt_update(ps_proc->ps_sub_pic_rc_ctxt);
2518*495ae853SAndroid Build Coastguard Worker         }
2519*495ae853SAndroid Build Coastguard Worker 
2520*495ae853SAndroid Build Coastguard Worker #if ENABLE_MODE_STAT_VISUALISER
2521*495ae853SAndroid Build Coastguard Worker         if(ps_proc->u1_spatial_layer_id == (ps_proc->s_svc_params.u1_num_spatial_layers - 1))
2522*495ae853SAndroid Build Coastguard Worker         {
2523*495ae853SAndroid Build Coastguard Worker             coordinates_t s_mb_pos = {ps_proc->i4_mb_x, ps_proc->i4_mb_y};
2524*495ae853SAndroid Build Coastguard Worker 
2525*495ae853SAndroid Build Coastguard Worker             isvce_msv_set_mode(ps_codec->ps_mode_stat_visualiser, ps_proc->ps_mb_info, &s_mb_pos);
2526*495ae853SAndroid Build Coastguard Worker         }
2527*495ae853SAndroid Build Coastguard Worker #endif
2528*495ae853SAndroid Build Coastguard Worker 
2529*495ae853SAndroid Build Coastguard Worker         /**********************************************************************/
2530*495ae853SAndroid Build Coastguard Worker         /* if disable deblock level is '0' this implies enable deblocking for */
2531*495ae853SAndroid Build Coastguard Worker         /* all edges of all macroblocks with out any restrictions             */
2532*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
2533*495ae853SAndroid Build Coastguard Worker         /* if disable deblock level is '1' this implies disable deblocking for*/
2534*495ae853SAndroid Build Coastguard Worker         /* all edges of all macroblocks with out any restrictions             */
2535*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
2536*495ae853SAndroid Build Coastguard Worker         /* if disable deblock level is '2' this implies enable deblocking for */
2537*495ae853SAndroid Build Coastguard Worker         /* all edges of all macroblocks except edges overlapping with slice   */
2538*495ae853SAndroid Build Coastguard Worker         /* boundaries. This option is not currently supported by the encoder  */
2539*495ae853SAndroid Build Coastguard Worker         /* hence the slice map should be of no significance to perform debloc */
2540*495ae853SAndroid Build Coastguard Worker         /* king                                                               */
2541*495ae853SAndroid Build Coastguard Worker         /**********************************************************************/
2542*495ae853SAndroid Build Coastguard Worker 
2543*495ae853SAndroid Build Coastguard Worker         if(ps_proc->u4_compute_recon)
2544*495ae853SAndroid Build Coastguard Worker         {
2545*495ae853SAndroid Build Coastguard Worker             /* compute blocking strength */
2546*495ae853SAndroid Build Coastguard Worker             if(ps_proc->u4_disable_deblock_level != 1)
2547*495ae853SAndroid Build Coastguard Worker             {
2548*495ae853SAndroid Build Coastguard Worker                 isvce_compute_bs(ps_proc, 0);
2549*495ae853SAndroid Build Coastguard Worker 
2550*495ae853SAndroid Build Coastguard Worker                 if(ENABLE_INTRA_BASE_DEBLOCK && (ps_proc->u1_spatial_layer_id <
2551*495ae853SAndroid Build Coastguard Worker                                                  (ps_proc->s_svc_params.u1_num_spatial_layers - 1)))
2552*495ae853SAndroid Build Coastguard Worker                 {
2553*495ae853SAndroid Build Coastguard Worker                     isvce_compute_bs(ps_proc, 1);
2554*495ae853SAndroid Build Coastguard Worker                 }
2555*495ae853SAndroid Build Coastguard Worker             }
2556*495ae853SAndroid Build Coastguard Worker             /* nmb deblocking and hpel and padding */
2557*495ae853SAndroid Build Coastguard Worker             isvce_dblk_n_mbs(ps_proc, 0);
2558*495ae853SAndroid Build Coastguard Worker 
2559*495ae853SAndroid Build Coastguard Worker             if(ENABLE_INTRA_BASE_DEBLOCK &&
2560*495ae853SAndroid Build Coastguard Worker                (ps_proc->u1_spatial_layer_id < (ps_proc->s_svc_params.u1_num_spatial_layers - 1)))
2561*495ae853SAndroid Build Coastguard Worker             {
2562*495ae853SAndroid Build Coastguard Worker                 isvce_intra_base_dblk(ps_proc);
2563*495ae853SAndroid Build Coastguard Worker             }
2564*495ae853SAndroid Build Coastguard Worker 
2565*495ae853SAndroid Build Coastguard Worker             if(ps_proc->i4_mb_x == (ps_proc->i4_wd_mbs - 1) &&
2566*495ae853SAndroid Build Coastguard Worker                ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1))
2567*495ae853SAndroid Build Coastguard Worker             {
2568*495ae853SAndroid Build Coastguard Worker                 isvce_svc_pad_frame(ps_proc);
2569*495ae853SAndroid Build Coastguard Worker 
2570*495ae853SAndroid Build Coastguard Worker                 isvce_pad_mb_mode_buf(ps_proc->ps_intra_pred_ctxt, ps_proc->u1_spatial_layer_id,
2571*495ae853SAndroid Build Coastguard Worker                                       ps_proc->s_svc_params.u1_num_spatial_layers,
2572*495ae853SAndroid Build Coastguard Worker                                       ps_proc->s_svc_params.d_spatial_res_ratio,
2573*495ae853SAndroid Build Coastguard Worker                                       ps_codec->s_cfg.u4_wd, ps_codec->s_cfg.u4_ht);
2574*495ae853SAndroid Build Coastguard Worker             }
2575*495ae853SAndroid Build Coastguard Worker         }
2576*495ae853SAndroid Build Coastguard Worker 
2577*495ae853SAndroid Build Coastguard Worker         /* update the context after for coding next mb */
2578*495ae853SAndroid Build Coastguard Worker         error_status = isvce_update_proc_ctxt(ps_proc);
2579*495ae853SAndroid Build Coastguard Worker 
2580*495ae853SAndroid Build Coastguard Worker         if(error_status != IH264E_SUCCESS)
2581*495ae853SAndroid Build Coastguard Worker         {
2582*495ae853SAndroid Build Coastguard Worker             return error_status;
2583*495ae853SAndroid Build Coastguard Worker         }
2584*495ae853SAndroid Build Coastguard Worker 
2585*495ae853SAndroid Build Coastguard Worker         {
2586*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_new_mb_qp;
2587*495ae853SAndroid Build Coastguard Worker 
2588*495ae853SAndroid Build Coastguard Worker             u1_new_mb_qp =
2589*495ae853SAndroid Build Coastguard Worker                 isvce_sub_pic_rc_get_mb_qp(ps_proc->ps_sub_pic_rc_ctxt, ps_proc->u1_mb_qp);
2590*495ae853SAndroid Build Coastguard Worker 
2591*495ae853SAndroid Build Coastguard Worker             if(u1_new_mb_qp != ps_proc->u1_mb_qp)
2592*495ae853SAndroid Build Coastguard Worker             {
2593*495ae853SAndroid Build Coastguard Worker                 ps_proc->u1_mb_qp = u1_new_mb_qp;
2594*495ae853SAndroid Build Coastguard Worker                 ps_proc->u4_lambda = gu1_qp0[u1_new_mb_qp];
2595*495ae853SAndroid Build Coastguard Worker 
2596*495ae853SAndroid Build Coastguard Worker                 isvce_init_quant_params(ps_proc, ps_proc->u1_mb_qp);
2597*495ae853SAndroid Build Coastguard Worker             }
2598*495ae853SAndroid Build Coastguard Worker         }
2599*495ae853SAndroid Build Coastguard Worker 
2600*495ae853SAndroid Build Coastguard Worker         /* Once the last row is processed, mark the buffer status appropriately */
2601*495ae853SAndroid Build Coastguard Worker         if(ps_proc->i4_ht_mbs == ps_proc->i4_mb_y)
2602*495ae853SAndroid Build Coastguard Worker         {
2603*495ae853SAndroid Build Coastguard Worker             /* Pointer to current picture buffer structure */
2604*495ae853SAndroid Build Coastguard Worker             svc_au_buf_t *ps_cur_pic = ps_proc->ps_cur_pic;
2605*495ae853SAndroid Build Coastguard Worker 
2606*495ae853SAndroid Build Coastguard Worker             /* Pointer to current picture's mv buffer structure */
2607*495ae853SAndroid Build Coastguard Worker             svc_au_data_t *ps_cur_mv_buf = ps_proc->ps_cur_mv_buf;
2608*495ae853SAndroid Build Coastguard Worker 
2609*495ae853SAndroid Build Coastguard Worker             /**********************************************************************/
2610*495ae853SAndroid Build Coastguard Worker             /* if disable deblock level is '0' this implies enable deblocking for */
2611*495ae853SAndroid Build Coastguard Worker             /* all edges of all macroblocks with out any restrictions             */
2612*495ae853SAndroid Build Coastguard Worker             /*                                                                    */
2613*495ae853SAndroid Build Coastguard Worker             /* if disable deblock level is '1' this implies disable deblocking for*/
2614*495ae853SAndroid Build Coastguard Worker             /* all edges of all macroblocks with out any restrictions             */
2615*495ae853SAndroid Build Coastguard Worker             /*                                                                    */
2616*495ae853SAndroid Build Coastguard Worker             /* if disable deblock level is '2' this implies enable deblocking for */
2617*495ae853SAndroid Build Coastguard Worker             /* all edges of all macroblocks except edges overlapping with slice   */
2618*495ae853SAndroid Build Coastguard Worker             /* boundaries. This option is not currently supported by the encoder  */
2619*495ae853SAndroid Build Coastguard Worker             /* hence the slice map should be of no significance to perform debloc */
2620*495ae853SAndroid Build Coastguard Worker             /* king                                                               */
2621*495ae853SAndroid Build Coastguard Worker             /**********************************************************************/
2622*495ae853SAndroid Build Coastguard Worker             error_status = ih264_buf_mgr_release(ps_codec->pv_svc_au_data_store_mgr,
2623*495ae853SAndroid Build Coastguard Worker                                                  ps_cur_mv_buf->i4_buf_id, BUF_MGR_CODEC);
2624*495ae853SAndroid Build Coastguard Worker             if(error_status != IH264E_SUCCESS)
2625*495ae853SAndroid Build Coastguard Worker             {
2626*495ae853SAndroid Build Coastguard Worker                 return error_status;
2627*495ae853SAndroid Build Coastguard Worker             }
2628*495ae853SAndroid Build Coastguard Worker             error_status = ih264_buf_mgr_release(ps_codec->pv_ref_buf_mgr, ps_cur_pic->i4_buf_id,
2629*495ae853SAndroid Build Coastguard Worker                                                  BUF_MGR_CODEC);
2630*495ae853SAndroid Build Coastguard Worker             if(error_status != IH264E_SUCCESS)
2631*495ae853SAndroid Build Coastguard Worker             {
2632*495ae853SAndroid Build Coastguard Worker                 return error_status;
2633*495ae853SAndroid Build Coastguard Worker             }
2634*495ae853SAndroid Build Coastguard Worker             if(ps_codec->s_cfg.u4_enable_recon)
2635*495ae853SAndroid Build Coastguard Worker             {
2636*495ae853SAndroid Build Coastguard Worker                 /* pic cnt */
2637*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_rec_buf[ctxt_sel].i4_pic_cnt = ps_proc->i4_pic_cnt;
2638*495ae853SAndroid Build Coastguard Worker 
2639*495ae853SAndroid Build Coastguard Worker                 /* rec buffers */
2640*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_rec_buf[ctxt_sel].s_pic_buf = *ps_proc->ps_cur_pic;
2641*495ae853SAndroid Build Coastguard Worker 
2642*495ae853SAndroid Build Coastguard Worker                 /* is last? */
2643*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_rec_buf[ctxt_sel].u4_is_last = ps_proc->s_entropy.u4_is_last;
2644*495ae853SAndroid Build Coastguard Worker 
2645*495ae853SAndroid Build Coastguard Worker                 /* frame time stamp */
2646*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_rec_buf[ctxt_sel].u4_timestamp_high =
2647*495ae853SAndroid Build Coastguard Worker                     ps_proc->s_entropy.u4_timestamp_high;
2648*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_rec_buf[ctxt_sel].u4_timestamp_low =
2649*495ae853SAndroid Build Coastguard Worker                     ps_proc->s_entropy.u4_timestamp_low;
2650*495ae853SAndroid Build Coastguard Worker             }
2651*495ae853SAndroid Build Coastguard Worker         }
2652*495ae853SAndroid Build Coastguard Worker     }
2653*495ae853SAndroid Build Coastguard Worker 
2654*495ae853SAndroid Build Coastguard Worker     DEBUG_HISTOGRAM_DUMP(ps_codec->s_cfg.i4_ht_mbs == ps_proc->i4_mb_y);
2655*495ae853SAndroid Build Coastguard Worker 
2656*495ae853SAndroid Build Coastguard Worker     return error_status;
2657*495ae853SAndroid Build Coastguard Worker }
2658*495ae853SAndroid Build Coastguard Worker 
2659*495ae853SAndroid Build Coastguard Worker /**
2660*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2661*495ae853SAndroid Build Coastguard Worker *
2662*495ae853SAndroid Build Coastguard Worker * @brief
2663*495ae853SAndroid Build Coastguard Worker *  entry point of a spawned encoder thread
2664*495ae853SAndroid Build Coastguard Worker *
2665*495ae853SAndroid Build Coastguard Worker * @par Description:
2666*495ae853SAndroid Build Coastguard Worker *  The encoder thread dequeues a proc/entropy job from the encoder queue and
2667*495ae853SAndroid Build Coastguard Worker *  calls necessary routines.
2668*495ae853SAndroid Build Coastguard Worker *
2669*495ae853SAndroid Build Coastguard Worker * @param[in] pv_proc
2670*495ae853SAndroid Build Coastguard Worker *  Process context corresponding to the thread
2671*495ae853SAndroid Build Coastguard Worker *
2672*495ae853SAndroid Build Coastguard Worker * @returns  error status
2673*495ae853SAndroid Build Coastguard Worker *
2674*495ae853SAndroid Build Coastguard Worker * @remarks
2675*495ae853SAndroid Build Coastguard Worker *
2676*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2677*495ae853SAndroid Build Coastguard Worker */
isvce_process_thread(void * pv_proc)2678*495ae853SAndroid Build Coastguard Worker WORD32 isvce_process_thread(void *pv_proc)
2679*495ae853SAndroid Build Coastguard Worker {
2680*495ae853SAndroid Build Coastguard Worker     job_t s_job;
2681*495ae853SAndroid Build Coastguard Worker 
2682*495ae853SAndroid Build Coastguard Worker     isvce_process_ctxt_t *ps_proc = pv_proc;
2683*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
2684*495ae853SAndroid Build Coastguard Worker 
2685*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T ret = IH264_SUCCESS;
2686*495ae853SAndroid Build Coastguard Worker 
2687*495ae853SAndroid Build Coastguard Worker     WORD32 ctxt_sel = ps_codec->i4_encode_api_call_cnt % MAX_CTXT_SETS;
2688*495ae853SAndroid Build Coastguard Worker     WORD32 error_status = IH264_SUCCESS;
2689*495ae853SAndroid Build Coastguard Worker     WORD32 is_blocking = 0;
2690*495ae853SAndroid Build Coastguard Worker 
2691*495ae853SAndroid Build Coastguard Worker     ps_proc->i4_error_code = IH264_SUCCESS;
2692*495ae853SAndroid Build Coastguard Worker 
2693*495ae853SAndroid Build Coastguard Worker     while(1)
2694*495ae853SAndroid Build Coastguard Worker     {
2695*495ae853SAndroid Build Coastguard Worker         /* dequeue a job from the entropy queue */
2696*495ae853SAndroid Build Coastguard Worker         {
2697*495ae853SAndroid Build Coastguard Worker             bool b_is_entropy_state_invalid = false;
2698*495ae853SAndroid Build Coastguard Worker             WORD32 retval = ithread_mutex_lock(ps_codec->pv_entropy_mutex);
2699*495ae853SAndroid Build Coastguard Worker             volatile ISVCE_ENTROPY_THREAD_STATES_T *pe_entropy_thread_state =
2700*495ae853SAndroid Build Coastguard Worker                 &ps_codec->ae_entropy_thread_exit_state[ctxt_sel];
2701*495ae853SAndroid Build Coastguard Worker 
2702*495ae853SAndroid Build Coastguard Worker             /* have the lock */
2703*495ae853SAndroid Build Coastguard Worker             if(retval == 0)
2704*495ae853SAndroid Build Coastguard Worker             {
2705*495ae853SAndroid Build Coastguard Worker                 if(*pe_entropy_thread_state == INACTIVE)
2706*495ae853SAndroid Build Coastguard Worker                 {
2707*495ae853SAndroid Build Coastguard Worker                     /* no entropy threads are active, try dequeuing a job from the entropy
2708*495ae853SAndroid Build Coastguard Worker                      * queue */
2709*495ae853SAndroid Build Coastguard Worker                     ret = ih264_list_dequeue(ps_proc->pv_entropy_jobq, &s_job, is_blocking);
2710*495ae853SAndroid Build Coastguard Worker 
2711*495ae853SAndroid Build Coastguard Worker                     if(IH264_SUCCESS == ret)
2712*495ae853SAndroid Build Coastguard Worker                     {
2713*495ae853SAndroid Build Coastguard Worker                         *pe_entropy_thread_state = IN_PROCESS;
2714*495ae853SAndroid Build Coastguard Worker                         ithread_mutex_unlock(ps_codec->pv_entropy_mutex);
2715*495ae853SAndroid Build Coastguard Worker                         goto WORKER;
2716*495ae853SAndroid Build Coastguard Worker                     }
2717*495ae853SAndroid Build Coastguard Worker                     else if(is_blocking)
2718*495ae853SAndroid Build Coastguard Worker                     {
2719*495ae853SAndroid Build Coastguard Worker                         ithread_mutex_unlock(ps_codec->pv_entropy_mutex);
2720*495ae853SAndroid Build Coastguard Worker                         break;
2721*495ae853SAndroid Build Coastguard Worker                     }
2722*495ae853SAndroid Build Coastguard Worker                 }
2723*495ae853SAndroid Build Coastguard Worker                 else if(*pe_entropy_thread_state == ERRONEOUS_EXIT)
2724*495ae853SAndroid Build Coastguard Worker                 {
2725*495ae853SAndroid Build Coastguard Worker                     b_is_entropy_state_invalid = true;
2726*495ae853SAndroid Build Coastguard Worker                 }
2727*495ae853SAndroid Build Coastguard Worker 
2728*495ae853SAndroid Build Coastguard Worker                 ithread_mutex_unlock(ps_codec->pv_entropy_mutex);
2729*495ae853SAndroid Build Coastguard Worker             }
2730*495ae853SAndroid Build Coastguard Worker 
2731*495ae853SAndroid Build Coastguard Worker             if(b_is_entropy_state_invalid)
2732*495ae853SAndroid Build Coastguard Worker             {
2733*495ae853SAndroid Build Coastguard Worker                 ps_proc->i4_error_code = IH264_FAIL;
2734*495ae853SAndroid Build Coastguard Worker 
2735*495ae853SAndroid Build Coastguard Worker                 return IH264_FAIL;
2736*495ae853SAndroid Build Coastguard Worker             }
2737*495ae853SAndroid Build Coastguard Worker         }
2738*495ae853SAndroid Build Coastguard Worker 
2739*495ae853SAndroid Build Coastguard Worker         /* dequeue a job from the process queue */
2740*495ae853SAndroid Build Coastguard Worker         ret = ih264_list_dequeue(ps_proc->pv_proc_jobq, &s_job, 1);
2741*495ae853SAndroid Build Coastguard Worker         if(IH264_SUCCESS != ret)
2742*495ae853SAndroid Build Coastguard Worker         {
2743*495ae853SAndroid Build Coastguard Worker             if(ps_proc->i4_id)
2744*495ae853SAndroid Build Coastguard Worker             {
2745*495ae853SAndroid Build Coastguard Worker                 break;
2746*495ae853SAndroid Build Coastguard Worker             }
2747*495ae853SAndroid Build Coastguard Worker             else
2748*495ae853SAndroid Build Coastguard Worker             {
2749*495ae853SAndroid Build Coastguard Worker                 is_blocking = 1;
2750*495ae853SAndroid Build Coastguard Worker                 continue;
2751*495ae853SAndroid Build Coastguard Worker             }
2752*495ae853SAndroid Build Coastguard Worker         }
2753*495ae853SAndroid Build Coastguard Worker 
2754*495ae853SAndroid Build Coastguard Worker     WORKER:
2755*495ae853SAndroid Build Coastguard Worker         /* choose appropriate proc context based on proc_base_idx */
2756*495ae853SAndroid Build Coastguard Worker         switch(s_job.i4_cmd)
2757*495ae853SAndroid Build Coastguard Worker         {
2758*495ae853SAndroid Build Coastguard Worker             case CMD_PROCESS:
2759*495ae853SAndroid Build Coastguard Worker             {
2760*495ae853SAndroid Build Coastguard Worker                 ps_proc->i4_mb_cnt = s_job.i2_mb_cnt;
2761*495ae853SAndroid Build Coastguard Worker                 ps_proc->i4_mb_x = s_job.i2_mb_x;
2762*495ae853SAndroid Build Coastguard Worker                 ps_proc->i4_mb_y = s_job.i2_mb_y;
2763*495ae853SAndroid Build Coastguard Worker 
2764*495ae853SAndroid Build Coastguard Worker                 isvce_init_layer_proc_ctxt(ps_proc);
2765*495ae853SAndroid Build Coastguard Worker 
2766*495ae853SAndroid Build Coastguard Worker                 error_status = isvce_process(ps_proc);
2767*495ae853SAndroid Build Coastguard Worker 
2768*495ae853SAndroid Build Coastguard Worker                 if(error_status != IH264_SUCCESS)
2769*495ae853SAndroid Build Coastguard Worker                 {
2770*495ae853SAndroid Build Coastguard Worker                     ps_codec->ae_entropy_thread_exit_state[ctxt_sel] = ERRONEOUS_EXIT;
2771*495ae853SAndroid Build Coastguard Worker                     ps_proc->i4_error_code = error_status;
2772*495ae853SAndroid Build Coastguard Worker                     return ret;
2773*495ae853SAndroid Build Coastguard Worker                 }
2774*495ae853SAndroid Build Coastguard Worker 
2775*495ae853SAndroid Build Coastguard Worker                 break;
2776*495ae853SAndroid Build Coastguard Worker             }
2777*495ae853SAndroid Build Coastguard Worker             case CMD_ENTROPY:
2778*495ae853SAndroid Build Coastguard Worker             {
2779*495ae853SAndroid Build Coastguard Worker                 ps_proc->s_entropy.i4_mb_x = s_job.i2_mb_x;
2780*495ae853SAndroid Build Coastguard Worker                 ps_proc->s_entropy.i4_mb_y = s_job.i2_mb_y;
2781*495ae853SAndroid Build Coastguard Worker                 ps_proc->s_entropy.i4_mb_cnt = s_job.i2_mb_cnt;
2782*495ae853SAndroid Build Coastguard Worker 
2783*495ae853SAndroid Build Coastguard Worker                 isvce_init_entropy_ctxt(ps_proc);
2784*495ae853SAndroid Build Coastguard Worker 
2785*495ae853SAndroid Build Coastguard Worker                 error_status = isvce_entropy(ps_proc);
2786*495ae853SAndroid Build Coastguard Worker 
2787*495ae853SAndroid Build Coastguard Worker                 if(error_status != IH264_SUCCESS)
2788*495ae853SAndroid Build Coastguard Worker                 {
2789*495ae853SAndroid Build Coastguard Worker                     ps_codec->ae_entropy_thread_exit_state[ctxt_sel] = ERRONEOUS_EXIT;
2790*495ae853SAndroid Build Coastguard Worker                     ps_proc->i4_error_code = error_status;
2791*495ae853SAndroid Build Coastguard Worker                     return ret;
2792*495ae853SAndroid Build Coastguard Worker                 }
2793*495ae853SAndroid Build Coastguard Worker 
2794*495ae853SAndroid Build Coastguard Worker                 break;
2795*495ae853SAndroid Build Coastguard Worker             }
2796*495ae853SAndroid Build Coastguard Worker             default:
2797*495ae853SAndroid Build Coastguard Worker             {
2798*495ae853SAndroid Build Coastguard Worker                 ps_proc->i4_error_code = IH264_FAIL;
2799*495ae853SAndroid Build Coastguard Worker                 return ret;
2800*495ae853SAndroid Build Coastguard Worker             }
2801*495ae853SAndroid Build Coastguard Worker         }
2802*495ae853SAndroid Build Coastguard Worker     }
2803*495ae853SAndroid Build Coastguard Worker 
2804*495ae853SAndroid Build Coastguard Worker     return ret;
2805*495ae853SAndroid Build Coastguard Worker }
2806