1 /* 2 * Copyright (c) 2010, Texas Instruments Incorporated 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of Texas Instruments Incorporated nor the names of 17 * its contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 27 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 28 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /** 34 * @file omx_proxy_common.h 35 * This file contains methods that provides the functionality for 36 * the OpenMAX1.1 DOMX Framework OMX Common Proxy. 37 * 38 * @path \WTSD_DucatiMMSW\framework\domx\omx_proxy_common\ 39 * 40 * @rev 1.0 41 */ 42 43 /*============================================================== 44 *! Revision History 45 *! ============================ 46 *! 29-Mar-2010 Abhishek Ranka : Revamped DOMX implementation 47 *! 48 *! 19-August-2009 B Ravi Kiran ravi.kiran (at) ti.com: Initial Version 49 *================================================================*/ 50 51 #ifdef ANDROID_QUIRK_LOCK_BUFFER 52 #include <hardware/gralloc.h> 53 #endif 54 55 #ifndef OMX_PROXY_H 56 #define OMX_PROXY_H 57 58 #ifdef __cplusplus 59 extern "C" 60 { 61 #endif /* __cplusplus */ 62 63 /* ------compilation control switches ----------------------------------------*/ 64 65 /****************************************************************** 66 * INCLUDE FILES 67 ******************************************************************/ 68 /* ----- system and platform files ----------------------------*/ 69 #include <OMX_Core.h> 70 /*-------program files ----------------------------------------*/ 71 #include "omx_rpc.h" 72 #include "omx_rpc_internal.h" 73 #include "omx_rpc_utils.h" 74 75 /**************************************************************** 76 * PUBLIC DECLARATIONS Defined here, used elsewhere 77 ****************************************************************/ 78 /*--------data declarations -----------------------------------*/ 79 /*OMX versions supported by DOMX*/ 80 #define OMX_VER_MAJOR 0x1 81 #define OMX_VER_MINOR 0x1 82 83 #define MAX_NUM_PROXY_BUFFERS 32 84 #define MAX_COMPONENT_NAME_LENGTH 128 85 #define PROXY_MAXNUMOFPORTS 8 86 87 /****************************************************************** 88 * MACROS - ASSERTS 89 ******************************************************************/ 90 #define PROXY_assert PROXY_paramCheck 91 #define PROXY_require PROXY_paramCheck 92 #define PROXY_ensure PROXY_paramCheck 93 94 #define PROXY_paramCheck(C, V, S) do {\ 95 if (!(C)) { eError = V;\ 96 if(S) DOMX_ERROR("failed check:" #C" - returning error: 0x%x - %s",V,S);\ 97 else DOMX_ERROR("failed check:" #C" - returning error: 0x%x",C, V); \ 98 goto EXIT; }\ 99 } while(0) 100 101 #define PROXY_CHK_VERSION(_pStruct_, _sName_) do { \ 102 PROXY_require((((_sName_ *)_pStruct_)->nSize == sizeof(_sName_)), \ 103 OMX_ErrorBadParameter, "Incorrect nSize"); \ 104 PROXY_require(((((_sName_ *)_pStruct_)->nVersion.s.nVersionMajor == \ 105 OMX_VER_MAJOR) && \ 106 ((((_sName_ *)_pStruct_)->nVersion.s.nVersionMinor == \ 107 OMX_VER_MINOR) || \ 108 (((_sName_ *)_pStruct_)->nVersion.s.nVersionMinor == \ 109 0))), \ 110 OMX_ErrorVersionMismatch, NULL); \ 111 } while(0) 112 113 114 typedef OMX_ERRORTYPE(*PROXY_EMPTYBUFFER_DONE) (OMX_HANDLETYPE 115 hComponent, OMX_U32 remoteBufHdr, OMX_U32 nfilledLen, 116 OMX_U32 nOffset, OMX_U32 nFlags); 117 118 typedef OMX_ERRORTYPE(*PROXY_FILLBUFFER_DONE) (OMX_HANDLETYPE 119 hComponent, OMX_U32 remoteBufHdr, OMX_U32 nfilledLen, 120 OMX_U32 nOffset, OMX_U32 nFlags, OMX_TICKS nTimeStamp, 121 OMX_HANDLETYPE hMarkTargetComponent, OMX_PTR pMarkData); 122 123 typedef OMX_ERRORTYPE(*PROXY_EVENTHANDLER) (OMX_HANDLETYPE hComponent, 124 OMX_PTR pAppData, OMX_EVENTTYPE eEvent, OMX_U32 nData1, 125 OMX_U32 nData2, OMX_PTR pEventData); 126 127 /******************************************************************************* 128 * Structures 129 *******************************************************************************/ 130 /*===============================================================*/ 131 /** PROXY_BUFFER_INFO : This structure maintains a table of A9 and 132 * Ducati side buffers and headers. 133 * 134 * @param pBufHeader : This is a pointer to the A9 bufferheader. 135 * 136 * @param pBufHeaderRemote : This is pointer to Ducati side bufferheader. 137 */ 138 /*===============================================================*/ 139 typedef struct PROXY_BUFFER_INFO 140 { 141 OMX_BUFFERHEADERTYPE *pBufHeader; 142 OMX_U32 pBufHeaderRemote; 143 OMX_PTR pYBuffer; 144 OMX_PTR pMetaDataBuffer; 145 #ifdef USE_ION 146 int mmap_fd; 147 int mmap_fd_metadata_buff; 148 #endif 149 } PROXY_BUFFER_INFO; 150 151 /*===============================================================*/ 152 /** PROXY_BUFFER_TYPE : This enumeration tells the type of buffer pointers coming to OMX in 153 UseBuffer call. 154 */ 155 /*===============================================================*/ 156 typedef enum PROXY_BUFFER_TYPE 157 { 158 VirtualPointers, /*Used when buffer pointers come from the normal A9 virtual space */ 159 GrallocPointers, /*Used when buffer pointers come from Gralloc allocations */ 160 IONPointers, /*Used when buffer pointers come from ION allocations */ 161 EncoderMetadataPointers /*Used when buffer pointers come from Stagefright in camcorder usecase */ 162 } PROXY_BUFFER_TYPE; 163 164 /*===============================================================*/ 165 /** PROXY_BUFFER_TYPE : This enumeration tells the type of buffer pointers coming to OMX in 166 UseBuffer call. 167 */ 168 /*===============================================================*/ 169 typedef struct PROXY_PORT_TYPE 170 { 171 PROXY_BUFFER_TYPE proxyBufferType; /*Used when buffer pointers come from the normal A9 virtual space */ 172 OMX_U32 IsBuffer2D; /*Used when buffer pointers come from Gralloc allocations */ 173 } PROXY_PORT_TYPE; 174 175 /* ========================================================================== */ 176 /** 177 * PROXY_COMPONENT_PRIVATE 178 * 179 */ 180 /* ========================================================================== */ 181 typedef struct PROXY_COMPONENT_PRIVATE 182 { 183 /* OMX Related Information */ 184 OMX_CALLBACKTYPE tCBFunc; 185 OMX_PTR pILAppData; 186 OMX_HANDLETYPE hRemoteComp; 187 188 PROXY_BUFFER_INFO tBufList[MAX_NUM_PROXY_BUFFERS]; 189 PROXY_PORT_TYPE proxyPortBuffers[PROXY_MAXNUMOFPORTS]; 190 OMX_BOOL IsLoadedState; 191 OMX_U32 nTotalBuffers; 192 OMX_U32 nAllocatedBuffers; 193 194 /* PROXY specific data - PROXY PRIVATE DATA */ 195 OMX_PTR pCompProxyPrv; 196 char *cCompName; 197 198 PROXY_EMPTYBUFFER_DONE proxyEmptyBufferDone; 199 PROXY_FILLBUFFER_DONE proxyFillBufferDone; 200 PROXY_EVENTHANDLER proxyEventHandler; 201 202 #ifdef ANDROID_QUIRK_LOCK_BUFFER 203 gralloc_module_t const *grallocModule; 204 #endif 205 #ifdef USE_ION 206 int ion_fd; 207 OMX_BOOL bUseIon; 208 OMX_BOOL bMapIonBuffers; 209 #endif 210 int secure_misc_drv_fd; 211 } PROXY_COMPONENT_PRIVATE; 212 213 214 215 /*===============================================================*/ 216 /** PROXY_MARK_DATA : A pointer to this structure is sent as mark data to 217 * the remote core when a MarkBuffer command is made. 218 * 219 * @param hComponentActual : This is the actual handle of the component to be 220 * marked. When marked buffers come from the remote 221 * to the local core then remote handle of the mark 222 * component is replaced by this in the header. 223 * 224 * @param pMarkdataActual : This is the mark data set by the client. 225 */ 226 /*===============================================================*/ 227 typedef struct PROXY_MARK_DATA 228 { 229 OMX_HANDLETYPE hComponentActual; 230 OMX_PTR pMarkDataActual; 231 } PROXY_MARK_DATA; 232 /******************************************************************************* 233 * Functions 234 *******************************************************************************/ 235 OMX_ERRORTYPE OMX_ProxyCommonInit(OMX_HANDLETYPE hComponent); 236 OMX_ERRORTYPE PROXY_GetParameter(OMX_IN OMX_HANDLETYPE hComponent, 237 OMX_IN OMX_INDEXTYPE nParamIndex, OMX_INOUT OMX_PTR pParamStruct); 238 OMX_ERRORTYPE PROXY_SetParameter(OMX_IN OMX_HANDLETYPE hComponent, 239 OMX_IN OMX_INDEXTYPE nParamIndex, OMX_INOUT OMX_PTR pParamStruct); 240 OMX_ERRORTYPE PROXY_EventHandler(OMX_HANDLETYPE hComponent, 241 OMX_PTR pAppData, OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2, 242 OMX_PTR pEventData); 243 OMX_ERRORTYPE PROXY_SendCommand(OMX_IN OMX_HANDLETYPE hComponent, 244 OMX_IN OMX_COMMANDTYPE eCmd, 245 OMX_IN OMX_U32 nParam, OMX_IN OMX_PTR pCmdData); 246 OMX_ERRORTYPE PROXY_EmptyThisBuffer(OMX_HANDLETYPE hComponent, 247 OMX_BUFFERHEADERTYPE * pBufferHdr); 248 OMX_ERRORTYPE PROXY_GetExtensionIndex(OMX_IN OMX_HANDLETYPE hComponent, 249 OMX_IN OMX_STRING cParameterName, OMX_OUT OMX_INDEXTYPE * pIndexType); 250 OMX_ERRORTYPE PROXY_FillBufferDone(OMX_HANDLETYPE hComponent, 251 OMX_U32 remoteBufHdr, OMX_U32 nfilledLen, OMX_U32 nOffset, OMX_U32 nFlags, 252 OMX_TICKS nTimeStamp, OMX_HANDLETYPE hMarkTargetComponent, 253 OMX_PTR pMarkData); 254 OMX_ERRORTYPE PROXY_FillThisBuffer(OMX_HANDLETYPE hComponent, 255 OMX_BUFFERHEADERTYPE * pBufferHdr); 256 OMX_ERRORTYPE PROXY_AllocateBuffer(OMX_IN OMX_HANDLETYPE hComponent, 257 OMX_INOUT OMX_BUFFERHEADERTYPE ** ppBufferHdr,OMX_IN OMX_U32 nPortIndex, 258 OMX_IN OMX_PTR pAppPrivate, OMX_IN OMX_U32 nSizeBytes); 259 OMX_ERRORTYPE PROXY_FreeBuffer(OMX_IN OMX_HANDLETYPE hComponent, 260 OMX_IN OMX_U32 nPortIndex, OMX_IN OMX_BUFFERHEADERTYPE * pBufferHdr); 261 OMX_ERRORTYPE PROXY_ComponentDeInit(OMX_HANDLETYPE hComponent); 262 263 264 #ifdef __cplusplus 265 } 266 #endif /* __cplusplus */ 267 268 #endif 269