OSDN Git Service

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 bcc6038..0143af7 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 b648755..8fbbda1 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 e8e1ecf..7d093ac 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 9981a2a..3d8431d 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