Hi Jean-Michel, On Thu, 2017-03-02 at 11:02 +0100, Jean-Michel Hautbois wrote: > Hi Philipp, > > 2017-03-02 10:51 GMT+01:00 Philipp Zabel <p.za...@pengutronix.de>: > > There is no need to call v4l2_m2m_try_schedule to kick off draining the > > bitstream buffer for the encoder, but we have to wake up the destination > > queue in case there are no new OUTPUT buffers to be encoded and userspace > > is already polling for new CAPTURE buffers. > > > > Signed-off-by: Philipp Zabel <p.za...@pengutronix.de> > > --- > > drivers/media/platform/coda/coda-common.c | 47 > > +++++++++++++++++++++++++++++++ > > 1 file changed, 47 insertions(+) > > > > diff --git a/drivers/media/platform/coda/coda-common.c > > b/drivers/media/platform/coda/coda-common.c > > index e1a2e8c70db01..085bbdb0d361b 100644 > > --- a/drivers/media/platform/coda/coda-common.c > > +++ b/drivers/media/platform/coda/coda-common.c > > @@ -881,6 +881,47 @@ static int coda_g_selection(struct file *file, void > > *fh, > > return 0; > > } > > > > +static int coda_try_encoder_cmd(struct file *file, void *fh, > > + struct v4l2_encoder_cmd *ec) > > +{ > > + if (ec->cmd != V4L2_ENC_CMD_STOP) > > + return -EINVAL; > > + > > + if (ec->flags & V4L2_ENC_CMD_STOP_AT_GOP_END) > > + return -EINVAL; > > + > > + return 0; > > +} > > + > > +static int coda_encoder_cmd(struct file *file, void *fh, > > + struct v4l2_encoder_cmd *ec) > > +{ > > + struct coda_ctx *ctx = fh_to_ctx(fh); > > + struct vb2_queue *dst_vq; > > + int ret; > > + > > + ret = coda_try_encoder_cmd(file, fh, ec); > > + if (ret < 0) > > + return ret; > > + > > + /* Ignore encoder stop command silently in decoder context */ > > + if (ctx->inst_type != CODA_INST_ENCODER) > > + return 0; > > + > > + /* Set the stream-end flag on this context */ > > + ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG; > > Why aren't you calling coda_bit_stream_end_flag() ?
Because that additionally does: /* If this context is currently running, update the hardware flag */ if ((dev->devtype->product == CODA_960) && coda_isbusy(dev) && (ctx->idx == coda_read(dev, CODA_REG_BIT_RUN_INDEX))) { coda_write(dev, ctx->bit_stream_param, CODA_REG_BIT_BIT_STREAM_PARAM); } to kick a potentially hanging decode picture run. This is unnecessary in the encoder case. We only need the flag set to make coda_buf_is_end_of_stream return true and thereby make coda_m2m_buf_done set the V4L2_BUF_FLAG_LAST on the buffer and emit the EOS event. regards Philipp