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 */ 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 */ 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 */ 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