[FFmpeg-cvslog] avformat/libsrt: fix checking connection result in non-blocking mode
Marton Balint
git at videolan.org
Mon Feb 24 01:14:50 EET 2020
ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Thu Feb 13 23:58:45 2020 +0100| [aab9133d919bec4af54a06216d8629ebe4fb8f74] | committer: Marton Balint
avformat/libsrt: fix checking connection result in non-blocking mode
After f8990c5f414d4575415e2a3981c3b142222ca3d4 we properly set non-blocking
mode which makes the connect() call return always 0 even if no connection can
be established.
Fix this by always doing a poll after calling connect(). Also there was some
leftover copy paste code which checks for various errors which are simply not
possible with SRT.
Signed-off-by: Marton Balint <cus at passwd.hu>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=aab9133d919bec4af54a06216d8629ebe4fb8f74
---
libavformat/libsrt.c | 41 +++++++++++++----------------------------
1 file changed, 13 insertions(+), 28 deletions(-)
diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c
index 378acb045a..1ab6c1ddb3 100644
--- a/libavformat/libsrt.c
+++ b/libavformat/libsrt.c
@@ -250,34 +250,19 @@ static int libsrt_listen_connect(int eid, int fd, const struct sockaddr *addr, s
if (libsrt_socket_nonblock(fd, 1) < 0)
av_log(h, AV_LOG_DEBUG, "ff_socket_nonblock failed\n");
- while ((ret = srt_connect(fd, addr, addrlen))) {
- ret = libsrt_neterrno(h);
- switch (ret) {
- case AVERROR(EINTR):
- if (ff_check_interrupt(&h->interrupt_callback))
- return AVERROR_EXIT;
- continue;
- case AVERROR(EINPROGRESS):
- case AVERROR(EAGAIN):
- ret = libsrt_network_wait_fd_timeout(h, eid, fd, 1, timeout, &h->interrupt_callback);
- if (ret < 0)
- return ret;
- ret = srt_getlasterror(NULL);
- srt_clearlasterror();
- if (ret != 0) {
- char buf[128];
- ret = AVERROR(ret);
- av_strerror(ret, buf, sizeof(buf));
- if (will_try_next)
- av_log(h, AV_LOG_WARNING,
- "Connection to %s failed (%s), trying next address\n",
- h->filename, buf);
- else
- av_log(h, AV_LOG_ERROR, "Connection to %s failed: %s\n",
- h->filename, buf);
- }
- default:
- return ret;
+ ret = srt_connect(fd, addr, addrlen);
+ if (ret < 0)
+ return libsrt_neterrno(h);
+
+ ret = libsrt_network_wait_fd_timeout(h, eid, fd, 1, timeout, &h->interrupt_callback);
+ if (ret < 0) {
+ 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));
}
}
return ret;
More information about the ffmpeg-cvslog
mailing list