Hi Michael, On Tue, Apr 30, 2019 at 07:34:12PM +0200, Michael Tretter wrote: > On Thu, 24 Jan 2019 19:04:19 +0900, Tomasz Figa wrote: [snip] > > +State machine > > +============= > > + > > +.. kernel-render:: DOT > > + :alt: DOT digraph of encoder state machine > > + :caption: Encoder state machine > > + > > + digraph encoder_state_machine { > > + node [shape = doublecircle, label="Encoding"] Encoding; > > + > > + node [shape = circle, label="Initialization"] Initialization; > > + node [shape = circle, label="Stopped"] Stopped; > > + node [shape = circle, label="Drain"] Drain; > > + node [shape = circle, label="Reset"] Reset; > > + > > + node [shape = point]; qi > > + qi -> Initialization [ label = "open()" ]; > > + > > + Initialization -> Encoding [ label = "Both queues streaming" ]; > > + > > + Encoding -> Drain [ label = "V4L2_DEC_CMD_STOP" ]; > > + Encoding -> Reset [ label = "VIDIOC_STREAMOFF(CAPTURE)" ]; > > + Encoding -> Stopped [ label = "VIDIOC_STREAMOFF(OUTPUT)" ]; > > + Encoding -> Encoding; > > + > > + Drain -> Stopped [ label = "All CAPTURE\nbuffers dequeued\nor\nVIDIOC_STREAMOFF(CAPTURE)" ]; > > Shouldn't this be > > Drain -> Stopped [ label = "All OUTPUT\nbuffers dequeued\nor\nVIDIOC_STREAMOFF(OUTPUT)" ]; > > ? While draining, the encoder continues encoding until all source > buffers, i.e., buffers in the OUTPUT queue, are encoded or STREAMOFF > happens on the OUTPUT queue. At the same time, the client continues to > queue and dequeue buffers on the CAPTURE queue and there might be > buffers queued on the CAPTURE queue even if the driver returned the > buffer with the FLAG_LAST set and returns -EPIPE on further DQBUF > requests. > The STREAMOFF should be on OUTPUT indeed, because that immediately removes any OUTPUT buffers from the queue, so there is nothing to be encoded to wait for anymore. The "All OUTPUT buffers dequeued" part is correct, though. The last OUTPUT buffer in the flush sequence is considered encoded after the application dequeues the corresponding CAPTURE buffer is dequeued and that buffer is marked with the V4L2_BUF_FLAG_LAST flag. Best regards, Tomasz