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; }
/* * 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; } } } } }
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 */ }