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