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_G726Decoder.h 30 * 31 * This is an header file for an audio G726 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\g726_dec\inc\ 37 * 38 * @rev 1.0 39 */ 40/* --------------------------------------------------------------------------- */ 41 42 43#ifndef OMX_G726DEC_UTILS__H 44#define OMX_G726DEC_UTILS__H 45 46#include <OMX_Component.h> 47#include "LCML_DspCodec.h" 48 49#ifdef UNDER_CE 50#include <windows.h> 51#include <oaf_osal.h> 52#include <omx_core.h> 53#include <stdlib.h> 54#else 55#include <pthread.h> 56#ifdef RESOURCE_MANAGER_ENABLED 57#include <ResourceManagerProxyAPI.h> 58#endif 59#endif 60 61 62#undef G726DEC_DEBUG /* See all debug statement of the component */ 63#undef G726DEC_MEMDETAILS /* See memory details of the component */ 64#undef G726DEC_BUFDETAILS /* See buffers details of the component */ 65#undef G726DEC_STATEDETAILS /* See all state transitions of the component */ 66 67#define MAX_NUM_OF_BUFS 4 /* Max number of buffers used */ 68#define G726D_NUM_INPUT_BUFFERS 1 /* Default number of input buffers */ 69#define G726D_NUM_OUTPUT_BUFFERS 1 /* Default number of output buffers */ 70#define G726D_INPUT_BUFFER_SIZE 20 /* Default size of input buffer */ 71#define G726D_OUTPUT_BUFFER_SIZE 320 /* Default size of output buffer */ 72#define NUM_OF_PORTS 2 /* Number of ports of component */ 73#define INVALID_SAMPLING_FREQ 51 74#define EXIT_COMPONENT_THRD 10 75#define G726DEC_MAJOR_VER 1 /* Majer version of the component */ 76#define G726DEC_MINOR_VER 1 /* Minor version of the component */ 77#define G726DEC_BUFHEADER_VERSION 0x0 /* Version of the buffer header struct */ 78#define NOT_USED 10 /* To specify that a particulat field is not used */ 79#define NORMAL_BUFFER 0 /* Marks a buffer as normal buffer i.e. not last buffer */ 80#define OMX_G726DEC_DEFAULT_SEGMENT (0) /* Default segment ID */ 81#define OMX_G726DEC_SN_TIMEOUT (-1) /* timeout, wait until ack is received */ 82#define OMX_G726DEC_SN_PRIORITY (10) /* Priority used by DSP */ 83#define G726DEC_CPU 50 /* TBD, 50MHz for the moment */ 84 85 86/* G726 frame size IN BYTES */ 87#define SPEECH16_FRAME_SIZE 20 88#define SPEECH24_FRAME_SIZE 30 89#define SPEECH32_FRAME_SIZE 40 90#define SPEECH40_FRAME_SIZE 50 91 92/* G726 frame type */ 93#define SPEECH63_FRAME_TYPE 0 /* No tx frame */ 94#define SPEECH53_FRAME_TYPE 1 /* Speech Frame flag */ 95#define SID_FRAME_TYPE 2 /* SID frame flag */ 96#define NODATA_FRAME 3 /* Erasure frame flag */ 97 98#ifdef UNDER_CE 99#define USN_DLL_NAME "\\windows\\usn.dll64P" /* Path of USN DLL */ 100#define G726DEC_DLL_NAME "\\windows\\g726dec_sn.dll64P" /* Path of G726 SN DLL */ 101#else 102#define USN_DLL_NAME "usn.dll64P" /* Path of USN DLL */ 103#define G726DEC_DLL_NAME "g726dec_sn.dll64P" /* Path of G726 SN DLL */ 104#endif 105 106#define DONT_CARE 0 /* Value unused or ignored */ 107#define G726DEC_BUFDETAILS 108/** Default timeout used to come out of blocking calls*/ 109#define G726D_TIMEOUT 1 /* seconds */ 110 111#ifdef UNDER_CE 112 113#ifdef DEBUG 114#define G726DEC_DPRINT printf 115#define G726DEC_EPRINT printf 116#define G726DEC_MEMPRINT printf 117#define G726DEC_STATEPRINT printf 118#define G726DEC_BUFPRINT printf 119#else 120#define G726DEC_DPRINT 121#define G726DEC_EPRINT 122#define G726DEC_MEMPRINT 123#define G726DEC_STATEPRINT 124#define G726DEC_BUFPRINT 125#endif 126 127#else /* for Linux */ 128 129#ifdef G726DEC_DEBUG 130 131#define G726DEC_DPRINT(...) fprintf(stdout, "%s %d:: ",__FUNCTION__, __LINE__); \ 132 fprintf(stdout, __VA_ARGS__); \ 133 fprintf(stdout, "\n"); 134 135#define G726DEC_BUFPRINT printf 136#define G726DEC_MEMPRINT printf 137#define G726DEC_STATEPRINT printf 138 139#else 140#define G726DEC_DPRINT(...) 141 142#ifdef G726DEC_STATEDETAILS 143#define G726DEC_STATEPRINT printf 144#else 145#define G726DEC_STATEPRINT(...) 146#endif 147 148#ifdef G726DEC_BUFDETAILS 149#define G726DEC_BUFPRINT printf 150#else 151#define G726DEC_BUFPRINT(...) 152#endif 153 154#ifdef G726DEC_MEMDETAILS 155#define G726DEC_MEMPRINT(...) fprintf(stdout, "%s %d:: ",__FUNCTION__, __LINE__); \ 156 fprintf(stdout, __VA_ARGS__); \ 157 fprintf(stdout, "\n"); 158#else 159#define G726DEC_MEMPRINT(...) 160#endif 161 162#endif 163 164#define G726DEC_EPRINT(...) fprintf(stdout, "%s %s %d:: ", __FILE__,__FUNCTION__, __LINE__); \ 165 fprintf(stdout, __VA_ARGS__); \ 166 fprintf(stdout, "\n"); 167 168#endif /*for UNDER_CE*/ 169 170#define G726D_OMX_MALLOC(_pStruct_, _sName_) \ 171 _pStruct_ = (_sName_*)malloc(sizeof(_sName_)); \ 172 if(_pStruct_ == NULL){ \ 173 printf("***********************************\n"); \ 174 printf("%d :: Malloc Failed\n",__LINE__); \ 175 printf("***********************************\n"); \ 176 eError = OMX_ErrorInsufficientResources; \ 177 goto EXIT; \ 178 } \ 179 memset(_pStruct_,0,sizeof(_sName_)); \ 180 G726DEC_MEMPRINT("%d :: Malloced = %p\n",__LINE__,_pStruct_); 181 182 183 184#define G726D_OMX_MALLOC_SIZE(_ptr_, _size_,_name_) \ 185 _ptr_ = (_name_ *)malloc(_size_); \ 186 if(_ptr_ == NULL){ \ 187 printf("***********************************\n"); \ 188 printf("%d :: Malloc Failed\n",__LINE__); \ 189 printf("***********************************\n"); \ 190 eError = OMX_ErrorInsufficientResources; \ 191 goto EXIT; \ 192 } \ 193 memset(_ptr_,0,_size_); \ 194 G726DEC_MEMPRINT("%d :: Malloced = %p\n",__LINE__,_ptr_); 195 196#define G726D_OMX_ERROR_EXIT(_e_, _c_, _s_) \ 197 _e_ = _c_; \ 198 printf("\n**************** OMX ERROR ************************\n"); \ 199 printf("%d : Error Name: %s : Error Num = %x",__LINE__, _s_, _e_); \ 200 printf("\n**************** OMX ERROR ************************\n"); \ 201 goto EXIT; 202 203 204#define G726D_OMX_CONF_CHECK_CMD(_ptr1, _ptr2, _ptr3) \ 205 { \ 206 if(!_ptr1 || !_ptr2 || !_ptr3){ \ 207 eError = OMX_ErrorBadParameter; \ 208 goto EXIT; \ 209 } \ 210 } 211 212#define G726D_OMX_FREE(ptr) \ 213 if(NULL != ptr) { \ 214 G726DEC_MEMPRINT("%d :: Freeing Address = %p\n",__LINE__,ptr); \ 215 free(ptr); \ 216 ptr = NULL; \ 217 } 218 219#define OMX_CONF_INIT_STRUCT(_s_, _name_) \ 220 memset((_s_), 0x0, sizeof(_name_)); \ 221 (_s_)->nSize = sizeof(_name_); \ 222 (_s_)->nVersion.s.nVersionMajor = 0x1; \ 223 (_s_)->nVersion.s.nVersionMinor = 0x1; \ 224 (_s_)->nVersion.s.nRevision = 0x0; \ 225 (_s_)->nVersion.s.nStep = 0x0 226 227 228/* ======================================================================= */ 229/** OMX_G726DEC_INDEXAUDIOTYPE Defines the custom configuration settings 230 * for the component 231 * 232 * @param OMX_IndexCustomG726DecModeDasfConfig Sets the DASF mode 233 * 234 */ 235/* ==================================================================== */ 236typedef enum OMX_G726DEC_INDEXAUDIOTYPE { 237 /*OMX_IndexCustomG726DecModeDasfConfig = OMX_IndexIndexVendorStartUnused + 1,*/ 238 OMX_IndexCustomG726DecModeDasfConfig = 0xFF000001, 239 OMX_IndexCustomG726DecHeaderInfoConfig, 240 OMX_IndexCustomG726DecStreamIDConfig, 241 OMX_IndexCustomG726DecDataPath 242}OMX_G726DEC_INDEXAUDIOTYPE; 243 244 245/* ============================================================================== * */ 246/** G726D_COMP_PORT_TYPE describes the input and output port of indices of the 247 * component. 248 * 249 * @param G726D_INPUT_PORT Input port index 250 * 251 * @param G726D_OUTPUT_PORT Output port index 252 */ 253/* ============================================================================ * */ 254typedef enum G726D_COMP_PORT_TYPE { 255 G726D_INPUT_PORT = 0, 256 G726D_OUTPUT_PORT 257}G726D_COMP_PORT_TYPE; 258 259/* ======================================================================= */ 260/** G726DEC_ParamStruct: This struct is passed with input buffers that 261 * are sent to DSP. 262 */ 263/* ==================================================================== */ 264typedef struct { 265 /* Set to 1 if buffer is last buffer */ 266 unsigned long usLastFrame; 267}G726DEC_FrameStruct; 268 269 270/* ======================================================================= */ 271/** G726DEC_UAlgInBufParamStruct: This struct is passed with input buffers that 272 * are sent to DSP. 273 */ 274/* ==================================================================== */ 275typedef struct { 276 /* Set to 1 if buffer is last buffer */ 277 unsigned short bLastBuffer; 278}G726DEC_UAlgInBufParamStruct; 279 280 281/* ======================================================================= */ 282/** G726D_USN_AudioCodecParams: This contains the information which does to Codec 283 * on DSP 284 * are sent to DSP. 285 */ 286/* ==================================================================== */ 287typedef struct USN_AudioCodecParams{ 288 /* Specifies the sample frequency */ 289 unsigned long ulSamplingFreq; 290 /* Specifies the UUID */ 291 unsigned long unUUID; 292 /* Specifies the audio format */ 293 unsigned short unAudioFormat; 294}G726D_USN_AudioCodecParams; 295 296/* ======================================================================= */ 297/** G726DEC_UAlgOutBufParamStruct: This is passed with output buffer to DSP. 298 */ 299/* ==================================================================== */ 300typedef struct { 301 /* Number of frames in a buffer */ 302 unsigned long ulFrameCount; 303}G726DEC_UAlgOutBufParamStruct; 304 305/* ======================================================================= */ 306/** G726D_LCML_BUFHEADERTYPE: This is LCML buffer header which is sent to LCML 307 * for both input and output buffers. 308 */ 309/* ==================================================================== */ 310typedef struct G726D_LCML_BUFHEADERTYPE { 311 /* Direction whether input or output buffer */ 312 OMX_DIRTYPE eDir; 313 /* Pointer to OMX Buffer Header */ 314 OMX_BUFFERHEADERTYPE *pBufHdr; 315 /* Other parameters, may be useful for enhancements */ 316 void *pOtherParams[10]; 317 /* Input Parameter Information structure */ 318 G726DEC_UAlgInBufParamStruct *pFrameParam; 319}G726D_LCML_BUFHEADERTYPE; 320 321/* ======================================================================= */ 322/** G726D_AUDIODEC_PORT_TYPE: This contains component port information. 323 * 324 * @see OMX_AUDIO_PARAM_PORTFORMATTYPE 325 */ 326/* ==================================================================== */ 327typedef struct AUDIODEC_PORT_TYPE { 328 /* Used in tunneling, this is handle of tunneled component */ 329 OMX_HANDLETYPE hTunnelComponent; 330 /* Port which has to be tunneled */ 331 OMX_U32 nTunnelPort; 332 /* Buffer Supplier Information */ 333 OMX_BUFFERSUPPLIERTYPE eSupplierSetting; 334 /* Number of buffers */ 335 OMX_U8 nBufferCnt; 336 /* Port format information */ 337 OMX_AUDIO_PARAM_PORTFORMATTYPE* pPortFormat; 338} G726D_AUDIODEC_PORT_TYPE; 339 340 341/* ======================================================================= */ 342/** _G726D_BUFFERLIST: This contains information about a buffer's owner whether 343 * it is application or component, number of buffers owned etc. 344 * 345 * @see OMX_BUFFERHEADERTYPE 346 */ 347/* ==================================================================== */ 348struct _G726D_BUFFERLIST{ 349 /* Array of pointer to OMX buffer headers */ 350 OMX_BUFFERHEADERTYPE *pBufHdr[MAX_NUM_OF_BUFS]; 351 /* Array that tells about owner of each buffer */ 352 OMX_U32 bufferOwner[MAX_NUM_OF_BUFS]; 353 OMX_U32 bBufferPending[MAX_NUM_OF_BUFS]; 354 /* Number of buffers */ 355 OMX_U32 numBuffers; 356}; 357 358typedef struct _G726D_BUFFERLIST G726D_BUFFERLIST; 359 360#ifdef UNDER_CE 361#ifndef _OMX_EVENT_ 362#define _OMX_EVENT_ 363typedef struct OMX_Event { 364 HANDLE event; 365} OMX_Event; 366#endif 367int OMX_CreateEvent(OMX_Event *event); 368int OMX_SignalEvent(OMX_Event *event); 369int OMX_WaitForEvent(OMX_Event *event); 370int OMX_DestroyEvent(OMX_Event *event); 371#endif 372 373/* ======================================================================= */ 374/** G726DEC_COMPONENT_PRIVATE: This is the major and main structure of the 375 * component which contains all type of information of buffers, ports etc 376 * contained in the component. 377 * 378 * @see OMX_BUFFERHEADERTYPE 379 * @see OMX_AUDIO_PARAM_PORTFORMATTYPE 380 * @see OMX_PARAM_PORTDEFINITIONTYPE 381 * @see G726D_LCML_BUFHEADERTYPE 382 * @see OMX_PORT_PARAM_TYPE 383 * @see OMX_PRIORITYMGMTTYPE 384 * @see G726D_AUDIODEC_PORT_TYPE 385 * @see G726D_BUFFERLIST 386 * @see G726D_AUDIODEC_PORT_TYPE 387 * @see LCML_STRMATTR 388 * @see 389 */ 390/* ==================================================================== */ 391typedef struct G726DEC_COMPONENT_PRIVATE 392{ 393 /** Handle for use with async callbacks */ 394 OMX_CALLBACKTYPE cbInfo; 395 396 /* Component port information */ 397 OMX_PORT_PARAM_TYPE *sPortParam; 398 399 /* Input port information */ 400 OMX_AUDIO_PARAM_PORTFORMATTYPE sInPortFormat; 401 402 /* Output port information */ 403 OMX_AUDIO_PARAM_PORTFORMATTYPE sOutPortFormat; 404 405 /* Buffer owner information */ 406 OMX_U32 bIsBufferOwned[NUM_OF_PORTS]; 407 408 /** Number of input buffers at runtime */ 409 OMX_U32 nRuntimeInputBuffers; 410 411 /** Number of output buffers at runtime */ 412 OMX_U32 nRuntimeOutputBuffers; 413 414 /* Audio codec parameters structure */ 415 G726D_USN_AudioCodecParams *pParams; 416 417 /** This will contain info like how many buffers 418 are there for input/output ports, their size etc, but not 419 BUFFERHEADERTYPE POINTERS. */ 420 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef[NUM_OF_PORTS]; 421 422 /* Contains information that come from application */ 423 OMX_AUDIO_PARAM_G726TYPE* G726Params; 424 425 /* Contains information that come from application */ 426 OMX_AUDIO_PARAM_PCMMODETYPE* PcmParams; 427 428 /** This is component handle */ 429 OMX_COMPONENTTYPE* pHandle; 430 431 /** Current state of this component */ 432 OMX_STATETYPE curState; 433 434 /** The component thread handle */ 435 pthread_t ComponentThread; 436 437 /** The pipes for sending buffers to the thread */ 438 int dataPipe[2]; 439 440 /** The pipes for sending buffers to the thread */ 441 int cmdPipe[2]; 442 443 /** The pipes for sending command data to the thread */ 444 int cmdDataPipe[2]; 445 446 /** The pipes for sending buffers to the thread */ 447 int lcml_Pipe[2]; 448 449 /** Set to indicate component is stopping */ 450 OMX_U32 bIsEOFSent; 451 452 /** Count of number of buffers outstanding with bridge */ 453 OMX_U32 lcml_nIpBuf; 454 455 /** Count of number of buffers outstanding with bridge */ 456 OMX_U32 lcml_nOpBuf; 457 458 /** Counts of number of input buffers sent to LCML */ 459 OMX_U32 lcml_nCntIp; 460 461 /** Counts of number of input buffers received from LCML */ 462 OMX_U32 lcml_nCntIpRes; 463 464 /** Counts of number of output buffers sent to LCML */ 465 OMX_U32 lcml_nCntOp; 466 467 /** Counts of number of output buffers received from LCML */ 468 OMX_U32 lcml_nCntOpReceived; 469 470 /** Counts of number of buffers sent to App */ 471 OMX_U32 lcml_nCntApp; 472 473 /** Counts of number of buffers received from App */ 474 OMX_U32 app_nBuf; 475 476 /** Counts of number of output buffers reclaimed from lcml */ 477 OMX_U32 num_Reclaimed_Op_Buff; 478 479 /** Counts of number of input buffers sent to lcml */ 480 OMX_U32 num_Sent_Ip_Buff; 481 482 /** Counts of number of output buffers sent to lcml */ 483 OMX_U32 num_Op_Issued; 484 485 /** Holds the value of dasf mode, 1: DASF mode or 0: File Mode */ 486 OMX_U32 dasfmode; 487 488 /* contains the value indicating if linear or rtp is used */ 489 OMX_U32 packingType; 490 491 /* contains the string for the hardware device */ 492 OMX_STRING* sDeviceString; 493 494 /** This is LCML handle */ 495 OMX_HANDLETYPE pLcmlHandle; 496 497 /** Contains pointers to LCML Buffer Headers */ 498 G726D_LCML_BUFHEADERTYPE *pLcmlBufHeader[2]; 499 500 /*contains a flag for if the buffers are allocated */ 501 OMX_U32 bBufferIsAllocated; 502 503 /** Tells whether buffers on ports have been allocated */ 504 OMX_U32 bPortDefsAllocated; 505 506 /** Tells whether component thread has started */ 507 OMX_U32 bCompThreadStarted; 508 509 /** Marks the buffer data */ 510 OMX_PTR pMarkData; 511 512 /** Marks the buffer */ 513 OMX_MARKTYPE *pMarkBuf; 514 515 /** Marks the target component */ 516 OMX_HANDLETYPE hMarkTargetComponent; 517 518 /** Flag to track when input buffer's filled length is 0 */ 519 OMX_U32 bBypassDSP; 520 521 /** Input port enable flag */ 522 int ipPortEnableFlag; 523 524 /** Input port disble flag */ 525 int ipPortDisableFlag; 526 527 /** Pointer to port parameter structure */ 528 OMX_PORT_PARAM_TYPE* pPortParamType; 529 530 /** Pointer to port priority management structure */ 531 OMX_PRIORITYMGMTTYPE* pPriorityMgmt; 532 533 /** Contains the port related info of both the ports */ 534 G726D_AUDIODEC_PORT_TYPE *pCompPort[NUM_OF_PORTS]; 535 536 /* Checks whether or not buffer were allocated by appliction */ 537 int bufAlloced; 538 539 /** Flag to check about execution of component thread */ 540 OMX_U16 bExitCompThrd; 541 542 /** Pointer to list of input buffers */ 543 G726D_BUFFERLIST *pInputBufferList; 544 545 /** Pointer to list of output buffers */ 546 G726D_BUFFERLIST *pOutputBufferList; 547 548 /** it is used for component's create phase arguments */ 549 LCML_STRMATTR *strmAttr; 550 551 /** Contains the version information */ 552 OMX_U32 nVersion; 553 554 /** ACDN mode flag */ 555 OMX_U32 acdnmode; 556 557 /** Audio Stream ID */ 558 OMX_U32 streamID; 559 560 /* flag if the lcml handle is opened */ 561 int bLcmlHandleOpened; 562 563 /* counts the calls to FillThisBuffer() */ 564 OMX_U32 nFillThisBufferCount; 565 566 /** Counts number of FillBufferDone calls*/ 567 OMX_U32 nFillBufferDoneCount; 568 569 /** Counts number of EmptyThisBuffer calls*/ 570 OMX_U32 nEmptyThisBufferCount; 571 572 /** Counts number of EmptyBufferDone calls*/ 573 OMX_U32 nEmptyBufferDoneCount; 574 575 /** Checks if component Init Params have been initialized */ 576 OMX_U32 bInitParamsInitialized; 577 578 /* list of input buffers */ 579 G726D_BUFFERLIST *pInputBufferListQueue; 580 581 /* list of output buffers */ 582 G726D_BUFFERLIST *pOutputBufferListQueue; 583 584 /* array of pending input buffers headers */ 585 OMX_BUFFERHEADERTYPE *pInputBufHdrPending[MAX_NUM_OF_BUFS]; 586 587 /* number of pending input buffers */ 588 OMX_U32 nNumInputBufPending; 589 590 /* array of pending output buffers */ 591 OMX_BUFFERHEADERTYPE *pOutputBufHdrPending[MAX_NUM_OF_BUFS]; 592 593 /* number of pending output buffers */ 594 OMX_U32 nNumOutputBufPending; 595 596 /* array of buffers received while paused */ 597 OMX_BUFFERHEADERTYPE *pOutBufHdrWhilePaused[MAX_NUM_OF_BUFS]; 598 599 /* number of buffers received while paused */ 600 OMX_U32 nPendingOutPausedBufs; 601 602 /* flag if disable port command is pending */ 603 OMX_U32 bDisableCommandPending; 604 605 /* params for disable port command */ 606 OMX_U32 bDisableCommandParam; 607 608 /* number of invalid frames received */ 609 OMX_U32 nInvalidFrameCount; 610 611 /* number of pending buffers */ 612 OMX_U32 numPendingBuffers; 613 614 /* flag for if component should go to idle state when stopped */ 615 OMX_U32 bNoIdleOnStop; 616 617 /* flag for if dsp is stopped while component is in executing state */ 618 OMX_U32 bDspStoppedWhileExecuting; 619 620 /* flag for if transition to idle state is pending */ 621 OMX_U32 bIdleCommandPending; 622 623 /* number of FillThisBuffer calls pending */ 624 OMX_U32 nOutStandingFillDones; 625 626 /* coutns the number of unhandled FillThisBuffer() calls */ 627 OMX_U8 nUnhandledFillThisBuffers; 628 629 /* coutns the number of unhandled EmptyThisBuffer() calls */ 630 OMX_U8 nUnhandledEmptyThisBuffers; 631 632 /* flag if the flush command is pending in Output Port */ 633 OMX_BOOL bFlushOutputPortCommandPending; 634 635 /* flag if the flush command is pending in Output Port */ 636 OMX_BOOL bFlushInputPortCommandPending; 637 638#ifndef UNDER_CE 639 /* mutex for allocating buffers */ 640 pthread_mutex_t AlloBuf_mutex; 641 pthread_cond_t AlloBuf_threshold; 642 OMX_U8 AlloBuf_waitingsignal; 643 644 /*mutex for transition from loaded state to idle state */ 645 pthread_mutex_t InLoaded_mutex; 646 pthread_cond_t InLoaded_threshold; 647 OMX_U8 InLoaded_readytoidle; 648 649 /* mutex for transition from idle state to loaded state */ 650 pthread_mutex_t InIdle_mutex; 651 pthread_cond_t InIdle_threshold; 652 OMX_U8 InIdle_goingtoloaded; 653#else 654 OMX_Event AlloBuf_event; 655 OMX_U8 AlloBuf_waitingsignal; 656 657 OMX_Event InLoaded_event; 658 OMX_U8 InLoaded_readytoidle; 659 660 OMX_Event InIdle_event; 661 OMX_U8 InIdle_goingtoloaded; 662#endif 663 664 /* flag if transition to loaded is pending */ 665 OMX_BOOL bLoadedCommandPending; 666 667 /* contains the OMX defined role of the component */ 668 /* not used in non-standard components */ 669 OMX_PARAM_COMPONENTROLETYPE *componentRole; 670 671 /* describes the OMX_IL version inluding major, minor */ 672 OMX_VERSIONTYPE ComponentVersion; 673 674 /* holds the name of the component */ 675 OMX_STRING cComponentName; 676 677 /** Keep buffer timestamps **/ 678 OMX_S64 arrTimestamp[MAX_NUM_OF_BUFS]; 679 680 /** Keep buffer tick count **/ 681 OMX_S64 arrTickCount[MAX_NUM_OF_BUFS]; 682 683 /** Index to arrBufIndex[], used for input buffer timestamps */ 684 OMX_U8 IpBufindex; 685 686 /** Index to arrBufIndex[], used for output buffer timestamps */ 687 OMX_U8 OpBufindex; 688 689 /* flag if the component is preempted for resource or policy reasons */ 690 OMX_BOOL bPreempted; 691 692 /** Pointer to RM callback **/ 693#ifdef RESOURCE_MANAGER_ENABLED 694 RMPROXY_CALLBACKTYPE rmproxyCallback; 695#endif 696 697 698} G726DEC_COMPONENT_PRIVATE; 699 700 701 702/* ================================================================================= * */ 703/** 704 * OMX_ComponentInit() function is called by OMX Core to initialize the component 705 * with default values of the component. Before calling this function OMX_Init 706 * must have been called. 707 * 708 * @param *hComp This is component handle allocated by the OMX core. 709 * 710 * @pre OMX_Init should be called by application. 711 * 712 * @post Component has initialzed with default values. 713 * 714 * @return OMX_ErrorNone = Successful Inirialization of the component\n 715 * OMX_ErrorInsufficientResources = Not enough memory 716 * 717 * @see G726Dec_StartCompThread() 718 */ 719/* ================================================================================ * */ 720#ifndef UNDER_CE 721OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp); 722#else 723/* WinCE Implicit Export Syntax */ 724#define OMX_EXPORT __declspec(dllexport) 725OMX_EXPORT OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp); 726#endif 727 728/* ================================================================================= * */ 729/** 730 * G726Dec_StartCompThread() starts the component thread. This is internal 731 * function of the component. 732 * 733 * @param pHandle This is component handle allocated by the OMX core. 734 * 735 * @pre None 736 * 737 * @post None 738 * 739 * @return OMX_ErrorNone = Successful Inirialization of the component\n 740 * OMX_ErrorInsufficientResources = Not enough memory 741 * 742 * @see None 743 */ 744/* ================================================================================ * */ 745OMX_ERRORTYPE G726Dec_StartCompThread(OMX_HANDLETYPE pHandle); 746 747/* ================================================================================= * */ 748/** 749 * G726DEC_Fill_LCMLInitParams() fills the LCML initialization structure. 750 * 751 * @param pHandle This is component handle allocated by the OMX core. 752 * 753 * @param plcml_Init This structure is filled and sent to LCML. 754 * 755 * @pre None 756 * 757 * @post None 758 * 759 * @return OMX_ErrorNone = Successful Inirialization of the LCML struct. 760 * OMX_ErrorInsufficientResources = Not enough memory 761 * 762 * @see None 763 */ 764/* ================================================================================ * */ 765OMX_ERRORTYPE G726DEC_Fill_LCMLInitParams(OMX_HANDLETYPE pHandle, 766 LCML_DSP *plcml_Init, OMX_U16 arr[]); 767 768/* ================================================================================= * */ 769/** 770 * G726DEC_GetBufferDirection() function determines whether it is input buffer or 771 * output buffer. 772 * 773 * @param *pBufHeader This is pointer to buffer header whose direction needs to 774 * be determined. 775 * 776 * @param *eDir This is output argument which stores the direction of buffer. 777 * 778 * @pre None 779 * 780 * @post None 781 * 782 * @return OMX_ErrorNone = Successful processing. 783 * OMX_ErrorBadParameter = In case of invalid buffer 784 * 785 * @see None 786 */ 787/* ================================================================================ * */ 788OMX_ERRORTYPE G726DEC_GetBufferDirection(OMX_BUFFERHEADERTYPE *pBufHeader, 789 OMX_DIRTYPE *eDir); 790 791/* ================================================================================= * */ 792/** 793 * G726DEC_LCML_Callback() function is callback which is called by LCML whenever 794 * there is an even generated for the component. 795 * 796 * @param event This is event that was generated. 797 * 798 * @param arg This has other needed arguments supplied by LCML like handles 799 * etc. 800 * 801 * @pre None 802 * 803 * @post None 804 * 805 * @return OMX_ErrorNone = Successful processing. 806 * OMX_ErrorInsufficientResources = Not enough memory 807 * 808 * @see None 809 */ 810/* ================================================================================ * */ 811OMX_ERRORTYPE G726DEC_LCML_Callback (TUsnCodecEvent event,void * args [10]); 812 813/* ================================================================================= * */ 814/** 815 * G726DEC_HandleCommand() function handles the command sent by the application. 816 * All the state transitions, except from nothing to loaded state, of the 817 * component are done by this function. 818 * 819 * @param pComponentPrivate This is component's private date structure. 820 * 821 * @pre None 822 * 823 * @post None 824 * 825 * @return OMX_ErrorNone = Successful processing. 826 * OMX_ErrorInsufficientResources = Not enough memory 827 * OMX_ErrorHardware = Hardware error has occured lile LCML failed 828 * to do any said operartion. 829 * 830 * @see None 831 */ 832/* ================================================================================ * */ 833OMX_U32 G726DEC_HandleCommand (G726DEC_COMPONENT_PRIVATE *pComponentPrivate); 834 835/* ================================================================================= * */ 836/** 837 * G726DEC_HandleDataBuf_FromApp() function handles the input and output buffers 838 * that come from the application. It is not direct function wich gets called by 839 * the application rather, it gets called eventually. 840 * 841 * @param *pBufHeader This is the buffer header that needs to be processed. 842 * 843 * @param *pComponentPrivate This is component's private date structure. 844 * 845 * @pre None 846 * 847 * @post None 848 * 849 * @return OMX_ErrorNone = Successful processing. 850 * OMX_ErrorInsufficientResources = Not enough memory 851 * OMX_ErrorHardware = Hardware error has occured lile LCML failed 852 * to do any said operartion. 853 * 854 * @see None 855 */ 856/* ================================================================================ * */ 857OMX_ERRORTYPE G726DEC_HandleDataBuf_FromApp(OMX_BUFFERHEADERTYPE *pBufHeader, 858 G726DEC_COMPONENT_PRIVATE *pComponentPrivate); 859 860/* ================================================================================= * */ 861 862/* ================================================================================= * */ 863/** 864 * G726DEC_GetLCMLHandle() function gets the LCML handle and interacts with LCML 865 * by using this LCML Handle. 866 * 867 * @param *pBufHeader This is the buffer header that needs to be processed. 868 * 869 * @param *pComponentPrivate This is component's private date structure. 870 * 871 * @pre None 872 * 873 * @post None 874 * 875 * @return OMX_HANDLETYPE = Successful loading of LCML library. 876 * OMX_ErrorHardware = Hardware error has occured. 877 * 878 * @see None 879 */ 880/* ================================================================================ * */ 881OMX_HANDLETYPE G726DEC_GetLCMLHandle(G726DEC_COMPONENT_PRIVATE *pComponentPrivate); 882 883/* ================================================================================= * */ 884/** 885 * G726DEC_GetCorresponding_LCMLHeader() function gets the corresponding LCML 886 * header from the actual data buffer for required processing. 887 * 888 * @param *pBuffer This is the data buffer pointer. 889 * 890 * @param eDir This is direction of buffer. Input/Output. 891 * 892 * @param *G726D_LCML_BUFHEADERTYPE This is pointer to LCML Buffer Header. 893 * 894 * @pre None 895 * 896 * @post None 897 * 898 * @return OMX_ErrorNone = Successful Inirialization of the component\n 899 * OMX_ErrorHardware = Hardware error has occured. 900 * 901 * @see None 902 */ 903/* ================================================================================ * */ 904OMX_ERRORTYPE G726DEC_GetCorresponding_LCMLHeader(G726DEC_COMPONENT_PRIVATE *pComponentPrivate, 905 OMX_U8 *pBuffer, 906 OMX_DIRTYPE eDir, 907 G726D_LCML_BUFHEADERTYPE **ppLcmlHdr); 908 909/* ================================================================================= * */ 910/** 911 * G726DEC_FreeCompResources() function frees the component resources. 912 * 913 * @param pComponent This is the component handle. 914 * 915 * @pre None 916 * 917 * @post None 918 * 919 * @return OMX_ErrorNone = Successful Inirialization of the component\n 920 * OMX_ErrorHardware = Hardware error has occured. 921 * 922 * @see None 923 */ 924/* ================================================================================ * */ 925OMX_ERRORTYPE G726DEC_FreeCompResources(OMX_HANDLETYPE pComponent); 926 927/* ================================================================================= * */ 928/** 929 * G726DEC_CleanupInitParams() function frees only the initialization time 930 * memories allocated. For example, it will not close pipes, it will not free the 931 * memory allocated to the buffers etc. But it does free the memory of buffers 932 * utilized by the LCML etc. It is basically subset of G726DEC_FreeResources() 933 * function. 934 * 935 * @param pComponent This is the component handle. 936 * 937 * @pre None 938 * 939 * @post None 940 * 941 * @return OMX_ErrorNone = Successful Inirialization of the component\n 942 * 943 * @see None 944 */ 945/* ================================================================================ * */ 946void G726DEC_CleanupInitParams(OMX_HANDLETYPE pComponent); 947 948/* ================================================================================= * */ 949/** 950 * G726DEC_ComponentThread() This is component thread of the component which keeps 951 * running or lsitening from the application unless component is deinitialized 952 * from by the application i.e. component is transitioned from Idle to Loaded 953 * state. 954 * 955 * @param pHandle This is component handle allocated by the OMX core. 956 * 957 * @pre None 958 * 959 * @post None 960 * 961 * @return OMX_ErrorNone = Successful Inirialization of the component\n 962 * OMX_ErrorInsufficientResources = Not enough memory 963 * 964 * @see None 965 */ 966/* ================================================================================ * */ 967void* G726DEC_ComponentThread (void* pThreadData); 968 969OMX_ERRORTYPE G726DECFill_LCMLInitParamsEx(OMX_HANDLETYPE pComponent); 970void G726DEC_SetPending(G726DEC_COMPONENT_PRIVATE *pComponentPrivate, 971 OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber); 972void G726DEC_ClearPending(G726DEC_COMPONENT_PRIVATE *pComponentPrivate, 973 OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber) ; 974OMX_U32 G726DEC_IsPending(G726DEC_COMPONENT_PRIVATE *pComponentPrivate, 975 OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir); 976OMX_U32 G726DEC_IsValid(G726DEC_COMPONENT_PRIVATE *pComponentPrivate, 977 OMX_U8 *pBuffer, OMX_DIRTYPE eDir) ; 978 979OMX_ERRORTYPE OMX_DmmMap(DSP_HPROCESSOR ProcHandle, int size, void* pArmPtr, DMM_BUFFER_OBJ* pDmmBuf); 980OMX_ERRORTYPE OMX_DmmUnMap(DSP_HPROCESSOR ProcHandle, void* pMapPtr, void* pResPtr); 981 982#ifdef RESOURCE_MANAGER_ENABLED 983/*********************************** 984 * Callback to the RM * 985 ***********************************/ 986void G726DEC_ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData); 987#endif 988 989#endif 990