From patchwork Sun Feb 7 16:41:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 25482 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 20FE344B510 for ; Sun, 7 Feb 2021 18:41:34 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E71156881BB; Sun, 7 Feb 2021 18:41:33 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from qq.com (out203-205-221-242.mail.qq.com [203.205.221.242]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F132F688128 for ; Sun, 7 Feb 2021 18:41:26 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1612716082; bh=7MzByxGElGz7mGQ0GRmYZhiZJ9YeIIQJcyBoneTMbb8=; h=From:To:Cc:Subject:Date; b=yvbH2ry1sLG+/pYicOA+vzERMjw98fQir/3BDoX7RtN+crXoKxuwXRjTCNNNDT9hF FZW9+RboMf0IDC8uX8os9hZOxxJ3gTGbtyAvabTpLYWLo3Kit/aPwC5p22OvvdHrv2 MF5xlU2k+8gVg7yPgahNTNqJuvZ35J1P5rACc4dM= Received: from localhost.localdomain ([27.46.106.137]) by newxmesmtplogicsvrszb6.qq.com (NewEsmtp) with SMTP id A539C29D; Mon, 08 Feb 2021 00:41:19 +0800 X-QQ-mid: xmsmtpt1612716079tp5g6dj8c Message-ID: X-QQ-XMAILINFO: N9C/Vpkk5whXOJwmLFpZ5Des4/kepfDYSfWIQ1XXpmKf6eURnzTDuqB69uFlY9 8be9G3pebNl4jdt7MaFJQ0UoQrY4x7trKszD5k2xKl3Q4Uj1jIm+ciCzgfPvMTf2KzFiqv4CWuz8 zW/1rA/AQXZpmLHlfmkrqH8kyP6siDlKqiBaIdP5M+1cWQTX/kGBCM6+qX2VSswPHpU33Jwr0b5M VR8gFnmPbDwEHgwcVmjn9txo1j6A2R6zGf3y3UX0wNvi3y0lblqyG0i9l0V3HXjfrLkg3j5NX6lO JCNKu1+UDF6GW+Pydyd1wmBJ68eGYUMBlud6ItgKhDvSEindnsnzx6+g7hhF1fCk9B48Q8TXW1f/ /abf9bCNqKYkc401CrdCOy5c28edskcFdF9E/+NWuZKOVy/innSrAPSK9hdYAJ+BvYRSPODkk64x vzYZTkAmaxYM3tcVQ3M4wQJQbRqKPLNMPQtDWGUMkR2ZB91idC6tAPytUnXeWgD53cfvTvNGyp9/ v8z+iwDNS+uUn4UqXKVrzWzJwUHc5LpLo/M7U5/HZhl0DST6dLHxPM/rmNMGehosVM5qEKaohr/d NRypmaheM341BTdApQh03fz3ERrSDeyQXJjeiZoo0H+oA9CR7DJSDU6WHdTUTowDmMiUQnptMWBM nL67UyZ2ragqr8hErVKU1A6IJofOx1A0ZDezKIs3YnWINTIOKyYB8GIpbPFnhKjNEfYxg4KbZmZu Sa8eolLg/5Ec3tSHo5DwgYJHoHf+ejpr3lz/Yi4l1z61LEgHiCtBcQiwFn9516e9fywf3b1tQpJS LX7ZO2uPNGJgaHYgS2zW1S From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 00:41:16 +0800 X-OQ-MSGID: <20210207164117.4867-1-quinkblack@foxmail.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] lavf/network: add wait fd callback to ff_network_wait_fd_timeout X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/libamqp.c | 4 ++-- libavformat/network.c | 16 ++++++++++++++-- libavformat/network.h | 14 +++++++++++++- libavformat/tcp.c | 6 ++++-- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/libavformat/libamqp.c b/libavformat/libamqp.c index c3b9c484ea..ca7d3ab70f 100644 --- a/libavformat/libamqp.c +++ b/libavformat/libamqp.c @@ -241,7 +241,7 @@ static int amqp_proto_write(URLContext *h, const unsigned char *buf, int size) amqp_bytes_t message = { size, (void *)buf }; amqp_basic_properties_t props; - ret = ff_network_wait_fd_timeout(fd, 1, h->rw_timeout, &h->interrupt_callback); + ret = ff_network_wait_fd_timeout(fd, 1, h->rw_timeout, &h->interrupt_callback, NULL); if (ret) return ret; @@ -270,7 +270,7 @@ static int amqp_proto_read(URLContext *h, unsigned char *buf, int size) amqp_rpc_reply_t broker_reply; amqp_envelope_t envelope; - ret = ff_network_wait_fd_timeout(fd, 0, h->rw_timeout, &h->interrupt_callback); + ret = ff_network_wait_fd_timeout(fd, 0, h->rw_timeout, &h->interrupt_callback, NULL); if (ret) return ret; diff --git a/libavformat/network.c b/libavformat/network.c index 0f5a575f77..48a9af012e 100644 --- a/libavformat/network.c +++ b/libavformat/network.c @@ -75,15 +75,27 @@ int ff_network_wait_fd(int fd, int write) return ret < 0 ? ff_neterrno() : p.revents & (ev | POLLERR | POLLHUP) ? 0 : AVERROR(EAGAIN); } -int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb) +static int network_wait_fd_callback(int fd, int write, void *opaque) { + return ff_network_wait_fd(fd, write); +} + +int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, + AVIOInterruptCB *int_cb, const NetworkWaitFdCB *wait_cb) { int ret; int64_t wait_start = 0; + const static NetworkWaitFdCB wait_cb_internal = { + .wait_fd = network_wait_fd_callback, + }; + + if (!wait_cb) + wait_cb = &wait_cb_internal; + while (1) { if (ff_check_interrupt(int_cb)) return AVERROR_EXIT; - ret = ff_network_wait_fd(fd, write); + ret = ff_network_wait_fd_cb(wait_cb, fd, write); if (ret != AVERROR(EAGAIN)) return ret; if (timeout > 0) { diff --git a/libavformat/network.h b/libavformat/network.h index 71347e815b..1a02a6d9ee 100644 --- a/libavformat/network.h +++ b/libavformat/network.h @@ -84,6 +84,16 @@ void ff_network_close(void); int ff_tls_init(void); void ff_tls_deinit(void); +typedef struct NetworkWaitFdCB { + int (*wait_fd)(int /*fd*/, int /*write*/, void* /*opaque*/); + void *opaque; +} NetworkWaitFdCB; + +static av_always_inline int ff_network_wait_fd_cb(const NetworkWaitFdCB *cb, + int fd, int write) { + return cb->wait_fd(fd, write, cb->opaque); +} + int ff_network_wait_fd(int fd, int write); /** @@ -94,9 +104,11 @@ int ff_network_wait_fd(int fd, int write); * @param write Set 1 to wait for socket able to be read, 0 to be written * @param timeout Timeout interval, in microseconds. Actual precision is 100000 mcs, due to ff_network_wait_fd usage * @param int_cb Interrupt callback, is checked before each ff_network_wait_fd call + * @param wait_cb Wait callback, default implementation is used if NULL * @return 0 if data can be read/written, AVERROR(ETIMEDOUT) if timeout expired, or negative error code */ -int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb); +int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, + AVIOInterruptCB *int_cb, const NetworkWaitFdCB *wait_cb); /** * Waits for up to 'timeout' microseconds. If the usert's int_cb is set and diff --git a/libavformat/tcp.c b/libavformat/tcp.c index 2198e0f00e..437eaecbb4 100644 --- a/libavformat/tcp.c +++ b/libavformat/tcp.c @@ -237,7 +237,8 @@ static int tcp_read(URLContext *h, uint8_t *buf, int size) int ret; if (!(h->flags & AVIO_FLAG_NONBLOCK)) { - ret = ff_network_wait_fd_timeout(s->fd, 0, h->rw_timeout, &h->interrupt_callback); + ret = ff_network_wait_fd_timeout(s->fd, 0, h->rw_timeout, + &h->interrupt_callback, NULL); if (ret) return ret; } @@ -253,7 +254,8 @@ static int tcp_write(URLContext *h, const uint8_t *buf, int size) int ret; if (!(h->flags & AVIO_FLAG_NONBLOCK)) { - ret = ff_network_wait_fd_timeout(s->fd, 1, h->rw_timeout, &h->interrupt_callback); + ret = ff_network_wait_fd_timeout(s->fd, 1, h->rw_timeout, + &h->interrupt_callback, NULL); if (ret) return ret; } From patchwork Sun Feb 7 16:41:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 25483 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id ECC8F44B510 for ; Sun, 7 Feb 2021 18:41:35 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CEE4D68A0D0; Sun, 7 Feb 2021 18:41:35 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from qq.com (out203-205-221-164.mail.qq.com [203.205.221.164]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 998B6688181 for ; Sun, 7 Feb 2021 18:41:27 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1612716082; bh=4vwwM5QOKt5CfRL/BRxPkKm8htCo7By9SAC6Rjxthpk=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ijCfLV8WYoT8W1BvtVCRn236KnaRaPC+JPrWi+9loXuw3Su1McznDAEnkO+n9hUwr ULtfKVW5ZUmi1bcGC5TyABdrmtsngFJQKr1ykHMrAGxUSwQHFbykNrSpsa/0eWqbQ5 1eQqwg9XvjjaOi2kWGKtIYUgwvb/7hdXkQNeBynY= Received: from localhost.localdomain ([27.46.106.137]) by newxmesmtplogicsvrszb6.qq.com (NewEsmtp) with SMTP id A539C29D; Mon, 08 Feb 2021 00:41:19 +0800 X-QQ-mid: xmsmtpt1612716080tj9n7w98l Message-ID: X-QQ-XMAILINFO: OEArAL79m7TBpatRWrd47aS+0m6RZKyvIv5ljBWEdKz5SblyzWzUeWcEE/N2xU wAk8LBg1ivvStHuXARgH5q/UQTTO9M46J75zsQ83wjXLL7qgn6edAWuF9WXxbFDLxpMvq738PZ9Q Cgj3o+1UzbDX+2C7tgzFct9Rbp/f52+Zc7ZZNqqBZUjIT7xkDEPqqRYjfXW/htiF30HlbqgwPDP+ Op/N2er6uq9Hu0PBTWOnnpaGjPoRlK8w5rhp9NGGN0m+4cwI6OiO19pKyPwkhuzug60/FNmFKL3G 8M3VRmwgXlXM1RuA1k+WfC4DYALpADDMgnz+i6F86AiJTzqWgHsSLqo9WoqDWRFahnbqB84Zu0Di FPNwwtZHQ1gEXmtm7N7l0vndkLCUvwxArgEXJQTOqnN5R65r1PafQ0j/hZKbaT37tZ5YeO/j9zXC Fl3qTPppzHRhuQiGmqk4FrE2u7ci4tUriha3of5tynjAQqmLELWJmToydDp8/TRUZQQTWTf+nbX8 nOWm2838xi51Eptvopl8s3TMfNBp2sDWBNtwkBIXCkXqfOGJrMKF17UIFTN+RhdLE8YSfy45PQh6 YdIYD8yIKpYvKcp8MCfJuUvHs4jlyDe8Ek+cixGnIoxdtPqNGtgJxIDHb5ZS8nTMT5gzynKNBgGn zZZtFGj+xTCQylEEqrXxuU+QB2sSvaeyJqk+xt06c4iRm+H2mSPPYmQa8Ve6wQOQpBSy0YKmFR1x wf79VwHvyWPIo9QunpO+LN6o80lTdYyeT+dYPP4sal5BJSqZjrip+0aSdIN193sX37QssxddLITO KjfKKR6oDpx20Wc741fjY+pIVSdYmwDsY= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 00:41:17 +0800 X-OQ-MSGID: <20210207164117.4867-2-quinkblack@foxmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210207164117.4867-1-quinkblack@foxmail.com> References: <20210207164117.4867-1-quinkblack@foxmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] lavf/libsrt: deduplicate libsrt_network_wait_fd_timeout X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/libsrt.c | 45 +++++++++++++++++--------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c index f73e7dbfa5..67e42bacc6 100644 --- a/libavformat/libsrt.c +++ b/libavformat/libsrt.c @@ -164,12 +164,14 @@ static int libsrt_socket_nonblock(int socket, int enable) return srt_setsockopt(socket, 0, SRTO_RCVSYN, &blocking, sizeof(blocking)); } -static int libsrt_network_wait_fd(URLContext *h, int eid, int fd, int write) +static int libsrt_network_wait_fd(int fd, int write, void *ctx) { int ret, len = 1, errlen = 1; int modes = SRT_EPOLL_ERR | (write ? SRT_EPOLL_OUT : SRT_EPOLL_IN); SRTSOCKET ready[1]; SRTSOCKET error[1]; + URLContext *h = ctx; + int eid = ((SRTContext*)h->priv_data)->eid; if (srt_epoll_add_usock(eid, fd, &modes) < 0) return libsrt_neterrno(h); @@ -191,29 +193,16 @@ static int libsrt_network_wait_fd(URLContext *h, int eid, int fd, int write) return ret; } -/* TODO de-duplicate code from ff_network_wait_fd_timeout() */ - -static int libsrt_network_wait_fd_timeout(URLContext *h, int eid, int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb) +static int libsrt_network_wait_fd_timeout(URLContext *h, int fd, int write, int64_t timeout) { - int ret; - int64_t wait_start = 0; - - while (1) { - if (ff_check_interrupt(int_cb)) - return AVERROR_EXIT; - ret = libsrt_network_wait_fd(h, 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); - } - } + struct NetworkWaitFdCB wait_cb = { + .wait_fd = libsrt_network_wait_fd, + .opaque = h + }; + return ff_network_wait_fd_timeout(fd, write, timeout, &h->interrupt_callback, &wait_cb); } -static int libsrt_listen(int eid, int fd, const struct sockaddr *addr, socklen_t addrlen, URLContext *h, int64_t timeout) +static int libsrt_listen(int fd, const struct sockaddr *addr, socklen_t addrlen, URLContext *h, int64_t timeout) { int ret; int reuse = 1; @@ -228,7 +217,7 @@ static int libsrt_listen(int eid, int fd, const struct sockaddr *addr, socklen_t if (ret) return libsrt_neterrno(h); - ret = libsrt_network_wait_fd_timeout(h, eid, fd, 1, timeout, &h->interrupt_callback); + ret = libsrt_network_wait_fd_timeout(h, fd, 1, timeout); if (ret < 0) return ret; @@ -241,7 +230,7 @@ static int libsrt_listen(int eid, int fd, const struct sockaddr *addr, socklen_t return ret; } -static int libsrt_listen_connect(int eid, int fd, const struct sockaddr *addr, socklen_t addrlen, int64_t timeout, URLContext *h, int will_try_next) +static int libsrt_listen_connect(int fd, const struct sockaddr *addr, socklen_t addrlen, int64_t timeout, URLContext *h, int will_try_next) { int ret; @@ -249,7 +238,7 @@ static int libsrt_listen_connect(int eid, int fd, const struct sockaddr *addr, s if (ret < 0) return libsrt_neterrno(h); - ret = libsrt_network_wait_fd_timeout(h, eid, fd, 1, timeout, &h->interrupt_callback); + ret = libsrt_network_wait_fd_timeout(h, fd, 1, timeout); if (ret < 0) { if (will_try_next) { av_log(h, AV_LOG_WARNING, @@ -438,7 +427,7 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags) if (s->mode == SRT_MODE_LISTENER) { // multi-client - if ((ret = libsrt_listen(s->eid, fd, cur_ai->ai_addr, cur_ai->ai_addrlen, h, s->listen_timeout)) < 0) + if ((ret = libsrt_listen(fd, cur_ai->ai_addr, cur_ai->ai_addrlen, h, s->listen_timeout)) < 0) goto fail1; listen_fd = fd; fd = ret; @@ -449,7 +438,7 @@ static int libsrt_setup(URLContext *h, const char *uri, int flags) goto fail1; } - if ((ret = libsrt_listen_connect(s->eid, fd, cur_ai->ai_addr, cur_ai->ai_addrlen, + if ((ret = libsrt_listen_connect(fd, cur_ai->ai_addr, cur_ai->ai_addrlen, open_timeout, h, !!cur_ai->ai_next)) < 0) { if (ret == AVERROR_EXIT) goto fail1; @@ -652,7 +641,7 @@ static int libsrt_read(URLContext *h, uint8_t *buf, int size) int ret; if (!(h->flags & AVIO_FLAG_NONBLOCK)) { - ret = libsrt_network_wait_fd_timeout(h, s->eid, s->fd, 0, h->rw_timeout, &h->interrupt_callback); + ret = libsrt_network_wait_fd_timeout(h, s->fd, 0, h->rw_timeout); if (ret) return ret; } @@ -671,7 +660,7 @@ static int libsrt_write(URLContext *h, const uint8_t *buf, int size) int ret; if (!(h->flags & AVIO_FLAG_NONBLOCK)) { - ret = libsrt_network_wait_fd_timeout(h, s->eid, s->fd, 1, h->rw_timeout, &h->interrupt_callback); + ret = libsrt_network_wait_fd_timeout(h, s->fd, 1, h->rw_timeout); if (ret) return ret; }