/* * 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; } } } } }
/* * Input : Filename * Output : 1 if succesful -1 if not */ int mp4_openFile(char * name) { if((sndFile = fopen(name, "rb"))) { mp4cb.user_data = sndFile; 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 */ inf.sampRateCore = mp4ff_get_sample_rate(infile, track); inf.nChans = mp4ff_get_channel_count(infile,track); /* AACSetRawBlockParams will fail if not set */ inf.profile = AAC_PROFILE_LC; samples = mp4ff_num_samples(infile, track); if(!AACSetRawBlockParams(decoder, 0, &inf)) return 0; } } } } return -1; /* sndFile == NULL */ }