X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aac_afh.c;h=0a352c886164e858001fec0397da3aba7cab7cfb;hp=8b635c489720fbeb0d247ac566af4e27b995a35f;hb=a7a37b282c4e936b2fb34c2bd7423f9f800dfd44;hpb=5430c77f1fdf97d92796f44623d257b8124bde24 diff --git a/aac_afh.c b/aac_afh.c index 8b635c48..0a352c88 100644 --- a/aac_afh.c +++ b/aac_afh.c @@ -27,7 +27,7 @@ #include "string.h" #include "aac.h" -static int aac_find_stsz(unsigned char *buf, off_t buflen, off_t *skip) +static int aac_find_stsz(unsigned char *buf, size_t buflen, off_t *skip) { int i; @@ -52,7 +52,7 @@ static int aac_find_stsz(unsigned char *buf, off_t buflen, off_t *skip) } static ssize_t aac_compute_chunk_table(struct audio_format_info *afi, - unsigned char *map, off_t numbytes) + unsigned char *map, size_t numbytes) { int ret, i; size_t sum = 0; @@ -76,25 +76,32 @@ static ssize_t aac_compute_chunk_table(struct audio_format_info *afi, return skip; } -static long unsigned aac_set_chunk_tv(struct audio_format_info *afi, - mp4AudioSpecificConfig *mp4ASC) +static int aac_set_chunk_tv(struct audio_format_info *afi, + mp4AudioSpecificConfig *mp4ASC, long unsigned *seconds) { - float tmp = mp4ASC->sbr_present_flag == 1? 2047 : 1023, - ms = 1000.0 * afi->chunks_total * tmp / mp4ASC->samplingFrequency; + float tmp = mp4ASC->sbr_present_flag == 1? 2047 : 1023; struct timeval total; + long unsigned ms = 1000.0 * afi->chunks_total * tmp + / mp4ASC->samplingFrequency; + if (!mp4ASC->samplingFrequency) + return -E_MP4ASC; + ms = 1000.0 * afi->chunks_total * tmp / mp4ASC->samplingFrequency; ms2tv(ms, &total); tv_divide(afi->chunks_total, &total, &afi->chunk_tv); - PARA_INFO_LOG("%luHz, %fs (%lu x %lums)\n", + PARA_INFO_LOG("%luHz, %lus (%lu x %lums)\n", mp4ASC->samplingFrequency, ms / 1000, afi->chunks_total, tv2ms(&afi->chunk_tv)); - return ms < 1000? -E_MP4ASC : ms / 1000; + if (ms < 1000) + return -E_MP4ASC; + *seconds = ms / 1000; + return 1; } /* * Init m4a file and write some tech data to given pointers. */ -static int aac_get_file_info(char *map, off_t numbytes, +static int aac_get_file_info(char *map, size_t numbytes, struct audio_format_info *afi) { int i; @@ -106,12 +113,11 @@ static int aac_get_file_info(char *map, off_t numbytes, NeAACDecHandle handle; unsigned char *umap = (unsigned char *) map; - ret = aac_find_esds(umap, numbytes, &skip); + ret = aac_find_esds(umap, numbytes, &skip, &decoder_len); if (ret < 0) goto out; - decoder_len = ret; handle = aac_open(); - ret = -E_AACDEC_INIT; + ret = -E_AAC_AFH_INIT; if (NeAACDecInit(handle, umap + skip, decoder_len, &rate, &channels)) goto out; if (!channels) @@ -126,7 +132,9 @@ static int aac_get_file_info(char *map, off_t numbytes, if (ret < 0) goto out; skip = ret; - afi->seconds_total = aac_set_chunk_tv(afi, &mp4ASC); + ret = aac_set_chunk_tv(afi, &mp4ASC, &afi->seconds_total); + if (ret < 0) + goto out; ret = aac_find_entry_point(umap + skip, numbytes - skip, &skip); if (ret < 0) goto out;