• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright (C) Texas Instruments - http://www.ti.com/
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21 #ifndef OMX_VPP_UTILS__H
22 #define OMX_VPP_UTILS__H
23 
24 #include <OMX_Component.h>
25 #include "LCML_DspCodec.h"
26 #ifdef RESOURCE_MANAGER_ENABLED
27 #include <ResourceManagerProxyAPI.h>
28 #endif
29 #include <OMX_TI_Common.h>
30 
31 #ifdef __PERF_INSTRUMENTATION__
32 #include "perf.h"
33 #endif
34 
35 #define KHRONOS_1_2
36 
37 /*Linked List */
38 
39 typedef struct Node {
40     struct Node *pNextNode;
41     void *pValue;
42 } Node;
43 
44 typedef struct LinkedList {
45     Node *pRoot;
46 }   LinkedList;
47 
48 LinkedList AllocList;
49 
50 void LinkedList_Create(LinkedList *LinkedList);
51 void LinkedList_AddElement(LinkedList *LinkedList, void *pValue);
52 void LinkedList_FreeElement(LinkedList *LinkedList, void *pValue);
53 void LinkedList_FreeAll(LinkedList *LinkedList);
54 void LinkedList_DisplayAll(LinkedList *LinkedList);
55 void LinkedList_Destroy(LinkedList *LinkedList);
56 
57 /*
58  *     M A C R O S
59  */
60 /* configuration numbers */
61 
62 /*difine for Khronos 1.1*/
63 #define KHRONOS_1_1
64 
65 /*#define VPP_DEBUG*/
66 
67 #define VPP_MAJOR_VER 0x01
68 /*#ifdef  KHRONOS_1_1
69 #define VPP_MINOR_VER 0x01
70 #else*/
71 #define VPP_MINOR_VER 0x00
72 /*#endif*/
73 #define VPP_REVISION  0x00
74 #define VPP_STEP      0x00
75 
76 #define NORMAL_BUFFER      0
77 #define OMX_NOPORT         0xFFFFFFFE
78 #define NUM_OF_PORTS       4
79 
80 #define NUM_OF_VPP_BUFFERS (4)
81 #define MAX_VPP_BUFFERS    (4)
82 #define NUM_OF_VPP_PORTS   (4)
83 #define MIN_NUM_OF_VPP_BUFFERS 1
84 
85 #define DEFAULT_WIDTH      (176)
86 #define DEFAULT_HEIGHT     (144)
87 
88 #define VPP_ZERO                0
89 #define VPP_DSPSTOP          0x01
90 #define VPP_BUFFERBACK    0x02
91 #define VPP_IDLEREADY      ( VPP_DSPSTOP | VPP_BUFFERBACK )
92 
93 #define DSP_MMU_FAULT_HANDLING
94 
95 #ifdef UNDER_CE
96 #define USN_DLL_NAME "/windows/usn.dll64P"
97 #define VPP_NODE_DLL "/windows/vpp_sn.dll64P"
98 #else
99 #define USN_DLL_NAME "usn.dll64P"
100 #define VPP_NODE_DLL "vpp_sn.dll64P"
101 #endif
102 
103 #ifdef UNDER_CE
104   #include <oaf_debug.h> /* defines VPP_DPRINT*/
105 #else
106     #ifdef  VPP_DEBUG
107         #define VPP_DPRINT(...) fprintf(stderr,__VA_ARGS__)
108     #else
109         #define VPP_DPRINT(...)
110     #endif
111 #endif
112 
113 #define OMX_INIT_STRUCT(_s_, _name_)  \
114 { \
115     memset((_s_), 0x0, sizeof(_name_));  \
116     (_s_)->nSize = sizeof(_name_);    \
117     (_s_)->nVersion.s.nVersionMajor = VPP_MAJOR_VER;  \
118     (_s_)->nVersion.s.nVersionMinor = VPP_MINOR_VER;  \
119     (_s_)->nVersion.s.nRevision = VPP_REVISION;    \
120     (_s_)->nVersion.s.nStep = VPP_STEP; \
121 }
122 
123 #define OMX_CHECK_CMD(_ptr1, _ptr2, _ptr3)  \
124 {            \
125     if(!_ptr1 || !_ptr2 || !_ptr3){    \
126         eError = OMX_ErrorBadParameter;    \
127         goto EXIT;      \
128     }            \
129 }
130 
131 #define OMX_SET_ERROR_BAIL(_eError, _eCode)\
132 {            \
133     _eError = _eCode;        \
134     goto EXIT;      \
135 }
136 
137 #define OMX_MALLOC(_pStruct_, _size_)   \
138     _pStruct_ = malloc(_size_);  \
139     if(_pStruct_ == NULL){  \
140         eError = OMX_ErrorInsufficientResources;    \
141         goto EXIT;  \
142     } \
143     memset(_pStruct_, 0, _size_);\
144     LinkedList_AddElement(&AllocList, _pStruct_);
145 
146 #define OMX_FREE(_ptr)   \
147 {                     \
148     if (_ptr != NULL) { \
149         LinkedList_FreeElement(&AllocList, _ptr);\
150         _ptr = NULL; \
151     }                \
152 }
153 
154 #define OMX_FREEALL()   \
155 {                     \
156     LinkedList_FreeAll(&AllocList);\
157 }
158 
159 
160 /**********************************************************************
161  *    GPP Internal data type
162  **********************************************************************
163  */
164 
165 typedef enum OMX_VPP_PORT_NUMBER_TYPE {
166     OMX_VPP_INPUT_PORT         = 0,
167     OMX_VPP_INPUT_OVERLAY_PORT = 1,
168     OMX_VPP_RGB_OUTPUT_PORT    = 2,
169     OMX_VPP_YUV_OUTPUT_PORT    = 3,
170     OMX_VPP_MAXPORT_NUM = 3
171 } OMX_VPP_PORT_NUMBER_TYPE;
172 
173 typedef enum {
174     IUALG_CMD_SETCOEFF = 100,
175     IUALG_CMD_SETIO
176 }IUALG_VppCmd;
177 
178 typedef enum VPP_BUFFER_OWNER
179 {
180     VPP_BUFFER_CLIENT = 0x0,
181     VPP_BUFFER_COMPONENT_IN,
182     VPP_BUFFER_COMPONENT_OUT,
183     VPP_BUFFER_DSP,
184     VPP_BUFFER_TUNNEL_COMPONENT
185 } VPP_BUFFER_OWNER;
186 typedef enum OMX_INDEXVPPTYPE
187 {
188 #ifdef KHRONOS_1_2
189     OMX_IndexCustomSetZoomFactor = (OMX_IndexVendorStartUnused + 1),
190 #else
191     OMX_IndexCustomSetZoomFactor = (OMX_IndexIndexVendorStartUnused + 1),
192 #endif
193     OMX_IndexCustomSetZoomLimit,
194     OMX_IndexCustomSetZoomSpeed,
195     OMX_IndexCustomSetZoomXoffsetFromCenter16,
196     OMX_IndexCustomSetZoomYoffsetFromCenter16,
197     OMX_IndexCustomSetFrostedGlassOvly,
198     OMX_IndexCustomVideoColorRange,
199     OMX_IndexCustomRGB4ColorFormat,
200     OMX_IndexCustomConfigInputSize
201 } OMX_INDEXVPPTYPE;
202 
203 
204 typedef enum VGPOP_IORange {
205     VGPOP_IN_16_235_OUT_16_235,     /*limited range to limited range*/
206     VGPOP_IN_00_255_OUT_00_255,      /*full range to full range*/
207     VGPOP_IN_00_255_OUT_16_235,         /*full range to limited range*/
208     VGPOP_IN_16_235_OUT_00_255          /*limited range to full range*/
209 } VGPOP_IORange;
210 
211 
212  /* Parameter buffer which needs to be passed to DSP */
213 
214 typedef struct GPPToVPPInputFrameStatus {
215 
216     /* INPUT FRAME */
217 
218     /* input size*/
219     OMX_U32      ulInWidth;          /*  picture buffer width          */
220     OMX_U32      ulInHeight;         /*  picture buffer height         */
221     OMX_U32      ulCInOffset;        /* offset of the C frame in the   *
222                                     * buffer (equal to zero if there *
223                                     * is no C frame)                 */
224 
225     /* PROCESSING PARAMETERS */
226 
227     /*    crop           */
228     OMX_U32      ulInXstart;          /*  Hin active start             */
229     OMX_U32      ulInXsize;           /*  Hin active width             */
230     OMX_U32      ulInYstart;          /*  Vin active start             */
231     OMX_U32      ulInYsize;           /* Vin active height             */
232 
233     /*   zoom            */
234     OMX_U32      ulZoomFactor;        /*zooming ratio (/1024)          */
235     OMX_U32      ulZoomLimit;         /* zooming ratio limit (/1024)   */
236     OMX_U32      ulZoomSpeed;         /* speed of ratio change         */
237 
238     /*  stabilisation             */
239     OMX_U32      ulXoffsetFromCenter16;    /*  add 1/16/th accuracy offset */
240     OMX_U32      ulYoffsetFromCenter16;    /* add 1/16/th accuracy offset  */
241 
242     /*  gain and contrast             */
243     OMX_U32      ulContrastType;      /*    Contrast method            */
244     OMX_U32      ulVideoGain;         /* gain on video (Y and C)       */
245 
246     /*  effect             */
247     OMX_U32      ulFrostedGlassOvly;  /*  Frosted glass effect overlay          */
248     OMX_U32      ulLightChroma;       /*  Light chrominance process             */
249     OMX_U32      ulLockedRatio;       /*  keep H/V ratio                        */
250     OMX_U32      ulMirror;            /*  to mirror the picture                 */
251     OMX_U32      ulRGBRotation;          /*  0, 90, 180, 270 deg.                  */
252     OMX_U32      ulYUVRotation;          /*  0, 90, 180, 270 deg.                  */
253 
254 #ifndef _55_
255     OMX_U32     eIORange;              /*  Video Color Range Conversion */
256     OMX_U32     ulDithering;           /*  dithering                             */
257     OMX_U32     ulOutPitch;                 /* output pitch (in bytes)*/
258     OMX_U32     ulAlphaRGB;                 /* Global A value of an ARGB output*/
259 #endif
260 
261 }GPPToVPPInputFrameStatus;
262 
263 
264 /* OUTPPUT BUFFER */
265 
266 typedef struct GPPToVPPOutputFrameStatus {
267 
268     OMX_U32      ulOutWidth;          /*  RGB/YUV picture buffer width           */
269     OMX_U32      ulOutHeight;         /*  RGB/YUV picture buffer height          */
270     OMX_U32      ulCOutOffset;        /*  Offset of the C frame in the buffer (equal to 0 if there is no C frame)             */
271 
272 }GPPToVPPOutputFrameStatus;
273 
274 /* ALG CONTROL*/
275 
276 typedef struct VPPIOConf {
277 
278     /*   Optionnal input             */
279     OMX_U32 overlayInputImage;
280     /*  Optionnal output             */
281     OMX_U32 RGBOutputImage;
282     OMX_U32 YUVOutputImage;
283 
284 } VPPIOConf;
285 
286 /* UUID structure for DSP/BIOS Bridge nodes. COMMON_TI_UUID*/
287 static const struct DSP_UUID COMMON_TI_UUID = {
288         0x79A3C8B3, 0x95F2, 0x403F, 0x9A, 0x4B, {
289         0xCF, 0x80, 0x57, 0x73, 0x05, 0x41
290     }
291 };
292 
293 
294 
295 /*===================================================================*/
296 /**
297  * OMX_VPP_PORT_NUMBER_TYPE enumeration for ports supported by
298  * this component.
299  */
300 /*===================================================================*/
301 typedef struct VPP_OVERLAY {
302     OMX_U8  *iRBuff ;
303     OMX_U8  *iGBuff;
304     OMX_U8  *iBBuff ;
305     OMX_U8  *iOvlyConvBufPtr ;
306     OMX_U8  iRKey;
307     OMX_U8  iGKey;
308     OMX_U8  iBKey;
309     OMX_U8  iAlign ;
310 }VPP_OVERLAY;
311 
312 /* Component buffer */
313 typedef struct OMX_VPP_COMPONENT_BUFFER {
314     OMX_BUFFERHEADERTYPE  *pBufHeader;
315     OMX_U32                   nIndex;
316     OMX_BOOL                bSelfAllocated;
317     OMX_BOOL                bHolding;
318     VPP_BUFFER_OWNER  eBufferOwner;
319     OMX_U8                      *pBufferStart;
320 } OMX_VPP_COMPONENT_BUFFER;
321 
322 typedef struct VPP_BUFFERDATA_PROPAGATION {
323     OMX_U32 flag;
324     OMX_U32 buffer_idYUV;
325     OMX_U32 buffer_idRGB;
326     OMX_HANDLETYPE hMarkTargetComponent;
327     OMX_PTR pMarkData;
328     OMX_U32 nTickCount;
329     OMX_TICKS nTimeStamp;
330 } VPP_BUFFERDATA_PROPAGATION;
331 
332 /* Component Port Context */
333 typedef struct VPP_PORT_TYPE
334 {
335     OMX_HANDLETYPE               hTunnelComponent;
336     OMX_U32                      nTunnelPort;
337     OMX_BUFFERSUPPLIERTYPE       eSupplierSetting;
338     OMX_BUFFERSUPPLIERTYPE       eSupplierPreference;
339     OMX_U32                      nPortIndex;
340     OMX_U32                      nBufferCount;
341     OMX_VPP_COMPONENT_BUFFER     pVPPBufHeader[NUM_OF_VPP_BUFFERS];
342     VPP_BUFFERDATA_PROPAGATION sBufferDataProp[NUM_OF_VPP_BUFFERS];
343     OMX_PARAM_PORTDEFINITIONTYPE pPortDef;
344     OMX_BOOL                     nBufSupplier;
345     OMX_U32                         nReturnedBufferCount; /*For tunneling*/
346     OMX_MIRRORTYPE          eMirror;
347 } VPP_PORT_TYPE;
348 
349 typedef struct VPP_COMPONENT_PRIVATE
350 {
351     /** Array of pointers to BUFFERHEADERTYPE structues
352        This pBufHeader[INPUT_PORT] will point to all the
353        BUFFERHEADERTYPE structures related to input port,
354        not just one structure. Same is for output port
355        also. */
356 
357 
358     VPP_PORT_TYPE                   sCompPorts[NUM_OF_VPP_PORTS];
359 
360     OMX_CALLBACKTYPE                cbInfo;
361     /** Handle for use with async callbacks */
362 
363     /** This will contain info like how many buffers
364         are there for input/output ports, their size etc, but not
365         BUFFERHEADERTYPE POINTERS. */
366 
367     OMX_PORT_PARAM_TYPE                 *pPortParamTypeImage;
368     OMX_PORT_PARAM_TYPE                 *pPortParamTypeAudio;
369     OMX_PORT_PARAM_TYPE                 *pPortParamTypeVideo;
370     OMX_PORT_PARAM_TYPE                 *pPortParamTypeOthers;
371 
372     OMX_VIDEO_PARAM_PORTFORMATTYPE  *pInPortFormat;
373     OMX_VIDEO_PARAM_PORTFORMATTYPE  *pInPortOverlayFormat;
374     OMX_VIDEO_PARAM_PORTFORMATTYPE  *pOutPortRGBFormat;
375     OMX_VIDEO_PARAM_PORTFORMATTYPE  *pOutPortYUVFormat;
376     OMX_PRIORITYMGMTTYPE            *pPriorityMgmt;
377 
378     /** This is component handle */
379     OMX_COMPONENTTYPE               *pHandle;
380 
381     /** Current state of this component */
382     OMX_STATETYPE   curState;
383 
384     /** The state to go **/
385     OMX_STATETYPE   toState;
386 
387     OMX_STRING      cComponentName;
388     OMX_VERSIONTYPE ComponentVersion;
389     OMX_VERSIONTYPE SpecVersion;
390 
391     /** The component thread handle */
392     pthread_t       ComponentThread;
393     LCML_DSP_INTERFACE* pLCML;
394 	void * pDllHandle;
395 
396     /** The pipes for sending commands to the thread */
397     int            cmdPipe[2];
398     int            nCmdDataPipe[2];
399     /** The pipes for sending buffers to the thread */
400 
401     /*The Pipe to send empty output buffers to component*/
402     int            nFree_oPipe[2];
403     /*The pipe for sending Filled Input buffers to component*/
404     int            nFilled_iPipe[2];
405 
406     /** Set to indicate component is stopping */
407     OMX_U32        bIsStopping;
408 
409     OMX_U32        bIsEOFSent;
410     OMX_U32        lcml_compID;
411     OMX_U32        NumofOutputPort;
412     OMX_U32        IsYUVdataout;
413     OMX_U32         IsRGBdataout;
414     OMX_U32        IsOverlay;
415     OMX_CONFIG_RECTTYPE     *pCrop;
416     OMX_U8         ExeToIdleFlag;  /* StateCheck */
417     OMX_HANDLETYPE pLcmlHandle;
418     VPP_OVERLAY    *overlay;
419     OMX_U8         *RGBbuffer ;
420     OMX_U8         *colorKey;
421 
422 #ifdef __PERF_INSTRUMENTATION__
423     PERF_OBJHANDLE pPERF, pPERFcomp;
424 #endif
425 
426     OMX_U32        lcml_nCntIp;
427     OMX_U32        lcml_nCntOpReceived;
428     OMX_U32         nInputFrame; /*Buffer data propagation*/
429     OMX_U32         nOverlayFrame; /*Buffer data propagation*/
430     OMX_U32        nInYUVBufferCount; /*Buffer data propagation*/
431     OMX_U32         nInRGBBufferCount; /*Buffer data propagation*/
432     OMX_U32        nOutYUVBufferCount; /*Buffer data propagation*/
433     OMX_U32        nOutRGBBufferCount; /*Buffer data propagation*/
434     OMX_PTR        pMarkData;                   /*Buffer data propagation*/
435     OMX_HANDLETYPE hMarkTargetComponent; /*Buffer data propagation*/
436     VPPIOConf     *tVPPIOConf;
437     GPPToVPPInputFrameStatus  *pIpFrameStatus;
438     GPPToVPPOutputFrameStatus *pOpYUVFrameStatus;
439     GPPToVPPOutputFrameStatus *pOpRGBFrameStatus;
440     OMX_CONFIG_SCALEFACTORTYPE      sScale;
441     OMX_U8         CodecAlgCtrlAck;
442     OMX_BOOL	   bFlushComplete;
443 	OMX_U32		   nFlushPort;
444     OMX_BOOL       bDisable;
445     OMX_BOOL       bDisableIncomplete[NUM_OF_VPP_PORTS];
446 #ifdef RESOURCE_MANAGER_ENABLED
447     RMPROXY_CALLBACKTYPE rmproxyCallback;
448 #endif
449     OMX_BOOL bPreempted;
450 
451 
452 	pthread_mutex_t buf_mutex;
453 	pthread_mutex_t vpp_mutex;
454 	pthread_cond_t  stop_cond;
455 
456 #ifdef KHRONOS_1_1
457     OMX_PARAM_COMPONENTROLETYPE componentRole;
458 #endif
459 } VPP_COMPONENT_PRIVATE;
460 
461 /* structures for custom commands */
462 typedef struct _VPP_CUSTOM_PARAM_DEFINITION
463 {
464     OMX_U8 cCustomParamName[128];
465     OMX_INDEXTYPE nCustomParamIndex;
466 } VPP_CUSTOM_PARAM_DEFINITION;
467 
468 /* Function ProtoType */
469 
470 OMX_ERRORTYPE VPP_Fill_LCMLInitParams(OMX_HANDLETYPE pHandle, OMX_U16 arr[], LCML_DSP *plcml_Init);
471 
472 OMX_ERRORTYPE VPP_GetBufferDirection(OMX_BUFFERHEADERTYPE *pBufHeader, OMX_DIRTYPE *eDir, OMX_U32 Index);
473 
474 OMX_ERRORTYPE VPP_LCML_Callback (TUsnCodecEvent event,void * args [10]);
475 
476 OMX_ERRORTYPE VPP_HandleCommand (VPP_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1);
477 
478 OMX_ERRORTYPE VPP_HandleDataBuf_FromApp(OMX_BUFFERHEADERTYPE *pBufHeader, VPP_COMPONENT_PRIVATE *pComponentPrivate);
479 
480 
481 OMX_ERRORTYPE VPP_IsValidBuffer(OMX_BUFFERHEADERTYPE *pBufHeader,
482                             VPP_COMPONENT_PRIVATE *pComponentPrivate,
483                             OMX_U32 pIndex,
484                             OMX_U32 *pCount);
485 
486 
487 OMX_ERRORTYPE VPP_GetPortDefFromBufHeader(OMX_BUFFERHEADERTYPE *pBufHeader, OMX_PARAM_PORTDEFINITIONTYPE **portDef );
488 
489 OMX_ERRORTYPE VPP_HandleDataBuf_FromLCML(VPP_COMPONENT_PRIVATE* pComponentPrivate);
490 
491 OMX_HANDLETYPE VPP_GetLCMLHandle(VPP_COMPONENT_PRIVATE *pComponentPrivate);
492 
493 OMX_ERRORTYPE VPP_GetCorresponding_LCMLHeader(VPP_COMPONENT_PRIVATE *pComponentPrivate,
494                                               OMX_U8 *pBuffer,
495                                               OMX_DIRTYPE eDir,
496                                               OMX_VPP_COMPONENT_BUFFER **ppCmpBuf,
497                                               OMX_U32 Index);
498 
499 OMX_ERRORTYPE VPP_Free_ComponentResources(OMX_HANDLETYPE pComponent);
500 
501 OMX_ERRORTYPE ComputeTiOverlayImgFormat (VPP_COMPONENT_PRIVATE *pComponentPrivate,
502                                          OMX_U8* aPictureArray,
503                                          OMX_U8* aOutImagePtr,
504                                          OMX_U8* aTransparencyKey);
505 
506 OMX_ERRORTYPE VPP_Start_ComponentThread(OMX_HANDLETYPE pHandle);
507 
508 OMX_ERRORTYPE VPP_Stop_ComponentThread(OMX_HANDLETYPE pHandle);
509 
510 OMX_ERRORTYPE VPP_DisablePort (VPP_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1);
511 
512 OMX_ERRORTYPE VPP_EnablePort (VPP_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1);
513 
514 OMX_ERRORTYPE VPP_HandleCommandFlush (VPP_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1, OMX_BOOL return_event);
515 
516 OMX_ERRORTYPE VPP_Process_FilledInBuf(VPP_COMPONENT_PRIVATE* pComponentPrivate);
517 
518 OMX_ERRORTYPE VPP_Process_FilledOutBuf(VPP_COMPONENT_PRIVATE* pComponentPrivate,
519                                        OMX_VPP_COMPONENT_BUFFER *pComponentBuf);
520 
521 OMX_ERRORTYPE VPP_Process_FreeInBuf(VPP_COMPONENT_PRIVATE* pComponentPrivate,
522                                     OMX_VPP_COMPONENT_BUFFER *pComponentBuf);
523 
524 OMX_ERRORTYPE VPP_Process_FreeOutBuf(VPP_COMPONENT_PRIVATE* pComponentPrivate);
525 
526 OMX_ERRORTYPE VPP_Initialize_PrivateStruct(VPP_COMPONENT_PRIVATE *pComponentPrivate);
527 
528 OMX_BOOL IsTIOMXComponent(OMX_HANDLETYPE hComp);
529 
530 void VPP_InitBufferDataPropagation(VPP_COMPONENT_PRIVATE * pComponentPrivate, OMX_U32 nPortIndex);
531 
532 #endif
533