|
|
@@ -107,7 +107,7 @@ static int __verify_length(struct vb2_buffer *vb, const struct v4l2_buffer *b)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int __set_timestamp(struct vb2_buffer *vb, const void *pb)
|
|
|
+static int __copy_timestamp(struct vb2_buffer *vb, const void *pb)
|
|
|
{
|
|
|
const struct v4l2_buffer *b = pb;
|
|
|
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
|
|
@@ -118,8 +118,7 @@ static int __set_timestamp(struct vb2_buffer *vb, const void *pb)
|
|
|
* For output buffers copy the timestamp if needed,
|
|
|
* and the timecode field and flag if needed.
|
|
|
*/
|
|
|
- if ((q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) ==
|
|
|
- V4L2_BUF_FLAG_TIMESTAMP_COPY)
|
|
|
+ if (q->copy_timestamp)
|
|
|
vb->timestamp = timeval_to_ns(&b->timestamp);
|
|
|
vbuf->flags |= b->flags & V4L2_BUF_FLAG_TIMECODE;
|
|
|
if (b->flags & V4L2_BUF_FLAG_TIMECODE)
|
|
|
@@ -238,8 +237,7 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, void *pb)
|
|
|
*/
|
|
|
b->flags &= ~V4L2_BUFFER_MASK_FLAGS;
|
|
|
b->flags |= q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK;
|
|
|
- if ((q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) !=
|
|
|
- V4L2_BUF_FLAG_TIMESTAMP_COPY) {
|
|
|
+ if (!q->copy_timestamp) {
|
|
|
/*
|
|
|
* For non-COPY timestamps, drop timestamp source bits
|
|
|
* and obtain the timestamp source from the queue.
|
|
|
@@ -403,8 +401,7 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb,
|
|
|
|
|
|
/* Zero flags that the vb2 core handles */
|
|
|
vbuf->flags = b->flags & ~V4L2_BUFFER_MASK_FLAGS;
|
|
|
- if ((vb->vb2_queue->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) !=
|
|
|
- V4L2_BUF_FLAG_TIMESTAMP_COPY || !V4L2_TYPE_IS_OUTPUT(b->type)) {
|
|
|
+ if (!vb->vb2_queue->copy_timestamp || !V4L2_TYPE_IS_OUTPUT(b->type)) {
|
|
|
/*
|
|
|
* Non-COPY timestamps and non-OUTPUT queues will get
|
|
|
* their timestamp and timestamp source flags from the
|
|
|
@@ -433,7 +430,7 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb,
|
|
|
static const struct vb2_buf_ops v4l2_buf_ops = {
|
|
|
.fill_user_buffer = __fill_v4l2_buffer,
|
|
|
.fill_vb2_buffer = __fill_vb2_buffer,
|
|
|
- .set_timestamp = __set_timestamp,
|
|
|
+ .copy_timestamp = __copy_timestamp,
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -760,6 +757,8 @@ int vb2_queue_init(struct vb2_queue *q)
|
|
|
q->buf_ops = &v4l2_buf_ops;
|
|
|
q->is_multiplanar = V4L2_TYPE_IS_MULTIPLANAR(q->type);
|
|
|
q->is_output = V4L2_TYPE_IS_OUTPUT(q->type);
|
|
|
+ q->copy_timestamp = (q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK)
|
|
|
+ == V4L2_BUF_FLAG_TIMESTAMP_COPY;
|
|
|
|
|
|
return vb2_core_queue_init(q);
|
|
|
}
|
|
|
@@ -1114,12 +1113,10 @@ static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_
|
|
|
bool is_multiplanar = q->is_multiplanar;
|
|
|
/*
|
|
|
* When using write() to write data to an output video node the vb2 core
|
|
|
- * should set timestamps if V4L2_BUF_FLAG_TIMESTAMP_COPY is set. Nobody
|
|
|
+ * should copy timestamps if V4L2_BUF_FLAG_TIMESTAMP_COPY is set. Nobody
|
|
|
* else is able to provide this information with the write() operation.
|
|
|
*/
|
|
|
- bool set_timestamp = !read &&
|
|
|
- (q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) ==
|
|
|
- V4L2_BUF_FLAG_TIMESTAMP_COPY;
|
|
|
+ bool copy_timestamp = !read && q->copy_timestamp;
|
|
|
int ret, index;
|
|
|
|
|
|
dprintk(3, "mode %s, offset %ld, count %zd, %sblocking\n",
|
|
|
@@ -1236,7 +1233,7 @@ static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_
|
|
|
fileio->b.m.planes = &fileio->p;
|
|
|
fileio->b.length = 1;
|
|
|
}
|
|
|
- if (set_timestamp)
|
|
|
+ if (copy_timestamp)
|
|
|
v4l2_get_timestamp(&fileio->b.timestamp);
|
|
|
ret = vb2_internal_qbuf(q, &fileio->b);
|
|
|
dprintk(5, "vb2_dbuf result: %d\n", ret);
|
|
|
@@ -1301,16 +1298,14 @@ static int vb2_thread(void *data)
|
|
|
struct vb2_queue *q = data;
|
|
|
struct vb2_threadio_data *threadio = q->threadio;
|
|
|
struct vb2_fileio_data *fileio = q->fileio;
|
|
|
- bool set_timestamp = false;
|
|
|
+ bool copy_timestamp = false;
|
|
|
int prequeue = 0;
|
|
|
int index = 0;
|
|
|
int ret = 0;
|
|
|
|
|
|
if (q->is_output) {
|
|
|
prequeue = q->num_buffers;
|
|
|
- set_timestamp =
|
|
|
- (q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) ==
|
|
|
- V4L2_BUF_FLAG_TIMESTAMP_COPY;
|
|
|
+ copy_timestamp = q->copy_timestamp;
|
|
|
}
|
|
|
|
|
|
set_freezable();
|
|
|
@@ -1343,7 +1338,7 @@ static int vb2_thread(void *data)
|
|
|
if (threadio->fnc(vb, threadio->priv))
|
|
|
break;
|
|
|
call_void_qop(q, wait_finish, q);
|
|
|
- if (set_timestamp)
|
|
|
+ if (copy_timestamp)
|
|
|
v4l2_get_timestamp(&fileio->b.timestamp);
|
|
|
if (!threadio->stop)
|
|
|
ret = vb2_internal_qbuf(q, &fileio->b);
|