summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
3a624c0)
All audio format handlers just did fclose(), so do this from vss.c
and kill the handler. This also allows to get rid of the global
infile variable in all audio format handlers.
/** size of the input buffer, must be big enough to hold header */
#define AAC_INBUF_SIZE 65536
/** 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;
static int aac_find_stsz(unsigned char *buf, unsigned buflen, size_t *skip)
{
int i;
-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;
{
int ret, i;
size_t sum = 0;
ret = aac_find_stsz(inbuf, inbuf_len, &skip);
if (ret >= 0)
break;
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 (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);
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;
AAC_INBUF_SIZE - skip);
if (ret <= 0)
return -E_AAC_READ;
mp4AudioSpecificConfig mp4ASC;
NeAACDecHandle handle;
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 (ret <= 0) {
ret = -E_AAC_READ;
goto out;
if (NeAACDecAudioSpecificConfig(inbuf + skip, inbuf_len - skip,
&mp4ASC) < 0)
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);
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 = 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;
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,
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;
}
afh->suffixes = aac_suffixes;
}
* \sa struct audio_format_info
*/
int (*get_file_info)(FILE *audio_file, struct audio_format_info *afi);
* \sa struct audio_format_info
*/
int (*get_file_info)(FILE *audio_file, struct audio_format_info *afi);
- /**
- * cleanup function of this audio format handler
- *
- * This close function should deallocate any resources
- * associated with the current audio file. In particular, it is responsible
- * for closing the file handle. It is assumed to succeed.
- */
- void (*close_audio_file)(void);
static const int frame_size_index[] = {24000, 72000, 72000};
static const char *mode_text[] = {"stereo", "joint stereo", "dual channel", "mono", "invalid"};
static const int frame_size_index[] = {24000, 72000, 72000};
static const char *mode_text[] = {"stereo", "joint stereo", "dual channel", "mono", "invalid"};
static struct mp3info mp3;
static ssize_t num_chunks;
static struct mp3info mp3;
static ssize_t num_chunks;
-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) {
{
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;
; /* 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;
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 (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;
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) {
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));
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)
mp3.id3.album[0] = '\0';
mp3.id3.comment[0] = '\0';
mp3.id3.year[0] = '\0';
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 (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;
}
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 (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';
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';
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';
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';
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 -E_FREAD;
mp3.id3.comment[30] = '\0';
mp3.id3_isvalid = 1;
-static int find_valid_start(void)
+static int find_valid_start(FILE *file)
- 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) {
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 {
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;
}
if (ret < 0)
return ret;
}
-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;
{
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));
num_chunks = 0;
afi->chunk_table = para_malloc(chunk_table_size * sizeof(size_t));
+ ret = mp3_get_id3(file);
if (ret < 0)
goto err_out;
if (ret < 0)
goto err_out;
mp3.vbr = 0;
mp3.freq = 0;
while (1) {
int freq, br, fl;
struct timeval tmp, cct; /* current chunk time */
if (len > 0) {
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;
}
if (ret < 0)
goto err_out;
}
- len = find_valid_start();
+ len = find_valid_start(file);
if (len <= 0)
break;
freq = header_frequency(&mp3.header);
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 = 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) {
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;
freq_avg = freq;
br_avg = br;
old_br = br;
ret = -E_MP3_INFO;
if (!num_chunks || !freq_avg || !br_avg)
goto err_out;
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;
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);
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);
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));
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
*/
/*
* 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)
- 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)
write_info_str(afi);
afi->chunks_total = num_chunks;
afi->seconds_total = mp3.seconds;
write_info_str(afi);
afi->chunks_total = num_chunks;
afi->seconds_total = mp3.seconds;
-static void mp3_close_audio_file(void)
-{
- if (!infile)
- return;
- fclose(infile);
- infile = NULL;
-}
-
static const char* mp3_suffixes[] = {"mp3", NULL};
/**
static const char* mp3_suffixes[] = {"mp3", NULL};
/**
void mp3_init(struct audio_format_handler *afh)
{
afh->get_file_info = mp3_get_file_info;
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;
}
afh->suffixes = mp3_suffixes;
}
#define CHUNK_SIZE 32768
static double chunk_time = 0.25;
#define CHUNK_SIZE 32768
static double chunk_time = 0.25;
static size_t cb_read(void *buf, size_t size, size_t nmemb, void *datasource)
{
FILE *f = datasource;
static size_t cb_read(void *buf, size_t size, size_t nmemb, void *datasource)
{
FILE *f = datasource;
-static void ogg_close_audio_file(void)
-{
- fclose(audio_file);
-}
-
/*
* Init oggvorbis file and write some tech data to given pointers.
*/
/*
* Init oggvorbis file and write some tech data to given pointers.
*/
vi_sampling_rate / 1000, vi->channels, vi_bitrate / 1000
);
rewind(file);
vi_sampling_rate / 1000, vi->channels, vi_bitrate / 1000
);
rewind(file);
afi->chunk_tv.tv_sec = 0;
afi->chunk_tv.tv_usec = 250 * 1000;
tv_scale(3, &afi->chunk_tv, &afi->eof_tv);
afi->chunk_tv.tv_sec = 0;
afi->chunk_tv.tv_usec = 250 * 1000;
tv_scale(3, &afi->chunk_tv, &afi->eof_tv);
void ogg_init(struct audio_format_handler *afh)
{
afh->get_file_info = ogg_get_file_info,
void ogg_init(struct audio_format_handler *afh)
{
afh->get_file_info = ogg_get_file_info,
- afh->close_audio_file = ogg_close_audio_file;
afh->suffixes = ogg_suffixes;
}
afh->suffixes = ogg_suffixes;
}
}
gettimeofday(&now, NULL);
tv_add(&mmd->afi.eof_tv, &now, &eof_barrier);
}
gettimeofday(&now, NULL);
tv_add(&mmd->afi.eof_tv, &now, &eof_barrier);
- af->close_audio_file();
audio_file = NULL;
mmd->audio_format = -1;
af = NULL;
audio_file = NULL;
mmd->audio_format = -1;
af = NULL;