Esempio n. 1
0
void HEAACCodec::Close()
{
	if(sbr_handler_ != NULL)
	{
		EnvClose((HANDLE_SBR_ENCODER)sbr_handler_);
		sbr_handler_ = NULL;
	}

	if(aac_handler_ != NULL && encode_frame_)
	{
		AacEncClose((struct AAC_ENCODER *)aac_handler_);
		aac_handler_ = NULL;
	}

	if(inputBuffer != NULL)
	{
		delete []inputBuffer;
		inputBuffer = NULL;
	}

	if(outputBuffer != NULL)
	{
		delete []outputBuffer;
		outputBuffer = NULL;
	}

	return;
}
Esempio n. 2
0
	virtual ~CHEAAC_ENC()
	{
		if(m_pAacEnc)
			AacEncClose(m_pAacEnc);

		if(m_hEnvEnc)
		{
			EnvClose(m_hEnvEnc);
		}
	}
Esempio n. 3
0
/*------------------------------------------------------------------------------
 *  Close the encoding session
 *----------------------------------------------------------------------------*/
void
aacPlusEncoder :: close ( void )                           throw ( Exception )
{
    if ( isOpen() ) {
        flush();
    
        destroy_plans();
        AacEncClose(aacEnc);
        if (hEnvEnc) {
            EnvClose(hEnvEnc);
        }
    
        aacplusOpen = false;
    
        sink->close();
    }
}
Esempio n. 4
0
void FloatAACPlusEncodeCodec::Destroy()
{
	if(m_hSbr != NULL)
	{
		EnvClose((HANDLE_SBR_ENCODER)m_hSbr);
		m_hSbr = NULL;
	}

	if(m_hAac != NULL)
	{
		AacEncClose((struct AAC_ENCODER *)m_hAac);
		m_hAac = NULL;
	}

	SAFE_DELETEA(inputBuffer);
	SAFE_DELETEA(outputBuffer);
	SAFE_DELETEA(ancDataBytes);
}
Esempio n. 5
0
bool HEAACCodec::Init(unsigned long sampleRate, unsigned int numChannels, unsigned long &inputSamples,
					  unsigned long bitRate, unsigned int inputFormat)
{
	Close();

	//不支持低音质的参数
	if(sampleRate < 44100 || bitRate < 24000 || numChannels < 2)
	{
		return false;
	}

	if(bitRate > DEFAULT_BITRATE)
		bitRate = DEFAULT_BITRATE;

	//默认参数
	sample_rate_ = sampleRate;
	bitrate_ = bitRate;
	channels_ = numChannels;

	useParametricStereo = 0;

	if ((numChannels == 2) && (bitRate > 16000) && (bitRate < 36000))
	{
		useParametricStereo = 1;
	}

	unsigned int sample_rate_AAC = sample_rate_;
	unsigned int channels_AAC = numChannels;
	unsigned int channels_SBR = numChannels;

	if (useParametricStereo)
	{
		channels_AAC = 1;
		channels_SBR = 2;
	}

	AACENC_CONFIG   config;
	config.sampleRate = sampleRate;
	config.bitRate = bitRate;
	config.nChannelsIn = numChannels;
	config.nChannelsOut = channels_AAC;
	config.bandWidth = 0;

	//初始化SBR
	if(!IsSbrSettingAvail(bitRate, channels_AAC, sample_rate_AAC, &sample_rate_AAC)) 
	{
		return false;
	}

	HANDLE_SBR_ENCODER hEnvEnc = NULL;
	sbrConfiguration sbrConfig;

	//ParametricStereo的位置
	envReadOffset   = 0;
	coreWriteOffset = 0;
	if(useParametricStereo)
	{
		envReadOffset = (MAX_DS_FILTER_DELAY + INPUT_DELAY)*MAX_CHANNELS;
		coreWriteOffset = CORE_INPUT_OFFSET_PS;
		writeOffset = envReadOffset;
	}

	//获得SBR初始化参数
	InitializeSbrDefaults(&sbrConfig);

	AdjustSbrSettings(&sbrConfig,
		bitRate,
		channels_AAC,
		sample_rate_AAC,
		AACENC_TRANS_FAC,
		24000);

	//使用ParametricStereo
	sbrConfig.usePs = useParametricStereo;
	EnvOpen(&hEnvEnc,
		inputBuffer + coreWriteOffset,
		&sbrConfig,
		&config.bandWidth);

	sbr_handler_ = (void *)hEnvEnc;

	//初始化AAC
	config.sampleRate = sample_rate_AAC;

	struct AAC_ENCODER *aacEnc = 0;
	if(AacEncOpen(&aacEnc, config) != 0)
	{
		AacEncClose(aacEnc);
		EnvClose(hEnvEnc);
		return false;
	}

	aac_handler_ = (void *)aacEnc;

	//开辟编码器内存
	inputBuffer = new float[(AACENC_BLOCKSIZE*2 + MAX_DS_FILTER_DELAY + INPUT_DELAY)*MAX_CHANNELS];
	outputBuffer = new unsigned int[(6144/8)*MAX_CHANNELS/(sizeof(int))];

	inputSamples = AACENC_BLOCKSIZE * 4;

	m_outputBuffer = auto_ptr<unsigned char>(new unsigned char [m_maxOutputBytes]);

	encode_frame_ = false;

	return true;
}
Esempio n. 6
0
/*****************************************************************************

 description:  initializes parameters and allocates memory
 returns:      error status

*****************************************************************************/
int
EnvOpen (HANDLE_SBR_ENCODER * hEnvEncoder,
         float *pCoreBuffer,
         sbrConfigurationPtr params,
         int      *coreBandWith)
{
  HANDLE_SBR_ENCODER hEnvEnc ;
  int ch;

  COUNT_sub_start("EnvOpen");

  MOVE(1);
  *hEnvEncoder=0;

  PTR_INIT(1);
  hEnvEnc = &sbrEncoder;

  PTR_INIT(2); /* hEnvEnc->hEnvChannel[]
                  EnvChannel[]
               */
  LOOP(1);
  for (ch=0; ch<MAX_CHANNELS; ch++)
  {
    PTR_INIT(1);
    hEnvEnc->hEnvChannel[ch] = &EnvChannel[ch];
  }

  INDIRECT(2); ADD(2); LOGIC(1); BRANCH(1);
  if ((params->codecSettings.nChannels < 1) || (params->codecSettings.nChannels > MAX_CHANNELS)){

    FUNC(1);
    EnvClose (hEnvEnc);

    COUNT_sub_end();
    return(1);
  }


  INDIRECT(1); PTR_INIT(1);
  hEnvEnc->sbrConfigData.freqBandTable[LO] =  sbr_freqBandTableLO;

  FUNC(2); LOOP(1); PTR_INIT(1); MOVE(1); STORE(MAX_FREQ_COEFFS/2+1);
  memset(hEnvEnc->sbrConfigData.freqBandTable[LO],0,sizeof(unsigned char)*MAX_FREQ_COEFFS/2+1);

  INDIRECT(1); PTR_INIT(1);
  hEnvEnc->sbrConfigData.freqBandTable[HI] =  sbr_freqBandTableHI;

  FUNC(2); LOOP(1); PTR_INIT(1); MOVE(1); STORE(MAX_FREQ_COEFFS+1);
  memset(hEnvEnc->sbrConfigData.freqBandTable[HI],0,sizeof(unsigned char)*MAX_FREQ_COEFFS+1);

  INDIRECT(1); PTR_INIT(1);
  hEnvEnc->sbrConfigData.v_k_master =  sbr_v_k_master;

  FUNC(2); LOOP(1); PTR_INIT(1); MOVE(1); STORE(MAX_FREQ_COEFFS+1);
  memset(hEnvEnc->sbrConfigData.v_k_master,0,sizeof(unsigned char)*MAX_FREQ_COEFFS+1);

  INDIRECT(1); BRANCH(1);
  if (hEnvEnc->CmonData.sbrBitbuf.isValid == 0) {

    INDIRECT(2); PTR_INIT(1); FUNC(3);
    CreateBitBuffer(&hEnvEnc->CmonData.sbrBitbuf,
                    (unsigned char*) hEnvEnc->sbrPayload,
                    sizeof(hEnvEnc->sbrPayload));
  }

  INDIRECT(1); BRANCH(1);
  if (hEnvEnc->CmonData.sbrBitbufPrev.isValid == 0) {

    INDIRECT(2); PTR_INIT(1); FUNC(3);
    CreateBitBuffer(&hEnvEnc->CmonData.sbrBitbufPrev,
                    (unsigned char*) hEnvEnc->sbrPayloadPrevious,
                    sizeof(hEnvEnc->sbrPayload));
  }

  INDIRECT(2); MOVE(1);
  hEnvEnc->sbrConfigData.nChannels = params->codecSettings.nChannels;

  INDIRECT(1); ADD(1); BRANCH(1);
  if(params->codecSettings.nChannels == 2)
  {
     INDIRECT(2); MOVE(1);
     hEnvEnc->sbrConfigData.stereoMode = params->stereoMode;
  }
  else
  {
     INDIRECT(1); MOVE(1);
     hEnvEnc->sbrConfigData.stereoMode = SBR_MONO;
  }






  INDIRECT(1); ADD(1); BRANCH(1);
  if (params->codecSettings.sampleFreq <= 24000) {

    INDIRECT(1); MOVE(1);
    hEnvEnc->sbrHeaderData.sampleRateMode = DUAL_RATE;

    INDIRECT(1); MULT(1); STORE(1);
    hEnvEnc->sbrConfigData.sampleFreq = 2 * params->codecSettings.sampleFreq;
  }
  else {

    INDIRECT(2); MOVE(2);
    hEnvEnc->sbrHeaderData.sampleRateMode = SINGLE_RATE;
    hEnvEnc->sbrConfigData.sampleFreq = params->codecSettings.sampleFreq;
  }


  INDIRECT(1); MOVE(1);
  hEnvEnc->sbrBitstreamData.CountSendHeaderData = 0;

  INDIRECT(1); BRANCH(1);
  if (params->SendHeaderDataTime > 0 ) {

    INDIRECT(2); MULT(2); DIV(1); STORE(1);
    hEnvEnc->sbrBitstreamData.NrSendHeaderData = (int)(params->SendHeaderDataTime * 0.001*
                                             hEnvEnc->sbrConfigData.sampleFreq / 2048
                                             );

    ADD(1); BRANCH(1); MOVE(1);
    hEnvEnc->sbrBitstreamData.NrSendHeaderData = max(hEnvEnc->sbrBitstreamData.NrSendHeaderData,1);
  }
  else {

   INDIRECT(1); MOVE(1);
   hEnvEnc->sbrBitstreamData.NrSendHeaderData = 0;
  }

  INDIRECT(10); MOVE(6);
  hEnvEnc->sbrHeaderData.sbr_data_extra = params->sbr_data_extra;
  hEnvEnc->sbrBitstreamData.CRCActive = params->crcSbr;
  hEnvEnc->sbrBitstreamData.HeaderActive = 0;
  hEnvEnc->sbrHeaderData.sbr_start_frequency = params->startFreq;
  hEnvEnc->sbrHeaderData.sbr_stop_frequency  = params->stopFreq;
  hEnvEnc->sbrHeaderData.sbr_xover_band = 0;

    INDIRECT(1); ADD(1); BRANCH(1);
    if (params->sbr_xpos_ctrl!= SBR_XPOS_CTRL_DEFAULT)
    {
       INDIRECT(1); MOVE(1);
       hEnvEnc->sbrHeaderData.sbr_data_extra = 1;
    }

   INDIRECT(1); MOVE(1);
   hEnvEnc->sbrHeaderData.protocol_version = SI_SBR_PROTOCOL_VERSION_ID;

   INDIRECT(2); MOVE(2);
   hEnvEnc->sbrHeaderData.sbr_amp_res = (AMP_RES)params->amp_res;



  INDIRECT(7); MOVE(4);
  hEnvEnc->sbrHeaderData.freqScale  = params->freqScale;
  hEnvEnc->sbrHeaderData.alterScale = params->alterScale;
  hEnvEnc->sbrHeaderData.sbr_noise_bands = params->sbr_noise_bands;
  hEnvEnc->sbrHeaderData.header_extra_1 = 0;

  ADD(3); LOGIC(2); BRANCH(1);
  if ((params->freqScale != SBR_FREQ_SCALE_DEFAULT) ||
      (params->alterScale != SBR_ALTER_SCALE_DEFAULT) ||
      (params->sbr_noise_bands != SBR_NOISE_BANDS_DEFAULT)) {

   MOVE(1);
   hEnvEnc->sbrHeaderData.header_extra_1 = 1;
  }

  INDIRECT(9); MOVE(5);
  hEnvEnc->sbrHeaderData.sbr_limiter_bands = params->sbr_limiter_bands;
  hEnvEnc->sbrHeaderData.sbr_limiter_gains = params->sbr_limiter_gains;
  hEnvEnc->sbrHeaderData.sbr_interpol_freq = params->sbr_interpol_freq;
  hEnvEnc->sbrHeaderData.sbr_smoothing_length = params->sbr_smoothing_length;
  hEnvEnc->sbrHeaderData.header_extra_2 = 0;

  ADD(4); LOGIC(3); BRANCH(1);
  if ((params->sbr_limiter_bands != SBR_LIMITER_BANDS_DEFAULT) ||
      (params->sbr_limiter_gains != SBR_LIMITER_GAINS_DEFAULT) ||
      (params->sbr_interpol_freq != SBR_INTERPOL_FREQ_DEFAULT) ||
      (params->sbr_smoothing_length != SBR_SMOOTHING_LENGTH_DEFAULT)) {

     MOVE(1);
     hEnvEnc->sbrHeaderData.header_extra_2 = 1;
  }

  INDIRECT(4); MOVE(2);
  hEnvEnc->sbrConfigData.detectMissingHarmonics    = params->detectMissingHarmonics;
  hEnvEnc->sbrConfigData.useParametricCoding       = params->parametricCoding;


  INDIRECT(2); PTR_INIT(2); FUNC(3); BRANCH(1);
  if(updateFreqBandTable(&hEnvEnc->sbrConfigData,
                         &hEnvEnc->sbrHeaderData,
                         QMF_CHANNELS)){
    FUNC(1);
    EnvClose (hEnvEnc);

    COUNT_sub_end();
    return(1);
  }


  PTR_INIT(1); /* hEnvEnc->hEnvChannel[] */
  INDIRECT(3); PTR_INIT(2); LOOP(1);
  for ( ch = 0; ch < hEnvEnc->sbrConfigData.nChannels; ch++ ) {

    FUNC(5); BRANCH(1);
    if(createEnvChannel(ch,
                        &hEnvEnc->sbrConfigData,
                        &hEnvEnc->sbrHeaderData,
                        hEnvEnc->hEnvChannel[ch],
                        params)){

      FUNC(1);
      EnvClose (hEnvEnc);

      COUNT_sub_end();
      return(1);
    }
  }


  INDIRECT(1); PTR_INIT(1);
  hEnvEnc->hPsEnc = NULL;


#ifndef MONO_ONLY

  INDIRECT(1); BRANCH(1);
  if (params->usePs)
  {
    INDIRECT(2); PTR_INIT(1); FUNC(2); BRANCH(1);
    if(createQmfBank (1, &hEnvEnc->hEnvChannel[1]->sbrQmf)){
      COUNT_sub_end();
      return (1);
    }
    INDIRECT(1); PTR_INIT(1); FUNC(3); BRANCH(1);
    if(CreateExtractSbrEnvelope (1,
                                 &hEnvEnc->hEnvChannel[1]->sbrExtractEnvelope,
                                 576
                                 )) {
      COUNT_sub_end();
      return(1);
    }

    INDIRECT(1); MOVE(1);
    hEnvEnc->hSynthesisQmfBank = &SynthesisQmfBank;

    INDIRECT(1); PTR_INIT(1); FUNC(1); BRANCH(1);
    if(CreateSynthesisQmfBank (hEnvEnc->hSynthesisQmfBank)){

      FUNC(1);
      DeleteSynthesisQmfBank ((HANDLE_SBR_QMF_FILTER_BANK*)&hEnvEnc->hSynthesisQmfBank);

      COUNT_sub_end();
      return 1;
    }

    INDIRECT(1); MOVE(1);
    hEnvEnc->hPsEnc = &psEncoder;

    INDIRECT(2); PTR_INIT(1); FUNC(2); BRANCH(1);
    if(CreatePsEnc (hEnvEnc->hPsEnc,
                    params->psMode)){

      FUNC(1);
      DeletePsEnc(&hEnvEnc->hPsEnc);

      COUNT_sub_end();
      return 1;
    }
  }
#endif /* #ifndef MONO_ONLY */

  INDIRECT(2); MOVE(1);
  hEnvEnc->CmonData.sbrNumChannels  = hEnvEnc->sbrConfigData.nChannels;

  INDIRECT(1); MOVE(1);
  hEnvEnc->sbrPayloadSize = 0;

  INDIRECT(1); MOVE(2);
  *hEnvEncoder = hEnvEnc;
  *coreBandWith = hEnvEnc->sbrConfigData.xOverFreq;

  COUNT_sub_end();

  return 0;
}
Esempio n. 7
0
int FloatAACPlusEncodeCodec::init(unsigned int sample_rate, unsigned int bitrate, unsigned int channels)
{
	if(sample_rate < 44100 || bitrate < 24000 || channels < 2)
	{
		return -1;
	}

	m_iSampleRate = sample_rate;
	m_iBitRate = bitrate;
	m_iChannel = channels;
	useParametricStereo = 0;

	if ((channels == 2) && (bitrate > 16000) && (bitrate < 36000))
	{
		useParametricStereo = 1;
	}

	unsigned int sample_rate_AAC = m_iSampleRate;
	unsigned int channels_AAC = channels;
	unsigned int channels_SBR = channels;

	if (useParametricStereo)
	{
		channels_AAC = 1;
		channels_SBR = 2;
	}

	AACENC_CONFIG   config;

	AacInitDefaultConfig(&config);
	config.sampleRate = sample_rate;
	config.bitRate = bitrate;
	config.nChannelsIn = channels;
	config.nChannelsOut = channels_AAC;
	config.bandWidth = 0;

	//初始化SBR
	if(!IsSbrSettingAvail(bitrate, channels_AAC, sample_rate_AAC, &sample_rate_AAC)) 
	{
		return -2;
	}

	HANDLE_SBR_ENCODER hEnvEnc = NULL;
	sbrConfiguration sbrConfig;

	//ParametricStereo的位置
	envReadOffset   = 0;
	coreWriteOffset = 0;
	if(useParametricStereo)
	{
		envReadOffset = (MAX_DS_FILTER_DELAY + INPUT_DELAY)*MAX_CHANNELS;
		coreWriteOffset = CORE_INPUT_OFFSET_PS;
		writeOffset = envReadOffset;
	}

	//获得SBR初始化参数
	InitializeSbrDefaults(&sbrConfig);

	//使用ParametricStereo
	sbrConfig.usePs = useParametricStereo;

	AdjustSbrSettings(&sbrConfig,
		bitrate,
		channels_AAC,
		sample_rate_AAC,
		AACENC_TRANS_FAC,
		24000);

	//开辟编码器内存
	inputBuffer = new float[(AACENC_BLOCKSIZE*2 + MAX_DS_FILTER_DELAY + INPUT_DELAY)*MAX_CHANNELS];
	outputBuffer = new unsigned int[(6144/8)*MAX_CHANNELS/(sizeof(int))];

	EnvOpen(&hEnvEnc,
		inputBuffer + coreWriteOffset,
		&sbrConfig,
		&config.bandWidth);

	m_hSbr = (void *)hEnvEnc;

	//初始化AAC
	config.sampleRate = sample_rate_AAC;

	struct AAC_ENCODER *aacEnc = 0;
	if(AacEncOpen(&aacEnc, config) != 0)
	{
		AacEncClose(aacEnc);
		EnvClose(hEnvEnc);
		return -3;
	}

	m_hAac = (void *)aacEnc;

	return 0;
}
Esempio n. 8
0
int main(/*int argc, char *argv[]*/)
{
	AACENC_CONFIG     config;
	FILE* inputFile = NULL;

	SBRDECODER sbrDecoderInfo = 0;

	FILE *fOut=NULL;
	HANDLE_MP4_FILE hMp4File;

	int  error;
	int bitrate;
	int nChannelsAAC, nChannelsSBR;
	unsigned int sampleRateAAC;
	int frmCnt;
	int bandwidth = 0;

	unsigned int numAncDataBytes=0;
	unsigned char ancDataBytes[MAX_PAYLOAD_SIZE];

	/*!< required only for interfacing with audio output library, thus not counted into RAM requirements */
	short TimeDataPcm[AACENC_BLOCKSIZE*2*MAX_CHANNELS];

	int numSamplesRead;
	int bDoIIR2Downsample = 0;
	int bDingleRate = 0;
	int useParametricStereo = 0;
	int coreWriteOffset = 0;
	int coreReadOffset = 0;
	int envWriteOffset = 0;
	int envReadOffset = 0;
	int writeOffset=INPUT_DELAY*MAX_CHANNELS;

	struct AAC_ENCODER *aacEnc = 0;

	int bDoUpsample = 0;
	int upsampleReadOffset = 0;

	int inSamples_enc;
	int bDoIIR32Resample = 0;
	const int nRuns = 4;
	float *resamplerScratch = sbr_envRBuffer;

	HANDLE_SBR_ENCODER hEnvEnc=NULL;

	bitrate = 24000;

	/*open audio input file*/
	int sampleRate     = 48000 ;    /* only relevant if valid == 1 */
	int nChannels      = 2 ;        /* only relevant if valid == 1 */

	inputFile = fopen("f:\\xxxx.wav", "rb");
	if(inputFile == NULL)
	{
		assert(0);
		return 0;
	}

	/* set up basic parameters for aacPlus codec*/
	AacInitDefaultConfig(&config);

	nChannelsAAC = nChannelsSBR = nChannels;
	if ( (nChannels == 2) && (bitrate > 16000) && (bitrate < 36000) )
	{
		useParametricStereo = 1;
	}

	if (useParametricStereo)
	{
		nChannelsAAC = 1;
		nChannelsSBR = 2;
	}

	if ( (sampleRate == 48000) && (nChannelsAAC == 2) && (bitrate < 24000) ) {
		bDoIIR32Resample  = 1;
	}

	if (sampleRate == 16000) {
		bDoUpsample = 1;
		sampleRate = 32000;
		bDingleRate = 1;
	}

	sampleRateAAC = sampleRate;

	if (bDoIIR32Resample)
		sampleRateAAC = 32000;

	config.bitRate = bitrate;
	config.nChannelsIn=nChannels;
	config.nChannelsOut=nChannelsAAC;

	config.bandWidth=bandwidth;
	/*set up SBR configuration*/
	if(!IsSbrSettingAvail (bitrate, nChannelsAAC, sampleRateAAC, &sampleRateAAC)) {
		fprintf(stderr,"No valid SBR configuration found\n");
		exit(10);
	}

	{
		sbrConfiguration sbrConfig;

		envReadOffset = 0;
		coreWriteOffset = 0;

		if(useParametricStereo)
		{
			envReadOffset = (MAX_DS_FILTER_DELAY + INPUT_DELAY)*MAX_CHANNELS;
			coreWriteOffset = CORE_INPUT_OFFSET_PS;
			writeOffset = envReadOffset;
		}

		InitializeSbrDefaults (&sbrConfig);

		sbrConfig.usePs = useParametricStereo;

		AdjustSbrSettings(&sbrConfig,
			bitrate,
			nChannelsAAC,
			sampleRateAAC,
			AACENC_TRANS_FAC,
			24000);

		EnvOpen(&hEnvEnc,
			inputBuffer + coreWriteOffset,
			&sbrConfig,
			&config.bandWidth);

		/* set IIR 2:1 downsampling */
		bDoIIR2Downsample = (bDoUpsample) ? 0 : 1;

		if (useParametricStereo)
		{
			bDoIIR2Downsample = 0;
		}else{
			assert(0);
		}

	}

	if (bDoUpsample) {
		assert(0);
	}
	else {
		if (bDoIIR2Downsample){
			assert(0);
		}
	}

	/*
	set up AAC encoder, now that samling rate is known
	*/
	config.sampleRate = sampleRateAAC;
	error = AacEncOpen( &aacEnc,config);

	if (error){
		assert(0);
		AacEncClose(aacEnc);
		fclose(inputFile);

		if (fOut) 
			fclose(fOut);
		return 1;
	}


	/*set up MPEG-4/3GPP file format library (not instrumented nor accounted for RAM requirements)*/
	{
		unsigned char ASConfigBuffer[80];
		unsigned int  nConfigBits;
		unsigned int  nConfigBytes;

		memset (ASConfigBuffer, 0, 80);

		if ( GetMPEG4ASConfig( sampleRateAAC,
			nChannelsAAC,
			ASConfigBuffer,
			&nConfigBits,
			1,
			bDingleRate) ) {
				fprintf(stderr, "\nCould not initialize Audio Specific Config\n");
				exit(10);
		}


		nConfigBytes = (nConfigBits+7)>>3;

		if (OpenMP4File(&hMp4File,
			ASConfigBuffer,
			nConfigBytes,
			"f:/out2.3gp",
			(!bDingleRate) ? sampleRateAAC*2 : sampleRateAAC, /* output sampleRate */
			config.bitRate,
			nChannelsAAC,
			1,
			1) ) {
				fprintf(stderr, "\nFailed to create 3GPP file\n") ;
				exit(10);
		}
	}

	frmCnt = 0;
	memset(TimeDataPcm,0,sizeof(TimeDataPcm));

	/*set up input samples block size feed*/
	inSamples_enc = AACENC_BLOCKSIZE * nChannels * 2; 


////decodec////////////////////////////////////////////////////////////////////////////////////////
	#define INPUT_BUF_SIZE (6144*2/8)                      /*!< Size of Input buffer in bytes*/
	unsigned int inBuffer[INPUT_BUF_SIZE/(sizeof(int))];   /*!< Input buffer */
	struct BIT_BUF bitBuf, *hBitBuf;
	AACDECODER aacDecoderInfo = 0; 
	SBRBITSTREAM streamSBR;   
	hBitBuf = CreateBitBuffer(&bitBuf,(unsigned char*) inBuffer,INPUT_BUF_SIZE);


	aacDecoderInfo = CAacDecoderOpen(hBitBuf,
		&streamSBR,
		TimeDataFloat);
	if(0 == aacDecoderInfo)
	{
		assert(0);
		return 0;
	}

	if(0 != CAacDecoderInit (aacDecoderInfo,sampleRate/2,bitrate))
	{
		assert(0);
		return 0;
	}

///////////////////////////////////////////////////////////////////////////////////////////////////
	FILE* fw = fopen("f:\\uuu.pcm", "wb");
	/*	The frame loop */
	while (1)
	{
		int i, numOutBytes;

		numSamplesRead = fread(TimeDataPcm, 2, inSamples_enc, inputFile);
		if(numSamplesRead <= 0)
		{
			break;
		}

		/* copy from short to float input buffer */
		if ( nChannels == nChannelsSBR ) {
			for (i=0; i<numSamplesRead; i++) {
				inputBuffer[i+writeOffset] = (float) TimeDataPcm[i];
			}
		}

#if (MAX_CHANNELS==2)
		/* copy from short to float input buffer, reordering necessary since the encoder takes interleaved data */
		if(nChannels == 1) {
			int i;
			for (i=0; i<numSamplesRead; i++) {
				inputBuffer[writeOffset+2*i] = (float) TimeDataPcm[i];
			}
		}
#endif

		/*encode one SBR frame*/
		EnvEncodeFrame (hEnvEnc,
			inputBuffer + envReadOffset,
			inputBuffer + coreWriteOffset,
			MAX_CHANNELS,
			&numAncDataBytes,
			ancDataBytes);

		/*encode one AAC frame*/
		if (hEnvEnc && useParametricStereo) {

			AacEncEncode(aacEnc,
				inputBuffer,
				1, /* stride */
				ancDataBytes,
				&numAncDataBytes,
				outputBuffer,
				&numOutBytes);

			if(hEnvEnc)
			{
				memcpy( inputBuffer,inputBuffer+AACENC_BLOCKSIZE,CORE_INPUT_OFFSET_PS*sizeof(float));
			}
		}
		else
		{
			assert(0);
		}

		////////////////////////////////////////dec
		unsigned char* pData = (unsigned char*)outputBuffer;
		for(int i = 0; i < numOutBytes; i++)
			WriteBits(hBitBuf,pData[i],8);

		streamSBR.NrElements = 0;
		int frameSize_dec= 0, sampleRate_dec = 0, numChannels_dec = 2;
		char frameOk_dec = 1, channelMode_dec = 0;
		int ErrorStatus = CAacDecoder_DecodeFrame(aacDecoderInfo,&frameSize_dec,&sampleRate_dec,
									&numChannels_dec,	&channelMode_dec,	frameOk_dec);

		assert(ErrorStatus == 0);
		if ((!sbrDecoderInfo) && streamSBR.NrElements)
			sbrDecoderInfo = openSBR (sampleRate_dec,frameSize_dec, 0,0);

		if (sbrDecoderInfo) {

			/* apply SBR processing */
			if (applySBR(sbrDecoderInfo, &streamSBR, TimeDataFloat,	&numChannels_dec,
						frameOk_dec, 0, 0) != SBRDEC_OK){
					sbrDecoderInfo = 0;
			}
			else {
				frameSize_dec = frameSize_dec * 2;
				sampleRate_dec *= 2;
			}
		}

		short* pwData = new short[frameSize_dec * 2];
		/* clip time samples */
		for (i = 0; i < frameSize_dec * numChannels_dec; i++) {
			if (TimeDataFloat[i] < -32768.0) {
				TimeDataFloat[i] = -32768.0;
			}
			else {
				if (TimeDataFloat[i] > 32767.0) {
					TimeDataFloat[i] = 32767.0;
				}
			}

			//pwData[i] = TimeDataFloat[i];
		}

		interleaveSamples(&TimeDataFloat[0],&TimeDataFloat[frameSize_dec],pwData,frameSize_dec,&numChannels_dec);

		fwrite(pwData, 2, frameSize_dec * numChannels_dec, fw);
		delete [] pwData;
////////////////////////////////////////////////////////////////////////
		if (numOutBytes) {
			MP4FileAddFrame( hMp4File, 
				outputBuffer,
				numOutBytes );
		}

		frmCnt++;

		/* 3GPP instrumenting tool: measure worst case work load at end of each decoding loop */
		fprintf(stderr,"[%d]\r",frmCnt); fflush(stderr);
	}
	fprintf(stderr,"\n"); fflush(stderr);

	AacEncClose(aacEnc);

	fclose(inputFile);

	if (WriteMP4File( hMp4File)) {
		fprintf(stderr, "Writing of 3GPP file failed.");
		exit(10);
	}
	CloseMP4File( hMp4File);

	if(hEnvEnc)
	{
		EnvClose(hEnvEnc);
	}

	printf("\nencoding finished\n");
	return 0;
}