xref: /aosp_15_r20/external/libavc/encoder/svc/isvce_utils.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker *  ih264e_svc_utils.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker *  Contains utility functions used for SVC encoding
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_svc_ref_list_refresh()
34*495ae853SAndroid Build Coastguard Worker *  - ih264e_svc_inp_params_validate()
35*495ae853SAndroid Build Coastguard Worker *
36*495ae853SAndroid Build Coastguard Worker * @remarks
37*495ae853SAndroid Build Coastguard Worker *  None
38*495ae853SAndroid Build Coastguard Worker *
39*495ae853SAndroid Build Coastguard Worker *******************************************************************************
40*495ae853SAndroid Build Coastguard Worker */
41*495ae853SAndroid Build Coastguard Worker #include <math.h>
42*495ae853SAndroid Build Coastguard Worker #include <limits.h>
43*495ae853SAndroid Build Coastguard Worker 
44*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
45*495ae853SAndroid Build Coastguard Worker 
46*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264_buf_mgr.h */
47*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264_list.h */
48*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
49*495ae853SAndroid Build Coastguard Worker 
50*495ae853SAndroid Build Coastguard Worker #include "ih264_buf_mgr.h"
51*495ae853SAndroid Build Coastguard Worker #include "ih264_list.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_data.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264_size_defs.h"
54*495ae853SAndroid Build Coastguard Worker 
55*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264_common_tables.h */
56*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
58*495ae853SAndroid Build Coastguard Worker 
59*495ae853SAndroid Build Coastguard Worker #include "ih264_common_tables.h"
60*495ae853SAndroid Build Coastguard Worker 
61*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264e_bitstream.h */
62*495ae853SAndroid Build Coastguard Worker #include "ih264e_error.h"
63*495ae853SAndroid Build Coastguard Worker 
64*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264e_cabac_structs.h */
65*495ae853SAndroid Build Coastguard Worker #include "ih264_cabac_tables.h"
66*495ae853SAndroid Build Coastguard Worker 
67*495ae853SAndroid Build Coastguard Worker /* Dependencies of ime_structs.h */
68*495ae853SAndroid Build Coastguard Worker #include "ime_defs.h"
69*495ae853SAndroid Build Coastguard Worker #include "ime_distortion_metrics.h"
70*495ae853SAndroid Build Coastguard Worker 
71*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264e_structs.h */
72*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
73*495ae853SAndroid Build Coastguard Worker #include "ive2.h"
74*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
75*495ae853SAndroid Build Coastguard Worker #include "ih264_deblk_edge_filters.h"
76*495ae853SAndroid Build Coastguard Worker #include "ih264_inter_pred_filters.h"
77*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
78*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_quant_itrans_iquant.h"
79*495ae853SAndroid Build Coastguard Worker #include "ih264e_bitstream.h"
80*495ae853SAndroid Build Coastguard Worker #include "ih264e_cabac_structs.h"
81*495ae853SAndroid Build Coastguard Worker #include "ime_statistics.h"
82*495ae853SAndroid Build Coastguard Worker #include "ime_structs.h"
83*495ae853SAndroid Build Coastguard Worker /* Dependencies of 'irc_picture_type.h' */
84*495ae853SAndroid Build Coastguard Worker #include "irc_cntrl_param.h"
85*495ae853SAndroid Build Coastguard Worker #include "irc_frame_info_collector.h"
86*495ae853SAndroid Build Coastguard Worker #include "irc_mem_req_and_acq.h"
87*495ae853SAndroid Build Coastguard Worker /* Dependencies of 'irc_rate_control_api_structs' */
88*495ae853SAndroid Build Coastguard Worker #include "irc_picture_type.h"
89*495ae853SAndroid Build Coastguard Worker #include "irc_rd_model.h"
90*495ae853SAndroid Build Coastguard Worker #include "irc_vbr_storage_vbv.h"
91*495ae853SAndroid Build Coastguard Worker #include "irc_est_sad.h"
92*495ae853SAndroid Build Coastguard Worker #include "irc_bit_allocation.h"
93*495ae853SAndroid Build Coastguard Worker #include "irc_mb_model_based.h"
94*495ae853SAndroid Build Coastguard Worker #include "irc_cbr_buffer_control.h"
95*495ae853SAndroid Build Coastguard Worker #include "irc_vbr_str_prms.h"
96*495ae853SAndroid Build Coastguard Worker #include "irc_common.h"
97*495ae853SAndroid Build Coastguard Worker #include "irc_rate_control_api_structs.h"
98*495ae853SAndroid Build Coastguard Worker #include "irc_rate_control_api.h"
99*495ae853SAndroid Build Coastguard Worker #include "irc_svc_rate_control_api.h"
100*495ae853SAndroid Build Coastguard Worker /* Dependencies of 'ih264e_utils.h' */
101*495ae853SAndroid Build Coastguard Worker #include "ih264e_defs.h"
102*495ae853SAndroid Build Coastguard Worker #include "ih264e_structs.h"
103*495ae853SAndroid Build Coastguard Worker /* Dependencies of 'ih264e_utils.h' */
104*495ae853SAndroid Build Coastguard Worker #include "irc_mem_req_and_acq.h"
105*495ae853SAndroid Build Coastguard Worker #include "ih264e_rc_mem_interface.h"
106*495ae853SAndroid Build Coastguard Worker #include "ih264e_time_stamp.h"
107*495ae853SAndroid Build Coastguard Worker #include "ih264e_utils.h"
108*495ae853SAndroid Build Coastguard Worker #include "ime.h"
109*495ae853SAndroid Build Coastguard Worker #include "isvc_macros.h"
110*495ae853SAndroid Build Coastguard Worker #include "isvce_cabac.h"
111*495ae853SAndroid Build Coastguard Worker #include "isvce_core_coding.h"
112*495ae853SAndroid Build Coastguard Worker #include "isvce_defs.h"
113*495ae853SAndroid Build Coastguard Worker #include "isvce_error.h"
114*495ae853SAndroid Build Coastguard Worker #include "isvce_me.h"
115*495ae853SAndroid Build Coastguard Worker #include "isvce_utils.h"
116*495ae853SAndroid Build Coastguard Worker #include "isvce_downscaler.h"
117*495ae853SAndroid Build Coastguard Worker #include "isvce_encode_header.h"
118*495ae853SAndroid Build Coastguard Worker #include "isvce_rate_control.h"
119*495ae853SAndroid Build Coastguard Worker #include "isvce_sub_pic_rc.h"
120*495ae853SAndroid Build Coastguard Worker 
121*495ae853SAndroid Build Coastguard Worker static const UWORD32 gu4_downscaler_blk_size = 96;
122*495ae853SAndroid Build Coastguard Worker 
isvce_get_downscaler_blk_dims(UWORD32 u4_frame_dim,UWORD32 u4_blk_pos,UWORD32 u4_default_blk_size)123*495ae853SAndroid Build Coastguard Worker static FORCEINLINE UWORD32 isvce_get_downscaler_blk_dims(UWORD32 u4_frame_dim, UWORD32 u4_blk_pos,
124*495ae853SAndroid Build Coastguard Worker                                                          UWORD32 u4_default_blk_size)
125*495ae853SAndroid Build Coastguard Worker {
126*495ae853SAndroid Build Coastguard Worker     return ((u4_frame_dim - u4_blk_pos * u4_default_blk_size) < u4_default_blk_size)
127*495ae853SAndroid Build Coastguard Worker                ? (u4_frame_dim - u4_blk_pos * u4_default_blk_size)
128*495ae853SAndroid Build Coastguard Worker                : u4_default_blk_size;
129*495ae853SAndroid Build Coastguard Worker }
130*495ae853SAndroid Build Coastguard Worker 
131*495ae853SAndroid Build Coastguard Worker /**
132*495ae853SAndroid Build Coastguard Worker *******************************************************************************
133*495ae853SAndroid Build Coastguard Worker *
134*495ae853SAndroid Build Coastguard Worker * @brief
135*495ae853SAndroid Build Coastguard Worker *  Reference and MV bank Buffer Manager for SVC
136*495ae853SAndroid Build Coastguard Worker *
137*495ae853SAndroid Build Coastguard Worker * @par Description:
138*495ae853SAndroid Build Coastguard Worker *  Here we will
139*495ae853SAndroid Build Coastguard Worker *      1) Find the correct ref pics for the current frame
140*495ae853SAndroid Build Coastguard Worker *      2) Free the ref pics that are not going to be used anymore
141*495ae853SAndroid Build Coastguard Worker *
142*495ae853SAndroid Build Coastguard Worker *  1) Finding correct ref pic
143*495ae853SAndroid Build Coastguard Worker *      All pics needed for future are arranged in a picture list called
144*495ae853SAndroid Build Coastguard Worker *      ps_codec->as_ref_set. Each picture in this will have a pic buffer and
145*495ae853SAndroid Build Coastguard Worker *      MV buffer that is marked appropriately as BUF_MGR_REF, BUF_MGR_IO or
146*495ae853SAndroid Build Coastguard Worker *      BUF_MGR_CODEC. pic_cnt, poc, and temporal_id will also be present.
147*495ae853SAndroid Build Coastguard Worker *      The strategy is to pick the closest references that belongs to the
148*495ae853SAndroid Build Coastguard Worker *      same temporal_id or lesser. The closeness is measured via the
149*495ae853SAndroid Build Coastguard Worker *      smallest absolute difference between ref and cur pocs.
150*495ae853SAndroid Build Coastguard Worker *
151*495ae853SAndroid Build Coastguard Worker *      Note that i4_pic_cnt == -1 is used to filter uninitialised ref pics.
152*495ae853SAndroid Build Coastguard Worker *      Now since we only have max two ref pics, we will always find max 2
153*495ae853SAndroid Build Coastguard Worker *      ref pics.
154*495ae853SAndroid Build Coastguard Worker *
155*495ae853SAndroid Build Coastguard Worker *  2) Self explanatory
156*495ae853SAndroid Build Coastguard Worker *
157*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
158*495ae853SAndroid Build Coastguard Worker *  Pointer to codeec context
159*495ae853SAndroid Build Coastguard Worker *
160*495ae853SAndroid Build Coastguard Worker * @param[in] pps_ref_pics
161*495ae853SAndroid Build Coastguard Worker *  Array of pointers to refPicBufs
162*495ae853SAndroid Build Coastguard Worker *
163*495ae853SAndroid Build Coastguard Worker * @param[in] pps_mv_bufs
164*495ae853SAndroid Build Coastguard Worker *  Array of pointers to refMVBufs
165*495ae853SAndroid Build Coastguard Worker *
166*495ae853SAndroid Build Coastguard Worker * @param[in] e_pic_type
167*495ae853SAndroid Build Coastguard Worker *  Picture type
168*495ae853SAndroid Build Coastguard Worker *
169*495ae853SAndroid Build Coastguard Worker * @returns Nothing
170*495ae853SAndroid Build Coastguard Worker *
171*495ae853SAndroid Build Coastguard Worker *******************************************************************************
172*495ae853SAndroid Build Coastguard Worker */
isvce_ref_list_refresh(isvce_codec_t * ps_codec,svc_au_buf_t ** pps_ref_pics,svc_au_data_t ** pps_mv_bufs,WORD32 * pi4_ref_set_id,PIC_TYPE_T e_pic_type)173*495ae853SAndroid Build Coastguard Worker static WORD32 isvce_ref_list_refresh(isvce_codec_t *ps_codec, svc_au_buf_t **pps_ref_pics,
174*495ae853SAndroid Build Coastguard Worker                                      svc_au_data_t **pps_mv_bufs, WORD32 *pi4_ref_set_id,
175*495ae853SAndroid Build Coastguard Worker                                      PIC_TYPE_T e_pic_type)
176*495ae853SAndroid Build Coastguard Worker {
177*495ae853SAndroid Build Coastguard Worker     typedef struct
178*495ae853SAndroid Build Coastguard Worker     {
179*495ae853SAndroid Build Coastguard Worker         WORD32 i4_buf_id;
180*495ae853SAndroid Build Coastguard Worker 
181*495ae853SAndroid Build Coastguard Worker         WORD32 i4_abs_poc_diff;
182*495ae853SAndroid Build Coastguard Worker 
183*495ae853SAndroid Build Coastguard Worker         WORD8 i1_temporal_id;
184*495ae853SAndroid Build Coastguard Worker     } ref_pic_props_t;
185*495ae853SAndroid Build Coastguard Worker 
186*495ae853SAndroid Build Coastguard Worker     ref_pic_props_t s_ref_pic_props = {0, 0, -1};
187*495ae853SAndroid Build Coastguard Worker 
188*495ae853SAndroid Build Coastguard Worker     WORD32 i, buf_status;
189*495ae853SAndroid Build Coastguard Worker 
190*495ae853SAndroid Build Coastguard Worker     WORD32 i4_cur_pic_poc = ps_codec->i4_poc;
191*495ae853SAndroid Build Coastguard Worker     WORD32 i4_cur_pic_temporal_id = isvce_svc_temporal_id_compute(
192*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_poc, ps_codec->s_cfg.s_svc_params.u1_num_temporal_layers, e_pic_type);
193*495ae853SAndroid Build Coastguard Worker 
194*495ae853SAndroid Build Coastguard Worker     if(e_pic_type == PIC_B)
195*495ae853SAndroid Build Coastguard Worker     {
196*495ae853SAndroid Build Coastguard Worker         return IH264E_FAIL;
197*495ae853SAndroid Build Coastguard Worker     }
198*495ae853SAndroid Build Coastguard Worker 
199*495ae853SAndroid Build Coastguard Worker     ASSERT(1 == MAX_LAYER_REFERENCE_PICS);
200*495ae853SAndroid Build Coastguard Worker 
201*495ae853SAndroid Build Coastguard Worker     /* Pick a ref_pic for the current picture */
202*495ae853SAndroid Build Coastguard Worker     if(e_pic_type != PIC_IDR)
203*495ae853SAndroid Build Coastguard Worker     {
204*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < ps_codec->i4_ref_buf_cnt; i++)
205*495ae853SAndroid Build Coastguard Worker         {
206*495ae853SAndroid Build Coastguard Worker             WORD32 i4_abs_poc_diff;
207*495ae853SAndroid Build Coastguard Worker             WORD8 i1_temporal_id;
208*495ae853SAndroid Build Coastguard Worker 
209*495ae853SAndroid Build Coastguard Worker             if(ps_codec->as_ref_set[i].i4_pic_cnt == -1)
210*495ae853SAndroid Build Coastguard Worker             {
211*495ae853SAndroid Build Coastguard Worker                 continue;
212*495ae853SAndroid Build Coastguard Worker             }
213*495ae853SAndroid Build Coastguard Worker 
214*495ae853SAndroid Build Coastguard Worker             buf_status = ih264_buf_mgr_get_status(ps_codec->pv_ref_buf_mgr,
215*495ae853SAndroid Build Coastguard Worker                                                   ps_codec->as_ref_set[i].ps_pic_buf->i4_buf_id);
216*495ae853SAndroid Build Coastguard Worker 
217*495ae853SAndroid Build Coastguard Worker             if(buf_status & BUF_MGR_REF)
218*495ae853SAndroid Build Coastguard Worker             {
219*495ae853SAndroid Build Coastguard Worker                 i4_abs_poc_diff = ABS(ps_codec->as_ref_set[i].i4_poc - i4_cur_pic_poc);
220*495ae853SAndroid Build Coastguard Worker                 i1_temporal_id = ps_codec->as_ref_set[i].ps_pic_buf->i1_temporal_id;
221*495ae853SAndroid Build Coastguard Worker 
222*495ae853SAndroid Build Coastguard Worker                 if(s_ref_pic_props.i1_temporal_id > -1)
223*495ae853SAndroid Build Coastguard Worker                 {
224*495ae853SAndroid Build Coastguard Worker                     if((i1_temporal_id <= i4_cur_pic_temporal_id) &&
225*495ae853SAndroid Build Coastguard Worker                        (s_ref_pic_props.i4_abs_poc_diff > i4_abs_poc_diff))
226*495ae853SAndroid Build Coastguard Worker                     {
227*495ae853SAndroid Build Coastguard Worker                         s_ref_pic_props.i4_abs_poc_diff = i4_abs_poc_diff;
228*495ae853SAndroid Build Coastguard Worker                         s_ref_pic_props.i1_temporal_id = i1_temporal_id;
229*495ae853SAndroid Build Coastguard Worker                         s_ref_pic_props.i4_buf_id = i;
230*495ae853SAndroid Build Coastguard Worker                     }
231*495ae853SAndroid Build Coastguard Worker                 }
232*495ae853SAndroid Build Coastguard Worker                 else if(i1_temporal_id <= i4_cur_pic_temporal_id)
233*495ae853SAndroid Build Coastguard Worker                 {
234*495ae853SAndroid Build Coastguard Worker                     s_ref_pic_props.i4_abs_poc_diff = i4_abs_poc_diff;
235*495ae853SAndroid Build Coastguard Worker                     s_ref_pic_props.i1_temporal_id = i1_temporal_id;
236*495ae853SAndroid Build Coastguard Worker                     s_ref_pic_props.i4_buf_id = i;
237*495ae853SAndroid Build Coastguard Worker                 }
238*495ae853SAndroid Build Coastguard Worker             }
239*495ae853SAndroid Build Coastguard Worker         }
240*495ae853SAndroid Build Coastguard Worker 
241*495ae853SAndroid Build Coastguard Worker         if(s_ref_pic_props.i1_temporal_id < 0)
242*495ae853SAndroid Build Coastguard Worker         {
243*495ae853SAndroid Build Coastguard Worker             return IH264E_FAIL;
244*495ae853SAndroid Build Coastguard Worker         }
245*495ae853SAndroid Build Coastguard Worker 
246*495ae853SAndroid Build Coastguard Worker         pps_ref_pics[0] = pps_ref_pics[1] =
247*495ae853SAndroid Build Coastguard Worker             ps_codec->as_ref_set[s_ref_pic_props.i4_buf_id].ps_pic_buf;
248*495ae853SAndroid Build Coastguard Worker         pps_mv_bufs[0] = pps_mv_bufs[1] =
249*495ae853SAndroid Build Coastguard Worker             ps_codec->as_ref_set[s_ref_pic_props.i4_buf_id].ps_svc_au_data;
250*495ae853SAndroid Build Coastguard Worker 
251*495ae853SAndroid Build Coastguard Worker         /* Pick all ref pic_bufs to be freed. */
252*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < ps_codec->i4_ref_buf_cnt; i++)
253*495ae853SAndroid Build Coastguard Worker         {
254*495ae853SAndroid Build Coastguard Worker             if(ps_codec->as_ref_set[i].i4_pic_cnt == -1)
255*495ae853SAndroid Build Coastguard Worker             {
256*495ae853SAndroid Build Coastguard Worker                 continue;
257*495ae853SAndroid Build Coastguard Worker             }
258*495ae853SAndroid Build Coastguard Worker 
259*495ae853SAndroid Build Coastguard Worker             buf_status = ih264_buf_mgr_get_status(ps_codec->pv_ref_buf_mgr,
260*495ae853SAndroid Build Coastguard Worker                                                   ps_codec->as_ref_set[i].ps_pic_buf->i4_buf_id);
261*495ae853SAndroid Build Coastguard Worker 
262*495ae853SAndroid Build Coastguard Worker             if((buf_status & (BUF_MGR_REF | BUF_MGR_CODEC | BUF_MGR_IO)) == 0)
263*495ae853SAndroid Build Coastguard Worker             {
264*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_ref_set[i].i4_pic_cnt = -1;
265*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_ref_set[i].i4_poc = 32768;
266*495ae853SAndroid Build Coastguard Worker 
267*495ae853SAndroid Build Coastguard Worker                 continue;
268*495ae853SAndroid Build Coastguard Worker             }
269*495ae853SAndroid Build Coastguard Worker 
270*495ae853SAndroid Build Coastguard Worker             if(buf_status & BUF_MGR_REF)
271*495ae853SAndroid Build Coastguard Worker             {
272*495ae853SAndroid Build Coastguard Worker                 if((i4_cur_pic_temporal_id <= ps_codec->as_ref_set[i].ps_pic_buf->i1_temporal_id) &&
273*495ae853SAndroid Build Coastguard Worker                    (pps_ref_pics[0]->i4_frame_num !=
274*495ae853SAndroid Build Coastguard Worker                     ps_codec->as_ref_set[i].ps_pic_buf->i4_frame_num) &&
275*495ae853SAndroid Build Coastguard Worker                    (pps_ref_pics[0]->i4_frame_num !=
276*495ae853SAndroid Build Coastguard Worker                     ps_codec->as_ref_set[i].ps_pic_buf->i4_frame_num))
277*495ae853SAndroid Build Coastguard Worker                 {
278*495ae853SAndroid Build Coastguard Worker                     ih264_buf_mgr_release(ps_codec->pv_svc_au_data_store_mgr,
279*495ae853SAndroid Build Coastguard Worker                                           ps_codec->as_ref_set[i].ps_pic_buf->i4_buf_id,
280*495ae853SAndroid Build Coastguard Worker                                           BUF_MGR_REF);
281*495ae853SAndroid Build Coastguard Worker 
282*495ae853SAndroid Build Coastguard Worker                     ih264_buf_mgr_release(ps_codec->pv_ref_buf_mgr,
283*495ae853SAndroid Build Coastguard Worker                                           ps_codec->as_ref_set[i].ps_pic_buf->i4_buf_id,
284*495ae853SAndroid Build Coastguard Worker                                           BUF_MGR_REF);
285*495ae853SAndroid Build Coastguard Worker                 }
286*495ae853SAndroid Build Coastguard Worker             }
287*495ae853SAndroid Build Coastguard Worker         }
288*495ae853SAndroid Build Coastguard Worker     }
289*495ae853SAndroid Build Coastguard Worker     else
290*495ae853SAndroid Build Coastguard Worker     {
291*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < ps_codec->i4_ref_buf_cnt; i++)
292*495ae853SAndroid Build Coastguard Worker         {
293*495ae853SAndroid Build Coastguard Worker             if(ps_codec->as_ref_set[i].i4_pic_cnt == -1)
294*495ae853SAndroid Build Coastguard Worker             {
295*495ae853SAndroid Build Coastguard Worker                 continue;
296*495ae853SAndroid Build Coastguard Worker             }
297*495ae853SAndroid Build Coastguard Worker 
298*495ae853SAndroid Build Coastguard Worker             buf_status = ih264_buf_mgr_get_status(ps_codec->pv_ref_buf_mgr,
299*495ae853SAndroid Build Coastguard Worker                                                   ps_codec->as_ref_set[i].ps_pic_buf->i4_buf_id);
300*495ae853SAndroid Build Coastguard Worker 
301*495ae853SAndroid Build Coastguard Worker             if((buf_status & (BUF_MGR_REF | BUF_MGR_CODEC | BUF_MGR_IO)) == 0)
302*495ae853SAndroid Build Coastguard Worker             {
303*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_ref_set[i].i4_pic_cnt = -1;
304*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_ref_set[i].i4_poc = 32768;
305*495ae853SAndroid Build Coastguard Worker 
306*495ae853SAndroid Build Coastguard Worker                 continue;
307*495ae853SAndroid Build Coastguard Worker             }
308*495ae853SAndroid Build Coastguard Worker 
309*495ae853SAndroid Build Coastguard Worker             if(buf_status & BUF_MGR_REF)
310*495ae853SAndroid Build Coastguard Worker             {
311*495ae853SAndroid Build Coastguard Worker                 ih264_buf_mgr_release(ps_codec->pv_svc_au_data_store_mgr,
312*495ae853SAndroid Build Coastguard Worker                                       ps_codec->as_ref_set[i].ps_pic_buf->i4_buf_id, BUF_MGR_REF);
313*495ae853SAndroid Build Coastguard Worker 
314*495ae853SAndroid Build Coastguard Worker                 ih264_buf_mgr_release(ps_codec->pv_ref_buf_mgr,
315*495ae853SAndroid Build Coastguard Worker                                       ps_codec->as_ref_set[i].ps_pic_buf->i4_buf_id, BUF_MGR_REF);
316*495ae853SAndroid Build Coastguard Worker             }
317*495ae853SAndroid Build Coastguard Worker         }
318*495ae853SAndroid Build Coastguard Worker     }
319*495ae853SAndroid Build Coastguard Worker 
320*495ae853SAndroid Build Coastguard Worker     /*
321*495ae853SAndroid Build Coastguard Worker      * Mark all reference pic with unused buffers to be free
322*495ae853SAndroid Build Coastguard Worker      * We need this step since each one, ie ref, recon io etc only unset their
323*495ae853SAndroid Build Coastguard Worker      * respective flags. Hence we need to combine togather and mark the ref set
324*495ae853SAndroid Build Coastguard Worker      * accordingly
325*495ae853SAndroid Build Coastguard Worker      */
326*495ae853SAndroid Build Coastguard Worker     pi4_ref_set_id[0] = -1;
327*495ae853SAndroid Build Coastguard Worker 
328*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_codec->i4_ref_buf_cnt; i++)
329*495ae853SAndroid Build Coastguard Worker     {
330*495ae853SAndroid Build Coastguard Worker         if(ps_codec->as_ref_set[i].i4_pic_cnt == -1)
331*495ae853SAndroid Build Coastguard Worker         {
332*495ae853SAndroid Build Coastguard Worker             pi4_ref_set_id[0] = i;
333*495ae853SAndroid Build Coastguard Worker             continue;
334*495ae853SAndroid Build Coastguard Worker         }
335*495ae853SAndroid Build Coastguard Worker 
336*495ae853SAndroid Build Coastguard Worker         buf_status = ih264_buf_mgr_get_status(ps_codec->pv_ref_buf_mgr,
337*495ae853SAndroid Build Coastguard Worker                                               ps_codec->as_ref_set[i].ps_pic_buf->i4_buf_id);
338*495ae853SAndroid Build Coastguard Worker 
339*495ae853SAndroid Build Coastguard Worker         if((buf_status & (BUF_MGR_REF | BUF_MGR_CODEC | BUF_MGR_IO)) == 0)
340*495ae853SAndroid Build Coastguard Worker         {
341*495ae853SAndroid Build Coastguard Worker             ps_codec->as_ref_set[i].i4_pic_cnt = -1;
342*495ae853SAndroid Build Coastguard Worker             ps_codec->as_ref_set[i].i4_poc = 32768;
343*495ae853SAndroid Build Coastguard Worker 
344*495ae853SAndroid Build Coastguard Worker             pi4_ref_set_id[0] = i;
345*495ae853SAndroid Build Coastguard Worker         }
346*495ae853SAndroid Build Coastguard Worker     }
347*495ae853SAndroid Build Coastguard Worker 
348*495ae853SAndroid Build Coastguard Worker     /* An asssert failure here means we donot have any free buffs */
349*495ae853SAndroid Build Coastguard Worker     if(pi4_ref_set_id[0] < 0)
350*495ae853SAndroid Build Coastguard Worker     {
351*495ae853SAndroid Build Coastguard Worker         return IH264E_FAIL;
352*495ae853SAndroid Build Coastguard Worker     }
353*495ae853SAndroid Build Coastguard Worker 
354*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
355*495ae853SAndroid Build Coastguard Worker }
356*495ae853SAndroid Build Coastguard Worker 
357*495ae853SAndroid Build Coastguard Worker /**
358*495ae853SAndroid Build Coastguard Worker *******************************************************************************
359*495ae853SAndroid Build Coastguard Worker *
360*495ae853SAndroid Build Coastguard Worker * @brief
361*495ae853SAndroid Build Coastguard Worker *  Validates SVC AU properties
362*495ae853SAndroid Build Coastguard Worker *
363*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cfg
364*495ae853SAndroid Build Coastguard Worker *  Cfg parameters
365*495ae853SAndroid Build Coastguard Worker *
366*495ae853SAndroid Build Coastguard Worker * @returns  error code in conformance with 'IH264E_ERROR_T'
367*495ae853SAndroid Build Coastguard Worker *
368*495ae853SAndroid Build Coastguard Worker *******************************************************************************
369*495ae853SAndroid Build Coastguard Worker */
isvce_svc_au_props_validate(svc_inp_params_t * ps_svc_inp_params,UWORD32 u4_inp_wd,UWORD32 u4_inp_ht,UWORD32 u4_svc_comp_wd,UWORD32 u4_svc_comp_ht)370*495ae853SAndroid Build Coastguard Worker WORD32 isvce_svc_au_props_validate(svc_inp_params_t *ps_svc_inp_params, UWORD32 u4_inp_wd,
371*495ae853SAndroid Build Coastguard Worker                                    UWORD32 u4_inp_ht, UWORD32 u4_svc_comp_wd,
372*495ae853SAndroid Build Coastguard Worker                                    UWORD32 u4_svc_comp_ht)
373*495ae853SAndroid Build Coastguard Worker {
374*495ae853SAndroid Build Coastguard Worker     typedef struct
375*495ae853SAndroid Build Coastguard Worker     {
376*495ae853SAndroid Build Coastguard Worker         DOUBLE d_spatial_res_ratio;
377*495ae853SAndroid Build Coastguard Worker 
378*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_max_num_spatial_layers;
379*495ae853SAndroid Build Coastguard Worker     } spatial_layer_props_t;
380*495ae853SAndroid Build Coastguard Worker 
381*495ae853SAndroid Build Coastguard Worker     UWORD8 i;
382*495ae853SAndroid Build Coastguard Worker     UWORD32 au4_svc_wd[MAX_NUM_SPATIAL_LAYERS];
383*495ae853SAndroid Build Coastguard Worker     UWORD32 au4_svc_ht[MAX_NUM_SPATIAL_LAYERS];
384*495ae853SAndroid Build Coastguard Worker 
385*495ae853SAndroid Build Coastguard Worker     DOUBLE d_scaling_factor = ps_svc_inp_params->d_spatial_res_ratio;
386*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_spatial_layers = ps_svc_inp_params->u1_num_spatial_layers;
387*495ae853SAndroid Build Coastguard Worker     const spatial_layer_props_t gas_valid_spatial_layer_props[] = {{1.5, 2}, {2, 3}};
388*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_error_code = IV_SUCCESS;
389*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_min_num_temporal_layers = 1;
390*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_min_num_spatial_layers = 1;
391*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_max_num_temporal_layers = MAX_NUM_TEMPORAL_LAYERS;
392*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_max_num_spatial_layers = MAX_NUM_SPATIAL_LAYERS;
393*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_num_valid_spatial_layer_props =
394*495ae853SAndroid Build Coastguard Worker         sizeof(gas_valid_spatial_layer_props) / sizeof(gas_valid_spatial_layer_props[0]);
395*495ae853SAndroid Build Coastguard Worker 
396*495ae853SAndroid Build Coastguard Worker     if((ps_svc_inp_params->u1_num_temporal_layers < u1_min_num_temporal_layers) ||
397*495ae853SAndroid Build Coastguard Worker        (ps_svc_inp_params->u1_num_temporal_layers > u1_max_num_temporal_layers))
398*495ae853SAndroid Build Coastguard Worker     {
399*495ae853SAndroid Build Coastguard Worker         u4_error_code |= IH264E_INVALID_SVC_PARAMS | IH264E_INVALID_NUM_TEMPORAL_LAYERS;
400*495ae853SAndroid Build Coastguard Worker     }
401*495ae853SAndroid Build Coastguard Worker 
402*495ae853SAndroid Build Coastguard Worker     if((ps_svc_inp_params->u1_num_spatial_layers < u1_min_num_spatial_layers) ||
403*495ae853SAndroid Build Coastguard Worker        (ps_svc_inp_params->u1_num_spatial_layers > u1_max_num_spatial_layers))
404*495ae853SAndroid Build Coastguard Worker     {
405*495ae853SAndroid Build Coastguard Worker         u4_error_code |= IH264E_INVALID_SVC_PARAMS | IH264E_INVALID_NUM_SPATIAL_LAYERS;
406*495ae853SAndroid Build Coastguard Worker     }
407*495ae853SAndroid Build Coastguard Worker 
408*495ae853SAndroid Build Coastguard Worker     {
409*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_is_input_ratio_valid = 0;
410*495ae853SAndroid Build Coastguard Worker 
411*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < u1_num_valid_spatial_layer_props; i++)
412*495ae853SAndroid Build Coastguard Worker         {
413*495ae853SAndroid Build Coastguard Worker             if(ps_svc_inp_params->d_spatial_res_ratio ==
414*495ae853SAndroid Build Coastguard Worker                gas_valid_spatial_layer_props[i].d_spatial_res_ratio)
415*495ae853SAndroid Build Coastguard Worker             {
416*495ae853SAndroid Build Coastguard Worker                 u1_is_input_ratio_valid = 1;
417*495ae853SAndroid Build Coastguard Worker 
418*495ae853SAndroid Build Coastguard Worker                 if(ps_svc_inp_params->u1_num_spatial_layers >
419*495ae853SAndroid Build Coastguard Worker                    gas_valid_spatial_layer_props[i].u1_max_num_spatial_layers)
420*495ae853SAndroid Build Coastguard Worker                 {
421*495ae853SAndroid Build Coastguard Worker                     u4_error_code |= IH264E_INVALID_SVC_PARAMS | IH264E_INVALID_NUM_SPATIAL_LAYERS;
422*495ae853SAndroid Build Coastguard Worker                 }
423*495ae853SAndroid Build Coastguard Worker 
424*495ae853SAndroid Build Coastguard Worker                 break;
425*495ae853SAndroid Build Coastguard Worker             }
426*495ae853SAndroid Build Coastguard Worker         }
427*495ae853SAndroid Build Coastguard Worker 
428*495ae853SAndroid Build Coastguard Worker         if(!u1_is_input_ratio_valid)
429*495ae853SAndroid Build Coastguard Worker         {
430*495ae853SAndroid Build Coastguard Worker             u4_error_code |= IH264E_INVALID_SVC_PARAMS | IH264E_INVALID_SPATIAL_RES_RATIO;
431*495ae853SAndroid Build Coastguard Worker         }
432*495ae853SAndroid Build Coastguard Worker     }
433*495ae853SAndroid Build Coastguard Worker 
434*495ae853SAndroid Build Coastguard Worker     if((u4_svc_comp_wd > SVCE_MAX_INP_DIM) || (u4_svc_comp_ht > SVCE_MAX_INP_DIM) ||
435*495ae853SAndroid Build Coastguard Worker        ((u4_svc_comp_wd * u4_svc_comp_ht) > SVCE_MAX_INP_FRAME_SIZE) ||
436*495ae853SAndroid Build Coastguard Worker        (u4_svc_comp_wd % 16 != 0) || (u4_svc_comp_ht % 16 != 0))
437*495ae853SAndroid Build Coastguard Worker     {
438*495ae853SAndroid Build Coastguard Worker         u4_error_code |= IH264E_INVALID_SVC_INPUT_DIMENSIONS;
439*495ae853SAndroid Build Coastguard Worker     }
440*495ae853SAndroid Build Coastguard Worker 
441*495ae853SAndroid Build Coastguard Worker     /* Constraint from padding intrinsics */
442*495ae853SAndroid Build Coastguard Worker     if((u4_svc_comp_wd - u4_inp_wd) % 16)
443*495ae853SAndroid Build Coastguard Worker     {
444*495ae853SAndroid Build Coastguard Worker         u4_error_code |= IH264E_INVALID_SVC_INPUT_DIMENSIONS;
445*495ae853SAndroid Build Coastguard Worker     }
446*495ae853SAndroid Build Coastguard Worker 
447*495ae853SAndroid Build Coastguard Worker     /* Constraint from 420p to 420sp conversion */
448*495ae853SAndroid Build Coastguard Worker     if((u4_svc_comp_ht - u4_inp_ht) % 4)
449*495ae853SAndroid Build Coastguard Worker     {
450*495ae853SAndroid Build Coastguard Worker         u4_error_code |= IH264E_INVALID_SVC_INPUT_DIMENSIONS;
451*495ae853SAndroid Build Coastguard Worker     }
452*495ae853SAndroid Build Coastguard Worker 
453*495ae853SAndroid Build Coastguard Worker     au4_svc_wd[u1_num_spatial_layers - 1] = u4_svc_comp_wd;
454*495ae853SAndroid Build Coastguard Worker     au4_svc_ht[u1_num_spatial_layers - 1] = u4_svc_comp_ht;
455*495ae853SAndroid Build Coastguard Worker 
456*495ae853SAndroid Build Coastguard Worker     for(i = (u1_num_spatial_layers - 1); i > 0; i--)
457*495ae853SAndroid Build Coastguard Worker     {
458*495ae853SAndroid Build Coastguard Worker         au4_svc_wd[i - 1] = au4_svc_wd[i] / d_scaling_factor;
459*495ae853SAndroid Build Coastguard Worker         au4_svc_ht[i - 1] = au4_svc_ht[i] / d_scaling_factor;
460*495ae853SAndroid Build Coastguard Worker 
461*495ae853SAndroid Build Coastguard Worker         if((au4_svc_wd[i - 1] * d_scaling_factor != au4_svc_wd[i]) ||
462*495ae853SAndroid Build Coastguard Worker            (au4_svc_ht[i - 1] * d_scaling_factor != au4_svc_ht[i]) ||
463*495ae853SAndroid Build Coastguard Worker            (au4_svc_ht[i - 1] % 16 != 0) || (au4_svc_ht[i - 1] % 16 != 0))
464*495ae853SAndroid Build Coastguard Worker         {
465*495ae853SAndroid Build Coastguard Worker             u4_error_code |= IH264E_INVALID_SVC_INPUT_DIMENSIONS;
466*495ae853SAndroid Build Coastguard Worker         }
467*495ae853SAndroid Build Coastguard Worker     }
468*495ae853SAndroid Build Coastguard Worker 
469*495ae853SAndroid Build Coastguard Worker     return u4_error_code;
470*495ae853SAndroid Build Coastguard Worker }
471*495ae853SAndroid Build Coastguard Worker 
472*495ae853SAndroid Build Coastguard Worker /**
473*495ae853SAndroid Build Coastguard Worker *******************************************************************************
474*495ae853SAndroid Build Coastguard Worker *
475*495ae853SAndroid Build Coastguard Worker * @brief
476*495ae853SAndroid Build Coastguard Worker *  Validates SVC input params
477*495ae853SAndroid Build Coastguard Worker *
478*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cfg
479*495ae853SAndroid Build Coastguard Worker *  Cfg parameters
480*495ae853SAndroid Build Coastguard Worker *
481*495ae853SAndroid Build Coastguard Worker * @returns  error code in conformance with 'IH264E_ERROR_T'
482*495ae853SAndroid Build Coastguard Worker *
483*495ae853SAndroid Build Coastguard Worker *******************************************************************************
484*495ae853SAndroid Build Coastguard Worker */
isvce_svc_inp_params_validate(isvce_init_ip_t * ps_ip,isvce_cfg_params_t * ps_cfg)485*495ae853SAndroid Build Coastguard Worker WORD32 isvce_svc_inp_params_validate(isvce_init_ip_t *ps_ip, isvce_cfg_params_t *ps_cfg)
486*495ae853SAndroid Build Coastguard Worker {
487*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_error_code = isvce_svc_au_props_validate(&ps_ip->s_svc_inp_params, ps_ip->u4_wd,
488*495ae853SAndroid Build Coastguard Worker                                                         ps_ip->u4_ht, ps_cfg->u4_wd, ps_cfg->u4_ht);
489*495ae853SAndroid Build Coastguard Worker 
490*495ae853SAndroid Build Coastguard Worker     if(ps_cfg->u4_enable_alt_ref)
491*495ae853SAndroid Build Coastguard Worker     {
492*495ae853SAndroid Build Coastguard Worker         u4_error_code |= IH264E_INVALID_ALT_REF_OPTION;
493*495ae853SAndroid Build Coastguard Worker     }
494*495ae853SAndroid Build Coastguard Worker 
495*495ae853SAndroid Build Coastguard Worker     if(ps_cfg->u4_num_bframes)
496*495ae853SAndroid Build Coastguard Worker     {
497*495ae853SAndroid Build Coastguard Worker         u4_error_code |= IH264E_BFRAMES_NOT_SUPPORTED;
498*495ae853SAndroid Build Coastguard Worker     }
499*495ae853SAndroid Build Coastguard Worker 
500*495ae853SAndroid Build Coastguard Worker     if(ps_cfg->e_slice_mode != IVE_SLICE_MODE_NONE)
501*495ae853SAndroid Build Coastguard Worker     {
502*495ae853SAndroid Build Coastguard Worker         u4_error_code |= IH264E_SLICE_TYPE_INPUT_INVALID;
503*495ae853SAndroid Build Coastguard Worker     }
504*495ae853SAndroid Build Coastguard Worker 
505*495ae853SAndroid Build Coastguard Worker     if(ps_cfg->e_content_type != IV_PROGRESSIVE)
506*495ae853SAndroid Build Coastguard Worker     {
507*495ae853SAndroid Build Coastguard Worker         u4_error_code |= IH264E_CONTENT_TYPE_NOT_SUPPORTED;
508*495ae853SAndroid Build Coastguard Worker     }
509*495ae853SAndroid Build Coastguard Worker 
510*495ae853SAndroid Build Coastguard Worker     if(ps_cfg->u4_weighted_prediction)
511*495ae853SAndroid Build Coastguard Worker     {
512*495ae853SAndroid Build Coastguard Worker         u4_error_code |= IH264E_WEIGHTED_PRED_NOT_SUPPORTED;
513*495ae853SAndroid Build Coastguard Worker     }
514*495ae853SAndroid Build Coastguard Worker 
515*495ae853SAndroid Build Coastguard Worker     return u4_error_code;
516*495ae853SAndroid Build Coastguard Worker }
517*495ae853SAndroid Build Coastguard Worker 
518*495ae853SAndroid Build Coastguard Worker /**
519*495ae853SAndroid Build Coastguard Worker *******************************************************************************
520*495ae853SAndroid Build Coastguard Worker *
521*495ae853SAndroid Build Coastguard Worker * @brief
522*495ae853SAndroid Build Coastguard Worker *  Validates SVC RC params
523*495ae853SAndroid Build Coastguard Worker *
524*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cfg
525*495ae853SAndroid Build Coastguard Worker *  Cfg parameters
526*495ae853SAndroid Build Coastguard Worker *
527*495ae853SAndroid Build Coastguard Worker * @returns  error code in conformance with 'IH264E_ERROR_T'
528*495ae853SAndroid Build Coastguard Worker *
529*495ae853SAndroid Build Coastguard Worker *******************************************************************************
530*495ae853SAndroid Build Coastguard Worker */
isvce_svc_rc_params_validate(isvce_cfg_params_t * ps_cfg)531*495ae853SAndroid Build Coastguard Worker static WORD32 isvce_svc_rc_params_validate(isvce_cfg_params_t *ps_cfg)
532*495ae853SAndroid Build Coastguard Worker {
533*495ae853SAndroid Build Coastguard Worker     WORD32 i;
534*495ae853SAndroid Build Coastguard Worker 
535*495ae853SAndroid Build Coastguard Worker     /* RC requires total bits in a second to fit int32_t */
536*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_cfg->s_svc_params.u1_num_spatial_layers; i++)
537*495ae853SAndroid Build Coastguard Worker     {
538*495ae853SAndroid Build Coastguard Worker         if((((((UWORD64) ps_cfg->au4_target_bitrate[i]) * 1000llu) / ps_cfg->u4_tgt_frame_rate) *
539*495ae853SAndroid Build Coastguard Worker             ps_cfg->u4_idr_frm_interval) > ((UWORD64) INT32_MAX))
540*495ae853SAndroid Build Coastguard Worker         {
541*495ae853SAndroid Build Coastguard Worker             return IH264E_BITRATE_NOT_SUPPORTED;
542*495ae853SAndroid Build Coastguard Worker         }
543*495ae853SAndroid Build Coastguard Worker     }
544*495ae853SAndroid Build Coastguard Worker 
545*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
546*495ae853SAndroid Build Coastguard Worker }
547*495ae853SAndroid Build Coastguard Worker 
548*495ae853SAndroid Build Coastguard Worker /**
549*495ae853SAndroid Build Coastguard Worker *******************************************************************************
550*495ae853SAndroid Build Coastguard Worker *
551*495ae853SAndroid Build Coastguard Worker * @brief
552*495ae853SAndroid Build Coastguard Worker *  Validates SVC frame-level input params
553*495ae853SAndroid Build Coastguard Worker *
554*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cfg
555*495ae853SAndroid Build Coastguard Worker *  Cfg parameters
556*495ae853SAndroid Build Coastguard Worker *
557*495ae853SAndroid Build Coastguard Worker * @returns  error code in conformance with 'IH264E_ERROR_T'
558*495ae853SAndroid Build Coastguard Worker *
559*495ae853SAndroid Build Coastguard Worker *******************************************************************************
560*495ae853SAndroid Build Coastguard Worker */
isvce_svc_frame_params_validate(rate_control_api_t * aps_rate_control_api[MAX_NUM_SPATIAL_LAYERS],UWORD8 u1_num_spatial_layers)561*495ae853SAndroid Build Coastguard Worker WORD32 isvce_svc_frame_params_validate(
562*495ae853SAndroid Build Coastguard Worker     rate_control_api_t *aps_rate_control_api[MAX_NUM_SPATIAL_LAYERS], UWORD8 u1_num_spatial_layers)
563*495ae853SAndroid Build Coastguard Worker {
564*495ae853SAndroid Build Coastguard Worker     WORD32 i;
565*495ae853SAndroid Build Coastguard Worker 
566*495ae853SAndroid Build Coastguard Worker     /* RC requires total bits in a second to fit int32_t */
567*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < u1_num_spatial_layers; i++)
568*495ae853SAndroid Build Coastguard Worker     {
569*495ae853SAndroid Build Coastguard Worker         if((((UWORD64) irc_get_bits_per_frame(aps_rate_control_api[i])) *
570*495ae853SAndroid Build Coastguard Worker             irc_get_intra_frame_interval(aps_rate_control_api[i])) > ((UWORD64) INT32_MAX))
571*495ae853SAndroid Build Coastguard Worker         {
572*495ae853SAndroid Build Coastguard Worker             return IH264E_BITRATE_NOT_SUPPORTED;
573*495ae853SAndroid Build Coastguard Worker         }
574*495ae853SAndroid Build Coastguard Worker     }
575*495ae853SAndroid Build Coastguard Worker 
576*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
577*495ae853SAndroid Build Coastguard Worker }
578*495ae853SAndroid Build Coastguard Worker 
579*495ae853SAndroid Build Coastguard Worker /**
580*495ae853SAndroid Build Coastguard Worker *******************************************************************************
581*495ae853SAndroid Build Coastguard Worker *
582*495ae853SAndroid Build Coastguard Worker * @brief
583*495ae853SAndroid Build Coastguard Worker *  Used to get reference picture buffer size for a given level and
584*495ae853SAndroid Build Coastguard Worker *  and padding used
585*495ae853SAndroid Build Coastguard Worker *
586*495ae853SAndroid Build Coastguard Worker * @param[in] ps_svc_inp_params
587*495ae853SAndroid Build Coastguard Worker *  Struct containing SVC specific input params
588*495ae853SAndroid Build Coastguard Worker *
589*495ae853SAndroid Build Coastguard Worker * @param[in] i4_pic_size
590*495ae853SAndroid Build Coastguard Worker *  Number of luma samples (Width * Height)
591*495ae853SAndroid Build Coastguard Worker *
592*495ae853SAndroid Build Coastguard Worker * @param[in] i4_level
593*495ae853SAndroid Build Coastguard Worker *  Level
594*495ae853SAndroid Build Coastguard Worker *
595*495ae853SAndroid Build Coastguard Worker * @param[in] i4_horz_pad
596*495ae853SAndroid Build Coastguard Worker *  Total padding used in horizontal direction
597*495ae853SAndroid Build Coastguard Worker *
598*495ae853SAndroid Build Coastguard Worker * @param[in] i4_vert_pad
599*495ae853SAndroid Build Coastguard Worker *  Total padding used in vertical direction
600*495ae853SAndroid Build Coastguard Worker *
601*495ae853SAndroid Build Coastguard Worker * @param[in] i4_num_ref_frames
602*495ae853SAndroid Build Coastguard Worker *  Num Reference Frames
603*495ae853SAndroid Build Coastguard Worker *
604*495ae853SAndroid Build Coastguard Worker * @param[in] i4_num_reorder_frames
605*495ae853SAndroid Build Coastguard Worker *  Num Reorder Frames
606*495ae853SAndroid Build Coastguard Worker *
607*495ae853SAndroid Build Coastguard Worker * @returns  Total picture buffer size
608*495ae853SAndroid Build Coastguard Worker *
609*495ae853SAndroid Build Coastguard Worker *******************************************************************************
610*495ae853SAndroid Build Coastguard Worker */
isvce_get_total_svc_au_buf_size(svc_inp_params_t * ps_svc_inp_params,WORD32 i4_pic_size,WORD32 i4_level,WORD32 i4_horz_pad,WORD32 i4_vert_pad,WORD32 i4_num_ref_frames,WORD32 i4_num_reorder_frames)611*495ae853SAndroid Build Coastguard Worker WORD32 isvce_get_total_svc_au_buf_size(svc_inp_params_t *ps_svc_inp_params, WORD32 i4_pic_size,
612*495ae853SAndroid Build Coastguard Worker                                        WORD32 i4_level, WORD32 i4_horz_pad, WORD32 i4_vert_pad,
613*495ae853SAndroid Build Coastguard Worker                                        WORD32 i4_num_ref_frames, WORD32 i4_num_reorder_frames)
614*495ae853SAndroid Build Coastguard Worker {
615*495ae853SAndroid Build Coastguard Worker     WORD32 i;
616*495ae853SAndroid Build Coastguard Worker     WORD32 size;
617*495ae853SAndroid Build Coastguard Worker     WORD32 num_luma_samples;
618*495ae853SAndroid Build Coastguard Worker     WORD32 lvl_idx;
619*495ae853SAndroid Build Coastguard Worker     WORD32 max_wd, min_ht;
620*495ae853SAndroid Build Coastguard Worker     WORD32 num_samples;
621*495ae853SAndroid Build Coastguard Worker     WORD32 max_num_bufs;
622*495ae853SAndroid Build Coastguard Worker 
623*495ae853SAndroid Build Coastguard Worker     WORD32 pad = MAX(i4_horz_pad, i4_vert_pad);
624*495ae853SAndroid Build Coastguard Worker     DOUBLE d_svc_size_multiplier = 1;
625*495ae853SAndroid Build Coastguard Worker 
626*495ae853SAndroid Build Coastguard Worker     for(i = 1; i < ps_svc_inp_params->u1_num_spatial_layers; i++)
627*495ae853SAndroid Build Coastguard Worker     {
628*495ae853SAndroid Build Coastguard Worker         d_svc_size_multiplier += 1. / pow(ps_svc_inp_params->d_spatial_res_ratio, i);
629*495ae853SAndroid Build Coastguard Worker     }
630*495ae853SAndroid Build Coastguard Worker 
631*495ae853SAndroid Build Coastguard Worker     /*
632*495ae853SAndroid Build Coastguard Worker      * If i4_num_ref_frames and num_reorder_frmaes is specified
633*495ae853SAndroid Build Coastguard Worker      * Use minimum value
634*495ae853SAndroid Build Coastguard Worker      */
635*495ae853SAndroid Build Coastguard Worker     max_num_bufs = (i4_num_ref_frames + i4_num_reorder_frames + MAX_CTXT_SETS +
636*495ae853SAndroid Build Coastguard Worker                     ps_svc_inp_params->u1_num_temporal_layers);
637*495ae853SAndroid Build Coastguard Worker 
638*495ae853SAndroid Build Coastguard Worker     /* Get i4_level index */
639*495ae853SAndroid Build Coastguard Worker     lvl_idx = ih264e_get_lvl_idx(i4_level);
640*495ae853SAndroid Build Coastguard Worker 
641*495ae853SAndroid Build Coastguard Worker     /* Maximum number of luma samples in a picture at given i4_level */
642*495ae853SAndroid Build Coastguard Worker     num_luma_samples = gai4_ih264_max_luma_pic_size[lvl_idx];
643*495ae853SAndroid Build Coastguard Worker     num_luma_samples = MAX(num_luma_samples, i4_pic_size);
644*495ae853SAndroid Build Coastguard Worker 
645*495ae853SAndroid Build Coastguard Worker     /* Account for chroma */
646*495ae853SAndroid Build Coastguard Worker     num_samples = num_luma_samples * 3 / 2;
647*495ae853SAndroid Build Coastguard Worker 
648*495ae853SAndroid Build Coastguard Worker     /* Maximum width of luma samples in a picture at given i4_level */
649*495ae853SAndroid Build Coastguard Worker     max_wd = gai4_ih264_max_wd_ht[lvl_idx];
650*495ae853SAndroid Build Coastguard Worker 
651*495ae853SAndroid Build Coastguard Worker     /* Minimum height of luma samples in a picture at given i4_level */
652*495ae853SAndroid Build Coastguard Worker     min_ht = gai4_ih264_min_wd_ht[lvl_idx];
653*495ae853SAndroid Build Coastguard Worker 
654*495ae853SAndroid Build Coastguard Worker     /* Allocation is required for
655*495ae853SAndroid Build Coastguard Worker      * (Wd + i4_horz_pad) * (Ht + i4_vert_pad) * (2 * max_dpb_size + 1)
656*495ae853SAndroid Build Coastguard Worker      *
657*495ae853SAndroid Build Coastguard Worker      * Above expanded as
658*495ae853SAndroid Build Coastguard Worker      * ((Wd * Ht) + (i4_horz_pad * i4_vert_pad) + Wd * i4_vert_pad + Ht *
659*495ae853SAndroid Build Coastguard Worker      * i4_horz_pad) * (2 * max_dpb_size + 1) (Wd * Ht) * (2 * max_dpb_size + 1) +
660*495ae853SAndroid Build Coastguard Worker      * ((i4_horz_pad * i4_vert_pad) + Wd * i4_vert_pad + Ht * i4_horz_pad) * (2 *
661*495ae853SAndroid Build Coastguard Worker      * max_dpb_size + 1) Now max_dpb_size increases with smaller Wd and Ht, but Wd
662*495ae853SAndroid Build Coastguard Worker      * * ht * max_dpb_size will still be lesser or equal to max_wd * max_ht *
663*495ae853SAndroid Build Coastguard Worker      * dpb_size
664*495ae853SAndroid Build Coastguard Worker      *
665*495ae853SAndroid Build Coastguard Worker      * In the above equation (Wd * Ht) * (2 * max_dpb_size + 1) is accounted by
666*495ae853SAndroid Build Coastguard Worker      * using num_samples * (2 * max_dpb_size + 1) below
667*495ae853SAndroid Build Coastguard Worker      *
668*495ae853SAndroid Build Coastguard Worker      * For the padded area use MAX(i4_horz_pad, i4_vert_pad) as pad
669*495ae853SAndroid Build Coastguard Worker      * ((pad * pad) + pad * (Wd + Ht)) * (2 * max_dpb_size + 1) has to accounted
670*495ae853SAndroid Build Coastguard Worker      * from the above for padding
671*495ae853SAndroid Build Coastguard Worker      *
672*495ae853SAndroid Build Coastguard Worker      * Since Width and Height can change worst Wd + Ht is when One of the
673*495ae853SAndroid Build Coastguard Worker      * dimensions is max and other is min So use max_wd and min_ht
674*495ae853SAndroid Build Coastguard Worker      */
675*495ae853SAndroid Build Coastguard Worker 
676*495ae853SAndroid Build Coastguard Worker     /* Number of bytes in reference pictures */
677*495ae853SAndroid Build Coastguard Worker     size = num_samples * max_num_bufs;
678*495ae853SAndroid Build Coastguard Worker 
679*495ae853SAndroid Build Coastguard Worker     /* Account for Spatial Layers */
680*495ae853SAndroid Build Coastguard Worker     size = (WORD32) (size * d_svc_size_multiplier + 0.99);
681*495ae853SAndroid Build Coastguard Worker 
682*495ae853SAndroid Build Coastguard Worker     /* Account for padding area */
683*495ae853SAndroid Build Coastguard Worker     size += ((pad * pad) + pad * (max_wd + min_ht)) * 3 / 2 * max_num_bufs *
684*495ae853SAndroid Build Coastguard Worker             ps_svc_inp_params->u1_num_spatial_layers;
685*495ae853SAndroid Build Coastguard Worker 
686*495ae853SAndroid Build Coastguard Worker     size += ps_svc_inp_params->u1_num_spatial_layers * sizeof(yuv_buf_props_t);
687*495ae853SAndroid Build Coastguard Worker 
688*495ae853SAndroid Build Coastguard Worker     return size;
689*495ae853SAndroid Build Coastguard Worker }
690*495ae853SAndroid Build Coastguard Worker 
691*495ae853SAndroid Build Coastguard Worker /**
692*495ae853SAndroid Build Coastguard Worker *******************************************************************************
693*495ae853SAndroid Build Coastguard Worker *
694*495ae853SAndroid Build Coastguard Worker * @brief
695*495ae853SAndroid Build Coastguard Worker *  Used to get size of buffers used for storing prediction data
696*495ae853SAndroid Build Coastguard Worker *
697*495ae853SAndroid Build Coastguard Worker * @param[in] ps_svc_inp_params
698*495ae853SAndroid Build Coastguard Worker *  Struct containing SVC specific input params
699*495ae853SAndroid Build Coastguard Worker *
700*495ae853SAndroid Build Coastguard Worker * @param[in] i4_num_luma_samples
701*495ae853SAndroid Build Coastguard Worker *  Number of luma samples (Width * Height)
702*495ae853SAndroid Build Coastguard Worker *
703*495ae853SAndroid Build Coastguard Worker * @returns  Size of buffers used for storing prediction data
704*495ae853SAndroid Build Coastguard Worker *
705*495ae853SAndroid Build Coastguard Worker *******************************************************************************
706*495ae853SAndroid Build Coastguard Worker */
isvce_get_total_svc_au_data_size(WORD32 i4_num_luma_samples,UWORD8 u1_num_spatial_layers,DOUBLE d_spatial_res_ratio)707*495ae853SAndroid Build Coastguard Worker UWORD32 isvce_get_total_svc_au_data_size(WORD32 i4_num_luma_samples, UWORD8 u1_num_spatial_layers,
708*495ae853SAndroid Build Coastguard Worker                                          DOUBLE d_spatial_res_ratio)
709*495ae853SAndroid Build Coastguard Worker {
710*495ae853SAndroid Build Coastguard Worker     WORD32 i;
711*495ae853SAndroid Build Coastguard Worker 
712*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_svc_au_data_size = 0;
713*495ae853SAndroid Build Coastguard Worker 
714*495ae853SAndroid Build Coastguard Worker     u4_svc_au_data_size += u1_num_spatial_layers * sizeof(svc_layer_data_t);
715*495ae853SAndroid Build Coastguard Worker 
716*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < u1_num_spatial_layers; i++)
717*495ae853SAndroid Build Coastguard Worker     {
718*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_samples =
719*495ae853SAndroid Build Coastguard Worker             ((DOUBLE) i4_num_luma_samples) / pow(pow(d_spatial_res_ratio, i), 2) + 0.99;
720*495ae853SAndroid Build Coastguard Worker         WORD32 i4_num_mbs = i4_layer_luma_samples / (MB_SIZE * MB_SIZE);
721*495ae853SAndroid Build Coastguard Worker 
722*495ae853SAndroid Build Coastguard Worker         /* isvce_mb_info_t */
723*495ae853SAndroid Build Coastguard Worker         u4_svc_au_data_size += i4_num_mbs * sizeof(isvce_mb_info_t);
724*495ae853SAndroid Build Coastguard Worker 
725*495ae853SAndroid Build Coastguard Worker         /* pu4_num_pus_in_mb */
726*495ae853SAndroid Build Coastguard Worker         u4_svc_au_data_size += i4_num_mbs * sizeof(UWORD32);
727*495ae853SAndroid Build Coastguard Worker     }
728*495ae853SAndroid Build Coastguard Worker 
729*495ae853SAndroid Build Coastguard Worker     return u4_svc_au_data_size;
730*495ae853SAndroid Build Coastguard Worker }
731*495ae853SAndroid Build Coastguard Worker 
732*495ae853SAndroid Build Coastguard Worker /**
733*495ae853SAndroid Build Coastguard Worker *******************************************************************************
734*495ae853SAndroid Build Coastguard Worker *
735*495ae853SAndroid Build Coastguard Worker * @brief Function to add buffers to SVC AU Data Store Manager
736*495ae853SAndroid Build Coastguard Worker *
737*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
738*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
739*495ae853SAndroid Build Coastguard Worker *
740*495ae853SAndroid Build Coastguard Worker * @returns  error status
741*495ae853SAndroid Build Coastguard Worker *
742*495ae853SAndroid Build Coastguard Worker *******************************************************************************
743*495ae853SAndroid Build Coastguard Worker */
isvce_svc_au_data_mgr_add_bufs(isvce_codec_t * ps_codec)744*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_svc_au_data_mgr_add_bufs(isvce_codec_t *ps_codec)
745*495ae853SAndroid Build Coastguard Worker {
746*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T ret;
747*495ae853SAndroid Build Coastguard Worker 
748*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
749*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf;
750*495ae853SAndroid Build Coastguard Worker 
751*495ae853SAndroid Build Coastguard Worker     svc_au_data_t *ps_svc_au_data = ps_codec->ps_svc_au_data_base;
752*495ae853SAndroid Build Coastguard Worker 
753*495ae853SAndroid Build Coastguard Worker     WORD32 i4_max_dpb_size = ps_codec->i4_ref_buf_cnt;
754*495ae853SAndroid Build Coastguard Worker     WORD64 i8_alloc_mem_size = ps_codec->i4_svc_au_data_size;
755*495ae853SAndroid Build Coastguard Worker     WORD32 i4_num_luma_samples = ALIGN16(ps_codec->s_cfg.u4_wd) * ALIGN16(ps_codec->s_cfg.u4_ht);
756*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_spatial_layers = ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers;
757*495ae853SAndroid Build Coastguard Worker     DOUBLE d_spatial_res_ratio = ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio;
758*495ae853SAndroid Build Coastguard Worker 
759*495ae853SAndroid Build Coastguard Worker     ps_codec->ps_svc_au_data = ps_svc_au_data;
760*495ae853SAndroid Build Coastguard Worker     pu1_buf = (UWORD8 *) ps_svc_au_data;
761*495ae853SAndroid Build Coastguard Worker     pu1_buf += BUF_MGR_MAX_CNT * sizeof(ps_svc_au_data[0]);
762*495ae853SAndroid Build Coastguard Worker 
763*495ae853SAndroid Build Coastguard Worker     i8_alloc_mem_size -= (BUF_MGR_MAX_CNT * sizeof(ps_svc_au_data[0]));
764*495ae853SAndroid Build Coastguard Worker 
765*495ae853SAndroid Build Coastguard Worker     i = 0;
766*495ae853SAndroid Build Coastguard Worker 
767*495ae853SAndroid Build Coastguard Worker     while(i < i4_max_dpb_size)
768*495ae853SAndroid Build Coastguard Worker     {
769*495ae853SAndroid Build Coastguard Worker         ps_svc_au_data->ps_svc_layer_data = (svc_layer_data_t *) pu1_buf;
770*495ae853SAndroid Build Coastguard Worker         pu1_buf += u1_num_spatial_layers * sizeof(ps_svc_au_data->ps_svc_layer_data[0]);
771*495ae853SAndroid Build Coastguard Worker         i8_alloc_mem_size -= u1_num_spatial_layers * sizeof(ps_svc_au_data->ps_svc_layer_data[0]);
772*495ae853SAndroid Build Coastguard Worker 
773*495ae853SAndroid Build Coastguard Worker         for(j = u1_num_spatial_layers - 1; j >= 0; j--)
774*495ae853SAndroid Build Coastguard Worker         {
775*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_samples =
776*495ae853SAndroid Build Coastguard Worker                 ((DOUBLE) i4_num_luma_samples) /
777*495ae853SAndroid Build Coastguard Worker                     pow(pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j), 2) +
778*495ae853SAndroid Build Coastguard Worker                 0.99;
779*495ae853SAndroid Build Coastguard Worker             WORD32 i4_num_mbs = i4_layer_luma_samples / (MB_SIZE * MB_SIZE);
780*495ae853SAndroid Build Coastguard Worker 
781*495ae853SAndroid Build Coastguard Worker             ps_svc_au_data->ps_svc_layer_data[j].pu4_num_pus_in_mb = (UWORD32 *) pu1_buf;
782*495ae853SAndroid Build Coastguard Worker             pu1_buf +=
783*495ae853SAndroid Build Coastguard Worker                 i4_num_mbs * sizeof(ps_svc_au_data->ps_svc_layer_data[j].pu4_num_pus_in_mb[0]);
784*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -=
785*495ae853SAndroid Build Coastguard Worker                 i4_num_mbs * sizeof(ps_svc_au_data->ps_svc_layer_data[j].pu4_num_pus_in_mb[0]);
786*495ae853SAndroid Build Coastguard Worker 
787*495ae853SAndroid Build Coastguard Worker             ps_svc_au_data->ps_svc_layer_data[j].ps_mb_info = (isvce_mb_info_t *) pu1_buf;
788*495ae853SAndroid Build Coastguard Worker             pu1_buf += i4_num_mbs * sizeof(ps_svc_au_data->ps_svc_layer_data[j].ps_mb_info[0]);
789*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -=
790*495ae853SAndroid Build Coastguard Worker                 i4_num_mbs * sizeof(ps_svc_au_data->ps_svc_layer_data[j].ps_mb_info[0]);
791*495ae853SAndroid Build Coastguard Worker 
792*495ae853SAndroid Build Coastguard Worker             ASSERT(i8_alloc_mem_size >= 0);
793*495ae853SAndroid Build Coastguard Worker         }
794*495ae853SAndroid Build Coastguard Worker 
795*495ae853SAndroid Build Coastguard Worker         if(i8_alloc_mem_size < 0)
796*495ae853SAndroid Build Coastguard Worker         {
797*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_error_code = IH264E_INSUFFICIENT_MEM_MVBANK;
798*495ae853SAndroid Build Coastguard Worker 
799*495ae853SAndroid Build Coastguard Worker             return IH264E_INSUFFICIENT_MEM_MVBANK;
800*495ae853SAndroid Build Coastguard Worker         }
801*495ae853SAndroid Build Coastguard Worker 
802*495ae853SAndroid Build Coastguard Worker         ret =
803*495ae853SAndroid Build Coastguard Worker             ih264_buf_mgr_add((buf_mgr_t *) ps_codec->pv_svc_au_data_store_mgr, ps_svc_au_data, i);
804*495ae853SAndroid Build Coastguard Worker 
805*495ae853SAndroid Build Coastguard Worker         if(IH264_SUCCESS != ret)
806*495ae853SAndroid Build Coastguard Worker         {
807*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_error_code = IH264E_BUF_MGR_ERROR;
808*495ae853SAndroid Build Coastguard Worker 
809*495ae853SAndroid Build Coastguard Worker             return IH264E_BUF_MGR_ERROR;
810*495ae853SAndroid Build Coastguard Worker         }
811*495ae853SAndroid Build Coastguard Worker 
812*495ae853SAndroid Build Coastguard Worker         ps_svc_au_data++;
813*495ae853SAndroid Build Coastguard Worker         i++;
814*495ae853SAndroid Build Coastguard Worker     }
815*495ae853SAndroid Build Coastguard Worker 
816*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
817*495ae853SAndroid Build Coastguard Worker }
818*495ae853SAndroid Build Coastguard Worker 
819*495ae853SAndroid Build Coastguard Worker /**
820*495ae853SAndroid Build Coastguard Worker *******************************************************************************
821*495ae853SAndroid Build Coastguard Worker *
822*495ae853SAndroid Build Coastguard Worker * @brief
823*495ae853SAndroid Build Coastguard Worker *  Function to initialize svc_au_buf_t structs add au buffers to
824*495ae853SAndroid Build Coastguard Worker *  buffer manager in case of non-shared mode
825*495ae853SAndroid Build Coastguard Worker *
826*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
827*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
828*495ae853SAndroid Build Coastguard Worker *
829*495ae853SAndroid Build Coastguard Worker * @returns  error status
830*495ae853SAndroid Build Coastguard Worker *
831*495ae853SAndroid Build Coastguard Worker *******************************************************************************
832*495ae853SAndroid Build Coastguard Worker */
isvce_svc_au_buf_mgr_add_bufs(isvce_codec_t * ps_codec)833*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_svc_au_buf_mgr_add_bufs(isvce_codec_t *ps_codec)
834*495ae853SAndroid Build Coastguard Worker {
835*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
836*495ae853SAndroid Build Coastguard Worker     WORD32 buf_ret;
837*495ae853SAndroid Build Coastguard Worker 
838*495ae853SAndroid Build Coastguard Worker     svc_au_buf_t *ps_pic_buf = ps_codec->ps_pic_buf;
839*495ae853SAndroid Build Coastguard Worker 
840*495ae853SAndroid Build Coastguard Worker     IH264E_ERROR_T ret = IH264E_SUCCESS;
841*495ae853SAndroid Build Coastguard Worker 
842*495ae853SAndroid Build Coastguard Worker     WORD32 i4_max_dpb_size = ps_codec->i4_ref_buf_cnt;
843*495ae853SAndroid Build Coastguard Worker     WORD64 i8_alloc_mem_size =
844*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_total_pic_buf_size - BUF_MGR_MAX_CNT * sizeof(ps_pic_buf[0]);
845*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf = (UWORD8 *) ps_codec->ps_pic_buf;
846*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_spatial_layers = ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers;
847*495ae853SAndroid Build Coastguard Worker     DOUBLE d_spatial_res_ratio = ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio;
848*495ae853SAndroid Build Coastguard Worker 
849*495ae853SAndroid Build Coastguard Worker     pu1_buf += BUF_MGR_MAX_CNT * sizeof(svc_au_buf_t);
850*495ae853SAndroid Build Coastguard Worker 
851*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < i4_max_dpb_size; i++)
852*495ae853SAndroid Build Coastguard Worker     {
853*495ae853SAndroid Build Coastguard Worker         WORD32 i4_total_fpel_mem_size = 0;
854*495ae853SAndroid Build Coastguard Worker 
855*495ae853SAndroid Build Coastguard Worker         ps_pic_buf->ps_layer_yuv_buf_props = (yuv_buf_props_t *) pu1_buf;
856*495ae853SAndroid Build Coastguard Worker         pu1_buf += u1_num_spatial_layers * sizeof(ps_pic_buf->ps_layer_yuv_buf_props[0]);
857*495ae853SAndroid Build Coastguard Worker         i8_alloc_mem_size -= u1_num_spatial_layers * sizeof(ps_pic_buf->ps_layer_yuv_buf_props[0]);
858*495ae853SAndroid Build Coastguard Worker 
859*495ae853SAndroid Build Coastguard Worker         if(i8_alloc_mem_size < 0)
860*495ae853SAndroid Build Coastguard Worker         {
861*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_error_code = IH264E_INSUFFICIENT_MEM_PICBUF;
862*495ae853SAndroid Build Coastguard Worker             return IH264E_INSUFFICIENT_MEM_PICBUF;
863*495ae853SAndroid Build Coastguard Worker         }
864*495ae853SAndroid Build Coastguard Worker 
865*495ae853SAndroid Build Coastguard Worker         for(j = u1_num_spatial_layers - 1; j >= 0; j--)
866*495ae853SAndroid Build Coastguard Worker         {
867*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_wd = ((DOUBLE) ps_codec->s_cfg.u4_wd /
868*495ae853SAndroid Build Coastguard Worker                                        pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j)) +
869*495ae853SAndroid Build Coastguard Worker                                       0.99;
870*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_ht = ((DOUBLE) ps_codec->s_cfg.u4_ht /
871*495ae853SAndroid Build Coastguard Worker                                        pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j)) +
872*495ae853SAndroid Build Coastguard Worker                                       0.99;
873*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_samples =
874*495ae853SAndroid Build Coastguard Worker                 (ALIGN16(i4_layer_luma_wd) + PAD_WD) * (i4_layer_luma_ht + PAD_HT);
875*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_wd = i4_layer_luma_wd;
876*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_ht = i4_layer_luma_ht / 2.0 + 0.99;
877*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_samples =
878*495ae853SAndroid Build Coastguard Worker                 (ALIGN16(i4_layer_uv_wd) + PAD_WD) * (i4_layer_uv_ht + PAD_HT);
879*495ae853SAndroid Build Coastguard Worker 
880*495ae853SAndroid Build Coastguard Worker             ps_pic_buf->ps_layer_yuv_buf_props[j].as_component_bufs[0].i4_data_stride =
881*495ae853SAndroid Build Coastguard Worker                 ALIGN16(i4_layer_luma_wd) + PAD_WD;
882*495ae853SAndroid Build Coastguard Worker             ps_pic_buf->ps_layer_yuv_buf_props[j].as_component_bufs[0].pv_data =
883*495ae853SAndroid Build Coastguard Worker                 pu1_buf +
884*495ae853SAndroid Build Coastguard Worker                 ps_pic_buf->ps_layer_yuv_buf_props[j].as_component_bufs[0].i4_data_stride *
885*495ae853SAndroid Build Coastguard Worker                     PAD_TOP +
886*495ae853SAndroid Build Coastguard Worker                 PAD_LEFT;
887*495ae853SAndroid Build Coastguard Worker 
888*495ae853SAndroid Build Coastguard Worker             pu1_buf += i4_layer_luma_samples;
889*495ae853SAndroid Build Coastguard Worker 
890*495ae853SAndroid Build Coastguard Worker             ps_pic_buf->ps_layer_yuv_buf_props[j].as_component_bufs[1].i4_data_stride =
891*495ae853SAndroid Build Coastguard Worker                 ALIGN16(i4_layer_uv_wd) + PAD_WD;
892*495ae853SAndroid Build Coastguard Worker             ps_pic_buf->ps_layer_yuv_buf_props[j].as_component_bufs[1].pv_data =
893*495ae853SAndroid Build Coastguard Worker                 pu1_buf +
894*495ae853SAndroid Build Coastguard Worker                 ps_pic_buf->ps_layer_yuv_buf_props[j].as_component_bufs[1].i4_data_stride *
895*495ae853SAndroid Build Coastguard Worker                     (PAD_TOP / 2) +
896*495ae853SAndroid Build Coastguard Worker                 PAD_LEFT;
897*495ae853SAndroid Build Coastguard Worker 
898*495ae853SAndroid Build Coastguard Worker             pu1_buf += i4_layer_uv_samples;
899*495ae853SAndroid Build Coastguard Worker 
900*495ae853SAndroid Build Coastguard Worker             ps_pic_buf->ps_layer_yuv_buf_props[j].u4_width = i4_layer_luma_wd;
901*495ae853SAndroid Build Coastguard Worker             ps_pic_buf->ps_layer_yuv_buf_props[j].u4_height = i4_layer_luma_ht;
902*495ae853SAndroid Build Coastguard Worker             ps_pic_buf->ps_layer_yuv_buf_props[j].u1_bit_depth = 8;
903*495ae853SAndroid Build Coastguard Worker             ps_pic_buf->ps_layer_yuv_buf_props[j].e_color_format = IV_YUV_420SP_UV;
904*495ae853SAndroid Build Coastguard Worker 
905*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= i4_layer_luma_samples + i4_layer_uv_samples;
906*495ae853SAndroid Build Coastguard Worker             i4_total_fpel_mem_size += i4_layer_luma_samples + i4_layer_uv_samples;
907*495ae853SAndroid Build Coastguard Worker 
908*495ae853SAndroid Build Coastguard Worker             if(i8_alloc_mem_size < 0)
909*495ae853SAndroid Build Coastguard Worker             {
910*495ae853SAndroid Build Coastguard Worker                 ps_codec->i4_error_code = IH264E_INSUFFICIENT_MEM_PICBUF;
911*495ae853SAndroid Build Coastguard Worker                 return IH264E_INSUFFICIENT_MEM_PICBUF;
912*495ae853SAndroid Build Coastguard Worker             }
913*495ae853SAndroid Build Coastguard Worker         }
914*495ae853SAndroid Build Coastguard Worker 
915*495ae853SAndroid Build Coastguard Worker         buf_ret = ih264_buf_mgr_add((buf_mgr_t *) ps_codec->pv_ref_buf_mgr, ps_pic_buf, i);
916*495ae853SAndroid Build Coastguard Worker 
917*495ae853SAndroid Build Coastguard Worker         if(0 != buf_ret)
918*495ae853SAndroid Build Coastguard Worker         {
919*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_error_code = IH264E_BUF_MGR_ERROR;
920*495ae853SAndroid Build Coastguard Worker             return IH264E_BUF_MGR_ERROR;
921*495ae853SAndroid Build Coastguard Worker         }
922*495ae853SAndroid Build Coastguard Worker 
923*495ae853SAndroid Build Coastguard Worker         pu1_buf += (HPEL_PLANES_CNT - 1) * i4_total_fpel_mem_size;
924*495ae853SAndroid Build Coastguard Worker         ps_pic_buf++;
925*495ae853SAndroid Build Coastguard Worker     }
926*495ae853SAndroid Build Coastguard Worker 
927*495ae853SAndroid Build Coastguard Worker     return ret;
928*495ae853SAndroid Build Coastguard Worker }
929*495ae853SAndroid Build Coastguard Worker 
930*495ae853SAndroid Build Coastguard Worker /**
931*495ae853SAndroid Build Coastguard Worker *******************************************************************************
932*495ae853SAndroid Build Coastguard Worker *
933*495ae853SAndroid Build Coastguard Worker * @brief
934*495ae853SAndroid Build Coastguard Worker *  Returns size of buffers for storing SVC input data
935*495ae853SAndroid Build Coastguard Worker *
936*495ae853SAndroid Build Coastguard Worker * @param[in] u1_num_spatial_layers
937*495ae853SAndroid Build Coastguard Worker *  Num Spatial Layers
938*495ae853SAndroid Build Coastguard Worker *
939*495ae853SAndroid Build Coastguard Worker * @param[in] d_spatial_res_ratio
940*495ae853SAndroid Build Coastguard Worker *  Resolution Ratio b/w spatial layers
941*495ae853SAndroid Build Coastguard Worker *
942*495ae853SAndroid Build Coastguard Worker * @param[in] u4_wd
943*495ae853SAndroid Build Coastguard Worker *  Input Width
944*495ae853SAndroid Build Coastguard Worker *
945*495ae853SAndroid Build Coastguard Worker * @param[in] u4_ht
946*495ae853SAndroid Build Coastguard Worker *  Input Height
947*495ae853SAndroid Build Coastguard Worker *
948*495ae853SAndroid Build Coastguard Worker * @returns  Size of buffers
949*495ae853SAndroid Build Coastguard Worker *
950*495ae853SAndroid Build Coastguard Worker *******************************************************************************
951*495ae853SAndroid Build Coastguard Worker */
isvce_get_svc_inp_buf_size(UWORD8 u1_num_spatial_layers,DOUBLE d_spatial_res_ratio,UWORD32 u4_wd,UWORD32 u4_ht)952*495ae853SAndroid Build Coastguard Worker UWORD32 isvce_get_svc_inp_buf_size(UWORD8 u1_num_spatial_layers, DOUBLE d_spatial_res_ratio,
953*495ae853SAndroid Build Coastguard Worker                                    UWORD32 u4_wd, UWORD32 u4_ht)
954*495ae853SAndroid Build Coastguard Worker {
955*495ae853SAndroid Build Coastguard Worker     padding_dims_t s_pad_dims;
956*495ae853SAndroid Build Coastguard Worker 
957*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
958*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_filter_padding_size_x, u1_filter_padding_size_y;
959*495ae853SAndroid Build Coastguard Worker 
960*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_size = 0;
961*495ae853SAndroid Build Coastguard Worker 
962*495ae853SAndroid Build Coastguard Worker     isvce_get_downscaler_padding_dims(&s_pad_dims);
963*495ae853SAndroid Build Coastguard Worker 
964*495ae853SAndroid Build Coastguard Worker     u1_filter_padding_size_x = s_pad_dims.u1_left_pad_size + s_pad_dims.u1_right_pad_size;
965*495ae853SAndroid Build Coastguard Worker 
966*495ae853SAndroid Build Coastguard Worker     u1_filter_padding_size_y = s_pad_dims.u1_top_pad_size + s_pad_dims.u1_bottom_pad_size;
967*495ae853SAndroid Build Coastguard Worker 
968*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < u1_num_spatial_layers; i++)
969*495ae853SAndroid Build Coastguard Worker     {
970*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_wd = ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, i)) + 0.99;
971*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_ht = ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, i)) + 0.99;
972*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_samples =
973*495ae853SAndroid Build Coastguard Worker             (ALIGN16(i4_layer_luma_wd) + PAD_WD + u1_filter_padding_size_x) *
974*495ae853SAndroid Build Coastguard Worker             (i4_layer_luma_ht + PAD_HT + u1_filter_padding_size_y);
975*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_uv_wd = i4_layer_luma_wd;
976*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_uv_ht = i4_layer_luma_ht / 2.0 + 0.99;
977*495ae853SAndroid Build Coastguard Worker         /* u1_filter_padding_size_x * 2 because U and V
978*495ae853SAndroid Build Coastguard Worker         both need same amount of padding */
979*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_uv_samples =
980*495ae853SAndroid Build Coastguard Worker             (ALIGN16(i4_layer_uv_wd) + PAD_WD + u1_filter_padding_size_x * 2) *
981*495ae853SAndroid Build Coastguard Worker             (i4_layer_uv_ht + PAD_HT + u1_filter_padding_size_y);
982*495ae853SAndroid Build Coastguard Worker 
983*495ae853SAndroid Build Coastguard Worker         u4_size += (i4_layer_luma_samples + i4_layer_uv_samples) * sizeof(UWORD8);
984*495ae853SAndroid Build Coastguard Worker     }
985*495ae853SAndroid Build Coastguard Worker 
986*495ae853SAndroid Build Coastguard Worker     return SVC_MAX_NUM_INP_FRAMES * u4_size;
987*495ae853SAndroid Build Coastguard Worker }
988*495ae853SAndroid Build Coastguard Worker 
989*495ae853SAndroid Build Coastguard Worker /**
990*495ae853SAndroid Build Coastguard Worker *******************************************************************************
991*495ae853SAndroid Build Coastguard Worker *
992*495ae853SAndroid Build Coastguard Worker * @brief
993*495ae853SAndroid Build Coastguard Worker *  Function to initialize svc input buffers
994*495ae853SAndroid Build Coastguard Worker *
995*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
996*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
997*495ae853SAndroid Build Coastguard Worker *
998*495ae853SAndroid Build Coastguard Worker * @param[in] ps_mem_rec
999*495ae853SAndroid Build Coastguard Worker *  Pointer to memory allocated for input buffers
1000*495ae853SAndroid Build Coastguard Worker *
1001*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1002*495ae853SAndroid Build Coastguard Worker */
isvce_svc_inp_buf_init(isvce_codec_t * ps_codec,iv_mem_rec_t * ps_mem_rec)1003*495ae853SAndroid Build Coastguard Worker void isvce_svc_inp_buf_init(isvce_codec_t *ps_codec, iv_mem_rec_t *ps_mem_rec)
1004*495ae853SAndroid Build Coastguard Worker {
1005*495ae853SAndroid Build Coastguard Worker     padding_dims_t s_pad_dims;
1006*495ae853SAndroid Build Coastguard Worker 
1007*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
1008*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_filter_padding_size_x, u1_filter_padding_size_y;
1009*495ae853SAndroid Build Coastguard Worker 
1010*495ae853SAndroid Build Coastguard Worker     DOUBLE d_spatial_res_ratio = ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio;
1011*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_spatial_layers = ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers;
1012*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_wd = ps_codec->s_cfg.u4_wd;
1013*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ht = ps_codec->s_cfg.u4_ht;
1014*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf = ps_mem_rec->pv_base;
1015*495ae853SAndroid Build Coastguard Worker     WORD64 i8_alloc_mem_size =
1016*495ae853SAndroid Build Coastguard Worker         isvce_get_svc_inp_buf_size(u1_num_spatial_layers, d_spatial_res_ratio, u4_wd, u4_ht);
1017*495ae853SAndroid Build Coastguard Worker 
1018*495ae853SAndroid Build Coastguard Worker     isvce_get_downscaler_padding_dims(&s_pad_dims);
1019*495ae853SAndroid Build Coastguard Worker 
1020*495ae853SAndroid Build Coastguard Worker     u1_filter_padding_size_x = s_pad_dims.u1_left_pad_size + s_pad_dims.u1_right_pad_size;
1021*495ae853SAndroid Build Coastguard Worker 
1022*495ae853SAndroid Build Coastguard Worker     u1_filter_padding_size_y = s_pad_dims.u1_top_pad_size + s_pad_dims.u1_bottom_pad_size;
1023*495ae853SAndroid Build Coastguard Worker 
1024*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < SVC_MAX_NUM_INP_FRAMES; i++)
1025*495ae853SAndroid Build Coastguard Worker     {
1026*495ae853SAndroid Build Coastguard Worker         ps_codec->as_inp_list[i].s_svc_params = ps_codec->s_cfg.s_svc_params;
1027*495ae853SAndroid Build Coastguard Worker 
1028*495ae853SAndroid Build Coastguard Worker         for(j = u1_num_spatial_layers - 1; j >= 0; j--)
1029*495ae853SAndroid Build Coastguard Worker         {
1030*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_wd =
1031*495ae853SAndroid Build Coastguard Worker                 ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j)) + 0.99;
1032*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_ht =
1033*495ae853SAndroid Build Coastguard Worker                 ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j)) + 0.99;
1034*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_samples =
1035*495ae853SAndroid Build Coastguard Worker                 (ALIGN16(i4_layer_luma_wd) + PAD_WD + u1_filter_padding_size_x) *
1036*495ae853SAndroid Build Coastguard Worker                 (i4_layer_luma_ht + PAD_HT + u1_filter_padding_size_y);
1037*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_wd = i4_layer_luma_wd;
1038*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_ht = i4_layer_luma_ht / 2.0 + 0.99;
1039*495ae853SAndroid Build Coastguard Worker             /* u1_filter_padding_size_x * 2 because U and V
1040*495ae853SAndroid Build Coastguard Worker             both need same amount of padding */
1041*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_samples =
1042*495ae853SAndroid Build Coastguard Worker                 (ALIGN16(i4_layer_uv_wd) + PAD_WD + u1_filter_padding_size_x * 2) *
1043*495ae853SAndroid Build Coastguard Worker                 (i4_layer_uv_ht + PAD_HT + u1_filter_padding_size_y);
1044*495ae853SAndroid Build Coastguard Worker 
1045*495ae853SAndroid Build Coastguard Worker             ps_codec->as_inp_list[i].as_layer_yuv_buf_props[j].as_component_bufs[Y].i4_data_stride =
1046*495ae853SAndroid Build Coastguard Worker                 ALIGN16(i4_layer_luma_wd) + PAD_WD + u1_filter_padding_size_x;
1047*495ae853SAndroid Build Coastguard Worker             ps_codec->as_inp_list[i].as_layer_yuv_buf_props[j].as_component_bufs[Y].pv_data =
1048*495ae853SAndroid Build Coastguard Worker                 pu1_buf +
1049*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_inp_list[i]
1050*495ae853SAndroid Build Coastguard Worker                         .as_layer_yuv_buf_props[j]
1051*495ae853SAndroid Build Coastguard Worker                         .as_component_bufs[Y]
1052*495ae853SAndroid Build Coastguard Worker                         .i4_data_stride *
1053*495ae853SAndroid Build Coastguard Worker                     (PAD_TOP + s_pad_dims.u1_top_pad_size) +
1054*495ae853SAndroid Build Coastguard Worker                 (PAD_LEFT + s_pad_dims.u1_left_pad_size);
1055*495ae853SAndroid Build Coastguard Worker             pu1_buf += i4_layer_luma_samples * sizeof(UWORD8);
1056*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= i4_layer_luma_samples * sizeof(UWORD8);
1057*495ae853SAndroid Build Coastguard Worker 
1058*495ae853SAndroid Build Coastguard Worker             ps_codec->as_inp_list[i]
1059*495ae853SAndroid Build Coastguard Worker                 .as_layer_yuv_buf_props[j]
1060*495ae853SAndroid Build Coastguard Worker                 .as_component_bufs[UV]
1061*495ae853SAndroid Build Coastguard Worker                 .i4_data_stride = ALIGN16(i4_layer_uv_wd) + PAD_WD + u1_filter_padding_size_x * 2;
1062*495ae853SAndroid Build Coastguard Worker             ps_codec->as_inp_list[i].as_layer_yuv_buf_props[j].as_component_bufs[UV].pv_data =
1063*495ae853SAndroid Build Coastguard Worker                 pu1_buf +
1064*495ae853SAndroid Build Coastguard Worker                 ps_codec->as_inp_list[i]
1065*495ae853SAndroid Build Coastguard Worker                         .as_layer_yuv_buf_props[j]
1066*495ae853SAndroid Build Coastguard Worker                         .as_component_bufs[UV]
1067*495ae853SAndroid Build Coastguard Worker                         .i4_data_stride *
1068*495ae853SAndroid Build Coastguard Worker                     (PAD_TOP + s_pad_dims.u1_top_pad_size) +
1069*495ae853SAndroid Build Coastguard Worker                 (PAD_LEFT + s_pad_dims.u1_left_pad_size * 2);
1070*495ae853SAndroid Build Coastguard Worker             pu1_buf += i4_layer_uv_samples * sizeof(UWORD8);
1071*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= i4_layer_uv_samples * sizeof(UWORD8);
1072*495ae853SAndroid Build Coastguard Worker 
1073*495ae853SAndroid Build Coastguard Worker             /* Chroma is always stored interleaved */
1074*495ae853SAndroid Build Coastguard Worker             ps_codec->as_inp_list[i].as_layer_yuv_buf_props[j].as_component_bufs[V].pv_data = NULL;
1075*495ae853SAndroid Build Coastguard Worker 
1076*495ae853SAndroid Build Coastguard Worker             ps_codec->as_inp_list[i].as_layer_yuv_buf_props[j].u1_bit_depth = 8;
1077*495ae853SAndroid Build Coastguard Worker             ps_codec->as_inp_list[i].as_layer_yuv_buf_props[j].e_color_format = IV_YUV_420SP_UV;
1078*495ae853SAndroid Build Coastguard Worker             ps_codec->as_inp_list[i].as_layer_yuv_buf_props[j].u4_width = i4_layer_luma_wd;
1079*495ae853SAndroid Build Coastguard Worker             ps_codec->as_inp_list[i].as_layer_yuv_buf_props[j].u4_height = i4_layer_luma_ht;
1080*495ae853SAndroid Build Coastguard Worker 
1081*495ae853SAndroid Build Coastguard Worker             ASSERT(i8_alloc_mem_size >= 0);
1082*495ae853SAndroid Build Coastguard Worker         }
1083*495ae853SAndroid Build Coastguard Worker     }
1084*495ae853SAndroid Build Coastguard Worker }
1085*495ae853SAndroid Build Coastguard Worker 
isvce_init_svc_dimension(isvce_inp_buf_t * ps_inp)1086*495ae853SAndroid Build Coastguard Worker void isvce_init_svc_dimension(isvce_inp_buf_t *ps_inp)
1087*495ae853SAndroid Build Coastguard Worker {
1088*495ae853SAndroid Build Coastguard Worker     WORD32 i;
1089*495ae853SAndroid Build Coastguard Worker 
1090*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_spatial_layers = ps_inp->s_svc_params.u1_num_spatial_layers;
1091*495ae853SAndroid Build Coastguard Worker     DOUBLE d_spatial_res_ratio = ps_inp->s_svc_params.d_spatial_res_ratio;
1092*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_wd = ps_inp->s_inp_props.s_raw_buf.au4_wd[Y];
1093*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ht = ps_inp->s_inp_props.s_raw_buf.au4_ht[Y];
1094*495ae853SAndroid Build Coastguard Worker 
1095*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < u1_num_spatial_layers; i++)
1096*495ae853SAndroid Build Coastguard Worker     {
1097*495ae853SAndroid Build Coastguard Worker         ps_inp->as_layer_yuv_buf_props[i].u4_width =
1098*495ae853SAndroid Build Coastguard Worker             ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
1099*495ae853SAndroid Build Coastguard Worker         ps_inp->as_layer_yuv_buf_props[i].u4_height =
1100*495ae853SAndroid Build Coastguard Worker             ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
1101*495ae853SAndroid Build Coastguard Worker     }
1102*495ae853SAndroid Build Coastguard Worker }
1103*495ae853SAndroid Build Coastguard Worker 
1104*495ae853SAndroid Build Coastguard Worker /**
1105*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1106*495ae853SAndroid Build Coastguard Worker *
1107*495ae853SAndroid Build Coastguard Worker * @brief
1108*495ae853SAndroid Build Coastguard Worker *  Pads input buf as assumed by the downscaler filter
1109*495ae853SAndroid Build Coastguard Worker *
1110*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
1111*495ae853SAndroid Build Coastguard Worker *  Pointer to codec ctxt
1112*495ae853SAndroid Build Coastguard Worker *
1113*495ae853SAndroid Build Coastguard Worker * @param[in] ps_inp
1114*495ae853SAndroid Build Coastguard Worker *  Pointer to svc input buffer
1115*495ae853SAndroid Build Coastguard Worker *
1116*495ae853SAndroid Build Coastguard Worker * @param[in] u1_svc_layer_index
1117*495ae853SAndroid Build Coastguard Worker *  SVC layer index of the buffer
1118*495ae853SAndroid Build Coastguard Worker *
1119*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1120*495ae853SAndroid Build Coastguard Worker */
1121*495ae853SAndroid Build Coastguard Worker 
isvce_pad_buf_for_filtering(isvce_codec_t * ps_codec,isvce_inp_buf_t * ps_inp,UWORD8 u1_svc_layer_index)1122*495ae853SAndroid Build Coastguard Worker static void isvce_pad_buf_for_filtering(isvce_codec_t *ps_codec, isvce_inp_buf_t *ps_inp,
1123*495ae853SAndroid Build Coastguard Worker                                         UWORD8 u1_svc_layer_index)
1124*495ae853SAndroid Build Coastguard Worker {
1125*495ae853SAndroid Build Coastguard Worker     padding_dims_t s_pad_dims;
1126*495ae853SAndroid Build Coastguard Worker 
1127*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf;
1128*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_buf_width, u4_buf_height;
1129*495ae853SAndroid Build Coastguard Worker 
1130*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_pad_left_size;
1131*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_pad_right_size;
1132*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_pad_top_size;
1133*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_pad_bottom_size;
1134*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_filter_padding_size_x;
1135*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_filter_padding_size_chroma_x;
1136*495ae853SAndroid Build Coastguard Worker 
1137*495ae853SAndroid Build Coastguard Worker     ASSERT(ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].e_color_format == IV_YUV_420SP_UV);
1138*495ae853SAndroid Build Coastguard Worker 
1139*495ae853SAndroid Build Coastguard Worker     isvce_get_downscaler_padding_dims(&s_pad_dims);
1140*495ae853SAndroid Build Coastguard Worker 
1141*495ae853SAndroid Build Coastguard Worker     u1_pad_left_size = s_pad_dims.u1_left_pad_size;
1142*495ae853SAndroid Build Coastguard Worker     u1_pad_right_size = s_pad_dims.u1_right_pad_size;
1143*495ae853SAndroid Build Coastguard Worker     u1_pad_top_size = s_pad_dims.u1_top_pad_size;
1144*495ae853SAndroid Build Coastguard Worker     u1_pad_bottom_size = s_pad_dims.u1_bottom_pad_size;
1145*495ae853SAndroid Build Coastguard Worker     u1_filter_padding_size_x = u1_pad_left_size + u1_pad_right_size;
1146*495ae853SAndroid Build Coastguard Worker     u1_filter_padding_size_chroma_x = u1_filter_padding_size_x * 2;
1147*495ae853SAndroid Build Coastguard Worker 
1148*495ae853SAndroid Build Coastguard Worker     u4_buf_width = ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].u4_width;
1149*495ae853SAndroid Build Coastguard Worker 
1150*495ae853SAndroid Build Coastguard Worker     u4_buf_height = ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].u4_height;
1151*495ae853SAndroid Build Coastguard Worker 
1152*495ae853SAndroid Build Coastguard Worker     pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index]
1153*495ae853SAndroid Build Coastguard Worker                               .as_component_bufs[0]
1154*495ae853SAndroid Build Coastguard Worker                               .pv_data);
1155*495ae853SAndroid Build Coastguard Worker 
1156*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_left_luma(
1157*495ae853SAndroid Build Coastguard Worker         pu1_buf,
1158*495ae853SAndroid Build Coastguard Worker         ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].as_component_bufs[0].i4_data_stride,
1159*495ae853SAndroid Build Coastguard Worker         u4_buf_height, u1_pad_left_size);
1160*495ae853SAndroid Build Coastguard Worker 
1161*495ae853SAndroid Build Coastguard Worker     pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index]
1162*495ae853SAndroid Build Coastguard Worker                               .as_component_bufs[0]
1163*495ae853SAndroid Build Coastguard Worker                               .pv_data);
1164*495ae853SAndroid Build Coastguard Worker 
1165*495ae853SAndroid Build Coastguard Worker     pu1_buf += u4_buf_width;
1166*495ae853SAndroid Build Coastguard Worker 
1167*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_right_luma(
1168*495ae853SAndroid Build Coastguard Worker         pu1_buf,
1169*495ae853SAndroid Build Coastguard Worker         ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].as_component_bufs[0].i4_data_stride,
1170*495ae853SAndroid Build Coastguard Worker         u4_buf_height, u1_pad_right_size);
1171*495ae853SAndroid Build Coastguard Worker 
1172*495ae853SAndroid Build Coastguard Worker     pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index]
1173*495ae853SAndroid Build Coastguard Worker                               .as_component_bufs[1]
1174*495ae853SAndroid Build Coastguard Worker                               .pv_data);
1175*495ae853SAndroid Build Coastguard Worker 
1176*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_left_chroma(
1177*495ae853SAndroid Build Coastguard Worker         pu1_buf,
1178*495ae853SAndroid Build Coastguard Worker         ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].as_component_bufs[1].i4_data_stride,
1179*495ae853SAndroid Build Coastguard Worker         u4_buf_height / 2, u1_pad_left_size * 2);
1180*495ae853SAndroid Build Coastguard Worker 
1181*495ae853SAndroid Build Coastguard Worker     pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index]
1182*495ae853SAndroid Build Coastguard Worker                               .as_component_bufs[1]
1183*495ae853SAndroid Build Coastguard Worker                               .pv_data);
1184*495ae853SAndroid Build Coastguard Worker 
1185*495ae853SAndroid Build Coastguard Worker     pu1_buf += u4_buf_width;
1186*495ae853SAndroid Build Coastguard Worker 
1187*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_right_chroma(
1188*495ae853SAndroid Build Coastguard Worker         pu1_buf,
1189*495ae853SAndroid Build Coastguard Worker         ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].as_component_bufs[1].i4_data_stride,
1190*495ae853SAndroid Build Coastguard Worker         u4_buf_height / 2, u1_pad_right_size * 2);
1191*495ae853SAndroid Build Coastguard Worker 
1192*495ae853SAndroid Build Coastguard Worker     pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index]
1193*495ae853SAndroid Build Coastguard Worker                               .as_component_bufs[0]
1194*495ae853SAndroid Build Coastguard Worker                               .pv_data) -
1195*495ae853SAndroid Build Coastguard Worker               u1_pad_left_size;
1196*495ae853SAndroid Build Coastguard Worker 
1197*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_top(
1198*495ae853SAndroid Build Coastguard Worker         pu1_buf,
1199*495ae853SAndroid Build Coastguard Worker         ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].as_component_bufs[0].i4_data_stride,
1200*495ae853SAndroid Build Coastguard Worker         (u4_buf_width + u1_filter_padding_size_x), u1_pad_top_size);
1201*495ae853SAndroid Build Coastguard Worker 
1202*495ae853SAndroid Build Coastguard Worker     pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index]
1203*495ae853SAndroid Build Coastguard Worker                               .as_component_bufs[0]
1204*495ae853SAndroid Build Coastguard Worker                               .pv_data) -
1205*495ae853SAndroid Build Coastguard Worker               u1_pad_left_size;
1206*495ae853SAndroid Build Coastguard Worker 
1207*495ae853SAndroid Build Coastguard Worker     pu1_buf +=
1208*495ae853SAndroid Build Coastguard Worker         (u4_buf_height *
1209*495ae853SAndroid Build Coastguard Worker          ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].as_component_bufs[0].i4_data_stride);
1210*495ae853SAndroid Build Coastguard Worker 
1211*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_bottom(
1212*495ae853SAndroid Build Coastguard Worker         pu1_buf,
1213*495ae853SAndroid Build Coastguard Worker         ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].as_component_bufs[0].i4_data_stride,
1214*495ae853SAndroid Build Coastguard Worker         (u4_buf_width + u1_filter_padding_size_x), u1_pad_bottom_size);
1215*495ae853SAndroid Build Coastguard Worker 
1216*495ae853SAndroid Build Coastguard Worker     pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index]
1217*495ae853SAndroid Build Coastguard Worker                               .as_component_bufs[1]
1218*495ae853SAndroid Build Coastguard Worker                               .pv_data) -
1219*495ae853SAndroid Build Coastguard Worker               u1_pad_left_size * 2;
1220*495ae853SAndroid Build Coastguard Worker 
1221*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_top(
1222*495ae853SAndroid Build Coastguard Worker         pu1_buf,
1223*495ae853SAndroid Build Coastguard Worker         ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].as_component_bufs[1].i4_data_stride,
1224*495ae853SAndroid Build Coastguard Worker         (u4_buf_width + u1_filter_padding_size_chroma_x), u1_pad_top_size);
1225*495ae853SAndroid Build Coastguard Worker 
1226*495ae853SAndroid Build Coastguard Worker     pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index]
1227*495ae853SAndroid Build Coastguard Worker                               .as_component_bufs[1]
1228*495ae853SAndroid Build Coastguard Worker                               .pv_data) -
1229*495ae853SAndroid Build Coastguard Worker               u1_pad_left_size * 2;
1230*495ae853SAndroid Build Coastguard Worker 
1231*495ae853SAndroid Build Coastguard Worker     pu1_buf +=
1232*495ae853SAndroid Build Coastguard Worker         ((u4_buf_height / 2) *
1233*495ae853SAndroid Build Coastguard Worker          ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].as_component_bufs[1].i4_data_stride);
1234*495ae853SAndroid Build Coastguard Worker 
1235*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_bottom(
1236*495ae853SAndroid Build Coastguard Worker         pu1_buf,
1237*495ae853SAndroid Build Coastguard Worker         ps_inp->as_layer_yuv_buf_props[u1_svc_layer_index].as_component_bufs[1].i4_data_stride,
1238*495ae853SAndroid Build Coastguard Worker         (u4_buf_width + u1_filter_padding_size_chroma_x), u1_pad_bottom_size);
1239*495ae853SAndroid Build Coastguard Worker }
1240*495ae853SAndroid Build Coastguard Worker 
1241*495ae853SAndroid Build Coastguard Worker /**
1242*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1243*495ae853SAndroid Build Coastguard Worker *
1244*495ae853SAndroid Build Coastguard Worker * @brief
1245*495ae853SAndroid Build Coastguard Worker *  Pads raw input to satisfy SVC compliant input dimensions
1246*495ae853SAndroid Build Coastguard Worker *
1247*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
1248*495ae853SAndroid Build Coastguard Worker *  Pointer to codec ctxt
1249*495ae853SAndroid Build Coastguard Worker *
1250*495ae853SAndroid Build Coastguard Worker * @param[in] ps_inp
1251*495ae853SAndroid Build Coastguard Worker *  Pointer to svc input buffer
1252*495ae853SAndroid Build Coastguard Worker *
1253*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1254*495ae853SAndroid Build Coastguard Worker */
1255*495ae853SAndroid Build Coastguard Worker 
isvce_pad_input_to_svc_compliant_dims(isvce_codec_t * ps_codec,isvce_inp_buf_t * ps_inp)1256*495ae853SAndroid Build Coastguard Worker static void isvce_pad_input_to_svc_compliant_dims(isvce_codec_t *ps_codec, isvce_inp_buf_t *ps_inp)
1257*495ae853SAndroid Build Coastguard Worker {
1258*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf;
1259*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_raw_input_wd, u4_raw_input_ht, u4_padded_width, u4_padded_height, u4_width_delta,
1260*495ae853SAndroid Build Coastguard Worker         u4_height_delta;
1261*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_layers = ps_inp->s_svc_params.u1_num_spatial_layers;
1262*495ae853SAndroid Build Coastguard Worker 
1263*495ae853SAndroid Build Coastguard Worker     ASSERT(ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].e_color_format == IV_YUV_420SP_UV);
1264*495ae853SAndroid Build Coastguard Worker 
1265*495ae853SAndroid Build Coastguard Worker     u4_padded_width = ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].u4_width;
1266*495ae853SAndroid Build Coastguard Worker     u4_padded_height = ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].u4_height;
1267*495ae853SAndroid Build Coastguard Worker     u4_raw_input_wd = ps_inp->s_inp_props.s_raw_buf.au4_wd[0];
1268*495ae853SAndroid Build Coastguard Worker     u4_raw_input_ht = ps_inp->s_inp_props.s_raw_buf.au4_ht[0];
1269*495ae853SAndroid Build Coastguard Worker     u4_width_delta = u4_padded_width - u4_raw_input_wd;
1270*495ae853SAndroid Build Coastguard Worker     u4_height_delta = u4_padded_height - u4_raw_input_ht;
1271*495ae853SAndroid Build Coastguard Worker 
1272*495ae853SAndroid Build Coastguard Worker     ASSERT(!(u4_width_delta & 1));
1273*495ae853SAndroid Build Coastguard Worker     ASSERT(!(u4_height_delta & 1));
1274*495ae853SAndroid Build Coastguard Worker 
1275*495ae853SAndroid Build Coastguard Worker     if(u4_width_delta)
1276*495ae853SAndroid Build Coastguard Worker     {
1277*495ae853SAndroid Build Coastguard Worker         pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1278*495ae853SAndroid Build Coastguard Worker                                   .as_component_bufs[0]
1279*495ae853SAndroid Build Coastguard Worker                                   .pv_data);
1280*495ae853SAndroid Build Coastguard Worker 
1281*495ae853SAndroid Build Coastguard Worker         pu1_buf += ((u4_width_delta / 2) + (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1282*495ae853SAndroid Build Coastguard Worker                                                 .as_component_bufs[0]
1283*495ae853SAndroid Build Coastguard Worker                                                 .i4_data_stride) *
1284*495ae853SAndroid Build Coastguard Worker                                                (u4_height_delta / 2));
1285*495ae853SAndroid Build Coastguard Worker 
1286*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_left_luma(
1287*495ae853SAndroid Build Coastguard Worker             pu1_buf,
1288*495ae853SAndroid Build Coastguard Worker             ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].as_component_bufs[0].i4_data_stride,
1289*495ae853SAndroid Build Coastguard Worker             u4_padded_height, u4_width_delta / 2);
1290*495ae853SAndroid Build Coastguard Worker 
1291*495ae853SAndroid Build Coastguard Worker         pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1292*495ae853SAndroid Build Coastguard Worker                                   .as_component_bufs[0]
1293*495ae853SAndroid Build Coastguard Worker                                   .pv_data);
1294*495ae853SAndroid Build Coastguard Worker 
1295*495ae853SAndroid Build Coastguard Worker         pu1_buf += ((u4_width_delta / 2) + (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1296*495ae853SAndroid Build Coastguard Worker                                                 .as_component_bufs[0]
1297*495ae853SAndroid Build Coastguard Worker                                                 .i4_data_stride) *
1298*495ae853SAndroid Build Coastguard Worker                                                (u4_height_delta / 2));
1299*495ae853SAndroid Build Coastguard Worker 
1300*495ae853SAndroid Build Coastguard Worker         pu1_buf += u4_raw_input_wd;
1301*495ae853SAndroid Build Coastguard Worker 
1302*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_right_luma(
1303*495ae853SAndroid Build Coastguard Worker             pu1_buf,
1304*495ae853SAndroid Build Coastguard Worker             ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].as_component_bufs[0].i4_data_stride,
1305*495ae853SAndroid Build Coastguard Worker             u4_padded_height, u4_width_delta / 2);
1306*495ae853SAndroid Build Coastguard Worker 
1307*495ae853SAndroid Build Coastguard Worker         pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1308*495ae853SAndroid Build Coastguard Worker                                   .as_component_bufs[1]
1309*495ae853SAndroid Build Coastguard Worker                                   .pv_data);
1310*495ae853SAndroid Build Coastguard Worker 
1311*495ae853SAndroid Build Coastguard Worker         pu1_buf += ((u4_width_delta / 2) + (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1312*495ae853SAndroid Build Coastguard Worker                                                 .as_component_bufs[1]
1313*495ae853SAndroid Build Coastguard Worker                                                 .i4_data_stride) *
1314*495ae853SAndroid Build Coastguard Worker                                                (u4_height_delta / 4));
1315*495ae853SAndroid Build Coastguard Worker 
1316*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_left_chroma(
1317*495ae853SAndroid Build Coastguard Worker             pu1_buf,
1318*495ae853SAndroid Build Coastguard Worker             ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].as_component_bufs[1].i4_data_stride,
1319*495ae853SAndroid Build Coastguard Worker             u4_padded_height / 2, u4_width_delta / 2);
1320*495ae853SAndroid Build Coastguard Worker 
1321*495ae853SAndroid Build Coastguard Worker         pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1322*495ae853SAndroid Build Coastguard Worker                                   .as_component_bufs[1]
1323*495ae853SAndroid Build Coastguard Worker                                   .pv_data);
1324*495ae853SAndroid Build Coastguard Worker 
1325*495ae853SAndroid Build Coastguard Worker         pu1_buf += ((u4_width_delta / 2) + (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1326*495ae853SAndroid Build Coastguard Worker                                                 .as_component_bufs[1]
1327*495ae853SAndroid Build Coastguard Worker                                                 .i4_data_stride) *
1328*495ae853SAndroid Build Coastguard Worker                                                (u4_height_delta / 4));
1329*495ae853SAndroid Build Coastguard Worker 
1330*495ae853SAndroid Build Coastguard Worker         pu1_buf += u4_raw_input_wd;
1331*495ae853SAndroid Build Coastguard Worker 
1332*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_right_chroma(
1333*495ae853SAndroid Build Coastguard Worker             pu1_buf,
1334*495ae853SAndroid Build Coastguard Worker             ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].as_component_bufs[1].i4_data_stride,
1335*495ae853SAndroid Build Coastguard Worker             u4_padded_height / 2, u4_width_delta / 2);
1336*495ae853SAndroid Build Coastguard Worker     }
1337*495ae853SAndroid Build Coastguard Worker 
1338*495ae853SAndroid Build Coastguard Worker     if(u4_height_delta)
1339*495ae853SAndroid Build Coastguard Worker     {
1340*495ae853SAndroid Build Coastguard Worker         pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1341*495ae853SAndroid Build Coastguard Worker                                   .as_component_bufs[0]
1342*495ae853SAndroid Build Coastguard Worker                                   .pv_data);
1343*495ae853SAndroid Build Coastguard Worker 
1344*495ae853SAndroid Build Coastguard Worker         pu1_buf += ((ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1345*495ae853SAndroid Build Coastguard Worker                          .as_component_bufs[0]
1346*495ae853SAndroid Build Coastguard Worker                          .i4_data_stride) *
1347*495ae853SAndroid Build Coastguard Worker                     (u4_height_delta / 2));
1348*495ae853SAndroid Build Coastguard Worker 
1349*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_top(
1350*495ae853SAndroid Build Coastguard Worker             pu1_buf,
1351*495ae853SAndroid Build Coastguard Worker             ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].as_component_bufs[0].i4_data_stride,
1352*495ae853SAndroid Build Coastguard Worker             u4_padded_width, u4_height_delta / 2);
1353*495ae853SAndroid Build Coastguard Worker 
1354*495ae853SAndroid Build Coastguard Worker         pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1355*495ae853SAndroid Build Coastguard Worker                                   .as_component_bufs[0]
1356*495ae853SAndroid Build Coastguard Worker                                   .pv_data);
1357*495ae853SAndroid Build Coastguard Worker 
1358*495ae853SAndroid Build Coastguard Worker         pu1_buf += ((ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1359*495ae853SAndroid Build Coastguard Worker                          .as_component_bufs[0]
1360*495ae853SAndroid Build Coastguard Worker                          .i4_data_stride) *
1361*495ae853SAndroid Build Coastguard Worker                     (u4_height_delta / 2));
1362*495ae853SAndroid Build Coastguard Worker 
1363*495ae853SAndroid Build Coastguard Worker         pu1_buf +=
1364*495ae853SAndroid Build Coastguard Worker             (u4_raw_input_ht *
1365*495ae853SAndroid Build Coastguard Worker              ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].as_component_bufs[0].i4_data_stride);
1366*495ae853SAndroid Build Coastguard Worker 
1367*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_bottom(
1368*495ae853SAndroid Build Coastguard Worker             pu1_buf,
1369*495ae853SAndroid Build Coastguard Worker             ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].as_component_bufs[0].i4_data_stride,
1370*495ae853SAndroid Build Coastguard Worker             u4_padded_width, u4_height_delta / 2);
1371*495ae853SAndroid Build Coastguard Worker 
1372*495ae853SAndroid Build Coastguard Worker         pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1373*495ae853SAndroid Build Coastguard Worker                                   .as_component_bufs[1]
1374*495ae853SAndroid Build Coastguard Worker                                   .pv_data);
1375*495ae853SAndroid Build Coastguard Worker 
1376*495ae853SAndroid Build Coastguard Worker         pu1_buf += ((ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1377*495ae853SAndroid Build Coastguard Worker                          .as_component_bufs[1]
1378*495ae853SAndroid Build Coastguard Worker                          .i4_data_stride) *
1379*495ae853SAndroid Build Coastguard Worker                     (u4_height_delta / 4));
1380*495ae853SAndroid Build Coastguard Worker 
1381*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_top(
1382*495ae853SAndroid Build Coastguard Worker             pu1_buf,
1383*495ae853SAndroid Build Coastguard Worker             ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].as_component_bufs[1].i4_data_stride,
1384*495ae853SAndroid Build Coastguard Worker             u4_padded_width, u4_height_delta / 4);
1385*495ae853SAndroid Build Coastguard Worker 
1386*495ae853SAndroid Build Coastguard Worker         pu1_buf = (UWORD8 *) (ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1387*495ae853SAndroid Build Coastguard Worker                                   .as_component_bufs[1]
1388*495ae853SAndroid Build Coastguard Worker                                   .pv_data);
1389*495ae853SAndroid Build Coastguard Worker 
1390*495ae853SAndroid Build Coastguard Worker         pu1_buf += ((ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1]
1391*495ae853SAndroid Build Coastguard Worker                          .as_component_bufs[1]
1392*495ae853SAndroid Build Coastguard Worker                          .i4_data_stride) *
1393*495ae853SAndroid Build Coastguard Worker                     (u4_height_delta / 4));
1394*495ae853SAndroid Build Coastguard Worker 
1395*495ae853SAndroid Build Coastguard Worker         pu1_buf +=
1396*495ae853SAndroid Build Coastguard Worker             ((u4_raw_input_ht / 2) *
1397*495ae853SAndroid Build Coastguard Worker              ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].as_component_bufs[1].i4_data_stride);
1398*495ae853SAndroid Build Coastguard Worker 
1399*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_pad_bottom(
1400*495ae853SAndroid Build Coastguard Worker             pu1_buf,
1401*495ae853SAndroid Build Coastguard Worker             ps_inp->as_layer_yuv_buf_props[u1_num_layers - 1].as_component_bufs[1].i4_data_stride,
1402*495ae853SAndroid Build Coastguard Worker             u4_padded_width, u4_height_delta / 4);
1403*495ae853SAndroid Build Coastguard Worker     }
1404*495ae853SAndroid Build Coastguard Worker }
1405*495ae853SAndroid Build Coastguard Worker 
1406*495ae853SAndroid Build Coastguard Worker /**
1407*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1408*495ae853SAndroid Build Coastguard Worker *
1409*495ae853SAndroid Build Coastguard Worker * @brief
1410*495ae853SAndroid Build Coastguard Worker *  Format conversion and downsampling for deriving spatial layer inputs
1411*495ae853SAndroid Build Coastguard Worker *
1412*495ae853SAndroid Build Coastguard Worker * @param[in] ps_inp
1413*495ae853SAndroid Build Coastguard Worker *  Pointer to input buffer
1414*495ae853SAndroid Build Coastguard Worker *
1415*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1416*495ae853SAndroid Build Coastguard Worker */
isvce_svc_inp_buf_populate(isvce_codec_t * ps_codec,isvce_inp_buf_t * ps_inp)1417*495ae853SAndroid Build Coastguard Worker void isvce_svc_inp_buf_populate(isvce_codec_t *ps_codec, isvce_inp_buf_t *ps_inp)
1418*495ae853SAndroid Build Coastguard Worker {
1419*495ae853SAndroid Build Coastguard Worker     yuv_buf_props_t s_src_buf_props, s_dst_buf_props;
1420*495ae853SAndroid Build Coastguard Worker 
1421*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
1422*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_blk_x, u4_blk_y;
1423*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_planar_y, *pu1_planar_u, *pu1_planar_v, *pu1_semi_planar_y, *pu1_semi_planar_uv;
1424*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_luma, *pu1_src_chroma, *pu1_dst_luma, *pu1_dst_chroma;
1425*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_blocks_x, u4_num_blocks_y;
1426*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_scaled_block_wd, u4_scaled_block_ht;
1427*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_blk_wd_luma, u4_blk_ht_luma;
1428*495ae853SAndroid Build Coastguard Worker 
1429*495ae853SAndroid Build Coastguard Worker     downscaler_ctxt_t *ps_scaler = &ps_codec->s_scaler;
1430*495ae853SAndroid Build Coastguard Worker     isa_dependent_fxns_t *ps_isa_dependent_fxns = &ps_codec->s_isa_dependent_fxns;
1431*495ae853SAndroid Build Coastguard Worker     mem_fxns_t *ps_mem_fxns = &ps_isa_dependent_fxns->s_mem_fxns;
1432*495ae853SAndroid Build Coastguard Worker 
1433*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_num_yuv_components_420sp = NUM_SP_COMPONENTS;
1434*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_spatial_layers = ps_inp->s_svc_params.u1_num_spatial_layers;
1435*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_padded_width = ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1].u4_width;
1436*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_padded_height = ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1].u4_height;
1437*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_raw_input_wd = ps_inp->s_inp_props.s_raw_buf.au4_wd[0];
1438*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_raw_input_ht = ps_inp->s_inp_props.s_raw_buf.au4_ht[0];
1439*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_width_delta = u4_padded_width - u4_raw_input_wd;
1440*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_height_delta = u4_padded_height - u4_raw_input_ht;
1441*495ae853SAndroid Build Coastguard Worker 
1442*495ae853SAndroid Build Coastguard Worker     ASSERT(!(u4_width_delta & 1));
1443*495ae853SAndroid Build Coastguard Worker     ASSERT(!(u4_height_delta & 1));
1444*495ae853SAndroid Build Coastguard Worker 
1445*495ae853SAndroid Build Coastguard Worker     ASSERT((ps_inp->s_inp_props.s_raw_buf.e_color_fmt == IV_YUV_420P) ||
1446*495ae853SAndroid Build Coastguard Worker            (ps_inp->s_inp_props.s_raw_buf.e_color_fmt == IV_YUV_420SP_UV));
1447*495ae853SAndroid Build Coastguard Worker 
1448*495ae853SAndroid Build Coastguard Worker     /* Check is input is valid */
1449*495ae853SAndroid Build Coastguard Worker     if(!(ps_inp->s_inp_props.s_raw_buf.apv_bufs[0]))
1450*495ae853SAndroid Build Coastguard Worker     {
1451*495ae853SAndroid Build Coastguard Worker         ASSERT(0);
1452*495ae853SAndroid Build Coastguard Worker 
1453*495ae853SAndroid Build Coastguard Worker         return;
1454*495ae853SAndroid Build Coastguard Worker     }
1455*495ae853SAndroid Build Coastguard Worker 
1456*495ae853SAndroid Build Coastguard Worker     /* Convert the input into semi-planar in case of other formats */
1457*495ae853SAndroid Build Coastguard Worker     if(ps_inp->s_inp_props.s_raw_buf.e_color_fmt == IV_YUV_420P)
1458*495ae853SAndroid Build Coastguard Worker     {
1459*495ae853SAndroid Build Coastguard Worker         pu1_planar_y = (UWORD8 *) ps_inp->s_inp_props.s_raw_buf.apv_bufs[0];
1460*495ae853SAndroid Build Coastguard Worker         pu1_planar_u = (UWORD8 *) ps_inp->s_inp_props.s_raw_buf.apv_bufs[1];
1461*495ae853SAndroid Build Coastguard Worker         pu1_planar_v = (UWORD8 *) ps_inp->s_inp_props.s_raw_buf.apv_bufs[2];
1462*495ae853SAndroid Build Coastguard Worker 
1463*495ae853SAndroid Build Coastguard Worker         pu1_semi_planar_y = (UWORD8 *) ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1]
1464*495ae853SAndroid Build Coastguard Worker                                 .as_component_bufs[0]
1465*495ae853SAndroid Build Coastguard Worker                                 .pv_data;
1466*495ae853SAndroid Build Coastguard Worker 
1467*495ae853SAndroid Build Coastguard Worker         pu1_semi_planar_uv = (UWORD8 *) ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1]
1468*495ae853SAndroid Build Coastguard Worker                                  .as_component_bufs[1]
1469*495ae853SAndroid Build Coastguard Worker                                  .pv_data;
1470*495ae853SAndroid Build Coastguard Worker 
1471*495ae853SAndroid Build Coastguard Worker         pu1_semi_planar_y +=
1472*495ae853SAndroid Build Coastguard Worker             ((u4_width_delta / 2) + (ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1]
1473*495ae853SAndroid Build Coastguard Worker                                          .as_component_bufs[0]
1474*495ae853SAndroid Build Coastguard Worker                                          .i4_data_stride) *
1475*495ae853SAndroid Build Coastguard Worker                                         (u4_height_delta / 2));
1476*495ae853SAndroid Build Coastguard Worker 
1477*495ae853SAndroid Build Coastguard Worker         pu1_semi_planar_uv +=
1478*495ae853SAndroid Build Coastguard Worker             ((u4_width_delta / 2) + (ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1]
1479*495ae853SAndroid Build Coastguard Worker                                          .as_component_bufs[1]
1480*495ae853SAndroid Build Coastguard Worker                                          .i4_data_stride) *
1481*495ae853SAndroid Build Coastguard Worker                                         (u4_height_delta / 4));
1482*495ae853SAndroid Build Coastguard Worker 
1483*495ae853SAndroid Build Coastguard Worker         ps_codec->pf_ih264e_conv_420p_to_420sp(
1484*495ae853SAndroid Build Coastguard Worker             pu1_planar_y, pu1_planar_u, pu1_planar_v, pu1_semi_planar_y, pu1_semi_planar_uv,
1485*495ae853SAndroid Build Coastguard Worker             ps_inp->s_inp_props.s_raw_buf.au4_ht[0], ps_inp->s_inp_props.s_raw_buf.au4_wd[0],
1486*495ae853SAndroid Build Coastguard Worker             ps_inp->s_inp_props.s_raw_buf.au4_strd[0], ps_inp->s_inp_props.s_raw_buf.au4_strd[1],
1487*495ae853SAndroid Build Coastguard Worker             ps_inp->s_inp_props.s_raw_buf.au4_strd[2],
1488*495ae853SAndroid Build Coastguard Worker             ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1]
1489*495ae853SAndroid Build Coastguard Worker                 .as_component_bufs[0]
1490*495ae853SAndroid Build Coastguard Worker                 .i4_data_stride,
1491*495ae853SAndroid Build Coastguard Worker             ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1]
1492*495ae853SAndroid Build Coastguard Worker                 .as_component_bufs[1]
1493*495ae853SAndroid Build Coastguard Worker                 .i4_data_stride,
1494*495ae853SAndroid Build Coastguard Worker             0);
1495*495ae853SAndroid Build Coastguard Worker     }
1496*495ae853SAndroid Build Coastguard Worker     else
1497*495ae853SAndroid Build Coastguard Worker     {
1498*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_wd, u4_ht;
1499*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_comp;
1500*495ae853SAndroid Build Coastguard Worker         UWORD32 au4_arr_dims[4];
1501*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_src, *pu1_dst;
1502*495ae853SAndroid Build Coastguard Worker 
1503*495ae853SAndroid Build Coastguard Worker         au4_arr_dims[0] = ps_inp->s_inp_props.s_raw_buf.au4_wd[0];
1504*495ae853SAndroid Build Coastguard Worker         au4_arr_dims[1] = ps_inp->s_inp_props.s_raw_buf.au4_ht[0];
1505*495ae853SAndroid Build Coastguard Worker         au4_arr_dims[2] = ps_inp->s_inp_props.s_raw_buf.au4_wd[1];
1506*495ae853SAndroid Build Coastguard Worker         au4_arr_dims[3] = ps_inp->s_inp_props.s_raw_buf.au4_ht[1];
1507*495ae853SAndroid Build Coastguard Worker 
1508*495ae853SAndroid Build Coastguard Worker         for(u1_comp = 0; u1_comp < u1_num_yuv_components_420sp; u1_comp++)
1509*495ae853SAndroid Build Coastguard Worker         {
1510*495ae853SAndroid Build Coastguard Worker             u4_wd = au4_arr_dims[u1_comp * 2];
1511*495ae853SAndroid Build Coastguard Worker             u4_ht = au4_arr_dims[(u1_comp * 2) + 1];
1512*495ae853SAndroid Build Coastguard Worker 
1513*495ae853SAndroid Build Coastguard Worker             pu1_dst = (UWORD8 *) ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1]
1514*495ae853SAndroid Build Coastguard Worker                           .as_component_bufs[u1_comp]
1515*495ae853SAndroid Build Coastguard Worker                           .pv_data;
1516*495ae853SAndroid Build Coastguard Worker 
1517*495ae853SAndroid Build Coastguard Worker             pu1_dst +=
1518*495ae853SAndroid Build Coastguard Worker                 ((u4_width_delta / 2) + (ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1]
1519*495ae853SAndroid Build Coastguard Worker                                              .as_component_bufs[u1_comp]
1520*495ae853SAndroid Build Coastguard Worker                                              .i4_data_stride) *
1521*495ae853SAndroid Build Coastguard Worker                                             ((u4_height_delta / 2) / (u1_comp + 1)));
1522*495ae853SAndroid Build Coastguard Worker 
1523*495ae853SAndroid Build Coastguard Worker             pu1_src = ps_inp->s_inp_props.s_raw_buf.apv_bufs[u1_comp];
1524*495ae853SAndroid Build Coastguard Worker 
1525*495ae853SAndroid Build Coastguard Worker             ps_mem_fxns->pf_copy_2d(pu1_dst,
1526*495ae853SAndroid Build Coastguard Worker                                     ps_inp->as_layer_yuv_buf_props[u1_num_spatial_layers - 1]
1527*495ae853SAndroid Build Coastguard Worker                                         .as_component_bufs[u1_comp]
1528*495ae853SAndroid Build Coastguard Worker                                         .i4_data_stride,
1529*495ae853SAndroid Build Coastguard Worker                                     pu1_src, ps_inp->s_inp_props.s_raw_buf.au4_strd[u1_comp], u4_wd,
1530*495ae853SAndroid Build Coastguard Worker                                     u4_ht);
1531*495ae853SAndroid Build Coastguard Worker         }
1532*495ae853SAndroid Build Coastguard Worker     }
1533*495ae853SAndroid Build Coastguard Worker 
1534*495ae853SAndroid Build Coastguard Worker     /* Padding input to satisfy SVC constraints */
1535*495ae853SAndroid Build Coastguard Worker     isvce_pad_input_to_svc_compliant_dims(ps_codec, ps_inp);
1536*495ae853SAndroid Build Coastguard Worker 
1537*495ae853SAndroid Build Coastguard Worker     /* Downscaling */
1538*495ae853SAndroid Build Coastguard Worker     for(i = u1_num_spatial_layers - 1; i > 0; i--)
1539*495ae853SAndroid Build Coastguard Worker     {
1540*495ae853SAndroid Build Coastguard Worker         const UWORD32 u4_default_scaled_blk_wd =
1541*495ae853SAndroid Build Coastguard Worker             gu4_downscaler_blk_size / ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio + 0.5;
1542*495ae853SAndroid Build Coastguard Worker         const UWORD32 u4_default_scaled_blk_ht =
1543*495ae853SAndroid Build Coastguard Worker             gu4_downscaler_blk_size / ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio + 0.5;
1544*495ae853SAndroid Build Coastguard Worker 
1545*495ae853SAndroid Build Coastguard Worker         isvce_pad_buf_for_filtering(ps_codec, ps_inp, i);
1546*495ae853SAndroid Build Coastguard Worker 
1547*495ae853SAndroid Build Coastguard Worker         s_src_buf_props = ps_inp->as_layer_yuv_buf_props[i];
1548*495ae853SAndroid Build Coastguard Worker         s_dst_buf_props = ps_inp->as_layer_yuv_buf_props[i - 1];
1549*495ae853SAndroid Build Coastguard Worker 
1550*495ae853SAndroid Build Coastguard Worker         u4_num_blocks_x =
1551*495ae853SAndroid Build Coastguard Worker             (s_src_buf_props.u4_width + (gu4_downscaler_blk_size - 1)) / gu4_downscaler_blk_size;
1552*495ae853SAndroid Build Coastguard Worker 
1553*495ae853SAndroid Build Coastguard Worker         u4_num_blocks_y =
1554*495ae853SAndroid Build Coastguard Worker             (s_src_buf_props.u4_height + (gu4_downscaler_blk_size - 1)) / gu4_downscaler_blk_size;
1555*495ae853SAndroid Build Coastguard Worker 
1556*495ae853SAndroid Build Coastguard Worker         pu1_src_luma = (UWORD8 *) s_src_buf_props.as_component_bufs[Y].pv_data;
1557*495ae853SAndroid Build Coastguard Worker         pu1_src_chroma = (UWORD8 *) s_src_buf_props.as_component_bufs[U].pv_data;
1558*495ae853SAndroid Build Coastguard Worker         pu1_dst_luma = (UWORD8 *) s_dst_buf_props.as_component_bufs[Y].pv_data;
1559*495ae853SAndroid Build Coastguard Worker         pu1_dst_chroma = (UWORD8 *) s_dst_buf_props.as_component_bufs[U].pv_data;
1560*495ae853SAndroid Build Coastguard Worker 
1561*495ae853SAndroid Build Coastguard Worker         for(u4_blk_x = 0; u4_blk_x < u4_num_blocks_x; u4_blk_x++)
1562*495ae853SAndroid Build Coastguard Worker         {
1563*495ae853SAndroid Build Coastguard Worker             for(u4_blk_y = 0; u4_blk_y < u4_num_blocks_y; u4_blk_y++)
1564*495ae853SAndroid Build Coastguard Worker             {
1565*495ae853SAndroid Build Coastguard Worker                 u4_blk_wd_luma = isvce_get_downscaler_blk_dims(s_src_buf_props.u4_width, u4_blk_x,
1566*495ae853SAndroid Build Coastguard Worker                                                                gu4_downscaler_blk_size);
1567*495ae853SAndroid Build Coastguard Worker 
1568*495ae853SAndroid Build Coastguard Worker                 u4_blk_ht_luma = isvce_get_downscaler_blk_dims(s_src_buf_props.u4_height, u4_blk_y,
1569*495ae853SAndroid Build Coastguard Worker                                                                gu4_downscaler_blk_size);
1570*495ae853SAndroid Build Coastguard Worker 
1571*495ae853SAndroid Build Coastguard Worker                 u4_scaled_block_wd = isvce_get_downscaler_blk_dims(
1572*495ae853SAndroid Build Coastguard Worker                     s_dst_buf_props.u4_width, u4_blk_x, u4_default_scaled_blk_wd);
1573*495ae853SAndroid Build Coastguard Worker 
1574*495ae853SAndroid Build Coastguard Worker                 u4_scaled_block_ht = isvce_get_downscaler_blk_dims(
1575*495ae853SAndroid Build Coastguard Worker                     s_dst_buf_props.u4_height, u4_blk_y, u4_default_scaled_blk_ht);
1576*495ae853SAndroid Build Coastguard Worker 
1577*495ae853SAndroid Build Coastguard Worker                 s_src_buf_props.as_component_bufs[Y].pv_data =
1578*495ae853SAndroid Build Coastguard Worker                     pu1_src_luma + (u4_blk_x * gu4_downscaler_blk_size +
1579*495ae853SAndroid Build Coastguard Worker                                     u4_blk_y * gu4_downscaler_blk_size *
1580*495ae853SAndroid Build Coastguard Worker                                         s_src_buf_props.as_component_bufs[Y].i4_data_stride);
1581*495ae853SAndroid Build Coastguard Worker 
1582*495ae853SAndroid Build Coastguard Worker                 s_src_buf_props.as_component_bufs[U].pv_data =
1583*495ae853SAndroid Build Coastguard Worker                     pu1_src_chroma + (u4_blk_x * gu4_downscaler_blk_size +
1584*495ae853SAndroid Build Coastguard Worker                                       u4_blk_y * (gu4_downscaler_blk_size / 2) *
1585*495ae853SAndroid Build Coastguard Worker                                           s_src_buf_props.as_component_bufs[U].i4_data_stride);
1586*495ae853SAndroid Build Coastguard Worker 
1587*495ae853SAndroid Build Coastguard Worker                 s_dst_buf_props.as_component_bufs[Y].pv_data =
1588*495ae853SAndroid Build Coastguard Worker                     pu1_dst_luma + (u4_blk_x * u4_default_scaled_blk_wd +
1589*495ae853SAndroid Build Coastguard Worker                                     u4_blk_y * u4_default_scaled_blk_ht *
1590*495ae853SAndroid Build Coastguard Worker                                         s_dst_buf_props.as_component_bufs[Y].i4_data_stride);
1591*495ae853SAndroid Build Coastguard Worker 
1592*495ae853SAndroid Build Coastguard Worker                 s_dst_buf_props.as_component_bufs[U].pv_data =
1593*495ae853SAndroid Build Coastguard Worker                     pu1_dst_chroma + (u4_blk_x * u4_default_scaled_blk_wd +
1594*495ae853SAndroid Build Coastguard Worker                                       u4_blk_y * (u4_default_scaled_blk_ht / 2) *
1595*495ae853SAndroid Build Coastguard Worker                                           s_dst_buf_props.as_component_bufs[U].i4_data_stride);
1596*495ae853SAndroid Build Coastguard Worker 
1597*495ae853SAndroid Build Coastguard Worker                 ASSERT(!(u4_scaled_block_wd & 1));
1598*495ae853SAndroid Build Coastguard Worker                 ASSERT(!(u4_scaled_block_ht & 1));
1599*495ae853SAndroid Build Coastguard Worker 
1600*495ae853SAndroid Build Coastguard Worker                 isvce_process_downscaler(ps_scaler, &s_src_buf_props, &s_dst_buf_props,
1601*495ae853SAndroid Build Coastguard Worker                                          u4_blk_wd_luma, u4_blk_ht_luma);
1602*495ae853SAndroid Build Coastguard Worker             }
1603*495ae853SAndroid Build Coastguard Worker         }
1604*495ae853SAndroid Build Coastguard Worker     }
1605*495ae853SAndroid Build Coastguard Worker 
1606*495ae853SAndroid Build Coastguard Worker     UNUSED(u4_scaled_block_wd);
1607*495ae853SAndroid Build Coastguard Worker     UNUSED(u4_scaled_block_ht);
1608*495ae853SAndroid Build Coastguard Worker }
1609*495ae853SAndroid Build Coastguard Worker 
1610*495ae853SAndroid Build Coastguard Worker /**
1611*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1612*495ae853SAndroid Build Coastguard Worker *
1613*495ae853SAndroid Build Coastguard Worker * @brief
1614*495ae853SAndroid Build Coastguard Worker *  calculates the greatest common divisor between the two parameters.
1615*495ae853SAndroid Build Coastguard Worker *
1616*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1617*495ae853SAndroid Build Coastguard Worker */
1618*495ae853SAndroid Build Coastguard Worker 
isvce_get_GCD(DOUBLE a,DOUBLE b)1619*495ae853SAndroid Build Coastguard Worker static DOUBLE isvce_get_GCD(DOUBLE a, DOUBLE b)
1620*495ae853SAndroid Build Coastguard Worker {
1621*495ae853SAndroid Build Coastguard Worker     if(b == 0)
1622*495ae853SAndroid Build Coastguard Worker     {
1623*495ae853SAndroid Build Coastguard Worker         return a;
1624*495ae853SAndroid Build Coastguard Worker     }
1625*495ae853SAndroid Build Coastguard Worker 
1626*495ae853SAndroid Build Coastguard Worker     return isvce_get_GCD(b, fmod(a, b));
1627*495ae853SAndroid Build Coastguard Worker }
1628*495ae853SAndroid Build Coastguard Worker 
1629*495ae853SAndroid Build Coastguard Worker /**
1630*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1631*495ae853SAndroid Build Coastguard Worker *
1632*495ae853SAndroid Build Coastguard Worker * @brief
1633*495ae853SAndroid Build Coastguard Worker *  calculates the least common multiple between the two parameters
1634*495ae853SAndroid Build Coastguard Worker *
1635*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1636*495ae853SAndroid Build Coastguard Worker */
1637*495ae853SAndroid Build Coastguard Worker 
isvce_get_LCM(DOUBLE a,DOUBLE b)1638*495ae853SAndroid Build Coastguard Worker static DOUBLE isvce_get_LCM(DOUBLE a, DOUBLE b) { return (a / isvce_get_GCD(a, b)) * b; }
1639*495ae853SAndroid Build Coastguard Worker 
1640*495ae853SAndroid Build Coastguard Worker /**
1641*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1642*495ae853SAndroid Build Coastguard Worker *
1643*495ae853SAndroid Build Coastguard Worker * @brief
1644*495ae853SAndroid Build Coastguard Worker *  sets the width and height in config structure to SVC compliant width and
1645*495ae853SAndroid Build Coastguard Worker *   height
1646*495ae853SAndroid Build Coastguard Worker *
1647*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cfg
1648*495ae853SAndroid Build Coastguard Worker *  Pointer to config struct
1649*495ae853SAndroid Build Coastguard Worker *
1650*495ae853SAndroid Build Coastguard Worker * @param[in] u4_app_wd
1651*495ae853SAndroid Build Coastguard Worker *  width of the YUV as read by the app
1652*495ae853SAndroid Build Coastguard Worker *
1653*495ae853SAndroid Build Coastguard Worker * @param[in] u4_app_ht
1654*495ae853SAndroid Build Coastguard Worker *  height of the YUV as read by the app
1655*495ae853SAndroid Build Coastguard Worker *
1656*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1657*495ae853SAndroid Build Coastguard Worker */
1658*495ae853SAndroid Build Coastguard Worker 
isvce_get_svc_compliant_dimensions(UWORD8 u1_num_spatial_layers,DOUBLE d_scaling_factor,UWORD32 u4_wd,UWORD32 u4_ht,UWORD32 * pu4_svc_comp_wd,UWORD32 * pu4_svc_comp_ht)1659*495ae853SAndroid Build Coastguard Worker void isvce_get_svc_compliant_dimensions(UWORD8 u1_num_spatial_layers, DOUBLE d_scaling_factor,
1660*495ae853SAndroid Build Coastguard Worker                                         UWORD32 u4_wd, UWORD32 u4_ht, UWORD32 *pu4_svc_comp_wd,
1661*495ae853SAndroid Build Coastguard Worker                                         UWORD32 *pu4_svc_comp_ht)
1662*495ae853SAndroid Build Coastguard Worker {
1663*495ae853SAndroid Build Coastguard Worker     DOUBLE d_scaling_factor_power_num_layers_minus1 = 0;
1664*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_constraint_offset = 0;
1665*495ae853SAndroid Build Coastguard Worker 
1666*495ae853SAndroid Build Coastguard Worker     d_scaling_factor_power_num_layers_minus1 = pow(d_scaling_factor, u1_num_spatial_layers - 1);
1667*495ae853SAndroid Build Coastguard Worker 
1668*495ae853SAndroid Build Coastguard Worker     if(fmod(16, d_scaling_factor_power_num_layers_minus1))
1669*495ae853SAndroid Build Coastguard Worker     {
1670*495ae853SAndroid Build Coastguard Worker         u4_constraint_offset =
1671*495ae853SAndroid Build Coastguard Worker             (UWORD32) isvce_get_LCM(16, d_scaling_factor_power_num_layers_minus1);
1672*495ae853SAndroid Build Coastguard Worker     }
1673*495ae853SAndroid Build Coastguard Worker     else
1674*495ae853SAndroid Build Coastguard Worker     {
1675*495ae853SAndroid Build Coastguard Worker         u4_constraint_offset = (UWORD32) (16 * d_scaling_factor_power_num_layers_minus1);
1676*495ae853SAndroid Build Coastguard Worker     }
1677*495ae853SAndroid Build Coastguard Worker 
1678*495ae853SAndroid Build Coastguard Worker     if(u4_wd % u4_constraint_offset)
1679*495ae853SAndroid Build Coastguard Worker     {
1680*495ae853SAndroid Build Coastguard Worker         *pu4_svc_comp_wd = u4_wd - ((u4_wd) % u4_constraint_offset) + u4_constraint_offset;
1681*495ae853SAndroid Build Coastguard Worker     }
1682*495ae853SAndroid Build Coastguard Worker     else
1683*495ae853SAndroid Build Coastguard Worker     {
1684*495ae853SAndroid Build Coastguard Worker         *pu4_svc_comp_wd = u4_wd;
1685*495ae853SAndroid Build Coastguard Worker     }
1686*495ae853SAndroid Build Coastguard Worker 
1687*495ae853SAndroid Build Coastguard Worker     if(u4_ht % u4_constraint_offset)
1688*495ae853SAndroid Build Coastguard Worker     {
1689*495ae853SAndroid Build Coastguard Worker         *pu4_svc_comp_ht = u4_ht - ((u4_ht) % u4_constraint_offset) + u4_constraint_offset;
1690*495ae853SAndroid Build Coastguard Worker     }
1691*495ae853SAndroid Build Coastguard Worker     else
1692*495ae853SAndroid Build Coastguard Worker     {
1693*495ae853SAndroid Build Coastguard Worker         *pu4_svc_comp_ht = u4_ht;
1694*495ae853SAndroid Build Coastguard Worker     }
1695*495ae853SAndroid Build Coastguard Worker }
1696*495ae853SAndroid Build Coastguard Worker 
1697*495ae853SAndroid Build Coastguard Worker /**
1698*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1699*495ae853SAndroid Build Coastguard Worker *
1700*495ae853SAndroid Build Coastguard Worker * @brief
1701*495ae853SAndroid Build Coastguard Worker *  Returns size of buffers for storing SVC layer nbr info
1702*495ae853SAndroid Build Coastguard Worker *
1703*495ae853SAndroid Build Coastguard Worker * @param[in] u1_num_spatial_layers
1704*495ae853SAndroid Build Coastguard Worker *  Num Spatial Layers
1705*495ae853SAndroid Build Coastguard Worker *
1706*495ae853SAndroid Build Coastguard Worker * @param[in] d_spatial_res_ratio
1707*495ae853SAndroid Build Coastguard Worker *  Resolution Ratio b/w spatial layers
1708*495ae853SAndroid Build Coastguard Worker *
1709*495ae853SAndroid Build Coastguard Worker * @param[in] u4_wd
1710*495ae853SAndroid Build Coastguard Worker *  Input Width
1711*495ae853SAndroid Build Coastguard Worker *
1712*495ae853SAndroid Build Coastguard Worker * @returns  Size of buffers
1713*495ae853SAndroid Build Coastguard Worker *
1714*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1715*495ae853SAndroid Build Coastguard Worker */
isvce_get_svc_nbr_info_buf_size(UWORD8 u1_num_spatial_layers,DOUBLE d_spatial_res_ratio,UWORD32 u4_wd,UWORD32 u4_ht)1716*495ae853SAndroid Build Coastguard Worker UWORD32 isvce_get_svc_nbr_info_buf_size(UWORD8 u1_num_spatial_layers, DOUBLE d_spatial_res_ratio,
1717*495ae853SAndroid Build Coastguard Worker                                         UWORD32 u4_wd, UWORD32 u4_ht)
1718*495ae853SAndroid Build Coastguard Worker {
1719*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
1720*495ae853SAndroid Build Coastguard Worker 
1721*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_size = 0;
1722*495ae853SAndroid Build Coastguard Worker 
1723*495ae853SAndroid Build Coastguard Worker     ASSERT(1 == MAX_CTXT_SETS);
1724*495ae853SAndroid Build Coastguard Worker 
1725*495ae853SAndroid Build Coastguard Worker     u4_size += MAX_PROCESS_CTXT * u1_num_spatial_layers * sizeof(nbr_info_t);
1726*495ae853SAndroid Build Coastguard Worker 
1727*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < u1_num_spatial_layers; i++)
1728*495ae853SAndroid Build Coastguard Worker     {
1729*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_wd = ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, i)) + 0.99;
1730*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_ht = ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, i)) + 0.99;
1731*495ae853SAndroid Build Coastguard Worker         WORD32 i4_num_mbs_in_row = i4_layer_luma_wd / MB_SIZE;
1732*495ae853SAndroid Build Coastguard Worker         WORD32 i4_num_mbs_in_col = i4_layer_luma_ht / MB_SIZE;
1733*495ae853SAndroid Build Coastguard Worker 
1734*495ae853SAndroid Build Coastguard Worker         /* ps_top_row_mb_info */
1735*495ae853SAndroid Build Coastguard Worker         u4_size += (i4_num_mbs_in_row + 1) * i4_num_mbs_in_col * sizeof(isvce_mb_info_t);
1736*495ae853SAndroid Build Coastguard Worker 
1737*495ae853SAndroid Build Coastguard Worker         /* ps_left_mb_info */
1738*495ae853SAndroid Build Coastguard Worker         u4_size += MAX_PROCESS_CTXT * sizeof(isvce_mb_info_t);
1739*495ae853SAndroid Build Coastguard Worker 
1740*495ae853SAndroid Build Coastguard Worker         /* ps_top_mb_intra_modes */
1741*495ae853SAndroid Build Coastguard Worker         u4_size += (i4_num_mbs_in_row + 1) * i4_num_mbs_in_col * sizeof(mb_intra_modes_t);
1742*495ae853SAndroid Build Coastguard Worker 
1743*495ae853SAndroid Build Coastguard Worker         /* ps_left_mb_intra_modes */
1744*495ae853SAndroid Build Coastguard Worker         u4_size += MAX_PROCESS_CTXT * sizeof(mb_intra_modes_t);
1745*495ae853SAndroid Build Coastguard Worker     }
1746*495ae853SAndroid Build Coastguard Worker 
1747*495ae853SAndroid Build Coastguard Worker     return u4_size;
1748*495ae853SAndroid Build Coastguard Worker }
1749*495ae853SAndroid Build Coastguard Worker 
1750*495ae853SAndroid Build Coastguard Worker /**
1751*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1752*495ae853SAndroid Build Coastguard Worker *
1753*495ae853SAndroid Build Coastguard Worker * @brief
1754*495ae853SAndroid Build Coastguard Worker *  Function to initialize svc nbr info buffers
1755*495ae853SAndroid Build Coastguard Worker *
1756*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
1757*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
1758*495ae853SAndroid Build Coastguard Worker *
1759*495ae853SAndroid Build Coastguard Worker * @param[in] ps_mem_rec
1760*495ae853SAndroid Build Coastguard Worker *  Pointer to memory allocated for input buffers
1761*495ae853SAndroid Build Coastguard Worker *
1762*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1763*495ae853SAndroid Build Coastguard Worker */
isvce_svc_nbr_info_buf_init(isvce_codec_t * ps_codec,iv_mem_rec_t * ps_mem_rec)1764*495ae853SAndroid Build Coastguard Worker void isvce_svc_nbr_info_buf_init(isvce_codec_t *ps_codec, iv_mem_rec_t *ps_mem_rec)
1765*495ae853SAndroid Build Coastguard Worker {
1766*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
1767*495ae853SAndroid Build Coastguard Worker 
1768*495ae853SAndroid Build Coastguard Worker     DOUBLE d_spatial_res_ratio = ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio;
1769*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_spatial_layers = ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers;
1770*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_wd = ps_codec->s_cfg.u4_wd;
1771*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ht = ps_codec->s_cfg.u4_ht;
1772*495ae853SAndroid Build Coastguard Worker 
1773*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf = ps_mem_rec->pv_base;
1774*495ae853SAndroid Build Coastguard Worker     WORD64 i8_alloc_mem_size =
1775*495ae853SAndroid Build Coastguard Worker         isvce_get_svc_nbr_info_buf_size(u1_num_spatial_layers, d_spatial_res_ratio, u4_wd, u4_ht);
1776*495ae853SAndroid Build Coastguard Worker 
1777*495ae853SAndroid Build Coastguard Worker     ASSERT(1 == MAX_CTXT_SETS);
1778*495ae853SAndroid Build Coastguard Worker 
1779*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_PROCESS_CTXT; i++)
1780*495ae853SAndroid Build Coastguard Worker     {
1781*495ae853SAndroid Build Coastguard Worker         ps_codec->as_process[i].s_nbr_info_base.ps_layer_nbr_info = (nbr_info_t *) pu1_buf;
1782*495ae853SAndroid Build Coastguard Worker         pu1_buf += u1_num_spatial_layers *
1783*495ae853SAndroid Build Coastguard Worker                    sizeof(ps_codec->as_process[i].s_nbr_info_base.ps_layer_nbr_info[0]);
1784*495ae853SAndroid Build Coastguard Worker         i8_alloc_mem_size -= u1_num_spatial_layers *
1785*495ae853SAndroid Build Coastguard Worker                              sizeof(ps_codec->as_process[i].s_nbr_info_base.ps_layer_nbr_info[0]);
1786*495ae853SAndroid Build Coastguard Worker 
1787*495ae853SAndroid Build Coastguard Worker         for(j = u1_num_spatial_layers - 1; j >= 0; j--)
1788*495ae853SAndroid Build Coastguard Worker         {
1789*495ae853SAndroid Build Coastguard Worker             ps_codec->as_process[i].s_nbr_info_base.ps_layer_nbr_info[j].ps_left_mb_info =
1790*495ae853SAndroid Build Coastguard Worker                 (isvce_mb_info_t *) pu1_buf;
1791*495ae853SAndroid Build Coastguard Worker             ps_codec->as_process[i].s_nbr_info.ps_left_mb_info = (isvce_mb_info_t *) pu1_buf;
1792*495ae853SAndroid Build Coastguard Worker             pu1_buf += sizeof(ps_codec->as_process[i].s_nbr_info.ps_left_mb_info[0]);
1793*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= sizeof(ps_codec->as_process[i].s_nbr_info.ps_left_mb_info[0]);
1794*495ae853SAndroid Build Coastguard Worker 
1795*495ae853SAndroid Build Coastguard Worker             ps_codec->as_process[i].s_nbr_info_base.ps_layer_nbr_info[j].ps_left_mb_intra_modes =
1796*495ae853SAndroid Build Coastguard Worker                 (mb_intra_modes_t *) pu1_buf;
1797*495ae853SAndroid Build Coastguard Worker             ps_codec->as_process[i].s_nbr_info.ps_left_mb_intra_modes =
1798*495ae853SAndroid Build Coastguard Worker                 (mb_intra_modes_t *) pu1_buf;
1799*495ae853SAndroid Build Coastguard Worker             pu1_buf += sizeof(ps_codec->as_process[i].s_nbr_info.ps_left_mb_intra_modes[0]);
1800*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -=
1801*495ae853SAndroid Build Coastguard Worker                 sizeof(ps_codec->as_process[i].s_nbr_info.ps_left_mb_intra_modes[0]);
1802*495ae853SAndroid Build Coastguard Worker         }
1803*495ae853SAndroid Build Coastguard Worker 
1804*495ae853SAndroid Build Coastguard Worker         ASSERT(i8_alloc_mem_size >= 0);
1805*495ae853SAndroid Build Coastguard Worker     }
1806*495ae853SAndroid Build Coastguard Worker 
1807*495ae853SAndroid Build Coastguard Worker     for(i = u1_num_spatial_layers - 1; i >= 0; i--)
1808*495ae853SAndroid Build Coastguard Worker     {
1809*495ae853SAndroid Build Coastguard Worker         isvce_mb_info_t *ps_top_mb_info;
1810*495ae853SAndroid Build Coastguard Worker         mb_intra_modes_t *ps_top_intra_modes;
1811*495ae853SAndroid Build Coastguard Worker 
1812*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_wd =
1813*495ae853SAndroid Build Coastguard Worker             ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
1814*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_ht =
1815*495ae853SAndroid Build Coastguard Worker             ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
1816*495ae853SAndroid Build Coastguard Worker         WORD32 i4_num_mbs_in_row = i4_layer_luma_wd / MB_SIZE;
1817*495ae853SAndroid Build Coastguard Worker         WORD32 i4_num_mbs_in_col = i4_layer_luma_ht / MB_SIZE;
1818*495ae853SAndroid Build Coastguard Worker 
1819*495ae853SAndroid Build Coastguard Worker         ps_top_mb_info = (isvce_mb_info_t *) pu1_buf;
1820*495ae853SAndroid Build Coastguard Worker         pu1_buf += (i4_num_mbs_in_row + 1) * i4_num_mbs_in_col * sizeof(ps_top_mb_info[0]);
1821*495ae853SAndroid Build Coastguard Worker         i8_alloc_mem_size -=
1822*495ae853SAndroid Build Coastguard Worker             (i4_num_mbs_in_row + 1) * i4_num_mbs_in_col * sizeof(ps_top_mb_info[0]);
1823*495ae853SAndroid Build Coastguard Worker 
1824*495ae853SAndroid Build Coastguard Worker         ps_top_intra_modes = (mb_intra_modes_t *) pu1_buf;
1825*495ae853SAndroid Build Coastguard Worker         pu1_buf += (i4_num_mbs_in_row + 1) * i4_num_mbs_in_col * sizeof(ps_top_intra_modes[0]);
1826*495ae853SAndroid Build Coastguard Worker         i8_alloc_mem_size -=
1827*495ae853SAndroid Build Coastguard Worker             (i4_num_mbs_in_row + 1) * i4_num_mbs_in_col * sizeof(ps_top_intra_modes[0]);
1828*495ae853SAndroid Build Coastguard Worker 
1829*495ae853SAndroid Build Coastguard Worker         for(j = 0; j < MAX_PROCESS_CTXT; j++)
1830*495ae853SAndroid Build Coastguard Worker         {
1831*495ae853SAndroid Build Coastguard Worker             ps_codec->as_process[j].s_nbr_info_base.ps_layer_nbr_info[i].ps_top_row_mb_info =
1832*495ae853SAndroid Build Coastguard Worker                 ps_top_mb_info;
1833*495ae853SAndroid Build Coastguard Worker             ps_codec->as_process[j].s_nbr_info.ps_top_row_mb_info = NULL;
1834*495ae853SAndroid Build Coastguard Worker 
1835*495ae853SAndroid Build Coastguard Worker             ps_codec->as_process[j].s_nbr_info_base.ps_layer_nbr_info[i].ps_top_mb_intra_modes =
1836*495ae853SAndroid Build Coastguard Worker                 ps_top_intra_modes;
1837*495ae853SAndroid Build Coastguard Worker             ps_codec->as_process[j].s_nbr_info.ps_top_mb_intra_modes = NULL;
1838*495ae853SAndroid Build Coastguard Worker         }
1839*495ae853SAndroid Build Coastguard Worker 
1840*495ae853SAndroid Build Coastguard Worker         ASSERT(i8_alloc_mem_size >= 0);
1841*495ae853SAndroid Build Coastguard Worker     }
1842*495ae853SAndroid Build Coastguard Worker }
1843*495ae853SAndroid Build Coastguard Worker 
1844*495ae853SAndroid Build Coastguard Worker /**
1845*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1846*495ae853SAndroid Build Coastguard Worker *
1847*495ae853SAndroid Build Coastguard Worker * @brief
1848*495ae853SAndroid Build Coastguard Worker *  isvce_codec_t and proc_t initialisations for an Access Unit
1849*495ae853SAndroid Build Coastguard Worker *
1850*495ae853SAndroid Build Coastguard Worker * @par Description:
1851*495ae853SAndroid Build Coastguard Worker *  Before beginning to encode the frame, the current function initializes all
1852*495ae853SAndroid Build Coastguard Worker *  the ctxts (proc, entropy, me, ...) basing on the input configured params.
1853*495ae853SAndroid Build Coastguard Worker *  It locates space for storing recon in the encoder picture buffer set, fetches
1854*495ae853SAndroid Build Coastguard Worker *  reference frame from encoder picture buffer set. Calls RC pre-enc to get
1855*495ae853SAndroid Build Coastguard Worker *  qp and pic type for the current frame. Queues proc jobs so that
1856*495ae853SAndroid Build Coastguard Worker *  the other threads can begin encoding. In brief, this function sets up the
1857*495ae853SAndroid Build Coastguard Worker *  tone for the entire encoder.
1858*495ae853SAndroid Build Coastguard Worker *
1859*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
1860*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
1861*495ae853SAndroid Build Coastguard Worker *
1862*495ae853SAndroid Build Coastguard Worker * @param[in] ps_inp_buf
1863*495ae853SAndroid Build Coastguard Worker *  Pointer to input buffer context
1864*495ae853SAndroid Build Coastguard Worker *
1865*495ae853SAndroid Build Coastguard Worker * @returns  error_status
1866*495ae853SAndroid Build Coastguard Worker *
1867*495ae853SAndroid Build Coastguard Worker * @remarks
1868*495ae853SAndroid Build Coastguard Worker *
1869*495ae853SAndroid Build Coastguard Worker *
1870*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1871*495ae853SAndroid Build Coastguard Worker */
isvce_svc_au_init(isvce_codec_t * ps_codec,isvce_inp_buf_t * ps_inp_buf)1872*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_svc_au_init(isvce_codec_t *ps_codec, isvce_inp_buf_t *ps_inp_buf)
1873*495ae853SAndroid Build Coastguard Worker {
1874*495ae853SAndroid Build Coastguard Worker     svc_au_buf_t *ps_cur_pic;
1875*495ae853SAndroid Build Coastguard Worker 
1876*495ae853SAndroid Build Coastguard Worker     WORD32 cur_mv_bank_buf_id;
1877*495ae853SAndroid Build Coastguard Worker     WORD32 cur_pic_buf_id;
1878*495ae853SAndroid Build Coastguard Worker     WORD32 ref_set_id;
1879*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
1880*495ae853SAndroid Build Coastguard Worker 
1881*495ae853SAndroid Build Coastguard Worker     svc_au_data_t *ps_mv_buf = NULL;
1882*495ae853SAndroid Build Coastguard Worker     svc_au_buf_t *aps_ref_pic[MAX_REF_PIC_CNT] = {NULL, NULL};
1883*495ae853SAndroid Build Coastguard Worker     svc_au_data_t *aps_mv_buf[MAX_REF_PIC_CNT] = {NULL, NULL};
1884*495ae853SAndroid Build Coastguard Worker 
1885*495ae853SAndroid Build Coastguard Worker     IH264E_ERROR_T error_status = IH264E_SUCCESS;
1886*495ae853SAndroid Build Coastguard Worker     PIC_TYPE_T *pic_type = &ps_codec->pic_type;
1887*495ae853SAndroid Build Coastguard Worker 
1888*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_timestamp_high = ps_inp_buf->s_inp_props.u4_timestamp_high;
1889*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_timestamp_low = ps_inp_buf->s_inp_props.u4_timestamp_low;
1890*495ae853SAndroid Build Coastguard Worker     WORD32 ctxt_sel = ps_codec->i4_encode_api_call_cnt % MAX_CTXT_SETS;
1891*495ae853SAndroid Build Coastguard Worker     /* Diamond search Iteration Max Cnt */
1892*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_layers =
1893*495ae853SAndroid Build Coastguard Worker         (ps_codec->s_cfg.u4_enc_speed_preset == IVE_FASTEST) ? (NUM_LAYERS >> 2) : NUM_LAYERS;
1894*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_enable_fast_sad = ps_codec->s_cfg.u4_enable_fast_sad;
1895*495ae853SAndroid Build Coastguard Worker 
1896*495ae853SAndroid Build Coastguard Worker     if((PIC_I == *pic_type) || (PIC_IDR == *pic_type))
1897*495ae853SAndroid Build Coastguard Worker     {
1898*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_slice_type = ISLICE;
1899*495ae853SAndroid Build Coastguard Worker     }
1900*495ae853SAndroid Build Coastguard Worker     else if(PIC_P == *pic_type)
1901*495ae853SAndroid Build Coastguard Worker     {
1902*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_slice_type = PSLICE;
1903*495ae853SAndroid Build Coastguard Worker     }
1904*495ae853SAndroid Build Coastguard Worker     else if(PIC_B == *pic_type)
1905*495ae853SAndroid Build Coastguard Worker     {
1906*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_slice_type = BSLICE;
1907*495ae853SAndroid Build Coastguard Worker     }
1908*495ae853SAndroid Build Coastguard Worker 
1909*495ae853SAndroid Build Coastguard Worker     ps_codec->u4_is_curr_frm_ref = 0;
1910*495ae853SAndroid Build Coastguard Worker     ps_codec->u4_is_curr_frm_ref = (*pic_type != PIC_B);
1911*495ae853SAndroid Build Coastguard Worker 
1912*495ae853SAndroid Build Coastguard Worker     if(ps_codec->s_cfg.u4_enable_alt_ref && (*pic_type == PIC_P) &&
1913*495ae853SAndroid Build Coastguard Worker        (ps_codec->i4_pic_cnt % (ps_codec->s_cfg.u4_enable_alt_ref + 1)))
1914*495ae853SAndroid Build Coastguard Worker     {
1915*495ae853SAndroid Build Coastguard Worker         ps_codec->u4_is_curr_frm_ref = 0;
1916*495ae853SAndroid Build Coastguard Worker     }
1917*495ae853SAndroid Build Coastguard Worker 
1918*495ae853SAndroid Build Coastguard Worker     ps_codec->u4_is_idr = 0;
1919*495ae853SAndroid Build Coastguard Worker 
1920*495ae853SAndroid Build Coastguard Worker     if(PIC_IDR == *pic_type)
1921*495ae853SAndroid Build Coastguard Worker     {
1922*495ae853SAndroid Build Coastguard Worker         ps_codec->u4_is_idr = 1;
1923*495ae853SAndroid Build Coastguard Worker 
1924*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_frame_num = 0;
1925*495ae853SAndroid Build Coastguard Worker 
1926*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_idr_pic_id++;
1927*495ae853SAndroid Build Coastguard Worker     }
1928*495ae853SAndroid Build Coastguard Worker 
1929*495ae853SAndroid Build Coastguard Worker     ps_codec->u4_disable_deblock_level = 1;
1930*495ae853SAndroid Build Coastguard Worker 
1931*495ae853SAndroid Build Coastguard Worker     if(ps_codec->s_cfg.u4_disable_deblock_level == DISABLE_DEBLK_LEVEL_0)
1932*495ae853SAndroid Build Coastguard Worker     {
1933*495ae853SAndroid Build Coastguard Worker         ps_codec->u4_disable_deblock_level = 0;
1934*495ae853SAndroid Build Coastguard Worker     }
1935*495ae853SAndroid Build Coastguard Worker     else if(ps_codec->s_cfg.u4_disable_deblock_level == DISABLE_DEBLK_LEVEL_2)
1936*495ae853SAndroid Build Coastguard Worker     {
1937*495ae853SAndroid Build Coastguard Worker         if(ps_codec->u4_disable_deblock_level_cnt == DISABLE_DEBLOCK_INTERVAL ||
1938*495ae853SAndroid Build Coastguard Worker            ps_codec->i4_slice_type == ISLICE)
1939*495ae853SAndroid Build Coastguard Worker         {
1940*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_disable_deblock_level = 0;
1941*495ae853SAndroid Build Coastguard Worker         }
1942*495ae853SAndroid Build Coastguard Worker     }
1943*495ae853SAndroid Build Coastguard Worker     else if(ps_codec->s_cfg.u4_disable_deblock_level == DISABLE_DEBLK_LEVEL_3)
1944*495ae853SAndroid Build Coastguard Worker     {
1945*495ae853SAndroid Build Coastguard Worker         if(ps_codec->i4_slice_type == ISLICE)
1946*495ae853SAndroid Build Coastguard Worker         {
1947*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_disable_deblock_level = 0;
1948*495ae853SAndroid Build Coastguard Worker         }
1949*495ae853SAndroid Build Coastguard Worker     }
1950*495ae853SAndroid Build Coastguard Worker 
1951*495ae853SAndroid Build Coastguard Worker     if(ps_codec->u4_disable_deblock_level)
1952*495ae853SAndroid Build Coastguard Worker     {
1953*495ae853SAndroid Build Coastguard Worker         ps_codec->u4_disable_deblock_level_cnt++;
1954*495ae853SAndroid Build Coastguard Worker     }
1955*495ae853SAndroid Build Coastguard Worker     else
1956*495ae853SAndroid Build Coastguard Worker     {
1957*495ae853SAndroid Build Coastguard Worker         ps_codec->u4_disable_deblock_level_cnt = 0;
1958*495ae853SAndroid Build Coastguard Worker     }
1959*495ae853SAndroid Build Coastguard Worker 
1960*495ae853SAndroid Build Coastguard Worker     if(ps_codec->u4_disable_deblock_level == 0)
1961*495ae853SAndroid Build Coastguard Worker     {
1962*495ae853SAndroid Build Coastguard Worker         if(ps_codec->s_cfg.e_slice_mode != IVE_SLICE_MODE_NONE)
1963*495ae853SAndroid Build Coastguard Worker         {
1964*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_error_code = IH264E_SLICE_TYPE_INPUT_INVALID;
1965*495ae853SAndroid Build Coastguard Worker 
1966*495ae853SAndroid Build Coastguard Worker             return IH264E_SLICE_TYPE_INPUT_INVALID;
1967*495ae853SAndroid Build Coastguard Worker         }
1968*495ae853SAndroid Build Coastguard Worker     }
1969*495ae853SAndroid Build Coastguard Worker 
1970*495ae853SAndroid Build Coastguard Worker     ps_codec->i4_error_code = IH264E_SUCCESS;
1971*495ae853SAndroid Build Coastguard Worker 
1972*495ae853SAndroid Build Coastguard Worker     if(ps_codec->i4_gen_header)
1973*495ae853SAndroid Build Coastguard Worker     {
1974*495ae853SAndroid Build Coastguard Worker         sps_t *ps_sps = NULL;
1975*495ae853SAndroid Build Coastguard Worker         pps_t *ps_pps = NULL;
1976*495ae853SAndroid Build Coastguard Worker         subset_sps_t *ps_subset_sps = NULL;
1977*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_profile_idc = IH264_PROFILE_BASELINE;
1978*495ae853SAndroid Build Coastguard Worker 
1979*495ae853SAndroid Build Coastguard Worker         if(ps_codec->as_process[ctxt_sel * MAX_PROCESS_THREADS].u1_spatial_layer_id > 0)
1980*495ae853SAndroid Build Coastguard Worker         {
1981*495ae853SAndroid Build Coastguard Worker             u1_profile_idc = IH264_SCALABLE_BASELINE;
1982*495ae853SAndroid Build Coastguard Worker         }
1983*495ae853SAndroid Build Coastguard Worker 
1984*495ae853SAndroid Build Coastguard Worker         ps_sps = ps_codec->ps_sps_base;
1985*495ae853SAndroid Build Coastguard Worker         isvce_populate_sps(ps_codec, ps_sps, 0, u1_profile_idc, ps_inp_buf, 0);
1986*495ae853SAndroid Build Coastguard Worker 
1987*495ae853SAndroid Build Coastguard Worker         ps_pps = ps_codec->ps_pps_base;
1988*495ae853SAndroid Build Coastguard Worker         isvce_populate_pps(ps_codec, ps_pps, 0, 0, 0);
1989*495ae853SAndroid Build Coastguard Worker 
1990*495ae853SAndroid Build Coastguard Worker         for(i = 1; i < ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers; i++)
1991*495ae853SAndroid Build Coastguard Worker         {
1992*495ae853SAndroid Build Coastguard Worker             ps_subset_sps = ps_codec->ps_subset_sps_base + i;
1993*495ae853SAndroid Build Coastguard Worker             isvce_populate_subset_sps(ps_codec, ps_subset_sps, i, ps_inp_buf, i);
1994*495ae853SAndroid Build Coastguard Worker 
1995*495ae853SAndroid Build Coastguard Worker             /* populate pps header */
1996*495ae853SAndroid Build Coastguard Worker             ps_pps = ps_codec->ps_pps_base + i;
1997*495ae853SAndroid Build Coastguard Worker             isvce_populate_pps(ps_codec, ps_pps, i, i, i);
1998*495ae853SAndroid Build Coastguard Worker         }
1999*495ae853SAndroid Build Coastguard Worker     }
2000*495ae853SAndroid Build Coastguard Worker 
2001*495ae853SAndroid Build Coastguard Worker     if(IH264E_SUCCESS !=
2002*495ae853SAndroid Build Coastguard Worker        isvce_ref_list_refresh(ps_codec, aps_ref_pic, aps_mv_buf, &ref_set_id, pic_type[0]))
2003*495ae853SAndroid Build Coastguard Worker     {
2004*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_error_code = IH264E_NO_FREE_PICBUF;
2005*495ae853SAndroid Build Coastguard Worker 
2006*495ae853SAndroid Build Coastguard Worker         return IH264E_NO_FREE_PICBUF;
2007*495ae853SAndroid Build Coastguard Worker     }
2008*495ae853SAndroid Build Coastguard Worker 
2009*495ae853SAndroid Build Coastguard Worker     {
2010*495ae853SAndroid Build Coastguard Worker         ps_mv_buf = (svc_au_data_t *) ih264_buf_mgr_get_next_free(
2011*495ae853SAndroid Build Coastguard Worker             (buf_mgr_t *) ps_codec->pv_svc_au_data_store_mgr, &cur_mv_bank_buf_id);
2012*495ae853SAndroid Build Coastguard Worker 
2013*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_mv_buf)
2014*495ae853SAndroid Build Coastguard Worker         {
2015*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_error_code = IH264E_NO_FREE_MVBANK;
2016*495ae853SAndroid Build Coastguard Worker 
2017*495ae853SAndroid Build Coastguard Worker             return IH264E_NO_FREE_MVBANK;
2018*495ae853SAndroid Build Coastguard Worker         }
2019*495ae853SAndroid Build Coastguard Worker 
2020*495ae853SAndroid Build Coastguard Worker         if(ps_codec->u4_is_curr_frm_ref)
2021*495ae853SAndroid Build Coastguard Worker         {
2022*495ae853SAndroid Build Coastguard Worker             ih264_buf_mgr_set_status(ps_codec->pv_svc_au_data_store_mgr, cur_mv_bank_buf_id,
2023*495ae853SAndroid Build Coastguard Worker                                      BUF_MGR_REF);
2024*495ae853SAndroid Build Coastguard Worker         }
2025*495ae853SAndroid Build Coastguard Worker 
2026*495ae853SAndroid Build Coastguard Worker         ps_mv_buf->i4_abs_poc = ps_codec->i4_abs_pic_order_cnt;
2027*495ae853SAndroid Build Coastguard Worker         ps_mv_buf->i4_buf_id = cur_mv_bank_buf_id;
2028*495ae853SAndroid Build Coastguard Worker     }
2029*495ae853SAndroid Build Coastguard Worker 
2030*495ae853SAndroid Build Coastguard Worker     {
2031*495ae853SAndroid Build Coastguard Worker         ps_cur_pic = (svc_au_buf_t *) ih264_buf_mgr_get_next_free(
2032*495ae853SAndroid Build Coastguard Worker             (buf_mgr_t *) ps_codec->pv_ref_buf_mgr, &cur_pic_buf_id);
2033*495ae853SAndroid Build Coastguard Worker 
2034*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_cur_pic)
2035*495ae853SAndroid Build Coastguard Worker         {
2036*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_error_code = IH264E_NO_FREE_PICBUF;
2037*495ae853SAndroid Build Coastguard Worker 
2038*495ae853SAndroid Build Coastguard Worker             return IH264E_NO_FREE_PICBUF;
2039*495ae853SAndroid Build Coastguard Worker         }
2040*495ae853SAndroid Build Coastguard Worker 
2041*495ae853SAndroid Build Coastguard Worker         if(ps_codec->u4_is_curr_frm_ref)
2042*495ae853SAndroid Build Coastguard Worker         {
2043*495ae853SAndroid Build Coastguard Worker             ih264_buf_mgr_set_status(ps_codec->pv_ref_buf_mgr, cur_pic_buf_id, BUF_MGR_REF);
2044*495ae853SAndroid Build Coastguard Worker         }
2045*495ae853SAndroid Build Coastguard Worker 
2046*495ae853SAndroid Build Coastguard Worker         if(1 == ps_codec->s_cfg.u4_enable_recon)
2047*495ae853SAndroid Build Coastguard Worker         {
2048*495ae853SAndroid Build Coastguard Worker             ih264_buf_mgr_set_status(ps_codec->pv_ref_buf_mgr, cur_pic_buf_id, BUF_MGR_IO);
2049*495ae853SAndroid Build Coastguard Worker         }
2050*495ae853SAndroid Build Coastguard Worker 
2051*495ae853SAndroid Build Coastguard Worker         ps_cur_pic->u4_timestamp_high = ps_inp_buf->s_inp_props.u4_timestamp_high;
2052*495ae853SAndroid Build Coastguard Worker         ps_cur_pic->u4_timestamp_low = ps_inp_buf->s_inp_props.u4_timestamp_low;
2053*495ae853SAndroid Build Coastguard Worker 
2054*495ae853SAndroid Build Coastguard Worker         ps_cur_pic->i4_abs_poc = ps_codec->i4_poc;
2055*495ae853SAndroid Build Coastguard Worker         ps_cur_pic->i4_poc_lsb = ps_codec->i4_pic_order_cnt_lsb;
2056*495ae853SAndroid Build Coastguard Worker         ps_cur_pic->i4_frame_num = ps_codec->i4_frame_num;
2057*495ae853SAndroid Build Coastguard Worker 
2058*495ae853SAndroid Build Coastguard Worker         ps_cur_pic->i4_buf_id = cur_pic_buf_id;
2059*495ae853SAndroid Build Coastguard Worker 
2060*495ae853SAndroid Build Coastguard Worker         ps_cur_pic->i1_temporal_id = isvce_svc_temporal_id_compute(
2061*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_poc, ps_codec->s_cfg.s_svc_params.u1_num_temporal_layers, pic_type[0]);
2062*495ae853SAndroid Build Coastguard Worker     }
2063*495ae853SAndroid Build Coastguard Worker 
2064*495ae853SAndroid Build Coastguard Worker     /*
2065*495ae853SAndroid Build Coastguard Worker      * Add the current picture to ref list independent of the fact that it is used
2066*495ae853SAndroid Build Coastguard Worker      * as reference or not. This is because, now recon is not in sync with output
2067*495ae853SAndroid Build Coastguard Worker      * hence we may need the current recon after some delay. By adding it to ref
2068*495ae853SAndroid Build Coastguard Worker      * list we can retrieve the recon any time we want. The information that it is
2069*495ae853SAndroid Build Coastguard Worker      * used for ref can still be found by checking the buffer status of pic buf.
2070*495ae853SAndroid Build Coastguard Worker      */
2071*495ae853SAndroid Build Coastguard Worker     ps_codec->as_ref_set[ref_set_id].i4_pic_cnt = ps_codec->i4_pic_cnt;
2072*495ae853SAndroid Build Coastguard Worker     ps_codec->as_ref_set[ref_set_id].i4_poc = ps_codec->i4_poc;
2073*495ae853SAndroid Build Coastguard Worker     ps_codec->as_ref_set[ref_set_id].ps_svc_au_data = ps_mv_buf;
2074*495ae853SAndroid Build Coastguard Worker     ps_codec->as_ref_set[ref_set_id].ps_pic_buf = ps_cur_pic;
2075*495ae853SAndroid Build Coastguard Worker 
2076*495ae853SAndroid Build Coastguard Worker     ps_codec->s_svc_ilp_data.ps_svc_au_data = ps_mv_buf;
2077*495ae853SAndroid Build Coastguard Worker 
2078*495ae853SAndroid Build Coastguard Worker     {
2079*495ae853SAndroid Build Coastguard Worker         isvce_process_ctxt_t *ps_proc = NULL;
2080*495ae853SAndroid Build Coastguard Worker 
2081*495ae853SAndroid Build Coastguard Worker         j = ctxt_sel * MAX_PROCESS_THREADS;
2082*495ae853SAndroid Build Coastguard Worker 
2083*495ae853SAndroid Build Coastguard Worker         for(i = j; i < (j + MAX_PROCESS_THREADS); i++)
2084*495ae853SAndroid Build Coastguard Worker         {
2085*495ae853SAndroid Build Coastguard Worker             ps_proc = &ps_codec->as_process[i];
2086*495ae853SAndroid Build Coastguard Worker 
2087*495ae853SAndroid Build Coastguard Worker             ps_proc->s_svc_params = ps_codec->s_cfg.s_svc_params;
2088*495ae853SAndroid Build Coastguard Worker 
2089*495ae853SAndroid Build Coastguard Worker             ps_proc->i4_frame_num = ps_codec->i4_frame_num;
2090*495ae853SAndroid Build Coastguard Worker             ps_proc->u4_is_idr = ps_codec->u4_is_idr;
2091*495ae853SAndroid Build Coastguard Worker             ps_proc->u4_idr_pic_id = ps_codec->i4_idr_pic_id;
2092*495ae853SAndroid Build Coastguard Worker             ps_proc->i4_slice_type = ps_codec->i4_slice_type;
2093*495ae853SAndroid Build Coastguard Worker 
2094*495ae853SAndroid Build Coastguard Worker             ps_proc->u4_half_x_offset = 0;
2095*495ae853SAndroid Build Coastguard Worker             ps_proc->u4_half_y_offset = 0;
2096*495ae853SAndroid Build Coastguard Worker             ps_proc->u4_half_xy_offset = 0;
2097*495ae853SAndroid Build Coastguard Worker 
2098*495ae853SAndroid Build Coastguard Worker             ps_proc->u4_disable_deblock_level = ps_codec->u4_disable_deblock_level;
2099*495ae853SAndroid Build Coastguard Worker 
2100*495ae853SAndroid Build Coastguard Worker             ps_proc->i4_cur_mv_bank_buf_id = cur_mv_bank_buf_id;
2101*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_cur_pic = ps_cur_pic;
2102*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_cur_mv_buf = ps_mv_buf;
2103*495ae853SAndroid Build Coastguard Worker 
2104*495ae853SAndroid Build Coastguard Worker             /*
2105*495ae853SAndroid Build Coastguard Worker              * pointer to ref picture
2106*495ae853SAndroid Build Coastguard Worker              * 0    : Temporal back reference
2107*495ae853SAndroid Build Coastguard Worker              * 1    : Temporal forward reference
2108*495ae853SAndroid Build Coastguard Worker              */
2109*495ae853SAndroid Build Coastguard Worker             ps_proc->aps_ref_pic[L0] = aps_ref_pic[L0];
2110*495ae853SAndroid Build Coastguard Worker             ps_proc->aps_ref_pic[L1] = aps_ref_pic[L1];
2111*495ae853SAndroid Build Coastguard Worker             if(ps_codec->pic_type == PIC_B)
2112*495ae853SAndroid Build Coastguard Worker             {
2113*495ae853SAndroid Build Coastguard Worker                 ps_proc->aps_mv_buf[L0] = aps_mv_buf[L0];
2114*495ae853SAndroid Build Coastguard Worker                 ps_proc->aps_mv_buf[L1] = aps_mv_buf[L1];
2115*495ae853SAndroid Build Coastguard Worker             }
2116*495ae853SAndroid Build Coastguard Worker             else
2117*495ae853SAndroid Build Coastguard Worker             {
2118*495ae853SAndroid Build Coastguard Worker                 /*
2119*495ae853SAndroid Build Coastguard Worker                  * Else is dummy since for non B pic we does not need this
2120*495ae853SAndroid Build Coastguard Worker                  * But an assignment here will help in not having a segfault
2121*495ae853SAndroid Build Coastguard Worker                  * when we calcualte colpic in P slices
2122*495ae853SAndroid Build Coastguard Worker                  */
2123*495ae853SAndroid Build Coastguard Worker                 ps_proc->aps_mv_buf[L0] = ps_mv_buf;
2124*495ae853SAndroid Build Coastguard Worker                 ps_proc->aps_mv_buf[L1] = ps_mv_buf;
2125*495ae853SAndroid Build Coastguard Worker             }
2126*495ae853SAndroid Build Coastguard Worker 
2127*495ae853SAndroid Build Coastguard Worker             ps_proc->s_inp_buf = ps_inp_buf[0];
2128*495ae853SAndroid Build Coastguard Worker 
2129*495ae853SAndroid Build Coastguard Worker             ps_proc->i4_encode_api_call_cnt = ps_codec->i4_encode_api_call_cnt;
2130*495ae853SAndroid Build Coastguard Worker 
2131*495ae853SAndroid Build Coastguard Worker             ps_proc->i4_pic_cnt = ps_codec->i4_pic_cnt;
2132*495ae853SAndroid Build Coastguard Worker 
2133*495ae853SAndroid Build Coastguard Worker             ps_proc->i4_error_code = 0;
2134*495ae853SAndroid Build Coastguard Worker 
2135*495ae853SAndroid Build Coastguard Worker             {
2136*495ae853SAndroid Build Coastguard Worker                 isvce_entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy;
2137*495ae853SAndroid Build Coastguard Worker 
2138*495ae853SAndroid Build Coastguard Worker                 ps_entropy->i4_sof = 0;
2139*495ae853SAndroid Build Coastguard Worker                 ps_entropy->i4_eof = 0;
2140*495ae853SAndroid Build Coastguard Worker                 ps_entropy->ps_sps_base = ps_codec->ps_sps_base;
2141*495ae853SAndroid Build Coastguard Worker                 ps_entropy->ps_pps_base = ps_codec->ps_pps_base;
2142*495ae853SAndroid Build Coastguard Worker                 ps_entropy->pu1_slice_idx = ps_proc->pu1_slice_idx;
2143*495ae853SAndroid Build Coastguard Worker                 ps_entropy->ps_svc_nalu_ext_base = ps_proc->ps_svc_nalu_ext_base;
2144*495ae853SAndroid Build Coastguard Worker                 ps_entropy->ps_subset_sps_base = ps_proc->ps_subset_sps_base;
2145*495ae853SAndroid Build Coastguard Worker                 ps_entropy->ps_slice_hdr_base = ps_proc->ps_slice_hdr_base;
2146*495ae853SAndroid Build Coastguard Worker                 ps_entropy->ps_svc_slice_hdr_base = ps_proc->ps_svc_slice_hdr_base;
2147*495ae853SAndroid Build Coastguard Worker                 ps_entropy->i4_abs_pic_order_cnt = ps_codec->i4_poc;
2148*495ae853SAndroid Build Coastguard Worker 
2149*495ae853SAndroid Build Coastguard Worker                 ps_entropy->i1_transform_8x8_mode_flag = 0;
2150*495ae853SAndroid Build Coastguard Worker 
2151*495ae853SAndroid Build Coastguard Worker                 ps_entropy->i4_error_code = IH264E_SUCCESS;
2152*495ae853SAndroid Build Coastguard Worker                 ps_proc->s_entropy.u4_is_last = ps_inp_buf->s_inp_props.u4_is_last;
2153*495ae853SAndroid Build Coastguard Worker                 ps_proc->s_entropy.i4_pic_cnt = ps_codec->i4_pic_cnt;
2154*495ae853SAndroid Build Coastguard Worker 
2155*495ae853SAndroid Build Coastguard Worker                 ps_entropy->u4_timestamp_low = u4_timestamp_low;
2156*495ae853SAndroid Build Coastguard Worker                 ps_entropy->u4_timestamp_high = u4_timestamp_high;
2157*495ae853SAndroid Build Coastguard Worker             }
2158*495ae853SAndroid Build Coastguard Worker 
2159*495ae853SAndroid Build Coastguard Worker             {
2160*495ae853SAndroid Build Coastguard Worker                 isvce_me_ctxt_t *ps_me_ctxt = &ps_proc->s_me_ctxt;
2161*495ae853SAndroid Build Coastguard Worker 
2162*495ae853SAndroid Build Coastguard Worker                 ps_me_ctxt->ai2_srch_boundaries[0] = ps_codec->s_cfg.u4_srch_rng_x;
2163*495ae853SAndroid Build Coastguard Worker                 ps_me_ctxt->ai2_srch_boundaries[1] = ps_codec->s_cfg.u4_srch_rng_y;
2164*495ae853SAndroid Build Coastguard Worker 
2165*495ae853SAndroid Build Coastguard Worker                 ps_me_ctxt->u4_half_x_offset = ps_proc->u4_half_x_offset;
2166*495ae853SAndroid Build Coastguard Worker                 ps_me_ctxt->u4_half_y_offset = ps_proc->u4_half_y_offset;
2167*495ae853SAndroid Build Coastguard Worker                 ps_me_ctxt->u4_half_xy_offset = ps_proc->u4_half_xy_offset;
2168*495ae853SAndroid Build Coastguard Worker 
2169*495ae853SAndroid Build Coastguard Worker                 ps_me_ctxt->u4_enable_fast_sad = u4_enable_fast_sad;
2170*495ae853SAndroid Build Coastguard Worker                 ps_me_ctxt->u4_enable_hpel = ps_codec->s_cfg.u4_enable_hpel;
2171*495ae853SAndroid Build Coastguard Worker                 ps_me_ctxt->u4_num_layers = u4_num_layers;
2172*495ae853SAndroid Build Coastguard Worker                 ps_me_ctxt->u4_me_speed_preset = ps_codec->s_cfg.u4_me_speed_preset;
2173*495ae853SAndroid Build Coastguard Worker 
2174*495ae853SAndroid Build Coastguard Worker                 if((i == j) && (0 == ps_codec->i4_poc))
2175*495ae853SAndroid Build Coastguard Worker                 {
2176*495ae853SAndroid Build Coastguard Worker                     isvce_init_mv_bits(ps_me_ctxt);
2177*495ae853SAndroid Build Coastguard Worker                 }
2178*495ae853SAndroid Build Coastguard Worker             }
2179*495ae853SAndroid Build Coastguard Worker 
2180*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_ngbr_avbl = &(ps_proc->s_ngbr_avbl);
2181*495ae853SAndroid Build Coastguard Worker         }
2182*495ae853SAndroid Build Coastguard Worker     }
2183*495ae853SAndroid Build Coastguard Worker 
2184*495ae853SAndroid Build Coastguard Worker     return error_status;
2185*495ae853SAndroid Build Coastguard Worker }
2186*495ae853SAndroid Build Coastguard Worker 
isvce_init_quant_params(isvce_process_ctxt_t * ps_proc,WORD32 qp)2187*495ae853SAndroid Build Coastguard Worker void isvce_init_quant_params(isvce_process_ctxt_t *ps_proc, WORD32 qp)
2188*495ae853SAndroid Build Coastguard Worker {
2189*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
2190*495ae853SAndroid Build Coastguard Worker     /* quant params */
2191*495ae853SAndroid Build Coastguard Worker     quant_params_t *ps_qp_params;
2192*495ae853SAndroid Build Coastguard Worker 
2193*495ae853SAndroid Build Coastguard Worker     /* ptr to forward quant threshold matrix */
2194*495ae853SAndroid Build Coastguard Worker     const UWORD16 *pu2_thres_mat = NULL;
2195*495ae853SAndroid Build Coastguard Worker 
2196*495ae853SAndroid Build Coastguard Worker     /* ptr to forward scale matrix */
2197*495ae853SAndroid Build Coastguard Worker     const UWORD16 *pu2_scale_mat = gu2_quant_scale_matrix_4x4;
2198*495ae853SAndroid Build Coastguard Worker 
2199*495ae853SAndroid Build Coastguard Worker     /* ptr to inverse scale matrix */
2200*495ae853SAndroid Build Coastguard Worker     const UWORD16 *pu2_iscale_mat = gau2_ih264_iquant_scale_matrix_4x4;
2201*495ae853SAndroid Build Coastguard Worker 
2202*495ae853SAndroid Build Coastguard Worker     /* temp var */
2203*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_qp[3], u4_qp_div6, u4_qp_mod6;
2204*495ae853SAndroid Build Coastguard Worker     COMPONENT_TYPE plane;
2205*495ae853SAndroid Build Coastguard Worker     WORD32 i;
2206*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_satdq_t;
2207*495ae853SAndroid Build Coastguard Worker     const UWORD16 *pu2_smat;
2208*495ae853SAndroid Build Coastguard Worker 
2209*495ae853SAndroid Build Coastguard Worker     /********************************************************************/
2210*495ae853SAndroid Build Coastguard Worker     /* init quant params for all planes Y, U and V                      */
2211*495ae853SAndroid Build Coastguard Worker     /********************************************************************/
2212*495ae853SAndroid Build Coastguard Worker     /* luma qp */
2213*495ae853SAndroid Build Coastguard Worker     u4_qp[Y] = qp;
2214*495ae853SAndroid Build Coastguard Worker 
2215*495ae853SAndroid Build Coastguard Worker     /* chroma qp
2216*495ae853SAndroid Build Coastguard Worker      * TODO_LATER : just in case if the chroma planes use different qp's this
2217*495ae853SAndroid Build Coastguard Worker      * needs to be corrected accordingly.
2218*495ae853SAndroid Build Coastguard Worker      */
2219*495ae853SAndroid Build Coastguard Worker     u4_qp[U] = gu1_qpc_fqpi[qp];
2220*495ae853SAndroid Build Coastguard Worker     u4_qp[V] = gu1_qpc_fqpi[qp];
2221*495ae853SAndroid Build Coastguard Worker 
2222*495ae853SAndroid Build Coastguard Worker     plane = Y;
2223*495ae853SAndroid Build Coastguard Worker     while(plane <= V)
2224*495ae853SAndroid Build Coastguard Worker     {
2225*495ae853SAndroid Build Coastguard Worker         u4_qp_div6 = (u4_qp[plane] / 6);
2226*495ae853SAndroid Build Coastguard Worker         u4_qp_mod6 = (u4_qp[plane] % 6);
2227*495ae853SAndroid Build Coastguard Worker 
2228*495ae853SAndroid Build Coastguard Worker         ps_qp_params = ps_proc->ps_qp_params[plane];
2229*495ae853SAndroid Build Coastguard Worker 
2230*495ae853SAndroid Build Coastguard Worker         /* mb qp */
2231*495ae853SAndroid Build Coastguard Worker         ps_qp_params->u1_mb_qp = u4_qp[plane];
2232*495ae853SAndroid Build Coastguard Worker 
2233*495ae853SAndroid Build Coastguard Worker         /* mb qp / 6 */
2234*495ae853SAndroid Build Coastguard Worker         ps_qp_params->u1_qp_div = u4_qp_div6;
2235*495ae853SAndroid Build Coastguard Worker 
2236*495ae853SAndroid Build Coastguard Worker         /* mb qp % 6 */
2237*495ae853SAndroid Build Coastguard Worker         ps_qp_params->u1_qp_rem = u4_qp_mod6;
2238*495ae853SAndroid Build Coastguard Worker 
2239*495ae853SAndroid Build Coastguard Worker         /* QP bits */
2240*495ae853SAndroid Build Coastguard Worker         ps_qp_params->u1_qbits = QP_BITS_h264_4x4 + u4_qp_div6;
2241*495ae853SAndroid Build Coastguard Worker 
2242*495ae853SAndroid Build Coastguard Worker         /* forward scale matrix */
2243*495ae853SAndroid Build Coastguard Worker         ps_qp_params->pu2_scale_mat = pu2_scale_mat + (u4_qp_mod6 * 16);
2244*495ae853SAndroid Build Coastguard Worker 
2245*495ae853SAndroid Build Coastguard Worker         /* threshold matrix & weight for quantization */
2246*495ae853SAndroid Build Coastguard Worker         pu2_thres_mat = gu2_forward_quant_threshold_4x4 + (u4_qp_mod6 * 16);
2247*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < 16; i++)
2248*495ae853SAndroid Build Coastguard Worker         {
2249*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_thres_mat[i] = pu2_thres_mat[i] >> (8 - u4_qp_div6);
2250*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_weigh_mat[i] = 16;
2251*495ae853SAndroid Build Coastguard Worker         }
2252*495ae853SAndroid Build Coastguard Worker 
2253*495ae853SAndroid Build Coastguard Worker         /* qp dependent rounding constant */
2254*495ae853SAndroid Build Coastguard Worker         ps_qp_params->u4_dead_zone = gu4_forward_quant_round_factor_4x4[u4_qp_div6];
2255*495ae853SAndroid Build Coastguard Worker 
2256*495ae853SAndroid Build Coastguard Worker         /* slice dependent rounding constant */
2257*495ae853SAndroid Build Coastguard Worker         if(ps_proc->i4_slice_type != ISLICE && ps_proc->i4_slice_type != SISLICE)
2258*495ae853SAndroid Build Coastguard Worker         {
2259*495ae853SAndroid Build Coastguard Worker             ps_qp_params->u4_dead_zone >>= 1;
2260*495ae853SAndroid Build Coastguard Worker         }
2261*495ae853SAndroid Build Coastguard Worker 
2262*495ae853SAndroid Build Coastguard Worker         /* SATQD threshold for zero block prediction */
2263*495ae853SAndroid Build Coastguard Worker         if(ps_codec->s_cfg.u4_enable_satqd)
2264*495ae853SAndroid Build Coastguard Worker         {
2265*495ae853SAndroid Build Coastguard Worker             pu2_smat = ps_qp_params->pu2_scale_mat;
2266*495ae853SAndroid Build Coastguard Worker 
2267*495ae853SAndroid Build Coastguard Worker             u4_satdq_t = ((1 << (ps_qp_params->u1_qbits)) - ps_qp_params->u4_dead_zone);
2268*495ae853SAndroid Build Coastguard Worker 
2269*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_sad_thrsh[0] = u4_satdq_t / MAX(pu2_smat[3], pu2_smat[11]);
2270*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_sad_thrsh[1] = u4_satdq_t / MAX(pu2_smat[1], pu2_smat[9]);
2271*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_sad_thrsh[2] = u4_satdq_t / pu2_smat[15];
2272*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_sad_thrsh[3] = u4_satdq_t / pu2_smat[7];
2273*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_sad_thrsh[4] = u4_satdq_t / MAX(pu2_smat[12], pu2_smat[14]);
2274*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_sad_thrsh[5] = u4_satdq_t / MAX(pu2_smat[4], pu2_smat[6]);
2275*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_sad_thrsh[6] = u4_satdq_t / pu2_smat[13];
2276*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_sad_thrsh[7] = u4_satdq_t / pu2_smat[5];
2277*495ae853SAndroid Build Coastguard Worker             ps_qp_params->pu2_sad_thrsh[8] =
2278*495ae853SAndroid Build Coastguard Worker                 u4_satdq_t / MAX(MAX3(pu2_smat[0], pu2_smat[2], pu2_smat[8]), pu2_smat[10]);
2279*495ae853SAndroid Build Coastguard Worker         }
2280*495ae853SAndroid Build Coastguard Worker 
2281*495ae853SAndroid Build Coastguard Worker         /* inverse scale matrix */
2282*495ae853SAndroid Build Coastguard Worker         ps_qp_params->pu2_iscale_mat = pu2_iscale_mat + (u4_qp_mod6 * 16);
2283*495ae853SAndroid Build Coastguard Worker 
2284*495ae853SAndroid Build Coastguard Worker         plane += 1;
2285*495ae853SAndroid Build Coastguard Worker     }
2286*495ae853SAndroid Build Coastguard Worker }
2287*495ae853SAndroid Build Coastguard Worker 
2288*495ae853SAndroid Build Coastguard Worker /**
2289*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2290*495ae853SAndroid Build Coastguard Worker *
2291*495ae853SAndroid Build Coastguard Worker * @brief
2292*495ae853SAndroid Build Coastguard Worker *  isvce_codec_t and proc_t initialisations for an Access Unit
2293*495ae853SAndroid Build Coastguard Worker *
2294*495ae853SAndroid Build Coastguard Worker * @par Description:
2295*495ae853SAndroid Build Coastguard Worker *  Before beginning to encode the frame, the current function initializes all
2296*495ae853SAndroid Build Coastguard Worker *  the ctxts (proc, entropy, me, ...) basing on the input configured params.
2297*495ae853SAndroid Build Coastguard Worker *  It locates space for storing recon in the encoder picture buffer set, fetches
2298*495ae853SAndroid Build Coastguard Worker *  reference frame from encoder picture buffer set. Calls RC pre-enc to get
2299*495ae853SAndroid Build Coastguard Worker *  qp and pic type for the current frame. Queues proc jobs so that
2300*495ae853SAndroid Build Coastguard Worker *  the other threads can begin encoding. In brief, this function sets up the
2301*495ae853SAndroid Build Coastguard Worker *  tone for the entire encoder.
2302*495ae853SAndroid Build Coastguard Worker *
2303*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
2304*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
2305*495ae853SAndroid Build Coastguard Worker *
2306*495ae853SAndroid Build Coastguard Worker * @param[in] ps_inp_buf
2307*495ae853SAndroid Build Coastguard Worker *  Pointer to input buffer context
2308*495ae853SAndroid Build Coastguard Worker *
2309*495ae853SAndroid Build Coastguard Worker * @param[in] u1_spatial_layer_id
2310*495ae853SAndroid Build Coastguard Worker *  Spatial Layer IDl 0 => Base layer
2311*495ae853SAndroid Build Coastguard Worker *
2312*495ae853SAndroid Build Coastguard Worker * @returns  error_status
2313*495ae853SAndroid Build Coastguard Worker *
2314*495ae853SAndroid Build Coastguard Worker * @remarks
2315*495ae853SAndroid Build Coastguard Worker *
2316*495ae853SAndroid Build Coastguard Worker *
2317*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2318*495ae853SAndroid Build Coastguard Worker */
isvce_svc_layer_pic_init(isvce_codec_t * ps_codec,isvce_inp_buf_t * ps_inp_buf,UWORD8 u1_spatial_layer_id)2319*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_svc_layer_pic_init(isvce_codec_t *ps_codec, isvce_inp_buf_t *ps_inp_buf,
2320*495ae853SAndroid Build Coastguard Worker                                         UWORD8 u1_spatial_layer_id)
2321*495ae853SAndroid Build Coastguard Worker {
2322*495ae853SAndroid Build Coastguard Worker     WORD32 i;
2323*495ae853SAndroid Build Coastguard Worker 
2324*495ae853SAndroid Build Coastguard Worker     IH264E_ERROR_T error_status = IH264E_SUCCESS;
2325*495ae853SAndroid Build Coastguard Worker     IH264_ERROR_T ret = IH264_SUCCESS;
2326*495ae853SAndroid Build Coastguard Worker     PIC_TYPE_T e_pic_type = ps_codec->pic_type;
2327*495ae853SAndroid Build Coastguard Worker 
2328*495ae853SAndroid Build Coastguard Worker     ASSERT(MAX_CTXT_SETS == 1);
2329*495ae853SAndroid Build Coastguard Worker 
2330*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_PROCESS_THREADS; i++)
2331*495ae853SAndroid Build Coastguard Worker     {
2332*495ae853SAndroid Build Coastguard Worker         isvce_process_ctxt_t *ps_proc = &ps_codec->as_process[i];
2333*495ae853SAndroid Build Coastguard Worker         isvce_entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy;
2334*495ae853SAndroid Build Coastguard Worker         isvce_deblk_ctxt_t *ps_deblk = &ps_proc->s_deblk_ctxt;
2335*495ae853SAndroid Build Coastguard Worker         isvce_me_ctxt_t *ps_me_ctxt = &ps_proc->s_me_ctxt;
2336*495ae853SAndroid Build Coastguard Worker         svc_au_buf_t *ps_cur_pic = ps_proc->ps_cur_pic;
2337*495ae853SAndroid Build Coastguard Worker         svc_au_buf_t *aps_ref_pic[MAX_REF_PIC_CNT] = {ps_proc->aps_ref_pic[L0],
2338*495ae853SAndroid Build Coastguard Worker                                                       ps_proc->aps_ref_pic[L1]};
2339*495ae853SAndroid Build Coastguard Worker 
2340*495ae853SAndroid Build Coastguard Worker         ps_proc->u1_spatial_layer_id = u1_spatial_layer_id;
2341*495ae853SAndroid Build Coastguard Worker 
2342*495ae853SAndroid Build Coastguard Worker         ps_proc->s_src_pic_buf_props = ps_inp_buf->as_layer_yuv_buf_props[u1_spatial_layer_id];
2343*495ae853SAndroid Build Coastguard Worker 
2344*495ae853SAndroid Build Coastguard Worker         ps_proc->s_rec_pic_buf_props = ps_cur_pic->ps_layer_yuv_buf_props[u1_spatial_layer_id];
2345*495ae853SAndroid Build Coastguard Worker 
2346*495ae853SAndroid Build Coastguard Worker         ASSERT(0 == (ps_inp_buf->as_layer_yuv_buf_props[u1_spatial_layer_id].u4_width % MB_SIZE));
2347*495ae853SAndroid Build Coastguard Worker         ASSERT(0 == (ps_inp_buf->as_layer_yuv_buf_props[u1_spatial_layer_id].u4_height % MB_SIZE));
2348*495ae853SAndroid Build Coastguard Worker 
2349*495ae853SAndroid Build Coastguard Worker         ps_proc->i4_wd_mbs =
2350*495ae853SAndroid Build Coastguard Worker             ps_inp_buf->as_layer_yuv_buf_props[u1_spatial_layer_id].u4_width / MB_SIZE;
2351*495ae853SAndroid Build Coastguard Worker         ps_proc->i4_ht_mbs =
2352*495ae853SAndroid Build Coastguard Worker             ps_inp_buf->as_layer_yuv_buf_props[u1_spatial_layer_id].u4_height / MB_SIZE;
2353*495ae853SAndroid Build Coastguard Worker 
2354*495ae853SAndroid Build Coastguard Worker         ps_proc->u1_frame_qp = ps_codec->au4_frame_qp[u1_spatial_layer_id];
2355*495ae853SAndroid Build Coastguard Worker 
2356*495ae853SAndroid Build Coastguard Worker         ps_proc->u1_mb_qp = ps_proc->u1_frame_qp;
2357*495ae853SAndroid Build Coastguard Worker         ps_entropy->ps_mb_qp_ctxt->u1_cur_mb_qp = ps_proc->u1_frame_qp;
2358*495ae853SAndroid Build Coastguard Worker 
2359*495ae853SAndroid Build Coastguard Worker         isvce_init_quant_params(ps_proc, ps_proc->u1_frame_qp);
2360*495ae853SAndroid Build Coastguard Worker 
2361*495ae853SAndroid Build Coastguard Worker         memset(&ps_proc->s_frame_info, 0, sizeof(frame_info_t));
2362*495ae853SAndroid Build Coastguard Worker 
2363*495ae853SAndroid Build Coastguard Worker         /* row '-1' */
2364*495ae853SAndroid Build Coastguard Worker         memset(ps_proc->pu1_proc_map - ps_proc->i4_wd_mbs, 1,
2365*495ae853SAndroid Build Coastguard Worker                ps_proc->i4_wd_mbs * sizeof(ps_proc->pu1_proc_map[0]));
2366*495ae853SAndroid Build Coastguard Worker 
2367*495ae853SAndroid Build Coastguard Worker         /* row 0 to ht in mbs */
2368*495ae853SAndroid Build Coastguard Worker         memset(ps_proc->pu1_proc_map, 0,
2369*495ae853SAndroid Build Coastguard Worker                ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs * sizeof(ps_proc->pu1_proc_map[0]));
2370*495ae853SAndroid Build Coastguard Worker 
2371*495ae853SAndroid Build Coastguard Worker         /* row '-1' */
2372*495ae853SAndroid Build Coastguard Worker         memset(ps_proc->pu1_deblk_map - ps_proc->i4_wd_mbs, 1,
2373*495ae853SAndroid Build Coastguard Worker                ps_proc->i4_wd_mbs * sizeof(ps_proc->pu1_deblk_map[0]));
2374*495ae853SAndroid Build Coastguard Worker 
2375*495ae853SAndroid Build Coastguard Worker         /* row 0 to ht in mbs */
2376*495ae853SAndroid Build Coastguard Worker         memset(ps_proc->pu1_deblk_map, 0,
2377*495ae853SAndroid Build Coastguard Worker                ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs * sizeof(ps_proc->pu1_deblk_map[0]));
2378*495ae853SAndroid Build Coastguard Worker 
2379*495ae853SAndroid Build Coastguard Worker         /* row '-1' */
2380*495ae853SAndroid Build Coastguard Worker         memset(ps_proc->pu1_me_map - ps_proc->i4_wd_mbs, 1,
2381*495ae853SAndroid Build Coastguard Worker                ps_proc->i4_wd_mbs * sizeof(ps_proc->pu1_me_map[0]));
2382*495ae853SAndroid Build Coastguard Worker 
2383*495ae853SAndroid Build Coastguard Worker         /* row 0 to ht in mbs */
2384*495ae853SAndroid Build Coastguard Worker         memset(ps_proc->pu1_me_map, 0,
2385*495ae853SAndroid Build Coastguard Worker                ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs * sizeof(ps_proc->pu1_me_map[0]));
2386*495ae853SAndroid Build Coastguard Worker 
2387*495ae853SAndroid Build Coastguard Worker         if(IVE_AIR_MODE_NONE != ps_codec->s_cfg.e_air_mode)
2388*495ae853SAndroid Build Coastguard Worker         {
2389*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_air_pic_cnt =
2390*495ae853SAndroid Build Coastguard Worker                 (ps_codec->i4_air_pic_cnt + 1) % ps_codec->s_cfg.u4_air_refresh_period;
2391*495ae853SAndroid Build Coastguard Worker 
2392*495ae853SAndroid Build Coastguard Worker             if(!ps_codec->i4_air_pic_cnt)
2393*495ae853SAndroid Build Coastguard Worker             {
2394*495ae853SAndroid Build Coastguard Worker                 memset(ps_proc->pu1_is_intra_coded, 0,
2395*495ae853SAndroid Build Coastguard Worker                        ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs *
2396*495ae853SAndroid Build Coastguard Worker                            sizeof(ps_proc->pu1_is_intra_coded[0]));
2397*495ae853SAndroid Build Coastguard Worker             }
2398*495ae853SAndroid Build Coastguard Worker         }
2399*495ae853SAndroid Build Coastguard Worker 
2400*495ae853SAndroid Build Coastguard Worker         if(ps_codec->s_cfg.e_slice_mode == IVE_SLICE_MODE_NONE)
2401*495ae853SAndroid Build Coastguard Worker         {
2402*495ae853SAndroid Build Coastguard Worker             memset(ps_proc->pu1_slice_idx, 0,
2403*495ae853SAndroid Build Coastguard Worker                    ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs * sizeof(ps_proc->pu1_slice_idx[0]));
2404*495ae853SAndroid Build Coastguard Worker         }
2405*495ae853SAndroid Build Coastguard Worker         else if(ps_codec->s_cfg.e_slice_mode == IVE_SLICE_MODE_BLOCKS)
2406*495ae853SAndroid Build Coastguard Worker         {
2407*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_slice_idx = ps_proc->pu1_slice_idx;
2408*495ae853SAndroid Build Coastguard Worker             WORD32 i4_mb_y = 0, slice_idx = 0, cnt;
2409*495ae853SAndroid Build Coastguard Worker 
2410*495ae853SAndroid Build Coastguard Worker             while(i4_mb_y < ps_proc->i4_ht_mbs)
2411*495ae853SAndroid Build Coastguard Worker             {
2412*495ae853SAndroid Build Coastguard Worker                 if(i4_mb_y + (WORD32) ps_codec->s_cfg.u4_slice_param < ps_proc->i4_ht_mbs)
2413*495ae853SAndroid Build Coastguard Worker                 {
2414*495ae853SAndroid Build Coastguard Worker                     cnt = ps_codec->s_cfg.u4_slice_param * ps_proc->i4_wd_mbs;
2415*495ae853SAndroid Build Coastguard Worker                     i4_mb_y += ps_codec->s_cfg.u4_slice_param;
2416*495ae853SAndroid Build Coastguard Worker                 }
2417*495ae853SAndroid Build Coastguard Worker                 else
2418*495ae853SAndroid Build Coastguard Worker                 {
2419*495ae853SAndroid Build Coastguard Worker                     cnt = (ps_proc->i4_ht_mbs - i4_mb_y) * ps_proc->i4_wd_mbs;
2420*495ae853SAndroid Build Coastguard Worker                     i4_mb_y += (ps_proc->i4_ht_mbs - i4_mb_y);
2421*495ae853SAndroid Build Coastguard Worker                 }
2422*495ae853SAndroid Build Coastguard Worker 
2423*495ae853SAndroid Build Coastguard Worker                 memset(pu1_slice_idx, slice_idx, cnt * sizeof(pu1_slice_idx[0]));
2424*495ae853SAndroid Build Coastguard Worker 
2425*495ae853SAndroid Build Coastguard Worker                 slice_idx++;
2426*495ae853SAndroid Build Coastguard Worker                 pu1_slice_idx += cnt;
2427*495ae853SAndroid Build Coastguard Worker             }
2428*495ae853SAndroid Build Coastguard Worker         }
2429*495ae853SAndroid Build Coastguard Worker 
2430*495ae853SAndroid Build Coastguard Worker         if((e_pic_type != PIC_IDR) && (e_pic_type != PIC_I))
2431*495ae853SAndroid Build Coastguard Worker         {
2432*495ae853SAndroid Build Coastguard Worker             ps_proc->as_ref_pic_buf_props[L0] =
2433*495ae853SAndroid Build Coastguard Worker                 aps_ref_pic[L0]->ps_layer_yuv_buf_props[u1_spatial_layer_id];
2434*495ae853SAndroid Build Coastguard Worker             ps_proc->as_ref_pic_buf_props[L1] =
2435*495ae853SAndroid Build Coastguard Worker                 aps_ref_pic[L1]->ps_layer_yuv_buf_props[u1_spatial_layer_id];
2436*495ae853SAndroid Build Coastguard Worker         }
2437*495ae853SAndroid Build Coastguard Worker 
2438*495ae853SAndroid Build Coastguard Worker         ps_entropy->i4_gen_header = ps_codec->i4_gen_header && (0 == u1_spatial_layer_id);
2439*495ae853SAndroid Build Coastguard Worker         ps_entropy->i4_gen_subset_sps =
2440*495ae853SAndroid Build Coastguard Worker             (ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers > 1) && ps_codec->i4_gen_header;
2441*495ae853SAndroid Build Coastguard Worker 
2442*495ae853SAndroid Build Coastguard Worker         /* row '-1' */
2443*495ae853SAndroid Build Coastguard Worker         memset(ps_entropy->pu1_entropy_map - ps_proc->i4_wd_mbs, 1,
2444*495ae853SAndroid Build Coastguard Worker                ps_proc->i4_wd_mbs * sizeof(ps_entropy->pu1_entropy_map[0]));
2445*495ae853SAndroid Build Coastguard Worker 
2446*495ae853SAndroid Build Coastguard Worker         /* row 0 to ht in mbs */
2447*495ae853SAndroid Build Coastguard Worker         memset(ps_entropy->pu1_entropy_map, 0,
2448*495ae853SAndroid Build Coastguard Worker                ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs * sizeof(ps_entropy->pu1_entropy_map[0]));
2449*495ae853SAndroid Build Coastguard Worker 
2450*495ae853SAndroid Build Coastguard Worker         isvce_init_cabac_table(ps_entropy);
2451*495ae853SAndroid Build Coastguard Worker 
2452*495ae853SAndroid Build Coastguard Worker         ps_entropy->i4_wd_mbs = ps_proc->i4_wd_mbs;
2453*495ae853SAndroid Build Coastguard Worker         ps_entropy->i4_ht_mbs = ps_proc->i4_ht_mbs;
2454*495ae853SAndroid Build Coastguard Worker 
2455*495ae853SAndroid Build Coastguard Worker         ps_entropy->u1_entropy_coding_mode_flag =
2456*495ae853SAndroid Build Coastguard Worker             ((ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers > 1) && (0 == u1_spatial_layer_id))
2457*495ae853SAndroid Build Coastguard Worker                 ? CAVLC
2458*495ae853SAndroid Build Coastguard Worker                 : ps_codec->s_cfg.u4_entropy_coding_mode;
2459*495ae853SAndroid Build Coastguard Worker 
2460*495ae853SAndroid Build Coastguard Worker         ps_proc->s_entropy.pi4_mb_skip_run[0] = 0;
2461*495ae853SAndroid Build Coastguard Worker 
2462*495ae853SAndroid Build Coastguard Worker         ps_entropy->u4_header_bits[MB_TYPE_INTRA] = 0;
2463*495ae853SAndroid Build Coastguard Worker         ps_entropy->u4_header_bits[MB_TYPE_INTER] = 0;
2464*495ae853SAndroid Build Coastguard Worker         ps_entropy->u4_residue_bits[MB_TYPE_INTRA] = 0;
2465*495ae853SAndroid Build Coastguard Worker         ps_entropy->u4_residue_bits[MB_TYPE_INTER] = 0;
2466*495ae853SAndroid Build Coastguard Worker 
2467*495ae853SAndroid Build Coastguard Worker         ps_entropy->u1_spatial_layer_id = ps_proc->u1_spatial_layer_id;
2468*495ae853SAndroid Build Coastguard Worker 
2469*495ae853SAndroid Build Coastguard Worker         ps_deblk->pu1_slice_idx = ps_proc->pu1_slice_idx;
2470*495ae853SAndroid Build Coastguard Worker 
2471*495ae853SAndroid Build Coastguard Worker         ps_me_ctxt->u1_mb_qp = ps_codec->au4_frame_qp[u1_spatial_layer_id];
2472*495ae853SAndroid Build Coastguard Worker 
2473*495ae853SAndroid Build Coastguard Worker         {
2474*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_min_qp;
2475*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_max_qp;
2476*495ae853SAndroid Build Coastguard Worker 
2477*495ae853SAndroid Build Coastguard Worker             svc_sub_pic_rc_ctxt_t *ps_sub_pic_rc_ctxt = ps_proc->ps_sub_pic_rc_ctxt;
2478*495ae853SAndroid Build Coastguard Worker             svc_sub_pic_rc_layer_variables_t *ps_layer_variables =
2479*495ae853SAndroid Build Coastguard Worker                 &ps_sub_pic_rc_ctxt->s_sub_pic_rc_variables.s_layer_variables;
2480*495ae853SAndroid Build Coastguard Worker 
2481*495ae853SAndroid Build Coastguard Worker             switch(ps_proc->i4_slice_type)
2482*495ae853SAndroid Build Coastguard Worker             {
2483*495ae853SAndroid Build Coastguard Worker                 case ISLICE:
2484*495ae853SAndroid Build Coastguard Worker                 {
2485*495ae853SAndroid Build Coastguard Worker                     u1_min_qp = ps_codec->s_cfg.au4_i_qp_min[u1_spatial_layer_id];
2486*495ae853SAndroid Build Coastguard Worker                     u1_max_qp = ps_codec->s_cfg.au4_i_qp_max[u1_spatial_layer_id];
2487*495ae853SAndroid Build Coastguard Worker 
2488*495ae853SAndroid Build Coastguard Worker                     break;
2489*495ae853SAndroid Build Coastguard Worker                 }
2490*495ae853SAndroid Build Coastguard Worker                 case PSLICE:
2491*495ae853SAndroid Build Coastguard Worker                 {
2492*495ae853SAndroid Build Coastguard Worker                     u1_min_qp = ps_codec->s_cfg.au4_p_qp_min[u1_spatial_layer_id];
2493*495ae853SAndroid Build Coastguard Worker                     u1_max_qp = ps_codec->s_cfg.au4_p_qp_max[u1_spatial_layer_id];
2494*495ae853SAndroid Build Coastguard Worker 
2495*495ae853SAndroid Build Coastguard Worker                     break;
2496*495ae853SAndroid Build Coastguard Worker                 }
2497*495ae853SAndroid Build Coastguard Worker                 default:
2498*495ae853SAndroid Build Coastguard Worker                 {
2499*495ae853SAndroid Build Coastguard Worker                     u1_min_qp = ps_codec->s_cfg.au4_b_qp_min[u1_spatial_layer_id];
2500*495ae853SAndroid Build Coastguard Worker                     u1_max_qp = ps_codec->s_cfg.au4_b_qp_max[u1_spatial_layer_id];
2501*495ae853SAndroid Build Coastguard Worker 
2502*495ae853SAndroid Build Coastguard Worker                     break;
2503*495ae853SAndroid Build Coastguard Worker                 }
2504*495ae853SAndroid Build Coastguard Worker             }
2505*495ae853SAndroid Build Coastguard Worker 
2506*495ae853SAndroid Build Coastguard Worker             ps_layer_variables->i4_max_num_reference_frames = ps_codec->i4_max_num_reference_frames;
2507*495ae853SAndroid Build Coastguard Worker             ps_layer_variables->i4_slice_type = ps_proc->i4_slice_type;
2508*495ae853SAndroid Build Coastguard Worker             ps_layer_variables->i4_frame_num = ps_proc->i4_frame_num;
2509*495ae853SAndroid Build Coastguard Worker             ps_layer_variables->u1_frame_qp = ps_proc->u1_frame_qp;
2510*495ae853SAndroid Build Coastguard Worker             ps_layer_variables->u1_spatial_layer_id = u1_spatial_layer_id;
2511*495ae853SAndroid Build Coastguard Worker             ps_layer_variables->u1_min_qp = u1_min_qp;
2512*495ae853SAndroid Build Coastguard Worker             ps_layer_variables->u1_max_qp = u1_max_qp;
2513*495ae853SAndroid Build Coastguard Worker 
2514*495ae853SAndroid Build Coastguard Worker             isvce_sub_pic_rc_ctxt_layer_init(ps_proc->ps_sub_pic_rc_ctxt);
2515*495ae853SAndroid Build Coastguard Worker         }
2516*495ae853SAndroid Build Coastguard Worker     }
2517*495ae853SAndroid Build Coastguard Worker 
2518*495ae853SAndroid Build Coastguard Worker     {
2519*495ae853SAndroid Build Coastguard Worker         job_t s_job;
2520*495ae853SAndroid Build Coastguard Worker 
2521*495ae853SAndroid Build Coastguard Worker         s_job.i4_cmd = CMD_PROCESS;
2522*495ae853SAndroid Build Coastguard Worker         s_job.i2_mb_cnt =
2523*495ae853SAndroid Build Coastguard Worker             ps_inp_buf->as_layer_yuv_buf_props[u1_spatial_layer_id].u4_width / MB_SIZE;
2524*495ae853SAndroid Build Coastguard Worker         s_job.i2_mb_x = 0;
2525*495ae853SAndroid Build Coastguard Worker 
2526*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < (WORD32) (ps_inp_buf->as_layer_yuv_buf_props[u1_spatial_layer_id].u4_height /
2527*495ae853SAndroid Build Coastguard Worker                                  MB_SIZE);
2528*495ae853SAndroid Build Coastguard Worker             i++)
2529*495ae853SAndroid Build Coastguard Worker         {
2530*495ae853SAndroid Build Coastguard Worker             s_job.i2_mb_y = i;
2531*495ae853SAndroid Build Coastguard Worker 
2532*495ae853SAndroid Build Coastguard Worker             ret = ih264_list_queue(ps_codec->pv_proc_jobq, &s_job, 1);
2533*495ae853SAndroid Build Coastguard Worker 
2534*495ae853SAndroid Build Coastguard Worker             if(ret != IH264_SUCCESS)
2535*495ae853SAndroid Build Coastguard Worker             {
2536*495ae853SAndroid Build Coastguard Worker                 ps_codec->i4_error_code = ret;
2537*495ae853SAndroid Build Coastguard Worker 
2538*495ae853SAndroid Build Coastguard Worker                 return IH264E_FAIL;
2539*495ae853SAndroid Build Coastguard Worker             }
2540*495ae853SAndroid Build Coastguard Worker         }
2541*495ae853SAndroid Build Coastguard Worker 
2542*495ae853SAndroid Build Coastguard Worker         /* Once all the jobs are queued, terminate the queue */
2543*495ae853SAndroid Build Coastguard Worker         /* Since the threads are created and deleted in each call, terminating
2544*495ae853SAndroid Build Coastguard Worker         here is not an issue */
2545*495ae853SAndroid Build Coastguard Worker         ih264_list_terminate(ps_codec->pv_proc_jobq);
2546*495ae853SAndroid Build Coastguard Worker     }
2547*495ae853SAndroid Build Coastguard Worker 
2548*495ae853SAndroid Build Coastguard Worker     ps_codec->i4_gen_header = 0;
2549*495ae853SAndroid Build Coastguard Worker 
2550*495ae853SAndroid Build Coastguard Worker     return error_status;
2551*495ae853SAndroid Build Coastguard Worker }
2552*495ae853SAndroid Build Coastguard Worker 
2553*495ae853SAndroid Build Coastguard Worker /**
2554*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2555*495ae853SAndroid Build Coastguard Worker *
2556*495ae853SAndroid Build Coastguard Worker * @brief   initialize process context.
2557*495ae853SAndroid Build Coastguard Worker *
2558*495ae853SAndroid Build Coastguard Worker * @par Description:
2559*495ae853SAndroid Build Coastguard Worker *  Before dispatching the current job to process thread, the process context
2560*495ae853SAndroid Build Coastguard Worker *  associated with the job is initialized. Usually every job aims to encode one
2561*495ae853SAndroid Build Coastguard Worker *  row of mb's. Basing on the row indices provided by the job, the process
2562*495ae853SAndroid Build Coastguard Worker *  context's buffer ptrs, slice indices and other elements that are necessary
2563*495ae853SAndroid Build Coastguard Worker *  during core-coding are initialized.
2564*495ae853SAndroid Build Coastguard Worker *
2565*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc
2566*495ae853SAndroid Build Coastguard Worker *  Pointer to the current process context
2567*495ae853SAndroid Build Coastguard Worker *
2568*495ae853SAndroid Build Coastguard Worker * @returns error status
2569*495ae853SAndroid Build Coastguard Worker *
2570*495ae853SAndroid Build Coastguard Worker * @remarks none
2571*495ae853SAndroid Build Coastguard Worker *
2572*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2573*495ae853SAndroid Build Coastguard Worker */
isvce_init_layer_proc_ctxt(isvce_process_ctxt_t * ps_proc)2574*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_init_layer_proc_ctxt(isvce_process_ctxt_t *ps_proc)
2575*495ae853SAndroid Build Coastguard Worker {
2576*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_x, i4_mb_y;
2577*495ae853SAndroid Build Coastguard Worker 
2578*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
2579*495ae853SAndroid Build Coastguard Worker     n_mb_process_ctxt_t *ps_n_mb_ctxt = &ps_proc->s_n_mb_ctxt;
2580*495ae853SAndroid Build Coastguard Worker     quant_params_t *ps_qp_params = ps_proc->ps_qp_params[0];
2581*495ae853SAndroid Build Coastguard Worker     isvce_deblk_ctxt_t *ps_deblk = &ps_proc->s_deblk_ctxt;
2582*495ae853SAndroid Build Coastguard Worker     isvce_bs_ctxt_t *ps_bs = &(ps_deblk->s_bs_ctxt);
2583*495ae853SAndroid Build Coastguard Worker     svc_au_data_t *ps_cur_mv_buf = ps_proc->ps_cur_mv_buf;
2584*495ae853SAndroid Build Coastguard Worker 
2585*495ae853SAndroid Build Coastguard Worker     i4_mb_x = ps_proc->i4_mb_x;
2586*495ae853SAndroid Build Coastguard Worker     i4_mb_y = ps_proc->i4_mb_y;
2587*495ae853SAndroid Build Coastguard Worker 
2588*495ae853SAndroid Build Coastguard Worker     ASSERT((ps_codec->s_cfg.u4_wd - ps_codec->s_cfg.u4_disp_wd) == 0);
2589*495ae853SAndroid Build Coastguard Worker     ASSERT((ps_codec->s_cfg.u4_ht - ps_codec->s_cfg.u4_disp_ht) == 0);
2590*495ae853SAndroid Build Coastguard Worker 
2591*495ae853SAndroid Build Coastguard Worker     ps_proc->i4_nmb_ntrpy = ps_proc->i4_wd_mbs;
2592*495ae853SAndroid Build Coastguard Worker     ps_proc->u4_nmb_me = 1;
2593*495ae853SAndroid Build Coastguard Worker 
2594*495ae853SAndroid Build Coastguard Worker     ps_proc->s_src_buf_props = ps_proc->s_src_pic_buf_props;
2595*495ae853SAndroid Build Coastguard Worker     ps_proc->s_rec_buf_props = ps_proc->s_rec_pic_buf_props;
2596*495ae853SAndroid Build Coastguard Worker     ps_proc->as_ref_buf_props[0] = ps_proc->as_ref_pic_buf_props[0];
2597*495ae853SAndroid Build Coastguard Worker     ps_proc->as_ref_buf_props[1] = ps_proc->as_ref_pic_buf_props[1];
2598*495ae853SAndroid Build Coastguard Worker 
2599*495ae853SAndroid Build Coastguard Worker     ps_proc->s_src_buf_props.as_component_bufs[0].pv_data =
2600*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->s_src_buf_props.as_component_bufs[0].pv_data) + (i4_mb_x * MB_SIZE) +
2601*495ae853SAndroid Build Coastguard Worker         ps_proc->s_src_buf_props.as_component_bufs[0].i4_data_stride * (i4_mb_y * MB_SIZE);
2602*495ae853SAndroid Build Coastguard Worker     ps_proc->s_src_buf_props.as_component_bufs[1].pv_data =
2603*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->s_src_pic_buf_props.as_component_bufs[1].pv_data) +
2604*495ae853SAndroid Build Coastguard Worker         (i4_mb_x * MB_SIZE) +
2605*495ae853SAndroid Build Coastguard Worker         ps_proc->s_src_buf_props.as_component_bufs[1].i4_data_stride * (i4_mb_y * BLK8x8SIZE);
2606*495ae853SAndroid Build Coastguard Worker 
2607*495ae853SAndroid Build Coastguard Worker     ps_proc->s_rec_buf_props.as_component_bufs[0].pv_data =
2608*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->s_rec_buf_props.as_component_bufs[0].pv_data) + (i4_mb_x * MB_SIZE) +
2609*495ae853SAndroid Build Coastguard Worker         ps_proc->s_rec_buf_props.as_component_bufs[0].i4_data_stride * (i4_mb_y * MB_SIZE);
2610*495ae853SAndroid Build Coastguard Worker     ps_proc->s_rec_buf_props.as_component_bufs[1].pv_data =
2611*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->s_rec_buf_props.as_component_bufs[1].pv_data) + (i4_mb_x * MB_SIZE) +
2612*495ae853SAndroid Build Coastguard Worker         ps_proc->s_rec_buf_props.as_component_bufs[1].i4_data_stride * (i4_mb_y * BLK8x8SIZE);
2613*495ae853SAndroid Build Coastguard Worker 
2614*495ae853SAndroid Build Coastguard Worker     ps_proc->as_ref_buf_props[0].as_component_bufs[0].pv_data =
2615*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->as_ref_buf_props[0].as_component_bufs[0].pv_data) +
2616*495ae853SAndroid Build Coastguard Worker         (i4_mb_x * MB_SIZE) +
2617*495ae853SAndroid Build Coastguard Worker         ps_proc->as_ref_buf_props[0].as_component_bufs[0].i4_data_stride * (i4_mb_y * MB_SIZE);
2618*495ae853SAndroid Build Coastguard Worker     ps_proc->as_ref_buf_props[0].as_component_bufs[1].pv_data =
2619*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->as_ref_buf_props[0].as_component_bufs[1].pv_data) +
2620*495ae853SAndroid Build Coastguard Worker         (i4_mb_x * MB_SIZE) +
2621*495ae853SAndroid Build Coastguard Worker         ps_proc->as_ref_buf_props[0].as_component_bufs[1].i4_data_stride * (i4_mb_y * BLK8x8SIZE);
2622*495ae853SAndroid Build Coastguard Worker 
2623*495ae853SAndroid Build Coastguard Worker     ps_proc->as_ref_buf_props[1].as_component_bufs[0].pv_data =
2624*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->as_ref_buf_props[1].as_component_bufs[0].pv_data) +
2625*495ae853SAndroid Build Coastguard Worker         (i4_mb_x * MB_SIZE) +
2626*495ae853SAndroid Build Coastguard Worker         ps_proc->as_ref_buf_props[1].as_component_bufs[0].i4_data_stride * (i4_mb_y * MB_SIZE);
2627*495ae853SAndroid Build Coastguard Worker     ps_proc->as_ref_buf_props[1].as_component_bufs[1].pv_data =
2628*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->as_ref_buf_props[1].as_component_bufs[1].pv_data) +
2629*495ae853SAndroid Build Coastguard Worker         (i4_mb_x * MB_SIZE) +
2630*495ae853SAndroid Build Coastguard Worker         ps_proc->as_ref_buf_props[1].as_component_bufs[1].i4_data_stride * (i4_mb_y * BLK8x8SIZE);
2631*495ae853SAndroid Build Coastguard Worker 
2632*495ae853SAndroid Build Coastguard Worker     ps_proc->pv_mb_coeff_data =
2633*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->pv_pic_mb_coeff_data) + i4_mb_y * ps_codec->u4_size_coeff_data;
2634*495ae853SAndroid Build Coastguard Worker 
2635*495ae853SAndroid Build Coastguard Worker     ps_proc->pv_mb_header_data =
2636*495ae853SAndroid Build Coastguard Worker         ((UWORD8 *) ps_proc->pv_pic_mb_header_data) + i4_mb_y * ps_codec->u4_size_header_data;
2637*495ae853SAndroid Build Coastguard Worker 
2638*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];
2639*495ae853SAndroid Build Coastguard Worker 
2640*495ae853SAndroid Build Coastguard Worker     ps_proc->ps_mb_info =
2641*495ae853SAndroid Build Coastguard Worker         ps_cur_mv_buf->ps_svc_layer_data[ps_proc->u1_spatial_layer_id].ps_mb_info +
2642*495ae853SAndroid Build Coastguard Worker         i4_mb_y * ps_proc->i4_wd_mbs;
2643*495ae853SAndroid Build Coastguard Worker 
2644*495ae853SAndroid Build Coastguard Worker     ps_proc->ps_col_mb =
2645*495ae853SAndroid Build Coastguard Worker         ps_proc->aps_mv_buf[1]->ps_svc_layer_data[ps_proc->u1_spatial_layer_id].ps_mb_info +
2646*495ae853SAndroid Build Coastguard Worker         i4_mb_y * ps_proc->i4_wd_mbs;
2647*495ae853SAndroid Build Coastguard Worker 
2648*495ae853SAndroid Build Coastguard Worker     {
2649*495ae853SAndroid Build Coastguard Worker         ps_proc->s_nbr_info.ps_top_row_mb_info =
2650*495ae853SAndroid Build Coastguard Worker             ps_proc->s_nbr_info_base.ps_layer_nbr_info[ps_proc->u1_spatial_layer_id]
2651*495ae853SAndroid Build Coastguard Worker                 .ps_top_row_mb_info +
2652*495ae853SAndroid Build Coastguard Worker             (i4_mb_x + (i4_mb_y - 1) * ps_proc->i4_wd_mbs);
2653*495ae853SAndroid Build Coastguard Worker 
2654*495ae853SAndroid Build Coastguard Worker         ps_proc->s_nbr_info.ps_top_mb_intra_modes =
2655*495ae853SAndroid Build Coastguard Worker             ps_proc->s_nbr_info_base.ps_layer_nbr_info[ps_proc->u1_spatial_layer_id]
2656*495ae853SAndroid Build Coastguard Worker                 .ps_top_mb_intra_modes +
2657*495ae853SAndroid Build Coastguard Worker             (i4_mb_x + (i4_mb_y - 1) * ps_proc->i4_wd_mbs);
2658*495ae853SAndroid Build Coastguard Worker     }
2659*495ae853SAndroid Build Coastguard Worker 
2660*495ae853SAndroid Build Coastguard Worker     ps_proc->pu4_mb_pu_cnt =
2661*495ae853SAndroid Build Coastguard Worker         ps_cur_mv_buf->ps_svc_layer_data[ps_proc->u1_spatial_layer_id].pu4_num_pus_in_mb +
2662*495ae853SAndroid Build Coastguard Worker         (i4_mb_y * ps_proc->i4_wd_mbs);
2663*495ae853SAndroid Build Coastguard Worker 
2664*495ae853SAndroid Build Coastguard Worker     ps_proc->ps_mb_info->u2_mb_type = I16x16;
2665*495ae853SAndroid Build Coastguard Worker 
2666*495ae853SAndroid Build Coastguard Worker     ps_proc->u4_lambda = gu1_qp0[ps_qp_params->u1_mb_qp];
2667*495ae853SAndroid Build Coastguard Worker 
2668*495ae853SAndroid Build Coastguard Worker     ps_proc->i4_mb_distortion = SHRT_MAX;
2669*495ae853SAndroid Build Coastguard Worker 
2670*495ae853SAndroid Build Coastguard Worker     if(i4_mb_x == 0)
2671*495ae853SAndroid Build Coastguard Worker     {
2672*495ae853SAndroid Build Coastguard Worker         ps_proc->s_nbr_info.ps_left_mb_info[0].i4_mb_distortion = 0;
2673*495ae853SAndroid Build Coastguard Worker     }
2674*495ae853SAndroid Build Coastguard Worker 
2675*495ae853SAndroid Build Coastguard Worker     ps_proc->i4_mb_cost = INT_MAX;
2676*495ae853SAndroid Build Coastguard Worker 
2677*495ae853SAndroid Build Coastguard Worker     ps_deblk->i4_mb_x = ps_proc->i4_mb_x;
2678*495ae853SAndroid Build Coastguard Worker     /* deblk lags the current mb proc by 1 row */
2679*495ae853SAndroid Build Coastguard Worker     /* NOTE: Intra prediction has to happen with non deblocked samples used as
2680*495ae853SAndroid Build Coastguard Worker      * reference */
2681*495ae853SAndroid Build Coastguard Worker     /* Hence to deblk MB 0 of row 0, you have wait till MB 0 of row 1 is encoded.
2682*495ae853SAndroid Build Coastguard Worker      */
2683*495ae853SAndroid Build Coastguard Worker     /* For simplicity, we chose to lag deblking by 1 Row wrt to proc */
2684*495ae853SAndroid Build Coastguard Worker     ps_deblk->i4_mb_y = ps_proc->i4_mb_y - 1;
2685*495ae853SAndroid Build Coastguard Worker 
2686*495ae853SAndroid Build Coastguard Worker     ps_deblk->s_rec_pic_buf_props = ps_proc->s_rec_pic_buf_props;
2687*495ae853SAndroid Build Coastguard Worker 
2688*495ae853SAndroid Build Coastguard Worker     ps_bs->i4_mb_x = ps_proc->i4_mb_x;
2689*495ae853SAndroid Build Coastguard Worker     ps_bs->i4_mb_y = ps_proc->i4_mb_y;
2690*495ae853SAndroid Build Coastguard Worker 
2691*495ae853SAndroid Build Coastguard Worker     ps_n_mb_ctxt->i4_mb_x = 0;
2692*495ae853SAndroid Build Coastguard Worker     ps_n_mb_ctxt->i4_mb_y = ps_deblk->i4_mb_y;
2693*495ae853SAndroid Build Coastguard Worker     ps_n_mb_ctxt->i4_n_mbs = ps_proc->i4_nmb_ntrpy;
2694*495ae853SAndroid Build Coastguard Worker 
2695*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
2696*495ae853SAndroid Build Coastguard Worker }
2697*495ae853SAndroid Build Coastguard Worker 
2698*495ae853SAndroid Build Coastguard Worker /**
2699*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2700*495ae853SAndroid Build Coastguard Worker *
2701*495ae853SAndroid Build Coastguard Worker * @brief
2702*495ae853SAndroid Build Coastguard Worker *  Returns size of buffers for storing SVC ILP data
2703*495ae853SAndroid Build Coastguard Worker *
2704*495ae853SAndroid Build Coastguard Worker * @param[in] u1_num_spatial_layers
2705*495ae853SAndroid Build Coastguard Worker *  Num Spatial Layers
2706*495ae853SAndroid Build Coastguard Worker *
2707*495ae853SAndroid Build Coastguard Worker * @param[in] d_spatial_res_ratio
2708*495ae853SAndroid Build Coastguard Worker *  Resolution Ratio b/w spatial layers
2709*495ae853SAndroid Build Coastguard Worker *
2710*495ae853SAndroid Build Coastguard Worker * @param[in] u4_wd
2711*495ae853SAndroid Build Coastguard Worker *  Input Width
2712*495ae853SAndroid Build Coastguard Worker *
2713*495ae853SAndroid Build Coastguard Worker * @param[in] u4_ht
2714*495ae853SAndroid Build Coastguard Worker *  Input Height
2715*495ae853SAndroid Build Coastguard Worker *
2716*495ae853SAndroid Build Coastguard Worker * @returns  Size of buffers
2717*495ae853SAndroid Build Coastguard Worker *
2718*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2719*495ae853SAndroid Build Coastguard Worker */
isvce_get_svc_ilp_buf_size(UWORD8 u1_num_spatial_layers,DOUBLE d_spatial_res_ratio,UWORD32 u4_wd,UWORD32 u4_ht)2720*495ae853SAndroid Build Coastguard Worker UWORD32 isvce_get_svc_ilp_buf_size(UWORD8 u1_num_spatial_layers, DOUBLE d_spatial_res_ratio,
2721*495ae853SAndroid Build Coastguard Worker                                    UWORD32 u4_wd, UWORD32 u4_ht)
2722*495ae853SAndroid Build Coastguard Worker {
2723*495ae853SAndroid Build Coastguard Worker     WORD32 i;
2724*495ae853SAndroid Build Coastguard Worker 
2725*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_size = 0;
2726*495ae853SAndroid Build Coastguard Worker 
2727*495ae853SAndroid Build Coastguard Worker     if(u1_num_spatial_layers > 1)
2728*495ae853SAndroid Build Coastguard Worker     {
2729*495ae853SAndroid Build Coastguard Worker         /* ps_intra_recon_bufs */
2730*495ae853SAndroid Build Coastguard Worker         u4_size += u1_num_spatial_layers * sizeof(yuv_buf_props_t);
2731*495ae853SAndroid Build Coastguard Worker 
2732*495ae853SAndroid Build Coastguard Worker         /* ps_residual_bufs */
2733*495ae853SAndroid Build Coastguard Worker         u4_size += u1_num_spatial_layers * sizeof(yuv_buf_props_t);
2734*495ae853SAndroid Build Coastguard Worker 
2735*495ae853SAndroid Build Coastguard Worker         /* aps_layer_resampler_props[Y] */
2736*495ae853SAndroid Build Coastguard Worker         u4_size += u1_num_spatial_layers * sizeof(layer_resampler_props_t);
2737*495ae853SAndroid Build Coastguard Worker 
2738*495ae853SAndroid Build Coastguard Worker         /* aps_layer_resampler_props[UV] */
2739*495ae853SAndroid Build Coastguard Worker         u4_size += u1_num_spatial_layers * sizeof(layer_resampler_props_t);
2740*495ae853SAndroid Build Coastguard Worker 
2741*495ae853SAndroid Build Coastguard Worker         for(i = u1_num_spatial_layers - 1; i >= 0; i--)
2742*495ae853SAndroid Build Coastguard Worker         {
2743*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_wd =
2744*495ae853SAndroid Build Coastguard Worker                 ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
2745*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_ht =
2746*495ae853SAndroid Build Coastguard Worker                 ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
2747*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_samples =
2748*495ae853SAndroid Build Coastguard Worker                 (ALIGN16(i4_layer_luma_wd) + PAD_WD) * (i4_layer_luma_ht + PAD_HT);
2749*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_wd = i4_layer_luma_wd;
2750*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_ht = i4_layer_luma_ht / 2.0 + 0.99;
2751*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_samples =
2752*495ae853SAndroid Build Coastguard Worker                 (ALIGN16(i4_layer_uv_wd) + PAD_WD) * (i4_layer_uv_ht + PAD_HT);
2753*495ae853SAndroid Build Coastguard Worker 
2754*495ae853SAndroid Build Coastguard Worker             /* ps_intra_recon_bufs */
2755*495ae853SAndroid Build Coastguard Worker             u4_size += (i4_layer_luma_samples + i4_layer_uv_samples) * sizeof(UWORD8);
2756*495ae853SAndroid Build Coastguard Worker 
2757*495ae853SAndroid Build Coastguard Worker             /* ps_residual_bufs */
2758*495ae853SAndroid Build Coastguard Worker             u4_size += (i4_layer_luma_samples + i4_layer_uv_samples) * sizeof(WORD16);
2759*495ae853SAndroid Build Coastguard Worker         }
2760*495ae853SAndroid Build Coastguard Worker     }
2761*495ae853SAndroid Build Coastguard Worker     else
2762*495ae853SAndroid Build Coastguard Worker     {
2763*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_wd = u4_wd;
2764*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_ht = u4_ht;
2765*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_samples =
2766*495ae853SAndroid Build Coastguard Worker             (ALIGN16(i4_layer_luma_wd) + PAD_WD) * (i4_layer_luma_ht + PAD_HT);
2767*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_uv_wd = i4_layer_luma_wd;
2768*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_uv_ht = i4_layer_luma_ht / 2.0 + 0.99;
2769*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_uv_samples = (ALIGN16(i4_layer_uv_wd) + PAD_WD) * (i4_layer_uv_ht + PAD_HT);
2770*495ae853SAndroid Build Coastguard Worker 
2771*495ae853SAndroid Build Coastguard Worker         /* ps_residual_bufs */
2772*495ae853SAndroid Build Coastguard Worker         u4_size += sizeof(yuv_buf_props_t);
2773*495ae853SAndroid Build Coastguard Worker 
2774*495ae853SAndroid Build Coastguard Worker         /* ps_residual_bufs */
2775*495ae853SAndroid Build Coastguard Worker         u4_size += (i4_layer_luma_samples + i4_layer_uv_samples) * sizeof(WORD16);
2776*495ae853SAndroid Build Coastguard Worker     }
2777*495ae853SAndroid Build Coastguard Worker 
2778*495ae853SAndroid Build Coastguard Worker     return u4_size;
2779*495ae853SAndroid Build Coastguard Worker }
2780*495ae853SAndroid Build Coastguard Worker 
isvce_layer_resampler_props_init(layer_resampler_props_t * ps_layer_props,DOUBLE d_spatial_res_ratio,UWORD32 u4_wd,UWORD32 u4_ht,UWORD8 u1_level_idc,UWORD8 u1_is_chroma)2781*495ae853SAndroid Build Coastguard Worker static void isvce_layer_resampler_props_init(layer_resampler_props_t *ps_layer_props,
2782*495ae853SAndroid Build Coastguard Worker                                              DOUBLE d_spatial_res_ratio, UWORD32 u4_wd,
2783*495ae853SAndroid Build Coastguard Worker                                              UWORD32 u4_ht, UWORD8 u1_level_idc,
2784*495ae853SAndroid Build Coastguard Worker                                              UWORD8 u1_is_chroma)
2785*495ae853SAndroid Build Coastguard Worker {
2786*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_ref_layer_field_pic_flag = 0;
2787*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_field_pic_flag = 0;
2788*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_frame_mbs_only_flag = 1;
2789*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_ref_layer_frame_mbs_only_flag = 1;
2790*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_bot_field_flag = 0;
2791*495ae853SAndroid Build Coastguard Worker     const WORD32 i4_scaled_ref_layer_left_offset = 0;
2792*495ae853SAndroid Build Coastguard Worker     const WORD32 i4_scaled_ref_layer_top_offset = 0;
2793*495ae853SAndroid Build Coastguard Worker     const WORD32 i4_ref_layer_chroma_phase_x_plus1 = 1;
2794*495ae853SAndroid Build Coastguard Worker     const WORD32 i4_ref_layer_chroma_phase_y_plus1 = 1;
2795*495ae853SAndroid Build Coastguard Worker     const WORD32 i4_chroma_phase_x_plus1 = 1;
2796*495ae853SAndroid Build Coastguard Worker     const WORD32 i4_chroma_phase_y_plus1 = 1;
2797*495ae853SAndroid Build Coastguard Worker     const WORD32 i4_sub_wd_chroma = 2;
2798*495ae853SAndroid Build Coastguard Worker     const WORD32 i4_sub_ht_chroma = 2;
2799*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ref_wd = (u4_wd / d_spatial_res_ratio);
2800*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ref_ht = (u4_ht / d_spatial_res_ratio) * (1 + u1_ref_layer_field_pic_flag);
2801*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_scaled_wd = u4_wd;
2802*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_scaled_ht = u4_ht * (1 + u1_field_pic_flag);
2803*495ae853SAndroid Build Coastguard Worker 
2804*495ae853SAndroid Build Coastguard Worker     u4_ref_wd = u4_ref_wd >> u1_is_chroma;
2805*495ae853SAndroid Build Coastguard Worker     u4_ref_ht = u4_ref_ht >> u1_is_chroma;
2806*495ae853SAndroid Build Coastguard Worker     u4_scaled_wd = u4_scaled_wd >> u1_is_chroma;
2807*495ae853SAndroid Build Coastguard Worker     u4_scaled_ht = u4_scaled_ht >> u1_is_chroma;
2808*495ae853SAndroid Build Coastguard Worker 
2809*495ae853SAndroid Build Coastguard Worker     if(u1_is_chroma)
2810*495ae853SAndroid Build Coastguard Worker     {
2811*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_refphase_x = i4_ref_layer_chroma_phase_x_plus1 - 1;
2812*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_refphase_y = i4_ref_layer_chroma_phase_y_plus1 - 1;
2813*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_phase_x = i4_chroma_phase_x_plus1 - 1;
2814*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_phase_y = i4_chroma_phase_y_plus1 - 1;
2815*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_sub_wd = i4_sub_wd_chroma;
2816*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_sub_ht = i4_sub_ht_chroma;
2817*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_mb_wd = MB_SIZE >> 1;
2818*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_mb_ht = MB_SIZE >> 1;
2819*495ae853SAndroid Build Coastguard Worker     }
2820*495ae853SAndroid Build Coastguard Worker     else
2821*495ae853SAndroid Build Coastguard Worker     {
2822*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_refphase_x = 0;
2823*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_refphase_y = 0;
2824*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_phase_x = 0;
2825*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_phase_y = 0;
2826*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_sub_wd = 1;
2827*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_sub_ht = 1;
2828*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_mb_wd = MB_SIZE;
2829*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_mb_ht = MB_SIZE;
2830*495ae853SAndroid Build Coastguard Worker     }
2831*495ae853SAndroid Build Coastguard Worker 
2832*495ae853SAndroid Build Coastguard Worker     if(u1_level_idc <= 30)
2833*495ae853SAndroid Build Coastguard Worker     {
2834*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_shift_x = 16;
2835*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_shift_y = 16;
2836*495ae853SAndroid Build Coastguard Worker     }
2837*495ae853SAndroid Build Coastguard Worker     else
2838*495ae853SAndroid Build Coastguard Worker     {
2839*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_shift_x = 31 - isvcd_get_ceil_log2(u4_ref_wd);
2840*495ae853SAndroid Build Coastguard Worker         ps_layer_props->u4_shift_y = 31 - isvcd_get_ceil_log2(u4_ref_ht);
2841*495ae853SAndroid Build Coastguard Worker     }
2842*495ae853SAndroid Build Coastguard Worker 
2843*495ae853SAndroid Build Coastguard Worker     if((0 == u1_frame_mbs_only_flag) || (0 == u1_ref_layer_frame_mbs_only_flag))
2844*495ae853SAndroid Build Coastguard Worker     {
2845*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_phase_y = ps_layer_props->i4_phase_y + 4 * u1_bot_field_flag;
2846*495ae853SAndroid Build Coastguard Worker 
2847*495ae853SAndroid Build Coastguard Worker         if(1 == u1_ref_layer_frame_mbs_only_flag)
2848*495ae853SAndroid Build Coastguard Worker         {
2849*495ae853SAndroid Build Coastguard Worker             ps_layer_props->i4_refphase_y = (2 * ps_layer_props->i4_refphase_y) + 2;
2850*495ae853SAndroid Build Coastguard Worker         }
2851*495ae853SAndroid Build Coastguard Worker         else
2852*495ae853SAndroid Build Coastguard Worker         {
2853*495ae853SAndroid Build Coastguard Worker             ps_layer_props->i4_refphase_y = ps_layer_props->i4_refphase_y + (4 * u1_bot_field_flag);
2854*495ae853SAndroid Build Coastguard Worker         }
2855*495ae853SAndroid Build Coastguard Worker     }
2856*495ae853SAndroid Build Coastguard Worker 
2857*495ae853SAndroid Build Coastguard Worker     ps_layer_props->u4_scale_x =
2858*495ae853SAndroid Build Coastguard Worker         ((u4_ref_wd << ps_layer_props->u4_shift_x) + (u4_scaled_wd >> 1)) / (u4_scaled_wd);
2859*495ae853SAndroid Build Coastguard Worker     ps_layer_props->u4_scale_y =
2860*495ae853SAndroid Build Coastguard Worker         ((u4_ref_ht << ps_layer_props->u4_shift_y) + (u4_scaled_ht >> 1)) / (u4_scaled_ht);
2861*495ae853SAndroid Build Coastguard Worker 
2862*495ae853SAndroid Build Coastguard Worker     ps_layer_props->i4_offset_x = i4_scaled_ref_layer_left_offset / ps_layer_props->u4_sub_wd;
2863*495ae853SAndroid Build Coastguard Worker     ps_layer_props->i4_add_x =
2864*495ae853SAndroid Build Coastguard Worker         (((u4_ref_wd * (2 + ps_layer_props->i4_phase_x)) << (ps_layer_props->u4_shift_x - 2)) +
2865*495ae853SAndroid Build Coastguard Worker          (u4_scaled_wd >> 1)) /
2866*495ae853SAndroid Build Coastguard Worker             u4_scaled_wd +
2867*495ae853SAndroid Build Coastguard Worker         (1 << (ps_layer_props->u4_shift_x - 5));
2868*495ae853SAndroid Build Coastguard Worker     ps_layer_props->i4_delta_x = 4 * (2 + ps_layer_props->i4_refphase_x);
2869*495ae853SAndroid Build Coastguard Worker 
2870*495ae853SAndroid Build Coastguard Worker     if((1 == u1_frame_mbs_only_flag) && (1 == u1_ref_layer_frame_mbs_only_flag))
2871*495ae853SAndroid Build Coastguard Worker     {
2872*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_offset_y = i4_scaled_ref_layer_top_offset / ps_layer_props->u4_sub_ht;
2873*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_add_y =
2874*495ae853SAndroid Build Coastguard Worker             (((u4_ref_ht * (2 + ps_layer_props->i4_phase_y)) << (ps_layer_props->u4_shift_y - 2)) +
2875*495ae853SAndroid Build Coastguard Worker              (u4_scaled_ht >> 1)) /
2876*495ae853SAndroid Build Coastguard Worker                 u4_scaled_ht +
2877*495ae853SAndroid Build Coastguard Worker             (1 << (ps_layer_props->u4_shift_y - 5));
2878*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_delta_y = 4 * (2 + ps_layer_props->i4_refphase_y);
2879*495ae853SAndroid Build Coastguard Worker     }
2880*495ae853SAndroid Build Coastguard Worker     else
2881*495ae853SAndroid Build Coastguard Worker     {
2882*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_offset_y =
2883*495ae853SAndroid Build Coastguard Worker             i4_scaled_ref_layer_top_offset / (2 * ps_layer_props->u4_sub_ht);
2884*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_add_y =
2885*495ae853SAndroid Build Coastguard Worker             (((u4_ref_ht * (2 + ps_layer_props->i4_phase_y)) << (ps_layer_props->u4_shift_y - 3)) +
2886*495ae853SAndroid Build Coastguard Worker              (u4_scaled_ht >> 1)) /
2887*495ae853SAndroid Build Coastguard Worker                 u4_scaled_ht +
2888*495ae853SAndroid Build Coastguard Worker             (1 << (ps_layer_props->u4_shift_y - 5));
2889*495ae853SAndroid Build Coastguard Worker         ps_layer_props->i4_delta_y = 2 * (2 + ps_layer_props->i4_refphase_y);
2890*495ae853SAndroid Build Coastguard Worker     }
2891*495ae853SAndroid Build Coastguard Worker }
2892*495ae853SAndroid Build Coastguard Worker 
2893*495ae853SAndroid Build Coastguard Worker /**
2894*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2895*495ae853SAndroid Build Coastguard Worker *
2896*495ae853SAndroid Build Coastguard Worker * @brief
2897*495ae853SAndroid Build Coastguard Worker *  Function to initialize svc ilp buffers
2898*495ae853SAndroid Build Coastguard Worker *
2899*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
2900*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
2901*495ae853SAndroid Build Coastguard Worker *
2902*495ae853SAndroid Build Coastguard Worker * @param[in] ps_mem_rec
2903*495ae853SAndroid Build Coastguard Worker *  Pointer to memory allocated for input buffers
2904*495ae853SAndroid Build Coastguard Worker *
2905*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2906*495ae853SAndroid Build Coastguard Worker */
isvce_svc_ilp_buf_init(isvce_codec_t * ps_codec,iv_mem_rec_t * ps_mem_rec)2907*495ae853SAndroid Build Coastguard Worker void isvce_svc_ilp_buf_init(isvce_codec_t *ps_codec, iv_mem_rec_t *ps_mem_rec)
2908*495ae853SAndroid Build Coastguard Worker {
2909*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_spatial_layers = ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers;
2910*495ae853SAndroid Build Coastguard Worker     DOUBLE d_spatial_res_ratio = ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio;
2911*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_wd = ps_codec->s_cfg.u4_wd;
2912*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ht = ps_codec->s_cfg.u4_ht;
2913*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf = ps_mem_rec->pv_base;
2914*495ae853SAndroid Build Coastguard Worker     WORD64 i8_alloc_mem_size =
2915*495ae853SAndroid Build Coastguard Worker         isvce_get_svc_ilp_buf_size(u1_num_spatial_layers, d_spatial_res_ratio, u4_wd, u4_ht);
2916*495ae853SAndroid Build Coastguard Worker 
2917*495ae853SAndroid Build Coastguard Worker     if(u1_num_spatial_layers > 1)
2918*495ae853SAndroid Build Coastguard Worker     {
2919*495ae853SAndroid Build Coastguard Worker         WORD32 i, j;
2920*495ae853SAndroid Build Coastguard Worker 
2921*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_intra_recon_bufs = (yuv_buf_props_t *) pu1_buf;
2922*495ae853SAndroid Build Coastguard Worker         pu1_buf += u1_num_spatial_layers * sizeof(ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[0]);
2923*495ae853SAndroid Build Coastguard Worker         i8_alloc_mem_size -=
2924*495ae853SAndroid Build Coastguard Worker             u1_num_spatial_layers * sizeof(ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[0]);
2925*495ae853SAndroid Build Coastguard Worker 
2926*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs = (yuv_buf_props_t *) pu1_buf;
2927*495ae853SAndroid Build Coastguard Worker         pu1_buf += u1_num_spatial_layers * sizeof(ps_codec->s_svc_ilp_data.ps_residual_bufs[0]);
2928*495ae853SAndroid Build Coastguard Worker         i8_alloc_mem_size -=
2929*495ae853SAndroid Build Coastguard Worker             u1_num_spatial_layers * sizeof(ps_codec->s_svc_ilp_data.ps_residual_bufs[0]);
2930*495ae853SAndroid Build Coastguard Worker 
2931*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < NUM_SP_COMPONENTS; i++)
2932*495ae853SAndroid Build Coastguard Worker         {
2933*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.aps_layer_resampler_props[i] =
2934*495ae853SAndroid Build Coastguard Worker                 (layer_resampler_props_t *) pu1_buf;
2935*495ae853SAndroid Build Coastguard Worker             pu1_buf += u1_num_spatial_layers *
2936*495ae853SAndroid Build Coastguard Worker                        sizeof(ps_codec->s_svc_ilp_data.aps_layer_resampler_props[i][0]);
2937*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= u1_num_spatial_layers *
2938*495ae853SAndroid Build Coastguard Worker                                  sizeof(ps_codec->s_svc_ilp_data.aps_layer_resampler_props[i][0]);
2939*495ae853SAndroid Build Coastguard Worker         }
2940*495ae853SAndroid Build Coastguard Worker 
2941*495ae853SAndroid Build Coastguard Worker         ASSERT(i8_alloc_mem_size >= 0);
2942*495ae853SAndroid Build Coastguard Worker 
2943*495ae853SAndroid Build Coastguard Worker         for(i = u1_num_spatial_layers - 1; i >= 0; i--)
2944*495ae853SAndroid Build Coastguard Worker         {
2945*495ae853SAndroid Build Coastguard Worker             WORD32 i4_stride;
2946*495ae853SAndroid Build Coastguard Worker 
2947*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_wd =
2948*495ae853SAndroid Build Coastguard Worker                 ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
2949*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_ht =
2950*495ae853SAndroid Build Coastguard Worker                 ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
2951*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_samples =
2952*495ae853SAndroid Build Coastguard Worker                 (ALIGN16(i4_layer_luma_wd) + PAD_WD) * (i4_layer_luma_ht + PAD_HT);
2953*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_wd = i4_layer_luma_wd;
2954*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_ht = i4_layer_luma_ht / 2.0 + 0.99;
2955*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_uv_samples =
2956*495ae853SAndroid Build Coastguard Worker                 (ALIGN16(i4_layer_uv_wd) + PAD_WD) * (i4_layer_uv_ht + PAD_HT);
2957*495ae853SAndroid Build Coastguard Worker 
2958*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[i].u4_width = i4_layer_luma_wd;
2959*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[i].u4_height = i4_layer_luma_ht;
2960*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[i].e_color_format = IV_YUV_420SP_UV;
2961*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[i].u1_bit_depth = 8;
2962*495ae853SAndroid Build Coastguard Worker 
2963*495ae853SAndroid Build Coastguard Worker             i4_stride = ALIGN16(i4_layer_luma_wd) + PAD_WD;
2964*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[i].as_component_bufs[Y].pv_data =
2965*495ae853SAndroid Build Coastguard Worker                 pu1_buf + PAD_LEFT + PAD_TOP * i4_stride;
2966*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[i].as_component_bufs[Y].i4_data_stride =
2967*495ae853SAndroid Build Coastguard Worker                 ALIGN16(i4_layer_luma_wd) + PAD_WD;
2968*495ae853SAndroid Build Coastguard Worker             pu1_buf += i4_layer_luma_samples * sizeof(UWORD8);
2969*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= i4_layer_luma_samples * sizeof(UWORD8);
2970*495ae853SAndroid Build Coastguard Worker 
2971*495ae853SAndroid Build Coastguard Worker             i4_stride = ALIGN16(i4_layer_uv_wd) + PAD_WD;
2972*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[i].as_component_bufs[UV].pv_data =
2973*495ae853SAndroid Build Coastguard Worker                 pu1_buf + PAD_LEFT + PAD_TOP * i4_stride;
2974*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[i].as_component_bufs[UV].i4_data_stride =
2975*495ae853SAndroid Build Coastguard Worker                 ALIGN16(i4_layer_uv_wd) + PAD_WD;
2976*495ae853SAndroid Build Coastguard Worker             pu1_buf += i4_layer_uv_samples * sizeof(UWORD8);
2977*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= i4_layer_uv_samples * sizeof(UWORD8);
2978*495ae853SAndroid Build Coastguard Worker 
2979*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_residual_bufs[i].u4_width = i4_layer_luma_wd;
2980*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_residual_bufs[i].u4_height = i4_layer_luma_ht;
2981*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_residual_bufs[i].e_color_format = IV_YUV_420SP_UV;
2982*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_residual_bufs[i].u1_bit_depth = 10;
2983*495ae853SAndroid Build Coastguard Worker 
2984*495ae853SAndroid Build Coastguard Worker             i4_stride = ALIGN16(i4_layer_luma_wd) + PAD_WD;
2985*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_residual_bufs[i].as_component_bufs[Y].pv_data =
2986*495ae853SAndroid Build Coastguard Worker                 pu1_buf + (PAD_LEFT + PAD_TOP * i4_stride) * (sizeof(WORD16) / sizeof(pu1_buf[0]));
2987*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_residual_bufs[i].as_component_bufs[Y].i4_data_stride =
2988*495ae853SAndroid Build Coastguard Worker                 i4_stride;
2989*495ae853SAndroid Build Coastguard Worker             pu1_buf += i4_layer_luma_samples * sizeof(WORD16);
2990*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= i4_layer_luma_samples * sizeof(WORD16);
2991*495ae853SAndroid Build Coastguard Worker 
2992*495ae853SAndroid Build Coastguard Worker             i4_stride = ALIGN16(i4_layer_uv_wd) + PAD_WD;
2993*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_residual_bufs[i].as_component_bufs[UV].pv_data =
2994*495ae853SAndroid Build Coastguard Worker                 pu1_buf + (PAD_LEFT + PAD_TOP * i4_stride) * (sizeof(WORD16) / sizeof(pu1_buf[0]));
2995*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_residual_bufs[i].as_component_bufs[UV].i4_data_stride =
2996*495ae853SAndroid Build Coastguard Worker                 i4_stride;
2997*495ae853SAndroid Build Coastguard Worker             pu1_buf += i4_layer_uv_samples * sizeof(WORD16);
2998*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= i4_layer_uv_samples * sizeof(WORD16);
2999*495ae853SAndroid Build Coastguard Worker 
3000*495ae853SAndroid Build Coastguard Worker             ps_codec->s_svc_ilp_data.ps_residual_bufs[i].as_component_bufs[V].pv_data = NULL;
3001*495ae853SAndroid Build Coastguard Worker 
3002*495ae853SAndroid Build Coastguard Worker             ASSERT(i8_alloc_mem_size >= 0);
3003*495ae853SAndroid Build Coastguard Worker 
3004*495ae853SAndroid Build Coastguard Worker             if(i >= 1)
3005*495ae853SAndroid Build Coastguard Worker             {
3006*495ae853SAndroid Build Coastguard Worker                 for(j = 0; j < NUM_SP_COMPONENTS; j++)
3007*495ae853SAndroid Build Coastguard Worker                 {
3008*495ae853SAndroid Build Coastguard Worker                     isvce_layer_resampler_props_init(
3009*495ae853SAndroid Build Coastguard Worker                         &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[j][i],
3010*495ae853SAndroid Build Coastguard Worker                         d_spatial_res_ratio, i4_layer_luma_wd, i4_layer_luma_ht,
3011*495ae853SAndroid Build Coastguard Worker                         ps_codec->s_cfg.u4_max_level, ((COMPONENT_TYPE) j) == UV);
3012*495ae853SAndroid Build Coastguard Worker                 }
3013*495ae853SAndroid Build Coastguard Worker             }
3014*495ae853SAndroid Build Coastguard Worker         }
3015*495ae853SAndroid Build Coastguard Worker     }
3016*495ae853SAndroid Build Coastguard Worker     else
3017*495ae853SAndroid Build Coastguard Worker     {
3018*495ae853SAndroid Build Coastguard Worker         WORD32 i4_stride;
3019*495ae853SAndroid Build Coastguard Worker 
3020*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_wd = u4_wd;
3021*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_ht = u4_ht;
3022*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_luma_samples =
3023*495ae853SAndroid Build Coastguard Worker             (ALIGN16(i4_layer_luma_wd) + PAD_WD) * (i4_layer_luma_ht + PAD_HT);
3024*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_uv_wd = i4_layer_luma_wd;
3025*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_uv_ht = i4_layer_luma_ht / 2.0 + 0.99;
3026*495ae853SAndroid Build Coastguard Worker         WORD32 i4_layer_uv_samples = (ALIGN16(i4_layer_uv_wd) + PAD_WD) * (i4_layer_uv_ht + PAD_HT);
3027*495ae853SAndroid Build Coastguard Worker 
3028*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs = (yuv_buf_props_t *) pu1_buf;
3029*495ae853SAndroid Build Coastguard Worker         pu1_buf += sizeof(ps_codec->s_svc_ilp_data.ps_residual_bufs[0]);
3030*495ae853SAndroid Build Coastguard Worker         i8_alloc_mem_size -= sizeof(ps_codec->s_svc_ilp_data.ps_residual_bufs[0]);
3031*495ae853SAndroid Build Coastguard Worker 
3032*495ae853SAndroid Build Coastguard Worker         ASSERT(i8_alloc_mem_size >= 0);
3033*495ae853SAndroid Build Coastguard Worker 
3034*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs[0].u4_width = i4_layer_luma_wd;
3035*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs[0].u4_height = i4_layer_luma_ht;
3036*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs[0].e_color_format = IV_YUV_420SP_UV;
3037*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs[0].u1_bit_depth = 10;
3038*495ae853SAndroid Build Coastguard Worker 
3039*495ae853SAndroid Build Coastguard Worker         i4_stride = ALIGN16(i4_layer_luma_wd) + PAD_WD;
3040*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs[0].as_component_bufs[Y].pv_data =
3041*495ae853SAndroid Build Coastguard Worker             pu1_buf + (PAD_LEFT + PAD_TOP * i4_stride) * (sizeof(WORD16) / sizeof(pu1_buf[0]));
3042*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs[0].as_component_bufs[Y].i4_data_stride =
3043*495ae853SAndroid Build Coastguard Worker             i4_stride;
3044*495ae853SAndroid Build Coastguard Worker         pu1_buf += i4_layer_luma_samples * sizeof(WORD16);
3045*495ae853SAndroid Build Coastguard Worker         i8_alloc_mem_size -= i4_layer_luma_samples * sizeof(WORD16);
3046*495ae853SAndroid Build Coastguard Worker 
3047*495ae853SAndroid Build Coastguard Worker         i4_stride = ALIGN16(i4_layer_uv_wd) + PAD_WD;
3048*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs[0].as_component_bufs[UV].pv_data =
3049*495ae853SAndroid Build Coastguard Worker             pu1_buf + (PAD_LEFT + PAD_TOP * i4_stride) * (sizeof(WORD16) / sizeof(pu1_buf[0]));
3050*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs[0].as_component_bufs[UV].i4_data_stride =
3051*495ae853SAndroid Build Coastguard Worker             i4_stride;
3052*495ae853SAndroid Build Coastguard Worker         pu1_buf += i4_layer_uv_samples * sizeof(WORD16);
3053*495ae853SAndroid Build Coastguard Worker         i8_alloc_mem_size -= i4_layer_uv_samples * sizeof(WORD16);
3054*495ae853SAndroid Build Coastguard Worker 
3055*495ae853SAndroid Build Coastguard Worker         ps_codec->s_svc_ilp_data.ps_residual_bufs[0].as_component_bufs[V].pv_data = NULL;
3056*495ae853SAndroid Build Coastguard Worker 
3057*495ae853SAndroid Build Coastguard Worker         ASSERT(i8_alloc_mem_size >= 0);
3058*495ae853SAndroid Build Coastguard Worker     }
3059*495ae853SAndroid Build Coastguard Worker }
3060*495ae853SAndroid Build Coastguard Worker 
isvce_get_residual_csbf(mem_fxns_t * ps_mem_fxns,buffer_container_t * ps_comp_buf)3061*495ae853SAndroid Build Coastguard Worker static FORCEINLINE UWORD32 isvce_get_residual_csbf(mem_fxns_t *ps_mem_fxns,
3062*495ae853SAndroid Build Coastguard Worker                                                    buffer_container_t *ps_comp_buf)
3063*495ae853SAndroid Build Coastguard Worker {
3064*495ae853SAndroid Build Coastguard Worker     WORD32 i;
3065*495ae853SAndroid Build Coastguard Worker 
3066*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_csbf = 0;
3067*495ae853SAndroid Build Coastguard Worker 
3068*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_TU_IN_MB; i++)
3069*495ae853SAndroid Build Coastguard Worker     {
3070*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_zscan_idx = gau1_raster_to_zscan_map[i];
3071*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_offset_x = (i % MAX_TU_IN_MB_ROW) * MIN_TU_SIZE;
3072*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_offset_y = (i / MAX_TU_IN_MB_ROW) * MIN_TU_SIZE;
3073*495ae853SAndroid Build Coastguard Worker         WORD16 *pi2_res = ((WORD16 *) ps_comp_buf->pv_data) + u1_offset_x +
3074*495ae853SAndroid Build Coastguard Worker                           u1_offset_y * ps_comp_buf->i4_data_stride;
3075*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_cbf = ps_mem_fxns->pf_nonzero_checker(
3076*495ae853SAndroid Build Coastguard Worker             (UWORD8 *) pi2_res, ps_comp_buf->i4_data_stride * (sizeof(WORD16) / sizeof(UWORD8)),
3077*495ae853SAndroid Build Coastguard Worker             MIN_TU_SIZE * (sizeof(WORD16) / sizeof(UWORD8)), MIN_TU_SIZE);
3078*495ae853SAndroid Build Coastguard Worker 
3079*495ae853SAndroid Build Coastguard Worker         u4_csbf |= (u1_cbf << u1_zscan_idx);
3080*495ae853SAndroid Build Coastguard Worker     }
3081*495ae853SAndroid Build Coastguard Worker 
3082*495ae853SAndroid Build Coastguard Worker     return u4_csbf;
3083*495ae853SAndroid Build Coastguard Worker }
3084*495ae853SAndroid Build Coastguard Worker 
3085*495ae853SAndroid Build Coastguard Worker /**
3086*495ae853SAndroid Build Coastguard Worker *******************************************************************************
3087*495ae853SAndroid Build Coastguard Worker *
3088*495ae853SAndroid Build Coastguard Worker * @brief
3089*495ae853SAndroid Build Coastguard Worker *  Function to update svc ilp buffers after every MB
3090*495ae853SAndroid Build Coastguard Worker *
3091*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc
3092*495ae853SAndroid Build Coastguard Worker *  Pointer to process context
3093*495ae853SAndroid Build Coastguard Worker *
3094*495ae853SAndroid Build Coastguard Worker *******************************************************************************
3095*495ae853SAndroid Build Coastguard Worker */
isvce_svc_ilp_buf_update(isvce_process_ctxt_t * ps_proc)3096*495ae853SAndroid Build Coastguard Worker void isvce_svc_ilp_buf_update(isvce_process_ctxt_t *ps_proc)
3097*495ae853SAndroid Build Coastguard Worker {
3098*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
3099*495ae853SAndroid Build Coastguard Worker     svc_params_t *ps_svc_params = &ps_codec->s_cfg.s_svc_params;
3100*495ae853SAndroid Build Coastguard Worker 
3101*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_spatial_layer_id = ps_proc->u1_spatial_layer_id;
3102*495ae853SAndroid Build Coastguard Worker 
3103*495ae853SAndroid Build Coastguard Worker     if(ps_svc_params->u1_num_spatial_layers > 1)
3104*495ae853SAndroid Build Coastguard Worker     {
3105*495ae853SAndroid Build Coastguard Worker         buffer_container_t s_src;
3106*495ae853SAndroid Build Coastguard Worker         buffer_container_t s_dst;
3107*495ae853SAndroid Build Coastguard Worker 
3108*495ae853SAndroid Build Coastguard Worker         WORD32 i;
3109*495ae853SAndroid Build Coastguard Worker 
3110*495ae853SAndroid Build Coastguard Worker         svc_ilp_data_t *ps_svc_ilp_data = &ps_codec->s_svc_ilp_data;
3111*495ae853SAndroid Build Coastguard Worker         isa_dependent_fxns_t *ps_isa_dependent_fxns = &ps_codec->s_isa_dependent_fxns;
3112*495ae853SAndroid Build Coastguard Worker         mem_fxns_t *ps_mem_fxns = &ps_isa_dependent_fxns->s_mem_fxns;
3113*495ae853SAndroid Build Coastguard Worker         yuv_buf_props_t *ps_residual_buf =
3114*495ae853SAndroid Build Coastguard Worker             &ps_codec->s_svc_ilp_data.ps_residual_bufs[u1_spatial_layer_id];
3115*495ae853SAndroid Build Coastguard Worker 
3116*495ae853SAndroid Build Coastguard Worker         WORD32 i4_mb_x = ps_proc->i4_mb_x;
3117*495ae853SAndroid Build Coastguard Worker         WORD32 i4_mb_y = ps_proc->i4_mb_y;
3118*495ae853SAndroid Build Coastguard Worker 
3119*495ae853SAndroid Build Coastguard Worker         ASSERT(ps_proc->s_rec_buf_props.e_color_format == IV_YUV_420SP_UV);
3120*495ae853SAndroid Build Coastguard Worker 
3121*495ae853SAndroid Build Coastguard Worker         if(u1_spatial_layer_id < (ps_svc_params->u1_num_spatial_layers - 1))
3122*495ae853SAndroid Build Coastguard Worker         {
3123*495ae853SAndroid Build Coastguard Worker             if(ps_proc->ps_mb_info->u1_is_intra)
3124*495ae853SAndroid Build Coastguard Worker             {
3125*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i < NUM_SP_COMPONENTS; i++)
3126*495ae853SAndroid Build Coastguard Worker                 {
3127*495ae853SAndroid Build Coastguard Worker                     UWORD8 u1_is_chroma = (Y != ((COMPONENT_TYPE) i));
3128*495ae853SAndroid Build Coastguard Worker 
3129*495ae853SAndroid Build Coastguard Worker                     s_src = ps_proc->s_rec_buf_props.as_component_bufs[i];
3130*495ae853SAndroid Build Coastguard Worker 
3131*495ae853SAndroid Build Coastguard Worker                     s_dst.i4_data_stride = ps_svc_ilp_data->ps_intra_recon_bufs[u1_spatial_layer_id]
3132*495ae853SAndroid Build Coastguard Worker                                                .as_component_bufs[i]
3133*495ae853SAndroid Build Coastguard Worker                                                .i4_data_stride;
3134*495ae853SAndroid Build Coastguard Worker                     s_dst.pv_data =
3135*495ae853SAndroid Build Coastguard Worker                         ((UWORD8 *) ps_svc_ilp_data->ps_intra_recon_bufs[u1_spatial_layer_id]
3136*495ae853SAndroid Build Coastguard Worker                              .as_component_bufs[i]
3137*495ae853SAndroid Build Coastguard Worker                              .pv_data) +
3138*495ae853SAndroid Build Coastguard Worker                         i4_mb_x * MB_SIZE +
3139*495ae853SAndroid Build Coastguard Worker                         i4_mb_y * (MB_SIZE >> u1_is_chroma) * s_dst.i4_data_stride;
3140*495ae853SAndroid Build Coastguard Worker 
3141*495ae853SAndroid Build Coastguard Worker                     ps_mem_fxns->pf_copy_2d((UWORD8 *) s_dst.pv_data, s_dst.i4_data_stride,
3142*495ae853SAndroid Build Coastguard Worker                                             (UWORD8 *) s_src.pv_data, s_src.i4_data_stride, MB_SIZE,
3143*495ae853SAndroid Build Coastguard Worker                                             (MB_SIZE >> u1_is_chroma));
3144*495ae853SAndroid Build Coastguard Worker                 }
3145*495ae853SAndroid Build Coastguard Worker             }
3146*495ae853SAndroid Build Coastguard Worker             else
3147*495ae853SAndroid Build Coastguard Worker             {
3148*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i < NUM_SP_COMPONENTS; i++)
3149*495ae853SAndroid Build Coastguard Worker                 {
3150*495ae853SAndroid Build Coastguard Worker                     UWORD8 u1_is_chroma = (Y != ((COMPONENT_TYPE) i));
3151*495ae853SAndroid Build Coastguard Worker 
3152*495ae853SAndroid Build Coastguard Worker                     s_dst.i4_data_stride = ps_svc_ilp_data->ps_intra_recon_bufs[u1_spatial_layer_id]
3153*495ae853SAndroid Build Coastguard Worker                                                .as_component_bufs[i]
3154*495ae853SAndroid Build Coastguard Worker                                                .i4_data_stride;
3155*495ae853SAndroid Build Coastguard Worker                     s_dst.pv_data =
3156*495ae853SAndroid Build Coastguard Worker                         ((UWORD8 *) ps_svc_ilp_data->ps_intra_recon_bufs[u1_spatial_layer_id]
3157*495ae853SAndroid Build Coastguard Worker                              .as_component_bufs[i]
3158*495ae853SAndroid Build Coastguard Worker                              .pv_data) +
3159*495ae853SAndroid Build Coastguard Worker                         i4_mb_x * MB_SIZE +
3160*495ae853SAndroid Build Coastguard Worker                         i4_mb_y * (MB_SIZE >> u1_is_chroma) * s_dst.i4_data_stride;
3161*495ae853SAndroid Build Coastguard Worker 
3162*495ae853SAndroid Build Coastguard Worker                     ps_mem_fxns->pf_memset_2d((UWORD8 *) s_dst.pv_data, s_dst.i4_data_stride, 0,
3163*495ae853SAndroid Build Coastguard Worker                                               MB_SIZE, (MB_SIZE >> u1_is_chroma));
3164*495ae853SAndroid Build Coastguard Worker                 }
3165*495ae853SAndroid Build Coastguard Worker             }
3166*495ae853SAndroid Build Coastguard Worker         }
3167*495ae853SAndroid Build Coastguard Worker 
3168*495ae853SAndroid Build Coastguard Worker         if(ENABLE_RESIDUAL_PREDICTION && (ps_proc->i4_slice_type != ISLICE) &&
3169*495ae853SAndroid Build Coastguard Worker            (u1_spatial_layer_id < (ps_svc_params->u1_num_spatial_layers - 1)))
3170*495ae853SAndroid Build Coastguard Worker         {
3171*495ae853SAndroid Build Coastguard Worker             if(ps_proc->ps_mb_info->u1_is_intra || (ps_proc->ps_mb_info->u2_mb_type == PSKIP) ||
3172*495ae853SAndroid Build Coastguard Worker                (ps_proc->ps_mb_info->u2_mb_type == BSKIP))
3173*495ae853SAndroid Build Coastguard Worker             {
3174*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i < NUM_SP_COMPONENTS; i++)
3175*495ae853SAndroid Build Coastguard Worker                 {
3176*495ae853SAndroid Build Coastguard Worker                     buffer_container_t *ps_comp_buf;
3177*495ae853SAndroid Build Coastguard Worker 
3178*495ae853SAndroid Build Coastguard Worker                     WORD16 *pi2_res;
3179*495ae853SAndroid Build Coastguard Worker 
3180*495ae853SAndroid Build Coastguard Worker                     UWORD8 u1_is_chroma = (Y != ((COMPONENT_TYPE) i));
3181*495ae853SAndroid Build Coastguard Worker 
3182*495ae853SAndroid Build Coastguard Worker                     ps_comp_buf = &ps_residual_buf->as_component_bufs[u1_is_chroma ? UV : Y];
3183*495ae853SAndroid Build Coastguard Worker                     pi2_res =
3184*495ae853SAndroid Build Coastguard Worker                         ((WORD16 *) ps_comp_buf->pv_data) + ps_proc->i4_mb_x * MB_SIZE +
3185*495ae853SAndroid Build Coastguard Worker                         ps_proc->i4_mb_y * (MB_SIZE >> u1_is_chroma) * ps_comp_buf->i4_data_stride;
3186*495ae853SAndroid Build Coastguard Worker 
3187*495ae853SAndroid Build Coastguard Worker                     ps_mem_fxns->pf_memset_2d(
3188*495ae853SAndroid Build Coastguard Worker                         (UWORD8 *) pi2_res,
3189*495ae853SAndroid Build Coastguard Worker                         ps_comp_buf->i4_data_stride * (sizeof(WORD16) / sizeof(UWORD8)), 0,
3190*495ae853SAndroid Build Coastguard Worker                         MB_SIZE * (sizeof(WORD16) / sizeof(UWORD8)), MB_SIZE >> u1_is_chroma);
3191*495ae853SAndroid Build Coastguard Worker                 }
3192*495ae853SAndroid Build Coastguard Worker             }
3193*495ae853SAndroid Build Coastguard Worker         }
3194*495ae853SAndroid Build Coastguard Worker 
3195*495ae853SAndroid Build Coastguard Worker         if(ENABLE_RESIDUAL_PREDICTION && (u1_spatial_layer_id > 0) &&
3196*495ae853SAndroid Build Coastguard Worker            !(ps_proc->ps_mb_info->u1_is_intra || (ps_proc->ps_mb_info->u2_mb_type == PSKIP) ||
3197*495ae853SAndroid Build Coastguard Worker              (ps_proc->ps_mb_info->u2_mb_type == BSKIP)))
3198*495ae853SAndroid Build Coastguard Worker         {
3199*495ae853SAndroid Build Coastguard Worker             s_src = ps_residual_buf->as_component_bufs[Y];
3200*495ae853SAndroid Build Coastguard Worker             s_src.pv_data = ((WORD16 *) s_src.pv_data) + ps_proc->i4_mb_x * MB_SIZE +
3201*495ae853SAndroid Build Coastguard Worker                             ps_proc->i4_mb_y * MB_SIZE * s_src.i4_data_stride;
3202*495ae853SAndroid Build Coastguard Worker 
3203*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u4_res_csbp = isvce_get_residual_csbf(ps_mem_fxns, &s_src);
3204*495ae853SAndroid Build Coastguard Worker         }
3205*495ae853SAndroid Build Coastguard Worker         else
3206*495ae853SAndroid Build Coastguard Worker         {
3207*495ae853SAndroid Build Coastguard Worker             ps_proc->ps_mb_info->u4_res_csbp = 0;
3208*495ae853SAndroid Build Coastguard Worker         }
3209*495ae853SAndroid Build Coastguard Worker     }
3210*495ae853SAndroid Build Coastguard Worker     else
3211*495ae853SAndroid Build Coastguard Worker     {
3212*495ae853SAndroid Build Coastguard Worker         ps_proc->ps_mb_info->u4_res_csbp = 0;
3213*495ae853SAndroid Build Coastguard Worker     }
3214*495ae853SAndroid Build Coastguard Worker }
3215*495ae853SAndroid Build Coastguard Worker 
3216*495ae853SAndroid Build Coastguard Worker /*
3217*495ae853SAndroid Build Coastguard Worker  * Padding has a one MB row dependency on deblock  which
3218*495ae853SAndroid Build Coastguard Worker  * in turn has a one MB row dependency on encode
3219*495ae853SAndroid Build Coastguard Worker  */
isvce_pad_frame(isvce_process_ctxt_t * ps_proc,yuv_buf_props_t * ps_pad_buf)3220*495ae853SAndroid Build Coastguard Worker static IH264E_ERROR_T isvce_pad_frame(isvce_process_ctxt_t *ps_proc, yuv_buf_props_t *ps_pad_buf)
3221*495ae853SAndroid Build Coastguard Worker {
3222*495ae853SAndroid Build Coastguard Worker     /* codec context */
3223*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
3224*495ae853SAndroid Build Coastguard Worker 
3225*495ae853SAndroid Build Coastguard Worker     WORD32 i4_element_size = (ps_pad_buf->u1_bit_depth > 8) ? 2 : 1;
3226*495ae853SAndroid Build Coastguard Worker 
3227*495ae853SAndroid Build Coastguard Worker     /* src buffers luma */
3228*495ae853SAndroid Build Coastguard Worker     WORD32 i4_luma_stride = ps_pad_buf->as_component_bufs[0].i4_data_stride * i4_element_size;
3229*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_curr_pic_luma = (UWORD8 *) (ps_pad_buf->as_component_bufs[0].pv_data);
3230*495ae853SAndroid Build Coastguard Worker 
3231*495ae853SAndroid Build Coastguard Worker     /* src buffers chroma */
3232*495ae853SAndroid Build Coastguard Worker     WORD32 i4_chroma_stride = ps_pad_buf->as_component_bufs[1].i4_data_stride * i4_element_size;
3233*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_curr_pic_chroma = (UWORD8 *) (ps_pad_buf->as_component_bufs[1].pv_data);
3234*495ae853SAndroid Build Coastguard Worker 
3235*495ae853SAndroid Build Coastguard Worker     WORD32 i4_bottom_offset_luma = ps_pad_buf->u4_height * i4_luma_stride;
3236*495ae853SAndroid Build Coastguard Worker     WORD32 i4_bottom_offset_chroma = (ps_pad_buf->u4_height >> 1) * i4_chroma_stride;
3237*495ae853SAndroid Build Coastguard Worker 
3238*495ae853SAndroid Build Coastguard Worker     /* Pad left */
3239*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_left_luma(pu1_curr_pic_luma, i4_luma_stride, ps_pad_buf->u4_height,
3240*495ae853SAndroid Build Coastguard Worker                                PAD_LEFT * i4_element_size);
3241*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_left_chroma(pu1_curr_pic_chroma, i4_chroma_stride, ps_pad_buf->u4_height >> 1,
3242*495ae853SAndroid Build Coastguard Worker                                  PAD_LEFT * i4_element_size);
3243*495ae853SAndroid Build Coastguard Worker 
3244*495ae853SAndroid Build Coastguard Worker     /* Pad right */
3245*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_right_luma(pu1_curr_pic_luma + ps_pad_buf->u4_width * i4_element_size,
3246*495ae853SAndroid Build Coastguard Worker                                 i4_luma_stride, ps_pad_buf->u4_height, PAD_RIGHT * i4_element_size);
3247*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_right_chroma(pu1_curr_pic_chroma + ps_pad_buf->u4_width * i4_element_size,
3248*495ae853SAndroid Build Coastguard Worker                                   i4_chroma_stride, ps_pad_buf->u4_height >> 1,
3249*495ae853SAndroid Build Coastguard Worker                                   PAD_RIGHT * i4_element_size);
3250*495ae853SAndroid Build Coastguard Worker 
3251*495ae853SAndroid Build Coastguard Worker     /* Pad top */
3252*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_top(pu1_curr_pic_luma - (PAD_LEFT * i4_element_size), i4_luma_stride,
3253*495ae853SAndroid Build Coastguard Worker                          (ps_pad_buf->u4_width + PAD_WD) * i4_element_size, PAD_TOP);
3254*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_top(pu1_curr_pic_chroma - (PAD_LEFT * i4_element_size), i4_chroma_stride,
3255*495ae853SAndroid Build Coastguard Worker                          (ps_pad_buf->u4_width + PAD_WD) * i4_element_size, PAD_TOP >> 1);
3256*495ae853SAndroid Build Coastguard Worker 
3257*495ae853SAndroid Build Coastguard Worker     /* Pad bottom */
3258*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_bottom(
3259*495ae853SAndroid Build Coastguard Worker         pu1_curr_pic_luma + i4_bottom_offset_luma - (PAD_LEFT * i4_element_size), i4_luma_stride,
3260*495ae853SAndroid Build Coastguard Worker         (ps_pad_buf->u4_width + PAD_WD) * i4_element_size, PAD_BOT);
3261*495ae853SAndroid Build Coastguard Worker     ps_codec->pf_pad_bottom(
3262*495ae853SAndroid Build Coastguard Worker         pu1_curr_pic_chroma + i4_bottom_offset_chroma - (PAD_LEFT * i4_element_size),
3263*495ae853SAndroid Build Coastguard Worker         i4_chroma_stride, (ps_pad_buf->u4_width + PAD_WD) * i4_element_size, PAD_BOT >> 1);
3264*495ae853SAndroid Build Coastguard Worker 
3265*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
3266*495ae853SAndroid Build Coastguard Worker }
3267*495ae853SAndroid Build Coastguard Worker 
isvce_svc_pad_frame(isvce_process_ctxt_t * ps_proc)3268*495ae853SAndroid Build Coastguard Worker void isvce_svc_pad_frame(isvce_process_ctxt_t *ps_proc)
3269*495ae853SAndroid Build Coastguard Worker {
3270*495ae853SAndroid Build Coastguard Worker     isvce_codec_t *ps_codec = ps_proc->ps_codec;
3271*495ae853SAndroid Build Coastguard Worker 
3272*495ae853SAndroid Build Coastguard Worker     isvce_pad_frame(ps_proc, &(ps_proc->s_rec_pic_buf_props));
3273*495ae853SAndroid Build Coastguard Worker 
3274*495ae853SAndroid Build Coastguard Worker     if(ps_proc->s_svc_params.u1_num_spatial_layers > 1)
3275*495ae853SAndroid Build Coastguard Worker     {
3276*495ae853SAndroid Build Coastguard Worker         isvce_pad_frame(
3277*495ae853SAndroid Build Coastguard Worker             ps_proc, &(ps_codec->s_svc_ilp_data.ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id]));
3278*495ae853SAndroid Build Coastguard Worker         isvce_pad_frame(ps_proc,
3279*495ae853SAndroid Build Coastguard Worker                         &(ps_codec->s_svc_ilp_data.ps_residual_bufs[ps_proc->u1_spatial_layer_id]));
3280*495ae853SAndroid Build Coastguard Worker     }
3281*495ae853SAndroid Build Coastguard Worker }
3282*495ae853SAndroid Build Coastguard Worker 
3283*495ae853SAndroid Build Coastguard Worker /**
3284*495ae853SAndroid Build Coastguard Worker *******************************************************************************
3285*495ae853SAndroid Build Coastguard Worker *
3286*495ae853SAndroid Build Coastguard Worker * @brief
3287*495ae853SAndroid Build Coastguard Worker *  Initialize AIR mb frame Map
3288*495ae853SAndroid Build Coastguard Worker *
3289*495ae853SAndroid Build Coastguard Worker * @par Description:
3290*495ae853SAndroid Build Coastguard Worker *  Initialize AIR mb frame map
3291*495ae853SAndroid Build Coastguard Worker *  MB frame map indicates which frame an Mb should be coded as intra according
3292*495ae853SAndroid Build Coastguard Worker *to AIR
3293*495ae853SAndroid Build Coastguard Worker *
3294*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
3295*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
3296*495ae853SAndroid Build Coastguard Worker *
3297*495ae853SAndroid Build Coastguard Worker * @returns  error_status
3298*495ae853SAndroid Build Coastguard Worker *
3299*495ae853SAndroid Build Coastguard Worker * @remarks
3300*495ae853SAndroid Build Coastguard Worker *
3301*495ae853SAndroid Build Coastguard Worker *
3302*495ae853SAndroid Build Coastguard Worker *******************************************************************************
3303*495ae853SAndroid Build Coastguard Worker */
isvce_init_air_map(isvce_codec_t * ps_codec)3304*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_init_air_map(isvce_codec_t *ps_codec)
3305*495ae853SAndroid Build Coastguard Worker {
3306*495ae853SAndroid Build Coastguard Worker     /* intra refresh map */
3307*495ae853SAndroid Build Coastguard Worker     UWORD16 *pu2_intr_rfrsh_map = ps_codec->pu2_intr_rfrsh_map;
3308*495ae853SAndroid Build Coastguard Worker 
3309*495ae853SAndroid Build Coastguard Worker     /* air mode */
3310*495ae853SAndroid Build Coastguard Worker     IVE_AIR_MODE_T air_mode = ps_codec->s_cfg.e_air_mode;
3311*495ae853SAndroid Build Coastguard Worker 
3312*495ae853SAndroid Build Coastguard Worker     /* refresh period */
3313*495ae853SAndroid Build Coastguard Worker     UWORD32 air_period = ps_codec->s_cfg.u4_air_refresh_period;
3314*495ae853SAndroid Build Coastguard Worker 
3315*495ae853SAndroid Build Coastguard Worker     /* mb cnt */
3316*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_mb_cnt = ps_codec->s_cfg.i4_wd_mbs * ps_codec->s_cfg.i4_ht_mbs;
3317*495ae853SAndroid Build Coastguard Worker 
3318*495ae853SAndroid Build Coastguard Worker     /* temp var */
3319*495ae853SAndroid Build Coastguard Worker     UWORD32 curr_mb, seed_rand = 1;
3320*495ae853SAndroid Build Coastguard Worker 
3321*495ae853SAndroid Build Coastguard Worker     switch(air_mode)
3322*495ae853SAndroid Build Coastguard Worker     {
3323*495ae853SAndroid Build Coastguard Worker         case IVE_AIR_MODE_CYCLIC:
3324*495ae853SAndroid Build Coastguard Worker 
3325*495ae853SAndroid Build Coastguard Worker             for(curr_mb = 0; curr_mb < u4_mb_cnt; curr_mb++)
3326*495ae853SAndroid Build Coastguard Worker             {
3327*495ae853SAndroid Build Coastguard Worker                 pu2_intr_rfrsh_map[curr_mb] = curr_mb % air_period;
3328*495ae853SAndroid Build Coastguard Worker             }
3329*495ae853SAndroid Build Coastguard Worker             break;
3330*495ae853SAndroid Build Coastguard Worker 
3331*495ae853SAndroid Build Coastguard Worker         case IVE_AIR_MODE_RANDOM:
3332*495ae853SAndroid Build Coastguard Worker 
3333*495ae853SAndroid Build Coastguard Worker             for(curr_mb = 0; curr_mb < u4_mb_cnt; curr_mb++)
3334*495ae853SAndroid Build Coastguard Worker             {
3335*495ae853SAndroid Build Coastguard Worker                 seed_rand = (seed_rand * 32719 + 3) % 32749;
3336*495ae853SAndroid Build Coastguard Worker                 pu2_intr_rfrsh_map[curr_mb] = seed_rand % air_period;
3337*495ae853SAndroid Build Coastguard Worker             }
3338*495ae853SAndroid Build Coastguard Worker             break;
3339*495ae853SAndroid Build Coastguard Worker 
3340*495ae853SAndroid Build Coastguard Worker         default:
3341*495ae853SAndroid Build Coastguard Worker 
3342*495ae853SAndroid Build Coastguard Worker             break;
3343*495ae853SAndroid Build Coastguard Worker     }
3344*495ae853SAndroid Build Coastguard Worker 
3345*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
3346*495ae853SAndroid Build Coastguard Worker }
3347*495ae853SAndroid Build Coastguard Worker 
3348*495ae853SAndroid Build Coastguard Worker /**
3349*495ae853SAndroid Build Coastguard Worker ******************************************************************************
3350*495ae853SAndroid Build Coastguard Worker *
3351*495ae853SAndroid Build Coastguard Worker * @brief
3352*495ae853SAndroid Build Coastguard Worker *  derivation process for macroblock availability
3353*495ae853SAndroid Build Coastguard Worker *
3354*495ae853SAndroid Build Coastguard Worker * @par   Description
3355*495ae853SAndroid Build Coastguard Worker *  Calculates the availability of the left, top, topright and topleft macroblocks.
3356*495ae853SAndroid Build Coastguard Worker *
3357*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc_ctxt
3358*495ae853SAndroid Build Coastguard Worker *  pointer to proc context (handle)
3359*495ae853SAndroid Build Coastguard Worker *
3360*495ae853SAndroid Build Coastguard Worker * @remarks Based on section 6.4.5 in H264 spec
3361*495ae853SAndroid Build Coastguard Worker *
3362*495ae853SAndroid Build Coastguard Worker * @return  none
3363*495ae853SAndroid Build Coastguard Worker *
3364*495ae853SAndroid Build Coastguard Worker ******************************************************************************
3365*495ae853SAndroid Build Coastguard Worker */
isvce_derive_nghbr_avbl_of_mbs(isvce_process_ctxt_t * ps_proc)3366*495ae853SAndroid Build Coastguard Worker void isvce_derive_nghbr_avbl_of_mbs(isvce_process_ctxt_t *ps_proc)
3367*495ae853SAndroid Build Coastguard Worker {
3368*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_slice_idx_curr = ps_proc->pu1_slice_idx;
3369*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_slice_idx_b;
3370*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_slice_idx_a;
3371*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_slice_idx_c;
3372*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_slice_idx_d;
3373*495ae853SAndroid Build Coastguard Worker     block_neighbors_t *ps_ngbr_avbl;
3374*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_x, i4_mb_y;
3375*495ae853SAndroid Build Coastguard Worker     WORD32 i4_wd_mbs;
3376*495ae853SAndroid Build Coastguard Worker 
3377*495ae853SAndroid Build Coastguard Worker     i4_mb_x = ps_proc->i4_mb_x;
3378*495ae853SAndroid Build Coastguard Worker     i4_mb_y = ps_proc->i4_mb_y;
3379*495ae853SAndroid Build Coastguard Worker 
3380*495ae853SAndroid Build Coastguard Worker     i4_wd_mbs = ps_proc->i4_wd_mbs;
3381*495ae853SAndroid Build Coastguard Worker 
3382*495ae853SAndroid Build Coastguard Worker     pu1_slice_idx_curr += (i4_mb_y * i4_wd_mbs) + i4_mb_x;
3383*495ae853SAndroid Build Coastguard Worker     pu1_slice_idx_a = pu1_slice_idx_curr - 1;
3384*495ae853SAndroid Build Coastguard Worker     pu1_slice_idx_b = pu1_slice_idx_curr - i4_wd_mbs;
3385*495ae853SAndroid Build Coastguard Worker     pu1_slice_idx_c = pu1_slice_idx_b + 1;
3386*495ae853SAndroid Build Coastguard Worker     pu1_slice_idx_d = pu1_slice_idx_b - 1;
3387*495ae853SAndroid Build Coastguard Worker     ps_ngbr_avbl = ps_proc->ps_ngbr_avbl;
3388*495ae853SAndroid Build Coastguard Worker 
3389*495ae853SAndroid Build Coastguard Worker     /**********************************************************************/
3390*495ae853SAndroid Build Coastguard Worker     /* The macroblock is marked as available, unless one of the following */
3391*495ae853SAndroid Build Coastguard Worker     /* conditions is true in which case the macroblock shall be marked as */
3392*495ae853SAndroid Build Coastguard Worker     /* not available.                                                     */
3393*495ae853SAndroid Build Coastguard Worker     /* 1. mbAddr < 0                                                      */
3394*495ae853SAndroid Build Coastguard Worker     /* 2  mbAddr > CurrMbAddr                                             */
3395*495ae853SAndroid Build Coastguard Worker     /* 3. the macroblock with address mbAddr belongs to a different slice */
3396*495ae853SAndroid Build Coastguard Worker     /* than the macroblock with address CurrMbAddr                        */
3397*495ae853SAndroid Build Coastguard Worker     /**********************************************************************/
3398*495ae853SAndroid Build Coastguard Worker 
3399*495ae853SAndroid Build Coastguard Worker     /* left macroblock availability */
3400*495ae853SAndroid Build Coastguard Worker     if(i4_mb_x == 0)
3401*495ae853SAndroid Build Coastguard Worker     { /* macroblocks along first column */
3402*495ae853SAndroid Build Coastguard Worker         ps_ngbr_avbl->u1_mb_a = 0;
3403*495ae853SAndroid Build Coastguard Worker     }
3404*495ae853SAndroid Build Coastguard Worker     else
3405*495ae853SAndroid Build Coastguard Worker     { /* macroblocks belong to same slice? */
3406*495ae853SAndroid Build Coastguard Worker         if(*pu1_slice_idx_a != *pu1_slice_idx_curr)
3407*495ae853SAndroid Build Coastguard Worker             ps_ngbr_avbl->u1_mb_a = 0;
3408*495ae853SAndroid Build Coastguard Worker         else
3409*495ae853SAndroid Build Coastguard Worker             ps_ngbr_avbl->u1_mb_a = 1;
3410*495ae853SAndroid Build Coastguard Worker     }
3411*495ae853SAndroid Build Coastguard Worker 
3412*495ae853SAndroid Build Coastguard Worker     /* top macroblock availability */
3413*495ae853SAndroid Build Coastguard Worker     if(i4_mb_y == 0)
3414*495ae853SAndroid Build Coastguard Worker     { /* macroblocks along first row */
3415*495ae853SAndroid Build Coastguard Worker         ps_ngbr_avbl->u1_mb_b = 0;
3416*495ae853SAndroid Build Coastguard Worker     }
3417*495ae853SAndroid Build Coastguard Worker     else
3418*495ae853SAndroid Build Coastguard Worker     { /* macroblocks belong to same slice? */
3419*495ae853SAndroid Build Coastguard Worker         if(*pu1_slice_idx_b != *pu1_slice_idx_curr)
3420*495ae853SAndroid Build Coastguard Worker             ps_ngbr_avbl->u1_mb_b = 0;
3421*495ae853SAndroid Build Coastguard Worker         else
3422*495ae853SAndroid Build Coastguard Worker             ps_ngbr_avbl->u1_mb_b = 1;
3423*495ae853SAndroid Build Coastguard Worker     }
3424*495ae853SAndroid Build Coastguard Worker 
3425*495ae853SAndroid Build Coastguard Worker     /* top right macroblock availability */
3426*495ae853SAndroid Build Coastguard Worker     if(i4_mb_x == i4_wd_mbs - 1 || i4_mb_y == 0)
3427*495ae853SAndroid Build Coastguard Worker     { /* macroblocks along last column */
3428*495ae853SAndroid Build Coastguard Worker         ps_ngbr_avbl->u1_mb_c = 0;
3429*495ae853SAndroid Build Coastguard Worker     }
3430*495ae853SAndroid Build Coastguard Worker     else
3431*495ae853SAndroid Build Coastguard Worker     { /* macroblocks belong to same slice? */
3432*495ae853SAndroid Build Coastguard Worker         if(*pu1_slice_idx_c != *pu1_slice_idx_curr)
3433*495ae853SAndroid Build Coastguard Worker             ps_ngbr_avbl->u1_mb_c = 0;
3434*495ae853SAndroid Build Coastguard Worker         else
3435*495ae853SAndroid Build Coastguard Worker             ps_ngbr_avbl->u1_mb_c = 1;
3436*495ae853SAndroid Build Coastguard Worker     }
3437*495ae853SAndroid Build Coastguard Worker 
3438*495ae853SAndroid Build Coastguard Worker     /* top left macroblock availability */
3439*495ae853SAndroid Build Coastguard Worker     if(i4_mb_x == 0 || i4_mb_y == 0)
3440*495ae853SAndroid Build Coastguard Worker     { /* macroblocks along first column */
3441*495ae853SAndroid Build Coastguard Worker         ps_ngbr_avbl->u1_mb_d = 0;
3442*495ae853SAndroid Build Coastguard Worker     }
3443*495ae853SAndroid Build Coastguard Worker     else
3444*495ae853SAndroid Build Coastguard Worker     { /* macroblocks belong to same slice? */
3445*495ae853SAndroid Build Coastguard Worker         if(*pu1_slice_idx_d != *pu1_slice_idx_curr)
3446*495ae853SAndroid Build Coastguard Worker             ps_ngbr_avbl->u1_mb_d = 0;
3447*495ae853SAndroid Build Coastguard Worker         else
3448*495ae853SAndroid Build Coastguard Worker             ps_ngbr_avbl->u1_mb_d = 1;
3449*495ae853SAndroid Build Coastguard Worker     }
3450*495ae853SAndroid Build Coastguard Worker }
3451*495ae853SAndroid Build Coastguard Worker 
isvce_rc_init_wrapper(isvce_codec_t * ps_codec)3452*495ae853SAndroid Build Coastguard Worker static IH264E_ERROR_T isvce_rc_init_wrapper(isvce_codec_t *ps_codec)
3453*495ae853SAndroid Build Coastguard Worker {
3454*495ae853SAndroid Build Coastguard Worker     WORD32 i;
3455*495ae853SAndroid Build Coastguard Worker 
3456*495ae853SAndroid Build Coastguard Worker     isvce_cfg_params_t *ps_cfg = &ps_codec->s_cfg;
3457*495ae853SAndroid Build Coastguard Worker 
3458*495ae853SAndroid Build Coastguard Worker     IH264E_ERROR_T err = isvce_svc_rc_params_validate(ps_cfg);
3459*495ae853SAndroid Build Coastguard Worker 
3460*495ae853SAndroid Build Coastguard Worker     if(IH264E_SUCCESS != err)
3461*495ae853SAndroid Build Coastguard Worker     {
3462*495ae853SAndroid Build Coastguard Worker         return err;
3463*495ae853SAndroid Build Coastguard Worker     }
3464*495ae853SAndroid Build Coastguard Worker 
3465*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_cfg->s_svc_params.u1_num_spatial_layers; i++)
3466*495ae853SAndroid Build Coastguard Worker     {
3467*495ae853SAndroid Build Coastguard Worker         UWORD8 au1_init_qp[MAX_PIC_TYPE];
3468*495ae853SAndroid Build Coastguard Worker         UWORD8 au1_min_max_qp[2 * MAX_PIC_TYPE];
3469*495ae853SAndroid Build Coastguard Worker 
3470*495ae853SAndroid Build Coastguard Worker         au1_init_qp[0] = gau1_h264_to_mpeg2_qmap[ps_cfg->au4_i_qp[i]];
3471*495ae853SAndroid Build Coastguard Worker         au1_init_qp[1] = gau1_h264_to_mpeg2_qmap[ps_cfg->au4_p_qp[i]];
3472*495ae853SAndroid Build Coastguard Worker         au1_init_qp[2] = gau1_h264_to_mpeg2_qmap[ps_cfg->au4_b_qp[i]];
3473*495ae853SAndroid Build Coastguard Worker 
3474*495ae853SAndroid Build Coastguard Worker         au1_min_max_qp[2 * I_PIC] = gau1_h264_to_mpeg2_qmap[ps_cfg->au4_i_qp_min[i]];
3475*495ae853SAndroid Build Coastguard Worker         au1_min_max_qp[2 * I_PIC + 1] = gau1_h264_to_mpeg2_qmap[ps_cfg->au4_i_qp_max[i]];
3476*495ae853SAndroid Build Coastguard Worker 
3477*495ae853SAndroid Build Coastguard Worker         au1_min_max_qp[2 * P_PIC] = gau1_h264_to_mpeg2_qmap[ps_cfg->au4_p_qp_min[i]];
3478*495ae853SAndroid Build Coastguard Worker         au1_min_max_qp[2 * P_PIC + 1] = gau1_h264_to_mpeg2_qmap[ps_cfg->au4_p_qp_max[i]];
3479*495ae853SAndroid Build Coastguard Worker 
3480*495ae853SAndroid Build Coastguard Worker         au1_min_max_qp[2 * B_PIC] = gau1_h264_to_mpeg2_qmap[ps_cfg->au4_b_qp_min[i]];
3481*495ae853SAndroid Build Coastguard Worker         au1_min_max_qp[2 * B_PIC + 1] = gau1_h264_to_mpeg2_qmap[ps_cfg->au4_b_qp_max[i]];
3482*495ae853SAndroid Build Coastguard Worker 
3483*495ae853SAndroid Build Coastguard Worker         switch(ps_cfg->e_rc_mode)
3484*495ae853SAndroid Build Coastguard Worker         {
3485*495ae853SAndroid Build Coastguard Worker             case IVE_RC_STORAGE:
3486*495ae853SAndroid Build Coastguard Worker             {
3487*495ae853SAndroid Build Coastguard Worker                 ps_codec->s_rate_control.e_rc_type = VBR_STORAGE;
3488*495ae853SAndroid Build Coastguard Worker                 break;
3489*495ae853SAndroid Build Coastguard Worker             }
3490*495ae853SAndroid Build Coastguard Worker             case IVE_RC_CBR_NON_LOW_DELAY:
3491*495ae853SAndroid Build Coastguard Worker             {
3492*495ae853SAndroid Build Coastguard Worker                 ps_codec->s_rate_control.e_rc_type = CBR_NLDRC;
3493*495ae853SAndroid Build Coastguard Worker                 break;
3494*495ae853SAndroid Build Coastguard Worker             }
3495*495ae853SAndroid Build Coastguard Worker             case IVE_RC_CBR_LOW_DELAY:
3496*495ae853SAndroid Build Coastguard Worker             {
3497*495ae853SAndroid Build Coastguard Worker                 ps_codec->s_rate_control.e_rc_type = CBR_LDRC;
3498*495ae853SAndroid Build Coastguard Worker                 break;
3499*495ae853SAndroid Build Coastguard Worker             }
3500*495ae853SAndroid Build Coastguard Worker             case IVE_RC_NONE:
3501*495ae853SAndroid Build Coastguard Worker             {
3502*495ae853SAndroid Build Coastguard Worker                 ps_codec->s_rate_control.e_rc_type = CONST_QP;
3503*495ae853SAndroid Build Coastguard Worker                 break;
3504*495ae853SAndroid Build Coastguard Worker             }
3505*495ae853SAndroid Build Coastguard Worker             default:
3506*495ae853SAndroid Build Coastguard Worker             {
3507*495ae853SAndroid Build Coastguard Worker                 break;
3508*495ae853SAndroid Build Coastguard Worker             }
3509*495ae853SAndroid Build Coastguard Worker         }
3510*495ae853SAndroid Build Coastguard Worker 
3511*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < MAX_NUM_SPATIAL_LAYERS; i++)
3512*495ae853SAndroid Build Coastguard Worker         {
3513*495ae853SAndroid Build Coastguard Worker             isvce_rc_init(ps_codec->s_rate_control.apps_rate_control_api[i],
3514*495ae853SAndroid Build Coastguard Worker                           ps_codec->s_rate_control.pps_frame_time,
3515*495ae853SAndroid Build Coastguard Worker                           ps_codec->s_rate_control.pps_time_stamp,
3516*495ae853SAndroid Build Coastguard Worker                           ps_codec->s_rate_control.pps_pd_frm_rate, ps_cfg->u4_max_framerate,
3517*495ae853SAndroid Build Coastguard Worker                           ps_cfg->u4_src_frame_rate, ps_cfg->u4_tgt_frame_rate,
3518*495ae853SAndroid Build Coastguard Worker                           ps_codec->s_rate_control.e_rc_type, ps_cfg->au4_target_bitrate[i],
3519*495ae853SAndroid Build Coastguard Worker                           ps_cfg->au4_max_bitrate[i], ps_cfg->au4_vbv_buffer_delay[i],
3520*495ae853SAndroid Build Coastguard Worker                           ps_cfg->u4_i_frm_interval, ps_cfg->u4_num_bframes + 1, au1_init_qp,
3521*495ae853SAndroid Build Coastguard Worker                           ps_cfg->u4_num_bframes + 2, au1_min_max_qp, ps_cfg->u4_max_level);
3522*495ae853SAndroid Build Coastguard Worker         }
3523*495ae853SAndroid Build Coastguard Worker     }
3524*495ae853SAndroid Build Coastguard Worker 
3525*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
3526*495ae853SAndroid Build Coastguard Worker }
3527*495ae853SAndroid Build Coastguard Worker 
3528*495ae853SAndroid Build Coastguard Worker /**
3529*495ae853SAndroid Build Coastguard Worker *******************************************************************************
3530*495ae853SAndroid Build Coastguard Worker *
3531*495ae853SAndroid Build Coastguard Worker * @brief
3532*495ae853SAndroid Build Coastguard Worker *  Codec level initializations
3533*495ae853SAndroid Build Coastguard Worker *
3534*495ae853SAndroid Build Coastguard Worker * @par Description:
3535*495ae853SAndroid Build Coastguard Worker *  Initializes the codec with parameters that needs to be set before encoding
3536*495ae853SAndroid Build Coastguard Worker *  first frame
3537*495ae853SAndroid Build Coastguard Worker *
3538*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
3539*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
3540*495ae853SAndroid Build Coastguard Worker *
3541*495ae853SAndroid Build Coastguard Worker * @param[in] ps_inp_buf
3542*495ae853SAndroid Build Coastguard Worker *  Pointer to input buffer context
3543*495ae853SAndroid Build Coastguard Worker *
3544*495ae853SAndroid Build Coastguard Worker * @returns  error_status
3545*495ae853SAndroid Build Coastguard Worker *
3546*495ae853SAndroid Build Coastguard Worker * @remarks
3547*495ae853SAndroid Build Coastguard Worker *
3548*495ae853SAndroid Build Coastguard Worker *
3549*495ae853SAndroid Build Coastguard Worker *******************************************************************************
3550*495ae853SAndroid Build Coastguard Worker */
isvce_codec_init(isvce_codec_t * ps_codec)3551*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_codec_init(isvce_codec_t *ps_codec)
3552*495ae853SAndroid Build Coastguard Worker {
3553*495ae853SAndroid Build Coastguard Worker     isa_dependent_fxns_t *ps_isa_dependent_fxns = &ps_codec->s_isa_dependent_fxns;
3554*495ae853SAndroid Build Coastguard Worker     enc_loop_fxns_t *ps_enc_loop_fxns = &ps_isa_dependent_fxns->s_enc_loop_fxns;
3555*495ae853SAndroid Build Coastguard Worker     WORD8 i;
3556*495ae853SAndroid Build Coastguard Worker 
3557*495ae853SAndroid Build Coastguard Worker     /********************************************************************
3558*495ae853SAndroid Build Coastguard Worker      *                     INITIALIZE CODEC CONTEXT                     *
3559*495ae853SAndroid Build Coastguard Worker      ********************************************************************/
3560*495ae853SAndroid Build Coastguard Worker     /* encoder presets */
3561*495ae853SAndroid Build Coastguard Worker     if(ps_codec->s_cfg.u4_enc_speed_preset != IVE_CONFIG)
3562*495ae853SAndroid Build Coastguard Worker     {
3563*495ae853SAndroid Build Coastguard Worker         if(ps_codec->s_cfg.u4_enc_speed_preset == IVE_SLOWEST)
3564*495ae853SAndroid Build Coastguard Worker         { /* high quality */
3565*495ae853SAndroid Build Coastguard Worker             /* enable diamond search */
3566*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_me_speed_preset = DMND_SRCH;
3567*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_fast_sad = 0;
3568*495ae853SAndroid Build Coastguard Worker 
3569*495ae853SAndroid Build Coastguard Worker             /* disable intra 4x4 */
3570*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_intra_4x4 = 1;
3571*495ae853SAndroid Build Coastguard Worker             if(!FORCE_FAST_INTRA4X4)
3572*495ae853SAndroid Build Coastguard Worker             {
3573*495ae853SAndroid Build Coastguard Worker                 ps_enc_loop_fxns->apf_luma_energy_compaction[1] =
3574*495ae853SAndroid Build Coastguard Worker                     isvce_code_luma_intra_macroblock_4x4_rdopt_on;
3575*495ae853SAndroid Build Coastguard Worker             }
3576*495ae853SAndroid Build Coastguard Worker 
3577*495ae853SAndroid Build Coastguard Worker             /* sub pel off */
3578*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_hpel = 1;
3579*495ae853SAndroid Build Coastguard Worker 
3580*495ae853SAndroid Build Coastguard Worker             /* disabled intra inter gating in Inter slices */
3581*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_inter_gate = 0;
3582*495ae853SAndroid Build Coastguard Worker         }
3583*495ae853SAndroid Build Coastguard Worker         else if(ps_codec->s_cfg.u4_enc_speed_preset == IVE_NORMAL)
3584*495ae853SAndroid Build Coastguard Worker         { /* normal */
3585*495ae853SAndroid Build Coastguard Worker             /* enable diamond search */
3586*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_me_speed_preset = DMND_SRCH;
3587*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_fast_sad = 0;
3588*495ae853SAndroid Build Coastguard Worker 
3589*495ae853SAndroid Build Coastguard Worker             /* disable intra 4x4 */
3590*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_intra_4x4 = 1;
3591*495ae853SAndroid Build Coastguard Worker 
3592*495ae853SAndroid Build Coastguard Worker             /* sub pel off */
3593*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_hpel = 1;
3594*495ae853SAndroid Build Coastguard Worker 
3595*495ae853SAndroid Build Coastguard Worker             /* disabled intra inter gating in Inter slices */
3596*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_inter_gate = 0;
3597*495ae853SAndroid Build Coastguard Worker         }
3598*495ae853SAndroid Build Coastguard Worker         else if(ps_codec->s_cfg.u4_enc_speed_preset == IVE_FAST)
3599*495ae853SAndroid Build Coastguard Worker         { /* normal */
3600*495ae853SAndroid Build Coastguard Worker             /* enable diamond search */
3601*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_me_speed_preset = DMND_SRCH;
3602*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_fast_sad = 0;
3603*495ae853SAndroid Build Coastguard Worker 
3604*495ae853SAndroid Build Coastguard Worker             /* disable intra 4x4 */
3605*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_intra_4x4 = 0;
3606*495ae853SAndroid Build Coastguard Worker 
3607*495ae853SAndroid Build Coastguard Worker             /* sub pel off */
3608*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_hpel = 1;
3609*495ae853SAndroid Build Coastguard Worker 
3610*495ae853SAndroid Build Coastguard Worker             /* disabled intra inter gating in Inter slices */
3611*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_inter_gate = 1;
3612*495ae853SAndroid Build Coastguard Worker         }
3613*495ae853SAndroid Build Coastguard Worker         else if(ps_codec->s_cfg.u4_enc_speed_preset == IVE_HIGH_SPEED)
3614*495ae853SAndroid Build Coastguard Worker         { /* fast */
3615*495ae853SAndroid Build Coastguard Worker             /* enable diamond search */
3616*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_me_speed_preset = DMND_SRCH;
3617*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_fast_sad = 0;
3618*495ae853SAndroid Build Coastguard Worker 
3619*495ae853SAndroid Build Coastguard Worker             /* disable intra 4x4 */
3620*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_intra_4x4 = 0;
3621*495ae853SAndroid Build Coastguard Worker 
3622*495ae853SAndroid Build Coastguard Worker             /* sub pel off */
3623*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_hpel = 0;
3624*495ae853SAndroid Build Coastguard Worker 
3625*495ae853SAndroid Build Coastguard Worker             /* disabled intra inter gating in Inter slices */
3626*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_inter_gate = 0;
3627*495ae853SAndroid Build Coastguard Worker         }
3628*495ae853SAndroid Build Coastguard Worker         else if(ps_codec->s_cfg.u4_enc_speed_preset == IVE_FASTEST)
3629*495ae853SAndroid Build Coastguard Worker         { /* fastest */
3630*495ae853SAndroid Build Coastguard Worker             /* enable diamond search */
3631*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_me_speed_preset = DMND_SRCH;
3632*495ae853SAndroid Build Coastguard Worker 
3633*495ae853SAndroid Build Coastguard Worker             /* disable intra 4x4 */
3634*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_intra_4x4 = 0;
3635*495ae853SAndroid Build Coastguard Worker 
3636*495ae853SAndroid Build Coastguard Worker             /* sub pel off */
3637*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_hpel = 0;
3638*495ae853SAndroid Build Coastguard Worker 
3639*495ae853SAndroid Build Coastguard Worker             /* disabled intra inter gating in Inter slices */
3640*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_inter_gate = 1;
3641*495ae853SAndroid Build Coastguard Worker         }
3642*495ae853SAndroid Build Coastguard Worker     }
3643*495ae853SAndroid Build Coastguard Worker 
3644*495ae853SAndroid Build Coastguard Worker     /*****************************************************************
3645*495ae853SAndroid Build Coastguard Worker      * Initialize AIR inside codec
3646*495ae853SAndroid Build Coastguard Worker      *****************************************************************/
3647*495ae853SAndroid Build Coastguard Worker     if(IVE_AIR_MODE_NONE != ps_codec->s_cfg.e_air_mode)
3648*495ae853SAndroid Build Coastguard Worker     {
3649*495ae853SAndroid Build Coastguard Worker         isvce_init_air_map(ps_codec);
3650*495ae853SAndroid Build Coastguard Worker 
3651*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_air_pic_cnt = -1;
3652*495ae853SAndroid Build Coastguard Worker     }
3653*495ae853SAndroid Build Coastguard Worker 
3654*495ae853SAndroid Build Coastguard Worker     {
3655*495ae853SAndroid Build Coastguard Worker         WORD32 i4_err_code = isvce_rc_init_wrapper(ps_codec);
3656*495ae853SAndroid Build Coastguard Worker 
3657*495ae853SAndroid Build Coastguard Worker         if(IH264E_SUCCESS != i4_err_code)
3658*495ae853SAndroid Build Coastguard Worker         {
3659*495ae853SAndroid Build Coastguard Worker             return i4_err_code;
3660*495ae853SAndroid Build Coastguard Worker         }
3661*495ae853SAndroid Build Coastguard Worker     }
3662*495ae853SAndroid Build Coastguard Worker 
3663*495ae853SAndroid Build Coastguard Worker     /* recon stride */
3664*495ae853SAndroid Build Coastguard Worker     ps_codec->i4_rec_strd = ALIGN16(ps_codec->s_cfg.u4_max_wd) + PAD_WD;
3665*495ae853SAndroid Build Coastguard Worker 
3666*495ae853SAndroid Build Coastguard Worker     /* max ref and reorder cnt */
3667*495ae853SAndroid Build Coastguard Worker     ps_codec->i4_ref_buf_cnt = ps_codec->s_cfg.u4_max_ref_cnt + ps_codec->s_cfg.u4_max_reorder_cnt;
3668*495ae853SAndroid Build Coastguard Worker     ps_codec->i4_ref_buf_cnt += MAX_CTXT_SETS;
3669*495ae853SAndroid Build Coastguard Worker     ps_codec->i4_ref_buf_cnt += ps_codec->s_cfg.s_svc_params.u1_num_temporal_layers;
3670*495ae853SAndroid Build Coastguard Worker 
3671*495ae853SAndroid Build Coastguard Worker     DEBUG_HISTOGRAM_INIT();
3672*495ae853SAndroid Build Coastguard Worker 
3673*495ae853SAndroid Build Coastguard Worker     /* Init dependecy vars */
3674*495ae853SAndroid Build Coastguard Worker     ps_codec->i4_last_inp_buff_received = 0;
3675*495ae853SAndroid Build Coastguard Worker 
3676*495ae853SAndroid Build Coastguard Worker     /* At codec start no IDR is pending */
3677*495ae853SAndroid Build Coastguard Worker     ps_codec->i4_pending_idr_flag = 0;
3678*495ae853SAndroid Build Coastguard Worker 
3679*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers - 1; i++)
3680*495ae853SAndroid Build Coastguard Worker     {
3681*495ae853SAndroid Build Coastguard Worker         ps_codec->au4_constrained_intra_pred[i] = 1;
3682*495ae853SAndroid Build Coastguard Worker     }
3683*495ae853SAndroid Build Coastguard Worker 
3684*495ae853SAndroid Build Coastguard Worker     ps_codec->au4_constrained_intra_pred[ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers - 1] =
3685*495ae853SAndroid Build Coastguard Worker         0;
3686*495ae853SAndroid Build Coastguard Worker 
3687*495ae853SAndroid Build Coastguard Worker     return IH264E_SUCCESS;
3688*495ae853SAndroid Build Coastguard Worker }
3689*495ae853SAndroid Build Coastguard Worker 
3690*495ae853SAndroid Build Coastguard Worker /**
3691*495ae853SAndroid Build Coastguard Worker *******************************************************************************
3692*495ae853SAndroid Build Coastguard Worker *
3693*495ae853SAndroid Build Coastguard Worker * @brief update encoder configuration parameters
3694*495ae853SAndroid Build Coastguard Worker *
3695*495ae853SAndroid Build Coastguard Worker * @par Description:
3696*495ae853SAndroid Build Coastguard Worker *  updates encoder configuration parameters from the given config set.
3697*495ae853SAndroid Build Coastguard Worker *  Initialize/reinitialize codec parameters according to new configurations.
3698*495ae853SAndroid Build Coastguard Worker *
3699*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
3700*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
3701*495ae853SAndroid Build Coastguard Worker *
3702*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cfg
3703*495ae853SAndroid Build Coastguard Worker *  Pointer to config param set
3704*495ae853SAndroid Build Coastguard Worker *
3705*495ae853SAndroid Build Coastguard Worker * @remarks none
3706*495ae853SAndroid Build Coastguard Worker *
3707*495ae853SAndroid Build Coastguard Worker *******************************************************************************
3708*495ae853SAndroid Build Coastguard Worker */
isvce_codec_update_config(isvce_codec_t * ps_codec,isvce_cfg_params_t * ps_cfg)3709*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_codec_update_config(isvce_codec_t *ps_codec, isvce_cfg_params_t *ps_cfg)
3710*495ae853SAndroid Build Coastguard Worker {
3711*495ae853SAndroid Build Coastguard Worker     /* config params */
3712*495ae853SAndroid Build Coastguard Worker     isvce_cfg_params_t *ps_curr_cfg = &ps_codec->s_cfg;
3713*495ae853SAndroid Build Coastguard Worker 
3714*495ae853SAndroid Build Coastguard Worker     /* error status */
3715*495ae853SAndroid Build Coastguard Worker     IH264E_ERROR_T err = IH264E_SUCCESS;
3716*495ae853SAndroid Build Coastguard Worker 
3717*495ae853SAndroid Build Coastguard Worker     /* temp var */
3718*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_init_rc = 0;
3719*495ae853SAndroid Build Coastguard Worker 
3720*495ae853SAndroid Build Coastguard Worker     WORD8 i;
3721*495ae853SAndroid Build Coastguard Worker 
3722*495ae853SAndroid Build Coastguard Worker     /***********************/
3723*495ae853SAndroid Build Coastguard Worker     /* UPDATE CODEC CONFIG */
3724*495ae853SAndroid Build Coastguard Worker     /***********************/
3725*495ae853SAndroid Build Coastguard Worker     if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_DIMENSIONS)
3726*495ae853SAndroid Build Coastguard Worker     {
3727*495ae853SAndroid Build Coastguard Worker         UWORD32 wd_aln = ALIGN16(ps_cfg->u4_wd);
3728*495ae853SAndroid Build Coastguard Worker         UWORD32 ht_aln = ALIGN16(ps_cfg->u4_ht);
3729*495ae853SAndroid Build Coastguard Worker 
3730*495ae853SAndroid Build Coastguard Worker         if(ps_curr_cfg->u4_wd != wd_aln || ps_curr_cfg->u4_ht != ht_aln ||
3731*495ae853SAndroid Build Coastguard Worker            ps_curr_cfg->u4_disp_wd != ps_cfg->u4_disp_wd ||
3732*495ae853SAndroid Build Coastguard Worker            ps_curr_cfg->u4_disp_ht != ps_cfg->u4_disp_ht)
3733*495ae853SAndroid Build Coastguard Worker         {
3734*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_wd = wd_aln;
3735*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_ht = ht_aln;
3736*495ae853SAndroid Build Coastguard Worker 
3737*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_disp_wd = ps_cfg->u4_disp_wd;
3738*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_disp_ht = ps_cfg->u4_disp_ht;
3739*495ae853SAndroid Build Coastguard Worker 
3740*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->i4_wd_mbs = ps_curr_cfg->u4_wd >> 4;
3741*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->i4_ht_mbs = ps_curr_cfg->u4_ht >> 4;
3742*495ae853SAndroid Build Coastguard Worker 
3743*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_rec_strd = ALIGN16(ps_cfg->u4_wd) + PAD_WD;
3744*495ae853SAndroid Build Coastguard Worker 
3745*495ae853SAndroid Build Coastguard Worker             /* If number of MBs in a frame changes the air map also changes.
3746*495ae853SAndroid Build Coastguard Worker              * Hence recompute air map also reset air pic cnt */
3747*495ae853SAndroid Build Coastguard Worker             if(ps_codec->s_cfg.e_air_mode != IVE_AIR_MODE_NONE)
3748*495ae853SAndroid Build Coastguard Worker             {
3749*495ae853SAndroid Build Coastguard Worker                 /* re-init the air map */
3750*495ae853SAndroid Build Coastguard Worker                 isvce_init_air_map(ps_codec);
3751*495ae853SAndroid Build Coastguard Worker 
3752*495ae853SAndroid Build Coastguard Worker                 /* reset air counter */
3753*495ae853SAndroid Build Coastguard Worker                 ps_codec->i4_air_pic_cnt = -1;
3754*495ae853SAndroid Build Coastguard Worker             }
3755*495ae853SAndroid Build Coastguard Worker 
3756*495ae853SAndroid Build Coastguard Worker             /* initialize mv bank buffer manager */
3757*495ae853SAndroid Build Coastguard Worker             err = isvce_svc_au_data_mgr_add_bufs(ps_codec);
3758*495ae853SAndroid Build Coastguard Worker             if(err != IH264E_SUCCESS) return err;
3759*495ae853SAndroid Build Coastguard Worker 
3760*495ae853SAndroid Build Coastguard Worker             /* initialize ref bank buffer manager */
3761*495ae853SAndroid Build Coastguard Worker             err = isvce_svc_au_buf_mgr_add_bufs(ps_codec);
3762*495ae853SAndroid Build Coastguard Worker             if(err != IH264E_SUCCESS) return err;
3763*495ae853SAndroid Build Coastguard Worker 
3764*495ae853SAndroid Build Coastguard Worker             /* since dimension changed, start new sequence by forcing IDR */
3765*495ae853SAndroid Build Coastguard Worker             ps_codec->force_curr_frame_type = IV_IDR_FRAME;
3766*495ae853SAndroid Build Coastguard Worker 
3767*495ae853SAndroid Build Coastguard Worker             /* in case dimension changes, we need to reinitialize RC as the
3768*495ae853SAndroid Build Coastguard Worker              * old model shall not fit further */
3769*495ae853SAndroid Build Coastguard Worker             u4_init_rc = 1;
3770*495ae853SAndroid Build Coastguard Worker 
3771*495ae853SAndroid Build Coastguard Worker             /* when the dimension changes, the header needs to be regenerated */
3772*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_gen_header = 1;
3773*495ae853SAndroid Build Coastguard Worker         }
3774*495ae853SAndroid Build Coastguard Worker     }
3775*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_FRAMERATE)
3776*495ae853SAndroid Build Coastguard Worker     {
3777*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_src_ticks, u4_tgt_ticks;
3778*495ae853SAndroid Build Coastguard Worker 
3779*495ae853SAndroid Build Coastguard Worker         u4_src_ticks = ih264e_frame_time_get_src_ticks(ps_codec->s_rate_control.pps_frame_time);
3780*495ae853SAndroid Build Coastguard Worker 
3781*495ae853SAndroid Build Coastguard Worker         u4_tgt_ticks = ih264e_frame_time_get_tgt_ticks(ps_codec->s_rate_control.pps_frame_time);
3782*495ae853SAndroid Build Coastguard Worker 
3783*495ae853SAndroid Build Coastguard Worker         /* Change frame rate */
3784*495ae853SAndroid Build Coastguard Worker         if(ps_codec->s_cfg.u4_src_frame_rate != ps_cfg->u4_src_frame_rate * 1000)
3785*495ae853SAndroid Build Coastguard Worker         {
3786*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_src_frame_rate = ps_cfg->u4_src_frame_rate * 1000;
3787*495ae853SAndroid Build Coastguard Worker 
3788*495ae853SAndroid Build Coastguard Worker             ih264e_frame_time_update_src_frame_rate(ps_codec->s_rate_control.pps_frame_time,
3789*495ae853SAndroid Build Coastguard Worker                                                     ps_codec->s_cfg.u4_src_frame_rate);
3790*495ae853SAndroid Build Coastguard Worker 
3791*495ae853SAndroid Build Coastguard Worker             ih264_time_stamp_update_frame_rate(ps_codec->s_rate_control.pps_time_stamp,
3792*495ae853SAndroid Build Coastguard Worker                                                ps_codec->s_cfg.u4_src_frame_rate);
3793*495ae853SAndroid Build Coastguard Worker 
3794*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < ps_cfg->s_svc_params.u1_num_spatial_layers; i++)
3795*495ae853SAndroid Build Coastguard Worker             {
3796*495ae853SAndroid Build Coastguard Worker                 irc_change_frame_rate(ps_codec->s_rate_control.apps_rate_control_api[i],
3797*495ae853SAndroid Build Coastguard Worker                                       ps_codec->s_cfg.u4_src_frame_rate, u4_src_ticks,
3798*495ae853SAndroid Build Coastguard Worker                                       u4_tgt_ticks);
3799*495ae853SAndroid Build Coastguard Worker             }
3800*495ae853SAndroid Build Coastguard Worker         }
3801*495ae853SAndroid Build Coastguard Worker 
3802*495ae853SAndroid Build Coastguard Worker         if(ps_codec->s_cfg.u4_tgt_frame_rate != ps_cfg->u4_tgt_frame_rate * 1000)
3803*495ae853SAndroid Build Coastguard Worker         {
3804*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_tgt_frame_rate = ps_cfg->u4_tgt_frame_rate * 1000;
3805*495ae853SAndroid Build Coastguard Worker 
3806*495ae853SAndroid Build Coastguard Worker             ih264e_frame_time_update_tgt_frame_rate(ps_codec->s_rate_control.pps_frame_time,
3807*495ae853SAndroid Build Coastguard Worker                                                     ps_codec->s_cfg.u4_tgt_frame_rate);
3808*495ae853SAndroid Build Coastguard Worker 
3809*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < ps_cfg->s_svc_params.u1_num_spatial_layers; i++)
3810*495ae853SAndroid Build Coastguard Worker             {
3811*495ae853SAndroid Build Coastguard Worker                 irc_change_frame_rate(ps_codec->s_rate_control.apps_rate_control_api[i],
3812*495ae853SAndroid Build Coastguard Worker                                       ps_codec->s_cfg.u4_src_frame_rate, u4_src_ticks,
3813*495ae853SAndroid Build Coastguard Worker                                       u4_tgt_ticks);
3814*495ae853SAndroid Build Coastguard Worker 
3815*495ae853SAndroid Build Coastguard Worker                 irc_change_frm_rate_for_bit_alloc(ps_codec->s_rate_control.apps_rate_control_api[i],
3816*495ae853SAndroid Build Coastguard Worker                                                   ps_codec->s_cfg.u4_tgt_frame_rate);
3817*495ae853SAndroid Build Coastguard Worker             }
3818*495ae853SAndroid Build Coastguard Worker         }
3819*495ae853SAndroid Build Coastguard Worker     }
3820*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_BITRATE)
3821*495ae853SAndroid Build Coastguard Worker     {
3822*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < MAX_NUM_SPATIAL_LAYERS; i++)
3823*495ae853SAndroid Build Coastguard Worker         {
3824*495ae853SAndroid Build Coastguard Worker             if(ps_curr_cfg->au4_target_bitrate[i] != ps_cfg->au4_target_bitrate[i])
3825*495ae853SAndroid Build Coastguard Worker             {
3826*495ae853SAndroid Build Coastguard Worker                 if(IVE_RC_NONE != ps_curr_cfg->e_rc_mode)
3827*495ae853SAndroid Build Coastguard Worker                     irc_change_avg_bit_rate(ps_codec->s_rate_control.apps_rate_control_api[i],
3828*495ae853SAndroid Build Coastguard Worker                                             ps_cfg->au4_target_bitrate[i]);
3829*495ae853SAndroid Build Coastguard Worker 
3830*495ae853SAndroid Build Coastguard Worker                 ps_curr_cfg->au4_target_bitrate[i] = ps_cfg->au4_target_bitrate[i];
3831*495ae853SAndroid Build Coastguard Worker             }
3832*495ae853SAndroid Build Coastguard Worker         }
3833*495ae853SAndroid Build Coastguard Worker     }
3834*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_FRAMETYPE)
3835*495ae853SAndroid Build Coastguard Worker     {
3836*495ae853SAndroid Build Coastguard Worker         switch(ps_cfg->e_frame_type)
3837*495ae853SAndroid Build Coastguard Worker         {
3838*495ae853SAndroid Build Coastguard Worker             case IV_I_FRAME:
3839*495ae853SAndroid Build Coastguard Worker                 ps_codec->force_curr_frame_type = IV_I_FRAME;
3840*495ae853SAndroid Build Coastguard Worker                 break;
3841*495ae853SAndroid Build Coastguard Worker 
3842*495ae853SAndroid Build Coastguard Worker             case IV_IDR_FRAME:
3843*495ae853SAndroid Build Coastguard Worker                 ps_codec->force_curr_frame_type = IV_IDR_FRAME;
3844*495ae853SAndroid Build Coastguard Worker                 break;
3845*495ae853SAndroid Build Coastguard Worker 
3846*495ae853SAndroid Build Coastguard Worker             case IV_P_FRAME:
3847*495ae853SAndroid Build Coastguard Worker             default:
3848*495ae853SAndroid Build Coastguard Worker                 break;
3849*495ae853SAndroid Build Coastguard Worker         }
3850*495ae853SAndroid Build Coastguard Worker     }
3851*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_ME_PARAMS)
3852*495ae853SAndroid Build Coastguard Worker     {
3853*495ae853SAndroid Build Coastguard Worker         if(ps_curr_cfg->u4_enc_speed_preset == IVE_CONFIG)
3854*495ae853SAndroid Build Coastguard Worker         {
3855*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_hpel = ps_cfg->u4_enable_hpel;
3856*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_fast_sad = ps_cfg->u4_enable_fast_sad;
3857*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_me_speed_preset = ps_cfg->u4_me_speed_preset;
3858*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_qpel = ps_cfg->u4_enable_qpel;
3859*495ae853SAndroid Build Coastguard Worker         }
3860*495ae853SAndroid Build Coastguard Worker         else if(ps_curr_cfg->u4_enc_speed_preset == IVE_FASTEST)
3861*495ae853SAndroid Build Coastguard Worker         {
3862*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_fast_sad = ps_cfg->u4_enable_fast_sad;
3863*495ae853SAndroid Build Coastguard Worker         }
3864*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.u4_srch_rng_x = ps_cfg->u4_srch_rng_x;
3865*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.u4_srch_rng_y = ps_cfg->u4_srch_rng_y;
3866*495ae853SAndroid Build Coastguard Worker 
3867*495ae853SAndroid Build Coastguard Worker         if(ps_codec->s_cfg.u4_enable_alt_ref != ps_cfg->u4_enable_alt_ref)
3868*495ae853SAndroid Build Coastguard Worker         {
3869*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.u4_enable_alt_ref = ps_cfg->u4_enable_alt_ref;
3870*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_is_curr_frm_ref = 1;
3871*495ae853SAndroid Build Coastguard Worker         }
3872*495ae853SAndroid Build Coastguard Worker     }
3873*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_IPE_PARAMS)
3874*495ae853SAndroid Build Coastguard Worker     {
3875*495ae853SAndroid Build Coastguard Worker         ps_curr_cfg->u4_enc_speed_preset = ps_cfg->u4_enc_speed_preset;
3876*495ae853SAndroid Build Coastguard Worker 
3877*495ae853SAndroid Build Coastguard Worker         if(ps_curr_cfg->u4_enc_speed_preset == IVE_SLOWEST)
3878*495ae853SAndroid Build Coastguard Worker         {
3879*495ae853SAndroid Build Coastguard Worker             isa_dependent_fxns_t *ps_isa_dependent_fxns = &ps_codec->s_isa_dependent_fxns;
3880*495ae853SAndroid Build Coastguard Worker             enc_loop_fxns_t *ps_enc_loop_fxns = &ps_isa_dependent_fxns->s_enc_loop_fxns;
3881*495ae853SAndroid Build Coastguard Worker 
3882*495ae853SAndroid Build Coastguard Worker             /* enable diamond search */
3883*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
3884*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_fast_sad = 0;
3885*495ae853SAndroid Build Coastguard Worker 
3886*495ae853SAndroid Build Coastguard Worker             /* disable intra 4x4 */
3887*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_intra_4x4 = 1;
3888*495ae853SAndroid Build Coastguard Worker             ps_enc_loop_fxns->apf_luma_energy_compaction[1] =
3889*495ae853SAndroid Build Coastguard Worker                 isvce_code_luma_intra_macroblock_4x4_rdopt_on;
3890*495ae853SAndroid Build Coastguard Worker 
3891*495ae853SAndroid Build Coastguard Worker             /* sub pel off */
3892*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_hpel = 1;
3893*495ae853SAndroid Build Coastguard Worker 
3894*495ae853SAndroid Build Coastguard Worker             /* disabled intra inter gating in Inter slices */
3895*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_inter_gate = 0;
3896*495ae853SAndroid Build Coastguard Worker         }
3897*495ae853SAndroid Build Coastguard Worker         else if(ps_curr_cfg->u4_enc_speed_preset == IVE_NORMAL)
3898*495ae853SAndroid Build Coastguard Worker         { /* normal */
3899*495ae853SAndroid Build Coastguard Worker             /* enable diamond search */
3900*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
3901*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_fast_sad = 0;
3902*495ae853SAndroid Build Coastguard Worker 
3903*495ae853SAndroid Build Coastguard Worker             /* disable intra 4x4 */
3904*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_intra_4x4 = 1;
3905*495ae853SAndroid Build Coastguard Worker 
3906*495ae853SAndroid Build Coastguard Worker             /* sub pel off */
3907*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_hpel = 1;
3908*495ae853SAndroid Build Coastguard Worker 
3909*495ae853SAndroid Build Coastguard Worker             /* disabled intra inter gating in Inter slices */
3910*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_inter_gate = 0;
3911*495ae853SAndroid Build Coastguard Worker         }
3912*495ae853SAndroid Build Coastguard Worker         else if(ps_curr_cfg->u4_enc_speed_preset == IVE_FAST)
3913*495ae853SAndroid Build Coastguard Worker         { /* normal */
3914*495ae853SAndroid Build Coastguard Worker             /* enable diamond search */
3915*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
3916*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_fast_sad = 0;
3917*495ae853SAndroid Build Coastguard Worker 
3918*495ae853SAndroid Build Coastguard Worker             /* disable intra 4x4 */
3919*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_intra_4x4 = 0;
3920*495ae853SAndroid Build Coastguard Worker 
3921*495ae853SAndroid Build Coastguard Worker             /* sub pel off */
3922*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_hpel = 1;
3923*495ae853SAndroid Build Coastguard Worker 
3924*495ae853SAndroid Build Coastguard Worker             /* disabled intra inter gating in Inter slices */
3925*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_inter_gate = 1;
3926*495ae853SAndroid Build Coastguard Worker         }
3927*495ae853SAndroid Build Coastguard Worker         else if(ps_curr_cfg->u4_enc_speed_preset == IVE_HIGH_SPEED)
3928*495ae853SAndroid Build Coastguard Worker         { /* fast */
3929*495ae853SAndroid Build Coastguard Worker             /* enable diamond search */
3930*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
3931*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_fast_sad = 0;
3932*495ae853SAndroid Build Coastguard Worker 
3933*495ae853SAndroid Build Coastguard Worker             /* disable intra 4x4 */
3934*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_intra_4x4 = 0;
3935*495ae853SAndroid Build Coastguard Worker 
3936*495ae853SAndroid Build Coastguard Worker             /* sub pel off */
3937*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_hpel = 0;
3938*495ae853SAndroid Build Coastguard Worker 
3939*495ae853SAndroid Build Coastguard Worker             /* disabled intra inter gating in Inter slices */
3940*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_inter_gate = 0;
3941*495ae853SAndroid Build Coastguard Worker         }
3942*495ae853SAndroid Build Coastguard Worker         else if(ps_curr_cfg->u4_enc_speed_preset == IVE_FASTEST)
3943*495ae853SAndroid Build Coastguard Worker         { /* fastest */
3944*495ae853SAndroid Build Coastguard Worker             /* enable diamond search */
3945*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
3946*495ae853SAndroid Build Coastguard Worker             // u4_num_layers = 4;
3947*495ae853SAndroid Build Coastguard Worker 
3948*495ae853SAndroid Build Coastguard Worker             /* disable intra 4x4 */
3949*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_intra_4x4 = 0;
3950*495ae853SAndroid Build Coastguard Worker 
3951*495ae853SAndroid Build Coastguard Worker             /* sub pel off */
3952*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_hpel = 0;
3953*495ae853SAndroid Build Coastguard Worker 
3954*495ae853SAndroid Build Coastguard Worker             /* disabled intra inter gating in Inter slices */
3955*495ae853SAndroid Build Coastguard Worker             ps_codec->u4_inter_gate = 1;
3956*495ae853SAndroid Build Coastguard Worker         }
3957*495ae853SAndroid Build Coastguard Worker         else if(ps_curr_cfg->u4_enc_speed_preset == IVE_CONFIG)
3958*495ae853SAndroid Build Coastguard Worker         {
3959*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_enable_intra_4x4 = ps_cfg->u4_enable_intra_4x4;
3960*495ae853SAndroid Build Coastguard Worker         }
3961*495ae853SAndroid Build Coastguard Worker     }
3962*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_GOP_PARAMS)
3963*495ae853SAndroid Build Coastguard Worker     {
3964*495ae853SAndroid Build Coastguard Worker         if(ps_curr_cfg->u4_i_frm_interval != ps_cfg->u4_i_frm_interval)
3965*495ae853SAndroid Build Coastguard Worker         {
3966*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_i_frm_interval = ps_cfg->u4_i_frm_interval;
3967*495ae853SAndroid Build Coastguard Worker 
3968*495ae853SAndroid Build Coastguard Worker             /* reset air counter */
3969*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_air_pic_cnt = -1;
3970*495ae853SAndroid Build Coastguard Worker 
3971*495ae853SAndroid Build Coastguard Worker             /* re-init air map */
3972*495ae853SAndroid Build Coastguard Worker             isvce_init_air_map(ps_codec);
3973*495ae853SAndroid Build Coastguard Worker 
3974*495ae853SAndroid Build Coastguard Worker             /*Effect intra frame interval change*/
3975*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < ps_cfg->s_svc_params.u1_num_spatial_layers; i++)
3976*495ae853SAndroid Build Coastguard Worker             {
3977*495ae853SAndroid Build Coastguard Worker                 irc_change_intra_frm_int_call(ps_codec->s_rate_control.apps_rate_control_api[i],
3978*495ae853SAndroid Build Coastguard Worker                                               ps_curr_cfg->u4_i_frm_interval);
3979*495ae853SAndroid Build Coastguard Worker             }
3980*495ae853SAndroid Build Coastguard Worker         }
3981*495ae853SAndroid Build Coastguard Worker 
3982*495ae853SAndroid Build Coastguard Worker         ps_curr_cfg->u4_idr_frm_interval = ps_cfg->u4_idr_frm_interval;
3983*495ae853SAndroid Build Coastguard Worker     }
3984*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_DEBLOCK_PARAMS)
3985*495ae853SAndroid Build Coastguard Worker     {
3986*495ae853SAndroid Build Coastguard Worker         ps_curr_cfg->u4_disable_deblock_level = ps_cfg->u4_disable_deblock_level;
3987*495ae853SAndroid Build Coastguard Worker     }
3988*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_QP)
3989*495ae853SAndroid Build Coastguard Worker     {
3990*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < ps_cfg->s_svc_params.u1_num_spatial_layers; i++)
3991*495ae853SAndroid Build Coastguard Worker         {
3992*495ae853SAndroid Build Coastguard Worker             UWORD8 au1_init_qp[MAX_PIC_TYPE];
3993*495ae853SAndroid Build Coastguard Worker             UWORD8 au1_min_max_qp[2 * MAX_PIC_TYPE];
3994*495ae853SAndroid Build Coastguard Worker             UWORD8 au1_min_max_avc_qp[2 * MAX_PIC_TYPE];
3995*495ae853SAndroid Build Coastguard Worker 
3996*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.au4_i_qp_max[i] = ps_cfg->au4_i_qp_max[i];
3997*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.au4_i_qp_min[i] = ps_cfg->au4_i_qp_min[i];
3998*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.au4_i_qp[i] = ps_cfg->au4_i_qp[i];
3999*495ae853SAndroid Build Coastguard Worker 
4000*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.au4_p_qp_max[i] = ps_cfg->au4_p_qp_max[i];
4001*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.au4_p_qp_min[i] = ps_cfg->au4_p_qp_min[i];
4002*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.au4_p_qp[i] = ps_cfg->au4_p_qp[i];
4003*495ae853SAndroid Build Coastguard Worker 
4004*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.au4_b_qp_max[i] = ps_cfg->au4_b_qp_max[i];
4005*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.au4_b_qp_min[i] = ps_cfg->au4_b_qp_min[i];
4006*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.au4_b_qp[i] = ps_cfg->au4_b_qp[i];
4007*495ae853SAndroid Build Coastguard Worker 
4008*495ae853SAndroid Build Coastguard Worker             /* update rc lib with modified qp */
4009*495ae853SAndroid Build Coastguard Worker             au1_init_qp[0] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.au4_i_qp[i]];
4010*495ae853SAndroid Build Coastguard Worker             au1_init_qp[1] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.au4_p_qp[i]];
4011*495ae853SAndroid Build Coastguard Worker             au1_init_qp[2] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.au4_b_qp[i]];
4012*495ae853SAndroid Build Coastguard Worker 
4013*495ae853SAndroid Build Coastguard Worker             irc_change_init_qp(ps_codec->s_rate_control.apps_rate_control_api[i], au1_init_qp);
4014*495ae853SAndroid Build Coastguard Worker 
4015*495ae853SAndroid Build Coastguard Worker             au1_min_max_qp[2 * I_PIC] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.au4_i_qp_min[i]];
4016*495ae853SAndroid Build Coastguard Worker             au1_min_max_qp[2 * I_PIC + 1] =
4017*495ae853SAndroid Build Coastguard Worker                 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.au4_i_qp_max[i]];
4018*495ae853SAndroid Build Coastguard Worker 
4019*495ae853SAndroid Build Coastguard Worker             au1_min_max_qp[2 * P_PIC] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.au4_p_qp_min[i]];
4020*495ae853SAndroid Build Coastguard Worker             au1_min_max_qp[2 * P_PIC + 1] =
4021*495ae853SAndroid Build Coastguard Worker                 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.au4_p_qp_max[i]];
4022*495ae853SAndroid Build Coastguard Worker 
4023*495ae853SAndroid Build Coastguard Worker             au1_min_max_qp[2 * B_PIC] = gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.au4_b_qp_min[i]];
4024*495ae853SAndroid Build Coastguard Worker             au1_min_max_qp[2 * B_PIC + 1] =
4025*495ae853SAndroid Build Coastguard Worker                 gau1_h264_to_mpeg2_qmap[ps_codec->s_cfg.au4_b_qp_max[i]];
4026*495ae853SAndroid Build Coastguard Worker 
4027*495ae853SAndroid Build Coastguard Worker             au1_min_max_avc_qp[2 * I_PIC] = ps_codec->s_cfg.au4_i_qp_min[i];
4028*495ae853SAndroid Build Coastguard Worker             au1_min_max_avc_qp[2 * I_PIC + 1] = ps_codec->s_cfg.au4_i_qp_max[i];
4029*495ae853SAndroid Build Coastguard Worker 
4030*495ae853SAndroid Build Coastguard Worker             au1_min_max_avc_qp[2 * P_PIC] = ps_codec->s_cfg.au4_p_qp_min[i];
4031*495ae853SAndroid Build Coastguard Worker             au1_min_max_avc_qp[2 * P_PIC + 1] = ps_codec->s_cfg.au4_p_qp_max[i];
4032*495ae853SAndroid Build Coastguard Worker 
4033*495ae853SAndroid Build Coastguard Worker             au1_min_max_avc_qp[2 * B_PIC] = ps_codec->s_cfg.au4_b_qp_min[i];
4034*495ae853SAndroid Build Coastguard Worker             au1_min_max_avc_qp[2 * B_PIC + 1] = ps_codec->s_cfg.au4_b_qp_max[i];
4035*495ae853SAndroid Build Coastguard Worker 
4036*495ae853SAndroid Build Coastguard Worker             irc_change_qp_constraints(ps_codec->s_rate_control.apps_rate_control_api[i],
4037*495ae853SAndroid Build Coastguard Worker                                       au1_min_max_qp, au1_min_max_avc_qp);
4038*495ae853SAndroid Build Coastguard Worker         }
4039*495ae853SAndroid Build Coastguard Worker     }
4040*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_ENC_MODE)
4041*495ae853SAndroid Build Coastguard Worker     {
4042*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.e_enc_mode = ps_cfg->e_enc_mode;
4043*495ae853SAndroid Build Coastguard Worker 
4044*495ae853SAndroid Build Coastguard Worker         if(ps_codec->s_cfg.e_enc_mode == IVE_ENC_MODE_HEADER)
4045*495ae853SAndroid Build Coastguard Worker         {
4046*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_header_mode = 1;
4047*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.e_enc_mode = IVE_ENC_MODE_PICTURE;
4048*495ae853SAndroid Build Coastguard Worker         }
4049*495ae853SAndroid Build Coastguard Worker         else
4050*495ae853SAndroid Build Coastguard Worker         {
4051*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_header_mode = 0;
4052*495ae853SAndroid Build Coastguard Worker         }
4053*495ae853SAndroid Build Coastguard Worker     }
4054*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_VBV_PARAMS &&
4055*495ae853SAndroid Build Coastguard Worker             IVE_RC_NONE != ps_codec->s_cfg.e_rc_mode)
4056*495ae853SAndroid Build Coastguard Worker     {
4057*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < ps_cfg->s_svc_params.u1_num_spatial_layers; i++)
4058*495ae853SAndroid Build Coastguard Worker         {
4059*495ae853SAndroid Build Coastguard Worker             ps_codec->s_cfg.au4_vbv_buffer_delay[i] = ps_cfg->au4_vbv_buffer_delay[i];
4060*495ae853SAndroid Build Coastguard Worker         }
4061*495ae853SAndroid Build Coastguard Worker         // irc_change_buffer_delay(ps_codec->s_rate_control.pps_rate_control_api,
4062*495ae853SAndroid Build Coastguard Worker         // ps_codec->s_cfg.u4_vbv_buffer_delay);
4063*495ae853SAndroid Build Coastguard Worker 
4064*495ae853SAndroid Build Coastguard Worker         // TODO: remove this when the support for changing buffer dynamically
4065*495ae853SAndroid Build Coastguard Worker         // is yet to be added.
4066*495ae853SAndroid Build Coastguard Worker         u4_init_rc = 1;
4067*495ae853SAndroid Build Coastguard Worker     }
4068*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_AIR_PARAMS)
4069*495ae853SAndroid Build Coastguard Worker     {
4070*495ae853SAndroid Build Coastguard Worker         if(ps_curr_cfg->e_air_mode != ps_cfg->e_air_mode ||
4071*495ae853SAndroid Build Coastguard Worker            ps_curr_cfg->u4_air_refresh_period != ps_cfg->u4_air_refresh_period)
4072*495ae853SAndroid Build Coastguard Worker         {
4073*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->e_air_mode = ps_cfg->e_air_mode;
4074*495ae853SAndroid Build Coastguard Worker             ps_curr_cfg->u4_air_refresh_period = ps_cfg->u4_air_refresh_period;
4075*495ae853SAndroid Build Coastguard Worker 
4076*495ae853SAndroid Build Coastguard Worker             isvce_init_air_map(ps_codec);
4077*495ae853SAndroid Build Coastguard Worker 
4078*495ae853SAndroid Build Coastguard Worker             /* reset air counter */
4079*495ae853SAndroid Build Coastguard Worker             ps_codec->i4_air_pic_cnt = -1;
4080*495ae853SAndroid Build Coastguard Worker         }
4081*495ae853SAndroid Build Coastguard Worker     }
4082*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_PROFILE_PARAMS)
4083*495ae853SAndroid Build Coastguard Worker     {
4084*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.e_profile = ps_cfg->e_profile;
4085*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.u4_entropy_coding_mode = ps_cfg->u4_entropy_coding_mode;
4086*495ae853SAndroid Build Coastguard Worker     }
4087*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_NUM_CORES)
4088*495ae853SAndroid Build Coastguard Worker     {
4089*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.u4_num_cores = ps_cfg->u4_num_cores;
4090*495ae853SAndroid Build Coastguard Worker     }
4091*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_VUI_PARAMS)
4092*495ae853SAndroid Build Coastguard Worker     {
4093*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.s_vui = ps_cfg->s_vui;
4094*495ae853SAndroid Build Coastguard Worker     }
4095*495ae853SAndroid Build Coastguard Worker 
4096*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_SEI_MDCV_PARAMS)
4097*495ae853SAndroid Build Coastguard Worker     {
4098*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.s_sei.u1_sei_mdcv_params_present_flag =
4099*495ae853SAndroid Build Coastguard Worker             ps_cfg->s_sei.u1_sei_mdcv_params_present_flag;
4100*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.s_sei.s_sei_mdcv_params = ps_cfg->s_sei.s_sei_mdcv_params;
4101*495ae853SAndroid Build Coastguard Worker     }
4102*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_SEI_CLL_PARAMS)
4103*495ae853SAndroid Build Coastguard Worker     {
4104*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.s_sei.u1_sei_cll_params_present_flag =
4105*495ae853SAndroid Build Coastguard Worker             ps_cfg->s_sei.u1_sei_cll_params_present_flag;
4106*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.s_sei.s_sei_cll_params = ps_cfg->s_sei.s_sei_cll_params;
4107*495ae853SAndroid Build Coastguard Worker     }
4108*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_SEI_AVE_PARAMS)
4109*495ae853SAndroid Build Coastguard Worker     {
4110*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.s_sei.u1_sei_ave_params_present_flag =
4111*495ae853SAndroid Build Coastguard Worker             ps_cfg->s_sei.u1_sei_ave_params_present_flag;
4112*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.s_sei.s_sei_ave_params = ps_cfg->s_sei.s_sei_ave_params;
4113*495ae853SAndroid Build Coastguard Worker     }
4114*495ae853SAndroid Build Coastguard Worker     else if(ps_cfg->e_cmd == ISVCE_CMD_CTL_SET_SEI_CCV_PARAMS)
4115*495ae853SAndroid Build Coastguard Worker     {
4116*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.s_sei.u1_sei_ccv_params_present_flag =
4117*495ae853SAndroid Build Coastguard Worker             ps_cfg->s_sei.u1_sei_ccv_params_present_flag;
4118*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.s_sei.s_sei_ccv_params = ps_cfg->s_sei.s_sei_ccv_params;
4119*495ae853SAndroid Build Coastguard Worker     }
4120*495ae853SAndroid Build Coastguard Worker 
4121*495ae853SAndroid Build Coastguard Worker     /* reset RC model */
4122*495ae853SAndroid Build Coastguard Worker     if(u4_init_rc)
4123*495ae853SAndroid Build Coastguard Worker     {
4124*495ae853SAndroid Build Coastguard Worker         err = isvce_rc_init_wrapper(ps_codec);
4125*495ae853SAndroid Build Coastguard Worker     }
4126*495ae853SAndroid Build Coastguard Worker 
4127*495ae853SAndroid Build Coastguard Worker     return err;
4128*495ae853SAndroid Build Coastguard Worker }
4129*495ae853SAndroid Build Coastguard Worker 
isvce_change_rc_init_qp(void * pv_rate_control_api,UWORD8 u1_qp)4130*495ae853SAndroid Build Coastguard Worker static FORCEINLINE void isvce_change_rc_init_qp(void *pv_rate_control_api, UWORD8 u1_qp)
4131*495ae853SAndroid Build Coastguard Worker {
4132*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_pic_qps[MAX_PIC_TYPE];
4133*495ae853SAndroid Build Coastguard Worker     WORD32 i;
4134*495ae853SAndroid Build Coastguard Worker 
4135*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_PIC_TYPE; i++)
4136*495ae853SAndroid Build Coastguard Worker     {
4137*495ae853SAndroid Build Coastguard Worker         au1_pic_qps[i] = gau1_h264_to_mpeg2_qmap[CLIP3(MIN_H264_QP, MAX_H264_QP, u1_qp + i)];
4138*495ae853SAndroid Build Coastguard Worker     }
4139*495ae853SAndroid Build Coastguard Worker 
4140*495ae853SAndroid Build Coastguard Worker     irc_change_init_qp(pv_rate_control_api, au1_pic_qps);
4141*495ae853SAndroid Build Coastguard Worker }
4142*495ae853SAndroid Build Coastguard Worker 
4143*495ae853SAndroid Build Coastguard Worker /**
4144*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
4145*495ae853SAndroid Build Coastguard Worker  *
4146*495ae853SAndroid Build Coastguard Worker  * @brief
4147*495ae853SAndroid Build Coastguard Worker  *  Queues the current buffer, gets back a another buffer for encoding with
4148*495ae853SAndroid Build Coastguard Worker  *corrent picture type
4149*495ae853SAndroid Build Coastguard Worker  *
4150*495ae853SAndroid Build Coastguard Worker  * @par Description:
4151*495ae853SAndroid Build Coastguard Worker  *      This function performs 3 distinct but related functions.
4152*495ae853SAndroid Build Coastguard Worker  *      1) Maintains an input queue [Note the the term queue donot imply a
4153*495ae853SAndroid Build Coastguard Worker  *         first-in first-out logic here] that queues input and dequeues them so
4154*495ae853SAndroid Build Coastguard Worker  *         that input frames can be encoded at any predetermined encoding order
4155*495ae853SAndroid Build Coastguard Worker  *      2) Uses RC library to decide which frame must be encoded in current pass
4156*495ae853SAndroid Build Coastguard Worker  *         and which picture type it must be encoded to.
4157*495ae853SAndroid Build Coastguard Worker  *      3) Uses RC library to decide the QP at which current frame has to be
4158*495ae853SAndroid Build Coastguard Worker  *         encoded
4159*495ae853SAndroid Build Coastguard Worker  *      4) Determines if the current picture must be encoded or not based on
4160*495ae853SAndroid Build Coastguard Worker  *         PRE-ENC skip
4161*495ae853SAndroid Build Coastguard Worker  *
4162*495ae853SAndroid Build Coastguard Worker  *     Input queue is used for storing input buffers till they are used for
4163*495ae853SAndroid Build Coastguard Worker  *     encoding. This queue is maintained at ps_codec->as_inp_list. Whenever a
4164*495ae853SAndroid Build Coastguard Worker  *     valid input comes, it is added to the end of queue. This same input is
4165*495ae853SAndroid Build Coastguard Worker  *     added to RC queue using the identifier as ps_codec->i4_pic_cnt. Hence any
4166*495ae853SAndroid Build Coastguard Worker  *     pic from RC can be located in the input queue easily.
4167*495ae853SAndroid Build Coastguard Worker  *
4168*495ae853SAndroid Build Coastguard Worker  *     The dequeue operation does not start till we have
4169*495ae853SAndroid Build Coastguard Worker  *ps_codec->s_cfg.u4_max_num_bframes frames in the queue. THis is done in order
4170*495ae853SAndroid Build Coastguard Worker  *to ensure that once output starts we will have a constant stream of output
4171*495ae853SAndroid Build Coastguard Worker  *with no gaps.
4172*495ae853SAndroid Build Coastguard Worker  *
4173*495ae853SAndroid Build Coastguard Worker  *     THe output frame order is governed by RC library. When ever we dequeue a
4174*495ae853SAndroid Build Coastguard Worker  *     buffer from RC library, it ensures that we will get them in encoding
4175*495ae853SAndroid Build Coastguard Worker  *order With the output of RC library, we can use the picture id to dequeue the
4176*495ae853SAndroid Build Coastguard Worker  *     corresponding buffer from input queue and encode it.
4177*495ae853SAndroid Build Coastguard Worker  *
4178*495ae853SAndroid Build Coastguard Worker  *     Condition at the end of stream.
4179*495ae853SAndroid Build Coastguard Worker  *     -------------------------------
4180*495ae853SAndroid Build Coastguard Worker  *      At the last valid buffer from the app, we will get ps_ive_ip->u4_is_last
4181*495ae853SAndroid Build Coastguard Worker  *      to be set. This will the given to lib when appropriate input buffer is
4182*495ae853SAndroid Build Coastguard Worker  *      given to encoding.
4183*495ae853SAndroid Build Coastguard Worker  *
4184*495ae853SAndroid Build Coastguard Worker  *      Since we have to output is not in sync with input, we will have frames
4185*495ae853SAndroid Build Coastguard Worker  *to encode even after we recive the last vaild input buffer. Hence we have to
4186*495ae853SAndroid Build Coastguard Worker  *      make sure that we donot queue any new buffers once we get the flag [It
4187*495ae853SAndroid Build Coastguard Worker  *may mess up GOP ?]. This is acheived by setting
4188*495ae853SAndroid Build Coastguard Worker  *ps_codec->i4_last_inp_buff_received to act as a permenent marker for last
4189*495ae853SAndroid Build Coastguard Worker  *frame recived [This may not be needed, because in our current app, all buffers
4190*495ae853SAndroid Build Coastguard Worker  *after the last are marked as last. But can we rely on that?] . Hence after
4191*495ae853SAndroid Build Coastguard Worker  *this flgag is set no new buffers are queued.
4192*495ae853SAndroid Build Coastguard Worker  *
4193*495ae853SAndroid Build Coastguard Worker  * @param[in] ps_codec
4194*495ae853SAndroid Build Coastguard Worker  *   Pointer to codec descriptor
4195*495ae853SAndroid Build Coastguard Worker  *
4196*495ae853SAndroid Build Coastguard Worker  * @param[in] ps_ive_ip
4197*495ae853SAndroid Build Coastguard Worker  *   Current input buffer to the encoder
4198*495ae853SAndroid Build Coastguard Worker  *
4199*495ae853SAndroid Build Coastguard Worker  * @param[out] ps_inp
4200*495ae853SAndroid Build Coastguard Worker  *   Buffer to be encoded in the current pass
4201*495ae853SAndroid Build Coastguard Worker  *
4202*495ae853SAndroid Build Coastguard Worker  * @returns
4203*495ae853SAndroid Build Coastguard Worker  *   Flag indicating if we have a pre-enc skip or not
4204*495ae853SAndroid Build Coastguard Worker  *
4205*495ae853SAndroid Build Coastguard Worker  * @remarks
4206*495ae853SAndroid Build Coastguard Worker  * TODO (bpic)
4207*495ae853SAndroid Build Coastguard Worker  *  The check for null ans is last is redudent.
4208*495ae853SAndroid Build Coastguard Worker  *  Need to see if we can remove it
4209*495ae853SAndroid Build Coastguard Worker  *
4210*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
4211*495ae853SAndroid Build Coastguard Worker  */
isvce_input_queue_update(isvce_codec_t * ps_codec,ive_video_encode_ip_t * ps_ive_ip,isvce_inp_buf_t * ps_enc_buff,WORD8 i1_layer_id)4212*495ae853SAndroid Build Coastguard Worker WORD32 isvce_input_queue_update(isvce_codec_t *ps_codec, ive_video_encode_ip_t *ps_ive_ip,
4213*495ae853SAndroid Build Coastguard Worker                                 isvce_inp_buf_t *ps_enc_buff, WORD8 i1_layer_id)
4214*495ae853SAndroid Build Coastguard Worker {
4215*495ae853SAndroid Build Coastguard Worker     isvce_inp_buf_t *ps_inp_buf;
4216*495ae853SAndroid Build Coastguard Worker     picture_type_e e_pictype;
4217*495ae853SAndroid Build Coastguard Worker     WORD32 i4_skip;
4218*495ae853SAndroid Build Coastguard Worker     UWORD32 ctxt_sel, u4_pic_id, u4_pic_disp_id;
4219*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_frame_qp = MAX_H264_QP;
4220*495ae853SAndroid Build Coastguard Worker     UWORD32 max_frame_bits = 0x7FFFFFFF;
4221*495ae853SAndroid Build Coastguard Worker 
4222*495ae853SAndroid Build Coastguard Worker     WORD32 i;
4223*495ae853SAndroid Build Coastguard Worker 
4224*495ae853SAndroid Build Coastguard Worker     /*  Mark that the last input frame has been received */
4225*495ae853SAndroid Build Coastguard Worker     if(ps_ive_ip->u4_is_last == 1)
4226*495ae853SAndroid Build Coastguard Worker     {
4227*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_last_inp_buff_received = 1;
4228*495ae853SAndroid Build Coastguard Worker     }
4229*495ae853SAndroid Build Coastguard Worker 
4230*495ae853SAndroid Build Coastguard Worker     if(ps_ive_ip->s_inp_buf.apv_bufs[0] == NULL && !ps_codec->i4_last_inp_buff_received)
4231*495ae853SAndroid Build Coastguard Worker     {
4232*495ae853SAndroid Build Coastguard Worker         ps_enc_buff->s_inp_props.s_raw_buf.apv_bufs[0] = NULL;
4233*495ae853SAndroid Build Coastguard Worker         ps_enc_buff->s_inp_props.u4_is_last = ps_ive_ip->u4_is_last;
4234*495ae853SAndroid Build Coastguard Worker         return 0;
4235*495ae853SAndroid Build Coastguard Worker     }
4236*495ae853SAndroid Build Coastguard Worker 
4237*495ae853SAndroid Build Coastguard Worker     /***************************************************************************
4238*495ae853SAndroid Build Coastguard Worker      * Check for pre enc skip
4239*495ae853SAndroid Build Coastguard Worker      *   When src and target frame rates donot match, we skip some frames to
4240*495ae853SAndroid Build Coastguard Worker      *   maintain the relation ship between them
4241*495ae853SAndroid Build Coastguard Worker      **************************************************************************/
4242*495ae853SAndroid Build Coastguard Worker     {
4243*495ae853SAndroid Build Coastguard Worker         WORD32 skip_src;
4244*495ae853SAndroid Build Coastguard Worker 
4245*495ae853SAndroid Build Coastguard Worker         skip_src = isvce_update_rc_framerates(
4246*495ae853SAndroid Build Coastguard Worker             ps_codec->s_rate_control.apps_rate_control_api[i1_layer_id],
4247*495ae853SAndroid Build Coastguard Worker             ps_codec->s_rate_control.pps_pd_frm_rate, ps_codec->s_rate_control.pps_time_stamp,
4248*495ae853SAndroid Build Coastguard Worker             ps_codec->s_rate_control.pps_frame_time);
4249*495ae853SAndroid Build Coastguard Worker 
4250*495ae853SAndroid Build Coastguard Worker         if(skip_src)
4251*495ae853SAndroid Build Coastguard Worker         {
4252*495ae853SAndroid Build Coastguard Worker             ps_enc_buff->s_inp_props.u4_is_last = ps_ive_ip->u4_is_last;
4253*495ae853SAndroid Build Coastguard Worker             return 1;
4254*495ae853SAndroid Build Coastguard Worker         }
4255*495ae853SAndroid Build Coastguard Worker     }
4256*495ae853SAndroid Build Coastguard Worker 
4257*495ae853SAndroid Build Coastguard Worker     /***************************************************************************
4258*495ae853SAndroid Build Coastguard Worker      *Queue the input to the queue
4259*495ae853SAndroid Build Coastguard Worker      **************************************************************************/
4260*495ae853SAndroid Build Coastguard Worker     ps_inp_buf = &(ps_codec->as_inp_list[ps_codec->i4_pic_cnt % SVC_MAX_NUM_INP_FRAMES]);
4261*495ae853SAndroid Build Coastguard Worker 
4262*495ae853SAndroid Build Coastguard Worker     /* copy input info. to internal structure */
4263*495ae853SAndroid Build Coastguard Worker     ps_inp_buf->s_inp_props.s_raw_buf = ps_ive_ip->s_inp_buf;
4264*495ae853SAndroid Build Coastguard Worker     ps_inp_buf->s_inp_props.u4_timestamp_low = ps_ive_ip->u4_timestamp_low;
4265*495ae853SAndroid Build Coastguard Worker     ps_inp_buf->s_inp_props.u4_timestamp_high = ps_ive_ip->u4_timestamp_high;
4266*495ae853SAndroid Build Coastguard Worker     ps_inp_buf->s_inp_props.u4_is_last = ps_ive_ip->u4_is_last;
4267*495ae853SAndroid Build Coastguard Worker     ps_inp_buf->s_inp_props.pv_mb_info = ps_ive_ip->pv_mb_info;
4268*495ae853SAndroid Build Coastguard Worker     ps_inp_buf->s_inp_props.u4_mb_info_type = ps_ive_ip->u4_mb_info_type;
4269*495ae853SAndroid Build Coastguard Worker     ps_inp_buf->s_inp_props.pv_pic_info = ps_ive_ip->pv_pic_info;
4270*495ae853SAndroid Build Coastguard Worker     ps_inp_buf->s_inp_props.u4_pic_info_type = ps_ive_ip->u4_pic_info_type;
4271*495ae853SAndroid Build Coastguard Worker 
4272*495ae853SAndroid Build Coastguard Worker     ps_inp_buf->s_inp_props.u1_sei_ccv_params_present_flag =
4273*495ae853SAndroid Build Coastguard Worker         ps_codec->s_cfg.s_sei.u1_sei_ccv_params_present_flag;
4274*495ae853SAndroid Build Coastguard Worker     ps_inp_buf->s_inp_props.s_sei_ccv = ps_codec->s_cfg.s_sei.s_sei_ccv_params;
4275*495ae853SAndroid Build Coastguard Worker 
4276*495ae853SAndroid Build Coastguard Worker     if(ps_inp_buf->s_inp_props.s_raw_buf.apv_bufs[0])
4277*495ae853SAndroid Build Coastguard Worker         isvce_svc_inp_buf_populate(ps_codec, ps_inp_buf);
4278*495ae853SAndroid Build Coastguard Worker 
4279*495ae853SAndroid Build Coastguard Worker     /***************************************************************************
4280*495ae853SAndroid Build Coastguard Worker      * Now we should add the picture to RC stack here
4281*495ae853SAndroid Build Coastguard Worker      **************************************************************************/
4282*495ae853SAndroid Build Coastguard Worker     /*
4283*495ae853SAndroid Build Coastguard Worker      * If an I frame has been requested, ask  RC to force it
4284*495ae853SAndroid Build Coastguard Worker      * For IDR requests, we have to ask RC to force I and set IDR by our selves
4285*495ae853SAndroid Build Coastguard Worker      * since RC Donot know about IDR. For forcing an IDR at dequeue stage we
4286*495ae853SAndroid Build Coastguard Worker      * should record that an IDR has been requested some where. Hence we will
4287*495ae853SAndroid Build Coastguard Worker      * store it in the u4_idr_inp_list at a position same as that of input frame
4288*495ae853SAndroid Build Coastguard Worker      */
4289*495ae853SAndroid Build Coastguard Worker     {
4290*495ae853SAndroid Build Coastguard Worker         WORD32 i4_force_idr, i4_force_i;
4291*495ae853SAndroid Build Coastguard Worker 
4292*495ae853SAndroid Build Coastguard Worker         i4_force_idr = (ps_codec->force_curr_frame_type == IV_IDR_FRAME);
4293*495ae853SAndroid Build Coastguard Worker         i4_force_idr |= !(ps_codec->i4_pic_cnt % ps_codec->s_cfg.u4_idr_frm_interval);
4294*495ae853SAndroid Build Coastguard Worker 
4295*495ae853SAndroid Build Coastguard Worker         i4_force_i = (ps_codec->force_curr_frame_type == IV_I_FRAME);
4296*495ae853SAndroid Build Coastguard Worker 
4297*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_pending_idr_flag |= i4_force_idr;
4298*495ae853SAndroid Build Coastguard Worker 
4299*495ae853SAndroid Build Coastguard Worker         if((ps_codec->i4_pic_cnt > 0) && (i4_force_idr || i4_force_i))
4300*495ae853SAndroid Build Coastguard Worker         {
4301*495ae853SAndroid Build Coastguard Worker             irc_force_I_frame(ps_codec->s_rate_control.apps_rate_control_api[i1_layer_id]);
4302*495ae853SAndroid Build Coastguard Worker         }
4303*495ae853SAndroid Build Coastguard Worker 
4304*495ae853SAndroid Build Coastguard Worker         if(i1_layer_id == (ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers - 1))
4305*495ae853SAndroid Build Coastguard Worker         {
4306*495ae853SAndroid Build Coastguard Worker             ps_codec->force_curr_frame_type = IV_NA_FRAME;
4307*495ae853SAndroid Build Coastguard Worker         }
4308*495ae853SAndroid Build Coastguard Worker     }
4309*495ae853SAndroid Build Coastguard Worker 
4310*495ae853SAndroid Build Coastguard Worker     irc_add_picture_to_stack(ps_codec->s_rate_control.apps_rate_control_api[i1_layer_id],
4311*495ae853SAndroid Build Coastguard Worker                              ps_codec->i4_pic_cnt);
4312*495ae853SAndroid Build Coastguard Worker 
4313*495ae853SAndroid Build Coastguard Worker     /* Delay */
4314*495ae853SAndroid Build Coastguard Worker     if(ps_codec->i4_encode_api_call_cnt < (WORD32) (ps_codec->s_cfg.u4_num_bframes))
4315*495ae853SAndroid Build Coastguard Worker     {
4316*495ae853SAndroid Build Coastguard Worker         ps_enc_buff->s_inp_props.s_raw_buf.apv_bufs[0] = NULL;
4317*495ae853SAndroid Build Coastguard Worker         ps_enc_buff->s_inp_props.u4_is_last = 0;
4318*495ae853SAndroid Build Coastguard Worker         return 0;
4319*495ae853SAndroid Build Coastguard Worker     }
4320*495ae853SAndroid Build Coastguard Worker 
4321*495ae853SAndroid Build Coastguard Worker     /***************************************************************************
4322*495ae853SAndroid Build Coastguard Worker      * Get a new pic to encode
4323*495ae853SAndroid Build Coastguard Worker      **************************************************************************/
4324*495ae853SAndroid Build Coastguard Worker     /* Query the picture_type */
4325*495ae853SAndroid Build Coastguard Worker     e_pictype =
4326*495ae853SAndroid Build Coastguard Worker         isvce_rc_get_picture_details(ps_codec->s_rate_control.apps_rate_control_api[i1_layer_id],
4327*495ae853SAndroid Build Coastguard Worker                                      (WORD32 *) (&u4_pic_id), (WORD32 *) (&u4_pic_disp_id));
4328*495ae853SAndroid Build Coastguard Worker 
4329*495ae853SAndroid Build Coastguard Worker     switch(e_pictype)
4330*495ae853SAndroid Build Coastguard Worker     {
4331*495ae853SAndroid Build Coastguard Worker         case I_PIC:
4332*495ae853SAndroid Build Coastguard Worker             ps_codec->pic_type = PIC_I;
4333*495ae853SAndroid Build Coastguard Worker             break;
4334*495ae853SAndroid Build Coastguard Worker         case P_PIC:
4335*495ae853SAndroid Build Coastguard Worker             ps_codec->pic_type = PIC_P;
4336*495ae853SAndroid Build Coastguard Worker             break;
4337*495ae853SAndroid Build Coastguard Worker         case B_PIC:
4338*495ae853SAndroid Build Coastguard Worker             ps_codec->pic_type = PIC_B;
4339*495ae853SAndroid Build Coastguard Worker             break;
4340*495ae853SAndroid Build Coastguard Worker         default:
4341*495ae853SAndroid Build Coastguard Worker             ps_codec->pic_type = PIC_NA;
4342*495ae853SAndroid Build Coastguard Worker             ps_enc_buff->s_inp_props.s_raw_buf.apv_bufs[0] = NULL;
4343*495ae853SAndroid Build Coastguard Worker             return 0;
4344*495ae853SAndroid Build Coastguard Worker     }
4345*495ae853SAndroid Build Coastguard Worker 
4346*495ae853SAndroid Build Coastguard Worker     /* Set IDR if it has been requested */
4347*495ae853SAndroid Build Coastguard Worker     if(ps_codec->pic_type == PIC_I)
4348*495ae853SAndroid Build Coastguard Worker     {
4349*495ae853SAndroid Build Coastguard Worker         ps_codec->pic_type = ps_codec->i4_pending_idr_flag ? PIC_IDR : ps_codec->pic_type;
4350*495ae853SAndroid Build Coastguard Worker         ps_codec->i4_pending_idr_flag = 0;
4351*495ae853SAndroid Build Coastguard Worker     }
4352*495ae853SAndroid Build Coastguard Worker 
4353*495ae853SAndroid Build Coastguard Worker     if(ps_codec->s_rate_control.e_rc_type != CONST_QP && ps_codec->u1_enable_init_qp &&
4354*495ae853SAndroid Build Coastguard Worker        (u4_pic_id == 0 ||
4355*495ae853SAndroid Build Coastguard Worker         irc_is_scenecut(ps_codec->s_rate_control.apps_rate_control_api[i1_layer_id])))
4356*495ae853SAndroid Build Coastguard Worker     {
4357*495ae853SAndroid Build Coastguard Worker         DOUBLE d_bpp;
4358*495ae853SAndroid Build Coastguard Worker 
4359*495ae853SAndroid Build Coastguard Worker         svc_rc_utils_ctxt_t *ps_svc_rc_utils = &ps_codec->s_rate_control.s_rc_utils;
4360*495ae853SAndroid Build Coastguard Worker 
4361*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_src_fps = ps_codec->s_cfg.u4_src_frame_rate / 1000;
4362*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_wd = ps_inp_buf->as_layer_yuv_buf_props[i1_layer_id].u4_width;
4363*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_ht = ps_inp_buf->as_layer_yuv_buf_props[i1_layer_id].u4_height;
4364*495ae853SAndroid Build Coastguard Worker         DOUBLE d_gpp =
4365*495ae853SAndroid Build Coastguard Worker             isvce_compute_gpp(ps_svc_rc_utils, &ps_inp_buf->as_layer_yuv_buf_props[i1_layer_id]);
4366*495ae853SAndroid Build Coastguard Worker 
4367*495ae853SAndroid Build Coastguard Worker         d_bpp = ((DOUBLE) irc_get_vbv_buf_size(
4368*495ae853SAndroid Build Coastguard Worker                      ps_codec->s_rate_control.apps_rate_control_api[i1_layer_id]) /
4369*495ae853SAndroid Build Coastguard Worker                  10.) /
4370*495ae853SAndroid Build Coastguard Worker                 ((DOUBLE) (u4_src_fps * u4_wd * u4_ht));
4371*495ae853SAndroid Build Coastguard Worker 
4372*495ae853SAndroid Build Coastguard Worker         u1_frame_qp = (UWORD8) irc_get_frame_level_init_qp(
4373*495ae853SAndroid Build Coastguard Worker             ps_codec->s_rate_control.apps_rate_control_api[i1_layer_id],
4374*495ae853SAndroid Build Coastguard Worker             ps_codec->s_rate_control.e_rc_type, e_pictype, d_bpp, d_gpp);
4375*495ae853SAndroid Build Coastguard Worker 
4376*495ae853SAndroid Build Coastguard Worker         isvce_change_rc_init_qp(ps_codec->s_rate_control.apps_rate_control_api[i1_layer_id],
4377*495ae853SAndroid Build Coastguard Worker                                 u1_frame_qp);
4378*495ae853SAndroid Build Coastguard Worker 
4379*495ae853SAndroid Build Coastguard Worker         ps_codec->au4_frame_qp[i1_layer_id] = u1_frame_qp;
4380*495ae853SAndroid Build Coastguard Worker     }
4381*495ae853SAndroid Build Coastguard Worker     else
4382*495ae853SAndroid Build Coastguard Worker     {
4383*495ae853SAndroid Build Coastguard Worker         /* Get current frame Qp */
4384*495ae853SAndroid Build Coastguard Worker         u1_frame_qp = (UWORD8) irc_get_frame_level_qp(
4385*495ae853SAndroid Build Coastguard Worker             ps_codec->s_rate_control.apps_rate_control_api[i1_layer_id], e_pictype, max_frame_bits);
4386*495ae853SAndroid Build Coastguard Worker         ps_codec->au4_frame_qp[i1_layer_id] = gau1_mpeg2_to_h264_qmap[u1_frame_qp];
4387*495ae853SAndroid Build Coastguard Worker     }
4388*495ae853SAndroid Build Coastguard Worker 
4389*495ae853SAndroid Build Coastguard Worker     /*
4390*495ae853SAndroid Build Coastguard Worker      * copy the pic id to poc because the display order is assumed to be same
4391*495ae853SAndroid Build Coastguard Worker      * as input order
4392*495ae853SAndroid Build Coastguard Worker      */
4393*495ae853SAndroid Build Coastguard Worker     ps_codec->i4_poc = u4_pic_id;
4394*495ae853SAndroid Build Coastguard Worker 
4395*495ae853SAndroid Build Coastguard Worker     /***************************************************************************
4396*495ae853SAndroid Build Coastguard Worker      * Now retrieve the correct picture from the queue
4397*495ae853SAndroid Build Coastguard Worker      **************************************************************************/
4398*495ae853SAndroid Build Coastguard Worker 
4399*495ae853SAndroid Build Coastguard Worker     /* Mark the skip flag   */
4400*495ae853SAndroid Build Coastguard Worker     i4_skip = 0;
4401*495ae853SAndroid Build Coastguard Worker     ctxt_sel = ps_codec->i4_encode_api_call_cnt % MAX_CTXT_SETS;
4402*495ae853SAndroid Build Coastguard Worker     ps_codec->s_rate_control.pre_encode_skip[ctxt_sel] = i4_skip;
4403*495ae853SAndroid Build Coastguard Worker 
4404*495ae853SAndroid Build Coastguard Worker     /* Get a buffer to encode */
4405*495ae853SAndroid Build Coastguard Worker     ps_inp_buf = &(ps_codec->as_inp_list[u4_pic_id % SVC_MAX_NUM_INP_FRAMES]);
4406*495ae853SAndroid Build Coastguard Worker 
4407*495ae853SAndroid Build Coastguard Worker     /* copy dequeued input to output */
4408*495ae853SAndroid Build Coastguard Worker     ps_enc_buff[0] = ps_inp_buf[0];
4409*495ae853SAndroid Build Coastguard Worker 
4410*495ae853SAndroid Build Coastguard Worker     /* Special case for encoding trailing B frames
4411*495ae853SAndroid Build Coastguard Worker      *
4412*495ae853SAndroid Build Coastguard Worker      * In encoding streams with B frames it may happen that we have a B frame
4413*495ae853SAndroid Build Coastguard Worker      * at the end without a P/I frame after it. Hence when we are dequeing from
4414*495ae853SAndroid Build Coastguard Worker      * the RC, it will return the P frame [next in display order but before in
4415*495ae853SAndroid Build Coastguard Worker      * encoding order] first. Since the dequeue happens for an invalid frame we
4416*495ae853SAndroid Build Coastguard Worker      * will get a frame with null buff and set u4_is_last. Hence lib with return
4417*495ae853SAndroid Build Coastguard Worker      * last frame flag at this point and will stop encoding.
4418*495ae853SAndroid Build Coastguard Worker      *
4419*495ae853SAndroid Build Coastguard Worker      * Since for the last B frame, we does not have the forward ref frame
4420*495ae853SAndroid Build Coastguard Worker      * it makes sense to force it into P.
4421*495ae853SAndroid Build Coastguard Worker      *
4422*495ae853SAndroid Build Coastguard Worker      * To solve this, in case the current frame is P and if the last frame flag
4423*495ae853SAndroid Build Coastguard Worker      * is set, we need to see if there is and pending B frames. If there are any,
4424*495ae853SAndroid Build Coastguard Worker      * we should just encode that picture as the current P frame and set
4425*495ae853SAndroid Build Coastguard Worker      * that B frame as the last frame. Hence the encoder will terminate naturally
4426*495ae853SAndroid Build Coastguard Worker      * once that B-frame is encoded after all the in between frames.
4427*495ae853SAndroid Build Coastguard Worker      *
4428*495ae853SAndroid Build Coastguard Worker      * Since we cannot touch RC stack directly, the option of actually swapping
4429*495ae853SAndroid Build Coastguard Worker      * frames in RC is ruled out. We have to modify the as_inp_list to simulate
4430*495ae853SAndroid Build Coastguard Worker      * such a behavior by RC. We can do that by
4431*495ae853SAndroid Build Coastguard Worker      *  1) Search through as_inp_list to locate the largest u4_timestamp_low less
4432*495ae853SAndroid Build Coastguard Worker      *     than current u4_timestamp_low. This will give us the last B frame
4433*495ae853SAndroid Build Coastguard Worker      * before the current P frame. Note that this will handle pre encode skip too
4434*495ae853SAndroid Build Coastguard Worker      * since queue happens after pre enc skip. 2) Swap the position in
4435*495ae853SAndroid Build Coastguard Worker      * as_inp_list. Hence now the last B frame is encoded as P frame. And the new
4436*495ae853SAndroid Build Coastguard Worker      * last B frame will have u4_is_last set so that encoder will end naturally
4437*495ae853SAndroid Build Coastguard Worker      * once we reached that B frame or any subsequent frame. Also the current GOP
4438*495ae853SAndroid Build Coastguard Worker      * will have 1 less B frame Since we are swapping, the poc will also be
4439*495ae853SAndroid Build Coastguard Worker      * in-order. 3) In case we have an IPP stream, the result of our search will
4440*495ae853SAndroid Build Coastguard Worker      * be an I/P frame which is already encoded. Thus swap and encode will result
4441*495ae853SAndroid Build Coastguard Worker      *     in encoding of duplicate frames. Hence to avoid this we will only
4442*495ae853SAndroid Build Coastguard Worker      *     have this work around in case of u4_num_bframes > 0.
4443*495ae853SAndroid Build Coastguard Worker      *
4444*495ae853SAndroid Build Coastguard Worker      *     In case we have forced an I/IDR frame In between this P frame and
4445*495ae853SAndroid Build Coastguard Worker      *     the last B frame -> This cannot happen as the current P frame is
4446*495ae853SAndroid Build Coastguard Worker      *     supposed to have u4_is_last set. Thus forcing an I/ IDR after this
4447*495ae853SAndroid Build Coastguard Worker      *     is illogical.
4448*495ae853SAndroid Build Coastguard Worker      *
4449*495ae853SAndroid Build Coastguard Worker      *     In cae if we have forced an I such that the frame just before last
4450*495ae853SAndroid Build Coastguard Worker      * frame in is I/P -> This case will never arise. Since we have a closed GOP
4451*495ae853SAndroid Build Coastguard Worker      * now, once we force an I, the gop gets reset, hence there will be a B
4452*495ae853SAndroid Build Coastguard Worker      * between I/P and I/P.
4453*495ae853SAndroid Build Coastguard Worker      */
4454*495ae853SAndroid Build Coastguard Worker     if(ps_enc_buff->s_inp_props.u4_is_last && (ps_codec->pic_type == PIC_P) &&
4455*495ae853SAndroid Build Coastguard Worker        ps_codec->s_cfg.u4_num_bframes)
4456*495ae853SAndroid Build Coastguard Worker     {
4457*495ae853SAndroid Build Coastguard Worker         WORD32 cntr;
4458*495ae853SAndroid Build Coastguard Worker         WORD32 lst_bframe = -1;
4459*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_timestamp_low = 0;
4460*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_timestamp_high = 0;
4461*495ae853SAndroid Build Coastguard Worker         isvce_inp_buf_t *ps_swap_buff, *ps_inp_list;
4462*495ae853SAndroid Build Coastguard Worker 
4463*495ae853SAndroid Build Coastguard Worker         ps_inp_list = &ps_codec->as_inp_list[0];
4464*495ae853SAndroid Build Coastguard Worker 
4465*495ae853SAndroid Build Coastguard Worker         /* Now search the inp list for highest timestamp */
4466*495ae853SAndroid Build Coastguard Worker         for(cntr = 0; cntr < SVC_MAX_NUM_INP_FRAMES; cntr++)
4467*495ae853SAndroid Build Coastguard Worker         {
4468*495ae853SAndroid Build Coastguard Worker             if(ps_inp_list[cntr].s_inp_props.s_raw_buf.apv_bufs[0] != NULL)
4469*495ae853SAndroid Build Coastguard Worker             {
4470*495ae853SAndroid Build Coastguard Worker                 if((ps_inp_list[cntr].s_inp_props.u4_timestamp_high > u4_timestamp_high) ||
4471*495ae853SAndroid Build Coastguard Worker                    (ps_inp_list[cntr].s_inp_props.u4_timestamp_high == u4_timestamp_high &&
4472*495ae853SAndroid Build Coastguard Worker                     ps_inp_list[cntr].s_inp_props.u4_timestamp_low > u4_timestamp_low))
4473*495ae853SAndroid Build Coastguard Worker                 {
4474*495ae853SAndroid Build Coastguard Worker                     u4_timestamp_low = ps_inp_list[cntr].s_inp_props.u4_timestamp_low;
4475*495ae853SAndroid Build Coastguard Worker                     u4_timestamp_high = ps_inp_list[cntr].s_inp_props.u4_timestamp_high;
4476*495ae853SAndroid Build Coastguard Worker                     lst_bframe = cntr;
4477*495ae853SAndroid Build Coastguard Worker                 }
4478*495ae853SAndroid Build Coastguard Worker             }
4479*495ae853SAndroid Build Coastguard Worker         }
4480*495ae853SAndroid Build Coastguard Worker 
4481*495ae853SAndroid Build Coastguard Worker         if(lst_bframe != -1)
4482*495ae853SAndroid Build Coastguard Worker         {
4483*495ae853SAndroid Build Coastguard Worker             ps_swap_buff = &(ps_codec->as_inp_list[lst_bframe]);
4484*495ae853SAndroid Build Coastguard Worker 
4485*495ae853SAndroid Build Coastguard Worker             /* copy the last B buffer to output */
4486*495ae853SAndroid Build Coastguard Worker             *ps_enc_buff = *ps_swap_buff;
4487*495ae853SAndroid Build Coastguard Worker 
4488*495ae853SAndroid Build Coastguard Worker             /* Store the current buf into the queue in place of last B buf */
4489*495ae853SAndroid Build Coastguard Worker             *ps_swap_buff = *ps_inp_buf;
4490*495ae853SAndroid Build Coastguard Worker         }
4491*495ae853SAndroid Build Coastguard Worker     }
4492*495ae853SAndroid Build Coastguard Worker 
4493*495ae853SAndroid Build Coastguard Worker     if(ps_enc_buff->s_inp_props.u4_is_last)
4494*495ae853SAndroid Build Coastguard Worker     {
4495*495ae853SAndroid Build Coastguard Worker         ps_codec->pic_type = PIC_NA;
4496*495ae853SAndroid Build Coastguard Worker     }
4497*495ae853SAndroid Build Coastguard Worker 
4498*495ae853SAndroid Build Coastguard Worker     /* The buffer in the queue is set to NULL to specify that encoding is done for
4499*495ae853SAndroid Build Coastguard Worker      * that frame */
4500*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < 3; i++)
4501*495ae853SAndroid Build Coastguard Worker     {
4502*495ae853SAndroid Build Coastguard Worker         ps_inp_buf->s_inp_props.s_raw_buf.apv_bufs[i] = NULL;
4503*495ae853SAndroid Build Coastguard Worker     }
4504*495ae853SAndroid Build Coastguard Worker 
4505*495ae853SAndroid Build Coastguard Worker     /* Return the buffer status */
4506*495ae853SAndroid Build Coastguard Worker     return (0);
4507*495ae853SAndroid Build Coastguard Worker }
4508*495ae853SAndroid Build Coastguard Worker 
4509*495ae853SAndroid Build Coastguard Worker /**
4510*495ae853SAndroid Build Coastguard Worker ******************************************************************************
4511*495ae853SAndroid Build Coastguard Worker *
4512*495ae853SAndroid Build Coastguard Worker * @brief
4513*495ae853SAndroid Build Coastguard Worker *  This function joins all the spawned threads after successful completion of
4514*495ae853SAndroid Build Coastguard Worker *  their tasks
4515*495ae853SAndroid Build Coastguard Worker *
4516*495ae853SAndroid Build Coastguard Worker * @par   Description
4517*495ae853SAndroid Build Coastguard Worker *
4518*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
4519*495ae853SAndroid Build Coastguard Worker *  pointer to codec context
4520*495ae853SAndroid Build Coastguard Worker *
4521*495ae853SAndroid Build Coastguard Worker * @returns  none
4522*495ae853SAndroid Build Coastguard Worker *
4523*495ae853SAndroid Build Coastguard Worker ******************************************************************************
4524*495ae853SAndroid Build Coastguard Worker */
isvce_join_threads(isvce_codec_t * ps_codec)4525*495ae853SAndroid Build Coastguard Worker void isvce_join_threads(isvce_codec_t *ps_codec)
4526*495ae853SAndroid Build Coastguard Worker {
4527*495ae853SAndroid Build Coastguard Worker     WORD32 i = 0;
4528*495ae853SAndroid Build Coastguard Worker     WORD32 ret = 0;
4529*495ae853SAndroid Build Coastguard Worker 
4530*495ae853SAndroid Build Coastguard Worker     /* join spawned threads */
4531*495ae853SAndroid Build Coastguard Worker     while(i < ps_codec->i4_proc_thread_cnt)
4532*495ae853SAndroid Build Coastguard Worker     {
4533*495ae853SAndroid Build Coastguard Worker         if(ps_codec->ai4_process_thread_created[i])
4534*495ae853SAndroid Build Coastguard Worker         {
4535*495ae853SAndroid Build Coastguard Worker             ret = ithread_join(ps_codec->apv_proc_thread_handle[i], NULL);
4536*495ae853SAndroid Build Coastguard Worker 
4537*495ae853SAndroid Build Coastguard Worker             if(ret != 0)
4538*495ae853SAndroid Build Coastguard Worker             {
4539*495ae853SAndroid Build Coastguard Worker                 ASSERT(0);
4540*495ae853SAndroid Build Coastguard Worker             }
4541*495ae853SAndroid Build Coastguard Worker 
4542*495ae853SAndroid Build Coastguard Worker             ps_codec->ai4_process_thread_created[i] = 0;
4543*495ae853SAndroid Build Coastguard Worker             i++;
4544*495ae853SAndroid Build Coastguard Worker         }
4545*495ae853SAndroid Build Coastguard Worker     }
4546*495ae853SAndroid Build Coastguard Worker 
4547*495ae853SAndroid Build Coastguard Worker     ps_codec->i4_proc_thread_cnt = 0;
4548*495ae853SAndroid Build Coastguard Worker }
4549*495ae853SAndroid Build Coastguard Worker 
isvce_get_min_outbuf_size(UWORD32 u4_wd,UWORD32 u4_ht,UWORD8 u1_num_spatial_layers)4550*495ae853SAndroid Build Coastguard Worker UWORD32 isvce_get_min_outbuf_size(UWORD32 u4_wd, UWORD32 u4_ht, UWORD8 u1_num_spatial_layers)
4551*495ae853SAndroid Build Coastguard Worker {
4552*495ae853SAndroid Build Coastguard Worker     return MAX((u4_wd * u4_ht * 3), MIN_STREAM_SIZE) * u1_num_spatial_layers;
4553*495ae853SAndroid Build Coastguard Worker }