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