1 /******************************************************************************
2 *
3 * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18 /**
19 *******************************************************************************
20 * @file
21 *  ihevc_disp_mgr.c
22 *
23 * @brief
24 *  Contains function definitions for display management
25 *
26 * @author
27 *  Srinivas T
28 *
29 * @par List of Functions:
30 *   - ihevc_disp_mgr_init()
31 *   - ihevc_disp_mgr_add()
32 *   - ihevc_disp_mgr_get()
33 *
34 * @remarks
35 *  None
36 *
37 *******************************************************************************
38 */
39 #include <stdlib.h>
40 #include "ihevc_typedefs.h"
41 #include "ihevc_macros.h"
42 #include "ihevc_func_selector.h"
43 #include "ihevc_disp_mgr.h"
44 
45 
46 /**
47 *******************************************************************************
48 *
49 * @brief
50 *    Initialization function for display buffer manager
51 *
52 * @par Description:
53 *    Initializes the display buffer management structure
54 *
55 * @param[in] ps_disp_mgr
56 *  Pointer to the display buffer management structure
57 *
58 * @returns none
59 *
60 * @remarks
61 *  None
62 *
63 *******************************************************************************
64 */
ihevc_disp_mgr_init(disp_mgr_t * ps_disp_mgr)65 void ihevc_disp_mgr_init(
66                 disp_mgr_t *ps_disp_mgr)
67 {
68     WORD32 id;
69 
70     ps_disp_mgr->u4_last_abs_poc = DEFAULT_POC;
71 
72     for(id = 0; id < DISP_MGR_MAX_CNT; id++)
73     {
74         ps_disp_mgr->ai4_abs_poc[id] = DEFAULT_POC;
75         ps_disp_mgr->apv_ptr[id] = NULL;
76     }
77 }
78 
79 
80 /**
81 *******************************************************************************
82 *
83 * @brief
84 *     Adds a buffer to the display manager
85 *
86 * @par Description:
87 *      Adds a buffer to the display buffer manager
88 *
89 * @param[in] ps_disp_mgr
90 *  Pointer to the diaplay buffer management structure
91 *
92 * @param[in] buf_id
93 *  ID of the display buffer
94 *
95 * @param[in] abs_poc
96 *  Absolute POC of the display buffer
97 *
98 * @param[in] pv_ptr
99 *  Pointer to the display buffer
100 *
101 * @returns  0 if success, -1 otherwise
102 *
103 * @remarks
104 *  None
105 *
106 *******************************************************************************
107 */
ihevc_disp_mgr_add(disp_mgr_t * ps_disp_mgr,WORD32 buf_id,WORD32 abs_poc,void * pv_ptr)108 WORD32 ihevc_disp_mgr_add(disp_mgr_t *ps_disp_mgr,
109                           WORD32 buf_id,
110                           WORD32 abs_poc,
111                           void *pv_ptr)
112 {
113     if(buf_id >= DISP_MGR_MAX_CNT)
114     {
115         return (-1);
116     }
117 
118     if(ps_disp_mgr->apv_ptr[buf_id] != NULL)
119     {
120         return (-1);
121     }
122 
123     ps_disp_mgr->apv_ptr[buf_id] = pv_ptr;
124     ps_disp_mgr->ai4_abs_poc[buf_id] = abs_poc;
125     return 0;
126 }
127 
128 
129 /**
130 *******************************************************************************
131 *
132 * @brief
133 *  Gets the next buffer
134 *
135 * @par Description:
136 *  Gets the next display buffer
137 *
138 * @param[in] ps_disp_mgr
139 *  Pointer to the display buffer structure
140 *
141 * @param[out]  pi4_buf_id
142 *  Pointer to hold buffer id of the display buffer being returned
143 *
144 * @returns  Pointer to the next display buffer
145 *
146 * @remarks
147 *  None
148 *
149 *******************************************************************************
150 */
ihevc_disp_mgr_get(disp_mgr_t * ps_disp_mgr,WORD32 * pi4_buf_id)151 void* ihevc_disp_mgr_get(
152                 disp_mgr_t *ps_disp_mgr,
153                 WORD32 *pi4_buf_id)
154 {
155     WORD32 id;
156     void *pv_ret_ptr;
157     WORD32 i4_min_poc;
158     WORD32 min_poc_id;
159 
160 
161     pv_ret_ptr = NULL;
162     i4_min_poc = 0x7FFFFFFF;
163     min_poc_id = -1;
164 
165     /* Find minimum POC */
166     for(id = 0; id < DISP_MGR_MAX_CNT; id++)
167     {
168         if((DEFAULT_POC != ps_disp_mgr->ai4_abs_poc[id]) &&
169                         (ps_disp_mgr->ai4_abs_poc[id] <= i4_min_poc))
170         {
171             i4_min_poc = ps_disp_mgr->ai4_abs_poc[id];
172             min_poc_id = id;
173         }
174     }
175     *pi4_buf_id = min_poc_id;
176     /* If all pocs are still default_poc then return NULL */
177     if(-1 == min_poc_id)
178     {
179         return NULL;
180     }
181 
182     pv_ret_ptr = ps_disp_mgr->apv_ptr[min_poc_id];
183 
184     /* Set abs poc to default and apv_ptr to null so that the buffer is not returned again */
185     ps_disp_mgr->apv_ptr[min_poc_id] = NULL;
186     ps_disp_mgr->ai4_abs_poc[min_poc_id] = DEFAULT_POC;
187     return pv_ret_ptr;
188 }
189