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_WbAmrEnc_Utils.h 30* 31* This is an header file for an WBAMR Encoder that is fully 32* compliant with the OMX Audio specification 1.5. 33* This the file that the application that uses OMX would include in its code. 34* 35* @path $(CSLPATH)\OMAPSW_MPU\linux\audio\src\openmax_il\wbamr_enc\inc 36* 37* @rev 1.0 38*/ 39/* --------------------------------------------------------------------------- */ 40/* ---------------------------------------------------------------------------- 41*! 42*! Revision History 43*! =================================== 44*! 21-sept-2006 bk: updated review findings for alpha release 45*! 24-Aug-2006 bk: Khronos OpenMAX (TM) 1.0 Conformance tests some more 46*! 18-July-2006 bk: Khronos OpenMAX (TM) 1.0 Conformance tests validated for few cases 47*! 21-Jun-2006 bk: Khronos OpenMAX (TM) 1.0 migration done 48*! 22-May-2006 bk: DASF recording quality improved 49*! 19-Apr-2006 bk: DASF recording speed issue resloved 50*! 23-Feb-2006 bk: DASF functionality added 51*! 18-Jan-2006 bk: Repated recording issue fixed and LCML changes taken care 52*! 14-Dec-2005 bk: Initial Version 53*! 16-Nov-2005 bk: Initial Version 54*! 23-Sept-2005 bk: Initial Version 55*! 10-Sept-2005 bk: Initial Version 56*! 10-Sept-2005 bk: 57*! This is newest file 58* =========================================================================== */ 59#ifndef OMX_WBAMRENC_UTILS__H 60#define OMX_WBAMRENC_UTILS__H 61 62#include "LCML_DspCodec.h" 63#include <semaphore.h> 64 65#ifdef RESOURCE_MANAGER_ENABLED 66#include <ResourceManagerProxyAPI.h> 67#endif 68 69#ifdef __PERF_INSTRUMENTATION__ 70#include "perf.h" 71#endif 72 73#include <OMX_Component.h> 74#include "OMX_TI_Common.h" 75#include "OMX_TI_Debug.h" 76#ifdef DSP_RENDERING_ON 77#include <AudioManagerAPI.h> 78#endif 79 80#ifdef UNDER_CE 81#define sleep Sleep 82#endif 83 84#ifndef ANDROID 85#define ANDROID 86#endif 87 88#ifdef ANDROID 89#undef LOG_TAG 90#define LOG_TAG "OMX_WBAMRENC" 91 92/* PV opencore capability custom parameter index */ 93#define PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX 0xFF7A347 94#endif 95 96/* ======================================================================= */ 97/** 98 * @def WBAMRENC_DEBUG Turns debug messaging on and off 99 */ 100/* ======================================================================= */ 101#undef WBAMRENC_DEBUG 102/* ======================================================================= */ 103/** 104 * @def WBAMRENC_MEMCHECK Turns memory messaging on and off 105 */ 106/* ======================================================================= */ 107#undef WBAMRENC_MEMCHECK 108 109/* ======================================================================= */ 110/** 111 * @def WBAMRENC_DEBUGMEM Turns memory leaks messaging on and off. 112 * APP_DEBUGMEM must be defined in Test App in order to get 113 * this functionality On. 114 */ 115/* ======================================================================= */ 116#undef WBAMRENC_DEBUGMEM 117/*#define WBAMRENC_DEBUGMEM*/ 118 119/* ======================================================================= */ 120/** 121 * M A C R O S FOR MEMORY and CLOSING PIPES 122 */ 123/* ======================================================================= */ 124 125#define OMX_WBCONF_INIT_STRUCT(_s_, _name_) \ 126 memset((_s_), 0x0, sizeof(_name_)); \ 127 (_s_)->nSize = sizeof(_name_); \ 128 (_s_)->nVersion.s.nVersionMajor = 0x1; \ 129 (_s_)->nVersion.s.nVersionMinor = 0x0; \ 130 (_s_)->nVersion.s.nRevision = 0x0; \ 131 (_s_)->nVersion.s.nStep = 0x0 132 133#define OMX_WBCLOSE_PIPE(_pStruct_,err)\ 134 OMXDBG_PRINT(stderr, BUFFER, 2, OMX_DBG_BASEMASK, "Closing pipes = %d\n",_pStruct_);\ 135 err = close (_pStruct_);\ 136 if(0 != err && OMX_ErrorNone == eError){\ 137 eError = OMX_ErrorHardware;\ 138 OMXDBG_PRINT(stderr, ERROR, 4, OMX_DBG_BASEMASK, "Error while closing pipe\n");\ 139 goto EXIT;\ 140 } 141 142#define WBAMRENC_OMX_ERROR_EXIT(_e_, _c_, _s_)\ 143 _e_ = _c_;\ 144 OMXDBG_PRINT(stderr, ERROR, 4, OMX_DBG_BASEMASK, "Error Name: %s : Error Num = %x", _s_, _e_);\ 145 goto EXIT; 146 147/* ======================================================================= */ 148/** 149 * @def WBAMRENC_SAMPLING_FREQUENCY Sampling frequency 150 */ 151/* ======================================================================= */ 152#define WBAMRENC_SAMPLING_FREQUENCY 16000 153/* ======================================================================= */ 154/** 155 * @def WBAMRENC_CPU_LOAD CPU Load in MHz 156 */ 157/* ======================================================================= */ 158#define WBAMRENC_CPU_LOAD 20 159/* ======================================================================= */ 160/** 161 * @def WBAMRENC_MAX_NUM_OF_BUFS Maximum number of buffers 162 */ 163/* ======================================================================= */ 164#define WBAMRENC_MAX_NUM_OF_BUFS 15 165/* ======================================================================= */ 166/** 167 * @def WBAMRENC_NUM_OF_PORTS Number of ports 168 */ 169/* ======================================================================= */ 170#define WBAMRENC_NUM_OF_PORTS 2 171/* ======================================================================= */ 172/** 173 * @def WBAMRENC_XXX_VER Component version 174 */ 175/* ======================================================================= */ 176#define WBAMRENC_MAJOR_VER 0xF1 177#define WBAMRENC_MINOR_VER 0xF2 178/* ======================================================================= */ 179/** 180 * @def WBAMRENC_NOT_USED Defines a value for "don't care" parameters 181 */ 182/* ======================================================================= */ 183#define WBAMRENC_NOT_USED 10 184/* ======================================================================= */ 185/** 186 * @def WBAMRENC_NORMAL_BUFFER Defines flag value with all flags off 187 */ 188/* ======================================================================= */ 189#define WBAMRENC_NORMAL_BUFFER 0 190/* ======================================================================= */ 191/** 192 * @def OMX_WBAMRENC_DEFAULT_SEGMENT Default segment ID for the LCML 193 */ 194/* ======================================================================= */ 195#define WBAMRENC_DEFAULT_SEGMENT (0) 196/* ======================================================================= */ 197/** 198 * @def OMX_WBAMRENC_SN_TIMEOUT Timeout value for the socket node 199 */ 200/* ======================================================================= */ 201#define WBAMRENC_SN_TIMEOUT (-1) 202/* ======================================================================= */ 203/** 204 * @def OMX_WBAMRENC_SN_PRIORITY Priority for the socket node 205 */ 206/* ======================================================================= */ 207#define WBAMRENC_SN_PRIORITY (10) 208/* ======================================================================= */ 209/** 210 * @def OMX_WBAMRENC_NUM_DLLS number of DLL's 211 */ 212/* ======================================================================= */ 213#define WBAMRENC_NUM_DLLS (2) 214/* ======================================================================= */ 215/** 216 * @def WBAMRENC_USN_DLL_NAME USN DLL name 217 */ 218/* ======================================================================= */ 219#ifdef UNDER_CE 220#define WBAMRENC_USN_DLL_NAME "\\windows\\usn.dll64P" 221#else 222#define WBAMRENC_USN_DLL_NAME "usn.dll64P" 223#endif 224 225/* ======================================================================= */ 226/** 227 * @def WBAMRENC_DLL_NAME WBAMR Encoder socket node dll name 228 */ 229/* ======================================================================= */ 230#ifdef UNDER_CE 231#define WBAMRENC_DLL_NAME "\\windows\\wbamrenc_sn.dll64P" 232#else 233#define WBAMRENC_DLL_NAME "wbamrenc_sn.dll64P" 234#endif 235 236/* ======================================================================= */ 237/** WBAMRENC_StreamType Stream types 238* 239* @param WBAMRENC_DMM DMM 240* 241* @param WBAMRENC_INSTRM Input stream 242* 243* @param WBAMRENC_OUTSTRM Output stream 244*/ 245/* ======================================================================= */ 246enum WBAMRENC_StreamType { 247 WBAMRENC_DMM = 0, 248 WBAMRENC_INSTRM, 249 WBAMRENC_OUTSTRM 250}; 251/* ======================================================================= */ 252/** WBAMRENC_EncodeType coding types 253* 254* @param WBAMRENC_WBAMR WBAMR mode 255* 256* @param WBAMRENC_EFR EFR mode 257* 258*/ 259/* ======================================================================= */ 260enum WBAMRENC_EncodeType { 261 WBAMRENC_WBAMR = 0, 262 WBAMRENC_EFR 263}; 264/* ======================================================================= */ 265/** WBAMRENC_MimeMode format types 266* 267* @param WBAMRENC_MIMEMODE MIME 268* 269* @param WBAMRENC_FORMATCONFORMANCE WBAMR mode 270* 271* @param WBAMRENC_IF2 IF2 mode 272* 273*/ 274/* ======================================================================= */ 275enum WBAMRENC_MimeMode { 276 WBAMRENC_FORMATCONFORMANCE = 0, 277 WBAMRENC_MIMEMODE, 278 WBAMRENC_IF2 279}; 280 281/* ======================================================================= */ 282/* 283 * Different Frame sizes for different index in MIME Mode 284 */ 285/* ======================================================================= */ 286#define WBAMRENC_FRAME_SIZE_0 0 287#define WBAMRENC_FRAME_SIZE_1 1 288#define WBAMRENC_FRAME_SIZE_6 6 289#define WBAMRENC_FRAME_SIZE_18 18 290#define WBAMRENC_FRAME_SIZE_23 23 291#define WBAMRENC_FRAME_SIZE_24 24 292#define WBAMRENC_FRAME_SIZE_33 33 293#define WBAMRENC_FRAME_SIZE_37 37 294#define WBAMRENC_FRAME_SIZE_41 41 295#define WBAMRENC_FRAME_SIZE_47 47 296#define WBAMRENC_FRAME_SIZE_51 51 297#define WBAMRENC_FRAME_SIZE_59 59 298#define WBAMRENC_FRAME_SIZE_61 61 299 300 301 302/* ======================================================================= */ 303/** 304 * @def WBAMRENC_TIMEOUT Default timeout used to come out of blocking calls 305 */ 306/* ======================================================================= */ 307#define WBAMRENC_TIMEOUT 1000 308/* ======================================================================= */ 309/* 310 * @def WBAMRENC_OMX_MAX_TIMEOUTS Max Time Outs 311 * @def WBAMRENC_DONT_CARE Dont Care Condition 312 * @def WBAMRENC_NUM_CHANNELS Number of Channels 313 * @def WBAMRENC_APP_ID App ID Value setting 314 */ 315/* ======================================================================= */ 316#define WBAMRENC_OMX_MAX_TIMEOUTS 20 317#define WBAMRENC_DONT_CARE 0 318#define WBAMRENC_NUM_CHANNELS 1 319/* ======================================================================= */ 320/** 321 * @def WBAMRENC_STREAM_COUNT Number of streams 322 * WBAMRENC_INPUT_STREAM_ID Stream ID for Input Buffer 323 */ 324/* ======================================================================= */ 325#define WBAMRENC_STREAM_COUNT 2 326#define WBAMRENC_INPUT_STREAM_ID 0 327 328/* ======================================================================= */ 329/** 330 * @def _ERROR_PROPAGATION__ Allow Logic to Detec&Report Arm Errors 331 */ 332/* ======================================================================= */ 333#define _ERROR_PROPAGATION__ 334 335typedef struct PV_OMXComponentCapabilityFlagsType { 336 /* OMX COMPONENT CAPABILITY RELATED MEMBERS (for opencore compatability)*/ 337 OMX_BOOL iIsOMXComponentMultiThreaded; 338 OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc; 339 OMX_BOOL iOMXComponentSupportsExternalInputBufferAlloc; 340 OMX_BOOL iOMXComponentSupportsMovableInputBuffers; 341 OMX_BOOL iOMXComponentSupportsPartialFrames; 342 OMX_BOOL iOMXComponentNeedsNALStartCode; 343 OMX_BOOL iOMXComponentCanHandleIncompleteFrames; 344} PV_OMXComponentCapabilityFlagsType; 345 346/** WBAMRENC_COMP_PORT_TYPE Port types 347 * 348 * @param WBAMRENC_INPUT_PORT Input port 349 * 350 * @param WBAMRENC_OUTPUT_PORT Output port 351 */ 352/* ====================================================================== */ 353/*This enum must not be changed. */ 354typedef enum WBAMRENC_COMP_PORT_TYPE { 355 WBAMRENC_INPUT_PORT = 0, 356 WBAMRENC_OUTPUT_PORT 357} WBAMRENC_COMP_PORT_TYPE; 358 359/* ======================================================================= */ 360/** AUDIO_SN_WBAMRBANDMODETYPE 361 * 362 * @SN_AUDIO_BRXXX This constant is used to determine the code to send 363 * to SN to set the BitRate. 364 */ 365/* ====================================================================== */ 366typedef enum AUDIO_SN_WBAMRBANDMODETYPE { 367 SN_AUDIO_BR2385 = 8, 368 SN_AUDIO_BR2305, 369 SN_AUDIO_BR1985, 370 SN_AUDIO_BR1825, 371 SN_AUDIO_BR1585, 372 SN_AUDIO_BR1425, 373 SN_AUDIO_BR1265, 374 SN_AUDIO_BR885, 375 SN_AUDIO_BR660, 376 SN_AUDIO_WBAMRBandModeMax = 0x7FFFFFFF 377} AUDIO_SN_WBAMRBANDMODETYPE; 378 379/* ======================================================================= */ 380/** WBAMRENC_BUFFER_Dir Buffer Direction 381* 382* @param WBAMRENC_DIRECTION_INPUT Input direction 383* 384* @param WBAMRENC_DIRECTION_OUTPUT Output direction 385* 386*/ 387/* ======================================================================= */ 388typedef enum { 389 WBAMRENC_DIRECTION_INPUT, 390 WBAMRENC_DIRECTION_OUTPUT 391} WBAMRENC_BUFFER_Dir; 392 393/* ======================================================================= */ 394/** WBAMRENC_BUFFS Buffer details 395* 396* @param BufHeader Buffer header 397* 398* @param Buffer Buffer 399* 400*/ 401/* ======================================================================= */ 402typedef struct WBAMRENC_BUFFS { 403 char BufHeader; 404 char Buffer; 405} WBAMRENC_BUFFS; 406 407/* ======================================================================= */ 408/** WBAMRENC_BUFFERHEADERTYPE_INFO 409* 410* @param pBufHeader 411* 412* @param bBufOwner 413* 414*/ 415/* ======================================================================= */ 416typedef struct WBAMRENC_BUFFERHEADERTYPE_INFO { 417 OMX_BUFFERHEADERTYPE* pBufHeader[WBAMRENC_MAX_NUM_OF_BUFS]; 418 WBAMRENC_BUFFS bBufOwner[WBAMRENC_MAX_NUM_OF_BUFS]; 419} WBAMRENC_BUFFERHEADERTYPE_INFO; 420 421 422typedef OMX_ERRORTYPE (*WBAMRENC_fpo)(OMX_HANDLETYPE); 423 424/* =================================================================================== */ 425/** 426* Socket node Audio Codec Configuration parameters. 427*/ 428/* =================================================================================== */ 429typedef struct WBAMRENC_AudioCodecParams { 430 unsigned long iSamplingRate; 431 unsigned long iStrmId; 432 unsigned short iAudioFormat; 433} WBAMRENC_AudioCodecParams; 434 435/* =================================================================================== */ 436/** 437* WBAMRENC_TALGCtrl Socket Node Alg Control parameters. 438* WBAMRENC_TALGCtrlDTX Socket Node Alg Control parameters (DTX). 439* WBAMRENC_UAlgInBufParamStruct Input Buffer Param Structure 440* WBAMRENC_UAlgOutBufParamStruct Output Buffer Param Structure 441*/ 442/* =================================================================================== */ 443/* Algorithm specific command parameters */ 444typedef struct { 445 int iSize; 446 unsigned int iBitrate; 447} WBAMRENC_TALGCtrl; 448 449typedef struct { 450 int iSize; 451 unsigned int iVADFlag; 452 453} WBAMRENC_TALGCtrlDTX; 454/* =================================================================================== */ 455/** 456* WBAMRENC_UAlgInBufParamStruct Input Buffer Param Structure 457* usLastFrame To Send Last Buufer Flag 458*/ 459/* =================================================================================== */ 460typedef struct { 461 unsigned long int usLastFrame; 462} WBAMRENC_FrameStruct; 463 464typedef struct { 465 unsigned long int usNbFrames; 466 WBAMRENC_FrameStruct *pParamElem; 467} WBAMRENC_ParamStruct; 468 469/* =================================================================================== */ 470/** 471* WBAMRENC_UAlgOutBufParamStruct Output Buffer Param Structure 472* ulFrameCount No.of Frames Encoded 473*/ 474/* =================================================================================== */ 475typedef struct { 476 unsigned long ulFrameCount; 477} WBAMRENC_UAlgOutBufParamStruct; 478 479/* =================================================================================== */ 480/** 481* WBAMRENC_LCML_BUFHEADERTYPE Buffer Header Type 482*/ 483/* =================================================================================== */ 484typedef struct WBAMRENC_LCML_BUFHEADERTYPE { 485 WBAMRENC_BUFFER_Dir eDir; 486 WBAMRENC_FrameStruct *pFrameParam; 487 WBAMRENC_ParamStruct *pBufferParam; 488 DMM_BUFFER_OBJ* pDmmBuf; 489 OMX_BUFFERHEADERTYPE* buffer; 490} WBAMRENC_LCML_BUFHEADERTYPE; 491 492typedef struct _WBAMRENC_BUFFERLIST WBAMRENC_BUFFERLIST; 493 494/* =================================================================================== */ 495/** 496* _WBAMRENC_BUFFERLIST Structure for buffer list 497*/ 498/* ================================================================================== */ 499struct _WBAMRENC_BUFFERLIST { 500 OMX_BUFFERHEADERTYPE sBufHdr; 501 OMX_BUFFERHEADERTYPE *pBufHdr[WBAMRENC_MAX_NUM_OF_BUFS]; 502 OMX_U32 bufferOwner[WBAMRENC_MAX_NUM_OF_BUFS]; 503 OMX_U32 bBufferPending[WBAMRENC_MAX_NUM_OF_BUFS]; 504 OMX_U32 numBuffers; 505 WBAMRENC_BUFFERLIST *pNextBuf; 506 WBAMRENC_BUFFERLIST *pPrevBuf; 507}; 508 509/* =================================================================================== */ 510/** 511* WBAMRENC_PORT_TYPE Structure for PortFormat details 512*/ 513/* =================================================================================== */ 514typedef struct WBAMRENC_PORT_TYPE { 515 OMX_HANDLETYPE hTunnelComponent; 516 OMX_U32 nTunnelPort; 517 OMX_BUFFERSUPPLIERTYPE eSupplierSetting; 518 OMX_U8 nBufferCnt; 519 OMX_AUDIO_PARAM_PORTFORMATTYPE* pPortFormat; 520} WBAMRENC_PORT_TYPE; 521 522#ifdef UNDER_CE 523#ifndef _OMX_EVENT_ 524#define _OMX_EVENT_ 525typedef struct OMX_Event { 526 HANDLE event; 527} OMX_Event; 528#endif 529int OMX_CreateEvent(OMX_Event *event); 530int OMX_SignalEvent(OMX_Event *event); 531int OMX_WaitForEvent(OMX_Event *event); 532int OMX_DestroyEvent(OMX_Event *event); 533#endif 534 535typedef struct WBAMRENC_BUFDATA { 536 OMX_U8 nFrames; 537} WBAMRENC_BUFDATA; 538/* =================================================================================== */ 539/** 540* WBAMRENC_COMPONENT_PRIVATE Component private data Structure 541*/ 542/* =================================================================================== */ 543typedef struct WBAMRENC_COMPONENT_PRIVATE { 544 /** Array of pointers to BUFFERHEADERTYPE structues 545 This pBufHeader[INPUT_PORT] will point to all the 546 BUFFERHEADERTYPE structures related to input port, 547 not just one structure. Same is the case for output 548 port also. */ 549 OMX_BUFFERHEADERTYPE* pBufHeader[WBAMRENC_NUM_OF_PORTS]; 550 /** Number of input buffers at runtime */ 551 OMX_U32 nRuntimeInputBuffers; 552 553 /** Number of output buffers at runtime */ 554 OMX_U32 nRuntimeOutputBuffers; 555 556 OMX_CALLBACKTYPE cbInfo; 557 OMX_PORT_PARAM_TYPE* sPortParam; 558 OMX_PRIORITYMGMTTYPE* sPriorityMgmt; 559 560#ifdef RESOURCE_MANAGER_ENABLED 561 RMPROXY_CALLBACKTYPE rmproxyCallback; 562#endif 563 564 OMX_BOOL bPreempted; 565 566 OMX_PARAM_PORTDEFINITIONTYPE* pPortDef[WBAMRENC_NUM_OF_PORTS]; 567 OMX_PORT_PARAM_TYPE* pPortParamType; 568 OMX_AUDIO_PARAM_AMRTYPE* amrParams; 569 OMX_AUDIO_PARAM_PCMMODETYPE* pcmParams; 570 571 WBAMRENC_BUFFERHEADERTYPE_INFO BufInfo[WBAMRENC_NUM_OF_PORTS]; 572 WBAMRENC_PORT_TYPE *pCompPort[WBAMRENC_NUM_OF_PORTS]; 573 WBAMRENC_LCML_BUFHEADERTYPE *pLcmlBufHeader[WBAMRENC_NUM_OF_PORTS]; 574 /** This is component handle */ 575 OMX_COMPONENTTYPE* pHandle; 576 /** Current state of this component */ 577 OMX_STATETYPE curState; 578 /** The component thread handle */ 579 pthread_t ComponentThread; 580 /** The pipes for sending buffers to the thread */ 581 int dataPipe[2]; 582 /** The pipes for sending command to the thread */ 583 int cmdPipe[2]; 584 /** The pipes for sending cmd data to the thread */ 585 int cmdDataPipe[2]; 586 587 OMX_U32 efrMode; 588 589 OMX_U32 amrMode; 590 591 OMX_U32 dasfMode; 592 593 OMX_U32 frameMode; 594 595 OMX_U32 acdnMode; 596 597 OMX_U32 nMultiFrameMode; 598 599 OMX_S32 fdwrite; 600 601 OMX_S32 fdread; 602 603 /** Set to indicate component is stopping */ 604 OMX_U32 bIsThreadstop; 605 606 /** Count of number of buffers outstanding with bridge */ 607 OMX_U32 lcml_nIpBuf; 608 609 /** Count of number of buffers outstanding with bridge */ 610 OMX_U32 lcml_nOpBuf; 611 612 OMX_U32 app_nBuf; 613 614 OMX_U32 lcml_nCntIp; 615 616 OMX_U32 lcml_nCntOpReceived; 617 618 OMX_U32 bIsBufferOwned[WBAMRENC_NUM_OF_PORTS]; 619 620 OMX_U32 streamID; 621 622 OMX_U32 bCompThreadStarted; 623 624 OMX_U32 nVersion; 625 626 OMX_U32 amrMimeBytes[16]; 627 628 OMX_U32 amrIf2Bytes[16]; 629 630 OMX_U32 iHoldLen; 631 632 OMX_U32 nHoldLength; 633 634 OMX_U32 nFillThisBufferCount; 635 636 OMX_U32 nFillBufferDoneCount; 637 638 OMX_U32 nEmptyThisBufferCount; 639 640 OMX_U32 nEmptyBufferDoneCount; 641 642 OMX_U32 bInitParamsInitialized; 643 644 OMX_U32 nNumInputBufPending; 645 646 OMX_U32 nNumOutputBufPending; 647 648 OMX_U32 bDisableCommandPending; 649 650 OMX_U32 bDisableCommandParam; 651 652 OMX_U32 bEnableCommandPending; 653 654 OMX_U32 bEnableCommandParam; 655 656 OMX_HANDLETYPE pLcmlHandle; 657 658 OMX_PTR pMarkData; 659 660 OMX_MARKTYPE *pMarkBuf; 661 662 OMX_HANDLETYPE hMarkTargetComponent; 663 664 WBAMRENC_BUFFERLIST *pInputBufferList; 665 666 WBAMRENC_BUFFERLIST *pOutputBufferList; 667 668 LCML_STRMATTR *strmAttr; 669 670 WBAMRENC_TALGCtrl *pAlgParam; 671 672 WBAMRENC_TALGCtrlDTX *pAlgParamDTX; 673 674 WBAMRENC_AudioCodecParams *pParams; 675 676 OMX_STRING cComponentName; 677 678 OMX_VERSIONTYPE ComponentVersion; 679 680 OMX_BUFFERHEADERTYPE *pInputBufHdrPending[WBAMRENC_MAX_NUM_OF_BUFS]; 681 682 OMX_BUFFERHEADERTYPE *pOutputBufHdrPending[WBAMRENC_MAX_NUM_OF_BUFS]; 683 684 OMX_BUFFERHEADERTYPE *iMMFDataLastBuffer; 685 686 OMX_U8* pHoldBuffer, *pHoldBuffer2; 687 688 OMX_U8* iHoldBuffer; 689 690 /** Flag to set when socket node stop callback should not transition 691 component to OMX_StateIdle */ 692 OMX_U32 bNoIdleOnStop; 693 694 /** Flag set when socket node is stopped */ 695 OMX_U32 bDspStoppedWhileExecuting; 696 697 /** Number of outstanding FillBufferDone() calls */ 698 OMX_S32 nOutStandingFillDones; 699 700 OMX_S32 nOutStandingEmptyDones; 701 702#ifndef UNDER_CE 703 pthread_mutex_t AlloBuf_mutex; 704 pthread_cond_t AlloBuf_threshold; 705 OMX_U8 AlloBuf_waitingsignal; 706 707 pthread_mutex_t InLoaded_mutex; 708 pthread_cond_t InLoaded_threshold; 709 OMX_U8 InLoaded_readytoidle; 710 711 pthread_mutex_t InIdle_mutex; 712 pthread_cond_t InIdle_threshold; 713 OMX_U8 InIdle_goingtoloaded; 714 715 pthread_mutex_t ToLoaded_mutex; 716 /* 717 sem_t allobuf; 718 sem_t inloaded; 719 sem_t inidle; 720 */ 721#else 722 OMX_Event AlloBuf_event; 723 OMX_U8 AlloBuf_waitingsignal; 724 725 OMX_Event InLoaded_event; 726 OMX_U8 InLoaded_readytoidle; 727 728 OMX_Event InIdle_event; 729 OMX_U8 InIdle_goingtoloaded; 730#endif 731 732 OMX_U8 nNumOfFramesSent; 733 734 OMX_U8 InBuf_Eos_alreadysent; 735 736#ifdef __PERF_INSTRUMENTATION__ 737 PERF_OBJHANDLE pPERF, pPERFcomp; 738 OMX_U32 nLcml_nCntIp; 739 OMX_U32 nLcml_nCntOpReceived; 740#endif 741 742 OMX_BUFFERHEADERTYPE *LastOutbuf; 743 OMX_BOOL bIsInvalidState; 744 745 OMX_STRING* sDeviceString; 746 void* ptrLibLCML; 747 748 /** Circular array to keep buffer timestamps */ 749 OMX_S64 arrBufIndex[WBAMRENC_MAX_NUM_OF_BUFS]; 750 /** Circular array to keep buffer nTickCounts */ 751 OMX_S64 arrTickCount[WBAMRENC_MAX_NUM_OF_BUFS]; 752 /** Index to arrBufIndex[], used for input buffer timestamps */ 753 OMX_U8 IpBufindex; 754 /** Index to arrBufIndex[], used for output buffer timestamps */ 755 OMX_U8 OpBufindex; 756 757 OMX_S8 ProcessingInputBuf; 758 OMX_S8 ProcessingOutputBuf; 759 760 OMX_BOOL bLoadedCommandPending; 761 762 OMX_PARAM_COMPONENTROLETYPE componentRole; 763 764 /* Pointer to OpenCore capabilities structure */ 765 PV_OMXComponentCapabilityFlagsType iPVCapabilityFlags; 766 767 struct OMX_TI_Debug dbg; 768 769 /* Reference count for pending state change requests */ 770 OMX_U32 nPendingStateChangeRequests; 771 pthread_mutex_t mutexStateChangeRequest; 772 pthread_cond_t StateChangeCondition; 773 774} WBAMRENC_COMPONENT_PRIVATE; 775 776 777/* =================================================================================== */ 778/** 779* OMX_ComponentInit() Initializes component 780* 781* 782* @param hComp OMX Handle 783* 784* @return OMX_ErrorNone = Successful 785* Other error code = fail 786* 787*/ 788/* =================================================================================== */ 789OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp); 790/* =================================================================================== */ 791/** 792* WBAMRENC_StartComponentThread() Starts component thread 793* 794* 795* @param hComp OMX Handle 796* 797* @return OMX_ErrorNone = Successful 798* Other error code = fail 799* 800*/ 801/* =================================================================================== */ 802OMX_ERRORTYPE WBAMRENC_StartComponentThread(OMX_HANDLETYPE pHandle); 803/* =================================================================================== */ 804/** 805* WBAMRENC_StopComponentThread() Stops component thread 806* 807* 808* @param hComp OMX Handle 809* 810* @return OMX_ErrorNone = Successful 811* Other error code = fail 812* 813*/ 814/* =================================================================================== */ 815OMX_ERRORTYPE WBAMRENC_StopComponentThread(OMX_HANDLETYPE pHandle); 816/* =================================================================================== */ 817/** 818* WBAMRENC_FreeCompResources() Frees allocated memory 819* 820* 821* @param hComp OMX Handle 822* 823* @return OMX_ErrorNone = Successful 824* Other error code = fail 825* 826*/ 827/* =================================================================================== */ 828OMX_ERRORTYPE WBAMRENC_FreeCompResources(OMX_HANDLETYPE pComponent); 829/* =================================================================================== */ 830/** 831* WBAMRENC_GetCorrespondingLCMLHeader() Returns LCML header 832* that corresponds to the given buffer 833* 834* @param pComponentPrivate Component private data 835* 836* @return OMX_ErrorNone = Successful 837* Other error code = fail 838*/ 839/* =================================================================================== */ 840OMX_ERRORTYPE WBAMRENC_GetCorrespondingLCMLHeader(WBAMRENC_COMPONENT_PRIVATE *pComponentPrivate, 841 OMX_U8 *pBuffer, 842 OMX_DIRTYPE eDir, 843 WBAMRENC_LCML_BUFHEADERTYPE **ppLcmlHdr); 844/* =================================================================================== */ 845/** 846* WBAMRENC_LCMLCallback() Callback from LCML 847* 848* @param event Codec Event 849* 850* @param args Arguments from LCML 851* 852* @return OMX_ErrorNone = Successful 853* Other error code = fail 854*/ 855/* =================================================================================== */ 856OMX_ERRORTYPE WBAMRENC_LCMLCallback(TUsnCodecEvent event, 857 void * args [10]); 858/* =================================================================================== */ 859/** 860* WBAMRENC_FillLCMLInitParams() Fills the parameters needed 861* to initialize the LCML 862* 863* @param pHandle OMX Handle 864* 865* @param plcml_Init LCML initialization parameters 866* 867* @return OMX_ErrorNone = Successful 868* Other error code = fail 869* 870*/ 871/* =================================================================================== */ 872OMX_ERRORTYPE WBAMRENC_FillLCMLInitParams(OMX_HANDLETYPE pHandle, 873 LCML_DSP *plcml_Init, 874 OMX_U16 arr[]); 875/* =================================================================================== */ 876/** 877* WBAMRENC_GetBufferDirection() Returns direction of pBufHeader 878* 879* @param pBufHeader Buffer header 880* 881* @param eDir Buffer direction 882* 883* @param pComponentPrivate Component private data 884* 885* @return OMX_ErrorNone = Successful 886* Other error code = fail 887*/ 888/* =================================================================================== */ 889OMX_ERRORTYPE WBAMRENC_GetBufferDirection(OMX_BUFFERHEADERTYPE *pBufHeader, 890 OMX_DIRTYPE *eDir); 891/* =========================================================== */ 892/** 893* WBAMRENC_HandleCommand() Handles commands sent via SendCommand() 894* 895* @param pComponentPrivate Component private data 896* 897* @return OMX_ErrorNone = Successful 898* Other error code = fail 899* @return OMX_ErrorNone = Successful 900* Other error code = fail 901*/ 902/* =================================================================================== */ 903OMX_U32 WBAMRENC_HandleCommand(WBAMRENC_COMPONENT_PRIVATE *pComponentPrivate, 904 OMX_COMMANDTYPE cmd, 905 OMX_U32 cmdData); 906/* =================================================================================== */ 907/** 908* WBAMRENC_HandleDataBufFromApp() Handles data buffers received 909* from the IL Client 910* 911* @param pComponentPrivate Component private data 912* 913* @return OMX_ErrorNone = Successful 914* Other error code = fail 915* @return OMX_ErrorNone = Successful 916* Other error code = fail 917*/ 918/* =================================================================================== */ 919OMX_ERRORTYPE WBAMRENC_HandleDataBufFromApp(OMX_BUFFERHEADERTYPE *pBufHeader, 920 WBAMRENC_COMPONENT_PRIVATE *pComponentPrivate); 921/* =================================================================================== */ 922/** 923* WBAMRENC_GetLCMLHandle() Get the handle to the LCML 924* 925* 926* @return OMX_ErrorNone = Successful 927* Other error code = fail 928*/ 929/* =================================================================================== */ 930OMX_HANDLETYPE WBAMRENC_GetLCMLHandle(WBAMRENC_COMPONENT_PRIVATE *pComponentPrivate); 931/* =================================================================================== */ 932/** 933* WBAMRENC_FreeLCMLHandle() Frees the handle to the LCML 934* 935* 936* @return OMX_ErrorNone = Successful 937* Other error code = fail 938*/ 939/* =================================================================================== */ 940OMX_ERRORTYPE WBAMRENC_FreeLCMLHandle(WBAMRENC_COMPONENT_PRIVATE *pComponentPrivate); 941/* =================================================================================== */ 942/** 943* WBAMRENC_CleanupInitParams() Starts component thread 944* 945* @param pComponent OMX Handle 946* 947* @return OMX_ErrorNone = Successful 948* Other error code = fail 949*/ 950/* =================================================================================== */ 951OMX_ERRORTYPE WBAMRENC_CleanupInitParams(OMX_HANDLETYPE pHandle); 952/* =================================================================================== */ 953/** 954* WBAMRENC_SetPending() Called when the component queues a buffer 955* to the LCML 956* 957* @param pComponentPrivate Component private data 958* 959* @param pBufHdr Buffer header 960* 961* @param eDir Direction of the buffer 962* 963* @return None 964*/ 965/* =================================================================================== */ 966void WBAMRENC_SetPending(WBAMRENC_COMPONENT_PRIVATE *pComponentPrivate, 967 OMX_BUFFERHEADERTYPE *pBufHdr, 968 OMX_DIRTYPE eDir, 969 OMX_U32 lineNumber); 970/* =================================================================================== */ 971/** 972* WBAMRENC_ClearPending() Called when a buffer is returned 973* from the LCML 974* 975* @param pComponentPrivate Component private data 976* 977* @param pBufHdr Buffer header 978* 979* @param eDir Direction of the buffer 980* 981* @return None 982*/ 983/* =================================================================================== */ 984void WBAMRENC_ClearPending(WBAMRENC_COMPONENT_PRIVATE *pComponentPrivate, 985 OMX_BUFFERHEADERTYPE *pBufHdr, 986 OMX_DIRTYPE eDir, 987 OMX_U32 lineNumber); 988/* =================================================================================== */ 989/** 990* WBAMRENC_IsPending() 991* 992* 993* @param pComponentPrivate Component private data 994* 995* @return OMX_ErrorNone = Successful 996* Other error code = fail 997*/ 998/* =================================================================================== */ 999OMX_U32 WBAMRENC_IsPending(WBAMRENC_COMPONENT_PRIVATE *pComponentPrivate, 1000 OMX_BUFFERHEADERTYPE *pBufHdr, 1001 OMX_DIRTYPE eDir); 1002/* =================================================================================== */ 1003/** 1004* WBAMRENC_FillLCMLInitParamsEx() Fills the parameters needed 1005* to initialize the LCML without recreating the socket node 1006* 1007* @param pComponent OMX Handle 1008* 1009* @return None 1010*/ 1011/* =================================================================================== */ 1012OMX_ERRORTYPE WBAMRENC_FillLCMLInitParamsEx(OMX_HANDLETYPE pComponent); 1013/* =================================================================================== */ 1014/** 1015* WBAMRENC_IsValid() Returns whether a buffer is valid 1016* 1017* 1018* @param pComponentPrivate Component private data 1019* 1020* @param pBuffer Data buffer 1021* 1022* @param eDir Buffer direction 1023* 1024* @return OMX_True = Valid 1025* OMX_False= Invalid 1026*/ 1027/* =================================================================================== */ 1028OMX_U32 WBAMRENC_IsValid(WBAMRENC_COMPONENT_PRIVATE *pComponentPrivate, 1029 OMX_U8 *pBuffer, 1030 OMX_DIRTYPE eDir); 1031 1032OMX_ERRORTYPE OMX_DmmMap(DSP_HPROCESSOR ProcHandle, int size, void* pArmPtr, DMM_BUFFER_OBJ* pDmmBuf, struct OMX_TI_Debug dbg); 1033OMX_ERRORTYPE OMX_DmmUnMap(DSP_HPROCESSOR ProcHandle, void* pMapPtr, void* pResPtr, struct OMX_TI_Debug dbg); 1034 1035#ifdef RESOURCE_MANAGER_ENABLED 1036void WBAMRENC_ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData); 1037#endif 1038 1039void WBAMRENC_HandleUSNError (WBAMRENC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 arg); 1040 1041/*===============================================================*/ 1042 1043typedef enum { 1044 IUALG_CMD_STOP = 0, 1045 IUALG_CMD_PAUSE = 1, 1046 IUALG_CMD_GETSTATUS = 2, 1047 IUALG_CMD_SETSTATUS = 3, 1048 IUALG_CMD_USERSETCMDSTART = 100, 1049 IUALG_CMD_USERGETCMDSTART = 150, 1050 IUALG_CMD_FLUSH = 0x100 1051} IUALG_Cmd; 1052 1053typedef enum { 1054 ALGCMD_BITRATE = IUALG_CMD_USERSETCMDSTART, 1055 ALGCMD_DTX 1056 1057} eSPEECHENCODE_AlgCmd; 1058 1059OMX_ERRORTYPE AddStateTransition(WBAMRENC_COMPONENT_PRIVATE* pComponentPrivate); 1060OMX_ERRORTYPE RemoveStateTransition(WBAMRENC_COMPONENT_PRIVATE* pComponentPrivate, OMX_BOOL bEnableSignal); 1061 1062 1063#endif /* OMX_WBAMRENC_UTILS__H */ 1064