X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=ogg_afh_common.c;h=3e36bdd5b1e9d3615695f975541bf69c0cc05093;hp=62cde3d465ab7c86a23d6c539b8a2b447d465f78;hb=62c0894fbb589dd45e69b7d9ef1fd152a9960d62;hpb=ee7fe52a4740edca5130ebb9c860bed987259acc diff --git a/ogg_afh_common.c b/ogg_afh_common.c index 62cde3d4..3e36bdd5 100644 --- a/ogg_afh_common.c +++ b/ogg_afh_common.c @@ -124,8 +124,9 @@ int oac_get_file_info(char *map, size_t numbytes, struct afh_info *afhi, ogg_sync_state oss; ogg_page op; char *buf; - int ret, i, j, frames_per_chunk, ct_size; - long long unsigned num_frames = 0; + int ret, i, j, frames_per_chunk, ct_size, prev_pageno = 0; + long long unsigned granule_skip = 0, num_frames = 0; + int64_t granule = 0, prev_granule = 0; ogg_sync_init(&oss); ret = -E_OGG_SYNC; @@ -145,8 +146,17 @@ int oac_get_file_info(char *map, size_t numbytes, struct afh_info *afhi, oss.returned = 0; oss.fill = numbytes; /* count ogg pages and get duration of the file */ - for (i = 0; ogg_sync_pageseek(&oss, &op) > 0; i++) - num_frames = ogg_page_granulepos(&op); + for (i = 0; ogg_sync_pageseek(&oss, &op) > 0; i++) { + int this_pageno = ogg_page_pageno(&op); + int64_t this_granule = ogg_page_granulepos(&op); + if (this_granule >= 0) + granule = this_granule; + if (i > 0 && this_pageno != prev_pageno + 1) /* hole */ + granule_skip += granule - prev_granule; + prev_pageno = this_pageno; + prev_granule = granule; + } + num_frames = granule - granule_skip; PARA_INFO_LOG("%d pages, %llu frames\n", i, num_frames); ret = -E_OGG_EMPTY; if (i == 0) @@ -163,7 +173,7 @@ int oac_get_file_info(char *map, size_t numbytes, struct afh_info *afhi, oss.returned = afhi->header_len; oss.fill = numbytes; for (j = 1; ogg_sync_pageseek(&oss, &op) > 0; /* nothing */) { - int granule = ogg_page_granulepos(&op); + granule = ogg_page_granulepos(&op); while (granule >= (j + 1) * frames_per_chunk) { j++;