X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=ogg_afh_common.c;h=12a152062f2bf49beebd6d3838e3514d1ec0ee3d;hp=46465de1208b3c8edbb09972550bf4277667c7db;hb=b223b30fd6ecea80100b1d4a6802cef0e9c29e49;hpb=e5de57de1b8bf1df96c152fc92f5a49f75d6d96c diff --git a/ogg_afh_common.c b/ogg_afh_common.c index 46465de1..12a15206 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,16 @@ 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); + + granule = ogg_page_granulepos(&op); + 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) @@ -154,7 +163,7 @@ int oac_get_file_info(char *map, size_t numbytes, struct afh_info *afhi, afhi->seconds_total = num_frames / afhi->frequency; /* use roughly one page per chunk */ frames_per_chunk = num_frames / i; - PARA_INFO_LOG("%" PRIu32 "seconds, %d frames/chunk\n", + PARA_INFO_LOG("%" PRIu32 " seconds, %d frames/chunk\n", afhi->seconds_total, frames_per_chunk); ct_size = 250; afhi->chunk_table = para_malloc(ct_size * sizeof(uint32_t)); @@ -163,7 +172,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++;