c->cb.seek = aac_afh_seek_cb;
c->cb.user_data = c;
- ret = -E_MP4_OPEN;
- c->mp4 = mp4_open_read(&c->cb);
- if (!c->mp4)
+ ret = mp4_open_read(&c->cb, &c->mp4);
+ if (ret < 0)
goto free_ctx;
*afh_context = c;
return 0;
return ret;
lseek(fd, 0, SEEK_SET);
- mp4 = mp4_open_meta(&cb);
- if (!mp4)
- return -E_MP4_OPEN;
+ ret = mp4_open_meta(&cb, &mp4);
+ if (ret < 0)
+ return ret;
metadata = mp4_get_meta(mp4);
PARA_NOTICE_LOG("%u metadata item(s) found\n", metadata->count);
replace_or_add_tag("artist", tags->artist, metadata);
return 1;
}
-static int parse_root_atoms(struct mp4 *f, bool meta_only)
+static int open_file(const struct mp4_callback *cb, bool meta_only, struct mp4 **result)
{
int ret;
uint64_t size;
- uint8_t atom_type = 0;
- uint8_t header_size = 0;
-
- f->file_size = 0;
+ uint8_t atom_type, header_size;
+ struct mp4 *f = para_calloc(sizeof(*f));
+ f->cb = cb;
while ((ret = atom_read_header(f, &atom_type, &header_size, &size)) > 0) {
f->file_size += size;
f->last_atom = atom_type;
if (ret <= 0)
break;
}
- if (ret < 0)
- return ret;
+ if (ret < 0) {
+ ret = -E_MP4_OPEN;
+ goto fail;
+ }
+ ret = -E_MP4_TRACK;
if (!f->audio_track)
- return -E_MP4_TRACK;
+ goto fail;
+ *result = f;
+ return 1;
+fail:
+ *result = NULL;
+ free(f);
return ret;
}
-struct mp4 *mp4_open_read(const struct mp4_callback *cb)
+int mp4_open_read(const struct mp4_callback *cb, struct mp4 **result)
{
- int ret;
- struct mp4 *f = para_calloc(sizeof(struct mp4));
-
- f->cb = cb;
- ret = parse_root_atoms(f, false);
- if (ret < 0) {
- free(f);
- return NULL;
- }
- return f;
+ return open_file(cb, false, result);
}
void mp4_close(struct mp4 *f)
return total;
}
-struct mp4 *mp4_open_meta(const struct mp4_callback *cb)
+int mp4_open_meta(const struct mp4_callback *cb, struct mp4 **result)
{
- int ret;
- struct mp4 *f = para_calloc(sizeof(struct mp4));
-
- f->cb = cb;
- ret = parse_root_atoms(f, true);
- if (ret < 0) {
- free(f);
- return NULL;
- }
- return f;
+ return open_file(cb, true, result);
}
/**
struct mp4; /* opaque */
int mp4_set_sample_position(struct mp4 *f, int32_t sample);
-struct mp4 *mp4_open_read(const struct mp4_callback *cb);
+int mp4_open_read(const struct mp4_callback *cb, struct mp4 **result);
void mp4_close(struct mp4 *f);
int32_t mp4_get_sample_size(const struct mp4 *f, int sample);
uint32_t mp4_get_sample_rate(const struct mp4 *f);
uint32_t mp4_get_channel_count(const struct mp4 * f);
int32_t mp4_num_samples(const struct mp4 *f);
uint64_t mp4_get_duration(const struct mp4 *f);
-struct mp4 *mp4_open_meta(const struct mp4_callback *cb);
-
+int mp4_open_meta(const struct mp4_callback *cb, struct mp4 **result);
struct mp4_metadata *mp4_get_meta(struct mp4 *f);
int32_t mp4_meta_update(struct mp4 *f);
char *mp4_meta_get_artist(const struct mp4 *f);