blob: c516816dc6d78fcb0d89814bc15999de189335fc [file] [log] [blame]
/*
* Copyright (C) Texas Instruments - http://www.ti.com/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* =============================================================================
* Texas Instruments OMAP(TM) Platform Software
* (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
*
* Use of this software is controlled by the terms and conditions found
* in the license agreement under which this software has been supplied.
* ============================================================================ */
/**
* @file OMX_AacDec_Utils.h
*
* This is an header file for an audio AAC decoder that is fully
* compliant with the OMX Audio specification.
* This the file is used internally by the component
* in its code.
*
* @path $(CSLPATH)\OMAPSW_MPU\linux\audio\src\openmax_il\aac_dec\inc\
*
* @rev 1.0
*/
/* --------------------------------------------------------------------------- */
#ifndef OMX_AACDEC_UTILS__H
#define OMX_AACDEC_UTILS__H
#include <OMX_Component.h>
#include <OMX_TI_Common.h>
#include <OMX_TI_Debug.h>
#include "LCML_DspCodec.h"
#include <pthread.h>
#include <sched.h>
#ifdef RESOURCE_MANAGER_ENABLED
#include <ResourceManagerProxyAPI.h>
#endif
#ifdef UNDER_CE
#include <windows.h>
#include <oaf_osal.h>
#include <omx_core.h>
#include <stdlib.h>
#endif
#ifndef UNDER_CE
#define AUDIO_MANAGER
#else
#undef AUDIO_MANAGER
#endif
#ifdef __PERF_INSTRUMENTATION__
#include "perf.h"
#endif
#ifndef ANDROID
#define ANDROID
#endif
#ifdef ANDROID
/* Log for Android system*/
#undef LOG_TAG
#define LOG_TAG "OMX_AACDEC"
/* PV opencore capability custom parameter index */
#define PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX 0xFF7A347
#endif
#define OBJECTTYPE_LC 2
#define OBJECTTYPE_LTP 4
#define OBJECTTYPE_HE 5
#define OBJECTTYPE_HE2 29
#define EXIT_COMPONENT_THRD 10
/* ======================================================================= */
/**
* @def AAC_DEC__XXX_VER Component version
*/
/* ======================================================================= */
#define AACDEC_MAJOR_VER 1
#define AACDEC_MINOR_VER 1
/* ======================================================================= */
/**
* @def NOT_USED_AACDEC Defines a value for "don't care" parameters
*/
/* ======================================================================= */
#define NOT_USED_AACDEC 0
/* ======================================================================= */
/**
* @def NORMAL_BUFFER_AACDEC Defines the flag value with all flags turned off
*/
/* ======================================================================= */
#define NORMAL_BUFFER_AACDEC 0
/* ======================================================================= */
/**
* @def OMX_AACDEC_DEFAULT_SEGMENT Default segment ID for the LCML
*/
/* ======================================================================= */
#define OMX_AACDEC_DEFAULT_SEGMENT (0)
/* ======================================================================= */
/**
* @def OMX_AACDEC_SN_TIMEOUT Timeout value for the socket node
*/
/* ======================================================================= */
#define OMX_AACDEC_SN_TIMEOUT (-1)
/* ======================================================================= */
/**
* @def OMX_AACDEC_SN_PRIORITY Priority for the socket node
*/
/* ======================================================================= */
#define OMX_AACDEC_SN_PRIORITY (10)
/* ======================================================================= */
/**
* @def OMX_AACDEC_NUM_DLLS number of DLL's
*/
/* ======================================================================= */
#define OMX_AACDEC_NUM_DLLS (2)
#define AACDEC_BUFHEADER_VERSION 0x1
/* ======================================================================= */
/**
** Default timeout used to come out of blocking calls*
*
*/
/* ======================================================================= */
#define AACD_TIMEOUT (1000) /* millisecs */
/* ======================================================================= */
/**
* Wince #define
*
*/
/* ======================================================================= */
#ifdef UNDER_CE
#define sleep Sleep
#endif
/* ======================================================================= */
/**
* @def AACDEC_USN_DLL_NAME USN DLL name
*/
/* ======================================================================= */
#ifdef UNDER_CE
#define AACDEC_USN_DLL_NAME "\\windows\\usn.dll64P"
#else
#define AACDEC_USN_DLL_NAME "usn.dll64P"
#endif
/* ======================================================================= */
/**
* @def AACDEC_DLL_NAME AAC Dec Decoder socket node DLL name
*/
/* ======================================================================= */
#ifdef UNDER_CE
#define AACDEC_DLL_NAME "\\windows\\mpeg4aacdec_sn.dll64P"
#else
#define AACDEC_DLL_NAME "mpeg4aacdec_sn.dll64P"
#endif
#define DONT_CARE 0
/* ======================================================================= */
/**
* @def AACDEC_CPU_USAGE for Resource Mannager (MHZ)
*/
/* ======================================================================= */
#define AACDEC_CPU_USAGE 50
/* ======================================================================= */
/**
* @def AACDEC_SBR_CONTENT flag detection
*/
/* ======================================================================= */
#define AACDEC_SBR_CONTENT 0x601
/* ======================================================================= */
/**
* @def AACDEC_PS_CONTENT flag detection
*/
/* ======================================================================= */
#define AACDEC_PS_CONTENT 0x602
/* ======================================================================= */
/**
* @def AACDEC_DEBUG Debug print macro
*/
/* ======================================================================= */
#undef AACDEC_DEBUG
#define _ERROR_PROPAGATION__
#ifdef UNDER_CE
/* ======================================================================= */
/**
* @def DEBUG Memory print macro
*/
/* ======================================================================= */
#if DEBUG
#define AACDEC_DPRINT printf
#define AACDEC_MEMPRINT printf
#define AACDEC_STATEPRINT printf
#define AACDEC_BUFPRINT printf
#define AACDEC_MEMPRINT printf
#define AACDEC_EPRINT printf
#else
#define AACDEC_DPRINT
#define AACDEC_MEMPRINT
#define AACDEC_STATEPRINT
#define AACDEC_BUFPRINT
#define AACDEC_MEMPRINT
#define AACDEC_EPRINT
#endif
#else /* for Linux */
#ifdef AACDEC_DEBUG
#define AACDEC_DPRINT printf
#undef AACDEC_BUFPRINT printf
#undef AACDEC_MEMPRINT printf
#define AACDEC_STATEPRINT printf
#else
#define AACDEC_DPRINT(...)
#endif
#ifdef AACDEC_STATEDETAILS
#define AACDEC_STATEPRINT printf
#else
#define AACDEC_STATEPRINT(...)
#endif
#ifdef AACDEC_BUFDETAILS
#define AACDEC_BUFPRINT printf
#else
#define AACDEC_BUFPRINT(...)
#endif
#ifdef AACDEC_MEMDETAILS
#define AACDEC_MEMPRINT(...) fprintf(stdout, "%s %d:: ",__FUNCTION__, __LINE__); \
fprintf(stdout, __VA_ARGS__); \
fprintf(stdout, "\n");
#else
#define AACDEC_MEMPRINT(...)
#endif
#define AACDEC_EPRINT ALOGE
#endif
/* ======================================================================= */
/**
* @def AACDEC_OMX_ERROR_EXIT Exit print and return macro
*/
/* ======================================================================= */
#define AACDEC_OMX_ERROR_EXIT(_e_, _c_, _s_) \
_e_ = _c_; \
OMXDBG_PRINT(stderr, ERROR, 4, 0, "\n**************** OMX ERROR ************************\n"); \
OMXDBG_PRINT(stderr, ERROR, 4, 0, "%d : Error Name: %s : Error Num = %x",__LINE__, _s_, _e_); \
OMXDBG_PRINT(stderr, ERROR, 4, 0, "\n**************** OMX ERROR ************************\n"); \
goto EXIT;
/* ======================================================================= */
/**
* @def AACDEC_OMX_CONF_CHECK_CMD Command check Macro
*/
/* ======================================================================= */
#define AACDEC_OMX_CONF_CHECK_CMD(_ptr1, _ptr2, _ptr3) \
{ \
if(!_ptr1 || !_ptr2 || !_ptr3){ \
eError = OMX_ErrorBadParameter; \
goto EXIT; \
} \
}
/* ======================================================================= */
/**
* @def OMX_CONF_INIT_STRUCT Macro to Initialise the structure variables
*/
/* ======================================================================= */
#define OMX_CONF_INIT_STRUCT(_s_, _name_) \
memset((_s_), 0x0, sizeof(_name_)); \
(_s_)->nSize = sizeof(_name_); \
(_s_)->nVersion.s.nVersionMajor = 1; \
(_s_)->nVersion.s.nVersionMinor = 1; \
(_s_)->nVersion.s.nRevision = 0x0; \
(_s_)->nVersion.s.nStep = 0x0
/* ======================================================================= */
/**
* @def AACDEC_BUFDETAILS Turns buffer messaging on and off
*/
/* ======================================================================= */
#undef AACDEC_BUFDETAILS
/* ======================================================================= */
/**
* @def AACDEC_STATEDETAILS Turns state messaging on and off
*/
/* ======================================================================= */
#undef AACDEC_STATEDETAILS
/* ======================================================================= */
/**
* @def AACDEC_MEMDETAILS Turns memory messaging on and off
*/
/* ======================================================================= */
#undef AACDEC_MEMDETAILS
#define AACDEC_OUTPUT_PORT 1
#define AACDEC_INPUT_PORT 0
#define AACDEC_APP_ID 100
#define MAX_NUM_OF_BUFS_AACDEC 15
#define PARAMETRIC_STEREO_AACDEC 1
#define NON_PARAMETRIC_STEREO_AACDEC 0
/* ======================================================================= */
/**
* @def NUM_OF_PORTS_AACDEC Number of ports
*/
/* ======================================================================= */
#define NUM_OF_PORTS_AACDEC 2
/* ======================================================================= */
/**
* @def STREAM_COUNT_AACDEC Number of streams
*/
/* ======================================================================= */
#define STREAM_COUNT_AACDEC 2
/** Default timeout used to come out of blocking calls*/
/* ======================================================================= */
/**
* @def AACD_NUM_INPUT_BUFFERS Default number of input buffers
*
*/
/* ======================================================================= */
#define AACD_NUM_INPUT_BUFFERS 4
/* ======================================================================= */
/**
* @def AACD_NUM_OUTPUT_BUFFERS Default number of output buffers
*
*/
/* ======================================================================= */
#define AACD_NUM_OUTPUT_BUFFERS 4
/* ======================================================================= */
/**
* @def AACD_INPUT_BUFFER_SIZE Default input buffer size
*
*/
/* ======================================================================= */
#define AACD_INPUT_BUFFER_SIZE 1536*4
/* ======================================================================= */
/**
* @def AACD_OUTPUT_BUFFER_SIZE Default output buffer size
*
*/
/* ======================================================================= */
#define AACD_OUTPUT_BUFFER_SIZE 8192*2
/* ======================================================================= */
/**
* @def AACD_SAMPLING_FREQUENCY Sampling frequency
*/
/* ======================================================================= */
#define AACD_SAMPLING_FREQUENCY 44100
/* ======================================================================= */
/**
* @def AACDec macros for MONO,STEREO_INTERLEAVED,STEREO_NONINTERLEAVED
*/
/* ======================================================================= */
/*#define AACD_STEREO_INTERLEAVED_STREAM 2
#define AACD_STEREO_NONINTERLEAVED_STREAM 3*/
/* ======================================================================= */
/**
* @def AACDec macros for MONO,STEREO_INTERLEAVED,STEREO_NONINTERLEAVED
*/
/* ======================================================================= */
/* Stream types supported*/
#define MONO_STREAM_AACDEC 1
#define STEREO_INTERLEAVED_STREAM_AACDEC 2
#define STEREO_NONINTERLEAVED_STREAM_AACDEC 3
/* ======================================================================= */
/**
* pthread variable to indicate OMX returned all buffers to app
*/
/* ======================================================================= */
pthread_mutex_t bufferReturned_mutex;
pthread_cond_t bufferReturned_condition;
/**
*
* AAC Decoder Profile:0 - MAIN, 1 - LC, 2 - SSR, 3 - LTP.
*/
typedef enum {
EProfileMain,
EProfileLC,
EProfileSSR,
EProfileLTP
}AACProfile;
/* ======================================================================= */
/** COMP_PORT_TYPE_AACDEC Port types
*
* @param INPUT_PORT_AACDEC Input port
*
* @param OUTPUT_PORT_AACDEC Output port
*/
/* ==================================================================== */
/*This enum must not be changed. */
typedef enum COMP_PORT_TYPE_AACDEC {
INPUT_PORT_AACDEC = 0,
OUTPUT_PORT_AACDEC
}COMP_PORT_TYPE_AACDEC;
/* ======================================================================= */
/** OMX_INDEXAUDIOTYPE_AACDEC Defines the custom configuration settings
* for the component
*
* @param OMX_IndexCustomMode16_24bit_AACDEC Sets the 16/24 mode
*
* @param OMX_IndexCustomModeProfile_AACDEC Sets the Profile mode
*
* @param OMX_IndexCustomModeSBR_AACDEC Sets the SBR mode
*
* @param OMX_IndexCustomModeDasfConfig_AACDEC Sets the DASF mode
*
* @param OMX_IndexCustomModeRAW_AACDEC Sets the RAW mode
*
* @param OMX_IndexCustomModePS_AACDEC Sets the ParametricStereo mode
*
*/
/* ==================================================================== */
typedef enum OMX_INDEXAUDIOTYPE_AACDEC {
OMX_IndexCustomAacDecHeaderInfoConfig = 0xFF000001,
OMX_IndexCustomAacDecStreamIDConfig,
OMX_IndexCustomAacDecDataPath,
OMX_IndexCustomDebug
}OMX_INDEXAUDIOTYPE_AACDEC;
/* ======================================================================= */
/** IAUDIO_PcmFormat: This value is used by DSP.
*
* @param IAUDIO_BLOCK: It is used in DASF mode.
*
* @param IAUDIO_INTERLEAVED: It specifies interleaved format of SN.
*/
/* ==================================================================== */
typedef enum {
EAUDIO_BLOCK =0,
EAUDIO_INTERLEAVED
}TAUDIO_AacFormat;
/* ======================================================================= */
/** IAUDIO_PcmFormat: This value is used by DSP.
*
* @param IAUDIO_BLOCK: It is used in DASF mode.
*
* @param IAUDIO_INTERLEAVED: It specifies interleaved format of SN.
*/
/* ==================================================================== */
typedef enum {
IAUDIO_BLOCK=0,
IAUDIO_INTERLEAVED
} IAUDIO_PcmFormat;
/* ======================================================================= */
/** MPEG4AACDEC_UALGParams
*
* @param lOutputFormat - To set interleaved/Block format:Refer to IAUDIO_AacFormat.
* @param DownSampleSbr -
*/
/* ==================================================================== */
typedef struct {
OMX_U32 size;
long lOutputFormat;
long DownSampleSbr;
long iEnablePS;
long lSamplingRateIdx;
long bRawFormat;
long dualMonoMode;
} MPEG4AACDEC_UALGParams;
/* ======================================================================= */
/** IUALG_Cmd_AAC_DEC: This enum type describes the standard set of commands that
* will be passed to iualg control API at DSP. This enum is taken as it is from
* DSP side USN source code.
*
* @param IUALG_CMD_STOP: This command indicates that higher layer framework
* has received a stop command and no more process API will be called for the
* current data stream. The iualg layer is expected to ensure that all processed
* output as is put in the output IUALG_Buf buffers and the state of all buffers
* changed as to free or DISPATCH after this function call.
*
* @param IUALG_CMD_PAUSE: This command indicates that higher layer framework
* has received a PAUSE command on the current data stream. The iualg layer
* can change the state of some of its output IUALG_Bufs to DISPATCH to enable
* high level framework to use the processed data until the command was received.
*
* @param IUALG_CMD_GETSTATUS: This command indicates that some algo specific
* status needs to be returned to the framework. The pointer to the status
* structure will be in IALG_status * variable passed to the control API.
* The interpretation of the content of this pointer is left to IUALG layer.
*
* @param IUALG_CMD_SETSTATUS: This command indicates that some algo specific
* status needs to be set. The pointer to the status structure will be in
* IALG_status * variable passed to the control API. The interpretation of the
* content of this pointer is left to IUALG layer.
*
* @param IUALG_CMD_USERCMDSTART: The algorithm specific control commands can
* have the enum type set from this number.
*/
/* ==================================================================== */
typedef enum {
IUALG_CMD_STOP = 0,
IUALG_CMD_PAUSE = 1,
IUALG_CMD_GETSTATUS = 2,
IUALG_CMD_SETSTATUS = 3,
IUALG_CMD_USERCMDSTART_AACDEC = 100
}IUALG_Cmd_AAC_DEC;
typedef enum{
IAAC_WARN_DATA_CORRUPT = 0x0804
}IAAC_WARN_MSG;
#ifdef UNDER_CE
#ifndef _OMX_EVENT_
#define _OMX_EVENT_
typedef struct OMX_Event {
HANDLE event;
} OMX_Event;
#endif
int OMX_CreateEvent(OMX_Event *event);
int OMX_SignalEvent(OMX_Event *event);
int OMX_WaitForEvent(OMX_Event *event);
int OMX_DestroyEvent(OMX_Event *event);
#endif
/* ======================================================================= */
/** IUALG_PCMDCmd: This enum specifies the command to DSP.
*
* @param IULAG_CMD_SETSTREAMTYPE: Specifies the stream type to be sent to DSP.
*/
/* ==================================================================== */
typedef enum {
IULAG_CMD_SETSTREAMTYPE = IUALG_CMD_USERCMDSTART_AACDEC
}IUALG_PCMDCmd;
/* ======================================================================= */
/** AACDEC_UAlgInBufParamStruct: This struct is passed with input buffers that
* are sent to DSP.
*/
/* ==================================================================== */
typedef struct {
/* Set to 1 if buffer is last buffer */
unsigned short bLastBuffer;
unsigned short bConcealBuffer;
}AACDEC_UAlgInBufParamStruct;
/* ======================================================================= */
/** USN_AudioCodecParams: This contains the information which does to Codec
* on DSP
* are sent to DSP.
*/
/* ==================================================================== */
typedef struct USN_AudioCodecParams{
/* Specifies the sample frequency */
unsigned long ulSamplingFreq;
/* Specifies the UUID */
unsigned long unUUID;
/* Specifies the audio format */
unsigned short unAudioFormat;
}USN_AudioCodecParams;
/* ======================================================================= */
/** AACDEC_UAlgOutBufParamStruct: This is passed with output buffer to DSP.
*/
/* ==================================================================== */
typedef struct {
unsigned long ulFrameCount;
unsigned long isLastBuffer;
}AACDEC_UAlgOutBufParamStruct;
typedef struct AACDEC_UALGParams{
unsigned long lOutputFormat;
unsigned long lMonoToStereoCopy;
} AACDEC_UALGParams;
/* ======================================================================= */
/** AACD_LCML_BUFHEADERTYPE: This is LCML buffer header which is sent to LCML
* for both input and output buffers.
*/
/* ==================================================================== */
typedef struct AACD_LCML_BUFHEADERTYPE {
/* Direction whether input or output buffer */
OMX_DIRTYPE eDir;
/* Pointer to OMX Buffer Header */
OMX_BUFFERHEADERTYPE *pBufHdr;
/* Other parameters, may be useful for enhancements */
void *pOtherParams[10];
/* Input Parameter Information structure */
AACDEC_UAlgInBufParamStruct *pIpParam;
/* Output Parameter Information structure */
AACDEC_UAlgOutBufParamStruct *pOpParam;
}AACD_LCML_BUFHEADERTYPE;
/* Component Port Context */
typedef struct AUDIODEC_PORT_TYPE {
/* Used in tunneling, this is handle of tunneled component */
OMX_HANDLETYPE hTunnelComponent;
/* Port which has to be tunneled */
OMX_U32 nTunnelPort;
/* Buffer Supplier Information */
OMX_BUFFERSUPPLIERTYPE eSupplierSetting;
/* Number of buffers */
OMX_U8 nBufferCnt;
/* Port format information */
OMX_AUDIO_PARAM_PORTFORMATTYPE* pPortFormat;
} AUDIODEC_PORT_TYPE;
/* ======================================================================= */
/** AAC_DEC_BUFFERLIST: This contains information about a buffer's owner whether
* it is application or component, number of buffers owned etc.
*
* @see OMX_BUFFERHEADERTYPE
*/
/* ==================================================================== */
struct AAC_DEC_BUFFERLIST{
/* Array of pointer to OMX buffer headers */
OMX_BUFFERHEADERTYPE *pBufHdr[MAX_NUM_OF_BUFS_AACDEC];
/* Array that tells about owner of each buffer */
OMX_U32 bufferOwner[MAX_NUM_OF_BUFS_AACDEC];
/* Tracks pending buffers */
OMX_U32 bBufferPending[MAX_NUM_OF_BUFS_AACDEC];
/* Number of buffers */
OMX_U32 numBuffers;
};
typedef struct AAC_DEC_BUFFERLIST AACDEC_BUFFERLIST;
typedef struct PV_OMXComponentCapabilityFlagsType
{
////////////////// OMX COMPONENT CAPABILITY RELATED MEMBERS (for opencore compatability)
OMX_BOOL iIsOMXComponentMultiThreaded;
OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc;
OMX_BOOL iOMXComponentSupportsExternalInputBufferAlloc;
OMX_BOOL iOMXComponentSupportsMovableInputBuffers;
OMX_BOOL iOMXComponentSupportsPartialFrames;
OMX_BOOL iOMXComponentNeedsNALStartCode;
OMX_BOOL iOMXComponentCanHandleIncompleteFrames;
} PV_OMXComponentCapabilityFlagsType;
/* ======================================================================= */
/** AACDEC_COMPONENT_PRIVATE: This is the major and main structure of the
* component which contains all type of information of buffers, ports etc
* contained in the component.
*
* @see OMX_BUFFERHEADERTYPE
* @see OMX_AUDIO_PARAM_PORTFORMATTYPE
* @see OMX_PARAM_PORTDEFINITIONTYPE
* @see AACD_LCML_BUFHEADERTYPE
* @see OMX_PORT_PARAM_TYPE
* @see OMX_PRIORITYMGMTTYPE
* @see AUDIODEC_PORT_TYPE
* @see AACDEC_BUFFERLIST
* @see LCML_STRMATTR
* @see
*/
/* ==================================================================== */
typedef struct AACDEC_COMPONENT_PRIVATE
{
OMX_CALLBACKTYPE cbInfo;
/** Handle for use with async callbacks */
OMX_PORT_PARAM_TYPE* sPortParam;
/* Input port information */
OMX_AUDIO_PARAM_PORTFORMATTYPE sInPortFormat;
/* Output port information */
OMX_AUDIO_PARAM_PORTFORMATTYPE sOutPortFormat;
/* Buffer owner information */
OMX_U32 bIsBufferOwned[NUM_OF_PORTS_AACDEC];
/** This will contain info like how many buffers
are there for input/output ports, their size etc, but not
BUFFERHEADERTYPE POINTERS. */
OMX_PARAM_PORTDEFINITIONTYPE* pPortDef[NUM_OF_PORTS_AACDEC];
/* Contains information that come from application */
OMX_AUDIO_PARAM_AACPROFILETYPE* aacParams;
OMX_AUDIO_PARAM_PCMMODETYPE* pcmParams;
/** This is component handle */
OMX_COMPONENTTYPE* pHandle;
/** Current state of this component */
OMX_STATETYPE curState;
/** The component thread handle */
pthread_t ComponentThread;
/** The pipes for sending buffers to the thread */
int dataPipe[2];
/** The pipes for sending buffers to the thread */
int cmdPipe[2];
/** The pipes for sending command data to the thread */
int cmdDataPipe[2];
/** Set to indicate component is stopping */
OMX_U32 bIsEOFSent;
/** Count of number of buffers outstanding with bridge */
OMX_U32 lcml_nIpBuf;
/** Count of number of buffers outstanding with bridge */
OMX_U32 lcml_nOpBuf;
/** Counts of number of input buffers sent to LCML */
OMX_U32 lcml_nCntIp;
/** Counts of number of input buffers received from LCML */
OMX_U32 lcml_nCntIpRes;
/** Counts of number of output buffers sent to LCML */
OMX_U32 lcml_nCntOp;
/** Counts of number of output buffers received from LCML */
OMX_U32 lcml_nCntOpReceived;
/** Counts of number of buffers sent to App */
OMX_U32 lcml_nCntApp;
/** Counts of number of buffers received from App */
OMX_U32 app_nBuf;
OMX_U32 lcml_compID;
/** Counts of number of output buffers reclaimed from lcml */
OMX_U32 num_Reclaimed_Op_Buff;
/** Counts of number of input buffers sent to lcml */
OMX_U32 num_Sent_Ip_Buff;
/** Counts of number of output buffers sent to lcml */
OMX_U32 num_Op_Issued;
/** Holds the value of dasf mode, 1: DASF mode or 0: File Mode */
OMX_U32 dasfmode;
/** This is LCML handle */
OMX_HANDLETYPE pLcmlHandle;
/** ID stream ID**/
OMX_U32 streamID;
/** Contains pointers to LCML Buffer Headers */
AACD_LCML_BUFHEADERTYPE *pLcmlBufHeader[2];
#ifdef __PERF_INSTRUMENTATION__
PERF_OBJHANDLE pPERF, pPERFcomp;
OMX_U32 nLcml_nCntIp;
OMX_U32 nLcml_nCntOpReceived;
#endif
/** Tells whether buffers on ports have been allocated */
OMX_U32 bPortDefsAllocated;
/** Tells whether component thread has started */
OMX_U32 bCompThreadStarted;
/** Marks the buffer data */
OMX_PTR pMarkData;
/** Marks the buffer */
OMX_MARKTYPE *pMarkBuf;
/** Marks the target component */
OMX_HANDLETYPE hMarkTargetComponent;
/** Flag to track when input buffer's filled length is 0 */
OMX_U32 bBypassDSP;
/** Input port enable flag */
OMX_U32 ipPortEnableFlag;
/** Input port disble flag */
OMX_U32 ipPortDisableFlag;
/** Pointer to port parameter structure */
OMX_PORT_PARAM_TYPE* pPortParamType;
/** Pointer to port priority management structure */
OMX_PRIORITYMGMTTYPE* pPriorityMgmt;
#ifdef RESOURCE_MANAGER_ENABLED
RMPROXY_CALLBACKTYPE rmproxyCallback;
#endif
OMX_BOOL bPreempted;
/** Contains the port related info of both the ports */
AUDIODEC_PORT_TYPE *pCompPort[NUM_OF_PORTS_AACDEC];
/* Checks whether or not buffer were allocated by appliction */
OMX_U32 bufAlloced;
/** Flag to check about execution of component thread */
OMX_U16 bExitCompThrd;
/** Pointer to list of input buffers */
AACDEC_BUFFERLIST *pInputBufferList;
/** Pointer to list of output buffers */
AACDEC_BUFFERLIST *pOutputBufferList;
/** it is used for component's create phase arguments */
LCML_STRMATTR *strmAttr;
/** Contains the version information */
OMX_U32 nVersion;
/** Number of input buffers at runtime */
OMX_U32 nRuntimeInputBuffers;
/** Number of output buffers at runtime */
OMX_U32 nRuntimeOutputBuffers;
/** Parameters being passed to the SN */
USN_AudioCodecParams *pParams;
/** Dynamic Parameters being passed to the SN */
MPEG4AACDEC_UALGParams * AACDEC_UALGParam;
OMX_U16 framemode;
OMX_STRING cComponentName;
OMX_VERSIONTYPE ComponentVersion;
OMX_U32 nOpBit;
OMX_U32 parameteric_stereo;
OMX_U32 dualMonoMode;
OMX_U32 SBR;
OMX_U32 RAW;
OMX_U32 nFillThisBufferCount;
OMX_U32 nFillBufferDoneCount;
OMX_U32 nEmptyThisBufferCount;
OMX_U32 nEmptyBufferDoneCount;
OMX_U32 bInitParamsInitialized;
AACDEC_BUFFERLIST *pInputBufferListQueue;
AACDEC_BUFFERLIST *pOutputBufferListQueue;
/** To store input buffers recieved while in paused state **/
OMX_BUFFERHEADERTYPE *pInputBufHdrPending[MAX_NUM_OF_BUFS_AACDEC];
OMX_U32 nNumInputBufPending;
/** To store out buffers received while in puased state **/
OMX_BUFFERHEADERTYPE *pOutputBufHdrPending[MAX_NUM_OF_BUFS_AACDEC];
OMX_U32 nNumOutputBufPending;
/** Flags to control port disable command **/
OMX_U32 bDisableCommandPending;
OMX_U32 bDisableCommandParam;
/** Flags to control port enable command **/
OMX_U32 bEnableCommandPending;
OMX_U32 bEnableCommandParam;
OMX_U32 nInvalidFrameCount;
OMX_U32 numPendingBuffers;
OMX_U32 bNoIdleOnStop;
OMX_U32 bDspStoppedWhileExecuting;
/* bIdleCommandPending;*/
OMX_S32 nOutStandingFillDones;
OMX_BOOL bIsInvalidState;
OMX_STRING* sDeviceString;
#ifndef UNDER_CE
pthread_mutex_t AlloBuf_mutex;
pthread_cond_t AlloBuf_threshold;
OMX_U8 AlloBuf_waitingsignal;
pthread_mutex_t InLoaded_mutex;
pthread_cond_t InLoaded_threshold;
OMX_U8 InLoaded_readytoidle;
pthread_mutex_t InIdle_mutex;
pthread_cond_t InIdle_threshold;
OMX_U8 InIdle_goingtoloaded;
pthread_mutex_t codecStop_mutex;
pthread_cond_t codecStop_threshold;
OMX_U8 codecStop_waitingsignal;
pthread_mutex_t codecFlush_mutex;
pthread_cond_t codecFlush_threshold;
OMX_U8 codecFlush_waitingsignal;
OMX_U32 nUnhandledFillThisBuffers;
OMX_U32 nHandledFillThisBuffers;
OMX_U32 nUnhandledEmptyThisBuffers;
OMX_U32 nHandledEmptyThisBuffers;
OMX_BOOL bFlushOutputPortCommandPending;
OMX_BOOL bFlushInputPortCommandPending;
#else
OMX_Event AlloBuf_event;
OMX_U8 AlloBuf_waitingsignal;
OMX_Event InLoaded_event;
OMX_U8 InLoaded_readytoidle;
OMX_Event InIdle_event;
OMX_U8 InIdle_goingtoloaded;
#endif
OMX_BOOL bLoadedCommandPending;
OMX_PARAM_COMPONENTROLETYPE *componentRole;
OMX_U8 PendingInPausedBufs;
OMX_BUFFERHEADERTYPE *pInBufHdrPausedPending[MAX_NUM_OF_BUFS_AACDEC];
OMX_U8 PendingOutPausedBufs;
OMX_BUFFERHEADERTYPE *pOutBufHdrPausedPending[MAX_NUM_OF_BUFS_AACDEC];
/** Keep buffer timestamps **/
OMX_S64 arrBufIndex[MAX_NUM_OF_BUFS_AACDEC];
/**Keep buffer tickcount*/
OMX_U32 arrBufIndexTick[MAX_NUM_OF_BUFS_AACDEC];
/** Index to arrBufIndex[] and arrBufIndexTick[], used for input buffer timestamps */
OMX_U8 IpBufindex;
/** Index to arrBufIndex[] and arrBufIndexTick[], used for input buffer timestamps */
OMX_U8 OpBufindex;
/** Flag to flush SN after EOS in order to process more buffers after EOS**/
OMX_U8 SendAfterEOS;
/** Flag to mark the first sent buffer**/
OMX_U8 first_buff;
/** First Time Stamp sent **/
OMX_TICKS first_TS;
/** Temporal time stamp **/
OMX_TICKS temp_TS;
PV_OMXComponentCapabilityFlagsType iPVCapabilityFlags;
OMX_BOOL bConfigData;
OMX_BOOL reconfigInputPort;
OMX_BOOL reconfigOutputPort;
OMX_U8 OutPendingPR;
struct OMX_TI_Debug dbg;
/** Indicate when first output buffer received from DSP **/
OMX_U32 first_output_buf_rcv;
} AACDEC_COMPONENT_PRIVATE;
/* ================================================================================= * */
/**
* OMX_ComponentInit() function is called by OMX Core to initialize the component
* with default values of the component. Before calling this function OMX_Init
* must have been called.
*
* @param *hComp This is component handle allocated by the OMX core.
*
* @pre OMX_Init should be called by application.
*
* @post Component has initialzed with default values.
*
* @return OMX_ErrorNone = Successful Inirialization of the component\n
* OMX_ErrorInsufficientResources = Not enough memory
*
* @see AacDec_StartCompThread()
*/
/* ================================================================================ * */
#ifndef UNDER_CE
OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp);
#else
/* WinCE Implicit Export Syntax */
#define OMX_EXPORT __declspec(dllexport)
/* =========================================================== */
/**
* OMX_ComponentInit() Initializes component
*
*
* @param hComp OMX Handle
*
* @return OMX_ErrorNone = Successful
* Other error code = fail
*
*/
/*================================================================== */
OMX_EXPORT OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComp);
#endif
/* ================================================================================= * */
/**
* AacDec_StartCompThread() starts the component thread. This is internal
* function of the component.
*
* @param pHandle This is component handle allocated by the OMX core.
*
* @pre None
*
* @post None
*
* @return OMX_ErrorNone = Successful Inirialization of the component\n
* OMX_ErrorInsufficientResources = Not enough memory
*
* @see None
*/
/* ================================================================================ * */
OMX_ERRORTYPE AacDec_StartCompThread(OMX_HANDLETYPE pHandle);
/* ================================================================================= * */
/**
* AACDEC_Fill_LCMLInitParams() fills the LCML initialization structure.
*
* @param pHandle This is component handle allocated by the OMX core.
*
* @param plcml_Init This structure is filled and sent to LCML.
*
* @pre None
*
* @post None
*
* @return OMX_ErrorNone = Successful Inirialization of the LCML struct.
* OMX_ErrorInsufficientResources = Not enough memory
*
* @see None
*/
/* ================================================================================ * */
OMX_ERRORTYPE AACDEC_Fill_LCMLInitParams(OMX_HANDLETYPE pHandle, LCML_DSP *plcml_Init, OMX_U16 arr[]);
/* ================================================================================= * */
/**
* AACDEC_GetBufferDirection() function determines whether it is input buffer or
* output buffer.
*
* @param *pBufHeader This is pointer to buffer header whose direction needs to
* be determined.
*
* @param *eDir This is output argument which stores the direction of buffer.
*
* @pre None
*
* @post None
*
* @return OMX_ErrorNone = Successful processing.
* OMX_ErrorBadParameter = In case of invalid buffer
*
* @see None
*/
/* ================================================================================ * */
OMX_ERRORTYPE AACDEC_GetBufferDirection(OMX_BUFFERHEADERTYPE *pBufHeader,
OMX_DIRTYPE *eDir);
/* ================================================================================= * */
/**
* AACDEC_LCML_Callback() function is callback which is called by LCML whenever
* there is an even generated for the component.
*
* @param event This is event that was generated.
*
* @param arg This has other needed arguments supplied by LCML like handles
* etc.
*
* @pre None
*
* @post None
*
* @return OMX_ErrorNone = Successful processing.
* OMX_ErrorInsufficientResources = Not enough memory
*
* @see None
*/
/* ================================================================================ * */
OMX_ERRORTYPE AACDEC_LCML_Callback (TUsnCodecEvent event,void * args [10]);
/* ================================================================================= * */
/**
* AACDEC_HandleCommand() function handles the command sent by the application.
* All the state transitions, except from nothing to loaded state, of the
* component are done by this function.
*
* @param pComponentPrivate This is component's private date structure.
*
* @pre None
*
* @post None
*
* @return OMX_ErrorNone = Successful processing.
* OMX_ErrorInsufficientResources = Not enough memory
* OMX_ErrorHardware = Hardware error has occured lile LCML failed
* to do any said operartion.
*
* @see None
*/
/* ================================================================================ * */
OMX_U32 AACDEC_HandleCommand (AACDEC_COMPONENT_PRIVATE *pComponentPrivate);
/* ================================================================================= * */
/**
* AACDEC_HandleDataBuf_FromApp() function handles the input and output buffers
* that come from the application. It is not direct function wich gets called by
* the application rather, it gets called eventually.
*
* @param *pBufHeader This is the buffer header that needs to be processed.
*
* @param *pComponentPrivate This is component's private date structure.
*
* @pre None
*
* @post None
*
* @return OMX_ErrorNone = Successful processing.
* OMX_ErrorInsufficientResources = Not enough memory
* OMX_ErrorHardware = Hardware error has occured lile LCML failed
* to do any said operartion.
*
* @see None
*/
/* ================================================================================ * */
OMX_ERRORTYPE AACDEC_HandleDataBuf_FromApp(OMX_BUFFERHEADERTYPE *pBufHeader,
AACDEC_COMPONENT_PRIVATE *pComponentPrivate);
/* ================================================================================= * */
/**
* AACDEC_GetLCMLHandle() function gets the LCML handle and interacts with LCML
* by using this LCML Handle.
*
* @param *pBufHeader This is the buffer header that needs to be processed.
*
* @param *pComponentPrivate This is component's private date structure.
*
* @pre None
*
* @post None
*
* @return OMX_HANDLETYPE = Successful loading of LCML library.
* OMX_ErrorHardware = Hardware error has occured.
*
* @see None
*/
/* ================================================================================ * */
OMX_HANDLETYPE AACDEC_GetLCMLHandle(AACDEC_COMPONENT_PRIVATE* pComponentPrivate);
/* ================================================================================= * */
/**
* AACDEC_GetCorresponding_LCMLHeader() function gets the corresponding LCML
* header from the actual data buffer for required processing.
*
* @param *pBuffer This is the data buffer pointer.
*
* @param eDir This is direction of buffer. Input/Output.
*
* @param *AACD_LCML_BUFHEADERTYPE This is pointer to LCML Buffer Header.
*
* @pre None
*
* @post None
*
* @return OMX_ErrorNone = Successful Inirialization of the component\n
* OMX_ErrorHardware = Hardware error has occured.
*
* @see None
*/
/* ================================================================================ * */
OMX_ERRORTYPE AACDEC_GetCorresponding_LCMLHeader(AACDEC_COMPONENT_PRIVATE* pComponentPrivate,
OMX_U8 *pBuffer,
OMX_DIRTYPE eDir,
AACD_LCML_BUFHEADERTYPE **ppLcmlHdr);
/* ================================================================================= * */
/**
* AACDEC_FreeCompResources() function frees the component resources.
*
* @param pComponent This is the component handle.
*
* @pre None
*
* @post None
*
* @return OMX_ErrorNone = Successful Inirialization of the component\n
* OMX_ErrorHardware = Hardware error has occured.
*
* @see None
*/
/* ================================================================================ * */
OMX_ERRORTYPE AACDEC_FreeCompResources(OMX_HANDLETYPE pComponent);
/* ================================================================================= * */
/**
* AACDEC_CleanupInitParams() function frees only the initialization time
* memories allocated. For example, it will not close pipes, it will not free the
* memory allocated to the buffers etc. But it does free the memory of buffers
* utilized by the LCML etc. It is basically subset of AACDEC_FreeCompResources()
* function.
*
* @param pComponent This is the component handle.
*
* @pre None
*
* @post None
*
* @return OMX_ErrorNone = Successful Inirialization of the component\n
*
* @see None
*/
/* ================================================================================ * */
void AACDEC_CleanupInitParams(OMX_HANDLETYPE pComponent);
/* ================================================================================= * */
/**
* AACDEC_CleanupInitParamsEx() function frees only the initialization time
* memories allocated. For example, it will not close pipes, it will not free the
* memory allocated to the buffers etc. But it does free the memory of buffers
* utilized by the LCML etc. It is basically subset of AACDEC_FreeCompResources()
* function. Called while port disable when port reconfiguration takes place.
*
* @param pComponent This is the component handle.
*
* @pre None
*
* @post None
*
* @return OMX_ErrorNone = Successful Inirialization of the component\n
*
* @see None
*/
/* ================================================================================ * */
void AACDEC_CleanupInitParamsEx(OMX_HANDLETYPE pComponent,OMX_U32 indexport);
/* =========================================================== */
/**
* AACDEC_SetPending() Called when the component queues a buffer
* to the LCML
*
* @param pComponentPrivate Component private data
*
* @param pBufHdr Buffer header
*
* @param eDir Direction of the buffer
*
* @return None
*/
/*================================================================== */
void AACDEC_SetPending(AACDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber);
/* =========================================================== */
/**
* AACDEC_ClearPending() Called when a buffer is returned
* from the LCML
*
* @param pComponentPrivate Component private data
*
* @param pBufHdr Buffer header
*
* @param eDir Direction of the buffer
*
* @return None
*/
/*================================================================== */
void AACDEC_ClearPending(AACDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir, OMX_U32 lineNumber) ;
/* =========================================================== */
/**
* AACDEC_IsPending()
*
*
* @param pComponentPrivate Component private data
*
* @return OMX_ErrorNone = Successful
* Other error code = fail
*/
/*================================================================== */
OMX_U32 AACDEC_IsPending(AACDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_BUFFERHEADERTYPE *pBufHdr, OMX_DIRTYPE eDir);
/* =========================================================== */
/**
* AACDECFill_LCMLInitParamsEx() Fills the parameters needed
* to initialize the LCML without recreating the socket node
*
* @param pComponent OMX Handle
*
* @return None
*/
/*================================================================== */
OMX_ERRORTYPE AACDECFill_LCMLInitParamsEx(OMX_HANDLETYPE pComponent,OMX_U32 indexport);
/* =========================================================== */
/**
* AACDEC_IsValid()
*
*
* @param pComponentPrivate Component private data
*
* @return OMX_ErrorNone = Successful
* Other error code = fail
*/
/*================================================================== */
OMX_U32 AACDEC_IsValid(AACDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U8 *pBuffer, OMX_DIRTYPE eDir) ;
#ifdef RESOURCE_MANAGER_ENABLED
void AACDEC_ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData);
#endif
/*=======================================================================*/
/*! @fn AACDec_GetSampleRateIndexL
* @brief Gets the sample rate index
* @param aRate : Actual Sampling Freq
* @Return Index
*/
/*=======================================================================*/
int AACDec_GetSampleRateIndexL( const int aRate);
int AACDec_GetSampleRatebyIndex( const int index);
void* AACDEC_ComponentThread (void* pThreadData);
OMX_U32 AACDEC_ParseHeader(OMX_BUFFERHEADERTYPE* pBufHeader,
AACDEC_COMPONENT_PRIVATE *pComponentPrivate);
/* =========================================================================*/
/* func GetBits */
/* */
/* desc Gets aBits number of bits from position aPosition of one buffer */
/* and returns the value in a TUint value. */
/* =========================================================================*/
OMX_U32 AACDEC_GetBits(OMX_U32* nPosition, OMX_U8 nBits, OMX_U8* pBuffer, OMX_BOOL bIcreasePosition);
/* =========================================================================*/
/* func AACDEC_HandleUSNError
*
* desc Handles error messages returned by the dsp
*
* @Return n/a
*
* =========================================================================*/
void AACDEC_HandleUSNError (AACDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 arg);
/*=======================================================================*/
/*! @fn SignalIfAllBuffersAreReturned
* @brief Sends pthread signal to indicate OMX has returned all buffers to app
* @param none
* @Return void
*/
/*=======================================================================*/
void SignalIfAllBuffersAreReturned(AACDEC_COMPONENT_PRIVATE *pComponentPrivate);
#endif