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 * @file
23*495ae853SAndroid Build Coastguard Worker * isvcd_utils.c
24*495ae853SAndroid Build Coastguard Worker *
25*495ae853SAndroid Build Coastguard Worker * @brief
26*495ae853SAndroid Build Coastguard Worker * Contains routines that handle of start and end of pic processing
27*495ae853SAndroid Build Coastguard Worker *
28*495ae853SAndroid Build Coastguard Worker * @author
29*495ae853SAndroid Build Coastguard Worker * Kishore
30*495ae853SAndroid Build Coastguard Worker *
31*495ae853SAndroid Build Coastguard Worker * @remarks
32*495ae853SAndroid Build Coastguard Worker * None
33*495ae853SAndroid Build Coastguard Worker *
34*495ae853SAndroid Build Coastguard Worker *******************************************************************************
35*495ae853SAndroid Build Coastguard Worker */
36*495ae853SAndroid Build Coastguard Worker
37*495ae853SAndroid Build Coastguard Worker #include <string.h>
38*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
39*495ae853SAndroid Build Coastguard Worker #include "ithread.h"
40*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
45*495ae853SAndroid Build Coastguard Worker #include "isvcd_structs.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264d_mem_request.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
50*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
51*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
55*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
56*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
58*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
59*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
60*495ae853SAndroid Build Coastguard Worker #include "iv.h"
61*495ae853SAndroid Build Coastguard Worker #include "ivd.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264d_format_conv.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
64*495ae853SAndroid Build Coastguard Worker #include "ih264_disp_mgr.h"
65*495ae853SAndroid Build Coastguard Worker #include "ih264_buf_mgr.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
67*495ae853SAndroid Build Coastguard Worker
68*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_init_dec_mb_grp(dec_struct_t *ps_dec);
69*495ae853SAndroid Build Coastguard Worker /*!
70*495ae853SAndroid Build Coastguard Worker **************************************************************************
71*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_free_dynamic_bufs \endif
72*495ae853SAndroid Build Coastguard Worker *
73*495ae853SAndroid Build Coastguard Worker * \brief
74*495ae853SAndroid Build Coastguard Worker * This function frees dynamic memory allocated by Decoder.
75*495ae853SAndroid Build Coastguard Worker *
76*495ae853SAndroid Build Coastguard Worker * \param ps_dec: Pointer to dec_struct_t.
77*495ae853SAndroid Build Coastguard Worker *
78*495ae853SAndroid Build Coastguard Worker * \return
79*495ae853SAndroid Build Coastguard Worker * Returns i4_status as returned by MemManager.
80*495ae853SAndroid Build Coastguard Worker *
81*495ae853SAndroid Build Coastguard Worker **************************************************************************
82*495ae853SAndroid Build Coastguard Worker */
isvcd_free_dynamic_bufs(svc_dec_lyr_struct_t * ps_svc_lyr_dec)83*495ae853SAndroid Build Coastguard Worker WORD16 isvcd_free_dynamic_bufs(svc_dec_lyr_struct_t *ps_svc_lyr_dec)
84*495ae853SAndroid Build Coastguard Worker {
85*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
86*495ae853SAndroid Build Coastguard Worker /* Free any avc dynamic buffers that are allocated */
87*495ae853SAndroid Build Coastguard Worker ih264d_free_dynamic_bufs(ps_dec);
88*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->pu1_crop_wnd_flag);
89*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->ps_inter_lyr_mb_prms_base);
90*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_base);
91*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->pi2_il_residual_resample_luma_base);
92*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->pi2_il_residual_resample_chroma_base);
93*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->ps_svc_frm_mb_info);
94*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->pu2_frm_res_luma_csbp);
95*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_svc_lyr_dec->pu1_svc_base_mode_flag);
96*495ae853SAndroid Build Coastguard Worker return 0;
97*495ae853SAndroid Build Coastguard Worker }
98*495ae853SAndroid Build Coastguard Worker
99*495ae853SAndroid Build Coastguard Worker /*!
100*495ae853SAndroid Build Coastguard Worker **************************************************************************
101*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_allocate_dynamic_bufs \endif
102*495ae853SAndroid Build Coastguard Worker *
103*495ae853SAndroid Build Coastguard Worker * \brief
104*495ae853SAndroid Build Coastguard Worker * This function allocates memory required by Decoder.
105*495ae853SAndroid Build Coastguard Worker *
106*495ae853SAndroid Build Coastguard Worker * \param ps_dec: Pointer to dec_struct_t.
107*495ae853SAndroid Build Coastguard Worker *
108*495ae853SAndroid Build Coastguard Worker * \return
109*495ae853SAndroid Build Coastguard Worker * Returns i4_status as returned by MemManager.
110*495ae853SAndroid Build Coastguard Worker *
111*495ae853SAndroid Build Coastguard Worker **************************************************************************
112*495ae853SAndroid Build Coastguard Worker */
113*495ae853SAndroid Build Coastguard Worker
isvcd_allocate_dynamic_bufs(svc_dec_lyr_struct_t * ps_svc_lyr_dec)114*495ae853SAndroid Build Coastguard Worker WORD16 isvcd_allocate_dynamic_bufs(svc_dec_lyr_struct_t *ps_svc_lyr_dec)
115*495ae853SAndroid Build Coastguard Worker {
116*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
117*495ae853SAndroid Build Coastguard Worker WORD16 i16_status = 0;
118*495ae853SAndroid Build Coastguard Worker UWORD8 uc_frmOrFld = (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag);
119*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_sps = ps_dec->ps_cur_sps;
120*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_mbs = ps_sps->u2_total_num_of_mbs << uc_frmOrFld;
121*495ae853SAndroid Build Coastguard Worker WORD32 size;
122*495ae853SAndroid Build Coastguard Worker void *pv_buf;
123*495ae853SAndroid Build Coastguard Worker void *pv_mem_ctxt = ps_dec->pv_mem_ctxt;
124*495ae853SAndroid Build Coastguard Worker size = u4_total_mbs;
125*495ae853SAndroid Build Coastguard Worker
126*495ae853SAndroid Build Coastguard Worker i16_status = ih264d_allocate_dynamic_bufs(ps_dec);
127*495ae853SAndroid Build Coastguard Worker
128*495ae853SAndroid Build Coastguard Worker if(i16_status != OK)
129*495ae853SAndroid Build Coastguard Worker {
130*495ae853SAndroid Build Coastguard Worker /* Free any dynamic buffers that are allocated */
131*495ae853SAndroid Build Coastguard Worker ih264d_free_dynamic_bufs(ps_dec);
132*495ae853SAndroid Build Coastguard Worker ps_dec->i4_error_code = IVD_MEM_ALLOC_FAILED;
133*495ae853SAndroid Build Coastguard Worker return IVD_MEM_ALLOC_FAILED;
134*495ae853SAndroid Build Coastguard Worker }
135*495ae853SAndroid Build Coastguard Worker if(u4_total_mbs == 0)
136*495ae853SAndroid Build Coastguard Worker {
137*495ae853SAndroid Build Coastguard Worker return IVD_MEM_ALLOC_FAILED;
138*495ae853SAndroid Build Coastguard Worker }
139*495ae853SAndroid Build Coastguard Worker
140*495ae853SAndroid Build Coastguard Worker /* Allocate frame level mb info */
141*495ae853SAndroid Build Coastguard Worker size = sizeof(dec_svc_mb_info_t) * u4_total_mbs;
142*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
143*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
144*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_svc_frm_mb_info = pv_buf;
145*495ae853SAndroid Build Coastguard Worker memset(ps_svc_lyr_dec->ps_svc_frm_mb_info, 0, size);
146*495ae853SAndroid Build Coastguard Worker
147*495ae853SAndroid Build Coastguard Worker /* Allocate frame level residual luma csbp info */
148*495ae853SAndroid Build Coastguard Worker size = sizeof(UWORD16) * u4_total_mbs;
149*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
150*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
151*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pu2_frm_res_luma_csbp = pv_buf;
152*495ae853SAndroid Build Coastguard Worker memset(ps_svc_lyr_dec->pu2_frm_res_luma_csbp, 0, size);
153*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride = ps_dec->u2_frm_wd_in_mbs;
154*495ae853SAndroid Build Coastguard Worker
155*495ae853SAndroid Build Coastguard Worker /* Allocate frame level residual luma csbp info */
156*495ae853SAndroid Build Coastguard Worker size = sizeof(UWORD8) * u4_total_mbs;
157*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
158*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
159*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pu1_svc_base_mode_flag = pv_buf;
160*495ae853SAndroid Build Coastguard Worker memset(ps_svc_lyr_dec->pu1_svc_base_mode_flag, 0, size);
161*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride = ps_dec->u2_frm_wd_in_mbs;
162*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_size = u4_total_mbs;
163*495ae853SAndroid Build Coastguard Worker
164*495ae853SAndroid Build Coastguard Worker /* Allocate frame level crop windows flags */
165*495ae853SAndroid Build Coastguard Worker size = sizeof(UWORD8) * u4_total_mbs;
166*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
167*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
168*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pu1_crop_wnd_flag = pv_buf;
169*495ae853SAndroid Build Coastguard Worker memset(ps_svc_lyr_dec->pu1_crop_wnd_flag, 0, size);
170*495ae853SAndroid Build Coastguard Worker
171*495ae853SAndroid Build Coastguard Worker /**********************************/
172*495ae853SAndroid Build Coastguard Worker /*Creation of Inter layer buffers */
173*495ae853SAndroid Build Coastguard Worker /**********************************/
174*495ae853SAndroid Build Coastguard Worker
175*495ae853SAndroid Build Coastguard Worker /* MB type buffer : one element per MB */
176*495ae853SAndroid Build Coastguard Worker size = (ps_dec->u2_frm_wd_in_mbs + 2) * (ps_dec->u2_frm_ht_in_mbs + 2) *
177*495ae853SAndroid Build Coastguard Worker sizeof(inter_lyr_mb_prms_t);
178*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
179*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
180*495ae853SAndroid Build Coastguard Worker memset(pv_buf, -1, size);
181*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_base = pv_buf;
182*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride = ps_dec->u2_frm_wd_in_mbs + 2;
183*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start =
184*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_base + 1 + ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride;
185*495ae853SAndroid Build Coastguard Worker
186*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->u4_inter_lyr_mb_prms_size = (ps_dec->u2_frm_wd_in_mbs + 2) *
187*495ae853SAndroid Build Coastguard Worker (ps_dec->u2_frm_ht_in_mbs + 2) *
188*495ae853SAndroid Build Coastguard Worker sizeof(inter_lyr_mb_prms_t);
189*495ae853SAndroid Build Coastguard Worker
190*495ae853SAndroid Build Coastguard Worker /* Luma Residual data at each layer : dafault 0*/
191*495ae853SAndroid Build Coastguard Worker size = ((ps_dec->u2_pic_wd + 4) * (ps_dec->u2_pic_ht + 4)) * sizeof(WORD16);
192*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
193*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
194*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
195*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pi2_il_residual_resample_luma_base = pv_buf;
196*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->u2_residual_resample_luma_stride = (ps_dec->u2_pic_wd + 4);
197*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pi2_il_residual_resample_mb_luma_frm_start =
198*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pi2_il_residual_resample_luma_base + 2 +
199*495ae853SAndroid Build Coastguard Worker (2 * ps_svc_lyr_dec->u2_residual_resample_luma_stride);
200*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->u4_residual_resample_luma_size =
201*495ae853SAndroid Build Coastguard Worker ((ps_dec->u2_pic_wd + 4) * (ps_dec->u2_pic_ht + 4)) * sizeof(WORD16);
202*495ae853SAndroid Build Coastguard Worker
203*495ae853SAndroid Build Coastguard Worker /* Chroma Residual data at each layer : dafault 0*/
204*495ae853SAndroid Build Coastguard Worker size = (((4 + ps_dec->u2_pic_wd) * ((4 + ps_dec->u2_pic_ht) >> 1)) * sizeof(WORD16));
205*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
206*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
207*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
208*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pi2_il_residual_resample_chroma_base = pv_buf;
209*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->u2_residual_resample_chroma_stride = (ps_dec->u2_pic_wd + 4);
210*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pi2_il_residual_resample_mb_chroma_frm_start =
211*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pi2_il_residual_resample_chroma_base + 2 +
212*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->u2_residual_resample_chroma_stride;
213*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->u4_residual_resample_chroma_size =
214*495ae853SAndroid Build Coastguard Worker (((4 + ps_dec->u2_pic_wd) * ((4 + ps_dec->u2_pic_ht) >> 1)) * sizeof(WORD16));
215*495ae853SAndroid Build Coastguard Worker
216*495ae853SAndroid Build Coastguard Worker /* mv bank buffer : 16 elements per MB: each at 4x4 block level */
217*495ae853SAndroid Build Coastguard Worker size = ((ps_dec->u2_pic_wd) * (ps_dec->u2_pic_ht >> 4)) * sizeof(mv_pred_t);
218*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
219*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
220*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
221*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_il_pred_mv_bank_buf_base = pv_buf;
222*495ae853SAndroid Build Coastguard Worker
223*495ae853SAndroid Build Coastguard Worker /*syntax for SVC related bin ctxt tables*/
224*495ae853SAndroid Build Coastguard Worker {
225*495ae853SAndroid Build Coastguard Worker bin_ctxt_model_t *const p_cabac_ctxt_table_t = ps_dec->p_cabac_ctxt_table_t;
226*495ae853SAndroid Build Coastguard Worker
227*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_base_mode_flag = p_cabac_ctxt_table_t + CABAC_BASE_MODE_FLAG;
228*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_motion_prediction_flag_l0 = p_cabac_ctxt_table_t + CABAC_MOT_PRED_FLAG0;
229*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_motion_prediction_flag_l1 = p_cabac_ctxt_table_t + CABAC_MOT_PRED_FLAG1;
230*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_residual_prediction_flag = p_cabac_ctxt_table_t + CABAC_RES_PRED_FLAG;
231*495ae853SAndroid Build Coastguard Worker }
232*495ae853SAndroid Build Coastguard Worker return (i16_status);
233*495ae853SAndroid Build Coastguard Worker }
234*495ae853SAndroid Build Coastguard Worker
235*495ae853SAndroid Build Coastguard Worker /*!
236*495ae853SAndroid Build Coastguard Worker **************************************************************************
237*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_decode_pic_order_cnt \endif
238*495ae853SAndroid Build Coastguard Worker *
239*495ae853SAndroid Build Coastguard Worker * \brief
240*495ae853SAndroid Build Coastguard Worker * Calculates picture order count of picture.
241*495ae853SAndroid Build Coastguard Worker *
242*495ae853SAndroid Build Coastguard Worker * \return
243*495ae853SAndroid Build Coastguard Worker * Returns the pic order count of the picture to which current
244*495ae853SAndroid Build Coastguard Worker * Slice belongs.
245*495ae853SAndroid Build Coastguard Worker *
246*495ae853SAndroid Build Coastguard Worker **************************************************************************
247*495ae853SAndroid Build Coastguard Worker */
isvcd_decode_pic_order_cnt(UWORD8 u1_is_idr_slice,UWORD32 u2_frame_num,pocstruct_t * ps_prev_poc,pocstruct_t * ps_cur_poc,dec_slice_params_t * ps_cur_slice,dec_pic_params_t * ps_pps,UWORD8 u1_nal_ref_idc,UWORD8 u1_bottom_field_flag,UWORD8 u1_field_pic_flag,WORD32 * pi4_poc,dec_struct_t * ps_dec)248*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_decode_pic_order_cnt(
249*495ae853SAndroid Build Coastguard Worker UWORD8 u1_is_idr_slice, UWORD32 u2_frame_num, pocstruct_t *ps_prev_poc, pocstruct_t *ps_cur_poc,
250*495ae853SAndroid Build Coastguard Worker dec_slice_params_t *ps_cur_slice, /*!< Pointer to current slice Params*/
251*495ae853SAndroid Build Coastguard Worker dec_pic_params_t *ps_pps, UWORD8 u1_nal_ref_idc, UWORD8 u1_bottom_field_flag,
252*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_pic_flag, WORD32 *pi4_poc, dec_struct_t *ps_dec)
253*495ae853SAndroid Build Coastguard Worker {
254*495ae853SAndroid Build Coastguard Worker WORD64 i8_pic_msb;
255*495ae853SAndroid Build Coastguard Worker WORD32 i4_top_field_order_cnt = 0, i4_bottom_field_order_cnt = 0;
256*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_seq = ps_dec->ps_cur_sps;
257*495ae853SAndroid Build Coastguard Worker WORD32 i4_prev_frame_num_ofst;
258*495ae853SAndroid Build Coastguard Worker
259*495ae853SAndroid Build Coastguard Worker switch(ps_seq->u1_pic_order_cnt_type)
260*495ae853SAndroid Build Coastguard Worker {
261*495ae853SAndroid Build Coastguard Worker case 0:
262*495ae853SAndroid Build Coastguard Worker /* POC TYPE 0 */
263*495ae853SAndroid Build Coastguard Worker if(u1_is_idr_slice)
264*495ae853SAndroid Build Coastguard Worker {
265*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_msb = 0;
266*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_lsb = 0;
267*495ae853SAndroid Build Coastguard Worker }
268*495ae853SAndroid Build Coastguard Worker if(ps_prev_poc->u1_mmco_equalto5)
269*495ae853SAndroid Build Coastguard Worker {
270*495ae853SAndroid Build Coastguard Worker if(ps_prev_poc->u1_bot_field != 1)
271*495ae853SAndroid Build Coastguard Worker {
272*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_msb = 0;
273*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_lsb = ps_prev_poc->i4_top_field_order_count;
274*495ae853SAndroid Build Coastguard Worker }
275*495ae853SAndroid Build Coastguard Worker else
276*495ae853SAndroid Build Coastguard Worker {
277*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_msb = 0;
278*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_lsb = 0;
279*495ae853SAndroid Build Coastguard Worker }
280*495ae853SAndroid Build Coastguard Worker }
281*495ae853SAndroid Build Coastguard Worker
282*495ae853SAndroid Build Coastguard Worker if((ps_cur_poc->i4_pic_order_cnt_lsb < ps_prev_poc->i4_pic_order_cnt_lsb) &&
283*495ae853SAndroid Build Coastguard Worker ((ps_prev_poc->i4_pic_order_cnt_lsb - ps_cur_poc->i4_pic_order_cnt_lsb) >=
284*495ae853SAndroid Build Coastguard Worker (ps_seq->i4_max_pic_order_cntLsb >> 1)))
285*495ae853SAndroid Build Coastguard Worker {
286*495ae853SAndroid Build Coastguard Worker i8_pic_msb =
287*495ae853SAndroid Build Coastguard Worker (WORD64) ps_prev_poc->i4_pic_order_cnt_msb + ps_seq->i4_max_pic_order_cntLsb;
288*495ae853SAndroid Build Coastguard Worker }
289*495ae853SAndroid Build Coastguard Worker else if((ps_cur_poc->i4_pic_order_cnt_lsb > ps_prev_poc->i4_pic_order_cnt_lsb) &&
290*495ae853SAndroid Build Coastguard Worker ((ps_cur_poc->i4_pic_order_cnt_lsb - ps_prev_poc->i4_pic_order_cnt_lsb) >=
291*495ae853SAndroid Build Coastguard Worker (ps_seq->i4_max_pic_order_cntLsb >> 1)))
292*495ae853SAndroid Build Coastguard Worker {
293*495ae853SAndroid Build Coastguard Worker i8_pic_msb =
294*495ae853SAndroid Build Coastguard Worker (WORD64) ps_prev_poc->i4_pic_order_cnt_msb - ps_seq->i4_max_pic_order_cntLsb;
295*495ae853SAndroid Build Coastguard Worker }
296*495ae853SAndroid Build Coastguard Worker else
297*495ae853SAndroid Build Coastguard Worker {
298*495ae853SAndroid Build Coastguard Worker i8_pic_msb = ps_prev_poc->i4_pic_order_cnt_msb;
299*495ae853SAndroid Build Coastguard Worker }
300*495ae853SAndroid Build Coastguard Worker
301*495ae853SAndroid Build Coastguard Worker if(!u1_field_pic_flag || !u1_bottom_field_flag)
302*495ae853SAndroid Build Coastguard Worker {
303*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = i8_pic_msb + ps_cur_poc->i4_pic_order_cnt_lsb;
304*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
305*495ae853SAndroid Build Coastguard Worker {
306*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
307*495ae853SAndroid Build Coastguard Worker }
308*495ae853SAndroid Build Coastguard Worker i4_top_field_order_cnt = (WORD32) i8_result;
309*495ae853SAndroid Build Coastguard Worker }
310*495ae853SAndroid Build Coastguard Worker
311*495ae853SAndroid Build Coastguard Worker if(!u1_field_pic_flag)
312*495ae853SAndroid Build Coastguard Worker {
313*495ae853SAndroid Build Coastguard Worker WORD64 i8_result =
314*495ae853SAndroid Build Coastguard Worker (WORD64) i4_top_field_order_cnt + ps_cur_poc->i4_delta_pic_order_cnt_bottom;
315*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
316*495ae853SAndroid Build Coastguard Worker {
317*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
318*495ae853SAndroid Build Coastguard Worker }
319*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = (WORD32) i8_result;
320*495ae853SAndroid Build Coastguard Worker }
321*495ae853SAndroid Build Coastguard Worker else if(u1_bottom_field_flag)
322*495ae853SAndroid Build Coastguard Worker {
323*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = i8_pic_msb + ps_cur_poc->i4_pic_order_cnt_lsb;
324*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
325*495ae853SAndroid Build Coastguard Worker {
326*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
327*495ae853SAndroid Build Coastguard Worker }
328*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = (WORD32) i8_result;
329*495ae853SAndroid Build Coastguard Worker }
330*495ae853SAndroid Build Coastguard Worker
331*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_pic_msb))
332*495ae853SAndroid Build Coastguard Worker {
333*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
334*495ae853SAndroid Build Coastguard Worker }
335*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_pic_order_cnt_msb = (WORD32) i8_pic_msb;
336*495ae853SAndroid Build Coastguard Worker break;
337*495ae853SAndroid Build Coastguard Worker
338*495ae853SAndroid Build Coastguard Worker case 1:
339*495ae853SAndroid Build Coastguard Worker {
340*495ae853SAndroid Build Coastguard Worker /* POC TYPE 1 */
341*495ae853SAndroid Build Coastguard Worker UWORD8 i;
342*495ae853SAndroid Build Coastguard Worker WORD32 prev_frame_num;
343*495ae853SAndroid Build Coastguard Worker WORD32 frame_num_ofst;
344*495ae853SAndroid Build Coastguard Worker WORD32 abs_frm_num;
345*495ae853SAndroid Build Coastguard Worker WORD32 poc_cycle_cnt, frame_num_in_poc_cycle;
346*495ae853SAndroid Build Coastguard Worker WORD64 i8_expected_delta_poc_cycle;
347*495ae853SAndroid Build Coastguard Worker WORD32 expected_poc;
348*495ae853SAndroid Build Coastguard Worker WORD64 i8_result;
349*495ae853SAndroid Build Coastguard Worker
350*495ae853SAndroid Build Coastguard Worker prev_frame_num = (WORD32) ps_cur_slice->u2_frame_num;
351*495ae853SAndroid Build Coastguard Worker if(!u1_is_idr_slice)
352*495ae853SAndroid Build Coastguard Worker {
353*495ae853SAndroid Build Coastguard Worker if(ps_cur_slice->u1_mmco_equalto5)
354*495ae853SAndroid Build Coastguard Worker {
355*495ae853SAndroid Build Coastguard Worker prev_frame_num = 0;
356*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = 0;
357*495ae853SAndroid Build Coastguard Worker }
358*495ae853SAndroid Build Coastguard Worker else
359*495ae853SAndroid Build Coastguard Worker {
360*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = ps_prev_poc->i4_prev_frame_num_ofst;
361*495ae853SAndroid Build Coastguard Worker }
362*495ae853SAndroid Build Coastguard Worker }
363*495ae853SAndroid Build Coastguard Worker else
364*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = 0;
365*495ae853SAndroid Build Coastguard Worker
366*495ae853SAndroid Build Coastguard Worker /* 1. Derivation for FrameNumOffset */
367*495ae853SAndroid Build Coastguard Worker if(u1_is_idr_slice)
368*495ae853SAndroid Build Coastguard Worker {
369*495ae853SAndroid Build Coastguard Worker frame_num_ofst = 0;
370*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[0] = 0;
371*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[1] = 0;
372*495ae853SAndroid Build Coastguard Worker }
373*495ae853SAndroid Build Coastguard Worker else if(prev_frame_num > ((WORD32) u2_frame_num))
374*495ae853SAndroid Build Coastguard Worker {
375*495ae853SAndroid Build Coastguard Worker WORD64 i8_result =
376*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst + (WORD64) ps_seq->u2_u4_max_pic_num_minus1 + 1;
377*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
378*495ae853SAndroid Build Coastguard Worker {
379*495ae853SAndroid Build Coastguard Worker return ERROR_INV_FRAME_NUM;
380*495ae853SAndroid Build Coastguard Worker }
381*495ae853SAndroid Build Coastguard Worker frame_num_ofst = (WORD32) i8_result;
382*495ae853SAndroid Build Coastguard Worker }
383*495ae853SAndroid Build Coastguard Worker else
384*495ae853SAndroid Build Coastguard Worker frame_num_ofst = i4_prev_frame_num_ofst;
385*495ae853SAndroid Build Coastguard Worker
386*495ae853SAndroid Build Coastguard Worker /* 2. Derivation for absFrameNum */
387*495ae853SAndroid Build Coastguard Worker if(0 != ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle)
388*495ae853SAndroid Build Coastguard Worker {
389*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = frame_num_ofst + (WORD64) u2_frame_num;
390*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
391*495ae853SAndroid Build Coastguard Worker {
392*495ae853SAndroid Build Coastguard Worker return ERROR_INV_FRAME_NUM;
393*495ae853SAndroid Build Coastguard Worker }
394*495ae853SAndroid Build Coastguard Worker abs_frm_num = (WORD32) i8_result;
395*495ae853SAndroid Build Coastguard Worker }
396*495ae853SAndroid Build Coastguard Worker else
397*495ae853SAndroid Build Coastguard Worker abs_frm_num = 0;
398*495ae853SAndroid Build Coastguard Worker if((u1_nal_ref_idc == 0) && (abs_frm_num > 0)) abs_frm_num = abs_frm_num - 1;
399*495ae853SAndroid Build Coastguard Worker
400*495ae853SAndroid Build Coastguard Worker /* 4. expectedDeltaPerPicOrderCntCycle is derived as */
401*495ae853SAndroid Build Coastguard Worker i8_expected_delta_poc_cycle = 0;
402*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle; i++)
403*495ae853SAndroid Build Coastguard Worker {
404*495ae853SAndroid Build Coastguard Worker i8_expected_delta_poc_cycle += ps_seq->i4_ofst_for_ref_frame[i];
405*495ae853SAndroid Build Coastguard Worker }
406*495ae853SAndroid Build Coastguard Worker
407*495ae853SAndroid Build Coastguard Worker /* 3. When absFrameNum > 0, picOrderCntCycleCnt and
408*495ae853SAndroid Build Coastguard Worker frame_num_in_poc_cycle are derived as : */
409*495ae853SAndroid Build Coastguard Worker /* 5. expectedPicOrderCnt is derived as : */
410*495ae853SAndroid Build Coastguard Worker if(abs_frm_num > 0)
411*495ae853SAndroid Build Coastguard Worker {
412*495ae853SAndroid Build Coastguard Worker poc_cycle_cnt =
413*495ae853SAndroid Build Coastguard Worker DIV((abs_frm_num - 1), ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle);
414*495ae853SAndroid Build Coastguard Worker frame_num_in_poc_cycle =
415*495ae853SAndroid Build Coastguard Worker MOD((abs_frm_num - 1), ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle);
416*495ae853SAndroid Build Coastguard Worker
417*495ae853SAndroid Build Coastguard Worker i8_result = poc_cycle_cnt * i8_expected_delta_poc_cycle;
418*495ae853SAndroid Build Coastguard Worker
419*495ae853SAndroid Build Coastguard Worker for(i = 0; i <= frame_num_in_poc_cycle; i++)
420*495ae853SAndroid Build Coastguard Worker {
421*495ae853SAndroid Build Coastguard Worker i8_result = i8_result + ps_seq->i4_ofst_for_ref_frame[i];
422*495ae853SAndroid Build Coastguard Worker }
423*495ae853SAndroid Build Coastguard Worker
424*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result)) return ERROR_INV_POC;
425*495ae853SAndroid Build Coastguard Worker
426*495ae853SAndroid Build Coastguard Worker expected_poc = (WORD32) i8_result;
427*495ae853SAndroid Build Coastguard Worker }
428*495ae853SAndroid Build Coastguard Worker else
429*495ae853SAndroid Build Coastguard Worker expected_poc = 0;
430*495ae853SAndroid Build Coastguard Worker
431*495ae853SAndroid Build Coastguard Worker if(u1_nal_ref_idc == 0)
432*495ae853SAndroid Build Coastguard Worker {
433*495ae853SAndroid Build Coastguard Worker i8_result = (WORD64) expected_poc + ps_seq->i4_ofst_for_non_ref_pic;
434*495ae853SAndroid Build Coastguard Worker
435*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result)) return ERROR_INV_POC;
436*495ae853SAndroid Build Coastguard Worker
437*495ae853SAndroid Build Coastguard Worker expected_poc = (WORD32) i8_result;
438*495ae853SAndroid Build Coastguard Worker }
439*495ae853SAndroid Build Coastguard Worker
440*495ae853SAndroid Build Coastguard Worker /* 6. TopFieldOrderCnt or BottomFieldOrderCnt are derived as */
441*495ae853SAndroid Build Coastguard Worker if(!u1_field_pic_flag)
442*495ae853SAndroid Build Coastguard Worker {
443*495ae853SAndroid Build Coastguard Worker i8_result = (WORD64) expected_poc + ps_cur_poc->i4_delta_pic_order_cnt[0];
444*495ae853SAndroid Build Coastguard Worker
445*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result)) return ERROR_INV_POC;
446*495ae853SAndroid Build Coastguard Worker i4_top_field_order_cnt = (WORD32) i8_result;
447*495ae853SAndroid Build Coastguard Worker
448*495ae853SAndroid Build Coastguard Worker i8_result = (WORD64) i4_top_field_order_cnt +
449*495ae853SAndroid Build Coastguard Worker ps_seq->i4_ofst_for_top_to_bottom_field +
450*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[1];
451*495ae853SAndroid Build Coastguard Worker
452*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result)) return ERROR_INV_POC;
453*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = (WORD32) i8_result;
454*495ae853SAndroid Build Coastguard Worker }
455*495ae853SAndroid Build Coastguard Worker else if(!u1_bottom_field_flag)
456*495ae853SAndroid Build Coastguard Worker {
457*495ae853SAndroid Build Coastguard Worker i8_result = (WORD64) expected_poc + ps_cur_poc->i4_delta_pic_order_cnt[0];
458*495ae853SAndroid Build Coastguard Worker
459*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result)) return ERROR_INV_POC;
460*495ae853SAndroid Build Coastguard Worker i4_top_field_order_cnt = (WORD32) i8_result;
461*495ae853SAndroid Build Coastguard Worker }
462*495ae853SAndroid Build Coastguard Worker else
463*495ae853SAndroid Build Coastguard Worker {
464*495ae853SAndroid Build Coastguard Worker i8_result = (WORD64) expected_poc + ps_seq->i4_ofst_for_top_to_bottom_field +
465*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[0];
466*495ae853SAndroid Build Coastguard Worker
467*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result)) return ERROR_INV_POC;
468*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = (WORD32) i8_result;
469*495ae853SAndroid Build Coastguard Worker }
470*495ae853SAndroid Build Coastguard Worker /* Copy the current POC info into Previous POC structure */
471*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_prev_frame_num_ofst = frame_num_ofst;
472*495ae853SAndroid Build Coastguard Worker }
473*495ae853SAndroid Build Coastguard Worker
474*495ae853SAndroid Build Coastguard Worker break;
475*495ae853SAndroid Build Coastguard Worker case 2:
476*495ae853SAndroid Build Coastguard Worker {
477*495ae853SAndroid Build Coastguard Worker /* POC TYPE 2 */
478*495ae853SAndroid Build Coastguard Worker WORD32 prev_frame_num;
479*495ae853SAndroid Build Coastguard Worker WORD32 frame_num_ofst;
480*495ae853SAndroid Build Coastguard Worker WORD32 tmp_poc;
481*495ae853SAndroid Build Coastguard Worker
482*495ae853SAndroid Build Coastguard Worker prev_frame_num = (WORD32) ps_cur_slice->u2_frame_num;
483*495ae853SAndroid Build Coastguard Worker if(!u1_is_idr_slice)
484*495ae853SAndroid Build Coastguard Worker {
485*495ae853SAndroid Build Coastguard Worker if(ps_cur_slice->u1_mmco_equalto5)
486*495ae853SAndroid Build Coastguard Worker {
487*495ae853SAndroid Build Coastguard Worker prev_frame_num = 0;
488*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = 0;
489*495ae853SAndroid Build Coastguard Worker }
490*495ae853SAndroid Build Coastguard Worker else
491*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = ps_prev_poc->i4_prev_frame_num_ofst;
492*495ae853SAndroid Build Coastguard Worker }
493*495ae853SAndroid Build Coastguard Worker else
494*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = 0;
495*495ae853SAndroid Build Coastguard Worker
496*495ae853SAndroid Build Coastguard Worker /* 1. Derivation for FrameNumOffset */
497*495ae853SAndroid Build Coastguard Worker if(u1_is_idr_slice)
498*495ae853SAndroid Build Coastguard Worker {
499*495ae853SAndroid Build Coastguard Worker frame_num_ofst = 0;
500*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[0] = 0;
501*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[1] = 0;
502*495ae853SAndroid Build Coastguard Worker }
503*495ae853SAndroid Build Coastguard Worker else if(prev_frame_num > ((WORD32) u2_frame_num))
504*495ae853SAndroid Build Coastguard Worker {
505*495ae853SAndroid Build Coastguard Worker WORD64 i8_result =
506*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst + (WORD64) ps_seq->u2_u4_max_pic_num_minus1 + 1;
507*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
508*495ae853SAndroid Build Coastguard Worker {
509*495ae853SAndroid Build Coastguard Worker return ERROR_INV_FRAME_NUM;
510*495ae853SAndroid Build Coastguard Worker }
511*495ae853SAndroid Build Coastguard Worker frame_num_ofst = (WORD32) i8_result;
512*495ae853SAndroid Build Coastguard Worker }
513*495ae853SAndroid Build Coastguard Worker else
514*495ae853SAndroid Build Coastguard Worker frame_num_ofst = i4_prev_frame_num_ofst;
515*495ae853SAndroid Build Coastguard Worker
516*495ae853SAndroid Build Coastguard Worker /* 2. Derivation for tempPicOrderCnt */
517*495ae853SAndroid Build Coastguard Worker if(u1_is_idr_slice)
518*495ae853SAndroid Build Coastguard Worker tmp_poc = 0;
519*495ae853SAndroid Build Coastguard Worker else if(u1_nal_ref_idc == 0)
520*495ae853SAndroid Build Coastguard Worker {
521*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = ((frame_num_ofst + (WORD64) u2_frame_num) << 1) - 1;
522*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
523*495ae853SAndroid Build Coastguard Worker {
524*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
525*495ae853SAndroid Build Coastguard Worker }
526*495ae853SAndroid Build Coastguard Worker tmp_poc = (WORD32) i8_result;
527*495ae853SAndroid Build Coastguard Worker }
528*495ae853SAndroid Build Coastguard Worker else
529*495ae853SAndroid Build Coastguard Worker {
530*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = (frame_num_ofst + (WORD64) u2_frame_num) << 1;
531*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
532*495ae853SAndroid Build Coastguard Worker {
533*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
534*495ae853SAndroid Build Coastguard Worker }
535*495ae853SAndroid Build Coastguard Worker tmp_poc = (WORD32) i8_result;
536*495ae853SAndroid Build Coastguard Worker }
537*495ae853SAndroid Build Coastguard Worker
538*495ae853SAndroid Build Coastguard Worker /* 6. TopFieldOrderCnt or BottomFieldOrderCnt are derived as */
539*495ae853SAndroid Build Coastguard Worker if(!u1_field_pic_flag)
540*495ae853SAndroid Build Coastguard Worker {
541*495ae853SAndroid Build Coastguard Worker i4_top_field_order_cnt = tmp_poc;
542*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = tmp_poc;
543*495ae853SAndroid Build Coastguard Worker }
544*495ae853SAndroid Build Coastguard Worker else if(!u1_bottom_field_flag)
545*495ae853SAndroid Build Coastguard Worker i4_top_field_order_cnt = tmp_poc;
546*495ae853SAndroid Build Coastguard Worker else
547*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = tmp_poc;
548*495ae853SAndroid Build Coastguard Worker
549*495ae853SAndroid Build Coastguard Worker /* Copy the current POC info into Previous POC structure */
550*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_prev_frame_num_ofst = frame_num_ofst;
551*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_prev_frame_num_ofst = frame_num_ofst;
552*495ae853SAndroid Build Coastguard Worker }
553*495ae853SAndroid Build Coastguard Worker break;
554*495ae853SAndroid Build Coastguard Worker default:
555*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC_TYPE_T;
556*495ae853SAndroid Build Coastguard Worker break;
557*495ae853SAndroid Build Coastguard Worker }
558*495ae853SAndroid Build Coastguard Worker
559*495ae853SAndroid Build Coastguard Worker if(!u1_field_pic_flag) // or a complementary field pair
560*495ae853SAndroid Build Coastguard Worker {
561*495ae853SAndroid Build Coastguard Worker *pi4_poc = MIN(i4_top_field_order_cnt, i4_bottom_field_order_cnt);
562*495ae853SAndroid Build Coastguard Worker ps_pps->i4_top_field_order_cnt = i4_top_field_order_cnt;
563*495ae853SAndroid Build Coastguard Worker ps_pps->i4_bottom_field_order_cnt = i4_bottom_field_order_cnt;
564*495ae853SAndroid Build Coastguard Worker }
565*495ae853SAndroid Build Coastguard Worker else if(!u1_bottom_field_flag)
566*495ae853SAndroid Build Coastguard Worker {
567*495ae853SAndroid Build Coastguard Worker *pi4_poc = i4_top_field_order_cnt;
568*495ae853SAndroid Build Coastguard Worker ps_pps->i4_top_field_order_cnt = i4_top_field_order_cnt;
569*495ae853SAndroid Build Coastguard Worker }
570*495ae853SAndroid Build Coastguard Worker else
571*495ae853SAndroid Build Coastguard Worker {
572*495ae853SAndroid Build Coastguard Worker *pi4_poc = i4_bottom_field_order_cnt;
573*495ae853SAndroid Build Coastguard Worker ps_pps->i4_bottom_field_order_cnt = i4_bottom_field_order_cnt;
574*495ae853SAndroid Build Coastguard Worker }
575*495ae853SAndroid Build Coastguard Worker
576*495ae853SAndroid Build Coastguard Worker ps_pps->i4_avg_poc = *pi4_poc;
577*495ae853SAndroid Build Coastguard Worker
578*495ae853SAndroid Build Coastguard Worker return OK;
579*495ae853SAndroid Build Coastguard Worker }
580*495ae853SAndroid Build Coastguard Worker
581*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
582*495ae853SAndroid Build Coastguard Worker /* */
583*495ae853SAndroid Build Coastguard Worker /* Function Name : isvcd_decode_gaps_in_frame_num */
584*495ae853SAndroid Build Coastguard Worker /* */
585*495ae853SAndroid Build Coastguard Worker /* Description : This function decodes gaps in frame number */
586*495ae853SAndroid Build Coastguard Worker /* */
587*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_dec Decoder parameters */
588*495ae853SAndroid Build Coastguard Worker /* u2_frame_num current frame number */
589*495ae853SAndroid Build Coastguard Worker /* */
590*495ae853SAndroid Build Coastguard Worker /* Globals : None */
591*495ae853SAndroid Build Coastguard Worker /* Processing : This functionality needs to be implemented */
592*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
593*495ae853SAndroid Build Coastguard Worker /* Returns : None */
594*495ae853SAndroid Build Coastguard Worker /* */
595*495ae853SAndroid Build Coastguard Worker /* Issues : Not implemented */
596*495ae853SAndroid Build Coastguard Worker /* */
597*495ae853SAndroid Build Coastguard Worker /* Revision History: */
598*495ae853SAndroid Build Coastguard Worker /* */
599*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
600*495ae853SAndroid Build Coastguard Worker /* 06 05 2002 NS Draft */
601*495ae853SAndroid Build Coastguard Worker /* */
602*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_decode_gaps_in_frame_num(dec_struct_t * ps_dec,UWORD16 u2_frame_num)603*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_decode_gaps_in_frame_num(dec_struct_t *ps_dec, UWORD16 u2_frame_num)
604*495ae853SAndroid Build Coastguard Worker {
605*495ae853SAndroid Build Coastguard Worker UWORD32 u4_next_frm_num, u4_start_frm_num;
606*495ae853SAndroid Build Coastguard Worker UWORD32 u4_max_frm_num;
607*495ae853SAndroid Build Coastguard Worker pocstruct_t s_tmp_poc;
608*495ae853SAndroid Build Coastguard Worker WORD32 i4_poc;
609*495ae853SAndroid Build Coastguard Worker dec_slice_params_t *ps_cur_slice;
610*495ae853SAndroid Build Coastguard Worker
611*495ae853SAndroid Build Coastguard Worker dec_pic_params_t *ps_pic_params;
612*495ae853SAndroid Build Coastguard Worker WORD8 i1_gap_idx;
613*495ae853SAndroid Build Coastguard Worker WORD32 *i4_gaps_start_frm_num;
614*495ae853SAndroid Build Coastguard Worker dpb_manager_t *ps_dpb_mgr;
615*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_gaps_per_seq;
616*495ae853SAndroid Build Coastguard Worker WORD32 ret;
617*495ae853SAndroid Build Coastguard Worker
618*495ae853SAndroid Build Coastguard Worker ps_cur_slice = ps_dec->ps_cur_slice;
619*495ae853SAndroid Build Coastguard Worker if(ps_cur_slice->u1_field_pic_flag)
620*495ae853SAndroid Build Coastguard Worker {
621*495ae853SAndroid Build Coastguard Worker if(ps_dec->u2_prev_ref_frame_num == u2_frame_num) return 0;
622*495ae853SAndroid Build Coastguard Worker }
623*495ae853SAndroid Build Coastguard Worker
624*495ae853SAndroid Build Coastguard Worker u4_next_frm_num = ps_dec->u2_prev_ref_frame_num + 1;
625*495ae853SAndroid Build Coastguard Worker u4_max_frm_num = ps_dec->ps_cur_sps->u2_u4_max_pic_num_minus1 + 1;
626*495ae853SAndroid Build Coastguard Worker
627*495ae853SAndroid Build Coastguard Worker if(u4_next_frm_num >= u4_max_frm_num)
628*495ae853SAndroid Build Coastguard Worker {
629*495ae853SAndroid Build Coastguard Worker u4_next_frm_num -= u4_max_frm_num;
630*495ae853SAndroid Build Coastguard Worker }
631*495ae853SAndroid Build Coastguard Worker
632*495ae853SAndroid Build Coastguard Worker if(u4_next_frm_num == u2_frame_num)
633*495ae853SAndroid Build Coastguard Worker {
634*495ae853SAndroid Build Coastguard Worker return (0);
635*495ae853SAndroid Build Coastguard Worker }
636*495ae853SAndroid Build Coastguard Worker
637*495ae853SAndroid Build Coastguard Worker if((ps_dec->u1_nal_unit_type == IDR_SLICE_NAL) && (u4_next_frm_num >= u2_frame_num))
638*495ae853SAndroid Build Coastguard Worker {
639*495ae853SAndroid Build Coastguard Worker return (0);
640*495ae853SAndroid Build Coastguard Worker }
641*495ae853SAndroid Build Coastguard Worker u4_start_frm_num = u4_next_frm_num;
642*495ae853SAndroid Build Coastguard Worker
643*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_pic_order_cnt_lsb = 0;
644*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
645*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_pic_order_cnt_lsb = 0;
646*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
647*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
648*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
649*495ae853SAndroid Build Coastguard Worker
650*495ae853SAndroid Build Coastguard Worker ps_cur_slice = ps_dec->ps_cur_slice;
651*495ae853SAndroid Build Coastguard Worker ps_pic_params = ps_dec->ps_cur_pps;
652*495ae853SAndroid Build Coastguard Worker
653*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr = ps_dec->ps_dpb_mgr;
654*495ae853SAndroid Build Coastguard Worker
655*495ae853SAndroid Build Coastguard Worker /* Find a empty slot to store gap seqn info */
656*495ae853SAndroid Build Coastguard Worker i4_gaps_start_frm_num = ps_dpb_mgr->ai4_gaps_start_frm_num;
657*495ae853SAndroid Build Coastguard Worker for(i1_gap_idx = 0; i1_gap_idx < MAX_FRAMES; i1_gap_idx++)
658*495ae853SAndroid Build Coastguard Worker {
659*495ae853SAndroid Build Coastguard Worker if(INVALID_FRAME_NUM == i4_gaps_start_frm_num[i1_gap_idx]) break;
660*495ae853SAndroid Build Coastguard Worker }
661*495ae853SAndroid Build Coastguard Worker if(MAX_FRAMES == i1_gap_idx)
662*495ae853SAndroid Build Coastguard Worker {
663*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
664*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
665*495ae853SAndroid Build Coastguard Worker return i4_error_code;
666*495ae853SAndroid Build Coastguard Worker }
667*495ae853SAndroid Build Coastguard Worker
668*495ae853SAndroid Build Coastguard Worker i4_poc = 0;
669*495ae853SAndroid Build Coastguard Worker i4_gaps_start_frm_num[i1_gap_idx] = u4_start_frm_num;
670*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_end_frm_num[i1_gap_idx] = u2_frame_num - 1;
671*495ae853SAndroid Build Coastguard Worker pi1_gaps_per_seq = ps_dpb_mgr->ai1_gaps_per_seq;
672*495ae853SAndroid Build Coastguard Worker pi1_gaps_per_seq[i1_gap_idx] = 0;
673*495ae853SAndroid Build Coastguard Worker while(u4_next_frm_num != u2_frame_num)
674*495ae853SAndroid Build Coastguard Worker {
675*495ae853SAndroid Build Coastguard Worker ih264d_delete_nonref_nondisplay_pics(ps_dpb_mgr);
676*495ae853SAndroid Build Coastguard Worker if(ps_pic_params->ps_sps->u1_pic_order_cnt_type)
677*495ae853SAndroid Build Coastguard Worker {
678*495ae853SAndroid Build Coastguard Worker /* allocate a picture buffer and insert it as ST node */
679*495ae853SAndroid Build Coastguard Worker ret =
680*495ae853SAndroid Build Coastguard Worker isvcd_decode_pic_order_cnt(0, u4_next_frm_num, &ps_dec->s_prev_pic_poc, &s_tmp_poc,
681*495ae853SAndroid Build Coastguard Worker ps_cur_slice, ps_pic_params, 1, 0, 0, &i4_poc, ps_dec);
682*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
683*495ae853SAndroid Build Coastguard Worker
684*495ae853SAndroid Build Coastguard Worker /* Display seq no calculations */
685*495ae853SAndroid Build Coastguard Worker if(i4_poc >= ps_dec->i4_max_poc) ps_dec->i4_max_poc = i4_poc;
686*495ae853SAndroid Build Coastguard Worker /* IDR Picture or POC wrap around */
687*495ae853SAndroid Build Coastguard Worker if(i4_poc == 0)
688*495ae853SAndroid Build Coastguard Worker {
689*495ae853SAndroid Build Coastguard Worker WORD64 i8_temp;
690*495ae853SAndroid Build Coastguard Worker i8_temp = (WORD64) ps_dec->i4_prev_max_display_seq + ps_dec->i4_max_poc +
691*495ae853SAndroid Build Coastguard Worker ps_dec->u1_max_dec_frame_buffering + 1;
692*495ae853SAndroid Build Coastguard Worker /*If i4_prev_max_display_seq overflows integer range, reset it */
693*495ae853SAndroid Build Coastguard Worker ps_dec->i4_prev_max_display_seq =
694*495ae853SAndroid Build Coastguard Worker IS_OUT_OF_RANGE_S32(i8_temp) ? 0 : (WORD32) i8_temp;
695*495ae853SAndroid Build Coastguard Worker ps_dec->i4_max_poc = 0;
696*495ae853SAndroid Build Coastguard Worker }
697*495ae853SAndroid Build Coastguard Worker
698*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u1_mmco_equalto5 = 0;
699*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u2_frame_num = u4_next_frm_num;
700*495ae853SAndroid Build Coastguard Worker }
701*495ae853SAndroid Build Coastguard Worker
702*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->i1_poc_buf_id_entries >= ps_dec->u1_max_dec_frame_buffering)
703*495ae853SAndroid Build Coastguard Worker {
704*495ae853SAndroid Build Coastguard Worker ret = ih264d_assign_display_seq(ps_dec);
705*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
706*495ae853SAndroid Build Coastguard Worker }
707*495ae853SAndroid Build Coastguard Worker
708*495ae853SAndroid Build Coastguard Worker {
709*495ae853SAndroid Build Coastguard Worker WORD64 i8_display_poc;
710*495ae853SAndroid Build Coastguard Worker i8_display_poc = (WORD64) ps_dec->i4_prev_max_display_seq + i4_poc;
711*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_display_poc))
712*495ae853SAndroid Build Coastguard Worker {
713*495ae853SAndroid Build Coastguard Worker ps_dec->i4_prev_max_display_seq = 0;
714*495ae853SAndroid Build Coastguard Worker }
715*495ae853SAndroid Build Coastguard Worker }
716*495ae853SAndroid Build Coastguard Worker ret = ih264d_insert_pic_in_display_list(ps_dec->ps_dpb_mgr, (WORD8) DO_NOT_DISP,
717*495ae853SAndroid Build Coastguard Worker (WORD32) (ps_dec->i4_prev_max_display_seq + i4_poc),
718*495ae853SAndroid Build Coastguard Worker u4_next_frm_num);
719*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
720*495ae853SAndroid Build Coastguard Worker
721*495ae853SAndroid Build Coastguard Worker pi1_gaps_per_seq[i1_gap_idx]++;
722*495ae853SAndroid Build Coastguard Worker ret = ih264d_do_mmco_for_gaps(ps_dpb_mgr, ps_dec->ps_cur_sps->u1_num_ref_frames);
723*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
724*495ae853SAndroid Build Coastguard Worker
725*495ae853SAndroid Build Coastguard Worker ih264d_delete_nonref_nondisplay_pics(ps_dpb_mgr);
726*495ae853SAndroid Build Coastguard Worker
727*495ae853SAndroid Build Coastguard Worker u4_next_frm_num++;
728*495ae853SAndroid Build Coastguard Worker if(u4_next_frm_num >= u4_max_frm_num)
729*495ae853SAndroid Build Coastguard Worker {
730*495ae853SAndroid Build Coastguard Worker u4_next_frm_num -= u4_max_frm_num;
731*495ae853SAndroid Build Coastguard Worker }
732*495ae853SAndroid Build Coastguard Worker }
733*495ae853SAndroid Build Coastguard Worker
734*495ae853SAndroid Build Coastguard Worker return OK;
735*495ae853SAndroid Build Coastguard Worker }
736*495ae853SAndroid Build Coastguard Worker
737*495ae853SAndroid Build Coastguard Worker /*!
738*495ae853SAndroid Build Coastguard Worker **************************************************************************
739*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_init_pic \endif
740*495ae853SAndroid Build Coastguard Worker *
741*495ae853SAndroid Build Coastguard Worker * \brief
742*495ae853SAndroid Build Coastguard Worker * Initializes the picture.
743*495ae853SAndroid Build Coastguard Worker *
744*495ae853SAndroid Build Coastguard Worker * \return
745*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
746*495ae853SAndroid Build Coastguard Worker *
747*495ae853SAndroid Build Coastguard Worker * \note
748*495ae853SAndroid Build Coastguard Worker * This function is called when first slice of the
749*495ae853SAndroid Build Coastguard Worker * NON -IDR picture is encountered.
750*495ae853SAndroid Build Coastguard Worker **************************************************************************
751*495ae853SAndroid Build Coastguard Worker */
isvcd_init_pic(svc_dec_lyr_struct_t * ps_svc_lyr_dec,UWORD16 u2_frame_num,WORD32 i4_poc,dec_pic_params_t * ps_pps)752*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_init_pic(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD16 u2_frame_num, WORD32 i4_poc,
753*495ae853SAndroid Build Coastguard Worker dec_pic_params_t *ps_pps)
754*495ae853SAndroid Build Coastguard Worker {
755*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
756*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_seq = ps_dec->ps_cur_sps;
757*495ae853SAndroid Build Coastguard Worker prev_seq_params_t *ps_prev_seq_params = &ps_dec->s_prev_seq_params;
758*495ae853SAndroid Build Coastguard Worker WORD32 ret;
759*495ae853SAndroid Build Coastguard Worker
760*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num;
761*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->i4_poc = i4_poc;
762*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pps = ps_pps;
763*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pps->pv_codec_handle = ps_dec;
764*495ae853SAndroid Build Coastguard Worker
765*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->i4_max_frm_num = ps_seq->u2_u4_max_pic_num_minus1 + 1;
766*495ae853SAndroid Build Coastguard Worker
767*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->u2_pic_ht = ps_dec->u2_pic_ht;
768*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->u2_pic_wd = ps_dec->u2_pic_wd;
769*495ae853SAndroid Build Coastguard Worker ps_dec->i4_pic_type = NA_SLICE;
770*495ae853SAndroid Build Coastguard Worker ps_dec->i4_frametype = IV_NA_FRAME;
771*495ae853SAndroid Build Coastguard Worker ps_dec->i4_content_type = IV_CONTENTTYPE_NA;
772*495ae853SAndroid Build Coastguard Worker
773*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
774*495ae853SAndroid Build Coastguard Worker /* Get the value of MaxMbAddress and frmheight in Mbs */
775*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
776*495ae853SAndroid Build Coastguard Worker ps_seq->u2_max_mb_addr =
777*495ae853SAndroid Build Coastguard Worker (ps_seq->u2_frm_wd_in_mbs *
778*495ae853SAndroid Build Coastguard Worker (ps_dec->u2_pic_ht >> (4 + ps_dec->ps_cur_slice->u1_field_pic_flag))) -
779*495ae853SAndroid Build Coastguard Worker 1;
780*495ae853SAndroid Build Coastguard Worker ps_dec->u2_frm_ht_in_mbs = (ps_dec->u2_pic_ht >> (4 + ps_dec->ps_cur_slice->u1_field_pic_flag));
781*495ae853SAndroid Build Coastguard Worker
782*495ae853SAndroid Build Coastguard Worker /***************************************************************************/
783*495ae853SAndroid Build Coastguard Worker /* If change in Level or the required PicBuffers i4_size is more than the */
784*495ae853SAndroid Build Coastguard Worker /* current one FREE the current PicBuffers and allocate affresh */
785*495ae853SAndroid Build Coastguard Worker /***************************************************************************/
786*495ae853SAndroid Build Coastguard Worker if(!ps_dec->u1_init_dec_flag)
787*495ae853SAndroid Build Coastguard Worker {
788*495ae853SAndroid Build Coastguard Worker ps_dec->u1_max_dec_frame_buffering = ih264d_get_dpb_size(ps_seq);
789*495ae853SAndroid Build Coastguard Worker
790*495ae853SAndroid Build Coastguard Worker ps_dec->i4_display_delay = ps_dec->u1_max_dec_frame_buffering;
791*495ae853SAndroid Build Coastguard Worker if((1 == ps_seq->u1_vui_parameters_present_flag) &&
792*495ae853SAndroid Build Coastguard Worker (1 == ps_seq->s_vui.u1_bitstream_restriction_flag))
793*495ae853SAndroid Build Coastguard Worker {
794*495ae853SAndroid Build Coastguard Worker if(ps_seq->u1_frame_mbs_only_flag == 1)
795*495ae853SAndroid Build Coastguard Worker ps_dec->i4_display_delay = ps_seq->s_vui.u4_num_reorder_frames + 1;
796*495ae853SAndroid Build Coastguard Worker else
797*495ae853SAndroid Build Coastguard Worker ps_dec->i4_display_delay = ps_seq->s_vui.u4_num_reorder_frames * 2 + 2;
798*495ae853SAndroid Build Coastguard Worker }
799*495ae853SAndroid Build Coastguard Worker
800*495ae853SAndroid Build Coastguard Worker if(IVD_DECODE_FRAME_OUT == ps_dec->e_frm_out_mode) ps_dec->i4_display_delay = 0;
801*495ae853SAndroid Build Coastguard Worker
802*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_share_disp_buf == 0)
803*495ae853SAndroid Build Coastguard Worker {
804*495ae853SAndroid Build Coastguard Worker if(ps_seq->u1_frame_mbs_only_flag == 1)
805*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs = ps_dec->i4_display_delay + ps_seq->u1_num_ref_frames + 1;
806*495ae853SAndroid Build Coastguard Worker else
807*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs = ps_dec->i4_display_delay + ps_seq->u1_num_ref_frames * 2 + 2;
808*495ae853SAndroid Build Coastguard Worker }
809*495ae853SAndroid Build Coastguard Worker else
810*495ae853SAndroid Build Coastguard Worker {
811*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs = (WORD32) ps_dec->u4_num_disp_bufs;
812*495ae853SAndroid Build Coastguard Worker }
813*495ae853SAndroid Build Coastguard Worker
814*495ae853SAndroid Build Coastguard Worker /* Ensure at least two buffers are allocated */
815*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs = MAX(ps_dec->u1_pic_bufs, 2);
816*495ae853SAndroid Build Coastguard Worker
817*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_share_disp_buf == 0)
818*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs = MIN(ps_dec->u1_pic_bufs, (H264_MAX_REF_PICS * 2));
819*495ae853SAndroid Build Coastguard Worker
820*495ae853SAndroid Build Coastguard Worker ps_dec->u1_max_dec_frame_buffering =
821*495ae853SAndroid Build Coastguard Worker MIN(ps_dec->u1_max_dec_frame_buffering, ps_dec->u1_pic_bufs);
822*495ae853SAndroid Build Coastguard Worker
823*495ae853SAndroid Build Coastguard Worker /* Temporary hack to run Tractor Cav/Cab/MbAff Profiler streams also for
824*495ae853SAndroid Build Coastguard Worker * CAFI1_SVA_C.264 in conformance*/
825*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_init_dec_flag)
826*495ae853SAndroid Build Coastguard Worker {
827*495ae853SAndroid Build Coastguard Worker ih264d_release_pics_in_dpb((void *) ps_dec, ps_dec->u1_pic_bufs);
828*495ae853SAndroid Build Coastguard Worker ih264d_release_display_bufs(ps_dec);
829*495ae853SAndroid Build Coastguard Worker ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
830*495ae853SAndroid Build Coastguard Worker }
831*495ae853SAndroid Build Coastguard Worker
832*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
833*495ae853SAndroid Build Coastguard Worker /* Configuring decoder parameters based on level and then */
834*495ae853SAndroid Build Coastguard Worker /* fresh pointer initialisation in decoder scratch and state buffers */
835*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
836*495ae853SAndroid Build Coastguard Worker if(!ps_dec->u1_init_dec_flag || ((ps_seq->u1_level_idc < H264_LEVEL_3_0) ^
837*495ae853SAndroid Build Coastguard Worker (ps_prev_seq_params->u1_level_idc < H264_LEVEL_3_0)))
838*495ae853SAndroid Build Coastguard Worker {
839*495ae853SAndroid Build Coastguard Worker ret = ih264d_init_dec_mb_grp(ps_dec);
840*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
841*495ae853SAndroid Build Coastguard Worker }
842*495ae853SAndroid Build Coastguard Worker
843*495ae853SAndroid Build Coastguard Worker ret = isvcd_allocate_dynamic_bufs(ps_svc_lyr_dec);
844*495ae853SAndroid Build Coastguard Worker
845*495ae853SAndroid Build Coastguard Worker if(ret != OK)
846*495ae853SAndroid Build Coastguard Worker {
847*495ae853SAndroid Build Coastguard Worker /* Free any dynamic buffers that are allocated */
848*495ae853SAndroid Build Coastguard Worker isvcd_free_dynamic_bufs(ps_svc_lyr_dec);
849*495ae853SAndroid Build Coastguard Worker ps_dec->i4_error_code = IVD_MEM_ALLOC_FAILED;
850*495ae853SAndroid Build Coastguard Worker return IVD_MEM_ALLOC_FAILED;
851*495ae853SAndroid Build Coastguard Worker }
852*495ae853SAndroid Build Coastguard Worker
853*495ae853SAndroid Build Coastguard Worker ret = ih264d_create_pic_buffers(ps_dec->u1_pic_bufs, ps_dec);
854*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
855*495ae853SAndroid Build Coastguard Worker
856*495ae853SAndroid Build Coastguard Worker ret = ih264d_create_mv_bank(ps_dec, ps_dec->u2_pic_wd, ps_dec->u2_pic_ht);
857*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
858*495ae853SAndroid Build Coastguard Worker
859*495ae853SAndroid Build Coastguard Worker /* In shared mode, set all of them as used by display */
860*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_share_disp_buf == 1)
861*495ae853SAndroid Build Coastguard Worker {
862*495ae853SAndroid Build Coastguard Worker WORD32 i;
863*495ae853SAndroid Build Coastguard Worker
864*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_dec->u1_pic_bufs; i++)
865*495ae853SAndroid Build Coastguard Worker {
866*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_set_status((buf_mgr_t *) ps_dec->pv_pic_buf_mgr, i, BUF_MGR_IO);
867*495ae853SAndroid Build Coastguard Worker }
868*495ae853SAndroid Build Coastguard Worker }
869*495ae853SAndroid Build Coastguard Worker
870*495ae853SAndroid Build Coastguard Worker ps_dec->u1_init_dec_flag = 1;
871*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
872*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u1_level_idc = ps_seq->u1_level_idc;
873*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u1_profile_idc = ps_seq->u1_profile_idc;
874*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
875*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u1_frame_mbs_only_flag = ps_seq->u1_frame_mbs_only_flag;
876*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u1_direct_8x8_inference_flag = ps_seq->u1_direct_8x8_inference_flag;
877*495ae853SAndroid Build Coastguard Worker
878*495ae853SAndroid Build Coastguard Worker ps_dec->i4_cur_display_seq = 0;
879*495ae853SAndroid Build Coastguard Worker ps_dec->i4_prev_max_display_seq = 0;
880*495ae853SAndroid Build Coastguard Worker ps_dec->i4_max_poc = 0;
881*495ae853SAndroid Build Coastguard Worker
882*495ae853SAndroid Build Coastguard Worker {
883*495ae853SAndroid Build Coastguard Worker /* 0th entry of CtxtIncMbMap will be always be containing default values
884*495ae853SAndroid Build Coastguard Worker for CABAC context representing MB not available */
885*495ae853SAndroid Build Coastguard Worker ctxt_inc_mb_info_t *p_DefCtxt = ps_dec->p_ctxt_inc_mb_map - 1;
886*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_temp;
887*495ae853SAndroid Build Coastguard Worker WORD8 i;
888*495ae853SAndroid Build Coastguard Worker p_DefCtxt->u1_mb_type = CAB_SKIP;
889*495ae853SAndroid Build Coastguard Worker
890*495ae853SAndroid Build Coastguard Worker p_DefCtxt->u1_cbp = 0x0f;
891*495ae853SAndroid Build Coastguard Worker p_DefCtxt->u1_intra_chroma_pred_mode = 0;
892*495ae853SAndroid Build Coastguard Worker
893*495ae853SAndroid Build Coastguard Worker p_DefCtxt->u1_yuv_dc_csbp = 0x7;
894*495ae853SAndroid Build Coastguard Worker
895*495ae853SAndroid Build Coastguard Worker p_DefCtxt->u1_transform8x8_ctxt = 0;
896*495ae853SAndroid Build Coastguard Worker
897*495ae853SAndroid Build Coastguard Worker pu1_temp = (UWORD8 *) p_DefCtxt->i1_ref_idx;
898*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++, pu1_temp++) (*pu1_temp) = 0;
899*495ae853SAndroid Build Coastguard Worker pu1_temp = (UWORD8 *) p_DefCtxt->u1_mv;
900*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 16; i++, pu1_temp++) (*pu1_temp) = 0;
901*495ae853SAndroid Build Coastguard Worker ps_dec->ps_def_ctxt_mb_info = p_DefCtxt;
902*495ae853SAndroid Build Coastguard Worker }
903*495ae853SAndroid Build Coastguard Worker }
904*495ae853SAndroid Build Coastguard Worker /* reset DBP commands read u4_flag */
905*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_cmds->u1_dpb_commands_read = 0;
906*495ae853SAndroid Build Coastguard Worker
907*495ae853SAndroid Build Coastguard Worker return OK;
908*495ae853SAndroid Build Coastguard Worker }
909