xref: /aosp_15_r20/external/libhevc/common/ihevc_dpb_mgr.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar ******************************************************************************/
18*c83a76b0SSuyog Pawar /**
19*c83a76b0SSuyog Pawar  *******************************************************************************
20*c83a76b0SSuyog Pawar  * @file
21*c83a76b0SSuyog Pawar  *  ihevc_dpb_mgr.c
22*c83a76b0SSuyog Pawar  *
23*c83a76b0SSuyog Pawar  * @brief
24*c83a76b0SSuyog Pawar  *  Function definitions used for decoded picture buffer management
25*c83a76b0SSuyog Pawar  *
26*c83a76b0SSuyog Pawar  * @author
27*c83a76b0SSuyog Pawar  *  Srinivas T
28*c83a76b0SSuyog Pawar  *
29*c83a76b0SSuyog Pawar  * @par List of Functions:
30*c83a76b0SSuyog Pawar  *   - ihevc_dpb_mgr_init()
31*c83a76b0SSuyog Pawar  *   - ihevc_dpb_mgr_del_lt()
32*c83a76b0SSuyog Pawar  *   - ihevc_dpb_mgr_insert_lt()
33*c83a76b0SSuyog Pawar  *   - ihevc_dpb_mgr_del_st_or_make_lt()
34*c83a76b0SSuyog Pawar  *   - ihevc_dpb_mgr_insert_st()
35*c83a76b0SSuyog Pawar  *   - ihevc_dpb_mgr_reset()
36*c83a76b0SSuyog Pawar  *   - ihevc_dpb_mgr_release_pics()
37*c83a76b0SSuyog Pawar  *
38*c83a76b0SSuyog Pawar  * @remarks
39*c83a76b0SSuyog Pawar  *  None
40*c83a76b0SSuyog Pawar  *
41*c83a76b0SSuyog Pawar  *******************************************************************************
42*c83a76b0SSuyog Pawar  */
43*c83a76b0SSuyog Pawar 
44*c83a76b0SSuyog Pawar #include <stdio.h>
45*c83a76b0SSuyog Pawar #include <stdlib.h>
46*c83a76b0SSuyog Pawar 
47*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
48*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
49*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
50*c83a76b0SSuyog Pawar #include "ihevc_func_selector.h"
51*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
52*c83a76b0SSuyog Pawar #include "ihevc_buf_mgr.h"
53*c83a76b0SSuyog Pawar #include "ihevc_dpb_mgr.h"
54*c83a76b0SSuyog Pawar 
55*c83a76b0SSuyog Pawar /**
56*c83a76b0SSuyog Pawar  *******************************************************************************
57*c83a76b0SSuyog Pawar  *
58*c83a76b0SSuyog Pawar  * @brief
59*c83a76b0SSuyog Pawar  *  DPB manager initializer
60*c83a76b0SSuyog Pawar  *
61*c83a76b0SSuyog Pawar  * @par Description:
62*c83a76b0SSuyog Pawar  *  Initialises the DPB manager structure
63*c83a76b0SSuyog Pawar  *
64*c83a76b0SSuyog Pawar  * @param[in] ps_dpb_mgr
65*c83a76b0SSuyog Pawar  *  Pointer to the DPB manager structure
66*c83a76b0SSuyog Pawar  *
67*c83a76b0SSuyog Pawar  * @returns
68*c83a76b0SSuyog Pawar  *
69*c83a76b0SSuyog Pawar  * @remarks
70*c83a76b0SSuyog Pawar  *
71*c83a76b0SSuyog Pawar  *
72*c83a76b0SSuyog Pawar  *******************************************************************************
73*c83a76b0SSuyog Pawar  */
74*c83a76b0SSuyog Pawar 
ihevc_dpb_mgr_init(dpb_mgr_t * ps_dpb_mgr)75*c83a76b0SSuyog Pawar void ihevc_dpb_mgr_init(dpb_mgr_t *ps_dpb_mgr)
76*c83a76b0SSuyog Pawar {
77*c83a76b0SSuyog Pawar     UWORD32 i;
78*c83a76b0SSuyog Pawar     dpb_info_t *ps_dpb_info = ps_dpb_mgr->as_dpb_info;
79*c83a76b0SSuyog Pawar     for(i = 0; i < MAX_DPB_BUFS; i++)
80*c83a76b0SSuyog Pawar     {
81*c83a76b0SSuyog Pawar         ps_dpb_info[i].ps_prev_dpb = NULL;
82*c83a76b0SSuyog Pawar         ps_dpb_info[i].ps_pic_buf = NULL;
83*c83a76b0SSuyog Pawar 
84*c83a76b0SSuyog Pawar     }
85*c83a76b0SSuyog Pawar 
86*c83a76b0SSuyog Pawar     ps_dpb_mgr->u1_num_ref_bufs = 0;
87*c83a76b0SSuyog Pawar     ps_dpb_mgr->ps_dpb_head = NULL;
88*c83a76b0SSuyog Pawar 
89*c83a76b0SSuyog Pawar }
90*c83a76b0SSuyog Pawar 
91*c83a76b0SSuyog Pawar 
92*c83a76b0SSuyog Pawar /**
93*c83a76b0SSuyog Pawar  *******************************************************************************
94*c83a76b0SSuyog Pawar  *
95*c83a76b0SSuyog Pawar  * @brief
96*c83a76b0SSuyog Pawar  *  Adds a reference picture into the linked  list
97*c83a76b0SSuyog Pawar  *
98*c83a76b0SSuyog Pawar  * @par Description:
99*c83a76b0SSuyog Pawar  *  Adds the reference buffer with the given buffer id into the DPB manager
100*c83a76b0SSuyog Pawar  *
101*c83a76b0SSuyog Pawar  *
102*c83a76b0SSuyog Pawar  * @param[in] ps_dpb_mgr
103*c83a76b0SSuyog Pawar  *  Pointer to the DPB manager structure
104*c83a76b0SSuyog Pawar  *
105*c83a76b0SSuyog Pawar  * @param[in] ps_picBuf
106*c83a76b0SSuyog Pawar  *  Pointer to the picture buffer
107*c83a76b0SSuyog Pawar  *
108*c83a76b0SSuyog Pawar  * @param[in] buf_id
109*c83a76b0SSuyog Pawar  *  buffer id of the picture buffer
110*c83a76b0SSuyog Pawar  *
111*c83a76b0SSuyog Pawar  * @returns  0 if successful, -1 otherwise
112*c83a76b0SSuyog Pawar  *
113*c83a76b0SSuyog Pawar  * @remarks
114*c83a76b0SSuyog Pawar  *
115*c83a76b0SSuyog Pawar  *
116*c83a76b0SSuyog Pawar  *******************************************************************************
117*c83a76b0SSuyog Pawar  */
118*c83a76b0SSuyog Pawar 
ihevc_dpb_mgr_insert_ref(dpb_mgr_t * ps_dpb_mgr,pic_buf_t * ps_pic_buf,WORD32 buf_id)119*c83a76b0SSuyog Pawar WORD32 ihevc_dpb_mgr_insert_ref(dpb_mgr_t *ps_dpb_mgr,
120*c83a76b0SSuyog Pawar                                 pic_buf_t *ps_pic_buf,
121*c83a76b0SSuyog Pawar                                 WORD32 buf_id)
122*c83a76b0SSuyog Pawar {
123*c83a76b0SSuyog Pawar     int i;
124*c83a76b0SSuyog Pawar     dpb_info_t *ps_dpb_info;
125*c83a76b0SSuyog Pawar 
126*c83a76b0SSuyog Pawar     ps_dpb_info = ps_dpb_mgr->as_dpb_info;
127*c83a76b0SSuyog Pawar 
128*c83a76b0SSuyog Pawar     /* Return error if buffer is already present in the DPB */
129*c83a76b0SSuyog Pawar     for(i = 0; i < MAX_DPB_BUFS; i++)
130*c83a76b0SSuyog Pawar     {
131*c83a76b0SSuyog Pawar         if((ps_dpb_info[i].ps_pic_buf == ps_pic_buf)
132*c83a76b0SSuyog Pawar                         && (ps_dpb_info[i].ps_pic_buf->u1_used_as_ref))
133*c83a76b0SSuyog Pawar         {
134*c83a76b0SSuyog Pawar             return (-1);
135*c83a76b0SSuyog Pawar         }
136*c83a76b0SSuyog Pawar 
137*c83a76b0SSuyog Pawar 
138*c83a76b0SSuyog Pawar     }
139*c83a76b0SSuyog Pawar 
140*c83a76b0SSuyog Pawar     /* Find an unused DPB location */
141*c83a76b0SSuyog Pawar     for(i = 0; i < MAX_DPB_BUFS; i++)
142*c83a76b0SSuyog Pawar     {
143*c83a76b0SSuyog Pawar         if(NULL == ps_dpb_info[i].ps_pic_buf)
144*c83a76b0SSuyog Pawar         {
145*c83a76b0SSuyog Pawar             break;
146*c83a76b0SSuyog Pawar         }
147*c83a76b0SSuyog Pawar     }
148*c83a76b0SSuyog Pawar     if(i == MAX_DPB_BUFS)
149*c83a76b0SSuyog Pawar     {
150*c83a76b0SSuyog Pawar         return (-1);
151*c83a76b0SSuyog Pawar     }
152*c83a76b0SSuyog Pawar 
153*c83a76b0SSuyog Pawar     /* Create DPB info */
154*c83a76b0SSuyog Pawar     ps_dpb_info[i].ps_pic_buf = ps_pic_buf;
155*c83a76b0SSuyog Pawar     ps_dpb_info[i].ps_prev_dpb = ps_dpb_mgr->ps_dpb_head;
156*c83a76b0SSuyog Pawar     ps_dpb_info[i].ps_pic_buf->u1_buf_id = buf_id;
157*c83a76b0SSuyog Pawar     ps_dpb_info[i].ps_pic_buf->u1_used_as_ref = SHORT_TERM_REF;
158*c83a76b0SSuyog Pawar 
159*c83a76b0SSuyog Pawar     /* update the head node of linked list to point to the current picture */
160*c83a76b0SSuyog Pawar     ps_dpb_mgr->ps_dpb_head = ps_dpb_info + i;
161*c83a76b0SSuyog Pawar 
162*c83a76b0SSuyog Pawar     /* Increment Short term buffer count */
163*c83a76b0SSuyog Pawar     ps_dpb_mgr->u1_num_ref_bufs++;
164*c83a76b0SSuyog Pawar 
165*c83a76b0SSuyog Pawar     return 0;
166*c83a76b0SSuyog Pawar }
167*c83a76b0SSuyog Pawar 
168*c83a76b0SSuyog Pawar /**
169*c83a76b0SSuyog Pawar  *******************************************************************************
170*c83a76b0SSuyog Pawar  *
171*c83a76b0SSuyog Pawar  * @brief
172*c83a76b0SSuyog Pawar  *  Deletes a reference buffer from the dpb manager
173*c83a76b0SSuyog Pawar  *
174*c83a76b0SSuyog Pawar  * @par Description:
175*c83a76b0SSuyog Pawar  *  Delete short term reference with a given POC from the linked
176*c83a76b0SSuyog Pawar  *  list
177*c83a76b0SSuyog Pawar  *
178*c83a76b0SSuyog Pawar  * @param[in] ps_dpb_mgr
179*c83a76b0SSuyog Pawar  *  Pointer to DPB Manager structure
180*c83a76b0SSuyog Pawar  *
181*c83a76b0SSuyog Pawar  * @param[in] ps_buf_mgr
182*c83a76b0SSuyog Pawar  *  Pointer to buffer manager structure
183*c83a76b0SSuyog Pawar  *
184*c83a76b0SSuyog Pawar  * @param[in] u4_abs_poc
185*c83a76b0SSuyog Pawar  *  Node's absolute poc
186*c83a76b0SSuyog Pawar  *
187*c83a76b0SSuyog Pawar  *
188*c83a76b0SSuyog Pawar  * @returns  0 if successful, -1 otherwise
189*c83a76b0SSuyog Pawar  *
190*c83a76b0SSuyog Pawar  * @remarks
191*c83a76b0SSuyog Pawar  *
192*c83a76b0SSuyog Pawar  *
193*c83a76b0SSuyog Pawar  *******************************************************************************
194*c83a76b0SSuyog Pawar  */
195*c83a76b0SSuyog Pawar 
ihevc_dpb_mgr_del_ref(dpb_mgr_t * ps_dpb_mgr,buf_mgr_t * ps_buf_mgr,WORD32 i4_abs_poc)196*c83a76b0SSuyog Pawar void ihevc_dpb_mgr_del_ref(dpb_mgr_t *ps_dpb_mgr,
197*c83a76b0SSuyog Pawar                            buf_mgr_t *ps_buf_mgr,
198*c83a76b0SSuyog Pawar                            WORD32 i4_abs_poc)
199*c83a76b0SSuyog Pawar {
200*c83a76b0SSuyog Pawar     int i;
201*c83a76b0SSuyog Pawar     dpb_info_t *ps_next_dpb;
202*c83a76b0SSuyog Pawar 
203*c83a76b0SSuyog Pawar     dpb_info_t *ps_unmark_node;
204*c83a76b0SSuyog Pawar     UWORD8 u1_del_node;
205*c83a76b0SSuyog Pawar     UNUSED(u1_del_node);
206*c83a76b0SSuyog Pawar     u1_del_node = 0;
207*c83a76b0SSuyog Pawar 
208*c83a76b0SSuyog Pawar     /* Find the node with matching absolute POC */
209*c83a76b0SSuyog Pawar     ps_next_dpb = ps_dpb_mgr->ps_dpb_head;
210*c83a76b0SSuyog Pawar     if(ps_next_dpb->ps_pic_buf->i4_abs_poc == i4_abs_poc)
211*c83a76b0SSuyog Pawar     {
212*c83a76b0SSuyog Pawar         ps_unmark_node = ps_next_dpb;
213*c83a76b0SSuyog Pawar     }
214*c83a76b0SSuyog Pawar     else
215*c83a76b0SSuyog Pawar     {
216*c83a76b0SSuyog Pawar         for(i = 1; i < ps_dpb_mgr->u1_num_ref_bufs; i++)
217*c83a76b0SSuyog Pawar         {
218*c83a76b0SSuyog Pawar             if(ps_next_dpb->ps_prev_dpb->ps_pic_buf->i4_abs_poc == i4_abs_poc)
219*c83a76b0SSuyog Pawar                 break;
220*c83a76b0SSuyog Pawar             ps_next_dpb = ps_next_dpb->ps_prev_dpb;
221*c83a76b0SSuyog Pawar         }
222*c83a76b0SSuyog Pawar 
223*c83a76b0SSuyog Pawar         if(i == ps_dpb_mgr->u1_num_ref_bufs)
224*c83a76b0SSuyog Pawar         {
225*c83a76b0SSuyog Pawar             return;
226*c83a76b0SSuyog Pawar         }
227*c83a76b0SSuyog Pawar         else
228*c83a76b0SSuyog Pawar             ps_unmark_node = ps_next_dpb->ps_prev_dpb;
229*c83a76b0SSuyog Pawar     }
230*c83a76b0SSuyog Pawar 
231*c83a76b0SSuyog Pawar     if(ps_unmark_node == ps_dpb_mgr->ps_dpb_head)
232*c83a76b0SSuyog Pawar     {
233*c83a76b0SSuyog Pawar         ps_dpb_mgr->ps_dpb_head = ps_unmark_node->ps_prev_dpb;
234*c83a76b0SSuyog Pawar     }
235*c83a76b0SSuyog Pawar     else
236*c83a76b0SSuyog Pawar     {
237*c83a76b0SSuyog Pawar         ps_next_dpb->ps_prev_dpb = ps_unmark_node->ps_prev_dpb; //update link
238*c83a76b0SSuyog Pawar         ps_unmark_node->ps_prev_dpb = NULL;
239*c83a76b0SSuyog Pawar     }
240*c83a76b0SSuyog Pawar     ps_dpb_mgr->u1_num_ref_bufs--; //decrement buffer count
241*c83a76b0SSuyog Pawar 
242*c83a76b0SSuyog Pawar     /* Release the physical buffer */
243*c83a76b0SSuyog Pawar     ihevc_buf_mgr_release((buf_mgr_t *)ps_buf_mgr, ps_unmark_node->ps_pic_buf->u1_buf_id,
244*c83a76b0SSuyog Pawar                           BUF_MGR_REF);
245*c83a76b0SSuyog Pawar     ps_unmark_node->ps_prev_dpb = NULL;
246*c83a76b0SSuyog Pawar     ps_unmark_node->ps_pic_buf = NULL;
247*c83a76b0SSuyog Pawar }
248*c83a76b0SSuyog Pawar 
249*c83a76b0SSuyog Pawar 
250*c83a76b0SSuyog Pawar /**
251*c83a76b0SSuyog Pawar  *******************************************************************************
252*c83a76b0SSuyog Pawar  *
253*c83a76b0SSuyog Pawar  * @brief
254*c83a76b0SSuyog Pawar  *  Gets a buffer with abs_poc closest to the current poc
255*c83a76b0SSuyog Pawar  *
256*c83a76b0SSuyog Pawar  * @par Description:
257*c83a76b0SSuyog Pawar  *  Returns the pointer to the picture buffer whose poc is equal to abs_poc
258*c83a76b0SSuyog Pawar  *
259*c83a76b0SSuyog Pawar  * @param[in] ps_dpb_mgr
260*c83a76b0SSuyog Pawar  *  Pointer to DPB Manager structure
261*c83a76b0SSuyog Pawar  *
262*c83a76b0SSuyog Pawar  * @param[out] ps_pic_buf
263*c83a76b0SSuyog Pawar  *  Pointer to picture buffer
264*c83a76b0SSuyog Pawar 
265*c83a76b0SSuyog Pawar  * @param[in] abs_poc
266*c83a76b0SSuyog Pawar  *  poc of the buffer to be returned
267*c83a76b0SSuyog Pawar  *
268*c83a76b0SSuyog Pawar  * @returns
269*c83a76b0SSuyog Pawar  *  0 if successful, pic_buf otherwise
270*c83a76b0SSuyog Pawar  * @remarks
271*c83a76b0SSuyog Pawar  *
272*c83a76b0SSuyog Pawar  *
273*c83a76b0SSuyog Pawar  *******************************************************************************
274*c83a76b0SSuyog Pawar  */
ihevc_dpb_mgr_get_ref_by_nearest_poc(dpb_mgr_t * ps_dpb_mgr,WORD32 cur_abs_poc)275*c83a76b0SSuyog Pawar pic_buf_t* ihevc_dpb_mgr_get_ref_by_nearest_poc(dpb_mgr_t *ps_dpb_mgr, WORD32 cur_abs_poc)
276*c83a76b0SSuyog Pawar {
277*c83a76b0SSuyog Pawar     WORD32 i;
278*c83a76b0SSuyog Pawar     WORD32 min_diff = 0x7FFFFFFF;
279*c83a76b0SSuyog Pawar     pic_buf_t *ps_pic_buf = NULL;
280*c83a76b0SSuyog Pawar 
281*c83a76b0SSuyog Pawar     for(i = 0; i < MAX_DPB_BUFS; i++)
282*c83a76b0SSuyog Pawar     {
283*c83a76b0SSuyog Pawar         if((ps_dpb_mgr->as_dpb_info[i].ps_pic_buf) &&
284*c83a76b0SSuyog Pawar                         (ps_dpb_mgr->as_dpb_info[i].ps_pic_buf->u1_used_as_ref != UNUSED_FOR_REF))
285*c83a76b0SSuyog Pawar         {
286*c83a76b0SSuyog Pawar             WORD32 poc_diff = cur_abs_poc - ps_dpb_mgr->as_dpb_info[i].ps_pic_buf->i4_abs_poc;
287*c83a76b0SSuyog Pawar             if((poc_diff > 0) && (poc_diff < min_diff))
288*c83a76b0SSuyog Pawar             {
289*c83a76b0SSuyog Pawar                 min_diff = poc_diff;
290*c83a76b0SSuyog Pawar                 ps_pic_buf = ps_dpb_mgr->as_dpb_info[i].ps_pic_buf;
291*c83a76b0SSuyog Pawar             }
292*c83a76b0SSuyog Pawar         }
293*c83a76b0SSuyog Pawar     }
294*c83a76b0SSuyog Pawar 
295*c83a76b0SSuyog Pawar     if(NULL == ps_pic_buf)
296*c83a76b0SSuyog Pawar     {
297*c83a76b0SSuyog Pawar         min_diff = 0x7FFFFFFF;
298*c83a76b0SSuyog Pawar         for(i = 0; i < MAX_DPB_BUFS; i++)
299*c83a76b0SSuyog Pawar         {
300*c83a76b0SSuyog Pawar             if((ps_dpb_mgr->as_dpb_info[i].ps_pic_buf) &&
301*c83a76b0SSuyog Pawar                             (ps_dpb_mgr->as_dpb_info[i].ps_pic_buf->u1_used_as_ref != UNUSED_FOR_REF))
302*c83a76b0SSuyog Pawar             {
303*c83a76b0SSuyog Pawar                 WORD32 poc_diff = cur_abs_poc - ps_dpb_mgr->as_dpb_info[i].ps_pic_buf->i4_abs_poc;
304*c83a76b0SSuyog Pawar                 if(ABS(poc_diff) < min_diff)
305*c83a76b0SSuyog Pawar                 {
306*c83a76b0SSuyog Pawar                     min_diff = ABS(poc_diff);
307*c83a76b0SSuyog Pawar                     ps_pic_buf = ps_dpb_mgr->as_dpb_info[i].ps_pic_buf;
308*c83a76b0SSuyog Pawar                 }
309*c83a76b0SSuyog Pawar             }
310*c83a76b0SSuyog Pawar         }
311*c83a76b0SSuyog Pawar     }
312*c83a76b0SSuyog Pawar 
313*c83a76b0SSuyog Pawar     return ps_pic_buf;
314*c83a76b0SSuyog Pawar }
315*c83a76b0SSuyog Pawar 
316*c83a76b0SSuyog Pawar 
317*c83a76b0SSuyog Pawar /**
318*c83a76b0SSuyog Pawar  *******************************************************************************
319*c83a76b0SSuyog Pawar  *
320*c83a76b0SSuyog Pawar  * @brief
321*c83a76b0SSuyog Pawar  *  Gets a buffer with abs_poc
322*c83a76b0SSuyog Pawar  *
323*c83a76b0SSuyog Pawar  * @par Description:
324*c83a76b0SSuyog Pawar  *  Returns the pointer to the picture buffer whose poc is equal to abs_poc
325*c83a76b0SSuyog Pawar  *
326*c83a76b0SSuyog Pawar  * @param[in] ps_dpb_mgr
327*c83a76b0SSuyog Pawar  *  Pointer to DPB Manager structure
328*c83a76b0SSuyog Pawar  *
329*c83a76b0SSuyog Pawar  * @param[out] ps_pic_buf
330*c83a76b0SSuyog Pawar  *  Pointer to picture buffer
331*c83a76b0SSuyog Pawar 
332*c83a76b0SSuyog Pawar  * @param[in] abs_poc
333*c83a76b0SSuyog Pawar  *  poc of the buffer to be returned
334*c83a76b0SSuyog Pawar  *
335*c83a76b0SSuyog Pawar  * @returns
336*c83a76b0SSuyog Pawar  *  0 if successful, pic_buf otherwise
337*c83a76b0SSuyog Pawar  * @remarks
338*c83a76b0SSuyog Pawar  *
339*c83a76b0SSuyog Pawar  *
340*c83a76b0SSuyog Pawar  *******************************************************************************
341*c83a76b0SSuyog Pawar  */
ihevc_dpb_mgr_get_ref_by_poc(dpb_mgr_t * ps_dpb_mgr,WORD32 abs_poc)342*c83a76b0SSuyog Pawar pic_buf_t* ihevc_dpb_mgr_get_ref_by_poc(dpb_mgr_t *ps_dpb_mgr, WORD32 abs_poc)
343*c83a76b0SSuyog Pawar {
344*c83a76b0SSuyog Pawar     UWORD32 i;
345*c83a76b0SSuyog Pawar     dpb_info_t *ps_next_ref;
346*c83a76b0SSuyog Pawar     pic_buf_t *ps_pic_buf = NULL;
347*c83a76b0SSuyog Pawar 
348*c83a76b0SSuyog Pawar 
349*c83a76b0SSuyog Pawar     ps_next_ref = ps_dpb_mgr->ps_dpb_head;
350*c83a76b0SSuyog Pawar     for(i = 0; i < ps_dpb_mgr->u1_num_ref_bufs; i++)
351*c83a76b0SSuyog Pawar     {
352*c83a76b0SSuyog Pawar         if(ps_next_ref->ps_pic_buf->i4_abs_poc == abs_poc)
353*c83a76b0SSuyog Pawar         {
354*c83a76b0SSuyog Pawar             ps_pic_buf = ps_next_ref->ps_pic_buf;
355*c83a76b0SSuyog Pawar             break;
356*c83a76b0SSuyog Pawar         }
357*c83a76b0SSuyog Pawar 
358*c83a76b0SSuyog Pawar         ps_next_ref = ps_next_ref->ps_prev_dpb;
359*c83a76b0SSuyog Pawar     }
360*c83a76b0SSuyog Pawar 
361*c83a76b0SSuyog Pawar     if(i == ps_dpb_mgr->u1_num_ref_bufs)
362*c83a76b0SSuyog Pawar     {
363*c83a76b0SSuyog Pawar         ps_pic_buf = NULL;
364*c83a76b0SSuyog Pawar     }
365*c83a76b0SSuyog Pawar 
366*c83a76b0SSuyog Pawar     return ps_pic_buf;
367*c83a76b0SSuyog Pawar }
368*c83a76b0SSuyog Pawar 
369*c83a76b0SSuyog Pawar /**
370*c83a76b0SSuyog Pawar  *******************************************************************************
371*c83a76b0SSuyog Pawar  *
372*c83a76b0SSuyog Pawar  * @brief
373*c83a76b0SSuyog Pawar  *  Gets a buffer with poc_lsb
374*c83a76b0SSuyog Pawar  *
375*c83a76b0SSuyog Pawar  * @par Description:
376*c83a76b0SSuyog Pawar  *  Returns the pointer to the picture buffer whose poc is equal to poc_lsb
377*c83a76b0SSuyog Pawar  *
378*c83a76b0SSuyog Pawar  * @param[in] ps_dpb_mgr
379*c83a76b0SSuyog Pawar  *  Pointer to DPB Manager structure
380*c83a76b0SSuyog Pawar  *
381*c83a76b0SSuyog Pawar  * @param[out] ps_pic_buf
382*c83a76b0SSuyog Pawar  *  Pointer to picture buffer
383*c83a76b0SSuyog Pawar 
384*c83a76b0SSuyog Pawar  * @param[in] poc_lsb
385*c83a76b0SSuyog Pawar  *  poc_lsb of the buffer to be returned
386*c83a76b0SSuyog Pawar  *
387*c83a76b0SSuyog Pawar  * @returns
388*c83a76b0SSuyog Pawar  *  0 if successful, pic_buf otherwise
389*c83a76b0SSuyog Pawar  * @remarks
390*c83a76b0SSuyog Pawar  *
391*c83a76b0SSuyog Pawar  *
392*c83a76b0SSuyog Pawar  *******************************************************************************
393*c83a76b0SSuyog Pawar  */
394*c83a76b0SSuyog Pawar 
ihevc_dpb_mgr_get_ref_by_poc_lsb(dpb_mgr_t * ps_dpb_mgr,WORD32 poc_lsb)395*c83a76b0SSuyog Pawar pic_buf_t* ihevc_dpb_mgr_get_ref_by_poc_lsb(dpb_mgr_t *ps_dpb_mgr, WORD32 poc_lsb)
396*c83a76b0SSuyog Pawar {
397*c83a76b0SSuyog Pawar     pic_buf_t *ps_pic_buf = NULL;
398*c83a76b0SSuyog Pawar     UWORD32 i;
399*c83a76b0SSuyog Pawar     dpb_info_t *ps_next_ref;
400*c83a76b0SSuyog Pawar 
401*c83a76b0SSuyog Pawar     ps_next_ref = ps_dpb_mgr->ps_dpb_head;
402*c83a76b0SSuyog Pawar     for(i = 0; i < ps_dpb_mgr->u1_num_ref_bufs; i++)
403*c83a76b0SSuyog Pawar     {
404*c83a76b0SSuyog Pawar         if(ps_next_ref->ps_pic_buf->i4_poc_lsb == poc_lsb)
405*c83a76b0SSuyog Pawar         {
406*c83a76b0SSuyog Pawar             ps_pic_buf = ps_next_ref->ps_pic_buf;
407*c83a76b0SSuyog Pawar             break;
408*c83a76b0SSuyog Pawar         }
409*c83a76b0SSuyog Pawar 
410*c83a76b0SSuyog Pawar         ps_next_ref = ps_next_ref->ps_prev_dpb;
411*c83a76b0SSuyog Pawar     }
412*c83a76b0SSuyog Pawar 
413*c83a76b0SSuyog Pawar     if(i == ps_dpb_mgr->u1_num_ref_bufs)
414*c83a76b0SSuyog Pawar     {
415*c83a76b0SSuyog Pawar         ps_pic_buf = NULL;
416*c83a76b0SSuyog Pawar     }
417*c83a76b0SSuyog Pawar 
418*c83a76b0SSuyog Pawar     return ps_pic_buf;
419*c83a76b0SSuyog Pawar }
420*c83a76b0SSuyog Pawar 
421*c83a76b0SSuyog Pawar 
422*c83a76b0SSuyog Pawar /**
423*c83a76b0SSuyog Pawar  *******************************************************************************
424*c83a76b0SSuyog Pawar  *
425*c83a76b0SSuyog Pawar  * @brief
426*c83a76b0SSuyog Pawar  *  Resets the DPB manager
427*c83a76b0SSuyog Pawar  *
428*c83a76b0SSuyog Pawar  * @par Description:
429*c83a76b0SSuyog Pawar  *  Re-initialises the DPB manager structure
430*c83a76b0SSuyog Pawar  *
431*c83a76b0SSuyog Pawar  * @param[in] ps_dpb_mgr
432*c83a76b0SSuyog Pawar  *  Pointer to DPB Manager structure
433*c83a76b0SSuyog Pawar  *
434*c83a76b0SSuyog Pawar  * @param[in] ps_buf_mgr
435*c83a76b0SSuyog Pawar  *  Pointer to buffer manager structure
436*c83a76b0SSuyog Pawar  *
437*c83a76b0SSuyog Pawar  * @returns
438*c83a76b0SSuyog Pawar  *
439*c83a76b0SSuyog Pawar  * @remarks
440*c83a76b0SSuyog Pawar  *
441*c83a76b0SSuyog Pawar  *
442*c83a76b0SSuyog Pawar  *******************************************************************************
443*c83a76b0SSuyog Pawar  */
444*c83a76b0SSuyog Pawar 
ihevc_dpb_mgr_reset(dpb_mgr_t * ps_dpb_mgr,buf_mgr_t * ps_buf_mgr)445*c83a76b0SSuyog Pawar void ihevc_dpb_mgr_reset(dpb_mgr_t *ps_dpb_mgr, buf_mgr_t *ps_buf_mgr)
446*c83a76b0SSuyog Pawar {
447*c83a76b0SSuyog Pawar     int i;
448*c83a76b0SSuyog Pawar     dpb_info_t *ps_dpb_info;
449*c83a76b0SSuyog Pawar 
450*c83a76b0SSuyog Pawar     ps_dpb_info = ps_dpb_mgr->as_dpb_info;
451*c83a76b0SSuyog Pawar 
452*c83a76b0SSuyog Pawar     for(i = 0; i < MAX_DPB_BUFS; i++)
453*c83a76b0SSuyog Pawar     {
454*c83a76b0SSuyog Pawar         if(ps_dpb_info[i].ps_pic_buf->u1_used_as_ref)
455*c83a76b0SSuyog Pawar         {
456*c83a76b0SSuyog Pawar             ps_dpb_info[i].ps_pic_buf->u1_used_as_ref = UNUSED_FOR_REF;
457*c83a76b0SSuyog Pawar             ps_dpb_info[i].ps_prev_dpb = NULL;
458*c83a76b0SSuyog Pawar             //Release physical buffer
459*c83a76b0SSuyog Pawar             ihevc_buf_mgr_release(ps_buf_mgr, ps_dpb_info[i].ps_pic_buf->u1_buf_id,
460*c83a76b0SSuyog Pawar                                   BUF_MGR_REF);
461*c83a76b0SSuyog Pawar 
462*c83a76b0SSuyog Pawar             ps_dpb_info[i].ps_pic_buf = NULL;
463*c83a76b0SSuyog Pawar         }
464*c83a76b0SSuyog Pawar     }
465*c83a76b0SSuyog Pawar     ps_dpb_mgr->u1_num_ref_bufs = 0;
466*c83a76b0SSuyog Pawar     ps_dpb_mgr->ps_dpb_head = NULL;
467*c83a76b0SSuyog Pawar 
468*c83a76b0SSuyog Pawar }
469*c83a76b0SSuyog Pawar 
470*c83a76b0SSuyog Pawar /**
471*c83a76b0SSuyog Pawar  *******************************************************************************
472*c83a76b0SSuyog Pawar  *
473*c83a76b0SSuyog Pawar  * @brief
474*c83a76b0SSuyog Pawar  *  deletes all pictures from DPB
475*c83a76b0SSuyog Pawar  *
476*c83a76b0SSuyog Pawar  * @par Description:
477*c83a76b0SSuyog Pawar  *  Deletes all pictures present in the DPB manager
478*c83a76b0SSuyog Pawar  *
479*c83a76b0SSuyog Pawar  * @param[in] ps_buf_mgr
480*c83a76b0SSuyog Pawar  *  Pointer to buffer manager structure
481*c83a76b0SSuyog Pawar  *
482*c83a76b0SSuyog Pawar  * @param[in] u1_disp_bufs
483*c83a76b0SSuyog Pawar  *  Number of buffers to be deleted
484*c83a76b0SSuyog Pawar  *
485*c83a76b0SSuyog Pawar  * @returns
486*c83a76b0SSuyog Pawar  *
487*c83a76b0SSuyog Pawar  * @remarks
488*c83a76b0SSuyog Pawar  *
489*c83a76b0SSuyog Pawar  *
490*c83a76b0SSuyog Pawar  *******************************************************************************
491*c83a76b0SSuyog Pawar  */
492*c83a76b0SSuyog Pawar 
ihevc_dpb_mgr_release_pics(buf_mgr_t * ps_buf_mgr,UWORD8 u1_disp_bufs)493*c83a76b0SSuyog Pawar void ihevc_dpb_mgr_release_pics(buf_mgr_t *ps_buf_mgr, UWORD8 u1_disp_bufs)
494*c83a76b0SSuyog Pawar {
495*c83a76b0SSuyog Pawar     WORD8 i;
496*c83a76b0SSuyog Pawar     UWORD32 buf_status;
497*c83a76b0SSuyog Pawar 
498*c83a76b0SSuyog Pawar     for(i = 0; i < u1_disp_bufs; i++)
499*c83a76b0SSuyog Pawar     {
500*c83a76b0SSuyog Pawar         buf_status = ihevc_buf_mgr_get_status(ps_buf_mgr, i);
501*c83a76b0SSuyog Pawar         if(0 != buf_status)
502*c83a76b0SSuyog Pawar         {
503*c83a76b0SSuyog Pawar             ihevc_buf_mgr_release((buf_mgr_t *)ps_buf_mgr, i, BUF_MGR_REF);
504*c83a76b0SSuyog Pawar         }
505*c83a76b0SSuyog Pawar     }
506*c83a76b0SSuyog Pawar }
507