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 /* ============================================================================= 22 * Texas Instruments OMAP(TM) Platform Software 23 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved. 24 * 25 * Use of this software is controlled by the terms and conditions found 26 * in the license agreement under which this software has been supplied. 27 * ============================================================================ */ 28 /** 29 * @file OMX_G722Decoder.h 30 * 31 * This is an header file for an audio G722 decoder that is fully 32 * compliant with the OMX Audio specification. 33 * This the file is used internally by the component 34 * in its code. 35 * 36 * @path $(CSLPATH)\OMAPSW_MPU\linux\audio\src\openmax_il\g722_dec\inc\ 37 * 38 * @rev 1.0 39 */ 40 /* --------------------------------------------------------------------------- */ 41 #ifndef OMX_G722DEC_UTILS__H 42 #define OMX_G722DEC_UTILS__H 43 44 #include <OMX_Component.h> 45 46 #include "LCML_DspCodec.h" 47 48 #ifdef UNDER_CE 49 #include <windows.h> 50 #include <oaf_osal.h> 51 #include <omx_core.h> 52 #include <stdlib.h> 53 #else 54 #include <pthread.h> 55 #endif 56 57 /*#define G722DEC_DEBUG **/ /* See all debug statement of the component */ 58 /*#define G722DEC_MEMDETAILS */ /* See memory details of the component */ 59 /*#define G722DEC_BUFDETAILS */ /* See buffers details of the component */ 60 /*#define G722DEC_STATEDETAILS */ /* See all state transitions of the component */ 61 62 #define MAX_NUM_OF_BUFS 10 /* Max number of buffers used */ 63 #define G722D_NUM_INPUT_BUFFERS 1 /* Default number of input buffers */ 64 #define G722D_NUM_OUTPUT_BUFFERS 1 /* Default number of output buffers */ 65 #define G722D_INPUT_BUFFER_SIZE 4096 /* Default size of input buffer */ 66 #define G722D_OUTPUT_BUFFER_SIZE 320 /* Default size of output buffer */ 67 68 #define NUM_OF_PORTS 2 /* Number of ports of component */ 69 #define INVALID_SAMPLING_FREQ 51 70 71 #define EXIT_COMPONENT_THRD 10 72 73 74 #define G722DEC_MAJOR_VER 0xF1 /* Majer version of the component */ 75 #define G722DEC_MINOR_VER 0xF2 /* Minor version of the component */ 76 #define G722DEC_BUFHEADER_VERSION 0x0 /* Version of the buffer header struct */ 77 #define NOT_USED 10 /* To specify that a particulat field is not used */ 78 #define NORMAL_BUFFER 0 /* Marks a buffer as normal buffer i.e. not last buffer */ 79 #define OMX_G722DEC_DEFAULT_SEGMENT (0) /* Default segment ID */ 80 #define OMX_G722DEC_SN_TIMEOUT (-1) /* timeout, wait until ack is received */ 81 #define OMX_G722DEC_SN_PRIORITY (10) /* Priority used by DSP */ 82 #define G722DEC_CPU 50 /* TBD, 50MHz for the moment */ 83 84 #ifdef UNDER_CE 85 #define USN_DLL_NAME "\\windows\\usn.dll64P" /* Path of USN DLL */ 86 #define G722DEC_DLL_NAME "\\windows\\g722dec_sn.dll64P" /* Path of G722 SN DLL */ 87 #else 88 #define USN_DLL_NAME "usn.dll64P" /* Path of USN DLL */ 89 #define G722DEC_DLL_NAME "g722dec_sn.dll64P" /* Path of G722 SN DLL */ 90 #endif 91 92 #define DONT_CARE 0 /* Value unused or ignored */ 93 94 /** Default timeout used to come out of blocking calls*/ 95 #define G722D_TIMEOUT (1000) /* millisecs */ 96 97 #ifdef UNDER_CE 98 99 #ifdef DEBUG 100 #define G722DEC_DPRINT printf 101 #define G722DEC_EPRINT printf 102 #define G722DEC_MEMPRINT printf 103 #define G722DEC_STATEPRINT printf 104 #define G722DEC_BUFPRINT printf 105 #else 106 #define G722DEC_DPRINT 107 #define G722DEC_EPRINT 108 #define G722DEC_MEMPRINT 109 #define G722DEC_STATEPRINT 110 #define G722DEC_BUFPRINT 111 #endif 112 113 #else /* for Linux */ 114 115 #ifdef G722DEC_DEBUG 116 117 #define G722DEC_DPRINT(...) fprintf(stdout, "%s %d:: ",__FUNCTION__, __LINE__); \ 118 fprintf(stdout, __VA_ARGS__); \ 119 fprintf(stdout, "\n"); 120 121 #define G722DEC_BUFPRINT printf 122 #define G722DEC_MEMPRINT printf 123 #define G722DEC_STATEPRINT printf 124 125 #else 126 #define G722DEC_DPRINT(...) 127 128 #ifdef G722DEC_STATEDETAILS 129 #define G722DEC_STATEPRINT printf 130 #else 131 #define G722DEC_STATEPRINT(...) 132 #endif 133 134 #ifdef G722DEC_BUFDETAILS 135 #define G722DEC_BUFPRINT printf 136 #else 137 #define G722DEC_BUFPRINT(...) 138 #endif 139 140 #ifdef G722DEC_MEMDETAILS 141 #define G722DEC_MEMPRINT(...) fprintf(stdout, "%s %d:: ",__FUNCTION__, __LINE__); \ 142 fprintf(stdout, __VA_ARGS__); \ 143 fprintf(stdout, "\n"); 144 #else 145 #define G722DEC_MEMPRINT(...) 146 #endif 147 148 #endif 149 150 #endif /*for UNDER_CE*/ 151 152 #define G722D_OMX_MALLOC(_pStruct_, _sName_) \ 153 _pStruct_ = (_sName_*)malloc(sizeof(_sName_)); \ 154 if(_pStruct_ == NULL){ \ 155 printf("***********************************\n"); \ 156 printf("%d :: Malloc Failed\n",__LINE__); \ 157 printf("***********************************\n"); \ 158 eError = OMX_ErrorInsufficientResources; \ 159 goto EXIT; \ 160 } \ 161 memset(_pStruct_,0,sizeof(_sName_)); \ 162 G722DEC_MEMPRINT("%d :: Malloced = %p\n",__LINE__,_pStruct_); 163 164 165 166 #define G722D_OMX_MALLOC_SIZE(_ptr_, _size_,_name_) \ 167 _ptr_ = (_name_ *)malloc(_size_); \ 168 if(_ptr_ == NULL){ \ 169 printf("***********************************\n"); \ 170 printf("%d :: Malloc Failed\n",__LINE__); \ 171 printf("***********************************\n"); \ 172 eError = OMX_ErrorInsufficientResources; \ 173 goto EXIT; \ 174 } \ 175 memset(_ptr_,0,_size_); \ 176 G722DEC_MEMPRINT("%d :: Malloced = %p\n",__LINE__,_ptr_); 177 178 #define G722D_OMX_ERROR_EXIT(_e_, _c_, _s_) \ 179 _e_ = _c_; \ 180 printf("\n**************** OMX ERROR ************************\n"); \ 181 printf("%d : Error Name: %s : Error Num = %x",__LINE__, _s_, _e_); \ 182 printf("\n**************** OMX ERROR ************************\n"); \ 183 goto EXIT; 184 185 186 #define G722D_OMX_CONF_CHECK_CMD(_ptr1, _ptr2, _ptr3) \ 187 { \ 188 if(!_ptr1 || !_ptr2 || !_ptr3){ \ 189 eError = OMX_ErrorBadParameter; \ 190 goto EXIT; \ 191 } \ 192 } 193 194 #define G722D_OMX_FREE(ptr) \ 195 if(NULL != ptr) { \ 196 G722DEC_MEMPRINT("%d :: Freeing Address = %p\n",__LINE__,ptr); \ 197 free(ptr); \ 198 ptr = NULL; \ 199 } 200 201 #define OMX_CONF_INIT_STRUCT(_s_, _name_) \ 202 memset((_s_), 0x0, sizeof(_name_)); \ 203 (_s_)->nSize = sizeof(_name_); \ 204 (_s_)->nVersion.s.nVersionMajor = 0x1; \ 205 (_s_)->nVersion.s.nVersionMinor = 0x0; \ 206 (_s_)->nVersion.s.nRevision = 0x0; \ 207 (_s_)->nVersion.s.nStep = 0x0 208 209 210 /* ======================================================================= */ 211 /** OMX_G722DEC_INDEXAUDIOTYPE Defines the custom configuration settings 212 * for the component 213 * 214 * @param OMX_IndexCustomG722DecModeDasfConfig Sets the DASF mode 215 * 216 */ 217 /* ==================================================================== */ 218 typedef enum OMX_G722DEC_INDEXAUDIOTYPE { 219 /*OMX_IndexCustomG722DecModeDasfConfig = OMX_IndexIndexVendorStartUnused + 1,*/ 220 OMX_IndexCustomG722DecModeDasfConfig = 0xFF000001, 221 OMX_IndexCustomG722DecHeaderInfoConfig, 222 OMX_IndexCustomG722DecStreamIDConfig, 223 OMX_IndexCustomG722DecDataPath 224 }OMX_G722DEC_INDEXAUDIOTYPE; 225 226 227 /* ============================================================================== * */ 228 /** G722D_COMP_PORT_TYPE describes the input and output port of indices of the 229 * component. 230 * 231 * @param G722D_INPUT_PORT Input port index 232 * 233 * @param G722D_OUTPUT_PORT Output port index 234 */ 235 /* ============================================================================ * */ 236 typedef enum G722D_COMP_PORT_TYPE { 237 G722D_INPUT_PORT = 0, 238 G722D_OUTPUT_PORT 239 }G722D_COMP_PORT_TYPE; 240 241 242 /* ======================================================================= */ 243 /** G722DEC_ParamStruct: This struct is passed with input buffers that 244 * are sent to DSP. 245 */ 246 /* ==================================================================== */ 247 typedef struct { 248 /* Set to 1 if buffer is last buffer */ 249 unsigned long usLastFrame; 250 unsigned long usFrameLost; 251 }G722DEC_ParamStruct; 252 253 /* ======================================================================= */ 254 /** G722DEC_UAlgInBufParamStruct: This struct is passed with input buffers that 255 * are sent to DSP. 256 */ 257 /* ==================================================================== */ 258 typedef struct { 259 /* Set to 1 if buffer is last buffer */ 260 unsigned long bLastBuffer; 261 }G722DEC_UAlgInBufParamStruct; 262 263 264 /* ======================================================================= */ 265 /** G722D_USN_AudioCodecParams: This contains the information which does to Codec 266 * on DSP 267 * are sent to DSP. 268 */ 269 /* ==================================================================== */ 270 typedef struct USN_AudioCodecParams{ 271 /* Specifies the sample frequency */ 272 unsigned long ulSamplingFreq; 273 /* Specifies the UUID */ 274 unsigned long unUUID; 275 /* Specifies the audio format */ 276 unsigned short unAudioFormat; 277 }G722D_USN_AudioCodecParams; 278 279 /* ======================================================================= */ 280 /** G722DEC_UAlgOutBufParamStruct: This is passed with output buffer to DSP. 281 */ 282 /* ==================================================================== */ 283 typedef struct { 284 /* Number of frames in a buffer */ 285 unsigned long ulFrameCount; 286 }G722DEC_UAlgOutBufParamStruct; 287 288 /* ======================================================================= */ 289 /** G722D_LCML_BUFHEADERTYPE: This is LCML buffer header which is sent to LCML 290 * for both input and output buffers. 291 */ 292 /* ==================================================================== */ 293 typedef struct G722D_LCML_BUFHEADERTYPE { 294 /* Direction whether input or output buffer */ 295 OMX_DIRTYPE eDir; 296 /* Pointer to OMX Buffer Header */ 297 OMX_BUFFERHEADERTYPE *pBufHdr; 298 /* Other parameters, may be useful for enhancements */ 299 void *pOtherParams[10]; 300 /* Input Parameter Information structure */ 301 /*G722DEC_UAlgInBufParamStruct *pIpParam;*/ 302 G722DEC_ParamStruct *pIpParam; 303 /* Output Parameter Information structure */ 304 G722DEC_UAlgOutBufParamStruct *pOpParam; 305 306 OMX_BUFFERHEADERTYPE* buffer; 307 }G722D_LCML_BUFHEADERTYPE; 308 309 /* ======================================================================= */ 310 /** G722D_AUDIODEC_PORT_TYPE: This contains component port information. 311 * 312 * @see OMX_AUDIO_PARAM_PORTFORMATTYPE 313 */ 314 /* ==================================================================== */ 315 typedef struct AUDIODEC_PORT_TYPE { 316 /* Used in tunneling, this is handle of tunneled component */ 317 OMX_HANDLETYPE hTunnelComponent; 318 /* Port which has to be tunneled */ 319 OMX_U32 nTunnelPort; 320 /* Buffer Supplier Information */ 321 OMX_BUFFERSUPPLIERTYPE eSupplierSetting; 322 /* Number of buffers */ 323 OMX_U8 nBufferCnt; 324 /* Port format information */ 325 OMX_AUDIO_PARAM_PORTFORMATTYPE* pPortFormat; 326 } G722D_AUDIODEC_PORT_TYPE; 327 328 329 /* ======================================================================= */ 330 /** _G722D_BUFFERLIST: This contains information about a buffer's owner whether 331 * it is application or component, number of buffers owned etc. 332 * 333 * @see OMX_BUFFERHEADERTYPE 334 */ 335 /* ==================================================================== */ 336 struct _G722D_BUFFERLIST{ 337 /* Array of pointer to OMX buffer headers */ 338 OMX_BUFFERHEADERTYPE *pBufHdr[MAX_NUM_OF_BUFS]; 339 /* Array that tells about owner of each buffer */ 340 OMX_U32 bufferOwner[MAX_NUM_OF_BUFS]; 341 OMX_U32 bBufferPending[MAX_NUM_OF_BUFS]; 342 /* Number of buffers */ 343 OMX_U32 numBuffers; 344 }; 345 346 typedef struct _G722D_BUFFERLIST G722D_BUFFERLIST; 347 348 #ifdef UNDER_CE 349 #ifndef _OMX_EVENT_ 350 #define _OMX_EVENT_ 351 typedef struct OMX_Event { 352 HANDLE event; 353 } OMX_Event; 354 #endif 355 int OMX_CreateEvent(OMX_Event *event); 356 int OMX_SignalEvent(OMX_Event *event); 357 int OMX_WaitForEvent(OMX_Event *event); 358 int OMX_DestroyEvent(OMX_Event *event); 359 #endif 360 361 /* ======================================================================= */ 362 /** G722DEC_COMPONENT_PRIVATE: This is the major and main structure of the 363 * component which contains all type of information of buffers, ports etc 364 * contained in the component. 365 * 366 * @see OMX_BUFFERHEADERTYPE 367 * @see OMX_AUDIO_PARAM_PORTFORMATTYPE 368 * @see OMX_PARAM_PORTDEFINITIONTYPE 369 * @see G722D_LCML_BUFHEADERTYPE 370 * @see OMX_PORT_PARAM_TYPE 371 * @see OMX_PRIORITYMGMTTYPE 372 * @see G722D_AUDIODEC_PORT_TYPE 373 * @see G722D_BUFFERLIST 374 * @see G722D_AUDIODEC_PORT_TYPE 375 * @see LCML_STRMATTR 376 * @see 377 */ 378 /* ==================================================================== */ 379 typedef struct G722DEC_COMPONENT_PRIVATE 380 { 381 /** Handle for use with async callbacks */ 382 OMX_CALLBACKTYPE cbInfo; 383 /* Component port information */ 384 OMX_PORT_PARAM_TYPE *sPortParam; 385 /* Input port information */ 386 OMX_AUDIO_PARAM_PORTFORMATTYPE sInPortFormat; 387 /* Output port information */ 388 OMX_AUDIO_PARAM_PORTFORMATTYPE sOutPortFormat; 389 /* Buffer owner information */ 390 OMX_U32 bIsBufferOwned[NUM_OF_PORTS]; 391 392 /** Number of input buffers at runtime */ 393 OMX_U32 nRuntimeInputBuffers; 394 395 /** Number of output buffers at runtime */ 396 OMX_U32 nRuntimeOutputBuffers; 397 398 /* Audio codec parameters structure */ 399 G722D_USN_AudioCodecParams *pParams; 400 401 /** This will contain info like how many buffers 402 are there for input/output ports, their size etc, but not 403 BUFFERHEADERTYPE POINTERS. */ 404 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef[NUM_OF_PORTS]; 405 /* Contains information that come from application */ 406 OMX_AUDIO_PARAM_PCMMODETYPE* G722Params[NUM_OF_PORTS]; 407 /** This is component handle */ 408 OMX_COMPONENTTYPE* pHandle; 409 /** Current state of this component */ 410 OMX_STATETYPE curState; 411 /** The component thread handle */ 412 pthread_t ComponentThread; 413 /** The pipes for sending buffers to the thread */ 414 int dataPipe[2]; 415 /** The pipes for sending buffers to the thread */ 416 int cmdPipe[2]; 417 418 /** The pipes for sending command data to the thread */ 419 int cmdDataPipe[2]; 420 421 /* int portcmdPipe[2]; */ 422 423 /** The pipes for sending buffers to the thread */ 424 int lcml_Pipe[2]; 425 426 /** Set to indicate component is stopping */ 427 OMX_U32 bIsEOFSent; 428 429 /** Count of number of buffers outstanding with bridge */ 430 OMX_U32 lcml_nIpBuf; 431 432 /** Count of number of buffers outstanding with bridge */ 433 OMX_U32 lcml_nOpBuf; 434 435 /** Counts of number of input buffers sent to LCML */ 436 OMX_U32 lcml_nCntIp; 437 /** Counts of number of input buffers received from LCML */ 438 OMX_U32 lcml_nCntIpRes; 439 /** Counts of number of output buffers sent to LCML */ 440 OMX_U32 lcml_nCntOp; 441 /** Counts of number of output buffers received from LCML */ 442 OMX_U32 lcml_nCntOpReceived; 443 /** Counts of number of buffers sent to App */ 444 OMX_U32 lcml_nCntApp; 445 /** Counts of number of buffers received from App */ 446 OMX_U32 app_nBuf; 447 448 /** Counts of number of output buffers reclaimed from lcml */ 449 OMX_U32 num_Reclaimed_Op_Buff; 450 /** Counts of number of input buffers sent to lcml */ 451 OMX_U32 num_Sent_Ip_Buff; 452 /** Counts of number of output buffers sent to lcml */ 453 OMX_U32 num_Op_Issued; 454 /** Holds the value of dasf mode, 1: DASF mode or 0: File Mode */ 455 OMX_U32 dasfmode; 456 457 OMX_STRING* sDeviceString; 458 459 /** This is LCML handle */ 460 OMX_HANDLETYPE pLcmlHandle; 461 462 /** Contains pointers to LCML Buffer Headers */ 463 G722D_LCML_BUFHEADERTYPE *pLcmlBufHeader[2]; 464 OMX_U32 bBufferIsAllocated; 465 466 /** Tells whether buffers on ports have been allocated */ 467 OMX_U32 bPortDefsAllocated; 468 /** Tells whether component thread has started */ 469 OMX_U32 bCompThreadStarted; 470 /** Marks the buffer data */ 471 OMX_PTR pMarkData; 472 /** Marks the buffer */ 473 OMX_MARKTYPE *pMarkBuf; 474 /** Marks the target component */ 475 OMX_HANDLETYPE hMarkTargetComponent; 476 /** Flag to track when input buffer's filled length is 0 */ 477 OMX_U32 bBypassDSP; 478 /** Input port enable flag */ 479 int ipPortEnableFlag; 480 /** Input port disble flag */ 481 int ipPortDisableFlag; 482 /** Pointer to port parameter structure */ 483 OMX_PORT_PARAM_TYPE* pPortParamType; 484 /** Pointer to port priority management structure */ 485 OMX_PRIORITYMGMTTYPE* pPriorityMgmt; 486 /** Contains the port related info of both the ports */ 487 G722D_AUDIODEC_PORT_TYPE *pCompPort[NUM_OF_PORTS]; 488 /* Checks whether or not buffer were allocated by appliction */ 489 int bufAlloced; 490 /** Flag to check about execution of component thread */ 491 OMX_U16 bExitCompThrd; 492 /** Pointer to list of input buffers */ 493 G722D_BUFFERLIST *pInputBufferList; 494 /** Pointer to list of output buffers */ 495 G722D_BUFFERLIST *pOutputBufferList; 496 /** it is used for component's create phase arguments */ 497 LCML_STRMATTR *strmAttr; 498 /** Contains the version information */ 499 OMX_U32 nVersion; 500 501 /** ACDN mode flag */ 502 OMX_U32 acdnmode; 503 504 /** Audio Stream ID */ 505 OMX_U32 streamID; 506 507 int nOpBit; 508 int bLcmlHandleOpened; 509 OMX_U32 nFillThisBufferCount; 510 /** Counts number of FillBufferDone calls*/ 511 OMX_U32 nFillBufferDoneCount; 512 /** Counts number of EmptyThisBuffer calls*/ 513 OMX_U32 nEmptyThisBufferCount; 514 /** Counts number of EmptyBufferDone calls*/ 515 OMX_U32 nEmptyBufferDoneCount; 516 /** Checks if component Init Params have been initialized */ 517 OMX_U32 bInitParamsInitialized; 518 G722D_BUFFERLIST *pInputBufferListQueue; 519 G722D_BUFFERLIST *pOutputBufferListQueue; 520 OMX_BUFFERHEADERTYPE *pInputBufHdrPending[MAX_NUM_OF_BUFS]; 521 OMX_U32 nNumInputBufPending; 522 OMX_BUFFERHEADERTYPE *pOutputBufHdrPending[MAX_NUM_OF_BUFS]; 523 OMX_U32 nNumOutputBufPending; 524 OMX_BUFFERHEADERTYPE *pOutBufHdrWhilePaused[MAX_NUM_OF_BUFS]; 525 OMX_U32 nPendingOutPausedBufs; 526 527 OMX_U32 bDisableCommandPending; 528 OMX_U32 bDisableCommandParam; 529 OMX_U32 nInvalidFrameCount; 530 OMX_U32 numPendingBuffers; 531 OMX_U32 bNoIdleOnStop; 532 OMX_U32 bDspStoppedWhileExecuting; 533 OMX_U32 bIdleCommandPending; 534 OMX_U32 nOutStandingFillDones; 535 536 #ifndef UNDER_CE 537 pthread_mutex_t AlloBuf_mutex; 538 pthread_cond_t AlloBuf_threshold; 539 OMX_U8 AlloBuf_waitingsignal; 540 541 pthread_mutex_t InLoaded_mutex; 542 pthread_cond_t InLoaded_threshold; 543 OMX_U8 InLoaded_readytoidle; 544 545 pthread_mutex_t InIdle_mutex; 546 pthread_cond_t InIdle_threshold; 547 OMX_U8 InIdle_goingtoloaded; 548 #else 549 OMX_Event AlloBuf_event; 550 OMX_U8 AlloBuf_waitingsignal; 551 552 OMX_Event InLoaded_event; 553 OMX_U8 InLoaded_readytoidle; 554 555 OMX_Event InIdle_event; 556 OMX_U8 InIdle_goingtoloaded; 557 #endif 558 559 OMX_BOOL bLoadedCommandPending; 560 OMX_PARAM_COMPONENTROLETYPE *componentRole; 561 OMX_VERSIONTYPE ComponentVersion; 562 OMX_STRING cComponentName; 563 564 /** Keep buffer timestamps **/ 565 OMX_S64 arrTimestamp[MAX_NUM_OF_BUFS]; 566 /** Keep buffer nTickCounts **/ 567 OMX_S64 arrTickCount[MAX_NUM_OF_BUFS]; 568 /** Index to arrTimestamp[], used for input buffer timestamps */ 569 OMX_U8 IpBufindex; 570 /** Index to arrTimestamp[], used for output buffer timestamps */ 571 OMX_U8 OpBufindex; 572 } G722DEC_COMPONENT_PRIVATE; 573 574 575 576 /* ================================================================================= * */ 577 /** 578 * OMX_ComponentInit() function is called by OMX Core to initialize the component 579 * with default values of the component. Before calling this function OMX_Init 580 * must have been called. 581 * 582 * @param *hComp This is component handle allocated by the OMX core. 583 * 584 * @pre OMX_Init should be called by application. 585 * 586 * @post Component has initialzed with default values. 587 * 588 * @return OMX_ErrorNone = Successful Inirialization of the component\n 589 * OMX_ErrorInsufficientResources = Not enough memory 590 * 591 * @see G722Dec_StartCompThread() 592 */ 593 /* ================================================================================ * */ 594 #ifndef UNDER_CE 595 OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp); 596 #else 597 /* WinCE Implicit Export Syntax */ 598 #define OMX_EXPORT __declspec(dllexport) 599 OMX_EXPORT OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp); 600 #endif 601 602 /* ================================================================================= * */ 603 /** 604 * G722Dec_StartCompThread() starts the component thread. This is internal 605 * function of the component. 606 * 607 * @param pHandle This is component handle allocated by the OMX core. 608 * 609 * @pre None 610 * 611 * @post None 612 * 613 * @return OMX_ErrorNone = Successful Inirialization of the component\n 614 * OMX_ErrorInsufficientResources = Not enough memory 615 * 616 * @see None 617 */ 618 /* ================================================================================ * */ 619 OMX_ERRORTYPE G722Dec_StartCompThread(OMX_HANDLETYPE pHandle); 620 621 /* ================================================================================= * */ 622 /** 623 * G722DEC_Fill_LCMLInitParams() fills the LCML initialization structure. 624 * 625 * @param pHandle This is component handle allocated by the OMX core. 626 * 627 * @param plcml_Init This structure is filled and sent to LCML. 628 * 629 * @pre None 630 * 631 * @post None 632 * 633 * @return OMX_ErrorNone = Successful Inirialization of the LCML struct. 634 * OMX_ErrorInsufficientResources = Not enough memory 635 * 636 * @see None 637 */ 638 /* ================================================================================ * */ 639 OMX_ERRORTYPE G722DEC_Fill_LCMLInitParams(OMX_HANDLETYPE pHandle, 640 LCML_DSP *plcml_Init, OMX_U16 arr[]); 641 642 /* ================================================================================= * */ 643 /** 644 * G722DEC_GetBufferDirection() function determines whether it is input buffer or 645 * output buffer. 646 * 647 * @param *pBufHeader This is pointer to buffer header whose direction needs to 648 * be determined. 649 * 650 * @param *eDir This is output argument which stores the direction of buffer. 651 * 652 * @pre None 653 * 654 * @post None 655 * 656 * @return OMX_ErrorNone = Successful processing. 657 * OMX_ErrorBadParameter = In case of invalid buffer 658 * 659 * @see None 660 */ 661 /* ================================================================================ * */ 662 OMX_ERRORTYPE G722DEC_GetBufferDirection(OMX_BUFFERHEADERTYPE *pBufHeader, 663 OMX_DIRTYPE *eDir); 664 665 /* ================================================================================= * */ 666 /** 667 * G722DEC_LCML_Callback() function is callback which is called by LCML whenever 668 * there is an even generated for the component. 669 * 670 * @param event This is event that was generated. 671 * 672 * @param arg This has other needed arguments supplied by LCML like handles 673 * etc. 674 * 675 * @pre None 676 * 677 * @post None 678 * 679 * @return OMX_ErrorNone = Successful processing. 680 * OMX_ErrorInsufficientResources = Not enough memory 681 * 682 * @see None 683 */ 684 /* ================================================================================ * */ 685 OMX_ERRORTYPE G722DEC_LCML_Callback (TUsnCodecEvent event,void * args [10]); 686 687 /* ================================================================================= * */ 688 /** 689 * G722DEC_HandleCommand() function handles the command sent by the application. 690 * All the state transitions, except from nothing to loaded state, of the 691 * component are done by this function. 692 * 693 * @param pComponentPrivate This is component's private date structure. 694 * 695 * @pre None 696 * 697 * @post None 698 * 699 * @return OMX_ErrorNone = Successful processing. 700 * OMX_ErrorInsufficientResources = Not enough memory 701 * OMX_ErrorHardware = Hardware error has occured lile LCML failed 702 * to do any said operartion. 703 * 704 * @see None 705 */ 706 /* ================================================================================ * */ 707 OMX_U32 G722DEC_HandleCommand (G722DEC_COMPONENT_PRIVATE *pComponentPrivate); 708 709 /* ================================================================================= * */ 710 /** 711 * G722DEC_HandleDataBuf_FromApp() function handles the input and output buffers 712 * that come from the application. It is not direct function wich gets called by 713 * the application rather, it gets called eventually. 714 * 715 * @param *pBufHeader This is the buffer header that needs to be processed. 716 * 717 * @param *pComponentPrivate This is component's private date structure. 718 * 719 * @pre None 720 * 721 * @post None 722 * 723 * @return OMX_ErrorNone = Successful processing. 724 * OMX_ErrorInsufficientResources = Not enough memory 725 * OMX_ErrorHardware = Hardware error has occured lile LCML failed 726 * to do any said operartion. 727 * 728 * @see None 729 */ 730 /* ================================================================================ * */ 731 OMX_ERRORTYPE G722DEC_HandleDataBuf_FromApp(OMX_BUFFERHEADERTYPE *pBufHeader, 732 G722DEC_COMPONENT_PRIVATE *pComponentPrivate); 733 734 /* ================================================================================= * */ 735 /** 736 * G722DEC_GetLCMLHandle() function gets the LCML handle and interacts with LCML 737 * by using this LCML Handle. 738 * 739 * @param *pBufHeader This is the buffer header that needs to be processed. 740 * 741 * @param *pComponentPrivate This is component's private date structure. 742 * 743 * @pre None 744 * 745 * @post None 746 * 747 * @return OMX_HANDLETYPE = Successful loading of LCML library. 748 * OMX_ErrorHardware = Hardware error has occured. 749 * 750 * @see None 751 */ 752 /* ================================================================================ * */ 753 OMX_HANDLETYPE G722DEC_GetLCMLHandle(G722DEC_COMPONENT_PRIVATE *pComponentPrivate); 754 755 /* ================================================================================= * */ 756 /** 757 * G722DEC_GetCorresponding_LCMLHeader() function gets the corresponding LCML 758 * header from the actual data buffer for required processing. 759 * 760 * @param *pBuffer This is the data buffer pointer. 761 * 762 * @param eDir This is direction of buffer. Input/Output. 763 * 764 * @param *G722D_LCML_BUFHEADERTYPE This is pointer to LCML Buffer Header. 765 * 766 * @pre None 767 * 768 * @post None 769 * 770 * @return OMX_ErrorNone = Successful Inirialization of the component\n 771 * OMX_ErrorHardware = Hardware error has occured. 772 * 773 * @see None 774 */ 775 /* ================================================================================ * */ 776 OMX_ERRORTYPE G722DEC_GetCorresponding_LCMLHeader(G722DEC_COMPONENT_PRIVATE *pComponentPrivate, 777 OMX_U8 *pBuffer, 778 OMX_DIRTYPE eDir, 779 G722D_LCML_BUFHEADERTYPE **ppLcmlHdr); 780 781 /* ================================================================================= * */ 782 /** 783 * G722DEC_FreeCompResources() function frees the component resources. 784 * 785 * @param pComponent This is the component handle. 786 * 787 * @pre None 788 * 789 * @post None 790 * 791 * @return OMX_ErrorNone = Successful Inirialization of the component\n 792 * OMX_ErrorHardware = Hardware error has occured. 793 * 794 * @see None 795 */ 796 /* ================================================================================ * */ 797 OMX_ERRORTYPE G722DEC_FreeCompResources(OMX_HANDLETYPE pComponent); 798 799 /* ================================================================================= * */ 800 /** 801 * G722DEC_CleanupInitParams() function frees only the initialization time 802 * memories allocated. For example, it will not close pipes, it will not free the 803 * memory allocated to the buffers etc. But it does free the memory of buffers 804 * utilized by the LCML etc. It is basically subset of G722DEC_FreeResources() 805 * function. 806 * 807 * @param pComponent This is the component handle. 808 * 809 * @pre None 810 * 811 * @post None 812 * 813 * @return OMX_ErrorNone = Successful Inirialization of the component\n 814 * 815 * @see None 816 */ 817 /* ================================================================================ * */ 818 void G722DEC_CleanupInitParams(OMX_HANDLETYPE pComponent); 819 820 /* ================================================================================= * */ 821 /** 822 * G722DEC_ComponentThread() This is component thread of the component which keeps 823 * running or lsitening from the application unless component is deinitialized 824 * from by the application i.e. component is transitioned from Idle to Loaded 825 * state. 826 * 827 * @param pHandle This is component handle allocated by the OMX core. 828 * 829 * @pre None 830 * 831 * @post None 832 * 833 * @return OMX_ErrorNone = Successful Inirialization of the component\n 834 * OMX_ErrorInsufficientResources = Not enough memory 835 * 836 * @see None 837 */ 838 /* ================================================================================ * */ 839 void* G722DEC_ComponentThread (void* pThreadData); 840 841 OMX_ERRORTYPE G722DECFill_LCMLInitParamsEx (OMX_HANDLETYPE pComponent); 842 void G722DEC_SetPending (G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber); 843 void G722DEC_ClearPending (G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber) ; 844 OMX_U32 G722DEC_IsPending (G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir); 845 OMX_U32 G722DEC_IsValid (G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U8 *pBuffer, OMX_DIRTYPE eDir) ; 846 void printEmmEvent (TUsnCodecEvent); 847 void* G722DEC_ComponentThread (void* pThreadData); 848 849 #ifndef OMX_G722_COMPONENTTHREAD__H 850 #define OMX_G722_COMPONENTTHREAD__H 851 852 #define EXIT_COMPONENT_THRD 10 853 #endif 854 855 #endif 856