> -----Ursprüngliche Nachricht----- > Von: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] Im Auftrag > von wm4 > Gesendet: Freitag, 9. März 2018 08:21 > An: ffmpeg-devel@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" <s...@nablet.com> wrote: > > > protocol requires libsrt (https://github.com/Haivision/srt) to be > > installed > > > > Signed-off-by: Sven Dueking <sven.duek...@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/}. > > > > +@section srt > > + > > +Haivision Secure Reliable Transport Protocol via libsrt. > > + > > +The required syntax for a SRT url is: > > +@example > > +srt://@var{hostname}:@var{port}[?@var{options}] > > +@end example > > + > > +@var{options} contains a list of &-separated options of the form > > +@var{key}=@var{val}. > > + > > +This protocol accepts the following options. > > + > > +@table @option > > +@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). > > + > > +@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 > > +@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. > > + > > +@item inputbw=@var{bytes/seconds} > > +Sender nominal input rate, in bytes per seconds. Used along with > > +@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: > > +@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. > > + > > +@item iptos=@var{tos} > > +IP Type of Service. Applies to sender only. Default value is 0xB8. > > + > > +@item ipttl=@var{ttl} > > +IP Time To Live. Applies to sender only. Default value is 64. > > + > > +@item listen_timeout > > +Set socket listen timeout. > > + > > +@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) > > + > > +@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. > > + > > +@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. > > + > > +@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. > > + > > +@item oheadbw=@var{percents} > > +Recovery bandwidth overhead above input rate, in percents. > > +See @option{inputbw}. Default value is 25%. > > + > > +@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 > > +@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). > > + > > +@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. > > + > > +@item recv_buffer_size=@var{bytes} > > +Set receive buffer size, expressed bytes. > > + > > +@item send_buffer_size=@var{bytes} > > +Set send buffer size, expressed bytes. > > + > > +@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. > > + > > +@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. > > + > > +@item tsbpddelay > > +Timestamp-based Packet Delivery Delay. > > +Used to absorb burst of missed packet retransmission. > > + > > +@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@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel