Commit 245ede42 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

media: vb2: add vb2_find_timestamp()



Use v4l2_timeval_to_ns instead of timeval_to_ns to ensure that
both kernelspace and userspace will use the same conversion
function.

Next add a new vb2_find_timestamp() function to find buffers
with a specific timestamp.

This function will only look at DEQUEUED and DONE buffers, i.e.
buffers that are already processed.

Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent c2eb8eff
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ static void __copy_timestamp(struct vb2_buffer *vb, const void *pb)
		 * and the timecode field and flag if needed.
		 */
		if (q->copy_timestamp)
			vb->timestamp = timeval_to_ns(&b->timestamp);
			vb->timestamp = v4l2_timeval_to_ns(&b->timestamp);
		vbuf->flags |= b->flags & V4L2_BUF_FLAG_TIMECODE;
		if (b->flags & V4L2_BUF_FLAG_TIMECODE)
			vbuf->timecode = b->timecode;
@@ -589,6 +589,23 @@ static const struct vb2_buf_ops v4l2_buf_ops = {
	.copy_timestamp		= __copy_timestamp,
};

int vb2_find_timestamp(const struct vb2_queue *q, u64 timestamp,
		       unsigned int start_idx)
{
	unsigned int i;

	for (i = start_idx; i < q->num_buffers; i++) {
		struct vb2_buffer *vb = q->bufs[i];

		if ((vb->state == VB2_BUF_STATE_DEQUEUED ||
		     vb->state == VB2_BUF_STATE_DONE) &&
		    vb->timestamp == timestamp)
			return i;
	}
	return -1;
}
EXPORT_SYMBOL_GPL(vb2_find_timestamp);

/*
 * vb2_querybuf() - query video buffer information
 * @q:		videobuf queue
+17 −0
Original line number Diff line number Diff line
@@ -55,6 +55,23 @@ struct vb2_v4l2_buffer {
#define to_vb2_v4l2_buffer(vb) \
	container_of(vb, struct vb2_v4l2_buffer, vb2_buf)

/**
 * vb2_find_timestamp() - Find buffer with given timestamp in the queue
 *
 * @q:		pointer to &struct vb2_queue with videobuf2 queue.
 * @timestamp:	the timestamp to find. Only buffers in state DEQUEUED or DONE
 *		are considered.
 * @start_idx:	the start index (usually 0) in the buffer array to start
 *		searching from. Note that there may be multiple buffers
 *		with the same timestamp value, so you can restart the search
 *		by setting @start_idx to the previously found index + 1.
 *
 * Returns the buffer index of the buffer with the given @timestamp, or
 * -1 if no buffer with @timestamp was found.
 */
int vb2_find_timestamp(const struct vb2_queue *q, u64 timestamp,
		       unsigned int start_idx);

int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b);

/**