Commit 6998b6fb authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

[media] uvcvideo: Use videobuf2-vmalloc

Replace the current video buffers queue implementation with
videobuf2-vmalloc.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 3d95e932
config USB_VIDEO_CLASS config USB_VIDEO_CLASS
tristate "USB Video Class (UVC)" tristate "USB Video Class (UVC)"
select VIDEOBUF2_VMALLOC
---help--- ---help---
Support for the USB Video Class (UVC). Currently only video Support for the USB Video Class (UVC). Currently only video
input devices, such as webcams, are supported. input devices, such as webcams, are supported.
......
This diff is collapsed.
...@@ -513,10 +513,7 @@ static int uvc_v4l2_release(struct file *file) ...@@ -513,10 +513,7 @@ static int uvc_v4l2_release(struct file *file)
/* Only free resources if this is a privileged handle. */ /* Only free resources if this is a privileged handle. */
if (uvc_has_privileges(handle)) { if (uvc_has_privileges(handle)) {
uvc_video_enable(stream, 0); uvc_video_enable(stream, 0);
uvc_free_buffers(&stream->queue);
if (uvc_free_buffers(&stream->queue) < 0)
uvc_printk(KERN_ERR, "uvc_v4l2_release: Unable to "
"free buffers.\n");
} }
/* Release the file handle. */ /* Release the file handle. */
...@@ -914,19 +911,11 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) ...@@ -914,19 +911,11 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
/* Buffers & streaming */ /* Buffers & streaming */
case VIDIOC_REQBUFS: case VIDIOC_REQBUFS:
{
struct v4l2_requestbuffers *rb = arg;
if (rb->type != stream->type ||
rb->memory != V4L2_MEMORY_MMAP)
return -EINVAL;
if ((ret = uvc_acquire_privileges(handle)) < 0) if ((ret = uvc_acquire_privileges(handle)) < 0)
return ret; return ret;
mutex_lock(&stream->mutex); mutex_lock(&stream->mutex);
ret = uvc_alloc_buffers(&stream->queue, rb->count, ret = uvc_alloc_buffers(&stream->queue, arg);
stream->ctrl.dwMaxVideoFrameSize);
mutex_unlock(&stream->mutex); mutex_unlock(&stream->mutex);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -934,18 +923,13 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) ...@@ -934,18 +923,13 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
if (ret == 0) if (ret == 0)
uvc_dismiss_privileges(handle); uvc_dismiss_privileges(handle);
rb->count = ret;
ret = 0; ret = 0;
break; break;
}
case VIDIOC_QUERYBUF: case VIDIOC_QUERYBUF:
{ {
struct v4l2_buffer *buf = arg; struct v4l2_buffer *buf = arg;
if (buf->type != stream->type)
return -EINVAL;
if (!uvc_has_privileges(handle)) if (!uvc_has_privileges(handle))
return -EBUSY; return -EBUSY;
......
...@@ -467,9 +467,10 @@ static int uvc_video_decode_start(struct uvc_streaming *stream, ...@@ -467,9 +467,10 @@ static int uvc_video_decode_start(struct uvc_streaming *stream,
else else
ktime_get_real_ts(&ts); ktime_get_real_ts(&ts);
buf->buf.sequence = stream->sequence; buf->buf.v4l2_buf.sequence = stream->sequence;
buf->buf.timestamp.tv_sec = ts.tv_sec; buf->buf.v4l2_buf.timestamp.tv_sec = ts.tv_sec;
buf->buf.timestamp.tv_usec = ts.tv_nsec / NSEC_PER_USEC; buf->buf.v4l2_buf.timestamp.tv_usec =
ts.tv_nsec / NSEC_PER_USEC;
/* TODO: Handle PTS and SCR. */ /* TODO: Handle PTS and SCR. */
buf->state = UVC_BUF_STATE_ACTIVE; buf->state = UVC_BUF_STATE_ACTIVE;
...@@ -728,7 +729,7 @@ static void uvc_video_encode_bulk(struct urb *urb, struct uvc_streaming *stream, ...@@ -728,7 +729,7 @@ static void uvc_video_encode_bulk(struct urb *urb, struct uvc_streaming *stream,
if (buf->bytesused == stream->queue.buf_used) { if (buf->bytesused == stream->queue.buf_used) {
stream->queue.buf_used = 0; stream->queue.buf_used = 0;
buf->state = UVC_BUF_STATE_READY; buf->state = UVC_BUF_STATE_READY;
buf->buf.sequence = ++stream->sequence; buf->buf.v4l2_buf.sequence = ++stream->sequence;
uvc_queue_next_buffer(&stream->queue, buf); uvc_queue_next_buffer(&stream->queue, buf);
stream->last_fid ^= UVC_STREAM_FID; stream->last_fid ^= UVC_STREAM_FID;
} }
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/media-device.h> #include <media/media-device.h>
#include <media/v4l2-device.h> #include <media/v4l2-device.h>
#include <media/videobuf2-core.h>
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
* UVC constants * UVC constants
...@@ -319,13 +320,9 @@ enum uvc_buffer_state { ...@@ -319,13 +320,9 @@ enum uvc_buffer_state {
}; };
struct uvc_buffer { struct uvc_buffer {
unsigned long vma_use_count; struct vb2_buffer buf;
struct list_head stream;
/* Touched by interrupt handler. */
struct v4l2_buffer buf;
struct list_head queue; struct list_head queue;
wait_queue_head_t wait;
enum uvc_buffer_state state; enum uvc_buffer_state state;
unsigned int error; unsigned int error;
...@@ -334,24 +331,17 @@ struct uvc_buffer { ...@@ -334,24 +331,17 @@ struct uvc_buffer {
unsigned int bytesused; unsigned int bytesused;
}; };
#define UVC_QUEUE_STREAMING (1 << 0) #define UVC_QUEUE_DISCONNECTED (1 << 0)
#define UVC_QUEUE_DISCONNECTED (1 << 1) #define UVC_QUEUE_DROP_CORRUPTED (1 << 1)
#define UVC_QUEUE_DROP_CORRUPTED (1 << 2)
struct uvc_video_queue { struct uvc_video_queue {
enum v4l2_buf_type type; struct vb2_queue queue;
struct mutex mutex; /* Protects queue */
void *mem;
unsigned int flags; unsigned int flags;
unsigned int count;
unsigned int buf_size;
unsigned int buf_used; unsigned int buf_used;
struct uvc_buffer buffer[UVC_MAX_VIDEO_BUFFERS];
struct mutex mutex; /* protects buffers and mainqueue */
spinlock_t irqlock; /* protects irqqueue */
struct list_head mainqueue; spinlock_t irqlock; /* Protects irqqueue */
struct list_head irqqueue; struct list_head irqqueue;
}; };
...@@ -391,6 +381,7 @@ struct uvc_streaming { ...@@ -391,6 +381,7 @@ struct uvc_streaming {
*/ */
struct mutex mutex; struct mutex mutex;
/* Buffers queue. */
unsigned int frozen : 1; unsigned int frozen : 1;
struct uvc_video_queue queue; struct uvc_video_queue queue;
void (*decode) (struct urb *urb, struct uvc_streaming *video, void (*decode) (struct urb *urb, struct uvc_streaming *video,
...@@ -520,8 +511,8 @@ extern struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id); ...@@ -520,8 +511,8 @@ extern struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id);
extern void uvc_queue_init(struct uvc_video_queue *queue, extern void uvc_queue_init(struct uvc_video_queue *queue,
enum v4l2_buf_type type, int drop_corrupted); enum v4l2_buf_type type, int drop_corrupted);
extern int uvc_alloc_buffers(struct uvc_video_queue *queue, extern int uvc_alloc_buffers(struct uvc_video_queue *queue,
unsigned int nbuffers, unsigned int buflength); struct v4l2_requestbuffers *rb);
extern int uvc_free_buffers(struct uvc_video_queue *queue); extern void uvc_free_buffers(struct uvc_video_queue *queue);
extern int uvc_query_buffer(struct uvc_video_queue *queue, extern int uvc_query_buffer(struct uvc_video_queue *queue,
struct v4l2_buffer *v4l2_buf); struct v4l2_buffer *v4l2_buf);
extern int uvc_queue_buffer(struct uvc_video_queue *queue, extern int uvc_queue_buffer(struct uvc_video_queue *queue,
...@@ -543,7 +534,7 @@ extern unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue, ...@@ -543,7 +534,7 @@ extern unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue,
extern int uvc_queue_allocated(struct uvc_video_queue *queue); extern int uvc_queue_allocated(struct uvc_video_queue *queue);
static inline int uvc_queue_streaming(struct uvc_video_queue *queue) static inline int uvc_queue_streaming(struct uvc_video_queue *queue)
{ {
return queue->flags & UVC_QUEUE_STREAMING; return vb2_is_streaming(&queue->queue);
} }
/* V4L2 interface */ /* V4L2 interface */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment