[FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision Open SRT protocol
wm4
nfxjfg at googlemail.com
Fri Mar 9 09:20:38 EET 2018
On Wed, 21 Feb 2018 10:16:48 +0100
"Sven Dueking" <sven at nablet.com> wrote:
> protocol requires libsrt (https://github.com/Haivision/srt) to be installed
>
> Signed-off-by: Sven Dueking <sven.dueking at nablet.com>
> ---
> MAINTAINERS | 1 +
> configure | 5 +
> doc/protocols.texi | 134 ++++++++++-
> libavformat/Makefile | 1 +
> libavformat/opensrt.c | 589
> ++++++++++++++++++++++++++++++++++++++++++++++++
> libavformat/protocols.c | 1 +
> 6 files changed, 730 insertions(+), 1 deletion(-) create mode 100644
> libavformat/opensrt.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index b691bd5..3e0355a 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -499,6 +499,7 @@ Protocols:
> http.c Ronald S. Bultje
> libssh.c Lukasz Marek
> mms*.c Ronald S. Bultje
> + opensrt.c sven Dueking
> udp.c Luca Abeni
> icecast.c Marvin Scholz
>
> diff --git a/configure b/configure
> index 013308c..9a78bae 100755
> --- a/configure
> +++ b/configure
> @@ -294,6 +294,7 @@ External library support:
> --enable-opengl enable OpenGL rendering [no]
> --enable-openssl enable openssl, needed for https support
> if gnutls or libtls is not used [no]
> + --enable-opensrt enable Haivision Open SRT protocol [no]
> --disable-sndio disable sndio support [autodetect]
> --disable-schannel disable SChannel SSP, needed for TLS support on
> Windows if openssl and gnutls are not used
> [autodetect] @@ -1648,6 +1649,7 @@ EXTERNAL_LIBRARY_LIST="
> mediacodec
> openal
> opengl
> + opensrt
> "
>
> HWACCEL_AUTODETECT_LIBRARY_LIST="
> @@ -3157,6 +3159,8 @@ libssh_protocol_deps="libssh"
> libtls_conflict="openssl gnutls"
> mmsh_protocol_select="http_protocol"
> mmst_protocol_select="network"
> +opensrt_protocol_select="network"
> +opensrt_protocol_deps="opensrt"
> rtmp_protocol_conflict="librtmp_protocol"
> rtmp_protocol_select="tcp_protocol"
> rtmp_protocol_suggest="zlib"
> @@ -6028,6 +6032,7 @@ enabled omx && require_header OMX_Core.h
> enabled omx_rpi && { check_header OMX_Core.h ||
> { ! enabled cross_compile && add_cflags
> -isystem/opt/vc/include/IL && check_header OMX_Core.h ; } ||
> die "ERROR: OpenMAX IL headers not found"; }
> && enable omx
> +enabled opensrt && require_pkg_config libsrt "srt >= 1.2.0"
> srt/srt.h srt_socket
> enabled openssl && { check_pkg_config openssl openssl
> openssl/ssl.h OPENSSL_init_ssl ||
> check_pkg_config openssl openssl
> openssl/ssl.h SSL_library_init ||
> check_lib openssl openssl/ssl.h
> SSL_library_init -lssl -lcrypto || diff --git a/doc/protocols.texi
> b/doc/protocols.texi index c24dc74..1d49eaa 100644
> --- a/doc/protocols.texi
> +++ b/doc/protocols.texi
> @@ -752,12 +752,144 @@ Truncate existing files on write, if set to 1. A
> value of 0 prevents truncating. Default value is 1.
>
> @item workgroup
> -Set the workgroup used for making connections. By default workgroup is not
> specified.
> +Set the workgroup used for making connections. By default workgroup is
> +not specified.
>
> @end table
>
> For more information see: @url{http://www.samba.org/}.
>
> + at section srt
> +
> +Haivision Secure Reliable Transport Protocol via libsrt.
> +
> +The required syntax for a SRT url is:
> + at example
> +srt://@var{hostname}:@var{port}[?@var{options}]
> + at end example
> +
> + at var{options} contains a list of &-separated options of the form
> + at var{key}=@var{val}.
> +
> +This protocol accepts the following options.
> +
> + at table @option
> + at item connect_timeout
> +Connection timeout. SRT cannot connect for RTT > 1500 msec
> +(2 handshake exchanges) with the default connect timeout of
> +3 seconds. This option applies to the caller and rendezvous connection
> +modes. The connect timeout is 10 times the value set for the rendezvous
> +mode (which can be used as a workaround for this connection problem
> +with earlier versions).
> +
> + at item fc=@var{bytes}
> +Flight Flag Size (Window Size), in bytes. FC is actually an internal
> +parameter and you should set it to not less than
> + at option{recv_buffer_size} and @option{mss}. The default value is
> +relatively large, therefore unless you set a very large receiver
> +buffer, you do not need to change this option. Default value is 25600.
> +
> + at item inputbw=@var{bytes/seconds}
> +Sender nominal input rate, in bytes per seconds. Used along with
> + at option{oheadbw}, when @option{maxbw} is set to relative (0), to
> +calculate maximum sending rate when recovery packets are sent along
> +with main media stream:
> + at option{inputbw} * (100 + @option{oheadbw}) / 100 if @option{inputbw}
> +is not set while @option{maxbw} is set to relative (0), the actual
> +ctual input rate is evaluated inside the library. Default value is 0.
> +
> + at item iptos=@var{tos}
> +IP Type of Service. Applies to sender only. Default value is 0xB8.
> +
> + at item ipttl=@var{ttl}
> +IP Time To Live. Applies to sender only. Default value is 64.
> +
> + at item listen_timeout
> +Set socket listen timeout.
> +
> + at item maxbw=@var{bytes/seconds}
> +Maximum sending bandwidth, in bytes per seconds.
> +-1 infinite (CSRTCC limit is 30mbps)
> +0 relative to input rate (see @option{inputbw})
> +>0 absolute limit value
> +Default value is 0 (relative)
> +
> + at item mode=@var{caller|listener|rendezvous}
> +Connection mode.
> +caller opens client connection.
> +listener starts server to listen for incoming connections.
> +rendezvous use Rendez-Vous connection mode.
> +Default valus is caller.
> +
> + at item mss=@var{bytes}
> +Maximum Segment Size, in bytes. Used for buffer allocation and rate
> +calculation using packet counter assuming fully filled packets. The
> +smallest MSS between the peers is used. This is 1500 by default in the
> +overall internet.
> +This is the maximum size of the UDP packet and can be only decreased,
> +unless you have some unusual dedicated network settings. Default value
> +is 1500.
> +
> + at item nakreport=@var{1|0}
> +If set to 1, Receiver will send `UMSG_LOSSREPORT` messages periodically
> +until the lost packet is retransmitted or intentionally dropped.
> +Default value is 1.
> +
> + at item oheadbw=@var{percents}
> +Recovery bandwidth overhead above input rate, in percents.
> +See @option{inputbw}. Default value is 25%.
> +
> + at item passphrase=@var{string}
> +HaiCrypt Encryption/Decryption Passphrase string, length from 10 to 79
> +characters. The passphrase is the shared secret between the sender and
> +the receiver. It is used to generate the Key Encrypting Key using
> +PBKDF2 (Password-Based Key Deriviation Function). It is used only if
> + at option{pbkeylen} is non-zero. It is used on the receiver only if the
> +received data is encrypted.
> +The configured passphrase cannot be get back (write-only).
> +
> + at item pbkeylen=@var{bytes}
> +Sender encryption key length, in bytes.
> +Only can be set to 0, 16, 24 and 32.
> +Enable sender encryption if not 0.
> +Not required on receiver (set to 0),
> +key size obtained from sender in HaiCrypt handshake.
> +Default value is 0.
> +
> + at item recv_buffer_size=@var{bytes}
> +Set receive buffer size, expressed bytes.
> +
> + at item send_buffer_size=@var{bytes}
> +Set send buffer size, expressed bytes.
> +
> + at item timeout
> +Set raise error timeout.
> +
> +This option is only relevant in read mode:
> +if no data arrived in more than this time interval, raise error.
> +
> + at item tlpktdrop=@var{1|0}
> +Too-late Packet Drop. When enabled on receiver, it skips missing
> +packets that have not been delivered in time and deliver the following
> +packets to the application when their time-to-play has come. It also
> +send a fake ACK to sender. When enabled on sender and enabled on the
> +receiving peer, sender drops the older packets that have no chance to
> +be delivered in time. It was automatically enabled in sender if
> +receiver supports it.
> +
> + at item tsbpddelay
> +Timestamp-based Packet Delivery Delay.
> +Used to absorb burst of missed packet retransmission.
> +
> + at end table
> +
> +For more information see: @url{https://github.com/Haivision/srt}.
> +
> +
> @section libssh
>
> Secure File Transfer Protocol via libssh diff --git a/libavformat/Makefile
> b/libavformat/Makefile index 7ac1ba9..46ea43f 100644
> --- a/libavformat/Makefile
> +++ b/libavformat/Makefile
> @@ -606,6 +606,7 @@ TLS-OBJS-$(CONFIG_SCHANNEL) +=
> tls_schannel.o
> OBJS-$(CONFIG_TLS_PROTOCOL) += tls.o $(TLS-OBJS-yes)
> OBJS-$(CONFIG_UDP_PROTOCOL) += udp.o
> OBJS-$(CONFIG_UDPLITE_PROTOCOL) += udp.o
> +OBJS-$(CONFIG_OPENSRT_PROTOCOL) += opensrt.o
> OBJS-$(CONFIG_UNIX_PROTOCOL) += unix.o
>
> # libavdevice dependencies
> diff --git a/libavformat/opensrt.c b/libavformat/opensrt.c new file mode
> 100644 index 0000000..3836ef7
> --- /dev/null
> +++ b/libavformat/opensrt.c
> @@ -0,0 +1,589 @@
> +/*
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> +02110-1301 USA */
> +
> +/**
> + * @file
> + * Haivision Open SRT (Secure Reliable Transport) protocol */
> +
> +#include "avformat.h"
> +#include "libavutil/avassert.h"
> +#include "libavutil/parseutils.h"
> +#include "libavutil/opt.h"
> +#include "libavutil/time.h"
> +
> +#include "internal.h"
> +#include "network.h"
> +#include "os_support.h"
> +#include "url.h"
> +#if HAVE_POLL_H
> +#include <poll.h>
> +#endif
> +
> +#if CONFIG_OPENSRT_PROTOCOL
> +#include <srt/srt.h>
> +#endif
> +
> +enum SRTMode {
> + SRT_MODE_CALLER = 0,
> + SRT_MODE_LISTENER = 1,
> + SRT_MODE_RENDEZVOUS = 2
> +};
> +
> +typedef struct SRTContext {
> + int fd;
> + int eid;
> + int64_t rw_timeout;
> + int64_t listen_timeout;
> + int recv_buffer_size;
> + int send_buffer_size;
> +
> + int64_t maxbw;
> + int pbkeylen;
> + char * passphrase;
> + int mss;
> + int fc;
> + int ipttl;
> + int iptos;
> + int64_t inputbw;
> + int oheadbw;
> + int64_t tsbpddelay;
> + int tlpktdrop;
> + int nakreport;
> + int64_t connect_timeout;
> + enum SRTMode mode;
> +} SRTContext;
> +
> +#define D AV_OPT_FLAG_DECODING_PARAM
> +#define E AV_OPT_FLAG_ENCODING_PARAM
> +#define OFFSET(x) offsetof(SRTContext, x) static const AVOption
> +opensrt_options[] = {
> + { "timeout", "set timeout of socket I/O operations",
> OFFSET(rw_timeout), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX,
> .flags = D|E },
Timeout should be an int, using microseconds as unit, to be compatible
with what everything else uses (especially tcp/http). (I don't know what
AV_OPT_TYPE_DURATION actually does and whether it's compatible with
the tcp option, it's not documented anywhere.)
More information about the ffmpeg-devel
mailing list