aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/demux.c
diff options
context:
space:
mode:
authorNicolas Gaullier <nicolas.gaullier@cji.paris>2024-03-29 10:26:19 +0100
committerStefano Sabatini <stefasab@gmail.com>2024-04-02 19:53:40 +0200
commited9363052f4b8b89ed2f1415f392d39788dab0d3 (patch)
tree710b11cf226965b1594f0ce92a00e45a62df794c /libavformat/demux.c
parent13cdef9d450e5a164740a57a92f723b1bd4b41c6 (diff)
downloadffmpeg-ed9363052f4b8b89ed2f1415f392d39788dab0d3.tar.gz
avformat/demux: add duration_probesize AVOption
Yet another probesize used to get the durations when estimate_timings_from_pts is required. It is aimed at users interested in better durations probing for itself, or because using avformat_find_stream_info indirectly and requiring exact values: for concatdec for example, especially if streamcopying above it. The current code is a performance trade-off that can fail to get video stream durations in a scenario with high bitrates and buffering for files ending cleanly (as opposed to live captures): the physical gap between the last video packet and the last audio packet is very high in such a case. Default behaviour is unchanged: 250k up to 250k << 6 (step by step). Setting this new option has two effects: - override the maximum probesize (currently 250k << 6) - reduce the number of steps to 1 instead of 6, this is to avoid detecting the audio "too early" and failing to reach a video packet. Even if a single audio stream duration is found but not the other audio/video stream durations, there will be a retry, so at the end the full user-overriden probesize will be used as expected by the user. Signed-off-by: Nicolas Gaullier <nicolas.gaullier@cji.paris>
Diffstat (limited to 'libavformat/demux.c')
-rw-r--r--libavformat/demux.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/libavformat/demux.c b/libavformat/demux.c
index 3ead690df0..abfd5fee7d 100644
--- a/libavformat/demux.c
+++ b/libavformat/demux.c
@@ -1804,8 +1804,9 @@ static void estimate_timings_from_bit_rate(AVFormatContext *ic)
"Estimating duration from bitrate, this may be inaccurate\n");
}
-#define DURATION_MAX_READ_SIZE 250000LL
-#define DURATION_MAX_RETRY 6
+#define DURATION_DEFAULT_MAX_READ_SIZE 250000LL
+#define DURATION_DEFAULT_MAX_RETRY 6
+#define DURATION_MAX_RETRY 1
/* only usable for MPEG-PS streams */
static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
@@ -1813,6 +1814,8 @@ static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
FFFormatContext *const si = ffformatcontext(ic);
AVPacket *const pkt = si->pkt;
int num, den, read_size, ret;
+ int64_t duration_max_read_size = ic->duration_probesize ? ic->duration_probesize >> DURATION_MAX_RETRY : DURATION_DEFAULT_MAX_READ_SIZE;
+ int duration_max_retry = ic->duration_probesize ? DURATION_MAX_RETRY : DURATION_DEFAULT_MAX_RETRY;
int found_duration = 0;
int is_end;
int64_t filesize, offset, duration;
@@ -1848,7 +1851,7 @@ static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
filesize = ic->pb ? avio_size(ic->pb) : 0;
do {
is_end = found_duration;
- offset = filesize - (DURATION_MAX_READ_SIZE << retry);
+ offset = filesize - (duration_max_read_size << retry);
if (offset < 0)
offset = 0;
@@ -1857,7 +1860,7 @@ static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
for (;;) {
AVStream *st;
FFStream *sti;
- if (read_size >= DURATION_MAX_READ_SIZE << (FFMAX(retry - 1, 0)))
+ if (read_size >= duration_max_read_size << (FFMAX(retry - 1, 0)))
break;
do {
@@ -1911,7 +1914,7 @@ static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
}
} while (!is_end &&
offset &&
- ++retry <= DURATION_MAX_RETRY);
+ ++retry <= duration_max_retry);
av_opt_set_int(ic, "skip_changes", 0, AV_OPT_SEARCH_CHILDREN);