diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2014-04-11 03:40:03 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-04-16 17:51:58 -0400 |
commit | 7bb6edd37fc2e56297231cc854d7a17e336590db (patch) | |
tree | 7541ba7ac769c20f05a650d63a69908a22175008 /drivers/media/v4l2-core/videobuf2-core.c | |
parent | 74753cffa6fae399aef0f0a1a3315196e6e339cf (diff) |
[media] vb2: allow read/write as long as the format is single planar
It was impossible to read() or write() a frame if the queue type was multiplanar.
Even if the current format is single planar. Change this to just check whether
the number of planes is 1 or more.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/v4l2-core/videobuf2-core.c')
-rw-r--r-- | drivers/media/v4l2-core/videobuf2-core.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c index b80fd24debfa..4a635c6bb6e1 100644 --- a/drivers/media/v4l2-core/videobuf2-core.c +++ b/drivers/media/v4l2-core/videobuf2-core.c | |||
@@ -2658,6 +2658,7 @@ struct vb2_fileio_buf { | |||
2658 | */ | 2658 | */ |
2659 | struct vb2_fileio_data { | 2659 | struct vb2_fileio_data { |
2660 | struct v4l2_requestbuffers req; | 2660 | struct v4l2_requestbuffers req; |
2661 | struct v4l2_plane p; | ||
2661 | struct v4l2_buffer b; | 2662 | struct v4l2_buffer b; |
2662 | struct vb2_fileio_buf bufs[VIDEO_MAX_FRAME]; | 2663 | struct vb2_fileio_buf bufs[VIDEO_MAX_FRAME]; |
2663 | unsigned int cur_index; | 2664 | unsigned int cur_index; |
@@ -2748,13 +2749,21 @@ static int __vb2_init_fileio(struct vb2_queue *q, int read) | |||
2748 | * Read mode requires pre queuing of all buffers. | 2749 | * Read mode requires pre queuing of all buffers. |
2749 | */ | 2750 | */ |
2750 | if (read) { | 2751 | if (read) { |
2752 | bool is_multiplanar = V4L2_TYPE_IS_MULTIPLANAR(q->type); | ||
2753 | |||
2751 | /* | 2754 | /* |
2752 | * Queue all buffers. | 2755 | * Queue all buffers. |
2753 | */ | 2756 | */ |
2754 | for (i = 0; i < q->num_buffers; i++) { | 2757 | for (i = 0; i < q->num_buffers; i++) { |
2755 | struct v4l2_buffer *b = &fileio->b; | 2758 | struct v4l2_buffer *b = &fileio->b; |
2759 | |||
2756 | memset(b, 0, sizeof(*b)); | 2760 | memset(b, 0, sizeof(*b)); |
2757 | b->type = q->type; | 2761 | b->type = q->type; |
2762 | if (is_multiplanar) { | ||
2763 | memset(&fileio->p, 0, sizeof(fileio->p)); | ||
2764 | b->m.planes = &fileio->p; | ||
2765 | b->length = 1; | ||
2766 | } | ||
2758 | b->memory = q->memory; | 2767 | b->memory = q->memory; |
2759 | b->index = i; | 2768 | b->index = i; |
2760 | ret = vb2_internal_qbuf(q, b); | 2769 | ret = vb2_internal_qbuf(q, b); |
@@ -2822,6 +2831,7 @@ static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_ | |||
2822 | { | 2831 | { |
2823 | struct vb2_fileio_data *fileio; | 2832 | struct vb2_fileio_data *fileio; |
2824 | struct vb2_fileio_buf *buf; | 2833 | struct vb2_fileio_buf *buf; |
2834 | bool is_multiplanar = V4L2_TYPE_IS_MULTIPLANAR(q->type); | ||
2825 | /* | 2835 | /* |
2826 | * When using write() to write data to an output video node the vb2 core | 2836 | * When using write() to write data to an output video node the vb2 core |
2827 | * should set timestamps if V4L2_BUF_FLAG_TIMESTAMP_COPY is set. Nobody | 2837 | * should set timestamps if V4L2_BUF_FLAG_TIMESTAMP_COPY is set. Nobody |
@@ -2861,6 +2871,11 @@ static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_ | |||
2861 | memset(&fileio->b, 0, sizeof(fileio->b)); | 2871 | memset(&fileio->b, 0, sizeof(fileio->b)); |
2862 | fileio->b.type = q->type; | 2872 | fileio->b.type = q->type; |
2863 | fileio->b.memory = q->memory; | 2873 | fileio->b.memory = q->memory; |
2874 | if (is_multiplanar) { | ||
2875 | memset(&fileio->p, 0, sizeof(fileio->p)); | ||
2876 | fileio->b.m.planes = &fileio->p; | ||
2877 | fileio->b.length = 1; | ||
2878 | } | ||
2864 | ret = vb2_internal_dqbuf(q, &fileio->b, nonblock); | 2879 | ret = vb2_internal_dqbuf(q, &fileio->b, nonblock); |
2865 | dprintk(5, "vb2_dqbuf result: %d\n", ret); | 2880 | dprintk(5, "vb2_dqbuf result: %d\n", ret); |
2866 | if (ret) | 2881 | if (ret) |
@@ -2931,6 +2946,12 @@ static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_ | |||
2931 | fileio->b.memory = q->memory; | 2946 | fileio->b.memory = q->memory; |
2932 | fileio->b.index = index; | 2947 | fileio->b.index = index; |
2933 | fileio->b.bytesused = buf->pos; | 2948 | fileio->b.bytesused = buf->pos; |
2949 | if (is_multiplanar) { | ||
2950 | memset(&fileio->p, 0, sizeof(fileio->p)); | ||
2951 | fileio->p.bytesused = buf->pos; | ||
2952 | fileio->b.m.planes = &fileio->p; | ||
2953 | fileio->b.length = 1; | ||
2954 | } | ||
2934 | if (set_timestamp) | 2955 | if (set_timestamp) |
2935 | v4l2_get_timestamp(&fileio->b.timestamp); | 2956 | v4l2_get_timestamp(&fileio->b.timestamp); |
2936 | ret = vb2_internal_qbuf(q, &fileio->b); | 2957 | ret = vb2_internal_qbuf(q, &fileio->b); |