media: rockchip: vicap: hdr buffer sync detect by fe timestamp

Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
Change-Id: I96b8c45c716b0c55015ccad5fc577c176229bf5b
This commit is contained in:
Zefa Chen
2023-03-28 20:47:24 +08:00
parent ea2f26927f
commit c49ee74470
2 changed files with 17 additions and 10 deletions

View File

@@ -1538,9 +1538,9 @@ static void rkcif_rdbk_frame_end_toisp(struct rkcif_stream *stream,
dev->rdbk_rx_buf[RDBK_L] &&
dev->rdbk_rx_buf[RDBK_M] &&
dev->rdbk_rx_buf[RDBK_S]) {
l_ts = dev->rdbk_rx_buf[RDBK_L]->dbufs.timestamp;
m_ts = dev->rdbk_rx_buf[RDBK_M]->dbufs.timestamp;
s_ts = dev->rdbk_rx_buf[RDBK_S]->dbufs.timestamp;
l_ts = dev->rdbk_rx_buf[RDBK_L]->fe_timestamp;
m_ts = dev->rdbk_rx_buf[RDBK_M]->fe_timestamp;
s_ts = dev->rdbk_rx_buf[RDBK_S]->fe_timestamp;
if (m_ts < l_ts || s_ts < m_ts) {
v4l2_err(&dev->v4l2_dev,
@@ -1580,8 +1580,8 @@ static void rkcif_rdbk_frame_end_toisp(struct rkcif_stream *stream,
dev->rdbk_rx_buf[RDBK_S] = NULL;
} else if (dev->hdr.hdr_mode == HDR_X2 &&
dev->rdbk_rx_buf[RDBK_L] && dev->rdbk_rx_buf[RDBK_M]) {
l_ts = dev->rdbk_rx_buf[RDBK_L]->dbufs.timestamp;
s_ts = dev->rdbk_rx_buf[RDBK_M]->dbufs.timestamp;
l_ts = dev->rdbk_rx_buf[RDBK_L]->fe_timestamp;
s_ts = dev->rdbk_rx_buf[RDBK_M]->fe_timestamp;
if (s_ts < l_ts) {
v4l2_err(&dev->v4l2_dev,
@@ -1728,6 +1728,7 @@ static int rkcif_assign_new_buffer_update_toisp(struct rkcif_stream *stream,
active_buf->dbufs.is_first = true;
active_buf->dbufs.sequence = stream->frame_idx - 1;
active_buf->dbufs.timestamp = stream->readout.fs_timestamp;
active_buf->fe_timestamp = ktime_get_ns();
stream->last_frame_idx = stream->frame_idx;
if (dev->hdr.hdr_mode == NO_HDR)
rkcif_s_rx_buffer(dev, &active_buf->dbufs);
@@ -1756,6 +1757,7 @@ static int rkcif_assign_new_buffer_update_toisp(struct rkcif_stream *stream,
active_buf->dbufs.is_first = true;
active_buf->dbufs.sequence = stream->frame_idx - 1;
active_buf->dbufs.timestamp = stream->readout.fs_timestamp;
active_buf->fe_timestamp = ktime_get_ns();
stream->last_frame_idx = stream->frame_idx;
if (dev->hdr.hdr_mode == NO_HDR)
rkcif_s_rx_buffer(dev, &active_buf->dbufs);
@@ -1804,6 +1806,7 @@ static int rkcif_assign_new_buffer_update_toisp(struct rkcif_stream *stream,
active_buf->dbufs.is_first = true;
active_buf->dbufs.sequence = stream->frame_idx - 1;
active_buf->dbufs.timestamp = stream->readout.fs_timestamp;
active_buf->fe_timestamp = ktime_get_ns();
stream->last_frame_idx = stream->frame_idx;
if (dev->hdr.hdr_mode == NO_HDR)
rkcif_s_rx_buffer(dev, &active_buf->dbufs);
@@ -7683,9 +7686,9 @@ static void rkcif_rdbk_frame_end(struct rkcif_stream *stream)
if (dev->rdbk_buf[RDBK_L] &&
dev->rdbk_buf[RDBK_M] &&
dev->rdbk_buf[RDBK_S]) {
l_ts = dev->rdbk_buf[RDBK_L]->vb.vb2_buf.timestamp;
m_ts = dev->rdbk_buf[RDBK_M]->vb.vb2_buf.timestamp;
s_ts = dev->rdbk_buf[RDBK_S]->vb.vb2_buf.timestamp;
l_ts = dev->rdbk_buf[RDBK_L]->fe_timestamp;
m_ts = dev->rdbk_buf[RDBK_M]->fe_timestamp;
s_ts = dev->rdbk_buf[RDBK_S]->fe_timestamp;
if (m_ts < l_ts || s_ts < m_ts) {
v4l2_err(&dev->v4l2_dev,
@@ -7745,8 +7748,8 @@ static void rkcif_rdbk_frame_end(struct rkcif_stream *stream)
}
} else if (dev->hdr.hdr_mode == HDR_X2) {
if (dev->rdbk_buf[RDBK_L] && dev->rdbk_buf[RDBK_M]) {
l_ts = dev->rdbk_buf[RDBK_L]->vb.vb2_buf.timestamp;
s_ts = dev->rdbk_buf[RDBK_M]->vb.vb2_buf.timestamp;
l_ts = dev->rdbk_buf[RDBK_L]->fe_timestamp;
s_ts = dev->rdbk_buf[RDBK_M]->fe_timestamp;
if (s_ts < l_ts) {
v4l2_err(&dev->v4l2_dev,
@@ -7853,6 +7856,7 @@ static void rkcif_buf_done_prepare(struct rkcif_stream *stream,
vb_done = &active_buf->vb;
vb_done->vb2_buf.timestamp = stream->readout.fs_timestamp;
vb_done->sequence = stream->frame_idx - 1;
active_buf->fe_timestamp = ktime_get_ns();
if (stream->is_line_wake_up) {
spin_lock_irqsave(&stream->fps_lock, flags);
if (mode)
@@ -8080,6 +8084,7 @@ static void rkcif_line_wake_up_rdbk(struct rkcif_stream *stream, int mipi_id)
spin_unlock_irqrestore(&stream->vbq_lock, flags);
active_buf->dbufs.sequence = stream->frame_idx - 1;
active_buf->dbufs.timestamp = stream->readout.fs_timestamp;
active_buf->fe_timestamp = ktime_get_ns();
stream->last_frame_idx = stream->frame_idx;
if (stream->cifdev->hdr.hdr_mode == NO_HDR)
rkcif_s_rx_buffer(stream->cifdev, &active_buf->dbufs);

View File

@@ -188,6 +188,7 @@ struct rkcif_buffer {
void *vaddr[VIDEO_MAX_PLANES];
};
struct dma_buf *dbuf;
u64 fe_timestamp;
};
struct rkcif_tools_buffer {
@@ -443,6 +444,7 @@ struct rkcif_rx_buffer {
struct rkisp_rx_buf dbufs;
struct rkcif_dummy_buffer dummy;
struct rkisp_thunderboot_shmem shmem;
u64 fe_timestamp;
};
enum rkcif_dma_en_mode {