Mercurial > libavformat.hg
changeset 5617:f50eb231b06a libavformat
Increase search range if no end timestamp could be found for the duration
calculation.
author | michael |
---|---|
date | Sun, 31 Jan 2010 17:43:18 +0000 |
parents | 9a624037cf06 |
children | 27fd77f20a89 |
files | utils.c |
diffstat | 1 files changed, 9 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/utils.c Sun Jan 31 16:21:49 2010 +0000 +++ b/utils.c Sun Jan 31 17:43:18 2010 +0000 @@ -1771,6 +1771,7 @@ } #define DURATION_MAX_READ_SIZE 250000 +#define DURATION_MAX_RETRY 3 /* only usable for MPEG-PS streams */ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset) @@ -1780,6 +1781,7 @@ int read_size, i, ret; int64_t end_time, start_time[MAX_STREAMS]; int64_t filesize, offset, duration; + int retry=0; ic->cur_st = NULL; @@ -1805,14 +1807,16 @@ /* estimate the end time (duration) */ /* XXX: may need to support wrapping */ filesize = ic->file_size; - offset = filesize - DURATION_MAX_READ_SIZE; + end_time = AV_NOPTS_VALUE; + do{ + offset = filesize - (DURATION_MAX_READ_SIZE<<retry); if (offset < 0) offset = 0; url_fseek(ic->pb, offset, SEEK_SET); read_size = 0; for(;;) { - if (read_size >= DURATION_MAX_READ_SIZE) + if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0))) break; do{ @@ -1836,6 +1840,9 @@ } av_free_packet(pkt); } + }while( end_time==AV_NOPTS_VALUE + && filesize > (DURATION_MAX_READ_SIZE<<retry) + && ++retry <= DURATION_MAX_RETRY); fill_all_stream_timings(ic);