[FFmpeg-cvslog] lavf/libsrt: add linger parameter to libsrt
Jun Zhao
git at videolan.org
Wed Dec 11 08:49:06 EET 2019
ffmpeg | branch: master | Jun Zhao <barryjzhao at tencent.com> | Sun Dec 1 14:03:37 2019 +0800| [8d823e6005febef23ca10ccd9d8725e708167aeb] | committer: Jun Zhao
lavf/libsrt: add linger parameter to libsrt
add linger parameter to libsrt, it's setting the number of seconds
that the socket waits for unsent data when closing.
Reviewed-by: Andriy Gelman <andriy.gelman at gmail.com>
Signed-off-by: Jun Zhao <barryjzhao at tencent.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8d823e6005febef23ca10ccd9d8725e708167aeb
---
doc/protocols.texi | 6 ++++++
libavformat/libsrt.c | 13 +++++++++++++
2 files changed, 19 insertions(+)
diff --git a/doc/protocols.texi b/doc/protocols.texi
index 0e18a49dda..886c3b8bb9 100644
--- a/doc/protocols.texi
+++ b/doc/protocols.texi
@@ -1426,6 +1426,12 @@ the overhead transmission (retransmitted and control packets).
file: Set options as for non-live transmission. See @option{messageapi}
for further explanations
+ at item linger=@var{seconds}
+The number of seconds that the socket waits for unsent data when closing.
+Default is -1. -1 means auto (off with 0 seconds in live mode, on with 180
+seconds in file mode). The range for this option is integers in the
+0 - @code{INT_MAX}.
+
@end table
For more information see: @url{https://github.com/Haivision/srt}.
diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c
index 825ad9d1a3..b6dd2750ca 100644
--- a/libavformat/libsrt.c
+++ b/libavformat/libsrt.c
@@ -84,6 +84,7 @@ typedef struct SRTContext {
char *smoother;
int messageapi;
SRT_TRANSTYPE transtype;
+ int linger;
} SRTContext;
#define D AV_OPT_FLAG_DECODING_PARAM
@@ -128,6 +129,7 @@ static const AVOption libsrt_options[] = {
{ "transtype", "The transmission type for the socket", OFFSET(transtype), AV_OPT_TYPE_INT, { .i64 = SRTT_INVALID }, SRTT_LIVE, SRTT_INVALID, .flags = D|E, "transtype" },
{ "live", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = SRTT_LIVE }, INT_MIN, INT_MAX, .flags = D|E, "transtype" },
{ "file", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = SRTT_FILE }, INT_MIN, INT_MAX, .flags = D|E, "transtype" },
+ { "linger", "Number of seconds that the socket waits for unsent data when closing", OFFSET(linger), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = D|E },
{ NULL }
};
@@ -340,6 +342,14 @@ static int libsrt_set_options_pre(URLContext *h, int fd)
((h->flags & AVIO_FLAG_WRITE) && libsrt_setsockopt(h, fd, SRTO_SENDER, "SRTO_SENDER", &yes, sizeof(yes)) < 0)) {
return AVERROR(EIO);
}
+
+ if (s->linger >= 0) {
+ struct linger lin;
+ lin.l_linger = s->linger;
+ lin.l_onoff = lin.l_linger > 0 ? 1 : 0;
+ if (libsrt_setsockopt(h, fd, SRTO_LINGER, "SRTO_LINGER", &lin, sizeof(lin)) < 0)
+ return AVERROR(EIO);
+ }
return 0;
}
@@ -592,6 +602,9 @@ static int libsrt_open(URLContext *h, const char *uri, int flags)
goto err;
}
}
+ if (av_find_info_tag(buf, sizeof(buf), "linger", p)) {
+ s->linger = strtol(buf, NULL, 10);
+ }
}
return libsrt_setup(h, uri, flags);
err:
More information about the ffmpeg-cvslog
mailing list