#include "aac.h"
#include "fd.h"
-/* must be big enough to hold header */
+/** size of the input buffer, must be big enough to hold header */
#define DEFAULT_INBUF_SIZE 65536
static FILE *infile;
static int inbuf_size;
static unsigned char *inbuf;
static size_t inbuf_len;
-struct audio_format_handler *af;
+static struct audio_format_handler *af;
static size_t num_chunks;
-static size_t entry;
static size_t *chunk_table;
-NeAACDecHandle handle;
+static NeAACDecHandle handle;
static void aac_close_audio_file(void)
{
return;
fclose(infile);
infile = NULL;
+ free(inbuf);
+ inbuf = NULL;
+ free(chunk_table);
+ chunk_table = NULL;
}
static int aac_find_stsz(unsigned char *buf, unsigned buflen, size_t *skip)
}
num_chunks = ret;
PARA_INFO_LOG("sz table has %zu entries\n", num_chunks);
- free(chunk_table);
- chunk_table = para_malloc(num_chunks * sizeof(size_t));
- for (i = 0; i < num_chunks; i++) {
+ chunk_table = para_malloc((num_chunks + 1) * sizeof(size_t));
+ for (i = 1; i <= num_chunks; i++) {
if (skip + 4 > inbuf_len) {
skip = inbuf_len - skip;
memmove(inbuf, inbuf + inbuf_len - skip, skip);
return 1;
}
-long unsigned aac_set_chunk_tv(mp4AudioSpecificConfig *mp4ASC)
+static long unsigned aac_set_chunk_tv(mp4AudioSpecificConfig *mp4ASC)
{
float tmp = mp4ASC->sbr_present_flag == 1? 2047 : 1023,
ms = 1000.0 * num_chunks * tmp / mp4ASC->samplingFrequency;
static int aac_get_file_info(FILE *file, char *info_str, long unsigned *frames,
int *seconds)
{
- int ret, decoder_len;
+ int i, ret, decoder_len;
size_t skip;
unsigned long rate = 0;
unsigned char channels = 0;
mp4AudioSpecificConfig mp4ASC;
- free(inbuf);
inbuf_size = DEFAULT_INBUF_SIZE;
inbuf = para_malloc(inbuf_size);
infile = file;
return -E_AAC_READ;
PARA_INFO_LOG("next buffer: %d bytes\n", ret);
}
- entry = ret;
+ chunk_table[0] = ret;
+ for (i = 1; i<= num_chunks; i++)
+ chunk_table[i] += ret;
sprintf(info_str, "audio_file_info1:%zu x %lums\n"
"audio_file_info2:\n"
"audio_file_info3:\n",
return 1;
}
-/*
- * nothing to do as we'll seek to the correct offset in aac read_chunk() anyway
- */
-static int aac_reposition_stream(__a_unused long unsigned request)
-{
- return 1;
-}
-
static char *aac_read_chunk(long unsigned current_chunk, ssize_t *len)
{
int ret;
*len = 0;
if (current_chunk >= num_chunks)
return NULL;
- if (!current_chunk) {
- *len = chunk_table[0];
- pos = entry;
- } else {
- *len = chunk_table[current_chunk] - chunk_table[current_chunk - 1];
- pos = entry + chunk_table[current_chunk - 1];
- }
+ *len = chunk_table[current_chunk + 1] - chunk_table[current_chunk];
+ if (!*len) /* nothing to send for this run */
+ return inbuf;
+ pos = chunk_table[current_chunk];
if (inbuf_size < *len) {
+ PARA_INFO_LOG("increasing inbuf for chunk #%lu/%zu to %zd bytes\n",
+ current_chunk, num_chunks, *len);
inbuf = para_realloc(inbuf, *len);
inbuf_size = *len;
}
return (char *)inbuf;
}
+
static const char* aac_suffixes[] = {"m4a", "mp4", NULL};
/** the init function of the aac audio format handler */
void aac_afh_init(struct audio_format_handler *p)
{
af = p;
- af->reposition_stream = aac_reposition_stream;
af->get_file_info = aac_get_file_info,
af->read_chunk = aac_read_chunk;
af->close_audio_file = aac_close_audio_file;