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