- int ret;
- size_t pos;
-
- *len = 0;
- if (current_chunk >= num_chunks)
- return NULL;
- if (!current_chunk) {
- *len = entry;
- pos = 0;
- } else if (current_chunk == 1) {
- *len = chunk_table[0];
- pos = entry;
- } else {
- *len = chunk_table[current_chunk - 1] - chunk_table[current_chunk - 2];
- pos = entry + chunk_table[current_chunk - 2];
- }
- if (inbuf_size < *len) {
- inbuf = para_realloc(inbuf, *len);
- inbuf_size = *len;
- }
-// PARA_DEBUG_LOG("reading chunk #%lu@%zd (%zd bytes)\n", current_chunk,
-// pos, *len);
- ret = fseek(infile, pos, SEEK_SET);
+ int i;
+ size_t skip;
+ ssize_t ret;
+ unsigned long rate = 0, decoder_len;
+ unsigned char channels = 0;
+ mp4AudioSpecificConfig mp4ASC;
+ NeAACDecHandle handle = NULL;
+ unsigned char *umap = (unsigned char *) map;
+
+ ret = aac_find_esds(umap, numbytes, &skip, &decoder_len);
+ if (ret < 0)
+ goto out;
+ aac_get_taginfo(umap, numbytes, afhi);
+ handle = aac_open();
+ ret = -E_AAC_AFH_INIT;
+ if (NeAACDecInit(handle, umap + skip, decoder_len, &rate, &channels))
+ goto out;
+ if (!channels)
+ goto out;
+ PARA_DEBUG_LOG("rate: %lu, channels: %d\n", rate, channels);
+ ret = -E_MP4ASC;
+ if (NeAACDecAudioSpecificConfig(umap + skip, numbytes - skip, &mp4ASC))
+ goto out;
+ if (!mp4ASC.samplingFrequency)
+ goto out;
+ ret = aac_compute_chunk_table(afhi, umap, numbytes);