media: venus: helpers: Done buffers per queue type
authorStanimir Varbanov <stanimir.varbanov@linaro.org>
Tue, 31 Mar 2020 15:47:38 +0000 (17:47 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 5 May 2020 11:04:59 +0000 (13:04 +0200)
Currently calling venus_helper_buffers_done() will return buffers to
user for both capture and output queues in the same call. This is
wrong because both queues are really separate and calling
stop_streaming on one queue shouldn't return buffers for the other.
Solve this by add a new queue type argument and fix the clients of
the helper function.

Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/qcom/venus/helpers.c
drivers/media/platform/qcom/venus/helpers.h
drivers/media/platform/qcom/venus/vdec.c
drivers/media/platform/qcom/venus/venc.c

index bcc60380404123d5b0e07f42f1fed8796f7d2c46..0143af7822b22cce39e57c55cf781178b13af550 100644 (file)
@@ -1129,15 +1129,18 @@ unlock:
 }
 EXPORT_SYMBOL_GPL(venus_helper_vb2_buf_queue);
 
-void venus_helper_buffers_done(struct venus_inst *inst,
+void venus_helper_buffers_done(struct venus_inst *inst, unsigned int type,
                               enum vb2_buffer_state state)
 {
        struct vb2_v4l2_buffer *buf;
 
-       while ((buf = v4l2_m2m_src_buf_remove(inst->m2m_ctx)))
-               v4l2_m2m_buf_done(buf, state);
-       while ((buf = v4l2_m2m_dst_buf_remove(inst->m2m_ctx)))
-               v4l2_m2m_buf_done(buf, state);
+       if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+               while ((buf = v4l2_m2m_src_buf_remove(inst->m2m_ctx)))
+                       v4l2_m2m_buf_done(buf, state);
+       } else if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
+               while ((buf = v4l2_m2m_dst_buf_remove(inst->m2m_ctx)))
+                       v4l2_m2m_buf_done(buf, state);
+       }
 }
 EXPORT_SYMBOL_GPL(venus_helper_buffers_done);
 
@@ -1168,7 +1171,10 @@ void venus_helper_vb2_stop_streaming(struct vb2_queue *q)
                INIT_LIST_HEAD(&inst->registeredbufs);
        }
 
-       venus_helper_buffers_done(inst, VB2_BUF_STATE_ERROR);
+       venus_helper_buffers_done(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
+                                 VB2_BUF_STATE_ERROR);
+       venus_helper_buffers_done(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
+                                 VB2_BUF_STATE_ERROR);
 
        if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
                inst->streamon_out = 0;
index b6487556406481e331b07da93075e546f9dfe41f..8fbbda12a4fe75e4e41dd25b2231f0934fb20b9d 100644 (file)
@@ -14,7 +14,7 @@ struct venus_core;
 bool venus_helper_check_codec(struct venus_inst *inst, u32 v4l2_pixfmt);
 struct vb2_v4l2_buffer *venus_helper_find_buf(struct venus_inst *inst,
                                              unsigned int type, u32 idx);
-void venus_helper_buffers_done(struct venus_inst *inst,
+void venus_helper_buffers_done(struct venus_inst *inst, unsigned int type,
                               enum vb2_buffer_state state);
 int venus_helper_vb2_buf_init(struct vb2_buffer *vb);
 int venus_helper_vb2_buf_prepare(struct vb2_buffer *vb);
index e8e1ecf7cf4a46619e8272a41fd0ca0fdc5c0c30..7d093accbd596e76ec562bd1c2403479f82126a6 100644 (file)
@@ -1044,7 +1044,7 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count)
 put_power:
        vdec_pm_put(inst, false);
 error:
-       venus_helper_buffers_done(inst, VB2_BUF_STATE_QUEUED);
+       venus_helper_buffers_done(inst, q->type, VB2_BUF_STATE_QUEUED);
        mutex_unlock(&inst->lock);
        return ret;
 }
@@ -1071,7 +1071,6 @@ static int vdec_stop_capture(struct venus_inst *inst)
                break;
        case VENUS_DEC_STATE_DRC:
                ret = hfi_session_flush(inst, HFI_FLUSH_OUTPUT);
-               vdec_cancel_dst_buffers(inst);
                inst->codec_state = VENUS_DEC_STATE_CAPTURE_SETUP;
                INIT_LIST_HEAD(&inst->registeredbufs);
                venus_helper_free_dpb_bufs(inst);
@@ -1117,7 +1116,7 @@ static void vdec_stop_streaming(struct vb2_queue *q)
        else
                ret = vdec_stop_output(inst);
 
-       venus_helper_buffers_done(inst, VB2_BUF_STATE_ERROR);
+       venus_helper_buffers_done(inst, q->type, VB2_BUF_STATE_ERROR);
 
        if (ret)
                goto unlock;
index 9981a2a27c90c1d8cb0d756d09f14967c52420fc..3d8431dc14c458f6b9706ad9233c2117becc791b 100644 (file)
@@ -1018,7 +1018,7 @@ static int venc_start_streaming(struct vb2_queue *q, unsigned int count)
 deinit_sess:
        hfi_session_deinit(inst);
 bufs_done:
-       venus_helper_buffers_done(inst, VB2_BUF_STATE_QUEUED);
+       venus_helper_buffers_done(inst, q->type, VB2_BUF_STATE_QUEUED);
        if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
                inst->streamon_out = 0;
        else