1/****************************************************************************** 2* * 3* easycap_settings.c * 4* * 5******************************************************************************/ 6/* 7 * 8 * Copyright (C) 2010 R.M. Thomas <rmthomas@sciolus.org> 9 * 10 * 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. 15 * 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. 20 * 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 24 * 25*/ 26/*****************************************************************************/ 27 28#include "easycap.h" 29#include "easycap_debug.h" 30 31/*---------------------------------------------------------------------------*/ 32/* 33 * THE LEAST SIGNIFICANT BIT OF easycap_standard.mask HAS MEANING: 34 * 0 => 25 fps 35 * 1 => 30 fps 36 */ 37/*---------------------------------------------------------------------------*/ 38const struct easycap_standard easycap_standard[] = { 39{ 40.mask = 0x000F & PAL_BGHIN , 41.v4l2_standard = { 42 .index = PAL_BGHIN, 43 .id = (V4L2_STD_PAL_B | V4L2_STD_PAL_G | V4L2_STD_PAL_H | \ 44 V4L2_STD_PAL_I | V4L2_STD_PAL_N), 45 .name = "PAL_BGHIN", 46 .frameperiod = {1, 25}, 47 .framelines = 625, 48 .reserved = {0, 0, 0, 0} 49 } 50}, 51/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 52{ 53.mask = 0x000F & NTSC_N_443 , 54.v4l2_standard = { 55 .index = NTSC_N_443, 56 .id = V4L2_STD_UNKNOWN, 57 .name = "NTSC_N_443", 58 .frameperiod = {1, 25}, 59 .framelines = 480, 60 .reserved = {0, 0, 0, 0} 61} 62}, 63/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 64{ 65.mask = 0x000F & PAL_Nc , 66.v4l2_standard = { 67 .index = PAL_Nc, 68 .id = V4L2_STD_PAL_Nc, 69 .name = "PAL_Nc", 70 .frameperiod = {1, 25}, 71 .framelines = 625, 72 .reserved = {0, 0, 0, 0} 73} 74}, 75/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 76{ 77.mask = 0x000F & NTSC_N , 78.v4l2_standard = { 79 .index = NTSC_N, 80 .id = V4L2_STD_UNKNOWN, 81 .name = "NTSC_N", 82 .frameperiod = {1, 25}, 83 .framelines = 525, 84 .reserved = {0, 0, 0, 0} 85} 86}, 87/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 88{ 89.mask = 0x000F & SECAM , 90.v4l2_standard = { 91 .index = SECAM, 92 .id = V4L2_STD_SECAM, 93 .name = "SECAM", 94 .frameperiod = {1, 25}, 95 .framelines = 625, 96 .reserved = {0, 0, 0, 0} 97} 98}, 99/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 100{ 101.mask = 0x000F & NTSC_M , 102.v4l2_standard = { 103 .index = NTSC_M, 104 .id = V4L2_STD_NTSC_M, 105 .name = "NTSC_M", 106 .frameperiod = {1, 30}, 107 .framelines = 525, 108 .reserved = {0, 0, 0, 0} 109} 110}, 111/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 112{ 113.mask = 0x000F & NTSC_M_JP , 114.v4l2_standard = { 115 .index = NTSC_M_JP, 116 .id = V4L2_STD_NTSC_M_JP, 117 .name = "NTSC_M_JP", 118 .frameperiod = {1, 30}, 119 .framelines = 525, 120 .reserved = {0, 0, 0, 0} 121} 122}, 123/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 124{ 125.mask = 0x000F & PAL_60 , 126.v4l2_standard = { 127 .index = PAL_60, 128 .id = V4L2_STD_PAL_60, 129 .name = "PAL_60", 130 .frameperiod = {1, 30}, 131 .framelines = 525, 132 .reserved = {0, 0, 0, 0} 133} 134}, 135/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 136{ 137.mask = 0x000F & NTSC_443 , 138.v4l2_standard = { 139 .index = NTSC_443, 140 .id = V4L2_STD_NTSC_443, 141 .name = "NTSC_443", 142 .frameperiod = {1, 30}, 143 .framelines = 525, 144 .reserved = {0, 0, 0, 0} 145} 146}, 147/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 148{ 149.mask = 0x000F & PAL_M , 150.v4l2_standard = { 151 .index = PAL_M, 152 .id = V4L2_STD_PAL_M, 153 .name = "PAL_M", 154 .frameperiod = {1, 30}, 155 .framelines = 525, 156 .reserved = {0, 0, 0, 0} 157} 158}, 159/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 160{ 161.mask = 0xFFFF 162} 163}; 164/*---------------------------------------------------------------------------*/ 165/* 166 * THE 16-BIT easycap_format.mask HAS MEANING: 167 * (least significant) BIT 0: 0 => PAL, 25 FPS; 1 => NTSC, 30 FPS 168 * BITS 1-3: RESERVED FOR DIFFERENTIATING STANDARDS 169 * BITS 4-7: NUMBER OF BYTES PER PIXEL 170 * BIT 8: 0 => NATIVE BYTE ORDER; 1 => SWAPPED 171 * BITS 9-10: RESERVED FOR OTHER BYTE PERMUTATIONS 172 * BIT 11: 0 => UNDECIMATED; 1 => DECIMATED 173 * BIT 12: 0 => OFFER FRAMES; 1 => OFFER FIELDS 174 * (most significant) BITS 13-15: RESERVED FOR OTHER FIELD ORDER OPTIONS 175 * IT FOLLOWS THAT: 176 * bytesperpixel IS ((0x00F0 & easycap_format.mask) >> 4) 177 * byteswaporder IS true IF (0 != (0x0100 & easycap_format.mask)) 178 * 179 * decimatepixel IS true IF (0 != (0x0800 & easycap_format.mask)) 180 * 181 * offerfields IS true IF (0 != (0x1000 & easycap_format.mask)) 182 */ 183/*---------------------------------------------------------------------------*/ 184 185struct easycap_format easycap_format[1 + SETTINGS_MANY]; 186 187int 188fillin_formats(void) 189{ 190int i, j, k, m, n; 191__u32 width, height, pixelformat, bytesperline, sizeimage; 192__u32 field, colorspace; 193__u16 mask1, mask2, mask3, mask4; 194char name1[32], name2[32], name3[32], name4[32]; 195 196for (i = 0, n = 0; i < STANDARD_MANY; i++) { 197 mask1 = 0x0000; 198 switch (i) { 199 case PAL_BGHIN: { 200 mask1 = PAL_BGHIN; 201 strcpy(&name1[0], "PAL_BGHIN"); 202 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 203 break; 204 } 205 case SECAM: { 206 mask1 = SECAM; 207 strcpy(&name1[0], "SECAM"); 208 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 209 break; 210 } 211 case PAL_Nc: { 212 mask1 = PAL_Nc; 213 strcpy(&name1[0], "PAL_Nc"); 214 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 215 break; 216 } 217 case PAL_60: { 218 mask1 = PAL_60; 219 strcpy(&name1[0], "PAL_60"); 220 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 221 break; 222 } 223 case PAL_M: { 224 mask1 = PAL_M; 225 strcpy(&name1[0], "PAL_M"); 226 colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 227 break; 228 } 229 case NTSC_M: { 230 mask1 = NTSC_M; 231 strcpy(&name1[0], "NTSC_M"); 232 colorspace = V4L2_COLORSPACE_470_SYSTEM_M; 233 break; 234 } 235 case NTSC_443: { 236 mask1 = NTSC_443; 237 strcpy(&name1[0], "NTSC_443"); 238 colorspace = V4L2_COLORSPACE_470_SYSTEM_M; 239 break; 240 } 241 case NTSC_M_JP: { 242 mask1 = NTSC_M_JP; 243 strcpy(&name1[0], "NTSC_M_JP"); 244 colorspace = V4L2_COLORSPACE_470_SYSTEM_M; 245 break; 246 } 247 case NTSC_N: { 248 mask1 = NTSC_M; 249 strcpy(&name1[0], "NTSC_N"); 250 colorspace = V4L2_COLORSPACE_470_SYSTEM_M; 251 break; 252 } 253 case NTSC_N_443: { 254 mask1 = NTSC_N_443; 255 strcpy(&name1[0], "NTSC_N_443"); 256 colorspace = V4L2_COLORSPACE_470_SYSTEM_M; 257 break; 258 } 259 default: 260 return -1; 261 } 262 263 for (j = 0; j < RESOLUTION_MANY; j++) { 264 mask2 = 0x0000; 265 switch (j) { 266 case AT_720x576: { 267 if (0x1 & mask1) 268 continue; 269 strcpy(&name2[0], "_AT_720x576"); 270 width = 720; height = 576; break; 271 } 272 case AT_704x576: { 273 if (0x1 & mask1) 274 continue; 275 strcpy(&name2[0], "_AT_704x576"); 276 width = 704; height = 576; break; 277 } 278 case AT_640x480: { 279 strcpy(&name2[0], "_AT_640x480"); 280 width = 640; height = 480; break; 281 } 282 case AT_720x480: { 283 if (!(0x1 & mask1)) 284 continue; 285 strcpy(&name2[0], "_AT_720x480"); 286 width = 720; height = 480; break; 287 } 288 case AT_360x288: { 289 if (0x1 & mask1) 290 continue; 291 strcpy(&name2[0], "_AT_360x288"); 292 width = 360; height = 288; mask2 = 0x0800; break; 293 } 294 case AT_320x240: { 295 strcpy(&name2[0], "_AT_320x240"); 296 width = 320; height = 240; mask2 = 0x0800; break; 297 } 298 case AT_360x240: { 299 if (!(0x1 & mask1)) 300 continue; 301 strcpy(&name2[0], "_AT_360x240"); 302 width = 360; height = 240; mask2 = 0x0800; break; 303 } 304 default: 305 return -2; 306 } 307 308 for (k = 0; k < PIXELFORMAT_MANY; k++) { 309 mask3 = 0x0000; 310 switch (k) { 311 case FMT_UYVY: { 312 strcpy(&name3[0], "_" STRINGIZE(FMT_UYVY)); 313 pixelformat = V4L2_PIX_FMT_UYVY; 314 mask3 |= (0x02 << 4); 315 break; 316 } 317 case FMT_YUY2: { 318 strcpy(&name3[0], "_" STRINGIZE(FMT_YUY2)); 319 pixelformat = V4L2_PIX_FMT_YUYV; 320 mask3 |= (0x02 << 4); 321 mask3 |= 0x0100; 322 break; 323 } 324 case FMT_RGB24: { 325 strcpy(&name3[0], "_" STRINGIZE(FMT_RGB24)); 326 pixelformat = V4L2_PIX_FMT_RGB24; 327 mask3 |= (0x03 << 4); 328 break; 329 } 330 case FMT_RGB32: { 331 strcpy(&name3[0], "_" STRINGIZE(FMT_RGB32)); 332 pixelformat = V4L2_PIX_FMT_RGB32; 333 mask3 |= (0x04 << 4); 334 break; 335 } 336 case FMT_BGR24: { 337 strcpy(&name3[0], "_" STRINGIZE(FMT_BGR24)); 338 pixelformat = V4L2_PIX_FMT_BGR24; 339 mask3 |= (0x03 << 4); 340 mask3 |= 0x0100; 341 break; 342 } 343 case FMT_BGR32: { 344 strcpy(&name3[0], "_" STRINGIZE(FMT_BGR32)); 345 pixelformat = V4L2_PIX_FMT_BGR32; 346 mask3 |= (0x04 << 4); 347 mask3 |= 0x0100; 348 break; 349 } 350 default: 351 return -3; 352 } 353 bytesperline = width * ((mask3 & 0x00F0) >> 4); 354 sizeimage = bytesperline * height; 355 356 for (m = 0; m < INTERLACE_MANY; m++) { 357 mask4 = 0x0000; 358 switch (m) { 359 case FIELD_NONE: { 360 strcpy(&name4[0], "-n"); 361 field = V4L2_FIELD_NONE; 362 break; 363 } 364 case FIELD_INTERLACED: { 365 strcpy(&name4[0], "-i"); 366 field = V4L2_FIELD_INTERLACED; 367 break; 368 } 369 case FIELD_ALTERNATE: { 370 strcpy(&name4[0], "-a"); 371 mask4 |= 0x1000; 372 field = V4L2_FIELD_ALTERNATE; 373 break; 374 } 375 default: 376 return -4; 377 } 378 if (SETTINGS_MANY <= n) 379 return -5; 380 strcpy(&easycap_format[n].name[0], &name1[0]); 381 strcat(&easycap_format[n].name[0], &name2[0]); 382 strcat(&easycap_format[n].name[0], &name3[0]); 383 strcat(&easycap_format[n].name[0], &name4[0]); 384 easycap_format[n].mask = \ 385 mask1 | mask2 | mask3 | mask4; 386 easycap_format[n].v4l2_format\ 387 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 388 easycap_format[n].v4l2_format\ 389 .fmt.pix.width = width; 390 easycap_format[n].v4l2_format\ 391 .fmt.pix.height = height; 392 easycap_format[n].v4l2_format\ 393 .fmt.pix.pixelformat = pixelformat; 394 easycap_format[n].v4l2_format\ 395 .fmt.pix.field = field; 396 easycap_format[n].v4l2_format\ 397 .fmt.pix.bytesperline = bytesperline; 398 easycap_format[n].v4l2_format\ 399 .fmt.pix.sizeimage = sizeimage; 400 easycap_format[n].v4l2_format\ 401 .fmt.pix.colorspace = colorspace; 402 easycap_format[n].v4l2_format\ 403 .fmt.pix.priv = 0; 404 n++; 405 } 406 } 407 } 408} 409if ((1 + SETTINGS_MANY) <= n) 410 return -6; 411easycap_format[n].mask = 0xFFFF; 412return n; 413} 414/*---------------------------------------------------------------------------*/ 415struct v4l2_queryctrl easycap_control[] = \ 416 {{ 417.id = V4L2_CID_BRIGHTNESS, 418.type = V4L2_CTRL_TYPE_INTEGER, 419.name = "Brightness", 420.minimum = 0, 421.maximum = 255, 422.step = 1, 423.default_value = SAA_0A_DEFAULT, 424.flags = 0, 425.reserved = {0, 0} 426}, 427/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 428{ 429.id = V4L2_CID_CONTRAST, 430.type = V4L2_CTRL_TYPE_INTEGER, 431.name = "Contrast", 432.minimum = 0, 433.maximum = 255, 434.step = 1, 435.default_value = SAA_0B_DEFAULT + 128, 436.flags = 0, 437.reserved = {0, 0} 438}, 439/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 440{ 441.id = V4L2_CID_SATURATION, 442.type = V4L2_CTRL_TYPE_INTEGER, 443.name = "Saturation", 444.minimum = 0, 445.maximum = 255, 446.step = 1, 447.default_value = SAA_0C_DEFAULT + 128, 448.flags = 0, 449.reserved = {0, 0} 450}, 451/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 452{ 453.id = V4L2_CID_HUE, 454.type = V4L2_CTRL_TYPE_INTEGER, 455.name = "Hue", 456.minimum = 0, 457.maximum = 255, 458.step = 1, 459.default_value = SAA_0D_DEFAULT + 128, 460.flags = 0, 461.reserved = {0, 0} 462}, 463/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 464{ 465.id = V4L2_CID_AUDIO_VOLUME, 466.type = V4L2_CTRL_TYPE_INTEGER, 467.name = "Volume", 468.minimum = 0, 469.maximum = 31, 470.step = 1, 471.default_value = 16, 472.flags = 0, 473.reserved = {0, 0} 474}, 475/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 476{ 477.id = V4L2_CID_AUDIO_MUTE, 478.type = V4L2_CTRL_TYPE_BOOLEAN, 479.name = "Mute", 480.default_value = true, 481.flags = 0, 482.reserved = {0, 0} 483}, 484/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 485{ 486.id = 0xFFFFFFFF 487} 488 }; 489/*****************************************************************************/ 490