}
 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);
 
                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;
 
 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);
 
 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;
 }
                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);
        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;
 
 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