X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=aac_afh.c;h=c4301a2f178257b19d56b3cf297da3e1eaff337c;hb=9228213e72bbcdaf42665f51c633af6c4ccc78bf;hp=b45db477e0e80ddbe1f170446c92e2df99cdc9e1;hpb=6b27f3436334bc89cad31b6fff5399b0d17c3f38;p=paraslash.git diff --git a/aac_afh.c b/aac_afh.c index b45db477..c4301a2f 100644 --- a/aac_afh.c +++ b/aac_afh.c @@ -59,7 +59,7 @@ static off_t aac_afh_seek_cb(void *user_data, off_t offset, int whence) static int aac_afh_open(const void *map, size_t mapsize, void **afh_context) { int ret; - struct aac_afh_context *c = para_malloc(sizeof(*c)); + struct aac_afh_context *c = alloc(sizeof(*c)); c->map = map; c->mapsize = mapsize; @@ -68,7 +68,7 @@ static int aac_afh_open(const void *map, size_t mapsize, void **afh_context) c->cb.seek = aac_afh_seek_cb; c->cb.user_data = c; - ret = mp4_open_read(&c->cb, &c->mp4); + ret = mp4_open(&c->cb, &c->mp4); if (ret < 0) goto free_ctx; *afh_context = c; @@ -90,7 +90,7 @@ static int aac_afh_get_chunk(uint32_t chunk_num, void *afh_context, const char **buf, uint32_t *len) { struct aac_afh_context *c = afh_context; - int32_t ss; + uint32_t ss; size_t offset; int ret; @@ -98,10 +98,11 @@ static int aac_afh_get_chunk(uint32_t chunk_num, void *afh_context, if (ret < 0) return ret; offset = c->fpos; - ss = mp4_get_sample_size(c->mp4, chunk_num); - if (ss <= 0) - return -E_MP4_BAD_SAMPLE; - assert(ss + offset <= c->mapsize); + ret = mp4_get_sample_size(c->mp4, chunk_num, &ss); + if (ret < 0) + return ret; + if (ss + offset > c->mapsize) /* file got truncated?! */ + return -E_MP4_CORRUPT; *buf = c->map + offset; *len = ss; return 1; @@ -123,7 +124,6 @@ static int aac_get_file_info(char *map, size_t numbytes, __a_unused int fd, struct afh_info *afhi) { int ret; - int32_t rv; struct aac_afh_context *c; uint64_t milliseconds; const char *buf; @@ -133,38 +133,30 @@ static int aac_get_file_info(char *map, size_t numbytes, __a_unused int fd, if (ret < 0) return ret; - ret = -E_MP4_BAD_SAMPLERATE; - rv = mp4_get_sample_rate(c->mp4); - if (rv <= 0) - goto close; - afhi->frequency = rv; - - ret = -E_MP4_BAD_CHANNEL_COUNT; - rv = mp4_get_channel_count(c->mp4); - if (rv <= 0) - goto close; - afhi->channels = rv; - - ret = -E_MP4_BAD_SAMPLE_COUNT; - rv = mp4_num_samples(c->mp4); - if (rv <= 0) - goto close; - afhi->chunks_total = rv; + afhi->frequency = mp4_get_sample_rate(c->mp4); + assert(afhi->frequency > 0); + afhi->channels = mp4_get_channel_count(c->mp4); + assert(afhi->channels > 0); + afhi->chunks_total = mp4_num_samples(c->mp4); + assert(afhi->chunks_total > 0); + afhi->max_chunk_size = 0; for (n = 0; n < afhi->chunks_total; n++) { - if (aac_afh_get_chunk(n, c, &buf, &len) < 0) - break; + ret = aac_afh_get_chunk(n, c, &buf, &len); + if (ret < 0) + goto out; afhi->max_chunk_size = PARA_MAX(afhi->max_chunk_size, len); } milliseconds = mp4_get_duration(c->mp4); afhi->seconds_total = milliseconds / 1000; ms2tv(milliseconds / afhi->chunks_total, &afhi->chunk_tv); - if (aac_afh_get_chunk(0, c, &buf, &len) >= 0) - numbytes -= buf - map; + if (aac_afh_get_chunk(0, c, &buf, &len) < 0) + goto out; + numbytes -= buf - map; afhi->bitrate = 8 * numbytes / afhi->seconds_total / 1000; aac_afh_get_taginfo(c->mp4, &afhi->tags); ret = 1; -close: +out: aac_afh_close(c); return ret; } @@ -249,7 +241,7 @@ static int aac_afh_rewrite_tags(const char *map, size_t mapsize, replace_or_add_tag("album", tags->album, metadata); replace_or_add_tag("date", tags->year, metadata); replace_or_add_tag("comment", tags->comment, metadata); - ret = mp4_meta_update(mp4); + ret = mp4_update_meta(mp4); mp4_close(mp4); return ret; }