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