xref: /aosp_15_r20/external/libavc/decoder/ih264d_dpb_mgr.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker #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