From patchwork Mon Feb 8 03:04:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 25491 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 C77424498BB for ; Mon, 8 Feb 2021 05:04:36 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9B64768814C; Mon, 8 Feb 2021 05:04:36 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from qq.com (out203-205-251-27.mail.qq.com [203.205.251.27]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 82151687F30 for ; Mon, 8 Feb 2021 05:04:28 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1612753463; bh=GmaqDpICzge9ceuglXnJBOyHtU43Iz6RxqyqOwjXOpg=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=xqDleOq2j6yTOIm4HSlfwyDWry80/zrGCkRMdxil2w+05G6Nl/eUC65YHzeM2zxKK r+xXQsT2Ic6lgzdZNjmHWlQQCKcLLV7xLuN9y2iIBSlEQkaXTaZB9QA3QoIGvmENDx QjX6qdbaqLTpmIvk48GFhzcRuTQxgqrp8PP4M7sg= Received: from ZHILIZHAO-MB2.tencent.com ([59.37.125.48]) by newxmesmtplogicsvrsza7.qq.com (NewEsmtp) with SMTP id 1131A01A; Mon, 08 Feb 2021 11:04:19 +0800 X-QQ-mid: xmsmtpt1612753459tkejcinn1 Message-ID: X-QQ-XMAILINFO: MX5dV5qpPIvuWfFkGjch1kC9/65HoB6DnjIyf9CvUa/icEgWEl5cxMyYI5XbeC ppueIztKT0q46kqSz0wP/sve4RvuRyH/2PB7umpjfJylCdO3OPc/0FG06oIvh3JaguJ1c6Ec9qWI eotJKDfNBT+sfTsnWQc8DII2XtSr6WQS/55ft1FFmhDgRcMr1/mbb0aFCQd1ooTOjt51A9gK4FWu HduZ1fHJms86o+8OYH4OKs7/Itjaw4TXhZA2XUcVEbUa5YPOQjEz9BVSmMc4Kvy5YDDv3VAPiMKB ZgvV9DFcVspdpDrcztgO32+4uAOjjpVOb3iRjWfPlr8DNm2Jnkik+jePJQN04HD9ZBLfTJYh8571 7NxgUiN2ilP/GRz+f1jbZRZO0mpcSn1iqWuqjQRO+gE6bptKxhRY7p4RtlZxOI9y3Ij6U0sZReog mii5Mw0aqCnkF9Js/Vlf4+dDimBfRttPy3aK1VA2OI8BjHV/PUQu81trJY+b0i7HGZ2uNcH+0Qez BVcHxHravMSKbdA2xjAbduyin8dTiQtY2IfrrCCyHNHIx1OR88zN3P3fT+MUo5KHB2DSIAFBLxAJ LkRuJ5294rANhSOebpwwkWlX/b1P9DmHVpEcmOr3JKQAyyAuODSo7ai+agD3czeu6BQ/hDJWDeqy shriOBD3RXoPRVTWZwkahl6zfgcWztt8sfhLs8jaYArzqDbU6zfF4DZWTQ10Y1j4xEwBsZVOVvYw oppFwgUh+o/B1f12dl5Hg+oIj0BUlVHnUtdJLHuHEXm4ZaQSh0q6hpoNRBWAlD6HZdAX4EQNvPK1 MhQZWpJfyzZoFCL/NYu9umIibEFg+ymCs= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Feb 2021 11:04:15 +0800 X-OQ-MSGID: <20210208030416.83468-1-quinkblack@foxmail.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 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; }