[FFmpeg-devel] [PATCHv8] libavcodec: v4l2: add support for v4l2 mem2mem codecs
wm4
nfxjfg at googlemail.com
Tue Sep 5 11:27:30 EEST 2017
On Tue, 5 Sep 2017 10:03:49 +0200
Jorge Ramirez <jorge.ramirez-ortiz at linaro.org> wrote:
> On 09/05/2017 09:16 AM, Jorge Ramirez wrote:
> > On 09/05/2017 12:16 AM, Mark Thompson wrote:
> >> On 04/09/17 22:55, Jorge Ramirez wrote:
> >>> On 09/04/2017 11:29 PM, Mark Thompson wrote:
> >>>>> ... stuff ...
> >>>> So the sequence of calls is:
> >>>>
> >>>> send_frame(frame 0) -> success
> >>>> receive_packet() -> EAGAIN
> >>>> send_frame(frame 1) -> success
> >>>> receive_packet() -> EAGAIN
> >>>> ...
> >>>> send_frame(frame 15) -> success
> >>>> receive_packet() -> EAGAIN
> >>>> send_frame(frame 16) -> success
> >>>> receive_packet() -> packet 0
> >>>> receive_packet() -> packet 1
> >>>> ...
> >>>> receive_packet() -> packet 15
> >>>> receive_packet() -> packet 16
> >>>> receive_packet() -> blocks
> >>>>
> >>>> This appears correct to me - since EAGAIN has not been returned by
> >>>> a receive_packet() call, it can be called again repeatedly (as
> >>>> documented in avcodec.h). Do you disagree?
> >>> I would have expected that after a packet is received, a new frame
> >>> is enqueued instead of executing again receive_packet (why do we
> >>> that? what is the benefit?)
> >>> under these circumsntances I can't block in receive_packet blindly,
> >>> I have to track in user-space what the driver has in its guts and
> >>> predict how much it needs to keep working....I dont think it is a
> >>> good idea.
> >> Feel free to submit a patch to avcodec.h which changes the definition
> >> of the API.
> >
> > no, that is ok. I can work around it easily (maybe v4l2 has special
> > needs compared to the rest of ffmpeg)
> >
> >>
> >>>> I think that the problem is that you are only polling on the frame
> >>>> buffer queue when blocking, so you don't see the packet buffers
> >>>> becoming free in the packet buffer queue - if you did see and
> >>>> dequeue them, you would then return EAGAIN to indicate that more
> >>>> input is needed. (See comments in
> >>>> <e4c6a8d7-798a-dfdb-b748-42936e944829 at jkqxz.net>.)
> >>> I could manually track it that way with additional counters - so
> >>> before blocking I could see count many frames are enqueued in the
> >>> input and if there is not at least one I could just return EAGAIN.
> >>> but the behaviour differs from encoding.
> >> The behaviour is identical. You return the output buffer if there is
> >> one available on the output queue, otherwise you return EAGAIN if
> >> there is any space on the input queue, otherwise you block waiting
> >> for either of those to become possible.
> >
>
>
> I made some modifications to the way I was dequeuing buffers so now it
> polls for both input and output queues. you were right, things work much
> smoother this way...thanks.
>
> having said that I still I find the encoding API wrongly defined (no
> need for two calls that are in fact highly couple to each other in my
> opinion)
The encoding API works exactly the same way as the decoding API, just
that the decoding API has an helper internally that makes it easier to
merge send/receive into 1 function. You could do the same on the
encoding side.
Other than that, the API is meant for single-threaded use, so we can't
do things like randomly blocking calls and requiring reentrant calls
from other threads to unblock them.
More information about the ffmpeg-devel
mailing list