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_Mp3Dec_Utils.h
30*
31* This is an header file for an audio MP3 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\mp3_dec\inc\
37*
38* @rev 1.0
39*/
40/* --------------------------------------------------------------------------- */
41#ifndef OMX_MP3DEC_UTILS__H
42#define OMX_MP3DEC_UTILS__H
43
44#include <OMX_Component.h>
45#include "OMX_TI_Common.h"
46#include <OMX_TI_Debug.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#endif
57
58#ifndef UNDER_CE
59
60#ifdef RESOURCE_MANAGER_ENABLED
61#include <ResourceManagerProxyAPI.h>
62#endif
63
64
65#define _ERROR_PROPAGATION__
66#ifdef __PERF_INSTRUMENTATION__
67    #include "perf.h"
68#endif
69
70#ifndef ANDROID
71    #define ANDROID
72#endif
73
74#ifdef ANDROID
75    /* Log for Android system*/
76    #include <utils/Log.h>
77    #undef LOG_TAG
78    #define LOG_TAG "OMX_MP3"
79
80    /* PV opencore capability custom parameter index */
81    #define PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX 0xFF7A347
82#endif
83
84#endif
85
86#define MP3DEC_MAJOR_VER 0x1/* Major number of the component */
87#define MP3DEC_MINOR_VER 0x1 /* Mnor number of the component */
88#define NOT_USED 10 /* Value not used */
89#define NORMAL_BUFFER 0 /* Marks a buffer as normal buffer */
90#define OMX_MP3DEC_DEFAULT_SEGMENT (0) /* default segment ID of the component */
91#define OMX_MP3DEC_SN_TIMEOUT (-1) /* tomeout value keep waiting until get the message */
92#define OMX_MP3DEC_SN_PRIORITY (10) /* SN priority value */
93
94#define MP3DEC_BUFHEADER_VERSION 0x0 /* Buffer Header structure version number */
95#define MP3D_TIMEOUT (1000) /* default timeout in millisecs */
96#define MP3_CPU 25
97
98/* #define DSP_RENDERING_ON*/ /* Enable to use DASF functionality */
99/* #define MP3DEC_MEMDEBUG */ /* Enable memory leaks debuf info */
100//#define MP3DEC_DEBUG    /* See all debug statement of the component */
101/* #define MP3DEC_MEMDETAILS */  /* See memory details of the component */
102/* #define MP3DEC_BUFDETAILS */  /* See buffers details of the component */
103// #define MP3DEC_STATEDETAILS /* See all state transitions of the component*/
104
105#define MP3_APP_ID  100 /* Defines MP3 Dec App ID, App must use this value */
106#define MP3D_MAX_NUM_OF_BUFS 10 /* Max number of buffers used */
107#define MP3D_NUM_INPUT_BUFFERS 4  /* Default number of input buffers */
108#define MP3D_NUM_OUTPUT_BUFFERS 4 /* Default number of output buffers */
109
110#define MP3D_INPUT_BUFFER_SIZE  2000*4 /* Default size of input buffer */
111#define MP3D_OUTPUT_BUFFER_SIZE 8192 /* Default size of output buffer */
112#define MP3D_DEFAULT_FREQUENCY 44100 /* Default sample frequency*/
113
114#define OUTPUT_PORT_MP3DEC 1
115#define INPUT_PORT_MP3DEC 0
116
117#define MP3D_MONO_STREAM  1 /* Mono stream index */
118#define MP3D_STEREO_INTERLEAVED_STREAM  2 /* Stereo Interleaved stream index */
119#define MP3D_STEREO_NONINTERLEAVED_STREAM  3 /* Stereo Non-Interleaved stream index */
120
121#define MP3D_STEREO_STREAM  2
122
123#define NUM_OF_PORTS 0x2 /* Number of ports of component */
124
125#ifdef UNDER_CE
126#define MP3DEC_USN_DLL_NAME "\\windows\\usn.dll64P"
127#else
128#define MP3DEC_USN_DLL_NAME "usn.dll64P"
129#endif
130
131#ifdef UNDER_CE
132#define MP3DEC_DLL_NAME "\\windows\\mp3dec_sn.dll64P"
133#else
134#define MP3DEC_DLL_NAME "mp3dec_sn.dll64P"
135#endif
136
137#define DONT_CARE 0
138
139#define EXIT_COMPONENT_THRD  10
140
141#ifdef UNDER_CE /* For Windows */
142
143#ifdef  MP3DEC_DEBUG
144 #define MP3DEC_DPRINT(STR, ARG...) printf()
145#else
146#endif
147
148#ifdef  MP3DEC_DEBUG
149 #define MP3DEC_EPRINT(STR, ARG...) printf()
150#else
151#endif
152
153
154#ifdef MP3DEC_MEMCHECK
155        #define MP3DEC_MEMPRINT(STR, ARG...) printf()
156#else
157#endif
158
159#ifdef MP3DEC_STATEDETAILS
160        #define MP3DEC_STATEPRINT(STR, ARG...) printf()
161#else
162#endif
163
164
165#ifdef MP3DEC_BUFDETAILS
166        #define MP3DEC_BUFPRINT(STR, ARG...) printf()
167#else
168#endif
169
170#ifdef MP3DEC_MEMDETAILS
171        #define MP3DEC_MEMPRINT(STR, ARG...) printf()
172#else
173#endif
174
175
176#ifdef DEBUG
177        #define MP3DEC_DPRINT   printf
178        #define MP3DEC_EPRINT   printf
179        #define MP3DEC_MEMPRINT   printf
180        #define MP3DEC_STATEPRINT   printf
181        #define MP3DEC_BUFPRINT   printf
182#else
183        #define MP3DEC_DPRINT
184        #define MP3DEC_EPRINT printf
185        #define MP3DEC_MEMPRINT
186        #define MP3DEC_STATEPRINT
187        #define MP3DEC_BUFPRINT
188#endif
189
190#else /* for Linux */
191#ifdef  MP3DEC_DEBUG
192
193  #ifdef ANDROID
194    #define MP3DEC_DPRINT  ALOGW
195    #define MP3DEC_BUFPRINT ALOGW
196    #define MP3DEC_MEMPRINT ALOGW
197    #define MP3DEC_STATEPRINT ALOGW
198  #else
199    #define MP3DEC_DPRINT  printf
200    #define MP3DEC_BUFPRINT printf
201    #define MP3DEC_MEMPRINT printf
202    #define MP3DEC_STATEPRINT printf
203  #endif
204
205#else
206    #define MP3DEC_DPRINT(...)
207
208    #ifdef MP3DEC_STATEDETAILS
209        #define MP3DEC_STATEPRINT printf
210    #else
211        #define MP3DEC_STATEPRINT(...)
212    #endif
213
214    #ifdef MP3DEC_BUFDETAILS
215        #define MP3DEC_BUFPRINT printf
216    #else
217        #define MP3DEC_BUFPRINT(...)
218    #endif
219
220    #ifdef MP3DEC_MEMDETAILS
221        #define MP3DEC_MEMPRINT printf
222    #else
223        #define MP3DEC_MEMPRINT(...)
224    #endif
225
226#endif
227
228#ifdef ANDROID
229  #define MP3DEC_EPRINT ALOGE
230#else
231  #define MP3DEC_EPRINT printf
232#endif
233
234#endif
235
236#define MP3D_OMX_ERROR_EXIT(_e_, _c_, _s_)\
237    _e_ = _c_;\
238    OMXDBG_PRINT(stderr, ERROR, 4, 0, "\n**************** OMX ERROR ************************\n");\
239    OMXDBG_PRINT(stderr, ERROR, 4, 0, "%d : Error Name: %s : Error Num = %x",__LINE__, _s_, _e_);\
240    OMXDBG_PRINT(stderr, ERROR, 4, 0, "\n**************** OMX ERROR ************************\n");\
241    goto EXIT;
242
243
244#define MP3D_OMX_CONF_CHECK_CMD(_ptr1, _ptr2, _ptr3) \
245{                                               \
246    if(!_ptr1 || !_ptr2 || !_ptr3){             \
247        eError = OMX_ErrorBadParameter;         \
248        goto EXIT;                 \
249    }                                           \
250}
251
252#define OMX_CONF_INIT_STRUCT(_s_, _name_)       \
253    memset((_s_), 0x0, sizeof(_name_)); \
254    (_s_)->nSize = sizeof(_name_);              \
255    (_s_)->nVersion.s.nVersionMajor = 0x1;      \
256    (_s_)->nVersion.s.nVersionMinor = 0x1;      \
257    (_s_)->nVersion.s.nRevision = 0x1;          \
258    (_s_)->nVersion.s.nStep = 0x0
259
260/* ======================================================================= */
261/** PV_OMXComponentCapabilityFlagsType: this communicates capabilities to opencore client
262*
263*/
264/* ==================================================================== */
265typedef struct PV_OMXComponentCapabilityFlagsType
266{
267        ////////////////// OMX COMPONENT CAPABILITY RELATED MEMBERS (for opencore compatability)
268        OMX_BOOL iIsOMXComponentMultiThreaded;
269        OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc;
270        OMX_BOOL iOMXComponentSupportsExternalInputBufferAlloc;
271        OMX_BOOL iOMXComponentSupportsMovableInputBuffers;
272        OMX_BOOL iOMXComponentSupportsPartialFrames;
273        OMX_BOOL iOMXComponentNeedsNALStartCode;
274        OMX_BOOL iOMXComponentCanHandleIncompleteFrames;
275} PV_OMXComponentCapabilityFlagsType;
276/* ======================================================================= */
277/** MP3D_COMP_PORT_TYPE: This enum is used by the OMX Component.
278*
279* @param MP3D_INPUT_PORT: Specifies Input port.
280*
281* @param MP3D_OUTPUT_PORT: Specifies Output port.
282*/
283/* ==================================================================== */
284typedef enum MP3D_COMP_PORT_TYPE {
285    MP3D_INPUT_PORT = 0,
286    MP3D_OUTPUT_PORT
287}MP3D_COMP_PORT_TYPE;
288
289/* ======================================================================= */
290/**
291 * pthread variable to indicate OMX returned all buffers to app
292 */
293/* ======================================================================= */
294    pthread_mutex_t bufferReturned_mutex;
295    pthread_cond_t bufferReturned_condition;
296
297/* ======================================================================= */
298/** OMX_INDEXAUDIOTYPE: This enum is used by the TI OMX Component.
299*
300* @param :
301*
302* @param :
303*/
304/* ==================================================================== */
305
306typedef enum OMX_INDEXAUDIOTYPE {
307    MP3D_OMX_IndexCustomMode16_24bit = 0xFF000001,
308    MP3D_OMX_IndexCustomModeDasfConfig,
309    OMX_IndexCustomMp3DecHeaderInfoConfig,
310    OMX_IndexCustomMp3DecStreamInfoConfig,
311    OMX_IndexCustomMp3DecDataPath,
312    OMX_IndexCustomDebug
313}OMX_INDEXAUDIOTYPE;
314/* ======================================================================= */
315/** MP3DEC_BUFDATA
316*
317* @param nFrames: Specifies the number of frames received by the SN.
318*
319*/
320/* ==================================================================== */
321typedef struct MP3DEC_BUFDATA {
322   OMX_U8 nFrames;
323}MP3DEC_BUFDATA;
324
325/* ======================================================================= */
326/** IAUDIO_PcmFormat: This value is used by DSP.
327*
328* @param IAUDIO_BLOCK: It is used in DASF mode.
329*
330* @param IAUDIO_INTERLEAVED: It specifies interleaved format of SN.
331*/
332/* ==================================================================== */
333typedef enum {
334    IAUDIO_BLOCK=0,
335    IAUDIO_INTERLEAVED
336} IAUDIO_PcmFormat;
337
338
339/* ======================================================================= */
340/** MP3DEC_UALGParams
341 *
342 * @param lOutputFormat - To set interleaved/Block format:Refer to IAUDIO_Mp3Format.
343 * @param DownSampleSbr -
344 */
345/* ==================================================================== */
346typedef struct {
347  OMX_U32 size;
348  unsigned long      lOutputFormat;
349  unsigned long    lMonoToStereoCopy;
350  unsigned long    lStereoToMonoCopy;
351} MP3DEC_UALGParams;
352
353
354/* ======================================================================= */
355/** MP3D_IUALG_Cmd: This enum type describes the standard set of commands that
356* will be passed to iualg control API at DSP. This enum is taken as it is from
357* DSP side USN source code.
358*
359* @param IUALG_CMD_STOP: This command indicates that higher layer framework
360* has received a stop command and no more process API will be called for the
361* current data stream. The iualg layer is expected to ensure that all processed
362* output as is put in the output IUALG_Buf buffers and the state of all buffers
363* changed as to free or DISPATCH after this function call.
364*
365* @param IUALG_CMD_PAUSE: This command indicates that higher layer framework
366* has received a PAUSE command on the current data stream. The iualg layer
367* can change the state of some of its output IUALG_Bufs to DISPATCH to enable
368* high level framework to use the processed data until the command was received.
369*
370* @param IUALG_CMD_GETSTATUS: This command indicates that some algo specific
371* status needs to be returned to the framework. The pointer to the status
372* structure will be in IALG_status * variable passed to the control API.
373* The interpretation of the content of this pointer is left to IUALG layer.
374*
375* @param IUALG_CMD_SETSTATUS: This command indicates that some algo specific
376* status needs to be set. The pointer to the status structure will be in
377* IALG_status * variable passed to the control API. The interpretation of the
378* content of this pointer is left to IUALG layer.
379*
380* @param IUALG_CMD_USERCMDSTART: The algorithm specific control commands can
381* have the enum type set from this number.
382*/
383/* ==================================================================== */
384typedef enum {
385    IUALG_CMD_STOP          = 0,
386    IUALG_CMD_PAUSE         = 1,
387    IUALG_CMD_GETSTATUS     = 2,
388    IUALG_CMD_SETSTATUS     = 3,
389    IUALG_CMD_USERCMDSTART  = 100
390}IUALG_Cmd;
391
392#ifdef UNDER_CE
393    #ifndef _OMX_EVENT_
394        #define _OMX_EVENT_
395        typedef struct OMX_Event {
396            HANDLE event;
397        } OMX_Event;
398    #endif
399    int OMX_CreateEvent(OMX_Event *event);
400    int OMX_SignalEvent(OMX_Event *event);
401    int OMX_WaitForEvent(OMX_Event *event);
402    int OMX_DestroyEvent(OMX_Event *event);
403#endif
404
405/* ======================================================================= */
406/** IUALG_MP3DCmd: This enum specifies the command to DSP.
407*
408* @param IULAG_CMD_SETSTREAMTYPE: Specifies the stream type to be sent to DSP.
409*/
410/* ==================================================================== */
411typedef enum {
412    IULAG_CMD_SETSTREAMTYPE = IUALG_CMD_USERCMDSTART
413}IUALG_MP3DCmd;
414
415/* ======================================================================= */
416/** MP3DEC_UAlgInBufParamStruct: This struct is passed with input buffers that
417 * are sent to DSP.
418*/
419/* ==================================================================== */
420typedef struct {
421    /* Set to 1 if buffer is last buffer */
422    unsigned long bLastBuffer;
423}MP3DEC_UAlgInBufParamStruct;
424
425/* ======================================================================= */
426/** MP3D_USN_AudioCodecParams: This contains the information which does to Codec
427 * on DSP
428 * are sent to DSP.
429*/
430/* ==================================================================== */
431typedef struct USN_AudioCodecParams{
432    /* Specifies the sample frequency */
433    unsigned long ulSamplingFreq;
434    /* Specifies the UUID */
435    unsigned long unUUID;
436    /* Specifies the audio format */
437    unsigned short unAudioFormat;
438}USN_AudioCodecParams;
439
440/* ======================================================================= */
441/** MP3DEC_UAlgOutBufParamStruct: This is passed with output buffer to DSP.
442*/
443/* ==================================================================== */
444typedef struct {
445    /* Number of frames in a buffer */
446    unsigned long ulFrameCount;
447    unsigned long ulIsLastBuffer;
448}MP3DEC_UAlgOutBufParamStruct;
449
450/* ======================================================================= */
451/** MP3D_LCML_BUFHEADERTYPE: This is LCML buffer header which is sent to LCML
452 * for both input and output buffers.
453*/
454/* ==================================================================== */
455typedef struct MP3D_LCML_BUFHEADERTYPE {
456    /* Direction whether input or output buffer */
457    OMX_DIRTYPE eDir;
458    /* Pointer to OMX Buffer Header */
459    OMX_BUFFERHEADERTYPE *pBufHdr;
460    /* Other parameters, may be useful for enhancements */
461    void *pOtherParams[10];
462    /* Input Parameter Information structure */
463    MP3DEC_UAlgInBufParamStruct *pIpParam;
464    /* Output Parameter Information structure */
465    MP3DEC_UAlgOutBufParamStruct *pOpParam;
466}MP3D_LCML_BUFHEADERTYPE;
467
468/* Component Port Context */
469typedef struct MP3D_AUDIODEC_PORT_TYPE {
470    /* Used in tunneling, this is handle of tunneled component */
471    OMX_HANDLETYPE hTunnelComponent;
472    /* Port which has to be tunneled */
473    OMX_U32 nTunnelPort;
474    /* Buffer Supplier Information */
475    OMX_BUFFERSUPPLIERTYPE eSupplierSetting;
476    /* Number of buffers */
477    OMX_U8 nBufferCnt;
478    /* Port format information */
479    OMX_AUDIO_PARAM_PORTFORMATTYPE* pPortFormat;
480} MP3D_AUDIODEC_PORT_TYPE;
481
482
483/* ======================================================================= */
484/** _MP3D_BUFFERLIST: This contains information about a buffer's owner whether
485 * it is application or component, number of buffers owned etc.
486*
487* @see OMX_BUFFERHEADERTYPE
488*/
489/* ==================================================================== */
490struct _MP3D_BUFFERLIST{
491    /* Array of pointer to OMX buffer headers */
492    OMX_BUFFERHEADERTYPE *pBufHdr[MP3D_MAX_NUM_OF_BUFS];
493    /* Array that tells about owner of each buffer */
494    OMX_U32 bufferOwner[MP3D_MAX_NUM_OF_BUFS];
495    /* Tracks pending buffers */
496    OMX_U32 bBufferPending[MP3D_MAX_NUM_OF_BUFS];
497    /* Number of buffers  */
498    OMX_U32 numBuffers;
499};
500
501typedef struct _MP3D_BUFFERLIST MP3D_BUFFERLIST;
502
503typedef struct StreamData{
504    OMX_U32 nSyncWord;
505    OMX_U32 nMpegVersion;
506    OMX_U32 nLayer;
507    OMX_U32 nBitRate;
508    OMX_U32 nFrequency;
509    OMX_U32 nChannelMode;
510}StreamData;
511
512
513/* ======================================================================= */
514/** MP3DEC_COMPONENT_PRIVATE: This is the major and main structure of the
515 * component which contains all type of information of buffers, ports etc
516 * contained in the component.
517*
518* @see OMX_BUFFERHEADERTYPE
519* @see OMX_AUDIO_PARAM_PORTFORMATTYPE
520* @see OMX_PARAM_PORTDEFINITIONTYPE
521* @see MP3D_LCML_BUFHEADERTYPE
522* @see OMX_PORT_PARAM_TYPE
523* @see OMX_PRIORITYMGMTTYPE
524* @see MP3D_AUDIODEC_PORT_TYPE
525* @see MP3D_BUFFERLIST
526* @see MP3D_AUDIODEC_PORT_TYPE
527* @see LCML_STRMATTR
528* @see
529*/
530/* ==================================================================== */
531typedef struct MP3DEC_COMPONENT_PRIVATE
532{
533    /** Handle for use with async callbacks */
534    OMX_CALLBACKTYPE cbInfo;
535    /** Handle for use with async callbacks */
536
537    /** Number of input buffers at runtime */
538    OMX_U32 nRuntimeInputBuffers;
539    /** Number of output buffers at runtime */
540    OMX_U32 nRuntimeOutputBuffers;
541    /** Parameters being passed to the SN */
542    USN_AudioCodecParams *pParams;
543    /**Dynamic parameters*/
544    MP3DEC_UALGParams *ptAlgDynParams;
545
546    OMX_PORT_PARAM_TYPE* sPortParam;
547    /* Input port information */
548    OMX_AUDIO_PARAM_PORTFORMATTYPE sInPortFormat;
549    /* Output port information */
550    OMX_AUDIO_PARAM_PORTFORMATTYPE sOutPortFormat;
551    /* Buffer owner information */
552    OMX_U32 bIsBufferOwned[NUM_OF_PORTS];
553
554    /** This will contain info like how many buffers
555        are there for input/output ports, their size etc, but not
556        BUFFERHEADERTYPE POINTERS. */
557    OMX_PARAM_PORTDEFINITIONTYPE* pPortDef[NUM_OF_PORTS];
558    /* Contains information that come from application */
559    OMX_AUDIO_PARAM_MP3TYPE* mp3Params;
560    OMX_AUDIO_PARAM_PCMMODETYPE* pcmParams;
561    /** This is component handle */
562    OMX_COMPONENTTYPE* pHandle;
563
564    /** Needed to free LCML lib dll **/
565    void* ptrLibLCML;
566
567    /** Current state of this component */
568    OMX_STATETYPE curState;
569
570    /** The component thread handle */
571    pthread_t ComponentThread;
572
573    /** The pipes for sending buffers to the thread */
574    int dataPipe[2];
575
576    /** The pipes for sending buffers to the thread */
577    int cmdPipe[2];
578
579    /** The pipes for sending command data to the thread */
580    int cmdDataPipe[2];
581
582    /** Set to indicate component is stopping */
583    OMX_U32 bIsEOFSent;
584
585    /** Count of number of buffers outstanding with bridge */
586    OMX_U32 lcml_nIpBuf;
587
588    /** Count of number of buffers outstanding with bridge */
589    OMX_U32 lcml_nOpBuf;
590
591    /** Counts of number of input buffers sent to LCML */
592    OMX_U32 lcml_nCntIp;
593    /** Counts of number of input buffers received from LCML */
594    OMX_U32 lcml_nCntIpRes;
595    /** Counts of number of output buffers sent to LCML */
596    OMX_U32 lcml_nCntOp;
597    /** Counts of number of output buffers received from LCML */
598    OMX_U32 lcml_nCntOpReceived;
599    /** Counts of number of buffers sent to App  */
600    OMX_U32 lcml_nCntApp;
601    /** Counts of number of buffers received from App  */
602    OMX_U32 app_nBuf;
603
604#ifdef __PERF_INSTRUMENTATION__
605    PERF_OBJHANDLE pPERF, pPERFcomp;
606    OMX_U32 nLcml_nCntIp;
607    OMX_U32 nLcml_nCntOpReceived;
608#endif
609
610    /** Counts of number of output buffers reclaimed from lcml  */
611    OMX_U32 num_Reclaimed_Op_Buff;
612    /** Counts of number of input buffers sent to lcml  */
613    OMX_U32 num_Sent_Ip_Buff;
614    /** Counts of number of output buffers sent to lcml  */
615    OMX_U32 num_Op_Issued;
616    /** Holds the value of dasf mode, 1: DASF mode or 0: File Mode  */
617    OMX_U32 dasfmode;
618    /** Holds the value of frame mode, 1: frame mode or 0: non Frame Mode  */
619    OMX_U32 frameMode;
620
621    /** This is LCML handle  */
622    OMX_HANDLETYPE pLcmlHandle;
623
624    /** Contains pointers to LCML Buffer Headers */
625    MP3D_LCML_BUFHEADERTYPE *pLcmlBufHeader[2];
626    OMX_U32 bBufferIsAllocated;
627
628    /** Tells whether buffers on ports have been allocated */
629    OMX_U32 bPortDefsAllocated;
630    /** Tells whether component thread has started */
631    OMX_U32 bCompThreadStarted;
632    /** Marks the buffer data  */
633    OMX_PTR pMarkData;
634    /** Marks the buffer */
635    OMX_MARKTYPE *pMarkBuf;
636    /** Marks the target component */
637    OMX_HANDLETYPE hMarkTargetComponent;
638    /** Flag to track when input buffer's filled length is 0 */
639    OMX_U32 bBypassDSP;
640    /** Input port enable flag */
641    int ipPortEnableFlag;
642    /** Input port disble flag */
643    int ipPortDisableFlag;
644    /** Pointer to port parameter structure */
645    OMX_PORT_PARAM_TYPE* pPortParamType;
646    /** Pointer to port priority management structure */
647    OMX_PRIORITYMGMTTYPE* pPriorityMgmt;
648
649#ifdef RESOURCE_MANAGER_ENABLED
650    RMPROXY_CALLBACKTYPE rmproxyCallback;
651#endif
652    OMX_BOOL bPreempted;
653
654    /** Contains the port related info of both the ports */
655    MP3D_AUDIODEC_PORT_TYPE *pCompPort[NUM_OF_PORTS];
656    /* Checks whether or not buffer were allocated by appliction */
657    int bufAlloced;
658    /** Flag to check about execution of component thread */
659    OMX_U16 bExitCompThrd;
660    /** Pointer to list of input buffers */
661    MP3D_BUFFERLIST *pInputBufferList;
662    /** Pointer to list of output buffers */
663    MP3D_BUFFERLIST *pOutputBufferList;
664    /** it is used for component's create phase arguments */
665    LCML_STRMATTR  *strmAttr;
666    /** Contains the version information */
667    OMX_U32 nVersion;
668
669    /** Audio Stream ID */
670    OMX_U32 streamID;
671    OMX_BOOL bIsInvalidState;
672    OMX_STRING* sDeviceString;
673    /** MPEG 1 Layer 2 custom flag **/
674    OMX_BOOL mpeg1_layer2;
675
676    int nOpBit;
677    int bLcmlHandleOpened;
678    OMX_U32 nFillThisBufferCount;
679    /** Counts number of FillBufferDone calls*/
680    OMX_U32 nFillBufferDoneCount;
681    /** Counts number of EmptyThisBuffer calls*/
682    OMX_U32 nEmptyThisBufferCount;
683    /** Counts number of EmptyBufferDone calls*/
684    OMX_U32 nEmptyBufferDoneCount;
685    /** Checks if component Init Params have been initialized */
686    OMX_U32 bInitParamsInitialized;
687    MP3D_BUFFERLIST *pInputBufferListQueue;
688    MP3D_BUFFERLIST *pOutputBufferListQueue;
689    OMX_BUFFERHEADERTYPE *pInputBufHdrPending[MP3D_MAX_NUM_OF_BUFS];
690    OMX_U32 nNumInputBufPending;
691    OMX_BUFFERHEADERTYPE *pOutputBufHdrPending[MP3D_MAX_NUM_OF_BUFS];
692    OMX_U32 nNumOutputBufPending;
693
694    /** Store buffers received while paused **/
695    OMX_BUFFERHEADERTYPE *pOutputBufHdrPause[MP3D_MAX_NUM_OF_BUFS];
696    OMX_U32 nNumOutputBufPause;
697    /** Flags to control port disable command **/
698    OMX_U32 bDisableCommandPending;
699    OMX_U32 bDisableCommandParam;
700    /** Flags to control port enable command **/
701    OMX_U32 bEnableCommandPending;
702    OMX_U32 bEnableCommandParam;
703
704    OMX_U32 nInvalidFrameCount;
705    OMX_U32 numPendingBuffers;
706    OMX_U32 bNoIdleOnStop;
707    OMX_U32 bDspStoppedWhileExecuting;
708    OMX_BOOL bLoadedCommandPending;
709
710    /** Counts number of buffers received from client */
711    OMX_U32 nHandledFillThisBuffers;
712    /** Count number of buffers recieved from client */
713    OMX_U32 nHandledEmptyThisBuffers;
714    OMX_BOOL bFlushOutputPortCommandPending;
715    OMX_BOOL bFlushInputPortCommandPending;
716
717#ifndef UNDER_CE
718    pthread_mutex_t AlloBuf_mutex;
719    pthread_cond_t AlloBuf_threshold;
720    OMX_U8 AlloBuf_waitingsignal;
721
722    pthread_mutex_t codecStop_mutex;
723    pthread_cond_t codecStop_threshold;
724    OMX_U8 codecStop_waitingsignal;
725
726    pthread_mutex_t codecFlush_mutex;
727    pthread_cond_t codecFlush_threshold;
728    OMX_U8 codecFlush_waitingsignal;
729
730    pthread_mutex_t InLoaded_mutex;
731    pthread_cond_t InLoaded_threshold;
732    OMX_U8 InLoaded_readytoidle;
733
734    pthread_mutex_t InIdle_mutex;
735    pthread_cond_t InIdle_threshold;
736    OMX_U8 InIdle_goingtoloaded;
737
738#else
739    OMX_Event AlloBuf_event;
740    OMX_U8 AlloBuf_waitingsignal;
741
742    OMX_Event InLoaded_event;
743    OMX_U8 InLoaded_readytoidle;
744
745    OMX_Event InIdle_event;
746    OMX_U8 InIdle_goingtoloaded;
747#endif
748
749    OMX_PARAM_COMPONENTROLETYPE componentRole;
750
751    /** Keep buffer timestamps **/
752    OMX_S64 arrBufIndex[MP3D_MAX_NUM_OF_BUFS];
753	/**Keep buffer tickcounts*/
754    OMX_U32 arrBufIndexTick[MP3D_MAX_NUM_OF_BUFS];
755
756    /** Index to arrBufIndex[] and arrBufIndexTick[], used for input buffer timestamps */
757    OMX_U8 IpBufindex;
758    /** Index to arrBufIndex[] and arrBufIndexTick[], used for output buffer timestamps */
759    OMX_U8 OpBufindex;
760
761    OMX_U8 SendAfterEOS;
762
763    /** Flag to mark the first buffer sent **/
764    OMX_U8 first_buff;
765
766    /** First Time Stamp sent **/
767    OMX_S64 first_TS;
768    /** Temp Time Stamp to store intermediate values **/
769    OMX_S64 temp_TS;
770    /** Last buffer received usind in PV-Android context **/
771    OMX_BUFFERHEADERTYPE *lastout;
772
773    PV_OMXComponentCapabilityFlagsType iPVCapabilityFlags;
774    OMX_BOOL reconfigInputPort;
775    OMX_BOOL reconfigOutputPort;
776    OMX_BOOL bConfigData;
777
778    StreamData pStreamData;
779
780    struct OMX_TI_Debug dbg;
781
782} MP3DEC_COMPONENT_PRIVATE;
783
784
785/* ================================================================================= * */
786/**
787* OMX_ComponentInit() function is called by OMX Core to initialize the component
788* with default values of the component. Before calling this function OMX_Init
789* must have been called.
790*
791* @param *hComp This is component handle allocated by the OMX core.
792*
793* @pre          OMX_Init should be called by application.
794*
795* @post         Component has initialzed with default values.
796*
797*  @return      OMX_ErrorNone = Successful Inirialization of the component\n
798*               OMX_ErrorInsufficientResources = Not enough memory
799*
800*  @see          Mp3Dec_StartCompThread()
801*/
802/* ================================================================================ * */
803#ifndef UNDER_CE
804OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp);
805#else
806/*  WinCE Implicit Export Syntax */
807#define OMX_EXPORT __declspec(dllexport)
808OMX_EXPORT OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp);
809#endif
810
811
812/* ================================================================================= * */
813/**
814* Mp3Dec_StartCompThread() starts the component thread. This is internal
815* function of the component.
816*
817* @param pHandle This is component handle allocated by the OMX core.
818*
819* @pre          None
820*
821* @post         None
822*
823*  @return      OMX_ErrorNone = Successful Inirialization of the component\n
824*               OMX_ErrorInsufficientResources = Not enough memory
825*
826*  @see         None
827*/
828/* ================================================================================ * */
829OMX_ERRORTYPE Mp3Dec_StartCompThread(OMX_HANDLETYPE pHandle);
830
831
832/* ================================================================================= * */
833/**
834* MP3DEC_Fill_LCMLInitParams() fills the LCML initialization structure.
835*
836* @param pHandle This is component handle allocated by the OMX core.
837*
838* @param plcml_Init This structure is filled and sent to LCML.
839*
840* @pre          None
841*
842* @post         None
843*
844*  @return      OMX_ErrorNone = Successful Inirialization of the LCML struct.
845*               OMX_ErrorInsufficientResources = Not enough memory
846*
847*  @see         None
848*/
849/* ================================================================================ * */
850OMX_ERRORTYPE MP3DEC_Fill_LCMLInitParams(OMX_HANDLETYPE pHandle, LCML_DSP *plcml_Init, OMX_U16 arr[]);
851
852
853/* ================================================================================= * */
854/**
855* MP3DEC_GetBufferDirection() function determines whether it is input buffer or
856* output buffer.
857*
858* @param *pBufHeader This is pointer to buffer header whose direction needs to
859*                    be determined.
860*
861* @param *eDir  This is output argument which stores the direction of buffer.
862*
863* @pre          None
864*
865* @post         None
866*
867*  @return      OMX_ErrorNone = Successful processing.
868*               OMX_ErrorBadParameter = In case of invalid buffer
869*
870*  @see         None
871*/
872/* ================================================================================ * */
873OMX_ERRORTYPE MP3DEC_GetBufferDirection(OMX_BUFFERHEADERTYPE *pBufHeader, OMX_DIRTYPE *eDir);
874
875/* ================================================================================= * */
876/**
877* MP3DEC_LCML_Callback() function is callback which is called by LCML whenever
878* there is an even generated for the component.
879*
880* @param event  This is event that was generated.
881*
882* @param arg    This has other needed arguments supplied by LCML like handles
883*               etc.
884*
885* @pre          None
886*
887* @post         None
888*
889*  @return      OMX_ErrorNone = Successful processing.
890*               OMX_ErrorInsufficientResources = Not enough memory
891*
892*  @see         None
893*/
894/* ================================================================================ * */
895OMX_ERRORTYPE MP3DEC_LCML_Callback (TUsnCodecEvent event,void * args [10]);
896
897/* ================================================================================= * */
898/**
899* MP3DEC_HandleCommand() function handles the command sent by the application.
900* All the state transitions, except from nothing to loaded state, of the
901* component are done by this function.
902*
903* @param pComponentPrivate  This is component's private date structure.
904*
905* @pre          None
906*
907* @post         None
908*
909*  @return      OMX_ErrorNone = Successful processing.
910*               OMX_ErrorInsufficientResources = Not enough memory
911*               OMX_ErrorHardware = Hardware error has occured lile LCML failed
912*               to do any said operartion.
913*
914*  @see         None
915*/
916/* ================================================================================ * */
917OMX_U32 MP3DEC_HandleCommand (MP3DEC_COMPONENT_PRIVATE *pComponentPrivate);
918
919/* ================================================================================= * */
920/**
921* MP3DEC_HandleDataBuf_FromApp() function handles the input and output buffers
922* that come from the application. It is not direct function wich gets called by
923* the application rather, it gets called eventually.
924*
925* @param *pBufHeader This is the buffer header that needs to be processed.
926*
927* @param *pComponentPrivate  This is component's private date structure.
928*
929* @pre          None
930*
931* @post         None
932*
933*  @return      OMX_ErrorNone = Successful processing.
934*               OMX_ErrorInsufficientResources = Not enough memory
935*               OMX_ErrorHardware = Hardware error has occured lile LCML failed
936*               to do any said operartion.
937*
938*  @see         None
939*/
940/* ================================================================================ * */
941OMX_ERRORTYPE MP3DEC_HandleDataBuf_FromApp(OMX_BUFFERHEADERTYPE *pBufHeader, MP3DEC_COMPONENT_PRIVATE *pComponentPrivate);
942
943/* ================================================================================= * */
944/**
945* MP3DEC_GetLCMLHandle() function gets the LCML handle and interacts with LCML
946* by using this LCML Handle.
947*
948* @param *pBufHeader This is the buffer header that needs to be processed.
949*
950* @param *pComponentPrivate  This is component's private date structure.
951*
952* @pre          None
953*
954* @post         None
955*
956*  @return      OMX_HANDLETYPE = Successful loading of LCML library.
957*               OMX_ErrorHardware = Hardware error has occured.
958*
959*  @see         None
960*/
961/* ================================================================================ * */
962OMX_HANDLETYPE MP3DEC_GetLCMLHandle(MP3DEC_COMPONENT_PRIVATE* pComponentPrivate);
963
964/* ================================================================================= * */
965/**
966* MP3DEC_GetCorresponding_LCMLHeader() function gets the corresponding LCML
967* header from the actual data buffer for required processing.
968*
969* @param *pBuffer This is the data buffer pointer.
970*
971* @param eDir   This is direction of buffer. Input/Output.
972*
973* @param *MP3D_LCML_BUFHEADERTYPE  This is pointer to LCML Buffer Header.
974*
975* @pre          None
976*
977* @post         None
978*
979*  @return      OMX_ErrorNone = Successful Inirialization of the component\n
980*               OMX_ErrorHardware = Hardware error has occured.
981*
982*  @see         None
983*/
984/* ================================================================================ * */
985OMX_ERRORTYPE MP3DEC_GetCorresponding_LCMLHeader(MP3DEC_COMPONENT_PRIVATE* pComponentPrivate,
986                                                                                OMX_U8 *pBuffer,
987                                        OMX_DIRTYPE eDir,
988                                        MP3D_LCML_BUFHEADERTYPE **ppLcmlHdr);
989/* ================================================================================= * */
990/**
991* MP3DEC_FreeCompResources() function frees the component resources.
992*
993* @param pComponent This is the component handle.
994*
995* @pre          None
996*
997* @post         None
998*
999*  @return      OMX_ErrorNone = Successful Inirialization of the component\n
1000*               OMX_ErrorHardware = Hardware error has occured.
1001*
1002*  @see         None
1003*/
1004/* ================================================================================ * */
1005OMX_ERRORTYPE MP3DEC_FreeCompResources(OMX_HANDLETYPE pComponent);
1006
1007
1008/* ================================================================================= * */
1009/**
1010* MP3DEC_CleanupInitParams() function frees only the initialization time
1011* memories allocated. For example, it will not close pipes, it will not free the
1012* memory allocated to the buffers etc. But it does free the memory of buffers
1013* utilized by the LCML etc. It is basically subset of MP3DEC_FreeResources()
1014* function.
1015*
1016* @param pComponent This is the component handle.
1017*
1018* @pre          None
1019*
1020* @post         None
1021*
1022*  @return      OMX_ErrorNone = Successful Inirialization of the component\n
1023*
1024*  @see         None
1025*/
1026/* ================================================================================ * */
1027void MP3DEC_CleanupInitParams(OMX_HANDLETYPE pComponent);
1028/* ================================================================================= * */
1029/**
1030* MP3DEC_CleanupInitParamsEx() function frees only the initialization time
1031* memories allocated. For example, it will not close pipes, it will not free the
1032* memory allocated to the buffers etc. But it does free the memory of buffers
1033* utilized by the LCML etc. It is basically subset of MP3DEC_FreeResources()
1034* function. Called while port disable when port reconfiguration takes place.
1035*
1036* @param pComponent This is the component handle.
1037*
1038* @pre          None
1039*
1040* @post         None
1041*
1042*  @return      OMX_ErrorNone = Successful Inirialization of the component\n
1043*
1044*  @see         None
1045*/
1046/* ================================================================================ * */
1047void MP3DEC_CleanupInitParamsEx(OMX_HANDLETYPE pComponent,OMX_U32 indexport);
1048
1049#ifdef RESOURCE_MANAGER_ENABLED
1050/* =================================================================================== */
1051/**
1052*  MP3_ResourceManagerCallback() Callback from Resource Manager
1053*
1054*  @param cbData	RM Proxy command data
1055*
1056*  @return None
1057*/
1058/* =================================================================================== */
1059void MP3_ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData);
1060#endif
1061
1062OMX_ERRORTYPE MP3DECFill_LCMLInitParamsEx(OMX_HANDLETYPE pComponent,OMX_U32 indexport);
1063void MP3DEC_SetPending(MP3DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber);
1064void MP3DEC_ClearPending(MP3DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber) ;
1065OMX_U32 MP3DEC_IsPending(MP3DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir);
1066OMX_U32 MP3DEC_IsValid(MP3DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U8 *pBuffer, OMX_DIRTYPE eDir) ;
1067void* MP3DEC_ComponentThread (void* pThreadData);
1068
1069/*  =========================================================================*/
1070/*  func    GetBits                                                          */
1071/*                                                                           */
1072/*  desc    Gets aBits number of bits from position aPosition of one buffer  */
1073/*            and returns the value in a TUint value.                        */
1074/*  =========================================================================*/
1075OMX_U32 MP3DEC_GetBits(OMX_U32* nPosition, OMX_U8 nBits, OMX_U8* pBuffer, OMX_BOOL bIcreasePosition);
1076
1077/*=======================================================================*/
1078/*! @fn SignalIfAllBuffersAreReturned
1079
1080 * @brief Sends pthread signal to indicate OMX has returned all buffers to app
1081
1082 * @param  none
1083
1084 * @Return void
1085
1086 */
1087/*=======================================================================*/
1088void SignalIfAllBuffersAreReturned(MP3DEC_COMPONENT_PRIVATE *pComponentPrivate);
1089
1090/*  =========================================================================*/
1091/*  func    MP3DEC_HandleUSNError
1092/*
1093/*  desc    Handles error messages returned by the dsp
1094/*
1095/*@return n/a
1096/*
1097/*  =========================================================================*/
1098void MP3DEC_HandleUSNError (MP3DEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 arg);
1099
1100#endif
1101