Re: [FFmpeg-devel] [PATCH v7 01/11] avformat: Add fifo pseudo-muxer

2016-08-14 Thread Jan Sebechlebsky

On 08/14/2016 08:12 PM, Marton Balint wrote:




[...]


+@item max_recovery_attempts
+Sets maximum number of successive unsucessful recovery attempts 
after which
+the output fails permanently. Unlimited if set to zero. Default 
value is 16.


Maybe it's just me, but I'd set this to unlimited by default, since 
attempt_recovery is not enabled by default anyway.



That seems reasonable, I'll change that.

[...]


[...]


[...]

Otherwise it looks good to me, I don't think there is a reason to 
delay this any longer, so if you rebase the patch against the current 
git HEAD and fix my few comments, I will apply this in a day or two.


Thanks,
Marton
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

I'll fix the issues you mentioned and resend the patch.

Thank you!

Regards,
Jan
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH v7 01/11] avformat: Add fifo pseudo-muxer

2016-08-14 Thread Jan Sebechlebsky

On 08/14/2016 08:19 PM, Timothy Gu wrote:


On Sun, Aug 14, 2016 at 11:12 AM Marton Balint  wrote:


On Thu, 11 Aug 2016, sebechlebsky...@gmail.com wrote:

+@anchor tee

I still get error when building the docs:

doc/muxers.texi:1531: @anchor expected braces
doc/muxers.texi:1443: @ref reference to nonexistent node `tee'
make: *** [doc/ffmpeg-all.html] Error 1

@anchor{tee} should work.
Timothy
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Thank you!

Jan
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH v7 01/11] avformat: Add fifo pseudo-muxer

2016-08-14 Thread Timothy Gu
On Sun, Aug 14, 2016 at 11:12 AM Marton Balint  wrote:

> On Thu, 11 Aug 2016, sebechlebsky...@gmail.com wrote:
> > +@anchor tee
>
> I still get error when building the docs:
>
> doc/muxers.texi:1531: @anchor expected braces
> doc/muxers.texi:1443: @ref reference to nonexistent node `tee'
> make: *** [doc/ffmpeg-all.html] Error 1

@anchor{tee} should work.
Timothy
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH v7 01/11] avformat: Add fifo pseudo-muxer

2016-08-14 Thread Marton Balint


On Thu, 11 Aug 2016, sebechlebsky...@gmail.com wrote:


From: Jan Sebechlebsky 

Signed-off-by: Jan Sebechlebsky 
---
Changes since the last version of the patch:
- Fixed thread include (old patch included pthread.h directly)


[...]


--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -1436,6 +1436,99 @@ Specify whether to remove all fragments when finished. 
Default 0 (do not remove)

@end table

+@section fifo
+
+The fifo pseudo-muxer allows the separation of encoding and muxing by using
+first-in-first-out queue and running the actual muxer in a separate thread. 
This
+is especially useful in combination with the @ref{tee} muxer and output to
+several destinations with different reliability/writing speed/latency.


... in combination with the tee muxer and can be used to send data to 
several ...


[...]


+@item max_recovery_attempts
+Sets maximum number of successive unsucessful recovery attempts after which
+the output fails permanently. Unlimited if set to zero. Default value is 16.


Maybe it's just me, but I'd set this to unlimited by default, since 
attempt_recovery is not enabled by default anyway.


[...]


+@anchor tee


I still get error when building the docs:

