1 /*
2 # (C) 2008 Hans de Goede <hdegoede@redhat.com>
3
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU Lesser General Public License as published by
6 # the Free Software Foundation; either version 2.1 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
17 */
18
19 #ifndef __LIBV4L2_PRIV_H
20 #define __LIBV4L2_PRIV_H
21
22 #include <stdio.h>
23 #include <pthread.h>
24 #include <libv4lconvert.h> /* includes videodev2.h for us */
25
26 #include "../libv4lconvert/libv4lsyscall-priv.h"
27
28 #define V4L2_MAX_DEVICES 16
29 /* Warning when making this larger the frame_queued and frame_mapped members of
30 the v4l2_dev_info struct can no longer be a bitfield, so the code needs to
31 be adjusted! */
32 #define V4L2_MAX_NO_FRAMES 32
33 #define V4L2_DEFAULT_NREADBUFFERS 4
34 #define V4L2_IGNORE_FIRST_FRAME_ERRORS 3
35 #define V4L2_DEFAULT_FPS 30
36
37 #define V4L2_LOG_ERR(...) \
38 do { \
39 if (v4l2_log_file) { \
40 fprintf(v4l2_log_file, "libv4l2: error " __VA_ARGS__); \
41 fflush(v4l2_log_file); \
42 } else \
43 fprintf(stderr, "libv4l2: error " __VA_ARGS__); \
44 } while (0)
45
46 #define V4L2_PERROR(format, ...) \
47 do { \
48 if (errno == ENODEV) { \
49 devices[index].gone = 1;\
50 break; \
51 } \
52 V4L2_LOG_ERR(format ": %s\n", ##__VA_ARGS__, strerror(errno)); \
53 } while (0)
54
55 #define V4L2_LOG_WARN(...) \
56 do { \
57 if (v4l2_log_file) { \
58 fprintf(v4l2_log_file, "libv4l2: warning " __VA_ARGS__); \
59 fflush(v4l2_log_file); \
60 } else \
61 fprintf(stderr, "libv4l2: warning " __VA_ARGS__); \
62 } while (0)
63
64 #define V4L2_LOG(...) \
65 do { \
66 if (v4l2_log_file) { \
67 fprintf(v4l2_log_file, "libv4l2: " __VA_ARGS__); \
68 fflush(v4l2_log_file); \
69 } \
70 } while (0)
71
72 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
73
74 struct v4l2_dev_info {
75 int fd;
76 int flags;
77 int open_count;
78 int gone; /* Set to 1 when a device is detached (ENODEV encountered) */
79 long page_size;
80 /* actual format of the cam */
81 struct v4l2_format src_fmt;
82 /* fmt as seen by the application (iow after conversion) */
83 struct v4l2_format dest_fmt;
84 pthread_mutex_t stream_lock;
85 unsigned int no_frames;
86 unsigned int nreadbuffers;
87 int fps;
88 int first_frame;
89 struct v4lconvert_data *convert;
90 unsigned char *convert_mmap_buf;
91 size_t convert_mmap_buf_size;
92 size_t convert_mmap_frame_size;
93 /* Frame bookkeeping is only done when in read or mmap-conversion mode */
94 unsigned char *frame_pointers[V4L2_MAX_NO_FRAMES];
95 int frame_sizes[V4L2_MAX_NO_FRAMES];
96 int frame_queued; /* 1 status bit per frame */
97 int frame_info_generation;
98 /* mapping tracking of our fake (converting mmap) frame buffers */
99 unsigned char frame_map_count[V4L2_MAX_NO_FRAMES];
100 /* buffer when doing conversion and using read() for read() */
101 int readbuf_size;
102 unsigned char *readbuf;
103 /* plugin info */
104 void *plugin_library;
105 void *dev_ops_priv;
106 const struct libv4l_dev_ops *dev_ops;
107 };
108
109 /* From v4l2-plugin.c */
110 #if defined(HAVE_V4L_PLUGINS)
111 void v4l2_plugin_init(int fd, void **plugin_lib_ret, void **plugin_priv_ret,
112 const struct libv4l_dev_ops **dev_ops_ret);
113 void v4l2_plugin_cleanup(void *plugin_lib, void *plugin_priv,
114 const struct libv4l_dev_ops *dev_ops);
115 #else
v4l2_plugin_init(int fd,void ** plugin_lib_ret,void ** plugin_priv_ret,const struct libv4l_dev_ops ** dev_ops_ret)116 static inline void v4l2_plugin_init(int fd, void **plugin_lib_ret, void **plugin_priv_ret,
117 const struct libv4l_dev_ops **dev_ops_ret)
118 {
119 *dev_ops_ret = v4lconvert_get_default_dev_ops();
120 *plugin_lib_ret = NULL;
121 *plugin_priv_ret = NULL;
122 }
v4l2_plugin_cleanup(void * plugin_lib,void * plugin_priv,const struct libv4l_dev_ops * dev_ops)123 static inline void v4l2_plugin_cleanup(void *plugin_lib, void *plugin_priv,
124 const struct libv4l_dev_ops *dev_ops)
125 {
126 }
127 #endif /* WITH_V4L_PLUGINS */
128
129 /* From log.c */
130 extern const char *v4l2_ioctls[];
131 void v4l2_log_ioctl(unsigned long int request, void *arg, int result);
132
133 #endif
134