From: Aman Gupta <a...@tmm1.net>

Previously, the initial seek position was recorded into
old_offset at the beginning of avformat_find_stream_info(),
and passed into estimate_timings(). In the case of mpegts
with a known filesize, it was further passed into
estimate_timings_from_pts() which called avio_seek(SEEK_SET)
after doing its timing related seeks. (Interestingly, this
seeked all the way back to the initial position before
the probe, rather than only back before the timing
related seeks to the end of the file).

With this commit, we pull the avio_seek() out of the mpegts
specific code-path and unconditionally seek all streams back
to their original position after probing is complete.

This effectively prevents data that is consumed during
avformat_find_stream_info() from being discarded, so packets
contained at the beginning of a file are still passed back
to the user for playback.

Signed-off-by: Aman Gupta <a...@tmm1.net>
---
 libavformat/utils.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index 9b3f0d28e6..94d166869a 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2786,7 +2786,7 @@ static void 
estimate_timings_from_bit_rate(AVFormatContext *ic)
 #define DURATION_MAX_RETRY 6
 
 /* only usable for MPEG-PS streams */
-static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
+static void estimate_timings_from_pts(AVFormatContext *ic)
 {
     AVPacket pkt1, *pkt = &pkt1;
     AVStream *st;
@@ -2905,7 +2905,6 @@ static void estimate_timings_from_pts(AVFormatContext 
*ic, int64_t old_offset)
 skip_duration_calc:
     fill_all_stream_timings(ic);
 
-    avio_seek(ic->pb, old_offset, SEEK_SET);
     for (i = 0; i < ic->nb_streams; i++) {
         int j;
 
@@ -2918,7 +2917,7 @@ skip_duration_calc:
     }
 }
 
-static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
+static void estimate_timings(AVFormatContext *ic)
 {
     int64_t file_size;
 
@@ -2934,7 +2933,7 @@ static void estimate_timings(AVFormatContext *ic, int64_t 
old_offset)
          !strcmp(ic->iformat->name, "mpegts")) &&
         file_size && (ic->pb->seekable & AVIO_SEEKABLE_NORMAL)) {
         /* get accurate estimate from the PTSes */
-        estimate_timings_from_pts(ic, old_offset);
+        estimate_timings_from_pts(ic);
         ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
     } else if (has_duration(ic)) {
         /* at least one component has timings - we use them for all
@@ -4053,7 +4052,9 @@ FF_ENABLE_DEPRECATION_WARNINGS
     }
 
     if (probesize)
-        estimate_timings(ic, old_offset);
+        estimate_timings(ic);
+    if ((ic->pb->seekable & AVIO_SEEKABLE_NORMAL))
+        avio_seek(ic->pb, old_offset, SEEK_SET);
 
     av_opt_set(ic, "skip_clear", "0", AV_OPT_SEARCH_CHILDREN);
 
-- 
2.20.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to