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 #ifdef __ANDROID__
21*495ae853SAndroid Build Coastguard Worker #include <android/log.h>
22*495ae853SAndroid Build Coastguard Worker #endif
23*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
24*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
25*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
26*495ae853SAndroid Build Coastguard Worker #include "iv.h"
27*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
28*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
29*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
30*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
31*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
32*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_bslice.h"
33*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
34*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
35*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
36*495ae853SAndroid Build Coastguard Worker #include "string.h"
37*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
38*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264_buf_mgr.h"
40*495ae853SAndroid Build Coastguard Worker #include "assert.h"
41*495ae853SAndroid Build Coastguard Worker
42*495ae853SAndroid Build Coastguard Worker #ifdef __ANDROID__
43*495ae853SAndroid Build Coastguard Worker #ifndef ALOG
44*495ae853SAndroid Build Coastguard Worker #define ALOG(priority, tag, ...) ((void)__android_log_print(ANDROID_##priority, tag, __VA_ARGS__))
45*495ae853SAndroid Build Coastguard Worker #define ALOGE(...) ALOG(LOG_ERROR, NULL, __VA_ARGS__)
android_errorWriteLog(int tag,const char * subTag)46*495ae853SAndroid Build Coastguard Worker inline int android_errorWriteLog(int tag, const char* subTag) {
47*495ae853SAndroid Build Coastguard Worker ALOGE("android_errorWriteLog(%x, %s)", tag, subTag);
48*495ae853SAndroid Build Coastguard Worker return 0;
49*495ae853SAndroid Build Coastguard Worker }
50*495ae853SAndroid Build Coastguard Worker #endif
51*495ae853SAndroid Build Coastguard Worker #endif
52*495ae853SAndroid Build Coastguard Worker
53*495ae853SAndroid Build Coastguard Worker /*!
54*495ae853SAndroid Build Coastguard Worker ***************************************************************************
55*495ae853SAndroid Build Coastguard Worker * \file ih264d_dpb_mgr.c
56*495ae853SAndroid Build Coastguard Worker *
57*495ae853SAndroid Build Coastguard Worker * \brief
58*495ae853SAndroid Build Coastguard Worker * Functions for managing the decoded picture buffer
59*495ae853SAndroid Build Coastguard Worker *
60*495ae853SAndroid Build Coastguard Worker * Detailed_description
61*495ae853SAndroid Build Coastguard Worker *
62*495ae853SAndroid Build Coastguard Worker * \date
63*495ae853SAndroid Build Coastguard Worker * 19-12-2002
64*495ae853SAndroid Build Coastguard Worker *
65*495ae853SAndroid Build Coastguard Worker * \author Sriram Sethuraman
66*495ae853SAndroid Build Coastguard Worker ***************************************************************************
67*495ae853SAndroid Build Coastguard Worker */
68*495ae853SAndroid Build Coastguard Worker
69*495ae853SAndroid Build Coastguard Worker /*!
70*495ae853SAndroid Build Coastguard Worker **************************************************************************
71*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_init_ref_bufs \endif
72*495ae853SAndroid Build Coastguard Worker *
73*495ae853SAndroid Build Coastguard Worker * \brief
74*495ae853SAndroid Build Coastguard Worker * Called at the start for initialization.
75*495ae853SAndroid Build Coastguard Worker *
76*495ae853SAndroid Build Coastguard Worker * \return
77*495ae853SAndroid Build Coastguard Worker * none
78*495ae853SAndroid Build Coastguard Worker **************************************************************************
79*495ae853SAndroid Build Coastguard Worker */
ih264d_init_ref_bufs(dpb_manager_t * ps_dpb_mgr)80*495ae853SAndroid Build Coastguard Worker void ih264d_init_ref_bufs(dpb_manager_t *ps_dpb_mgr)
81*495ae853SAndroid Build Coastguard Worker {
82*495ae853SAndroid Build Coastguard Worker UWORD32 i;
83*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
84*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_REF_BUFS; i++)
85*495ae853SAndroid Build Coastguard Worker {
86*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].u1_used_as_ref = UNUSED_FOR_REF;
87*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].u1_lt_idx = MAX_REF_BUFS + 1;
88*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].ps_prev_short = NULL;
89*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].ps_prev_long = NULL;
90*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].ps_pic_buf = NULL;
91*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_top_field.u1_reference_info = UNUSED_FOR_REF;
92*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_bot_field.u1_reference_info = UNUSED_FOR_REF;
93*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_top_field.u1_long_term_frame_idx = MAX_REF_BUFS + 1;
94*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_bot_field.u1_long_term_frame_idx = MAX_REF_BUFS + 1;
95*495ae853SAndroid Build Coastguard Worker
96*495ae853SAndroid Build Coastguard Worker }
97*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs = 0;
98*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_st_head = NULL;
99*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_ht_head = NULL;
100*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->i1_gaps_deleted = 0;
101*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->i1_poc_buf_id_entries = 0;
102*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_mmco_error_in_seq = 0;
103*495ae853SAndroid Build Coastguard Worker
104*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_gaps = 0;
105*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_FRAMES; i++)
106*495ae853SAndroid Build Coastguard Worker {
107*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
108*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
109*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai1_gaps_per_seq[i] = 0;
110*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[i][0] = -1;
111*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[i][1] = 0x7fffffff;
112*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[i][2] = 0;
113*495ae853SAndroid Build Coastguard Worker }
114*495ae853SAndroid Build Coastguard Worker
115*495ae853SAndroid Build Coastguard Worker }
116*495ae853SAndroid Build Coastguard Worker
ih264d_free_ref_pic_mv_bufs(void * pv_dec,UWORD8 pic_buf_id)117*495ae853SAndroid Build Coastguard Worker void ih264d_free_ref_pic_mv_bufs(void* pv_dec, UWORD8 pic_buf_id)
118*495ae853SAndroid Build Coastguard Worker {
119*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *)pv_dec;
120*495ae853SAndroid Build Coastguard Worker
121*495ae853SAndroid Build Coastguard Worker if((pic_buf_id == ps_dec->u1_pic_buf_id) &&
122*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->u1_field_pic_flag &&
123*495ae853SAndroid Build Coastguard Worker (ps_dec->u1_top_bottom_decoded == 0))
124*495ae853SAndroid Build Coastguard Worker {
125*495ae853SAndroid Build Coastguard Worker return;
126*495ae853SAndroid Build Coastguard Worker }
127*495ae853SAndroid Build Coastguard Worker
128*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
129*495ae853SAndroid Build Coastguard Worker pic_buf_id,
130*495ae853SAndroid Build Coastguard Worker BUF_MGR_REF);
131*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
132*495ae853SAndroid Build Coastguard Worker ps_dec->as_buf_id_info_map[pic_buf_id].mv_buf_id,
133*495ae853SAndroid Build Coastguard Worker BUF_MGR_REF);
134*495ae853SAndroid Build Coastguard Worker }
135*495ae853SAndroid Build Coastguard Worker /*!
136*495ae853SAndroid Build Coastguard Worker **************************************************************************
137*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_delete_lt_node \endif
138*495ae853SAndroid Build Coastguard Worker *
139*495ae853SAndroid Build Coastguard Worker * \brief
140*495ae853SAndroid Build Coastguard Worker * Delete a buffer with a long term index from the LT linked list
141*495ae853SAndroid Build Coastguard Worker *
142*495ae853SAndroid Build Coastguard Worker * \return
143*495ae853SAndroid Build Coastguard Worker * none
144*495ae853SAndroid Build Coastguard Worker **************************************************************************
145*495ae853SAndroid Build Coastguard Worker */
ih264d_delete_lt_node(dpb_manager_t * ps_dpb_mgr,UWORD32 u4_lt_idx,UWORD8 u1_fld_pic_flag,struct dpb_info_t * ps_lt_node_to_insert,WORD32 * pi4_status)146*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_delete_lt_node(dpb_manager_t *ps_dpb_mgr,
147*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lt_idx,
148*495ae853SAndroid Build Coastguard Worker UWORD8 u1_fld_pic_flag,
149*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_lt_node_to_insert,
150*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_status)
151*495ae853SAndroid Build Coastguard Worker {
152*495ae853SAndroid Build Coastguard Worker *pi4_status = 0;
153*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->u1_num_lt_ref_bufs > 0)
154*495ae853SAndroid Build Coastguard Worker {
155*495ae853SAndroid Build Coastguard Worker WORD32 i;
156*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_next_dpb;
157*495ae853SAndroid Build Coastguard Worker /* ps_unmark_node points to the node to be removed */
158*495ae853SAndroid Build Coastguard Worker /* from long term list. */
159*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_unmark_node;
160*495ae853SAndroid Build Coastguard Worker //Find the node with matching LTIndex
161*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
162*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->u1_lt_idx == u4_lt_idx)
163*495ae853SAndroid Build Coastguard Worker {
164*495ae853SAndroid Build Coastguard Worker ps_unmark_node = ps_next_dpb;
165*495ae853SAndroid Build Coastguard Worker }
166*495ae853SAndroid Build Coastguard Worker else
167*495ae853SAndroid Build Coastguard Worker {
168*495ae853SAndroid Build Coastguard Worker for(i = 1; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
169*495ae853SAndroid Build Coastguard Worker {
170*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->ps_prev_long->u1_lt_idx == u4_lt_idx)
171*495ae853SAndroid Build Coastguard Worker break;
172*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_long;
173*495ae853SAndroid Build Coastguard Worker }
174*495ae853SAndroid Build Coastguard Worker if(i == ps_dpb_mgr->u1_num_lt_ref_bufs)
175*495ae853SAndroid Build Coastguard Worker *pi4_status = 1;
176*495ae853SAndroid Build Coastguard Worker else
177*495ae853SAndroid Build Coastguard Worker ps_unmark_node = ps_next_dpb->ps_prev_long;
178*495ae853SAndroid Build Coastguard Worker }
179*495ae853SAndroid Build Coastguard Worker
180*495ae853SAndroid Build Coastguard Worker if(*pi4_status == 0)
181*495ae853SAndroid Build Coastguard Worker {
182*495ae853SAndroid Build Coastguard Worker if(u1_fld_pic_flag)
183*495ae853SAndroid Build Coastguard Worker {
184*495ae853SAndroid Build Coastguard Worker if(ps_lt_node_to_insert != ps_unmark_node)
185*495ae853SAndroid Build Coastguard Worker {
186*495ae853SAndroid Build Coastguard Worker UWORD8 u1_deleted = 0;
187*495ae853SAndroid Build Coastguard Worker /* for the ps_unmark_node mark the corresponding field */
188*495ae853SAndroid Build Coastguard Worker /* field as unused for reference */
189*495ae853SAndroid Build Coastguard Worker
190*495ae853SAndroid Build Coastguard Worker if(ps_unmark_node->s_top_field.u1_long_term_frame_idx
191*495ae853SAndroid Build Coastguard Worker == u4_lt_idx)
192*495ae853SAndroid Build Coastguard Worker {
193*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_top_field.u1_reference_info =
194*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
195*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_top_field.u1_long_term_frame_idx =
196*495ae853SAndroid Build Coastguard Worker MAX_REF_BUFS + 1;
197*495ae853SAndroid Build Coastguard Worker u1_deleted = 1;
198*495ae853SAndroid Build Coastguard Worker }
199*495ae853SAndroid Build Coastguard Worker if(ps_unmark_node->s_bot_field.u1_long_term_frame_idx
200*495ae853SAndroid Build Coastguard Worker == u4_lt_idx)
201*495ae853SAndroid Build Coastguard Worker {
202*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_bot_field.u1_reference_info =
203*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
204*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_bot_field.u1_long_term_frame_idx =
205*495ae853SAndroid Build Coastguard Worker MAX_REF_BUFS + 1;
206*495ae853SAndroid Build Coastguard Worker u1_deleted = 1;
207*495ae853SAndroid Build Coastguard Worker }
208*495ae853SAndroid Build Coastguard Worker
209*495ae853SAndroid Build Coastguard Worker if(!u1_deleted)
210*495ae853SAndroid Build Coastguard Worker {
211*495ae853SAndroid Build Coastguard Worker
212*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
213*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
214*495ae853SAndroid Build Coastguard Worker
215*495ae853SAndroid Build Coastguard Worker return i4_error_code;
216*495ae853SAndroid Build Coastguard Worker }
217*495ae853SAndroid Build Coastguard Worker }
218*495ae853SAndroid Build Coastguard Worker
219*495ae853SAndroid Build Coastguard Worker ps_unmark_node->u1_used_as_ref =
220*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_top_field.u1_reference_info
221*495ae853SAndroid Build Coastguard Worker | ps_unmark_node->s_bot_field.u1_reference_info;
222*495ae853SAndroid Build Coastguard Worker }
223*495ae853SAndroid Build Coastguard Worker else
224*495ae853SAndroid Build Coastguard Worker ps_unmark_node->u1_used_as_ref = UNUSED_FOR_REF;
225*495ae853SAndroid Build Coastguard Worker
226*495ae853SAndroid Build Coastguard Worker if(UNUSED_FOR_REF == ps_unmark_node->u1_used_as_ref)
227*495ae853SAndroid Build Coastguard Worker {
228*495ae853SAndroid Build Coastguard Worker if(ps_unmark_node == ps_dpb_mgr->ps_dpb_ht_head)
229*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_ht_head = ps_next_dpb->ps_prev_long;
230*495ae853SAndroid Build Coastguard Worker
231*495ae853SAndroid Build Coastguard Worker ps_unmark_node->u1_lt_idx = MAX_REF_BUFS + 1;
232*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_top_field.u1_reference_info =
233*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
234*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_bot_field.u1_reference_info =
235*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
236*495ae853SAndroid Build Coastguard Worker // Release the physical buffer
237*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
238*495ae853SAndroid Build Coastguard Worker ps_unmark_node->u1_buf_id);
239*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_long = ps_unmark_node->ps_prev_long; //update link
240*495ae853SAndroid Build Coastguard Worker ps_unmark_node->ps_prev_long = NULL;
241*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_lt_ref_bufs--; //decrement LT buf count
242*495ae853SAndroid Build Coastguard Worker }
243*495ae853SAndroid Build Coastguard Worker }
244*495ae853SAndroid Build Coastguard Worker }
245*495ae853SAndroid Build Coastguard Worker return OK;
246*495ae853SAndroid Build Coastguard Worker }
247*495ae853SAndroid Build Coastguard Worker
248*495ae853SAndroid Build Coastguard Worker /*!
249*495ae853SAndroid Build Coastguard Worker **************************************************************************
250*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_insert_lt_node \endif
251*495ae853SAndroid Build Coastguard Worker *
252*495ae853SAndroid Build Coastguard Worker * \brief
253*495ae853SAndroid Build Coastguard Worker * Insert a buffer into the LT linked list at a given LT index
254*495ae853SAndroid Build Coastguard Worker *
255*495ae853SAndroid Build Coastguard Worker * \return
256*495ae853SAndroid Build Coastguard Worker * none
257*495ae853SAndroid Build Coastguard Worker **************************************************************************
258*495ae853SAndroid Build Coastguard Worker */
ih264d_insert_lt_node(dpb_manager_t * ps_dpb_mgr,struct dpb_info_t * ps_mov_node,UWORD32 u4_lt_idx,UWORD8 u1_fld_pic_flag)259*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_insert_lt_node(dpb_manager_t *ps_dpb_mgr,
260*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_mov_node,
261*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lt_idx,
262*495ae853SAndroid Build Coastguard Worker UWORD8 u1_fld_pic_flag)
263*495ae853SAndroid Build Coastguard Worker {
264*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mark_top_field_long_term = 0;
265*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mark_bot_field_long_term = 0;
266*495ae853SAndroid Build Coastguard Worker
267*495ae853SAndroid Build Coastguard Worker {
268*495ae853SAndroid Build Coastguard Worker if(u1_fld_pic_flag)
269*495ae853SAndroid Build Coastguard Worker {
270*495ae853SAndroid Build Coastguard Worker /* Assign corresponding field (top or bottom) long_term_frame_idx */
271*495ae853SAndroid Build Coastguard Worker
272*495ae853SAndroid Build Coastguard Worker if((ps_mov_node->s_top_field.u1_reference_info == IS_LONG_TERM)
273*495ae853SAndroid Build Coastguard Worker && (ps_mov_node->s_bot_field.u1_reference_info
274*495ae853SAndroid Build Coastguard Worker == IS_LONG_TERM))
275*495ae853SAndroid Build Coastguard Worker {
276*495ae853SAndroid Build Coastguard Worker if(ps_mov_node->u1_lt_idx == u4_lt_idx)
277*495ae853SAndroid Build Coastguard Worker u1_mark_bot_field_long_term = 1;
278*495ae853SAndroid Build Coastguard Worker else
279*495ae853SAndroid Build Coastguard Worker {
280*495ae853SAndroid Build Coastguard Worker
281*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
282*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
283*495ae853SAndroid Build Coastguard Worker
284*495ae853SAndroid Build Coastguard Worker return i4_error_code;
285*495ae853SAndroid Build Coastguard Worker
286*495ae853SAndroid Build Coastguard Worker }
287*495ae853SAndroid Build Coastguard Worker }
288*495ae853SAndroid Build Coastguard Worker else if(ps_mov_node->s_top_field.u1_reference_info == IS_LONG_TERM)
289*495ae853SAndroid Build Coastguard Worker {
290*495ae853SAndroid Build Coastguard Worker u1_mark_top_field_long_term = 1;
291*495ae853SAndroid Build Coastguard Worker }
292*495ae853SAndroid Build Coastguard Worker
293*495ae853SAndroid Build Coastguard Worker if(!(u1_mark_top_field_long_term || u1_mark_bot_field_long_term))
294*495ae853SAndroid Build Coastguard Worker {
295*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
296*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
297*495ae853SAndroid Build Coastguard Worker return i4_error_code;
298*495ae853SAndroid Build Coastguard Worker }
299*495ae853SAndroid Build Coastguard Worker }
300*495ae853SAndroid Build Coastguard Worker else
301*495ae853SAndroid Build Coastguard Worker {
302*495ae853SAndroid Build Coastguard Worker ps_mov_node->s_top_field.u1_reference_info = IS_LONG_TERM;
303*495ae853SAndroid Build Coastguard Worker ps_mov_node->s_bot_field.u1_reference_info = IS_LONG_TERM;
304*495ae853SAndroid Build Coastguard Worker ps_mov_node->s_top_field.u1_long_term_frame_idx = u4_lt_idx;
305*495ae853SAndroid Build Coastguard Worker ps_mov_node->s_bot_field.u1_long_term_frame_idx = u4_lt_idx;
306*495ae853SAndroid Build Coastguard Worker u1_mark_bot_field_long_term = 1;
307*495ae853SAndroid Build Coastguard Worker u1_mark_top_field_long_term = 1;
308*495ae853SAndroid Build Coastguard Worker }
309*495ae853SAndroid Build Coastguard Worker
310*495ae853SAndroid Build Coastguard Worker ps_mov_node->u1_lt_idx = u4_lt_idx; //Assign the LT index to the node
311*495ae853SAndroid Build Coastguard Worker ps_mov_node->ps_pic_buf->u1_long_term_frm_idx = u4_lt_idx;
312*495ae853SAndroid Build Coastguard Worker ps_mov_node->u1_used_as_ref = IS_LONG_TERM;
313*495ae853SAndroid Build Coastguard Worker
314*495ae853SAndroid Build Coastguard Worker /* Insert the new long term in the LT list with u4_lt_idx */
315*495ae853SAndroid Build Coastguard Worker /* in ascending order. */
316*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->u1_num_lt_ref_bufs > 0)
317*495ae853SAndroid Build Coastguard Worker {
318*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
319*495ae853SAndroid Build Coastguard Worker if(u4_lt_idx < ps_next_dpb->u1_lt_idx)
320*495ae853SAndroid Build Coastguard Worker {
321*495ae853SAndroid Build Coastguard Worker //LTIndex to be inserted is the smallest LT index
322*495ae853SAndroid Build Coastguard Worker //Update head and point prev to the next higher index
323*495ae853SAndroid Build Coastguard Worker ps_mov_node->ps_prev_long = ps_next_dpb;
324*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_ht_head = ps_mov_node;
325*495ae853SAndroid Build Coastguard Worker }
326*495ae853SAndroid Build Coastguard Worker else
327*495ae853SAndroid Build Coastguard Worker {
328*495ae853SAndroid Build Coastguard Worker WORD32 i;
329*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_nxtDPB = ps_next_dpb;
330*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_long;
331*495ae853SAndroid Build Coastguard Worker for(i = 1; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
332*495ae853SAndroid Build Coastguard Worker {
333*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->u1_lt_idx > u4_lt_idx)
334*495ae853SAndroid Build Coastguard Worker break;
335*495ae853SAndroid Build Coastguard Worker ps_nxtDPB = ps_next_dpb;
336*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_long;
337*495ae853SAndroid Build Coastguard Worker }
338*495ae853SAndroid Build Coastguard Worker
339*495ae853SAndroid Build Coastguard Worker ps_nxtDPB->ps_prev_long = ps_mov_node;
340*495ae853SAndroid Build Coastguard Worker ps_mov_node->ps_prev_long = ps_next_dpb;
341*495ae853SAndroid Build Coastguard Worker }
342*495ae853SAndroid Build Coastguard Worker }
343*495ae853SAndroid Build Coastguard Worker else
344*495ae853SAndroid Build Coastguard Worker {
345*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_ht_head = ps_mov_node;
346*495ae853SAndroid Build Coastguard Worker ps_mov_node->ps_prev_long = NULL;
347*495ae853SAndroid Build Coastguard Worker }
348*495ae853SAndroid Build Coastguard Worker /* Identify the picture buffer as a long term picture buffer */
349*495ae853SAndroid Build Coastguard Worker ps_mov_node->ps_pic_buf->u1_is_short = 0;
350*495ae853SAndroid Build Coastguard Worker
351*495ae853SAndroid Build Coastguard Worker /* Increment LT buf count only if new LT node inserted */
352*495ae853SAndroid Build Coastguard Worker /* If Increment during top_field is done, don't increment */
353*495ae853SAndroid Build Coastguard Worker /* for bottom field, as both them are part of same pic. */
354*495ae853SAndroid Build Coastguard Worker if(u1_mark_bot_field_long_term)
355*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_lt_ref_bufs++;
356*495ae853SAndroid Build Coastguard Worker
357*495ae853SAndroid Build Coastguard Worker }
358*495ae853SAndroid Build Coastguard Worker return OK;
359*495ae853SAndroid Build Coastguard Worker }
360*495ae853SAndroid Build Coastguard Worker
361*495ae853SAndroid Build Coastguard Worker /*!
362*495ae853SAndroid Build Coastguard Worker **************************************************************************
363*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_insert_st_node \endif
364*495ae853SAndroid Build Coastguard Worker *
365*495ae853SAndroid Build Coastguard Worker * \brief
366*495ae853SAndroid Build Coastguard Worker * Adds a short term reference picture into the ST linked list
367*495ae853SAndroid Build Coastguard Worker *
368*495ae853SAndroid Build Coastguard Worker * \return
369*495ae853SAndroid Build Coastguard Worker * None
370*495ae853SAndroid Build Coastguard Worker *
371*495ae853SAndroid Build Coastguard Worker * \note
372*495ae853SAndroid Build Coastguard Worker * Called only for a new coded picture with nal_ref_idc!=0
373*495ae853SAndroid Build Coastguard Worker **************************************************************************
374*495ae853SAndroid Build Coastguard Worker */
ih264d_insert_st_node(dpb_manager_t * ps_dpb_mgr,struct pic_buffer_t * ps_pic_buf,UWORD8 u1_buf_id,UWORD32 u4_cur_pic_num)375*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_insert_st_node(dpb_manager_t *ps_dpb_mgr,
376*495ae853SAndroid Build Coastguard Worker struct pic_buffer_t *ps_pic_buf,
377*495ae853SAndroid Build Coastguard Worker UWORD8 u1_buf_id,
378*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_pic_num)
379*495ae853SAndroid Build Coastguard Worker {
380*495ae853SAndroid Build Coastguard Worker WORD32 i;
381*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
382*495ae853SAndroid Build Coastguard Worker UWORD8 u1_picture_type = ps_pic_buf->u1_picturetype;
383*495ae853SAndroid Build Coastguard Worker /* Find an unused dpb location */
384*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_REF_BUFS; i++)
385*495ae853SAndroid Build Coastguard Worker {
386*495ae853SAndroid Build Coastguard Worker if((ps_dpb_info[i].ps_pic_buf == ps_pic_buf)
387*495ae853SAndroid Build Coastguard Worker && ps_dpb_info[i].u1_used_as_ref)
388*495ae853SAndroid Build Coastguard Worker {
389*495ae853SAndroid Build Coastguard Worker /*signal an error in the case of frame pic*/
390*495ae853SAndroid Build Coastguard Worker if(ps_dpb_info[i].ps_pic_buf->u1_pic_type == FRM_PIC)
391*495ae853SAndroid Build Coastguard Worker {
392*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
393*495ae853SAndroid Build Coastguard Worker }
394*495ae853SAndroid Build Coastguard Worker else
395*495ae853SAndroid Build Coastguard Worker {
396*495ae853SAndroid Build Coastguard Worker /* Can occur only for field bottom pictures */
397*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
398*495ae853SAndroid Build Coastguard Worker return OK;
399*495ae853SAndroid Build Coastguard Worker }
400*495ae853SAndroid Build Coastguard Worker }
401*495ae853SAndroid Build Coastguard Worker
402*495ae853SAndroid Build Coastguard Worker if((ps_dpb_info[i].u1_used_as_ref == UNUSED_FOR_REF)
403*495ae853SAndroid Build Coastguard Worker && (ps_dpb_info[i].s_top_field.u1_reference_info
404*495ae853SAndroid Build Coastguard Worker == UNUSED_FOR_REF)
405*495ae853SAndroid Build Coastguard Worker && (ps_dpb_info[i].s_bot_field.u1_reference_info
406*495ae853SAndroid Build Coastguard Worker == UNUSED_FOR_REF))
407*495ae853SAndroid Build Coastguard Worker break;
408*495ae853SAndroid Build Coastguard Worker }
409*495ae853SAndroid Build Coastguard Worker if(i == MAX_REF_BUFS)
410*495ae853SAndroid Build Coastguard Worker {
411*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
412*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
413*495ae853SAndroid Build Coastguard Worker return i4_error_code;
414*495ae853SAndroid Build Coastguard Worker }
415*495ae853SAndroid Build Coastguard Worker
416*495ae853SAndroid Build Coastguard Worker /* Create dpb info */
417*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].ps_pic_buf = ps_pic_buf;
418*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].ps_prev_short = ps_dpb_mgr->ps_dpb_st_head;
419*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].u1_buf_id = u1_buf_id;
420*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].u1_used_as_ref = TRUE;
421*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].u1_lt_idx = MAX_REF_BUFS + 1;
422*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].i4_frame_num = u4_cur_pic_num;
423*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].ps_pic_buf->i4_frame_num = u4_cur_pic_num;
424*495ae853SAndroid Build Coastguard Worker
425*495ae853SAndroid Build Coastguard Worker /* update the head node of linked list to point to the cur Pic */
426*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_st_head = ps_dpb_info + i;
427*495ae853SAndroid Build Coastguard Worker
428*495ae853SAndroid Build Coastguard Worker // Increment Short term bufCount
429*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs++;
430*495ae853SAndroid Build Coastguard Worker /* Identify the picture as a short term picture buffer */
431*495ae853SAndroid Build Coastguard Worker ps_pic_buf->u1_is_short = IS_SHORT_TERM;
432*495ae853SAndroid Build Coastguard Worker
433*495ae853SAndroid Build Coastguard Worker if((u1_picture_type & 0x03) == FRM_PIC)
434*495ae853SAndroid Build Coastguard Worker {
435*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].u1_used_as_ref = IS_SHORT_TERM;
436*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_top_field.u1_reference_info = IS_SHORT_TERM;
437*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
438*495ae853SAndroid Build Coastguard Worker }
439*495ae853SAndroid Build Coastguard Worker
440*495ae853SAndroid Build Coastguard Worker if((u1_picture_type & 0x03) == TOP_FLD)
441*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_top_field.u1_reference_info = IS_SHORT_TERM;
442*495ae853SAndroid Build Coastguard Worker
443*495ae853SAndroid Build Coastguard Worker if((u1_picture_type & 0x03) == BOT_FLD)
444*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
445*495ae853SAndroid Build Coastguard Worker
446*495ae853SAndroid Build Coastguard Worker return OK;
447*495ae853SAndroid Build Coastguard Worker }
448*495ae853SAndroid Build Coastguard Worker
449*495ae853SAndroid Build Coastguard Worker /*!
450*495ae853SAndroid Build Coastguard Worker **************************************************************************
451*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_delete_st_node_or_make_lt \endif
452*495ae853SAndroid Build Coastguard Worker *
453*495ae853SAndroid Build Coastguard Worker * \brief
454*495ae853SAndroid Build Coastguard Worker * Delete short term ref with a given picNum from the ST linked list or
455*495ae853SAndroid Build Coastguard Worker * make it an LT node
456*495ae853SAndroid Build Coastguard Worker *
457*495ae853SAndroid Build Coastguard Worker * \return
458*495ae853SAndroid Build Coastguard Worker * 0 - if successful; -1 - otherwise
459*495ae853SAndroid Build Coastguard Worker *
460*495ae853SAndroid Build Coastguard Worker * \note
461*495ae853SAndroid Build Coastguard Worker * Common parts to MMCO==1 and MMCO==3 have been combined here
462*495ae853SAndroid Build Coastguard Worker **************************************************************************
463*495ae853SAndroid Build Coastguard Worker */
ih264d_delete_st_node_or_make_lt(dpb_manager_t * ps_dpb_mgr,WORD32 i4_pic_num,UWORD32 u4_lt_idx,UWORD8 u1_fld_pic_flag)464*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_delete_st_node_or_make_lt(dpb_manager_t *ps_dpb_mgr,
465*495ae853SAndroid Build Coastguard Worker WORD32 i4_pic_num,
466*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lt_idx,
467*495ae853SAndroid Build Coastguard Worker UWORD8 u1_fld_pic_flag)
468*495ae853SAndroid Build Coastguard Worker {
469*495ae853SAndroid Build Coastguard Worker WORD32 i;
470*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_next_dpb;
471*495ae853SAndroid Build Coastguard Worker WORD32 i4_frame_num = i4_pic_num;
472*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_unmark_node = NULL;
473*495ae853SAndroid Build Coastguard Worker UWORD8 u1_del_node = 0, u1_del_st = 0;
474*495ae853SAndroid Build Coastguard Worker UWORD8 u1_reference_type = UNUSED_FOR_REF;
475*495ae853SAndroid Build Coastguard Worker WORD32 ret;
476*495ae853SAndroid Build Coastguard Worker
477*495ae853SAndroid Build Coastguard Worker if(u1_fld_pic_flag)
478*495ae853SAndroid Build Coastguard Worker {
479*495ae853SAndroid Build Coastguard Worker i4_frame_num = i4_frame_num >> 1;
480*495ae853SAndroid Build Coastguard Worker
481*495ae853SAndroid Build Coastguard Worker if(u4_lt_idx == (MAX_REF_BUFS + 1))
482*495ae853SAndroid Build Coastguard Worker u1_reference_type = UNUSED_FOR_REF;
483*495ae853SAndroid Build Coastguard Worker else
484*495ae853SAndroid Build Coastguard Worker u1_reference_type = IS_LONG_TERM;
485*495ae853SAndroid Build Coastguard Worker }
486*495ae853SAndroid Build Coastguard Worker
487*495ae853SAndroid Build Coastguard Worker //Find the node with matching picNum
488*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
489*495ae853SAndroid Build Coastguard Worker if((WORD32)ps_next_dpb->i4_frame_num == i4_frame_num)
490*495ae853SAndroid Build Coastguard Worker {
491*495ae853SAndroid Build Coastguard Worker ps_unmark_node = ps_next_dpb;
492*495ae853SAndroid Build Coastguard Worker }
493*495ae853SAndroid Build Coastguard Worker else
494*495ae853SAndroid Build Coastguard Worker {
495*495ae853SAndroid Build Coastguard Worker for(i = 1; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
496*495ae853SAndroid Build Coastguard Worker {
497*495ae853SAndroid Build Coastguard Worker if((WORD32)ps_next_dpb->ps_prev_short->i4_frame_num == i4_frame_num)
498*495ae853SAndroid Build Coastguard Worker break;
499*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_short;
500*495ae853SAndroid Build Coastguard Worker }
501*495ae853SAndroid Build Coastguard Worker
502*495ae853SAndroid Build Coastguard Worker if(i == ps_dpb_mgr->u1_num_st_ref_bufs)
503*495ae853SAndroid Build Coastguard Worker {
504*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->u1_num_gaps)
505*495ae853SAndroid Build Coastguard Worker {
506*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_mmco(ps_dpb_mgr, i4_frame_num, &u1_del_st);
507*495ae853SAndroid Build Coastguard Worker if(ret != OK)
508*495ae853SAndroid Build Coastguard Worker return ret;
509*495ae853SAndroid Build Coastguard Worker }
510*495ae853SAndroid Build Coastguard Worker else
511*495ae853SAndroid Build Coastguard Worker {
512*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
513*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
514*495ae853SAndroid Build Coastguard Worker
515*495ae853SAndroid Build Coastguard Worker return i4_error_code;
516*495ae853SAndroid Build Coastguard Worker }
517*495ae853SAndroid Build Coastguard Worker
518*495ae853SAndroid Build Coastguard Worker if(u1_del_st)
519*495ae853SAndroid Build Coastguard Worker {
520*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
521*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
522*495ae853SAndroid Build Coastguard Worker return i4_error_code;
523*495ae853SAndroid Build Coastguard Worker }
524*495ae853SAndroid Build Coastguard Worker else
525*495ae853SAndroid Build Coastguard Worker {
526*495ae853SAndroid Build Coastguard Worker return 0;
527*495ae853SAndroid Build Coastguard Worker }
528*495ae853SAndroid Build Coastguard Worker }
529*495ae853SAndroid Build Coastguard Worker else
530*495ae853SAndroid Build Coastguard Worker ps_unmark_node = ps_next_dpb->ps_prev_short;
531*495ae853SAndroid Build Coastguard Worker }
532*495ae853SAndroid Build Coastguard Worker
533*495ae853SAndroid Build Coastguard Worker if(u1_fld_pic_flag)
534*495ae853SAndroid Build Coastguard Worker {
535*495ae853SAndroid Build Coastguard Worker /* Mark the corresponding field ( top or bot) as */
536*495ae853SAndroid Build Coastguard Worker /* UNUSED_FOR_REF or IS_LONG_TERM depending on */
537*495ae853SAndroid Build Coastguard Worker /* u1_reference_type. */
538*495ae853SAndroid Build Coastguard Worker if(ps_unmark_node->s_top_field.i4_pic_num == i4_pic_num)
539*495ae853SAndroid Build Coastguard Worker {
540*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_top_field.u1_reference_info = u1_reference_type;
541*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_top_field.u1_long_term_frame_idx = u4_lt_idx;
542*495ae853SAndroid Build Coastguard Worker {
543*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src = ps_unmark_node->ps_pic_buf->pu1_col_zero_flag;
544*495ae853SAndroid Build Coastguard Worker WORD32 i4_size = ((ps_dpb_mgr->u2_pic_wd
545*495ae853SAndroid Build Coastguard Worker * ps_dpb_mgr->u2_pic_ht) >> 5);
546*495ae853SAndroid Build Coastguard Worker /* memset the colocated zero u4_flag buffer */
547*495ae853SAndroid Build Coastguard Worker memset(pu1_src, 0, i4_size);
548*495ae853SAndroid Build Coastguard Worker }
549*495ae853SAndroid Build Coastguard Worker }
550*495ae853SAndroid Build Coastguard Worker
551*495ae853SAndroid Build Coastguard Worker else if(ps_unmark_node->s_bot_field.i4_pic_num == i4_pic_num)
552*495ae853SAndroid Build Coastguard Worker {
553*495ae853SAndroid Build Coastguard Worker
554*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_bot_field.u1_reference_info = u1_reference_type;
555*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_bot_field.u1_long_term_frame_idx = u4_lt_idx;
556*495ae853SAndroid Build Coastguard Worker {
557*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src =
558*495ae853SAndroid Build Coastguard Worker ps_unmark_node->ps_pic_buf->pu1_col_zero_flag
559*495ae853SAndroid Build Coastguard Worker + ((ps_dpb_mgr->u2_pic_wd
560*495ae853SAndroid Build Coastguard Worker * ps_dpb_mgr->u2_pic_ht)
561*495ae853SAndroid Build Coastguard Worker >> 5);
562*495ae853SAndroid Build Coastguard Worker WORD32 i4_size = ((ps_dpb_mgr->u2_pic_wd
563*495ae853SAndroid Build Coastguard Worker * ps_dpb_mgr->u2_pic_ht) >> 5);
564*495ae853SAndroid Build Coastguard Worker /* memset the colocated zero u4_flag buffer */
565*495ae853SAndroid Build Coastguard Worker memset(pu1_src, 0, i4_size);
566*495ae853SAndroid Build Coastguard Worker }
567*495ae853SAndroid Build Coastguard Worker }
568*495ae853SAndroid Build Coastguard Worker ps_unmark_node->u1_used_as_ref =
569*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_top_field.u1_reference_info
570*495ae853SAndroid Build Coastguard Worker | ps_unmark_node->s_bot_field.u1_reference_info;
571*495ae853SAndroid Build Coastguard Worker }
572*495ae853SAndroid Build Coastguard Worker else
573*495ae853SAndroid Build Coastguard Worker {
574*495ae853SAndroid Build Coastguard Worker ps_unmark_node->u1_used_as_ref = UNUSED_FOR_REF;
575*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_top_field.u1_reference_info = UNUSED_FOR_REF;
576*495ae853SAndroid Build Coastguard Worker ps_unmark_node->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
577*495ae853SAndroid Build Coastguard Worker
578*495ae853SAndroid Build Coastguard Worker {
579*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src = ps_unmark_node->ps_pic_buf->pu1_col_zero_flag;
580*495ae853SAndroid Build Coastguard Worker
581*495ae853SAndroid Build Coastguard Worker WORD32 i4_size = ((ps_dpb_mgr->u2_pic_wd
582*495ae853SAndroid Build Coastguard Worker * ps_dpb_mgr->u2_pic_ht) >> 4);
583*495ae853SAndroid Build Coastguard Worker /* memset the colocated zero u4_flag buffer */
584*495ae853SAndroid Build Coastguard Worker memset(pu1_src, 0, i4_size);
585*495ae853SAndroid Build Coastguard Worker }
586*495ae853SAndroid Build Coastguard Worker }
587*495ae853SAndroid Build Coastguard Worker
588*495ae853SAndroid Build Coastguard Worker if(!(ps_unmark_node->u1_used_as_ref & IS_SHORT_TERM))
589*495ae853SAndroid Build Coastguard Worker {
590*495ae853SAndroid Build Coastguard Worker if(ps_unmark_node == ps_dpb_mgr->ps_dpb_st_head)
591*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_st_head = ps_next_dpb->ps_prev_short;
592*495ae853SAndroid Build Coastguard Worker else
593*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short = ps_unmark_node->ps_prev_short; //update link
594*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs--; //decrement ST buf count
595*495ae853SAndroid Build Coastguard Worker u1_del_node = 1;
596*495ae853SAndroid Build Coastguard Worker }
597*495ae853SAndroid Build Coastguard Worker
598*495ae853SAndroid Build Coastguard Worker if(u4_lt_idx == MAX_REF_BUFS + 1)
599*495ae853SAndroid Build Coastguard Worker {
600*495ae853SAndroid Build Coastguard Worker if(u1_del_node)
601*495ae853SAndroid Build Coastguard Worker {
602*495ae853SAndroid Build Coastguard Worker // Release the physical buffer
603*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
604*495ae853SAndroid Build Coastguard Worker ps_unmark_node->u1_buf_id);
605*495ae853SAndroid Build Coastguard Worker ps_unmark_node->ps_prev_short = NULL;
606*495ae853SAndroid Build Coastguard Worker }
607*495ae853SAndroid Build Coastguard Worker }
608*495ae853SAndroid Build Coastguard Worker else
609*495ae853SAndroid Build Coastguard Worker {
610*495ae853SAndroid Build Coastguard Worker WORD32 i4_status;
611*495ae853SAndroid Build Coastguard Worker //If another node has the same LT index, delete that node
612*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_lt_node(ps_dpb_mgr, u4_lt_idx,
613*495ae853SAndroid Build Coastguard Worker u1_fld_pic_flag, ps_unmark_node, &i4_status);
614*495ae853SAndroid Build Coastguard Worker if(ret != OK)
615*495ae853SAndroid Build Coastguard Worker return ret;
616*495ae853SAndroid Build Coastguard Worker // Now insert the short term node as a long term node
617*495ae853SAndroid Build Coastguard Worker ret = ih264d_insert_lt_node(ps_dpb_mgr, ps_unmark_node, u4_lt_idx,
618*495ae853SAndroid Build Coastguard Worker u1_fld_pic_flag);
619*495ae853SAndroid Build Coastguard Worker if(ret != OK)
620*495ae853SAndroid Build Coastguard Worker return ret;
621*495ae853SAndroid Build Coastguard Worker }
622*495ae853SAndroid Build Coastguard Worker return OK;
623*495ae853SAndroid Build Coastguard Worker }
624*495ae853SAndroid Build Coastguard Worker /*!
625*495ae853SAndroid Build Coastguard Worker **************************************************************************
626*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_reset_ref_bufs \endif
627*495ae853SAndroid Build Coastguard Worker *
628*495ae853SAndroid Build Coastguard Worker * \brief
629*495ae853SAndroid Build Coastguard Worker * Called if MMCO==5/7 or on the first slice of an IDR picture
630*495ae853SAndroid Build Coastguard Worker *
631*495ae853SAndroid Build Coastguard Worker * \return
632*495ae853SAndroid Build Coastguard Worker * none
633*495ae853SAndroid Build Coastguard Worker **************************************************************************
634*495ae853SAndroid Build Coastguard Worker */
ih264d_reset_ref_bufs(dpb_manager_t * ps_dpb_mgr)635*495ae853SAndroid Build Coastguard Worker void ih264d_reset_ref_bufs(dpb_manager_t *ps_dpb_mgr)
636*495ae853SAndroid Build Coastguard Worker {
637*495ae853SAndroid Build Coastguard Worker WORD32 i;
638*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
639*495ae853SAndroid Build Coastguard Worker
640*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_REF_BUFS; i++)
641*495ae853SAndroid Build Coastguard Worker {
642*495ae853SAndroid Build Coastguard Worker if(ps_dpb_info[i].u1_used_as_ref)
643*495ae853SAndroid Build Coastguard Worker {
644*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].u1_used_as_ref = UNUSED_FOR_REF;
645*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].u1_lt_idx = MAX_REF_BUFS + 1;
646*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].ps_prev_short = NULL;
647*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].ps_prev_long = NULL;
648*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].ps_pic_buf = NULL;
649*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_top_field.u1_reference_info = UNUSED_FOR_REF;
650*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_bot_field.u1_reference_info = UNUSED_FOR_REF;
651*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_top_field.u1_long_term_frame_idx = MAX_REF_BUFS + 1;
652*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].s_bot_field.u1_long_term_frame_idx = MAX_REF_BUFS + 1;
653*495ae853SAndroid Build Coastguard Worker
654*495ae853SAndroid Build Coastguard Worker //Release physical buffer
655*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
656*495ae853SAndroid Build Coastguard Worker ps_dpb_info[i].u1_buf_id);
657*495ae853SAndroid Build Coastguard Worker }
658*495ae853SAndroid Build Coastguard Worker }
659*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs = 0;
660*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_st_head = NULL;
661*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_ht_head = NULL;
662*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_mmco_error_in_seq = 0;
663*495ae853SAndroid Build Coastguard Worker
664*495ae853SAndroid Build Coastguard Worker /* release all gaps */
665*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_gaps = 0;
666*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_FRAMES; i++)
667*495ae853SAndroid Build Coastguard Worker {
668*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
669*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
670*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai1_gaps_per_seq[i] = 0;
671*495ae853SAndroid Build Coastguard Worker }
672*495ae853SAndroid Build Coastguard Worker }
673*495ae853SAndroid Build Coastguard Worker
674*495ae853SAndroid Build Coastguard Worker /*!
675*495ae853SAndroid Build Coastguard Worker **************************************************************************
676*495ae853SAndroid Build Coastguard Worker * \if Function name : Name \endif
677*495ae853SAndroid Build Coastguard Worker *
678*495ae853SAndroid Build Coastguard Worker * \brief
679*495ae853SAndroid Build Coastguard Worker * create the default index list after an MMCO
680*495ae853SAndroid Build Coastguard Worker *
681*495ae853SAndroid Build Coastguard Worker * \return
682*495ae853SAndroid Build Coastguard Worker * 0 - if no_error; -1 - error
683*495ae853SAndroid Build Coastguard Worker *
684*495ae853SAndroid Build Coastguard Worker **************************************************************************
685*495ae853SAndroid Build Coastguard Worker */
ih264d_update_default_index_list(dpb_manager_t * ps_dpb_mgr)686*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_update_default_index_list(dpb_manager_t *ps_dpb_mgr)
687*495ae853SAndroid Build Coastguard Worker {
688*495ae853SAndroid Build Coastguard Worker WORD32 i;
689*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
690*495ae853SAndroid Build Coastguard Worker
691*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
692*495ae853SAndroid Build Coastguard Worker {
693*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_def_dpb[i] = ps_next_dpb->ps_pic_buf;
694*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_short;
695*495ae853SAndroid Build Coastguard Worker }
696*495ae853SAndroid Build Coastguard Worker
697*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
698*495ae853SAndroid Build Coastguard Worker for(;i< ps_dpb_mgr->u1_num_st_ref_bufs + ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
699*495ae853SAndroid Build Coastguard Worker {
700*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_def_dpb[i] = ps_next_dpb->ps_pic_buf;
701*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_long;
702*495ae853SAndroid Build Coastguard Worker }
703*495ae853SAndroid Build Coastguard Worker return 0;
704*495ae853SAndroid Build Coastguard Worker }
705*495ae853SAndroid Build Coastguard Worker
706*495ae853SAndroid Build Coastguard Worker /*!
707*495ae853SAndroid Build Coastguard Worker **************************************************************************
708*495ae853SAndroid Build Coastguard Worker * \if Function name : ref_idx_reordering \endif
709*495ae853SAndroid Build Coastguard Worker *
710*495ae853SAndroid Build Coastguard Worker * \brief
711*495ae853SAndroid Build Coastguard Worker * Parse the bitstream and reorder indices for the current slice
712*495ae853SAndroid Build Coastguard Worker *
713*495ae853SAndroid Build Coastguard Worker * \return
714*495ae853SAndroid Build Coastguard Worker * 0 - if no_error; -1 - error
715*495ae853SAndroid Build Coastguard Worker *
716*495ae853SAndroid Build Coastguard Worker * \note
717*495ae853SAndroid Build Coastguard Worker * Called only if ref_idx_reordering_flag_l0 is decoded as 1
718*495ae853SAndroid Build Coastguard Worker * Remove error checking for unmatching picNum or LTIndex later (if not needed)
719*495ae853SAndroid Build Coastguard Worker * \para
720*495ae853SAndroid Build Coastguard Worker * This section implements 7.3.3.1 and 8.2.6.4
721*495ae853SAndroid Build Coastguard Worker * Uses the default index list as the starting point and
722*495ae853SAndroid Build Coastguard Worker * remaps the picNums sent to the next higher index in the
723*495ae853SAndroid Build Coastguard Worker * modified list. The unmodified ones are copied from the
724*495ae853SAndroid Build Coastguard Worker * default to modified list retaining their order in the default list.
725*495ae853SAndroid Build Coastguard Worker *
726*495ae853SAndroid Build Coastguard Worker **************************************************************************
727*495ae853SAndroid Build Coastguard Worker */
ih264d_ref_idx_reordering(dec_struct_t * ps_dec,UWORD8 uc_lx)728*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_ref_idx_reordering(dec_struct_t *ps_dec, UWORD8 uc_lx)
729*495ae853SAndroid Build Coastguard Worker {
730*495ae853SAndroid Build Coastguard Worker dpb_manager_t *ps_dpb_mgr = ps_dec->ps_dpb_mgr;
731*495ae853SAndroid Build Coastguard Worker UWORD16 u4_cur_pic_num = ps_dec->ps_cur_slice->u2_frame_num;
732*495ae853SAndroid Build Coastguard Worker /*< Maximum Picture Number Minus 1 */
733*495ae853SAndroid Build Coastguard Worker UWORD32 ui_max_frame_num =
734*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->u2_u4_max_pic_num_minus1 + 1;
735*495ae853SAndroid Build Coastguard Worker
736*495ae853SAndroid Build Coastguard Worker WORD32 i, count = 0;
737*495ae853SAndroid Build Coastguard Worker UWORD32 ui_remapIdc, ui_nextUev;
738*495ae853SAndroid Build Coastguard Worker WORD16 u2_pred_frame_num = u4_cur_pic_num;
739*495ae853SAndroid Build Coastguard Worker WORD32 i_temp;
740*495ae853SAndroid Build Coastguard Worker UWORD16 u2_def_mod_flag = 0; /* Flag to keep track of which indices have been remapped */
741*495ae853SAndroid Build Coastguard Worker UWORD8 modCount = 0;
742*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
743*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
744*495ae853SAndroid Build Coastguard Worker dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
745*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
746*495ae853SAndroid Build Coastguard Worker
747*495ae853SAndroid Build Coastguard Worker if(u1_field_pic_flag)
748*495ae853SAndroid Build Coastguard Worker {
749*495ae853SAndroid Build Coastguard Worker u4_cur_pic_num = u4_cur_pic_num * 2 + 1;
750*495ae853SAndroid Build Coastguard Worker ui_max_frame_num = ui_max_frame_num * 2;
751*495ae853SAndroid Build Coastguard Worker }
752*495ae853SAndroid Build Coastguard Worker
753*495ae853SAndroid Build Coastguard Worker u2_pred_frame_num = u4_cur_pic_num;
754*495ae853SAndroid Build Coastguard Worker
755*495ae853SAndroid Build Coastguard Worker ui_remapIdc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
756*495ae853SAndroid Build Coastguard Worker
757*495ae853SAndroid Build Coastguard Worker while((ui_remapIdc != 3)
758*495ae853SAndroid Build Coastguard Worker && (count < ps_cur_slice->u1_num_ref_idx_lx_active[uc_lx]))
759*495ae853SAndroid Build Coastguard Worker {
760*495ae853SAndroid Build Coastguard Worker ui_nextUev = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
761*495ae853SAndroid Build Coastguard Worker if(ui_remapIdc != 2)
762*495ae853SAndroid Build Coastguard Worker {
763*495ae853SAndroid Build Coastguard Worker if(ui_nextUev > ui_max_frame_num)
764*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
765*495ae853SAndroid Build Coastguard Worker
766*495ae853SAndroid Build Coastguard Worker ui_nextUev = ui_nextUev + 1;
767*495ae853SAndroid Build Coastguard Worker
768*495ae853SAndroid Build Coastguard Worker if(ui_remapIdc == 0)
769*495ae853SAndroid Build Coastguard Worker {
770*495ae853SAndroid Build Coastguard Worker // diffPicNum is -ve
771*495ae853SAndroid Build Coastguard Worker i_temp = (WORD32)u2_pred_frame_num - (WORD32)ui_nextUev;
772*495ae853SAndroid Build Coastguard Worker if(i_temp < 0)
773*495ae853SAndroid Build Coastguard Worker i_temp += ui_max_frame_num;
774*495ae853SAndroid Build Coastguard Worker }
775*495ae853SAndroid Build Coastguard Worker else
776*495ae853SAndroid Build Coastguard Worker {
777*495ae853SAndroid Build Coastguard Worker // diffPicNum is +ve
778*495ae853SAndroid Build Coastguard Worker i_temp = (WORD32)u2_pred_frame_num + (WORD32)ui_nextUev;
779*495ae853SAndroid Build Coastguard Worker if(i_temp >= (WORD32)ui_max_frame_num)
780*495ae853SAndroid Build Coastguard Worker i_temp -= ui_max_frame_num;
781*495ae853SAndroid Build Coastguard Worker }
782*495ae853SAndroid Build Coastguard Worker /* Find the dpb with the matching picNum (picNum==frameNum for framePic) */
783*495ae853SAndroid Build Coastguard Worker
784*495ae853SAndroid Build Coastguard Worker if(i_temp > u4_cur_pic_num)
785*495ae853SAndroid Build Coastguard Worker i_temp = i_temp - ui_max_frame_num;
786*495ae853SAndroid Build Coastguard Worker
787*495ae853SAndroid Build Coastguard Worker for(i = 0; i < (ps_cur_slice->u1_initial_list_size[uc_lx]); i++)
788*495ae853SAndroid Build Coastguard Worker {
789*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->ps_init_dpb[uc_lx][i]->i4_pic_num == i_temp)
790*495ae853SAndroid Build Coastguard Worker break;
791*495ae853SAndroid Build Coastguard Worker }
792*495ae853SAndroid Build Coastguard Worker if(i == (ps_cur_slice->u1_initial_list_size[uc_lx]))
793*495ae853SAndroid Build Coastguard Worker {
794*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
795*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
796*495ae853SAndroid Build Coastguard Worker return i4_error_code;
797*495ae853SAndroid Build Coastguard Worker }
798*495ae853SAndroid Build Coastguard Worker
799*495ae853SAndroid Build Coastguard Worker u2_def_mod_flag |= (1 << i);
800*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_mod_dpb[uc_lx][modCount++] =
801*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_init_dpb[uc_lx][i];
802*495ae853SAndroid Build Coastguard Worker u2_pred_frame_num = i_temp; //update predictor to be the picNum just obtained
803*495ae853SAndroid Build Coastguard Worker }
804*495ae853SAndroid Build Coastguard Worker else //2
805*495ae853SAndroid Build Coastguard Worker {
806*495ae853SAndroid Build Coastguard Worker UWORD8 u1_lt_idx;
807*495ae853SAndroid Build Coastguard Worker
808*495ae853SAndroid Build Coastguard Worker if(ui_nextUev > (MAX_REF_BUFS + 1))
809*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
810*495ae853SAndroid Build Coastguard Worker
811*495ae853SAndroid Build Coastguard Worker u1_lt_idx = (UWORD8)ui_nextUev;
812*495ae853SAndroid Build Coastguard Worker
813*495ae853SAndroid Build Coastguard Worker for(i = 0; i < (ps_cur_slice->u1_initial_list_size[uc_lx]); i++)
814*495ae853SAndroid Build Coastguard Worker {
815*495ae853SAndroid Build Coastguard Worker if(!ps_dpb_mgr->ps_init_dpb[uc_lx][i]->u1_is_short)
816*495ae853SAndroid Build Coastguard Worker {
817*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->ps_init_dpb[uc_lx][i]->u1_long_term_pic_num
818*495ae853SAndroid Build Coastguard Worker == u1_lt_idx)
819*495ae853SAndroid Build Coastguard Worker break;
820*495ae853SAndroid Build Coastguard Worker }
821*495ae853SAndroid Build Coastguard Worker }
822*495ae853SAndroid Build Coastguard Worker if(i == (ps_cur_slice->u1_initial_list_size[uc_lx]))
823*495ae853SAndroid Build Coastguard Worker {
824*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
825*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
826*495ae853SAndroid Build Coastguard Worker return i4_error_code;
827*495ae853SAndroid Build Coastguard Worker }
828*495ae853SAndroid Build Coastguard Worker
829*495ae853SAndroid Build Coastguard Worker u2_def_mod_flag |= (1 << i);
830*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_mod_dpb[uc_lx][modCount++] =
831*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_init_dpb[uc_lx][i];
832*495ae853SAndroid Build Coastguard Worker }
833*495ae853SAndroid Build Coastguard Worker
834*495ae853SAndroid Build Coastguard Worker ui_remapIdc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
835*495ae853SAndroid Build Coastguard Worker /* Get the remapping_idc - 0/1/2/3 */
836*495ae853SAndroid Build Coastguard Worker count++;
837*495ae853SAndroid Build Coastguard Worker }
838*495ae853SAndroid Build Coastguard Worker
839*495ae853SAndroid Build Coastguard Worker //Handle the ref indices that were not remapped
840*495ae853SAndroid Build Coastguard Worker for(i = 0; i < (ps_cur_slice->u1_num_ref_idx_lx_active[uc_lx]); i++)
841*495ae853SAndroid Build Coastguard Worker {
842*495ae853SAndroid Build Coastguard Worker if(!(u2_def_mod_flag & (1 << i)))
843*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_mod_dpb[uc_lx][modCount++] =
844*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_init_dpb[uc_lx][i];
845*495ae853SAndroid Build Coastguard Worker }
846*495ae853SAndroid Build Coastguard Worker return OK;
847*495ae853SAndroid Build Coastguard Worker }
848*495ae853SAndroid Build Coastguard Worker /*!
849*495ae853SAndroid Build Coastguard Worker **************************************************************************
850*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_read_mmco_commands \endif
851*495ae853SAndroid Build Coastguard Worker *
852*495ae853SAndroid Build Coastguard Worker * \brief
853*495ae853SAndroid Build Coastguard Worker * Parses MMCO commands and stores them in a structure for later use.
854*495ae853SAndroid Build Coastguard Worker *
855*495ae853SAndroid Build Coastguard Worker * \return
856*495ae853SAndroid Build Coastguard Worker * 0 - No error; -1 - Error
857*495ae853SAndroid Build Coastguard Worker *
858*495ae853SAndroid Build Coastguard Worker * \note
859*495ae853SAndroid Build Coastguard Worker * This function stores MMCO commands in structure only for the first time.
860*495ae853SAndroid Build Coastguard Worker * In case of MMCO commands being issued for same Picture Number, they are
861*495ae853SAndroid Build Coastguard Worker * just parsed and not stored them in the structure.
862*495ae853SAndroid Build Coastguard Worker *
863*495ae853SAndroid Build Coastguard Worker **************************************************************************
864*495ae853SAndroid Build Coastguard Worker */
ih264d_read_mmco_commands(struct _DecStruct * ps_dec)865*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_read_mmco_commands(struct _DecStruct * ps_dec)
866*495ae853SAndroid Build Coastguard Worker {
867*495ae853SAndroid Build Coastguard Worker dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
868*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_sps = ps_pps->ps_sps;
869*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
870*495ae853SAndroid Build Coastguard Worker dpb_commands_t *ps_dpb_cmds = &(ps_dec->s_dpb_cmds_scratch);
871*495ae853SAndroid Build Coastguard Worker dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
872*495ae853SAndroid Build Coastguard Worker WORD32 j;
873*495ae853SAndroid Build Coastguard Worker UWORD8 u1_buf_mode;
874*495ae853SAndroid Build Coastguard Worker struct MMCParams *ps_mmc_params;
875*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
876*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
877*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bit_ofst = ps_dec->ps_bitstrm->u4_ofst;
878*495ae853SAndroid Build Coastguard Worker
879*495ae853SAndroid Build Coastguard Worker ps_slice->u1_mmco_equalto5 = 0;
880*495ae853SAndroid Build Coastguard Worker {
881*495ae853SAndroid Build Coastguard Worker if(ps_dec->u1_nal_unit_type == IDR_SLICE_NAL)
882*495ae853SAndroid Build Coastguard Worker {
883*495ae853SAndroid Build Coastguard Worker ps_slice->u1_no_output_of_prior_pics_flag =
884*495ae853SAndroid Build Coastguard Worker ih264d_get_bit_h264(ps_bitstrm);
885*495ae853SAndroid Build Coastguard Worker COPYTHECONTEXT("SH: no_output_of_prior_pics_flag",
886*495ae853SAndroid Build Coastguard Worker ps_slice->u1_no_output_of_prior_pics_flag);
887*495ae853SAndroid Build Coastguard Worker ps_slice->u1_long_term_reference_flag = ih264d_get_bit_h264(
888*495ae853SAndroid Build Coastguard Worker ps_bitstrm);
889*495ae853SAndroid Build Coastguard Worker COPYTHECONTEXT("SH: long_term_reference_flag",
890*495ae853SAndroid Build Coastguard Worker ps_slice->u1_long_term_reference_flag);
891*495ae853SAndroid Build Coastguard Worker ps_dpb_cmds->u1_idr_pic = 1;
892*495ae853SAndroid Build Coastguard Worker ps_dpb_cmds->u1_no_output_of_prior_pics_flag =
893*495ae853SAndroid Build Coastguard Worker ps_slice->u1_no_output_of_prior_pics_flag;
894*495ae853SAndroid Build Coastguard Worker ps_dpb_cmds->u1_long_term_reference_flag =
895*495ae853SAndroid Build Coastguard Worker ps_slice->u1_long_term_reference_flag;
896*495ae853SAndroid Build Coastguard Worker }
897*495ae853SAndroid Build Coastguard Worker else
898*495ae853SAndroid Build Coastguard Worker {
899*495ae853SAndroid Build Coastguard Worker u1_buf_mode = ih264d_get_bit_h264(ps_bitstrm); //0 - sliding window; 1 - arbitrary
900*495ae853SAndroid Build Coastguard Worker COPYTHECONTEXT("SH: adaptive_ref_pic_buffering_flag", u1_buf_mode);
901*495ae853SAndroid Build Coastguard Worker ps_dpb_cmds->u1_buf_mode = u1_buf_mode;
902*495ae853SAndroid Build Coastguard Worker j = 0;
903*495ae853SAndroid Build Coastguard Worker
904*495ae853SAndroid Build Coastguard Worker if(u1_buf_mode == 1)
905*495ae853SAndroid Build Coastguard Worker {
906*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mmco;
907*495ae853SAndroid Build Coastguard Worker UWORD32 u4_diff_pic_num;
908*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lt_idx, u4_max_lt_idx_plus1;
909*495ae853SAndroid Build Coastguard Worker
910*495ae853SAndroid Build Coastguard Worker u4_mmco = ih264d_uev(pu4_bitstrm_ofst,
911*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
912*495ae853SAndroid Build Coastguard Worker while(u4_mmco != END_OF_MMCO)
913*495ae853SAndroid Build Coastguard Worker {
914*495ae853SAndroid Build Coastguard Worker if (j >= MAX_REF_BUFS)
915*495ae853SAndroid Build Coastguard Worker {
916*495ae853SAndroid Build Coastguard Worker #ifdef __ANDROID__
917*495ae853SAndroid Build Coastguard Worker ALOGE("b/25818142");
918*495ae853SAndroid Build Coastguard Worker android_errorWriteLog(0x534e4554, "25818142");
919*495ae853SAndroid Build Coastguard Worker #endif
920*495ae853SAndroid Build Coastguard Worker ps_dpb_cmds->u1_num_of_commands = 0;
921*495ae853SAndroid Build Coastguard Worker return -1;
922*495ae853SAndroid Build Coastguard Worker }
923*495ae853SAndroid Build Coastguard Worker ps_mmc_params = &ps_dpb_cmds->as_mmc_params[j];
924*495ae853SAndroid Build Coastguard Worker ps_mmc_params->u4_mmco = u4_mmco;
925*495ae853SAndroid Build Coastguard Worker switch(u4_mmco)
926*495ae853SAndroid Build Coastguard Worker {
927*495ae853SAndroid Build Coastguard Worker case MARK_ST_PICNUM_AS_NONREF:
928*495ae853SAndroid Build Coastguard Worker u4_diff_pic_num = ih264d_uev(pu4_bitstrm_ofst,
929*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
930*495ae853SAndroid Build Coastguard Worker //Get absDiffPicnumMinus1
931*495ae853SAndroid Build Coastguard Worker ps_mmc_params->u4_diff_pic_num = u4_diff_pic_num;
932*495ae853SAndroid Build Coastguard Worker break;
933*495ae853SAndroid Build Coastguard Worker
934*495ae853SAndroid Build Coastguard Worker case MARK_LT_INDEX_AS_NONREF:
935*495ae853SAndroid Build Coastguard Worker u4_lt_idx = ih264d_uev(pu4_bitstrm_ofst,
936*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
937*495ae853SAndroid Build Coastguard Worker ps_mmc_params->u4_lt_idx = u4_lt_idx;
938*495ae853SAndroid Build Coastguard Worker break;
939*495ae853SAndroid Build Coastguard Worker
940*495ae853SAndroid Build Coastguard Worker case MARK_ST_PICNUM_AS_LT_INDEX:
941*495ae853SAndroid Build Coastguard Worker u4_diff_pic_num = ih264d_uev(pu4_bitstrm_ofst,
942*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
943*495ae853SAndroid Build Coastguard Worker ps_mmc_params->u4_diff_pic_num = u4_diff_pic_num;
944*495ae853SAndroid Build Coastguard Worker u4_lt_idx = ih264d_uev(pu4_bitstrm_ofst,
945*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
946*495ae853SAndroid Build Coastguard Worker ps_mmc_params->u4_lt_idx = u4_lt_idx;
947*495ae853SAndroid Build Coastguard Worker break;
948*495ae853SAndroid Build Coastguard Worker
949*495ae853SAndroid Build Coastguard Worker case SET_MAX_LT_INDEX:
950*495ae853SAndroid Build Coastguard Worker {
951*495ae853SAndroid Build Coastguard Worker u4_max_lt_idx_plus1 = ih264d_uev(pu4_bitstrm_ofst,
952*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
953*495ae853SAndroid Build Coastguard Worker if (u4_max_lt_idx_plus1 > ps_sps->u1_num_ref_frames)
954*495ae853SAndroid Build Coastguard Worker {
955*495ae853SAndroid Build Coastguard Worker /* Invalid max LT ref index */
956*495ae853SAndroid Build Coastguard Worker return -1;
957*495ae853SAndroid Build Coastguard Worker }
958*495ae853SAndroid Build Coastguard Worker ps_mmc_params->u4_max_lt_idx_plus1 = u4_max_lt_idx_plus1;
959*495ae853SAndroid Build Coastguard Worker break;
960*495ae853SAndroid Build Coastguard Worker }
961*495ae853SAndroid Build Coastguard Worker case RESET_REF_PICTURES:
962*495ae853SAndroid Build Coastguard Worker {
963*495ae853SAndroid Build Coastguard Worker ps_slice->u1_mmco_equalto5 = 1;
964*495ae853SAndroid Build Coastguard Worker break;
965*495ae853SAndroid Build Coastguard Worker }
966*495ae853SAndroid Build Coastguard Worker
967*495ae853SAndroid Build Coastguard Worker case SET_LT_INDEX:
968*495ae853SAndroid Build Coastguard Worker u4_lt_idx = ih264d_uev(pu4_bitstrm_ofst,
969*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
970*495ae853SAndroid Build Coastguard Worker ps_mmc_params->u4_lt_idx = u4_lt_idx;
971*495ae853SAndroid Build Coastguard Worker break;
972*495ae853SAndroid Build Coastguard Worker
973*495ae853SAndroid Build Coastguard Worker default:
974*495ae853SAndroid Build Coastguard Worker break;
975*495ae853SAndroid Build Coastguard Worker }
976*495ae853SAndroid Build Coastguard Worker u4_mmco = ih264d_uev(pu4_bitstrm_ofst,
977*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
978*495ae853SAndroid Build Coastguard Worker
979*495ae853SAndroid Build Coastguard Worker j++;
980*495ae853SAndroid Build Coastguard Worker }
981*495ae853SAndroid Build Coastguard Worker ps_dpb_cmds->u1_num_of_commands = j;
982*495ae853SAndroid Build Coastguard Worker }
983*495ae853SAndroid Build Coastguard Worker }
984*495ae853SAndroid Build Coastguard Worker ps_dpb_cmds->u1_dpb_commands_read = 1;
985*495ae853SAndroid Build Coastguard Worker ps_dpb_cmds->u1_dpb_commands_read_slc = 1;
986*495ae853SAndroid Build Coastguard Worker
987*495ae853SAndroid Build Coastguard Worker }
988*495ae853SAndroid Build Coastguard Worker u4_bit_ofst = ps_dec->ps_bitstrm->u4_ofst - u4_bit_ofst;
989*495ae853SAndroid Build Coastguard Worker return u4_bit_ofst;
990*495ae853SAndroid Build Coastguard Worker }
991*495ae853SAndroid Build Coastguard Worker
992*495ae853SAndroid Build Coastguard Worker /*!
993*495ae853SAndroid Build Coastguard Worker **************************************************************************
994*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_do_mmco_buffer \endif
995*495ae853SAndroid Build Coastguard Worker *
996*495ae853SAndroid Build Coastguard Worker * \brief
997*495ae853SAndroid Build Coastguard Worker * Perform decoded picture buffer memory management control operations
998*495ae853SAndroid Build Coastguard Worker *
999*495ae853SAndroid Build Coastguard Worker * \return
1000*495ae853SAndroid Build Coastguard Worker * 0 - No error; -1 - Error
1001*495ae853SAndroid Build Coastguard Worker *
1002*495ae853SAndroid Build Coastguard Worker * \note
1003*495ae853SAndroid Build Coastguard Worker * Bitstream is also parsed here to get the MMCOs
1004*495ae853SAndroid Build Coastguard Worker *
1005*495ae853SAndroid Build Coastguard Worker **************************************************************************
1006*495ae853SAndroid Build Coastguard Worker */
ih264d_do_mmco_buffer(dpb_commands_t * ps_dpb_cmds,dpb_manager_t * ps_dpb_mgr,UWORD8 u1_numRef_frames_for_seq,UWORD32 u4_cur_pic_num,UWORD32 u2_u4_max_pic_num_minus1,UWORD8 u1_nal_unit_type,struct pic_buffer_t * ps_pic_buf,UWORD8 u1_buf_id,UWORD8 u1_fld_pic_flag,UWORD8 u1_curr_pic_in_err)1007*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_do_mmco_buffer(dpb_commands_t *ps_dpb_cmds,
1008*495ae853SAndroid Build Coastguard Worker dpb_manager_t *ps_dpb_mgr,
1009*495ae853SAndroid Build Coastguard Worker UWORD8 u1_numRef_frames_for_seq, /*!< num_ref_frames from active SeqParSet*/
1010*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_pic_num,
1011*495ae853SAndroid Build Coastguard Worker UWORD32 u2_u4_max_pic_num_minus1,
1012*495ae853SAndroid Build Coastguard Worker UWORD8 u1_nal_unit_type,
1013*495ae853SAndroid Build Coastguard Worker struct pic_buffer_t *ps_pic_buf,
1014*495ae853SAndroid Build Coastguard Worker UWORD8 u1_buf_id,
1015*495ae853SAndroid Build Coastguard Worker UWORD8 u1_fld_pic_flag,
1016*495ae853SAndroid Build Coastguard Worker UWORD8 u1_curr_pic_in_err)
1017*495ae853SAndroid Build Coastguard Worker {
1018*495ae853SAndroid Build Coastguard Worker WORD32 i;
1019*495ae853SAndroid Build Coastguard Worker UWORD8 u1_buf_mode, u1_marked_lt;
1020*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_next_dpb;
1021*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_gaps;
1022*495ae853SAndroid Build Coastguard Worker UWORD8 u1_del_node = 1;
1023*495ae853SAndroid Build Coastguard Worker UWORD8 u1_insert_st_pic = 1;
1024*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1025*495ae853SAndroid Build Coastguard Worker UNUSED(u1_nal_unit_type);
1026*495ae853SAndroid Build Coastguard Worker UNUSED(u2_u4_max_pic_num_minus1);
1027*495ae853SAndroid Build Coastguard Worker u1_buf_mode = ps_dpb_cmds->u1_buf_mode; //0 - sliding window; 1 - Adaptive
1028*495ae853SAndroid Build Coastguard Worker u1_marked_lt = 0;
1029*495ae853SAndroid Build Coastguard Worker u1_num_gaps = ps_dpb_mgr->u1_num_gaps;
1030*495ae853SAndroid Build Coastguard Worker
1031*495ae853SAndroid Build Coastguard Worker if(!u1_buf_mode)
1032*495ae853SAndroid Build Coastguard Worker {
1033*495ae853SAndroid Build Coastguard Worker //Sliding window - implements 8.2.5.3
1034*495ae853SAndroid Build Coastguard Worker if((ps_dpb_mgr->u1_num_st_ref_bufs
1035*495ae853SAndroid Build Coastguard Worker + ps_dpb_mgr->u1_num_lt_ref_bufs + u1_num_gaps)
1036*495ae853SAndroid Build Coastguard Worker == u1_numRef_frames_for_seq)
1037*495ae853SAndroid Build Coastguard Worker {
1038*495ae853SAndroid Build Coastguard Worker UWORD8 u1_new_node_flag = 1;
1039*495ae853SAndroid Build Coastguard Worker if((0 == ps_dpb_mgr->u1_num_st_ref_bufs) && (0 == u1_num_gaps))
1040*495ae853SAndroid Build Coastguard Worker {
1041*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1042*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1043*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1044*495ae853SAndroid Build Coastguard Worker }
1045*495ae853SAndroid Build Coastguard Worker
1046*495ae853SAndroid Build Coastguard Worker // Chase the links to reach the last but one picNum, if available
1047*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1048*495ae853SAndroid Build Coastguard Worker
1049*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->u1_num_st_ref_bufs > 1)
1050*495ae853SAndroid Build Coastguard Worker {
1051*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->i4_frame_num == (WORD32)u4_cur_pic_num)
1052*495ae853SAndroid Build Coastguard Worker {
1053*495ae853SAndroid Build Coastguard Worker /* Incase of filed pictures top_field has been allocated */
1054*495ae853SAndroid Build Coastguard Worker /* picture buffer and complementary bottom field pair comes */
1055*495ae853SAndroid Build Coastguard Worker /* then the sliding window mechanism should not allocate a */
1056*495ae853SAndroid Build Coastguard Worker /* new node */
1057*495ae853SAndroid Build Coastguard Worker u1_new_node_flag = 0;
1058*495ae853SAndroid Build Coastguard Worker }
1059*495ae853SAndroid Build Coastguard Worker
1060*495ae853SAndroid Build Coastguard Worker for(i = 1; i < (ps_dpb_mgr->u1_num_st_ref_bufs - 1); i++)
1061*495ae853SAndroid Build Coastguard Worker {
1062*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb == NULL)
1063*495ae853SAndroid Build Coastguard Worker {
1064*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1065*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1066*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1067*495ae853SAndroid Build Coastguard Worker }
1068*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->i4_frame_num == (WORD32)u4_cur_pic_num)
1069*495ae853SAndroid Build Coastguard Worker {
1070*495ae853SAndroid Build Coastguard Worker /* Incase of field pictures top_field has been allocated */
1071*495ae853SAndroid Build Coastguard Worker /* picture buffer and complementary bottom field pair comes */
1072*495ae853SAndroid Build Coastguard Worker /* then the sliding window mechanism should not allocate a */
1073*495ae853SAndroid Build Coastguard Worker /* new node */
1074*495ae853SAndroid Build Coastguard Worker u1_new_node_flag = 0;
1075*495ae853SAndroid Build Coastguard Worker }
1076*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_short;
1077*495ae853SAndroid Build Coastguard Worker }
1078*495ae853SAndroid Build Coastguard Worker
1079*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->ps_prev_short->ps_prev_short != NULL)
1080*495ae853SAndroid Build Coastguard Worker {
1081*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1082*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1083*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1084*495ae853SAndroid Build Coastguard Worker }
1085*495ae853SAndroid Build Coastguard Worker
1086*495ae853SAndroid Build Coastguard Worker if(u1_new_node_flag)
1087*495ae853SAndroid Build Coastguard Worker {
1088*495ae853SAndroid Build Coastguard Worker if(u1_num_gaps)
1089*495ae853SAndroid Build Coastguard Worker {
1090*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1091*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->i4_frame_num,
1092*495ae853SAndroid Build Coastguard Worker &u1_del_node);
1093*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1094*495ae853SAndroid Build Coastguard Worker return ret;
1095*495ae853SAndroid Build Coastguard Worker }
1096*495ae853SAndroid Build Coastguard Worker
1097*495ae853SAndroid Build Coastguard Worker if(u1_del_node)
1098*495ae853SAndroid Build Coastguard Worker {
1099*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs--;
1100*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->u1_used_as_ref =
1101*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1102*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->s_top_field.u1_reference_info =
1103*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1104*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->s_bot_field.u1_reference_info =
1105*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1106*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1107*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->u1_buf_id);
1108*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->ps_pic_buf = NULL;
1109*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short = NULL;
1110*495ae853SAndroid Build Coastguard Worker }
1111*495ae853SAndroid Build Coastguard Worker }
1112*495ae853SAndroid Build Coastguard Worker }
1113*495ae853SAndroid Build Coastguard Worker else
1114*495ae853SAndroid Build Coastguard Worker {
1115*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->u1_num_st_ref_bufs)
1116*495ae853SAndroid Build Coastguard Worker {
1117*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1118*495ae853SAndroid Build Coastguard Worker ps_next_dpb->i4_frame_num,
1119*495ae853SAndroid Build Coastguard Worker &u1_del_node);
1120*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1121*495ae853SAndroid Build Coastguard Worker return ret;
1122*495ae853SAndroid Build Coastguard Worker if((ps_next_dpb->i4_frame_num != (WORD32)u4_cur_pic_num)
1123*495ae853SAndroid Build Coastguard Worker && u1_del_node)
1124*495ae853SAndroid Build Coastguard Worker {
1125*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs--;
1126*495ae853SAndroid Build Coastguard Worker ps_next_dpb->u1_used_as_ref = FALSE;
1127*495ae853SAndroid Build Coastguard Worker ps_next_dpb->s_top_field.u1_reference_info =
1128*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1129*495ae853SAndroid Build Coastguard Worker ps_next_dpb->s_bot_field.u1_reference_info =
1130*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1131*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1132*495ae853SAndroid Build Coastguard Worker ps_next_dpb->u1_buf_id);
1133*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_pic_buf = NULL;
1134*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short = NULL;
1135*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_st_head = NULL;
1136*495ae853SAndroid Build Coastguard Worker ps_next_dpb = NULL;
1137*495ae853SAndroid Build Coastguard Worker }
1138*495ae853SAndroid Build Coastguard Worker else if(ps_next_dpb->i4_frame_num == (WORD32)u4_cur_pic_num)
1139*495ae853SAndroid Build Coastguard Worker {
1140*495ae853SAndroid Build Coastguard Worker if(u1_curr_pic_in_err)
1141*495ae853SAndroid Build Coastguard Worker {
1142*495ae853SAndroid Build Coastguard Worker u1_insert_st_pic = 0;
1143*495ae853SAndroid Build Coastguard Worker }
1144*495ae853SAndroid Build Coastguard Worker else if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1145*495ae853SAndroid Build Coastguard Worker {
1146*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs--;
1147*495ae853SAndroid Build Coastguard Worker ps_next_dpb->u1_used_as_ref = FALSE;
1148*495ae853SAndroid Build Coastguard Worker ps_next_dpb->s_top_field.u1_reference_info =
1149*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1150*495ae853SAndroid Build Coastguard Worker ps_next_dpb->s_bot_field.u1_reference_info =
1151*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1152*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1153*495ae853SAndroid Build Coastguard Worker ps_next_dpb->u1_buf_id);
1154*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_pic_buf = NULL;
1155*495ae853SAndroid Build Coastguard Worker ps_next_dpb = NULL;
1156*495ae853SAndroid Build Coastguard Worker }
1157*495ae853SAndroid Build Coastguard Worker }
1158*495ae853SAndroid Build Coastguard Worker }
1159*495ae853SAndroid Build Coastguard Worker else
1160*495ae853SAndroid Build Coastguard Worker {
1161*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1162*495ae853SAndroid Build Coastguard Worker INVALID_FRAME_NUM,
1163*495ae853SAndroid Build Coastguard Worker &u1_del_node);
1164*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1165*495ae853SAndroid Build Coastguard Worker return ret;
1166*495ae853SAndroid Build Coastguard Worker if(u1_del_node)
1167*495ae853SAndroid Build Coastguard Worker {
1168*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1169*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1170*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1171*495ae853SAndroid Build Coastguard Worker }
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 else
1177*495ae853SAndroid Build Coastguard Worker {
1178*495ae853SAndroid Build Coastguard Worker //Adaptive memory control - implements 8.2.5.4
1179*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mmco;
1180*495ae853SAndroid Build Coastguard Worker UWORD32 u4_diff_pic_num;
1181*495ae853SAndroid Build Coastguard Worker WORD32 i4_pic_num;
1182*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lt_idx;
1183*495ae853SAndroid Build Coastguard Worker WORD32 j;
1184*495ae853SAndroid Build Coastguard Worker struct MMCParams *ps_mmc_params;
1185*495ae853SAndroid Build Coastguard Worker
1186*495ae853SAndroid Build Coastguard Worker for(j = 0; j < ps_dpb_cmds->u1_num_of_commands; j++)
1187*495ae853SAndroid Build Coastguard Worker {
1188*495ae853SAndroid Build Coastguard Worker ps_mmc_params = &ps_dpb_cmds->as_mmc_params[j];
1189*495ae853SAndroid Build Coastguard Worker u4_mmco = ps_mmc_params->u4_mmco; //Get MMCO
1190*495ae853SAndroid Build Coastguard Worker
1191*495ae853SAndroid Build Coastguard Worker switch(u4_mmco)
1192*495ae853SAndroid Build Coastguard Worker {
1193*495ae853SAndroid Build Coastguard Worker case MARK_ST_PICNUM_AS_NONREF:
1194*495ae853SAndroid Build Coastguard Worker {
1195*495ae853SAndroid Build Coastguard Worker
1196*495ae853SAndroid Build Coastguard Worker {
1197*495ae853SAndroid Build Coastguard Worker UWORD32 i4_cur_pic_num = u4_cur_pic_num;
1198*495ae853SAndroid Build Coastguard Worker WORD64 i8_pic_num;
1199*495ae853SAndroid Build Coastguard Worker u4_diff_pic_num = ps_mmc_params->u4_diff_pic_num; //Get absDiffPicnumMinus1
1200*495ae853SAndroid Build Coastguard Worker if(u1_fld_pic_flag)
1201*495ae853SAndroid Build Coastguard Worker i4_cur_pic_num = i4_cur_pic_num * 2 + 1;
1202*495ae853SAndroid Build Coastguard Worker i8_pic_num = ((WORD64)i4_cur_pic_num - ((WORD64)u4_diff_pic_num + 1));
1203*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_pic_num))
1204*495ae853SAndroid Build Coastguard Worker {
1205*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1206*495ae853SAndroid Build Coastguard Worker }
1207*495ae853SAndroid Build Coastguard Worker i4_pic_num = i8_pic_num;
1208*495ae853SAndroid Build Coastguard Worker }
1209*495ae853SAndroid Build Coastguard Worker
1210*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1211*495ae853SAndroid Build Coastguard Worker {
1212*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_st_node_or_make_lt(ps_dpb_mgr,
1213*495ae853SAndroid Build Coastguard Worker i4_pic_num,
1214*495ae853SAndroid Build Coastguard Worker MAX_REF_BUFS + 1,
1215*495ae853SAndroid Build Coastguard Worker u1_fld_pic_flag);
1216*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1217*495ae853SAndroid Build Coastguard Worker return ret;
1218*495ae853SAndroid Build Coastguard Worker }
1219*495ae853SAndroid Build Coastguard Worker else
1220*495ae853SAndroid Build Coastguard Worker {
1221*495ae853SAndroid Build Coastguard Worker UWORD8 u1_dummy;
1222*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_mmco(ps_dpb_mgr, i4_pic_num, &u1_dummy);
1223*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1224*495ae853SAndroid Build Coastguard Worker return ret;
1225*495ae853SAndroid Build Coastguard Worker }
1226*495ae853SAndroid Build Coastguard Worker break;
1227*495ae853SAndroid Build Coastguard Worker }
1228*495ae853SAndroid Build Coastguard Worker case MARK_LT_INDEX_AS_NONREF:
1229*495ae853SAndroid Build Coastguard Worker {
1230*495ae853SAndroid Build Coastguard Worker WORD32 i4_status;
1231*495ae853SAndroid Build Coastguard Worker u4_lt_idx = ps_mmc_params->u4_lt_idx; //Get long term index
1232*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_lt_node(ps_dpb_mgr,
1233*495ae853SAndroid Build Coastguard Worker u4_lt_idx,
1234*495ae853SAndroid Build Coastguard Worker u1_fld_pic_flag,
1235*495ae853SAndroid Build Coastguard Worker 0, &i4_status);
1236*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1237*495ae853SAndroid Build Coastguard Worker return ret;
1238*495ae853SAndroid Build Coastguard Worker if(i4_status)
1239*495ae853SAndroid Build Coastguard Worker {
1240*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1241*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1242*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1243*495ae853SAndroid Build Coastguard Worker }
1244*495ae853SAndroid Build Coastguard Worker break;
1245*495ae853SAndroid Build Coastguard Worker }
1246*495ae853SAndroid Build Coastguard Worker
1247*495ae853SAndroid Build Coastguard Worker case MARK_ST_PICNUM_AS_LT_INDEX:
1248*495ae853SAndroid Build Coastguard Worker {
1249*495ae853SAndroid Build Coastguard Worker {
1250*495ae853SAndroid Build Coastguard Worker UWORD32 i4_cur_pic_num = u4_cur_pic_num;
1251*495ae853SAndroid Build Coastguard Worker WORD64 i8_pic_num;
1252*495ae853SAndroid Build Coastguard Worker u4_diff_pic_num = ps_mmc_params->u4_diff_pic_num; //Get absDiffPicnumMinus1
1253*495ae853SAndroid Build Coastguard Worker if(u1_fld_pic_flag)
1254*495ae853SAndroid Build Coastguard Worker i4_cur_pic_num = i4_cur_pic_num * 2 + 1;
1255*495ae853SAndroid Build Coastguard Worker
1256*495ae853SAndroid Build Coastguard Worker i8_pic_num = (WORD64)i4_cur_pic_num - ((WORD64)u4_diff_pic_num + 1);
1257*495ae853SAndroid Build Coastguard Worker if(IS_OUT_OF_RANGE_S32(i8_pic_num))
1258*495ae853SAndroid Build Coastguard Worker {
1259*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1260*495ae853SAndroid Build Coastguard Worker }
1261*495ae853SAndroid Build Coastguard Worker i4_pic_num = i8_pic_num;
1262*495ae853SAndroid Build Coastguard Worker }
1263*495ae853SAndroid Build Coastguard Worker
1264*495ae853SAndroid Build Coastguard Worker u4_lt_idx = ps_mmc_params->u4_lt_idx; //Get long term index
1265*495ae853SAndroid Build Coastguard Worker
1266*495ae853SAndroid Build Coastguard Worker if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) ||
1267*495ae853SAndroid Build Coastguard Worker (u4_lt_idx > ps_dpb_mgr->u1_max_lt_frame_idx))
1268*495ae853SAndroid Build Coastguard Worker {
1269*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1270*495ae853SAndroid Build Coastguard Worker }
1271*495ae853SAndroid Build Coastguard Worker
1272*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1273*495ae853SAndroid Build Coastguard Worker {
1274*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_st_node_or_make_lt(ps_dpb_mgr,
1275*495ae853SAndroid Build Coastguard Worker i4_pic_num, u4_lt_idx,
1276*495ae853SAndroid Build Coastguard Worker u1_fld_pic_flag);
1277*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1278*495ae853SAndroid Build Coastguard Worker return ret;
1279*495ae853SAndroid Build Coastguard Worker }
1280*495ae853SAndroid Build Coastguard Worker break;
1281*495ae853SAndroid Build Coastguard Worker }
1282*495ae853SAndroid Build Coastguard Worker case SET_MAX_LT_INDEX:
1283*495ae853SAndroid Build Coastguard Worker {
1284*495ae853SAndroid Build Coastguard Worker UWORD8 uc_numLT = ps_dpb_mgr->u1_num_lt_ref_bufs;
1285*495ae853SAndroid Build Coastguard Worker u4_lt_idx = ps_mmc_params->u4_max_lt_idx_plus1; //Get Max_long_term_index_plus1
1286*495ae853SAndroid Build Coastguard Worker if(u4_lt_idx <= ps_dpb_mgr->u1_max_lt_frame_idx
1287*495ae853SAndroid Build Coastguard Worker && uc_numLT > 0)
1288*495ae853SAndroid Build Coastguard Worker {
1289*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_nxtDPB;
1290*495ae853SAndroid Build Coastguard Worker //Set all LT buffers with index >= u4_lt_idx to nonreference
1291*495ae853SAndroid Build Coastguard Worker ps_nxtDPB = ps_dpb_mgr->ps_dpb_ht_head;
1292*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_nxtDPB->ps_prev_long;
1293*495ae853SAndroid Build Coastguard Worker if(ps_nxtDPB->u1_lt_idx >= u4_lt_idx)
1294*495ae853SAndroid Build Coastguard Worker {
1295*495ae853SAndroid Build Coastguard Worker i = 0;
1296*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_ht_head = NULL;
1297*495ae853SAndroid Build Coastguard Worker }
1298*495ae853SAndroid Build Coastguard Worker else
1299*495ae853SAndroid Build Coastguard Worker {
1300*495ae853SAndroid Build Coastguard Worker for(i = 1; i < uc_numLT; i++)
1301*495ae853SAndroid Build Coastguard Worker {
1302*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->u1_lt_idx >= u4_lt_idx)
1303*495ae853SAndroid Build Coastguard Worker break;
1304*495ae853SAndroid Build Coastguard Worker ps_nxtDPB = ps_next_dpb;
1305*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_long;
1306*495ae853SAndroid Build Coastguard Worker }
1307*495ae853SAndroid Build Coastguard Worker ps_nxtDPB->ps_prev_long = NULL; //Terminate the link of the closest LTIndex that is <=Max
1308*495ae853SAndroid Build Coastguard Worker }
1309*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_lt_ref_bufs = i;
1310*495ae853SAndroid Build Coastguard Worker if(i == 0)
1311*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_nxtDPB;
1312*495ae853SAndroid Build Coastguard Worker
1313*495ae853SAndroid Build Coastguard Worker for(; i < uc_numLT; i++)
1314*495ae853SAndroid Build Coastguard Worker {
1315*495ae853SAndroid Build Coastguard Worker ps_nxtDPB = ps_next_dpb;
1316*495ae853SAndroid Build Coastguard Worker ps_nxtDPB->u1_lt_idx = MAX_REF_BUFS + 1;
1317*495ae853SAndroid Build Coastguard Worker ps_nxtDPB->u1_used_as_ref = UNUSED_FOR_REF;
1318*495ae853SAndroid Build Coastguard Worker ps_nxtDPB->s_top_field.u1_reference_info =
1319*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1320*495ae853SAndroid Build Coastguard Worker ps_nxtDPB->s_bot_field.u1_reference_info =
1321*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1322*495ae853SAndroid Build Coastguard Worker
1323*495ae853SAndroid Build Coastguard Worker ps_nxtDPB->ps_pic_buf = NULL;
1324*495ae853SAndroid Build Coastguard Worker //Release buffer
1325*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1326*495ae853SAndroid Build Coastguard Worker ps_nxtDPB->u1_buf_id);
1327*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_nxtDPB->ps_prev_long;
1328*495ae853SAndroid Build Coastguard Worker ps_nxtDPB->ps_prev_long = NULL;
1329*495ae853SAndroid Build Coastguard Worker }
1330*495ae853SAndroid Build Coastguard Worker }
1331*495ae853SAndroid Build Coastguard Worker if(u4_lt_idx == 0)
1332*495ae853SAndroid Build Coastguard Worker {
1333*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_max_lt_frame_idx = NO_LONG_TERM_INDICIES;
1334*495ae853SAndroid Build Coastguard Worker }
1335*495ae853SAndroid Build Coastguard Worker else
1336*495ae853SAndroid Build Coastguard Worker {
1337*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_max_lt_frame_idx = u4_lt_idx - 1;
1338*495ae853SAndroid Build Coastguard Worker }
1339*495ae853SAndroid Build Coastguard Worker
1340*495ae853SAndroid Build Coastguard Worker break;
1341*495ae853SAndroid Build Coastguard Worker }
1342*495ae853SAndroid Build Coastguard Worker case SET_LT_INDEX:
1343*495ae853SAndroid Build Coastguard Worker {
1344*495ae853SAndroid Build Coastguard Worker u4_lt_idx = ps_mmc_params->u4_lt_idx; //Get long term index
1345*495ae853SAndroid Build Coastguard Worker if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) ||
1346*495ae853SAndroid Build Coastguard Worker (u4_lt_idx > ps_dpb_mgr->u1_max_lt_frame_idx))
1347*495ae853SAndroid Build Coastguard Worker {
1348*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1349*495ae853SAndroid Build Coastguard Worker }
1350*495ae853SAndroid Build Coastguard Worker ret = ih264d_insert_st_node(ps_dpb_mgr, ps_pic_buf, u1_buf_id,
1351*495ae853SAndroid Build Coastguard Worker u4_cur_pic_num);
1352*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1353*495ae853SAndroid Build Coastguard Worker return ret;
1354*495ae853SAndroid Build Coastguard Worker
1355*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1356*495ae853SAndroid Build Coastguard Worker
1357*495ae853SAndroid Build Coastguard Worker {
1358*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_st_node_or_make_lt(ps_dpb_mgr,
1359*495ae853SAndroid Build Coastguard Worker u4_cur_pic_num,
1360*495ae853SAndroid Build Coastguard Worker u4_lt_idx,
1361*495ae853SAndroid Build Coastguard Worker u1_fld_pic_flag);
1362*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1363*495ae853SAndroid Build Coastguard Worker return ret;
1364*495ae853SAndroid Build Coastguard Worker }
1365*495ae853SAndroid Build Coastguard Worker else
1366*495ae853SAndroid Build Coastguard Worker {
1367*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1368*495ae853SAndroid Build Coastguard Worker }
1369*495ae853SAndroid Build Coastguard Worker
1370*495ae853SAndroid Build Coastguard Worker u1_marked_lt = 1;
1371*495ae853SAndroid Build Coastguard Worker break;
1372*495ae853SAndroid Build Coastguard Worker }
1373*495ae853SAndroid Build Coastguard Worker
1374*495ae853SAndroid Build Coastguard Worker default:
1375*495ae853SAndroid Build Coastguard Worker break;
1376*495ae853SAndroid Build Coastguard Worker }
1377*495ae853SAndroid Build Coastguard Worker if(u4_mmco == RESET_REF_PICTURES || u4_mmco == RESET_ALL_PICTURES)
1378*495ae853SAndroid Build Coastguard Worker {
1379*495ae853SAndroid Build Coastguard Worker ih264d_reset_ref_bufs(ps_dpb_mgr);
1380*495ae853SAndroid Build Coastguard Worker u4_cur_pic_num = 0;
1381*495ae853SAndroid Build Coastguard Worker }
1382*495ae853SAndroid Build Coastguard Worker }
1383*495ae853SAndroid Build Coastguard Worker }
1384*495ae853SAndroid Build Coastguard Worker if(!u1_marked_lt && u1_insert_st_pic)
1385*495ae853SAndroid Build Coastguard Worker {
1386*495ae853SAndroid Build Coastguard Worker ret = ih264d_insert_st_node(ps_dpb_mgr, ps_pic_buf, u1_buf_id,
1387*495ae853SAndroid Build Coastguard Worker u4_cur_pic_num);
1388*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1389*495ae853SAndroid Build Coastguard Worker return ret;
1390*495ae853SAndroid Build Coastguard Worker }
1391*495ae853SAndroid Build Coastguard Worker return OK;
1392*495ae853SAndroid Build Coastguard Worker }
1393*495ae853SAndroid Build Coastguard Worker
1394*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1395*495ae853SAndroid Build Coastguard Worker /* */
1396*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_release_pics_in_dpb */
1397*495ae853SAndroid Build Coastguard Worker /* */
1398*495ae853SAndroid Build Coastguard Worker /* Description : This function deletes all pictures from DPB */
1399*495ae853SAndroid Build Coastguard Worker /* */
1400*495ae853SAndroid Build Coastguard Worker /* Inputs : h_pic_buf_api: pointer to picture buffer API */
1401*495ae853SAndroid Build Coastguard Worker /* u1_disp_bufs: number pictures ready for display */
1402*495ae853SAndroid Build Coastguard Worker /* */
1403*495ae853SAndroid Build Coastguard Worker /* Globals : None */
1404*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
1405*495ae853SAndroid Build Coastguard Worker /* Returns : None */
1406*495ae853SAndroid Build Coastguard Worker /* */
1407*495ae853SAndroid Build Coastguard Worker /* Issues : None */
1408*495ae853SAndroid Build Coastguard Worker /* */
1409*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1410*495ae853SAndroid Build Coastguard Worker /* */
1411*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1412*495ae853SAndroid Build Coastguard Worker /* 22 06 2005 NS Draft */
1413*495ae853SAndroid Build Coastguard Worker /* */
1414*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_release_pics_in_dpb(void * pv_dec,UWORD8 u1_disp_bufs)1415*495ae853SAndroid Build Coastguard Worker void ih264d_release_pics_in_dpb(void *pv_dec,
1416*495ae853SAndroid Build Coastguard Worker UWORD8 u1_disp_bufs)
1417*495ae853SAndroid Build Coastguard Worker {
1418*495ae853SAndroid Build Coastguard Worker WORD8 i;
1419*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *)pv_dec;
1420*495ae853SAndroid Build Coastguard Worker
1421*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u1_disp_bufs; i++)
1422*495ae853SAndroid Build Coastguard Worker {
1423*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
1424*495ae853SAndroid Build Coastguard Worker i,
1425*495ae853SAndroid Build Coastguard Worker BUF_MGR_REF);
1426*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
1427*495ae853SAndroid Build Coastguard Worker ps_dec->as_buf_id_info_map[i].mv_buf_id,
1428*495ae853SAndroid Build Coastguard Worker BUF_MGR_REF);
1429*495ae853SAndroid Build Coastguard Worker }
1430*495ae853SAndroid Build Coastguard Worker }
1431*495ae853SAndroid Build Coastguard Worker
1432*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1433*495ae853SAndroid Build Coastguard Worker /* */
1434*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_delete_gap_frm_sliding */
1435*495ae853SAndroid Build Coastguard Worker /* */
1436*495ae853SAndroid Build Coastguard Worker /* Description : This function deletes a picture from the list of gaps, */
1437*495ae853SAndroid Build Coastguard Worker /* if the frame number of gap frame is lesser than the one */
1438*495ae853SAndroid Build Coastguard Worker /* to be deleted by sliding window */
1439*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_dpb_mgr: pointer to dpb manager */
1440*495ae853SAndroid Build Coastguard Worker /* i4_frame_num: frame number of picture that's going to */
1441*495ae853SAndroid Build Coastguard Worker /* be deleted by sliding window */
1442*495ae853SAndroid Build Coastguard Worker /* pu1_del_node: holds 0 if a gap is deleted else 1 */
1443*495ae853SAndroid Build Coastguard Worker /* Globals : None */
1444*495ae853SAndroid Build Coastguard Worker /* Processing : Function searches for frame number lesser than */
1445*495ae853SAndroid Build Coastguard Worker /* i4_frame_num in the gaps list */
1446*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
1447*495ae853SAndroid Build Coastguard Worker /* Returns : None */
1448*495ae853SAndroid Build Coastguard Worker /* */
1449*495ae853SAndroid Build Coastguard Worker /* Issues : None */
1450*495ae853SAndroid Build Coastguard Worker /* */
1451*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1452*495ae853SAndroid Build Coastguard Worker /* */
1453*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1454*495ae853SAndroid Build Coastguard Worker /* 22 06 2005 NS Draft */
1455*495ae853SAndroid Build Coastguard Worker /* */
1456*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_delete_gap_frm_sliding(dpb_manager_t * ps_dpb_mgr,WORD32 i4_frame_num,UWORD8 * pu1_del_node)1457*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_delete_gap_frm_sliding(dpb_manager_t *ps_dpb_mgr,
1458*495ae853SAndroid Build Coastguard Worker WORD32 i4_frame_num,
1459*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_del_node)
1460*495ae853SAndroid Build Coastguard Worker {
1461*495ae853SAndroid Build Coastguard Worker WORD8 i1_gap_idx, i, j, j_min;
1462*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_gaps_start_frm_num, *pi4_gaps_end_frm_num, i4_gap_frame_num;
1463*495ae853SAndroid Build Coastguard Worker WORD32 i4_start_frm_num, i4_end_frm_num;
1464*495ae853SAndroid Build Coastguard Worker WORD32 i4_max_frm_num;
1465*495ae853SAndroid Build Coastguard Worker WORD32 i4_frm_num, i4_gap_frm_num_min;
1466*495ae853SAndroid Build Coastguard Worker
1467*495ae853SAndroid Build Coastguard Worker /* find the least frame num from gaps and current DPB node */
1468*495ae853SAndroid Build Coastguard Worker /* Delete the least one */
1469*495ae853SAndroid Build Coastguard Worker *pu1_del_node = 1;
1470*495ae853SAndroid Build Coastguard Worker if(0 == ps_dpb_mgr->u1_num_gaps)
1471*495ae853SAndroid Build Coastguard Worker return OK;
1472*495ae853SAndroid Build Coastguard Worker pi4_gaps_start_frm_num = ps_dpb_mgr->ai4_gaps_start_frm_num;
1473*495ae853SAndroid Build Coastguard Worker pi4_gaps_end_frm_num = ps_dpb_mgr->ai4_gaps_end_frm_num;
1474*495ae853SAndroid Build Coastguard Worker i4_gap_frame_num = INVALID_FRAME_NUM;
1475*495ae853SAndroid Build Coastguard Worker i4_max_frm_num = ps_dpb_mgr->i4_max_frm_num;
1476*495ae853SAndroid Build Coastguard Worker
1477*495ae853SAndroid Build Coastguard Worker i1_gap_idx = -1;
1478*495ae853SAndroid Build Coastguard Worker if(INVALID_FRAME_NUM != i4_frame_num)
1479*495ae853SAndroid Build Coastguard Worker {
1480*495ae853SAndroid Build Coastguard Worker i4_gap_frame_num = i4_frame_num;
1481*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_FRAMES; i++)
1482*495ae853SAndroid Build Coastguard Worker {
1483*495ae853SAndroid Build Coastguard Worker i4_start_frm_num = pi4_gaps_start_frm_num[i];
1484*495ae853SAndroid Build Coastguard Worker if(INVALID_FRAME_NUM != i4_start_frm_num)
1485*495ae853SAndroid Build Coastguard Worker {
1486*495ae853SAndroid Build Coastguard Worker i4_end_frm_num = pi4_gaps_end_frm_num[i];
1487*495ae853SAndroid Build Coastguard Worker if(i4_end_frm_num < i4_max_frm_num)
1488*495ae853SAndroid Build Coastguard Worker {
1489*495ae853SAndroid Build Coastguard Worker if(i4_start_frm_num <= i4_gap_frame_num)
1490*495ae853SAndroid Build Coastguard Worker {
1491*495ae853SAndroid Build Coastguard Worker i4_gap_frame_num = i4_start_frm_num;
1492*495ae853SAndroid Build Coastguard Worker i1_gap_idx = i;
1493*495ae853SAndroid Build Coastguard Worker }
1494*495ae853SAndroid Build Coastguard Worker }
1495*495ae853SAndroid Build Coastguard Worker else
1496*495ae853SAndroid Build Coastguard Worker {
1497*495ae853SAndroid Build Coastguard Worker if(((i4_start_frm_num <= i4_gap_frame_num)
1498*495ae853SAndroid Build Coastguard Worker && (i4_gap_frame_num <= i4_max_frm_num))
1499*495ae853SAndroid Build Coastguard Worker || ((i4_start_frm_num >= i4_gap_frame_num)
1500*495ae853SAndroid Build Coastguard Worker && ((i4_gap_frame_num
1501*495ae853SAndroid Build Coastguard Worker + i4_max_frm_num)
1502*495ae853SAndroid Build Coastguard Worker >= i4_end_frm_num)))
1503*495ae853SAndroid Build Coastguard Worker {
1504*495ae853SAndroid Build Coastguard Worker i4_gap_frame_num = i4_start_frm_num;
1505*495ae853SAndroid Build Coastguard Worker i1_gap_idx = i;
1506*495ae853SAndroid Build Coastguard Worker }
1507*495ae853SAndroid Build Coastguard Worker }
1508*495ae853SAndroid Build Coastguard Worker }
1509*495ae853SAndroid Build Coastguard Worker }
1510*495ae853SAndroid Build Coastguard Worker }
1511*495ae853SAndroid Build Coastguard Worker else
1512*495ae853SAndroid Build Coastguard Worker {
1513*495ae853SAndroid Build Coastguard Worker /* no valid short term buffers, delete one gap from the least start */
1514*495ae853SAndroid Build Coastguard Worker /* of gap sequence */
1515*495ae853SAndroid Build Coastguard Worker i4_gap_frame_num = pi4_gaps_start_frm_num[0];
1516*495ae853SAndroid Build Coastguard Worker i1_gap_idx = 0;
1517*495ae853SAndroid Build Coastguard Worker for(i = 1; i < MAX_FRAMES; i++)
1518*495ae853SAndroid Build Coastguard Worker {
1519*495ae853SAndroid Build Coastguard Worker if(INVALID_FRAME_NUM != pi4_gaps_start_frm_num[i])
1520*495ae853SAndroid Build Coastguard Worker {
1521*495ae853SAndroid Build Coastguard Worker if(pi4_gaps_start_frm_num[i] < i4_gap_frame_num)
1522*495ae853SAndroid Build Coastguard Worker {
1523*495ae853SAndroid Build Coastguard Worker i4_gap_frame_num = pi4_gaps_start_frm_num[i];
1524*495ae853SAndroid Build Coastguard Worker i1_gap_idx = i;
1525*495ae853SAndroid Build Coastguard Worker }
1526*495ae853SAndroid Build Coastguard Worker }
1527*495ae853SAndroid Build Coastguard Worker }
1528*495ae853SAndroid Build Coastguard Worker if(INVALID_FRAME_NUM == i4_gap_frame_num)
1529*495ae853SAndroid Build Coastguard Worker {
1530*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1531*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1532*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1533*495ae853SAndroid Build Coastguard Worker }
1534*495ae853SAndroid Build Coastguard Worker }
1535*495ae853SAndroid Build Coastguard Worker
1536*495ae853SAndroid Build Coastguard Worker if(-1 != i1_gap_idx)
1537*495ae853SAndroid Build Coastguard Worker {
1538*495ae853SAndroid Build Coastguard Worker /* find least frame_num in the poc_map, which is in this range */
1539*495ae853SAndroid Build Coastguard Worker i4_start_frm_num = pi4_gaps_start_frm_num[i1_gap_idx];
1540*495ae853SAndroid Build Coastguard Worker if(i4_start_frm_num < 0)
1541*495ae853SAndroid Build Coastguard Worker i4_start_frm_num += i4_max_frm_num;
1542*495ae853SAndroid Build Coastguard Worker i4_end_frm_num = pi4_gaps_end_frm_num[i1_gap_idx];
1543*495ae853SAndroid Build Coastguard Worker if(i4_end_frm_num < 0)
1544*495ae853SAndroid Build Coastguard Worker i4_end_frm_num += i4_max_frm_num;
1545*495ae853SAndroid Build Coastguard Worker
1546*495ae853SAndroid Build Coastguard Worker i4_gap_frm_num_min = 0xfffffff;
1547*495ae853SAndroid Build Coastguard Worker j_min = MAX_FRAMES;
1548*495ae853SAndroid Build Coastguard Worker for(j = 0; j < MAX_FRAMES; j++)
1549*495ae853SAndroid Build Coastguard Worker {
1550*495ae853SAndroid Build Coastguard Worker i4_frm_num = ps_dpb_mgr->ai4_poc_buf_id_map[j][2];
1551*495ae853SAndroid Build Coastguard Worker if((i4_start_frm_num <= i4_frm_num)
1552*495ae853SAndroid Build Coastguard Worker && (i4_end_frm_num >= i4_frm_num))
1553*495ae853SAndroid Build Coastguard Worker {
1554*495ae853SAndroid Build Coastguard Worker if(i4_frm_num < i4_gap_frm_num_min)
1555*495ae853SAndroid Build Coastguard Worker {
1556*495ae853SAndroid Build Coastguard Worker j_min = j;
1557*495ae853SAndroid Build Coastguard Worker i4_gap_frm_num_min = i4_frm_num;
1558*495ae853SAndroid Build Coastguard Worker }
1559*495ae853SAndroid Build Coastguard Worker }
1560*495ae853SAndroid Build Coastguard Worker }
1561*495ae853SAndroid Build Coastguard Worker
1562*495ae853SAndroid Build Coastguard Worker if(j_min != MAX_FRAMES)
1563*495ae853SAndroid Build Coastguard Worker {
1564*495ae853SAndroid Build Coastguard Worker
1565*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[j_min][0] = -1;
1566*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[j_min][1] = 0x7fffffff;
1567*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[j_min][2] = GAP_FRAME_NUM;
1568*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->i1_gaps_deleted++;
1569*495ae853SAndroid Build Coastguard Worker
1570*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai1_gaps_per_seq[i1_gap_idx]--;
1571*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_gaps--;
1572*495ae853SAndroid Build Coastguard Worker *pu1_del_node = 0;
1573*495ae853SAndroid Build Coastguard Worker if(0 == ps_dpb_mgr->ai1_gaps_per_seq[i1_gap_idx])
1574*495ae853SAndroid Build Coastguard Worker {
1575*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_start_frm_num[i1_gap_idx] =
1576*495ae853SAndroid Build Coastguard Worker INVALID_FRAME_NUM;
1577*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_end_frm_num[i1_gap_idx] = 0;
1578*495ae853SAndroid Build Coastguard Worker }
1579*495ae853SAndroid Build Coastguard Worker }
1580*495ae853SAndroid Build Coastguard Worker }
1581*495ae853SAndroid Build Coastguard Worker
1582*495ae853SAndroid Build Coastguard Worker return OK;
1583*495ae853SAndroid Build Coastguard Worker }
1584*495ae853SAndroid Build Coastguard Worker
1585*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1586*495ae853SAndroid Build Coastguard Worker /* */
1587*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_delete_gap_frm_mmco */
1588*495ae853SAndroid Build Coastguard Worker /* */
1589*495ae853SAndroid Build Coastguard Worker /* Description : This function deletes a picture from the list of gaps, */
1590*495ae853SAndroid Build Coastguard Worker /* if the frame number (specified by mmco commands) to be */
1591*495ae853SAndroid Build Coastguard Worker /* deleted is in the range by gap sequence. */
1592*495ae853SAndroid Build Coastguard Worker /* */
1593*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_dpb_mgr: pointer to dpb manager */
1594*495ae853SAndroid Build Coastguard Worker /* i4_frame_num: frame number of picture that's going to */
1595*495ae853SAndroid Build Coastguard Worker /* be deleted by mmco */
1596*495ae853SAndroid Build Coastguard Worker /* pu1_del_node: holds 0 if a gap is deleted else 1 */
1597*495ae853SAndroid Build Coastguard Worker /* Globals : None */
1598*495ae853SAndroid Build Coastguard Worker /* Processing : Function searches for frame number lesser in the range */
1599*495ae853SAndroid Build Coastguard Worker /* specified by gap sequence */
1600*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
1601*495ae853SAndroid Build Coastguard Worker /* Returns : None */
1602*495ae853SAndroid Build Coastguard Worker /* */
1603*495ae853SAndroid Build Coastguard Worker /* Issues : None */
1604*495ae853SAndroid Build Coastguard Worker /* */
1605*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1606*495ae853SAndroid Build Coastguard Worker /* */
1607*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1608*495ae853SAndroid Build Coastguard Worker /* 22 06 2005 NS Draft */
1609*495ae853SAndroid Build Coastguard Worker /* */
1610*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_delete_gap_frm_mmco(dpb_manager_t * ps_dpb_mgr,WORD32 i4_frame_num,UWORD8 * pu1_del_node)1611*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_delete_gap_frm_mmco(dpb_manager_t *ps_dpb_mgr,
1612*495ae853SAndroid Build Coastguard Worker WORD32 i4_frame_num,
1613*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_del_node)
1614*495ae853SAndroid Build Coastguard Worker {
1615*495ae853SAndroid Build Coastguard Worker WORD8 i, j;
1616*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_start, *pi4_end;
1617*495ae853SAndroid Build Coastguard Worker WORD32 i4_start_frm_num, i4_end_frm_num, i4_max_frm_num;
1618*495ae853SAndroid Build Coastguard Worker
1619*495ae853SAndroid Build Coastguard Worker /* find the least frame num from gaps and current DPB node */
1620*495ae853SAndroid Build Coastguard Worker /* Delete the gaps */
1621*495ae853SAndroid Build Coastguard Worker *pu1_del_node = 1;
1622*495ae853SAndroid Build Coastguard Worker pi4_start = ps_dpb_mgr->ai4_gaps_start_frm_num;
1623*495ae853SAndroid Build Coastguard Worker pi4_end = ps_dpb_mgr->ai4_gaps_end_frm_num;
1624*495ae853SAndroid Build Coastguard Worker i4_max_frm_num = ps_dpb_mgr->i4_max_frm_num;
1625*495ae853SAndroid Build Coastguard Worker
1626*495ae853SAndroid Build Coastguard Worker if(0 == ps_dpb_mgr->u1_num_gaps)
1627*495ae853SAndroid Build Coastguard Worker return OK;
1628*495ae853SAndroid Build Coastguard Worker
1629*495ae853SAndroid Build Coastguard Worker if(i4_frame_num < 0)
1630*495ae853SAndroid Build Coastguard Worker i4_frame_num += i4_max_frm_num;
1631*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_FRAMES; i++)
1632*495ae853SAndroid Build Coastguard Worker {
1633*495ae853SAndroid Build Coastguard Worker i4_start_frm_num = pi4_start[i];
1634*495ae853SAndroid Build Coastguard Worker if(i4_start_frm_num < 0)
1635*495ae853SAndroid Build Coastguard Worker i4_start_frm_num += i4_max_frm_num;
1636*495ae853SAndroid Build Coastguard Worker if(INVALID_FRAME_NUM != i4_start_frm_num)
1637*495ae853SAndroid Build Coastguard Worker {
1638*495ae853SAndroid Build Coastguard Worker i4_end_frm_num = pi4_end[i];
1639*495ae853SAndroid Build Coastguard Worker if(i4_end_frm_num < 0)
1640*495ae853SAndroid Build Coastguard Worker i4_end_frm_num += i4_max_frm_num;
1641*495ae853SAndroid Build Coastguard Worker
1642*495ae853SAndroid Build Coastguard Worker if((i4_frame_num >= i4_start_frm_num)
1643*495ae853SAndroid Build Coastguard Worker && (i4_frame_num <= i4_end_frm_num))
1644*495ae853SAndroid Build Coastguard Worker {
1645*495ae853SAndroid Build Coastguard Worker break;
1646*495ae853SAndroid Build Coastguard Worker }
1647*495ae853SAndroid Build Coastguard Worker else
1648*495ae853SAndroid Build Coastguard Worker {
1649*495ae853SAndroid Build Coastguard Worker if(((i4_frame_num + i4_max_frm_num) >= i4_start_frm_num)
1650*495ae853SAndroid Build Coastguard Worker && ((i4_frame_num + i4_max_frm_num)
1651*495ae853SAndroid Build Coastguard Worker <= i4_end_frm_num))
1652*495ae853SAndroid Build Coastguard Worker {
1653*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1654*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1655*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1656*495ae853SAndroid Build Coastguard Worker }
1657*495ae853SAndroid Build Coastguard Worker }
1658*495ae853SAndroid Build Coastguard Worker }
1659*495ae853SAndroid Build Coastguard Worker }
1660*495ae853SAndroid Build Coastguard Worker
1661*495ae853SAndroid Build Coastguard Worker /* find frame_num index, in the poc_map which needs to be deleted */
1662*495ae853SAndroid Build Coastguard Worker for(j = 0; j < MAX_FRAMES; j++)
1663*495ae853SAndroid Build Coastguard Worker {
1664*495ae853SAndroid Build Coastguard Worker if(i4_frame_num == ps_dpb_mgr->ai4_poc_buf_id_map[j][2])
1665*495ae853SAndroid Build Coastguard Worker break;
1666*495ae853SAndroid Build Coastguard Worker }
1667*495ae853SAndroid Build Coastguard Worker
1668*495ae853SAndroid Build Coastguard Worker if(MAX_FRAMES != i)
1669*495ae853SAndroid Build Coastguard Worker {
1670*495ae853SAndroid Build Coastguard Worker if(j == MAX_FRAMES)
1671*495ae853SAndroid Build Coastguard Worker {
1672*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1673*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1674*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1675*495ae853SAndroid Build Coastguard Worker }
1676*495ae853SAndroid Build Coastguard Worker
1677*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[j][0] = -1;
1678*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[j][1] = 0x7fffffff;
1679*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_poc_buf_id_map[j][2] = GAP_FRAME_NUM;
1680*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->i1_gaps_deleted++;
1681*495ae853SAndroid Build Coastguard Worker
1682*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai1_gaps_per_seq[i]--;
1683*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_gaps--;
1684*495ae853SAndroid Build Coastguard Worker *pu1_del_node = 0;
1685*495ae853SAndroid Build Coastguard Worker if(0 == ps_dpb_mgr->ai1_gaps_per_seq[i])
1686*495ae853SAndroid Build Coastguard Worker {
1687*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
1688*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
1689*495ae853SAndroid Build Coastguard Worker }
1690*495ae853SAndroid Build Coastguard Worker }
1691*495ae853SAndroid Build Coastguard Worker else
1692*495ae853SAndroid Build Coastguard Worker {
1693*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1694*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1695*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1696*495ae853SAndroid Build Coastguard Worker }
1697*495ae853SAndroid Build Coastguard Worker
1698*495ae853SAndroid Build Coastguard Worker return OK;
1699*495ae853SAndroid Build Coastguard Worker }
1700*495ae853SAndroid Build Coastguard Worker
1701*495ae853SAndroid Build Coastguard Worker /*!
1702*495ae853SAndroid Build Coastguard Worker **************************************************************************
1703*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_do_mmco_for_gaps \endif
1704*495ae853SAndroid Build Coastguard Worker *
1705*495ae853SAndroid Build Coastguard Worker * \brief
1706*495ae853SAndroid Build Coastguard Worker * Perform decoded picture buffer memory management control operations
1707*495ae853SAndroid Build Coastguard Worker *
1708*495ae853SAndroid Build Coastguard Worker * \return
1709*495ae853SAndroid Build Coastguard Worker * 0 - No error; -1 - Error
1710*495ae853SAndroid Build Coastguard Worker *
1711*495ae853SAndroid Build Coastguard Worker * \note
1712*495ae853SAndroid Build Coastguard Worker * Bitstream is also parsed here to get the MMCOs
1713*495ae853SAndroid Build Coastguard Worker *
1714*495ae853SAndroid Build Coastguard Worker **************************************************************************
1715*495ae853SAndroid Build Coastguard Worker */
ih264d_do_mmco_for_gaps(dpb_manager_t * ps_dpb_mgr,UWORD8 u1_num_ref_frames)1716*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_do_mmco_for_gaps(dpb_manager_t *ps_dpb_mgr,
1717*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_ref_frames /*!< num_ref_frames from active SeqParSet*/
1718*495ae853SAndroid Build Coastguard Worker )
1719*495ae853SAndroid Build Coastguard Worker {
1720*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_next_dpb;
1721*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_gaps;
1722*495ae853SAndroid Build Coastguard Worker UWORD8 u1_st_ref_bufs, u1_lt_ref_bufs, u1_del_node;
1723*495ae853SAndroid Build Coastguard Worker WORD8 i;
1724*495ae853SAndroid Build Coastguard Worker WORD32 i4_frame_gaps = 1;
1725*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1726*495ae853SAndroid Build Coastguard Worker
1727*495ae853SAndroid Build Coastguard Worker //Sliding window - implements 8.2.5.3, flush out buffers
1728*495ae853SAndroid Build Coastguard Worker u1_st_ref_bufs = ps_dpb_mgr->u1_num_st_ref_bufs;
1729*495ae853SAndroid Build Coastguard Worker u1_lt_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs;
1730*495ae853SAndroid Build Coastguard Worker
1731*495ae853SAndroid Build Coastguard Worker while(1)
1732*495ae853SAndroid Build Coastguard Worker {
1733*495ae853SAndroid Build Coastguard Worker u1_num_gaps = ps_dpb_mgr->u1_num_gaps;
1734*495ae853SAndroid Build Coastguard Worker if((u1_st_ref_bufs + u1_lt_ref_bufs + u1_num_gaps + i4_frame_gaps)
1735*495ae853SAndroid Build Coastguard Worker > u1_num_ref_frames)
1736*495ae853SAndroid Build Coastguard Worker {
1737*495ae853SAndroid Build Coastguard Worker if(0 == (u1_st_ref_bufs + u1_num_gaps))
1738*495ae853SAndroid Build Coastguard Worker {
1739*495ae853SAndroid Build Coastguard Worker i4_frame_gaps = 0;
1740*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_gaps = (u1_num_ref_frames
1741*495ae853SAndroid Build Coastguard Worker - u1_lt_ref_bufs);
1742*495ae853SAndroid Build Coastguard Worker }
1743*495ae853SAndroid Build Coastguard Worker else
1744*495ae853SAndroid Build Coastguard Worker {
1745*495ae853SAndroid Build Coastguard Worker u1_del_node = 1;
1746*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1747*495ae853SAndroid Build Coastguard Worker
1748*495ae853SAndroid Build Coastguard Worker if(u1_st_ref_bufs > 1)
1749*495ae853SAndroid Build Coastguard Worker {
1750*495ae853SAndroid Build Coastguard Worker for(i = 1; i < (u1_st_ref_bufs - 1); i++)
1751*495ae853SAndroid Build Coastguard Worker {
1752*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb == NULL)
1753*495ae853SAndroid Build Coastguard Worker {
1754*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
1755*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_DBP_MANAGER_T;
1756*495ae853SAndroid Build Coastguard Worker return i4_error_code;
1757*495ae853SAndroid Build Coastguard Worker }
1758*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_short;
1759*495ae853SAndroid Build Coastguard Worker }
1760*495ae853SAndroid Build Coastguard Worker
1761*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->ps_prev_short->ps_prev_short != NULL)
1762*495ae853SAndroid Build Coastguard Worker {
1763*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1764*495ae853SAndroid Build Coastguard Worker }
1765*495ae853SAndroid Build Coastguard Worker
1766*495ae853SAndroid Build Coastguard Worker if(u1_num_gaps)
1767*495ae853SAndroid Build Coastguard Worker {
1768*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1769*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->i4_frame_num,
1770*495ae853SAndroid Build Coastguard Worker &u1_del_node);
1771*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1772*495ae853SAndroid Build Coastguard Worker return ret;
1773*495ae853SAndroid Build Coastguard Worker }
1774*495ae853SAndroid Build Coastguard Worker
1775*495ae853SAndroid Build Coastguard Worker if(u1_del_node)
1776*495ae853SAndroid Build Coastguard Worker {
1777*495ae853SAndroid Build Coastguard Worker u1_st_ref_bufs--;
1778*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->u1_used_as_ref =
1779*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1780*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->s_top_field.u1_reference_info =
1781*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1782*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->s_bot_field.u1_reference_info =
1783*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1784*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1785*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->u1_buf_id);
1786*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->ps_pic_buf = NULL;
1787*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short = NULL;
1788*495ae853SAndroid Build Coastguard Worker }
1789*495ae853SAndroid Build Coastguard Worker }
1790*495ae853SAndroid Build Coastguard Worker else
1791*495ae853SAndroid Build Coastguard Worker {
1792*495ae853SAndroid Build Coastguard Worker if(u1_st_ref_bufs)
1793*495ae853SAndroid Build Coastguard Worker {
1794*495ae853SAndroid Build Coastguard Worker if(u1_num_gaps)
1795*495ae853SAndroid Build Coastguard Worker {
1796*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1797*495ae853SAndroid Build Coastguard Worker ps_next_dpb->i4_frame_num,
1798*495ae853SAndroid Build Coastguard Worker &u1_del_node);
1799*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1800*495ae853SAndroid Build Coastguard Worker return ret;
1801*495ae853SAndroid Build Coastguard Worker }
1802*495ae853SAndroid Build Coastguard Worker
1803*495ae853SAndroid Build Coastguard Worker if(u1_del_node)
1804*495ae853SAndroid Build Coastguard Worker {
1805*495ae853SAndroid Build Coastguard Worker u1_st_ref_bufs--;
1806*495ae853SAndroid Build Coastguard Worker ps_next_dpb->u1_used_as_ref = FALSE;
1807*495ae853SAndroid Build Coastguard Worker ps_next_dpb->s_top_field.u1_reference_info =
1808*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1809*495ae853SAndroid Build Coastguard Worker ps_next_dpb->s_bot_field.u1_reference_info =
1810*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1811*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1812*495ae853SAndroid Build Coastguard Worker ps_next_dpb->u1_buf_id);
1813*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_pic_buf = NULL;
1814*495ae853SAndroid Build Coastguard Worker ps_next_dpb = NULL;
1815*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->ps_dpb_st_head = NULL;
1816*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs = u1_st_ref_bufs;
1817*495ae853SAndroid Build Coastguard Worker }
1818*495ae853SAndroid Build Coastguard Worker }
1819*495ae853SAndroid Build Coastguard Worker else
1820*495ae853SAndroid Build Coastguard Worker {
1821*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1822*495ae853SAndroid Build Coastguard Worker INVALID_FRAME_NUM,
1823*495ae853SAndroid Build Coastguard Worker &u1_del_node);
1824*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1825*495ae853SAndroid Build Coastguard Worker return ret;
1826*495ae853SAndroid Build Coastguard Worker if(u1_del_node)
1827*495ae853SAndroid Build Coastguard Worker {
1828*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1829*495ae853SAndroid Build Coastguard Worker }
1830*495ae853SAndroid Build Coastguard Worker }
1831*495ae853SAndroid Build Coastguard Worker }
1832*495ae853SAndroid Build Coastguard Worker }
1833*495ae853SAndroid Build Coastguard Worker }
1834*495ae853SAndroid Build Coastguard Worker else
1835*495ae853SAndroid Build Coastguard Worker {
1836*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_gaps += i4_frame_gaps;
1837*495ae853SAndroid Build Coastguard Worker break;
1838*495ae853SAndroid Build Coastguard Worker }
1839*495ae853SAndroid Build Coastguard Worker }
1840*495ae853SAndroid Build Coastguard Worker
1841*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs = u1_st_ref_bufs;
1842*495ae853SAndroid Build Coastguard Worker
1843*495ae853SAndroid Build Coastguard Worker return OK;
1844*495ae853SAndroid Build Coastguard Worker }
1845*495ae853SAndroid Build Coastguard Worker /****************************************************************************/
1846*495ae853SAndroid Build Coastguard Worker /* */
1847*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_free_node_from_dpb */
1848*495ae853SAndroid Build Coastguard Worker /* */
1849*495ae853SAndroid Build Coastguard Worker /* Description : */
1850*495ae853SAndroid Build Coastguard Worker /* */
1851*495ae853SAndroid Build Coastguard Worker /* Inputs : */
1852*495ae853SAndroid Build Coastguard Worker /* */
1853*495ae853SAndroid Build Coastguard Worker /* Globals : */
1854*495ae853SAndroid Build Coastguard Worker /* */
1855*495ae853SAndroid Build Coastguard Worker /* Processing : */
1856*495ae853SAndroid Build Coastguard Worker /* */
1857*495ae853SAndroid Build Coastguard Worker /* Outputs : */
1858*495ae853SAndroid Build Coastguard Worker /* */
1859*495ae853SAndroid Build Coastguard Worker /* Returns : */
1860*495ae853SAndroid Build Coastguard Worker /* */
1861*495ae853SAndroid Build Coastguard Worker /* Known Issues : */
1862*495ae853SAndroid Build Coastguard Worker /* */
1863*495ae853SAndroid Build Coastguard Worker /* Revision History */
1864*495ae853SAndroid Build Coastguard Worker /* */
1865*495ae853SAndroid Build Coastguard Worker /* DD MM YY Author Changes */
1866*495ae853SAndroid Build Coastguard Worker /* Sarat */
1867*495ae853SAndroid Build Coastguard Worker /****************************************************************************/
1868*495ae853SAndroid Build Coastguard Worker /**** Function Added for Error Resilience *****/
ih264d_free_node_from_dpb(dpb_manager_t * ps_dpb_mgr,UWORD32 u4_cur_pic_num,UWORD8 u1_numRef_frames_for_seq)1869*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_free_node_from_dpb(dpb_manager_t *ps_dpb_mgr,
1870*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_pic_num,
1871*495ae853SAndroid Build Coastguard Worker UWORD8 u1_numRef_frames_for_seq)
1872*495ae853SAndroid Build Coastguard Worker {
1873*495ae853SAndroid Build Coastguard Worker WORD32 i;
1874*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_gaps = ps_dpb_mgr->u1_num_gaps;
1875*495ae853SAndroid Build Coastguard Worker struct dpb_info_t *ps_next_dpb;
1876*495ae853SAndroid Build Coastguard Worker UWORD8 u1_del_node = 1;
1877*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1878*495ae853SAndroid Build Coastguard Worker
1879*495ae853SAndroid Build Coastguard Worker //Sliding window - implements 8.2.5.3
1880*495ae853SAndroid Build Coastguard Worker if((ps_dpb_mgr->u1_num_st_ref_bufs + ps_dpb_mgr->u1_num_lt_ref_bufs
1881*495ae853SAndroid Build Coastguard Worker + u1_num_gaps) == u1_numRef_frames_for_seq)
1882*495ae853SAndroid Build Coastguard Worker {
1883*495ae853SAndroid Build Coastguard Worker UWORD8 u1_new_node_flag = 1;
1884*495ae853SAndroid Build Coastguard Worker if((0 == ps_dpb_mgr->u1_num_st_ref_bufs) && (0 == u1_num_gaps))
1885*495ae853SAndroid Build Coastguard Worker {
1886*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1887*495ae853SAndroid Build Coastguard Worker }
1888*495ae853SAndroid Build Coastguard Worker
1889*495ae853SAndroid Build Coastguard Worker // Chase the links to reach the last but one picNum, if available
1890*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1891*495ae853SAndroid Build Coastguard Worker
1892*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->u1_num_st_ref_bufs > 1)
1893*495ae853SAndroid Build Coastguard Worker {
1894*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->i4_frame_num == (WORD32)u4_cur_pic_num)
1895*495ae853SAndroid Build Coastguard Worker {
1896*495ae853SAndroid Build Coastguard Worker /* Incase of filed pictures top_field has been allocated */
1897*495ae853SAndroid Build Coastguard Worker /* picture buffer and complementary bottom field pair comes */
1898*495ae853SAndroid Build Coastguard Worker /* then the sliding window mechanism should not allocate a */
1899*495ae853SAndroid Build Coastguard Worker /* new node */
1900*495ae853SAndroid Build Coastguard Worker u1_new_node_flag = 0;
1901*495ae853SAndroid Build Coastguard Worker }
1902*495ae853SAndroid Build Coastguard Worker
1903*495ae853SAndroid Build Coastguard Worker for(i = 1; i < (ps_dpb_mgr->u1_num_st_ref_bufs - 1); i++)
1904*495ae853SAndroid Build Coastguard Worker {
1905*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb == NULL)
1906*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1907*495ae853SAndroid Build Coastguard Worker
1908*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->i4_frame_num == (WORD32)u4_cur_pic_num)
1909*495ae853SAndroid Build Coastguard Worker {
1910*495ae853SAndroid Build Coastguard Worker /* Incase of field pictures top_field has been allocated */
1911*495ae853SAndroid Build Coastguard Worker /* picture buffer and complementary bottom field pair comes */
1912*495ae853SAndroid Build Coastguard Worker /* then the sliding window mechanism should not allocate a */
1913*495ae853SAndroid Build Coastguard Worker /* new node */
1914*495ae853SAndroid Build Coastguard Worker u1_new_node_flag = 0;
1915*495ae853SAndroid Build Coastguard Worker }
1916*495ae853SAndroid Build Coastguard Worker ps_next_dpb = ps_next_dpb->ps_prev_short;
1917*495ae853SAndroid Build Coastguard Worker }
1918*495ae853SAndroid Build Coastguard Worker
1919*495ae853SAndroid Build Coastguard Worker if(ps_next_dpb->ps_prev_short->ps_prev_short != NULL)
1920*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1921*495ae853SAndroid Build Coastguard Worker
1922*495ae853SAndroid Build Coastguard Worker if(u1_new_node_flag)
1923*495ae853SAndroid Build Coastguard Worker {
1924*495ae853SAndroid Build Coastguard Worker if(u1_num_gaps)
1925*495ae853SAndroid Build Coastguard Worker {
1926*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1927*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->i4_frame_num,
1928*495ae853SAndroid Build Coastguard Worker &u1_del_node);
1929*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1930*495ae853SAndroid Build Coastguard Worker return ret;
1931*495ae853SAndroid Build Coastguard Worker }
1932*495ae853SAndroid Build Coastguard Worker
1933*495ae853SAndroid Build Coastguard Worker if(u1_del_node)
1934*495ae853SAndroid Build Coastguard Worker {
1935*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs--;
1936*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->u1_used_as_ref = UNUSED_FOR_REF;
1937*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->s_top_field.u1_reference_info =
1938*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1939*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->s_bot_field.u1_reference_info =
1940*495ae853SAndroid Build Coastguard Worker UNUSED_FOR_REF;
1941*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1942*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->u1_buf_id);
1943*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short->ps_pic_buf = NULL;
1944*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_prev_short = NULL;
1945*495ae853SAndroid Build Coastguard Worker }
1946*495ae853SAndroid Build Coastguard Worker }
1947*495ae853SAndroid Build Coastguard Worker }
1948*495ae853SAndroid Build Coastguard Worker else
1949*495ae853SAndroid Build Coastguard Worker {
1950*495ae853SAndroid Build Coastguard Worker if(ps_dpb_mgr->u1_num_st_ref_bufs)
1951*495ae853SAndroid Build Coastguard Worker {
1952*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr,
1953*495ae853SAndroid Build Coastguard Worker ps_next_dpb->i4_frame_num,
1954*495ae853SAndroid Build Coastguard Worker &u1_del_node);
1955*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1956*495ae853SAndroid Build Coastguard Worker return ret;
1957*495ae853SAndroid Build Coastguard Worker if((ps_next_dpb->i4_frame_num != (WORD32)u4_cur_pic_num)
1958*495ae853SAndroid Build Coastguard Worker && u1_del_node)
1959*495ae853SAndroid Build Coastguard Worker {
1960*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->u1_num_st_ref_bufs--;
1961*495ae853SAndroid Build Coastguard Worker ps_next_dpb->u1_used_as_ref = FALSE;
1962*495ae853SAndroid Build Coastguard Worker ps_next_dpb->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1963*495ae853SAndroid Build Coastguard Worker ps_next_dpb->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1964*495ae853SAndroid Build Coastguard Worker ih264d_free_ref_pic_mv_bufs(ps_dpb_mgr->pv_codec_handle,
1965*495ae853SAndroid Build Coastguard Worker ps_next_dpb->u1_buf_id);
1966*495ae853SAndroid Build Coastguard Worker ps_next_dpb->ps_pic_buf = NULL;
1967*495ae853SAndroid Build Coastguard Worker ps_next_dpb = NULL;
1968*495ae853SAndroid Build Coastguard Worker }
1969*495ae853SAndroid Build Coastguard Worker }
1970*495ae853SAndroid Build Coastguard Worker else
1971*495ae853SAndroid Build Coastguard Worker {
1972*495ae853SAndroid Build Coastguard Worker ret = ih264d_delete_gap_frm_sliding(ps_dpb_mgr, INVALID_FRAME_NUM, &u1_del_node);
1973*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1974*495ae853SAndroid Build Coastguard Worker return ret;
1975*495ae853SAndroid Build Coastguard Worker if(u1_del_node)
1976*495ae853SAndroid Build Coastguard Worker return ERROR_DBP_MANAGER_T;
1977*495ae853SAndroid Build Coastguard Worker }
1978*495ae853SAndroid Build Coastguard Worker }
1979*495ae853SAndroid Build Coastguard Worker }
1980*495ae853SAndroid Build Coastguard Worker return OK;
1981*495ae853SAndroid Build Coastguard Worker }
1982*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1983*495ae853SAndroid Build Coastguard Worker /* */
1984*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_delete_nonref_nondisplay_pics */
1985*495ae853SAndroid Build Coastguard Worker /* */
1986*495ae853SAndroid Build Coastguard Worker /* Description : */
1987*495ae853SAndroid Build Coastguard Worker /* */
1988*495ae853SAndroid Build Coastguard Worker /* */
1989*495ae853SAndroid Build Coastguard Worker /* Inputs : */
1990*495ae853SAndroid Build Coastguard Worker /* Globals : */
1991*495ae853SAndroid Build Coastguard Worker /* Processing : */
1992*495ae853SAndroid Build Coastguard Worker /* */
1993*495ae853SAndroid Build Coastguard Worker /* Outputs : */
1994*495ae853SAndroid Build Coastguard Worker /* Returns : */
1995*495ae853SAndroid Build Coastguard Worker /* */
1996*495ae853SAndroid Build Coastguard Worker /* Issues : */
1997*495ae853SAndroid Build Coastguard Worker /* */
1998*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1999*495ae853SAndroid Build Coastguard Worker /* */
2000*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
2001*495ae853SAndroid Build Coastguard Worker /* 05 06 2007 Varun Draft */
2002*495ae853SAndroid Build Coastguard Worker /* */
2003*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2004*495ae853SAndroid Build Coastguard Worker
ih264d_delete_nonref_nondisplay_pics(dpb_manager_t * ps_dpb_mgr)2005*495ae853SAndroid Build Coastguard Worker void ih264d_delete_nonref_nondisplay_pics(dpb_manager_t *ps_dpb_mgr)
2006*495ae853SAndroid Build Coastguard Worker {
2007*495ae853SAndroid Build Coastguard Worker WORD8 i;
2008*495ae853SAndroid Build Coastguard Worker WORD32 (*i4_poc_buf_id_map)[3] = ps_dpb_mgr->ai4_poc_buf_id_map;
2009*495ae853SAndroid Build Coastguard Worker
2010*495ae853SAndroid Build Coastguard Worker /* remove all gaps marked as unused for ref */
2011*495ae853SAndroid Build Coastguard Worker for(i = 0; (i < MAX_FRAMES) && ps_dpb_mgr->i1_gaps_deleted; i++)
2012*495ae853SAndroid Build Coastguard Worker {
2013*495ae853SAndroid Build Coastguard Worker if(GAP_FRAME_NUM == i4_poc_buf_id_map[i][2])
2014*495ae853SAndroid Build Coastguard Worker {
2015*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->i1_gaps_deleted--;
2016*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->i1_poc_buf_id_entries--;
2017*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i][0] = -1;
2018*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i][1] = 0x7fffffff;
2019*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i][2] = 0;
2020*495ae853SAndroid Build Coastguard Worker }
2021*495ae853SAndroid Build Coastguard Worker }
2022*495ae853SAndroid Build Coastguard Worker }
2023*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2024*495ae853SAndroid Build Coastguard Worker /* */
2025*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_insert_pic_in_display_list */
2026*495ae853SAndroid Build Coastguard Worker /* */
2027*495ae853SAndroid Build Coastguard Worker /* Description : */
2028*495ae853SAndroid Build Coastguard Worker /* */
2029*495ae853SAndroid Build Coastguard Worker /* */
2030*495ae853SAndroid Build Coastguard Worker /* Inputs : */
2031*495ae853SAndroid Build Coastguard Worker /* Globals : */
2032*495ae853SAndroid Build Coastguard Worker /* Processing : */
2033*495ae853SAndroid Build Coastguard Worker /* */
2034*495ae853SAndroid Build Coastguard Worker /* Outputs : */
2035*495ae853SAndroid Build Coastguard Worker /* Returns : */
2036*495ae853SAndroid Build Coastguard Worker /* */
2037*495ae853SAndroid Build Coastguard Worker /* Issues : */
2038*495ae853SAndroid Build Coastguard Worker /* */
2039*495ae853SAndroid Build Coastguard Worker /* Revision History: */
2040*495ae853SAndroid Build Coastguard Worker /* */
2041*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
2042*495ae853SAndroid Build Coastguard Worker /* 05 06 2007 Varun Draft */
2043*495ae853SAndroid Build Coastguard Worker /* */
2044*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2045*495ae853SAndroid Build Coastguard Worker
ih264d_insert_pic_in_display_list(dpb_manager_t * ps_dpb_mgr,UWORD8 u1_buf_id,WORD32 i4_display_poc,UWORD32 u4_frame_num)2046*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_insert_pic_in_display_list(dpb_manager_t *ps_dpb_mgr,
2047*495ae853SAndroid Build Coastguard Worker UWORD8 u1_buf_id,
2048*495ae853SAndroid Build Coastguard Worker WORD32 i4_display_poc,
2049*495ae853SAndroid Build Coastguard Worker UWORD32 u4_frame_num)
2050*495ae853SAndroid Build Coastguard Worker {
2051*495ae853SAndroid Build Coastguard Worker WORD8 i;
2052*495ae853SAndroid Build Coastguard Worker WORD32 (*i4_poc_buf_id_map)[3] = ps_dpb_mgr->ai4_poc_buf_id_map;
2053*495ae853SAndroid Build Coastguard Worker
2054*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_FRAMES; i++)
2055*495ae853SAndroid Build Coastguard Worker {
2056*495ae853SAndroid Build Coastguard Worker /* Find an empty slot */
2057*495ae853SAndroid Build Coastguard Worker if(i4_poc_buf_id_map[i][0] == -1)
2058*495ae853SAndroid Build Coastguard Worker {
2059*495ae853SAndroid Build Coastguard Worker if(GAP_FRAME_NUM == i4_poc_buf_id_map[i][2])
2060*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->i1_gaps_deleted--;
2061*495ae853SAndroid Build Coastguard Worker else
2062*495ae853SAndroid Build Coastguard Worker ps_dpb_mgr->i1_poc_buf_id_entries++;
2063*495ae853SAndroid Build Coastguard Worker
2064*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i][0] = u1_buf_id;
2065*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i][1] = i4_display_poc;
2066*495ae853SAndroid Build Coastguard Worker i4_poc_buf_id_map[i][2] = u4_frame_num;
2067*495ae853SAndroid Build Coastguard Worker
2068*495ae853SAndroid Build Coastguard Worker break;
2069*495ae853SAndroid Build Coastguard Worker }
2070*495ae853SAndroid Build Coastguard Worker }
2071*495ae853SAndroid Build Coastguard Worker
2072*495ae853SAndroid Build Coastguard Worker if(MAX_FRAMES == i)
2073*495ae853SAndroid Build Coastguard Worker {
2074*495ae853SAndroid Build Coastguard Worker
2075*495ae853SAndroid Build Coastguard Worker UWORD32 i4_error_code;
2076*495ae853SAndroid Build Coastguard Worker i4_error_code = ERROR_GAPS_IN_FRM_NUM;
2077*495ae853SAndroid Build Coastguard Worker return i4_error_code;
2078*495ae853SAndroid Build Coastguard Worker }
2079*495ae853SAndroid Build Coastguard Worker return OK;
2080*495ae853SAndroid Build Coastguard Worker }
2081*495ae853SAndroid Build Coastguard Worker
2082