1 /******************************************************************************
5 ******************************************************************************/
11 * This is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * The software is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this software; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 /*****************************************************************************/
29 #include "easycap_debug.h"
31 /*---------------------------------------------------------------------------*/
33 * THE LEAST SIGNIFICANT BIT OF easycap_standard.mask HAS MEANING:
37 * THE MOST SIGNIFICANT BIT OF easycap_standard.mask HAS MEANING:
41 /*---------------------------------------------------------------------------*/
42 const struct easycap_standard easycap_standard[] = {
44 .mask = 0x00FF & PAL_BGHIN ,
47 .id = (V4L2_STD_PAL_B | V4L2_STD_PAL_G | V4L2_STD_PAL_H | \
48 V4L2_STD_PAL_I | V4L2_STD_PAL_N),
50 .frameperiod = {1, 25},
52 .reserved = {0, 0, 0, 0}
55 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
57 .mask = 0x00FF & NTSC_N_443 ,
60 .id = V4L2_STD_UNKNOWN,
62 .frameperiod = {1, 25},
64 .reserved = {0, 0, 0, 0}
67 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
69 .mask = 0x00FF & PAL_Nc ,
72 .id = V4L2_STD_PAL_Nc,
74 .frameperiod = {1, 25},
76 .reserved = {0, 0, 0, 0}
79 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
81 .mask = 0x00FF & NTSC_N ,
84 .id = V4L2_STD_UNKNOWN,
86 .frameperiod = {1, 25},
88 .reserved = {0, 0, 0, 0}
91 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
93 .mask = 0x00FF & SECAM ,
98 .frameperiod = {1, 25},
100 .reserved = {0, 0, 0, 0}
103 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
105 .mask = 0x00FF & NTSC_M ,
108 .id = V4L2_STD_NTSC_M,
110 .frameperiod = {1, 30},
112 .reserved = {0, 0, 0, 0}
115 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
117 .mask = 0x00FF & NTSC_M_JP ,
120 .id = V4L2_STD_NTSC_M_JP,
122 .frameperiod = {1, 30},
124 .reserved = {0, 0, 0, 0}
127 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
129 .mask = 0x00FF & PAL_60 ,
132 .id = V4L2_STD_PAL_60,
134 .frameperiod = {1, 30},
136 .reserved = {0, 0, 0, 0}
139 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
141 .mask = 0x00FF & NTSC_443 ,
144 .id = V4L2_STD_NTSC_443,
146 .frameperiod = {1, 30},
148 .reserved = {0, 0, 0, 0}
151 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
153 .mask = 0x00FF & PAL_M ,
156 .id = V4L2_STD_PAL_M,
158 .frameperiod = {1, 30},
160 .reserved = {0, 0, 0, 0}
163 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
165 .mask = 0x8000 | (0x00FF & PAL_BGHIN_SLOW),
167 .index = PAL_BGHIN_SLOW,
168 .id = (V4L2_STD_PAL_B | V4L2_STD_PAL_G | V4L2_STD_PAL_H | \
169 V4L2_STD_PAL_I | V4L2_STD_PAL_N | \
170 (((v4l2_std_id)0x01) << 32)),
171 .name = "PAL_BGHIN_SLOW",
172 .frameperiod = {1, 5},
174 .reserved = {0, 0, 0, 0}
177 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
179 .mask = 0x8000 | (0x00FF & NTSC_N_443_SLOW),
181 .index = NTSC_N_443_SLOW,
182 .id = (V4L2_STD_UNKNOWN | (((v4l2_std_id)0x11) << 32)),
183 .name = "NTSC_N_443_SLOW",
184 .frameperiod = {1, 5},
186 .reserved = {0, 0, 0, 0}
189 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
191 .mask = 0x8000 | (0x00FF & PAL_Nc_SLOW),
193 .index = PAL_Nc_SLOW,
194 .id = (V4L2_STD_PAL_Nc | (((v4l2_std_id)0x01) << 32)),
195 .name = "PAL_Nc_SLOW",
196 .frameperiod = {1, 5},
198 .reserved = {0, 0, 0, 0}
201 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
203 .mask = 0x8000 | (0x00FF & NTSC_N_SLOW),
205 .index = NTSC_N_SLOW,
206 .id = (V4L2_STD_UNKNOWN | (((v4l2_std_id)0x21) << 32)),
207 .name = "NTSC_N_SLOW",
208 .frameperiod = {1, 5},
210 .reserved = {0, 0, 0, 0}
213 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
215 .mask = 0x8000 | (0x00FF & SECAM_SLOW),
218 .id = (V4L2_STD_SECAM | (((v4l2_std_id)0x01) << 32)),
219 .name = "SECAM_SLOW",
220 .frameperiod = {1, 5},
222 .reserved = {0, 0, 0, 0}
225 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
227 .mask = 0x8000 | (0x00FF & NTSC_M_SLOW),
229 .index = NTSC_M_SLOW,
230 .id = (V4L2_STD_NTSC_M | (((v4l2_std_id)0x01) << 32)),
231 .name = "NTSC_M_SLOW",
232 .frameperiod = {1, 6},
234 .reserved = {0, 0, 0, 0}
237 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
239 .mask = 0x8000 | (0x00FF & NTSC_M_JP_SLOW),
241 .index = NTSC_M_JP_SLOW,
242 .id = (V4L2_STD_NTSC_M_JP | (((v4l2_std_id)0x01) << 32)),
243 .name = "NTSC_M_JP_SLOW",
244 .frameperiod = {1, 6},
246 .reserved = {0, 0, 0, 0}
249 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
251 .mask = 0x8000 | (0x00FF & PAL_60_SLOW),
253 .index = PAL_60_SLOW,
254 .id = (V4L2_STD_PAL_60 | (((v4l2_std_id)0x01) << 32)),
255 .name = "PAL_60_SLOW",
256 .frameperiod = {1, 6},
258 .reserved = {0, 0, 0, 0}
261 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
263 .mask = 0x8000 | (0x00FF & NTSC_443_SLOW),
265 .index = NTSC_443_SLOW,
266 .id = (V4L2_STD_NTSC_443 | (((v4l2_std_id)0x01) << 32)),
267 .name = "NTSC_443_SLOW",
268 .frameperiod = {1, 6},
270 .reserved = {0, 0, 0, 0}
273 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
275 .mask = 0x8000 | (0x00FF & PAL_M_SLOW),
278 .id = (V4L2_STD_PAL_M | (((v4l2_std_id)0x01) << 32)),
279 .name = "PAL_M_SLOW",
280 .frameperiod = {1, 6},
282 .reserved = {0, 0, 0, 0}
285 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
290 /*---------------------------------------------------------------------------*/
292 * THE 16-BIT easycap_format.mask HAS MEANING:
293 * (least significant) BIT 0: 0 => PAL, 25 FPS; 1 => NTSC, 30 FPS
294 * BITS 2-4: RESERVED FOR DIFFERENTIATING STANDARDS
295 * BITS 5-7: NUMBER OF BYTES PER PIXEL
296 * BIT 8: 0 => NATIVE BYTE ORDER; 1 => SWAPPED
297 * BITS 9-10: RESERVED FOR OTHER BYTE PERMUTATIONS
298 * BIT 11: 0 => UNDECIMATED; 1 => DECIMATED
299 * BIT 12: 0 => OFFER FRAMES; 1 => OFFER FIELDS
300 * BIT 13: 0 => FULL FRAMERATE; 1 => REDUCED
301 * (most significant) BITS 14-15: RESERVED FOR OTHER FIELD/FRAME OPTIONS
303 * bytesperpixel IS ((0x00E0 & easycap_format.mask) >> 5)
304 * byteswaporder IS true IF (0 != (0x0100 & easycap_format.mask))
306 * decimatepixel IS true IF (0 != (0x0800 & easycap_format.mask))
308 * offerfields IS true IF (0 != (0x1000 & easycap_format.mask))
310 /*---------------------------------------------------------------------------*/
312 struct easycap_format easycap_format[1 + SETTINGS_MANY];
318 __u32 width, height, pixelformat, bytesperline, sizeimage;
319 __u32 field, colorspace;
320 __u16 mask1, mask2, mask3, mask4;
321 char name1[32], name2[32], name3[32], name4[32];
323 for (i = 0, n = 0; i < STANDARD_MANY; i++) {
327 mask1 = 0x1F & PAL_BGHIN;
328 strcpy(&name1[0], "PAL_BGHIN");
329 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
333 mask1 = 0x1F & SECAM;
334 strcpy(&name1[0], "SECAM");
335 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
339 mask1 = 0x1F & PAL_Nc;
340 strcpy(&name1[0], "PAL_Nc");
341 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
345 mask1 = 0x1F & PAL_60;
346 strcpy(&name1[0], "PAL_60");
347 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
351 mask1 = 0x1F & PAL_M;
352 strcpy(&name1[0], "PAL_M");
353 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
357 mask1 = 0x1F & NTSC_M;
358 strcpy(&name1[0], "NTSC_M");
359 colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
363 mask1 = 0x1F & NTSC_443;
364 strcpy(&name1[0], "NTSC_443");
365 colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
369 mask1 = 0x1F & NTSC_M_JP;
370 strcpy(&name1[0], "NTSC_M_JP");
371 colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
375 mask1 = 0x1F & NTSC_M;
376 strcpy(&name1[0], "NTSC_N");
377 colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
381 mask1 = 0x1F & NTSC_N_443;
382 strcpy(&name1[0], "NTSC_N_443");
383 colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
386 case PAL_BGHIN_SLOW: {
387 mask1 = 0x001F & PAL_BGHIN_SLOW;
389 strcpy(&name1[0], "PAL_BGHIN_SLOW");
390 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
394 mask1 = 0x001F & SECAM_SLOW;
396 strcpy(&name1[0], "SECAM_SLOW");
397 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
401 mask1 = 0x001F & PAL_Nc_SLOW;
403 strcpy(&name1[0], "PAL_Nc_SLOW");
404 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
408 mask1 = 0x001F & PAL_60_SLOW;
410 strcpy(&name1[0], "PAL_60_SLOW");
411 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
415 mask1 = 0x001F & PAL_M_SLOW;
417 strcpy(&name1[0], "PAL_M_SLOW");
418 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
422 mask1 = 0x001F & NTSC_M_SLOW;
424 strcpy(&name1[0], "NTSC_M_SLOW");
425 colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
428 case NTSC_443_SLOW: {
429 mask1 = 0x001F & NTSC_443_SLOW;
431 strcpy(&name1[0], "NTSC_443_SLOW");
432 colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
435 case NTSC_M_JP_SLOW: {
436 mask1 = 0x001F & NTSC_M_JP_SLOW;
438 strcpy(&name1[0], "NTSC_M_JP_SLOW");
439 colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
443 mask1 = 0x001F & NTSC_N_SLOW;
445 strcpy(&name1[0], "NTSC_N_SLOW");
446 colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
449 case NTSC_N_443_SLOW: {
450 mask1 = 0x001F & NTSC_N_443_SLOW;
452 strcpy(&name1[0], "NTSC_N_443_SLOW");
453 colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
460 for (j = 0; j < RESOLUTION_MANY; j++) {
466 strcpy(&name2[0], "_AT_720x576");
467 width = 720; height = 576; break;
472 strcpy(&name2[0], "_AT_704x576");
473 width = 704; height = 576; break;
476 strcpy(&name2[0], "_AT_640x480");
477 width = 640; height = 480; break;
482 strcpy(&name2[0], "_AT_720x480");
483 width = 720; height = 480; break;
488 strcpy(&name2[0], "_AT_360x288");
489 width = 360; height = 288; mask2 = 0x0800; break;
492 strcpy(&name2[0], "_AT_320x240");
493 width = 320; height = 240; mask2 = 0x0800; break;
498 strcpy(&name2[0], "_AT_360x240");
499 width = 360; height = 240; mask2 = 0x0800; break;
505 for (k = 0; k < PIXELFORMAT_MANY; k++) {
509 strcpy(&name3[0], "_" STRINGIZE(FMT_UYVY));
510 pixelformat = V4L2_PIX_FMT_UYVY;
511 mask3 |= (0x02 << 5);
515 strcpy(&name3[0], "_" STRINGIZE(FMT_YUY2));
516 pixelformat = V4L2_PIX_FMT_YUYV;
517 mask3 |= (0x02 << 5);
522 strcpy(&name3[0], "_" STRINGIZE(FMT_RGB24));
523 pixelformat = V4L2_PIX_FMT_RGB24;
524 mask3 |= (0x03 << 5);
528 strcpy(&name3[0], "_" STRINGIZE(FMT_RGB32));
529 pixelformat = V4L2_PIX_FMT_RGB32;
530 mask3 |= (0x04 << 5);
534 strcpy(&name3[0], "_" STRINGIZE(FMT_BGR24));
535 pixelformat = V4L2_PIX_FMT_BGR24;
536 mask3 |= (0x03 << 5);
541 strcpy(&name3[0], "_" STRINGIZE(FMT_BGR32));
542 pixelformat = V4L2_PIX_FMT_BGR32;
543 mask3 |= (0x04 << 5);
550 bytesperline = width * ((mask3 & 0x00F0) >> 4);
551 sizeimage = bytesperline * height;
553 for (m = 0; m < INTERLACE_MANY; m++) {
557 strcpy(&name4[0], "-n");
558 field = V4L2_FIELD_NONE;
561 case FIELD_INTERLACED: {
562 strcpy(&name4[0], "-i");
564 field = V4L2_FIELD_INTERLACED;
570 if (SETTINGS_MANY <= n)
572 strcpy(&easycap_format[n].name[0], &name1[0]);
573 strcat(&easycap_format[n].name[0], &name2[0]);
574 strcat(&easycap_format[n].name[0], &name3[0]);
575 strcat(&easycap_format[n].name[0], &name4[0]);
576 easycap_format[n].mask = \
577 mask1 | mask2 | mask3 | mask4;
578 easycap_format[n].v4l2_format\
579 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
580 easycap_format[n].v4l2_format\
581 .fmt.pix.width = width;
582 easycap_format[n].v4l2_format\
583 .fmt.pix.height = height;
584 easycap_format[n].v4l2_format\
585 .fmt.pix.pixelformat = pixelformat;
586 easycap_format[n].v4l2_format\
587 .fmt.pix.field = field;
588 easycap_format[n].v4l2_format\
589 .fmt.pix.bytesperline = bytesperline;
590 easycap_format[n].v4l2_format\
591 .fmt.pix.sizeimage = sizeimage;
592 easycap_format[n].v4l2_format\
593 .fmt.pix.colorspace = colorspace;
594 easycap_format[n].v4l2_format\
601 if ((1 + SETTINGS_MANY) <= n)
603 easycap_format[n].mask = 0xFFFF;
606 /*---------------------------------------------------------------------------*/
607 struct v4l2_queryctrl easycap_control[] = \
609 .id = V4L2_CID_BRIGHTNESS,
610 .type = V4L2_CTRL_TYPE_INTEGER,
611 .name = "Brightness",
615 .default_value = SAA_0A_DEFAULT,
619 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
621 .id = V4L2_CID_CONTRAST,
622 .type = V4L2_CTRL_TYPE_INTEGER,
627 .default_value = SAA_0B_DEFAULT + 128,
631 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
633 .id = V4L2_CID_SATURATION,
634 .type = V4L2_CTRL_TYPE_INTEGER,
635 .name = "Saturation",
639 .default_value = SAA_0C_DEFAULT + 128,
643 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
646 .type = V4L2_CTRL_TYPE_INTEGER,
651 .default_value = SAA_0D_DEFAULT + 128,
655 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
657 .id = V4L2_CID_AUDIO_VOLUME,
658 .type = V4L2_CTRL_TYPE_INTEGER,
667 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
669 .id = V4L2_CID_AUDIO_MUTE,
670 .type = V4L2_CTRL_TYPE_BOOLEAN,
672 .default_value = true,
676 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
681 /*****************************************************************************/