int __stdcall ac3_decode_frame(ac3_state *state)
{
	uint_32 i;
	int j;
	int error_flag=0;

	// debug(DAC3,"(decode_frame) begin frame %d\n",state->frame_count);

	//find a syncframe and parse
	parse_syncinfo(&state->syncinfo,&error_flag,state);
	if(error_flag)
	{
		// debug(DAC3," -- fail after parse_syncinfo\n");
		goto error;
	}

        state->frame_count++;

	state->sampling_rate = state->syncinfo.sampling_rate;

	parse_bsi(&state->bsi,state);

	stats_print_banner(&state->syncinfo,&state->bsi,state);

	for(i=0; i < 6; i++)
	{
		//Initialize freq/time sample storage
		memset(state->samples,0,sizeof(float) * 256 * (state->bsi.nfchans + state->bsi.lfeon));

		// Extract most of the audblk info from the bitstream
		// (minus the mantissas 
		parse_audblk(&state->bsi,&state->audblk,state);

		// Take the differential exponent data and turn it into
		// absolute exponents 
		exponent_unpack(&state->bsi,&state->audblk,&error_flag,state); 
		if(error_flag)
		{
			// debug(DAC3," -- fail after exponent_unpack\n");
			goto error;
		}

		// Figure out how many bits per mantissa 
		bit_allocate(state->syncinfo.fscod,&state->bsi,&state->audblk,state);

		// Extract the mantissas from the stream and
		// generate floating point frequency coefficients
		coeff_unpack(&state->bsi,&state->audblk,state->samples,&error_flag,state);
		if(error_flag)
		{
			// debug(DAC3," -- fail after coeff_unpack\n");
			goto error;
		}

		if(state->bsi.acmod == 0x2)
		{
			rematrix(&state->audblk,state->samples);
		}	

		// Convert the frequency samples into time samples
		imdct(&state->bsi,&state->audblk,state->samples);

		// Downmix into the requested number of channels
		// and convert floating point to sint_16

		for(j=0;j<256;j++)
		{
			state->left[i*256+j]=(sint_16)(state->samples[0][j]*32767.0f);
                        state->center[i*256+j]=(sint_16)(state->samples[1][j]*32767.0f);
                	state->right[i*256+j]=(sint_16)(state->samples[2][j]*32767.0f);
                        state->sleft[i*256+j]=(sint_16)(state->samples[3][j]*32767.0f);
                        state->sright[i*256+j]=(sint_16)(state->samples[4][j]*32767.0f);
                        state->subwoofer[i*256+j]=(sint_16)(state->samples[5][j]*32767.0f);
                }

		sanity_check(&state->syncinfo,&state->bsi,&state->audblk,&error_flag,state);
		if(error_flag)
		{
			// debug(DAC3," -- sanity check fail\n");
			goto error;
		}
	}
	parse_auxdata(&state->syncinfo,state);

	return 0;	

error:
	// debug(DAC3," -- FRAME ZEROED\n");

	return -1;
}
Exemple #2
0
uint_32 ac3_decode_data(uint_8 *data_start, uint_32 length, uint_32 *start, short *audio_buf_ptr)
{
	uint_8 *data_initial = data_start;
	uint_8 *data_end = data_start + length;
	uint_32 i, j = *start*2;
	int ret;

//	error_flag = buffer_size = 0;
//	syncinfo.syncword = 0xffff;

    // printf("In ac3_decode_data\n");

	while ((ret = decode_buffer_syncframe(&syncinfo, &data_start, data_end)) > 0)
	{
		if (error_flag)
		{
#ifdef _WIN32
			SetDlgItemText(hDlg, IDC_INFO, "A.E.!");
#else
      printf("A.E.!\n");
#endif
			ZeroMemory(s16_samples, sizeof(sint_16) * 256 * 2 * 6);
			error_flag = 0;
			continue;
		}

		parse_bsi(&bsi);

		for (i=0; i<6; i++)
		{
			ZeroMemory(samples, sizeof(double) * 256 * (bsi.nfchans + bsi.lfeon));

			parse_audblk(&bsi, &audblk);

			exponent_unpack(&bsi, &audblk); 
			if (error_flag)
				goto error;

			bit_allocate(syncinfo.fscod, &bsi, &audblk);

			coeff_unpack(&bsi, &audblk, samples);
			if (error_flag)
				goto error;

			if (bsi.acmod == 0x2)
				rematrix(&audblk, samples);

			imdct(&bsi, &audblk, samples);
			downmix(&audblk, &bsi, samples, &s16_samples[i * 512]);
			sanity_check(&bsi, &audblk);
			if (error_flag)
				goto error;
		}
		memcpy(&audio_buf_ptr[(*start)/2], s16_samples, 6144);
		*start += 6144;
error:
		;
	}
//	if (ret == -1)
//		return(-1);
	sampling_rate=syncinfo.sampling_rate;
	AC3_byterate = syncinfo.bit_rate/8*1000;

/*	if (Decision_Flag || (!SRC_Flag && Normalization_Flag))
		for (i=(j>>1); i<(start>>1); i++)
			if (Sound_Max < abs(ptrAC3Dec_Buffer[i]))
			{
				Sound_Max = abs(ptrAC3Dec_Buffer[i]);

				if (Decision_Flag && Sound_Max > Norm_Ratio)
				{
					sprintf(szBuffer, "%.2f", 327.68 * Norm_Ratio / Sound_Max);
					SetDlgItemText(hDlg, IDC_INFO, szBuffer);
				}
			}
*/
//	return (data_end - data_initial);
	return (data_start - data_initial);
}
Exemple #3
0
int AC3_SampleConvert(sint_16 *pPcmData, uint_32 *pnPcmDataLen, uint_8* pAc3Buf, uint_32 nAc3DataLen)
{
	int i;
	bitstream_t *bs;	
	long SampleRate = 0; /* bitstream sample-rate */
	uint_32 cbErrors = 0; /* bitstream error count returned by 							decode_sanity_check() */
	uint_32 cbMantErrors, cbExpErrors;		/* error counters for mantissa & exponent unpacking errors */
	bsi_t bsi_blank = {0};
    static audblk_t audblk_blank = {0};

	bs = bitstream_open(pAc3Buf, pAc3Buf+nAc3DataLen);

	imdct_init();
	/* initialize decoder and counter variables */

	(bsi) = bsi_blank;
	(audblk) = audblk_blank;
	decode_sanity_check_init();

	bsi_blank = bsi;
	audblk_blank = audblk;

	cbErrors = 0; 

	audblk = audblk_blank; /* clear out audioblock */

  	if(!(decode_resync(bs)))
	{
		return  0;
	}

	bsi = bsi_blank; /* v0.04 wipe bsi clear, not really necessary */

	parse_syncinfo(&syncinfo,bs);

	parse_bsi(&bsi,bs);

	switch (syncinfo.fscod)
	{
		case 2:
			SampleRate = 32000;
			break;
		case 1:
			SampleRate = 44100;
			break;
		case 0:
			SampleRate = 48000;
			break;
		default:
			return 0;
	}

		/* reset bitstream error counters */
	cbErrors =
	cbExpErrors =
	cbMantErrors = 0;
	
	memset(pPcmData, 0, BUFFER_SIZE1*2);
	*pnPcmDataLen = 0;
	for(i=0; i < 6; i++)
	{
		long buf_offset;
		parse_audblk(&bsi,&audblk,bs,i);					// CPU time 10%

		cbExpErrors = exponent_unpack(&bsi,&audblk);
		if(cbExpErrors > 0)
		{
			return 0;
			cbExpErrors =0;
		}

		bit_allocate(syncinfo.fscod,&bsi,&audblk);			// CPU TIME 1.2%

		if ( bsi.nfchans > 6 )
		{ 
			bsi.nfchans = 0; 
			return 0;//(LPBYTE) out_buf; 
		}

		cbMantErrors = mantissa_unpack(&bsi,&audblk,bs);	// CPU TIME 62.0%
		if( cbMantErrors > 0)
		{
			return 0;
            cbMantErrors = 0;
		}

		uncouple(&bsi,&audblk,&stream_coeffs);				// CPU TIME 1.7%

		if(bsi.acmod == 0x2)
			rematrix(&audblk,&stream_coeffs);				// CPU TIME 0.1%

		imdct(&bsi,&audblk,&stream_coeffs,&stream_samples);	// CPU TIME 11.2%

		buf_offset = i * 512;

		downmix( &stream_samples, pPcmData+buf_offset, &bsi, 0 );
	} /* endfor ( i = 0 ... ) */
	*pnPcmDataLen = 6*512*2;

	cbErrors = decode_sanity_check();
	if(cbErrors > 0)
	{
		return 0;
	}

	parse_auxdata(&syncinfo,bs);			// CPU TIME 2.0%
	if(!crc_validate())
	{
		return 0;
	}
	return 1;
}