1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker /*!
21*495ae853SAndroid Build Coastguard Worker **************************************************************************
22*495ae853SAndroid Build Coastguard Worker * \file ih264d_utils.c
23*495ae853SAndroid Build Coastguard Worker *
24*495ae853SAndroid Build Coastguard Worker * \brief
25*495ae853SAndroid Build Coastguard Worker * Contains routines that handle of start and end of pic processing
26*495ae853SAndroid Build Coastguard Worker *
27*495ae853SAndroid Build Coastguard Worker * \date
28*495ae853SAndroid Build Coastguard Worker * 19/12/2002
29*495ae853SAndroid Build Coastguard Worker *
30*495ae853SAndroid Build Coastguard Worker * \author AI
31*495ae853SAndroid Build Coastguard Worker **************************************************************************
32*495ae853SAndroid Build Coastguard Worker */
33*495ae853SAndroid Build Coastguard Worker
34*495ae853SAndroid Build Coastguard Worker #include <string.h>
35*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
36*495ae853SAndroid Build Coastguard Worker #include "ithread.h"
37*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
38*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
40*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_mem_request.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
50*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
51*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
55*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
56*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
57*495ae853SAndroid Build Coastguard Worker #include "iv.h"
58*495ae853SAndroid Build Coastguard Worker #include "ivd.h"
59*495ae853SAndroid Build Coastguard Worker #include "ih264d_format_conv.h"
60*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264_disp_mgr.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264_buf_mgr.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
64*495ae853SAndroid Build Coastguard Worker
65*495ae853SAndroid Build Coastguard Worker /*!
66*495ae853SAndroid Build Coastguard Worker **************************************************************************
67*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_is_end_of_pic \endif
68*495ae853SAndroid Build Coastguard Worker *
69*495ae853SAndroid Build Coastguard Worker * \brief
70*495ae853SAndroid Build Coastguard Worker * Determines whether current slice is first slice of a new picture as
71*495ae853SAndroid Build Coastguard Worker * defined in 7.4.1.2.4 of 14496-10.
72*495ae853SAndroid Build Coastguard Worker *
73*495ae853SAndroid Build Coastguard Worker * \return
74*495ae853SAndroid Build Coastguard Worker * Return 1 if current slice is first slice of a new picture
75*495ae853SAndroid Build Coastguard Worker * Otherwise it returns 0
76*495ae853SAndroid Build Coastguard Worker **************************************************************************
77*495ae853SAndroid Build Coastguard Worker */
ih264d_is_end_of_pic(UWORD16 u2_frame_num,UWORD8 u1_nal_ref_idc,pocstruct_t * ps_cur_poc,pocstruct_t * ps_prev_poc,dec_slice_params_t * ps_prev_slice,UWORD8 u1_pic_order_cnt_type,UWORD8 u1_nal_unit_type,UWORD32 u4_idr_pic_id,UWORD8 u1_field_pic_flag,UWORD8 u1_bottom_field_flag)78*495ae853SAndroid Build Coastguard Worker UWORD8 ih264d_is_end_of_pic(UWORD16 u2_frame_num,
79*495ae853SAndroid Build Coastguard Worker UWORD8 u1_nal_ref_idc,
80*495ae853SAndroid Build Coastguard Worker pocstruct_t *ps_cur_poc,
81*495ae853SAndroid Build Coastguard Worker pocstruct_t *ps_prev_poc,
82*495ae853SAndroid Build Coastguard Worker dec_slice_params_t * ps_prev_slice, /*!< Previous slice parameters*/
83*495ae853SAndroid Build Coastguard Worker UWORD8 u1_pic_order_cnt_type,
84*495ae853SAndroid Build Coastguard Worker UWORD8 u1_nal_unit_type,
85*495ae853SAndroid Build Coastguard Worker UWORD32 u4_idr_pic_id,
86*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_pic_flag,
87*495ae853SAndroid Build Coastguard Worker UWORD8 u1_bottom_field_flag)
88*495ae853SAndroid Build Coastguard Worker {
89*495ae853SAndroid Build Coastguard Worker WORD8 i1_is_end_of_pic;
90*495ae853SAndroid Build Coastguard Worker WORD8 a, b, c, d, e, f, g, h;
91*495ae853SAndroid Build Coastguard Worker
92*495ae853SAndroid Build Coastguard Worker a = b = c = d = e = f = g = h = 0;
93*495ae853SAndroid Build Coastguard Worker a = (ps_prev_slice->u2_frame_num != u2_frame_num);
94*495ae853SAndroid Build Coastguard Worker b = (ps_prev_slice->u1_field_pic_flag != u1_field_pic_flag);
95*495ae853SAndroid Build Coastguard Worker if(u1_field_pic_flag && ps_prev_slice->u1_field_pic_flag)
96*495ae853SAndroid Build Coastguard Worker c = (u1_bottom_field_flag != ps_prev_slice->u1_bottom_field_flag);
97*495ae853SAndroid Build Coastguard Worker d =
98*495ae853SAndroid Build Coastguard Worker (u1_nal_ref_idc == 0 && ps_prev_slice->u1_nal_ref_idc != 0)
99*495ae853SAndroid Build Coastguard Worker || (u1_nal_ref_idc != 0
100*495ae853SAndroid Build Coastguard Worker && ps_prev_slice->u1_nal_ref_idc
101*495ae853SAndroid Build Coastguard Worker == 0);
102*495ae853SAndroid Build Coastguard Worker if(!a)
103*495ae853SAndroid Build Coastguard Worker {
104*495ae853SAndroid Build Coastguard Worker if((u1_pic_order_cnt_type == 0)
105*495ae853SAndroid Build Coastguard Worker && (ps_prev_slice->u1_pic_order_cnt_type == 0))
106*495ae853SAndroid Build Coastguard Worker {
107*495ae853SAndroid Build Coastguard Worker e =
108*495ae853SAndroid Build Coastguard Worker ((ps_cur_poc->i4_pic_order_cnt_lsb
109*495ae853SAndroid Build Coastguard Worker != ps_prev_poc->i4_pic_order_cnt_lsb)
110*495ae853SAndroid Build Coastguard Worker || (ps_cur_poc->i4_delta_pic_order_cnt_bottom
111*495ae853SAndroid Build Coastguard Worker != ps_prev_poc->i4_delta_pic_order_cnt_bottom));
112*495ae853SAndroid Build Coastguard Worker }
113*495ae853SAndroid Build Coastguard Worker
114*495ae853SAndroid Build Coastguard Worker if((u1_pic_order_cnt_type == 1)
115*495ae853SAndroid Build Coastguard Worker && (ps_prev_slice->u1_pic_order_cnt_type == 1))
116*495ae853SAndroid Build Coastguard Worker {
117*495ae853SAndroid Build Coastguard Worker f =
118*495ae853SAndroid Build Coastguard Worker ((ps_cur_poc->i4_delta_pic_order_cnt[0]
119*495ae853SAndroid Build Coastguard Worker != ps_prev_poc->i4_delta_pic_order_cnt[0])
120*495ae853SAndroid Build Coastguard Worker || (ps_cur_poc->i4_delta_pic_order_cnt[1]
121*495ae853SAndroid Build Coastguard Worker != ps_prev_poc->i4_delta_pic_order_cnt[1]));
122*495ae853SAndroid Build Coastguard Worker }
123*495ae853SAndroid Build Coastguard Worker }
124*495ae853SAndroid Build Coastguard Worker
125*495ae853SAndroid Build Coastguard Worker if((u1_nal_unit_type == IDR_SLICE_NAL)
126*495ae853SAndroid Build Coastguard Worker && (ps_prev_slice->u1_nal_unit_type == IDR_SLICE_NAL))
127*495ae853SAndroid Build Coastguard Worker {
128*495ae853SAndroid Build Coastguard Worker g = (u4_idr_pic_id != ps_prev_slice->u4_idr_pic_id);
129*495ae853SAndroid Build Coastguard Worker }
130*495ae853SAndroid Build Coastguard Worker
131*495ae853SAndroid Build Coastguard Worker if((u1_nal_unit_type == IDR_SLICE_NAL)
132*495ae853SAndroid Build Coastguard Worker && (ps_prev_slice->u1_nal_unit_type != IDR_SLICE_NAL))
133*495ae853SAndroid Build Coastguard Worker {
134*495ae853SAndroid Build Coastguard Worker h = 1;
135*495ae853SAndroid Build Coastguard Worker }
136*495ae853SAndroid Build Coastguard Worker i1_is_end_of_pic = a + b + c + d + e + f + g + h;
137*495ae853SAndroid Build Coastguard Worker return (i1_is_end_of_pic);
138*495ae853SAndroid Build Coastguard Worker }
139*495ae853SAndroid Build Coastguard Worker
140*495ae853SAndroid Build Coastguard Worker /*!
141*495ae853SAndroid Build Coastguard Worker **************************************************************************
142*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_decode_pic_order_cnt \endif
143*495ae853SAndroid Build Coastguard Worker *
144*495ae853SAndroid Build Coastguard Worker * \brief
145*495ae853SAndroid Build Coastguard Worker * Calculates picture order count of picture.
146*495ae853SAndroid Build Coastguard Worker *
147*495ae853SAndroid Build Coastguard Worker * \return
148*495ae853SAndroid Build Coastguard Worker * Returns the pic order count of the picture to which current
149*495ae853SAndroid Build Coastguard Worker * Slice belongs.
150*495ae853SAndroid Build Coastguard Worker *
151*495ae853SAndroid Build Coastguard Worker **************************************************************************
152*495ae853SAndroid Build Coastguard Worker */
ih264d_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)153*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_decode_pic_order_cnt(UWORD8 u1_is_idr_slice,
154*495ae853SAndroid Build Coastguard Worker UWORD32 u2_frame_num,
155*495ae853SAndroid Build Coastguard Worker pocstruct_t *ps_prev_poc,
156*495ae853SAndroid Build Coastguard Worker pocstruct_t *ps_cur_poc,
157*495ae853SAndroid Build Coastguard Worker dec_slice_params_t *ps_cur_slice, /*!< Pointer to current slice Params*/
158*495ae853SAndroid Build Coastguard Worker dec_pic_params_t * ps_pps,
159*495ae853SAndroid Build Coastguard Worker UWORD8 u1_nal_ref_idc,
160*495ae853SAndroid Build Coastguard Worker UWORD8 u1_bottom_field_flag,
161*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_pic_flag,
162*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_poc)
163*495ae853SAndroid Build Coastguard Worker {
164*495ae853SAndroid Build Coastguard Worker WORD64 i8_pic_msb;
165*495ae853SAndroid Build Coastguard Worker WORD32 i4_top_field_order_cnt = 0, i4_bottom_field_order_cnt = 0;
166*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_seq = ps_pps->ps_sps;
167*495ae853SAndroid Build Coastguard Worker WORD32 i4_prev_frame_num_ofst;
168*495ae853SAndroid Build Coastguard Worker
169*495ae853SAndroid Build Coastguard Worker switch(ps_seq->u1_pic_order_cnt_type)
170*495ae853SAndroid Build Coastguard Worker {
171*495ae853SAndroid Build Coastguard Worker case 0:
172*495ae853SAndroid Build Coastguard Worker /* POC TYPE 0 */
173*495ae853SAndroid Build Coastguard Worker if(u1_is_idr_slice)
174*495ae853SAndroid Build Coastguard Worker {
175*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_pic_order_cnt_msb = 0;
176*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_pic_order_cnt_lsb = 0;
177*495ae853SAndroid Build Coastguard Worker }
178*495ae853SAndroid Build Coastguard Worker if(ps_prev_poc->u1_mmco_equalto5)
179*495ae853SAndroid Build Coastguard Worker {
180*495ae853SAndroid Build Coastguard Worker if(ps_prev_poc->u1_bot_field != 1)
181*495ae853SAndroid Build Coastguard Worker {
182*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_msb = 0;
183*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_lsb =
184*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_top_field_order_count;
185*495ae853SAndroid Build Coastguard Worker }
186*495ae853SAndroid Build Coastguard Worker else
187*495ae853SAndroid Build Coastguard Worker {
188*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_msb = 0;
189*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_pic_order_cnt_lsb = 0;
190*495ae853SAndroid Build Coastguard Worker }
191*495ae853SAndroid Build Coastguard Worker }
192*495ae853SAndroid Build Coastguard Worker
193*495ae853SAndroid Build Coastguard Worker if((ps_cur_poc->i4_pic_order_cnt_lsb
194*495ae853SAndroid Build Coastguard Worker < ps_prev_poc->i4_pic_order_cnt_lsb)
195*495ae853SAndroid Build Coastguard Worker && ((ps_prev_poc->i4_pic_order_cnt_lsb
196*495ae853SAndroid Build Coastguard Worker - ps_cur_poc->i4_pic_order_cnt_lsb)
197*495ae853SAndroid Build Coastguard Worker >= (ps_seq->i4_max_pic_order_cntLsb
198*495ae853SAndroid Build Coastguard Worker >> 1)))
199*495ae853SAndroid Build Coastguard Worker {
200*495ae853SAndroid Build Coastguard Worker i8_pic_msb = (WORD64)ps_prev_poc->i4_pic_order_cnt_msb
201*495ae853SAndroid Build Coastguard Worker + ps_seq->i4_max_pic_order_cntLsb;
202*495ae853SAndroid Build Coastguard Worker }
203*495ae853SAndroid Build Coastguard Worker else if((ps_cur_poc->i4_pic_order_cnt_lsb
204*495ae853SAndroid Build Coastguard Worker > ps_prev_poc->i4_pic_order_cnt_lsb)
205*495ae853SAndroid Build Coastguard Worker && ((ps_cur_poc->i4_pic_order_cnt_lsb
206*495ae853SAndroid Build Coastguard Worker - ps_prev_poc->i4_pic_order_cnt_lsb)
207*495ae853SAndroid Build Coastguard Worker >= (ps_seq->i4_max_pic_order_cntLsb
208*495ae853SAndroid Build Coastguard Worker >> 1)))
209*495ae853SAndroid Build Coastguard Worker {
210*495ae853SAndroid Build Coastguard Worker i8_pic_msb = (WORD64)ps_prev_poc->i4_pic_order_cnt_msb
211*495ae853SAndroid Build Coastguard Worker - ps_seq->i4_max_pic_order_cntLsb;
212*495ae853SAndroid Build Coastguard Worker }
213*495ae853SAndroid Build Coastguard Worker else
214*495ae853SAndroid Build Coastguard Worker {
215*495ae853SAndroid Build Coastguard Worker i8_pic_msb = ps_prev_poc->i4_pic_order_cnt_msb;
216*495ae853SAndroid Build Coastguard Worker }
217*495ae853SAndroid Build Coastguard Worker
218*495ae853SAndroid Build Coastguard Worker if(!u1_field_pic_flag || !u1_bottom_field_flag)
219*495ae853SAndroid Build Coastguard Worker {
220*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = i8_pic_msb + ps_cur_poc->i4_pic_order_cnt_lsb;
221*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
222*495ae853SAndroid Build Coastguard Worker {
223*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
224*495ae853SAndroid Build Coastguard Worker }
225*495ae853SAndroid Build Coastguard Worker i4_top_field_order_cnt = i8_result;
226*495ae853SAndroid Build Coastguard Worker }
227*495ae853SAndroid Build Coastguard Worker
228*495ae853SAndroid Build Coastguard Worker if(!u1_field_pic_flag)
229*495ae853SAndroid Build Coastguard Worker {
230*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = (WORD64)i4_top_field_order_cnt
231*495ae853SAndroid Build Coastguard Worker + ps_cur_poc->i4_delta_pic_order_cnt_bottom;
232*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
233*495ae853SAndroid Build Coastguard Worker {
234*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
235*495ae853SAndroid Build Coastguard Worker }
236*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = i8_result;
237*495ae853SAndroid Build Coastguard Worker }
238*495ae853SAndroid Build Coastguard Worker else if(u1_bottom_field_flag)
239*495ae853SAndroid Build Coastguard Worker {
240*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = i8_pic_msb + ps_cur_poc->i4_pic_order_cnt_lsb;
241*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
242*495ae853SAndroid Build Coastguard Worker {
243*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
244*495ae853SAndroid Build Coastguard Worker }
245*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = i8_result;
246*495ae853SAndroid Build Coastguard Worker }
247*495ae853SAndroid Build Coastguard Worker
248*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_pic_msb))
249*495ae853SAndroid Build Coastguard Worker {
250*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
251*495ae853SAndroid Build Coastguard Worker }
252*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_pic_order_cnt_msb = i8_pic_msb;
253*495ae853SAndroid Build Coastguard Worker break;
254*495ae853SAndroid Build Coastguard Worker
255*495ae853SAndroid Build Coastguard Worker case 1:
256*495ae853SAndroid Build Coastguard Worker {
257*495ae853SAndroid Build Coastguard Worker /* POC TYPE 1 */
258*495ae853SAndroid Build Coastguard Worker UWORD8 i;
259*495ae853SAndroid Build Coastguard Worker WORD32 prev_frame_num;
260*495ae853SAndroid Build Coastguard Worker WORD32 frame_num_ofst;
261*495ae853SAndroid Build Coastguard Worker WORD32 abs_frm_num;
262*495ae853SAndroid Build Coastguard Worker WORD32 poc_cycle_cnt, frame_num_in_poc_cycle;
263*495ae853SAndroid Build Coastguard Worker WORD64 i8_expected_delta_poc_cycle;
264*495ae853SAndroid Build Coastguard Worker WORD32 expected_poc;
265*495ae853SAndroid Build Coastguard Worker WORD64 i8_result;
266*495ae853SAndroid Build Coastguard Worker
267*495ae853SAndroid Build Coastguard Worker prev_frame_num = (WORD32)ps_cur_slice->u2_frame_num;
268*495ae853SAndroid Build Coastguard Worker if(!u1_is_idr_slice)
269*495ae853SAndroid Build Coastguard Worker {
270*495ae853SAndroid Build Coastguard Worker if(ps_cur_slice->u1_mmco_equalto5)
271*495ae853SAndroid Build Coastguard Worker {
272*495ae853SAndroid Build Coastguard Worker prev_frame_num = 0;
273*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = 0;
274*495ae853SAndroid Build Coastguard Worker }
275*495ae853SAndroid Build Coastguard Worker else
276*495ae853SAndroid Build Coastguard Worker {
277*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = ps_prev_poc->i4_prev_frame_num_ofst;
278*495ae853SAndroid Build Coastguard Worker }
279*495ae853SAndroid Build Coastguard Worker }
280*495ae853SAndroid Build Coastguard Worker else
281*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = 0;
282*495ae853SAndroid Build Coastguard Worker
283*495ae853SAndroid Build Coastguard Worker /* 1. Derivation for FrameNumOffset */
284*495ae853SAndroid Build Coastguard Worker if(u1_is_idr_slice)
285*495ae853SAndroid Build Coastguard Worker {
286*495ae853SAndroid Build Coastguard Worker frame_num_ofst = 0;
287*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[0] = 0;
288*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[1] = 0;
289*495ae853SAndroid Build Coastguard Worker }
290*495ae853SAndroid Build Coastguard Worker else if(prev_frame_num > ((WORD32)u2_frame_num))
291*495ae853SAndroid Build Coastguard Worker {
292*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = i4_prev_frame_num_ofst
293*495ae853SAndroid Build Coastguard Worker + (WORD64)ps_seq->u2_u4_max_pic_num_minus1 + 1;
294*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
295*495ae853SAndroid Build Coastguard Worker {
296*495ae853SAndroid Build Coastguard Worker return ERROR_INV_FRAME_NUM;
297*495ae853SAndroid Build Coastguard Worker }
298*495ae853SAndroid Build Coastguard Worker frame_num_ofst = i8_result;
299*495ae853SAndroid Build Coastguard Worker }
300*495ae853SAndroid Build Coastguard Worker else
301*495ae853SAndroid Build Coastguard Worker frame_num_ofst = i4_prev_frame_num_ofst;
302*495ae853SAndroid Build Coastguard Worker
303*495ae853SAndroid Build Coastguard Worker /* 2. Derivation for absFrameNum */
304*495ae853SAndroid Build Coastguard Worker if(0 != ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle)
305*495ae853SAndroid Build Coastguard Worker {
306*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = frame_num_ofst + (WORD64)u2_frame_num;
307*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
308*495ae853SAndroid Build Coastguard Worker {
309*495ae853SAndroid Build Coastguard Worker return ERROR_INV_FRAME_NUM;
310*495ae853SAndroid Build Coastguard Worker }
311*495ae853SAndroid Build Coastguard Worker abs_frm_num = i8_result;
312*495ae853SAndroid Build Coastguard Worker }
313*495ae853SAndroid Build Coastguard Worker else
314*495ae853SAndroid Build Coastguard Worker abs_frm_num = 0;
315*495ae853SAndroid Build Coastguard Worker if((u1_nal_ref_idc == 0) && (abs_frm_num > 0))
316*495ae853SAndroid Build Coastguard Worker abs_frm_num = abs_frm_num - 1;
317*495ae853SAndroid Build Coastguard Worker
318*495ae853SAndroid Build Coastguard Worker /* 4. expectedDeltaPerPicOrderCntCycle is derived as */
319*495ae853SAndroid Build Coastguard Worker i8_expected_delta_poc_cycle = 0;
320*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle;
321*495ae853SAndroid Build Coastguard Worker i++)
322*495ae853SAndroid Build Coastguard Worker {
323*495ae853SAndroid Build Coastguard Worker i8_expected_delta_poc_cycle +=
324*495ae853SAndroid Build Coastguard Worker ps_seq->i4_ofst_for_ref_frame[i];
325*495ae853SAndroid Build Coastguard Worker }
326*495ae853SAndroid Build Coastguard Worker
327*495ae853SAndroid Build Coastguard Worker /* 3. When absFrameNum > 0, picOrderCntCycleCnt and
328*495ae853SAndroid Build Coastguard Worker frame_num_in_poc_cycle are derived as : */
329*495ae853SAndroid Build Coastguard Worker /* 5. expectedPicOrderCnt is derived as : */
330*495ae853SAndroid Build Coastguard Worker if(abs_frm_num > 0)
331*495ae853SAndroid Build Coastguard Worker {
332*495ae853SAndroid Build Coastguard Worker poc_cycle_cnt =
333*495ae853SAndroid Build Coastguard Worker DIV((abs_frm_num - 1),
334*495ae853SAndroid Build Coastguard Worker ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle);
335*495ae853SAndroid Build Coastguard Worker frame_num_in_poc_cycle =
336*495ae853SAndroid Build Coastguard Worker MOD((abs_frm_num - 1),
337*495ae853SAndroid Build Coastguard Worker ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle);
338*495ae853SAndroid Build Coastguard Worker
339*495ae853SAndroid Build Coastguard Worker i8_result = poc_cycle_cnt
340*495ae853SAndroid Build Coastguard Worker * i8_expected_delta_poc_cycle;
341*495ae853SAndroid Build Coastguard Worker
342*495ae853SAndroid Build Coastguard Worker for(i = 0; i <= frame_num_in_poc_cycle; i++)
343*495ae853SAndroid Build Coastguard Worker {
344*495ae853SAndroid Build Coastguard Worker i8_result = i8_result
345*495ae853SAndroid Build Coastguard Worker + ps_seq->i4_ofst_for_ref_frame[i];
346*495ae853SAndroid Build Coastguard Worker }
347*495ae853SAndroid Build Coastguard Worker
348*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
349*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
350*495ae853SAndroid Build Coastguard Worker
351*495ae853SAndroid Build Coastguard Worker expected_poc = (WORD32)i8_result;
352*495ae853SAndroid Build Coastguard Worker
353*495ae853SAndroid Build Coastguard Worker }
354*495ae853SAndroid Build Coastguard Worker else
355*495ae853SAndroid Build Coastguard Worker expected_poc = 0;
356*495ae853SAndroid Build Coastguard Worker
357*495ae853SAndroid Build Coastguard Worker if(u1_nal_ref_idc == 0)
358*495ae853SAndroid Build Coastguard Worker {
359*495ae853SAndroid Build Coastguard Worker i8_result = (WORD64)expected_poc
360*495ae853SAndroid Build Coastguard Worker + ps_seq->i4_ofst_for_non_ref_pic;
361*495ae853SAndroid Build Coastguard Worker
362*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
363*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
364*495ae853SAndroid Build Coastguard Worker
365*495ae853SAndroid Build Coastguard Worker expected_poc = (WORD32)i8_result;
366*495ae853SAndroid Build Coastguard Worker }
367*495ae853SAndroid Build Coastguard Worker
368*495ae853SAndroid Build Coastguard Worker /* 6. TopFieldOrderCnt or BottomFieldOrderCnt are derived as */
369*495ae853SAndroid Build Coastguard Worker if(!u1_field_pic_flag)
370*495ae853SAndroid Build Coastguard Worker {
371*495ae853SAndroid Build Coastguard Worker i8_result = (WORD64)expected_poc
372*495ae853SAndroid Build Coastguard Worker + ps_cur_poc->i4_delta_pic_order_cnt[0];
373*495ae853SAndroid Build Coastguard Worker
374*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
375*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
376*495ae853SAndroid Build Coastguard Worker i4_top_field_order_cnt = (WORD32)i8_result;
377*495ae853SAndroid Build Coastguard Worker
378*495ae853SAndroid Build Coastguard Worker i8_result = (WORD64)i4_top_field_order_cnt
379*495ae853SAndroid Build Coastguard Worker + ps_seq->i4_ofst_for_top_to_bottom_field
380*495ae853SAndroid Build Coastguard Worker + ps_cur_poc->i4_delta_pic_order_cnt[1];
381*495ae853SAndroid Build Coastguard Worker
382*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
383*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
384*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = (WORD32)i8_result;
385*495ae853SAndroid Build Coastguard Worker }
386*495ae853SAndroid Build Coastguard Worker else if(!u1_bottom_field_flag)
387*495ae853SAndroid Build Coastguard Worker {
388*495ae853SAndroid Build Coastguard Worker i8_result = (WORD64)expected_poc
389*495ae853SAndroid Build Coastguard Worker + ps_cur_poc->i4_delta_pic_order_cnt[0];
390*495ae853SAndroid Build Coastguard Worker
391*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
392*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
393*495ae853SAndroid Build Coastguard Worker i4_top_field_order_cnt = (WORD32)i8_result;
394*495ae853SAndroid Build Coastguard Worker }
395*495ae853SAndroid Build Coastguard Worker else
396*495ae853SAndroid Build Coastguard Worker {
397*495ae853SAndroid Build Coastguard Worker i8_result = (WORD64)expected_poc
398*495ae853SAndroid Build Coastguard Worker + ps_seq->i4_ofst_for_top_to_bottom_field
399*495ae853SAndroid Build Coastguard Worker + ps_cur_poc->i4_delta_pic_order_cnt[0];
400*495ae853SAndroid Build Coastguard Worker
401*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
402*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
403*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = (WORD32)i8_result;
404*495ae853SAndroid Build Coastguard Worker }
405*495ae853SAndroid Build Coastguard Worker /* Copy the current POC info into Previous POC structure */
406*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_prev_frame_num_ofst = frame_num_ofst;
407*495ae853SAndroid Build Coastguard Worker }
408*495ae853SAndroid Build Coastguard Worker
409*495ae853SAndroid Build Coastguard Worker break;
410*495ae853SAndroid Build Coastguard Worker case 2:
411*495ae853SAndroid Build Coastguard Worker {
412*495ae853SAndroid Build Coastguard Worker /* POC TYPE 2 */
413*495ae853SAndroid Build Coastguard Worker WORD32 prev_frame_num;
414*495ae853SAndroid Build Coastguard Worker WORD32 frame_num_ofst;
415*495ae853SAndroid Build Coastguard Worker WORD32 tmp_poc;
416*495ae853SAndroid Build Coastguard Worker
417*495ae853SAndroid Build Coastguard Worker prev_frame_num = (WORD32)ps_cur_slice->u2_frame_num;
418*495ae853SAndroid Build Coastguard Worker if(!u1_is_idr_slice)
419*495ae853SAndroid Build Coastguard Worker {
420*495ae853SAndroid Build Coastguard Worker if(ps_cur_slice->u1_mmco_equalto5)
421*495ae853SAndroid Build Coastguard Worker {
422*495ae853SAndroid Build Coastguard Worker prev_frame_num = 0;
423*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = 0;
424*495ae853SAndroid Build Coastguard Worker }
425*495ae853SAndroid Build Coastguard Worker else
426*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = ps_prev_poc->i4_prev_frame_num_ofst;
427*495ae853SAndroid Build Coastguard Worker }
428*495ae853SAndroid Build Coastguard Worker else
429*495ae853SAndroid Build Coastguard Worker i4_prev_frame_num_ofst = 0;
430*495ae853SAndroid Build Coastguard Worker
431*495ae853SAndroid Build Coastguard Worker /* 1. Derivation for FrameNumOffset */
432*495ae853SAndroid Build Coastguard Worker if(u1_is_idr_slice)
433*495ae853SAndroid Build Coastguard Worker {
434*495ae853SAndroid Build Coastguard Worker frame_num_ofst = 0;
435*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[0] = 0;
436*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_delta_pic_order_cnt[1] = 0;
437*495ae853SAndroid Build Coastguard Worker }
438*495ae853SAndroid Build Coastguard Worker else if(prev_frame_num > ((WORD32)u2_frame_num))
439*495ae853SAndroid Build Coastguard Worker {
440*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = i4_prev_frame_num_ofst
441*495ae853SAndroid Build Coastguard Worker + (WORD64)ps_seq->u2_u4_max_pic_num_minus1 + 1;
442*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
443*495ae853SAndroid Build Coastguard Worker {
444*495ae853SAndroid Build Coastguard Worker return ERROR_INV_FRAME_NUM;
445*495ae853SAndroid Build Coastguard Worker }
446*495ae853SAndroid Build Coastguard Worker frame_num_ofst = i8_result;
447*495ae853SAndroid Build Coastguard Worker }
448*495ae853SAndroid Build Coastguard Worker else
449*495ae853SAndroid Build Coastguard Worker frame_num_ofst = i4_prev_frame_num_ofst;
450*495ae853SAndroid Build Coastguard Worker
451*495ae853SAndroid Build Coastguard Worker /* 2. Derivation for tempPicOrderCnt */
452*495ae853SAndroid Build Coastguard Worker if(u1_is_idr_slice)
453*495ae853SAndroid Build Coastguard Worker tmp_poc = 0;
454*495ae853SAndroid Build Coastguard Worker else if(u1_nal_ref_idc == 0)
455*495ae853SAndroid Build Coastguard Worker {
456*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = ((frame_num_ofst + (WORD64)u2_frame_num) << 1) - 1;
457*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
458*495ae853SAndroid Build Coastguard Worker {
459*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
460*495ae853SAndroid Build Coastguard Worker }
461*495ae853SAndroid Build Coastguard Worker tmp_poc = i8_result;
462*495ae853SAndroid Build Coastguard Worker }
463*495ae853SAndroid Build Coastguard Worker else
464*495ae853SAndroid Build Coastguard Worker {
465*495ae853SAndroid Build Coastguard Worker WORD64 i8_result = (frame_num_ofst + (WORD64)u2_frame_num) << 1;
466*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_result))
467*495ae853SAndroid Build Coastguard Worker {
468*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC;
469*495ae853SAndroid Build Coastguard Worker }
470*495ae853SAndroid Build Coastguard Worker tmp_poc = i8_result;
471*495ae853SAndroid Build Coastguard Worker }
472*495ae853SAndroid Build Coastguard Worker
473*495ae853SAndroid Build Coastguard Worker /* 6. TopFieldOrderCnt or BottomFieldOrderCnt are derived as */
474*495ae853SAndroid Build Coastguard Worker if(!u1_field_pic_flag)
475*495ae853SAndroid Build Coastguard Worker {
476*495ae853SAndroid Build Coastguard Worker i4_top_field_order_cnt = tmp_poc;
477*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = tmp_poc;
478*495ae853SAndroid Build Coastguard Worker }
479*495ae853SAndroid Build Coastguard Worker else if(!u1_bottom_field_flag)
480*495ae853SAndroid Build Coastguard Worker i4_top_field_order_cnt = tmp_poc;
481*495ae853SAndroid Build Coastguard Worker else
482*495ae853SAndroid Build Coastguard Worker i4_bottom_field_order_cnt = tmp_poc;
483*495ae853SAndroid Build Coastguard Worker
484*495ae853SAndroid Build Coastguard Worker /* Copy the current POC info into Previous POC structure */
485*495ae853SAndroid Build Coastguard Worker ps_prev_poc->i4_prev_frame_num_ofst = frame_num_ofst;
486*495ae853SAndroid Build Coastguard Worker ps_cur_poc->i4_prev_frame_num_ofst = frame_num_ofst;
487*495ae853SAndroid Build Coastguard Worker }
488*495ae853SAndroid Build Coastguard Worker break;
489*495ae853SAndroid Build Coastguard Worker default:
490*495ae853SAndroid Build Coastguard Worker return ERROR_INV_POC_TYPE_T;
491*495ae853SAndroid Build Coastguard Worker break;
492*495ae853SAndroid Build Coastguard Worker }
493*495ae853SAndroid Build Coastguard Worker
494*495ae853SAndroid Build Coastguard Worker if(!u1_field_pic_flag) // or a complementary field pair
495*495ae853SAndroid Build Coastguard Worker {
496*495ae853SAndroid Build Coastguard Worker *pi4_poc = MIN(i4_top_field_order_cnt, i4_bottom_field_order_cnt);
497*495ae853SAndroid Build Coastguard Worker ps_pps->i4_top_field_order_cnt = i4_top_field_order_cnt;
498*495ae853SAndroid Build Coastguard Worker ps_pps->i4_bottom_field_order_cnt = i4_bottom_field_order_cnt;
499*495ae853SAndroid Build Coastguard Worker }
500*495ae853SAndroid Build Coastguard Worker else if(!u1_bottom_field_flag)
501*495ae853SAndroid Build Coastguard Worker {
502*495ae853SAndroid Build Coastguard Worker *pi4_poc = i4_top_field_order_cnt;
503*495ae853SAndroid Build Coastguard Worker ps_pps->i4_top_field_order_cnt = i4_top_field_order_cnt;
504*495ae853SAndroid Build Coastguard Worker }
505*495ae853SAndroid Build Coastguard Worker else
506*495ae853SAndroid Build Coastguard Worker {
507*495ae853SAndroid Build Coastguard Worker *pi4_poc = i4_bottom_field_order_cnt;
508*495ae853SAndroid Build Coastguard Worker ps_pps->i4_bottom_field_order_cnt = i4_bottom_field_order_cnt;
509*495ae853SAndroid Build Coastguard Worker }
510*495ae853SAndroid Build Coastguard Worker
511*495ae853SAndroid Build Coastguard Worker ps_pps->i4_avg_poc = *pi4_poc;
512*495ae853SAndroid Build Coastguard Worker
513*495ae853SAndroid Build Coastguard Worker return OK;
514*495ae853SAndroid Build Coastguard Worker }
515*495ae853SAndroid Build Coastguard Worker
516*495ae853SAndroid Build Coastguard Worker /*!
517*495ae853SAndroid Build Coastguard Worker **************************************************************************
518*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_end_of_pic_processing \endif
519*495ae853SAndroid Build Coastguard Worker *
520*495ae853SAndroid Build Coastguard Worker * \brief
521*495ae853SAndroid Build Coastguard Worker * Performs the end of picture processing.
522*495ae853SAndroid Build Coastguard Worker *
523*495ae853SAndroid Build Coastguard Worker * It performs deblocking on the current picture and sets the i4_status of
524*495ae853SAndroid Build Coastguard Worker * current picture as decoded.
525*495ae853SAndroid Build Coastguard Worker *
526*495ae853SAndroid Build Coastguard Worker * \return
527*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise.
528*495ae853SAndroid Build Coastguard Worker **************************************************************************
529*495ae853SAndroid Build Coastguard Worker */
ih264d_end_of_pic_processing(dec_struct_t * ps_dec)530*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_end_of_pic_processing(dec_struct_t *ps_dec)
531*495ae853SAndroid Build Coastguard Worker {
532*495ae853SAndroid Build Coastguard Worker UWORD8 u1_pic_type, u1_nal_ref_idc;
533*495ae853SAndroid Build Coastguard Worker dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
534*495ae853SAndroid Build Coastguard Worker
535*495ae853SAndroid Build Coastguard Worker /* If nal_ref_idc is equal to 0 for one slice or slice data partition NAL
536*495ae853SAndroid Build Coastguard Worker unit of a particular picture, it shall be equal to 0 for all slice and
537*495ae853SAndroid Build Coastguard Worker slice data partition NAL units of the picture. nal_ref_idc greater
538*495ae853SAndroid Build Coastguard Worker than 0 indicates that the content of the NAL unit belongs to a decoded
539*495ae853SAndroid Build Coastguard Worker picture that is stored and marked for use as a reference picture in the
540*495ae853SAndroid Build Coastguard Worker decoded picture buffer. */
541*495ae853SAndroid Build Coastguard Worker
542*495ae853SAndroid Build Coastguard Worker /* 1. Do MMCO
543*495ae853SAndroid Build Coastguard Worker 2. Add Cur Pic to list of reference pics.
544*495ae853SAndroid Build Coastguard Worker */
545*495ae853SAndroid Build Coastguard Worker
546*495ae853SAndroid Build Coastguard Worker /* Call MMCO */
547*495ae853SAndroid Build Coastguard Worker u1_pic_type = 0;
548*495ae853SAndroid Build Coastguard Worker u1_nal_ref_idc = ps_cur_slice->u1_nal_ref_idc;
549*495ae853SAndroid Build Coastguard Worker
550*495ae853SAndroid Build Coastguard Worker if(u1_nal_ref_idc)
551*495ae853SAndroid Build Coastguard Worker {
552*495ae853SAndroid Build Coastguard Worker if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)
553*495ae853SAndroid Build Coastguard Worker {
554*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->u1_mmco_error_in_seq = 0;
555*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_dpb_cmds->u1_long_term_reference_flag == 0)
556*495ae853SAndroid Build Coastguard Worker {
557*495ae853SAndroid Build Coastguard Worker ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
558*495ae853SAndroid Build Coastguard Worker /* ignore DPB errors */
559*495ae853SAndroid Build Coastguard Worker ih264d_insert_st_node(ps_dec->ps_dpb_mgr,
560*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pic,
561*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_buf_id,
562*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u2_frame_num);
563*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->u1_max_lt_frame_idx = NO_LONG_TERM_INDICIES;
564*495ae853SAndroid Build Coastguard Worker }
565*495ae853SAndroid Build Coastguard Worker else
566*495ae853SAndroid Build Coastguard Worker {
567*495ae853SAndroid Build Coastguard Worker /* Equivalent of inserting a pic directly as longterm Pic */
568*495ae853SAndroid Build Coastguard Worker
569*495ae853SAndroid Build Coastguard Worker {
570*495ae853SAndroid Build Coastguard Worker /* ignore DPB errors */
571*495ae853SAndroid Build Coastguard Worker ih264d_insert_st_node(ps_dec->ps_dpb_mgr,
572*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pic,
573*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_buf_id,
574*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u2_frame_num);
575*495ae853SAndroid Build Coastguard Worker
576*495ae853SAndroid Build Coastguard Worker /* Set longTermIdx = 0, MaxLongTermFrameIdx = 0 */
577*495ae853SAndroid Build Coastguard Worker ih264d_delete_st_node_or_make_lt(
578*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr,
579*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u2_frame_num, 0,
580*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u1_field_pic_flag);
581*495ae853SAndroid Build Coastguard Worker
582*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->u1_max_lt_frame_idx = 0;
583*495ae853SAndroid Build Coastguard Worker }
584*495ae853SAndroid Build Coastguard Worker }
585*495ae853SAndroid Build Coastguard Worker }
586*495ae853SAndroid Build Coastguard Worker else
587*495ae853SAndroid Build Coastguard Worker {
588*495ae853SAndroid Build Coastguard Worker
589*495ae853SAndroid Build Coastguard Worker {
590*495ae853SAndroid Build Coastguard Worker UWORD16 u2_pic_num = ps_cur_slice->u2_frame_num;
591*495ae853SAndroid Build Coastguard Worker
592*495ae853SAndroid Build Coastguard Worker if(!ps_dec->ps_dpb_mgr->u1_mmco_error_in_seq)
593*495ae853SAndroid Build Coastguard Worker {
594*495ae853SAndroid Build Coastguard Worker WORD32 ret = ih264d_do_mmco_buffer(ps_dec->ps_dpb_cmds, ps_dec->ps_dpb_mgr,
595*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->u1_num_ref_frames, u2_pic_num,
596*495ae853SAndroid Build Coastguard Worker (ps_dec->ps_cur_sps->u2_u4_max_pic_num_minus1),
597*495ae853SAndroid Build Coastguard Worker ps_dec->u1_nal_unit_type, ps_dec->ps_cur_pic,
598*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_buf_id,
599*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u1_field_pic_flag,
600*495ae853SAndroid Build Coastguard Worker ps_dec->e_dec_status);
601*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->u1_mmco_error_in_seq = ret != OK;
602*495ae853SAndroid Build Coastguard Worker }
603*495ae853SAndroid Build Coastguard Worker }
604*495ae853SAndroid Build Coastguard Worker }
605*495ae853SAndroid Build Coastguard Worker ih264d_update_default_index_list(ps_dec->ps_dpb_mgr);
606*495ae853SAndroid Build Coastguard Worker }
607*495ae853SAndroid Build Coastguard Worker
608*495ae853SAndroid Build Coastguard Worker if(ps_cur_slice->u1_field_pic_flag)
609*495ae853SAndroid Build Coastguard Worker {
610*495ae853SAndroid Build Coastguard Worker if(ps_cur_slice->u1_bottom_field_flag)
611*495ae853SAndroid Build Coastguard Worker {
612*495ae853SAndroid Build Coastguard Worker if(u1_nal_ref_idc)
613*495ae853SAndroid Build Coastguard Worker u1_pic_type = u1_pic_type | BOT_REF;
614*495ae853SAndroid Build Coastguard Worker u1_pic_type = u1_pic_type | BOT_FLD;
615*495ae853SAndroid Build Coastguard Worker }
616*495ae853SAndroid Build Coastguard Worker else
617*495ae853SAndroid Build Coastguard Worker {
618*495ae853SAndroid Build Coastguard Worker if(u1_nal_ref_idc)
619*495ae853SAndroid Build Coastguard Worker u1_pic_type = u1_pic_type | TOP_REF;
620*495ae853SAndroid Build Coastguard Worker u1_pic_type = u1_pic_type | TOP_FLD;
621*495ae853SAndroid Build Coastguard Worker }
622*495ae853SAndroid Build Coastguard Worker }
623*495ae853SAndroid Build Coastguard Worker else
624*495ae853SAndroid Build Coastguard Worker u1_pic_type = TOP_REF | BOT_REF;
625*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pic->u1_pic_type |= u1_pic_type;
626*495ae853SAndroid Build Coastguard Worker
627*495ae853SAndroid Build Coastguard Worker
628*495ae853SAndroid Build Coastguard Worker if(ps_cur_slice->u1_field_pic_flag)
629*495ae853SAndroid Build Coastguard Worker {
630*495ae853SAndroid Build Coastguard Worker H264_DEC_DEBUG_PRINT("Toggling secondField\n");
631*495ae853SAndroid Build Coastguard Worker ps_dec->u1_second_field = 1 - ps_dec->u1_second_field;
632*495ae853SAndroid Build Coastguard Worker }
633*495ae853SAndroid Build Coastguard Worker
634*495ae853SAndroid Build Coastguard Worker return OK;
635*495ae853SAndroid Build Coastguard Worker }
636*495ae853SAndroid Build Coastguard Worker
637*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
638*495ae853SAndroid Build Coastguard Worker /* */
639*495ae853SAndroid Build Coastguard Worker /* Function Name : init_dpb_size */
640*495ae853SAndroid Build Coastguard Worker /* */
641*495ae853SAndroid Build Coastguard Worker /* Description : This function calculates the DBP i4_size in frames */
642*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_seq - current sequence params */
643*495ae853SAndroid Build Coastguard Worker /* */
644*495ae853SAndroid Build Coastguard Worker /* Globals : None */
645*495ae853SAndroid Build Coastguard Worker /* */
646*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
647*495ae853SAndroid Build Coastguard Worker /* */
648*495ae853SAndroid Build Coastguard Worker /* Returns : DPB in frames */
649*495ae853SAndroid Build Coastguard Worker /* */
650*495ae853SAndroid Build Coastguard Worker /* Issues : None */
651*495ae853SAndroid Build Coastguard Worker /* */
652*495ae853SAndroid Build Coastguard Worker /* Revision History: */
653*495ae853SAndroid Build Coastguard Worker /* */
654*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
655*495ae853SAndroid Build Coastguard Worker /* 28 04 2005 NS Draft */
656*495ae853SAndroid Build Coastguard Worker /* */
657*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_get_dpb_size(dec_seq_params_t * ps_seq)658*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_dpb_size(dec_seq_params_t *ps_seq)
659*495ae853SAndroid Build Coastguard Worker {
660*495ae853SAndroid Build Coastguard Worker WORD32 i4_size;
661*495ae853SAndroid Build Coastguard Worker UWORD8 u1_level_idc;
662*495ae853SAndroid Build Coastguard Worker
663*495ae853SAndroid Build Coastguard Worker u1_level_idc = ps_seq->u1_level_idc;
664*495ae853SAndroid Build Coastguard Worker
665*495ae853SAndroid Build Coastguard Worker switch(u1_level_idc)
666*495ae853SAndroid Build Coastguard Worker {
667*495ae853SAndroid Build Coastguard Worker case 10:
668*495ae853SAndroid Build Coastguard Worker i4_size = 152064;
669*495ae853SAndroid Build Coastguard Worker break;
670*495ae853SAndroid Build Coastguard Worker case 11:
671*495ae853SAndroid Build Coastguard Worker i4_size = 345600;
672*495ae853SAndroid Build Coastguard Worker break;
673*495ae853SAndroid Build Coastguard Worker case 12:
674*495ae853SAndroid Build Coastguard Worker i4_size = 912384;
675*495ae853SAndroid Build Coastguard Worker break;
676*495ae853SAndroid Build Coastguard Worker case 13:
677*495ae853SAndroid Build Coastguard Worker i4_size = 912384;
678*495ae853SAndroid Build Coastguard Worker break;
679*495ae853SAndroid Build Coastguard Worker case 20:
680*495ae853SAndroid Build Coastguard Worker i4_size = 912384;
681*495ae853SAndroid Build Coastguard Worker break;
682*495ae853SAndroid Build Coastguard Worker case 21:
683*495ae853SAndroid Build Coastguard Worker i4_size = 1824768;
684*495ae853SAndroid Build Coastguard Worker break;
685*495ae853SAndroid Build Coastguard Worker case 22:
686*495ae853SAndroid Build Coastguard Worker i4_size = 3110400;
687*495ae853SAndroid Build Coastguard Worker break;
688*495ae853SAndroid Build Coastguard Worker case 30:
689*495ae853SAndroid Build Coastguard Worker i4_size = 3110400;
690*495ae853SAndroid Build Coastguard Worker break;
691*495ae853SAndroid Build Coastguard Worker case 31:
692*495ae853SAndroid Build Coastguard Worker i4_size = 6912000;
693*495ae853SAndroid Build Coastguard Worker break;
694*495ae853SAndroid Build Coastguard Worker case 32:
695*495ae853SAndroid Build Coastguard Worker i4_size = 7864320;
696*495ae853SAndroid Build Coastguard Worker break;
697*495ae853SAndroid Build Coastguard Worker case 40:
698*495ae853SAndroid Build Coastguard Worker i4_size = 12582912;
699*495ae853SAndroid Build Coastguard Worker break;
700*495ae853SAndroid Build Coastguard Worker case 41:
701*495ae853SAndroid Build Coastguard Worker i4_size = 12582912;
702*495ae853SAndroid Build Coastguard Worker break;
703*495ae853SAndroid Build Coastguard Worker case 42:
704*495ae853SAndroid Build Coastguard Worker i4_size = 12582912;
705*495ae853SAndroid Build Coastguard Worker break;
706*495ae853SAndroid Build Coastguard Worker case 50:
707*495ae853SAndroid Build Coastguard Worker i4_size = 42393600;
708*495ae853SAndroid Build Coastguard Worker break;
709*495ae853SAndroid Build Coastguard Worker case 51:
710*495ae853SAndroid Build Coastguard Worker i4_size = 70778880;
711*495ae853SAndroid Build Coastguard Worker break;
712*495ae853SAndroid Build Coastguard Worker case 52:
713*495ae853SAndroid Build Coastguard Worker i4_size = 70778880;
714*495ae853SAndroid Build Coastguard Worker break;
715*495ae853SAndroid Build Coastguard Worker default:
716*495ae853SAndroid Build Coastguard Worker i4_size = 70778880;
717*495ae853SAndroid Build Coastguard Worker break;
718*495ae853SAndroid Build Coastguard Worker }
719*495ae853SAndroid Build Coastguard Worker
720*495ae853SAndroid Build Coastguard Worker i4_size /= (ps_seq->u2_frm_wd_in_mbs * (ps_seq->u2_frm_ht_in_mbs << (1 - ps_seq->u1_frame_mbs_only_flag)));
721*495ae853SAndroid Build Coastguard Worker i4_size /= 384;
722*495ae853SAndroid Build Coastguard Worker i4_size = MIN(i4_size, 16);
723*495ae853SAndroid Build Coastguard Worker i4_size = MAX(i4_size, 1);
724*495ae853SAndroid Build Coastguard Worker return (i4_size);
725*495ae853SAndroid Build Coastguard Worker }
726*495ae853SAndroid Build Coastguard Worker
727*495ae853SAndroid Build Coastguard Worker /**************************************************************************/
728*495ae853SAndroid Build Coastguard Worker /* This function initialises the value of ps_dec->u1_recon_mb_grp */
729*495ae853SAndroid Build Coastguard Worker /* ps_dec->u1_recon_mb_grp must satisfy the following criteria */
730*495ae853SAndroid Build Coastguard Worker /* - multiple of 2 (required for N/2 parse-mvpred design) */
731*495ae853SAndroid Build Coastguard Worker /* - multiple of 4 (if it is not a frame_mbs_only sequence), */
732*495ae853SAndroid Build Coastguard Worker /* in this case N/2 itself needs to be even for mbpair processing */
733*495ae853SAndroid Build Coastguard Worker /* - lesser than ps_dec->u2_frm_wd_in_mbs/2 (at least 3 N-Chunks */
734*495ae853SAndroid Build Coastguard Worker /* should make a row to ensure proper MvTop transferring) */
735*495ae853SAndroid Build Coastguard Worker /**************************************************************************/
ih264d_init_dec_mb_grp(dec_struct_t * ps_dec)736*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_init_dec_mb_grp(dec_struct_t *ps_dec)
737*495ae853SAndroid Build Coastguard Worker {
738*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_seq = ps_dec->ps_cur_sps;
739*495ae853SAndroid Build Coastguard Worker UWORD8 u1_frm = ps_seq->u1_frame_mbs_only_flag;
740*495ae853SAndroid Build Coastguard Worker
741*495ae853SAndroid Build Coastguard Worker ps_dec->u1_recon_mb_grp = ps_dec->u2_frm_wd_in_mbs << ps_seq->u1_mb_aff_flag;
742*495ae853SAndroid Build Coastguard Worker
743*495ae853SAndroid Build Coastguard Worker ps_dec->u1_recon_mb_grp_pair = ps_dec->u1_recon_mb_grp >> 1;
744*495ae853SAndroid Build Coastguard Worker
745*495ae853SAndroid Build Coastguard Worker if(!ps_dec->u1_recon_mb_grp)
746*495ae853SAndroid Build Coastguard Worker {
747*495ae853SAndroid Build Coastguard Worker return ERROR_MB_GROUP_ASSGN_T;
748*495ae853SAndroid Build Coastguard Worker }
749*495ae853SAndroid Build Coastguard Worker
750*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_mbs_prev_nmb = ps_dec->u1_recon_mb_grp;
751*495ae853SAndroid Build Coastguard Worker
752*495ae853SAndroid Build Coastguard Worker return OK;
753*495ae853SAndroid Build Coastguard Worker }
754*495ae853SAndroid Build Coastguard Worker
755*495ae853SAndroid Build Coastguard Worker
756*495ae853SAndroid Build Coastguard Worker /*!
757*495ae853SAndroid Build Coastguard Worker **************************************************************************
758*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_init_pic \endif
759*495ae853SAndroid Build Coastguard Worker *
760*495ae853SAndroid Build Coastguard Worker * \brief
761*495ae853SAndroid Build Coastguard Worker * Initializes the picture.
762*495ae853SAndroid Build Coastguard Worker *
763*495ae853SAndroid Build Coastguard Worker * \return
764*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
765*495ae853SAndroid Build Coastguard Worker *
766*495ae853SAndroid Build Coastguard Worker * \note
767*495ae853SAndroid Build Coastguard Worker * This function is called when first slice of the
768*495ae853SAndroid Build Coastguard Worker * NON -IDR picture is encountered.
769*495ae853SAndroid Build Coastguard Worker **************************************************************************
770*495ae853SAndroid Build Coastguard Worker */
ih264d_init_pic(dec_struct_t * ps_dec,UWORD16 u2_frame_num,WORD32 i4_poc,dec_pic_params_t * ps_pps)771*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_init_pic(dec_struct_t *ps_dec,
772*495ae853SAndroid Build Coastguard Worker UWORD16 u2_frame_num,
773*495ae853SAndroid Build Coastguard Worker WORD32 i4_poc,
774*495ae853SAndroid Build Coastguard Worker dec_pic_params_t *ps_pps)
775*495ae853SAndroid Build Coastguard Worker {
776*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_seq = ps_pps->ps_sps;
777*495ae853SAndroid Build Coastguard Worker prev_seq_params_t * ps_prev_seq_params = &ps_dec->s_prev_seq_params;
778*495ae853SAndroid Build Coastguard Worker WORD32 i4_pic_bufs;
779*495ae853SAndroid Build Coastguard Worker WORD32 ret;
780*495ae853SAndroid Build Coastguard Worker
781*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num;
782*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->i4_poc = i4_poc;
783*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pps = ps_pps;
784*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pps->pv_codec_handle = ps_dec;
785*495ae853SAndroid Build Coastguard Worker
786*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps = ps_seq;
787*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->i4_max_frm_num = ps_seq->u2_u4_max_pic_num_minus1
788*495ae853SAndroid Build Coastguard Worker + 1;
789*495ae853SAndroid Build Coastguard Worker
790*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->u2_pic_ht = ps_dec->u2_pic_ht;
791*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr->u2_pic_wd = ps_dec->u2_pic_wd;
792*495ae853SAndroid Build Coastguard Worker ps_dec->i4_pic_type = NA_SLICE;
793*495ae853SAndroid Build Coastguard Worker ps_dec->i4_frametype = IV_NA_FRAME;
794*495ae853SAndroid Build Coastguard Worker ps_dec->i4_content_type = IV_CONTENTTYPE_NA;
795*495ae853SAndroid Build Coastguard Worker
796*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
797*495ae853SAndroid Build Coastguard Worker /* Get the value of MaxMbAddress and frmheight in Mbs */
798*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
799*495ae853SAndroid Build Coastguard Worker ps_seq->u2_max_mb_addr =
800*495ae853SAndroid Build Coastguard Worker (ps_seq->u2_frm_wd_in_mbs
801*495ae853SAndroid Build Coastguard Worker * (ps_dec->u2_pic_ht
802*495ae853SAndroid Build Coastguard Worker >> (4
803*495ae853SAndroid Build Coastguard Worker + ps_dec->ps_cur_slice->u1_field_pic_flag)))
804*495ae853SAndroid Build Coastguard Worker - 1;
805*495ae853SAndroid Build Coastguard Worker ps_dec->u2_frm_ht_in_mbs = (ps_dec->u2_pic_ht
806*495ae853SAndroid Build Coastguard Worker >> (4 + ps_dec->ps_cur_slice->u1_field_pic_flag));
807*495ae853SAndroid Build Coastguard Worker
808*495ae853SAndroid Build Coastguard Worker /***************************************************************************/
809*495ae853SAndroid Build Coastguard Worker /* If change in Level or the required PicBuffers i4_size is more than the */
810*495ae853SAndroid Build Coastguard Worker /* current one FREE the current PicBuffers and allocate affresh */
811*495ae853SAndroid Build Coastguard Worker /***************************************************************************/
812*495ae853SAndroid Build Coastguard Worker if(!ps_dec->u1_init_dec_flag)
813*495ae853SAndroid Build Coastguard Worker {
814*495ae853SAndroid Build Coastguard Worker ps_dec->u1_max_dec_frame_buffering = ih264d_get_dpb_size(ps_seq);
815*495ae853SAndroid Build Coastguard Worker
816*495ae853SAndroid Build Coastguard Worker ps_dec->i4_display_delay = ps_dec->u1_max_dec_frame_buffering;
817*495ae853SAndroid Build Coastguard Worker if((1 == ps_seq->u1_vui_parameters_present_flag) &&
818*495ae853SAndroid Build Coastguard Worker (1 == ps_seq->s_vui.u1_bitstream_restriction_flag))
819*495ae853SAndroid Build Coastguard Worker {
820*495ae853SAndroid Build Coastguard Worker if(ps_seq->u1_frame_mbs_only_flag == 1)
821*495ae853SAndroid Build Coastguard Worker ps_dec->i4_display_delay = ps_seq->s_vui.u4_num_reorder_frames + 1;
822*495ae853SAndroid Build Coastguard Worker else
823*495ae853SAndroid Build Coastguard Worker ps_dec->i4_display_delay = ps_seq->s_vui.u4_num_reorder_frames * 2 + 2;
824*495ae853SAndroid Build Coastguard Worker }
825*495ae853SAndroid Build Coastguard Worker
826*495ae853SAndroid Build Coastguard Worker if(IVD_DECODE_FRAME_OUT == ps_dec->e_frm_out_mode)
827*495ae853SAndroid Build Coastguard Worker ps_dec->i4_display_delay = 0;
828*495ae853SAndroid Build Coastguard Worker
829*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_share_disp_buf == 0)
830*495ae853SAndroid Build Coastguard Worker {
831*495ae853SAndroid Build Coastguard Worker if(ps_seq->u1_frame_mbs_only_flag == 1)
832*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs = ps_dec->i4_display_delay + ps_seq->u1_num_ref_frames + 1;
833*495ae853SAndroid Build Coastguard Worker else
834*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs = ps_dec->i4_display_delay + ps_seq->u1_num_ref_frames * 2 + 2;
835*495ae853SAndroid Build Coastguard Worker }
836*495ae853SAndroid Build Coastguard Worker else
837*495ae853SAndroid Build Coastguard Worker {
838*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs = (WORD32)ps_dec->u4_num_disp_bufs;
839*495ae853SAndroid Build Coastguard Worker }
840*495ae853SAndroid Build Coastguard Worker
841*495ae853SAndroid Build Coastguard Worker /* Ensure at least two buffers are allocated */
842*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs = MAX(ps_dec->u1_pic_bufs, 2);
843*495ae853SAndroid Build Coastguard Worker
844*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_share_disp_buf == 0)
845*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs = MIN(ps_dec->u1_pic_bufs,
846*495ae853SAndroid Build Coastguard Worker (H264_MAX_REF_PICS * 2));
847*495ae853SAndroid Build Coastguard Worker
848*495ae853SAndroid Build Coastguard Worker ps_dec->u1_max_dec_frame_buffering = MIN(
849*495ae853SAndroid Build Coastguard Worker ps_dec->u1_max_dec_frame_buffering,
850*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs);
851*495ae853SAndroid Build Coastguard Worker
852*495ae853SAndroid Build Coastguard Worker /* Temporary hack to run Tractor Cav/Cab/MbAff Profiler streams also for CAFI1_SVA_C.264 in conformance*/
853*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_init_dec_flag)
854*495ae853SAndroid Build Coastguard Worker {
855*495ae853SAndroid Build Coastguard Worker ih264d_release_pics_in_dpb((void *)ps_dec,
856*495ae853SAndroid Build Coastguard Worker ps_dec->u1_pic_bufs);
857*495ae853SAndroid Build Coastguard Worker ih264d_release_display_bufs(ps_dec);
858*495ae853SAndroid Build Coastguard Worker ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
859*495ae853SAndroid Build Coastguard Worker }
860*495ae853SAndroid Build Coastguard Worker
861*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
862*495ae853SAndroid Build Coastguard Worker /* Configuring decoder parameters based on level and then */
863*495ae853SAndroid Build Coastguard Worker /* fresh pointer initialisation in decoder scratch and state buffers */
864*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
865*495ae853SAndroid Build Coastguard Worker if(!ps_dec->u1_init_dec_flag ||
866*495ae853SAndroid Build Coastguard Worker ((ps_seq->u1_level_idc < H264_LEVEL_3_0) ^ (ps_prev_seq_params->u1_level_idc < H264_LEVEL_3_0)))
867*495ae853SAndroid Build Coastguard Worker {
868*495ae853SAndroid Build Coastguard Worker ret = ih264d_init_dec_mb_grp(ps_dec);
869*495ae853SAndroid Build Coastguard Worker if(ret != OK)
870*495ae853SAndroid Build Coastguard Worker return ret;
871*495ae853SAndroid Build Coastguard Worker }
872*495ae853SAndroid Build Coastguard Worker
873*495ae853SAndroid Build Coastguard Worker ret = ih264d_allocate_dynamic_bufs(ps_dec);
874*495ae853SAndroid Build Coastguard Worker if(ret != OK)
875*495ae853SAndroid Build Coastguard Worker {
876*495ae853SAndroid Build Coastguard Worker /* Free any dynamic buffers that are allocated */
877*495ae853SAndroid Build Coastguard Worker ih264d_free_dynamic_bufs(ps_dec);
878*495ae853SAndroid Build Coastguard Worker ps_dec->i4_error_code = IVD_MEM_ALLOC_FAILED;
879*495ae853SAndroid Build Coastguard Worker return IVD_MEM_ALLOC_FAILED;
880*495ae853SAndroid Build Coastguard Worker }
881*495ae853SAndroid Build Coastguard Worker
882*495ae853SAndroid Build Coastguard Worker ret = ih264d_create_pic_buffers(ps_dec->u1_pic_bufs,
883*495ae853SAndroid Build Coastguard Worker ps_dec);
884*495ae853SAndroid Build Coastguard Worker if(ret != OK)
885*495ae853SAndroid Build Coastguard Worker return ret;
886*495ae853SAndroid Build Coastguard Worker
887*495ae853SAndroid Build Coastguard Worker
888*495ae853SAndroid Build Coastguard Worker
889*495ae853SAndroid Build Coastguard Worker ret = ih264d_create_mv_bank(ps_dec, ps_dec->u2_pic_wd,
890*495ae853SAndroid Build Coastguard Worker ps_dec->u2_pic_ht);
891*495ae853SAndroid Build Coastguard Worker if(ret != OK)
892*495ae853SAndroid Build Coastguard Worker return ret;
893*495ae853SAndroid Build Coastguard Worker
894*495ae853SAndroid Build Coastguard Worker /* In shared mode, set all of them as used by display */
895*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_share_disp_buf == 1)
896*495ae853SAndroid Build Coastguard Worker {
897*495ae853SAndroid Build Coastguard Worker WORD32 i;
898*495ae853SAndroid Build Coastguard Worker
899*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_dec->u1_pic_bufs; i++)
900*495ae853SAndroid Build Coastguard Worker {
901*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, i,
902*495ae853SAndroid Build Coastguard Worker BUF_MGR_IO);
903*495ae853SAndroid Build Coastguard Worker }
904*495ae853SAndroid Build Coastguard Worker }
905*495ae853SAndroid Build Coastguard Worker
906*495ae853SAndroid Build Coastguard Worker ps_dec->u1_init_dec_flag = 1;
907*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
908*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u1_level_idc = ps_seq->u1_level_idc;
909*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u1_profile_idc = ps_seq->u1_profile_idc;
910*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
911*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u1_frame_mbs_only_flag =
912*495ae853SAndroid Build Coastguard Worker ps_seq->u1_frame_mbs_only_flag;
913*495ae853SAndroid Build Coastguard Worker ps_prev_seq_params->u1_direct_8x8_inference_flag =
914*495ae853SAndroid Build Coastguard Worker ps_seq->u1_direct_8x8_inference_flag;
915*495ae853SAndroid Build Coastguard Worker
916*495ae853SAndroid Build Coastguard Worker ps_dec->i4_cur_display_seq = 0;
917*495ae853SAndroid Build Coastguard Worker ps_dec->i4_prev_max_display_seq = 0;
918*495ae853SAndroid Build Coastguard Worker ps_dec->i4_max_poc = 0;
919*495ae853SAndroid Build Coastguard Worker
920*495ae853SAndroid Build Coastguard Worker {
921*495ae853SAndroid Build Coastguard Worker /* 0th entry of CtxtIncMbMap will be always be containing default values
922*495ae853SAndroid Build Coastguard Worker for CABAC context representing MB not available */
923*495ae853SAndroid Build Coastguard Worker ctxt_inc_mb_info_t *p_DefCtxt = ps_dec->p_ctxt_inc_mb_map - 1;
924*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_temp;
925*495ae853SAndroid Build Coastguard Worker WORD8 i;
926*495ae853SAndroid Build Coastguard Worker p_DefCtxt->u1_mb_type = CAB_SKIP;
927*495ae853SAndroid Build Coastguard Worker
928*495ae853SAndroid Build Coastguard Worker p_DefCtxt->u1_cbp = 0x0f;
929*495ae853SAndroid Build Coastguard Worker p_DefCtxt->u1_intra_chroma_pred_mode = 0;
930*495ae853SAndroid Build Coastguard Worker
931*495ae853SAndroid Build Coastguard Worker p_DefCtxt->u1_yuv_dc_csbp = 0x7;
932*495ae853SAndroid Build Coastguard Worker
933*495ae853SAndroid Build Coastguard Worker p_DefCtxt->u1_transform8x8_ctxt = 0;
934*495ae853SAndroid Build Coastguard Worker
935*495ae853SAndroid Build Coastguard Worker pu1_temp = (UWORD8*)p_DefCtxt->i1_ref_idx;
936*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++, pu1_temp++)
937*495ae853SAndroid Build Coastguard Worker (*pu1_temp) = 0;
938*495ae853SAndroid Build Coastguard Worker pu1_temp = (UWORD8*)p_DefCtxt->u1_mv;
939*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 16; i++, pu1_temp++)
940*495ae853SAndroid Build Coastguard Worker (*pu1_temp) = 0;
941*495ae853SAndroid Build Coastguard Worker ps_dec->ps_def_ctxt_mb_info = p_DefCtxt;
942*495ae853SAndroid Build Coastguard Worker }
943*495ae853SAndroid Build Coastguard Worker
944*495ae853SAndroid Build Coastguard Worker }
945*495ae853SAndroid Build Coastguard Worker /* reset DBP commands read u4_flag */
946*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_cmds->u1_dpb_commands_read = 0;
947*495ae853SAndroid Build Coastguard Worker
948*495ae853SAndroid Build Coastguard Worker return OK;
949*495ae853SAndroid Build Coastguard Worker }
950*495ae853SAndroid Build Coastguard Worker
951*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
952*495ae853SAndroid Build Coastguard Worker /* */
953*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_get_next_display_field */
954*495ae853SAndroid Build Coastguard Worker /* */
955*495ae853SAndroid Build Coastguard Worker /* Description : Application calls this module to get the next field */
956*495ae853SAndroid Build Coastguard Worker /* to be displayed */
957*495ae853SAndroid Build Coastguard Worker /* */
958*495ae853SAndroid Build Coastguard Worker /* Inputs : 1. IBUFAPI_Handle Hnadle to the Display buffer */
959*495ae853SAndroid Build Coastguard Worker /* 2. IH264DEC_DispUnit Pointer to the display struct */
960*495ae853SAndroid Build Coastguard Worker /* */
961*495ae853SAndroid Build Coastguard Worker /* Globals : */
962*495ae853SAndroid Build Coastguard Worker /* */
963*495ae853SAndroid Build Coastguard Worker /* */
964*495ae853SAndroid Build Coastguard Worker /* Processing : None */
965*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
966*495ae853SAndroid Build Coastguard Worker /* Returns : None */
967*495ae853SAndroid Build Coastguard Worker /* Issues : None */
968*495ae853SAndroid Build Coastguard Worker /* */
969*495ae853SAndroid Build Coastguard Worker /* Revision History: */
970*495ae853SAndroid Build Coastguard Worker /* */
971*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
972*495ae853SAndroid Build Coastguard Worker /* 27 05 2005 Ittiam Draft */
973*495ae853SAndroid Build Coastguard Worker /* */
974*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
975*495ae853SAndroid Build Coastguard Worker
ih264d_get_next_display_field(dec_struct_t * ps_dec,ivd_out_bufdesc_t * ps_out_buffer,ivd_get_display_frame_op_t * pv_disp_op)976*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_get_next_display_field(dec_struct_t * ps_dec,
977*495ae853SAndroid Build Coastguard Worker ivd_out_bufdesc_t *ps_out_buffer,
978*495ae853SAndroid Build Coastguard Worker ivd_get_display_frame_op_t *pv_disp_op)
979*495ae853SAndroid Build Coastguard Worker {
980*495ae853SAndroid Build Coastguard Worker pic_buffer_t *pic_buf;
981*495ae853SAndroid Build Coastguard Worker
982*495ae853SAndroid Build Coastguard Worker UWORD8 i1_cur_fld;
983*495ae853SAndroid Build Coastguard Worker WORD32 u4_api_ret = -1;
984*495ae853SAndroid Build Coastguard Worker WORD32 i4_disp_buf_id;
985*495ae853SAndroid Build Coastguard Worker iv_yuv_buf_t *ps_op_frm;
986*495ae853SAndroid Build Coastguard Worker
987*495ae853SAndroid Build Coastguard Worker
988*495ae853SAndroid Build Coastguard Worker
989*495ae853SAndroid Build Coastguard Worker ps_op_frm = &(ps_dec->s_disp_frame_info);
990*495ae853SAndroid Build Coastguard Worker H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
991*495ae853SAndroid Build Coastguard Worker pic_buf = (pic_buffer_t *)ih264_disp_mgr_get(
992*495ae853SAndroid Build Coastguard Worker (disp_mgr_t *)ps_dec->pv_disp_buf_mgr, &i4_disp_buf_id);
993*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_fld_in_frm = 0;
994*495ae853SAndroid Build Coastguard Worker u4_api_ret = -1;
995*495ae853SAndroid Build Coastguard Worker pv_disp_op->u4_ts = 0;
996*495ae853SAndroid Build Coastguard Worker pv_disp_op->e_output_format = ps_dec->u1_chroma_format;
997*495ae853SAndroid Build Coastguard Worker
998*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_y_buf = ps_out_buffer->pu1_bufs[0];
999*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_u_buf = ps_out_buffer->pu1_bufs[1];
1000*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_v_buf = ps_out_buffer->pu1_bufs[2];
1001*495ae853SAndroid Build Coastguard Worker ps_dec->i4_display_index = DEFAULT_POC;
1002*495ae853SAndroid Build Coastguard Worker if(pic_buf != NULL)
1003*495ae853SAndroid Build Coastguard Worker {
1004*495ae853SAndroid Build Coastguard Worker ps_dec->pv_disp_sei_params = &pic_buf->s_sei_pic;
1005*495ae853SAndroid Build Coastguard Worker pv_disp_op->e4_fld_type = 0;
1006*495ae853SAndroid Build Coastguard Worker pv_disp_op->u4_disp_buf_id = i4_disp_buf_id;
1007*495ae853SAndroid Build Coastguard Worker
1008*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_ht = pic_buf->u2_disp_height << 1;
1009*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_u_ht = ps_op_frm->u4_v_ht = ps_op_frm->u4_y_ht >> 1;
1010*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_wd = pic_buf->u2_disp_width;
1011*495ae853SAndroid Build Coastguard Worker
1012*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_u_wd = ps_op_frm->u4_v_wd = ps_op_frm->u4_y_wd >> 1;
1013*495ae853SAndroid Build Coastguard Worker
1014*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_strd = pic_buf->u2_frm_wd_y;
1015*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_u_strd = ps_op_frm->u4_v_strd = pic_buf->u2_frm_wd_uv;
1016*495ae853SAndroid Build Coastguard Worker
1017*495ae853SAndroid Build Coastguard Worker /* ! */
1018*495ae853SAndroid Build Coastguard Worker pv_disp_op->u4_ts = pic_buf->u4_ts;
1019*495ae853SAndroid Build Coastguard Worker ps_dec->i4_display_index = pic_buf->i4_poc;
1020*495ae853SAndroid Build Coastguard Worker
1021*495ae853SAndroid Build Coastguard Worker /* set the start of the Y, U and V buffer pointer for display */
1022*495ae853SAndroid Build Coastguard Worker ps_op_frm->pv_y_buf = pic_buf->pu1_buf1 + pic_buf->u2_crop_offset_y;
1023*495ae853SAndroid Build Coastguard Worker ps_op_frm->pv_u_buf = pic_buf->pu1_buf2 + pic_buf->u2_crop_offset_uv;
1024*495ae853SAndroid Build Coastguard Worker ps_op_frm->pv_v_buf = pic_buf->pu1_buf3 + pic_buf->u2_crop_offset_uv;
1025*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_fld_in_frm++;
1026*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_fld_in_frm++;
1027*495ae853SAndroid Build Coastguard Worker u4_api_ret = 0;
1028*495ae853SAndroid Build Coastguard Worker
1029*495ae853SAndroid Build Coastguard Worker if(pic_buf->u1_picturetype == 0)
1030*495ae853SAndroid Build Coastguard Worker pv_disp_op->u4_progressive_frame_flag = 1;
1031*495ae853SAndroid Build Coastguard Worker else
1032*495ae853SAndroid Build Coastguard Worker pv_disp_op->u4_progressive_frame_flag = 0;
1033*495ae853SAndroid Build Coastguard Worker
1034*495ae853SAndroid Build Coastguard Worker } H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
1035*495ae853SAndroid Build Coastguard Worker pv_disp_op->u4_error_code = u4_api_ret;
1036*495ae853SAndroid Build Coastguard Worker pv_disp_op->e_pic_type = 0xFFFFFFFF; //Junk;
1037*495ae853SAndroid Build Coastguard Worker
1038*495ae853SAndroid Build Coastguard Worker if(u4_api_ret)
1039*495ae853SAndroid Build Coastguard Worker {
1040*495ae853SAndroid Build Coastguard Worker pv_disp_op->u4_error_code = 1; //put a proper error code here
1041*495ae853SAndroid Build Coastguard Worker }
1042*495ae853SAndroid Build Coastguard Worker else
1043*495ae853SAndroid Build Coastguard Worker {
1044*495ae853SAndroid Build Coastguard Worker
1045*495ae853SAndroid Build Coastguard Worker //Release the buffer if being sent for display
1046*495ae853SAndroid Build Coastguard Worker UWORD32 temp;
1047*495ae853SAndroid Build Coastguard Worker UWORD32 dest_inc_Y = 0, dest_inc_UV = 0;
1048*495ae853SAndroid Build Coastguard Worker
1049*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_wd = temp = MIN(ps_op_frm->u4_y_wd,
1050*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_strd);
1051*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_wd = pv_disp_op->s_disp_frm_buf.u4_y_wd
1052*495ae853SAndroid Build Coastguard Worker >> 1;
1053*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_v_wd = pv_disp_op->s_disp_frm_buf.u4_y_wd
1054*495ae853SAndroid Build Coastguard Worker >> 1;
1055*495ae853SAndroid Build Coastguard Worker
1056*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_ht = ps_op_frm->u4_y_ht;
1057*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_ht = pv_disp_op->s_disp_frm_buf.u4_y_ht
1058*495ae853SAndroid Build Coastguard Worker >> 1;
1059*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_v_ht = pv_disp_op->s_disp_frm_buf.u4_y_ht
1060*495ae853SAndroid Build Coastguard Worker >> 1;
1061*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
1062*495ae853SAndroid Build Coastguard Worker {
1063*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd =
1064*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_wd;
1065*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_strd =
1066*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_wd >> 1;
1067*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_v_strd =
1068*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_wd >> 1;
1069*495ae853SAndroid Build Coastguard Worker
1070*495ae853SAndroid Build Coastguard Worker }
1071*495ae853SAndroid Build Coastguard Worker else
1072*495ae853SAndroid Build Coastguard Worker {
1073*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd = ps_op_frm->u4_y_strd;
1074*495ae853SAndroid Build Coastguard Worker }
1075*495ae853SAndroid Build Coastguard Worker
1076*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_app_disp_width)
1077*495ae853SAndroid Build Coastguard Worker {
1078*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd = MAX(
1079*495ae853SAndroid Build Coastguard Worker ps_dec->u4_app_disp_width,
1080*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd);
1081*495ae853SAndroid Build Coastguard Worker }
1082*495ae853SAndroid Build Coastguard Worker
1083*495ae853SAndroid Build Coastguard Worker pv_disp_op->u4_error_code = 0;
1084*495ae853SAndroid Build Coastguard Worker if(pv_disp_op->e_output_format == IV_YUV_420P)
1085*495ae853SAndroid Build Coastguard Worker {
1086*495ae853SAndroid Build Coastguard Worker UWORD32 i;
1087*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_strd =
1088*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd >> 1;
1089*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_v_strd =
1090*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd >> 1;
1091*495ae853SAndroid Build Coastguard Worker
1092*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_wd = ps_op_frm->u4_y_wd >> 1;
1093*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_v_wd = ps_op_frm->u4_y_wd >> 1;
1094*495ae853SAndroid Build Coastguard Worker
1095*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->u4_share_disp_buf)
1096*495ae853SAndroid Build Coastguard Worker {
1097*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_y_buf = ps_op_frm->pv_y_buf;
1098*495ae853SAndroid Build Coastguard Worker
1099*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_DISP_BUFS_NEW; i++)
1100*495ae853SAndroid Build Coastguard Worker {
1101*495ae853SAndroid Build Coastguard Worker UWORD8 *buf = ps_dec->disp_bufs[i].buf[0];
1102*495ae853SAndroid Build Coastguard Worker buf += ps_dec->disp_bufs[i].u4_ofst[0];
1103*495ae853SAndroid Build Coastguard Worker if(((UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf
1104*495ae853SAndroid Build Coastguard Worker - pic_buf->u2_crop_offset_y) == buf)
1105*495ae853SAndroid Build Coastguard Worker {
1106*495ae853SAndroid Build Coastguard Worker buf = ps_dec->disp_bufs[i].buf[1];
1107*495ae853SAndroid Build Coastguard Worker buf += ps_dec->disp_bufs[i].u4_ofst[1];
1108*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_u_buf = buf
1109*495ae853SAndroid Build Coastguard Worker + (pic_buf->u2_crop_offset_uv
1110*495ae853SAndroid Build Coastguard Worker / YUV420SP_FACTOR);
1111*495ae853SAndroid Build Coastguard Worker
1112*495ae853SAndroid Build Coastguard Worker buf = ps_dec->disp_bufs[i].buf[2];
1113*495ae853SAndroid Build Coastguard Worker buf += ps_dec->disp_bufs[i].u4_ofst[2];
1114*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_v_buf = buf
1115*495ae853SAndroid Build Coastguard Worker + (pic_buf->u2_crop_offset_uv
1116*495ae853SAndroid Build Coastguard Worker / YUV420SP_FACTOR);
1117*495ae853SAndroid Build Coastguard Worker
1118*495ae853SAndroid Build Coastguard Worker }
1119*495ae853SAndroid Build Coastguard Worker }
1120*495ae853SAndroid Build Coastguard Worker }
1121*495ae853SAndroid Build Coastguard Worker
1122*495ae853SAndroid Build Coastguard Worker }
1123*495ae853SAndroid Build Coastguard Worker else if((pv_disp_op->e_output_format == IV_YUV_420SP_UV)
1124*495ae853SAndroid Build Coastguard Worker || (pv_disp_op->e_output_format == IV_YUV_420SP_VU))
1125*495ae853SAndroid Build Coastguard Worker {
1126*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_strd =
1127*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd;
1128*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_v_strd = 0;
1129*495ae853SAndroid Build Coastguard Worker
1130*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->u4_share_disp_buf)
1131*495ae853SAndroid Build Coastguard Worker {
1132*495ae853SAndroid Build Coastguard Worker UWORD32 i;
1133*495ae853SAndroid Build Coastguard Worker
1134*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_y_buf = ps_op_frm->pv_y_buf;
1135*495ae853SAndroid Build Coastguard Worker
1136*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_DISP_BUFS_NEW; i++)
1137*495ae853SAndroid Build Coastguard Worker {
1138*495ae853SAndroid Build Coastguard Worker UWORD8 *buf = ps_dec->disp_bufs[i].buf[0];
1139*495ae853SAndroid Build Coastguard Worker buf += ps_dec->disp_bufs[i].u4_ofst[0];
1140*495ae853SAndroid Build Coastguard Worker if((UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf
1141*495ae853SAndroid Build Coastguard Worker - pic_buf->u2_crop_offset_y == buf)
1142*495ae853SAndroid Build Coastguard Worker {
1143*495ae853SAndroid Build Coastguard Worker buf = ps_dec->disp_bufs[i].buf[1];
1144*495ae853SAndroid Build Coastguard Worker buf += ps_dec->disp_bufs[i].u4_ofst[1];
1145*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_u_buf = buf
1146*495ae853SAndroid Build Coastguard Worker + pic_buf->u2_crop_offset_uv;
1147*495ae853SAndroid Build Coastguard Worker ;
1148*495ae853SAndroid Build Coastguard Worker
1149*495ae853SAndroid Build Coastguard Worker buf = ps_dec->disp_bufs[i].buf[2];
1150*495ae853SAndroid Build Coastguard Worker buf += ps_dec->disp_bufs[i].u4_ofst[2];
1151*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_v_buf = buf
1152*495ae853SAndroid Build Coastguard Worker + pic_buf->u2_crop_offset_uv;
1153*495ae853SAndroid Build Coastguard Worker ;
1154*495ae853SAndroid Build Coastguard Worker }
1155*495ae853SAndroid Build Coastguard Worker }
1156*495ae853SAndroid Build Coastguard Worker }
1157*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_wd =
1158*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_wd;
1159*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_v_wd = 0;
1160*495ae853SAndroid Build Coastguard Worker
1161*495ae853SAndroid Build Coastguard Worker }
1162*495ae853SAndroid Build Coastguard Worker else if((pv_disp_op->e_output_format == IV_RGB_565)
1163*495ae853SAndroid Build Coastguard Worker || (pv_disp_op->e_output_format == IV_YUV_422ILE))
1164*495ae853SAndroid Build Coastguard Worker {
1165*495ae853SAndroid Build Coastguard Worker
1166*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_strd = 0;
1167*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_v_strd = 0;
1168*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_wd = 0;
1169*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_v_wd = 0;
1170*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_ht = 0;
1171*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_v_ht = 0;
1172*495ae853SAndroid Build Coastguard Worker
1173*495ae853SAndroid Build Coastguard Worker }
1174*495ae853SAndroid Build Coastguard Worker
1175*495ae853SAndroid Build Coastguard Worker
1176*495ae853SAndroid Build Coastguard Worker }
1177*495ae853SAndroid Build Coastguard Worker
1178*495ae853SAndroid Build Coastguard Worker return u4_api_ret;
1179*495ae853SAndroid Build Coastguard Worker }
1180*495ae853SAndroid Build Coastguard Worker
1181*495ae853SAndroid Build Coastguard Worker
1182*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1183*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_release_display_field */
1184*495ae853SAndroid Build Coastguard Worker /* */
1185*495ae853SAndroid Build Coastguard Worker /* Description : This function releases the display field that was returned */
1186*495ae853SAndroid Build Coastguard Worker /* here. */
1187*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_dec - Decoder parameters */
1188*495ae853SAndroid Build Coastguard Worker /* Globals : None */
1189*495ae853SAndroid Build Coastguard Worker /* Processing : Refer bumping process in the standard */
1190*495ae853SAndroid Build Coastguard Worker /* Outputs : Assigns display sequence number. */
1191*495ae853SAndroid Build Coastguard Worker /* Returns : None */
1192*495ae853SAndroid Build Coastguard Worker /* */
1193*495ae853SAndroid Build Coastguard Worker /* Issues : None */
1194*495ae853SAndroid Build Coastguard Worker /* */
1195*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1196*495ae853SAndroid Build Coastguard Worker /* */
1197*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1198*495ae853SAndroid Build Coastguard Worker /* 27 04 2005 NS Draft */
1199*495ae853SAndroid Build Coastguard Worker /* */
1200*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_release_display_field(dec_struct_t * ps_dec,ivd_get_display_frame_op_t * pv_disp_op)1201*495ae853SAndroid Build Coastguard Worker void ih264d_release_display_field(dec_struct_t *ps_dec,
1202*495ae853SAndroid Build Coastguard Worker ivd_get_display_frame_op_t *pv_disp_op)
1203*495ae853SAndroid Build Coastguard Worker {
1204*495ae853SAndroid Build Coastguard Worker if(1 == pv_disp_op->u4_error_code)
1205*495ae853SAndroid Build Coastguard Worker {
1206*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->u1_flushfrm)
1207*495ae853SAndroid Build Coastguard Worker {
1208*495ae853SAndroid Build Coastguard Worker UWORD32 i;
1209*495ae853SAndroid Build Coastguard Worker
1210*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->u4_share_disp_buf)
1211*495ae853SAndroid Build Coastguard Worker {
1212*495ae853SAndroid Build Coastguard Worker H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
1213*495ae853SAndroid Build Coastguard Worker for(i = 0; i < (MAX_DISP_BUFS_NEW); i++)
1214*495ae853SAndroid Build Coastguard Worker {
1215*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->u4_disp_buf_mapping[i])
1216*495ae853SAndroid Build Coastguard Worker {
1217*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release(
1218*495ae853SAndroid Build Coastguard Worker (buf_mgr_t *)ps_dec->pv_pic_buf_mgr, i,
1219*495ae853SAndroid Build Coastguard Worker BUF_MGR_IO);
1220*495ae853SAndroid Build Coastguard Worker ps_dec->u4_disp_buf_mapping[i] = 0;
1221*495ae853SAndroid Build Coastguard Worker }
1222*495ae853SAndroid Build Coastguard Worker } H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
1223*495ae853SAndroid Build Coastguard Worker
1224*495ae853SAndroid Build Coastguard Worker memset(ps_dec->u4_disp_buf_to_be_freed, 0,
1225*495ae853SAndroid Build Coastguard Worker (MAX_DISP_BUFS_NEW) * sizeof(UWORD32));
1226*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_dec->u1_pic_bufs; i++)
1227*495ae853SAndroid Build Coastguard Worker ps_dec->u4_disp_buf_mapping[i] = 1;
1228*495ae853SAndroid Build Coastguard Worker }
1229*495ae853SAndroid Build Coastguard Worker ps_dec->u1_flushfrm = 0;
1230*495ae853SAndroid Build Coastguard Worker
1231*495ae853SAndroid Build Coastguard Worker }
1232*495ae853SAndroid Build Coastguard Worker }
1233*495ae853SAndroid Build Coastguard Worker else
1234*495ae853SAndroid Build Coastguard Worker {
1235*495ae853SAndroid Build Coastguard Worker H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
1236*495ae853SAndroid Build Coastguard Worker
1237*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
1238*495ae853SAndroid Build Coastguard Worker {
1239*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
1240*495ae853SAndroid Build Coastguard Worker pv_disp_op->u4_disp_buf_id,
1241*495ae853SAndroid Build Coastguard Worker BUF_MGR_IO);
1242*495ae853SAndroid Build Coastguard Worker
1243*495ae853SAndroid Build Coastguard Worker }
1244*495ae853SAndroid Build Coastguard Worker else
1245*495ae853SAndroid Build Coastguard Worker {
1246*495ae853SAndroid Build Coastguard Worker ps_dec->u4_disp_buf_mapping[pv_disp_op->u4_disp_buf_id] = 1;
1247*495ae853SAndroid Build Coastguard Worker } H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
1248*495ae853SAndroid Build Coastguard Worker
1249*495ae853SAndroid Build Coastguard Worker }
1250*495ae853SAndroid Build Coastguard Worker }
1251*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1252*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_assign_display_seq */
1253*495ae853SAndroid Build Coastguard Worker /* */
1254*495ae853SAndroid Build Coastguard Worker /* Description : This function implments bumping process. Every outgoing */
1255*495ae853SAndroid Build Coastguard Worker /* frame from DPB is assigned a display sequence number */
1256*495ae853SAndroid Build Coastguard Worker /* which increases monotonically. System looks for this */
1257*495ae853SAndroid Build Coastguard Worker /* number to display a frame. */
1258*495ae853SAndroid Build Coastguard Worker /* here. */
1259*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_dec - Decoder parameters */
1260*495ae853SAndroid Build Coastguard Worker /* Globals : None */
1261*495ae853SAndroid Build Coastguard Worker /* Processing : Refer bumping process in the standard */
1262*495ae853SAndroid Build Coastguard Worker /* Outputs : Assigns display sequence number. */
1263*495ae853SAndroid Build Coastguard Worker /* Returns : None */
1264*495ae853SAndroid Build Coastguard Worker /* */
1265*495ae853SAndroid Build Coastguard Worker /* Issues : None */
1266*495ae853SAndroid Build Coastguard Worker /* */
1267*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1268*495ae853SAndroid Build Coastguard Worker /* */
1269*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1270*495ae853SAndroid Build Coastguard Worker /* 27 04 2005 NS Draft */
1271*495ae853SAndroid Build Coastguard Worker /* */
1272*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_assign_display_seq(dec_struct_t * ps_dec)1273*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_assign_display_seq(dec_struct_t *ps_dec)
1274*495ae853SAndroid Build Coastguard Worker {
1275*495ae853SAndroid Build Coastguard Worker WORD32 i;
1276*495ae853SAndroid Build Coastguard Worker WORD32 i4_min_poc;
1277*495ae853SAndroid Build Coastguard Worker WORD32 i4_min_poc_buf_id;
1278*495ae853SAndroid Build Coastguard Worker WORD32 i4_min_index;
1279*495ae853SAndroid Build Coastguard Worker dpb_manager_t *ps_dpb_mgr = ps_dec->ps_dpb_mgr;
1280*495ae853SAndroid Build Coastguard Worker WORD32 (*i4_poc_buf_id_map)[3] = ps_dpb_mgr->ai4_poc_buf_id_map;
1281*495ae853SAndroid Build Coastguard Worker
1282*495ae853SAndroid Build Coastguard Worker i4_min_poc = 0x7fffffff;
1283*495ae853SAndroid Build Coastguard Worker i4_min_poc_buf_id = -1;
1284*495ae853SAndroid Build Coastguard Worker i4_min_index = -1;
1285*495ae853SAndroid Build Coastguard Worker
1286*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->i1_poc_buf_id_entries >= ps_dec->i4_display_delay)
1287*495ae853SAndroid Build Coastguard Worker {
1288*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_FRAMES; i++)
1289*495ae853SAndroid Build Coastguard Worker {
1290*495ae853SAndroid Build Coastguard Worker if((i4_poc_buf_id_map[i][0] != -1)
1291*495ae853SAndroid Build Coastguard Worker && (DO_NOT_DISP
1292*495ae853SAndroid Build Coastguard Worker != ps_dpb_mgr->ai4_poc_buf_id_map[i][0]))
1293*495ae853SAndroid Build Coastguard Worker {
1294*495ae853SAndroid Build Coastguard Worker /* Checking for <= is necessary to handle cases where there is one
1295*495ae853SAndroid Build Coastguard Worker valid buffer with poc set to 0x7FFFFFFF. */
1296*495ae853SAndroid Build Coastguard Worker if(i4_poc_buf_id_map[i][1] <= i4_min_poc)
1297*495ae853SAndroid Build Coastguard Worker {
1298*495ae853SAndroid Build Coastguard Worker i4_min_poc = i4_poc_buf_id_map[i][1];
1299*495ae853SAndroid Build Coastguard Worker i4_min_poc_buf_id = i4_poc_buf_id_map[i][0];
1300*495ae853SAndroid Build Coastguard Worker i4_min_index = i;
1301*495ae853SAndroid Build Coastguard Worker }
1302*495ae853SAndroid Build Coastguard Worker }
1303*495ae853SAndroid Build Coastguard Worker }
1304*495ae853SAndroid Build Coastguard Worker
1305*495ae853SAndroid Build Coastguard Worker if((i4_min_index != -1) && (DO_NOT_DISP != i4_min_poc_buf_id))
1306*495ae853SAndroid Build Coastguard Worker {
1307*495ae853SAndroid Build Coastguard Worker ps_dec->i4_cur_display_seq++;
1308*495ae853SAndroid Build Coastguard Worker ih264_disp_mgr_add(
1309*495ae853SAndroid Build Coastguard Worker (disp_mgr_t *)ps_dec->pv_disp_buf_mgr,
1310*495ae853SAndroid Build Coastguard Worker i4_min_poc_buf_id, ps_dec->i4_cur_display_seq,
1311*495ae853SAndroid Build Coastguard Worker ps_dec->apv_buf_id_pic_buf_map[i4_min_poc_buf_id]);
1312*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i4_min_index][0] = -1;
1313*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i4_min_index][1] = 0x7fffffff;
1314*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->i1_poc_buf_id_entries--;
1315*495ae853SAndroid Build Coastguard Worker }
1316*495ae853SAndroid Build Coastguard Worker else if(DO_NOT_DISP == i4_min_poc_buf_id)
1317*495ae853SAndroid Build Coastguard Worker {
1318*495ae853SAndroid Build Coastguard Worker WORD32 i4_error_code;
1319*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_GAPS_IN_FRM_NUM;
1320*495ae853SAndroid Build Coastguard Worker // i4_error_code |= 1<<IVD_CORRUPTEDDATA;
1321*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1322*495ae853SAndroid Build Coastguard Worker }
1323*495ae853SAndroid Build Coastguard Worker }
1324*495ae853SAndroid Build Coastguard Worker return OK;
1325*495ae853SAndroid Build Coastguard Worker }
1326*495ae853SAndroid Build Coastguard Worker
1327*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1328*495ae853SAndroid Build Coastguard Worker /* */
1329*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_release_display_bufs */
1330*495ae853SAndroid Build Coastguard Worker /* */
1331*495ae853SAndroid Build Coastguard Worker /* Description : This function implments bumping process when mmco = 5. */
1332*495ae853SAndroid Build Coastguard Worker /* Each outgoing frame from DPB is assigned a display */
1333*495ae853SAndroid Build Coastguard Worker /* sequence number which increases monotonically. System */
1334*495ae853SAndroid Build Coastguard Worker /* looks for this number to display a frame. */
1335*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_dec - Decoder parameters */
1336*495ae853SAndroid Build Coastguard Worker /* Globals : None */
1337*495ae853SAndroid Build Coastguard Worker /* Processing : Refer bumping process in the standard for mmco = 5 */
1338*495ae853SAndroid Build Coastguard Worker /* Outputs : Assigns display sequence number. */
1339*495ae853SAndroid Build Coastguard Worker /* Returns : None */
1340*495ae853SAndroid Build Coastguard Worker /* */
1341*495ae853SAndroid Build Coastguard Worker /* Issues : None */
1342*495ae853SAndroid Build Coastguard Worker /* */
1343*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1344*495ae853SAndroid Build Coastguard Worker /* */
1345*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1346*495ae853SAndroid Build Coastguard Worker /* 27 04 2005 NS Draft */
1347*495ae853SAndroid Build Coastguard Worker /* */
1348*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_release_display_bufs(dec_struct_t * ps_dec)1349*495ae853SAndroid Build Coastguard Worker void ih264d_release_display_bufs(dec_struct_t *ps_dec)
1350*495ae853SAndroid Build Coastguard Worker {
1351*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
1352*495ae853SAndroid Build Coastguard Worker WORD32 i4_min_poc;
1353*495ae853SAndroid Build Coastguard Worker WORD32 i4_min_poc_buf_id;
1354*495ae853SAndroid Build Coastguard Worker WORD32 i4_min_index;
1355*495ae853SAndroid Build Coastguard Worker WORD64 i8_temp;
1356*495ae853SAndroid Build Coastguard Worker dpb_manager_t *ps_dpb_mgr = ps_dec->ps_dpb_mgr;
1357*495ae853SAndroid Build Coastguard Worker WORD32 (*i4_poc_buf_id_map)[3] = ps_dpb_mgr->ai4_poc_buf_id_map;
1358*495ae853SAndroid Build Coastguard Worker
1359*495ae853SAndroid Build Coastguard Worker i4_min_poc = 0x7fffffff;
1360*495ae853SAndroid Build Coastguard Worker i4_min_poc_buf_id = 0;
1361*495ae853SAndroid Build Coastguard Worker i4_min_index = 0;
1362*495ae853SAndroid Build Coastguard Worker
1363*495ae853SAndroid Build Coastguard Worker ih264d_delete_nonref_nondisplay_pics(ps_dpb_mgr);
1364*495ae853SAndroid Build Coastguard Worker
1365*495ae853SAndroid Build Coastguard Worker for(j = 0; j < ps_dpb_mgr->i1_poc_buf_id_entries; j++)
1366*495ae853SAndroid Build Coastguard Worker {
1367*495ae853SAndroid Build Coastguard Worker i4_min_poc = 0x7fffffff;
1368*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_FRAMES; i++)
1369*495ae853SAndroid Build Coastguard Worker {
1370*495ae853SAndroid Build Coastguard Worker if(i4_poc_buf_id_map[i][0] != -1)
1371*495ae853SAndroid Build Coastguard Worker {
1372*495ae853SAndroid Build Coastguard Worker /* Checking for <= is necessary to handle cases where there is one
1373*495ae853SAndroid Build Coastguard Worker valid buffer with poc set to 0x7FFFFFFF. */
1374*495ae853SAndroid Build Coastguard Worker if(i4_poc_buf_id_map[i][1] <= i4_min_poc)
1375*495ae853SAndroid Build Coastguard Worker {
1376*495ae853SAndroid Build Coastguard Worker i4_min_poc = i4_poc_buf_id_map[i][1];
1377*495ae853SAndroid Build Coastguard Worker i4_min_poc_buf_id = i4_poc_buf_id_map[i][0];
1378*495ae853SAndroid Build Coastguard Worker i4_min_index = i;
1379*495ae853SAndroid Build Coastguard Worker }
1380*495ae853SAndroid Build Coastguard Worker }
1381*495ae853SAndroid Build Coastguard Worker }
1382*495ae853SAndroid Build Coastguard Worker
1383*495ae853SAndroid Build Coastguard Worker if(DO_NOT_DISP != i4_min_poc_buf_id)
1384*495ae853SAndroid Build Coastguard Worker {
1385*495ae853SAndroid Build Coastguard Worker ps_dec->i4_cur_display_seq++;
1386*495ae853SAndroid Build Coastguard Worker ih264_disp_mgr_add(
1387*495ae853SAndroid Build Coastguard Worker (disp_mgr_t *)ps_dec->pv_disp_buf_mgr,
1388*495ae853SAndroid Build Coastguard Worker i4_min_poc_buf_id, ps_dec->i4_cur_display_seq,
1389*495ae853SAndroid Build Coastguard Worker ps_dec->apv_buf_id_pic_buf_map[i4_min_poc_buf_id]);
1390*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i4_min_index][0] = -1;
1391*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i4_min_index][1] = 0x7fffffff;
1392*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[i4_min_index][2] = 0;
1393*495ae853SAndroid Build Coastguard Worker }
1394*495ae853SAndroid Build Coastguard Worker else
1395*495ae853SAndroid Build Coastguard Worker {
1396*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i4_min_index][0] = -1;
1397*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i4_min_index][1] = 0x7fffffff;
1398*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[i4_min_index][2] = 0;
1399*495ae853SAndroid Build Coastguard Worker }
1400*495ae853SAndroid Build Coastguard Worker }
1401*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->i1_poc_buf_id_entries = 0;
1402*495ae853SAndroid Build Coastguard Worker i8_temp = (WORD64)ps_dec->i4_prev_max_display_seq + ps_dec->i4_max_poc
1403*495ae853SAndroid Build Coastguard Worker + ps_dec->u1_max_dec_frame_buffering + 1;
1404*495ae853SAndroid Build Coastguard Worker /*If i4_prev_max_display_seq overflows integer range, reset it */
1405*495ae853SAndroid Build Coastguard Worker ps_dec->i4_prev_max_display_seq = IS_OUT_OF_RANGE_S32(i8_temp)?
1406*495ae853SAndroid Build Coastguard Worker 0 : i8_temp;
1407*495ae853SAndroid Build Coastguard Worker ps_dec->i4_max_poc = 0;
1408*495ae853SAndroid Build Coastguard Worker }
1409*495ae853SAndroid Build Coastguard Worker
1410*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1411*495ae853SAndroid Build Coastguard Worker /* */
1412*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_assign_pic_num */
1413*495ae853SAndroid Build Coastguard Worker /* */
1414*495ae853SAndroid Build Coastguard Worker /* Description : This function assigns pic num to each reference frame */
1415*495ae853SAndroid Build Coastguard Worker /* depending on the cur_frame_num as speified in section */
1416*495ae853SAndroid Build Coastguard Worker /* 8.2.4.1 */
1417*495ae853SAndroid Build Coastguard Worker /* */
1418*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_dec */
1419*495ae853SAndroid Build Coastguard Worker /* */
1420*495ae853SAndroid Build Coastguard Worker /* Globals : NO globals used */
1421*495ae853SAndroid Build Coastguard Worker /* */
1422*495ae853SAndroid Build Coastguard Worker /* Processing : for all ST pictures */
1423*495ae853SAndroid Build Coastguard Worker /* if( FrameNum > cur_frame_num) */
1424*495ae853SAndroid Build Coastguard Worker /* PicNum = FrameNum - MaxFrameNum */
1425*495ae853SAndroid Build Coastguard Worker /* else */
1426*495ae853SAndroid Build Coastguard Worker /* PicNum = FrameNum */
1427*495ae853SAndroid Build Coastguard Worker /* */
1428*495ae853SAndroid Build Coastguard Worker /* Returns : void */
1429*495ae853SAndroid Build Coastguard Worker /* */
1430*495ae853SAndroid Build Coastguard Worker /* Issues : NO */
1431*495ae853SAndroid Build Coastguard Worker /* */
1432*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1433*495ae853SAndroid Build Coastguard Worker /* */
1434*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1435*495ae853SAndroid Build Coastguard Worker /* 13 07 2002 Jay Draft */
1436*495ae853SAndroid Build Coastguard Worker /* */
1437*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1438*495ae853SAndroid Build Coastguard Worker
ih264d_assign_pic_num(dec_struct_t * ps_dec)1439*495ae853SAndroid Build Coastguard Worker void ih264d_assign_pic_num(dec_struct_t *ps_dec)
1440*495ae853SAndroid Build Coastguard Worker {
1441*495ae853SAndroid Build Coastguard Worker dpb_manager_t *ps_dpb_mgr;
1442*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_next_dpb;
1443*495ae853SAndroid Build Coastguard Worker WORD8 i;
1444*495ae853SAndroid Build Coastguard Worker WORD32 i4_cur_frame_num, i4_max_frame_num;
1445*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_frame_num;
1446*495ae853SAndroid Build Coastguard Worker UWORD8 u1_fld_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
1447*495ae853SAndroid Build Coastguard Worker
1448*495ae853SAndroid Build Coastguard Worker i4_max_frame_num = ps_dec->ps_cur_sps->u2_u4_max_pic_num_minus1 + 1;
1449*495ae853SAndroid Build Coastguard Worker i4_cur_frame_num = ps_dec->ps_cur_pic->i4_frame_num;
1450*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr = ps_dec->ps_dpb_mgr;
1451*495ae853SAndroid Build Coastguard Worker
1452*495ae853SAndroid Build Coastguard Worker /* Start from ST head */
1453*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1454*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
1455*495ae853SAndroid Build Coastguard Worker {
1456*495ae853SAndroid Build Coastguard Worker WORD32 i4_pic_num;
1457*495ae853SAndroid Build Coastguard Worker
1458*495ae853SAndroid Build Coastguard Worker i4_ref_frame_num = ps_next_dpb->ps_pic_buf->i4_frame_num;
1459*495ae853SAndroid Build Coastguard Worker if(i4_ref_frame_num > i4_cur_frame_num)
1460*495ae853SAndroid Build Coastguard Worker {
1461*495ae853SAndroid Build Coastguard Worker /* RefPic Buf frame_num is before Current frame_num in decode order */
1462*495ae853SAndroid Build Coastguard Worker i4_pic_num = i4_ref_frame_num - i4_max_frame_num;
1463*495ae853SAndroid Build Coastguard Worker }
1464*495ae853SAndroid Build Coastguard Worker else
1465*495ae853SAndroid Build Coastguard Worker {
1466*495ae853SAndroid Build Coastguard Worker /* RefPic Buf frame_num is after Current frame_num in decode order */
1467*495ae853SAndroid Build Coastguard Worker i4_pic_num = i4_ref_frame_num;
1468*495ae853SAndroid Build Coastguard Worker }
1469*495ae853SAndroid Build Coastguard Worker
1470*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_pic_buf->i4_pic_num = i4_pic_num;
1471*495ae853SAndroid Build Coastguard Worker ps_next_dpb->i4_frame_num = i4_pic_num;
1472*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_pic_buf->u1_long_term_frm_idx = MAX_REF_BUFS + 1;
1473*495ae853SAndroid Build Coastguard Worker if(u1_fld_pic_flag)
1474*495ae853SAndroid Build Coastguard Worker {
1475*495ae853SAndroid Build Coastguard Worker /* Assign the pic num to top fields and bot fields */
1476*495ae853SAndroid Build Coastguard Worker
1477*495ae853SAndroid Build Coastguard Worker ps_next_dpb->s_top_field.i4_pic_num = i4_pic_num * 2
1478*495ae853SAndroid Build Coastguard Worker + !(ps_dec->ps_cur_slice->u1_bottom_field_flag);
1479*495ae853SAndroid Build Coastguard Worker ps_next_dpb->s_bot_field.i4_pic_num = i4_pic_num * 2
1480*495ae853SAndroid Build Coastguard Worker + ps_dec->ps_cur_slice->u1_bottom_field_flag;
1481*495ae853SAndroid Build Coastguard Worker }
1482*495ae853SAndroid Build Coastguard Worker /* Chase the next link */
1483*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_short;
1484*495ae853SAndroid Build Coastguard Worker }
1485*495ae853SAndroid Build Coastguard Worker
1486*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag
1487*495ae853SAndroid Build Coastguard Worker && ps_dpb_mgr->u1_num_gaps)
1488*495ae853SAndroid Build Coastguard Worker {
1489*495ae853SAndroid Build Coastguard Worker WORD32 i4_start_frm, i4_end_frm;
1490*495ae853SAndroid Build Coastguard Worker /* Assign pic numbers for gaps */
1491*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_FRAMES; i++)
1492*495ae853SAndroid Build Coastguard Worker {
1493*495ae853SAndroid Build Coastguard Worker i4_start_frm = ps_dpb_mgr->ai4_gaps_start_frm_num[i];
1494*495ae853SAndroid Build Coastguard Worker if(i4_start_frm != INVALID_FRAME_NUM)
1495*495ae853SAndroid Build Coastguard Worker {
1496*495ae853SAndroid Build Coastguard Worker if(i4_start_frm > i4_cur_frame_num)
1497*495ae853SAndroid Build Coastguard Worker {
1498*495ae853SAndroid Build Coastguard Worker /* gap's frame_num is before Current frame_num in
1499*495ae853SAndroid Build Coastguard Worker decode order */
1500*495ae853SAndroid Build Coastguard Worker i4_start_frm -= i4_max_frame_num;
1501*495ae853SAndroid Build Coastguard Worker }
1502*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_start_frm_num[i] = i4_start_frm;
1503*495ae853SAndroid Build Coastguard Worker i4_end_frm = ps_dpb_mgr->ai4_gaps_end_frm_num[i];
1504*495ae853SAndroid Build Coastguard Worker
1505*495ae853SAndroid Build Coastguard Worker if(i4_end_frm > i4_cur_frame_num)
1506*495ae853SAndroid Build Coastguard Worker {
1507*495ae853SAndroid Build Coastguard Worker /* gap's frame_num is before Current frame_num in
1508*495ae853SAndroid Build Coastguard Worker decode order */
1509*495ae853SAndroid Build Coastguard Worker i4_end_frm -= i4_max_frame_num;
1510*495ae853SAndroid Build Coastguard Worker }
1511*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_end_frm_num[i] = i4_end_frm;
1512*495ae853SAndroid Build Coastguard Worker }
1513*495ae853SAndroid Build Coastguard Worker }
1514*495ae853SAndroid Build Coastguard Worker }
1515*495ae853SAndroid Build Coastguard Worker }
1516*495ae853SAndroid Build Coastguard Worker
1517*495ae853SAndroid Build Coastguard Worker /*!
1518*495ae853SAndroid Build Coastguard Worker **************************************************************************
1519*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_update_qp \endif
1520*495ae853SAndroid Build Coastguard Worker *
1521*495ae853SAndroid Build Coastguard Worker * \brief
1522*495ae853SAndroid Build Coastguard Worker * Updates the values of QP and its related entities
1523*495ae853SAndroid Build Coastguard Worker *
1524*495ae853SAndroid Build Coastguard Worker * \return
1525*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
1526*495ae853SAndroid Build Coastguard Worker *
1527*495ae853SAndroid Build Coastguard Worker **************************************************************************
1528*495ae853SAndroid Build Coastguard Worker */
ih264d_update_qp(dec_struct_t * ps_dec,const WORD8 i1_qp)1529*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_update_qp(dec_struct_t * ps_dec, const WORD8 i1_qp)
1530*495ae853SAndroid Build Coastguard Worker {
1531*495ae853SAndroid Build Coastguard Worker WORD32 i_temp;
1532*495ae853SAndroid Build Coastguard Worker i_temp = (ps_dec->u1_qp + i1_qp + 52) % 52;
1533*495ae853SAndroid Build Coastguard Worker
1534*495ae853SAndroid Build Coastguard Worker if((i_temp < 0) || (i_temp > 51) || (i1_qp < -26) || (i1_qp > 25))
1535*495ae853SAndroid Build Coastguard Worker return ERROR_INV_RANGE_QP_T;
1536*495ae853SAndroid Build Coastguard Worker
1537*495ae853SAndroid Build Coastguard Worker ps_dec->u1_qp = i_temp;
1538*495ae853SAndroid Build Coastguard Worker ps_dec->u1_qp_y_rem6 = ps_dec->u1_qp % 6;
1539*495ae853SAndroid Build Coastguard Worker ps_dec->u1_qp_y_div6 = ps_dec->u1_qp / 6;
1540*495ae853SAndroid Build Coastguard Worker i_temp = CLIP3(0, 51, ps_dec->u1_qp + ps_dec->ps_cur_pps->i1_chroma_qp_index_offset);
1541*495ae853SAndroid Build Coastguard Worker ps_dec->u1_qp_u_rem6 = MOD(gau1_ih264d_qp_scale_cr[12 + i_temp], 6);
1542*495ae853SAndroid Build Coastguard Worker ps_dec->u1_qp_u_div6 = DIV(gau1_ih264d_qp_scale_cr[12 + i_temp], 6);
1543*495ae853SAndroid Build Coastguard Worker
1544*495ae853SAndroid Build Coastguard Worker i_temp = CLIP3(0, 51, ps_dec->u1_qp + ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset);
1545*495ae853SAndroid Build Coastguard Worker ps_dec->u1_qp_v_rem6 = MOD(gau1_ih264d_qp_scale_cr[12 + i_temp], 6);
1546*495ae853SAndroid Build Coastguard Worker ps_dec->u1_qp_v_div6 = DIV(gau1_ih264d_qp_scale_cr[12 + i_temp], 6);
1547*495ae853SAndroid Build Coastguard Worker
1548*495ae853SAndroid Build Coastguard Worker ps_dec->pu2_quant_scale_y =
1549*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_y_rem6];
1550*495ae853SAndroid Build Coastguard Worker ps_dec->pu2_quant_scale_u =
1551*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_u_rem6];
1552*495ae853SAndroid Build Coastguard Worker ps_dec->pu2_quant_scale_v =
1553*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_v_rem6];
1554*495ae853SAndroid Build Coastguard Worker return OK;
1555*495ae853SAndroid Build Coastguard Worker }
1556*495ae853SAndroid Build Coastguard Worker
1557*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1558*495ae853SAndroid Build Coastguard Worker /* */
1559*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_decode_gaps_in_frame_num */
1560*495ae853SAndroid Build Coastguard Worker /* */
1561*495ae853SAndroid Build Coastguard Worker /* Description : This function decodes gaps in frame number */
1562*495ae853SAndroid Build Coastguard Worker /* */
1563*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_dec Decoder parameters */
1564*495ae853SAndroid Build Coastguard Worker /* u2_frame_num current frame number */
1565*495ae853SAndroid Build Coastguard Worker /* */
1566*495ae853SAndroid Build Coastguard Worker /* Globals : None */
1567*495ae853SAndroid Build Coastguard Worker /* Processing : This functionality needs to be implemented */
1568*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
1569*495ae853SAndroid Build Coastguard Worker /* Returns : None */
1570*495ae853SAndroid Build Coastguard Worker /* */
1571*495ae853SAndroid Build Coastguard Worker /* Issues : Not implemented */
1572*495ae853SAndroid Build Coastguard Worker /* */
1573*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1574*495ae853SAndroid Build Coastguard Worker /* */
1575*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1576*495ae853SAndroid Build Coastguard Worker /* 06 05 2002 NS Draft */
1577*495ae853SAndroid Build Coastguard Worker /* */
1578*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_decode_gaps_in_frame_num(dec_struct_t * ps_dec,UWORD16 u2_frame_num)1579*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_decode_gaps_in_frame_num(dec_struct_t *ps_dec,
1580*495ae853SAndroid Build Coastguard Worker UWORD16 u2_frame_num)
1581*495ae853SAndroid Build Coastguard Worker {
1582*495ae853SAndroid Build Coastguard Worker UWORD32 u4_next_frm_num, u4_start_frm_num;
1583*495ae853SAndroid Build Coastguard Worker UWORD32 u4_max_frm_num;
1584*495ae853SAndroid Build Coastguard Worker pocstruct_t s_tmp_poc;
1585*495ae853SAndroid Build Coastguard Worker WORD32 i4_poc;
1586*495ae853SAndroid Build Coastguard Worker dec_slice_params_t *ps_cur_slice;
1587*495ae853SAndroid Build Coastguard Worker
1588*495ae853SAndroid Build Coastguard Worker dec_pic_params_t *ps_pic_params;
1589*495ae853SAndroid Build Coastguard Worker WORD8 i1_gap_idx;
1590*495ae853SAndroid Build Coastguard Worker WORD32 *i4_gaps_start_frm_num;
1591*495ae853SAndroid Build Coastguard Worker dpb_manager_t *ps_dpb_mgr;
1592*495ae853SAndroid Build Coastguard Worker WORD32 i4_frame_gaps;
1593*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_gaps_per_seq;
1594*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1595*495ae853SAndroid Build Coastguard Worker
1596*495ae853SAndroid Build Coastguard Worker ps_cur_slice = ps_dec->ps_cur_slice;
1597*495ae853SAndroid Build Coastguard Worker if(ps_cur_slice->u1_field_pic_flag)
1598*495ae853SAndroid Build Coastguard Worker {
1599*495ae853SAndroid Build Coastguard Worker if(ps_dec->u2_prev_ref_frame_num == u2_frame_num)
1600*495ae853SAndroid Build Coastguard Worker return 0;
1601*495ae853SAndroid Build Coastguard Worker }
1602*495ae853SAndroid Build Coastguard Worker ps_pic_params = ps_dec->ps_cur_pps;
1603*495ae853SAndroid Build Coastguard Worker
1604*495ae853SAndroid Build Coastguard Worker u4_next_frm_num = ps_dec->u2_prev_ref_frame_num + 1;
1605*495ae853SAndroid Build Coastguard Worker u4_max_frm_num = ps_pic_params->ps_sps->u2_u4_max_pic_num_minus1 + 1;
1606*495ae853SAndroid Build Coastguard Worker
1607*495ae853SAndroid Build Coastguard Worker // check
1608*495ae853SAndroid Build Coastguard Worker if(u4_next_frm_num >= u4_max_frm_num)
1609*495ae853SAndroid Build Coastguard Worker {
1610*495ae853SAndroid Build Coastguard Worker u4_next_frm_num -= u4_max_frm_num;
1611*495ae853SAndroid Build Coastguard Worker }
1612*495ae853SAndroid Build Coastguard Worker
1613*495ae853SAndroid Build Coastguard Worker if(u4_next_frm_num == u2_frame_num)
1614*495ae853SAndroid Build Coastguard Worker {
1615*495ae853SAndroid Build Coastguard Worker return (0);
1616*495ae853SAndroid Build Coastguard Worker }
1617*495ae853SAndroid Build Coastguard Worker
1618*495ae853SAndroid Build Coastguard Worker // check
1619*495ae853SAndroid Build Coastguard Worker if((ps_dec->u1_nal_unit_type == IDR_SLICE_NAL)
1620*495ae853SAndroid Build Coastguard Worker && (u4_next_frm_num >= u2_frame_num))
1621*495ae853SAndroid Build Coastguard Worker {
1622*495ae853SAndroid Build Coastguard Worker return (0);
1623*495ae853SAndroid Build Coastguard Worker }
1624*495ae853SAndroid Build Coastguard Worker u4_start_frm_num = u4_next_frm_num;
1625*495ae853SAndroid Build Coastguard Worker
1626*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_pic_order_cnt_lsb = 0;
1627*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
1628*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_pic_order_cnt_lsb = 0;
1629*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
1630*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
1631*495ae853SAndroid Build Coastguard Worker s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
1632*495ae853SAndroid Build Coastguard Worker
1633*495ae853SAndroid Build Coastguard Worker ps_cur_slice = ps_dec->ps_cur_slice;
1634*495ae853SAndroid Build Coastguard Worker
1635*495ae853SAndroid Build Coastguard Worker i4_frame_gaps = 0;
1636*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr = ps_dec->ps_dpb_mgr;
1637*495ae853SAndroid Build Coastguard Worker
1638*495ae853SAndroid Build Coastguard Worker /* Find a empty slot to store gap seqn info */
1639*495ae853SAndroid Build Coastguard Worker i4_gaps_start_frm_num = ps_dpb_mgr->ai4_gaps_start_frm_num;
1640*495ae853SAndroid Build Coastguard Worker for(i1_gap_idx = 0; i1_gap_idx < MAX_FRAMES; i1_gap_idx++)
1641*495ae853SAndroid Build Coastguard Worker {
1642*495ae853SAndroid Build Coastguard Worker if(INVALID_FRAME_NUM == i4_gaps_start_frm_num[i1_gap_idx])
1643*495ae853SAndroid Build Coastguard Worker break;
1644*495ae853SAndroid Build Coastguard Worker }
1645*495ae853SAndroid Build Coastguard Worker if(MAX_FRAMES == i1_gap_idx)
1646*495ae853SAndroid Build Coastguard Worker {
1647*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1648*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1649*495ae853SAndroid Build Coastguard Worker // i4_error_code |= 1<<IVD_CORRUPTEDDATA;
1650*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1651*495ae853SAndroid Build Coastguard Worker }
1652*495ae853SAndroid Build Coastguard Worker
1653*495ae853SAndroid Build Coastguard Worker i4_poc = 0;
1654*495ae853SAndroid Build Coastguard Worker i4_gaps_start_frm_num[i1_gap_idx] = u4_start_frm_num;
1655*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_end_frm_num[i1_gap_idx] = u2_frame_num - 1;
1656*495ae853SAndroid Build Coastguard Worker pi1_gaps_per_seq = ps_dpb_mgr->ai1_gaps_per_seq;
1657*495ae853SAndroid Build Coastguard Worker pi1_gaps_per_seq[i1_gap_idx] = 0;
1658*495ae853SAndroid Build Coastguard Worker while(u4_next_frm_num != u2_frame_num)
1659*495ae853SAndroid Build Coastguard Worker {
1660*495ae853SAndroid Build Coastguard Worker ih264d_delete_nonref_nondisplay_pics(ps_dpb_mgr);
1661*495ae853SAndroid Build Coastguard Worker if(ps_pic_params->ps_sps->u1_pic_order_cnt_type)
1662*495ae853SAndroid Build Coastguard Worker {
1663*495ae853SAndroid Build Coastguard Worker /* allocate a picture buffer and insert it as ST node */
1664*495ae853SAndroid Build Coastguard Worker ret = ih264d_decode_pic_order_cnt(0, u4_next_frm_num,
1665*495ae853SAndroid Build Coastguard Worker &ps_dec->s_prev_pic_poc,
1666*495ae853SAndroid Build Coastguard Worker &s_tmp_poc, ps_cur_slice,
1667*495ae853SAndroid Build Coastguard Worker ps_pic_params, 1, 0, 0,
1668*495ae853SAndroid Build Coastguard Worker &i4_poc);
1669*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1670*495ae853SAndroid Build Coastguard Worker return ret;
1671*495ae853SAndroid Build Coastguard Worker
1672*495ae853SAndroid Build Coastguard Worker /* Display seq no calculations */
1673*495ae853SAndroid Build Coastguard Worker if(i4_poc >= ps_dec->i4_max_poc)
1674*495ae853SAndroid Build Coastguard Worker ps_dec->i4_max_poc = i4_poc;
1675*495ae853SAndroid Build Coastguard Worker /* IDR Picture or POC wrap around */
1676*495ae853SAndroid Build Coastguard Worker if(i4_poc == 0)
1677*495ae853SAndroid Build Coastguard Worker {
1678*495ae853SAndroid Build Coastguard Worker WORD64 i8_temp;
1679*495ae853SAndroid Build Coastguard Worker i8_temp = (WORD64)ps_dec->i4_prev_max_display_seq
1680*495ae853SAndroid Build Coastguard Worker + ps_dec->i4_max_poc
1681*495ae853SAndroid Build Coastguard Worker + ps_dec->u1_max_dec_frame_buffering + 1;
1682*495ae853SAndroid Build Coastguard Worker /*If i4_prev_max_display_seq overflows integer range, reset it */
1683*495ae853SAndroid Build Coastguard Worker ps_dec->i4_prev_max_display_seq = IS_OUT_OF_RANGE_S32(i8_temp)?
1684*495ae853SAndroid Build Coastguard Worker 0 : i8_temp;
1685*495ae853SAndroid Build Coastguard Worker ps_dec->i4_max_poc = 0;
1686*495ae853SAndroid Build Coastguard Worker }
1687*495ae853SAndroid Build Coastguard Worker
1688*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u1_mmco_equalto5 = 0;
1689*495ae853SAndroid Build Coastguard Worker ps_cur_slice->u2_frame_num = u4_next_frm_num;
1690*495ae853SAndroid Build Coastguard Worker }
1691*495ae853SAndroid Build Coastguard Worker
1692*495ae853SAndroid Build Coastguard Worker // check
1693*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->i1_poc_buf_id_entries
1694*495ae853SAndroid Build Coastguard Worker >= ps_dec->u1_max_dec_frame_buffering)
1695*495ae853SAndroid Build Coastguard Worker {
1696*495ae853SAndroid Build Coastguard Worker ret = ih264d_assign_display_seq(ps_dec);
1697*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1698*495ae853SAndroid Build Coastguard Worker return ret;
1699*495ae853SAndroid Build Coastguard Worker }
1700*495ae853SAndroid Build Coastguard Worker
1701*495ae853SAndroid Build Coastguard Worker {
1702*495ae853SAndroid Build Coastguard Worker WORD64 i8_display_poc;
1703*495ae853SAndroid Build Coastguard Worker i8_display_poc = (WORD64)ps_dec->i4_prev_max_display_seq +
1704*495ae853SAndroid Build Coastguard Worker i4_poc;
1705*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_display_poc))
1706*495ae853SAndroid Build Coastguard Worker {
1707*495ae853SAndroid Build Coastguard Worker ps_dec->i4_prev_max_display_seq = 0;
1708*495ae853SAndroid Build Coastguard Worker }
1709*495ae853SAndroid Build Coastguard Worker }
1710*495ae853SAndroid Build Coastguard Worker ret = ih264d_insert_pic_in_display_list(
1711*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dpb_mgr, (WORD8) DO_NOT_DISP,
1712*495ae853SAndroid Build Coastguard Worker (WORD32)(ps_dec->i4_prev_max_display_seq + i4_poc),
1713*495ae853SAndroid Build Coastguard Worker u4_next_frm_num);
1714*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1715*495ae853SAndroid Build Coastguard Worker return ret;
1716*495ae853SAndroid Build Coastguard Worker
1717*495ae853SAndroid Build Coastguard Worker pi1_gaps_per_seq[i1_gap_idx]++;
1718*495ae853SAndroid Build Coastguard Worker ret = ih264d_do_mmco_for_gaps(ps_dpb_mgr,
1719*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->u1_num_ref_frames);
1720*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1721*495ae853SAndroid Build Coastguard Worker return ret;
1722*495ae853SAndroid Build Coastguard Worker
1723*495ae853SAndroid Build Coastguard Worker ih264d_delete_nonref_nondisplay_pics(ps_dpb_mgr);
1724*495ae853SAndroid Build Coastguard Worker
1725*495ae853SAndroid Build Coastguard Worker u4_next_frm_num++;
1726*495ae853SAndroid Build Coastguard Worker if(u4_next_frm_num >= u4_max_frm_num)
1727*495ae853SAndroid Build Coastguard Worker {
1728*495ae853SAndroid Build Coastguard Worker u4_next_frm_num -= u4_max_frm_num;
1729*495ae853SAndroid Build Coastguard Worker }
1730*495ae853SAndroid Build Coastguard Worker
1731*495ae853SAndroid Build Coastguard Worker i4_frame_gaps++;
1732*495ae853SAndroid Build Coastguard Worker }
1733*495ae853SAndroid Build Coastguard Worker
1734*495ae853SAndroid Build Coastguard Worker return OK;
1735*495ae853SAndroid Build Coastguard Worker }
1736*495ae853SAndroid Build Coastguard Worker
1737*495ae853SAndroid Build Coastguard Worker /*!
1738*495ae853SAndroid Build Coastguard Worker **************************************************************************
1739*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_create_pic_buffers \endif
1740*495ae853SAndroid Build Coastguard Worker *
1741*495ae853SAndroid Build Coastguard Worker * \brief
1742*495ae853SAndroid Build Coastguard Worker * This function creates Picture Buffers.
1743*495ae853SAndroid Build Coastguard Worker *
1744*495ae853SAndroid Build Coastguard Worker * \return
1745*495ae853SAndroid Build Coastguard Worker * 0 on Success and -1 on error
1746*495ae853SAndroid Build Coastguard Worker **************************************************************************
1747*495ae853SAndroid Build Coastguard Worker */
ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,dec_struct_t * ps_dec)1748*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,
1749*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec)
1750*495ae853SAndroid Build Coastguard Worker {
1751*495ae853SAndroid Build Coastguard Worker struct pic_buffer_t *ps_pic_buf;
1752*495ae853SAndroid Build Coastguard Worker UWORD8 i;
1753*495ae853SAndroid Build Coastguard Worker UWORD32 u4_luma_size, u4_chroma_size;
1754*495ae853SAndroid Build Coastguard Worker UWORD8 u1_frm = ps_dec->ps_cur_sps->u1_frame_mbs_only_flag;
1755*495ae853SAndroid Build Coastguard Worker WORD32 j;
1756*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf;
1757*495ae853SAndroid Build Coastguard Worker
1758*495ae853SAndroid Build Coastguard Worker ps_pic_buf = ps_dec->ps_pic_buf_base;
1759*495ae853SAndroid Build Coastguard Worker ih264_disp_mgr_init((disp_mgr_t *)ps_dec->pv_disp_buf_mgr);
1760*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_init((buf_mgr_t *)ps_dec->pv_pic_buf_mgr);
1761*495ae853SAndroid Build Coastguard Worker u4_luma_size = ps_dec->u2_frm_wd_y * ps_dec->u2_frm_ht_y;
1762*495ae853SAndroid Build Coastguard Worker u4_chroma_size = ps_dec->u2_frm_wd_uv * ps_dec->u2_frm_ht_uv;
1763*495ae853SAndroid Build Coastguard Worker
1764*495ae853SAndroid Build Coastguard Worker {
1765*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_share_disp_buf == 1)
1766*495ae853SAndroid Build Coastguard Worker {
1767*495ae853SAndroid Build Coastguard Worker /* In case of buffers getting shared between application and library
1768*495ae853SAndroid Build Coastguard Worker there is no need of reference memtabs. Instead of setting the i4_size
1769*495ae853SAndroid Build Coastguard Worker to zero, it is reduced to a small i4_size to ensure that changes
1770*495ae853SAndroid Build Coastguard Worker in the code are minimal */
1771*495ae853SAndroid Build Coastguard Worker if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
1772*495ae853SAndroid Build Coastguard Worker || (ps_dec->u1_chroma_format == IV_YUV_420SP_VU)
1773*495ae853SAndroid Build Coastguard Worker || (ps_dec->u1_chroma_format == IV_YUV_420P))
1774*495ae853SAndroid Build Coastguard Worker {
1775*495ae853SAndroid Build Coastguard Worker u4_luma_size = 64;
1776*495ae853SAndroid Build Coastguard Worker }
1777*495ae853SAndroid Build Coastguard Worker
1778*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
1779*495ae853SAndroid Build Coastguard Worker {
1780*495ae853SAndroid Build Coastguard Worker u4_chroma_size = 64;
1781*495ae853SAndroid Build Coastguard Worker }
1782*495ae853SAndroid Build Coastguard Worker
1783*495ae853SAndroid Build Coastguard Worker }
1784*495ae853SAndroid Build Coastguard Worker }
1785*495ae853SAndroid Build Coastguard Worker
1786*495ae853SAndroid Build Coastguard Worker pu1_buf = ps_dec->pu1_pic_buf_base;
1787*495ae853SAndroid Build Coastguard Worker
1788*495ae853SAndroid Build Coastguard Worker /* Allocate memory for refernce buffers */
1789*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u1_num_of_buf; i++)
1790*495ae853SAndroid Build Coastguard Worker {
1791*495ae853SAndroid Build Coastguard Worker UWORD32 u4_offset;
1792*495ae853SAndroid Build Coastguard Worker WORD32 buf_ret;
1793*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_luma, *pu1_chroma;
1794*495ae853SAndroid Build Coastguard Worker void *pv_mem_ctxt = ps_dec->pv_mem_ctxt;
1795*495ae853SAndroid Build Coastguard Worker
1796*495ae853SAndroid Build Coastguard Worker pu1_luma = pu1_buf;
1797*495ae853SAndroid Build Coastguard Worker pu1_buf += ALIGN64(u4_luma_size);
1798*495ae853SAndroid Build Coastguard Worker pu1_chroma = pu1_buf;
1799*495ae853SAndroid Build Coastguard Worker pu1_buf += ALIGN64(u4_chroma_size);
1800*495ae853SAndroid Build Coastguard Worker
1801*495ae853SAndroid Build Coastguard Worker /* Offset to the start of the pic from the top left corner of the frame
1802*495ae853SAndroid Build Coastguard Worker buffer */
1803*495ae853SAndroid Build Coastguard Worker
1804*495ae853SAndroid Build Coastguard Worker if((0 == ps_dec->u4_share_disp_buf)
1805*495ae853SAndroid Build Coastguard Worker || (NULL == ps_dec->disp_bufs[i].buf[0]))
1806*495ae853SAndroid Build Coastguard Worker {
1807*495ae853SAndroid Build Coastguard Worker UWORD32 pad_len_h, pad_len_v;
1808*495ae853SAndroid Build Coastguard Worker
1809*495ae853SAndroid Build Coastguard Worker u4_offset = ps_dec->u2_frm_wd_y * (PAD_LEN_Y_V << 1) + PAD_LEN_Y_H;
1810*495ae853SAndroid Build Coastguard Worker ps_pic_buf->pu1_buf1 = (UWORD8 *)(pu1_luma) + u4_offset;
1811*495ae853SAndroid Build Coastguard Worker
1812*495ae853SAndroid Build Coastguard Worker pad_len_h = MAX(PAD_LEN_UV_H, (PAD_LEN_Y_H >> 1));
1813*495ae853SAndroid Build Coastguard Worker pad_len_v = MAX(PAD_LEN_UV_V, PAD_LEN_Y_V);
1814*495ae853SAndroid Build Coastguard Worker
1815*495ae853SAndroid Build Coastguard Worker u4_offset = ps_dec->u2_frm_wd_uv * pad_len_v + pad_len_h;
1816*495ae853SAndroid Build Coastguard Worker
1817*495ae853SAndroid Build Coastguard Worker ps_pic_buf->pu1_buf2 = (UWORD8 *)(pu1_chroma) + u4_offset;
1818*495ae853SAndroid Build Coastguard Worker ps_pic_buf->pu1_buf3 = (UWORD8 *)(NULL) + u4_offset;
1819*495ae853SAndroid Build Coastguard Worker
1820*495ae853SAndroid Build Coastguard Worker }
1821*495ae853SAndroid Build Coastguard Worker else
1822*495ae853SAndroid Build Coastguard Worker {
1823*495ae853SAndroid Build Coastguard Worker UWORD32 pad_len_h, pad_len_v;
1824*495ae853SAndroid Build Coastguard Worker u4_offset = ps_dec->u2_frm_wd_y * (PAD_LEN_Y_V << 1) + PAD_LEN_Y_H;
1825*495ae853SAndroid Build Coastguard Worker ps_pic_buf->pu1_buf1 = (UWORD8 *)ps_dec->disp_bufs[i].buf[0]
1826*495ae853SAndroid Build Coastguard Worker + u4_offset;
1827*495ae853SAndroid Build Coastguard Worker
1828*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].u4_ofst[0] = u4_offset;
1829*495ae853SAndroid Build Coastguard Worker
1830*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_chroma_format == IV_YUV_420P)
1831*495ae853SAndroid Build Coastguard Worker {
1832*495ae853SAndroid Build Coastguard Worker pad_len_h = MAX(PAD_LEN_UV_H * YUV420SP_FACTOR,
1833*495ae853SAndroid Build Coastguard Worker (PAD_LEN_Y_H >> 1));
1834*495ae853SAndroid Build Coastguard Worker pad_len_v = MAX(PAD_LEN_UV_V, PAD_LEN_Y_V);
1835*495ae853SAndroid Build Coastguard Worker
1836*495ae853SAndroid Build Coastguard Worker u4_offset = ps_dec->u2_frm_wd_uv * pad_len_v + pad_len_h;
1837*495ae853SAndroid Build Coastguard Worker ps_pic_buf->pu1_buf2 = (UWORD8 *)(pu1_chroma) + u4_offset;
1838*495ae853SAndroid Build Coastguard Worker ps_pic_buf->pu1_buf3 = (UWORD8 *)(NULL) + u4_offset;
1839*495ae853SAndroid Build Coastguard Worker
1840*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].u4_ofst[1] = u4_offset;
1841*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].u4_ofst[2] = u4_offset;
1842*495ae853SAndroid Build Coastguard Worker
1843*495ae853SAndroid Build Coastguard Worker }
1844*495ae853SAndroid Build Coastguard Worker else
1845*495ae853SAndroid Build Coastguard Worker {
1846*495ae853SAndroid Build Coastguard Worker pad_len_h = MAX(PAD_LEN_UV_H * YUV420SP_FACTOR,
1847*495ae853SAndroid Build Coastguard Worker (PAD_LEN_Y_H >> 1));
1848*495ae853SAndroid Build Coastguard Worker pad_len_v = MAX(PAD_LEN_UV_V, PAD_LEN_Y_V);
1849*495ae853SAndroid Build Coastguard Worker
1850*495ae853SAndroid Build Coastguard Worker u4_offset = ps_dec->u2_frm_wd_uv * pad_len_v + pad_len_h;
1851*495ae853SAndroid Build Coastguard Worker ps_pic_buf->pu1_buf2 = (UWORD8 *)(ps_dec->disp_bufs[i].buf[1])
1852*495ae853SAndroid Build Coastguard Worker + u4_offset;
1853*495ae853SAndroid Build Coastguard Worker ps_pic_buf->pu1_buf3 = (UWORD8 *)(ps_dec->disp_bufs[i].buf[1])
1854*495ae853SAndroid Build Coastguard Worker + u4_offset;
1855*495ae853SAndroid Build Coastguard Worker
1856*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].u4_ofst[1] = u4_offset;
1857*495ae853SAndroid Build Coastguard Worker ps_dec->disp_bufs[i].u4_ofst[2] = u4_offset;
1858*495ae853SAndroid Build Coastguard Worker }
1859*495ae853SAndroid Build Coastguard Worker }
1860*495ae853SAndroid Build Coastguard Worker
1861*495ae853SAndroid Build Coastguard Worker ps_pic_buf->u2_frm_ht_y = ps_dec->u2_frm_ht_y;
1862*495ae853SAndroid Build Coastguard Worker ps_pic_buf->u2_frm_ht_uv = ps_dec->u2_frm_ht_uv;
1863*495ae853SAndroid Build Coastguard Worker ps_pic_buf->u2_frm_wd_y = ps_dec->u2_frm_wd_y;
1864*495ae853SAndroid Build Coastguard Worker ps_pic_buf->u2_frm_wd_uv = ps_dec->u2_frm_wd_uv;
1865*495ae853SAndroid Build Coastguard Worker
1866*495ae853SAndroid Build Coastguard Worker ps_pic_buf->u1_pic_buf_id = i;
1867*495ae853SAndroid Build Coastguard Worker
1868*495ae853SAndroid Build Coastguard Worker buf_ret = ih264_buf_mgr_add((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
1869*495ae853SAndroid Build Coastguard Worker ps_pic_buf, i);
1870*495ae853SAndroid Build Coastguard Worker if(0 != buf_ret)
1871*495ae853SAndroid Build Coastguard Worker {
1872*495ae853SAndroid Build Coastguard Worker ps_dec->i4_error_code = ERROR_BUF_MGR;
1873*495ae853SAndroid Build Coastguard Worker return ERROR_BUF_MGR;
1874*495ae853SAndroid Build Coastguard Worker }
1875*495ae853SAndroid Build Coastguard Worker
1876*495ae853SAndroid Build Coastguard Worker ps_dec->apv_buf_id_pic_buf_map[i] = (void *)ps_pic_buf;
1877*495ae853SAndroid Build Coastguard Worker ps_pic_buf++;
1878*495ae853SAndroid Build Coastguard Worker }
1879*495ae853SAndroid Build Coastguard Worker
1880*495ae853SAndroid Build Coastguard Worker if(1 == ps_dec->u4_share_disp_buf)
1881*495ae853SAndroid Build Coastguard Worker {
1882*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u1_num_of_buf; i++)
1883*495ae853SAndroid Build Coastguard Worker ps_dec->u4_disp_buf_mapping[i] = 1;
1884*495ae853SAndroid Build Coastguard Worker }
1885*495ae853SAndroid Build Coastguard Worker return OK;
1886*495ae853SAndroid Build Coastguard Worker }
1887*495ae853SAndroid Build Coastguard Worker
1888*495ae853SAndroid Build Coastguard Worker /*!
1889*495ae853SAndroid Build Coastguard Worker **************************************************************************
1890*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_allocate_dynamic_bufs \endif
1891*495ae853SAndroid Build Coastguard Worker *
1892*495ae853SAndroid Build Coastguard Worker * \brief
1893*495ae853SAndroid Build Coastguard Worker * This function allocates memory required by Decoder.
1894*495ae853SAndroid Build Coastguard Worker *
1895*495ae853SAndroid Build Coastguard Worker * \param ps_dec: Pointer to dec_struct_t.
1896*495ae853SAndroid Build Coastguard Worker *
1897*495ae853SAndroid Build Coastguard Worker * \return
1898*495ae853SAndroid Build Coastguard Worker * Returns i4_status as returned by MemManager.
1899*495ae853SAndroid Build Coastguard Worker *
1900*495ae853SAndroid Build Coastguard Worker **************************************************************************
1901*495ae853SAndroid Build Coastguard Worker */
ih264d_allocate_dynamic_bufs(dec_struct_t * ps_dec)1902*495ae853SAndroid Build Coastguard Worker WORD16 ih264d_allocate_dynamic_bufs(dec_struct_t * ps_dec)
1903*495ae853SAndroid Build Coastguard Worker {
1904*495ae853SAndroid Build Coastguard Worker struct MemReq s_MemReq;
1905*495ae853SAndroid Build Coastguard Worker struct MemBlock *p_MemBlock;
1906*495ae853SAndroid Build Coastguard Worker
1907*495ae853SAndroid Build Coastguard Worker pred_info_t *ps_pred_frame;
1908*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_frm_mb_info;
1909*495ae853SAndroid Build Coastguard Worker dec_slice_struct_t *ps_dec_slice_buf;
1910*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_dec_mb_map, *pu1_recon_mb_map;
1911*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_slice_num_map;
1912*495ae853SAndroid Build Coastguard Worker
1913*495ae853SAndroid Build Coastguard Worker WORD16 *pi16_res_coeff;
1914*495ae853SAndroid Build Coastguard Worker WORD16 i16_status = 0;
1915*495ae853SAndroid Build Coastguard Worker UWORD8 uc_frmOrFld = (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag);
1916*495ae853SAndroid Build Coastguard Worker UWORD16 u4_luma_wd = ps_dec->u2_frm_wd_y;
1917*495ae853SAndroid Build Coastguard Worker UWORD16 u4_chroma_wd = ps_dec->u2_frm_wd_uv;
1918*495ae853SAndroid Build Coastguard Worker WORD8 c_i = 0;
1919*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_sps = ps_dec->ps_cur_sps;
1920*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_mbs = ps_sps->u2_total_num_of_mbs << uc_frmOrFld;
1921*495ae853SAndroid Build Coastguard Worker UWORD32 u4_wd_mbs = ps_dec->u2_frm_wd_in_mbs;
1922*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ht_mbs = ps_dec->u2_frm_ht_in_mbs;
1923*495ae853SAndroid Build Coastguard Worker UWORD32 u4_blk_wd;
1924*495ae853SAndroid Build Coastguard Worker UWORD32 ui_size = 0;
1925*495ae853SAndroid Build Coastguard Worker UWORD32 u4_int_scratch_size = 0, u4_ref_pred_size = 0;
1926*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf;
1927*495ae853SAndroid Build Coastguard Worker WORD32 num_entries;
1928*495ae853SAndroid Build Coastguard Worker WORD32 size;
1929*495ae853SAndroid Build Coastguard Worker void *pv_buf;
1930*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_bufs;
1931*495ae853SAndroid Build Coastguard Worker UWORD32 u4_luma_size, u4_chroma_size;
1932*495ae853SAndroid Build Coastguard Worker void *pv_mem_ctxt = ps_dec->pv_mem_ctxt;
1933*495ae853SAndroid Build Coastguard Worker
1934*495ae853SAndroid Build Coastguard Worker size = u4_total_mbs;
1935*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
1936*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1937*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1938*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_dec_mb_map = pv_buf;
1939*495ae853SAndroid Build Coastguard Worker
1940*495ae853SAndroid Build Coastguard Worker size = u4_total_mbs;
1941*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
1942*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1943*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1944*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_recon_mb_map = pv_buf;
1945*495ae853SAndroid Build Coastguard Worker
1946*495ae853SAndroid Build Coastguard Worker size = u4_total_mbs * sizeof(UWORD16);
1947*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
1948*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1949*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1950*495ae853SAndroid Build Coastguard Worker ps_dec->pu2_slice_num_map = pv_buf;
1951*495ae853SAndroid Build Coastguard Worker
1952*495ae853SAndroid Build Coastguard Worker /************************************************************/
1953*495ae853SAndroid Build Coastguard Worker /* Post allocation Initialisations */
1954*495ae853SAndroid Build Coastguard Worker /************************************************************/
1955*495ae853SAndroid Build Coastguard Worker ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
1956*495ae853SAndroid Build Coastguard Worker ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
1957*495ae853SAndroid Build Coastguard Worker ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
1958*495ae853SAndroid Build Coastguard Worker
1959*495ae853SAndroid Build Coastguard Worker ps_dec->ps_pred_start = ps_dec->ps_pred;
1960*495ae853SAndroid Build Coastguard Worker
1961*495ae853SAndroid Build Coastguard Worker size = sizeof(parse_pmbarams_t) * (ps_dec->u1_recon_mb_grp);
1962*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
1963*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1964*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1965*495ae853SAndroid Build Coastguard Worker ps_dec->ps_parse_mb_data = pv_buf;
1966*495ae853SAndroid Build Coastguard Worker
1967*495ae853SAndroid Build Coastguard Worker size = sizeof(parse_part_params_t)
1968*495ae853SAndroid Build Coastguard Worker * ((ps_dec->u1_recon_mb_grp) << 4);
1969*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
1970*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1971*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1972*495ae853SAndroid Build Coastguard Worker ps_dec->ps_parse_part_params = pv_buf;
1973*495ae853SAndroid Build Coastguard Worker
1974*495ae853SAndroid Build Coastguard Worker size = ((u4_wd_mbs * sizeof(deblkmb_neighbour_t)) << uc_frmOrFld);
1975*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
1976*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1977*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1978*495ae853SAndroid Build Coastguard Worker ps_dec->ps_deblk_top_mb = pv_buf;
1979*495ae853SAndroid Build Coastguard Worker
1980*495ae853SAndroid Build Coastguard Worker size = ((sizeof(ctxt_inc_mb_info_t))
1981*495ae853SAndroid Build Coastguard Worker * (((u4_wd_mbs + 1) << uc_frmOrFld) + 1));
1982*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
1983*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1984*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1985*495ae853SAndroid Build Coastguard Worker ps_dec->p_ctxt_inc_mb_map = pv_buf;
1986*495ae853SAndroid Build Coastguard Worker
1987*495ae853SAndroid Build Coastguard Worker /* 0th entry of CtxtIncMbMap will be always be containing default values
1988*495ae853SAndroid Build Coastguard Worker for CABAC context representing MB not available */
1989*495ae853SAndroid Build Coastguard Worker ps_dec->p_ctxt_inc_mb_map += 1;
1990*495ae853SAndroid Build Coastguard Worker
1991*495ae853SAndroid Build Coastguard Worker size = (sizeof(mv_pred_t) * ps_dec->u1_recon_mb_grp
1992*495ae853SAndroid Build Coastguard Worker * 16);
1993*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
1994*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
1995*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
1996*495ae853SAndroid Build Coastguard Worker ps_dec->ps_mv_p[0] = pv_buf;
1997*495ae853SAndroid Build Coastguard Worker
1998*495ae853SAndroid Build Coastguard Worker size = (sizeof(mv_pred_t) * ps_dec->u1_recon_mb_grp
1999*495ae853SAndroid Build Coastguard Worker * 16);
2000*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2001*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2002*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
2003*495ae853SAndroid Build Coastguard Worker ps_dec->ps_mv_p[1] = pv_buf;
2004*495ae853SAndroid Build Coastguard Worker
2005*495ae853SAndroid Build Coastguard Worker {
2006*495ae853SAndroid Build Coastguard Worker UWORD8 i;
2007*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MV_SCRATCH_BUFS; i++)
2008*495ae853SAndroid Build Coastguard Worker {
2009*495ae853SAndroid Build Coastguard Worker size = (sizeof(mv_pred_t)
2010*495ae853SAndroid Build Coastguard Worker * ps_dec->u1_recon_mb_grp * 4);
2011*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2012*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2013*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
2014*495ae853SAndroid Build Coastguard Worker ps_dec->ps_mv_top_p[i] = pv_buf;
2015*495ae853SAndroid Build Coastguard Worker }
2016*495ae853SAndroid Build Coastguard Worker }
2017*495ae853SAndroid Build Coastguard Worker
2018*495ae853SAndroid Build Coastguard Worker size = sizeof(UWORD8) * ((u4_wd_mbs + 2) * MB_SIZE) * 2;
2019*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2020*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2021*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_y_intra_pred_line = pv_buf;
2022*495ae853SAndroid Build Coastguard Worker memset(ps_dec->pu1_y_intra_pred_line, 0, size);
2023*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_y_intra_pred_line += MB_SIZE;
2024*495ae853SAndroid Build Coastguard Worker
2025*495ae853SAndroid Build Coastguard Worker size = sizeof(UWORD8) * ((u4_wd_mbs + 2) * MB_SIZE) * 2;
2026*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2027*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2028*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_u_intra_pred_line = pv_buf;
2029*495ae853SAndroid Build Coastguard Worker memset(ps_dec->pu1_u_intra_pred_line, 0, size);
2030*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_u_intra_pred_line += MB_SIZE;
2031*495ae853SAndroid Build Coastguard Worker
2032*495ae853SAndroid Build Coastguard Worker size = sizeof(UWORD8) * ((u4_wd_mbs + 2) * MB_SIZE) * 2;
2033*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2034*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2035*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_v_intra_pred_line = pv_buf;
2036*495ae853SAndroid Build Coastguard Worker memset(ps_dec->pu1_v_intra_pred_line, 0, size);
2037*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_v_intra_pred_line += MB_SIZE;
2038*495ae853SAndroid Build Coastguard Worker
2039*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_separate_parse)
2040*495ae853SAndroid Build Coastguard Worker {
2041*495ae853SAndroid Build Coastguard Worker /* Needs one extra row of info, to hold top row data */
2042*495ae853SAndroid Build Coastguard Worker size = sizeof(mb_neigbour_params_t)
2043*495ae853SAndroid Build Coastguard Worker * 2 * ((u4_wd_mbs + 2) * (u4_ht_mbs + 1));
2044*495ae853SAndroid Build Coastguard Worker }
2045*495ae853SAndroid Build Coastguard Worker else
2046*495ae853SAndroid Build Coastguard Worker {
2047*495ae853SAndroid Build Coastguard Worker size = sizeof(mb_neigbour_params_t)
2048*495ae853SAndroid Build Coastguard Worker * 2 * ((u4_wd_mbs + 2) << uc_frmOrFld);
2049*495ae853SAndroid Build Coastguard Worker }
2050*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2051*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2052*495ae853SAndroid Build Coastguard Worker
2053*495ae853SAndroid Build Coastguard Worker ps_dec->ps_nbr_mb_row = pv_buf;
2054*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_nbr_mb_row, 0, size);
2055*495ae853SAndroid Build Coastguard Worker
2056*495ae853SAndroid Build Coastguard Worker /* Allocate deblock MB info */
2057*495ae853SAndroid Build Coastguard Worker size = (u4_total_mbs + u4_wd_mbs) * sizeof(deblk_mb_t);
2058*495ae853SAndroid Build Coastguard Worker
2059*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2060*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2061*495ae853SAndroid Build Coastguard Worker ps_dec->ps_deblk_pic = pv_buf;
2062*495ae853SAndroid Build Coastguard Worker
2063*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_deblk_pic, 0, size);
2064*495ae853SAndroid Build Coastguard Worker
2065*495ae853SAndroid Build Coastguard Worker /* Allocate frame level mb info */
2066*495ae853SAndroid Build Coastguard Worker size = sizeof(dec_mb_info_t) * u4_total_mbs;
2067*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2068*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2069*495ae853SAndroid Build Coastguard Worker ps_dec->ps_frm_mb_info = pv_buf;
2070*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_frm_mb_info, 0, size);
2071*495ae853SAndroid Build Coastguard Worker
2072*495ae853SAndroid Build Coastguard Worker /* Allocate memory for slice headers dec_slice_struct_t */
2073*495ae853SAndroid Build Coastguard Worker num_entries = MAX_FRAMES;
2074*495ae853SAndroid Build Coastguard Worker if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
2075*495ae853SAndroid Build Coastguard Worker (0 == ps_dec->i4_display_delay))
2076*495ae853SAndroid Build Coastguard Worker {
2077*495ae853SAndroid Build Coastguard Worker num_entries = 1;
2078*495ae853SAndroid Build Coastguard Worker }
2079*495ae853SAndroid Build Coastguard Worker num_entries = ((2 * num_entries) + 1);
2080*495ae853SAndroid Build Coastguard Worker num_entries *= 2;
2081*495ae853SAndroid Build Coastguard Worker
2082*495ae853SAndroid Build Coastguard Worker size = num_entries * sizeof(void *);
2083*495ae853SAndroid Build Coastguard Worker size += PAD_MAP_IDX_POC * sizeof(void *);
2084*495ae853SAndroid Build Coastguard Worker size *= u4_total_mbs;
2085*495ae853SAndroid Build Coastguard Worker size += sizeof(dec_slice_struct_t) * u4_total_mbs;
2086*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2087*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2088*495ae853SAndroid Build Coastguard Worker
2089*495ae853SAndroid Build Coastguard Worker ps_dec->ps_dec_slice_buf = pv_buf;
2090*495ae853SAndroid Build Coastguard Worker memset(ps_dec->ps_dec_slice_buf, 0, size);
2091*495ae853SAndroid Build Coastguard Worker pu1_buf = (UWORD8 *)ps_dec->ps_dec_slice_buf;
2092*495ae853SAndroid Build Coastguard Worker pu1_buf += sizeof(dec_slice_struct_t) * u4_total_mbs;
2093*495ae853SAndroid Build Coastguard Worker ps_dec->pv_map_ref_idx_to_poc_buf = (void *)pu1_buf;
2094*495ae853SAndroid Build Coastguard Worker
2095*495ae853SAndroid Build Coastguard Worker /* Allocate memory for packed pred info */
2096*495ae853SAndroid Build Coastguard Worker num_entries = u4_total_mbs;
2097*495ae853SAndroid Build Coastguard Worker num_entries *= 16 * 2;
2098*495ae853SAndroid Build Coastguard Worker
2099*495ae853SAndroid Build Coastguard Worker size = sizeof(pred_info_pkd_t) * num_entries;
2100*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2101*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2102*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
2103*495ae853SAndroid Build Coastguard Worker ps_dec->ps_pred_pkd = pv_buf;
2104*495ae853SAndroid Build Coastguard Worker
2105*495ae853SAndroid Build Coastguard Worker /* Allocate memory for coeff data */
2106*495ae853SAndroid Build Coastguard Worker size = MB_LUM_SIZE * sizeof(WORD16);
2107*495ae853SAndroid Build Coastguard Worker /*For I16x16 MBs, 16 4x4 AC coeffs and 1 4x4 DC coeff TU blocks will be sent
2108*495ae853SAndroid Build Coastguard Worker For all MBs along with 8 4x4 AC coeffs 2 2x2 DC coeff TU blocks will be sent
2109*495ae853SAndroid Build Coastguard Worker So use 17 4x4 TU blocks for luma and 9 4x4 TU blocks for chroma */
2110*495ae853SAndroid Build Coastguard Worker size += u4_total_mbs * (MAX(17 * sizeof(tu_sblk4x4_coeff_data_t),4 * sizeof(tu_blk8x8_coeff_data_t))
2111*495ae853SAndroid Build Coastguard Worker + 9 * sizeof(tu_sblk4x4_coeff_data_t));
2112*495ae853SAndroid Build Coastguard Worker //32 bytes for each mb to store u1_prev_intra4x4_pred_mode and u1_rem_intra4x4_pred_mode data
2113*495ae853SAndroid Build Coastguard Worker size += u4_total_mbs * 32;
2114*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2115*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2116*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
2117*495ae853SAndroid Build Coastguard Worker
2118*495ae853SAndroid Build Coastguard Worker ps_dec->pi2_coeff_data = pv_buf;
2119*495ae853SAndroid Build Coastguard Worker
2120*495ae853SAndroid Build Coastguard Worker ps_dec->pv_pic_tu_coeff_data = (void *)(ps_dec->pi2_coeff_data + MB_LUM_SIZE);
2121*495ae853SAndroid Build Coastguard Worker
2122*495ae853SAndroid Build Coastguard Worker /* Allocate MV bank buffer */
2123*495ae853SAndroid Build Coastguard Worker {
2124*495ae853SAndroid Build Coastguard Worker UWORD32 col_flag_buffer_size, mvpred_buffer_size;
2125*495ae853SAndroid Build Coastguard Worker
2126*495ae853SAndroid Build Coastguard Worker col_flag_buffer_size = ((ps_dec->u2_pic_wd * ps_dec->u2_pic_ht) >> 4);
2127*495ae853SAndroid Build Coastguard Worker mvpred_buffer_size = sizeof(mv_pred_t)
2128*495ae853SAndroid Build Coastguard Worker * ((ps_dec->u2_pic_wd * (ps_dec->u2_pic_ht + PAD_MV_BANK_ROW)) >> 4);
2129*495ae853SAndroid Build Coastguard Worker
2130*495ae853SAndroid Build Coastguard Worker u4_num_bufs = ps_dec->ps_cur_sps->u1_num_ref_frames + 1;
2131*495ae853SAndroid Build Coastguard Worker
2132*495ae853SAndroid Build Coastguard Worker u4_num_bufs = MIN(u4_num_bufs, ps_dec->u1_pic_bufs);
2133*495ae853SAndroid Build Coastguard Worker u4_num_bufs = MAX(u4_num_bufs, 2);
2134*495ae853SAndroid Build Coastguard Worker size = ALIGN64(mvpred_buffer_size) + ALIGN64(col_flag_buffer_size);
2135*495ae853SAndroid Build Coastguard Worker size *= u4_num_bufs;
2136*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2137*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2138*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
2139*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_mv_bank_buf_base = pv_buf;
2140*495ae853SAndroid Build Coastguard Worker }
2141*495ae853SAndroid Build Coastguard Worker
2142*495ae853SAndroid Build Coastguard Worker /* Allocate Pic buffer */
2143*495ae853SAndroid Build Coastguard Worker u4_luma_size = ps_dec->u2_frm_wd_y * ps_dec->u2_frm_ht_y;
2144*495ae853SAndroid Build Coastguard Worker u4_chroma_size = ps_dec->u2_frm_wd_uv * ps_dec->u2_frm_ht_uv;
2145*495ae853SAndroid Build Coastguard Worker
2146*495ae853SAndroid Build Coastguard Worker {
2147*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_share_disp_buf == 1)
2148*495ae853SAndroid Build Coastguard Worker {
2149*495ae853SAndroid Build Coastguard Worker /* In case of buffers getting shared between application and library
2150*495ae853SAndroid Build Coastguard Worker there is no need of reference memtabs. Instead of setting the i4_size
2151*495ae853SAndroid Build Coastguard Worker to zero, it is reduced to a small i4_size to ensure that changes
2152*495ae853SAndroid Build Coastguard Worker in the code are minimal */
2153*495ae853SAndroid Build Coastguard Worker if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
2154*495ae853SAndroid Build Coastguard Worker || (ps_dec->u1_chroma_format == IV_YUV_420SP_VU)
2155*495ae853SAndroid Build Coastguard Worker || (ps_dec->u1_chroma_format == IV_YUV_420P))
2156*495ae853SAndroid Build Coastguard Worker {
2157*495ae853SAndroid Build Coastguard Worker u4_luma_size = 64;
2158*495ae853SAndroid Build Coastguard Worker }
2159*495ae853SAndroid Build Coastguard Worker
2160*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
2161*495ae853SAndroid Build Coastguard Worker {
2162*495ae853SAndroid Build Coastguard Worker u4_chroma_size = 64;
2163*495ae853SAndroid Build Coastguard Worker }
2164*495ae853SAndroid Build Coastguard Worker
2165*495ae853SAndroid Build Coastguard Worker }
2166*495ae853SAndroid Build Coastguard Worker }
2167*495ae853SAndroid Build Coastguard Worker
2168*495ae853SAndroid Build Coastguard Worker size = ALIGN64(u4_luma_size) + ALIGN64(u4_chroma_size);
2169*495ae853SAndroid Build Coastguard Worker size *= ps_dec->u1_pic_bufs;
2170*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2171*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2172*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
2173*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_pic_buf_base = pv_buf;
2174*495ae853SAndroid Build Coastguard Worker
2175*495ae853SAndroid Build Coastguard Worker /* Allocate memory for mb_info maps */
2176*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_enable_mb_info)
2177*495ae853SAndroid Build Coastguard Worker {
2178*495ae853SAndroid Build Coastguard Worker size = (u4_total_mbs << 2) * MAX_DISP_BUFS_NEW;
2179*495ae853SAndroid Build Coastguard Worker
2180*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2181*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2182*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
2183*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_qp_map_base = pv_buf;
2184*495ae853SAndroid Build Coastguard Worker
2185*495ae853SAndroid Build Coastguard Worker pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
2186*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
2187*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, size);
2188*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_mb_type_map_base = pv_buf;
2189*495ae853SAndroid Build Coastguard Worker }
2190*495ae853SAndroid Build Coastguard Worker
2191*495ae853SAndroid Build Coastguard Worker /* Post allocation Increment Actions */
2192*495ae853SAndroid Build Coastguard Worker
2193*495ae853SAndroid Build Coastguard Worker /***************************************************************************/
2194*495ae853SAndroid Build Coastguard Worker /*Initialize cabac context pointers for every SE that has fixed contextIdx */
2195*495ae853SAndroid Build Coastguard Worker /***************************************************************************/
2196*495ae853SAndroid Build Coastguard Worker {
2197*495ae853SAndroid Build Coastguard Worker bin_ctxt_model_t * const p_cabac_ctxt_table_t =
2198*495ae853SAndroid Build Coastguard Worker ps_dec->p_cabac_ctxt_table_t;
2199*495ae853SAndroid Build Coastguard Worker bin_ctxt_model_t * * p_coeff_abs_level_minus1_t =
2200*495ae853SAndroid Build Coastguard Worker ps_dec->p_coeff_abs_level_minus1_t;
2201*495ae853SAndroid Build Coastguard Worker bin_ctxt_model_t * * p_cbf_t = ps_dec->p_cbf_t;
2202*495ae853SAndroid Build Coastguard Worker
2203*495ae853SAndroid Build Coastguard Worker ps_dec->p_mb_field_dec_flag_t = p_cabac_ctxt_table_t
2204*495ae853SAndroid Build Coastguard Worker + MB_FIELD_DECODING_FLAG;
2205*495ae853SAndroid Build Coastguard Worker ps_dec->p_prev_intra4x4_pred_mode_flag_t = p_cabac_ctxt_table_t
2206*495ae853SAndroid Build Coastguard Worker + PREV_INTRA4X4_PRED_MODE_FLAG;
2207*495ae853SAndroid Build Coastguard Worker ps_dec->p_rem_intra4x4_pred_mode_t = p_cabac_ctxt_table_t
2208*495ae853SAndroid Build Coastguard Worker + REM_INTRA4X4_PRED_MODE;
2209*495ae853SAndroid Build Coastguard Worker ps_dec->p_intra_chroma_pred_mode_t = p_cabac_ctxt_table_t
2210*495ae853SAndroid Build Coastguard Worker + INTRA_CHROMA_PRED_MODE;
2211*495ae853SAndroid Build Coastguard Worker ps_dec->p_mb_qp_delta_t = p_cabac_ctxt_table_t + MB_QP_DELTA;
2212*495ae853SAndroid Build Coastguard Worker ps_dec->p_ref_idx_t = p_cabac_ctxt_table_t + REF_IDX;
2213*495ae853SAndroid Build Coastguard Worker ps_dec->p_mvd_x_t = p_cabac_ctxt_table_t + MVD_X;
2214*495ae853SAndroid Build Coastguard Worker ps_dec->p_mvd_y_t = p_cabac_ctxt_table_t + MVD_Y;
2215*495ae853SAndroid Build Coastguard Worker p_cbf_t[0] = p_cabac_ctxt_table_t + CBF + 0;
2216*495ae853SAndroid Build Coastguard Worker p_cbf_t[1] = p_cabac_ctxt_table_t + CBF + 4;
2217*495ae853SAndroid Build Coastguard Worker p_cbf_t[2] = p_cabac_ctxt_table_t + CBF + 8;
2218*495ae853SAndroid Build Coastguard Worker p_cbf_t[3] = p_cabac_ctxt_table_t + CBF + 12;
2219*495ae853SAndroid Build Coastguard Worker p_cbf_t[4] = p_cabac_ctxt_table_t + CBF + 16;
2220*495ae853SAndroid Build Coastguard Worker ps_dec->p_cbp_luma_t = p_cabac_ctxt_table_t + CBP_LUMA;
2221*495ae853SAndroid Build Coastguard Worker ps_dec->p_cbp_chroma_t = p_cabac_ctxt_table_t + CBP_CHROMA;
2222*495ae853SAndroid Build Coastguard Worker
2223*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[LUMA_DC_CTXCAT] = p_cabac_ctxt_table_t
2224*495ae853SAndroid Build Coastguard Worker + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_0_OFFSET;
2225*495ae853SAndroid Build Coastguard Worker
2226*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[LUMA_AC_CTXCAT] = p_cabac_ctxt_table_t
2227*495ae853SAndroid Build Coastguard Worker + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_1_OFFSET;
2228*495ae853SAndroid Build Coastguard Worker
2229*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[LUMA_4X4_CTXCAT] = p_cabac_ctxt_table_t
2230*495ae853SAndroid Build Coastguard Worker + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_2_OFFSET;
2231*495ae853SAndroid Build Coastguard Worker
2232*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[CHROMA_DC_CTXCAT] = p_cabac_ctxt_table_t
2233*495ae853SAndroid Build Coastguard Worker + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_3_OFFSET;
2234*495ae853SAndroid Build Coastguard Worker
2235*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[CHROMA_AC_CTXCAT] = p_cabac_ctxt_table_t
2236*495ae853SAndroid Build Coastguard Worker + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_4_OFFSET;
2237*495ae853SAndroid Build Coastguard Worker
2238*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[LUMA_8X8_CTXCAT] = p_cabac_ctxt_table_t
2239*495ae853SAndroid Build Coastguard Worker + COEFF_ABS_LEVEL_MINUS1_8X8
2240*495ae853SAndroid Build Coastguard Worker + COEFF_ABS_LEVEL_CAT_5_OFFSET;
2241*495ae853SAndroid Build Coastguard Worker
2242*495ae853SAndroid Build Coastguard Worker /********************************************************/
2243*495ae853SAndroid Build Coastguard Worker /* context for the high profile related syntax elements */
2244*495ae853SAndroid Build Coastguard Worker /* This is maintained seperately in s_high_profile */
2245*495ae853SAndroid Build Coastguard Worker /********************************************************/
2246*495ae853SAndroid Build Coastguard Worker {
2247*495ae853SAndroid Build Coastguard Worker
2248*495ae853SAndroid Build Coastguard Worker ps_dec->s_high_profile.ps_transform8x8_flag = p_cabac_ctxt_table_t
2249*495ae853SAndroid Build Coastguard Worker + TRANSFORM_SIZE_8X8_FLAG;
2250*495ae853SAndroid Build Coastguard Worker
2251*495ae853SAndroid Build Coastguard Worker ps_dec->s_high_profile.ps_sigcoeff_8x8_frame = p_cabac_ctxt_table_t
2252*495ae853SAndroid Build Coastguard Worker + SIGNIFICANT_COEFF_FLAG_8X8_FRAME;
2253*495ae853SAndroid Build Coastguard Worker
2254*495ae853SAndroid Build Coastguard Worker ps_dec->s_high_profile.ps_last_sigcoeff_8x8_frame =
2255*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t
2256*495ae853SAndroid Build Coastguard Worker + LAST_SIGNIFICANT_COEFF_FLAG_8X8_FRAME;
2257*495ae853SAndroid Build Coastguard Worker
2258*495ae853SAndroid Build Coastguard Worker ps_dec->s_high_profile.ps_coeff_abs_levelminus1 =
2259*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + COEFF_ABS_LEVEL_MINUS1_8X8;
2260*495ae853SAndroid Build Coastguard Worker
2261*495ae853SAndroid Build Coastguard Worker ps_dec->s_high_profile.ps_sigcoeff_8x8_field = p_cabac_ctxt_table_t
2262*495ae853SAndroid Build Coastguard Worker + SIGNIFICANT_COEFF_FLAG_8X8_FIELD;
2263*495ae853SAndroid Build Coastguard Worker
2264*495ae853SAndroid Build Coastguard Worker ps_dec->s_high_profile.ps_last_sigcoeff_8x8_field =
2265*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t
2266*495ae853SAndroid Build Coastguard Worker + LAST_SIGNIFICANT_COEFF_FLAG_8X8_FIELD;
2267*495ae853SAndroid Build Coastguard Worker }
2268*495ae853SAndroid Build Coastguard Worker }
2269*495ae853SAndroid Build Coastguard Worker return (i16_status);
2270*495ae853SAndroid Build Coastguard Worker }
2271*495ae853SAndroid Build Coastguard Worker
2272*495ae853SAndroid Build Coastguard Worker /*!
2273*495ae853SAndroid Build Coastguard Worker **************************************************************************
2274*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_free_dynamic_bufs \endif
2275*495ae853SAndroid Build Coastguard Worker *
2276*495ae853SAndroid Build Coastguard Worker * \brief
2277*495ae853SAndroid Build Coastguard Worker * This function frees dynamic memory allocated by Decoder.
2278*495ae853SAndroid Build Coastguard Worker *
2279*495ae853SAndroid Build Coastguard Worker * \param ps_dec: Pointer to dec_struct_t.
2280*495ae853SAndroid Build Coastguard Worker *
2281*495ae853SAndroid Build Coastguard Worker * \return
2282*495ae853SAndroid Build Coastguard Worker * Returns i4_status as returned by MemManager.
2283*495ae853SAndroid Build Coastguard Worker *
2284*495ae853SAndroid Build Coastguard Worker **************************************************************************
2285*495ae853SAndroid Build Coastguard Worker */
ih264d_free_dynamic_bufs(dec_struct_t * ps_dec)2286*495ae853SAndroid Build Coastguard Worker WORD16 ih264d_free_dynamic_bufs(dec_struct_t * ps_dec)
2287*495ae853SAndroid Build Coastguard Worker {
2288*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_bits_buf_dynamic);
2289*495ae853SAndroid Build Coastguard Worker
2290*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_deblk_pic);
2291*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_dec_mb_map);
2292*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_recon_mb_map);
2293*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu2_slice_num_map);
2294*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dec_slice_buf);
2295*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_frm_mb_info);
2296*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pi2_coeff_data);
2297*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_parse_mb_data);
2298*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_parse_part_params);
2299*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_deblk_top_mb);
2300*495ae853SAndroid Build Coastguard Worker
2301*495ae853SAndroid Build Coastguard Worker if(ps_dec->p_ctxt_inc_mb_map)
2302*495ae853SAndroid Build Coastguard Worker {
2303*495ae853SAndroid Build Coastguard Worker ps_dec->p_ctxt_inc_mb_map -= 1;
2304*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->p_ctxt_inc_mb_map);
2305*495ae853SAndroid Build Coastguard Worker }
2306*495ae853SAndroid Build Coastguard Worker
2307*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_mv_p[0]);
2308*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_mv_p[1]);
2309*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pred_pkd);
2310*495ae853SAndroid Build Coastguard Worker {
2311*495ae853SAndroid Build Coastguard Worker UWORD8 i;
2312*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MV_SCRATCH_BUFS; i++)
2313*495ae853SAndroid Build Coastguard Worker {
2314*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_mv_top_p[i]);
2315*495ae853SAndroid Build Coastguard Worker }
2316*495ae853SAndroid Build Coastguard Worker }
2317*495ae853SAndroid Build Coastguard Worker
2318*495ae853SAndroid Build Coastguard Worker if(ps_dec->pu1_y_intra_pred_line)
2319*495ae853SAndroid Build Coastguard Worker {
2320*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_y_intra_pred_line -= MB_SIZE;
2321*495ae853SAndroid Build Coastguard Worker }
2322*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_y_intra_pred_line);
2323*495ae853SAndroid Build Coastguard Worker
2324*495ae853SAndroid Build Coastguard Worker if(ps_dec->pu1_u_intra_pred_line)
2325*495ae853SAndroid Build Coastguard Worker {
2326*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_u_intra_pred_line -= MB_SIZE;
2327*495ae853SAndroid Build Coastguard Worker }
2328*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_u_intra_pred_line);
2329*495ae853SAndroid Build Coastguard Worker
2330*495ae853SAndroid Build Coastguard Worker if(ps_dec->pu1_v_intra_pred_line)
2331*495ae853SAndroid Build Coastguard Worker {
2332*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_v_intra_pred_line -= MB_SIZE;
2333*495ae853SAndroid Build Coastguard Worker }
2334*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_v_intra_pred_line);
2335*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_nbr_mb_row);
2336*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_mv_bank_buf_base);
2337*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_pic_buf_base);
2338*495ae853SAndroid Build Coastguard Worker
2339*495ae853SAndroid Build Coastguard Worker /* Free memory for mb_info maps */
2340*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_enable_mb_info)
2341*495ae853SAndroid Build Coastguard Worker {
2342*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_qp_map_base);
2343*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_mb_type_map_base);
2344*495ae853SAndroid Build Coastguard Worker }
2345*495ae853SAndroid Build Coastguard Worker return 0;
2346*495ae853SAndroid Build Coastguard Worker }
2347*495ae853SAndroid Build Coastguard Worker
2348*495ae853SAndroid Build Coastguard Worker /*!
2349*495ae853SAndroid Build Coastguard Worker **************************************************************************
2350*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_create_mv_bank \endif
2351*495ae853SAndroid Build Coastguard Worker *
2352*495ae853SAndroid Build Coastguard Worker * \brief
2353*495ae853SAndroid Build Coastguard Worker * This function creates MV bank.
2354*495ae853SAndroid Build Coastguard Worker *
2355*495ae853SAndroid Build Coastguard Worker * \param memType : Type of memory being handled
2356*495ae853SAndroid Build Coastguard Worker * 0: Display Buffer
2357*495ae853SAndroid Build Coastguard Worker * 1: Decoder Buffer
2358*495ae853SAndroid Build Coastguard Worker * 2: Internal Buffer
2359*495ae853SAndroid Build Coastguard Worker * \param u1_num_of_buf: Number of decode or display buffers.
2360*495ae853SAndroid Build Coastguard Worker * \param u4_wd : Frame width.
2361*495ae853SAndroid Build Coastguard Worker * \param u4_ht : Frame Height.
2362*495ae853SAndroid Build Coastguard Worker * \param ps_pic_buf_api : Pointer to Picture Buffer API.
2363*495ae853SAndroid Build Coastguard Worker * \param ih264d_dec_mem_manager : Memory manager utility supplied by system.
2364*495ae853SAndroid Build Coastguard Worker *
2365*495ae853SAndroid Build Coastguard Worker * \return
2366*495ae853SAndroid Build Coastguard Worker * 0 on Success and -1 on error
2367*495ae853SAndroid Build Coastguard Worker *
2368*495ae853SAndroid Build Coastguard Worker **************************************************************************
2369*495ae853SAndroid Build Coastguard Worker */
ih264d_create_mv_bank(void * pv_dec,UWORD32 ui_width,UWORD32 ui_height)2370*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_create_mv_bank(void *pv_dec,
2371*495ae853SAndroid Build Coastguard Worker UWORD32 ui_width,
2372*495ae853SAndroid Build Coastguard Worker UWORD32 ui_height)
2373*495ae853SAndroid Build Coastguard Worker {
2374*495ae853SAndroid Build Coastguard Worker UWORD8 i;
2375*495ae853SAndroid Build Coastguard Worker UWORD32 col_flag_buffer_size, mvpred_buffer_size;
2376*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_mv_buf_mgr_base, *pu1_mv_bank_base;
2377*495ae853SAndroid Build Coastguard Worker col_mv_buf_t *ps_col_mv;
2378*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_mv;
2379*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_col_zero_flag_buf;
2380*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *)pv_dec;
2381*495ae853SAndroid Build Coastguard Worker WORD32 buf_ret;
2382*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_bufs;
2383*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf;
2384*495ae853SAndroid Build Coastguard Worker WORD32 size;
2385*495ae853SAndroid Build Coastguard Worker void *pv_mem_ctxt = ps_dec->pv_mem_ctxt;
2386*495ae853SAndroid Build Coastguard Worker
2387*495ae853SAndroid Build Coastguard Worker col_flag_buffer_size = ((ui_width * ui_height) >> 4);
2388*495ae853SAndroid Build Coastguard Worker mvpred_buffer_size = sizeof(mv_pred_t)
2389*495ae853SAndroid Build Coastguard Worker * ((ui_width * (ui_height + PAD_MV_BANK_ROW)) >> 4);
2390*495ae853SAndroid Build Coastguard Worker
2391*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_init((buf_mgr_t *)ps_dec->pv_mv_buf_mgr);
2392*495ae853SAndroid Build Coastguard Worker
2393*495ae853SAndroid Build Coastguard Worker ps_col_mv = ps_dec->ps_col_mv_base;
2394*495ae853SAndroid Build Coastguard Worker
2395*495ae853SAndroid Build Coastguard Worker u4_num_bufs = ps_dec->ps_cur_sps->u1_num_ref_frames + 1;
2396*495ae853SAndroid Build Coastguard Worker
2397*495ae853SAndroid Build Coastguard Worker u4_num_bufs = MIN(u4_num_bufs, ps_dec->u1_pic_bufs);
2398*495ae853SAndroid Build Coastguard Worker u4_num_bufs = MAX(u4_num_bufs, 2);
2399*495ae853SAndroid Build Coastguard Worker pu1_buf = ps_dec->pu1_mv_bank_buf_base;
2400*495ae853SAndroid Build Coastguard Worker for(i = 0 ; i < u4_num_bufs ; i++)
2401*495ae853SAndroid Build Coastguard Worker {
2402*495ae853SAndroid Build Coastguard Worker pu1_col_zero_flag_buf = pu1_buf;
2403*495ae853SAndroid Build Coastguard Worker pu1_buf += ALIGN64(col_flag_buffer_size);
2404*495ae853SAndroid Build Coastguard Worker
2405*495ae853SAndroid Build Coastguard Worker ps_mv = (mv_pred_t *)pu1_buf;
2406*495ae853SAndroid Build Coastguard Worker pu1_buf += ALIGN64(mvpred_buffer_size);
2407*495ae853SAndroid Build Coastguard Worker
2408*495ae853SAndroid Build Coastguard Worker memset(ps_mv, 0, ((ui_width * OFFSET_MV_BANK_ROW) >> 4) * sizeof(mv_pred_t));
2409*495ae853SAndroid Build Coastguard Worker ps_mv += (ui_width*OFFSET_MV_BANK_ROW) >> 4;
2410*495ae853SAndroid Build Coastguard Worker
2411*495ae853SAndroid Build Coastguard Worker ps_col_mv->pv_col_zero_flag = (void *)pu1_col_zero_flag_buf;
2412*495ae853SAndroid Build Coastguard Worker ps_col_mv->pv_mv = (void *)ps_mv;
2413*495ae853SAndroid Build Coastguard Worker buf_ret = ih264_buf_mgr_add((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, ps_col_mv, i);
2414*495ae853SAndroid Build Coastguard Worker if(0 != buf_ret)
2415*495ae853SAndroid Build Coastguard Worker {
2416*495ae853SAndroid Build Coastguard Worker ps_dec->i4_error_code = ERROR_BUF_MGR;
2417*495ae853SAndroid Build Coastguard Worker return ERROR_BUF_MGR;
2418*495ae853SAndroid Build Coastguard Worker }
2419*495ae853SAndroid Build Coastguard Worker ps_col_mv++;
2420*495ae853SAndroid Build Coastguard Worker }
2421*495ae853SAndroid Build Coastguard Worker return OK;
2422*495ae853SAndroid Build Coastguard Worker }
2423*495ae853SAndroid Build Coastguard Worker
ih264d_unpack_coeff4x4_dc_4x4blk(tu_sblk4x4_coeff_data_t * ps_tu_4x4,WORD16 * pi2_out_coeff_data,UWORD8 * pu1_inv_scan)2424*495ae853SAndroid Build Coastguard Worker void ih264d_unpack_coeff4x4_dc_4x4blk(tu_sblk4x4_coeff_data_t *ps_tu_4x4,
2425*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_coeff_data,
2426*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_inv_scan)
2427*495ae853SAndroid Build Coastguard Worker {
2428*495ae853SAndroid Build Coastguard Worker UWORD16 u2_sig_coeff_map = ps_tu_4x4->u2_sig_coeff_map;
2429*495ae853SAndroid Build Coastguard Worker WORD32 idx;
2430*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
2431*495ae853SAndroid Build Coastguard Worker
2432*495ae853SAndroid Build Coastguard Worker while(u2_sig_coeff_map)
2433*495ae853SAndroid Build Coastguard Worker {
2434*495ae853SAndroid Build Coastguard Worker idx = CLZ(u2_sig_coeff_map);
2435*495ae853SAndroid Build Coastguard Worker
2436*495ae853SAndroid Build Coastguard Worker idx = 31 - idx;
2437*495ae853SAndroid Build Coastguard Worker RESET_BIT(u2_sig_coeff_map,idx);
2438*495ae853SAndroid Build Coastguard Worker
2439*495ae853SAndroid Build Coastguard Worker idx = pu1_inv_scan[idx];
2440*495ae853SAndroid Build Coastguard Worker pi2_out_coeff_data[idx] = *pi2_coeff_data++;
2441*495ae853SAndroid Build Coastguard Worker
2442*495ae853SAndroid Build Coastguard Worker }
2443*495ae853SAndroid Build Coastguard Worker }
2444