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/* ==================================================================== */ 218typedef 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/* ============================================================================ * */ 236typedef 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/* ==================================================================== */ 247typedef 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/* ==================================================================== */ 258typedef 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/* ==================================================================== */ 270typedef 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/* ==================================================================== */ 283typedef 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/* ==================================================================== */ 293typedef 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/* ==================================================================== */ 315typedef 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/* ==================================================================== */ 336struct _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 346typedef struct _G722D_BUFFERLIST G722D_BUFFERLIST; 347 348#ifdef UNDER_CE 349#ifndef _OMX_EVENT_ 350#define _OMX_EVENT_ 351typedef struct OMX_Event { 352 HANDLE event; 353} OMX_Event; 354#endif 355int OMX_CreateEvent(OMX_Event *event); 356int OMX_SignalEvent(OMX_Event *event); 357int OMX_WaitForEvent(OMX_Event *event); 358int 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/* ==================================================================== */ 379typedef 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 595OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp); 596#else 597/* WinCE Implicit Export Syntax */ 598#define OMX_EXPORT __declspec(dllexport) 599OMX_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/* ================================================================================ * */ 619OMX_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/* ================================================================================ * */ 639OMX_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/* ================================================================================ * */ 662OMX_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/* ================================================================================ * */ 685OMX_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/* ================================================================================ * */ 707OMX_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/* ================================================================================ * */ 731OMX_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/* ================================================================================ * */ 753OMX_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/* ================================================================================ * */ 776OMX_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/* ================================================================================ * */ 797OMX_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/* ================================================================================ * */ 818void 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/* ================================================================================ * */ 839void* G722DEC_ComponentThread (void* pThreadData); 840 841OMX_ERRORTYPE G722DECFill_LCMLInitParamsEx (OMX_HANDLETYPE pComponent); 842void G722DEC_SetPending (G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber); 843void G722DEC_ClearPending (G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber) ; 844OMX_U32 G722DEC_IsPending (G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir); 845OMX_U32 G722DEC_IsValid (G722DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U8 *pBuffer, OMX_DIRTYPE eDir) ; 846void printEmmEvent (TUsnCodecEvent); 847void* 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