From a11e24cc03932264eeb3ea09007cc253e0aa9968 Mon Sep 17 00:00:00 2001
From: Nicolas Gaullier <nicolas.gaullier@arkena.com>
Date: Mon, 5 Feb 2018 18:14:27 +0100
Subject: [PATCH] avformat/utils : estimate_timings_from_pts - increase retrys
 if missing some a/v durations

---
 libavformat/utils.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index 28ea071409..b3e637d1f4 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2746,6 +2746,7 @@ static void estimate_timings_from_bit_rate(AVFormatContext *ic)
 
 #define DURATION_MAX_READ_SIZE 250000LL
 #define DURATION_MAX_RETRY 6
+#define MORE_DURATIONS_MAX_RETRY 4
 
 /* only usable for MPEG-PS streams */
 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
@@ -2757,6 +2758,7 @@ static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
     int is_end;
     int64_t filesize, offset, duration;
     int retry = 0;
+    int retry_get_more_durations = 0;
 
     /* flush packet queue */
     flush_packet_queue(ic);
@@ -2780,7 +2782,6 @@ static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
     /* XXX: may need to support wrapping */
     filesize = ic->pb ? avio_size(ic->pb) : 0;
     do {
-        is_end = found_duration;
         offset = filesize - (DURATION_MAX_READ_SIZE << retry);
         if (offset < 0)
             offset = 0;
@@ -2827,7 +2828,7 @@ static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
         }
 
         /* check if all audio/video streams have valid duration */
-        if (!is_end) {
+        if (found_duration) {
             is_end = 1;
             for (i = 0; i < ic->nb_streams; i++) {
                 st = ic->streams[i];
@@ -2840,6 +2841,7 @@ static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
             }
         }
     } while (!is_end &&
+            (!found_duration || ++retry_get_more_durations <= MORE_DURATIONS_MAX_RETRY) &&
              offset &&
              ++retry <= DURATION_MAX_RETRY);
 
-- 
2.14.1.windows.1