doc/muxers.texi:1531: @anchor expected braces
doc/muxers.texi:1443: @ref reference to nonexistent node `tee'
make: *** [doc/ffmpeg-all.html] Error 1

[...]


+static void free_message(void *msg)
+{
+FifoMessage *fifo_msg = msg;
+
+if (!fifo_msg)
+return;


This check might not be needed anymore.

[...]


+if (fifo->max_recovery_attempts) {
+av_log(avf, AV_LOG_INFO, "Recovery attempt #%d/%d\n",
+   ctx->recovery_nr, fifo->max_recovery_attempts);
+} else {
+av_log(avf, AV_LOG_INFO, "Recovery attempt #%d\n",
+   ctx->recovery_nr);
+}


AV_LOG_VERBOSE might be enough for these two messages.

[...]

Otherwise it looks good to me, I don't think there is a reason to delay 
this any longer, so if you rebase the patch against the current git HEAD 
and fix my few comments, I will apply this in a day or two.


Thanks,
Marton
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH v7 01/11] avformat: Add fifo pseudo-muxer

2016-08-11 Thread sebechlebskyjan
From: Jan Sebechlebsky 

Signed-off-by: Jan Sebechlebsky 
---
 Changes since the last version of the patch:
 - Fixed thread include (old patch included pthread.h directly)

 Changelog|   1 +
 configure|   1 +
 doc/muxers.texi  |  93 +++
 libavformat/Makefile |   1 +
 libavformat/allformats.c |   1 +
 libavformat/fifo.c   | 665 +++
 libavformat/version.h|   2 +-
 7 files changed, 763 insertions(+), 1 deletion(-)
 create mode 100644 libavformat/fifo.c

diff --git a/Changelog b/Changelog
index d9b6ecb..db6e415 100644
--- a/Changelog
+++ b/Changelog
@@ -14,6 +14,7 @@ version :
 - MediaCodec hwaccel
 - True Audio (TTA) muxer
 - crystalizer audio filter
+- fifo muxer
 
 
 version 3.1:
diff --git a/configure b/configure
index 8e30c68..7599dc1 100755
--- a/configure
+++ b/configure
@@ -2834,6 +2834,7 @@ dv_muxer_select="dvprofile"
 dxa_demuxer_select="riffdec"
 eac3_demuxer_select="ac3_parser"
 f4v_muxer_select="mov_muxer"
+fifo_muxer_deps="pthreads"
 flac_demuxer_select="flac_parser"
 hds_muxer_select="flv_muxer"
 hls_muxer_select="mpegts_muxer"
diff --git a/doc/muxers.texi b/doc/muxers.texi
index 5873269..e2f06d3 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -1436,6 +1436,99 @@ Specify whether to remove all fragments when finished. 
Default 0 (do not remove)
 
 @end table
 
+@section fifo
+
+The fifo pseudo-muxer allows the separation of encoding and muxing by using
+first-in-first-out queue and running the actual muxer in a separate thread. 
This
+is especially useful in combination with the @ref{tee} muxer and output to
+several destinations with different reliability/writing speed/latency.
+
+The behavior of the fifo muxer if the queue fills up or if the output fails is
+selectable,
+
+@itemize @bullet
+
+@item
+output can be transparently restarted with configurable delay between retries
+based on real time or time of the processed stream.
+
+@item
+encoding can be blocked during temporary failure, or continue transparently
+dropping packets in case fifo queue fills up.
+
+@end itemize
+
+@table @option
+
+@item fifo_format
+Specify the format name. Useful if it cannot be guessed from the
+output name suffix.
+
+@item queue_size
+Specify size of the queue (number of packets). Default value is 60.
+
+@item format_opts
+Specify format options for the underlying muxer. Muxer options can be specified
+as a list of @var{key}=@var{value} pairs separated by ':'.
+
+@item drop_pkts_on_overflow @var{bool}
+If set to 1 (true), in case the fifo queue fills up, packets will be dropped
+rather than blocking the encoder. This allows to continue streaming without
+delaying the input, at the cost of ommiting part of the stream. By default
+this option is set to 0 (false), so in such cases the encoder will be blocked
+until the muxer processes some of the packets and none of them is lost.
+
+@item attempt_recovery @var{bool}
+If failure occurs, attempt to recover the output. This is especially useful
+when used with network output, allows to restart streaming transparently.
+By default this option set to 0 (false).
+
+@item max_recovery_attempts
+Sets maximum number of successive unsucessful recovery attempts after which
+the output fails permanently. Unlimited if set to zero. Default value is 16.
+
+@item recovery_wait_time @var{duration}
+Waiting time before the next recovery attempt after previous unsuccessfull
+recovery attempt. Default value is 5 seconds.
+
+s@item recovery_wait_streamtime @var{bool}
+If set to 0 (false), the real time is used when waiting for the recovery
+attempt (i.e. the recovery will be attempted after at least
+recovery_wait_time seconds).
+If set to 1 (true), the time of the processed stream is taken into account
+instead (i.e. the recovery will be attempted after at least 
@var{recovery_wait_time}
+seconds of the stream is omitted).
+By default, this option is set to 0 (false).
+
+@item recover_any_error @var{bool}
+If set to 1 (true), recovery will be attempted regardless of type of the error
+causing the failure. By default this option is set to 0 (false) and in case of
+certain (usually permanent) errors the recovery is not attempted even when
+@var{attempt_recovery} is set to 1.
+
+@item restart_with_keyframe @var{bool}
+Specify whether to wait for the keyframe after recovering from
+queue overflow or failure. This option is set to 0 (false) by default.
+
+@end table
+
+@subsection Examples
+
+@itemize
+
+@item
+Stream something to rtmp server, continue processing the stream at real-time
+rate even in case of temporary failure (network outage) and attempt to recover
+streaming every second indefinitely.
+@example
+ffmpeg -re -i ... -c:v libx264 -c:a mp2 -f fifo -fifo_format flv -map 0:v -map 
0:a
+  -block_on_overflow 0 -attempt_recovery 1 -recovery_wait_time 1
+  -max_recovery_attempts 0 rtmp://example.com/live/stream_name
+@end