[FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision Open SRT protocol

wm4 nfxjfg at googlemail.com
Fri Mar 9 22:47:28 EET 2018


On Fri, 9 Mar 2018 11:01:51 +0100
"Sven Dueking" <sven at nablet.com> wrote:

> > -----Ursprüngliche Nachricht-----
> > Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] Im Auftrag
> > von wm4
> > Gesendet: Freitag, 9. März 2018 08:21
> > An: ffmpeg-devel at ffmpeg.org
> > Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > Open SRT protocol
> > 
> > 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.)  
> 
> Michael mentioned this : 
> newly added time based options should be in seconds the user can achive micro or milli seconds by using suffixes also see AV_OPT_TYPE_DURATION, it may fit here
> 
> So, what shell we use ? 

That completely sabotages my past efforts. Talk about having no
basic courtesy. Jesus christ. If Michael insists on this, don't name
the option "timeout", because its semantics will clash with all the
other options named "timeout" that mean timeout in microseconds.


More information about the ffmpeg-devel mailing list