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*/ 65void 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*/ 108WORD32 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*/ 151void* 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