On Wed, 21 Feb 2018 10:16:48 +0100 "Sven Dueking" <[email protected]> wrote:
> protocol requires libsrt (https://github.com/Haivision/srt) to be installed > > Signed-off-by: Sven Dueking <[email protected]> > --- > 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.) _______________________________________________ ffmpeg-devel mailing list [email protected] http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
