Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1146d1f6 authored by weikao's avatar weikao Committed by Luca Weiss
Browse files

Fix issue "During video recording, still picture captured shows full green screen."

Root cause:
N/A

How to fix:
N/A

Issue:PRJ8901-1488

Change-Id: I482ca772e5bad60e47b06dfb625db1417eba593f
(cherry picked from commit 75bcf6833da5769814e7dfe9547f628cc33fca68)
parent a0bd9ddb
Loading
Loading
Loading
Loading
+60 −0
Original line number Diff line number Diff line
@@ -757,6 +757,65 @@ static int msm_isp_buf_divert(struct msm_isp_buf_mgr *buf_mgr,
	return 0;
}


static int msm_isp_buf_err(struct msm_isp_buf_mgr *buf_mgr,
   uint32_t bufq_handle, uint32_t buf_index,
   struct timeval *tv, uint32_t frame_id, uint32_t output_format)
{
   int rc = 0;
   unsigned long flags;
   struct msm_isp_bufq *bufq = NULL;
   struct msm_isp_buffer *buf_info = NULL;
   enum msm_isp_buffer_state state;

   bufq = msm_isp_get_bufq(buf_mgr, bufq_handle);
   if (!bufq) {
       pr_err("Invalid bufq\n");
       return -EINVAL;
   }

   buf_info = msm_isp_get_buf_ptr(buf_mgr, bufq_handle, buf_index);
   if (!buf_info) {
       pr_err("%s: buf not found\n", __func__);
       return -EINVAL;
   }

   spin_lock_irqsave(&bufq->bufq_lock, flags);
   state = buf_info->state;

   if (BUF_SRC(bufq->stream_id) == MSM_ISP_BUFFER_SRC_HAL) {
       if (state == MSM_ISP_BUFFER_STATE_DEQUEUED) {
           buf_info->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
           spin_unlock_irqrestore(&bufq->bufq_lock, flags);
           buf_mgr->vb2_ops->buf_error(buf_info->vb2_v4l2_buf,
               bufq->session_id, bufq->stream_id,
               frame_id, tv, output_format);
       } else {
           spin_unlock_irqrestore(&bufq->bufq_lock, flags);
       }
       goto done;
   }

   /*
    * For native buffer put the diverted buffer back to queue since caller
    * is not going to send it to CPP, this is error case like
    * drop_frame/empty_buffer
    */
   if (state == MSM_ISP_BUFFER_STATE_DIVERTED) {
       buf_info->state = MSM_ISP_BUFFER_STATE_PREPARED;
       rc = msm_isp_put_buf_unsafe(buf_mgr, buf_info->bufq_handle,
           buf_info->buf_idx);
       if (rc < 0)
           pr_err("%s: Buf put failed\n", __func__);
   }
   spin_unlock_irqrestore(&bufq->bufq_lock, flags);
done:
   return rc;
}




static int msm_isp_buf_done(struct msm_isp_buf_mgr *buf_mgr,
	uint32_t bufq_handle, uint32_t buf_index,
	struct timeval *tv, uint32_t frame_id, uint32_t output_format)
@@ -1505,6 +1564,7 @@ static struct msm_isp_buf_ops isp_buf_ops = {
	.buf_mgr_debug = msm_isp_buf_mgr_debug,
	.get_bufq = msm_isp_get_bufq,
	.buf_divert = msm_isp_buf_divert,
	.buf_err = msm_isp_buf_err,
};

int msm_isp_create_isp_buf_mgr(
+3 −0
Original line number Diff line number Diff line
@@ -180,6 +180,9 @@ struct msm_isp_buf_ops {
	int (*buf_divert)(struct msm_isp_buf_mgr *buf_mgr,
			uint32_t bufq_handle, uint32_t buf_index,
			struct timeval *tv, uint32_t frame_id);
	int (*buf_err)(struct msm_isp_buf_mgr *buf_mgr,
       uint32_t bufq_handle, uint32_t buf_index,
       struct timeval *tv, uint32_t frame_id, uint32_t output_format);
};

struct msm_isp_buf_mgr {
+1 −1
Original line number Diff line number Diff line
@@ -3600,7 +3600,7 @@ static int msm_isp_return_empty_buffer(struct vfe_device *vfe_dev,
	buf->buf_debug.put_state[buf->buf_debug.put_state_last] =
		MSM_ISP_BUFFER_STATE_DROP_REG;
	buf->buf_debug.put_state_last ^= 1;
	rc = vfe_dev->buf_mgr->ops->buf_done(vfe_dev->buf_mgr,
	rc = vfe_dev->buf_mgr->ops->buf_err(vfe_dev->buf_mgr,
		buf->bufq_handle, buf->buf_idx,
		&timestamp.buf_time, frame_id,
		stream_info->runtime_output_format);