[FFmpeg-devel] [PATCH v4] Add ZeroMQ as protocol option
Marton Balint
cus at passwd.hu
Sat Aug 31 02:48:16 EEST 2019
On Fri, 30 Aug 2019, Andriy Gelman wrote:
> On Thu, 29. Aug 21:01, Marton Balint wrote:
>>
>>
>> On Thu, 29 Aug 2019, Andriy Gelman wrote:
>>
>> > Changes in v4:
>> > - Use polling instead of non-blocking option for socket
>> > read/write operations.
>> > - Added pkt_size, timeout_send, timeout_recv options.
>> > Updated documentation for new options.
>>
>> No, timeout_send and timeout_recv is not needed. The URL context has a
>> timeout parameter.
>>
>> Please see how unix.c or tcp.c does the polling: They both use a helper
>> funciton called ff_network_wait_fd_timeout (implemented in network.c) which
>> does polling in a loop with small timeouts in order to be able to check the
>> interrupt callback. After successful polling you can call the actual
>> transfer function.
>>
>> You should do something similar, copy ff_network_wait_fd_timeout, replace
>> the file descriptor polling with zmq polling and you should be good to go.
>
> Thanks Marton, I've added these changes. I'll send the updated patch shortly.
>
> When working on this new version, I first tried to use the AVIO_FLAG_NONBLOCK
> flag to decide whether to go into a blocking or non-blocking mode.
>
> My intention was to return AVERROR(EAGAIN) when in the non-blocking mode if
> read/write is not available. But avio exits with "Resource temporarily
> unavailable" when AVIO_FLAG_NONBLOCK flag is set and AVERROR(EAGAIN) is
> returned. So probably I've misunderstood the meaning of AVIO_FLAG_NONBLOCK.
> The updated patch is not using this flag.
AVIO_FLAG_NONBLOCK is not heavily used or tested. You can still add
support for it, (if the flag is set then you skip the code where you poll
and if the transfer function returns EAGAIN then you return that as a
special case). I am not sure how you can test it actually.
>
> Another point: the documentation in url.h says:
>
> " * In non-blocking mode, return AVERROR(EAGAIN) immediately.
> * In blocking mode, wait for data/EOF/error with a short timeout (0.1s),
> * and return AVERROR(EAGAIN) on timeout."
>
> But the function ff_network_wait_fd_timeout returns AVERROR(ETIMEDOUT) on
> timeout (causing the code to exit) in blocking mode. It seems to me that either
> the documentation or the return value should be updated. Should I submit a
> separate patch on this?
Yeah, the docs seems inaccurate. I guess the idea was that common code in
avio.c:retry_transfer_wrapper should handle the retries but the common
code has to differentiate between EAGAIN which should be retried
immediately and EAGAIN which should be retried after sleeping a bit. Maybe
we should simply return EINTR for the immediate retry case, because that
already means an immediate retry in retry_transfer_wrapper.
So I guess the docs should be changed to that (yes, submit a separate
patch), and existing protocols should be fixed to return EINTR when the
poll() times out instead of EAGAIN. This way we can reduce the duplicated
code from the protocols. And of course this also means that the zmq
protocol can return EINTR on poll timeout and you can call ff_zmq_wait
instead of ff_zmq_wait_timeout.
Regards,
Marton
More information about the ffmpeg-devel
mailing list