Browse Source

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
tags/v0.6
Michael Niedermayer 15 years ago
parent
commit
411ff3225f
1 changed files with 9 additions and 2 deletions
  1. +9
    -2
      libavformat/utils.c

+ 9
- 2
libavformat/utils.c 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_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 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
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 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
/* 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 @@ static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset
}
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);



Loading…
Cancel
Save