From 411ff3225febb9760fc8223584920b2cb9251302 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <michaelni@gmx.at>
Date: Sun, 31 Jan 2010 17:43:18 +0000
Subject: [PATCH] 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
---
 libavformat/utils.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index 260dc7641ce..8295f704ee6 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -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);
 
-- 
GitLab