[FFmpeg-devel] [PATCH v2 1/2] lavf/network: add wait fd callback to ff_network_wait_fd_timeout
"zhilizhao(赵志立)"
quinkblack at foxmail.com
Mon Mar 1 08:53:33 EET 2021
Ping.
> On Feb 8, 2021, at 11:04 AM, Zhao Zhili <quinkblack at foxmail.com> wrote:
>
> ---
> 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;
> }
> --
> 2.28.0
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list