⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aac.cpp

📁 EM8511s中使用的mp4播放器
💻 CPP
字号:
#include "aac.h"#if 0#include <stdio.h>static void debug_break (void){}#define ASSERT(exp)					((void)((exp)?1:(printf ("***ASSERT failed: line %d, file %s\n", __LINE__,__FILE__), debug_break(), 0)))#define DEBUGMSG(cond,printf_exp)	((void)((cond)?(printf printf_exp),1:0))#else#define ASSERT(exp)#define DEBUGMSG(cond,printf_exp)#endifAACDecoder::AACDecoder (){	m_Initialized = 0;	m_AACdata = 0;	m_sample_frequency_index = 0;}AACDecoder::~AACDecoder (){	if (m_Initialized)		aac_decoder_free (m_AACdata);	if (m_AACdata)		aac_dealloc_GlobalData (m_AACdata);}RMuint32 AACDecoder::Init (void){	ASSERT (m_AACdata == 0);	m_AACdata = (AAC_GlobalData*) aac_alloc_GlobalData ();	ASSERT (m_AACdata);	if (m_AACdata)		aac_set_defaults (m_AACdata);	return (RMuint32)m_AACdata;}RMint32 AACDecoder::DecodeFrame (RMuint8 *dataIn, RMuint32 InLength, RMint16 *dataOut, RMuint32 OutLength){	ASSERT (m_Initialized);	ASSERT (m_AACdata);	int bits; 	aacError err;	err = aac_reset_input_databuffer (m_AACdata, dataIn, InLength);	if (AAC_FAIL(err))	{		return (RMint32)err;	}	bits = aac_decode_raw_data_block (dataOut, OutLength, m_AACdata);	return (RMint32)bits;}RMuint32 AACDecoder::dsiInit (RMuint8 *dsi, RMuint32 dsiLength){	ASSERT (m_AACdata);	// what we need for decoder initialization	RMuint32 frameSize;	RMuint32 channelCount;	RMuint32 audioObjectType;	RMuint32 samplingFreqIdx;	// some helper variables	RMuint32 sampleRate;	RMuint8 frameLengthFlag;	RMuint8 dependsOnCoreCoder;	RMuint8 extensionFlag;	RMuint16 coreDecoderDelay;	if (AAC_FAIL (aac_reset_input_databuffer (m_AACdata, dsi, dsiLength)))		return (RMuint32)AAC_ERROR;	audioObjectType = (RMint32)aac_getbits (m_AACdata, 5);	samplingFreqIdx = (RMint32)aac_getbits (m_AACdata, 4);	m_sample_frequency_index = samplingFreqIdx;	if (samplingFreqIdx == 0xf) 	{		sampleRate = (RMuint32)aac_getbits (m_AACdata, 24);		if (sampleRate > 92017) 		{ 			samplingFreqIdx = 0x0; //96000		} 		else if (sampleRate > 75132) 		{ 			samplingFreqIdx = 0x1; //88200		}		else if (sampleRate > 55426) 		{ 			samplingFreqIdx = 0x2; //64000		}		else if (sampleRate > 46009) 		{ 			samplingFreqIdx = 0x3; //48000		}		else if (sampleRate > 37566) 		{ 			samplingFreqIdx = 0x4; //44100		}		else if (sampleRate > 27713) 		{ 			samplingFreqIdx = 0x5; //32000		}		else if (sampleRate > 23004) 		{ 			samplingFreqIdx = 0x6; //24000		}		else if (sampleRate > 18783) 		{ 			samplingFreqIdx = 0x7; //22050		}		else if (sampleRate > 13856) 		{ 			samplingFreqIdx = 0x8; //16000		}		else if (sampleRate > 11502) 		{ 			samplingFreqIdx = 0x9; //12000		}		else if (sampleRate >  9391) 		{ 			samplingFreqIdx = 0xa; //11025		}		else 		{			samplingFreqIdx = 0xb; // 8000		}	}	else 	{		switch (samplingFreqIdx) 		{		case 0x0 :		//  96000			sampleRate = 96000;			break;		case 0x1 : 		//  88200			sampleRate = 88200;			break;		case 0x2 : 		//  64000			sampleRate = 64000;			break;		case 0x3 : 		// 48000			sampleRate = 48000;			break;		case 0x4 : 		//  44100													sampleRate = 44100;			break;		case 0x5 : 		//  32000			sampleRate = 32000;			break;		case 0x6 : 		//  24000			sampleRate = 24000;			break;		case 0x7 : 		//  22050			sampleRate = 22050;			break;		case 0x8 : 		//  16000			sampleRate = 16000;			break;		case 0x9 : 		//  12000			sampleRate = 12000;			break;		case 0xa : 		//  11025			sampleRate = 11025;			break;		case 0xb : 		//  8000			sampleRate = 8000;			break;		default :		//  44100			sampleRate = 44100;			break;		}	}	channelCount = (RMuint32)aac_getbits (m_AACdata, 4);	if (channelCount == 7)		channelCount = 8;		if ((audioObjectType == 1) || (audioObjectType == 2) ||	    (audioObjectType == 3) || (audioObjectType == 4) ||	    (audioObjectType == 6) || (audioObjectType == 7)) 	{		// GASpecificConfig - 14496-3 Subpart 4, page 13		frameLengthFlag = (RMuint8)aac_getbits (m_AACdata, 1);		dependsOnCoreCoder = (RMuint8)aac_getbits (m_AACdata, 1);		if(dependsOnCoreCoder)			coreDecoderDelay = (RMuint16)aac_getbits (m_AACdata, 14);		extensionFlag = (RMuint8)aac_getbits (m_AACdata, 1);				// number of channels is in program config element		if (channelCount == 0) 		{			//really not the best solution...			if (AAC_FAIL(aac_get_prog_config (m_AACdata)))				return (RMuint32)AAC_ERROR;			if (AAC_FAIL(aac_get_property (NUMBER_OF_SOUND_CHANNELS, &channelCount, sizeof(channelCount), m_AACdata)))				return (RMuint32)AAC_ERROR;		}			if ((audioObjectType == 1) || (audioObjectType == 2) || (audioObjectType == 3) || (audioObjectType == 4)) 		{			m_Initialized = 1;			frameSize = (frameLengthFlag) ? 960 : 1024;			m_channelCount = channelCount;			m_sampleRate = sampleRate;			return aac_init (m_AACdata, audioObjectType-1, channelCount, samplingFreqIdx, frameSize);		}		else			return (RMuint32)AAC_ERROR; //not yet implemented	}	else 		return (RMuint32)AAC_ERROR;	return 0;}RMuint32 AACDecoder::aacInit (RMint32 AudioObjectType, RMint32 NumberOfChannels, RMint32 Sampling_Frequency_Index, RMint32 FrameSize){	ASSERT (m_AACdata);	aacError err;	m_Initialized = 1;	err = aac_init (m_AACdata, AudioObjectType - 1, NumberOfChannels, Sampling_Frequency_Index, FrameSize);	return (RMuint32)err;}RMuint32 AACDecoder::SetProperty (RMint32 propertyID, void *buffer, RMuint32 length){	aacError err;	err = aac_set_property (propertyID, buffer, length, m_AACdata);	return (RMuint32)err;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -