/** size of the input buffer, must be big enough to hold header */
#define AAC_INBUF_SIZE 65536
-static FILE *infile;
-
-static void aac_close_audio_file(void)
-{
- if (!infile)
- return;
- fclose(infile);
- infile = NULL;
-}
-
static int aac_find_stsz(unsigned char *buf, unsigned buflen, size_t *skip)
{
int i;
return -E_STSZ;
}
-static int read_chunk_table(struct audio_format_info *afi, unsigned char *inbuf,
- size_t inbuf_len, size_t skip)
+static int read_chunk_table(FILE *file, struct audio_format_info *afi,
+ unsigned char *inbuf, size_t inbuf_len, size_t skip)
{
int ret, i;
size_t sum = 0;
ret = aac_find_stsz(inbuf, inbuf_len, &skip);
if (ret >= 0)
break;
- ret = read(fileno(infile), inbuf, AAC_INBUF_SIZE);
+ ret = read(fileno(file), inbuf, AAC_INBUF_SIZE);
if (ret <= 0)
return -E_AAC_READ;
inbuf_len = ret;
if (skip + 4 > inbuf_len) {
skip = inbuf_len - skip;
memmove(inbuf, inbuf + inbuf_len - skip, skip);
- ret = read(fileno(infile), inbuf + skip,
+ ret = read(fileno(file), inbuf + skip,
AAC_INBUF_SIZE - skip);
if (ret <= 0)
return -E_AAC_READ;
mp4AudioSpecificConfig mp4ASC;
NeAACDecHandle handle;
- infile = file;
- ret = read(fileno(infile), inbuf, AAC_INBUF_SIZE);
+ ret = read(fileno(file), inbuf, AAC_INBUF_SIZE);
if (ret <= 0) {
ret = -E_AAC_READ;
goto out;
if (NeAACDecAudioSpecificConfig(inbuf + skip, inbuf_len - skip,
&mp4ASC) < 0)
goto out;
- ret = read_chunk_table(afi, inbuf, inbuf_len, skip);
+ ret = read_chunk_table(file, afi, inbuf, inbuf_len, skip);
if (ret < 0)
goto out;
afi->seconds_total = aac_set_chunk_tv(afi, &mp4ASC);
ret = aac_find_entry_point(inbuf, inbuf_len, &skip);
if (ret >= 0)
break;
- ret = read(fileno(infile), inbuf, AAC_INBUF_SIZE);
+ ret = read(fileno(file), inbuf, AAC_INBUF_SIZE);
if (ret <= 0) {
ret = -E_AAC_READ;
goto out;
void aac_afh_init(struct audio_format_handler *afh)
{
afh->get_file_info = aac_get_file_info,
- afh->close_audio_file = aac_close_audio_file;
afh->suffixes = aac_suffixes;
}
static const int frame_size_index[] = {24000, 72000, 72000};
static const char *mode_text[] = {"stereo", "joint stereo", "dual channel", "mono", "invalid"};
-static FILE *infile;
static struct mp3info mp3;
static ssize_t num_chunks;
* returned.
*
*/
-static int mp3_seek_next_header(void)
+static int mp3_seek_next_header(FILE *file)
{
int k, l = 0, c, first_len, ret;
struct mp3header h, h2;
long valid_start = 0;
while (1) {
- while ((c = fgetc(infile)) != 255 && (c != EOF))
+ while ((c = fgetc(file)) != 255 && (c != EOF))
; /* nothing */
if (c != 255)
return 0;
- ungetc(c, infile);
- valid_start = ftell(infile);
- first_len = get_header(infile, &h);
+ ungetc(c, file);
+ valid_start = ftell(file);
+ first_len = get_header(file, &h);
if (first_len <= 0)
continue;
- ret = para_fseek(infile, first_len - FRAME_HEADER_SIZE, SEEK_CUR);
+ ret = para_fseek(file, first_len - FRAME_HEADER_SIZE, SEEK_CUR);
if (ret < 0)
return ret;
for (k = 1; k < MIN_CONSEC_GOOD_FRAMES; k++) {
- if ((l = get_header(infile, &h2)) <= 0)
+ if ((l = get_header(file, &h2)) <= 0)
break;
if (!compare_headers(&h, &h2))
break;
- ret = para_fseek(infile, l - FRAME_HEADER_SIZE, SEEK_CUR);
+ ret = para_fseek(file, l - FRAME_HEADER_SIZE, SEEK_CUR);
if (ret < 0)
return ret;
}
if (k == MIN_CONSEC_GOOD_FRAMES) {
- ret = para_fseek(infile, valid_start, SEEK_SET);
+ ret = para_fseek(file, valid_start, SEEK_SET);
if (ret < 0)
return ret;
memcpy(&(mp3.header), &h2, sizeof(struct mp3header));
}
}
-static int mp3_get_id3(void)
+static int mp3_get_id3(FILE *file)
{
char fbuf[4];
int ret;
mp3.id3.album[0] = '\0';
mp3.id3.comment[0] = '\0';
mp3.id3.year[0] = '\0';
- ret = para_fseek(infile, -128, SEEK_END);
+ ret = para_fseek(file, -128, SEEK_END);
if (ret < 0 )
return ret;
- if (para_fread(fbuf, 1, 3, infile) < 0)
+ if (para_fread(fbuf, 1, 3, file) < 0)
return -E_FREAD;
fbuf[3] = '\0';
if (strcmp("TAG", fbuf)) {
PARA_INFO_LOG("%s", "no id3 tag\n");
return 0;
}
- ret = para_fseek(infile, -125, SEEK_END);
+ ret = para_fseek(file, -125, SEEK_END);
if (ret < 0)
return ret;
- if (para_fread(mp3.id3.title, 1, 30, infile) != 30)
+ if (para_fread(mp3.id3.title, 1, 30, file) != 30)
return -E_FREAD;
mp3.id3.title[30] = '\0';
- if (para_fread(mp3.id3.artist, 1, 30, infile) != 30)
+ if (para_fread(mp3.id3.artist, 1, 30, file) != 30)
return -E_FREAD;
mp3.id3.artist[30] = '\0';
- if (para_fread(mp3.id3.album, 1, 30, infile) != 30)
+ if (para_fread(mp3.id3.album, 1, 30, file) != 30)
return -E_FREAD;
mp3.id3.album[30] = '\0';
- if (para_fread(mp3.id3.year, 1, 4, infile) != 4)
+ if (para_fread(mp3.id3.year, 1, 4, file) != 4)
return -E_FREAD;
mp3.id3.year[4] = '\0';
- if (para_fread(mp3.id3.comment, 1, 30, infile) != 30)
+ if (para_fread(mp3.id3.comment, 1, 30, file) != 30)
return -E_FREAD;
mp3.id3.comment[30] = '\0';
mp3.id3_isvalid = 1;
return 1;
}
-static int find_valid_start(void)
+static int find_valid_start(FILE *file)
{
int ret, frame_len;
- if (!infile)
- return -E_MP3_NO_FILE;
- frame_len = get_header(infile, &mp3.header);
+ frame_len = get_header(file, &mp3.header);
if (frame_len < 0)
return frame_len;
if (!frame_len) {
- frame_len = mp3_seek_next_header();
+ frame_len = mp3_seek_next_header(file);
if (frame_len <= 0)
return frame_len;
} else {
- ret = para_fseek(infile, -FRAME_HEADER_SIZE, SEEK_CUR);
+ ret = para_fseek(file, -FRAME_HEADER_SIZE, SEEK_CUR);
if (ret < 0)
return ret;
}
return frame_len;
}
-static int mp3_read_info(struct audio_format_info *afi)
+static int mp3_read_info(FILE *file, struct audio_format_info *afi)
{
long fl_avg = 0, freq_avg = 0, br_avg = 0;
int ret, len = 0, old_br = -1;
num_chunks = 0;
afi->chunk_table = para_malloc(chunk_table_size * sizeof(size_t));
- ret = mp3_get_id3();
+ ret = mp3_get_id3(file);
if (ret < 0)
goto err_out;
- rewind(infile);
+ rewind(file);
mp3.vbr = 0;
mp3.freq = 0;
while (1) {
int freq, br, fl;
struct timeval tmp, cct; /* current chunk time */
if (len > 0) {
- ret = para_fseek(infile, len, SEEK_CUR);
+ ret = para_fseek(file, len, SEEK_CUR);
if (ret < 0)
goto err_out;
}
- len = find_valid_start();
+ len = find_valid_start(file);
if (len <= 0)
break;
freq = header_frequency(&mp3.header);
afi->chunk_table = para_realloc(afi->chunk_table,
chunk_table_size * sizeof(size_t));
}
- afi->chunk_table[num_chunks] = ftell(infile);
+ afi->chunk_table[num_chunks] = ftell(file);
if (num_chunks < 10 || !(num_chunks % 1000))
PARA_INFO_LOG("chunk #%d: %zd\n", num_chunks,
afi->chunk_table[num_chunks]);
num_chunks++;
if (num_chunks == 1) {
-// entry = ftell(infile);
-// PARA_INFO_LOG("entry: %zd\n", entry);
freq_avg = freq;
br_avg = br;
old_br = br;
ret = -E_MP3_INFO;
if (!num_chunks || !freq_avg || !br_avg)
goto err_out;
- ret= para_fseek(infile, 0, SEEK_END);
+ ret= para_fseek(file, 0, SEEK_END);
if (ret < 0)
goto err_out;
- afi->chunk_table[num_chunks] = ftell(infile);
+ afi->chunk_table[num_chunks] = ftell(file);
mp3.br_average = br_avg;
mp3.freq = freq_avg;
mp3.seconds = (tv2ms(&total_time) + 500) / 1000;
tv_divide(num_chunks, &total_time, &afi->chunk_tv);
- rewind(infile);
+ rewind(file);
PARA_DEBUG_LOG("%zu chunks, each %lums\n", num_chunks, tv2ms(&afi->chunk_tv));
tv_scale(3, &afi->chunk_tv, &afi->eof_tv);
PARA_DEBUG_LOG("eof timeout: %lu\n", tv2ms(&afi->eof_tv));
/*
* Read mp3 information from audio file
*/
-static int mp3_get_file_info(FILE *audio_file, struct audio_format_info *afi)
+static int mp3_get_file_info(FILE *file, struct audio_format_info *afi)
{
int ret;
- if (!audio_file)
- return -E_MP3_NO_FILE;
- infile = audio_file;
- ret = mp3_read_info(afi);
- if (ret < 0) {
- infile = NULL;
+ ret = mp3_read_info(file, afi);
+ if (ret < 0)
return ret;
- }
write_info_str(afi);
afi->chunks_total = num_chunks;
afi->seconds_total = mp3.seconds;
return 1;
}
-static void mp3_close_audio_file(void)
-{
- if (!infile)
- return;
- fclose(infile);
- infile = NULL;
-}
-
static const char* mp3_suffixes[] = {"mp3", NULL};
/**
void mp3_init(struct audio_format_handler *afh)
{
afh->get_file_info = mp3_get_file_info;
- afh->close_audio_file = mp3_close_audio_file;
afh->suffixes = mp3_suffixes;
}