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