[FFmpeg-devel] avformat: add skip_estimate_duration_from_pts

Submitted by Aman Gupta on May 15, 2018, 11:06 p.m.

Details

Message ID 20180515230624.87953-1-ffmpeg@tmm1.net
State New
Headers show

Commit Message

Aman Gupta May 15, 2018, 11:06 p.m.
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(+)

Comments

Michael Niedermayer May 16, 2018, 8:13 p.m.
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.

[...]

Patch hide | download patch | download mbox

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);