diff mbox

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

Message ID 0d3601d3aaf4$b3e11090$1ba331b0$@com
State New
Headers show

Commit Message

Sven Dueking Feb. 21, 2018, 9:16 a.m. UTC
protocol requires libsrt (https://github.com/Haivision/srt) to be installed

Signed-off-by: Sven Dueking <sven.dueking@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

Comments

Michael Niedermayer Feb. 21, 2018, 1:35 p.m. UTC | #1
On Wed, Feb 21, 2018 at 10:16:48AM +0100, Sven Dueking wrote:
> protocol requires libsrt (https://github.com/Haivision/srt) to be installed
> 
> Signed-off-by: Sven Dueking <sven.dueking@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

there is something wrong with newlines
this patch is corrupted and cannot be tested or applied

[...]
Sven Dueking Feb. 21, 2018, 2:25 p.m. UTC | #2
> -----Ursprüngliche Nachricht-----
> Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] Im Auftrag von
> Michael Niedermayer
> Gesendet: Mittwoch, 21. Februar 2018 14:35
> An: FFmpeg development discussions and patches
> Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision Open
> SRT protocol
> 
> On Wed, Feb 21, 2018 at 10:16:48AM +0100, Sven Dueking wrote:
> > protocol requires libsrt (https://github.com/Haivision/srt) to be
> > installed
> >
> > Signed-off-by: Sven Dueking <sven.dueking@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
> 
> there is something wrong with newlines
> this patch is corrupted and cannot be tested or applied
> 
> [...]

Hi Michael,

Sorry, no idea why this happens. Patch attached.

> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
> 
> Rewriting code that is poorly written but fully understood is good.
> Rewriting code that one doesnt understand is a sign that one is less smart
> then the original author, trying to rewrite it will not make it better.
Sven Dueking Feb. 27, 2018, 7:26 a.m. UTC | #3
> -----Ursprüngliche Nachricht-----
> Von: Sven Dueking [mailto:sven@nablet.com]
> Gesendet: Mittwoch, 21. Februar 2018 15:25
> An: 'FFmpeg development discussions and patches'
> Betreff: AW: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> Open SRT protocol
> 
> 
> 
> > -----Ursprüngliche Nachricht-----
> > Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] Im Auftrag
> > von Michael Niedermayer
> > Gesendet: Mittwoch, 21. Februar 2018 14:35
> > An: FFmpeg development discussions and patches
> > Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > Open SRT protocol
> >
> > On Wed, Feb 21, 2018 at 10:16:48AM +0100, Sven Dueking wrote:
> > > protocol requires libsrt (https://github.com/Haivision/srt) to be
> > > installed
> > >
> > > Signed-off-by: Sven Dueking <sven.dueking@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
> >
> > there is something wrong with newlines this patch is corrupted and
> > cannot be tested or applied
> >
> > [...]
> 
> Hi Michael,
> 
> Sorry, no idea why this happens. Patch attached.

Ping ?!

> 
> > --
> > Michael     GnuPG fingerprint:
> 9FF2128B147EF6730BADF133611EC787040B0FAB
> >
> > Rewriting code that is poorly written but fully understood is good.
> > Rewriting code that one doesnt understand is a sign that one is less
> > smart then the original author, trying to rewrite it will not make it
> better.
Sven Dueking March 5, 2018, 4:09 p.m. UTC | #4
> -----Ursprüngliche Nachricht-----
> Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] Im Auftrag
> von Sven Dueking
> Gesendet: Dienstag, 27. Februar 2018 08:27
> An: 'FFmpeg development discussions and patches'
> Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> Open SRT protocol
> 
> 
> 
> > -----Ursprüngliche Nachricht-----
> > Von: Sven Dueking [mailto:sven@nablet.com]
> > Gesendet: Mittwoch, 21. Februar 2018 15:25
> > An: 'FFmpeg development discussions and patches'
> > Betreff: AW: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > Open SRT protocol
> >
> >
> >
> > > -----Ursprüngliche Nachricht-----
> > > Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] Im
> > > Auftrag von Michael Niedermayer
> > > Gesendet: Mittwoch, 21. Februar 2018 14:35
> > > An: FFmpeg development discussions and patches
> > > Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > > Open SRT protocol
> > >
> > > On Wed, Feb 21, 2018 at 10:16:48AM +0100, Sven Dueking wrote:
> > > > protocol requires libsrt (https://github.com/Haivision/srt) to be
> > > > installed
> > > >
> > > > Signed-off-by: Sven Dueking <sven.dueking@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
> > >
> > > there is something wrong with newlines this patch is corrupted and
> > > cannot be tested or applied
> > >
> > > [...]
> >
> > Hi Michael,
> >
> > Sorry, no idea why this happens. Patch attached.
> 
> Ping ?!
> 
> >
> > > --
> > > Michael     GnuPG fingerprint:
> > 9FF2128B147EF6730BADF133611EC787040B0FAB
> > >
> > > Rewriting code that is poorly written but fully understood is good.
> > > Rewriting code that one doesnt understand is a sign that one is
> less
> > > smart then the original author, trying to rewrite it will not make
> > > it
> > better.
> 

Any chance to get feedback ? 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Michael Niedermayer March 9, 2018, 12:55 a.m. UTC | #5
On Mon, Mar 05, 2018 at 05:09:04PM +0100, Sven Dueking wrote:
> 
> 
> > -----Ursprüngliche Nachricht-----
> > Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] Im Auftrag
> > von Sven Dueking
> > Gesendet: Dienstag, 27. Februar 2018 08:27
> > An: 'FFmpeg development discussions and patches'
> > Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > Open SRT protocol
> > 
> > 
> > 
> > > -----Ursprüngliche Nachricht-----
> > > Von: Sven Dueking [mailto:sven@nablet.com]
> > > Gesendet: Mittwoch, 21. Februar 2018 15:25
> > > An: 'FFmpeg development discussions and patches'
> > > Betreff: AW: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > > Open SRT protocol
> > >
> > >
> > >
> > > > -----Ursprüngliche Nachricht-----
> > > > Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] Im
> > > > Auftrag von Michael Niedermayer
> > > > Gesendet: Mittwoch, 21. Februar 2018 14:35
> > > > An: FFmpeg development discussions and patches
> > > > Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > > > Open SRT protocol
> > > >
> > > > On Wed, Feb 21, 2018 at 10:16:48AM +0100, Sven Dueking wrote:
> > > > > protocol requires libsrt (https://github.com/Haivision/srt) to be
> > > > > installed
> > > > >
> > > > > Signed-off-by: Sven Dueking <sven.dueking@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
> > > >
> > > > there is something wrong with newlines this patch is corrupted and
> > > > cannot be tested or applied
> > > >
> > > > [...]
> > >
> > > Hi Michael,
> > >
> > > Sorry, no idea why this happens. Patch attached.
> > 
> > Ping ?!
> > 
> > >
> > > > --
> > > > Michael     GnuPG fingerprint:
> > > 9FF2128B147EF6730BADF133611EC787040B0FAB
> > > >
> > > > Rewriting code that is poorly written but fully understood is good.
> > > > Rewriting code that one doesnt understand is a sign that one is
> > less
> > > > smart then the original author, trying to rewrite it will not make
> > > > it
> > > better.
> > 
> 
> Any chance to get feedback ? 

is anyone working on a review of this patch or intends to review it ?

If not i intend to push it after a light review (i think there are
other people around who are more qualified to review this than i am)

[...]
Mike Goins March 9, 2018, 5:44 a.m. UTC | #6
On Thu, Mar 8, 2018 at 7:55 PM, Michael Niedermayer
<michael@niedermayer.cc> wrote:
>
> On Mon, Mar 05, 2018 at 05:09:04PM +0100, Sven Dueking wrote:
> >
> >
> > > -----Ursprüngliche Nachricht-----
> > > Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] Im Auftrag
> > > von Sven Dueking
> > > Gesendet: Dienstag, 27. Februar 2018 08:27
> > > An: 'FFmpeg development discussions and patches'
> > > Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > > Open SRT protocol
> > >
> > >
> > >
> > > > -----Ursprüngliche Nachricht-----
> > > > Von: Sven Dueking [mailto:sven@nablet.com]
> > > > Gesendet: Mittwoch, 21. Februar 2018 15:25
> > > > An: 'FFmpeg development discussions and patches'
> > > > Betreff: AW: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > > > Open SRT protocol
> > > >
> > > >
> > > >
> > > > > -----Ursprüngliche Nachricht-----
> > > > > Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] Im
> > > > > Auftrag von Michael Niedermayer
> > > > > Gesendet: Mittwoch, 21. Februar 2018 14:35
> > > > > An: FFmpeg development discussions and patches
> > > > > Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > > > > Open SRT protocol
> > > > >
> > > > > On Wed, Feb 21, 2018 at 10:16:48AM +0100, Sven Dueking wrote:
> > > > > > protocol requires libsrt (https://github.com/Haivision/srt) to be
> > > > > > installed
> > > > > >
> > > > > > Signed-off-by: Sven Dueking <sven.dueking@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
> > > > >
> > > > > there is something wrong with newlines this patch is corrupted and
> > > > > cannot be tested or applied
> > > > >
> > > > > [...]
> > > >
> > > > Hi Michael,
> > > >
> > > > Sorry, no idea why this happens. Patch attached.
> > >
> > > Ping ?!
> > >
> > > >
> > > > > --
> > > > > Michael     GnuPG fingerprint:
> > > > 9FF2128B147EF6730BADF133611EC787040B0FAB
> > > > >
> > > > > Rewriting code that is poorly written but fully understood is good.
> > > > > Rewriting code that one doesnt understand is a sign that one is
> > > less
> > > > > smart then the original author, trying to rewrite it will not make
> > > > > it
> > > > better.
> > >
> >
> > Any chance to get feedback ?
>
> is anyone working on a review of this patch or intends to review it ?
>
> If not i intend to push it after a light review (i think there are
> other people around who are more qualified to review this than i am)


Just a cursory glance at the moment, I can functionally test tomorrow
(pretty familiar with SRT).

+    { "timeout",        "set timeout of socket I/O operations",
                          OFFSET(rw_timeout),
AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
+    { "listen_timeout", "Connection awaiting timeout",
                          OFFSET(listen_timeout),
AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },

Is there guidance for option descriptions?  The capitalization is inconsistent.

+    { "mss",            "the Maximum Transfer Unit",
                          OFFSET(mss),              AV_OPT_TYPE_INT,
   { .i64 = -1 }, -1, 1500,      .flags = D|E },

mss -> maximum segment size?  Not sure why this is different than the
protocols.texi

+    { "connect_timeout", "Connect timeout. Ccaller default: 3000,
rendezvous (x 10)",           OFFSET(connect_timeout),
AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT64_MAX, .flags = D|E },

Spelling.


SRT has a dependency on openssl.  Not sure how that is accounted for
in the build/link process.



> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> While the State exists there can be no freedom; when there is freedom there
> will be no State. -- Vladimir Lenin
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
wm4 March 9, 2018, 7:20 a.m. UTC | #7
On Wed, 21 Feb 2018 10:16:48 +0100
"Sven Dueking" <sven@nablet.com> wrote:

> protocol requires libsrt (https://github.com/Haivision/srt) to be installed
> 
> Signed-off-by: Sven Dueking <sven.dueking@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.)
Sven Dueking March 9, 2018, 10:01 a.m. UTC | #8
> -----Ursprüngliche Nachricht-----
> Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@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" <sven@nablet.com> wrote:
> 
> > protocol requires libsrt (https://github.com/Haivision/srt) to be
> > installed
> >
> > Signed-off-by: Sven Dueking <sven.dueking@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
Nicolas George March 9, 2018, 10:06 a.m. UTC | #9
Sven Dueking (2018-03-09):
> 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 ? 

A timeout is a duration of time before giving up: AV_OPT_TYPE_DURATION,
there is no doubt about it.

OTOH, you need to fix the max value.

I have this patch in my inbox, I intend to review it again sometime, but
sorry, it is not very high in my priority list. If somebody else wants
to take over, I have absolutely no objection.

Regards,
Rostislav Pehlivanov March 9, 2018, 1:23 p.m. UTC | #10
On 9 March 2018 at 00:55, Michael Niedermayer <michael@niedermayer.cc>
wrote:

> On Mon, Mar 05, 2018 at 05:09:04PM +0100, Sven Dueking wrote:
> >
> >
> > > -----Ursprüngliche Nachricht-----
> > > Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] Im Auftrag
> > > von Sven Dueking
> > > Gesendet: Dienstag, 27. Februar 2018 08:27
> > > An: 'FFmpeg development discussions and patches'
> > > Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > > Open SRT protocol
> > >
> > >
> > >
> > > > -----Ursprüngliche Nachricht-----
> > > > Von: Sven Dueking [mailto:sven@nablet.com]
> > > > Gesendet: Mittwoch, 21. Februar 2018 15:25
> > > > An: 'FFmpeg development discussions and patches'
> > > > Betreff: AW: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > > > Open SRT protocol
> > > >
> > > >
> > > >
> > > > > -----Ursprüngliche Nachricht-----
> > > > > Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] Im
> > > > > Auftrag von Michael Niedermayer
> > > > > Gesendet: Mittwoch, 21. Februar 2018 14:35
> > > > > An: FFmpeg development discussions and patches
> > > > > Betreff: Re: [FFmpeg-devel] [PATCH] avformat/opensrt: add Haivision
> > > > > Open SRT protocol
> > > > >
> > > > > On Wed, Feb 21, 2018 at 10:16:48AM +0100, Sven Dueking wrote:
> > > > > > protocol requires libsrt (https://github.com/Haivision/srt) to
> be
> > > > > > installed
> > > > > >
> > > > > > Signed-off-by: Sven Dueking <sven.dueking@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
> > > > >
> > > > > there is something wrong with newlines this patch is corrupted and
> > > > > cannot be tested or applied
> > > > >
> > > > > [...]
> > > >
> > > > Hi Michael,
> > > >
> > > > Sorry, no idea why this happens. Patch attached.
> > >
> > > Ping ?!
> > >
> > > >
> > > > > --
> > > > > Michael     GnuPG fingerprint:
> > > > 9FF2128B147EF6730BADF133611EC787040B0FAB
> > > > >
> > > > > Rewriting code that is poorly written but fully understood is good.
> > > > > Rewriting code that one doesnt understand is a sign that one is
> > > less
> > > > > smart then the original author, trying to rewrite it will not make
> > > > > it
> > > > better.
> > >
> >
> > Any chance to get feedback ?
>
> is anyone working on a review of this patch or intends to review it ?
>
> If not i intend to push it after a light review (i think there are
> other people around who are more qualified to review this than i am)
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> While the State exists there can be no freedom; when there is freedom there
> will be no State. -- Vladimir Lenin
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>
I still think this should be a native protocol. No distro will bother
shipping the library and it will bitrot in no more than a few years. Then
it'll go the same route as libschroedinger - removed because its a security
disaster.
wm4 March 9, 2018, 8:47 p.m. UTC | #11
On Fri, 9 Mar 2018 11:01:51 +0100
"Sven Dueking" <sven@nablet.com> wrote:

> > -----Ursprüngliche Nachricht-----
> > Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces@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" <sven@nablet.com> wrote:
> >   
> > > protocol requires libsrt (https://github.com/Haivision/srt) to be
> > > installed
> > >
> > > Signed-off-by: Sven Dueking <sven.dueking@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 ? 

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.
diff mbox

Patch

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 },
+    { "listen_timeout", "Connection awaiting timeout",
OFFSET(listen_timeout),   AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX,
.flags = D|E },
+    { "send_buffer_size", "Socket send buffer size (in bytes)",
OFFSET(send_buffer_size), AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,
.flags = D|E },
+    { "recv_buffer_size", "Socket receive buffer size (in bytes)",
OFFSET(recv_buffer_size), AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,
.flags = D|E },
+    { "maxbw",          "maximum bandwidth (bytes per second) that the
connection can use",     OFFSET(maxbw),            AV_OPT_TYPE_INT64,    {
.i64 = -1 }, -1, INT64_MAX, .flags = D|E },
+    { "pbkeylen",       "Crypto key len in bytes {16,24,32} Default: 16
(128-bit)",             OFFSET(pbkeylen),         AV_OPT_TYPE_INT,      {
.i64 = -1 }, -1, 32,        .flags = D|E },
+    { "passphrase",     "Crypto PBKDF2 Passphrase size[0,10..64] 0:disable
crypto",             OFFSET(passphrase),       AV_OPT_TYPE_STRING,   { .str
= NULL },              .flags = D|E },
+    { "mss",            "the Maximum Transfer Unit",
OFFSET(mss),              AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 1500,
.flags = D|E },
+    { "fc",             "Flight flag size (window size) (in bytes)",
OFFSET(fc),               AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,
.flags = D|E },
+    { "ipttl",          "IP Time To Live",
OFFSET(ipttl),            AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 255,
.flags = D|E },
+    { "iptos",          "IP Type of Service",
OFFSET(iptos),            AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 255,
.flags = D|E },
+    { "inputbw",        "Estimated input stream rate",
OFFSET(inputbw),          AV_OPT_TYPE_INT64,    { .i64 = -1 }, -1,
INT64_MAX, .flags = D|E },
+    { "oheadbw",        "MaxBW ceiling based on % over input stream rate",
OFFSET(oheadbw),          AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 100,
.flags = D|E },
+    { "tsbpddelay",     "TsbPd receiver delay to absorb burst of missed
packet retransmission", OFFSET(tsbpddelay),       AV_OPT_TYPE_DURATION, {
.i64 = -1 }, -1, INT_MAX,   .flags = D|E },
+    { "tlpktdrop",      "Enable receiver pkt drop",
OFFSET(tlpktdrop),        AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 1,
.flags = D|E },
+    { "nakreport",      "Enable receiver to send periodic NAK reports",
OFFSET(nakreport),        AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 1,
.flags = D|E },
+    { "connect_timeout", "Connect timeout. Ccaller default: 3000,
rendezvous (x 10)",           OFFSET(connect_timeout),
AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT64_MAX, .flags = D|E },
+    { "mode",           "Connection mode (caller, listener, rendezvous)",
OFFSET(mode),             AV_OPT_TYPE_INT,      { .i64 = SRT_MODE_CALLER },
SRT_MODE_CALLER, SRT_MODE_RENDEZVOUS, .flags = D|E },
+    { "caller",         NULL, 0, AV_OPT_TYPE_CONST,  { .i64 =
SRT_MODE_CALLER },     INT_MIN, INT_MAX, .flags = D|E },
+    { "listener",       NULL, 0, AV_OPT_TYPE_CONST,  { .i64 =
SRT_MODE_LISTENER },   INT_MIN, INT_MAX, .flags = D|E },
+    { "rendezvous",     NULL, 0, AV_OPT_TYPE_CONST,  { .i64 =
SRT_MODE_RENDEZVOUS }, INT_MIN, INT_MAX, .flags = D|E },
+    { NULL }
+};
+
+static const AVClass opensrt_class = {
+    .class_name = "opensrt",
+    .item_name  = av_default_item_name,
+    .option     = opensrt_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+static int opensrt_neterrno(void)
+{
+    int err = srt_getlasterror(NULL);
+    if (err == SRT_EASYNCRCV)
+        return AVERROR(EAGAIN);
+    return AVERROR_EXTERNAL;
+}
+
+static int opensrt_socket_nonblock(int socket, int enable) {
+    int ret = srt_setsockopt(socket, 0, SRTO_SNDSYN, &enable,
sizeof(enable));
+    if (ret < 0)
+        return ret;
+    ret = srt_setsockopt(socket, 0, SRTO_RCVSYN, &enable, sizeof(enable));
+    return ret;
+}
+
+static int opensrt_network_wait_fd(int eid, int fd, int write) {
+    int ret, len = 1;
+    int modes = write ? SRT_EPOLL_OUT : SRT_EPOLL_IN;
+    SRTSOCKET ready[1];
+
+    if (srt_epoll_add_usock(eid, fd, &modes) < 0)
+        return opensrt_neterrno();
+    if (write) {
+        ret = srt_epoll_wait(eid, 0, 0, ready, &len, POLLING_TIME, 0, 0, 0,
0);
+    } else {
+        ret = srt_epoll_wait(eid, ready, &len, 0, 0, POLLING_TIME, 0, 0, 0,
0);
+    }
+    if (ret < 0) {
+        if (srt_getlasterror(NULL) == SRT_ETIMEOUT)
+            ret = AVERROR(EAGAIN);
+        else
+            ret = opensrt_neterrno();
+    } else {
+        ret = 0;
+    }
+    if (srt_epoll_remove_usock(eid, fd) < 0)
+        return opensrt_neterrno();
+    return ret;
+}
+
+/* TODO de-duplicate code from ff_network_wait_fd_timeout() */
+
+static int opensrt_network_wait_fd_timeout(int eid, int fd, int write, 
+int64_t timeout, AVIOInterruptCB *int_cb) {
+    int ret;
+    int64_t wait_start = 0;
+
+    while (1) {
+        if (ff_check_interrupt(int_cb))
+            return AVERROR_EXIT;
+        ret = opensrt_network_wait_fd(eid, fd, write);
+        if (ret != AVERROR(EAGAIN))
+            return ret;
+        if (timeout > 0) {
+            if (!wait_start)
+                wait_start = av_gettime_relative();
+            else if (av_gettime_relative() - wait_start > timeout)
+                return AVERROR(ETIMEDOUT);
+        }
+    }
+}
+
+static int opensrt_do_accept(int eid, int fd, int timeout, URLContext 
+*h) {
+    int ret;
+
+    ret = opensrt_network_wait_fd_timeout(eid, fd, 0, timeout,
&h->interrupt_callback);
+    if (ret < 0)
+        return ret;
+
+    ret = srt_accept(fd, NULL, NULL);
+    if (ret < 0)
+        return opensrt_neterrno();
+    if (opensrt_socket_nonblock(ret, 1) < 0)
+        av_log(h, AV_LOG_DEBUG, "opensrt_socket_nonblock failed\n");
+
+    return ret;
+}
+
+static int opensrt_listen(int fd, const struct sockaddr *addr, 
+socklen_t addrlen, URLContext *h) {
+    int ret;
+    int reuse = 1;
+    if (srt_setsockopt(fd, SOL_SOCKET, SRTO_REUSEADDR, &reuse,
sizeof(reuse))) {
+        av_log(h, AV_LOG_WARNING, "setsockopt(SRTO_REUSEADDR) failed\n");
+    }
+    ret = srt_bind(fd, addr, addrlen);
+    if (ret)
+        return opensrt_neterrno();
+
+    ret = srt_listen(fd, 1);
+    if (ret)
+        return opensrt_neterrno();
+    return ret;
+}
+
+static int opensrt_listen_connect(int eid, int fd, const struct 
+sockaddr *addr, socklen_t addrlen, int timeout, URLContext *h, int
will_try_next) {
+    int ret;
+
+    if (opensrt_socket_nonblock(fd, 1) < 0)
+        av_log(h, AV_LOG_DEBUG, "ff_socket_nonblock failed\n");
+
+    while ((ret = srt_connect(fd, addr, addrlen))) {
+        ret = opensrt_neterrno();
+        switch (ret) {
+        case AVERROR(EINTR):
+            if (ff_check_interrupt(&h->interrupt_callback))
+                return AVERROR_EXIT;
+            continue;
+        case AVERROR(EINPROGRESS):
+        case AVERROR(EAGAIN):
+            ret = opensrt_network_wait_fd_timeout(eid, fd, 1, timeout,
&h->interrupt_callback);
+            if (ret < 0)
+                return ret;
+            ret = srt_getlasterror(NULL);
+            srt_clearlasterror();
+            if (ret != 0) {
+                ret = AVERROR(ret);
+                if (will_try_next)
+                    av_log(h, AV_LOG_WARNING,
+                           "Connection to %s failed (%s), trying next
address\n",
+                           h->filename, av_err2str(ret));
+                else
+                    av_log(h, AV_LOG_ERROR, "Connection to %s failed:
%s\n",
+                           h->filename, av_err2str(ret));
+            }
+        default:
+            return ret;
+        }
+    }
+    return ret;
+}
+
+static int opensrt_setsockopt(URLContext *h, int fd, SRT_SOCKOPT 
+optname, const char * optnamestr, const void * optval, int optlen) {
+    if (srt_setsockopt(fd, 0, optname, optval, optlen) < 0) {
+        av_log(h, AV_LOG_ERROR, "failed to set option %s on socket: %s\n",
optnamestr, srt_getlasterror_str());
+        return AVERROR(EIO);
+    }
+    return 0;
+}
+
+/* - The "POST" options can be altered any time on a connected socket.
+     They MAY have also some meaning when set prior to connecting; such
+     option is SRTO_RCVSYN, which makes connect/accept call asynchronous.
+     Because of that this option is treated special way in this app. */ 
+static int opensrt_set_options_post(URLContext *h, int fd) {
+    SRTContext *s = h->priv_data;
+
+    if (s->inputbw >= 0 && opensrt_setsockopt(h, fd, SRTO_INPUTBW,
"SRTO_INPUTBW", &s->inputbw, sizeof(s->inputbw)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (s->oheadbw >= 0 && opensrt_setsockopt(h, fd, SRTO_OHEADBW,
"SRTO_OHEADBW", &s->oheadbw, sizeof(s->oheadbw)) < 0) {
+        return AVERROR(EIO);
+    }
+    return 0;
+}
+
+/* - The "PRE" options must be set prior to connecting and can't be altered
+     on a connected socket, however if set on a listening socket, they are
+     derived by accept-ed socket. */
+static int opensrt_set_options_pre(URLContext *h, int fd) {
+    SRTContext *s = h->priv_data;
+    int yes = 1;
+    int tsbpddelay = s->tsbpddelay / 1000;
+    int connect_timeout = s->connect_timeout;
+
+    if (s->mode == SRT_MODE_RENDEZVOUS && opensrt_setsockopt(h, fd,
SRTO_RENDEZVOUS, "SRTO_RENDEZVOUS", &yes, sizeof(yes)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (s->maxbw >= 0 && opensrt_setsockopt(h, fd, SRTO_MAXBW,
"SRTO_MAXBW", &s->maxbw, sizeof(s->maxbw)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (s->pbkeylen >= 0 && opensrt_setsockopt(h, fd, SRTO_PBKEYLEN,
"SRTO_PBKEYLEN", &s->pbkeylen, sizeof(s->pbkeylen)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (s->passphrase[0] && opensrt_setsockopt(h, fd, SRTO_PASSPHRASE,
"SRTO_PASSPHRASE", &s->passphrase, sizeof(s->passphrase)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (s->mss >= 0 && opensrt_setsockopt(h, fd, SRTO_MSS, "SRTO_MMS",
&s->mss, sizeof(s->mss)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (s->fc >= 0 && opensrt_setsockopt(h, fd, SRTO_FC, "SRTO_FC", &s->fc,
sizeof(s->fc)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (s->ipttl >= 0 && opensrt_setsockopt(h, fd, SRTO_IPTTL,
"SRTO_UPTTL", &s->ipttl, sizeof(s->ipttl)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (s->iptos >= 0 && opensrt_setsockopt(h, fd, SRTO_IPTOS,
"SRTO_IPTOS", &s->iptos, sizeof(s->iptos)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (tsbpddelay >= 0 && opensrt_setsockopt(h, fd, SRTO_TSBPDDELAY,
"SRTO_TSBPDELAY", &tsbpddelay, sizeof(tsbpddelay)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (s->tlpktdrop >= 0 && opensrt_setsockopt(h, fd, SRTO_TLPKTDROP,
"SRTO_TLPKDROP", &s->tlpktdrop, sizeof(s->tlpktdrop)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (s->nakreport >= 0 && opensrt_setsockopt(h, fd, SRTO_NAKREPORT,
"SRTO_NAKREPORT", &s->nakreport, sizeof(s->nakreport)) < 0) {
+        return AVERROR(EIO);
+    }
+    if (connect_timeout >= 0 && opensrt_setsockopt(h, fd, SRTO_CONNTIMEO,
"SRTO_CONNTIMEO", &connect_timeout, sizeof(connect_timeout)) < 0) {
+        return AVERROR(EIO);
+    }
+    return 0;
+}
+
+
+static int opensrt_setup(URLContext *h, const char *uri, int flags) {
+    struct addrinfo hints = { 0 }, *ai, *cur_ai;
+    int port, fd = -1;
+    SRTContext *s = h->priv_data;
+    const char *p;
+    char buf[256];
+    int ret;
+    char hostname[1024],proto[1024],path[1024];
+    char portstr[10];
+    int open_timeout = 5000000;
+    int eid;
+
+    eid = srt_epoll_create();
+    if (eid < 0)
+        return opensrt_neterrno();
+    s->eid = eid;
+
+    av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname),
+        &port, path, sizeof(path), uri);
+    if (strcmp(proto, "srt"))
+        return AVERROR(EINVAL);
+    if (port <= 0 || port >= 65536) {
+        av_log(h, AV_LOG_ERROR, "Port missing in uri\n");
+        return AVERROR(EINVAL);
+    }
+    p = strchr(uri, '?');
+    if (p) {
+        if (av_find_info_tag(buf, sizeof(buf), "timeout", p)) {
+            s->rw_timeout = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "listen_timeout", p)) {
+            s->listen_timeout = strtol(buf, NULL, 10);
+        }
+    }
+    if (s->rw_timeout >= 0) {
+        open_timeout = h->rw_timeout = s->rw_timeout;
+    }
+    hints.ai_family = AF_UNSPEC;
+    hints.ai_socktype = SOCK_STREAM;
+    snprintf(portstr, sizeof(portstr), "%d", port);
+    if (s->mode == SRT_MODE_LISTENER)
+        hints.ai_flags |= AI_PASSIVE;
+    ret = getaddrinfo(hostname[0] ? hostname : NULL, portstr, &hints, &ai);
+    if (ret) {
+        av_log(h, AV_LOG_ERROR,
+               "Failed to resolve hostname %s: %s\n",
+               hostname, gai_strerror(ret));
+        return AVERROR(EIO);
+    }
+
+    cur_ai = ai;
+
+ restart:
+
+    fd = srt_socket(cur_ai->ai_family, cur_ai->ai_socktype, 0);
+    if (fd < 0) {
+        ret = opensrt_neterrno();
+        goto fail;
+    }
+
+    if ((ret = opensrt_set_options_pre(h, fd)) < 0) {
+        goto fail;
+    }
+
+    /* Set the socket's send or receive buffer sizes, if specified.
+       If unspecified or setting fails, system default is used. */
+    if (s->recv_buffer_size > 0) {
+        srt_setsockopt(fd, SOL_SOCKET, SRTO_UDP_RCVBUF,
&s->recv_buffer_size, sizeof (s->recv_buffer_size));
+    }
+    if (s->send_buffer_size > 0) {
+        srt_setsockopt(fd, SOL_SOCKET, SRTO_UDP_SNDBUF,
&s->send_buffer_size, sizeof (s->send_buffer_size));
+    }
+    if (s->mode == SRT_MODE_LISTENER) {
+        // multi-client
+        if ((ret = opensrt_listen(fd, cur_ai->ai_addr, cur_ai->ai_addrlen,
h)) < 0)
+            goto fail1;
+    } else {
+        if ((ret = opensrt_listen_connect(s->eid, fd, cur_ai->ai_addr,
cur_ai->ai_addrlen,
+                                     open_timeout / 1000, h, 
+ !!cur_ai->ai_next)) < 0) {
+
+            if (ret == AVERROR_EXIT)
+                goto fail1;
+            else
+                goto fail;
+        }
+    }
+    if ((ret = opensrt_set_options_post(h, fd)) < 0) {
+        goto fail;
+    }
+
+    h->is_streamed = 1;
+    s->fd = fd;
+
+    freeaddrinfo(ai);
+    return 0;
+
+ fail:
+    if (cur_ai->ai_next) {
+        /* Retry with the next sockaddr */
+        cur_ai = cur_ai->ai_next;
+        if (fd >= 0)
+            srt_close(fd);
+        ret = 0;
+        goto restart;
+    }
+ fail1:
+    if (fd >= 0)
+        srt_close(fd);
+    freeaddrinfo(ai);
+    return ret;
+}
+
+static int opensrt_open(URLContext *h, const char *uri, int flags) {
+    SRTContext *s = h->priv_data;
+    const char * p;
+    char buf[256];
+
+    if (srt_startup() < 0) {
+        return AVERROR_EXTERNAL;
+    }
+
+    /* SRT options (srt/srt.h) */
+    p = strchr(uri, '?');
+    if (p)
+    {
+        if (av_find_info_tag(buf, sizeof(buf), "maxbw", p)) {
+            s->maxbw = strtoll(buf, NULL, 0);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "pbkeylen", p)) {
+            s->pbkeylen = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "passphrase", p)) {
+            s->passphrase = av_strndup(buf, strlen(buf));
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "mss", p)) {
+            s->mss = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "fc", p)) {
+            s->fc = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "ipttl", p)) {
+            s->ipttl = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "iptos", p)) {
+            s->iptos = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "inputbw", p)) {
+            s->inputbw = strtoll(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "oheadbw", p)) {
+            s->oheadbw = strtoll(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "tsbpddelay", p)) {
+            s->tsbpddelay = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "tlpktdrop", p)) {
+            s->tlpktdrop = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "nakreport", p)) {
+            s->nakreport = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "connect_timeout", p)) {
+            s->connect_timeout = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "mode", p)) {
+            if (!strcmp(buf, "caller")) {
+                s->mode = SRT_MODE_CALLER;
+            } else if (!strcmp(buf, "listener")) {
+                s->mode = SRT_MODE_LISTENER;
+            } else if (!strcmp(buf, "rendezvous")) {
+                s->mode = SRT_MODE_RENDEZVOUS;
+            } else {
+                return AVERROR(EIO);
+            }
+        }
+    }
+    return opensrt_setup(h, uri, flags); }
+
+
+static int opensrt_accept(URLContext *s, URLContext **c) {
+    SRTContext *sc = s->priv_data;
+    SRTContext *cc;
+    int ret;
+    av_assert0(sc->mode == SRT_MODE_LISTENER);
+    if ((ret = ffurl_alloc(c, s->filename, s->flags,
&s->interrupt_callback)) < 0)
+        return ret;
+    cc = (*c)->priv_data;
+    ret = opensrt_do_accept(sc->eid, sc->fd, sc->listen_timeout / 1000, s);
+    if (ret < 0)
+        return ret;
+    cc->fd = ret;
+    return 0;
+}
+
+static int opensrt_read(URLContext *h, uint8_t *buf, int size) {
+    SRTContext *s = h->priv_data;
+    int ret;
+
+    if (!(h->flags & AVIO_FLAG_NONBLOCK)) {
+        ret = opensrt_network_wait_fd_timeout(s->eid, s->fd, 0,
h->rw_timeout, &h->interrupt_callback);
+        if (ret)
+            return ret;
+    }
+    ret = srt_recvmsg(s->fd, buf, size);
+    return ret < 0 ? opensrt_neterrno() : ret; }
+
+static int opensrt_write(URLContext *h, const uint8_t *buf, int size) {
+    SRTContext *s = h->priv_data;
+    int ret;
+
+    if (!(h->flags & AVIO_FLAG_NONBLOCK)) {
+        ret = opensrt_network_wait_fd_timeout(s->eid, s->fd, 1,
h->rw_timeout, &h->interrupt_callback);
+        if (ret)
+            return ret;
+    }
+    ret = srt_sendmsg(s->fd, buf, size, -1, 0);
+    return ret < 0 ? opensrt_neterrno() : ret; }
+
+static int opensrt_close(URLContext *h) {
+    SRTContext *s = h->priv_data;
+
+    srt_close(s->fd);
+
+    srt_epoll_release(s->eid);
+
+    srt_cleanup();
+
+    return 0;
+}
+
+static int opensrt_get_file_handle(URLContext *h) {
+    SRTContext *s = h->priv_data;
+    return s->fd;
+}
+
+static int opensrt_get_window_size(URLContext *h) {
+    SRTContext *s = h->priv_data;
+    int avail;
+    socklen_t avail_len = sizeof(avail);
+
+    if (srt_getsockopt(s->fd, SOL_SOCKET, SRTO_UDP_RCVBUF, &avail,
&avail_len)) {
+        return opensrt_neterrno();
+    }
+    return avail;
+}
+
+const URLProtocol ff_opensrt_protocol = {
+    .name                = "srt",
+    .url_open            = opensrt_open,
+    .url_accept          = opensrt_accept,
+    .url_read            = opensrt_read,
+    .url_write           = opensrt_write,
+    .url_close           = opensrt_close,
+    .url_get_file_handle = opensrt_get_file_handle,
+    .url_get_short_seek  = opensrt_get_window_size,
+    .priv_data_size      = sizeof(SRTContext),
+    .flags               = URL_PROTOCOL_FLAG_NETWORK,
+    .priv_data_class     = &opensrt_class,
+};
diff --git a/libavformat/protocols.c b/libavformat/protocols.c index
669d74d..823349a 100644
--- a/libavformat/protocols.c
+++ b/libavformat/protocols.c
@@ -59,6 +59,7 @@  extern const URLProtocol ff_tcp_protocol;  extern const
URLProtocol ff_tls_protocol;  extern const URLProtocol ff_udp_protocol;
extern const URLProtocol ff_udplite_protocol;
+extern const URLProtocol ff_opensrt_protocol;
 extern const URLProtocol ff_unix_protocol;  extern const URLProtocol
ff_librtmp_protocol;  extern const URLProtocol ff_librtmpe_protocol;
--
1.8.3.1