1#ifndef _UVC_QUEUE_H_ 2#define _UVC_QUEUE_H_ 3 4#ifdef __KERNEL__ 5 6#include <linux/kernel.h> 7#include <linux/poll.h> 8#include <linux/videodev2.h> 9#include <media/videobuf2-core.h> 10 11/* Maximum frame size in bytes, for sanity checking. */ 12#define UVC_MAX_FRAME_SIZE (16*1024*1024) 13/* Maximum number of video buffers. */ 14#define UVC_MAX_VIDEO_BUFFERS 32 15 16/* ------------------------------------------------------------------------ 17 * Structures. 18 */ 19 20enum uvc_buffer_state { 21 UVC_BUF_STATE_IDLE = 0, 22 UVC_BUF_STATE_QUEUED = 1, 23 UVC_BUF_STATE_ACTIVE = 2, 24 UVC_BUF_STATE_DONE = 3, 25 UVC_BUF_STATE_ERROR = 4, 26}; 27 28struct uvc_buffer { 29 struct vb2_buffer buf; 30 struct list_head queue; 31 32 enum uvc_buffer_state state; 33 void *mem; 34 unsigned int length; 35 unsigned int bytesused; 36}; 37 38#define UVC_QUEUE_DISCONNECTED (1 << 0) 39#define UVC_QUEUE_DROP_INCOMPLETE (1 << 1) 40#define UVC_QUEUE_PAUSED (1 << 2) 41 42struct uvc_video_queue { 43 struct vb2_queue queue; 44 45 unsigned int flags; 46 __u32 sequence; 47 48 unsigned int buf_used; 49 50 spinlock_t irqlock; /* Protects flags and irqqueue */ 51 struct list_head irqqueue; 52}; 53 54static inline int uvc_queue_streaming(struct uvc_video_queue *queue) 55{ 56 return vb2_is_streaming(&queue->queue); 57} 58 59int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type, 60 struct mutex *lock); 61 62void uvcg_free_buffers(struct uvc_video_queue *queue); 63 64int uvcg_alloc_buffers(struct uvc_video_queue *queue, 65 struct v4l2_requestbuffers *rb); 66 67int uvcg_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf); 68 69int uvcg_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf); 70 71int uvcg_dequeue_buffer(struct uvc_video_queue *queue, 72 struct v4l2_buffer *buf, int nonblocking); 73 74unsigned int uvcg_queue_poll(struct uvc_video_queue *queue, 75 struct file *file, poll_table *wait); 76 77int uvcg_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma); 78 79#ifndef CONFIG_MMU 80unsigned long uvcg_queue_get_unmapped_area(struct uvc_video_queue *queue, 81 unsigned long pgoff); 82#endif /* CONFIG_MMU */ 83 84void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect); 85 86int uvcg_queue_enable(struct uvc_video_queue *queue, int enable); 87 88struct uvc_buffer *uvcg_queue_next_buffer(struct uvc_video_queue *queue, 89 struct uvc_buffer *buf); 90 91struct uvc_buffer *uvcg_queue_head(struct uvc_video_queue *queue); 92 93#endif /* __KERNEL__ */ 94 95#endif /* _UVC_QUEUE_H_ */ 96 97