Commit 7e4e7162 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

media: vb2: keep track of timestamp status

If a stream is stopped, or if a USERPTR/DMABUF buffer is queued
backed by a different user address or dmabuf fd, then the timestamp
should be skipped by vb2_find_timestamp since the memory it refers
to is no longer valid.

So keep track of a 'copied_timestamp' state: it is set when the
timestamp is copied from an output to a capture buffer, and is
cleared when it is no longer valid.
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Reviewed-by: default avatarPaul Kocialkowski <paul.kocialkowski@bootlin.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent cfc77408
...@@ -1041,6 +1041,7 @@ static int __prepare_userptr(struct vb2_buffer *vb) ...@@ -1041,6 +1041,7 @@ static int __prepare_userptr(struct vb2_buffer *vb)
if (vb->planes[plane].mem_priv) { if (vb->planes[plane].mem_priv) {
if (!reacquired) { if (!reacquired) {
reacquired = true; reacquired = true;
vb->copied_timestamp = 0;
call_void_vb_qop(vb, buf_cleanup, vb); call_void_vb_qop(vb, buf_cleanup, vb);
} }
call_void_memop(vb, put_userptr, vb->planes[plane].mem_priv); call_void_memop(vb, put_userptr, vb->planes[plane].mem_priv);
...@@ -1165,6 +1166,7 @@ static int __prepare_dmabuf(struct vb2_buffer *vb) ...@@ -1165,6 +1166,7 @@ static int __prepare_dmabuf(struct vb2_buffer *vb)
if (!reacquired) { if (!reacquired) {
reacquired = true; reacquired = true;
vb->copied_timestamp = 0;
call_void_vb_qop(vb, buf_cleanup, vb); call_void_vb_qop(vb, buf_cleanup, vb);
} }
...@@ -1942,6 +1944,7 @@ static void __vb2_queue_cancel(struct vb2_queue *q) ...@@ -1942,6 +1944,7 @@ static void __vb2_queue_cancel(struct vb2_queue *q)
if (vb->request) if (vb->request)
media_request_put(vb->request); media_request_put(vb->request);
vb->request = NULL; vb->request = NULL;
vb->copied_timestamp = 0;
} }
} }
......
...@@ -604,7 +604,8 @@ int vb2_find_timestamp(const struct vb2_queue *q, u64 timestamp, ...@@ -604,7 +604,8 @@ int vb2_find_timestamp(const struct vb2_queue *q, u64 timestamp,
unsigned int i; unsigned int i;
for (i = start_idx; i < q->num_buffers; i++) for (i = start_idx; i < q->num_buffers; i++)
if (q->bufs[i]->timestamp == timestamp) if (q->bufs[i]->copied_timestamp &&
q->bufs[i]->timestamp == timestamp)
return i; return i;
return -1; return -1;
} }
......
...@@ -992,6 +992,7 @@ void v4l2_m2m_buf_copy_metadata(const struct vb2_v4l2_buffer *out_vb, ...@@ -992,6 +992,7 @@ void v4l2_m2m_buf_copy_metadata(const struct vb2_v4l2_buffer *out_vb,
cap_vb->field = out_vb->field; cap_vb->field = out_vb->field;
cap_vb->flags &= ~mask; cap_vb->flags &= ~mask;
cap_vb->flags |= out_vb->flags & mask; cap_vb->flags |= out_vb->flags & mask;
cap_vb->vb2_buf.copied_timestamp = 1;
} }
EXPORT_SYMBOL_GPL(v4l2_m2m_buf_copy_metadata); EXPORT_SYMBOL_GPL(v4l2_m2m_buf_copy_metadata);
......
...@@ -262,6 +262,8 @@ struct vb2_buffer { ...@@ -262,6 +262,8 @@ struct vb2_buffer {
* prepared: this buffer has been prepared, i.e. the * prepared: this buffer has been prepared, i.e. the
* buf_prepare op was called. It is cleared again * buf_prepare op was called. It is cleared again
* after the 'buf_finish' op is called. * after the 'buf_finish' op is called.
* copied_timestamp: the timestamp of this capture buffer was copied
* from an output buffer.
* queued_entry: entry on the queued buffers list, which holds * queued_entry: entry on the queued buffers list, which holds
* all buffers queued from userspace * all buffers queued from userspace
* done_entry: entry on the list that stores all buffers ready * done_entry: entry on the list that stores all buffers ready
...@@ -271,6 +273,7 @@ struct vb2_buffer { ...@@ -271,6 +273,7 @@ struct vb2_buffer {
enum vb2_buffer_state state; enum vb2_buffer_state state;
unsigned int synced:1; unsigned int synced:1;
unsigned int prepared:1; unsigned int prepared:1;
unsigned int copied_timestamp:1;
struct vb2_plane planes[VB2_MAX_PLANES]; struct vb2_plane planes[VB2_MAX_PLANES];
struct list_head queued_entry; struct list_head queued_entry;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment