[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