This is an automatic generated email to let you know that the following patch 
were queued:

Subject: media: venus: helpers: Done buffers per queue type
Author:  Stanimir Varbanov <stanimir.varba...@linaro.org>
Date:    Tue Mar 31 17:47:38 2020 +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.varba...@linaro.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+hua...@kernel.org>

 drivers/media/platform/qcom/venus/helpers.c | 18 ++++++++++++------
 drivers/media/platform/qcom/venus/helpers.h |  2 +-
 drivers/media/platform/qcom/venus/vdec.c    |  5 ++---
 drivers/media/platform/qcom/venus/venc.c    |  2 +-
 4 files changed, 16 insertions(+), 11 deletions(-)

---

diff --git a/drivers/media/platform/qcom/venus/helpers.c 
b/drivers/media/platform/qcom/venus/helpers.c
index bcc603804041..0143af7822b2 100644
--- a/drivers/media/platform/qcom/venus/helpers.c
+++ b/drivers/media/platform/qcom/venus/helpers.c
@@ -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;
diff --git a/drivers/media/platform/qcom/venus/helpers.h 
b/drivers/media/platform/qcom/venus/helpers.h
index b64875564064..8fbbda12a4fe 100644
--- a/drivers/media/platform/qcom/venus/helpers.h
+++ b/drivers/media/platform/qcom/venus/helpers.h
@@ -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);
diff --git a/drivers/media/platform/qcom/venus/vdec.c 
b/drivers/media/platform/qcom/venus/vdec.c
index e8e1ecf7cf4a..7d093accbd59 100644
--- a/drivers/media/platform/qcom/venus/vdec.c
+++ b/drivers/media/platform/qcom/venus/vdec.c
@@ -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;
diff --git a/drivers/media/platform/qcom/venus/venc.c 
b/drivers/media/platform/qcom/venus/venc.c
index 9981a2a27c90..3d8431dc14c4 100644
--- a/drivers/media/platform/qcom/venus/venc.c
+++ b/drivers/media/platform/qcom/venus/venc.c
@@ -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

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to