media: venus: dec: Fix handling of the start cmd
authorMichał Krawczyk <mk@semihalf.com>
Mon, 30 Jan 2023 13:54:18 +0000 (13:54 +0000)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Wed, 12 Apr 2023 07:35:44 +0000 (09:35 +0200)
The decoder driver should clear the last_buffer_dequeued flag of the
capture queue upon receiving V4L2_DEC_CMD_START.

The last_buffer_dequeued flag is set upon receiving EOS (which always
happens upon receiving V4L2_DEC_CMD_STOP).

Without this patch, after issuing the V4L2_DEC_CMD_STOP and
V4L2_DEC_CMD_START, the vb2_dqbuf() function will always fail, even if
the buffers are completed by the hardware.

Fixes: beac82904a87 ("media: venus: make decoder compliant with stateful codec API")

Signed-off-by: Michał Krawczyk <mk@semihalf.com>
Signed-off-by: Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/qcom/venus/vdec.c

index d47c220..800dbc4 100644 (file)
@@ -526,6 +526,7 @@ static int
 vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
 {
        struct venus_inst *inst = to_inst(file);
+       struct vb2_queue *dst_vq;
        struct hfi_frame_data fdata = {0};
        int ret;
 
@@ -556,6 +557,13 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
                        inst->codec_state = VENUS_DEC_STATE_DRAIN;
                        inst->drain_active = true;
                }
+       } else if (cmd->cmd == V4L2_DEC_CMD_START &&
+                  inst->codec_state == VENUS_DEC_STATE_STOPPED) {
+               dst_vq = v4l2_m2m_get_vq(inst->fh.m2m_ctx,
+                                        V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
+               vb2_clear_last_buffer_dequeued(dst_vq);
+
+               inst->codec_state = VENUS_DEC_STATE_DECODING;
        }
 
 unlock: