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

Sven Dueking sven at nablet.com
Fri Mar 9 12:01:51 EET 2018



> -----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 ? 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel



More information about the ffmpeg-devel mailing list