Increase search range if no end timestamp could be found for the duration

calculation.

Originally committed as revision 21577 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2010-01-31 17:43:18 +00:00
parent 351aff72a4
commit 411ff3225f
1 changed files with 9 additions and 2 deletions

View File

@ -1771,6 +1771,7 @@ static void av_estimate_timings_from_bit_rate(AVFormatContext *ic)
} }
#define DURATION_MAX_READ_SIZE 250000 #define DURATION_MAX_READ_SIZE 250000
#define DURATION_MAX_RETRY 3
/* only usable for MPEG-PS streams */ /* only usable for MPEG-PS streams */
static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset) static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
@ -1780,6 +1781,7 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
int read_size, i, ret; int read_size, i, ret;
int64_t end_time, start_time[MAX_STREAMS]; int64_t end_time, start_time[MAX_STREAMS];
int64_t filesize, offset, duration; int64_t filesize, offset, duration;
int retry=0;
ic->cur_st = NULL; ic->cur_st = NULL;
@ -1805,14 +1807,16 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
/* estimate the end time (duration) */ /* estimate the end time (duration) */
/* XXX: may need to support wrapping */ /* XXX: may need to support wrapping */
filesize = ic->file_size; 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) if (offset < 0)
offset = 0; offset = 0;
url_fseek(ic->pb, offset, SEEK_SET); url_fseek(ic->pb, offset, SEEK_SET);
read_size = 0; read_size = 0;
for(;;) { for(;;) {
if (read_size >= DURATION_MAX_READ_SIZE) if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
break; break;
do{ do{
@ -1836,6 +1840,9 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
} }
av_free_packet(pkt); 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); fill_all_stream_timings(ic);