RPC: add generic way to pass more than one buffer to free
[gstreamer-omap:domx.git] / domx / omx_proxy_common.h
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@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             100
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",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 #define PROXY_checkRpcError() do { \
114     if (eRPCError == RPC_OMX_ErrorNone) \
115     { \
116         DOMX_DEBUG("Corresponding RPC function executed successfully"); \
117         eError = eCompReturn; \
118         PROXY_assert((eError == OMX_ErrorNone) || (eError == OMX_ErrorNoMore), eError, "Error returned from OMX API in ducati"); \
119     } else \
120     { \
121         DOMX_ERROR("RPC function returned error 0x%x", eRPCError); \
122         switch (eRPCError) \
123         { \
124             case RPC_OMX_ErrorHardware: \
125                 eError = OMX_ErrorHardware; \
126             break; \
127             case RPC_OMX_ErrorInsufficientResources: \
128                 eError = OMX_ErrorInsufficientResources; \
129             break; \
130             case RPC_OMX_ErrorBadParameter: \
131                 eError = OMX_ErrorBadParameter; \
132             break; \
133             case RPC_OMX_ErrorUnsupportedIndex: \
134                 eError = OMX_ErrorUnsupportedIndex; \
135             break; \
136             case RPC_OMX_ErrorTimeout: \
137                 eError = OMX_ErrorTimeout; \
138             break; \
139             default: \
140                 eError = OMX_ErrorUndefined; \
141         } \
142         PROXY_assert((eError == OMX_ErrorNone), eError, "Error returned from OMX API in ducati"); \
143     } \
144 } while(0)
145
146         typedef OMX_ERRORTYPE(*PROXY_EMPTYBUFFER_DONE) (OMX_HANDLETYPE
147             hComponent, OMX_U32 remoteBufHdr, OMX_U32 nfilledLen,
148             OMX_U32 nOffset, OMX_U32 nFlags);
149
150         typedef OMX_ERRORTYPE(*PROXY_FILLBUFFER_DONE) (OMX_HANDLETYPE
151             hComponent, OMX_U32 remoteBufHdr, OMX_U32 nfilledLen,
152             OMX_U32 nOffset, OMX_U32 nFlags, OMX_TICKS nTimeStamp,
153             OMX_HANDLETYPE hMarkTargetComponent, OMX_PTR pMarkData);
154
155         typedef OMX_ERRORTYPE(*PROXY_EVENTHANDLER) (OMX_HANDLETYPE hComponent,
156             OMX_PTR pAppData, OMX_EVENTTYPE eEvent, OMX_U32 nData1,
157             OMX_U32 nData2, OMX_PTR pEventData);
158
159 /*******************************************************************************
160 * Structures
161 *******************************************************************************/
162 /*===============================================================*/
163 /** PROXY_BUFFER_INFO        : This structure maintains a table of A9 and
164  *                             Ducati side buffers and headers.
165  *
166  * @param pBufHeader         : This is a pointer to the A9 bufferheader.
167  *
168  * @param pBufHeaderRemote   : This is pointer to Ducati side bufferheader.
169  *
170  * @param pRegisteredAufBux0
171  * @param pRegisteredAufBux1
172  * @param pRegisteredAufBux2 : These are pointers to buffers registered with rpc driver
173  *                             They will assigned when registering and used when
174  *                             unregistering the buffer
175  */
176 /*===============================================================*/
177         typedef struct PROXY_BUFFER_INFO
178         {
179                 OMX_BUFFERHEADERTYPE *pBufHeader;
180                 OMX_U32 pBufHeaderRemote;
181                 OMX_PTR pYBuffer;
182                 OMX_PTR pMetaDataBuffer;
183 #ifdef USE_ION
184                 int mmap_fd;
185                 int mmap_fd_metadata_buff;
186                 OMX_PTR pRegisteredAufBux0;
187                 OMX_PTR pRegisteredAufBux1;
188                 OMX_PTR pRegisteredAufBux2;
189 #endif
190         } PROXY_BUFFER_INFO;
191
192 /*===============================================================*/
193 /** PROXY_BUFFER_TYPE        : This enumeration tells the type of buffer pointers coming to OMX in 
194                                 UseBuffer call.
195  */
196 /*===============================================================*/
197         typedef enum PROXY_BUFFER_TYPE
198         {
199                 VirtualPointers,   /*Used when buffer pointers come from the normal A9 virtual space */
200                 GrallocPointers,   /*Used when buffer pointers come from Gralloc allocations */
201                 IONPointers,       /*Used when buffer pointers come from ION allocations */
202                 EncoderMetadataPointers,                /*Used when buffer pointers come from Stagefright in camcorder usecase */
203                 BufferDescriptorVirtual2D,         /*Virtual unpacked buffers passed via OMX_TI_BUFFERDESCRIPTOR_TYPE */
204                 FileDescriptorsArray,   /*We pass an array of integers representing file descriptors */
205         } PROXY_BUFFER_TYPE;
206
207 /*===============================================================*/
208 /** PROXY_BUFFER_TYPE        : This enumeration tells the type of buffer pointers coming to OMX in
209                                UseBuffer call.
210  */
211 /*===============================================================*/
212         typedef struct PROXY_PORT_TYPE
213         {
214                 PROXY_BUFFER_TYPE proxyBufferType;   /*Used when buffer pointers come from the normal A9 virtual space */
215                 OMX_U32 IsBuffer2D;   /*Used when buffer pointers come from Gralloc allocations */
216         } PROXY_PORT_TYPE;
217
218 #ifdef ENABLE_RAW_BUFFERS_DUMP_UTILITY
219 /*===============================================================*/
220 /** DebugFrame_Dump     : Structure holding the info about frames to dump
221  *  @param fromFrame: From which frame to start dumping
222  *  @param toFrame:  till which frame to dump
223  *  @param frame_width: Width of the frame
224  *  @param frame_height: Height of the frame
225  *  @param padded_width: Width of the buffer
226  *  @param padded_height: Height of the buffer
227  *  @param stride: Stride of the Buffer
228  *  @param runningFrame: running counter to track the frames
229  */
230 /*===============================================================*/
231         typedef struct DebugFrame_Dump
232         {
233                 OMX_S32 fromFrame;
234                 OMX_S32 toFrame;
235                 OMX_U32 frame_width;
236                 OMX_U32 frame_height;
237                 OMX_U32 frame_xoffset;
238                 OMX_U32 frame_yoffset;
239                 OMX_U32 stride;
240                 OMX_S32 runningFrame;
241                 OMX_U32 *y_uv[2];
242         }DebugFrame_Dump;
243 #endif
244
245 /* ========================================================================== */
246 /**
247 * PROXY_COMPONENT_PRIVATE
248 *
249 */
250 /* ========================================================================== */
251         typedef struct PROXY_COMPONENT_PRIVATE
252         {
253                 /* OMX Related Information */
254                 OMX_CALLBACKTYPE tCBFunc;
255                 OMX_PTR pILAppData;
256                 OMX_HANDLETYPE hRemoteComp;
257
258                 PROXY_BUFFER_INFO tBufList[MAX_NUM_PROXY_BUFFERS];
259                 PROXY_PORT_TYPE proxyPortBuffers[PROXY_MAXNUMOFPORTS];
260                 OMX_BOOL IsLoadedState;
261                 OMX_U32 nTotalBuffers;
262                 OMX_U32 nAllocatedBuffers;
263
264                 /* PROXY specific data - PROXY PRIVATE DATA */
265                 OMX_PTR pCompProxyPrv;
266                 char *cCompName;
267
268                 PROXY_EMPTYBUFFER_DONE proxyEmptyBufferDone;
269                 PROXY_FILLBUFFER_DONE proxyFillBufferDone;
270                 PROXY_EVENTHANDLER proxyEventHandler;
271
272 #ifdef ANDROID_QUIRK_LOCK_BUFFER
273                 gralloc_module_t const *grallocModule;
274 #endif
275 #ifdef USE_ION
276                 int ion_fd;
277                 OMX_BOOL bUseIon;
278                 OMX_BOOL bMapIonBuffers;
279 #endif
280 #ifdef ENABLE_RAW_BUFFERS_DUMP_UTILITY
281                 DebugFrame_Dump debugframeInfo;
282 #endif
283                 int secure_misc_drv_fd;
284         } PROXY_COMPONENT_PRIVATE;
285
286
287
288 /*===============================================================*/
289 /** PROXY_MARK_DATA        : A pointer to this structure is sent as mark data to
290  *                           the remote core when a MarkBuffer command is made.
291  *
292  * @param hComponentActual : This is the actual handle of the component to be
293  *                           marked. When marked buffers come from the remote
294  *                           to the local core then remote handle of the mark
295  *                           component is replaced by this in the header.
296  *
297  * @param pMarkdataActual : This is the mark data set by the client.
298  */
299 /*===============================================================*/
300         typedef struct PROXY_MARK_DATA
301         {
302                 OMX_HANDLETYPE hComponentActual;
303                 OMX_PTR pMarkDataActual;
304         } PROXY_MARK_DATA;
305 /*******************************************************************************
306 * Functions
307 *******************************************************************************/
308         OMX_ERRORTYPE OMX_ProxyCommonInit(OMX_HANDLETYPE hComponent);
309         OMX_ERRORTYPE PROXY_GetParameter(OMX_IN OMX_HANDLETYPE hComponent,
310             OMX_IN OMX_INDEXTYPE nParamIndex, OMX_INOUT OMX_PTR pParamStruct);
311         OMX_ERRORTYPE PROXY_SetParameter(OMX_IN OMX_HANDLETYPE hComponent,
312             OMX_IN OMX_INDEXTYPE nParamIndex, OMX_INOUT OMX_PTR pParamStruct);
313         OMX_ERRORTYPE PROXY_EventHandler(OMX_HANDLETYPE hComponent,
314             OMX_PTR pAppData, OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2,
315             OMX_PTR pEventData);
316         OMX_ERRORTYPE PROXY_SendCommand(OMX_IN OMX_HANDLETYPE hComponent,
317             OMX_IN OMX_COMMANDTYPE eCmd,
318             OMX_IN OMX_U32 nParam, OMX_IN OMX_PTR pCmdData);
319         OMX_ERRORTYPE PROXY_EmptyThisBuffer(OMX_HANDLETYPE hComponent,
320             OMX_BUFFERHEADERTYPE * pBufferHdr);
321         OMX_ERRORTYPE PROXY_GetExtensionIndex(OMX_IN OMX_HANDLETYPE hComponent,
322             OMX_IN OMX_STRING cParameterName, OMX_OUT OMX_INDEXTYPE * pIndexType);
323         OMX_ERRORTYPE PROXY_FillBufferDone(OMX_HANDLETYPE hComponent,
324         OMX_U32 remoteBufHdr, OMX_U32 nfilledLen, OMX_U32 nOffset, OMX_U32 nFlags,
325             OMX_TICKS nTimeStamp, OMX_HANDLETYPE hMarkTargetComponent,
326             OMX_PTR pMarkData);
327         OMX_ERRORTYPE PROXY_FillThisBuffer(OMX_HANDLETYPE hComponent,
328             OMX_BUFFERHEADERTYPE * pBufferHdr);
329         OMX_ERRORTYPE PROXY_AllocateBuffer(OMX_IN OMX_HANDLETYPE hComponent,
330             OMX_INOUT OMX_BUFFERHEADERTYPE ** ppBufferHdr,OMX_IN OMX_U32 nPortIndex,
331             OMX_IN OMX_PTR pAppPrivate, OMX_IN OMX_U32 nSizeBytes);
332         OMX_ERRORTYPE PROXY_FreeBuffer(OMX_IN OMX_HANDLETYPE hComponent,
333             OMX_IN OMX_U32 nPortIndex, OMX_IN OMX_BUFFERHEADERTYPE * pBufferHdr);
334         OMX_ERRORTYPE PROXY_ComponentDeInit(OMX_HANDLETYPE hComponent);
335
336
337 #ifdef __cplusplus
338 }
339 #endif                          /* __cplusplus */
340
341 #endif