diff mbox series

[FFmpeg-devel,v2,3/3] avformat/fifo: add option to delay output

Message ID 1588832241-63824-1-git-send-email-leozhang@qiyi.com
State New
Headers show
Series Patch set to delay output live stream
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

leozhang May 7, 2020, 6:17 a.m. UTC
Suggested-by: Nicolas George <george@nsup.org>
Reviewed-by:  Nicolas George <george@nsup.org>
Reviewed-by:  Marton Balint <cus@passwd.hu>
Reviewed-by:  Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Signed-off-by: leozhang <leozhang@qiyi.com>
---
 doc/muxers.texi    | 14 ++++++++++++++
 libavformat/fifo.c |  8 ++++++++
 2 files changed, 22 insertions(+)
diff mbox series

Patch

diff --git a/doc/muxers.texi b/doc/muxers.texi
index 14528f1..272cf24 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -2285,6 +2285,10 @@  It is the same as the speed option to realtime or arealtime filters.
 @item realtime_limit @var{duration}
 It is the same as the limit option to realtime or arealtime filters.
 
+@item output_delay @var{duration}
+Time to delay output. This will block every output packet for the extra specified duration. Default value is 0.
+This option is useful when user wouldn't want broadcast what's comming next immediately in live streaming applications.
+
 @end table
 
 @subsection Examples
@@ -2312,6 +2316,16 @@  ffmpeg -i your_input_file -c copy -map 0:v -map 0:a -f fifo -fifo_format flv -re
 
 @end itemize
 
+@itemize
+
+@item
+Add 20 seconds delay to rtmp stream.
+@example
+ffmpeg -i your_input_stream_address -c copy -map 0:a -map 0:v -f fifo -realtime 1 -queue_size 6000000 -output_delay 20 -fifo_format flv rtmp://example.com/live/delayed_stream_name
+@end example
+
+@end itemize
+
 @anchor{tee}
 @section tee
 
diff --git a/libavformat/fifo.c b/libavformat/fifo.c
index b819aeb..ba463e4 100644
--- a/libavformat/fifo.c
+++ b/libavformat/fifo.c
@@ -89,6 +89,9 @@  typedef struct FifoContext {
 
     int64_t delta;
     unsigned inited;
+
+    /* Time to delay output */
+    int64_t output_delay;
 } FifoContext;
 
 typedef struct FifoThreadContext {
@@ -439,6 +442,8 @@  static void *fifo_consumer_thread(void *data)
     memset(&fifo_thread_ctx, 0, sizeof(FifoThreadContext));
     fifo_thread_ctx.avf = avf;
 
+    fifo_sleep(fifo->output_delay);
+
     while (1) {
         uint8_t just_flushed = 0;
 
@@ -681,6 +686,9 @@  static const AVOption options[] = {
         {"realtime_limit", "Time limit for the pauses when realtime", OFFSET(realtime_limit),
          AV_OPT_TYPE_DURATION, {.i64 = 2000000}, 0, INT64_MAX, AV_OPT_FLAG_ENCODING_PARAM},
 
+        {"output_delay", "Time to delay output", OFFSET(output_delay),
+         AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, INT64_MAX, AV_OPT_FLAG_ENCODING_PARAM},
+
         {NULL},
 };