Message ID | 20180515230624.87953-1-ffmpeg@tmm1.net |
---|---|
State | New |
Headers | show |
On Tue, May 15, 2018 at 04:06:24PM -0700, Aman Gupta wrote: > From: Aman Gupta <aman@tmm1.net> > > For seekable mpegts streams, duration is calculated from > pts by seeking to the end of the file for a pts and subtracting > the initial pts to compute a duration. > > This can be expensive in terms of added latency during > probe, especially when streaming over a network. This new > option lets you skip the duration calculation, which is useful > when you don't care about the value and want to save some overhead. > > This patch is particularly useful when dealing with live mpegts > streams. Normally such streams are not seekable, so durations > are not calculated. However in my case I am dealing with a seekable > live mpegts stream (networked access to a .ts file which is still > being appended to). > > Signed-off-by: Aman Gupta <aman@tmm1.net> > --- > libavformat/avformat.h | 7 +++++++ > libavformat/options_table.h | 1 + > libavformat/utils.c | 6 ++++++ > 3 files changed, 14 insertions(+) LGTM it may make sense to design a more generic system in the future where the user can specify what fields she needs (like duration) which fields she could use and which are completely useless. [...]
diff --git a/libavformat/avformat.h b/libavformat/avformat.h index a2fe7c6bb2..669ddb423e 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1926,6 +1926,13 @@ typedef struct AVFormatContext { * - decoding: set by user */ int max_streams; + + /** + * Skip duration calcuation in estimate_timings_from_pts. + * - encoding: unused + * - decoding: set by user + */ + int skip_estimate_duration_from_pts; } AVFormatContext; #if FF_API_FORMAT_GET_SET diff --git a/libavformat/options_table.h b/libavformat/options_table.h index 7c4d84798e..6ba6d6ad33 100644 --- a/libavformat/options_table.h +++ b/libavformat/options_table.h @@ -108,6 +108,7 @@ static const AVOption avformat_options[] = { {"protocol_whitelist", "List of protocols that are allowed to be used", OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, CHAR_MAX, D }, {"protocol_blacklist", "List of protocols that are not allowed to be used", OFFSET(protocol_blacklist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, CHAR_MAX, D }, {"max_streams", "maximum number of streams", OFFSET(max_streams), AV_OPT_TYPE_INT, { .i64 = 1000 }, 0, INT_MAX, D }, +{"skip_estimate_duration_from_pts", "skip duration calculation in estimate_timings_from_pts (for live streams)", OFFSET(skip_estimate_duration_from_pts), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, D}, {NULL}, }; diff --git a/libavformat/utils.c b/libavformat/utils.c index c25eab4d49..636fae3779 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2812,6 +2812,11 @@ static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset) } } + if (ic->skip_estimate_duration_from_pts) { + av_log(ic, AV_LOG_INFO, "Skipping duration calculation in estimate_timings_from_pts\n"); + goto skip_duration_calc; + } + av_opt_set(ic, "skip_changes", "1", AV_OPT_SEARCH_CHILDREN); /* estimate the end time (duration) */ /* XXX: may need to support wrapping */ @@ -2896,6 +2901,7 @@ 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);