xref: /aosp_15_r20/external/libavc/decoder/mvc/imvcd_dpb_manager.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
22*495ae853SAndroid Build Coastguard Worker /*                                                                           */
23*495ae853SAndroid Build Coastguard Worker /*  File Name         : imvcd_nalu_parser.h                                  */
24*495ae853SAndroid Build Coastguard Worker /*                                                                           */
25*495ae853SAndroid Build Coastguard Worker /*  Description       : Functions for MVC NALU parsing                       */
26*495ae853SAndroid Build Coastguard Worker /*                                                                           */
27*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
28*495ae853SAndroid Build Coastguard Worker #include <stdbool.h>
29*495ae853SAndroid Build Coastguard Worker 
30*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
31*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
32*495ae853SAndroid Build Coastguard Worker #include "imvcd_dpb_manager.h"
33*495ae853SAndroid Build Coastguard Worker #include "imvcd_structs.h"
34*495ae853SAndroid Build Coastguard Worker #include "imvcd_utils.h"
35*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_set_display_num(mvc_dpb_manager_t * ps_dpb_mgr,WORD32 i4_display_num)36*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_set_display_num(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_display_num)
37*495ae853SAndroid Build Coastguard Worker {
38*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->i4_cur_display_seq = i4_display_num;
39*495ae853SAndroid Build Coastguard Worker }
40*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_set_max_pic_num(mvc_dpb_manager_t * ps_dpb_mgr,WORD32 i4_max_pic_num)41*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_set_max_pic_num(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_max_pic_num)
42*495ae853SAndroid Build Coastguard Worker {
43*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->i4_max_pic_num = i4_max_pic_num;
44*495ae853SAndroid Build Coastguard Worker }
45*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_set_num_views(mvc_dpb_manager_t * ps_dpb_mgr,UWORD16 u2_num_views)46*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_set_num_views(mvc_dpb_manager_t *ps_dpb_mgr, UWORD16 u2_num_views)
47*495ae853SAndroid Build Coastguard Worker {
48*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u2_num_views = u2_num_views;
49*495ae853SAndroid Build Coastguard Worker }
50*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_set_display_delay(mvc_dpb_manager_t * ps_dpb_mgr,WORD32 i4_display_delay)51*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_set_display_delay(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_display_delay)
52*495ae853SAndroid Build Coastguard Worker {
53*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->i4_display_delay = i4_display_delay;
54*495ae853SAndroid Build Coastguard Worker }
55*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_init_au_bufs(mvc_dpb_manager_t * ps_dpb_mgr,mvc_au_buffer_t * ps_cur_au)56*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_init_au_bufs(mvc_dpb_manager_t *ps_dpb_mgr, mvc_au_buffer_t *ps_cur_au)
57*495ae853SAndroid Build Coastguard Worker {
58*495ae853SAndroid Build Coastguard Worker     WORD32 i;
59*495ae853SAndroid Build Coastguard Worker 
60*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < 2; i++)
61*495ae853SAndroid Build Coastguard Worker     {
62*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->as_init_dpb[i][0] = ps_cur_au[0];
63*495ae853SAndroid Build Coastguard Worker     }
64*495ae853SAndroid Build Coastguard Worker }
65*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_init_view_bufs(mvc_dpb_manager_t * ps_dpb_mgr,UWORD16 u2_view_order_id,UWORD16 u2_view_id)66*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_init_view_bufs(mvc_dpb_manager_t *ps_dpb_mgr, UWORD16 u2_view_order_id,
67*495ae853SAndroid Build Coastguard Worker                               UWORD16 u2_view_id)
68*495ae853SAndroid Build Coastguard Worker {
69*495ae853SAndroid Build Coastguard Worker     WORD32 i;
70*495ae853SAndroid Build Coastguard Worker 
71*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < 2; i++)
72*495ae853SAndroid Build Coastguard Worker     {
73*495ae853SAndroid Build Coastguard Worker         imvcd_convert_au_buf_to_view_buf(&ps_dpb_mgr->as_init_dpb[i][0],
74*495ae853SAndroid Build Coastguard Worker                                          &ps_dpb_mgr->as_view_init_dpb[i][0], u2_view_order_id,
75*495ae853SAndroid Build Coastguard Worker                                          u2_view_id);
76*495ae853SAndroid Build Coastguard Worker     }
77*495ae853SAndroid Build Coastguard Worker }
78*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_init_ivp_ctxt(mvc_dpb_manager_t * ps_dpb_mgr,sps_mvc_ext_t * ps_sps_mvc_ext,nalu_mvc_ext_t * ps_nalu_mvc_exts)79*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_init_ivp_ctxt(mvc_dpb_manager_t *ps_dpb_mgr, sps_mvc_ext_t *ps_sps_mvc_ext,
80*495ae853SAndroid Build Coastguard Worker                              nalu_mvc_ext_t *ps_nalu_mvc_exts)
81*495ae853SAndroid Build Coastguard Worker {
82*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->s_dpb_ivp_ctxt.ps_nalu_mvc_exts = ps_nalu_mvc_exts;
83*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->s_dpb_ivp_ctxt.ps_sps_mvc_ext = ps_sps_mvc_ext;
84*495ae853SAndroid Build Coastguard Worker 
85*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs = 0;
86*495ae853SAndroid Build Coastguard Worker }
87*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_reset_ivp_ctxt(mvc_dpb_manager_t * ps_dpb_mgr)88*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_reset_ivp_ctxt(mvc_dpb_manager_t *ps_dpb_mgr)
89*495ae853SAndroid Build Coastguard Worker {
90*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
91*495ae853SAndroid Build Coastguard Worker 
92*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs; i++)
93*495ae853SAndroid Build Coastguard Worker     {
94*495ae853SAndroid Build Coastguard Worker         ih264_buf_mgr_release(ps_dpb_mgr->ps_mvc_au_buf_mgr->ps_buf_mgr_ctxt,
95*495ae853SAndroid Build Coastguard Worker                               ps_dpb_mgr->s_dpb_ivp_ctxt.au1_au_buf_ids[i],
96*495ae853SAndroid Build Coastguard Worker                               BUF_MGR_REF | BUF_MGR_IO);
97*495ae853SAndroid Build Coastguard Worker 
98*495ae853SAndroid Build Coastguard Worker         ih264_buf_mgr_release(ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr->ps_buf_mgr_ctxt,
99*495ae853SAndroid Build Coastguard Worker                               ps_dpb_mgr->s_dpb_ivp_ctxt.au1_mv_buf_ids[i],
100*495ae853SAndroid Build Coastguard Worker                               BUF_MGR_REF | BUF_MGR_IO);
101*495ae853SAndroid Build Coastguard Worker     }
102*495ae853SAndroid Build Coastguard Worker 
103*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs = 0;
104*495ae853SAndroid Build Coastguard Worker }
105*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_get_view_ref_pic_list(mvc_dpb_manager_t * ps_dpb_mgr,UWORD16 u2_view_order_id,UWORD16 u2_view_id,UWORD8 u1_pred_dir)106*495ae853SAndroid Build Coastguard Worker pic_buffer_t **imvcd_dpb_get_view_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr,
107*495ae853SAndroid Build Coastguard Worker                                                UWORD16 u2_view_order_id, UWORD16 u2_view_id,
108*495ae853SAndroid Build Coastguard Worker                                                UWORD8 u1_pred_dir)
109*495ae853SAndroid Build Coastguard Worker {
110*495ae853SAndroid Build Coastguard Worker     WORD32 i;
111*495ae853SAndroid Build Coastguard Worker 
112*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_ref_bufs = ps_dpb_mgr->au1_num_active_st_refs[u1_pred_dir] +
113*495ae853SAndroid Build Coastguard Worker                              ps_dpb_mgr->au1_num_active_lt_refs[u1_pred_dir];
114*495ae853SAndroid Build Coastguard Worker 
115*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < u1_num_ref_bufs; i++)
116*495ae853SAndroid Build Coastguard Worker     {
117*495ae853SAndroid Build Coastguard Worker         imvcd_convert_au_buf_to_view_buf(ps_dpb_mgr->aps_mod_dpb[u1_pred_dir][i],
118*495ae853SAndroid Build Coastguard Worker                                          &ps_dpb_mgr->as_view_init_dpb[u1_pred_dir][i],
119*495ae853SAndroid Build Coastguard Worker                                          u2_view_order_id, u2_view_id);
120*495ae853SAndroid Build Coastguard Worker 
121*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->aps_view_mod_dpb[u1_pred_dir][i] =
122*495ae853SAndroid Build Coastguard Worker             &ps_dpb_mgr->as_view_init_dpb[u1_pred_dir][i];
123*495ae853SAndroid Build Coastguard Worker     }
124*495ae853SAndroid Build Coastguard Worker 
125*495ae853SAndroid Build Coastguard Worker     return ps_dpb_mgr->aps_view_mod_dpb[u1_pred_dir];
126*495ae853SAndroid Build Coastguard Worker }
127*495ae853SAndroid Build Coastguard Worker 
imvcd_init_dpb_mgr(mvc_dpb_manager_t * ps_dpb_mgr,mvc_au_buf_mgr_t * ps_mvc_au_buf_mgr,mvc_au_mv_pred_buf_mgr_t * ps_mvc_au_mv_pred_buf_mgr,disp_mgr_t * ps_disp_buf_mgr)128*495ae853SAndroid Build Coastguard Worker void imvcd_init_dpb_mgr(mvc_dpb_manager_t *ps_dpb_mgr, mvc_au_buf_mgr_t *ps_mvc_au_buf_mgr,
129*495ae853SAndroid Build Coastguard Worker                         mvc_au_mv_pred_buf_mgr_t *ps_mvc_au_mv_pred_buf_mgr,
130*495ae853SAndroid Build Coastguard Worker                         disp_mgr_t *ps_disp_buf_mgr)
131*495ae853SAndroid Build Coastguard Worker {
132*495ae853SAndroid Build Coastguard Worker     WORD32 i, j, k, l;
133*495ae853SAndroid Build Coastguard Worker 
134*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
135*495ae853SAndroid Build Coastguard Worker 
136*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < 2; i++)
137*495ae853SAndroid Build Coastguard Worker     {
138*495ae853SAndroid Build Coastguard Worker         mvc_au_buffer_t *ps_init_dpb = ps_dpb_mgr->as_init_dpb[i];
139*495ae853SAndroid Build Coastguard Worker         pic_buffer_t *ps_view_init_dpb = ps_dpb_mgr->as_view_init_dpb[i];
140*495ae853SAndroid Build Coastguard Worker 
141*495ae853SAndroid Build Coastguard Worker         for(j = 0; j < MVC_MAX_REF_PICS; j++)
142*495ae853SAndroid Build Coastguard Worker         {
143*495ae853SAndroid Build Coastguard Worker             for(k = 0; k < MAX_NUM_VIEWS; k++)
144*495ae853SAndroid Build Coastguard Worker             {
145*495ae853SAndroid Build Coastguard Worker                 for(l = 0; l < NUM_COMPONENTS; l++)
146*495ae853SAndroid Build Coastguard Worker                 {
147*495ae853SAndroid Build Coastguard Worker                     ps_init_dpb->as_view_buffers[k].as_component_bufs[l].pv_data = NULL;
148*495ae853SAndroid Build Coastguard Worker                 }
149*495ae853SAndroid Build Coastguard Worker             }
150*495ae853SAndroid Build Coastguard Worker 
151*495ae853SAndroid Build Coastguard Worker             ps_view_init_dpb->pu1_buf1 = NULL;
152*495ae853SAndroid Build Coastguard Worker             ps_view_init_dpb->pu1_buf2 = NULL;
153*495ae853SAndroid Build Coastguard Worker             ps_view_init_dpb->pu1_buf3 = NULL;
154*495ae853SAndroid Build Coastguard Worker 
155*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->aps_mod_dpb[i][j] = ps_init_dpb;
156*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->aps_view_mod_dpb[i][j] = ps_view_init_dpb;
157*495ae853SAndroid Build Coastguard Worker 
158*495ae853SAndroid Build Coastguard Worker             ps_init_dpb++;
159*495ae853SAndroid Build Coastguard Worker             ps_view_init_dpb++;
160*495ae853SAndroid Build Coastguard Worker         }
161*495ae853SAndroid Build Coastguard Worker     }
162*495ae853SAndroid Build Coastguard Worker 
163*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MVC_MAX_REF_PICS; i++)
164*495ae853SAndroid Build Coastguard Worker     {
165*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].b_used_as_ref = false;
166*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].ps_prev_short = NULL;
167*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].ps_prev_long = NULL;
168*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].ps_au_buf = NULL;
169*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].s_top_field.u1_reference_info = UNUSED_FOR_REF;
170*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].s_bot_field.u1_reference_info = UNUSED_FOR_REF;
171*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].s_top_field.u1_long_term_frame_idx = MVC_MAX_REF_PICS + 1;
172*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].s_bot_field.u1_long_term_frame_idx = MVC_MAX_REF_PICS + 1;
173*495ae853SAndroid Build Coastguard Worker     }
174*495ae853SAndroid Build Coastguard Worker 
175*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs = 0;
176*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->ps_dpb_st_head = NULL;
177*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->ps_dpb_lt_head = NULL;
178*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->i1_gaps_deleted = 0;
179*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->i1_poc_buf_id_entries = 0;
180*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u1_mmco_error_in_seq = 0;
181*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u1_num_gaps = 0;
182*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->i4_display_delay = 0;
183*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->i4_cur_display_seq = 0;
184*495ae853SAndroid Build Coastguard Worker 
185*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_FRAMES; i++)
186*495ae853SAndroid Build Coastguard Worker     {
187*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
188*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
189*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->ai1_gaps_per_seq[i] = 0;
190*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->as_display_buf_info[i].i4_poc_buf_id = -1;
191*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->as_display_buf_info[i].i4_poc = INT32_MAX;
192*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->as_display_buf_info[i].i4_frame_num = 0;
193*495ae853SAndroid Build Coastguard Worker     }
194*495ae853SAndroid Build Coastguard Worker 
195*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs = 0;
196*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->s_dpb_ivp_ctxt.ps_nalu_mvc_exts = NULL;
197*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->s_dpb_ivp_ctxt.ps_sps_mvc_ext = NULL;
198*495ae853SAndroid Build Coastguard Worker 
199*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->ps_mvc_au_buf_mgr = ps_mvc_au_buf_mgr;
200*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr = ps_mvc_au_mv_pred_buf_mgr;
201*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->ps_disp_buf_mgr = ps_disp_buf_mgr;
202*495ae853SAndroid Build Coastguard Worker }
203*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_assign_display_seq(mvc_dpb_manager_t * ps_dpb_mgr)204*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_dpb_assign_display_seq(mvc_dpb_manager_t *ps_dpb_mgr)
205*495ae853SAndroid Build Coastguard Worker {
206*495ae853SAndroid Build Coastguard Worker     WORD32 i;
207*495ae853SAndroid Build Coastguard Worker 
208*495ae853SAndroid Build Coastguard Worker     display_buf_info_t *ps_display_buf_info = ps_dpb_mgr->as_display_buf_info;
209*495ae853SAndroid Build Coastguard Worker 
210*495ae853SAndroid Build Coastguard Worker     WORD32 i4_min_poc = INT32_MAX;
211*495ae853SAndroid Build Coastguard Worker     WORD32 i4_min_poc_buf_id = -1;
212*495ae853SAndroid Build Coastguard Worker     WORD32 i4_min_index = -1;
213*495ae853SAndroid Build Coastguard Worker 
214*495ae853SAndroid Build Coastguard Worker     if(ps_dpb_mgr->i1_poc_buf_id_entries >= ps_dpb_mgr->i4_display_delay)
215*495ae853SAndroid Build Coastguard Worker     {
216*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < MAX_FRAMES; i++)
217*495ae853SAndroid Build Coastguard Worker         {
218*495ae853SAndroid Build Coastguard Worker             if((-1 != ps_display_buf_info[i].i4_poc_buf_id) &&
219*495ae853SAndroid Build Coastguard Worker                (DO_NOT_DISP != ps_display_buf_info[i].i4_poc_buf_id))
220*495ae853SAndroid Build Coastguard Worker             {
221*495ae853SAndroid Build Coastguard Worker                 /* Checking for <= is necessary to handle cases where there is one
222*495ae853SAndroid Build Coastguard Worker                    valid buffer with poc set to 0x7FFFFFFF. */
223*495ae853SAndroid Build Coastguard Worker                 if(ps_display_buf_info[i].i4_poc <= i4_min_poc)
224*495ae853SAndroid Build Coastguard Worker                 {
225*495ae853SAndroid Build Coastguard Worker                     i4_min_poc = ps_display_buf_info[i].i4_poc;
226*495ae853SAndroid Build Coastguard Worker                     i4_min_poc_buf_id = ps_display_buf_info[i].i4_poc_buf_id;
227*495ae853SAndroid Build Coastguard Worker                     i4_min_index = i;
228*495ae853SAndroid Build Coastguard Worker                 }
229*495ae853SAndroid Build Coastguard Worker             }
230*495ae853SAndroid Build Coastguard Worker         }
231*495ae853SAndroid Build Coastguard Worker 
232*495ae853SAndroid Build Coastguard Worker         if((i4_min_index != -1) && (DO_NOT_DISP != i4_min_poc_buf_id))
233*495ae853SAndroid Build Coastguard Worker         {
234*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->i4_cur_display_seq++;
235*495ae853SAndroid Build Coastguard Worker 
236*495ae853SAndroid Build Coastguard Worker             ih264_disp_mgr_add(
237*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ps_disp_buf_mgr, i4_min_poc_buf_id, ps_dpb_mgr->i4_cur_display_seq,
238*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ps_mvc_au_buf_mgr->aps_buf_id_to_au_buf_map[i4_min_poc_buf_id]);
239*495ae853SAndroid Build Coastguard Worker 
240*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i4_min_index].i4_poc_buf_id = -1;
241*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i4_min_index].i4_poc = 0x7fffffff;
242*495ae853SAndroid Build Coastguard Worker 
243*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->i1_poc_buf_id_entries--;
244*495ae853SAndroid Build Coastguard Worker         }
245*495ae853SAndroid Build Coastguard Worker         else if(DO_NOT_DISP == i4_min_poc_buf_id)
246*495ae853SAndroid Build Coastguard Worker         {
247*495ae853SAndroid Build Coastguard Worker             return ERROR_GAPS_IN_FRM_NUM;
248*495ae853SAndroid Build Coastguard Worker         }
249*495ae853SAndroid Build Coastguard Worker     }
250*495ae853SAndroid Build Coastguard Worker 
251*495ae853SAndroid Build Coastguard Worker     return OK;
252*495ae853SAndroid Build Coastguard Worker }
253*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_insert_pic_in_display_list(mvc_dpb_manager_t * ps_dpb_mgr,WORD32 i4_display_poc,UWORD32 u4_frame_num,WORD32 i4_buf_id)254*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_dpb_insert_pic_in_display_list(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_display_poc,
255*495ae853SAndroid Build Coastguard Worker                                             UWORD32 u4_frame_num, WORD32 i4_buf_id)
256*495ae853SAndroid Build Coastguard Worker {
257*495ae853SAndroid Build Coastguard Worker     WORD32 i;
258*495ae853SAndroid Build Coastguard Worker 
259*495ae853SAndroid Build Coastguard Worker     display_buf_info_t *ps_display_buf_info = ps_dpb_mgr->as_display_buf_info;
260*495ae853SAndroid Build Coastguard Worker 
261*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_FRAMES; i++)
262*495ae853SAndroid Build Coastguard Worker     {
263*495ae853SAndroid Build Coastguard Worker         /* Find an empty slot */
264*495ae853SAndroid Build Coastguard Worker         if(ps_display_buf_info[i].i4_poc_buf_id == -1)
265*495ae853SAndroid Build Coastguard Worker         {
266*495ae853SAndroid Build Coastguard Worker             if(GAP_FRAME_NUM == ps_display_buf_info[i].i4_frame_num)
267*495ae853SAndroid Build Coastguard Worker             {
268*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->i1_gaps_deleted--;
269*495ae853SAndroid Build Coastguard Worker             }
270*495ae853SAndroid Build Coastguard Worker             else
271*495ae853SAndroid Build Coastguard Worker             {
272*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->i1_poc_buf_id_entries++;
273*495ae853SAndroid Build Coastguard Worker             }
274*495ae853SAndroid Build Coastguard Worker 
275*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i].i4_poc_buf_id = i4_buf_id;
276*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i].i4_poc = i4_display_poc;
277*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i].i4_frame_num = u4_frame_num;
278*495ae853SAndroid Build Coastguard Worker 
279*495ae853SAndroid Build Coastguard Worker             break;
280*495ae853SAndroid Build Coastguard Worker         }
281*495ae853SAndroid Build Coastguard Worker     }
282*495ae853SAndroid Build Coastguard Worker 
283*495ae853SAndroid Build Coastguard Worker     if(MAX_FRAMES == i)
284*495ae853SAndroid Build Coastguard Worker     {
285*495ae853SAndroid Build Coastguard Worker         return ERROR_GAPS_IN_FRM_NUM;
286*495ae853SAndroid Build Coastguard Worker     }
287*495ae853SAndroid Build Coastguard Worker 
288*495ae853SAndroid Build Coastguard Worker     return OK;
289*495ae853SAndroid Build Coastguard Worker }
290*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_delete_gap_frm_sliding(mvc_dpb_manager_t * ps_dpb_mgr,WORD32 i4_pic_num,UWORD8 * pu1_del_node)291*495ae853SAndroid Build Coastguard Worker static WORD32 imvcd_dpb_delete_gap_frm_sliding(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_pic_num,
292*495ae853SAndroid Build Coastguard Worker                                                UWORD8 *pu1_del_node)
293*495ae853SAndroid Build Coastguard Worker {
294*495ae853SAndroid Build Coastguard Worker     WORD32 i, j, j_min;
295*495ae853SAndroid Build Coastguard Worker     WORD8 i1_gap_idx;
296*495ae853SAndroid Build Coastguard Worker     WORD32 *pi4_gaps_start_frm_num, *pi4_gaps_end_frm_num, i4_gap_frame_num;
297*495ae853SAndroid Build Coastguard Worker     WORD32 i4_start_frm_num, i4_end_frm_num;
298*495ae853SAndroid Build Coastguard Worker     WORD32 i4_max_pic_num;
299*495ae853SAndroid Build Coastguard Worker     WORD32 i4_frm_num, i4_gap_frm_num_min;
300*495ae853SAndroid Build Coastguard Worker 
301*495ae853SAndroid Build Coastguard Worker     /* find the least frame num from gaps and current DPB node    */
302*495ae853SAndroid Build Coastguard Worker     /* Delete the least one                                       */
303*495ae853SAndroid Build Coastguard Worker     *pu1_del_node = 1;
304*495ae853SAndroid Build Coastguard Worker 
305*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dpb_mgr->u1_num_gaps)
306*495ae853SAndroid Build Coastguard Worker     {
307*495ae853SAndroid Build Coastguard Worker         return OK;
308*495ae853SAndroid Build Coastguard Worker     }
309*495ae853SAndroid Build Coastguard Worker 
310*495ae853SAndroid Build Coastguard Worker     pi4_gaps_start_frm_num = ps_dpb_mgr->ai4_gaps_start_frm_num;
311*495ae853SAndroid Build Coastguard Worker     pi4_gaps_end_frm_num = ps_dpb_mgr->ai4_gaps_end_frm_num;
312*495ae853SAndroid Build Coastguard Worker     i4_gap_frame_num = INVALID_FRAME_NUM;
313*495ae853SAndroid Build Coastguard Worker     i4_max_pic_num = ps_dpb_mgr->i4_max_pic_num;
314*495ae853SAndroid Build Coastguard Worker 
315*495ae853SAndroid Build Coastguard Worker     i1_gap_idx = -1;
316*495ae853SAndroid Build Coastguard Worker 
317*495ae853SAndroid Build Coastguard Worker     if(INVALID_FRAME_NUM != i4_pic_num)
318*495ae853SAndroid Build Coastguard Worker     {
319*495ae853SAndroid Build Coastguard Worker         i4_gap_frame_num = i4_pic_num;
320*495ae853SAndroid Build Coastguard Worker 
321*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < MAX_FRAMES; i++)
322*495ae853SAndroid Build Coastguard Worker         {
323*495ae853SAndroid Build Coastguard Worker             i4_start_frm_num = pi4_gaps_start_frm_num[i];
324*495ae853SAndroid Build Coastguard Worker 
325*495ae853SAndroid Build Coastguard Worker             if(INVALID_FRAME_NUM != i4_start_frm_num)
326*495ae853SAndroid Build Coastguard Worker             {
327*495ae853SAndroid Build Coastguard Worker                 i4_end_frm_num = pi4_gaps_end_frm_num[i];
328*495ae853SAndroid Build Coastguard Worker 
329*495ae853SAndroid Build Coastguard Worker                 if(i4_end_frm_num < i4_max_pic_num)
330*495ae853SAndroid Build Coastguard Worker                 {
331*495ae853SAndroid Build Coastguard Worker                     if(i4_start_frm_num <= i4_gap_frame_num)
332*495ae853SAndroid Build Coastguard Worker                     {
333*495ae853SAndroid Build Coastguard Worker                         i4_gap_frame_num = i4_start_frm_num;
334*495ae853SAndroid Build Coastguard Worker                         i1_gap_idx = i;
335*495ae853SAndroid Build Coastguard Worker                     }
336*495ae853SAndroid Build Coastguard Worker                 }
337*495ae853SAndroid Build Coastguard Worker                 else
338*495ae853SAndroid Build Coastguard Worker                 {
339*495ae853SAndroid Build Coastguard Worker                     if(((i4_start_frm_num <= i4_gap_frame_num) &&
340*495ae853SAndroid Build Coastguard Worker                         (i4_gap_frame_num <= i4_max_pic_num)) ||
341*495ae853SAndroid Build Coastguard Worker                        ((i4_start_frm_num >= i4_gap_frame_num) &&
342*495ae853SAndroid Build Coastguard Worker                         ((i4_gap_frame_num + i4_max_pic_num) >= i4_end_frm_num)))
343*495ae853SAndroid Build Coastguard Worker                     {
344*495ae853SAndroid Build Coastguard Worker                         i4_gap_frame_num = i4_start_frm_num;
345*495ae853SAndroid Build Coastguard Worker                         i1_gap_idx = i;
346*495ae853SAndroid Build Coastguard Worker                     }
347*495ae853SAndroid Build Coastguard Worker                 }
348*495ae853SAndroid Build Coastguard Worker             }
349*495ae853SAndroid Build Coastguard Worker         }
350*495ae853SAndroid Build Coastguard Worker     }
351*495ae853SAndroid Build Coastguard Worker     else
352*495ae853SAndroid Build Coastguard Worker     {
353*495ae853SAndroid Build Coastguard Worker         /* no valid short term buffers, delete one gap from the least start */
354*495ae853SAndroid Build Coastguard Worker         /* of gap sequence                                                  */
355*495ae853SAndroid Build Coastguard Worker         i4_gap_frame_num = pi4_gaps_start_frm_num[0];
356*495ae853SAndroid Build Coastguard Worker         i1_gap_idx = 0;
357*495ae853SAndroid Build Coastguard Worker 
358*495ae853SAndroid Build Coastguard Worker         for(i = 1; i < MAX_FRAMES; i++)
359*495ae853SAndroid Build Coastguard Worker         {
360*495ae853SAndroid Build Coastguard Worker             if(INVALID_FRAME_NUM != pi4_gaps_start_frm_num[i])
361*495ae853SAndroid Build Coastguard Worker             {
362*495ae853SAndroid Build Coastguard Worker                 if(pi4_gaps_start_frm_num[i] < i4_gap_frame_num)
363*495ae853SAndroid Build Coastguard Worker                 {
364*495ae853SAndroid Build Coastguard Worker                     i4_gap_frame_num = pi4_gaps_start_frm_num[i];
365*495ae853SAndroid Build Coastguard Worker                     i1_gap_idx = i;
366*495ae853SAndroid Build Coastguard Worker                 }
367*495ae853SAndroid Build Coastguard Worker             }
368*495ae853SAndroid Build Coastguard Worker         }
369*495ae853SAndroid Build Coastguard Worker         if(INVALID_FRAME_NUM == i4_gap_frame_num)
370*495ae853SAndroid Build Coastguard Worker         {
371*495ae853SAndroid Build Coastguard Worker             return ERROR_DBP_MANAGER_T;
372*495ae853SAndroid Build Coastguard Worker         }
373*495ae853SAndroid Build Coastguard Worker     }
374*495ae853SAndroid Build Coastguard Worker 
375*495ae853SAndroid Build Coastguard Worker     if(-1 != i1_gap_idx)
376*495ae853SAndroid Build Coastguard Worker     {
377*495ae853SAndroid Build Coastguard Worker         /* find least frame_num in the poc_map, which is in this range */
378*495ae853SAndroid Build Coastguard Worker         i4_start_frm_num = pi4_gaps_start_frm_num[i1_gap_idx];
379*495ae853SAndroid Build Coastguard Worker 
380*495ae853SAndroid Build Coastguard Worker         if(i4_start_frm_num < 0)
381*495ae853SAndroid Build Coastguard Worker         {
382*495ae853SAndroid Build Coastguard Worker             i4_start_frm_num += i4_max_pic_num;
383*495ae853SAndroid Build Coastguard Worker         }
384*495ae853SAndroid Build Coastguard Worker 
385*495ae853SAndroid Build Coastguard Worker         i4_end_frm_num = pi4_gaps_end_frm_num[i1_gap_idx];
386*495ae853SAndroid Build Coastguard Worker 
387*495ae853SAndroid Build Coastguard Worker         if(i4_end_frm_num < 0)
388*495ae853SAndroid Build Coastguard Worker         {
389*495ae853SAndroid Build Coastguard Worker             i4_end_frm_num += i4_max_pic_num;
390*495ae853SAndroid Build Coastguard Worker         }
391*495ae853SAndroid Build Coastguard Worker 
392*495ae853SAndroid Build Coastguard Worker         i4_gap_frm_num_min = INT32_MIN;
393*495ae853SAndroid Build Coastguard Worker         j_min = MAX_FRAMES;
394*495ae853SAndroid Build Coastguard Worker 
395*495ae853SAndroid Build Coastguard Worker         for(j = 0; j < MAX_FRAMES; j++)
396*495ae853SAndroid Build Coastguard Worker         {
397*495ae853SAndroid Build Coastguard Worker             i4_frm_num = ps_dpb_mgr->as_display_buf_info[j].i4_frame_num;
398*495ae853SAndroid Build Coastguard Worker 
399*495ae853SAndroid Build Coastguard Worker             if((i4_start_frm_num <= i4_frm_num) && (i4_end_frm_num >= i4_frm_num))
400*495ae853SAndroid Build Coastguard Worker             {
401*495ae853SAndroid Build Coastguard Worker                 if(i4_frm_num < i4_gap_frm_num_min)
402*495ae853SAndroid Build Coastguard Worker                 {
403*495ae853SAndroid Build Coastguard Worker                     j_min = j;
404*495ae853SAndroid Build Coastguard Worker                     i4_gap_frm_num_min = i4_frm_num;
405*495ae853SAndroid Build Coastguard Worker                 }
406*495ae853SAndroid Build Coastguard Worker             }
407*495ae853SAndroid Build Coastguard Worker         }
408*495ae853SAndroid Build Coastguard Worker 
409*495ae853SAndroid Build Coastguard Worker         if(j_min != MAX_FRAMES)
410*495ae853SAndroid Build Coastguard Worker         {
411*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->as_display_buf_info[j_min].i4_poc_buf_id = -1;
412*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->as_display_buf_info[j_min].i4_poc = 0x7fffffff;
413*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->as_display_buf_info[j_min].i4_frame_num = GAP_FRAME_NUM;
414*495ae853SAndroid Build Coastguard Worker 
415*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->i1_gaps_deleted++;
416*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->ai1_gaps_per_seq[i1_gap_idx]--;
417*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->u1_num_gaps--;
418*495ae853SAndroid Build Coastguard Worker             *pu1_del_node = 0;
419*495ae853SAndroid Build Coastguard Worker 
420*495ae853SAndroid Build Coastguard Worker             if(0 == ps_dpb_mgr->ai1_gaps_per_seq[i1_gap_idx])
421*495ae853SAndroid Build Coastguard Worker             {
422*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ai4_gaps_start_frm_num[i1_gap_idx] = INVALID_FRAME_NUM;
423*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ai4_gaps_end_frm_num[i1_gap_idx] = 0;
424*495ae853SAndroid Build Coastguard Worker             }
425*495ae853SAndroid Build Coastguard Worker         }
426*495ae853SAndroid Build Coastguard Worker     }
427*495ae853SAndroid Build Coastguard Worker 
428*495ae853SAndroid Build Coastguard Worker     return OK;
429*495ae853SAndroid Build Coastguard Worker }
430*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_do_mmco_for_gaps(mvc_dpb_manager_t * ps_dpb_mgr,UWORD8 u1_num_ref_frames)431*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_dpb_do_mmco_for_gaps(mvc_dpb_manager_t *ps_dpb_mgr, UWORD8 u1_num_ref_frames)
432*495ae853SAndroid Build Coastguard Worker {
433*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_next_dpb;
434*495ae853SAndroid Build Coastguard Worker 
435*495ae853SAndroid Build Coastguard Worker     WORD32 i;
436*495ae853SAndroid Build Coastguard Worker     WORD32 i4_error_code;
437*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_gaps;
438*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_st_ref_bufs, u1_num_lt_ref_bufs, u1_del_node;
439*495ae853SAndroid Build Coastguard Worker 
440*495ae853SAndroid Build Coastguard Worker     WORD32 i4_frame_gaps = 1;
441*495ae853SAndroid Build Coastguard Worker 
442*495ae853SAndroid Build Coastguard Worker     // Sliding window - implements 8.2.5.3, flush out buffers
443*495ae853SAndroid Build Coastguard Worker     u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_st_ref_bufs;
444*495ae853SAndroid Build Coastguard Worker     u1_num_lt_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs;
445*495ae853SAndroid Build Coastguard Worker 
446*495ae853SAndroid Build Coastguard Worker     while(1)
447*495ae853SAndroid Build Coastguard Worker     {
448*495ae853SAndroid Build Coastguard Worker         u1_num_gaps = ps_dpb_mgr->u1_num_gaps;
449*495ae853SAndroid Build Coastguard Worker 
450*495ae853SAndroid Build Coastguard Worker         if((u1_num_st_ref_bufs + u1_num_lt_ref_bufs + u1_num_gaps + i4_frame_gaps) >
451*495ae853SAndroid Build Coastguard Worker            u1_num_ref_frames)
452*495ae853SAndroid Build Coastguard Worker         {
453*495ae853SAndroid Build Coastguard Worker             if(0 == (u1_num_st_ref_bufs + u1_num_gaps))
454*495ae853SAndroid Build Coastguard Worker             {
455*495ae853SAndroid Build Coastguard Worker                 i4_frame_gaps = 0;
456*495ae853SAndroid Build Coastguard Worker 
457*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->u1_num_gaps = (u1_num_ref_frames - u1_num_lt_ref_bufs);
458*495ae853SAndroid Build Coastguard Worker             }
459*495ae853SAndroid Build Coastguard Worker             else
460*495ae853SAndroid Build Coastguard Worker             {
461*495ae853SAndroid Build Coastguard Worker                 u1_del_node = 1;
462*495ae853SAndroid Build Coastguard Worker                 ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
463*495ae853SAndroid Build Coastguard Worker 
464*495ae853SAndroid Build Coastguard Worker                 if(u1_num_st_ref_bufs > 1)
465*495ae853SAndroid Build Coastguard Worker                 {
466*495ae853SAndroid Build Coastguard Worker                     for(i = 1; i < (u1_num_st_ref_bufs - 1); i++)
467*495ae853SAndroid Build Coastguard Worker                     {
468*495ae853SAndroid Build Coastguard Worker                         if(ps_next_dpb == NULL)
469*495ae853SAndroid Build Coastguard Worker                         {
470*495ae853SAndroid Build Coastguard Worker                             return ERROR_DBP_MANAGER_T;
471*495ae853SAndroid Build Coastguard Worker                         }
472*495ae853SAndroid Build Coastguard Worker 
473*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb = ps_next_dpb->ps_prev_short;
474*495ae853SAndroid Build Coastguard Worker                     }
475*495ae853SAndroid Build Coastguard Worker 
476*495ae853SAndroid Build Coastguard Worker                     if(ps_next_dpb->ps_prev_short->ps_prev_short != NULL)
477*495ae853SAndroid Build Coastguard Worker                     {
478*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
479*495ae853SAndroid Build Coastguard Worker                     }
480*495ae853SAndroid Build Coastguard Worker 
481*495ae853SAndroid Build Coastguard Worker                     if(u1_num_gaps)
482*495ae853SAndroid Build Coastguard Worker                     {
483*495ae853SAndroid Build Coastguard Worker                         i4_error_code = imvcd_dpb_delete_gap_frm_sliding(
484*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr, ps_next_dpb->ps_prev_short->ps_au_buf->i4_pic_num,
485*495ae853SAndroid Build Coastguard Worker                             &u1_del_node);
486*495ae853SAndroid Build Coastguard Worker 
487*495ae853SAndroid Build Coastguard Worker                         if(i4_error_code != OK)
488*495ae853SAndroid Build Coastguard Worker                         {
489*495ae853SAndroid Build Coastguard Worker                             return i4_error_code;
490*495ae853SAndroid Build Coastguard Worker                         }
491*495ae853SAndroid Build Coastguard Worker                     }
492*495ae853SAndroid Build Coastguard Worker 
493*495ae853SAndroid Build Coastguard Worker                     if(u1_del_node)
494*495ae853SAndroid Build Coastguard Worker                     {
495*495ae853SAndroid Build Coastguard Worker                         u1_num_st_ref_bufs--;
496*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short->b_used_as_ref = false;
497*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short->s_top_field.u1_reference_info = UNUSED_FOR_REF;
498*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
499*495ae853SAndroid Build Coastguard Worker 
500*495ae853SAndroid Build Coastguard Worker                         imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
501*495ae853SAndroid Build Coastguard Worker                                             ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
502*495ae853SAndroid Build Coastguard Worker                                             ps_next_dpb->ps_prev_short->ps_au_buf->i4_pic_buf_id);
503*495ae853SAndroid Build Coastguard Worker 
504*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short->ps_au_buf = NULL;
505*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short = NULL;
506*495ae853SAndroid Build Coastguard Worker                     }
507*495ae853SAndroid Build Coastguard Worker                 }
508*495ae853SAndroid Build Coastguard Worker                 else
509*495ae853SAndroid Build Coastguard Worker                 {
510*495ae853SAndroid Build Coastguard Worker                     if(u1_num_st_ref_bufs)
511*495ae853SAndroid Build Coastguard Worker                     {
512*495ae853SAndroid Build Coastguard Worker                         if(u1_num_gaps)
513*495ae853SAndroid Build Coastguard Worker                         {
514*495ae853SAndroid Build Coastguard Worker                             i4_error_code = imvcd_dpb_delete_gap_frm_sliding(
515*495ae853SAndroid Build Coastguard Worker                                 ps_dpb_mgr, ps_next_dpb->ps_au_buf->i4_pic_num, &u1_del_node);
516*495ae853SAndroid Build Coastguard Worker 
517*495ae853SAndroid Build Coastguard Worker                             if(i4_error_code != OK)
518*495ae853SAndroid Build Coastguard Worker                             {
519*495ae853SAndroid Build Coastguard Worker                                 return i4_error_code;
520*495ae853SAndroid Build Coastguard Worker                             }
521*495ae853SAndroid Build Coastguard Worker                         }
522*495ae853SAndroid Build Coastguard Worker 
523*495ae853SAndroid Build Coastguard Worker                         if(u1_del_node)
524*495ae853SAndroid Build Coastguard Worker                         {
525*495ae853SAndroid Build Coastguard Worker                             u1_num_st_ref_bufs--;
526*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb->b_used_as_ref = false;
527*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb->s_top_field.u1_reference_info = UNUSED_FOR_REF;
528*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
529*495ae853SAndroid Build Coastguard Worker 
530*495ae853SAndroid Build Coastguard Worker                             imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
531*495ae853SAndroid Build Coastguard Worker                                                 ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
532*495ae853SAndroid Build Coastguard Worker                                                 ps_next_dpb->ps_au_buf->i4_pic_buf_id);
533*495ae853SAndroid Build Coastguard Worker 
534*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb->ps_au_buf = NULL;
535*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb = NULL;
536*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr->ps_dpb_st_head = NULL;
537*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr->u1_num_st_ref_bufs = u1_num_st_ref_bufs;
538*495ae853SAndroid Build Coastguard Worker                         }
539*495ae853SAndroid Build Coastguard Worker                     }
540*495ae853SAndroid Build Coastguard Worker                     else
541*495ae853SAndroid Build Coastguard Worker                     {
542*495ae853SAndroid Build Coastguard Worker                         i4_error_code = imvcd_dpb_delete_gap_frm_sliding(
543*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr, INVALID_FRAME_NUM, &u1_del_node);
544*495ae853SAndroid Build Coastguard Worker 
545*495ae853SAndroid Build Coastguard Worker                         if(i4_error_code != OK)
546*495ae853SAndroid Build Coastguard Worker                         {
547*495ae853SAndroid Build Coastguard Worker                             return i4_error_code;
548*495ae853SAndroid Build Coastguard Worker                         }
549*495ae853SAndroid Build Coastguard Worker 
550*495ae853SAndroid Build Coastguard Worker                         if(u1_del_node)
551*495ae853SAndroid Build Coastguard Worker                         {
552*495ae853SAndroid Build Coastguard Worker                             return ERROR_DBP_MANAGER_T;
553*495ae853SAndroid Build Coastguard Worker                         }
554*495ae853SAndroid Build Coastguard Worker                     }
555*495ae853SAndroid Build Coastguard Worker                 }
556*495ae853SAndroid Build Coastguard Worker             }
557*495ae853SAndroid Build Coastguard Worker         }
558*495ae853SAndroid Build Coastguard Worker         else
559*495ae853SAndroid Build Coastguard Worker         {
560*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->u1_num_gaps += i4_frame_gaps;
561*495ae853SAndroid Build Coastguard Worker 
562*495ae853SAndroid Build Coastguard Worker             break;
563*495ae853SAndroid Build Coastguard Worker         }
564*495ae853SAndroid Build Coastguard Worker     }
565*495ae853SAndroid Build Coastguard Worker 
566*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u1_num_st_ref_bufs = u1_num_st_ref_bufs;
567*495ae853SAndroid Build Coastguard Worker 
568*495ae853SAndroid Build Coastguard Worker     return OK;
569*495ae853SAndroid Build Coastguard Worker }
570*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_delete_nonref_nondisplay_pics(mvc_dpb_manager_t * ps_dpb_mgr)571*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_delete_nonref_nondisplay_pics(mvc_dpb_manager_t *ps_dpb_mgr)
572*495ae853SAndroid Build Coastguard Worker {
573*495ae853SAndroid Build Coastguard Worker     WORD32 i;
574*495ae853SAndroid Build Coastguard Worker 
575*495ae853SAndroid Build Coastguard Worker     display_buf_info_t *ps_display_buf_info = ps_dpb_mgr->as_display_buf_info;
576*495ae853SAndroid Build Coastguard Worker 
577*495ae853SAndroid Build Coastguard Worker     /* remove all gaps marked as unused for ref */
578*495ae853SAndroid Build Coastguard Worker     for(i = 0; (i < MAX_FRAMES) && ps_dpb_mgr->i1_gaps_deleted; i++)
579*495ae853SAndroid Build Coastguard Worker     {
580*495ae853SAndroid Build Coastguard Worker         if(GAP_FRAME_NUM == ps_display_buf_info[i].i4_frame_num)
581*495ae853SAndroid Build Coastguard Worker         {
582*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->i1_gaps_deleted--;
583*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->i1_poc_buf_id_entries--;
584*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i].i4_poc_buf_id = -1;
585*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i].i4_poc = 0x7fffffff;
586*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i].i4_frame_num = 0;
587*495ae853SAndroid Build Coastguard Worker         }
588*495ae853SAndroid Build Coastguard Worker     }
589*495ae853SAndroid Build Coastguard Worker }
590*495ae853SAndroid Build Coastguard Worker 
imvcd_reset_dpb(mvc_dpb_manager_t * ps_dpb_mgr)591*495ae853SAndroid Build Coastguard Worker void imvcd_reset_dpb(mvc_dpb_manager_t *ps_dpb_mgr)
592*495ae853SAndroid Build Coastguard Worker {
593*495ae853SAndroid Build Coastguard Worker     WORD32 i;
594*495ae853SAndroid Build Coastguard Worker 
595*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
596*495ae853SAndroid Build Coastguard Worker 
597*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MVC_MAX_REF_PICS; i++)
598*495ae853SAndroid Build Coastguard Worker     {
599*495ae853SAndroid Build Coastguard Worker         if(ps_dpb_info[i].b_used_as_ref)
600*495ae853SAndroid Build Coastguard Worker         {
601*495ae853SAndroid Build Coastguard Worker             imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
602*495ae853SAndroid Build Coastguard Worker                                 ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
603*495ae853SAndroid Build Coastguard Worker                                 ps_dpb_info[i].ps_au_buf->i4_pic_buf_id);
604*495ae853SAndroid Build Coastguard Worker 
605*495ae853SAndroid Build Coastguard Worker             ps_dpb_info[i].b_used_as_ref = false;
606*495ae853SAndroid Build Coastguard Worker             ps_dpb_info[i].ps_prev_short = NULL;
607*495ae853SAndroid Build Coastguard Worker             ps_dpb_info[i].ps_prev_long = NULL;
608*495ae853SAndroid Build Coastguard Worker             ps_dpb_info[i].ps_au_buf = NULL;
609*495ae853SAndroid Build Coastguard Worker             ps_dpb_info[i].s_top_field.u1_reference_info = UNUSED_FOR_REF;
610*495ae853SAndroid Build Coastguard Worker             ps_dpb_info[i].s_bot_field.u1_reference_info = UNUSED_FOR_REF;
611*495ae853SAndroid Build Coastguard Worker             ps_dpb_info[i].s_top_field.u1_long_term_frame_idx = MVC_MAX_REF_PICS + 1;
612*495ae853SAndroid Build Coastguard Worker             ps_dpb_info[i].s_bot_field.u1_long_term_frame_idx = MVC_MAX_REF_PICS + 1;
613*495ae853SAndroid Build Coastguard Worker         }
614*495ae853SAndroid Build Coastguard Worker     }
615*495ae853SAndroid Build Coastguard Worker 
616*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs = 0;
617*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->ps_dpb_st_head = NULL;
618*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->ps_dpb_lt_head = NULL;
619*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u1_mmco_error_in_seq = 0;
620*495ae853SAndroid Build Coastguard Worker 
621*495ae853SAndroid Build Coastguard Worker     /* release all gaps */
622*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u1_num_gaps = 0;
623*495ae853SAndroid Build Coastguard Worker 
624*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_FRAMES; i++)
625*495ae853SAndroid Build Coastguard Worker     {
626*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
627*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
628*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->ai1_gaps_per_seq[i] = 0;
629*495ae853SAndroid Build Coastguard Worker     }
630*495ae853SAndroid Build Coastguard Worker }
631*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_release_display_bufs(mvc_dpb_manager_t * ps_dpb_mgr)632*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_release_display_bufs(mvc_dpb_manager_t *ps_dpb_mgr)
633*495ae853SAndroid Build Coastguard Worker {
634*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
635*495ae853SAndroid Build Coastguard Worker 
636*495ae853SAndroid Build Coastguard Worker     display_buf_info_t *ps_display_buf_info = ps_dpb_mgr->as_display_buf_info;
637*495ae853SAndroid Build Coastguard Worker 
638*495ae853SAndroid Build Coastguard Worker     WORD32 i4_min_poc = 0x7fffffff;
639*495ae853SAndroid Build Coastguard Worker     WORD32 i4_min_poc_buf_id = 0;
640*495ae853SAndroid Build Coastguard Worker     WORD32 i4_min_index = 0;
641*495ae853SAndroid Build Coastguard Worker 
642*495ae853SAndroid Build Coastguard Worker     imvcd_dpb_delete_nonref_nondisplay_pics(ps_dpb_mgr);
643*495ae853SAndroid Build Coastguard Worker 
644*495ae853SAndroid Build Coastguard Worker     for(j = 0; j < ps_dpb_mgr->i1_poc_buf_id_entries; j++)
645*495ae853SAndroid Build Coastguard Worker     {
646*495ae853SAndroid Build Coastguard Worker         i4_min_poc = 0x7fffffff;
647*495ae853SAndroid Build Coastguard Worker 
648*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < MAX_FRAMES; i++)
649*495ae853SAndroid Build Coastguard Worker         {
650*495ae853SAndroid Build Coastguard Worker             if(ps_display_buf_info[i].i4_poc_buf_id != -1)
651*495ae853SAndroid Build Coastguard Worker             {
652*495ae853SAndroid Build Coastguard Worker                 /* Checking for <= is necessary to handle cases where there is one
653*495ae853SAndroid Build Coastguard Worker                    valid buffer with poc set to 0x7FFFFFFF. */
654*495ae853SAndroid Build Coastguard Worker                 if(ps_display_buf_info[i].i4_poc <= i4_min_poc)
655*495ae853SAndroid Build Coastguard Worker                 {
656*495ae853SAndroid Build Coastguard Worker                     i4_min_poc = ps_display_buf_info[i].i4_poc;
657*495ae853SAndroid Build Coastguard Worker                     i4_min_poc_buf_id = ps_display_buf_info[i].i4_poc_buf_id;
658*495ae853SAndroid Build Coastguard Worker                     i4_min_index = i;
659*495ae853SAndroid Build Coastguard Worker                 }
660*495ae853SAndroid Build Coastguard Worker             }
661*495ae853SAndroid Build Coastguard Worker         }
662*495ae853SAndroid Build Coastguard Worker 
663*495ae853SAndroid Build Coastguard Worker         if(DO_NOT_DISP != i4_min_poc_buf_id)
664*495ae853SAndroid Build Coastguard Worker         {
665*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->i4_cur_display_seq++;
666*495ae853SAndroid Build Coastguard Worker 
667*495ae853SAndroid Build Coastguard Worker             ih264_disp_mgr_add(
668*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ps_disp_buf_mgr, i4_min_poc_buf_id, ps_dpb_mgr->i4_cur_display_seq,
669*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ps_mvc_au_buf_mgr->aps_buf_id_to_au_buf_map[i4_min_poc_buf_id]);
670*495ae853SAndroid Build Coastguard Worker 
671*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i4_min_index].i4_poc_buf_id = -1;
672*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i4_min_index].i4_poc = 0x7fffffff;
673*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i4_min_index].i4_frame_num = 0;
674*495ae853SAndroid Build Coastguard Worker         }
675*495ae853SAndroid Build Coastguard Worker         else
676*495ae853SAndroid Build Coastguard Worker         {
677*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i4_min_index].i4_poc_buf_id = -1;
678*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i4_min_index].i4_poc = 0x7fffffff;
679*495ae853SAndroid Build Coastguard Worker             ps_display_buf_info[i4_min_index].i4_frame_num = 0;
680*495ae853SAndroid Build Coastguard Worker         }
681*495ae853SAndroid Build Coastguard Worker     }
682*495ae853SAndroid Build Coastguard Worker 
683*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->i1_poc_buf_id_entries = 0;
684*495ae853SAndroid Build Coastguard Worker }
685*495ae853SAndroid Build Coastguard Worker 
imvcd_assign_pic_num(mvc_dpb_manager_t * ps_dpb_mgr,WORD32 i4_max_frame_num,WORD32 i4_cur_frame_num,bool b_are_gaps_in_frame_num_value_allowed)686*495ae853SAndroid Build Coastguard Worker void imvcd_assign_pic_num(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_max_frame_num,
687*495ae853SAndroid Build Coastguard Worker                           WORD32 i4_cur_frame_num, bool b_are_gaps_in_frame_num_value_allowed)
688*495ae853SAndroid Build Coastguard Worker {
689*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_next_dpb;
690*495ae853SAndroid Build Coastguard Worker 
691*495ae853SAndroid Build Coastguard Worker     WORD32 i;
692*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_frame_num;
693*495ae853SAndroid Build Coastguard Worker 
694*495ae853SAndroid Build Coastguard Worker     /* Start from ST head */
695*495ae853SAndroid Build Coastguard Worker     ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
696*495ae853SAndroid Build Coastguard Worker 
697*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
698*495ae853SAndroid Build Coastguard Worker     {
699*495ae853SAndroid Build Coastguard Worker         WORD32 i4_pic_num;
700*495ae853SAndroid Build Coastguard Worker 
701*495ae853SAndroid Build Coastguard Worker         i4_ref_frame_num = ps_next_dpb->ps_au_buf->i4_pic_num;
702*495ae853SAndroid Build Coastguard Worker 
703*495ae853SAndroid Build Coastguard Worker         if(i4_ref_frame_num > i4_cur_frame_num)
704*495ae853SAndroid Build Coastguard Worker         {
705*495ae853SAndroid Build Coastguard Worker             i4_pic_num = i4_ref_frame_num - i4_max_frame_num;
706*495ae853SAndroid Build Coastguard Worker         }
707*495ae853SAndroid Build Coastguard Worker         else
708*495ae853SAndroid Build Coastguard Worker         {
709*495ae853SAndroid Build Coastguard Worker             i4_pic_num = i4_ref_frame_num;
710*495ae853SAndroid Build Coastguard Worker         }
711*495ae853SAndroid Build Coastguard Worker 
712*495ae853SAndroid Build Coastguard Worker         ps_next_dpb->ps_au_buf->i4_pic_num = i4_pic_num;
713*495ae853SAndroid Build Coastguard Worker 
714*495ae853SAndroid Build Coastguard Worker         ps_next_dpb = ps_next_dpb->ps_prev_short;
715*495ae853SAndroid Build Coastguard Worker     }
716*495ae853SAndroid Build Coastguard Worker 
717*495ae853SAndroid Build Coastguard Worker     if(b_are_gaps_in_frame_num_value_allowed && ps_dpb_mgr->u1_num_gaps)
718*495ae853SAndroid Build Coastguard Worker     {
719*495ae853SAndroid Build Coastguard Worker         WORD32 i4_start_frm, i4_end_frm;
720*495ae853SAndroid Build Coastguard Worker 
721*495ae853SAndroid Build Coastguard Worker         /* Assign pic numbers for gaps */
722*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < MAX_FRAMES; i++)
723*495ae853SAndroid Build Coastguard Worker         {
724*495ae853SAndroid Build Coastguard Worker             i4_start_frm = ps_dpb_mgr->ai4_gaps_start_frm_num[i];
725*495ae853SAndroid Build Coastguard Worker 
726*495ae853SAndroid Build Coastguard Worker             if(i4_start_frm != INVALID_FRAME_NUM)
727*495ae853SAndroid Build Coastguard Worker             {
728*495ae853SAndroid Build Coastguard Worker                 if(i4_start_frm > i4_cur_frame_num)
729*495ae853SAndroid Build Coastguard Worker                 {
730*495ae853SAndroid Build Coastguard Worker                     /* gap's frame_num is before Current frame_num in
731*495ae853SAndroid Build Coastguard Worker                      decode order */
732*495ae853SAndroid Build Coastguard Worker                     i4_start_frm -= i4_max_frame_num;
733*495ae853SAndroid Build Coastguard Worker                 }
734*495ae853SAndroid Build Coastguard Worker 
735*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ai4_gaps_start_frm_num[i] = i4_start_frm;
736*495ae853SAndroid Build Coastguard Worker                 i4_end_frm = ps_dpb_mgr->ai4_gaps_end_frm_num[i];
737*495ae853SAndroid Build Coastguard Worker 
738*495ae853SAndroid Build Coastguard Worker                 if(i4_end_frm > i4_cur_frame_num)
739*495ae853SAndroid Build Coastguard Worker                 {
740*495ae853SAndroid Build Coastguard Worker                     /* gap's frame_num is before Current frame_num in
741*495ae853SAndroid Build Coastguard Worker                      decode order */
742*495ae853SAndroid Build Coastguard Worker                     i4_end_frm -= i4_max_frame_num;
743*495ae853SAndroid Build Coastguard Worker                 }
744*495ae853SAndroid Build Coastguard Worker 
745*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ai4_gaps_end_frm_num[i] = i4_end_frm;
746*495ae853SAndroid Build Coastguard Worker             }
747*495ae853SAndroid Build Coastguard Worker         }
748*495ae853SAndroid Build Coastguard Worker     }
749*495ae853SAndroid Build Coastguard Worker }
750*495ae853SAndroid Build Coastguard Worker 
751*495ae853SAndroid Build Coastguard Worker /* If there is common node in both lt_list and st_list, then delete it from */
752*495ae853SAndroid Build Coastguard Worker /* st_list */
imvcd_dpb_st_lt_deduplicator(mvc_dpb_manager_t * ps_dpb_mgr)753*495ae853SAndroid Build Coastguard Worker UWORD8 imvcd_dpb_st_lt_deduplicator(mvc_dpb_manager_t *ps_dpb_mgr)
754*495ae853SAndroid Build Coastguard Worker {
755*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_dpb_lt_head = ps_dpb_mgr->ps_dpb_lt_head;
756*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_lt_curr_dpb = ps_dpb_mgr->ps_dpb_lt_head;
757*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_dpb_st_head = ps_dpb_mgr->ps_dpb_st_head;
758*495ae853SAndroid Build Coastguard Worker 
759*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_no_of_nodes_deleted = 0;
760*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_lt_refs = ps_dpb_mgr->u1_num_lt_ref_bufs;
761*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_st_refs = ps_dpb_mgr->u1_num_st_ref_bufs;
762*495ae853SAndroid Build Coastguard Worker 
763*495ae853SAndroid Build Coastguard Worker     while(u1_num_lt_refs && ps_dpb_lt_head)
764*495ae853SAndroid Build Coastguard Worker     {
765*495ae853SAndroid Build Coastguard Worker         if(ps_dpb_st_head &&
766*495ae853SAndroid Build Coastguard Worker            ((ps_dpb_lt_head->s_bot_field.u1_reference_info |
767*495ae853SAndroid Build Coastguard Worker              ps_dpb_lt_head->s_top_field.u1_reference_info) == (IS_SHORT_TERM | IS_LONG_TERM)))
768*495ae853SAndroid Build Coastguard Worker         {
769*495ae853SAndroid Build Coastguard Worker             mvc_dpb_info_t *ps_st_next_dpb = ps_dpb_st_head;
770*495ae853SAndroid Build Coastguard Worker             mvc_dpb_info_t *ps_st_curr_dpb = ps_dpb_st_head;
771*495ae853SAndroid Build Coastguard Worker 
772*495ae853SAndroid Build Coastguard Worker             while(u1_num_st_refs && ps_st_curr_dpb)
773*495ae853SAndroid Build Coastguard Worker             {
774*495ae853SAndroid Build Coastguard Worker                 if(ps_st_curr_dpb == ps_lt_curr_dpb)
775*495ae853SAndroid Build Coastguard Worker                 {
776*495ae853SAndroid Build Coastguard Worker                     if(u1_num_st_refs == ps_dpb_mgr->u1_num_st_ref_bufs)
777*495ae853SAndroid Build Coastguard Worker                     {
778*495ae853SAndroid Build Coastguard Worker                         ps_dpb_mgr->ps_dpb_st_head = ps_dpb_mgr->ps_dpb_st_head->ps_prev_short;
779*495ae853SAndroid Build Coastguard Worker                         ps_st_curr_dpb = ps_dpb_mgr->ps_dpb_st_head;
780*495ae853SAndroid Build Coastguard Worker                     }
781*495ae853SAndroid Build Coastguard Worker                     else
782*495ae853SAndroid Build Coastguard Worker                     {
783*495ae853SAndroid Build Coastguard Worker                         ps_st_next_dpb->ps_prev_short = ps_st_curr_dpb->ps_prev_short;
784*495ae853SAndroid Build Coastguard Worker                     }
785*495ae853SAndroid Build Coastguard Worker 
786*495ae853SAndroid Build Coastguard Worker                     ps_dpb_mgr->u1_num_st_ref_bufs--;
787*495ae853SAndroid Build Coastguard Worker                     u1_no_of_nodes_deleted++;
788*495ae853SAndroid Build Coastguard Worker 
789*495ae853SAndroid Build Coastguard Worker                     break;
790*495ae853SAndroid Build Coastguard Worker                 }
791*495ae853SAndroid Build Coastguard Worker 
792*495ae853SAndroid Build Coastguard Worker                 ps_st_next_dpb = ps_st_curr_dpb;
793*495ae853SAndroid Build Coastguard Worker                 ps_st_curr_dpb = ps_st_curr_dpb->ps_prev_short;
794*495ae853SAndroid Build Coastguard Worker                 u1_num_st_refs--;
795*495ae853SAndroid Build Coastguard Worker             }
796*495ae853SAndroid Build Coastguard Worker         }
797*495ae853SAndroid Build Coastguard Worker 
798*495ae853SAndroid Build Coastguard Worker         ps_lt_curr_dpb = ps_lt_curr_dpb->ps_prev_long;
799*495ae853SAndroid Build Coastguard Worker         u1_num_lt_refs--;
800*495ae853SAndroid Build Coastguard Worker     }
801*495ae853SAndroid Build Coastguard Worker 
802*495ae853SAndroid Build Coastguard Worker     return u1_no_of_nodes_deleted;
803*495ae853SAndroid Build Coastguard Worker }
804*495ae853SAndroid Build Coastguard Worker 
qsort_pic_num_compare(const void * pv_au1,const void * pv_au2)805*495ae853SAndroid Build Coastguard Worker static int qsort_pic_num_compare(const void *pv_au1, const void *pv_au2)
806*495ae853SAndroid Build Coastguard Worker {
807*495ae853SAndroid Build Coastguard Worker     return ((mvc_au_buffer_t **) pv_au1)[0]->i4_pic_num -
808*495ae853SAndroid Build Coastguard Worker            ((mvc_au_buffer_t **) pv_au2)[0]->i4_pic_num;
809*495ae853SAndroid Build Coastguard Worker }
810*495ae853SAndroid Build Coastguard Worker 
qsort_poc_compare(const void * pv_au1,const void * pv_au2)811*495ae853SAndroid Build Coastguard Worker static int qsort_poc_compare(const void *pv_au1, const void *pv_au2)
812*495ae853SAndroid Build Coastguard Worker {
813*495ae853SAndroid Build Coastguard Worker     return ((mvc_au_buffer_t **) pv_au1)[0]->i4_poc - ((mvc_au_buffer_t **) pv_au2)[0]->i4_poc;
814*495ae853SAndroid Build Coastguard Worker }
815*495ae853SAndroid Build Coastguard Worker 
qsort_lt_idx_compare(const void * pv_au1,const void * pv_au2)816*495ae853SAndroid Build Coastguard Worker static int qsort_lt_idx_compare(const void *pv_au1, const void *pv_au2)
817*495ae853SAndroid Build Coastguard Worker {
818*495ae853SAndroid Build Coastguard Worker     return ((mvc_au_buffer_t **) pv_au1)[0]->u1_long_term_frm_idx -
819*495ae853SAndroid Build Coastguard Worker            ((mvc_au_buffer_t **) pv_au2)[0]->u1_long_term_frm_idx;
820*495ae853SAndroid Build Coastguard Worker }
821*495ae853SAndroid Build Coastguard Worker 
imvcd_init_ref_pic_list(mvc_dpb_manager_t * ps_dpb_mgr,nalu_mvc_ext_t * ps_cur_nalu_mvc_ext,mvc_au_buffer_t * ps_cur_au,UWORD16 u2_view_order_id)822*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_init_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr, nalu_mvc_ext_t *ps_cur_nalu_mvc_ext,
823*495ae853SAndroid Build Coastguard Worker                                mvc_au_buffer_t *ps_cur_au, UWORD16 u2_view_order_id)
824*495ae853SAndroid Build Coastguard Worker {
825*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_ref_au_data;
826*495ae853SAndroid Build Coastguard Worker     mvc_ivp_ref_data_t *ps_mvc_ivp_ref_data;
827*495ae853SAndroid Build Coastguard Worker 
828*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
829*495ae853SAndroid Build Coastguard Worker 
830*495ae853SAndroid Build Coastguard Worker     mvc_au_buffer_t *aps_st_au_bufs[MVC_MAX_REF_PICS] = {NULL};
831*495ae853SAndroid Build Coastguard Worker     mvc_au_buffer_t *aps_lt_au_bufs[MVC_MAX_REF_PICS] = {NULL};
832*495ae853SAndroid Build Coastguard Worker     mvc_au_buffer_t *aps_ref_pic_buf_lx[2] = {ps_dpb_mgr->as_init_dpb[0],
833*495ae853SAndroid Build Coastguard Worker                                               ps_dpb_mgr->as_init_dpb[1]};
834*495ae853SAndroid Build Coastguard Worker     sps_mvc_ext_t *ps_sps_mvc_ext = ps_dpb_mgr->s_dpb_ivp_ctxt.ps_sps_mvc_ext;
835*495ae853SAndroid Build Coastguard Worker 
836*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_view_id = ps_cur_nalu_mvc_ext->u2_view_id;
837*495ae853SAndroid Build Coastguard Worker     WORD32 i4_cur_poc = ps_cur_au->i4_poc;
838*495ae853SAndroid Build Coastguard Worker     bool b_is_b_pic = !!(ps_cur_au->au4_pack_slc_typ[u2_view_order_id] & B_SLC_BIT);
839*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_num_short_term_refs = ps_dpb_mgr->au1_num_active_st_refs;
840*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_num_long_term_refs = ps_dpb_mgr->au1_num_active_lt_refs;
841*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_total_num_refs[2] = {0};
842*495ae853SAndroid Build Coastguard Worker 
843*495ae853SAndroid Build Coastguard Worker     memset(pu1_num_short_term_refs, 0, 2 * sizeof(pu1_num_short_term_refs[0]));
844*495ae853SAndroid Build Coastguard Worker 
845*495ae853SAndroid Build Coastguard Worker     memset(pu1_num_long_term_refs, 0, 2 * sizeof(pu1_num_long_term_refs[0]));
846*495ae853SAndroid Build Coastguard Worker 
847*495ae853SAndroid Build Coastguard Worker     ps_ref_au_data = ps_dpb_mgr->ps_dpb_st_head;
848*495ae853SAndroid Build Coastguard Worker 
849*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
850*495ae853SAndroid Build Coastguard Worker     {
851*495ae853SAndroid Build Coastguard Worker         aps_st_au_bufs[i] = ps_ref_au_data->ps_au_buf;
852*495ae853SAndroid Build Coastguard Worker         ps_ref_au_data = ps_ref_au_data->ps_prev_short;
853*495ae853SAndroid Build Coastguard Worker     }
854*495ae853SAndroid Build Coastguard Worker 
855*495ae853SAndroid Build Coastguard Worker     qsort(aps_st_au_bufs, ps_dpb_mgr->u1_num_st_ref_bufs, sizeof(aps_st_au_bufs[0]),
856*495ae853SAndroid Build Coastguard Worker           b_is_b_pic ? qsort_poc_compare : qsort_pic_num_compare);
857*495ae853SAndroid Build Coastguard Worker 
858*495ae853SAndroid Build Coastguard Worker     ps_ref_au_data = ps_dpb_mgr->ps_dpb_lt_head;
859*495ae853SAndroid Build Coastguard Worker 
860*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
861*495ae853SAndroid Build Coastguard Worker     {
862*495ae853SAndroid Build Coastguard Worker         aps_lt_au_bufs[i] = ps_ref_au_data->ps_au_buf;
863*495ae853SAndroid Build Coastguard Worker         ps_ref_au_data = ps_ref_au_data->ps_prev_long;
864*495ae853SAndroid Build Coastguard Worker     }
865*495ae853SAndroid Build Coastguard Worker 
866*495ae853SAndroid Build Coastguard Worker     qsort(aps_lt_au_bufs, ps_dpb_mgr->u1_num_lt_ref_bufs, sizeof(aps_lt_au_bufs[0]),
867*495ae853SAndroid Build Coastguard Worker           qsort_lt_idx_compare);
868*495ae853SAndroid Build Coastguard Worker 
869*495ae853SAndroid Build Coastguard Worker     if(b_is_b_pic)
870*495ae853SAndroid Build Coastguard Worker     {
871*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
872*495ae853SAndroid Build Coastguard Worker         {
873*495ae853SAndroid Build Coastguard Worker             if(aps_st_au_bufs[i]->i4_poc >= i4_cur_poc)
874*495ae853SAndroid Build Coastguard Worker             {
875*495ae853SAndroid Build Coastguard Worker                 break;
876*495ae853SAndroid Build Coastguard Worker             }
877*495ae853SAndroid Build Coastguard Worker         }
878*495ae853SAndroid Build Coastguard Worker 
879*495ae853SAndroid Build Coastguard Worker         for(j = i - 1; j >= 0; j--)
880*495ae853SAndroid Build Coastguard Worker         {
881*495ae853SAndroid Build Coastguard Worker             aps_ref_pic_buf_lx[0][0] = aps_st_au_bufs[j][0];
882*495ae853SAndroid Build Coastguard Worker             aps_ref_pic_buf_lx[0]++;
883*495ae853SAndroid Build Coastguard Worker             pu1_num_short_term_refs[0]++;
884*495ae853SAndroid Build Coastguard Worker         }
885*495ae853SAndroid Build Coastguard Worker 
886*495ae853SAndroid Build Coastguard Worker         for(j = i; j < ps_dpb_mgr->u1_num_st_ref_bufs; j++)
887*495ae853SAndroid Build Coastguard Worker         {
888*495ae853SAndroid Build Coastguard Worker             aps_ref_pic_buf_lx[1][0] = aps_st_au_bufs[j][0];
889*495ae853SAndroid Build Coastguard Worker             aps_ref_pic_buf_lx[1]++;
890*495ae853SAndroid Build Coastguard Worker             pu1_num_short_term_refs[1]++;
891*495ae853SAndroid Build Coastguard Worker         }
892*495ae853SAndroid Build Coastguard Worker     }
893*495ae853SAndroid Build Coastguard Worker     else
894*495ae853SAndroid Build Coastguard Worker     {
895*495ae853SAndroid Build Coastguard Worker         for(i = ps_dpb_mgr->u1_num_st_ref_bufs - 1; i >= 0; i--)
896*495ae853SAndroid Build Coastguard Worker         {
897*495ae853SAndroid Build Coastguard Worker             aps_ref_pic_buf_lx[0][0] = aps_st_au_bufs[i][0];
898*495ae853SAndroid Build Coastguard Worker             aps_ref_pic_buf_lx[0]++;
899*495ae853SAndroid Build Coastguard Worker             pu1_num_short_term_refs[0]++;
900*495ae853SAndroid Build Coastguard Worker         }
901*495ae853SAndroid Build Coastguard Worker     }
902*495ae853SAndroid Build Coastguard Worker 
903*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
904*495ae853SAndroid Build Coastguard Worker     {
905*495ae853SAndroid Build Coastguard Worker         for(j = 0; j < 1 + ((WORD32) b_is_b_pic); j++)
906*495ae853SAndroid Build Coastguard Worker         {
907*495ae853SAndroid Build Coastguard Worker             aps_ref_pic_buf_lx[j][0] = aps_lt_au_bufs[i][0];
908*495ae853SAndroid Build Coastguard Worker             aps_ref_pic_buf_lx[j]->u1_long_term_pic_num =
909*495ae853SAndroid Build Coastguard Worker                 aps_ref_pic_buf_lx[j]->u1_long_term_frm_idx;
910*495ae853SAndroid Build Coastguard Worker             aps_ref_pic_buf_lx[j]++;
911*495ae853SAndroid Build Coastguard Worker             pu1_num_long_term_refs[j]++;
912*495ae853SAndroid Build Coastguard Worker         }
913*495ae853SAndroid Build Coastguard Worker     }
914*495ae853SAndroid Build Coastguard Worker 
915*495ae853SAndroid Build Coastguard Worker     if(0 != u2_view_order_id)
916*495ae853SAndroid Build Coastguard Worker     {
917*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs = 0;
918*495ae853SAndroid Build Coastguard Worker 
919*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < 1 + ((WORD32) b_is_b_pic); i++)
920*495ae853SAndroid Build Coastguard Worker         {
921*495ae853SAndroid Build Coastguard Worker             WORD32 i4_num_refs;
922*495ae853SAndroid Build Coastguard Worker 
923*495ae853SAndroid Build Coastguard Worker             if(ps_cur_nalu_mvc_ext->u1_anchor_pic_flag)
924*495ae853SAndroid Build Coastguard Worker             {
925*495ae853SAndroid Build Coastguard Worker                 ps_mvc_ivp_ref_data = &ps_sps_mvc_ext->as_anchor_ref_data[i][u2_view_order_id];
926*495ae853SAndroid Build Coastguard Worker             }
927*495ae853SAndroid Build Coastguard Worker             else
928*495ae853SAndroid Build Coastguard Worker             {
929*495ae853SAndroid Build Coastguard Worker                 ps_mvc_ivp_ref_data = &ps_sps_mvc_ext->as_non_anchor_ref_data[i][u2_view_order_id];
930*495ae853SAndroid Build Coastguard Worker             }
931*495ae853SAndroid Build Coastguard Worker 
932*495ae853SAndroid Build Coastguard Worker             i4_num_refs = ps_mvc_ivp_ref_data->u1_num_refs;
933*495ae853SAndroid Build Coastguard Worker 
934*495ae853SAndroid Build Coastguard Worker             for(j = 0; j < i4_num_refs; j++)
935*495ae853SAndroid Build Coastguard Worker             {
936*495ae853SAndroid Build Coastguard Worker                 mvc_au_buffer_t *ps_au_buf;
937*495ae853SAndroid Build Coastguard Worker                 mvc_au_mv_pred_t *ps_au_mv_data;
938*495ae853SAndroid Build Coastguard Worker                 nalu_mvc_ext_t *ps_ref_nalu_mvc_ext;
939*495ae853SAndroid Build Coastguard Worker 
940*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_pic_buf_id;
941*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_mv_buf_id;
942*495ae853SAndroid Build Coastguard Worker 
943*495ae853SAndroid Build Coastguard Worker                 UWORD16 u2_ref_view_id = ps_mvc_ivp_ref_data->au2_ref_view_ids[j];
944*495ae853SAndroid Build Coastguard Worker 
945*495ae853SAndroid Build Coastguard Worker                 ps_ref_nalu_mvc_ext = imvcd_get_nalu_mvc_ext(
946*495ae853SAndroid Build Coastguard Worker                     ps_dpb_mgr->s_dpb_ivp_ctxt.ps_nalu_mvc_exts, u2_view_order_id, u2_ref_view_id);
947*495ae853SAndroid Build Coastguard Worker 
948*495ae853SAndroid Build Coastguard Worker                 if(!ps_ref_nalu_mvc_ext->u1_inter_view_flag)
949*495ae853SAndroid Build Coastguard Worker                 {
950*495ae853SAndroid Build Coastguard Worker                     continue;
951*495ae853SAndroid Build Coastguard Worker                 }
952*495ae853SAndroid Build Coastguard Worker 
953*495ae853SAndroid Build Coastguard Worker                 ps_au_buf = ih264_buf_mgr_get_next_free(
954*495ae853SAndroid Build Coastguard Worker                     ps_dpb_mgr->ps_mvc_au_buf_mgr->ps_buf_mgr_ctxt, &i4_pic_buf_id);
955*495ae853SAndroid Build Coastguard Worker 
956*495ae853SAndroid Build Coastguard Worker                 if(NULL == ps_au_buf)
957*495ae853SAndroid Build Coastguard Worker                 {
958*495ae853SAndroid Build Coastguard Worker                     return ERROR_UNAVAIL_PICBUF_T;
959*495ae853SAndroid Build Coastguard Worker                 }
960*495ae853SAndroid Build Coastguard Worker                 else
961*495ae853SAndroid Build Coastguard Worker                 {
962*495ae853SAndroid Build Coastguard Worker                     ih264_buf_mgr_set_status(ps_dpb_mgr->ps_mvc_au_buf_mgr->ps_buf_mgr_ctxt,
963*495ae853SAndroid Build Coastguard Worker                                              i4_pic_buf_id, BUF_MGR_REF);
964*495ae853SAndroid Build Coastguard Worker                 }
965*495ae853SAndroid Build Coastguard Worker 
966*495ae853SAndroid Build Coastguard Worker                 ps_au_mv_data = ih264_buf_mgr_get_next_free(
967*495ae853SAndroid Build Coastguard Worker                     ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr->ps_buf_mgr_ctxt, &i4_mv_buf_id);
968*495ae853SAndroid Build Coastguard Worker 
969*495ae853SAndroid Build Coastguard Worker                 if(NULL == ps_au_mv_data)
970*495ae853SAndroid Build Coastguard Worker                 {
971*495ae853SAndroid Build Coastguard Worker                     return ERROR_UNAVAIL_PICBUF_T;
972*495ae853SAndroid Build Coastguard Worker                 }
973*495ae853SAndroid Build Coastguard Worker                 else
974*495ae853SAndroid Build Coastguard Worker                 {
975*495ae853SAndroid Build Coastguard Worker                     ih264_buf_mgr_set_status(ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr->ps_buf_mgr_ctxt,
976*495ae853SAndroid Build Coastguard Worker                                              i4_mv_buf_id, BUF_MGR_REF);
977*495ae853SAndroid Build Coastguard Worker                 }
978*495ae853SAndroid Build Coastguard Worker 
979*495ae853SAndroid Build Coastguard Worker                 ps_au_buf->i4_pic_buf_id = i4_pic_buf_id;
980*495ae853SAndroid Build Coastguard Worker                 ps_au_buf->i4_mv_buf_id = i4_mv_buf_id;
981*495ae853SAndroid Build Coastguard Worker                 ps_au_buf->s_ivp_data.b_is_ivp_ref = true;
982*495ae853SAndroid Build Coastguard Worker                 ps_au_buf->s_ivp_data.u2_ref_view_id = u2_ref_view_id;
983*495ae853SAndroid Build Coastguard Worker 
984*495ae853SAndroid Build Coastguard Worker                 imvcd_ivp_buf_copier(ps_cur_au, ps_au_buf, ps_cur_au->ps_au_mv_data, ps_au_mv_data,
985*495ae853SAndroid Build Coastguard Worker                                      u2_ref_view_id, u2_view_id);
986*495ae853SAndroid Build Coastguard Worker 
987*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ps_mvc_au_buf_mgr->au1_au_buf_id_to_mv_buf_id_map[i4_pic_buf_id] =
988*495ae853SAndroid Build Coastguard Worker                     i4_mv_buf_id;
989*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ps_mvc_au_buf_mgr->aps_buf_id_to_au_buf_map[i4_pic_buf_id] = ps_au_buf;
990*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr->aps_buf_id_to_mv_pred_buf_map[i4_mv_buf_id] =
991*495ae853SAndroid Build Coastguard Worker                     ps_au_mv_data;
992*495ae853SAndroid Build Coastguard Worker 
993*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->s_dpb_ivp_ctxt
994*495ae853SAndroid Build Coastguard Worker                     .au1_au_buf_ids[ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs] = i4_pic_buf_id;
995*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->s_dpb_ivp_ctxt
996*495ae853SAndroid Build Coastguard Worker                     .au1_mv_buf_ids[ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs] = i4_mv_buf_id;
997*495ae853SAndroid Build Coastguard Worker 
998*495ae853SAndroid Build Coastguard Worker                 aps_ref_pic_buf_lx[i][0] = ps_au_buf[0];
999*495ae853SAndroid Build Coastguard Worker 
1000*495ae853SAndroid Build Coastguard Worker                 aps_ref_pic_buf_lx[i]++;
1001*495ae853SAndroid Build Coastguard Worker                 pu1_num_short_term_refs[i]++;
1002*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->s_dpb_ivp_ctxt.u4_num_ivp_refs++;
1003*495ae853SAndroid Build Coastguard Worker             }
1004*495ae853SAndroid Build Coastguard Worker         }
1005*495ae853SAndroid Build Coastguard Worker     }
1006*495ae853SAndroid Build Coastguard Worker 
1007*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < 1 + ((WORD32) b_is_b_pic); i++)
1008*495ae853SAndroid Build Coastguard Worker     {
1009*495ae853SAndroid Build Coastguard Worker         au1_total_num_refs[i] = pu1_num_short_term_refs[i] + pu1_num_long_term_refs[i];
1010*495ae853SAndroid Build Coastguard Worker 
1011*495ae853SAndroid Build Coastguard Worker         if(pu1_num_short_term_refs[i] > MVC_MAX_REF_PICS)
1012*495ae853SAndroid Build Coastguard Worker         {
1013*495ae853SAndroid Build Coastguard Worker             return ERROR_NUM_REF;
1014*495ae853SAndroid Build Coastguard Worker         }
1015*495ae853SAndroid Build Coastguard Worker 
1016*495ae853SAndroid Build Coastguard Worker         if(au1_total_num_refs[i] > MVC_MAX_REF_PICS)
1017*495ae853SAndroid Build Coastguard Worker         {
1018*495ae853SAndroid Build Coastguard Worker             return ERROR_NUM_REF;
1019*495ae853SAndroid Build Coastguard Worker         }
1020*495ae853SAndroid Build Coastguard Worker 
1021*495ae853SAndroid Build Coastguard Worker         if(0 == au1_total_num_refs[i])
1022*495ae853SAndroid Build Coastguard Worker         {
1023*495ae853SAndroid Build Coastguard Worker             return ERROR_NUM_REF;
1024*495ae853SAndroid Build Coastguard Worker         }
1025*495ae853SAndroid Build Coastguard Worker     }
1026*495ae853SAndroid Build Coastguard Worker 
1027*495ae853SAndroid Build Coastguard Worker     /* If list0 and list1 entries are same then swap the 0th and 1st entry */
1028*495ae853SAndroid Build Coastguard Worker     /* of list 1 */
1029*495ae853SAndroid Build Coastguard Worker     {
1030*495ae853SAndroid Build Coastguard Worker         mvc_au_buffer_t *aps_ref_pic_bufs_lx[2] = {ps_dpb_mgr->as_init_dpb[0],
1031*495ae853SAndroid Build Coastguard Worker                                                    ps_dpb_mgr->as_init_dpb[1]};
1032*495ae853SAndroid Build Coastguard Worker 
1033*495ae853SAndroid Build Coastguard Worker         if((au1_total_num_refs[0] == au1_total_num_refs[1]) && (au1_total_num_refs[0] > 1))
1034*495ae853SAndroid Build Coastguard Worker         {
1035*495ae853SAndroid Build Coastguard Worker             bool b_swap;
1036*495ae853SAndroid Build Coastguard Worker 
1037*495ae853SAndroid Build Coastguard Worker             b_swap = true;
1038*495ae853SAndroid Build Coastguard Worker 
1039*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < au1_total_num_refs[0]; i++)
1040*495ae853SAndroid Build Coastguard Worker             {
1041*495ae853SAndroid Build Coastguard Worker                 if(aps_ref_pic_bufs_lx[0][i]
1042*495ae853SAndroid Build Coastguard Worker                        .as_view_buffers[u2_view_id]
1043*495ae853SAndroid Build Coastguard Worker                        .as_component_bufs[Y]
1044*495ae853SAndroid Build Coastguard Worker                        .pv_data != aps_ref_pic_bufs_lx[1][i]
1045*495ae853SAndroid Build Coastguard Worker                                        .as_view_buffers[u2_view_id]
1046*495ae853SAndroid Build Coastguard Worker                                        .as_component_bufs[Y]
1047*495ae853SAndroid Build Coastguard Worker                                        .pv_data)
1048*495ae853SAndroid Build Coastguard Worker                 {
1049*495ae853SAndroid Build Coastguard Worker                     b_swap = false;
1050*495ae853SAndroid Build Coastguard Worker 
1051*495ae853SAndroid Build Coastguard Worker                     break;
1052*495ae853SAndroid Build Coastguard Worker                 }
1053*495ae853SAndroid Build Coastguard Worker             }
1054*495ae853SAndroid Build Coastguard Worker 
1055*495ae853SAndroid Build Coastguard Worker             if(b_swap)
1056*495ae853SAndroid Build Coastguard Worker             {
1057*495ae853SAndroid Build Coastguard Worker                 SWAP(aps_ref_pic_bufs_lx[1][0], aps_ref_pic_bufs_lx[1][1], mvc_au_buffer_t);
1058*495ae853SAndroid Build Coastguard Worker             }
1059*495ae853SAndroid Build Coastguard Worker         }
1060*495ae853SAndroid Build Coastguard Worker     }
1061*495ae853SAndroid Build Coastguard Worker 
1062*495ae853SAndroid Build Coastguard Worker     return OK;
1063*495ae853SAndroid Build Coastguard Worker }
1064*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_set_missing_refs_to_default(mvc_dpb_manager_t * ps_dpb_mgr,ref_pic_list_mod_data_t * ps_ref_pic_list_mod_data,mvc_au_buffer_t * ps_cur_au,UWORD8 u1_pred_lx)1065*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_set_missing_refs_to_default(mvc_dpb_manager_t *ps_dpb_mgr,
1066*495ae853SAndroid Build Coastguard Worker                                            ref_pic_list_mod_data_t *ps_ref_pic_list_mod_data,
1067*495ae853SAndroid Build Coastguard Worker                                            mvc_au_buffer_t *ps_cur_au, UWORD8 u1_pred_lx)
1068*495ae853SAndroid Build Coastguard Worker {
1069*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_refs = ps_dpb_mgr->au1_num_active_st_refs[u1_pred_lx] +
1070*495ae853SAndroid Build Coastguard Worker                          ps_dpb_mgr->au1_num_active_lt_refs[u1_pred_lx];
1071*495ae853SAndroid Build Coastguard Worker 
1072*495ae853SAndroid Build Coastguard Worker     while(u1_num_refs < ps_ref_pic_list_mod_data->au1_num_active_refs[u1_pred_lx])
1073*495ae853SAndroid Build Coastguard Worker     {
1074*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->as_init_dpb[u1_pred_lx][u1_num_refs] = ps_cur_au[0];
1075*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->au1_num_active_st_refs[u1_pred_lx]++;
1076*495ae853SAndroid Build Coastguard Worker         u1_num_refs++;
1077*495ae853SAndroid Build Coastguard Worker     }
1078*495ae853SAndroid Build Coastguard Worker }
1079*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_normalise_ref_pic_list(mvc_dpb_manager_t * ps_dpb_mgr,UWORD16 u2_buf_mod_bitfield,UWORD8 u1_num_bufs_modified,UWORD8 u1_pred_lx)1080*495ae853SAndroid Build Coastguard Worker void imvcd_dpb_normalise_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr, UWORD16 u2_buf_mod_bitfield,
1081*495ae853SAndroid Build Coastguard Worker                                       UWORD8 u1_num_bufs_modified, UWORD8 u1_pred_lx)
1082*495ae853SAndroid Build Coastguard Worker {
1083*495ae853SAndroid Build Coastguard Worker     WORD32 i;
1084*495ae853SAndroid Build Coastguard Worker 
1085*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_ref_bufs = ps_dpb_mgr->au1_num_active_st_refs[u1_pred_lx] +
1086*495ae853SAndroid Build Coastguard Worker                              ps_dpb_mgr->au1_num_active_lt_refs[u1_pred_lx];
1087*495ae853SAndroid Build Coastguard Worker 
1088*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < u1_num_ref_bufs; i++)
1089*495ae853SAndroid Build Coastguard Worker     {
1090*495ae853SAndroid Build Coastguard Worker         if(u1_num_bufs_modified >= MVC_MAX_REF_PICS)
1091*495ae853SAndroid Build Coastguard Worker         {
1092*495ae853SAndroid Build Coastguard Worker             return;
1093*495ae853SAndroid Build Coastguard Worker         }
1094*495ae853SAndroid Build Coastguard Worker 
1095*495ae853SAndroid Build Coastguard Worker         if(!(u2_buf_mod_bitfield & (1 << i)))
1096*495ae853SAndroid Build Coastguard Worker         {
1097*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->aps_mod_dpb[u1_pred_lx][u1_num_bufs_modified++] =
1098*495ae853SAndroid Build Coastguard Worker                 &ps_dpb_mgr->as_init_dpb[u1_pred_lx][i];
1099*495ae853SAndroid Build Coastguard Worker         }
1100*495ae853SAndroid Build Coastguard Worker     }
1101*495ae853SAndroid Build Coastguard Worker }
1102*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_reorder_ref_pic_list(mvc_dpb_manager_t * ps_dpb_mgr,nalu_mvc_ext_t * ps_cur_nalu_mvc_ext,mvc_au_buffer_t * ps_cur_au,ref_pic_list_mod_data_t * ps_ref_pic_list_mod_data,UWORD16 u2_view_order_id)1103*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_dpb_reorder_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr,
1104*495ae853SAndroid Build Coastguard Worker                                       nalu_mvc_ext_t *ps_cur_nalu_mvc_ext,
1105*495ae853SAndroid Build Coastguard Worker                                       mvc_au_buffer_t *ps_cur_au,
1106*495ae853SAndroid Build Coastguard Worker                                       ref_pic_list_mod_data_t *ps_ref_pic_list_mod_data,
1107*495ae853SAndroid Build Coastguard Worker                                       UWORD16 u2_view_order_id)
1108*495ae853SAndroid Build Coastguard Worker {
1109*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
1110*495ae853SAndroid Build Coastguard Worker 
1111*495ae853SAndroid Build Coastguard Worker     sps_mvc_ext_t *ps_sps_mvc_ext = ps_dpb_mgr->s_dpb_ivp_ctxt.ps_sps_mvc_ext;
1112*495ae853SAndroid Build Coastguard Worker 
1113*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_anchor_pic_flag = ps_cur_nalu_mvc_ext->u1_anchor_pic_flag;
1114*495ae853SAndroid Build Coastguard Worker     WORD32 i4_cur_pic_num = ps_cur_au->i4_pic_num;
1115*495ae853SAndroid Build Coastguard Worker     WORD32 i4_max_pic_num = ps_dpb_mgr->i4_max_pic_num;
1116*495ae853SAndroid Build Coastguard Worker     bool b_is_b_pic = !!(ps_cur_au->au4_pack_slc_typ[u2_view_order_id] & B_SLC_BIT);
1117*495ae853SAndroid Build Coastguard Worker 
1118*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < 1 + ((WORD32) b_is_b_pic); i++)
1119*495ae853SAndroid Build Coastguard Worker     {
1120*495ae853SAndroid Build Coastguard Worker         mvc_ivp_ref_data_t *ps_mvc_ivp_ref_data;
1121*495ae853SAndroid Build Coastguard Worker 
1122*495ae853SAndroid Build Coastguard Worker         UWORD16 u2_max_view_idx;
1123*495ae853SAndroid Build Coastguard Worker 
1124*495ae853SAndroid Build Coastguard Worker         WORD32 i4_pred_pic_num = i4_cur_pic_num;
1125*495ae853SAndroid Build Coastguard Worker         WORD16 i2_pred_view_order_id = 0;  // -1; Need to check spec and JMVM implementation match
1126*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_modification_of_pic_nums_idc =
1127*495ae853SAndroid Build Coastguard Worker             ps_ref_pic_list_mod_data->au1_modification_of_pic_nums_idc[i];
1128*495ae853SAndroid Build Coastguard Worker         WORD32 *pi4_abs_diff_pic_num_minus1 =
1129*495ae853SAndroid Build Coastguard Worker             ps_ref_pic_list_mod_data->ai4_abs_diff_pic_num_minus1[i];
1130*495ae853SAndroid Build Coastguard Worker         WORD32 *pi4_long_term_pic_num = ps_ref_pic_list_mod_data->ai4_long_term_pic_num[i];
1131*495ae853SAndroid Build Coastguard Worker         WORD32 *pi4_abs_diff_view_idx_minus1 =
1132*495ae853SAndroid Build Coastguard Worker             ps_ref_pic_list_mod_data->ai4_abs_diff_view_idx_minus1[i];
1133*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_num_ref_bufs =
1134*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->au1_num_active_st_refs[i] + ps_dpb_mgr->au1_num_active_lt_refs[i];
1135*495ae853SAndroid Build Coastguard Worker         UWORD16 u2_buf_mod_bitfield = 0;
1136*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_num_bufs_modified = 0;
1137*495ae853SAndroid Build Coastguard Worker 
1138*495ae853SAndroid Build Coastguard Worker         if(!ps_ref_pic_list_mod_data->au1_ref_pic_list_modification_flag_lx[i] ||
1139*495ae853SAndroid Build Coastguard Worker            (3 == pu1_modification_of_pic_nums_idc[0]))
1140*495ae853SAndroid Build Coastguard Worker         {
1141*495ae853SAndroid Build Coastguard Worker             imvcd_dpb_set_missing_refs_to_default(ps_dpb_mgr, ps_ref_pic_list_mod_data, ps_cur_au,
1142*495ae853SAndroid Build Coastguard Worker                                                   i);
1143*495ae853SAndroid Build Coastguard Worker 
1144*495ae853SAndroid Build Coastguard Worker             imvcd_dpb_normalise_ref_pic_list(ps_dpb_mgr, u2_buf_mod_bitfield, u1_num_bufs_modified,
1145*495ae853SAndroid Build Coastguard Worker                                              i);
1146*495ae853SAndroid Build Coastguard Worker 
1147*495ae853SAndroid Build Coastguard Worker             continue;
1148*495ae853SAndroid Build Coastguard Worker         }
1149*495ae853SAndroid Build Coastguard Worker 
1150*495ae853SAndroid Build Coastguard Worker         ps_mvc_ivp_ref_data =
1151*495ae853SAndroid Build Coastguard Worker             (0 == u2_view_order_id)
1152*495ae853SAndroid Build Coastguard Worker                 ? NULL
1153*495ae853SAndroid Build Coastguard Worker                 : (u1_anchor_pic_flag
1154*495ae853SAndroid Build Coastguard Worker                        ? &ps_sps_mvc_ext->as_anchor_ref_data[i][u2_view_order_id]
1155*495ae853SAndroid Build Coastguard Worker                        : &ps_sps_mvc_ext->as_non_anchor_ref_data[i][u2_view_order_id]);
1156*495ae853SAndroid Build Coastguard Worker         u2_max_view_idx = (0 == u2_view_order_id) ? 0 : ps_mvc_ivp_ref_data->u1_num_refs;
1157*495ae853SAndroid Build Coastguard Worker 
1158*495ae853SAndroid Build Coastguard Worker         do
1159*495ae853SAndroid Build Coastguard Worker         {
1160*495ae853SAndroid Build Coastguard Worker             if((0 == pu1_modification_of_pic_nums_idc[0]) ||
1161*495ae853SAndroid Build Coastguard Worker                (1 == pu1_modification_of_pic_nums_idc[0]))
1162*495ae853SAndroid Build Coastguard Worker             {
1163*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_mod_pic_num = pi4_abs_diff_pic_num_minus1[0];
1164*495ae853SAndroid Build Coastguard Worker 
1165*495ae853SAndroid Build Coastguard Worker                 UWORD8 u1_mod_buf_idx = u1_num_ref_bufs;
1166*495ae853SAndroid Build Coastguard Worker 
1167*495ae853SAndroid Build Coastguard Worker                 /* According to section 7.4.3.1 from spec, */
1168*495ae853SAndroid Build Coastguard Worker                 /* this value is expected to be from the */
1169*495ae853SAndroid Build Coastguard Worker                 /* closed interval [0, i4_max_pic_num - 1] */
1170*495ae853SAndroid Build Coastguard Worker                 if((i4_mod_pic_num < 0) || (i4_mod_pic_num >= i4_max_pic_num))
1171*495ae853SAndroid Build Coastguard Worker                 {
1172*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
1173*495ae853SAndroid Build Coastguard Worker                 }
1174*495ae853SAndroid Build Coastguard Worker 
1175*495ae853SAndroid Build Coastguard Worker                 /* +1 not accounted during initialisation, */
1176*495ae853SAndroid Build Coastguard Worker                 /* mainly to preclude integer overflow */
1177*495ae853SAndroid Build Coastguard Worker                 i4_mod_pic_num++;
1178*495ae853SAndroid Build Coastguard Worker 
1179*495ae853SAndroid Build Coastguard Worker                 if(0 == pu1_modification_of_pic_nums_idc[0])
1180*495ae853SAndroid Build Coastguard Worker                 {
1181*495ae853SAndroid Build Coastguard Worker                     i4_mod_pic_num = i4_pred_pic_num - i4_mod_pic_num;
1182*495ae853SAndroid Build Coastguard Worker 
1183*495ae853SAndroid Build Coastguard Worker                     if(i4_mod_pic_num < 0)
1184*495ae853SAndroid Build Coastguard Worker                     {
1185*495ae853SAndroid Build Coastguard Worker                         i4_mod_pic_num += i4_max_pic_num;
1186*495ae853SAndroid Build Coastguard Worker                     }
1187*495ae853SAndroid Build Coastguard Worker                 }
1188*495ae853SAndroid Build Coastguard Worker                 else
1189*495ae853SAndroid Build Coastguard Worker                 {
1190*495ae853SAndroid Build Coastguard Worker                     i4_mod_pic_num = i4_pred_pic_num + i4_mod_pic_num;
1191*495ae853SAndroid Build Coastguard Worker 
1192*495ae853SAndroid Build Coastguard Worker                     if(i4_mod_pic_num >= i4_max_pic_num)
1193*495ae853SAndroid Build Coastguard Worker                     {
1194*495ae853SAndroid Build Coastguard Worker                         i4_mod_pic_num -= i4_max_pic_num;
1195*495ae853SAndroid Build Coastguard Worker                     }
1196*495ae853SAndroid Build Coastguard Worker                 }
1197*495ae853SAndroid Build Coastguard Worker 
1198*495ae853SAndroid Build Coastguard Worker                 if(i4_mod_pic_num > i4_cur_pic_num)
1199*495ae853SAndroid Build Coastguard Worker                 {
1200*495ae853SAndroid Build Coastguard Worker                     i4_mod_pic_num -= i4_max_pic_num;
1201*495ae853SAndroid Build Coastguard Worker                 }
1202*495ae853SAndroid Build Coastguard Worker 
1203*495ae853SAndroid Build Coastguard Worker                 for(j = 0; j < u1_num_ref_bufs; j++)
1204*495ae853SAndroid Build Coastguard Worker                 {
1205*495ae853SAndroid Build Coastguard Worker                     if(ps_dpb_mgr->as_init_dpb[i][j].i4_pic_num == i4_mod_pic_num)
1206*495ae853SAndroid Build Coastguard Worker                     {
1207*495ae853SAndroid Build Coastguard Worker                         u1_mod_buf_idx = j;
1208*495ae853SAndroid Build Coastguard Worker 
1209*495ae853SAndroid Build Coastguard Worker                         break;
1210*495ae853SAndroid Build Coastguard Worker                     }
1211*495ae853SAndroid Build Coastguard Worker                 }
1212*495ae853SAndroid Build Coastguard Worker 
1213*495ae853SAndroid Build Coastguard Worker                 if(u1_mod_buf_idx == u1_num_ref_bufs)
1214*495ae853SAndroid Build Coastguard Worker                 {
1215*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
1216*495ae853SAndroid Build Coastguard Worker                 }
1217*495ae853SAndroid Build Coastguard Worker 
1218*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->aps_mod_dpb[i][u1_num_bufs_modified++] =
1219*495ae853SAndroid Build Coastguard Worker                     &ps_dpb_mgr->as_init_dpb[i][u1_mod_buf_idx];
1220*495ae853SAndroid Build Coastguard Worker 
1221*495ae853SAndroid Build Coastguard Worker                 u2_buf_mod_bitfield |= (1 << u1_mod_buf_idx);
1222*495ae853SAndroid Build Coastguard Worker                 i4_pred_pic_num = i4_mod_pic_num;
1223*495ae853SAndroid Build Coastguard Worker             }
1224*495ae853SAndroid Build Coastguard Worker             else if(2 == pu1_modification_of_pic_nums_idc[0])
1225*495ae853SAndroid Build Coastguard Worker             {
1226*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_mod_lt_pic_num = pi4_long_term_pic_num[0];
1227*495ae853SAndroid Build Coastguard Worker                 UWORD8 u1_mod_buf_idx = u1_num_ref_bufs;
1228*495ae853SAndroid Build Coastguard Worker 
1229*495ae853SAndroid Build Coastguard Worker                 if(pi4_long_term_pic_num[0] > (MAX_REF_BUFS + 1))
1230*495ae853SAndroid Build Coastguard Worker                 {
1231*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
1232*495ae853SAndroid Build Coastguard Worker                 }
1233*495ae853SAndroid Build Coastguard Worker 
1234*495ae853SAndroid Build Coastguard Worker                 for(j = 0; j < u1_num_ref_bufs; j++)
1235*495ae853SAndroid Build Coastguard Worker                 {
1236*495ae853SAndroid Build Coastguard Worker                     if(!ps_dpb_mgr->as_init_dpb[i][j].b_is_short_term_ref &&
1237*495ae853SAndroid Build Coastguard Worker                        (i4_mod_lt_pic_num == ps_dpb_mgr->as_init_dpb[i][j].u1_long_term_pic_num))
1238*495ae853SAndroid Build Coastguard Worker                     {
1239*495ae853SAndroid Build Coastguard Worker                         u1_mod_buf_idx = j;
1240*495ae853SAndroid Build Coastguard Worker 
1241*495ae853SAndroid Build Coastguard Worker                         break;
1242*495ae853SAndroid Build Coastguard Worker                     }
1243*495ae853SAndroid Build Coastguard Worker                 }
1244*495ae853SAndroid Build Coastguard Worker 
1245*495ae853SAndroid Build Coastguard Worker                 if(u1_mod_buf_idx == u1_num_ref_bufs)
1246*495ae853SAndroid Build Coastguard Worker                 {
1247*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
1248*495ae853SAndroid Build Coastguard Worker                 }
1249*495ae853SAndroid Build Coastguard Worker 
1250*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->aps_mod_dpb[i][u1_num_bufs_modified++] =
1251*495ae853SAndroid Build Coastguard Worker                     &ps_dpb_mgr->as_init_dpb[i][u1_mod_buf_idx];
1252*495ae853SAndroid Build Coastguard Worker 
1253*495ae853SAndroid Build Coastguard Worker                 u2_buf_mod_bitfield |= (1 << u1_mod_buf_idx);
1254*495ae853SAndroid Build Coastguard Worker             }
1255*495ae853SAndroid Build Coastguard Worker             else if((4 == pu1_modification_of_pic_nums_idc[0]) ||
1256*495ae853SAndroid Build Coastguard Worker                     (5 == pu1_modification_of_pic_nums_idc[0]))
1257*495ae853SAndroid Build Coastguard Worker             {
1258*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_target_view_id;
1259*495ae853SAndroid Build Coastguard Worker 
1260*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_mod_view_order_id = pi4_abs_diff_view_idx_minus1[0];
1261*495ae853SAndroid Build Coastguard Worker                 UWORD8 u1_mod_buf_idx = u1_num_ref_bufs;
1262*495ae853SAndroid Build Coastguard Worker 
1263*495ae853SAndroid Build Coastguard Worker                 /* According to section H.7.4.3.1.1 from spec, */
1264*495ae853SAndroid Build Coastguard Worker                 /* this value is expected to be from the */
1265*495ae853SAndroid Build Coastguard Worker                 /* closed interval [0, u2_max_view_idx - 1] */
1266*495ae853SAndroid Build Coastguard Worker                 if((i4_mod_view_order_id < 0) || (i4_mod_view_order_id >= u2_max_view_idx))
1267*495ae853SAndroid Build Coastguard Worker                 {
1268*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
1269*495ae853SAndroid Build Coastguard Worker                 }
1270*495ae853SAndroid Build Coastguard Worker 
1271*495ae853SAndroid Build Coastguard Worker                 /* +1 not accounted during initialisation, */
1272*495ae853SAndroid Build Coastguard Worker                 /* mainly to preclude integer overflow */
1273*495ae853SAndroid Build Coastguard Worker                 i4_mod_view_order_id++;
1274*495ae853SAndroid Build Coastguard Worker 
1275*495ae853SAndroid Build Coastguard Worker                 if(4 == pu1_modification_of_pic_nums_idc[0])
1276*495ae853SAndroid Build Coastguard Worker                 {
1277*495ae853SAndroid Build Coastguard Worker                     i4_mod_view_order_id = i2_pred_view_order_id - i4_mod_view_order_id;
1278*495ae853SAndroid Build Coastguard Worker 
1279*495ae853SAndroid Build Coastguard Worker                     if(i4_mod_view_order_id < 0)
1280*495ae853SAndroid Build Coastguard Worker                     {
1281*495ae853SAndroid Build Coastguard Worker                         i4_mod_view_order_id += u2_max_view_idx;
1282*495ae853SAndroid Build Coastguard Worker                     }
1283*495ae853SAndroid Build Coastguard Worker                 }
1284*495ae853SAndroid Build Coastguard Worker                 else
1285*495ae853SAndroid Build Coastguard Worker                 {
1286*495ae853SAndroid Build Coastguard Worker                     i4_mod_view_order_id = i2_pred_view_order_id + i4_mod_view_order_id;
1287*495ae853SAndroid Build Coastguard Worker 
1288*495ae853SAndroid Build Coastguard Worker                     if(i4_mod_view_order_id >= u2_max_view_idx)
1289*495ae853SAndroid Build Coastguard Worker                     {
1290*495ae853SAndroid Build Coastguard Worker                         i4_mod_view_order_id -= u2_max_view_idx;
1291*495ae853SAndroid Build Coastguard Worker                     }
1292*495ae853SAndroid Build Coastguard Worker                 }
1293*495ae853SAndroid Build Coastguard Worker 
1294*495ae853SAndroid Build Coastguard Worker                 if((0 == u2_view_order_id) || (NULL == ps_mvc_ivp_ref_data))
1295*495ae853SAndroid Build Coastguard Worker                 {
1296*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
1297*495ae853SAndroid Build Coastguard Worker                 }
1298*495ae853SAndroid Build Coastguard Worker 
1299*495ae853SAndroid Build Coastguard Worker                 i4_target_view_id = ps_mvc_ivp_ref_data->au2_ref_view_ids[i4_mod_view_order_id];
1300*495ae853SAndroid Build Coastguard Worker 
1301*495ae853SAndroid Build Coastguard Worker                 for(j = 0; j < u1_num_ref_bufs; j++)
1302*495ae853SAndroid Build Coastguard Worker                 {
1303*495ae853SAndroid Build Coastguard Worker                     if(ps_dpb_mgr->as_init_dpb[i][j].s_ivp_data.b_is_ivp_ref)
1304*495ae853SAndroid Build Coastguard Worker                     {
1305*495ae853SAndroid Build Coastguard Worker                         if((ps_dpb_mgr->as_init_dpb[i][j].i4_pic_num == i4_cur_pic_num) &&
1306*495ae853SAndroid Build Coastguard Worker                            (ps_dpb_mgr->as_init_dpb[i][j].s_ivp_data.u2_ref_view_id ==
1307*495ae853SAndroid Build Coastguard Worker                             i4_target_view_id))
1308*495ae853SAndroid Build Coastguard Worker                         {
1309*495ae853SAndroid Build Coastguard Worker                             u1_mod_buf_idx = j;
1310*495ae853SAndroid Build Coastguard Worker 
1311*495ae853SAndroid Build Coastguard Worker                             break;
1312*495ae853SAndroid Build Coastguard Worker                         }
1313*495ae853SAndroid Build Coastguard Worker                     }
1314*495ae853SAndroid Build Coastguard Worker                 }
1315*495ae853SAndroid Build Coastguard Worker 
1316*495ae853SAndroid Build Coastguard Worker                 if(u1_mod_buf_idx == u1_num_ref_bufs)
1317*495ae853SAndroid Build Coastguard Worker                 {
1318*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
1319*495ae853SAndroid Build Coastguard Worker                 }
1320*495ae853SAndroid Build Coastguard Worker 
1321*495ae853SAndroid Build Coastguard Worker                 u2_buf_mod_bitfield |= (1 << u1_mod_buf_idx);
1322*495ae853SAndroid Build Coastguard Worker                 ps_dpb_mgr->aps_mod_dpb[i][u1_num_bufs_modified++] =
1323*495ae853SAndroid Build Coastguard Worker                     &ps_dpb_mgr->as_init_dpb[i][u1_mod_buf_idx];
1324*495ae853SAndroid Build Coastguard Worker                 i2_pred_view_order_id = i4_mod_view_order_id;
1325*495ae853SAndroid Build Coastguard Worker             }
1326*495ae853SAndroid Build Coastguard Worker             else if(3 != pu1_modification_of_pic_nums_idc[0])
1327*495ae853SAndroid Build Coastguard Worker             {
1328*495ae853SAndroid Build Coastguard Worker                 return ERROR_REFIDX_ORDER_T;
1329*495ae853SAndroid Build Coastguard Worker             }
1330*495ae853SAndroid Build Coastguard Worker             else
1331*495ae853SAndroid Build Coastguard Worker             {
1332*495ae853SAndroid Build Coastguard Worker                 break;
1333*495ae853SAndroid Build Coastguard Worker             }
1334*495ae853SAndroid Build Coastguard Worker 
1335*495ae853SAndroid Build Coastguard Worker             pu1_modification_of_pic_nums_idc++;
1336*495ae853SAndroid Build Coastguard Worker             pi4_abs_diff_pic_num_minus1++;
1337*495ae853SAndroid Build Coastguard Worker             pi4_long_term_pic_num++;
1338*495ae853SAndroid Build Coastguard Worker             pi4_abs_diff_view_idx_minus1++;
1339*495ae853SAndroid Build Coastguard Worker         } while(true);
1340*495ae853SAndroid Build Coastguard Worker 
1341*495ae853SAndroid Build Coastguard Worker         imvcd_dpb_set_missing_refs_to_default(ps_dpb_mgr, ps_ref_pic_list_mod_data, ps_cur_au, i);
1342*495ae853SAndroid Build Coastguard Worker 
1343*495ae853SAndroid Build Coastguard Worker         imvcd_dpb_normalise_ref_pic_list(ps_dpb_mgr, u2_buf_mod_bitfield, u1_num_bufs_modified, i);
1344*495ae853SAndroid Build Coastguard Worker     }
1345*495ae853SAndroid Build Coastguard Worker 
1346*495ae853SAndroid Build Coastguard Worker     return OK;
1347*495ae853SAndroid Build Coastguard Worker }
1348*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_insert_st_node(mvc_dpb_manager_t * ps_dpb_mgr,mvc_au_buffer_t * ps_au_buf)1349*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_dpb_insert_st_node(mvc_dpb_manager_t *ps_dpb_mgr, mvc_au_buffer_t *ps_au_buf)
1350*495ae853SAndroid Build Coastguard Worker {
1351*495ae853SAndroid Build Coastguard Worker     WORD32 i;
1352*495ae853SAndroid Build Coastguard Worker 
1353*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
1354*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_picture_type = ps_au_buf->u1_picturetype;
1355*495ae853SAndroid Build Coastguard Worker 
1356*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MVC_MAX_REF_PICS; i++)
1357*495ae853SAndroid Build Coastguard Worker     {
1358*495ae853SAndroid Build Coastguard Worker         if((ps_dpb_info[i].ps_au_buf == ps_au_buf) && ps_dpb_info[i].b_used_as_ref)
1359*495ae853SAndroid Build Coastguard Worker         {
1360*495ae853SAndroid Build Coastguard Worker             /* Can occur only for field bottom pictures */
1361*495ae853SAndroid Build Coastguard Worker             if(ps_dpb_info[i].ps_au_buf->u1_pic_type == FRM_PIC)
1362*495ae853SAndroid Build Coastguard Worker             {
1363*495ae853SAndroid Build Coastguard Worker                 return ERROR_DBP_MANAGER_T;
1364*495ae853SAndroid Build Coastguard Worker             }
1365*495ae853SAndroid Build Coastguard Worker             else
1366*495ae853SAndroid Build Coastguard Worker             {
1367*495ae853SAndroid Build Coastguard Worker                 ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
1368*495ae853SAndroid Build Coastguard Worker 
1369*495ae853SAndroid Build Coastguard Worker                 return OK;
1370*495ae853SAndroid Build Coastguard Worker             }
1371*495ae853SAndroid Build Coastguard Worker         }
1372*495ae853SAndroid Build Coastguard Worker 
1373*495ae853SAndroid Build Coastguard Worker         if(!ps_dpb_info[i].b_used_as_ref &&
1374*495ae853SAndroid Build Coastguard Worker            (ps_dpb_info[i].s_top_field.u1_reference_info == UNUSED_FOR_REF) &&
1375*495ae853SAndroid Build Coastguard Worker            (ps_dpb_info[i].s_bot_field.u1_reference_info == UNUSED_FOR_REF))
1376*495ae853SAndroid Build Coastguard Worker         {
1377*495ae853SAndroid Build Coastguard Worker             break;
1378*495ae853SAndroid Build Coastguard Worker         }
1379*495ae853SAndroid Build Coastguard Worker     }
1380*495ae853SAndroid Build Coastguard Worker 
1381*495ae853SAndroid Build Coastguard Worker     if(i == MVC_MAX_REF_PICS)
1382*495ae853SAndroid Build Coastguard Worker     {
1383*495ae853SAndroid Build Coastguard Worker         return ERROR_DBP_MANAGER_T;
1384*495ae853SAndroid Build Coastguard Worker     }
1385*495ae853SAndroid Build Coastguard Worker 
1386*495ae853SAndroid Build Coastguard Worker     ps_dpb_info[i].ps_au_buf = ps_au_buf;
1387*495ae853SAndroid Build Coastguard Worker     ps_dpb_info[i].ps_prev_short = ps_dpb_mgr->ps_dpb_st_head;
1388*495ae853SAndroid Build Coastguard Worker     ps_dpb_info[i].b_used_as_ref = true;
1389*495ae853SAndroid Build Coastguard Worker 
1390*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->ps_dpb_st_head = ps_dpb_info + i;
1391*495ae853SAndroid Build Coastguard Worker 
1392*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u1_num_st_ref_bufs++;
1393*495ae853SAndroid Build Coastguard Worker 
1394*495ae853SAndroid Build Coastguard Worker     ps_au_buf->b_is_short_term_ref = true;
1395*495ae853SAndroid Build Coastguard Worker 
1396*495ae853SAndroid Build Coastguard Worker     if((u1_picture_type & 0x03) == FRM_PIC)
1397*495ae853SAndroid Build Coastguard Worker     {
1398*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].s_top_field.u1_reference_info = IS_SHORT_TERM;
1399*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
1400*495ae853SAndroid Build Coastguard Worker     }
1401*495ae853SAndroid Build Coastguard Worker     else if((u1_picture_type & 0x03) == TOP_FLD)
1402*495ae853SAndroid Build Coastguard Worker     {
1403*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].s_top_field.u1_reference_info = IS_SHORT_TERM;
1404*495ae853SAndroid Build Coastguard Worker     }
1405*495ae853SAndroid Build Coastguard Worker     else if((u1_picture_type & 0x03) == BOT_FLD)
1406*495ae853SAndroid Build Coastguard Worker     {
1407*495ae853SAndroid Build Coastguard Worker         ps_dpb_info[i].s_bot_field.u1_reference_info = IS_SHORT_TERM;
1408*495ae853SAndroid Build Coastguard Worker     }
1409*495ae853SAndroid Build Coastguard Worker 
1410*495ae853SAndroid Build Coastguard Worker     return OK;
1411*495ae853SAndroid Build Coastguard Worker }
1412*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_delete_gap_frm_mmco(mvc_dpb_manager_t * ps_dpb_mgr,WORD32 i4_frame_num,UWORD8 * pu1_del_node)1413*495ae853SAndroid Build Coastguard Worker static WORD32 imvcd_dpb_delete_gap_frm_mmco(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_frame_num,
1414*495ae853SAndroid Build Coastguard Worker                                             UWORD8 *pu1_del_node)
1415*495ae853SAndroid Build Coastguard Worker {
1416*495ae853SAndroid Build Coastguard Worker     WORD8 i, j;
1417*495ae853SAndroid Build Coastguard Worker     WORD32 *pi4_start, *pi4_end;
1418*495ae853SAndroid Build Coastguard Worker     WORD32 i4_start_frm_num, i4_end_frm_num, i4_max_pic_num;
1419*495ae853SAndroid Build Coastguard Worker 
1420*495ae853SAndroid Build Coastguard Worker     /* find the least frame num from gaps and current DPB node    */
1421*495ae853SAndroid Build Coastguard Worker     /* Delete the gaps                                            */
1422*495ae853SAndroid Build Coastguard Worker     *pu1_del_node = 1;
1423*495ae853SAndroid Build Coastguard Worker     pi4_start = ps_dpb_mgr->ai4_gaps_start_frm_num;
1424*495ae853SAndroid Build Coastguard Worker     pi4_end = ps_dpb_mgr->ai4_gaps_end_frm_num;
1425*495ae853SAndroid Build Coastguard Worker     i4_max_pic_num = ps_dpb_mgr->i4_max_pic_num;
1426*495ae853SAndroid Build Coastguard Worker 
1427*495ae853SAndroid Build Coastguard Worker     if(0 == ps_dpb_mgr->u1_num_gaps)
1428*495ae853SAndroid Build Coastguard Worker     {
1429*495ae853SAndroid Build Coastguard Worker         return OK;
1430*495ae853SAndroid Build Coastguard Worker     }
1431*495ae853SAndroid Build Coastguard Worker 
1432*495ae853SAndroid Build Coastguard Worker     if(i4_frame_num < 0)
1433*495ae853SAndroid Build Coastguard Worker     {
1434*495ae853SAndroid Build Coastguard Worker         i4_frame_num += i4_max_pic_num;
1435*495ae853SAndroid Build Coastguard Worker     }
1436*495ae853SAndroid Build Coastguard Worker 
1437*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_FRAMES; i++)
1438*495ae853SAndroid Build Coastguard Worker     {
1439*495ae853SAndroid Build Coastguard Worker         i4_start_frm_num = pi4_start[i];
1440*495ae853SAndroid Build Coastguard Worker 
1441*495ae853SAndroid Build Coastguard Worker         if(i4_start_frm_num < 0)
1442*495ae853SAndroid Build Coastguard Worker         {
1443*495ae853SAndroid Build Coastguard Worker             i4_start_frm_num += i4_max_pic_num;
1444*495ae853SAndroid Build Coastguard Worker         }
1445*495ae853SAndroid Build Coastguard Worker 
1446*495ae853SAndroid Build Coastguard Worker         if(INVALID_FRAME_NUM != i4_start_frm_num)
1447*495ae853SAndroid Build Coastguard Worker         {
1448*495ae853SAndroid Build Coastguard Worker             i4_end_frm_num = pi4_end[i];
1449*495ae853SAndroid Build Coastguard Worker 
1450*495ae853SAndroid Build Coastguard Worker             if(i4_end_frm_num < 0)
1451*495ae853SAndroid Build Coastguard Worker             {
1452*495ae853SAndroid Build Coastguard Worker                 i4_end_frm_num += i4_max_pic_num;
1453*495ae853SAndroid Build Coastguard Worker             }
1454*495ae853SAndroid Build Coastguard Worker 
1455*495ae853SAndroid Build Coastguard Worker             if((i4_frame_num >= i4_start_frm_num) && (i4_frame_num <= i4_end_frm_num))
1456*495ae853SAndroid Build Coastguard Worker             {
1457*495ae853SAndroid Build Coastguard Worker                 break;
1458*495ae853SAndroid Build Coastguard Worker             }
1459*495ae853SAndroid Build Coastguard Worker             else
1460*495ae853SAndroid Build Coastguard Worker             {
1461*495ae853SAndroid Build Coastguard Worker                 if(((i4_frame_num + i4_max_pic_num) >= i4_start_frm_num) &&
1462*495ae853SAndroid Build Coastguard Worker                    ((i4_frame_num + i4_max_pic_num) <= i4_end_frm_num))
1463*495ae853SAndroid Build Coastguard Worker                 {
1464*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
1465*495ae853SAndroid Build Coastguard Worker                 }
1466*495ae853SAndroid Build Coastguard Worker             }
1467*495ae853SAndroid Build Coastguard Worker         }
1468*495ae853SAndroid Build Coastguard Worker     }
1469*495ae853SAndroid Build Coastguard Worker 
1470*495ae853SAndroid Build Coastguard Worker     /* find frame_num index, in the poc_map which needs to be deleted */
1471*495ae853SAndroid Build Coastguard Worker     for(j = 0; j < MAX_FRAMES; j++)
1472*495ae853SAndroid Build Coastguard Worker     {
1473*495ae853SAndroid Build Coastguard Worker         if(i4_frame_num == ps_dpb_mgr->as_display_buf_info[j].i4_frame_num)
1474*495ae853SAndroid Build Coastguard Worker         {
1475*495ae853SAndroid Build Coastguard Worker             break;
1476*495ae853SAndroid Build Coastguard Worker         }
1477*495ae853SAndroid Build Coastguard Worker     }
1478*495ae853SAndroid Build Coastguard Worker 
1479*495ae853SAndroid Build Coastguard Worker     if(MAX_FRAMES != i)
1480*495ae853SAndroid Build Coastguard Worker     {
1481*495ae853SAndroid Build Coastguard Worker         if(j == MAX_FRAMES)
1482*495ae853SAndroid Build Coastguard Worker         {
1483*495ae853SAndroid Build Coastguard Worker             return ERROR_DBP_MANAGER_T;
1484*495ae853SAndroid Build Coastguard Worker         }
1485*495ae853SAndroid Build Coastguard Worker 
1486*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->as_display_buf_info[j].i4_poc_buf_id = -1;
1487*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->as_display_buf_info[j].i4_poc = 0x7fffffff;
1488*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->as_display_buf_info[j].i4_frame_num = GAP_FRAME_NUM;
1489*495ae853SAndroid Build Coastguard Worker 
1490*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->i1_gaps_deleted++;
1491*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->ai1_gaps_per_seq[i]--;
1492*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->u1_num_gaps--;
1493*495ae853SAndroid Build Coastguard Worker         *pu1_del_node = 0;
1494*495ae853SAndroid Build Coastguard Worker 
1495*495ae853SAndroid Build Coastguard Worker         if(0 == ps_dpb_mgr->ai1_gaps_per_seq[i])
1496*495ae853SAndroid Build Coastguard Worker         {
1497*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->ai4_gaps_start_frm_num[i] = INVALID_FRAME_NUM;
1498*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->ai4_gaps_end_frm_num[i] = 0;
1499*495ae853SAndroid Build Coastguard Worker         }
1500*495ae853SAndroid Build Coastguard Worker     }
1501*495ae853SAndroid Build Coastguard Worker     else
1502*495ae853SAndroid Build Coastguard Worker     {
1503*495ae853SAndroid Build Coastguard Worker         return ERROR_DBP_MANAGER_T;
1504*495ae853SAndroid Build Coastguard Worker     }
1505*495ae853SAndroid Build Coastguard Worker 
1506*495ae853SAndroid Build Coastguard Worker     return OK;
1507*495ae853SAndroid Build Coastguard Worker }
1508*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_insert_lt_node(mvc_dpb_manager_t * ps_dpb_mgr,mvc_dpb_info_t * ps_new_node,UWORD32 u4_lt_idx)1509*495ae853SAndroid Build Coastguard Worker static WORD32 imvcd_dpb_insert_lt_node(mvc_dpb_manager_t *ps_dpb_mgr, mvc_dpb_info_t *ps_new_node,
1510*495ae853SAndroid Build Coastguard Worker                                        UWORD32 u4_lt_idx)
1511*495ae853SAndroid Build Coastguard Worker {
1512*495ae853SAndroid Build Coastguard Worker     ps_new_node->s_top_field.u1_reference_info = IS_LONG_TERM;
1513*495ae853SAndroid Build Coastguard Worker     ps_new_node->s_bot_field.u1_reference_info = IS_LONG_TERM;
1514*495ae853SAndroid Build Coastguard Worker     ps_new_node->s_top_field.u1_long_term_frame_idx = u4_lt_idx;
1515*495ae853SAndroid Build Coastguard Worker     ps_new_node->s_bot_field.u1_long_term_frame_idx = u4_lt_idx;
1516*495ae853SAndroid Build Coastguard Worker     ps_new_node->ps_au_buf->u1_long_term_frm_idx = u4_lt_idx;
1517*495ae853SAndroid Build Coastguard Worker     ps_new_node->b_used_as_ref = true;
1518*495ae853SAndroid Build Coastguard Worker 
1519*495ae853SAndroid Build Coastguard Worker     if(ps_dpb_mgr->u1_num_lt_ref_bufs > 0)
1520*495ae853SAndroid Build Coastguard Worker     {
1521*495ae853SAndroid Build Coastguard Worker         WORD32 i;
1522*495ae853SAndroid Build Coastguard Worker 
1523*495ae853SAndroid Build Coastguard Worker         mvc_dpb_info_t **pps_next_node = &ps_dpb_mgr->ps_dpb_lt_head;
1524*495ae853SAndroid Build Coastguard Worker 
1525*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
1526*495ae853SAndroid Build Coastguard Worker         {
1527*495ae853SAndroid Build Coastguard Worker             if((*pps_next_node)->ps_au_buf->u1_long_term_frm_idx > u4_lt_idx)
1528*495ae853SAndroid Build Coastguard Worker             {
1529*495ae853SAndroid Build Coastguard Worker                 ps_new_node->ps_prev_long = *pps_next_node;
1530*495ae853SAndroid Build Coastguard Worker                 *pps_next_node = ps_new_node;
1531*495ae853SAndroid Build Coastguard Worker 
1532*495ae853SAndroid Build Coastguard Worker                 break;
1533*495ae853SAndroid Build Coastguard Worker             }
1534*495ae853SAndroid Build Coastguard Worker             else if(NULL == (*pps_next_node)->ps_prev_long)
1535*495ae853SAndroid Build Coastguard Worker             {
1536*495ae853SAndroid Build Coastguard Worker                 (*pps_next_node)->ps_prev_long = ps_new_node;
1537*495ae853SAndroid Build Coastguard Worker                 ps_new_node->ps_prev_long = NULL;
1538*495ae853SAndroid Build Coastguard Worker 
1539*495ae853SAndroid Build Coastguard Worker                 break;
1540*495ae853SAndroid Build Coastguard Worker             }
1541*495ae853SAndroid Build Coastguard Worker 
1542*495ae853SAndroid Build Coastguard Worker             pps_next_node = &(*pps_next_node)->ps_prev_long;
1543*495ae853SAndroid Build Coastguard Worker         }
1544*495ae853SAndroid Build Coastguard Worker     }
1545*495ae853SAndroid Build Coastguard Worker     else
1546*495ae853SAndroid Build Coastguard Worker     {
1547*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->ps_dpb_lt_head = ps_new_node;
1548*495ae853SAndroid Build Coastguard Worker         ps_new_node->ps_prev_long = NULL;
1549*495ae853SAndroid Build Coastguard Worker     }
1550*495ae853SAndroid Build Coastguard Worker 
1551*495ae853SAndroid Build Coastguard Worker     ps_new_node->ps_au_buf->b_is_short_term_ref = false;
1552*495ae853SAndroid Build Coastguard Worker 
1553*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u1_num_lt_ref_bufs++;
1554*495ae853SAndroid Build Coastguard Worker 
1555*495ae853SAndroid Build Coastguard Worker     return OK;
1556*495ae853SAndroid Build Coastguard Worker }
1557*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_delete_lt_node(mvc_dpb_manager_t * ps_dpb_mgr,UWORD32 u4_lt_idx)1558*495ae853SAndroid Build Coastguard Worker static WORD32 imvcd_dpb_delete_lt_node(mvc_dpb_manager_t *ps_dpb_mgr, UWORD32 u4_lt_idx)
1559*495ae853SAndroid Build Coastguard Worker {
1560*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_next_dpb;
1561*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_unmark_node;
1562*495ae853SAndroid Build Coastguard Worker 
1563*495ae853SAndroid Build Coastguard Worker     WORD32 i;
1564*495ae853SAndroid Build Coastguard Worker 
1565*495ae853SAndroid Build Coastguard Worker     if(ps_dpb_mgr->u1_num_lt_ref_bufs > 0)
1566*495ae853SAndroid Build Coastguard Worker     {
1567*495ae853SAndroid Build Coastguard Worker         ps_next_dpb = ps_dpb_mgr->ps_dpb_lt_head;
1568*495ae853SAndroid Build Coastguard Worker 
1569*495ae853SAndroid Build Coastguard Worker         if(ps_next_dpb->ps_au_buf->u1_long_term_frm_idx == u4_lt_idx)
1570*495ae853SAndroid Build Coastguard Worker         {
1571*495ae853SAndroid Build Coastguard Worker             ps_unmark_node = ps_next_dpb;
1572*495ae853SAndroid Build Coastguard Worker         }
1573*495ae853SAndroid Build Coastguard Worker         else
1574*495ae853SAndroid Build Coastguard Worker         {
1575*495ae853SAndroid Build Coastguard Worker             for(i = 1; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
1576*495ae853SAndroid Build Coastguard Worker             {
1577*495ae853SAndroid Build Coastguard Worker                 if(ps_next_dpb->ps_prev_long->ps_au_buf->u1_long_term_frm_idx == u4_lt_idx)
1578*495ae853SAndroid Build Coastguard Worker                 {
1579*495ae853SAndroid Build Coastguard Worker                     break;
1580*495ae853SAndroid Build Coastguard Worker                 }
1581*495ae853SAndroid Build Coastguard Worker 
1582*495ae853SAndroid Build Coastguard Worker                 ps_next_dpb = ps_next_dpb->ps_prev_long;
1583*495ae853SAndroid Build Coastguard Worker             }
1584*495ae853SAndroid Build Coastguard Worker 
1585*495ae853SAndroid Build Coastguard Worker             if(i < ps_dpb_mgr->u1_num_lt_ref_bufs)
1586*495ae853SAndroid Build Coastguard Worker             {
1587*495ae853SAndroid Build Coastguard Worker                 ps_unmark_node = ps_next_dpb->ps_prev_long;
1588*495ae853SAndroid Build Coastguard Worker             }
1589*495ae853SAndroid Build Coastguard Worker             else
1590*495ae853SAndroid Build Coastguard Worker             {
1591*495ae853SAndroid Build Coastguard Worker                 return OK;
1592*495ae853SAndroid Build Coastguard Worker             }
1593*495ae853SAndroid Build Coastguard Worker         }
1594*495ae853SAndroid Build Coastguard Worker 
1595*495ae853SAndroid Build Coastguard Worker         ps_unmark_node->b_used_as_ref = false;
1596*495ae853SAndroid Build Coastguard Worker 
1597*495ae853SAndroid Build Coastguard Worker         if(ps_unmark_node == ps_dpb_mgr->ps_dpb_lt_head)
1598*495ae853SAndroid Build Coastguard Worker         {
1599*495ae853SAndroid Build Coastguard Worker             ps_dpb_mgr->ps_dpb_lt_head = ps_next_dpb->ps_prev_long;
1600*495ae853SAndroid Build Coastguard Worker         }
1601*495ae853SAndroid Build Coastguard Worker 
1602*495ae853SAndroid Build Coastguard Worker         ps_unmark_node->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1603*495ae853SAndroid Build Coastguard Worker         ps_unmark_node->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1604*495ae853SAndroid Build Coastguard Worker 
1605*495ae853SAndroid Build Coastguard Worker         imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr, ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
1606*495ae853SAndroid Build Coastguard Worker                             ps_unmark_node->ps_au_buf->i4_pic_buf_id);
1607*495ae853SAndroid Build Coastguard Worker 
1608*495ae853SAndroid Build Coastguard Worker         ps_next_dpb->ps_prev_long = ps_unmark_node->ps_prev_long;
1609*495ae853SAndroid Build Coastguard Worker         ps_unmark_node->ps_prev_long = NULL;
1610*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->u1_num_lt_ref_bufs--;
1611*495ae853SAndroid Build Coastguard Worker     }
1612*495ae853SAndroid Build Coastguard Worker 
1613*495ae853SAndroid Build Coastguard Worker     return OK;
1614*495ae853SAndroid Build Coastguard Worker }
1615*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_delete_st_node_or_make_lt(mvc_dpb_manager_t * ps_dpb_mgr,WORD32 i4_pic_num,UWORD32 u4_lt_idx)1616*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_dpb_delete_st_node_or_make_lt(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_pic_num,
1617*495ae853SAndroid Build Coastguard Worker                                            UWORD32 u4_lt_idx)
1618*495ae853SAndroid Build Coastguard Worker {
1619*495ae853SAndroid Build Coastguard Worker     WORD32 i4_error_code;
1620*495ae853SAndroid Build Coastguard Worker 
1621*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1622*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_unmark_node = NULL;
1623*495ae853SAndroid Build Coastguard Worker 
1624*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_del_node = 0, u1_del_st = 0;
1625*495ae853SAndroid Build Coastguard Worker     WORD32 i = 0;
1626*495ae853SAndroid Build Coastguard Worker 
1627*495ae853SAndroid Build Coastguard Worker     if(ps_next_dpb->ps_au_buf->i4_pic_num == i4_pic_num)
1628*495ae853SAndroid Build Coastguard Worker     {
1629*495ae853SAndroid Build Coastguard Worker         ps_unmark_node = ps_next_dpb;
1630*495ae853SAndroid Build Coastguard Worker     }
1631*495ae853SAndroid Build Coastguard Worker     else
1632*495ae853SAndroid Build Coastguard Worker     {
1633*495ae853SAndroid Build Coastguard Worker         for(i = 1; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
1634*495ae853SAndroid Build Coastguard Worker         {
1635*495ae853SAndroid Build Coastguard Worker             if(ps_next_dpb->ps_prev_short->ps_au_buf->i4_pic_num == i4_pic_num)
1636*495ae853SAndroid Build Coastguard Worker             {
1637*495ae853SAndroid Build Coastguard Worker                 ps_unmark_node = ps_next_dpb->ps_prev_short;
1638*495ae853SAndroid Build Coastguard Worker 
1639*495ae853SAndroid Build Coastguard Worker                 break;
1640*495ae853SAndroid Build Coastguard Worker             }
1641*495ae853SAndroid Build Coastguard Worker 
1642*495ae853SAndroid Build Coastguard Worker             ps_next_dpb = ps_next_dpb->ps_prev_short;
1643*495ae853SAndroid Build Coastguard Worker         }
1644*495ae853SAndroid Build Coastguard Worker     }
1645*495ae853SAndroid Build Coastguard Worker 
1646*495ae853SAndroid Build Coastguard Worker     if(i == ps_dpb_mgr->u1_num_st_ref_bufs)
1647*495ae853SAndroid Build Coastguard Worker     {
1648*495ae853SAndroid Build Coastguard Worker         if(ps_dpb_mgr->u1_num_gaps)
1649*495ae853SAndroid Build Coastguard Worker         {
1650*495ae853SAndroid Build Coastguard Worker             i4_error_code = imvcd_dpb_delete_gap_frm_mmco(ps_dpb_mgr, i4_pic_num, &u1_del_st);
1651*495ae853SAndroid Build Coastguard Worker 
1652*495ae853SAndroid Build Coastguard Worker             if(i4_error_code != OK)
1653*495ae853SAndroid Build Coastguard Worker             {
1654*495ae853SAndroid Build Coastguard Worker                 return i4_error_code;
1655*495ae853SAndroid Build Coastguard Worker             }
1656*495ae853SAndroid Build Coastguard Worker         }
1657*495ae853SAndroid Build Coastguard Worker         else
1658*495ae853SAndroid Build Coastguard Worker         {
1659*495ae853SAndroid Build Coastguard Worker             return ERROR_DBP_MANAGER_T;
1660*495ae853SAndroid Build Coastguard Worker         }
1661*495ae853SAndroid Build Coastguard Worker 
1662*495ae853SAndroid Build Coastguard Worker         if(u1_del_st)
1663*495ae853SAndroid Build Coastguard Worker         {
1664*495ae853SAndroid Build Coastguard Worker             return ERROR_DBP_MANAGER_T;
1665*495ae853SAndroid Build Coastguard Worker         }
1666*495ae853SAndroid Build Coastguard Worker         else
1667*495ae853SAndroid Build Coastguard Worker         {
1668*495ae853SAndroid Build Coastguard Worker             return 0;
1669*495ae853SAndroid Build Coastguard Worker         }
1670*495ae853SAndroid Build Coastguard Worker     }
1671*495ae853SAndroid Build Coastguard Worker 
1672*495ae853SAndroid Build Coastguard Worker     ps_unmark_node->b_used_as_ref = false;
1673*495ae853SAndroid Build Coastguard Worker     ps_unmark_node->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1674*495ae853SAndroid Build Coastguard Worker     ps_unmark_node->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1675*495ae853SAndroid Build Coastguard Worker 
1676*495ae853SAndroid Build Coastguard Worker     if(ps_unmark_node == ps_dpb_mgr->ps_dpb_st_head)
1677*495ae853SAndroid Build Coastguard Worker     {
1678*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->ps_dpb_st_head = ps_next_dpb->ps_prev_short;
1679*495ae853SAndroid Build Coastguard Worker     }
1680*495ae853SAndroid Build Coastguard Worker     else
1681*495ae853SAndroid Build Coastguard Worker     {
1682*495ae853SAndroid Build Coastguard Worker         ps_next_dpb->ps_prev_short = ps_unmark_node->ps_prev_short;
1683*495ae853SAndroid Build Coastguard Worker     }
1684*495ae853SAndroid Build Coastguard Worker 
1685*495ae853SAndroid Build Coastguard Worker     ps_dpb_mgr->u1_num_st_ref_bufs--;
1686*495ae853SAndroid Build Coastguard Worker     u1_del_node = 1;
1687*495ae853SAndroid Build Coastguard Worker 
1688*495ae853SAndroid Build Coastguard Worker     if(u4_lt_idx == (MAX_REF_BUFS + 1))
1689*495ae853SAndroid Build Coastguard Worker     {
1690*495ae853SAndroid Build Coastguard Worker         if(u1_del_node)
1691*495ae853SAndroid Build Coastguard Worker         {
1692*495ae853SAndroid Build Coastguard Worker             imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
1693*495ae853SAndroid Build Coastguard Worker                                 ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
1694*495ae853SAndroid Build Coastguard Worker                                 ps_unmark_node->ps_au_buf->i4_pic_buf_id);
1695*495ae853SAndroid Build Coastguard Worker 
1696*495ae853SAndroid Build Coastguard Worker             ps_unmark_node->ps_prev_short = NULL;
1697*495ae853SAndroid Build Coastguard Worker         }
1698*495ae853SAndroid Build Coastguard Worker     }
1699*495ae853SAndroid Build Coastguard Worker     else
1700*495ae853SAndroid Build Coastguard Worker     {
1701*495ae853SAndroid Build Coastguard Worker         i4_error_code = imvcd_dpb_delete_lt_node(ps_dpb_mgr, u4_lt_idx);
1702*495ae853SAndroid Build Coastguard Worker 
1703*495ae853SAndroid Build Coastguard Worker         if(i4_error_code != OK)
1704*495ae853SAndroid Build Coastguard Worker         {
1705*495ae853SAndroid Build Coastguard Worker             return i4_error_code;
1706*495ae853SAndroid Build Coastguard Worker         }
1707*495ae853SAndroid Build Coastguard Worker 
1708*495ae853SAndroid Build Coastguard Worker         i4_error_code = imvcd_dpb_insert_lt_node(ps_dpb_mgr, ps_unmark_node, u4_lt_idx);
1709*495ae853SAndroid Build Coastguard Worker 
1710*495ae853SAndroid Build Coastguard Worker         if(i4_error_code != OK)
1711*495ae853SAndroid Build Coastguard Worker         {
1712*495ae853SAndroid Build Coastguard Worker             return i4_error_code;
1713*495ae853SAndroid Build Coastguard Worker         }
1714*495ae853SAndroid Build Coastguard Worker     }
1715*495ae853SAndroid Build Coastguard Worker 
1716*495ae853SAndroid Build Coastguard Worker     return OK;
1717*495ae853SAndroid Build Coastguard Worker }
1718*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_do_mmco(dpb_commands_t * ps_dpb_cmds,mvc_dpb_manager_t * ps_dpb_mgr,mvc_au_buffer_t * ps_cur_au,UWORD8 u1_max_num_ref_frames,UWORD8 u1_curr_pic_in_err)1719*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_mgr,
1720*495ae853SAndroid Build Coastguard Worker                          mvc_au_buffer_t *ps_cur_au, UWORD8 u1_max_num_ref_frames,
1721*495ae853SAndroid Build Coastguard Worker                          UWORD8 u1_curr_pic_in_err)
1722*495ae853SAndroid Build Coastguard Worker {
1723*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_next_dpb;
1724*495ae853SAndroid Build Coastguard Worker 
1725*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
1726*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_buf_mode, u1_marked_lt;
1727*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_gaps;
1728*495ae853SAndroid Build Coastguard Worker     WORD32 i4_error_code;
1729*495ae853SAndroid Build Coastguard Worker 
1730*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_del_node = 1;
1731*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_insert_st_pic = 1;
1732*495ae853SAndroid Build Coastguard Worker 
1733*495ae853SAndroid Build Coastguard Worker     // 0 - sliding window; 1 - Adaptive
1734*495ae853SAndroid Build Coastguard Worker     u1_buf_mode = ps_dpb_cmds->u1_buf_mode;
1735*495ae853SAndroid Build Coastguard Worker     u1_marked_lt = 0;
1736*495ae853SAndroid Build Coastguard Worker     u1_num_gaps = ps_dpb_mgr->u1_num_gaps;
1737*495ae853SAndroid Build Coastguard Worker 
1738*495ae853SAndroid Build Coastguard Worker     if(!u1_buf_mode)
1739*495ae853SAndroid Build Coastguard Worker     {
1740*495ae853SAndroid Build Coastguard Worker         // Sliding window - implements 8.2.5.3
1741*495ae853SAndroid Build Coastguard Worker         if((ps_dpb_mgr->u1_num_st_ref_bufs + ps_dpb_mgr->u1_num_lt_ref_bufs + u1_num_gaps) ==
1742*495ae853SAndroid Build Coastguard Worker            u1_max_num_ref_frames)
1743*495ae853SAndroid Build Coastguard Worker         {
1744*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_new_node_flag = 1;
1745*495ae853SAndroid Build Coastguard Worker 
1746*495ae853SAndroid Build Coastguard Worker             if((0 == ps_dpb_mgr->u1_num_st_ref_bufs) && (0 == u1_num_gaps))
1747*495ae853SAndroid Build Coastguard Worker             {
1748*495ae853SAndroid Build Coastguard Worker                 return ERROR_DBP_MANAGER_T;
1749*495ae853SAndroid Build Coastguard Worker             }
1750*495ae853SAndroid Build Coastguard Worker 
1751*495ae853SAndroid Build Coastguard Worker             // Chase the links to reach the last but one picNum, if available
1752*495ae853SAndroid Build Coastguard Worker             ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1753*495ae853SAndroid Build Coastguard Worker 
1754*495ae853SAndroid Build Coastguard Worker             if(ps_dpb_mgr->u1_num_st_ref_bufs > 1)
1755*495ae853SAndroid Build Coastguard Worker             {
1756*495ae853SAndroid Build Coastguard Worker                 if(ps_next_dpb->ps_au_buf->i4_pic_num == ps_cur_au->i4_pic_num)
1757*495ae853SAndroid Build Coastguard Worker                 {
1758*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
1759*495ae853SAndroid Build Coastguard Worker                 }
1760*495ae853SAndroid Build Coastguard Worker 
1761*495ae853SAndroid Build Coastguard Worker                 for(i = 1; i < (ps_dpb_mgr->u1_num_st_ref_bufs - 1); i++)
1762*495ae853SAndroid Build Coastguard Worker                 {
1763*495ae853SAndroid Build Coastguard Worker                     if(ps_next_dpb == NULL)
1764*495ae853SAndroid Build Coastguard Worker                     {
1765*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
1766*495ae853SAndroid Build Coastguard Worker                     }
1767*495ae853SAndroid Build Coastguard Worker 
1768*495ae853SAndroid Build Coastguard Worker                     if(ps_next_dpb->ps_au_buf->i4_pic_num == ps_cur_au->i4_pic_num)
1769*495ae853SAndroid Build Coastguard Worker                     {
1770*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
1771*495ae853SAndroid Build Coastguard Worker                     }
1772*495ae853SAndroid Build Coastguard Worker 
1773*495ae853SAndroid Build Coastguard Worker                     ps_next_dpb = ps_next_dpb->ps_prev_short;
1774*495ae853SAndroid Build Coastguard Worker                 }
1775*495ae853SAndroid Build Coastguard Worker 
1776*495ae853SAndroid Build Coastguard Worker                 if(ps_next_dpb->ps_prev_short->ps_prev_short != NULL)
1777*495ae853SAndroid Build Coastguard Worker                 {
1778*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
1779*495ae853SAndroid Build Coastguard Worker                 }
1780*495ae853SAndroid Build Coastguard Worker 
1781*495ae853SAndroid Build Coastguard Worker                 if(u1_new_node_flag)
1782*495ae853SAndroid Build Coastguard Worker                 {
1783*495ae853SAndroid Build Coastguard Worker                     if(u1_num_gaps)
1784*495ae853SAndroid Build Coastguard Worker                     {
1785*495ae853SAndroid Build Coastguard Worker                         i4_error_code = imvcd_dpb_delete_gap_frm_sliding(
1786*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr, ps_next_dpb->ps_prev_short->ps_au_buf->i4_pic_num,
1787*495ae853SAndroid Build Coastguard Worker                             &u1_del_node);
1788*495ae853SAndroid Build Coastguard Worker 
1789*495ae853SAndroid Build Coastguard Worker                         if(i4_error_code != OK)
1790*495ae853SAndroid Build Coastguard Worker                         {
1791*495ae853SAndroid Build Coastguard Worker                             return i4_error_code;
1792*495ae853SAndroid Build Coastguard Worker                         }
1793*495ae853SAndroid Build Coastguard Worker                     }
1794*495ae853SAndroid Build Coastguard Worker 
1795*495ae853SAndroid Build Coastguard Worker                     if(u1_del_node)
1796*495ae853SAndroid Build Coastguard Worker                     {
1797*495ae853SAndroid Build Coastguard Worker                         ps_dpb_mgr->u1_num_st_ref_bufs--;
1798*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short->b_used_as_ref = false;
1799*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1800*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1801*495ae853SAndroid Build Coastguard Worker 
1802*495ae853SAndroid Build Coastguard Worker                         imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
1803*495ae853SAndroid Build Coastguard Worker                                             ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
1804*495ae853SAndroid Build Coastguard Worker                                             ps_next_dpb->ps_prev_short->ps_au_buf->i4_pic_buf_id);
1805*495ae853SAndroid Build Coastguard Worker 
1806*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short->ps_au_buf = NULL;
1807*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short = NULL;
1808*495ae853SAndroid Build Coastguard Worker                     }
1809*495ae853SAndroid Build Coastguard Worker                 }
1810*495ae853SAndroid Build Coastguard Worker             }
1811*495ae853SAndroid Build Coastguard Worker             else
1812*495ae853SAndroid Build Coastguard Worker             {
1813*495ae853SAndroid Build Coastguard Worker                 if(ps_dpb_mgr->u1_num_st_ref_bufs)
1814*495ae853SAndroid Build Coastguard Worker                 {
1815*495ae853SAndroid Build Coastguard Worker                     i4_error_code = imvcd_dpb_delete_gap_frm_sliding(
1816*495ae853SAndroid Build Coastguard Worker                         ps_dpb_mgr, ps_next_dpb->ps_au_buf->i4_pic_num, &u1_del_node);
1817*495ae853SAndroid Build Coastguard Worker 
1818*495ae853SAndroid Build Coastguard Worker                     if(i4_error_code != OK)
1819*495ae853SAndroid Build Coastguard Worker                     {
1820*495ae853SAndroid Build Coastguard Worker                         return i4_error_code;
1821*495ae853SAndroid Build Coastguard Worker                     }
1822*495ae853SAndroid Build Coastguard Worker 
1823*495ae853SAndroid Build Coastguard Worker                     if((ps_next_dpb->ps_au_buf->i4_pic_num != ps_cur_au->i4_pic_num) && u1_del_node)
1824*495ae853SAndroid Build Coastguard Worker                     {
1825*495ae853SAndroid Build Coastguard Worker                         ps_dpb_mgr->u1_num_st_ref_bufs--;
1826*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->b_used_as_ref = false;
1827*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1828*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1829*495ae853SAndroid Build Coastguard Worker 
1830*495ae853SAndroid Build Coastguard Worker                         imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
1831*495ae853SAndroid Build Coastguard Worker                                             ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
1832*495ae853SAndroid Build Coastguard Worker                                             ps_next_dpb->ps_au_buf->i4_pic_buf_id);
1833*495ae853SAndroid Build Coastguard Worker 
1834*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_au_buf = NULL;
1835*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb->ps_prev_short = NULL;
1836*495ae853SAndroid Build Coastguard Worker                         ps_dpb_mgr->ps_dpb_st_head = NULL;
1837*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb = NULL;
1838*495ae853SAndroid Build Coastguard Worker                     }
1839*495ae853SAndroid Build Coastguard Worker                     else if(ps_next_dpb->ps_au_buf->i4_pic_num == ps_cur_au->i4_pic_num)
1840*495ae853SAndroid Build Coastguard Worker                     {
1841*495ae853SAndroid Build Coastguard Worker                         if(u1_curr_pic_in_err)
1842*495ae853SAndroid Build Coastguard Worker                         {
1843*495ae853SAndroid Build Coastguard Worker                             u1_insert_st_pic = 0;
1844*495ae853SAndroid Build Coastguard Worker                         }
1845*495ae853SAndroid Build Coastguard Worker                         else if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1846*495ae853SAndroid Build Coastguard Worker                         {
1847*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr->u1_num_st_ref_bufs--;
1848*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb->b_used_as_ref = false;
1849*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb->s_top_field.u1_reference_info = UNUSED_FOR_REF;
1850*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
1851*495ae853SAndroid Build Coastguard Worker 
1852*495ae853SAndroid Build Coastguard Worker                             imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
1853*495ae853SAndroid Build Coastguard Worker                                                 ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
1854*495ae853SAndroid Build Coastguard Worker                                                 ps_next_dpb->ps_au_buf->i4_pic_buf_id);
1855*495ae853SAndroid Build Coastguard Worker 
1856*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb->ps_au_buf = NULL;
1857*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb = NULL;
1858*495ae853SAndroid Build Coastguard Worker                         }
1859*495ae853SAndroid Build Coastguard Worker                     }
1860*495ae853SAndroid Build Coastguard Worker                 }
1861*495ae853SAndroid Build Coastguard Worker                 else
1862*495ae853SAndroid Build Coastguard Worker                 {
1863*495ae853SAndroid Build Coastguard Worker                     i4_error_code = imvcd_dpb_delete_gap_frm_sliding(ps_dpb_mgr, INVALID_FRAME_NUM,
1864*495ae853SAndroid Build Coastguard Worker                                                                      &u1_del_node);
1865*495ae853SAndroid Build Coastguard Worker 
1866*495ae853SAndroid Build Coastguard Worker                     if(i4_error_code != OK)
1867*495ae853SAndroid Build Coastguard Worker                     {
1868*495ae853SAndroid Build Coastguard Worker                         return i4_error_code;
1869*495ae853SAndroid Build Coastguard Worker                     }
1870*495ae853SAndroid Build Coastguard Worker 
1871*495ae853SAndroid Build Coastguard Worker                     if(u1_del_node)
1872*495ae853SAndroid Build Coastguard Worker                     {
1873*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
1874*495ae853SAndroid Build Coastguard Worker                     }
1875*495ae853SAndroid Build Coastguard Worker                 }
1876*495ae853SAndroid Build Coastguard Worker             }
1877*495ae853SAndroid Build Coastguard Worker         }
1878*495ae853SAndroid Build Coastguard Worker     }
1879*495ae853SAndroid Build Coastguard Worker     else
1880*495ae853SAndroid Build Coastguard Worker     {
1881*495ae853SAndroid Build Coastguard Worker         // Adaptive memory control - implements 8.2.5.4
1882*495ae853SAndroid Build Coastguard Worker         struct MMCParams *ps_mmc_params;
1883*495ae853SAndroid Build Coastguard Worker 
1884*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_mmco;
1885*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_diff_pic_num;
1886*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_lt_idx;
1887*495ae853SAndroid Build Coastguard Worker 
1888*495ae853SAndroid Build Coastguard Worker         UWORD32 au4_num_mmco_cmds[NUM_MMCO_CMD_IDS] = {0};
1889*495ae853SAndroid Build Coastguard Worker 
1890*495ae853SAndroid Build Coastguard Worker         for(j = 0; j < ps_dpb_cmds->u1_num_of_commands; j++)
1891*495ae853SAndroid Build Coastguard Worker         {
1892*495ae853SAndroid Build Coastguard Worker             ps_mmc_params = &ps_dpb_cmds->as_mmc_params[j];
1893*495ae853SAndroid Build Coastguard Worker             u4_mmco = ps_mmc_params->u4_mmco;
1894*495ae853SAndroid Build Coastguard Worker 
1895*495ae853SAndroid Build Coastguard Worker             switch(u4_mmco)
1896*495ae853SAndroid Build Coastguard Worker             {
1897*495ae853SAndroid Build Coastguard Worker                 case MARK_ST_PICNUM_AS_NONREF:
1898*495ae853SAndroid Build Coastguard Worker                 {
1899*495ae853SAndroid Build Coastguard Worker                     WORD64 i8_pic_num;
1900*495ae853SAndroid Build Coastguard Worker 
1901*495ae853SAndroid Build Coastguard Worker                     u4_diff_pic_num = ps_mmc_params->u4_diff_pic_num;
1902*495ae853SAndroid Build Coastguard Worker                     i8_pic_num =
1903*495ae853SAndroid Build Coastguard Worker                         ((WORD64) ps_cur_au->i4_pic_num) - ((WORD64) (u4_diff_pic_num + 1));
1904*495ae853SAndroid Build Coastguard Worker 
1905*495ae853SAndroid Build Coastguard Worker                     if(IS_OUT_OF_RANGE_S32(i8_pic_num))
1906*495ae853SAndroid Build Coastguard Worker                     {
1907*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
1908*495ae853SAndroid Build Coastguard Worker                     }
1909*495ae853SAndroid Build Coastguard Worker 
1910*495ae853SAndroid Build Coastguard Worker                     if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1911*495ae853SAndroid Build Coastguard Worker                     {
1912*495ae853SAndroid Build Coastguard Worker                         i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(
1913*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr, (WORD32) i8_pic_num, MAX_REF_BUFS + 1);
1914*495ae853SAndroid Build Coastguard Worker 
1915*495ae853SAndroid Build Coastguard Worker                         if(i4_error_code != OK)
1916*495ae853SAndroid Build Coastguard Worker                         {
1917*495ae853SAndroid Build Coastguard Worker                             return i4_error_code;
1918*495ae853SAndroid Build Coastguard Worker                         }
1919*495ae853SAndroid Build Coastguard Worker                     }
1920*495ae853SAndroid Build Coastguard Worker                     else
1921*495ae853SAndroid Build Coastguard Worker                     {
1922*495ae853SAndroid Build Coastguard Worker                         UWORD8 u1_dummy;
1923*495ae853SAndroid Build Coastguard Worker 
1924*495ae853SAndroid Build Coastguard Worker                         i4_error_code = imvcd_dpb_delete_gap_frm_mmco(
1925*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr, (WORD32) i8_pic_num, &u1_dummy);
1926*495ae853SAndroid Build Coastguard Worker 
1927*495ae853SAndroid Build Coastguard Worker                         if(i4_error_code != OK)
1928*495ae853SAndroid Build Coastguard Worker                         {
1929*495ae853SAndroid Build Coastguard Worker                             return i4_error_code;
1930*495ae853SAndroid Build Coastguard Worker                         }
1931*495ae853SAndroid Build Coastguard Worker                     }
1932*495ae853SAndroid Build Coastguard Worker 
1933*495ae853SAndroid Build Coastguard Worker                     break;
1934*495ae853SAndroid Build Coastguard Worker                 }
1935*495ae853SAndroid Build Coastguard Worker                 case MARK_LT_INDEX_AS_NONREF:
1936*495ae853SAndroid Build Coastguard Worker                 {
1937*495ae853SAndroid Build Coastguard Worker                     u4_lt_idx = ps_mmc_params->u4_lt_idx;
1938*495ae853SAndroid Build Coastguard Worker 
1939*495ae853SAndroid Build Coastguard Worker                     i4_error_code = imvcd_dpb_delete_lt_node(ps_dpb_mgr, u4_lt_idx);
1940*495ae853SAndroid Build Coastguard Worker 
1941*495ae853SAndroid Build Coastguard Worker                     if(i4_error_code != OK)
1942*495ae853SAndroid Build Coastguard Worker                     {
1943*495ae853SAndroid Build Coastguard Worker                         return i4_error_code;
1944*495ae853SAndroid Build Coastguard Worker                     }
1945*495ae853SAndroid Build Coastguard Worker 
1946*495ae853SAndroid Build Coastguard Worker                     break;
1947*495ae853SAndroid Build Coastguard Worker                 }
1948*495ae853SAndroid Build Coastguard Worker                 case MARK_ST_PICNUM_AS_LT_INDEX:
1949*495ae853SAndroid Build Coastguard Worker                 {
1950*495ae853SAndroid Build Coastguard Worker                     WORD64 i8_pic_num;
1951*495ae853SAndroid Build Coastguard Worker 
1952*495ae853SAndroid Build Coastguard Worker                     u4_diff_pic_num = ps_mmc_params->u4_diff_pic_num;
1953*495ae853SAndroid Build Coastguard Worker 
1954*495ae853SAndroid Build Coastguard Worker                     i8_pic_num =
1955*495ae853SAndroid Build Coastguard Worker                         ((WORD64) ps_cur_au->i4_pic_num) - ((WORD64) (u4_diff_pic_num + 1));
1956*495ae853SAndroid Build Coastguard Worker 
1957*495ae853SAndroid Build Coastguard Worker                     if(IS_OUT_OF_RANGE_S32(i8_pic_num))
1958*495ae853SAndroid Build Coastguard Worker                     {
1959*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
1960*495ae853SAndroid Build Coastguard Worker                     }
1961*495ae853SAndroid Build Coastguard Worker 
1962*495ae853SAndroid Build Coastguard Worker                     u4_lt_idx = ps_mmc_params->u4_lt_idx;
1963*495ae853SAndroid Build Coastguard Worker 
1964*495ae853SAndroid Build Coastguard Worker                     if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) ||
1965*495ae853SAndroid Build Coastguard Worker                        (u4_lt_idx > ps_dpb_mgr->u1_max_lt_frame_idx))
1966*495ae853SAndroid Build Coastguard Worker                     {
1967*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
1968*495ae853SAndroid Build Coastguard Worker                     }
1969*495ae853SAndroid Build Coastguard Worker 
1970*495ae853SAndroid Build Coastguard Worker                     if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
1971*495ae853SAndroid Build Coastguard Worker                     {
1972*495ae853SAndroid Build Coastguard Worker                         i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(
1973*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr, (WORD32) i8_pic_num, u4_lt_idx);
1974*495ae853SAndroid Build Coastguard Worker 
1975*495ae853SAndroid Build Coastguard Worker                         if(i4_error_code != OK)
1976*495ae853SAndroid Build Coastguard Worker                         {
1977*495ae853SAndroid Build Coastguard Worker                             return i4_error_code;
1978*495ae853SAndroid Build Coastguard Worker                         }
1979*495ae853SAndroid Build Coastguard Worker                     }
1980*495ae853SAndroid Build Coastguard Worker 
1981*495ae853SAndroid Build Coastguard Worker                     break;
1982*495ae853SAndroid Build Coastguard Worker                 }
1983*495ae853SAndroid Build Coastguard Worker                 case SET_MAX_LT_INDEX:
1984*495ae853SAndroid Build Coastguard Worker                 {
1985*495ae853SAndroid Build Coastguard Worker                     if(au4_num_mmco_cmds[SET_MAX_LT_INDEX] > 0)
1986*495ae853SAndroid Build Coastguard Worker                     {
1987*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
1988*495ae853SAndroid Build Coastguard Worker                     }
1989*495ae853SAndroid Build Coastguard Worker 
1990*495ae853SAndroid Build Coastguard Worker                     u4_lt_idx =
1991*495ae853SAndroid Build Coastguard Worker                         ps_mmc_params->u4_max_lt_idx_plus1;  // Get Max_long_term_index_plus1
1992*495ae853SAndroid Build Coastguard Worker 
1993*495ae853SAndroid Build Coastguard Worker                     if((u4_lt_idx <= ps_dpb_mgr->u1_max_lt_frame_idx) &&
1994*495ae853SAndroid Build Coastguard Worker                        (ps_dpb_mgr->u1_num_lt_ref_bufs > 0))
1995*495ae853SAndroid Build Coastguard Worker                     {
1996*495ae853SAndroid Build Coastguard Worker                         mvc_dpb_info_t *ps_nxtDPB;
1997*495ae853SAndroid Build Coastguard Worker 
1998*495ae853SAndroid Build Coastguard Worker                         // Set all LT buffers with index >= u4_lt_idx to nonreference
1999*495ae853SAndroid Build Coastguard Worker                         ps_nxtDPB = ps_dpb_mgr->ps_dpb_lt_head;
2000*495ae853SAndroid Build Coastguard Worker                         ps_next_dpb = ps_nxtDPB->ps_prev_long;
2001*495ae853SAndroid Build Coastguard Worker 
2002*495ae853SAndroid Build Coastguard Worker                         if(ps_nxtDPB->ps_au_buf->u1_long_term_frm_idx >= u4_lt_idx)
2003*495ae853SAndroid Build Coastguard Worker                         {
2004*495ae853SAndroid Build Coastguard Worker                             i = 0;
2005*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr->ps_dpb_lt_head = NULL;
2006*495ae853SAndroid Build Coastguard Worker                         }
2007*495ae853SAndroid Build Coastguard Worker                         else
2008*495ae853SAndroid Build Coastguard Worker                         {
2009*495ae853SAndroid Build Coastguard Worker                             for(i = 1; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
2010*495ae853SAndroid Build Coastguard Worker                             {
2011*495ae853SAndroid Build Coastguard Worker                                 if(ps_next_dpb->ps_au_buf->u1_long_term_frm_idx >= u4_lt_idx)
2012*495ae853SAndroid Build Coastguard Worker                                 {
2013*495ae853SAndroid Build Coastguard Worker                                     break;
2014*495ae853SAndroid Build Coastguard Worker                                 }
2015*495ae853SAndroid Build Coastguard Worker 
2016*495ae853SAndroid Build Coastguard Worker                                 ps_nxtDPB = ps_next_dpb;
2017*495ae853SAndroid Build Coastguard Worker                                 ps_next_dpb = ps_next_dpb->ps_prev_long;
2018*495ae853SAndroid Build Coastguard Worker                             }
2019*495ae853SAndroid Build Coastguard Worker 
2020*495ae853SAndroid Build Coastguard Worker                             ps_nxtDPB->ps_prev_long = NULL;  // Terminate the link of the
2021*495ae853SAndroid Build Coastguard Worker                                                              // closest LTIndex that is <=Max
2022*495ae853SAndroid Build Coastguard Worker                         }
2023*495ae853SAndroid Build Coastguard Worker 
2024*495ae853SAndroid Build Coastguard Worker                         ps_dpb_mgr->u1_num_lt_ref_bufs = i;
2025*495ae853SAndroid Build Coastguard Worker 
2026*495ae853SAndroid Build Coastguard Worker                         if(i == 0)
2027*495ae853SAndroid Build Coastguard Worker                         {
2028*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb = ps_nxtDPB;
2029*495ae853SAndroid Build Coastguard Worker                         }
2030*495ae853SAndroid Build Coastguard Worker 
2031*495ae853SAndroid Build Coastguard Worker                         for(; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
2032*495ae853SAndroid Build Coastguard Worker                         {
2033*495ae853SAndroid Build Coastguard Worker                             ps_nxtDPB = ps_next_dpb;
2034*495ae853SAndroid Build Coastguard Worker                             ps_nxtDPB->b_used_as_ref = false;
2035*495ae853SAndroid Build Coastguard Worker                             ps_nxtDPB->s_top_field.u1_reference_info = UNUSED_FOR_REF;
2036*495ae853SAndroid Build Coastguard Worker                             ps_nxtDPB->s_bot_field.u1_reference_info = UNUSED_FOR_REF;
2037*495ae853SAndroid Build Coastguard Worker 
2038*495ae853SAndroid Build Coastguard Worker                             imvcd_free_ref_bufs(ps_dpb_mgr->ps_mvc_au_buf_mgr,
2039*495ae853SAndroid Build Coastguard Worker                                                 ps_dpb_mgr->ps_mvc_au_mv_pred_buf_mgr,
2040*495ae853SAndroid Build Coastguard Worker                                                 ps_nxtDPB->ps_au_buf->i4_pic_buf_id);
2041*495ae853SAndroid Build Coastguard Worker 
2042*495ae853SAndroid Build Coastguard Worker                             ps_nxtDPB->ps_au_buf = NULL;
2043*495ae853SAndroid Build Coastguard Worker 
2044*495ae853SAndroid Build Coastguard Worker                             ps_next_dpb = ps_nxtDPB->ps_prev_long;
2045*495ae853SAndroid Build Coastguard Worker                             ps_nxtDPB->ps_prev_long = NULL;
2046*495ae853SAndroid Build Coastguard Worker                         }
2047*495ae853SAndroid Build Coastguard Worker                     }
2048*495ae853SAndroid Build Coastguard Worker 
2049*495ae853SAndroid Build Coastguard Worker                     if(u4_lt_idx == 0)
2050*495ae853SAndroid Build Coastguard Worker                     {
2051*495ae853SAndroid Build Coastguard Worker                         ps_dpb_mgr->u1_max_lt_frame_idx = NO_LONG_TERM_INDICIES;
2052*495ae853SAndroid Build Coastguard Worker                     }
2053*495ae853SAndroid Build Coastguard Worker                     else
2054*495ae853SAndroid Build Coastguard Worker                     {
2055*495ae853SAndroid Build Coastguard Worker                         ps_dpb_mgr->u1_max_lt_frame_idx = u4_lt_idx - 1;
2056*495ae853SAndroid Build Coastguard Worker                     }
2057*495ae853SAndroid Build Coastguard Worker 
2058*495ae853SAndroid Build Coastguard Worker                     break;
2059*495ae853SAndroid Build Coastguard Worker                 }
2060*495ae853SAndroid Build Coastguard Worker                 case SET_LT_INDEX:
2061*495ae853SAndroid Build Coastguard Worker                 {
2062*495ae853SAndroid Build Coastguard Worker                     if(au4_num_mmco_cmds[SET_LT_INDEX] > 0)
2063*495ae853SAndroid Build Coastguard Worker                     {
2064*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
2065*495ae853SAndroid Build Coastguard Worker                     }
2066*495ae853SAndroid Build Coastguard Worker 
2067*495ae853SAndroid Build Coastguard Worker                     u4_lt_idx = ps_mmc_params->u4_lt_idx;  // Get long term index
2068*495ae853SAndroid Build Coastguard Worker 
2069*495ae853SAndroid Build Coastguard Worker                     if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) ||
2070*495ae853SAndroid Build Coastguard Worker                        (u4_lt_idx > ps_dpb_mgr->u1_max_lt_frame_idx))
2071*495ae853SAndroid Build Coastguard Worker                     {
2072*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
2073*495ae853SAndroid Build Coastguard Worker                     }
2074*495ae853SAndroid Build Coastguard Worker 
2075*495ae853SAndroid Build Coastguard Worker                     i4_error_code = imvcd_dpb_insert_st_node(ps_dpb_mgr, ps_cur_au);
2076*495ae853SAndroid Build Coastguard Worker 
2077*495ae853SAndroid Build Coastguard Worker                     if(i4_error_code != OK)
2078*495ae853SAndroid Build Coastguard Worker                     {
2079*495ae853SAndroid Build Coastguard Worker                         return i4_error_code;
2080*495ae853SAndroid Build Coastguard Worker                     }
2081*495ae853SAndroid Build Coastguard Worker 
2082*495ae853SAndroid Build Coastguard Worker                     if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
2083*495ae853SAndroid Build Coastguard Worker                     {
2084*495ae853SAndroid Build Coastguard Worker                         i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(
2085*495ae853SAndroid Build Coastguard Worker                             ps_dpb_mgr, ps_cur_au->i4_pic_num, u4_lt_idx);
2086*495ae853SAndroid Build Coastguard Worker 
2087*495ae853SAndroid Build Coastguard Worker                         if(i4_error_code != OK)
2088*495ae853SAndroid Build Coastguard Worker                         {
2089*495ae853SAndroid Build Coastguard Worker                             return i4_error_code;
2090*495ae853SAndroid Build Coastguard Worker                         }
2091*495ae853SAndroid Build Coastguard Worker                     }
2092*495ae853SAndroid Build Coastguard Worker                     else
2093*495ae853SAndroid Build Coastguard Worker                     {
2094*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
2095*495ae853SAndroid Build Coastguard Worker                     }
2096*495ae853SAndroid Build Coastguard Worker 
2097*495ae853SAndroid Build Coastguard Worker                     u1_marked_lt = 1;
2098*495ae853SAndroid Build Coastguard Worker 
2099*495ae853SAndroid Build Coastguard Worker                     break;
2100*495ae853SAndroid Build Coastguard Worker                 }
2101*495ae853SAndroid Build Coastguard Worker                 case RESET_REF_PICTURES:
2102*495ae853SAndroid Build Coastguard Worker                 {
2103*495ae853SAndroid Build Coastguard Worker                     if((au4_num_mmco_cmds[RESET_REF_PICTURES] > 0) ||
2104*495ae853SAndroid Build Coastguard Worker                        (au4_num_mmco_cmds[MARK_ST_PICNUM_AS_NONREF] > 0) ||
2105*495ae853SAndroid Build Coastguard Worker                        (au4_num_mmco_cmds[MARK_LT_INDEX_AS_NONREF] > 0) ||
2106*495ae853SAndroid Build Coastguard Worker                        (au4_num_mmco_cmds[MARK_ST_PICNUM_AS_LT_INDEX] > 0))
2107*495ae853SAndroid Build Coastguard Worker                     {
2108*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
2109*495ae853SAndroid Build Coastguard Worker                     }
2110*495ae853SAndroid Build Coastguard Worker 
2111*495ae853SAndroid Build Coastguard Worker                     if((j > 0) && (ps_dpb_cmds->as_mmc_params[j - 1].u4_mmco == SET_LT_INDEX))
2112*495ae853SAndroid Build Coastguard Worker                     {
2113*495ae853SAndroid Build Coastguard Worker                         return ERROR_DBP_MANAGER_T;
2114*495ae853SAndroid Build Coastguard Worker                     }
2115*495ae853SAndroid Build Coastguard Worker 
2116*495ae853SAndroid Build Coastguard Worker                     __attribute__((fallthrough));
2117*495ae853SAndroid Build Coastguard Worker                 }
2118*495ae853SAndroid Build Coastguard Worker                 case RESET_ALL_PICTURES:
2119*495ae853SAndroid Build Coastguard Worker                 {
2120*495ae853SAndroid Build Coastguard Worker                     WORD32 i4_pic_num = ps_cur_au->i4_frame_num;
2121*495ae853SAndroid Build Coastguard Worker 
2122*495ae853SAndroid Build Coastguard Worker                     imvcd_reset_dpb(ps_dpb_mgr);
2123*495ae853SAndroid Build Coastguard Worker 
2124*495ae853SAndroid Build Coastguard Worker                     ps_cur_au->i4_frame_num = 0;
2125*495ae853SAndroid Build Coastguard Worker 
2126*495ae853SAndroid Build Coastguard Worker                     if(!u1_marked_lt && u1_insert_st_pic)
2127*495ae853SAndroid Build Coastguard Worker                     {
2128*495ae853SAndroid Build Coastguard Worker                         i4_error_code = imvcd_dpb_insert_st_node(ps_dpb_mgr, ps_cur_au);
2129*495ae853SAndroid Build Coastguard Worker 
2130*495ae853SAndroid Build Coastguard Worker                         if(i4_error_code != OK)
2131*495ae853SAndroid Build Coastguard Worker                         {
2132*495ae853SAndroid Build Coastguard Worker                             return i4_error_code;
2133*495ae853SAndroid Build Coastguard Worker                         }
2134*495ae853SAndroid Build Coastguard Worker                     }
2135*495ae853SAndroid Build Coastguard Worker 
2136*495ae853SAndroid Build Coastguard Worker                     ps_cur_au->i4_frame_num = i4_pic_num;
2137*495ae853SAndroid Build Coastguard Worker 
2138*495ae853SAndroid Build Coastguard Worker                     return OK;
2139*495ae853SAndroid Build Coastguard Worker                 }
2140*495ae853SAndroid Build Coastguard Worker                 default:
2141*495ae853SAndroid Build Coastguard Worker                 {
2142*495ae853SAndroid Build Coastguard Worker                     return ERROR_DBP_MANAGER_T;
2143*495ae853SAndroid Build Coastguard Worker                 }
2144*495ae853SAndroid Build Coastguard Worker             }
2145*495ae853SAndroid Build Coastguard Worker 
2146*495ae853SAndroid Build Coastguard Worker             au4_num_mmco_cmds[u4_mmco]++;
2147*495ae853SAndroid Build Coastguard Worker         }
2148*495ae853SAndroid Build Coastguard Worker     }
2149*495ae853SAndroid Build Coastguard Worker 
2150*495ae853SAndroid Build Coastguard Worker     if(!u1_marked_lt && u1_insert_st_pic)
2151*495ae853SAndroid Build Coastguard Worker     {
2152*495ae853SAndroid Build Coastguard Worker         i4_error_code = imvcd_dpb_insert_st_node(ps_dpb_mgr, ps_cur_au);
2153*495ae853SAndroid Build Coastguard Worker 
2154*495ae853SAndroid Build Coastguard Worker         if(i4_error_code != OK)
2155*495ae853SAndroid Build Coastguard Worker         {
2156*495ae853SAndroid Build Coastguard Worker             return i4_error_code;
2157*495ae853SAndroid Build Coastguard Worker         }
2158*495ae853SAndroid Build Coastguard Worker     }
2159*495ae853SAndroid Build Coastguard Worker 
2160*495ae853SAndroid Build Coastguard Worker     return OK;
2161*495ae853SAndroid Build Coastguard Worker }
2162*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_update_default_index_list(mvc_dpb_manager_t * ps_dpb_mgr)2163*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_dpb_update_default_index_list(mvc_dpb_manager_t *ps_dpb_mgr)
2164*495ae853SAndroid Build Coastguard Worker {
2165*495ae853SAndroid Build Coastguard Worker     WORD32 i;
2166*495ae853SAndroid Build Coastguard Worker 
2167*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
2168*495ae853SAndroid Build Coastguard Worker 
2169*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
2170*495ae853SAndroid Build Coastguard Worker     {
2171*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->aps_def_dpb[i] = ps_next_dpb->ps_au_buf;
2172*495ae853SAndroid Build Coastguard Worker         ps_next_dpb = ps_next_dpb->ps_prev_short;
2173*495ae853SAndroid Build Coastguard Worker     }
2174*495ae853SAndroid Build Coastguard Worker 
2175*495ae853SAndroid Build Coastguard Worker     ps_next_dpb = ps_dpb_mgr->ps_dpb_lt_head;
2176*495ae853SAndroid Build Coastguard Worker 
2177*495ae853SAndroid Build Coastguard Worker     for(; i < ps_dpb_mgr->u1_num_st_ref_bufs + ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
2178*495ae853SAndroid Build Coastguard Worker     {
2179*495ae853SAndroid Build Coastguard Worker         ps_dpb_mgr->aps_def_dpb[i] = ps_next_dpb->ps_au_buf;
2180*495ae853SAndroid Build Coastguard Worker         ps_next_dpb = ps_next_dpb->ps_prev_long;
2181*495ae853SAndroid Build Coastguard Worker     }
2182*495ae853SAndroid Build Coastguard Worker 
2183*495ae853SAndroid Build Coastguard Worker     return OK;
2184*495ae853SAndroid Build Coastguard Worker }
2185*495ae853SAndroid Build Coastguard Worker 
imvcd_dpb_is_diff_poc_valid(mvc_dpb_manager_t * ps_dpb_mgr,WORD32 i4_curr_poc)2186*495ae853SAndroid Build Coastguard Worker bool imvcd_dpb_is_diff_poc_valid(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_curr_poc)
2187*495ae853SAndroid Build Coastguard Worker {
2188*495ae853SAndroid Build Coastguard Worker     WORD32 i;
2189*495ae853SAndroid Build Coastguard Worker 
2190*495ae853SAndroid Build Coastguard Worker     mvc_dpb_info_t *ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
2191*495ae853SAndroid Build Coastguard Worker 
2192*495ae853SAndroid Build Coastguard Worker     /* Check in conformance with section 8.2.1 from spec */
2193*495ae853SAndroid Build Coastguard Worker     /* Particularly the statement - */
2194*495ae853SAndroid Build Coastguard Worker     /* 'The bitstream shall not contain data that result in values of DiffPicOrderCnt(picA, picB)
2195*495ae853SAndroid Build Coastguard Worker      * used in the decoding process that exceed the range of -2^15 to 2^15 - 1 inclusive' */
2196*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
2197*495ae853SAndroid Build Coastguard Worker     {
2198*495ae853SAndroid Build Coastguard Worker         if(((((WORD64) i4_curr_poc) - ((WORD64) ps_next_dpb->ps_au_buf->i4_poc)) >= (1 << 15)) ||
2199*495ae853SAndroid Build Coastguard Worker            ((((WORD64) i4_curr_poc) - ((WORD64) ps_next_dpb->ps_au_buf->i4_poc)) < -(1 << 15)))
2200*495ae853SAndroid Build Coastguard Worker         {
2201*495ae853SAndroid Build Coastguard Worker             return false;
2202*495ae853SAndroid Build Coastguard Worker         }
2203*495ae853SAndroid Build Coastguard Worker 
2204*495ae853SAndroid Build Coastguard Worker         ps_next_dpb = ps_next_dpb->ps_prev_short;
2205*495ae853SAndroid Build Coastguard Worker     }
2206*495ae853SAndroid Build Coastguard Worker 
2207*495ae853SAndroid Build Coastguard Worker     return true;
2208*495ae853SAndroid Build Coastguard Worker }
2209