243 lines
8.3 KiB
C
Executable File
243 lines
8.3 KiB
C
Executable File
/******************************************************************************
|
|
Copyright (C), 2001-2016, Allwinner Tech. Co., Ltd.
|
|
******************************************************************************
|
|
File Name : AudioDec_Component.h
|
|
Version : Initial Draft
|
|
Author : Allwinner BU3-PD2 Team
|
|
Created : 2016/09/10
|
|
Last Modified :
|
|
Description : mpp component implement
|
|
Function List :
|
|
History :
|
|
******************************************************************************/
|
|
|
|
#ifndef __IPCLINUX_AUDIODEC_COMPONENT_H__
|
|
#define __IPCLINUX_AUDIODEC_COMPONENT_H__
|
|
|
|
//ref platform headers
|
|
#include "plat_type.h"
|
|
#include "plat_errno.h"
|
|
#include "plat_defines.h"
|
|
#include "plat_math.h"
|
|
|
|
//media api headers to app
|
|
#include "mm_common.h"
|
|
//#include "mm_comm_audio.h"
|
|
#include "mm_comm_adec.h"
|
|
|
|
//media internal common headers.
|
|
#include "media_common.h"
|
|
#include "mm_component.h"
|
|
#include "ComponentCommon.h"
|
|
#include "tmessage.h"
|
|
#include "tsemaphore.h"
|
|
#include "adecoder.h"
|
|
|
|
|
|
//------------------------------------------------------------------------------------
|
|
#define MAX_ADECODER_PORTS (2)
|
|
#define ADEC_FRAME_COUNT (64)
|
|
//#define DEBUG_SAVE_PCMDATA
|
|
|
|
typedef enum ADEC_PORT_INDEX_DEFINITION{
|
|
ADEC_PORT_INDEX_DEMUX = 0x0,
|
|
ADEC_OUT_PORT_INDEX_VRENDER = 0x1,
|
|
ADEC_PORT_INDEX_CLOCK = 0x2,
|
|
}ADEC_PORT_INDEX_DEFINITION;
|
|
|
|
struct AUDIODEC_INPUT_DATA
|
|
{
|
|
COMP_STATETYPE state;
|
|
pthread_mutex_t mStateLock;
|
|
pthread_cond_t mStateCond;
|
|
char mThreadName[32];
|
|
|
|
volatile BOOL mWaitAbsValidFlag;
|
|
int nRequestLen; //Set when not enough buffer for component A
|
|
|
|
struct list_head mIdleAbsList; //DMXPKT_NODE_T
|
|
struct list_head mReadyAbsList;
|
|
struct list_head mUsingAbsList;
|
|
int mNodeNum;
|
|
BOOL mbWaitAbsFullFlag;
|
|
pthread_mutex_t mAbsListLock;
|
|
pthread_cond_t mAbsFullCond;
|
|
|
|
struct AUDIODECDATATYPE *pAudioDecData;
|
|
message_queue_t cmd_queue;
|
|
pthread_t thread_id;
|
|
};
|
|
|
|
struct AUDIODECDATATYPE {
|
|
COMP_STATETYPE state;
|
|
pthread_mutex_t mStateLock;
|
|
COMP_CALLBACKTYPE *pCallbacks;
|
|
void* pAppData;
|
|
COMP_HANDLETYPE hSelf;
|
|
char mThreadName[32];
|
|
|
|
COMP_PORT_PARAM_TYPE sPortParam;
|
|
COMP_PARAM_PORTDEFINITIONTYPE sInPortDef;
|
|
COMP_PARAM_PORTDEFINITIONTYPE sOutPortDef;
|
|
COMP_PARAM_PORTEXTRADEFINITIONTYPE sInPortExtraDef;
|
|
COMP_PARAM_PORTEXTRADEFINITIONTYPE sOutPortExtraDef;
|
|
|
|
COMP_INTERNAL_TUNNELINFOTYPE sInPortTunnelInfo;
|
|
COMP_INTERNAL_TUNNELINFOTYPE sOutPortTunnelInfo;
|
|
COMP_PARAM_BUFFERSUPPLIERTYPE sPortBufSupplier[MAX_ADECODER_PORTS];
|
|
BOOL mInputPortTunnelFlag;
|
|
BOOL mOutputPortTunnelFlag; //TRUE: tunnel mode; FALSE: non-tunnel mode.
|
|
|
|
MPP_CHN_S mMppChnInfo;
|
|
pthread_t thread_id;
|
|
CompInternalMsgType eTCmd;
|
|
message_queue_t cmd_queue;
|
|
|
|
ADEC_CHN_ATTR_S mADecChnAttr;
|
|
//int mOutputFrameNotifyPipeFds[2];
|
|
|
|
int demux_type;
|
|
int mAudioInfoVersion;
|
|
AudioStreamInfo mAudioStreamInfo; //for inport non-tunnel, config steamInfo by hand!
|
|
|
|
int decode_mode;
|
|
//int codec_type;
|
|
int priv_flag; //CDX_COMP_PRIV_FLAGS_REINIT
|
|
BOOL mbEof;
|
|
int is_raw_music_mode;
|
|
|
|
int get_audio_info_flag; //if get audio info, after first decode, we get audio info, then set it to 0.
|
|
int audio_channel; //CEDARX_AUDIO_CHANNEL_STEREO
|
|
int volumegain;
|
|
int mute;
|
|
int enable_resample;
|
|
int mNoBitstreamCounter;
|
|
|
|
AudioDecoder* pDecoder;
|
|
BsInFor ad_cedar_info;
|
|
int force_exit;
|
|
int mFrameId;
|
|
|
|
struct list_head mIdleOutFrameList; //ADecCompOutputFrame
|
|
struct list_head mReadyOutFrameList; //for non-tunnel mode. when mOutputPortTunnelFlag == FALSE, use it to store decoded frames.
|
|
struct list_head mUsedOutFrameList; //for tunnel-mode; also for non-tunnel mode. when mOutputPortTunnelFlag == FALSE, use it to store user occupied frames.
|
|
|
|
int mFrameNodeNum; //ADecCompOutputFrame counter
|
|
|
|
volatile BOOL mWaitAbsInputFlag;
|
|
volatile BOOL mWaitPcmBufFlag;
|
|
|
|
volatile BOOL mWaitOutFrameFullFlag;
|
|
//volatile BOOL mWaitOutFrameFlag; //wait outFrame coming! same meaning with mWaitPcmBufFlag
|
|
|
|
volatile BOOL mWaitReadyFrameFlag; //for non-tunnel mode, wait frame ready, so can get it.
|
|
pthread_cond_t mReadyFrameCondition;
|
|
|
|
pthread_mutex_t mAbsInputMutex;
|
|
|
|
volatile BOOL mWaitEmptyAbsFlag; // for non-tunnel mode, wait enough space for one new bs when Abs buffer full or almost full
|
|
int mRequestAbsLen; // coming bitstream size
|
|
pthread_cond_t mEmptyAbsCondition;
|
|
|
|
pthread_mutex_t mOutFrameListMutex;
|
|
pthread_cond_t mOutFrameFullCondition;
|
|
pthread_cond_t mOutFrameCondition; //for non-tunnel mode, wait outFrame coming!
|
|
|
|
struct AUDIODEC_INPUT_DATA* pInputData;
|
|
#ifdef DEBUG_SAVE_PCMDATA
|
|
FILE* mPcmSaveFp;
|
|
int mPcmSize;
|
|
#endif
|
|
};
|
|
|
|
typedef struct AUDIODECDATATYPE AUDIODECDATATYPE;
|
|
typedef struct AUDIODEC_INPUT_DATA AUDIODEC_INPUT_DATA;
|
|
|
|
// below 3 put here tmp
|
|
//typedef enum CEDARX_AUDIO_CHANNEL_TYPE
|
|
//{
|
|
// CEDARX_AUDIO_CHANNEL_STEREO = 0,
|
|
// CEDARX_AUDIO_CHANNEL_LEFT ,
|
|
// CEDARX_AUDIO_CHANNEL_RIGHT,
|
|
//}CEDARX_AUDIO_CHANNEL_TYPE;
|
|
|
|
//enum CEDARXAUDIOFLAGSENUM
|
|
//{
|
|
// ADEC_DISABLE_AAC_PACKING = (1<<0),
|
|
//};
|
|
|
|
//typedef enum CDX_DECODE_MODE {
|
|
// CDX_DECODER_MODE_NORMAL = 0,
|
|
// CDX_DECODER_MODE_RAWMUSIC,
|
|
//}CDX_DECODE_MODE;
|
|
|
|
//private interface
|
|
ERRORTYPE AudioDecGetPortDefinition(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_INOUT COMP_PARAM_PORTDEFINITIONTYPE *pPortDef);
|
|
ERRORTYPE AudioDecSetPortDefinition(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_IN COMP_PARAM_PORTDEFINITIONTYPE *pPortDef);
|
|
ERRORTYPE AudioDecGetCompBufferSupplier(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_INOUT COMP_PARAM_BUFFERSUPPLIERTYPE *pPortBufSupplier);
|
|
ERRORTYPE AudioDecSetCompBufferSupplier(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_IN COMP_PARAM_BUFFERSUPPLIERTYPE *pPortBufSupplier);
|
|
ERRORTYPE AudioDecGetMPPChannelInfo(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_OUT MPP_CHN_S *pChn);
|
|
ERRORTYPE AudioDecSetMPPChannelInfo(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_IN MPP_CHN_S *pChn);
|
|
//ERRORTYPE AudioDecGetChannelFd(
|
|
// PARAM_IN COMP_HANDLETYPE hComponent,
|
|
// PARAM_OUT int *pChnFd);
|
|
ERRORTYPE AudioDecGetTunnelInfo(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_INOUT COMP_INTERNAL_TUNNELINFOTYPE *pTunnelInfo);
|
|
ERRORTYPE AudioDecGetChnAttr(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_OUT ADEC_CHN_ATTR_S *pChnAttr);
|
|
ERRORTYPE AudioDecSetChnAttr(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_OUT ADEC_CHN_ATTR_S *pChnAttr);
|
|
|
|
//public interface
|
|
ERRORTYPE AudioDecSendCommand(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_IN COMP_COMMANDTYPE Cmd,
|
|
PARAM_IN unsigned int nParam1,
|
|
PARAM_IN void* pCmdData);
|
|
ERRORTYPE AudioDecGetState(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_OUT COMP_STATETYPE* pState);
|
|
ERRORTYPE AudioDecSetCallbacks(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_IN COMP_CALLBACKTYPE* pCallbacks,
|
|
PARAM_IN void* pAppData) ;
|
|
ERRORTYPE AudioDecGetConfig(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_IN COMP_INDEXTYPE nIndex,
|
|
PARAM_IN void* pComponentConfigStructure);
|
|
ERRORTYPE AudioDecSetConfig(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_IN COMP_INDEXTYPE nIndex,
|
|
PARAM_IN void* pComponentConfigStructure);
|
|
ERRORTYPE AudioDecComponentTunnelRequest(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_IN unsigned int nPort,
|
|
PARAM_IN COMP_HANDLETYPE hTunneledComp,
|
|
PARAM_IN unsigned int nTunneledPort,
|
|
PARAM_INOUT COMP_TUNNELSETUPTYPE* pTunnelSetup);
|
|
ERRORTYPE AudioDecEmptyThisBuffer(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_IN COMP_BUFFERHEADERTYPE* pBuffer);
|
|
ERRORTYPE AudioDecFillThisBuffer(
|
|
PARAM_IN COMP_HANDLETYPE hComponent,
|
|
PARAM_IN COMP_BUFFERHEADERTYPE* pBuffer);
|
|
ERRORTYPE AudioDecComponentDeInit(PARAM_IN COMP_HANDLETYPE hComponent);
|
|
ERRORTYPE AudioDecComponentInit(PARAM_IN COMP_HANDLETYPE hComponent);
|
|
#endif /* __IPCLINUX_AUDIODEC_COMPONENT_H__ */
|
|
|