aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/v4l2-core/videobuf2-core.c
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2014-04-11 03:40:03 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-04-16 17:51:58 -0400
commit7bb6edd37fc2e56297231cc854d7a17e336590db (patch)
tree7541ba7ac769c20f05a650d63a69908a22175008 /drivers/media/v4l2-core/videobuf2-core.c
parent74753cffa6fae399aef0f0a1a3315196e6e339cf (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.c21
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 */
2659struct vb2_fileio_data { 2659struct 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);