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