4 * A generic video device interface for the LINUX operating system
5 * using a set of device structures/vectors for low level operations.
7 * This file replaces the videodev.c file that comes with the
8 * regular kernel distribution.
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version
13 * 2 of the License, or (at your option) any later version.
15 * Author: Bill Dirks <bdirks@pacbell.net>
16 * based on code by Alan Cox, <alan@cymru.net>
21 * Video capture interface for Linux
23 * A generic video device interface for the LINUX operating system
24 * using a set of device structures/vectors for low level operations.
26 * This program is free software; you can redistribute it and/or
27 * modify it under the terms of the GNU General Public License
28 * as published by the Free Software Foundation; either version
29 * 2 of the License, or (at your option) any later version.
31 * Author: Alan Cox, <alan@redhat.com>
37 * Video4linux 1/2 integration by Justin Schoeman
38 * <justin@suntiger.ee.up.ac.za>
39 * 2.4 PROCFS support ported from 2.4 kernels by
40 * Iñaki García Etxebarria <garetxe@euskalnet.net>
41 * Makefile fix by "W. Michael Petullo" <mike@flyn.org>
42 * 2.4 devfs support ported from 2.4 kernels by
43 * Dan Merillat <dan@merillat.org>
44 * Added Gerd Knorrs v4l1 enhancements (Justin Schoeman)
47 #include <linux/module.h>
48 #include <linux/types.h>
49 #include <linux/kernel.h>
50 #include <linux/sched.h>
51 #include <linux/smp_lock.h>
53 #include <linux/string.h>
54 #include <linux/errno.h>
55 #include <asm/uaccess.h>
56 #include <asm/system.h>
57 #include <asm/pgtable.h>
59 #include <asm/div64.h>
60 #include <linux/video_decoder.h>
61 #define __OLD_VIDIOC_ /* To allow fixing old calls*/
62 #include <media/v4l2-common.h>
65 #include <linux/kmod.h>
68 #if defined(CONFIG_UST) || defined(CONFIG_UST_MODULE)
69 #include <linux/ust.h>
73 #include <linux/videodev.h>
75 MODULE_AUTHOR("Bill Dirks, Justin Schoeman, Gerd Knorr");
76 MODULE_DESCRIPTION("misc helper functions for v4l2 device drivers");
77 MODULE_LICENSE("GPL");
81 * V 4 L 2 D R I V E R H E L P E R A P I
86 * Video Standard Operations (contributed by Michael Schimek)
90 /* Fill in the fields of a v4l2_standard structure according to the
91 'id' and 'transmission' parameters. Returns negative on error. */
92 int v4l2_video_std_construct(struct v4l2_standard *vs,
95 u32 index = vs->index;
97 memset(vs, 0, sizeof(struct v4l2_standard));
100 if (id & V4L2_STD_525_60) {
101 vs->frameperiod.numerator = 1001;
102 vs->frameperiod.denominator = 30000;
103 vs->framelines = 525;
105 vs->frameperiod.numerator = 1;
106 vs->frameperiod.denominator = 25;
107 vs->framelines = 625;
109 strlcpy(vs->name,name,sizeof(vs->name));
113 /* ----------------------------------------------------------------- */
114 /* priority handling */
116 #define V4L2_PRIO_VALID(val) (val == V4L2_PRIORITY_BACKGROUND || \
117 val == V4L2_PRIORITY_INTERACTIVE || \
118 val == V4L2_PRIORITY_RECORD)
120 int v4l2_prio_init(struct v4l2_prio_state *global)
122 memset(global,0,sizeof(*global));
126 int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
127 enum v4l2_priority new)
129 if (!V4L2_PRIO_VALID(new))
134 atomic_inc(&global->prios[new]);
135 if (V4L2_PRIO_VALID(*local))
136 atomic_dec(&global->prios[*local]);
141 int v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local)
143 return v4l2_prio_change(global,local,V4L2_PRIORITY_DEFAULT);
146 int v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority *local)
148 if (V4L2_PRIO_VALID(*local))
149 atomic_dec(&global->prios[*local]);
153 enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global)
155 if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0)
156 return V4L2_PRIORITY_RECORD;
157 if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0)
158 return V4L2_PRIORITY_INTERACTIVE;
159 if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0)
160 return V4L2_PRIORITY_BACKGROUND;
161 return V4L2_PRIORITY_UNSET;
164 int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority *local)
166 if (*local < v4l2_prio_max(global))
172 /* ----------------------------------------------------------------- */
173 /* some arrays for pretty-printing debug messages of enum types */
175 char *v4l2_field_names[] = {
176 [V4L2_FIELD_ANY] = "any",
177 [V4L2_FIELD_NONE] = "none",
178 [V4L2_FIELD_TOP] = "top",
179 [V4L2_FIELD_BOTTOM] = "bottom",
180 [V4L2_FIELD_INTERLACED] = "interlaced",
181 [V4L2_FIELD_SEQ_TB] = "seq-tb",
182 [V4L2_FIELD_SEQ_BT] = "seq-bt",
183 [V4L2_FIELD_ALTERNATE] = "alternate",
186 char *v4l2_type_names[] = {
187 [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "video-cap",
188 [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "video-over",
189 [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "video-out",
190 [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap",
191 [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out",
194 static char *v4l2_memory_names[] = {
195 [V4L2_MEMORY_MMAP] = "mmap",
196 [V4L2_MEMORY_USERPTR] = "userptr",
197 [V4L2_MEMORY_OVERLAY] = "overlay",
200 #define prt_names(a,arr) (((a)>=0)&&((a)<ARRAY_SIZE(arr)))?arr[a]:"unknown"
202 /* ------------------------------------------------------------------ */
203 /* debug help functions */
206 static const char *v4l1_ioctls[] = {
207 [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
208 [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
209 [_IOC_NR(VIDIOCSCHAN)] = "VIDIOCSCHAN",
210 [_IOC_NR(VIDIOCGTUNER)] = "VIDIOCGTUNER",
211 [_IOC_NR(VIDIOCSTUNER)] = "VIDIOCSTUNER",
212 [_IOC_NR(VIDIOCGPICT)] = "VIDIOCGPICT",
213 [_IOC_NR(VIDIOCSPICT)] = "VIDIOCSPICT",
214 [_IOC_NR(VIDIOCCAPTURE)] = "VIDIOCCAPTURE",
215 [_IOC_NR(VIDIOCGWIN)] = "VIDIOCGWIN",
216 [_IOC_NR(VIDIOCSWIN)] = "VIDIOCSWIN",
217 [_IOC_NR(VIDIOCGFBUF)] = "VIDIOCGFBUF",
218 [_IOC_NR(VIDIOCSFBUF)] = "VIDIOCSFBUF",
219 [_IOC_NR(VIDIOCKEY)] = "VIDIOCKEY",
220 [_IOC_NR(VIDIOCGFREQ)] = "VIDIOCGFREQ",
221 [_IOC_NR(VIDIOCSFREQ)] = "VIDIOCSFREQ",
222 [_IOC_NR(VIDIOCGAUDIO)] = "VIDIOCGAUDIO",
223 [_IOC_NR(VIDIOCSAUDIO)] = "VIDIOCSAUDIO",
224 [_IOC_NR(VIDIOCSYNC)] = "VIDIOCSYNC",
225 [_IOC_NR(VIDIOCMCAPTURE)] = "VIDIOCMCAPTURE",
226 [_IOC_NR(VIDIOCGMBUF)] = "VIDIOCGMBUF",
227 [_IOC_NR(VIDIOCGUNIT)] = "VIDIOCGUNIT",
228 [_IOC_NR(VIDIOCGCAPTURE)] = "VIDIOCGCAPTURE",
229 [_IOC_NR(VIDIOCSCAPTURE)] = "VIDIOCSCAPTURE",
230 [_IOC_NR(VIDIOCSPLAYMODE)] = "VIDIOCSPLAYMODE",
231 [_IOC_NR(VIDIOCSWRITEMODE)] = "VIDIOCSWRITEMODE",
232 [_IOC_NR(VIDIOCGPLAYINFO)] = "VIDIOCGPLAYINFO",
233 [_IOC_NR(VIDIOCSMICROCODE)] = "VIDIOCSMICROCODE",
234 [_IOC_NR(VIDIOCGVBIFMT)] = "VIDIOCGVBIFMT",
235 [_IOC_NR(VIDIOCSVBIFMT)] = "VIDIOCSVBIFMT"
237 #define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls)
240 static const char *v4l2_ioctls[] = {
241 [_IOC_NR(VIDIOC_QUERYCAP)] = "VIDIOC_QUERYCAP",
242 [_IOC_NR(VIDIOC_RESERVED)] = "VIDIOC_RESERVED",
243 [_IOC_NR(VIDIOC_ENUM_FMT)] = "VIDIOC_ENUM_FMT",
244 [_IOC_NR(VIDIOC_G_FMT)] = "VIDIOC_G_FMT",
245 [_IOC_NR(VIDIOC_S_FMT)] = "VIDIOC_S_FMT",
246 [_IOC_NR(VIDIOC_G_MPEGCOMP)] = "VIDIOC_G_MPEGCOMP",
247 [_IOC_NR(VIDIOC_S_MPEGCOMP)] = "VIDIOC_S_MPEGCOMP",
248 [_IOC_NR(VIDIOC_REQBUFS)] = "VIDIOC_REQBUFS",
249 [_IOC_NR(VIDIOC_QUERYBUF)] = "VIDIOC_QUERYBUF",
250 [_IOC_NR(VIDIOC_G_FBUF)] = "VIDIOC_G_FBUF",
251 [_IOC_NR(VIDIOC_S_FBUF)] = "VIDIOC_S_FBUF",
252 [_IOC_NR(VIDIOC_OVERLAY)] = "VIDIOC_OVERLAY",
253 [_IOC_NR(VIDIOC_QBUF)] = "VIDIOC_QBUF",
254 [_IOC_NR(VIDIOC_DQBUF)] = "VIDIOC_DQBUF",
255 [_IOC_NR(VIDIOC_STREAMON)] = "VIDIOC_STREAMON",
256 [_IOC_NR(VIDIOC_STREAMOFF)] = "VIDIOC_STREAMOFF",
257 [_IOC_NR(VIDIOC_G_PARM)] = "VIDIOC_G_PARM",
258 [_IOC_NR(VIDIOC_S_PARM)] = "VIDIOC_S_PARM",
259 [_IOC_NR(VIDIOC_G_STD)] = "VIDIOC_G_STD",
260 [_IOC_NR(VIDIOC_S_STD)] = "VIDIOC_S_STD",
261 [_IOC_NR(VIDIOC_ENUMSTD)] = "VIDIOC_ENUMSTD",
262 [_IOC_NR(VIDIOC_ENUMINPUT)] = "VIDIOC_ENUMINPUT",
263 [_IOC_NR(VIDIOC_G_CTRL)] = "VIDIOC_G_CTRL",
264 [_IOC_NR(VIDIOC_S_CTRL)] = "VIDIOC_S_CTRL",
265 [_IOC_NR(VIDIOC_G_TUNER)] = "VIDIOC_G_TUNER",
266 [_IOC_NR(VIDIOC_S_TUNER)] = "VIDIOC_S_TUNER",
267 [_IOC_NR(VIDIOC_G_AUDIO)] = "VIDIOC_G_AUDIO",
268 [_IOC_NR(VIDIOC_S_AUDIO)] = "VIDIOC_S_AUDIO",
269 [_IOC_NR(VIDIOC_QUERYCTRL)] = "VIDIOC_QUERYCTRL",
270 [_IOC_NR(VIDIOC_QUERYMENU)] = "VIDIOC_QUERYMENU",
271 [_IOC_NR(VIDIOC_G_INPUT)] = "VIDIOC_G_INPUT",
272 [_IOC_NR(VIDIOC_S_INPUT)] = "VIDIOC_S_INPUT",
273 [_IOC_NR(VIDIOC_G_OUTPUT)] = "VIDIOC_G_OUTPUT",
274 [_IOC_NR(VIDIOC_S_OUTPUT)] = "VIDIOC_S_OUTPUT",
275 [_IOC_NR(VIDIOC_ENUMOUTPUT)] = "VIDIOC_ENUMOUTPUT",
276 [_IOC_NR(VIDIOC_G_AUDOUT)] = "VIDIOC_G_AUDOUT",
277 [_IOC_NR(VIDIOC_S_AUDOUT)] = "VIDIOC_S_AUDOUT",
278 [_IOC_NR(VIDIOC_G_MODULATOR)] = "VIDIOC_G_MODULATOR",
279 [_IOC_NR(VIDIOC_S_MODULATOR)] = "VIDIOC_S_MODULATOR",
280 [_IOC_NR(VIDIOC_G_FREQUENCY)] = "VIDIOC_G_FREQUENCY",
281 [_IOC_NR(VIDIOC_S_FREQUENCY)] = "VIDIOC_S_FREQUENCY",
282 [_IOC_NR(VIDIOC_CROPCAP)] = "VIDIOC_CROPCAP",
283 [_IOC_NR(VIDIOC_G_CROP)] = "VIDIOC_G_CROP",
284 [_IOC_NR(VIDIOC_S_CROP)] = "VIDIOC_S_CROP",
285 [_IOC_NR(VIDIOC_G_JPEGCOMP)] = "VIDIOC_G_JPEGCOMP",
286 [_IOC_NR(VIDIOC_S_JPEGCOMP)] = "VIDIOC_S_JPEGCOMP",
287 [_IOC_NR(VIDIOC_QUERYSTD)] = "VIDIOC_QUERYSTD",
288 [_IOC_NR(VIDIOC_TRY_FMT)] = "VIDIOC_TRY_FMT",
289 [_IOC_NR(VIDIOC_ENUMAUDIO)] = "VIDIOC_ENUMAUDIO",
290 [_IOC_NR(VIDIOC_ENUMAUDOUT)] = "VIDIOC_ENUMAUDOUT",
291 [_IOC_NR(VIDIOC_G_PRIORITY)] = "VIDIOC_G_PRIORITY",
292 [_IOC_NR(VIDIOC_S_PRIORITY)] = "VIDIOC_S_PRIORITY",
294 [_IOC_NR(VIDIOC_G_SLICED_VBI_CAP)] = "VIDIOC_G_SLICED_VBI_CAP",
296 [_IOC_NR(VIDIOC_LOG_STATUS)] = "VIDIOC_LOG_STATUS",
297 [_IOC_NR(VIDIOC_G_EXT_CTRLS)] = "VIDIOC_G_EXT_CTRLS",
298 [_IOC_NR(VIDIOC_S_EXT_CTRLS)] = "VIDIOC_S_EXT_CTRLS",
299 [_IOC_NR(VIDIOC_TRY_EXT_CTRLS)] = "VIDIOC_TRY_EXT_CTRLS"
301 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
303 static const char *v4l2_int_ioctls[] = {
304 #ifdef HAVE_VIDEO_DECODER
305 [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES",
306 [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
307 [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM",
308 [_IOC_NR(DECODER_SET_INPUT)] = "DECODER_SET_INPUT",
309 [_IOC_NR(DECODER_SET_OUTPUT)] = "DECODER_SET_OUTPUT",
310 [_IOC_NR(DECODER_ENABLE_OUTPUT)] = "DECODER_ENABLE_OUTPUT",
311 [_IOC_NR(DECODER_SET_PICTURE)] = "DECODER_SET_PICTURE",
312 [_IOC_NR(DECODER_SET_GPIO)] = "DECODER_SET_GPIO",
313 [_IOC_NR(DECODER_INIT)] = "DECODER_INIT",
314 [_IOC_NR(DECODER_SET_VBI_BYPASS)] = "DECODER_SET_VBI_BYPASS",
315 [_IOC_NR(DECODER_DUMP)] = "DECODER_DUMP",
317 [_IOC_NR(AUDC_SET_RADIO)] = "AUDC_SET_RADIO",
319 [_IOC_NR(TUNER_SET_TYPE_ADDR)] = "TUNER_SET_TYPE_ADDR",
320 [_IOC_NR(TUNER_SET_STANDBY)] = "TUNER_SET_STANDBY",
321 [_IOC_NR(TDA9887_SET_CONFIG)] = "TDA9887_SET_CONFIG",
323 [_IOC_NR(VIDIOC_INT_S_TUNER_MODE)] = "VIDIOC_INT_S_TUNER_MODE",
324 [_IOC_NR(VIDIOC_INT_S_REGISTER)] = "VIDIOC_INT_S_REGISTER",
325 [_IOC_NR(VIDIOC_INT_G_REGISTER)] = "VIDIOC_INT_G_REGISTER",
326 [_IOC_NR(VIDIOC_INT_RESET)] = "VIDIOC_INT_RESET",
327 [_IOC_NR(VIDIOC_INT_AUDIO_CLOCK_FREQ)] = "VIDIOC_INT_AUDIO_CLOCK_FREQ",
328 [_IOC_NR(VIDIOC_INT_DECODE_VBI_LINE)] = "VIDIOC_INT_DECODE_VBI_LINE",
329 [_IOC_NR(VIDIOC_INT_S_VBI_DATA)] = "VIDIOC_INT_S_VBI_DATA",
330 [_IOC_NR(VIDIOC_INT_G_VBI_DATA)] = "VIDIOC_INT_G_VBI_DATA",
331 [_IOC_NR(VIDIOC_INT_G_CHIP_IDENT)] = "VIDIOC_INT_G_CHIP_IDENT",
332 [_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ)] = "VIDIOC_INT_I2S_CLOCK_FREQ",
333 [_IOC_NR(VIDIOC_INT_S_STANDBY)] = "VIDIOC_INT_S_STANDBY",
334 [_IOC_NR(VIDIOC_INT_S_AUDIO_ROUTING)] = "VIDIOC_INT_S_AUDIO_ROUTING",
335 [_IOC_NR(VIDIOC_INT_G_AUDIO_ROUTING)] = "VIDIOC_INT_G_AUDIO_ROUTING",
336 [_IOC_NR(VIDIOC_INT_S_VIDEO_ROUTING)] = "VIDIOC_INT_S_VIDEO_ROUTING",
337 [_IOC_NR(VIDIOC_INT_G_VIDEO_ROUTING)] = "VIDIOC_INT_G_VIDEO_ROUTING",
338 [_IOC_NR(VIDIOC_INT_S_CRYSTAL_FREQ)] = "VIDIOC_INT_S_CRYSTAL_FREQ"
340 #define V4L2_INT_IOCTLS ARRAY_SIZE(v4l2_int_ioctls)
342 static void v4l_print_pix_fmt (char *s, struct v4l2_pix_format *fmt)
344 printk ("%s: width=%d, height=%d, format=%d, field=%s, "
345 "bytesperline=%d sizeimage=%d, colorspace=%d\n", s,
346 fmt->width,fmt->height,fmt->pixelformat,
347 prt_names(fmt->field,v4l2_field_names),
348 fmt->bytesperline,fmt->sizeimage,fmt->colorspace);
351 /* Common ioctl debug function. This function can be used by
352 external ioctl messages as well as internal V4L ioctl */
353 void v4l_printk_ioctl(unsigned int cmd)
357 switch (_IOC_DIR(cmd)) {
358 case _IOC_NONE: dir = "--"; break;
359 case _IOC_READ: dir = "r-"; break;
360 case _IOC_WRITE: dir = "-w"; break;
361 case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
362 default: dir = "*ERR*"; break;
364 switch (_IOC_TYPE(cmd)) {
366 printk("v4l2_int ioctl %s, dir=%s (0x%08x)\n",
367 (_IOC_NR(cmd) < V4L2_INT_IOCTLS) ?
368 v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
372 printk("v4l1 ioctl %s, dir=%s (0x%08x)\n",
373 (_IOC_NR(cmd) < V4L1_IOCTLS) ?
374 v4l1_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
378 printk("v4l2 ioctl %s, dir=%s (0x%08x)\n",
379 (_IOC_NR(cmd) < V4L2_IOCTLS) ?
380 v4l2_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
384 printk("unknown ioctl '%c', dir=%s, #%d (0x%08x)\n",
385 _IOC_TYPE(cmd), dir, _IOC_NR(cmd), cmd);
389 /* Common ioctl debug function. This function can be used by
390 external ioctl messages as well as internal V4L ioctl and its
392 void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
396 v4l_printk_ioctl(cmd);
398 case VIDIOC_INT_G_CHIP_IDENT:
400 enum v4l2_chip_ident *p=arg;
401 printk ("%s: chip ident=%d\n", s, *p);
404 case VIDIOC_G_PRIORITY:
405 case VIDIOC_S_PRIORITY:
407 enum v4l2_priority *p=arg;
408 printk ("%s: priority=%d\n", s, *p);
411 case VIDIOC_INT_S_TUNER_MODE:
413 enum v4l2_tuner_type *p=arg;
414 printk ("%s: tuner type=%d\n", s, *p);
417 case DECODER_SET_VBI_BYPASS:
418 case DECODER_ENABLE_OUTPUT:
419 case DECODER_GET_STATUS:
420 case DECODER_SET_OUTPUT:
421 case DECODER_SET_INPUT:
422 case DECODER_SET_GPIO:
423 case DECODER_SET_NORM:
426 case VIDIOCSWRITEMODE:
427 case TUNER_SET_TYPE_ADDR:
428 case TUNER_SET_STANDBY:
429 case TDA9887_SET_CONFIG:
431 case VIDIOC_OVERLAY_OLD:
433 case VIDIOC_STREAMOFF:
434 case VIDIOC_G_OUTPUT:
435 case VIDIOC_S_OUTPUT:
436 case VIDIOC_STREAMON:
442 printk ("%s: value=%d\n", s, *p);
447 case VIDIOC_ENUMAUDIO:
449 case VIDIOC_G_AUDIO_OLD:
452 struct v4l2_audio *p=arg;
454 printk ("%s: index=%d, name=%s, capability=%d, mode=%d\n",
455 s,p->index, p->name,p->capability, p->mode);
458 case VIDIOC_G_AUDOUT:
459 case VIDIOC_S_AUDOUT:
460 case VIDIOC_ENUMAUDOUT:
462 case VIDIOC_G_AUDOUT_OLD:
465 struct v4l2_audioout *p=arg;
466 printk ("%s: index=%d, name=%s, capability=%d, mode=%d\n", s,
467 p->index, p->name, p->capability,p->mode);
472 case VIDIOC_QUERYBUF:
474 struct v4l2_buffer *p=arg;
475 struct v4l2_timecode *tc=&p->timecode;
476 printk ("%s: %02ld:%02d:%02d.%08ld index=%d, type=%s, "
477 "bytesused=%d, flags=0x%08x, "
478 "field=%0d, sequence=%d, memory=%s, offset/userptr=0x%08lx\n",
480 (p->timestamp.tv_sec/3600),
481 (int)(p->timestamp.tv_sec/60)%60,
482 (int)(p->timestamp.tv_sec%60),
483 p->timestamp.tv_usec,
485 prt_names(p->type,v4l2_type_names),
486 p->bytesused,p->flags,
487 p->field,p->sequence,
488 prt_names(p->memory,v4l2_memory_names),
490 printk ("%s: timecode= %02d:%02d:%02d type=%d, "
491 "flags=0x%08x, frames=%d, userbits=0x%08x\n",
492 s,tc->hours,tc->minutes,tc->seconds,
493 tc->type, tc->flags, tc->frames, *(__u32 *) tc->userbits);
496 case VIDIOC_QUERYCAP:
498 struct v4l2_capability *p=arg;
499 printk ("%s: driver=%s, card=%s, bus=%s, version=0x%08x, "
500 "capabilities=0x%08x\n", s,
501 p->driver,p->card,p->bus_info,
509 case VIDIOC_S_CTRL_OLD:
512 struct v4l2_control *p=arg;
513 printk ("%s: id=%d, value=%d\n", s, p->id, p->value);
516 case VIDIOC_G_EXT_CTRLS:
517 case VIDIOC_S_EXT_CTRLS:
518 case VIDIOC_TRY_EXT_CTRLS:
520 struct v4l2_ext_controls *p = arg;
523 printk("%s: ctrl_class=%d, count=%d\n", s, p->ctrl_class, p->count);
524 for (i = 0; i < p->count; i++) {
525 struct v4l2_ext_control *c = &p->controls[i];
526 if (cmd == VIDIOC_G_EXT_CTRLS)
527 printk("%s: id=%d\n", s, c->id);
529 printk("%s: id=%d, value=%d\n", s, c->id, c->value);
536 struct v4l2_crop *p=arg;
537 /*FIXME: Should also show rect structs */
538 printk ("%s: type=%d\n", s, p->type);
543 case VIDIOC_CROPCAP_OLD:
546 struct v4l2_cropcap *p=arg;
547 /*FIXME: Should also show rect structs */
548 printk ("%s: type=%d\n", s, p->type);
551 case VIDIOC_INT_DECODE_VBI_LINE:
553 struct v4l2_decode_vbi_line *p=arg;
554 printk ("%s: is_second_field=%d, ptr=0x%08lx, line=%d, "
556 p->is_second_field,(unsigned long)p->p,p->line,p->type);
559 case VIDIOC_ENUM_FMT:
561 struct v4l2_fmtdesc *p=arg;
562 printk ("%s: index=%d, type=%d, flags=%d, description=%s,"
563 " pixelformat=%d\n", s,
564 p->index, p->type, p->flags,p->description,
573 struct v4l2_format *p=arg;
574 printk ("%s: type=%s\n", s,
575 prt_names(p->type,v4l2_type_names));
577 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
578 v4l_print_pix_fmt (s, &p->fmt.pix);
587 struct v4l2_framebuffer *p=arg;
588 printk ("%s: capability=%d, flags=%d, base=0x%08lx\n", s,
589 p->capability,p->flags, (unsigned long)p->base);
590 v4l_print_pix_fmt (s, &p->fmt);
593 case VIDIOC_G_FREQUENCY:
594 case VIDIOC_S_FREQUENCY:
596 struct v4l2_frequency *p=arg;
597 printk ("%s: tuner=%d, type=%d, frequency=%d\n", s,
598 p->tuner,p->type,p->frequency);
601 case VIDIOC_ENUMINPUT:
603 struct v4l2_input *p=arg;
604 printk ("%s: index=%d, name=%s, type=%d, audioset=%d, "
605 "tuner=%d, std=%Ld, status=%d\n", s,
606 p->index,p->name,p->type,p->audioset,
608 (unsigned long long)p->std,
612 case VIDIOC_G_JPEGCOMP:
613 case VIDIOC_S_JPEGCOMP:
615 struct v4l2_jpegcompression *p=arg;
616 printk ("%s: quality=%d, APPn=%d, APP_len=%d, COM_len=%d,"
617 " jpeg_markers=%d\n", s,
618 p->quality,p->APPn,p->APP_len,
619 p->COM_len,p->jpeg_markers);
622 case VIDIOC_G_MODULATOR:
623 case VIDIOC_S_MODULATOR:
625 struct v4l2_modulator *p=arg;
626 printk ("%s: index=%d, name=%s, capability=%d, rangelow=%d,"
627 " rangehigh=%d, txsubchans=%d\n", s,
628 p->index, p->name,p->capability,p->rangelow,
629 p->rangehigh,p->txsubchans);
632 case VIDIOC_G_MPEGCOMP:
633 case VIDIOC_S_MPEGCOMP:
635 struct v4l2_mpeg_compression *p=arg;
636 /*FIXME: Several fields not shown */
637 printk ("%s: ts_pid_pmt=%d, ts_pid_audio=%d, ts_pid_video=%d, "
638 "ts_pid_pcr=%d, ps_size=%d, au_sample_rate=%d, "
639 "au_pesid=%c, vi_frame_rate=%d, vi_frames_per_gop=%d, "
640 "vi_bframes_count=%d, vi_pesid=%c\n", s,
641 p->ts_pid_pmt,p->ts_pid_audio, p->ts_pid_video,
642 p->ts_pid_pcr, p->ps_size, p->au_sample_rate,
643 p->au_pesid, p->vi_frame_rate,
644 p->vi_frames_per_gop, p->vi_bframes_count,
648 case VIDIOC_ENUMOUTPUT:
650 struct v4l2_output *p=arg;
651 printk ("%s: index=%d, name=%s,type=%d, audioset=%d, "
652 "modulator=%d, std=%Ld\n",
653 s,p->index,p->name,p->type,p->audioset,
655 (unsigned long long)p->std);
658 case VIDIOC_QUERYCTRL:
660 struct v4l2_queryctrl *p=arg;
661 printk ("%s: id=%d, type=%d, name=%s, min/max=%d/%d,"
662 " step=%d, default=%d, flags=0x%08x\n", s,
663 p->id,p->type,p->name,p->minimum,p->maximum,
664 p->step,p->default_value,p->flags);
667 case VIDIOC_QUERYMENU:
669 struct v4l2_querymenu *p=arg;
670 printk ("%s: id=%d, index=%d, name=%s\n", s,
671 p->id,p->index,p->name);
674 case VIDIOC_INT_G_REGISTER:
675 case VIDIOC_INT_S_REGISTER:
677 struct v4l2_register *p=arg;
678 printk ("%s: i2c_id=%d, reg=%lu, val=%d\n", s,
679 p->i2c_id,p->reg,p->val);
685 struct v4l2_requestbuffers *p=arg;
686 printk ("%s: count=%d, type=%s, memory=%s\n", s,
688 prt_names(p->type,v4l2_type_names),
689 prt_names(p->memory,v4l2_memory_names));
692 case VIDIOC_INT_S_AUDIO_ROUTING:
693 case VIDIOC_INT_S_VIDEO_ROUTING:
694 case VIDIOC_INT_G_AUDIO_ROUTING:
695 case VIDIOC_INT_G_VIDEO_ROUTING:
697 struct v4l2_routing *p=arg;
698 printk ("%s: input=0x%x, output=0x%x\n", s, p->input, p->output);
701 case VIDIOC_INT_S_CRYSTAL_FREQ:
703 struct v4l2_crystal_freq *p=arg;
704 printk ("%s: freq=%u, flags=0x%x\n", s, p->freq, p->flags);
707 case VIDIOC_G_SLICED_VBI_CAP:
709 struct v4l2_sliced_vbi_cap *p=arg;
710 printk ("%s: service_set=%d\n", s,
714 case VIDIOC_INT_S_VBI_DATA:
715 case VIDIOC_INT_G_VBI_DATA:
717 struct v4l2_sliced_vbi_data *p=arg;
718 printk ("%s: id=%d, field=%d, line=%d\n", s,
719 p->id, p->field, p->line);
724 struct v4l2_standard *p=arg;
725 printk ("%s: index=%d, id=%Ld, name=%s, fps=%d/%d, "
726 "framelines=%d\n", s, p->index,
727 (unsigned long long)p->id, p->name,
728 p->frameperiod.numerator,
729 p->frameperiod.denominator,
737 case VIDIOC_S_PARM_OLD:
740 struct v4l2_streamparm *p=arg;
741 printk ("%s: type=%d\n", s, p->type);
748 struct v4l2_tuner *p=arg;
749 printk ("%s: index=%d, name=%s, type=%d, capability=%d, "
750 "rangelow=%d, rangehigh=%d, signal=%d, afc=%d, "
751 "rxsubchans=%d, audmode=%d\n", s,
752 p->index, p->name, p->type,
753 p->capability, p->rangelow,p->rangehigh,
754 p->rxsubchans, p->audmode, p->signal,
761 struct vbi_format *p=arg;
762 printk ("%s: sampling_rate=%d, samples_per_line=%d, "
763 "sample_format=%d, start=%d/%d, count=%d/%d, flags=%d\n", s,
764 p->sampling_rate,p->samples_per_line,
765 p->sample_format,p->start[0],p->start[1],
766 p->count[0],p->count[1],p->flags);
772 struct video_audio *p=arg;
773 printk ("%s: audio=%d, volume=%d, bass=%d, treble=%d, "
774 "flags=%d, name=%s, mode=%d, balance=%d, step=%d\n",
775 s,p->audio,p->volume,p->bass, p->treble,
776 p->flags,p->name,p->mode,p->balance,p->step);
782 struct video_buffer *p=arg;
783 printk ("%s: base=%08lx, height=%d, width=%d, depth=%d, "
784 "bytesperline=%d\n", s,
785 (unsigned long) p->base, p->height, p->width,
786 p->depth,p->bytesperline);
791 struct video_capability *p=arg;
792 printk ("%s: name=%s, type=%d, channels=%d, audios=%d, "
793 "maxwidth=%d, maxheight=%d, minwidth=%d, minheight=%d\n",
794 s,p->name,p->type,p->channels,p->audios,
795 p->maxwidth,p->maxheight,p->minwidth,
803 struct video_capture *p=arg;
804 printk ("%s: x=%d, y=%d, width=%d, height=%d, decimation=%d,"
806 p->x, p->y,p->width, p->height,
807 p->decimation,p->flags);
813 struct video_channel *p=arg;
814 printk ("%s: channel=%d, name=%s, tuners=%d, flags=%d, "
815 "type=%d, norm=%d\n", s,
816 p->channel,p->name,p->tuners,
817 p->flags,p->type,p->norm);
821 case VIDIOCSMICROCODE:
823 struct video_code *p=arg;
824 printk ("%s: loadwhat=%s, datasize=%d\n", s,
825 p->loadwhat,p->datasize);
828 case DECODER_GET_CAPABILITIES:
830 struct video_decoder_capability *p=arg;
831 printk ("%s: flags=%d, inputs=%d, outputs=%d\n", s,
832 p->flags,p->inputs,p->outputs);
837 struct video_decoder_init *p=arg;
838 printk ("%s: len=%c\n", s, p->len);
841 case VIDIOCGPLAYINFO:
843 struct video_info *p=arg;
844 printk ("%s: frame_count=%d, h_size=%d, v_size=%d, "
845 "smpte_timecode=%d, picture_type=%d, "
846 "temporal_reference=%d, user_data=%s\n", s,
847 p->frame_count, p->h_size,
848 p->v_size, p->smpte_timecode,
849 p->picture_type, p->temporal_reference,
855 struct video_key *p=arg;
856 printk ("%s: key=%s, flags=%d\n", s,
862 struct video_mbuf *p=arg;
863 printk ("%s: size=%d, frames=%d, offsets=0x%08lx\n", s,
866 (unsigned long)p->offsets);
871 struct video_mmap *p=arg;
872 printk ("%s: frame=%d, height=%d, width=%d, format=%d\n", s,
880 case DECODER_SET_PICTURE:
882 struct video_picture *p=arg;
884 printk ("%s: brightness=%d, hue=%d, colour=%d, contrast=%d,"
885 " whiteness=%d, depth=%d, palette=%d\n", s,
886 p->brightness, p->hue, p->colour,
887 p->contrast, p->whiteness, p->depth,
891 case VIDIOCSPLAYMODE:
893 struct video_play_mode *p=arg;
894 printk ("%s: mode=%d, p1=%d, p2=%d\n", s,
895 p->mode,p->p1,p->p2);
901 struct video_tuner *p=arg;
902 printk ("%s: tuner=%d, name=%s, rangelow=%ld, rangehigh=%ld, "
903 "flags=%d, mode=%d, signal=%d\n", s,
904 p->tuner, p->name,p->rangelow, p->rangehigh,
905 p->flags,p->mode, p->signal);
910 struct video_unit *p=arg;
911 printk ("%s: video=%d, vbi=%d, radio=%d, audio=%d, "
913 p->video,p->vbi,p->radio,p->audio,p->teletext);
919 struct video_window *p=arg;
920 printk ("%s: x=%d, y=%d, width=%d, height=%d, chromakey=%d,"
921 " flags=%d, clipcount=%d\n", s,
922 p->x, p->y,p->width, p->height,
923 p->chromakey,p->flags,
927 case VIDIOC_INT_AUDIO_CLOCK_FREQ:
928 case VIDIOC_INT_I2S_CLOCK_FREQ:
929 case VIDIOC_INT_S_STANDBY:
933 printk ("%s: value=%d\n", s, *p);
939 unsigned long *p=arg;
940 printk ("%s: value=%lu\n", s, *p);
945 case VIDIOC_QUERYSTD:
949 printk ("%s: value=%Lu\n", s, (unsigned long long)*p);
955 /* ----------------------------------------------------------------- */
957 /* Helper functions for control handling */
959 /* Check for correctness of the ctrl's value based on the data from
960 struct v4l2_queryctrl and the available menu items. Note that
961 menu_items may be NULL, in that case it is ignored. */
962 int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl,
963 const char **menu_items)
965 if (qctrl->flags & V4L2_CTRL_FLAG_DISABLED)
967 if (qctrl->flags & V4L2_CTRL_FLAG_GRABBED)
969 if (qctrl->type == V4L2_CTRL_TYPE_BUTTON ||
970 qctrl->type == V4L2_CTRL_TYPE_INTEGER64 ||
971 qctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
973 if (ctrl->value < qctrl->minimum || ctrl->value > qctrl->maximum)
975 if (qctrl->type == V4L2_CTRL_TYPE_MENU && menu_items != NULL) {
976 if (menu_items[ctrl->value] == NULL ||
977 menu_items[ctrl->value][0] == '\0')
983 /* Returns NULL or a character pointer array containing the menu for
984 the given control ID. The pointer array ends with a NULL pointer.
985 An empty string signifies a menu entry that is invalid. This allows
986 drivers to disable certain options if it is not supported. */
987 const char **v4l2_ctrl_get_menu(u32 id)
989 static const char *mpeg_audio_sampling_freq[] = {
995 static const char *mpeg_audio_encoding[] = {
1001 static const char *mpeg_audio_l1_bitrate[] = {
1018 static const char *mpeg_audio_l2_bitrate[] = {
1035 static const char *mpeg_audio_l3_bitrate[] = {
1052 static const char *mpeg_audio_mode[] = {
1059 static const char *mpeg_audio_mode_extension[] = {
1066 static const char *mpeg_audio_emphasis[] = {
1072 static const char *mpeg_audio_crc[] = {
1077 static const char *mpeg_video_encoding[] = {
1082 static const char *mpeg_video_aspect[] = {
1089 static const char *mpeg_video_bitrate_mode[] = {
1094 static const char *mpeg_stream_type[] = {
1095 "MPEG-2 Program Stream",
1096 "MPEG-2 Transport Stream",
1097 "MPEG-1 System Stream",
1098 "MPEG-2 DVD-compatible Stream",
1099 "MPEG-1 VCD-compatible Stream",
1100 "MPEG-2 SVCD-compatible Stream",
1103 static const char *mpeg_stream_vbi_fmt[] = {
1105 "Private packet, IVTV format",
1110 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
1111 return mpeg_audio_sampling_freq;
1112 case V4L2_CID_MPEG_AUDIO_ENCODING:
1113 return mpeg_audio_encoding;
1114 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
1115 return mpeg_audio_l1_bitrate;
1116 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
1117 return mpeg_audio_l2_bitrate;
1118 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
1119 return mpeg_audio_l3_bitrate;
1120 case V4L2_CID_MPEG_AUDIO_MODE:
1121 return mpeg_audio_mode;
1122 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
1123 return mpeg_audio_mode_extension;
1124 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
1125 return mpeg_audio_emphasis;
1126 case V4L2_CID_MPEG_AUDIO_CRC:
1127 return mpeg_audio_crc;
1128 case V4L2_CID_MPEG_VIDEO_ENCODING:
1129 return mpeg_video_encoding;
1130 case V4L2_CID_MPEG_VIDEO_ASPECT:
1131 return mpeg_video_aspect;
1132 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1133 return mpeg_video_bitrate_mode;
1134 case V4L2_CID_MPEG_STREAM_TYPE:
1135 return mpeg_stream_type;
1136 case V4L2_CID_MPEG_STREAM_VBI_FMT:
1137 return mpeg_stream_vbi_fmt;
1143 /* Fill in a struct v4l2_queryctrl */
1144 int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 step, s32 def)
1149 switch (qctrl->id) {
1151 case V4L2_CID_USER_CLASS: name = "User Controls"; break;
1152 case V4L2_CID_AUDIO_VOLUME: name = "Volume"; break;
1153 case V4L2_CID_AUDIO_MUTE: name = "Mute"; break;
1154 case V4L2_CID_AUDIO_BALANCE: name = "Balance"; break;
1155 case V4L2_CID_AUDIO_BASS: name = "Bass"; break;
1156 case V4L2_CID_AUDIO_TREBLE: name = "Treble"; break;
1157 case V4L2_CID_AUDIO_LOUDNESS: name = "Loudness"; break;
1158 case V4L2_CID_BRIGHTNESS: name = "Brightness"; break;
1159 case V4L2_CID_CONTRAST: name = "Contrast"; break;
1160 case V4L2_CID_SATURATION: name = "Saturation"; break;
1161 case V4L2_CID_HUE: name = "Hue"; break;
1164 case V4L2_CID_MPEG_CLASS: name = "MPEG Encoder Controls"; break;
1165 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: name = "Audio Sampling Frequency"; break;
1166 case V4L2_CID_MPEG_AUDIO_ENCODING: name = "Audio Encoding Layer"; break;
1167 case V4L2_CID_MPEG_AUDIO_L1_BITRATE: name = "Audio Layer I Bitrate"; break;
1168 case V4L2_CID_MPEG_AUDIO_L2_BITRATE: name = "Audio Layer II Bitrate"; break;
1169 case V4L2_CID_MPEG_AUDIO_L3_BITRATE: name = "Audio Layer III Bitrate"; break;
1170 case V4L2_CID_MPEG_AUDIO_MODE: name = "Audio Stereo Mode"; break;
1171 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: name = "Audio Stereo Mode Extension"; break;
1172 case V4L2_CID_MPEG_AUDIO_EMPHASIS: name = "Audio Emphasis"; break;
1173 case V4L2_CID_MPEG_AUDIO_CRC: name = "Audio CRC"; break;
1174 case V4L2_CID_MPEG_VIDEO_ENCODING: name = "Video Encoding"; break;
1175 case V4L2_CID_MPEG_VIDEO_ASPECT: name = "Video Aspect"; break;
1176 case V4L2_CID_MPEG_VIDEO_B_FRAMES: name = "Video B Frames"; break;
1177 case V4L2_CID_MPEG_VIDEO_GOP_SIZE: name = "Video GOP Size"; break;
1178 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE: name = "Video GOP Closure"; break;
1179 case V4L2_CID_MPEG_VIDEO_PULLDOWN: name = "Video Pulldown"; break;
1180 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: name = "Video Bitrate Mode"; break;
1181 case V4L2_CID_MPEG_VIDEO_BITRATE: name = "Video Bitrate"; break;
1182 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: name = "Video Peak Bitrate"; break;
1183 case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION: name = "Video Temporal Decimation"; break;
1184 case V4L2_CID_MPEG_STREAM_TYPE: name = "Stream Type"; break;
1185 case V4L2_CID_MPEG_STREAM_PID_PMT: name = "Stream PMT Program ID"; break;
1186 case V4L2_CID_MPEG_STREAM_PID_AUDIO: name = "Stream Audio Program ID"; break;
1187 case V4L2_CID_MPEG_STREAM_PID_VIDEO: name = "Stream Video Program ID"; break;
1188 case V4L2_CID_MPEG_STREAM_PID_PCR: name = "Stream PCR Program ID"; break;
1189 case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: name = "Stream PES Audio ID"; break;
1190 case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: name = "Stream PES Video ID"; break;
1191 case V4L2_CID_MPEG_STREAM_VBI_FMT: name = "Stream VBI Format"; break;
1196 switch (qctrl->id) {
1197 case V4L2_CID_AUDIO_MUTE:
1198 case V4L2_CID_AUDIO_LOUDNESS:
1199 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
1200 case V4L2_CID_MPEG_VIDEO_PULLDOWN:
1201 qctrl->type = V4L2_CTRL_TYPE_BOOLEAN;
1205 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
1206 case V4L2_CID_MPEG_AUDIO_ENCODING:
1207 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
1208 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
1209 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
1210 case V4L2_CID_MPEG_AUDIO_MODE:
1211 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
1212 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
1213 case V4L2_CID_MPEG_AUDIO_CRC:
1214 case V4L2_CID_MPEG_VIDEO_ENCODING:
1215 case V4L2_CID_MPEG_VIDEO_ASPECT:
1216 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1217 case V4L2_CID_MPEG_STREAM_TYPE:
1218 case V4L2_CID_MPEG_STREAM_VBI_FMT:
1219 qctrl->type = V4L2_CTRL_TYPE_MENU;
1222 case V4L2_CID_USER_CLASS:
1223 case V4L2_CID_MPEG_CLASS:
1224 qctrl->type = V4L2_CTRL_TYPE_CTRL_CLASS;
1225 qctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1226 min = max = step = def = 0;
1229 qctrl->type = V4L2_CTRL_TYPE_INTEGER;
1232 switch (qctrl->id) {
1233 case V4L2_CID_MPEG_AUDIO_ENCODING:
1234 case V4L2_CID_MPEG_AUDIO_MODE:
1235 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1236 case V4L2_CID_MPEG_VIDEO_B_FRAMES:
1237 case V4L2_CID_MPEG_STREAM_TYPE:
1238 qctrl->flags |= V4L2_CTRL_FLAG_UPDATE;
1240 case V4L2_CID_AUDIO_VOLUME:
1241 case V4L2_CID_AUDIO_BALANCE:
1242 case V4L2_CID_AUDIO_BASS:
1243 case V4L2_CID_AUDIO_TREBLE:
1244 case V4L2_CID_BRIGHTNESS:
1245 case V4L2_CID_CONTRAST:
1246 case V4L2_CID_SATURATION:
1248 qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
1251 qctrl->minimum = min;
1252 qctrl->maximum = max;
1254 qctrl->default_value = def;
1255 qctrl->reserved[0] = qctrl->reserved[1] = 0;
1256 snprintf(qctrl->name, sizeof(qctrl->name), name);
1260 /* Fill in a struct v4l2_queryctrl with standard values based on
1262 int v4l2_ctrl_query_fill_std(struct v4l2_queryctrl *qctrl)
1264 switch (qctrl->id) {
1266 case V4L2_CID_USER_CLASS:
1267 case V4L2_CID_MPEG_CLASS:
1268 return v4l2_ctrl_query_fill(qctrl, 0, 0, 0, 0);
1269 case V4L2_CID_AUDIO_VOLUME:
1270 return v4l2_ctrl_query_fill(qctrl, 0, 65535, 65535 / 100, 58880);
1271 case V4L2_CID_AUDIO_MUTE:
1272 case V4L2_CID_AUDIO_LOUDNESS:
1273 return v4l2_ctrl_query_fill(qctrl, 0, 1, 1, 0);
1274 case V4L2_CID_AUDIO_BALANCE:
1275 case V4L2_CID_AUDIO_BASS:
1276 case V4L2_CID_AUDIO_TREBLE:
1277 return v4l2_ctrl_query_fill(qctrl, 0, 65535, 65535 / 100, 32768);
1278 case V4L2_CID_BRIGHTNESS:
1279 return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 128);
1280 case V4L2_CID_CONTRAST:
1281 case V4L2_CID_SATURATION:
1282 return v4l2_ctrl_query_fill(qctrl, 0, 127, 1, 64);
1284 return v4l2_ctrl_query_fill(qctrl, -128, 127, 1, 0);
1287 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
1288 return v4l2_ctrl_query_fill(qctrl,
1289 V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100,
1290 V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000, 1,
1291 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000);
1292 case V4L2_CID_MPEG_AUDIO_ENCODING:
1293 return v4l2_ctrl_query_fill(qctrl,
1294 V4L2_MPEG_AUDIO_ENCODING_LAYER_1,
1295 V4L2_MPEG_AUDIO_ENCODING_LAYER_3, 1,
1296 V4L2_MPEG_AUDIO_ENCODING_LAYER_2);
1297 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
1298 return v4l2_ctrl_query_fill(qctrl,
1299 V4L2_MPEG_AUDIO_L1_BITRATE_32K,
1300 V4L2_MPEG_AUDIO_L1_BITRATE_448K, 1,
1301 V4L2_MPEG_AUDIO_L1_BITRATE_256K);
1302 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
1303 return v4l2_ctrl_query_fill(qctrl,
1304 V4L2_MPEG_AUDIO_L2_BITRATE_32K,
1305 V4L2_MPEG_AUDIO_L2_BITRATE_384K, 1,
1306 V4L2_MPEG_AUDIO_L2_BITRATE_224K);
1307 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
1308 return v4l2_ctrl_query_fill(qctrl,
1309 V4L2_MPEG_AUDIO_L3_BITRATE_32K,
1310 V4L2_MPEG_AUDIO_L3_BITRATE_320K, 1,
1311 V4L2_MPEG_AUDIO_L3_BITRATE_192K);
1312 case V4L2_CID_MPEG_AUDIO_MODE:
1313 return v4l2_ctrl_query_fill(qctrl,
1314 V4L2_MPEG_AUDIO_MODE_STEREO,
1315 V4L2_MPEG_AUDIO_MODE_MONO, 1,
1316 V4L2_MPEG_AUDIO_MODE_STEREO);
1317 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
1318 return v4l2_ctrl_query_fill(qctrl,
1319 V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4,
1320 V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16, 1,
1321 V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4);
1322 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
1323 return v4l2_ctrl_query_fill(qctrl,
1324 V4L2_MPEG_AUDIO_EMPHASIS_NONE,
1325 V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17, 1,
1326 V4L2_MPEG_AUDIO_EMPHASIS_NONE);
1327 case V4L2_CID_MPEG_AUDIO_CRC:
1328 return v4l2_ctrl_query_fill(qctrl,
1329 V4L2_MPEG_AUDIO_CRC_NONE,
1330 V4L2_MPEG_AUDIO_CRC_CRC16, 1,
1331 V4L2_MPEG_AUDIO_CRC_NONE);
1332 case V4L2_CID_MPEG_VIDEO_ENCODING:
1333 return v4l2_ctrl_query_fill(qctrl,
1334 V4L2_MPEG_VIDEO_ENCODING_MPEG_1,
1335 V4L2_MPEG_VIDEO_ENCODING_MPEG_2, 1,
1336 V4L2_MPEG_VIDEO_ENCODING_MPEG_2);
1337 case V4L2_CID_MPEG_VIDEO_ASPECT:
1338 return v4l2_ctrl_query_fill(qctrl,
1339 V4L2_MPEG_VIDEO_ASPECT_1x1,
1340 V4L2_MPEG_VIDEO_ASPECT_221x100, 1,
1341 V4L2_MPEG_VIDEO_ASPECT_4x3);
1342 case V4L2_CID_MPEG_VIDEO_B_FRAMES:
1343 return v4l2_ctrl_query_fill(qctrl, 0, 33, 1, 2);
1344 case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
1345 return v4l2_ctrl_query_fill(qctrl, 1, 34, 1, 12);
1346 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
1347 return v4l2_ctrl_query_fill(qctrl, 0, 1, 1, 1);
1348 case V4L2_CID_MPEG_VIDEO_PULLDOWN:
1349 return v4l2_ctrl_query_fill(qctrl, 0, 1, 1, 0);
1350 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1351 return v4l2_ctrl_query_fill(qctrl,
1352 V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
1353 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 1,
1354 V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
1355 case V4L2_CID_MPEG_VIDEO_BITRATE:
1356 return v4l2_ctrl_query_fill(qctrl, 0, 27000000, 1, 6000000);
1357 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
1358 return v4l2_ctrl_query_fill(qctrl, 0, 27000000, 1, 8000000);
1359 case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION:
1360 return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0);
1361 case V4L2_CID_MPEG_STREAM_TYPE:
1362 return v4l2_ctrl_query_fill(qctrl,
1363 V4L2_MPEG_STREAM_TYPE_MPEG2_PS,
1364 V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD, 1,
1365 V4L2_MPEG_STREAM_TYPE_MPEG2_PS);
1366 case V4L2_CID_MPEG_STREAM_PID_PMT:
1367 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 16);
1368 case V4L2_CID_MPEG_STREAM_PID_AUDIO:
1369 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 260);
1370 case V4L2_CID_MPEG_STREAM_PID_VIDEO:
1371 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 256);
1372 case V4L2_CID_MPEG_STREAM_PID_PCR:
1373 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 259);
1374 case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO:
1375 return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0);
1376 case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO:
1377 return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0);
1378 case V4L2_CID_MPEG_STREAM_VBI_FMT:
1379 return v4l2_ctrl_query_fill(qctrl,
1380 V4L2_MPEG_STREAM_VBI_FMT_NONE,
1381 V4L2_MPEG_STREAM_VBI_FMT_IVTV, 1,
1382 V4L2_MPEG_STREAM_VBI_FMT_NONE);
1388 /* Fill in a struct v4l2_querymenu based on the struct v4l2_queryctrl and
1389 the menu. The qctrl pointer may be NULL, in which case it is ignored. */
1390 int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu, struct v4l2_queryctrl *qctrl,
1391 const char **menu_items)
1395 if (menu_items == NULL ||
1396 (qctrl && (qmenu->index < qctrl->minimum || qmenu->index > qctrl->maximum)))
1398 for (i = 0; i < qmenu->index && menu_items[i]; i++) ;
1399 if (menu_items[i] == NULL || menu_items[i][0] == '\0')
1401 snprintf(qmenu->name, sizeof(qmenu->name), menu_items[qmenu->index]);
1402 qmenu->reserved = 0;
1406 /* ctrl_classes points to an array of u32 pointers, the last element is
1407 a NULL pointer. Each u32 array is a 0-terminated array of control IDs.
1408 Each array must be sorted low to high and belong to the same control
1409 class. The array of u32 pointer must also be sorted, from low class IDs
1412 This function returns the first ID that follows after the given ID.
1413 When no more controls are available 0 is returned. */
1414 u32 v4l2_ctrl_next(const u32 * const * ctrl_classes, u32 id)
1419 /* if no query is desired, then just return the control ID */
1420 if ((id & V4L2_CTRL_FLAG_NEXT_CTRL) == 0)
1422 if (ctrl_classes == NULL)
1424 id &= V4L2_CTRL_ID_MASK;
1425 ctrl_class = V4L2_CTRL_ID2CLASS(id);
1426 id++; /* select next control */
1427 /* find first class that matches (or is greater than) the class of
1429 while (*ctrl_classes && V4L2_CTRL_ID2CLASS(**ctrl_classes) < ctrl_class)
1431 /* no more classes */
1432 if (*ctrl_classes == NULL)
1434 pctrl = *ctrl_classes;
1435 /* find first ctrl within the class that is >= ID */
1436 while (*pctrl && *pctrl < id) pctrl++;
1439 /* we are at the end of the controls of the current class. */
1440 /* continue with next class if available */
1442 if (*ctrl_classes == NULL)
1444 return **ctrl_classes;
1447 /* ----------------------------------------------------------------- */
1449 EXPORT_SYMBOL(v4l2_video_std_construct);
1451 EXPORT_SYMBOL(v4l2_prio_init);
1452 EXPORT_SYMBOL(v4l2_prio_change);
1453 EXPORT_SYMBOL(v4l2_prio_open);
1454 EXPORT_SYMBOL(v4l2_prio_close);
1455 EXPORT_SYMBOL(v4l2_prio_max);
1456 EXPORT_SYMBOL(v4l2_prio_check);
1458 EXPORT_SYMBOL(v4l2_field_names);
1459 EXPORT_SYMBOL(v4l2_type_names);
1460 EXPORT_SYMBOL(v4l_printk_ioctl);
1461 EXPORT_SYMBOL(v4l_printk_ioctl_arg);
1463 EXPORT_SYMBOL(v4l2_ctrl_next);
1464 EXPORT_SYMBOL(v4l2_ctrl_check);
1465 EXPORT_SYMBOL(v4l2_ctrl_get_menu);
1466 EXPORT_SYMBOL(v4l2_ctrl_query_menu);
1467 EXPORT_SYMBOL(v4l2_ctrl_query_fill);
1468 EXPORT_SYMBOL(v4l2_ctrl_query_fill_std);