Hi Junghak,
On 10/16/2015 15:27, Junghak Sung wrote:
> Replace v4l2-stuffs with common things in struct vb2_fileio_data and
> vb2_thread().
>
> Signed-off-by: Junghak Sung <[email protected]>
> Signed-off-by: Geunyoung Kim <[email protected]>
> Acked-by: Seung-Woo Kim <[email protected]>
> Acked-by: Inki Dae <[email protected]>
> ---
> drivers/media/v4l2-core/videobuf2-v4l2.c | 113
> +++++++++++++++---------------
> 1 file changed, 58 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/videobuf2-v4l2.c
> b/drivers/media/v4l2-core/videobuf2-v4l2.c
> index dabcb6d..ea5ab37 100644
> --- a/drivers/media/v4l2-core/videobuf2-v4l2.c
> +++ b/drivers/media/v4l2-core/videobuf2-v4l2.c
> @@ -882,6 +882,15 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file
> *file, poll_table *wait)
> }
> EXPORT_SYMBOL_GPL(vb2_poll);
>
> +static void vb2_get_timestamp(struct timeval *tv)
> +{
> + struct timespec ts;
> +
> + ktime_get_ts(&ts);
> + tv->tv_sec = ts.tv_sec;
> + tv->tv_usec = ts.tv_nsec / NSEC_PER_USEC;
> +}
This isn't necessary after we switch to u64 for the timestamp. We can just call
ktime_get_ns() without
introducing a new function.
Regards,
Hans
> +
> /**
> * struct vb2_fileio_buf - buffer context used by file io emulator
> *
> @@ -921,9 +930,10 @@ struct vb2_fileio_buf {
> * or write function.
> */
> struct vb2_fileio_data {
> - struct v4l2_requestbuffers req;
> - struct v4l2_plane p;
> - struct v4l2_buffer b;
> + unsigned int count;
> + unsigned int type;
> + unsigned int memory;
> + struct vb2_buffer *b;
> struct vb2_fileio_buf bufs[VB2_MAX_FRAME];
> unsigned int cur_index;
> unsigned int initial_index;
> @@ -976,6 +986,10 @@ static int __vb2_init_fileio(struct vb2_queue *q, int
> read)
> if (fileio == NULL)
> return -ENOMEM;
>
> + fileio->b = kzalloc(q->buf_struct_size, GFP_KERNEL);
> + if (fileio->b == NULL)
> + return -ENOMEM;
> +
> fileio->read_once = q->fileio_read_once;
> fileio->write_immediately = q->fileio_write_immediately;
>
> @@ -983,11 +997,11 @@ static int __vb2_init_fileio(struct vb2_queue *q, int
> read)
> * Request buffers and use MMAP type to force driver
> * to allocate buffers by itself.
> */
> - fileio->req.count = count;
> - fileio->req.memory = VB2_MEMORY_MMAP;
> - fileio->req.type = q->type;
> + fileio->count = count;
> + fileio->memory = VB2_MEMORY_MMAP;
> + fileio->type = q->type;
> q->fileio = fileio;
> - ret = vb2_core_reqbufs(q, fileio->req.memory, &fileio->req.count);
> + ret = vb2_core_reqbufs(q, fileio->memory, &fileio->count);
> if (ret)
> goto err_kfree;
>
> @@ -1016,24 +1030,17 @@ static int __vb2_init_fileio(struct vb2_queue *q, int
> read)
> * Read mode requires pre queuing of all buffers.
> */
> if (read) {
> - bool is_multiplanar = q->is_multiplanar;
> -
> /*
> * Queue all buffers.
> */
> for (i = 0; i < q->num_buffers; i++) {
> - struct v4l2_buffer *b = &fileio->b;
> + struct vb2_buffer *b = fileio->b;
>
> - memset(b, 0, sizeof(*b));
> + memset(b, 0, q->buf_struct_size);
> b->type = q->type;
> - if (is_multiplanar) {
> - memset(&fileio->p, 0, sizeof(fileio->p));
> - b->m.planes = &fileio->p;
> - b->length = 1;
> - }
> b->memory = q->memory;
> b->index = i;
> - ret = vb2_internal_qbuf(q, b);
> + ret = vb2_core_qbuf(q, i, b);
> if (ret)
> goto err_reqbufs;
> fileio->bufs[i].queued = 1;
> @@ -1056,8 +1063,8 @@ static int __vb2_init_fileio(struct vb2_queue *q, int
> read)
> return ret;
>
> err_reqbufs:
> - fileio->req.count = 0;
> - vb2_core_reqbufs(q, fileio->req.memory, &fileio->req.count);
> + fileio->count = 0;
> + vb2_core_reqbufs(q, fileio->memory, &fileio->count);
>
> err_kfree:
> q->fileio = NULL;
> @@ -1076,8 +1083,9 @@ static int __vb2_cleanup_fileio(struct vb2_queue *q)
> if (fileio) {
> vb2_core_streamoff(q, q->type);
> q->fileio = NULL;
> - fileio->req.count = 0;
> - vb2_reqbufs(q, &fileio->req);
> + fileio->count = 0;
> + vb2_core_reqbufs(q, fileio->memory, &fileio->count);
> + kfree(fileio->b);
> kfree(fileio);
> dprintk(3, "file io emulator closed\n");
> }
> @@ -1130,24 +1138,21 @@ static size_t __vb2_perform_fileio(struct vb2_queue
> *q, char __user *data, size_
> */
> index = fileio->cur_index;
> if (index >= q->num_buffers) {
> + struct vb2_buffer *b = fileio->b;
> +
> /*
> * Call vb2_dqbuf to get buffer back.
> */
> - memset(&fileio->b, 0, sizeof(fileio->b));
> - fileio->b.type = q->type;
> - fileio->b.memory = q->memory;
> - if (is_multiplanar) {
> - memset(&fileio->p, 0, sizeof(fileio->p));
> - fileio->b.m.planes = &fileio->p;
> - fileio->b.length = 1;
> - }
> - ret = vb2_internal_dqbuf(q, &fileio->b, nonblock);
> + memset(b, 0, q->buf_struct_size);
> + b->type = q->type;
> + b->memory = q->memory;
> + ret = vb2_core_dqbuf(q, b, nonblock);
> dprintk(5, "vb2_dqbuf result: %d\n", ret);
> if (ret)
> return ret;
> fileio->dq_count += 1;
>
> - fileio->cur_index = index = fileio->b.index;
> + fileio->cur_index = index = b->index;
> buf = &fileio->bufs[index];
>
> /*
> @@ -1159,8 +1164,8 @@ static size_t __vb2_perform_fileio(struct vb2_queue *q,
> char __user *data, size_
> : vb2_plane_size(q->bufs[index], 0);
> /* Compensate for data_offset on read in the multiplanar case.
> */
> if (is_multiplanar && read &&
> - fileio->b.m.planes[0].data_offset < buf->size) {
> - buf->pos = fileio->b.m.planes[0].data_offset;
> + b->planes[0].data_offset < buf->size) {
> + buf->pos = b->planes[0].data_offset;
> buf->size -= buf->pos;
> }
> } else {
> @@ -1199,6 +1204,8 @@ static size_t __vb2_perform_fileio(struct vb2_queue *q,
> char __user *data, size_
> * Queue next buffer if required.
> */
> if (buf->pos == buf->size || (!read && fileio->write_immediately)) {
> + struct vb2_buffer *b = fileio->b;
> +
> /*
> * Check if this is the last buffer to read.
> */
> @@ -1210,20 +1217,15 @@ static size_t __vb2_perform_fileio(struct vb2_queue
> *q, char __user *data, size_
> /*
> * Call vb2_qbuf and give buffer to the driver.
> */
> - memset(&fileio->b, 0, sizeof(fileio->b));
> - fileio->b.type = q->type;
> - fileio->b.memory = q->memory;
> - fileio->b.index = index;
> - fileio->b.bytesused = buf->pos;
> - if (is_multiplanar) {
> - memset(&fileio->p, 0, sizeof(fileio->p));
> - fileio->p.bytesused = buf->pos;
> - fileio->b.m.planes = &fileio->p;
> - fileio->b.length = 1;
> - }
> + memset(b, 0, q->buf_struct_size);
> + b->type = q->type;
> + b->memory = q->memory;
> + b->index = index;
> + b->planes[0].bytesused = buf->pos;
> +
> if (set_timestamp)
> - v4l2_get_timestamp(&fileio->b.timestamp);
> - ret = vb2_internal_qbuf(q, &fileio->b);
> + vb2_get_timestamp(&b->timestamp);
> + ret = vb2_core_qbuf(q, index, b);
> dprintk(5, "vb2_dbuf result: %d\n", ret);
> if (ret)
> return ret;
> @@ -1300,20 +1302,21 @@ static int vb2_thread(void *data)
>
> for (;;) {
> struct vb2_buffer *vb;
> + struct vb2_buffer *b = fileio->b;
>
> /*
> * Call vb2_dqbuf to get buffer back.
> */
> - memset(&fileio->b, 0, sizeof(fileio->b));
> - fileio->b.type = q->type;
> - fileio->b.memory = q->memory;
> + memset(b, 0, q->buf_struct_size);
> + b->type = q->type;
> + b->memory = q->memory;
> if (prequeue) {
> - fileio->b.index = index++;
> + b->index = index++;
> prequeue--;
> } else {
> call_void_qop(q, wait_finish, q);
> if (!threadio->stop)
> - ret = vb2_internal_dqbuf(q, &fileio->b, 0);
> + ret = vb2_core_dqbuf(q, b, 0);
> call_void_qop(q, wait_prepare, q);
> dprintk(5, "file io: vb2_dqbuf result: %d\n", ret);
> }
> @@ -1321,15 +1324,15 @@ static int vb2_thread(void *data)
> break;
> try_to_freeze();
>
> - vb = q->bufs[fileio->b.index];
> - if (!(fileio->b.flags & V4L2_BUF_FLAG_ERROR))
> + vb = q->bufs[b->index];
> + if (b->state == VB2_BUF_STATE_DONE)
> if (threadio->fnc(vb, threadio->priv))
> break;
> call_void_qop(q, wait_finish, q);
> if (set_timestamp)
> - v4l2_get_timestamp(&fileio->b.timestamp);
> + vb2_get_timestamp(&b->timestamp);
> if (!threadio->stop)
> - ret = vb2_internal_qbuf(q, &fileio->b);
> + ret = vb2_core_qbuf(q, b->index, b);
> call_void_qop(q, wait_prepare, q);
> if (ret || threadio->stop)
> break;
>
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html