19
19
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22
/* $Id: v4l2.c,v 1.2 2003/01/25 23:39:58 mschimek Exp $ */
22
/* $Id: v4l2.c,v 1.9 2005/02/25 18:10:08 mschimek Exp $ */
24
24
#ifdef HAVE_CONFIG_H
29
29
#include <unistd.h>
30
30
#include <sys/ioctl.h>
32
#include "zapping_setup_fb.h"
35
#include <sys/ioctl.h>
37
#include "zapping_setup_fb.h"
39
#include "../common/videodev2.h" /* V4L2 header file */
41
#define v4l2_ioctl(fd, cmd, arg) dev_ioctl (fd, cmd, arg, fprintf_v4l2_ioctl)
44
fprintf_v4l2_ioctl (FILE * fp,
53
struct v4l2_framebuffer *t = arg;
55
fprintf (fp, "capability=");
57
fprintf_symbolic (fp, 0, (unsigned long) t->capability,
58
"EXTERNOVERLAY", V4L2_FBUF_CAP_EXTERNOVERLAY,
59
"CHROMAKEY", V4L2_FBUF_CAP_CHROMAKEY,
60
"CLIPPING", V4L2_FBUF_CAP_CLIPPING,
61
"SCALEUP", V4L2_FBUF_CAP_SCALEUP,
62
"SCALEDOWN", V4L2_FBUF_CAP_SCALEDOWN,
63
"BITMAP_CLIPPING", V4L2_FBUF_CAP_BITMAP_CLIPPING,
66
fprintf (fp, " flags=");
68
fprintf_symbolic (fp, 2, (unsigned long) t->flags,
69
"PRIMARY", V4L2_FBUF_FLAG_PRIMARY,
70
"OVERLAY", V4L2_FBUF_FLAG_OVERLAY,
71
"CHROMAKEY", V4L2_FBUF_FLAG_CHROMAKEY,
74
fprintf (fp, " base[]={%p,%p,%p} fmt.width=%lu "
75
"fmt.height=%lu fmt.depth=%lu "
76
"fmt.pixelformat=0x%lx fmt.flags=",
77
t->base[0], t->base[1],
78
t->base[2], (unsigned long) t->fmt.width,
79
(unsigned long) t->fmt.height, (unsigned long) t->fmt.depth,
80
(unsigned long) t->fmt.pixelformat);
82
fprintf_symbolic (fp, 2, (unsigned long) t->fmt.flags,
83
"COMPRESSED", V4L2_FMT_FLAG_COMPRESSED,
84
"BYTESPERLINE", V4L2_FMT_FLAG_BYTESPERLINE,
85
"INTERLACED", V4L2_FMT_FLAG_INTERLACED,
86
"TOPFIELD", V4L2_FMT_FLAG_TOPFIELD,
87
"BOTFIELD", V4L2_FMT_FLAG_BOTFIELD,
90
fprintf (fp, " fmt.bytesperline=%lu fmt.sizeimage=%lu fmt.priv=%lu",
91
(unsigned long) t->fmt.bytesperline,
92
(unsigned long) t->fmt.sizeimage,
93
(unsigned long) t->fmt.priv);
97
CASE (VIDIOC_QUERYCAP)
99
struct v4l2_capability *t = arg;
101
fprintf (fp, "name=\"%.*s\" type=",
104
fprintf_symbolic (fp, 1, (unsigned long) t->type,
105
"CAPTURE", V4L2_TYPE_CAPTURE,
106
"CODEC", V4L2_TYPE_CODEC,
107
"OUTPUT", V4L2_TYPE_OUTPUT,
109
"VBI", V4L2_TYPE_VBI,
110
"VTR", V4L2_TYPE_VTR,
111
"VTX", V4L2_TYPE_VTX,
112
"RADIO", V4L2_TYPE_RADIO,
113
"VBI_INPUT", V4L2_TYPE_VBI_INPUT,
114
"VBI_OUTPUT", V4L2_TYPE_VBI_OUTPUT,
115
"PRIVATE", V4L2_TYPE_PRIVATE,
118
fprintf (fp, " inputs=%ld outputs=%ld "
119
"audios=%ld maxwidth=%ld "
120
"maxheight=%ld minwidth=%ld "
121
"minheight=%ld maxframerate=%ld "
123
(long) t->inputs, (long) t->outputs,
124
(long) t->audios, (long) t->maxwidth,
125
(long) t->maxheight, (long) t->minwidth,
126
(long) t->minheight, (long) t->maxframerate);
128
fprintf_symbolic (fp, 2, (unsigned long) t->flags,
129
"READ", V4L2_FLAG_READ,
130
"WRITE", V4L2_FLAG_WRITE,
131
"STREAMING", V4L2_FLAG_STREAMING,
132
"PREVIEW", V4L2_FLAG_PREVIEW,
133
"SELECT", V4L2_FLAG_SELECT,
134
"TUNER", V4L2_FLAG_TUNER,
135
"MONOCHROME", V4L2_FLAG_MONOCHROME,
136
"DATA_SERVICE", V4L2_FLAG_DATA_SERVICE,
142
fprintf (fp, "<unknown cmd 0x%x>", cmd);
38
#include "common/videodev2.h" /* V4L2 header file */
39
#include "common/_videodev2.h"
41
#define v4l2_ioctl(fd, cmd, arg) \
42
(IOCTL_ARG_TYPE_CHECK_ ## cmd (arg), \
43
device_ioctl (log_fp, fprint_v4l2_ioctl_arg, fd, cmd, arg))
147
setup_v4l2 (const char * device_name)
46
setup_v4l2 (const char * device_name,
47
const tv_overlay_buffer *buffer)
150
50
struct v4l2_capability cap;
151
struct v4l2_framebuffer fb;
153
52
message (2, "Opening video device.\n");
155
if (-1 == (fd = dev_open (device_name, 81, O_RDWR)))
54
if (-1 == (fd = device_open_safer (device_name, 81, O_RDWR)))
158
57
message (2, "Querying device capabilities.\n");
160
if (-1 == v4l2_ioctl (fd, VIDIOC_QUERYCAP, &cap))
59
if (0 == v4l2_ioctl (fd, VIDIOC_QUERYCAP, &cap))
162
61
errmsg ("VIDIOC_QUERYCAP ioctl failed,\n probably not a V4L2 device");
167
message (1, "Using V4L2 interface.\n");
169
message (2, "Checking overlay capability.\n");
171
if (V4L2_TYPE_CAPTURE != cap.type
172
|| !(V4L2_FLAG_PREVIEW & cap.flags))
174
message (1, "Device '%s' does not support video overlay.\n", device_name);
178
message (2, "Getting current frame buffer parameters.\n");
180
if (-1 == v4l2_ioctl (fd, VIDIOC_G_FBUF, &fb))
182
errmsg ("VIDIOC_G_FBUF ioctl failed");
186
if (fb.capability & V4L2_FBUF_CAP_EXTERNOVERLAY)
188
message (2, "Genlock device, mission accomplished.\n");
193
fb.base[0] = (void *) addr;
194
fb.base[1] = (void *) addr;
195
fb.base[2] = (void *) addr;
196
fb.fmt.width = width;
197
fb.fmt.height = height;
203
fb.fmt.pixelformat = V4L2_PIX_FMT_HI240; /* XXX bttv only */
206
#if BYTE_ORDER == BIG_ENDIAN /* safe? */
207
case 15: fb.fmt.pixelformat = V4L2_PIX_FMT_RGB555X; break;
208
case 16: fb.fmt.pixelformat = V4L2_PIX_FMT_RGB565X; break;
209
case 24: fb.fmt.pixelformat = V4L2_PIX_FMT_RGB24; break;
210
case 32: fb.fmt.pixelformat = V4L2_PIX_FMT_RGB32; break;
212
case 15: fb.fmt.pixelformat = V4L2_PIX_FMT_RGB555; break;
213
case 16: fb.fmt.pixelformat = V4L2_PIX_FMT_RGB565; break;
214
case 24: fb.fmt.pixelformat = V4L2_PIX_FMT_BGR24; break;
215
case 32: fb.fmt.pixelformat = V4L2_PIX_FMT_BGR32; break;
219
fb.fmt.flags = V4L2_FMT_FLAG_BYTESPERLINE;
220
fb.fmt.bytesperline = bpl;
221
fb.fmt.sizeimage = height * fb.fmt.bytesperline;
223
message (2, "Setting new frame buffer parameters.\n");
226
* This ioctl is privileged because it sets up
227
* DMA to a random (video memory) address.
233
if (!restore_root_privileges (uid, euid))
236
success = v4l2_ioctl (fd, VIDIOC_S_FBUF, &fb);
239
if (!drop_root_privileges (uid, euid))
246
errmsg ("VIDIOC_S_FBUF ioctl failed");
248
if (EPERM == saved_errno && ROOT_UID != euid)
249
message (1, "%s must be run as root, or marked as SUID root.\n",
250
program_invocation_short_name);
66
/* V4L2 0.20 is obsolete, superseded by V4L2 of Linux 2.6. */
68
errmsg ("V4L2 0.20 API not supported");
72
return 0; /* failed */
262
75
#else /* !ENABLE_V4L */
265
setup_v4l2 (const char * device_name)
78
setup_v4l2 (const char * device_name,
79
const tv_overlay_buffer *buffer)
81
return -1; /* try other */
270
84
#endif /* !ENABLE_V4L */