Exemplo n.º 1
0
mm_word aac_on_stream_request( mm_word length, mm_addr dest, mm_stream_formats format ) {
	int decoded = 0;

	/* AACDecode will always output 1024 samples per channel */
	if(length >=1024) {
		int ret = 1;
		/* At least the size of the header should be buffered */
		if(dataLeft < AAC_MAINBUF_SIZE)
			ret = fill_readBuffer(readBuffer, &readOff, AAC_MAINBUF_SIZE, &dataLeft);

		if(dataLeft < AAC_MAINBUF_SIZE) {
			/* No more to read, still able to decode something more */
			if(feof(sndFile) && !Endof)
				Endof = MM_BUFFER_SIZE;
			/* Still some data in maxmods buffer*/
			else if(length < Endof)
				return 0;
			else {
				needsClosing = true;
				return 0;
			}
		}
		/* Shouldn't be worth checking, as above should take care of no underflows */
		if((ret = AACDecode(decoder, &readOff, &dataLeft, dest)) == ERR_AAC_INDATA_UNDERFLOW) {}
		if(ret <-1) {
			iprintf("HELIX AAC ERROR: %d\n", ret);
			needsClosing = true;
			return 0;
		}
		decoded +=1024;
	}
	visualizeBuffer(dest);
	return decoded;
}
Exemplo n.º 2
0
/*
 * Input	:	Filename
 * Output	: 	1 if succesful 0 if not
 */
int openFile(const char * name)
{
	readOff = readBuf;
	if((fp = fopen(name, "rb"))) {
		if(strstr(name, ".aac") || strstr(name, ".AAC")) {
			dec_state  = DEC_AAC;
			if((decoder = AACInitDecoder())) {
				if(fill_readBuffer(readBuf, &readOff, READ_BUF_SIZE, &dataLeft) == READ_BUF_SIZE) {
					int ret = 0;
					int bitOffset = 0, bitsAvail = dataLeft << 3;
					if(IS_ADIF(readBuf))
						ret = UnpackADIFHeader((AACDecInfo*)decoder, &readOff, &bitOffset, &bitsAvail);
					else
						ret = UnpackADTSHeader((AACDecInfo*)decoder, &readOff, &bitOffset, &bitsAvail);
					if(!ret) {
						AACGetLastFrameInfo(decoder, &inf);
						readOff = readBuf;
						dataLeft = READ_BUF_SIZE;
						return 1;
					}
				}
			}
		} else {
			dec_state = DEC_MP4;
			mp4cb.user_data = fp;
			if((infile = mp4ff_open_read(&mp4cb))) {
				if ((track = findAudioTrack(infile)) >= 0) {
					/* Decoder failed to initialize */
					if((decoder = AACInitDecoder())) {
						/* Decoder should be updated to decode raw blocks in the mp4
						 * IMPORTANT:
						 * mp4ff_get_channel_count will return the wrong value for mono in this state
						 */
						inf.sampRateCore = mp4ff_get_sample_rate(infile, track);
						samples = mp4ff_num_samples(infile, track);
						/*
						DECODER CONFIG:
						[AAAA ABBB] [BCCC CDEF]

						A)object type
						B)frequency index
						C)channel configuration
						D)bit: frame length flag
						E)bit: dependsOnCoreCoder
						F)bit: extensionFlag
						*/

						unsigned char * config_buf;
						unsigned int config_bufSize;
						mp4ff_get_decoder_config(infile, track, &config_buf, &config_bufSize);
						inf.profile =  AAC_PROFILE_LC;
						inf.nChans 	= (config_buf[1] >> 3) & 0xF;
						free(config_buf);
						if(!AACSetRawBlockParams(decoder, 0, &inf))
							return 1;
					}
				}
			}
		}
	}
Exemplo n.º 3
0
int aac_openFile(char * name) {
	readOff = readBuffer;
	if((sndFile = fopen(name, "rb"))) {
		if((decoder = AACInitDecoder())) {
			if(fill_readBuffer(readBuffer, &readOff, READ_BUF_SIZE, &dataLeft) == READ_BUF_SIZE) {
				int ret = 0;
				int bitOffset = 0, bitsAvail = dataLeft << 3;
				if(IS_ADIF(readBuffer))
					ret = UnpackADIFHeader((AACDecInfo*)decoder, &readOff, &bitOffset, &bitsAvail);
				else
					ret = UnpackADTSHeader((AACDecInfo*)decoder, &readOff, &bitOffset, &bitsAvail);
				if(!ret) {
					AACGetLastFrameInfo(decoder, &inf);
					readOff = readBuffer;
					dataLeft = READ_BUF_SIZE;
					return 0;
				}
			}
		}
	}
	return -1;	/* sndFile == NULL */
}