• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdenetwork API Reference
  • KDE Home
  • Contact Us
 

kopete/libkopete

  • sources
  • kde-4.12
  • kdenetwork
  • kopete
  • libkopete
  • avdevice
videodevice.cpp
Go to the documentation of this file.
1 /*
2  videodevice.cpp - Kopete Video Device Low-level Support
3 
4  Copyright (c) 2005-2006 by Cláudio da Silveira Pinheiro <taupter@gmail.com>
5  Copyright (c) 2010-2011 by Frank Schaefer <fschaefer.oss@googlemail.com>
6 
7  Kopete (c) 2002-2003 by the Kopete developers <kopete-devel@kde.org>
8 
9  *************************************************************************
10  * *
11  * This library is free software; you can redistribute it and/or *
12  * modify it under the terms of the GNU Lesser General Public *
13  * License as published by the Free Software Foundation; either *
14  * version 2 of the License, or (at your option) any later version. *
15  * *
16  *************************************************************************
17 */
18 
19 #define ENABLE_AV
20 
21 #include <cstdlib>
22 #include <cerrno>
23 #include <cstring>
24 
25 #include <kdebug.h>
26 
27 #include "videoinput.h"
28 #include "videodevice.h"
29 
30 #include "bayer.h"
31 #include "sonix_compress.h"
32 
33 #define CLEAR(x) memset (&(x), 0, sizeof (x))
34 
35 namespace Kopete {
36 
37 namespace AV {
38 
39 VideoDevice::VideoDevice()
40 {
41  descriptor = -1;
42  m_streambuffers = 0;
43  m_current_input = 0;
44 }
45 
46 
47 VideoDevice::~VideoDevice()
48 {
49  close();
50 }
51 
59 void VideoDevice::setupControls()
60 {
61 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
62  bool driver_vflip = false;
63  bool driver_hflip = false;
64 #endif
65  m_numericCtrls.clear();
66  m_booleanCtrls.clear();
67  m_menuCtrls.clear();
68  m_actionCtrls.clear();
69 
70  switch(m_driver)
71  {
72 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
73 #ifdef V4L2_CAP_VIDEO_CAPTURE
74  case VIDEODEV_DRIVER_V4L2:
75  struct v4l2_queryctrl qctrl;
76  CLEAR (qctrl);
77  // Get standard controls:
78  for (quint32 k = V4L2_CID_BASE; k < V4L2_CID_LASTP1; k++) // NOTE: DO NOT USE qctrl.id DIRECTLY !
79  {
80  qctrl.id = k;
81  if (0 == xioctl(VIDIOC_QUERYCTRL, &qctrl))
82  {
83  if (qctrl.flags & V4L2_CTRL_FLAG_DISABLED)
84  continue;
85  if (qctrl.id == V4L2_CID_VFLIP)
86  driver_vflip = true;
87  if (qctrl.id == V4L2_CID_HFLIP)
88  driver_hflip = true;
89  const char *name_uni = getUnifiedV4L2StdCtrlName(qctrl.id);
90  if (name_uni && strlen(name_uni))
91  strncpy((char*)qctrl.name, name_uni, 32); // NOTE: v4l2_queryctrl.name is _u8[32]
92  saveV4L2ControlData(qctrl);
93  }
94  else
95  {
96  if (errno == EINVAL)
97  continue;
98  kDebug() << "VIDIOC_QUERYCTRL failed (" << errno << ").";
99  }
100  }
101  // Get custom controls:
102  for (quint32 k = V4L2_CID_PRIVATE_BASE; ; k++)
103  {
104  qctrl.id = k;
105  if (0 == xioctl(VIDIOC_QUERYCTRL, &qctrl))
106  {
107  if (qctrl.flags & V4L2_CTRL_FLAG_DISABLED)
108  continue;
109  saveV4L2ControlData(qctrl);
110  }
111  else
112  {
113  if (errno == EINVAL)
114  break;
115  kDebug() << "VIDIOC_QUERYCTRL failed (" << errno << ").";
116  }
117  }
118  break;
119 #endif
120  case VIDEODEV_DRIVER_V4L:
121  {
122  NumericVideoControl numCtrl;
123  numCtrl.value_min = 0;
124  numCtrl.value_max = 65535;
125  numCtrl.value_step = 1;
126  numCtrl.value_default = 32767;
127  numCtrl.id = IMGCTRL_ID_V4L1_BRIGHTNESS;
128  numCtrl.name = i18n("Brightness");
129  m_numericCtrls.push_back( numCtrl );
130  numCtrl.id = IMGCTRL_ID_V4L1_HUE;
131  numCtrl.name = i18n("Hue");
132  m_numericCtrls.push_back( numCtrl );
133  numCtrl.id = IMGCTRL_ID_V4L1_COLOR;
134  numCtrl.name = i18n("Color");
135  m_numericCtrls.push_back( numCtrl );
136  numCtrl.id = IMGCTRL_ID_V4L1_CONTRAST;
137  numCtrl.name = i18n("Contrast");
138  m_numericCtrls.push_back( numCtrl );
139  numCtrl.id = IMGCTRL_ID_V4L1_WHITENESS;
140  numCtrl.name = i18n("Whiteness");
141  m_numericCtrls.push_back( numCtrl );
142  }
143  break;
144 #endif
145  case VIDEODEV_DRIVER_NONE:
146  default:
147  break;
148  }
149 
150 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
151  // Software controls:
152  BooleanVideoControl boolCtrl;
153  boolCtrl.value_default = 0;
154  boolCtrl.id = IMGCTRL_ID_SOFT_AUTOBRIGHTNESSCONTRASTCORR;
155  boolCtrl.name = i18n("Automatic Brightness/Contrast Correction");
156  m_booleanCtrls.push_back( boolCtrl );
157  boolCtrl.id = IMGCTRL_ID_SOFT_AUTOCOLORCORR;
158  boolCtrl.name = i18n("Automatic Color Correction");
159  m_booleanCtrls.push_back( boolCtrl );
160  if (!driver_vflip)
161  {
162  boolCtrl.id = IMGCTRL_ID_SOFT_VFLIP;
163  boolCtrl.name = i18n("Vertical Flip");
164  m_booleanCtrls.push_back( boolCtrl );
165  }
166  if (!driver_hflip)
167  {
168  boolCtrl.id = IMGCTRL_ID_SOFT_HFLIP;
169  boolCtrl.name = i18n("Horizontal Flip");
170  m_booleanCtrls.push_back( boolCtrl );
171  }
172 #endif
173 }
174 
175 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
176 #ifdef V4L2_CAP_VIDEO_CAPTURE
177 
185 bool VideoDevice::getMenuCtrlOptions(quint32 id, quint32 maxindex, QStringList * options)
186 {
187  QStringList opt;
188  struct v4l2_querymenu ctrlmenu;
189  CLEAR (ctrlmenu);
190  options->clear();
191  ctrlmenu.id = id;
192  for (quint32 k = 0; k <= maxindex; k++) // DO NOT USE ctrlmenu.index DIRECTLY !
193  {
194  ctrlmenu.index = k;
195  if (0 == xioctl(VIDIOC_QUERYMENU, &ctrlmenu))
196  {
197  opt.push_back( i18n( (char*)(ctrlmenu.name) ) );
198  kDebug() << "option" << k << ":" << (char*)(ctrlmenu.name);
199  }
200  else
201  {
202  kDebug() << "VIDIOC_QUERYMENU failed (" << errno << ").";
203  return false;
204  }
205  }
206  *options = opt;
207  return true;
208  /* NOTE: According to V4L2-spec v0.24:
209  v4l2_querymenu.minimum = start-index = 0, v4l2_querymenu.maximum = last index
210  => DO DRIVERS REALLY SET THESE VALUES CORRECTLY ???
211  */
212 }
213 
214 
220 void VideoDevice::saveV4L2ControlData(struct v4l2_queryctrl qctrl)
221 {
222  NumericVideoControl numericCtrl;
223  BooleanVideoControl booleanCtrl;
224  MenuVideoControl menuCtrl;
225  ActionVideoControl actionCtrl;
226  QStringList options;
227  switch (qctrl.type)
228  {
229  case V4L2_CTRL_TYPE_INTEGER:
230  numericCtrl.id = qctrl.id;
231  numericCtrl.name = i18n((char*)qctrl.name);
232  numericCtrl.value_min = qctrl.minimum;
233  numericCtrl.value_max = qctrl.maximum;
234  numericCtrl.value_default = qctrl.default_value;
235  numericCtrl.value_step = qctrl.step;
236  m_numericCtrls.push_back( numericCtrl );
237  break;
238  case V4L2_CTRL_TYPE_BOOLEAN:
239  booleanCtrl.id = qctrl.id;
240  booleanCtrl.name = i18n((char*)qctrl.name);
241  booleanCtrl.value_default = qctrl.default_value;
242  m_booleanCtrls.push_back( booleanCtrl );
243  break;
244  case V4L2_CTRL_TYPE_MENU:
245  if (getMenuCtrlOptions( qctrl.id, qctrl.maximum, &options ))
246  {
247  menuCtrl.id = qctrl.id;
248  menuCtrl.name = i18n((char*)qctrl.name);
249  menuCtrl.index_default = qctrl.default_value;
250  menuCtrl.options = options;
251  m_menuCtrls.push_back( menuCtrl );
252  }
253  break;
254  case V4L2_CTRL_TYPE_BUTTON:
255  actionCtrl.id = qctrl.id;
256  actionCtrl.name = i18n((char*)qctrl.name);
257  m_actionCtrls.push_back( actionCtrl );
258  break;
259  // Since kernel 2.6.18:
260 #ifdef V4L2_CTRL_TYPE_INTEGER64
261  case V4L2_CTRL_TYPE_INTEGER64:
262 #endif
263 #ifdef V4L2_CTRL_TYPE_CTRL_CLASS
264  case V4L2_CTRL_TYPE_CTRL_CLASS:
265 #endif
266  default:
267  break;
268  }
269 // TODO V4L2_CTRL_TYPE_INTEGER64, V4L2_CTRL_TYPE_CTRL_CLASS
270 }
271 #endif
272 #endif
273 
277 int VideoDevice::xioctl(int request, void *arg)
278 {
279  int r;
280 
281 #ifdef HAVE_LIBV4L2
282  do r = v4l2_ioctl (descriptor, request, arg);
283 #else
284  do r = ioctl (descriptor, request, arg);
285 #endif
286  while (-1 == r && EINTR == errno);
287  return r;
288 }
289 
293 int VideoDevice::errnoReturn(const char* s)
294 {
296  fprintf (stderr, "%s error %d, %s\n",s, errno, strerror (errno));
297  return EXIT_FAILURE;
298 }
299 
303 int VideoDevice::setFileName(QString filename)
304 {
306  full_filename=filename;
307  return EXIT_SUCCESS;
308 }
309 
313 QString VideoDevice::fileName()
314 {
315  return full_filename;
316 }
317 
321 int VideoDevice::open()
322 {
324 
325  kDebug() << "called";
326  if(-1 != descriptor)
327  {
328  kDebug() << "Device is already open";
329  return EXIT_SUCCESS;
330  }
331 #ifdef HAVE_LIBV4L2
332  descriptor = ::v4l2_open (QFile::encodeName(full_filename), O_RDWR | O_NONBLOCK, 0);
333 #else
334  descriptor = ::open (QFile::encodeName(full_filename), O_RDWR | O_NONBLOCK, 0);
335 #endif
336  if(isOpen())
337  {
338  kDebug() << "File " << full_filename << " was opened successfuly";
339  if(EXIT_FAILURE==checkDevice())
340  {
341  kDebug() << "File " << full_filename << " could not be opened";
342  close();
343  return EXIT_FAILURE;
344  }
345  }
346  else
347  {
348  kDebug() << "Unable to open file " << full_filename << "Err: "<< errno;
349  return EXIT_FAILURE;
350  }
351 
352  initDevice();
353  selectInput(m_current_input);
354  kDebug() << "exited successfuly";
355  return EXIT_SUCCESS;
356 }
357 
358 bool VideoDevice::isOpen()
359 {
360  if(-1 == descriptor)
361  {
362 // kDebug() << "VideoDevice::isOpen() File is not open";
363  return false;
364  }
365 // kDebug() << "VideoDevice::isOpen() File is open";
366  return true;
367 }
368 
369 int VideoDevice::checkDevice()
370 {
371  kDebug() << "checkDevice() called.";
372  if(isOpen())
373  {
374  m_videocapture=false;
375  m_videochromakey=false;
376  m_videoscale=false;
377  m_videooverlay=false;
378  m_videoread=false;
379  m_videoasyncio=false;
380  m_videostream=false;
381 
382  m_driver=VIDEODEV_DRIVER_NONE;
383 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
384 #ifdef V4L2_CAP_VIDEO_CAPTURE
385 
386  CLEAR(V4L2_capabilities);
387 
388  if (-1 != xioctl (VIDIOC_QUERYCAP, &V4L2_capabilities))
389  {
390  if (!(V4L2_capabilities.capabilities & V4L2_CAP_VIDEO_CAPTURE))
391  {
392  kDebug() << "checkDevice(): " << full_filename << " is not a video capture device.";
393  m_driver = VIDEODEV_DRIVER_NONE;
394  return EXIT_FAILURE;
395  }
396  m_videocapture=true;
397  kDebug() << "checkDevice(): " << full_filename << " is a V4L2 device.";
398  m_driver = VIDEODEV_DRIVER_V4L2;
399  m_model=QString::fromLocal8Bit((const char*)V4L2_capabilities.card);
400 
401 
402 // Detect maximum and minimum resolution supported by the V4L2 device. VIDIOC_ENUM_FRAMESIZES is still experimental.
403  CLEAR (fmt);
404  fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
405  if (-1 == xioctl (VIDIOC_G_FMT, &fmt))
406  {
407  kDebug() << "VIDIOC_G_FMT failed (" << errno << ").";
408  }
409  fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
410  fmt.fmt.pix.width = 32767;
411  fmt.fmt.pix.height = 32767;
412  fmt.fmt.pix.field = V4L2_FIELD_ANY;
413  if (-1 == xioctl (VIDIOC_S_FMT, &fmt))
414  {
415  kDebug() << "Detecting maximum size with VIDIOC_S_FMT failed (" << errno << ").Returned maxwidth: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
416  // Note VIDIOC_S_FMT may change width and height.
417  }
418  else
419  {
420  maxwidth = fmt.fmt.pix.width;
421  maxheight = fmt.fmt.pix.height;
422  }
423  if (-1 == xioctl (VIDIOC_G_FMT, &fmt))
424  {
425  kDebug() << "VIDIOC_G_FMT failed (" << errno << ").";
426  }
427  fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
428  fmt.fmt.pix.width = 1;
429  fmt.fmt.pix.height = 1;
430  fmt.fmt.pix.field = V4L2_FIELD_ANY;
431  if (-1 == xioctl (VIDIOC_S_FMT, &fmt))
432  {
433  kDebug() << "Detecting minimum size with VIDIOC_S_FMT failed (" << errno << ").Returned maxwidth: " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
434  // Note VIDIOC_S_FMT may change width and height.
435  }
436  else
437  {
438  minwidth = fmt.fmt.pix.width;
439  minheight = fmt.fmt.pix.height;
440  }
441 
442 // Buggy driver paranoia
443 /* min = fmt.fmt.pix.width * 2;
444  if (fmt.fmt.pix.bytesperline < min)
445  fmt.fmt.pix.bytesperline = min;
446  min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;
447  if (fmt.fmt.pix.sizeimage < min)
448  fmt.fmt.pix.sizeimage = min;
449  m_buffer_size=fmt.fmt.pix.sizeimage ;*/
450 
451  int inputisok=EXIT_SUCCESS;
452  m_input.clear();
453  for(unsigned int loop=0; inputisok==EXIT_SUCCESS; loop++)
454  {
455  struct v4l2_input videoinput;
456  CLEAR(videoinput);
457  videoinput.index = loop;
458  inputisok=xioctl(VIDIOC_ENUMINPUT, &videoinput);
459  if(inputisok==EXIT_SUCCESS)
460  {
461  VideoInput tempinput;
462  tempinput.name = QString::fromLocal8Bit((const char*)videoinput.name);
463  tempinput.hastuner = videoinput.type & V4L2_INPUT_TYPE_TUNER;
464 detectSignalStandards();
465  tempinput.m_standards = videoinput.std;
466  m_input.push_back(tempinput);
467  kDebug() << "Input " << loop << ": " << tempinput.name << " (tuner: " << ((videoinput.type & V4L2_INPUT_TYPE_TUNER) != 0) << ")";
468  if((videoinput.type & V4L2_INPUT_TYPE_TUNER) != 0)
469  {
470 // _tunerForInput[name] = desc.tuner;
471 // _isTuner = true;
472  }
473  else
474  {
475 // _tunerForInput[name] = -1;
476  }
477  }
478  }
479  }
480  else
481  {
482 // V4L-only drivers should return an EINVAL in errno to indicate they cannot handle V4L2 calls. Not every driver is compliant, so
483 // it will try the V4L api even if the error code is different than expected.
484  kDebug() << "checkDevice(): " << full_filename << " is not a V4L2 device.";
485  }
486 
487 #endif
488 #ifdef HAVE_V4L
489  CLEAR(V4L_capabilities);
490 
491  if(m_driver==VIDEODEV_DRIVER_NONE)
492  {
493  kDebug() << "checkDevice(): " << full_filename << " Trying V4L API.";
494  if (-1 == xioctl (VIDIOCGCAP, &V4L_capabilities))
495  {
496  perror ("ioctl (VIDIOCGCAP)");
497  m_driver = VIDEODEV_DRIVER_NONE;
498  return EXIT_FAILURE;
499  }
500  else
501  {
502  kDebug() << full_filename << " is a V4L device.";
503  m_driver = VIDEODEV_DRIVER_V4L;
504  m_model=QString::fromLocal8Bit((const char*)V4L_capabilities.name);
505  if(V4L_capabilities.type & VID_TYPE_CAPTURE)
506  m_videocapture=true;
507  if(V4L_capabilities.type & VID_TYPE_CHROMAKEY)
508  m_videochromakey=true;
509  if(V4L_capabilities.type & VID_TYPE_SCALES)
510  m_videoscale=true;
511  if(V4L_capabilities.type & VID_TYPE_OVERLAY)
512  m_videooverlay=true;
513 // kDebug() << "libkopete (avdevice): Inputs : " << V4L_capabilities.channels;
514 // kDebug() << "libkopete (avdevice): Audios : " << V4L_capabilities.audios;
515  minwidth = V4L_capabilities.minwidth;
516  maxwidth = V4L_capabilities.maxwidth;
517  minheight = V4L_capabilities.minheight;
518  maxheight = V4L_capabilities.maxheight;
519 
520 
521  int inputisok=EXIT_SUCCESS;
522  m_input.clear();
523  for(int loop=0; loop < V4L_capabilities.channels; loop++)
524  {
525  struct video_channel videoinput;
526  CLEAR(videoinput);
527  videoinput.channel = loop;
528  videoinput.norm = 1;
529  inputisok=xioctl(VIDIOCGCHAN, &videoinput);
530  if(inputisok==EXIT_SUCCESS)
531  {
532  VideoInput tempinput;
533  tempinput.name = QString::fromLocal8Bit((const char*)videoinput.name);
534  tempinput.hastuner=videoinput.flags & VIDEO_VC_TUNER;
535 // TODO: The routine to detect the appropriate video standards for V4L must be placed here
536  m_input.push_back(tempinput);
537 // kDebug() << "libkopete (avdevice): Input " << loop << ": " << tempinput.name << " (tuner: " << ((videoinput.flags & VIDEO_VC_TUNER) != 0) << ")";
538 /* if((input.type & V4L2_INPUT_TYPE_TUNER) != 0)
539  {
540 // _tunerForInput[name] = desc.tuner;
541 // _isTuner = true;
542  }
543  else
544  {
545 // _tunerForInput[name] = -1;
546  }
547 */ }
548  }
549 
550  }
551  }
552 #endif
553 #endif
554  m_name=m_model; // Take care about changing the name to be different from the model itself...
555 
556  detectPixelFormats();
557 // TODO: Now we must execute the proper initialization according to the type of the driver.
558  kDebug() << "checkDevice() exited successfuly.";
559  return EXIT_SUCCESS;
560  }
561  return EXIT_FAILURE;
562 }
563 
564 
568 int VideoDevice::showDeviceCapabilities()
569 {
570  kDebug() << "showDeviceCapabilities() called.";
571  if(isOpen())
572  {
573 /* kDebug() << "libkopete (avdevice): Driver: " << (const char*)V4L2_capabilities.driver << " "
574  << ((V4L2_capabilities.version>>16) & 0xFF) << "."
575  << ((V4L2_capabilities.version>> 8) & 0xFF) << "."
576  << ((V4L2_capabilities.version ) & 0xFF) << endl;
577  kDebug() << "libkopete (avdevice): Device: " << name;
578  kDebug() << "libkopete (avdevice): Capabilities:";
579  if(V4L2_capabilities.capabilities & V4L2_CAP_VIDEO_CAPTURE)
580  kDebug() << "libkopete (avdevice): Video capture";
581  if(V4L2_capabilities.capabilities & V4L2_CAP_VIDEO_OUTPUT)
582  kDebug() << "libkopete (avdevice): Video output";
583  if(V4L2_capabilities.capabilities & V4L2_CAP_VIDEO_OVERLAY)
584  kDebug() << "libkopete (avdevice): Video overlay";
585  if(V4L2_capabilities.capabilities & V4L2_CAP_VBI_CAPTURE)
586  kDebug() << "libkopete (avdevice): VBI capture";
587  if(V4L2_capabilities.capabilities & V4L2_CAP_VBI_OUTPUT)
588  kDebug() << "libkopete (avdevice): VBI output";
589  if(V4L2_capabilities.capabilities & V4L2_CAP_RDS_CAPTURE)
590  kDebug() << "libkopete (avdevice): RDS capture";
591  if(V4L2_capabilities.capabilities & V4L2_CAP_TUNER)
592  kDebug() << "libkopete (avdevice): Tuner IO";
593  if(V4L2_capabilities.capabilities & V4L2_CAP_AUDIO)
594  kDebug() << "libkopete (avdevice): Audio IO";
595 ;*/
596  kDebug() << "Device model: " << m_model;
597  kDebug() << "Device name : " << m_name;
598  kDebug() << "Capabilities:";
599  if(canCapture())
600  {
601  kDebug() << " Video capture";
602  }
603  if(canRead())
604  {
605  kDebug() << " Read";
606  }
607  if(canAsyncIO())
608  {
609  kDebug() << " Asynchronous input/output";
610  }
611  if(canStream())
612  {
613  kDebug() << " Streaming";
614  }
615  if(canChromakey())
616  {
617  kDebug() << " Video chromakey";
618  }
619  if(canScale())
620  {
621  kDebug() << " Video scales";
622  }
623  if(canOverlay())
624  {
625  kDebug() << " Video overlay";
626  }
627 // kDebug() << "libkopete (avdevice): Audios : " << V4L_capabilities.audios;
628  kDebug() << " Max res: " << maxWidth() << " x " << maxHeight();
629  kDebug() << " Min res: " << minWidth() << " x " << minHeight();
630  kDebug() << " Inputs : " << inputs();
631  for (int loop=0; loop < inputs(); loop++)
632  kDebug() << "Input " << loop << ": " << m_input[loop].name << " (tuner: " << m_input[loop].hastuner << ")";
633  kDebug() << "showDeviceCapabilities() exited successfuly.";
634  return EXIT_SUCCESS;
635  }
636  return EXIT_FAILURE;
637 }
638 
642 int VideoDevice::initDevice()
643 {
645  kDebug() << "initDevice() started";
646  if(-1 == descriptor)
647  {
648  kDebug() << "initDevice() Device is not open";
649  return EXIT_FAILURE;
650  }
651  m_io_method = IO_METHOD_NONE;
652  switch(m_driver)
653  {
654 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
655 #ifdef V4L2_CAP_VIDEO_CAPTURE
656  case VIDEODEV_DRIVER_V4L2:
657  if(V4L2_capabilities.capabilities & V4L2_CAP_READWRITE)
658  {
659  m_videoread=true;
660  m_io_method = IO_METHOD_READ;
661  kDebug() << " Read/Write interface";
662  }
663  if(V4L2_capabilities.capabilities & V4L2_CAP_ASYNCIO)
664  {
665  m_videoasyncio=true;
666  kDebug() << " Async IO interface";
667  }
668  if(V4L2_capabilities.capabilities & V4L2_CAP_STREAMING)
669  {
670  m_videostream=true;
671  m_io_method = IO_METHOD_MMAP;
672 // m_io_method = IO_METHOD_USERPTR;
673  kDebug() << " Streaming interface";
674  }
675  if(m_io_method==IO_METHOD_NONE)
676  {
677  kDebug() << "initDevice() Found no suitable input/output method for " << full_filename;
678  return EXIT_FAILURE;
679  }
680  break;
681 #endif
682 #ifdef HAVE_V4L
683  case VIDEODEV_DRIVER_V4L:
684  m_videoread=true;
685  m_io_method=IO_METHOD_READ;
686  if(-1 != xioctl(VIDIOCGFBUF,&V4L_videobuffer))
687  {
688 // m_videostream=true;
689 // m_io_method = IO_METHOD_MMAP;
690  kDebug() << " Streaming interface";
691  }
692  break;
693 #endif
694 #endif
695  case VIDEODEV_DRIVER_NONE:
696  default:
697 
698  break;
699  }
700 
701 // Select video input, video standard and tune here.
702 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
703 #ifdef V4L2_CAP_VIDEO_CAPTURE
704  struct v4l2_cropcap cropcap;
705  struct v4l2_crop crop;
706  CLEAR (cropcap);
707  CLEAR (crop);
708 
709  cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
710  if (-1 == xioctl (VIDIOC_CROPCAP, &cropcap))
711  { // Errors ignored.
712  }
713  crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
714  crop.c = cropcap.defrect; // reset to default
715  if (-1 == xioctl (VIDIOC_S_CROP, &crop))
716  {
717  switch (errno)
718  {
719  case EINVAL: break; // Cropping not supported.
720  default: break; // Errors ignored.
721  }
722  }
723 #endif
724 #endif
725 
726  showDeviceCapabilities();
727  kDebug() << "initDevice() exited successfuly";
728  return EXIT_SUCCESS;
729 }
730 
731 int VideoDevice::inputs()
732 {
733  return m_input.size();
734 }
735 
736 
737 int VideoDevice::width()
738 {
739  return currentwidth;
740 }
741 
742 int VideoDevice::minWidth()
743 {
744  return minwidth;
745 }
746 
747 int VideoDevice::maxWidth()
748 {
749  return maxwidth;
750 }
751 
752 int VideoDevice::height()
753 {
754  return currentheight;
755 }
756 
757 int VideoDevice::minHeight()
758 {
759  return minheight;
760 }
761 
762 int VideoDevice::maxHeight()
763 {
764  return maxheight;
765 }
766 
767 int VideoDevice::setSize( int newwidth, int newheight)
768 {
769 kDebug() << "setSize(" << newwidth << ", " << newheight << ") called.";
770  if(isOpen())
771  {
772 // It should not be there. It must remain in a completely distict place, cause this method should not change the pixelformat.
773 // It shouldn't try to find a suitable pixel format this way. It should use values discovered by - detectPixelFormats() - to choose a valid one.
774  kDebug() << "Trying YUY422P";
775  errno = 0;
776  if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_YUV422P) && errno != EBUSY)
777  {
778  kDebug() << "Device doesn't seem to support YUV422P format. Trying YUYV.";
779  if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_YUYV) && errno != EBUSY)
780  {
781  kDebug() << "Device doesn't seem to support YUYV format. Trying UYVY.";
782  if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_UYVY) && errno != EBUSY)
783  {
784  kDebug() << "Device doesn't seem to support UYVY format. Trying YUV420P.";
785  if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_YUV420P) && errno != EBUSY)
786  {
787  kDebug() << "Device doesn't seem to support YUV420P format. Trying RGB24.";
788  if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_RGB24) && errno != EBUSY)
789  {
790  kDebug() << "Device doesn't seem to support RGB24 format. Trying BGR24.";
791  if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_BGR24) && errno != EBUSY)
792  {
793  kDebug() << "Device doesn't seem to support RGB24 format. Trying RGB32.";
794  if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_RGB32) && errno != EBUSY)
795  {
796  kDebug() << "Device doesn't seem to support RGB32 format. Trying BGR32.";
797  if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_BGR32) && errno != EBUSY)
798  {
799  kDebug() << "Device doesn't seem to support BGR32 format. Trying SBGGR8.";
800  if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_SBGGR8) && errno != EBUSY)
801  {
802  kDebug() << "Device doesn't seem to support SBGGR8 format. Trying SN9C10X.";
803  if(PIXELFORMAT_NONE == setPixelFormat(PIXELFORMAT_SN9C10X) && errno != EBUSY)
804  {
805  kDebug() << "Device doesn't seem to support BGR32 format. Fallback to it is not yet implemented.";
806  }
807  }
808  }
809  }
810  }
811  }
812  }
813  }
814  }
815  }
816  if (errno == EBUSY) {
817  kDebug() << "Can't change the video size: device in use";
818  return EXIT_FAILURE;
819  }
820 
821  if(newwidth > maxwidth ) newwidth = maxwidth;
822  if(newheight > maxheight) newheight = maxheight;
823  if(newwidth < minwidth ) newwidth = minwidth;
824  if(newheight < minheight) newheight = minheight;
825 
826 //kDebug() << "width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << width() << "x" << height();
827 // Change resolution for the video device
828  switch(m_driver)
829  {
830 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
831 #ifdef V4L2_CAP_VIDEO_CAPTURE
832  case VIDEODEV_DRIVER_V4L2:
833 // CLEAR (fmt);
834  if (-1 == xioctl (VIDIOC_G_FMT, &fmt))
835  {
836  kDebug() << "VIDIOC_G_FMT failed (" << errno << ").Returned width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
837  }
838  fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
839  fmt.fmt.pix.width = newwidth;
840  fmt.fmt.pix.height = newheight;
841  fmt.fmt.pix.field = V4L2_FIELD_ANY;
842  if (-1 == xioctl (VIDIOC_S_FMT, &fmt))
843  {
844  kDebug() << "VIDIOC_S_FMT failed (" << errno << ").Returned width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
845  // Note VIDIOC_S_FMT may change width and height.
846  return EXIT_FAILURE;
847  }
848  else
849  {
850 // Buggy driver paranoia.
851 kDebug() << "VIDIOC_S_FMT worked (" << errno << ").Returned width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
852  unsigned int min = fmt.fmt.pix.width * 2;
853  if (fmt.fmt.pix.bytesperline < min)
854  {
855  fmt.fmt.pix.bytesperline = min;
856  }
857  min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;
858  if (fmt.fmt.pix.sizeimage < min)
859  {
860  fmt.fmt.pix.sizeimage = min;
861  }
862  m_buffer_size=fmt.fmt.pix.sizeimage;
863 
864  currentwidth = fmt.fmt.pix.width;
865  currentheight = fmt.fmt.pix.height;
866  }
867  break;
868 #endif
869 #ifdef HAVE_V4L
870  case VIDEODEV_DRIVER_V4L:
871  {
872  struct video_window V4L_videowindow;
873 
874  if (xioctl (VIDIOCGWIN, &V4L_videowindow)== -1)
875  {
876  perror ("ioctl VIDIOCGWIN");
877 // return (NULL);
878  }
879  V4L_videowindow.width = newwidth;
880  V4L_videowindow.height = newheight;
881  V4L_videowindow.clipcount=0;
882  if (xioctl (VIDIOCSWIN, &V4L_videowindow)== -1)
883  {
884  perror ("ioctl VIDIOCSWIN");
885  return EXIT_FAILURE;
886  }
887 kDebug() << "------------- width: " << V4L_videowindow.width << " Height: " << V4L_videowindow.height << " Clipcount: " << V4L_videowindow.clipcount << " -----------------";
888 
889  currentwidth = V4L_videowindow.width;
890  currentheight = V4L_videowindow.height;
891 
892 // kDebug() << "libkopete (avdevice): V4L_picture.palette: " << V4L_picture.palette << " Depth: " << V4L_picture.depth;
893 
894 /* if(-1 == xioctl(VIDIOCGFBUF,&V4L_videobuffer))
895  kDebug() << "libkopete (avdevice): VIDIOCGFBUF failed (" << errno << "): Device cannot stream";*/
896 
897  }
898  break;
899 #endif
900 #endif
901  case VIDEODEV_DRIVER_NONE:
902  default:
903  return EXIT_FAILURE;
904  }
905  m_buffer_size = width() * height() * pixelFormatDepth(m_pixelformat) / 8;
906 kDebug() << "------------------------- ------- -- m_buffer_size: " << m_buffer_size << " !!! -- ------- -----------------------------------------";
907 
908  m_currentbuffer.width=width();
909  m_currentbuffer.height=width();
910  m_currentbuffer.pixelformat=m_pixelformat;
911  m_currentbuffer.data.resize(m_buffer_size);
912 
913  switch (m_io_method)
914  {
915  case IO_METHOD_NONE: break;
916  case IO_METHOD_READ: initRead (); break;
917  case IO_METHOD_MMAP: initMmap (); break;
918  case IO_METHOD_USERPTR: initUserptr (); break;
919  }
920 
921 kDebug() << "setSize(" << newwidth << ", " << newheight << ") exited successfuly.";
922  return EXIT_SUCCESS;
923  }
924 kDebug() << "setSize(" << newwidth << ", " << newheight << ") Device is not open.";
925  return EXIT_FAILURE;
926 }
927 
928 
929 
930 
931 
932 
933 
934 
935 
936 
937 
938 
939 
940 pixel_format VideoDevice::setPixelFormat(pixel_format newformat)
941 {
942  pixel_format ret = PIXELFORMAT_NONE;
943 //kDebug() << "called.";
944 // Change the pixel format for the video device
945  switch(m_driver)
946  {
947 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
948 #ifdef V4L2_CAP_VIDEO_CAPTURE
949  case VIDEODEV_DRIVER_V4L2:
950 // CLEAR (fmt);
951  if (-1 == xioctl (VIDIOC_G_FMT, &fmt))
952  {
953 // return errnoReturn ("VIDIOC_S_FMT");
954 // kDebug() << "VIDIOC_G_FMT failed (" << errno << ").Returned width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
955  }
956  else
957  m_pixelformat = pixelFormatForPalette(fmt.fmt.pix.pixelformat);
958 
959  fmt.fmt.pix.pixelformat = pixelFormatCode(newformat);
960  if (-1 == xioctl (VIDIOC_S_FMT, &fmt))
961  {
962 // kDebug() << "VIDIOC_S_FMT failed (" << errno << ").Returned width: " << pixelFormatName(fmt.fmt.pix.pixelformat) << " " << fmt.fmt.pix.width << "x" << fmt.fmt.pix.height;
963  }
964  else
965  {
966  if (fmt.fmt.pix.pixelformat == (unsigned int) pixelFormatCode(newformat)) // Thih "if" (not what is contained within) is a fix for a bug in sn9c102 driver.
967  {
968  m_pixelformat = newformat;
969  ret = m_pixelformat;
970  }
971  }
972  break;
973 #endif
974 #ifdef HAVE_V4L
975  case VIDEODEV_DRIVER_V4L:
976  {
977  struct video_picture V4L_picture;
978  if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
979  {
980  kDebug() << "VIDIOCGPICT failed (" << errno << ").";
981  }
982 // kDebug() << "V4L_picture.palette: " << V4L_picture.palette << " Depth: " << V4L_picture.depth;
983  V4L_picture.palette = pixelFormatCode(newformat);
984  V4L_picture.depth = pixelFormatDepth(newformat);
985  if(-1 == xioctl(VIDIOCSPICT,&V4L_picture))
986  {
987 // kDebug() << "Device seems to not support " << pixelFormatName(newformat) << " format. Fallback to it is not yet implemented.";
988  }
989 
990  if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
991  {
992  kDebug() << "VIDIOCGPICT failed (" << errno << ").";
993  }
994 
995 // kDebug() << "V4L_picture.palette: " << V4L_picture.palette << " Depth: " << V4L_picture.depth;
996  m_pixelformat=pixelFormatForPalette(V4L_picture.palette);
997  if (m_pixelformat == newformat)
998  ret = newformat;
999 
1000  }
1001  break;
1002 #endif
1003 #endif
1004  case VIDEODEV_DRIVER_NONE:
1005  default:
1006  break;
1007  }
1008  return ret;
1009 }
1010 
1011 
1012 
1013 
1014 
1015 
1019 int VideoDevice::currentInput()
1020 {
1022  if(isOpen())
1023  {
1024  return m_current_input;
1025  }
1026  return 0;
1027 }
1028 
1032 int VideoDevice::selectInput(int newinput)
1033 {
1035  if(m_current_input >= inputs())
1036  return EXIT_FAILURE;
1037 
1038  if(isOpen())
1039  {
1040  switch (m_driver)
1041  {
1042 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
1043 #ifdef V4L2_CAP_VIDEO_CAPTURE
1044  case VIDEODEV_DRIVER_V4L2:
1045  if (-1 == ioctl (descriptor, VIDIOC_S_INPUT, &newinput))
1046  {
1047  perror ("VIDIOC_S_INPUT");
1048  return EXIT_FAILURE;
1049  }
1050  setupControls();
1051  break;
1052 #endif
1053 #ifdef HAVE_V4L
1054  case VIDEODEV_DRIVER_V4L:
1055  struct video_channel V4L_input;
1056  V4L_input.channel=newinput;
1057  V4L_input.norm=4; // Hey, it's plain wrong! It should be input's signal standard!
1058  if (-1 == ioctl (descriptor, VIDIOCSCHAN, &V4L_input))
1059  {
1060  perror ("ioctl (VIDIOCSCHAN)");
1061  return EXIT_FAILURE;
1062  }
1063  setupControls();
1064  break;
1065 #endif
1066 #endif
1067  case VIDEODEV_DRIVER_NONE:
1068  default:
1069  break;
1070  }
1071  kDebug() << "Selected input " << newinput << " (" << m_input[newinput].name << ")";
1072  m_current_input = newinput;
1073  return EXIT_SUCCESS;
1074  }
1075  return EXIT_FAILURE;
1076 }
1077 
1081 int VideoDevice::startCapturing()
1082 {
1083 
1084  kDebug() << "called.";
1085  if(isOpen())
1086  {
1087  switch (m_io_method)
1088  {
1089  case IO_METHOD_NONE: // Device cannot capture frames
1090  return EXIT_FAILURE;
1091  break;
1092  case IO_METHOD_READ: // Nothing to do
1093  break;
1094  case IO_METHOD_MMAP:
1095 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
1096 #ifdef V4L2_CAP_VIDEO_CAPTURE
1097  {
1098  unsigned int loop;
1099  for (loop = 0; loop < m_streambuffers; ++loop)
1100  {
1101  struct v4l2_buffer buf;
1102  CLEAR (buf);
1103  buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1104  buf.memory = V4L2_MEMORY_MMAP;
1105  buf.index = loop;
1106  if (-1 == xioctl (VIDIOC_QBUF, &buf))
1107  return errnoReturn ("VIDIOC_QBUF");
1108  }
1109  enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1110  if (-1 == xioctl (VIDIOC_STREAMON, &type))
1111  return errnoReturn ("VIDIOC_STREAMON");
1112  }
1113 #endif
1114 #endif
1115  break;
1116  case IO_METHOD_USERPTR:
1117 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
1118 #ifdef V4L2_CAP_VIDEO_CAPTURE
1119  {
1120  unsigned int loop;
1121  for (loop = 0; loop < m_streambuffers; ++loop)
1122  {
1123  struct v4l2_buffer buf;
1124  CLEAR (buf);
1125  buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1126  buf.memory = V4L2_MEMORY_USERPTR;
1127  buf.m.userptr = (unsigned long) m_rawbuffers[loop].start;
1128  buf.length = m_rawbuffers[loop].length;
1129  if (-1 == xioctl (VIDIOC_QBUF, &buf))
1130  return errnoReturn ("VIDIOC_QBUF");
1131  }
1132  enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1133  if (-1 == xioctl (VIDIOC_STREAMON, &type))
1134  return errnoReturn ("VIDIOC_STREAMON");
1135  }
1136 #endif
1137 #endif
1138  break;
1139  }
1140 
1141  kDebug() << "exited successfuly.";
1142  return EXIT_SUCCESS;
1143  }
1144  return EXIT_FAILURE;
1145 }
1146 
1150 int VideoDevice::getFrame()
1151 {
1153  ssize_t bytesread;
1154 
1155 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
1156 #ifdef V4L2_CAP_VIDEO_CAPTURE
1157  struct v4l2_buffer v4l2buffer;
1158 #endif
1159 #endif
1160 // kDebug() << "getFrame() called.";
1161  if(isOpen())
1162  {
1163  switch (m_io_method)
1164  {
1165  case IO_METHOD_NONE: // Device cannot capture frames
1166  return EXIT_FAILURE;
1167  break;
1168  case IO_METHOD_READ:
1169 // kDebug() << "Using IO_METHOD_READ.File descriptor: " << descriptor << " Buffer address: " << &m_currentbuffer.data[0] << " Size: " << m_currentbuffer.data.size();
1170  if (m_currentbuffer.data.isEmpty())
1171  return EXIT_FAILURE;
1172 
1173 #ifdef HAVE_LIBV4L2
1174  bytesread = v4l2_read (descriptor, &m_currentbuffer.data[0], m_currentbuffer.data.size());
1175 #else
1176  bytesread = read (descriptor, &m_currentbuffer.data[0], m_currentbuffer.data.size());
1177 #endif
1178  if (-1 == bytesread) // must verify this point with ov511 driver.
1179  {
1180  if (errno == EAGAIN)
1181  {
1182 // kDebug() << "No new frame available.";
1183  return EXIT_FAILURE;
1184  }
1185  else
1186  return errnoReturn ("read");
1187  }
1188  if((int)m_currentbuffer.data.size() < bytesread)
1189  {
1190  kDebug() << "IO_METHOD_READ returned less bytes (" << bytesread << ") than it was asked for (" << m_currentbuffer.data.size() <<").";
1191  }
1192  break;
1193  case IO_METHOD_MMAP:
1194 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
1195 #ifdef V4L2_CAP_VIDEO_CAPTURE
1196  CLEAR (v4l2buffer);
1197  v4l2buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1198  v4l2buffer.memory = V4L2_MEMORY_MMAP;
1199  if (-1 == xioctl (VIDIOC_DQBUF, &v4l2buffer))
1200  {
1201  if (errno == EAGAIN)
1202  {
1203 // kDebug() << "No new frame available.";
1204  return EXIT_FAILURE;
1205  }
1206  else
1207  return errnoReturn ("VIDIOC_DQBUF");
1208  }
1209 /* if (v4l2buffer.index < m_streambuffers)
1210  return EXIT_FAILURE;*/ //it was an assert()
1211 // kDebug() << "m_rawbuffers[" << v4l2buffer.index << "].start: " << (void *)m_rawbuffers[v4l2buffer.index].start << " Size: " << m_currentbuffer.data.size();
1212  if (m_currentbuffer.data.isEmpty() ||
1213 // v4l2buffer.index < 0 || // is always false: v4l2buffer.index is unsigned
1214  (uint) m_rawbuffers.size() <= v4l2buffer.index)
1215  return EXIT_FAILURE;
1216 
1217  if (m_rawbuffers[v4l2buffer.index].length < (uint)m_currentbuffer.data.size())
1218  {
1219  kDebug() << "Buffer size mismatch: expecting raw buffer length to be" << m_currentbuffer.data.size() << "but it was" << m_rawbuffers[v4l2buffer.index].length;
1220  return EXIT_FAILURE;
1221  }
1222 
1223  memcpy(&m_currentbuffer.data[0], m_rawbuffers[v4l2buffer.index].start, m_currentbuffer.data.size());
1224  if (-1 == xioctl (VIDIOC_QBUF, &v4l2buffer))
1225  return errnoReturn ("VIDIOC_QBUF");
1226 #endif
1227 #endif
1228  break;
1229  case IO_METHOD_USERPTR:
1230 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
1231 #ifdef V4L2_CAP_VIDEO_CAPTURE
1232  {
1233  unsigned int i;
1234  CLEAR (v4l2buffer);
1235  v4l2buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1236  v4l2buffer.memory = V4L2_MEMORY_USERPTR;
1237  if (-1 == xioctl (VIDIOC_DQBUF, &v4l2buffer))
1238  {
1239  if (errno == EAGAIN)
1240  {
1241 // kDebug() << "No new frame available.";
1242  return EXIT_FAILURE;
1243  }
1244  else
1245  return errnoReturn ("VIDIOC_DQBUF");
1246  }
1247  if ((unsigned int) m_rawbuffers.size() < m_streambuffers)
1248  return EXIT_FAILURE;
1249 
1250  for (i = 0; i < m_streambuffers; ++i)
1251  if (v4l2buffer.m.userptr == (unsigned long) m_rawbuffers[i].start && v4l2buffer.length == m_rawbuffers[i].length)
1252  break;
1253  if (i < m_streambuffers)
1254  return EXIT_FAILURE;
1255  if (-1 == xioctl (VIDIOC_QBUF, &v4l2buffer))
1256  return errnoReturn ("VIDIOC_QBUF");
1257  }
1258 #endif
1259 #endif
1260  break;
1261  }
1262 // kDebug() << "exited successfuly.";
1263  return EXIT_SUCCESS;
1264  }
1265  return EXIT_FAILURE;
1266 }
1267 
1271 int VideoDevice::getFrame(imagebuffer *imgbuffer)
1272 {
1273  if (imgbuffer != NULL)
1274  {
1275  getFrame();
1276  imgbuffer->height = m_currentbuffer.height;
1277  imgbuffer->width = m_currentbuffer.width;
1278  imgbuffer->pixelformat = m_currentbuffer.pixelformat;
1279  imgbuffer->data = m_currentbuffer.data;
1280  return EXIT_SUCCESS;
1281  }
1282  return EXIT_FAILURE;
1283 }
1284 
1288 int VideoDevice::getImage(QImage *qimage)
1289 {
1291 
1292  // do NOT delete qimage here, as it is received as a parameter
1293  if (qimage->width() != width() || qimage->height() != height())
1294  *qimage = QImage(width(), height(), QImage::Format_RGB32);
1295 
1296  if (!m_currentbuffer.data.size())
1297  {
1298  //there is no data so if we continue something will try access it (as in bug 161536) and crash kopete
1299  //perhaps we should look at having the interface reflect when the camera isn't available? as it thinks
1300  //it is for some reason, though the data size seems to be an ok check
1301  return EXIT_FAILURE;
1302  }
1303 
1304  uchar *bits=qimage->bits();
1305 // kDebug() << "Capturing in " << pixelFormatName(m_currentbuffer.pixelformat);
1306  switch(m_currentbuffer.pixelformat)
1307  {
1308  case PIXELFORMAT_NONE : break;
1309 
1310 // Packed RGB formats
1311  case PIXELFORMAT_RGB332 :
1312  {
1313  int step=0;
1314  for(int loop=0;loop < qimage->numBytes();loop+=4)
1315  {
1316  bits[loop] = (m_currentbuffer.data[step]>>5<<5)+(m_currentbuffer.data[step]>>5<<2)+(m_currentbuffer.data[step]>>6);
1317  bits[loop+1] = (m_currentbuffer.data[step]>>2<<5)+(m_currentbuffer.data[step]<<3>>5<<2)+(m_currentbuffer.data[step]<<3>>6);
1318  bits[loop+2] = (m_currentbuffer.data[step]<<6)+(m_currentbuffer.data[step]<<6>>2)+(m_currentbuffer.data[step]<<6>>4)+(m_currentbuffer.data[step]<<6>>6);
1319  bits[loop+3] = 255;
1320  step++;
1321  }
1322  }
1323  break;
1324  case PIXELFORMAT_RGB444 : break;
1325  case PIXELFORMAT_RGB555 : break;
1326  case PIXELFORMAT_RGB565 :
1327  {
1328  int step=0;
1329  for(int loop=0;loop < qimage->numBytes();loop+=4)
1330  {
1331  bits[loop] = (m_currentbuffer.data[step]<<3)+(m_currentbuffer.data[step]<<3>>5);
1332  bits[loop+1] = ((m_currentbuffer.data[step+1])<<5)|m_currentbuffer.data[step]>>5;
1333  bits[loop+2] = ((m_currentbuffer.data[step+1])&248)+((m_currentbuffer.data[step+1])>>5);
1334  bits[loop+3] = 255;
1335  step+=2;
1336  }
1337  }
1338  break;
1339  case PIXELFORMAT_RGB555X: break;
1340  case PIXELFORMAT_RGB565X: break;
1341  case PIXELFORMAT_BGR24 :
1342  {
1343  int step=0;
1344  for(int loop=0;loop < qimage->numBytes();loop+=4)
1345  {
1346  bits[loop] = m_currentbuffer.data[step+2];
1347  bits[loop+1] = m_currentbuffer.data[step+1];
1348  bits[loop+2] = m_currentbuffer.data[step];
1349  bits[loop+3] = 255;
1350  step+=3;
1351  }
1352  }
1353  break;
1354  case PIXELFORMAT_RGB24 :
1355  {
1356  int step=0;
1357  for(int loop=0;loop < qimage->numBytes();loop+=4)
1358  {
1359  bits[loop] = m_currentbuffer.data[step];
1360  bits[loop+1] = m_currentbuffer.data[step+1];
1361  bits[loop+2] = m_currentbuffer.data[step+2];
1362  bits[loop+3] = 255;
1363  step+=3;
1364  }
1365  }
1366  break;
1367  case PIXELFORMAT_BGR32 :
1368  {
1369  int step=0;
1370  for(int loop=0;loop < qimage->numBytes();loop+=4)
1371  {
1372  bits[loop] = m_currentbuffer.data[step+2];
1373  bits[loop+1] = m_currentbuffer.data[step+1];
1374  bits[loop+2] = m_currentbuffer.data[step];
1375  bits[loop+3] = m_currentbuffer.data[step+3];
1376  step+=4;
1377  }
1378  }
1379  break;
1380  case PIXELFORMAT_RGB32 : memcpy(bits,&m_currentbuffer.data[0], m_currentbuffer.data.size());
1381  break;
1382 
1383 // Bayer RGB format
1384  case PIXELFORMAT_SBGGR8 :
1385  {
1386  unsigned char *d = (unsigned char *) malloc (width() * height() * 3);
1387  bayer2rgb24(d, &m_currentbuffer.data.first(), width(), height());
1388  int step=0;
1389  for(int loop=0;loop < qimage->numBytes();loop+=4)
1390  {
1391  bits[loop] = d[step+2];
1392  bits[loop+1] = d[step+1];
1393  bits[loop+2] = d[step];
1394  bits[loop+3] = 255;
1395  step+=3;
1396  }
1397  free(d);
1398  }
1399  break;
1400 
1401 // YUV formats
1402  case PIXELFORMAT_GREY :
1403  {
1404  int step=0;
1405  for(int loop=0;loop < qimage->numBytes();loop+=4)
1406  {
1407  bits[loop] = m_currentbuffer.data[step];
1408  bits[loop+1] = m_currentbuffer.data[step];
1409  bits[loop+2] = m_currentbuffer.data[step];
1410  bits[loop+3] = 255;
1411  step++;
1412  }
1413  }
1414  break;
1415  case PIXELFORMAT_YUYV:
1416  case PIXELFORMAT_UYVY:
1417  case PIXELFORMAT_YUV420P:
1418  case PIXELFORMAT_YUV422P:
1419  {
1420  uchar *yptr, *cbptr, *crptr;
1421  bool halfheight=false;
1422  bool packed=false;
1423 // Adjust algorythm to specific YUV data arrangements.
1424  if (m_currentbuffer.pixelformat == PIXELFORMAT_YUV420P)
1425  halfheight=true;
1426  if (m_currentbuffer.pixelformat == PIXELFORMAT_YUYV)
1427  {
1428  yptr = &m_currentbuffer.data[0];
1429  cbptr = yptr + 1;
1430  crptr = yptr + 3;
1431  packed=true;
1432  }
1433  else if (m_currentbuffer.pixelformat == PIXELFORMAT_UYVY)
1434  {
1435  cbptr = &m_currentbuffer.data[0];
1436  yptr = cbptr + 1;
1437  crptr = cbptr + 2;
1438  packed=true;
1439  }
1440  else
1441  {
1442  yptr = &m_currentbuffer.data[0];
1443  cbptr = yptr + (width()*height());
1444  crptr = cbptr + (width()*height()/(halfheight ? 4:2));
1445  }
1446 
1447  for(int y=0; y<height(); y++)
1448  {
1449 // Decode scanline
1450  for(int x=0; x<width(); x++)
1451  {
1452  int c,d,e;
1453 
1454  if (packed)
1455  {
1456  c = (yptr[x<<1])-16;
1457  d = (cbptr[x>>1<<2])-128;
1458  e = (crptr[x>>1<<2])-128;
1459  }
1460  else
1461  {
1462  c = (yptr[x])-16;
1463  d = (cbptr[x>>1])-128;
1464  e = (crptr[x>>1])-128;
1465  }
1466 
1467  int r = (298 * c + 409 * e + 128)>>8;
1468  int g = (298 * c - 100 * d - 208 * e + 128)>>8;
1469  int b = (298 * c + 516 * d + 128)>>8;
1470 
1471  if (r<0) r=0; if (r>255) r=255;
1472  if (g<0) g=0; if (g>255) g=255;
1473  if (b<0) b=0; if (b>255) b=255;
1474 
1475  uint *p = (uint*)qimage->scanLine(y)+x;
1476  *p = qRgba(r,g,b,255);
1477 
1478  }
1479 // Jump to next line
1480  if (packed)
1481  {
1482  yptr+=width()*2;
1483  cbptr+=width()*2;
1484  crptr+=width()*2;
1485  }
1486  else
1487  {
1488  yptr+=width();
1489  if (!halfheight || y&1)
1490  {
1491  cbptr+=width()/2;
1492  crptr+=width()/2;
1493  }
1494  }
1495  }
1496  }
1497  break;
1498 
1499 // Compressed formats
1500  case PIXELFORMAT_JPEG : break;
1501  case PIXELFORMAT_MPEG : break;
1502 
1503 // Reserved formats
1504  case PIXELFORMAT_DV : break;
1505  case PIXELFORMAT_ET61X251:break;
1506  case PIXELFORMAT_HI240 : break;
1507  case PIXELFORMAT_HM12 : break;
1508  case PIXELFORMAT_MJPEG : break;
1509  case PIXELFORMAT_PWC1 : break;
1510  case PIXELFORMAT_PWC2 : break;
1511  case PIXELFORMAT_SN9C10X:
1512  {
1513  unsigned char *s = new unsigned char [width() * height()];
1514  unsigned char *d = new unsigned char [width() * height() * 3];
1515  sonix_decompress_init();
1516  sonix_decompress(width(), height(), &m_currentbuffer.data.first(), s);
1517  bayer2rgb24(d, s, width(), height());
1518  int step=0;
1519  for(int loop=0;loop < qimage->numBytes();loop+=4)
1520  {
1521  bits[loop] = d[step+2];
1522  bits[loop+1] = d[step+1];
1523  bits[loop+2] = d[step];
1524  bits[loop+3] = 255;
1525  step+=3;
1526  }
1527  delete[] s;
1528  delete[] d;
1529  }
1530  case PIXELFORMAT_WNVA : break;
1531  case PIXELFORMAT_YYUV : break;
1532  }
1533 
1534  if (m_current_input >= m_input.size() )
1535  return EXIT_SUCCESS;
1536 
1537 // Proccesses image for automatic Brightness/Contrast/Color correction
1538  if (m_input[m_current_input].img_softcorr_autobrightnesscontrast || m_input[m_current_input].img_softcorr_autocolor)
1539  {
1540  unsigned long long R=0, G=0, B=0, A=0, global=0;
1541  int Rmax=0, Gmax=0, Bmax=0, Amax=0, globalmax=0;
1542  int Rmin=255, Gmin=255, Bmin=255, Amin=255, globalmin=255;
1543  int Rrange=255, Grange=255, Brange=255;
1544 
1545 // Finds minimum and maximum intensity for each color component
1546  for(unsigned int loop=0;loop < (unsigned int) qimage->numBytes();loop+=4)
1547  {
1548  R+=bits[loop];
1549  G+=bits[loop+1];
1550  B+=bits[loop+2];
1551 // A+=bits[loop+3];
1552  if (bits[loop] < Rmin) Rmin = bits[loop];
1553  if (bits[loop+1] < Gmin) Gmin = bits[loop+1];
1554  if (bits[loop+2] < Bmin) Bmin = bits[loop+2];
1555 // if (bits[loop+3] < Amin) Amin = bits[loop+3];
1556  if (bits[loop] > Rmax) Rmax = bits[loop];
1557  if (bits[loop+1] > Gmax) Gmax = bits[loop+1];
1558  if (bits[loop+2] > Bmax) Bmax = bits[loop+2];
1559 // if (bits[loop+3] > Amax) Amax = bits[loop+3];
1560  }
1561  global = R + G + B;
1562 // Finds overall minimum and maximum intensity
1563  if (Rmin > Gmin) globalmin = Gmin; else globalmin = Rmin; if (Bmin < globalmin) globalmin = Bmin;
1564  if (Rmax > Gmax) globalmax = Rmax; else globalmax = Gmax; if (Bmax > globalmax) globalmax = Bmax;
1565 // If no color correction should be performed, simply level all the intensities so they're just the same.
1566 // In fact color correction should use the R, G and B variables to detect color deviation and "bump up" the saturation,
1567 // but it's computationally more expensive and the current way returns better results to the user.
1568  if(!m_input[m_current_input].img_softcorr_autocolor)
1569  {
1570  Rmin = globalmin ; Rmax = globalmax;
1571  Gmin = globalmin ; Gmax = globalmax;
1572  Bmin = globalmin ; Bmax = globalmax;
1573 // Amin = globalmin ; Amax = globalmax;
1574  }
1575 // Calculates ranges and prevent a division by zero later on.
1576  Rrange = Rmax - Rmin; if (Rrange == 0) Rrange = 255;
1577  Grange = Gmax - Gmin; if (Grange == 0) Grange = 255;
1578  Brange = Bmax - Bmin; if (Brange == 0) Brange = 255;
1579 // Arange = Amax - Amin; if (Arange == 0) Arange = 255;
1580 
1581  kDebug() << " R: " << R << " G: " << G << " B: " << B << " A: " << A << " global: " << global <<
1582  " Rmin: " << Rmin << " Gmin: " << Gmin << " Bmin: " << Bmin << " Amin: " << Amin << " globalmin: " << globalmin <<
1583  " Rmax: " << Rmax << " Gmax: " << Gmax << " Bmax: " << Bmax << " Amax: " << Amax << " globalmax: " << globalmax ;
1584 
1585  for(unsigned int loop=0;loop < (unsigned int) qimage->numBytes();loop+=4)
1586  {
1587  bits[loop] = (bits[loop] - Rmin) * 255 / (Rrange);
1588  bits[loop+1] = (bits[loop+1] - Gmin) * 255 / (Grange);
1589  bits[loop+2] = (bits[loop+2] - Bmin) * 255 / (Brange);
1590 // bits[loop+3] = (bits[loop+3] - Amin) * 255 / (Arange);
1591  }
1592  }
1593 
1594  if (m_input[m_current_input].img_softcorr_vflip || m_input[m_current_input].img_softcorr_hflip)
1595  *qimage = qimage->mirrored(m_input[m_current_input].img_softcorr_vflip, m_input[m_current_input].img_softcorr_hflip);
1596 
1597  return EXIT_SUCCESS;
1598 }
1599 
1603 int VideoDevice::stopCapturing()
1604 {
1606  kDebug() << "called.";
1607  if(isOpen())
1608  {
1609  switch (m_io_method)
1610  {
1611  case IO_METHOD_NONE: // Device cannot capture frames
1612  return EXIT_FAILURE;
1613  break;
1614  case IO_METHOD_READ: // Nothing to do
1615  break;
1616  case IO_METHOD_MMAP:
1617  case IO_METHOD_USERPTR:
1618 #ifdef V4L2_CAP_VIDEO_CAPTURE
1619  {
1620  enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1621  if (-1 == xioctl (VIDIOC_STREAMOFF, &type))
1622  return errnoReturn ("VIDIOC_STREAMOFF");
1623 
1624  if (m_io_method == IO_METHOD_MMAP)
1625  {
1626  unsigned int loop;
1627  for (loop = 0; loop < m_streambuffers; ++loop)
1628  {
1629 #ifdef HAVE_LIBV4L2
1630  if (v4l2_munmap(m_rawbuffers[loop].start,m_rawbuffers[loop].length) != 0)
1631 #else
1632  if (munmap(m_rawbuffers[loop].start,m_rawbuffers[loop].length) != 0)
1633 #endif
1634  {
1635  kDebug() << "unable to munmap.";
1636  }
1637  }
1638  }
1639  }
1640 #endif
1641  break;
1642  }
1643  kDebug() << "exited successfuly.";
1644  return EXIT_SUCCESS;
1645  }
1646  return EXIT_FAILURE;
1647 }
1648 
1649 
1657 int VideoDevice::close()
1658 {
1659  kDebug() << "called.";
1660  if (isOpen())
1661  {
1662  kDebug() << "Device is open. Trying to properly shutdown the device.";
1663  stopCapturing();
1664 #ifdef HAVE_LIBV4L2
1665  int ret = ::v4l2_close(descriptor);
1666 #else
1667  int ret = ::close(descriptor);
1668 #endif
1669  if (ret == -1)
1670  {
1671  kDebug() << "::close() failed with errno" << errno << strerror(errno);
1672  return EXIT_FAILURE;
1673  }
1674  else
1675  kDebug() << "Device successfully closed.";
1676  }
1677  descriptor = -1;
1678  m_numericCtrls.clear();
1679  m_booleanCtrls.clear();
1680  m_menuCtrls.clear();
1681  m_actionCtrls.clear();
1682  m_driver=VIDEODEV_DRIVER_NONE;
1683  return EXIT_SUCCESS;
1684 }
1685 
1686 
1692 QList<NumericVideoControl> VideoDevice::getSupportedNumericControls()
1693 {
1694  return m_numericCtrls;
1695 }
1696 
1702 QList<BooleanVideoControl> VideoDevice::getSupportedBooleanControls()
1703 {
1704  return m_booleanCtrls;
1705 }
1706 
1712 QList<MenuVideoControl> VideoDevice::getSupportedMenuControls()
1713 {
1714  return m_menuCtrls;
1715 }
1716 
1722 QList<ActionVideoControl> VideoDevice::getSupportedActionControls()
1723 {
1724  return m_actionCtrls;
1725 }
1726 
1736 int VideoDevice::getControlValue(quint32 ctrl_id, qint32 * value)
1737 {
1738  kDebug() << "Control-ID" << ctrl_id << ":";
1739 
1740  if (!isOpen())
1741  return EXIT_FAILURE;
1742 
1743 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
1744  if (ctrl_id == IMGCTRL_ID_SOFT_AUTOBRIGHTNESSCONTRASTCORR)
1745  {
1746  if (m_current_input < m_input.size() )
1747  {
1748  *value = m_input[m_current_input].img_softcorr_autobrightnesscontrast;
1749  kDebug() << "Reported current value is" << *value << ".";
1750  return EXIT_SUCCESS;
1751  }
1752  else
1753  return EXIT_FAILURE;
1754  }
1755  else if (ctrl_id == IMGCTRL_ID_SOFT_AUTOCOLORCORR)
1756  {
1757  if (m_current_input < m_input.size() )
1758  {
1759  *value = m_input[m_current_input].img_softcorr_autocolor;
1760  kDebug() << "Reported current value is" << *value << ".";
1761  return EXIT_SUCCESS;
1762  }
1763  else
1764  return EXIT_FAILURE;
1765  }
1766  else if (ctrl_id == IMGCTRL_ID_SOFT_VFLIP)
1767  {
1768  if (m_current_input < m_input.size() )
1769  {
1770  *value = m_input[m_current_input].img_softcorr_vflip;
1771  kDebug() << "Reported current value is" << *value << ".";
1772  return EXIT_SUCCESS;
1773  }
1774  else
1775  return EXIT_FAILURE;
1776  }
1777  else if (ctrl_id == IMGCTRL_ID_SOFT_HFLIP)
1778  {
1779  if (m_current_input < m_input.size() )
1780  {
1781  *value = m_input[m_current_input].img_softcorr_hflip;
1782  kDebug() << "Reported current value is" << *value << ".";
1783  return EXIT_SUCCESS;
1784  }
1785  else
1786  return EXIT_FAILURE;
1787  }
1788 #endif
1789 
1790  switch(m_driver)
1791  {
1792 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
1793 #ifdef V4L2_CAP_VIDEO_CAPTURE
1794  case VIDEODEV_DRIVER_V4L2:
1795  {
1796  struct v4l2_queryctrl queryctrl;
1797  struct v4l2_control control;
1798 
1799  CLEAR (queryctrl);
1800  queryctrl.id = ctrl_id;
1801 
1802  if (-1 == xioctl(VIDIOC_QUERYCTRL, &queryctrl))
1803  {
1804  if (errno != EINVAL)
1805  kDebug() << "VIDIOC_QUERYCTRL failed (" << errno << ").";
1806  else
1807  kDebug() << "Device doesn't support the control.";
1808  }
1809  else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
1810  {
1811  kDebug() << "Control is disabled.";
1812  }
1813  else
1814  {
1815  CLEAR (control);
1816  control.id = ctrl_id;
1817  if (-1 == xioctl(VIDIOC_G_CTRL, &control))
1818  kDebug() << "VIDIOC_G_CTRL failed (" << errno << ").";
1819  else
1820  {
1821  *value = control.value;
1822  kDebug() << "Reported current value is" << control.value << ".";
1823  return EXIT_SUCCESS;
1824  }
1825  }
1826  }
1827  break;
1828 #endif
1829 #ifdef HAVE_V4L
1830  case VIDEODEV_DRIVER_V4L:
1831  struct video_picture V4L_picture;
1832  if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
1833  {
1834  kDebug() << "VIDIOCGPICT failed (" << errno << ").";
1835  return EXIT_FAILURE;
1836  }
1837  switch (ctrl_id)
1838  {
1839  case IMGCTRL_ID_V4L1_BRIGHTNESS:
1840  *value = V4L_picture.brightness;
1841  break;
1842  case IMGCTRL_ID_V4L1_HUE:
1843  *value = V4L_picture.hue;
1844  break;
1845  case IMGCTRL_ID_V4L1_COLOR:
1846  *value = V4L_picture.colour;
1847  break;
1848  case IMGCTRL_ID_V4L1_CONTRAST:
1849  *value = V4L_picture.contrast;
1850  break;
1851  case IMGCTRL_ID_V4L1_WHITENESS:
1852  *value = V4L_picture.whiteness;
1853  break;
1854  default:
1855  return EXIT_FAILURE;
1856  }
1857  kDebug() << "Reported current value is" << *value << ".";
1858  return EXIT_SUCCESS;
1859 #endif
1860 #endif
1861  case VIDEODEV_DRIVER_NONE:
1862  default:
1863  break;
1864  }
1865  return EXIT_FAILURE;
1866 }
1867 
1878 int VideoDevice::setControlValue(quint32 ctrl_id, qint32 value)
1879 {
1880  kDebug() << "Control-ID" << ctrl_id << ", Value" << value;
1881 
1882  if (!isOpen())
1883  return EXIT_FAILURE;
1884 
1885 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
1886  if (ctrl_id == IMGCTRL_ID_SOFT_AUTOBRIGHTNESSCONTRASTCORR)
1887  {
1888  if (m_current_input < m_input.size() )
1889  {
1890  m_input[m_current_input].img_softcorr_autobrightnesscontrast = value;
1891  return EXIT_SUCCESS;
1892  }
1893  else
1894  return EXIT_FAILURE;
1895  }
1896  else if (ctrl_id == IMGCTRL_ID_SOFT_AUTOCOLORCORR)
1897  {
1898  if (m_current_input < m_input.size() )
1899  {
1900  m_input[m_current_input].img_softcorr_autocolor = value;
1901  return EXIT_SUCCESS;
1902  }
1903  else
1904  return EXIT_FAILURE;
1905  }
1906  else if (ctrl_id == IMGCTRL_ID_SOFT_VFLIP)
1907  {
1908  if (m_current_input < m_input.size() )
1909  {
1910  m_input[m_current_input].img_softcorr_vflip = value;
1911  return EXIT_SUCCESS;
1912  }
1913  else
1914  return EXIT_FAILURE;
1915  }
1916  else if (ctrl_id == IMGCTRL_ID_SOFT_HFLIP)
1917  {
1918  if (m_current_input < m_input.size() )
1919  {
1920  m_input[m_current_input].img_softcorr_hflip = value;
1921  return EXIT_SUCCESS;
1922  }
1923  else
1924  return EXIT_FAILURE;
1925  }
1926 #endif
1927 
1928  switch(m_driver)
1929  {
1930 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
1931 #ifdef V4L2_CAP_VIDEO_CAPTURE
1932  case VIDEODEV_DRIVER_V4L2:
1933  {
1934  struct v4l2_queryctrl queryctrl;
1935  struct v4l2_control control;
1936 
1937  CLEAR (queryctrl);
1938  queryctrl.id = ctrl_id;
1939 
1940  if (-1 == xioctl(VIDIOC_QUERYCTRL, &queryctrl))
1941  {
1942  if (errno != EINVAL)
1943  kDebug() << "VIDIOC_QUERYCTRL failed (" << errno << ").";
1944  else
1945  kDebug() << "Device doesn't support the control.";
1946  }
1947  else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
1948  {
1949  kDebug() << "Control is disabled.";
1950  }
1951  else
1952  {
1953  CLEAR (control);
1954  control.id = ctrl_id;
1955  if (value < queryctrl.minimum)
1956  {
1957  control.value = queryctrl.minimum;
1958  kDebug() << "Value exceeds lower limit ! Setting to minimum:" << control.value;
1959  }
1960  else if (value > queryctrl.maximum)
1961  {
1962  control.value = queryctrl.maximum;
1963  kDebug() << "Value exceeds upper limit ! Setting to maximum:" << control.value;
1964  }
1965  else
1966  {
1967  control.value = value;
1968  }
1969  if (-1 == xioctl(VIDIOC_S_CTRL, &control))
1970  kDebug() << "VIDIOC_S_CTRL failed (" << errno << ").";
1971  else
1972  return EXIT_SUCCESS;
1973  }
1974  }
1975  break;
1976 #endif
1977 #ifdef HAVE_V4L
1978  case VIDEODEV_DRIVER_V4L:
1979  struct video_picture V4L_picture;
1980  if(-1 == xioctl(VIDIOCGPICT, &V4L_picture))
1981  {
1982  kDebug() << "VIDIOCGPICT failed (" << errno << ").";
1983  return EXIT_FAILURE;
1984  }
1985  if (value < 0)
1986  {
1987  value = 0;
1988  kDebug() << "Value exceeds lower limit ! Setting to minimum: 0";
1989  }
1990  else if (value > 65535)
1991  {
1992  value = 65535;
1993  kDebug() << "Value exceeds upper limit ! Setting to maximum: 65535";
1994  }
1995  // TODO: consider step, too ?
1996  switch (ctrl_id)
1997  {
1998  case IMGCTRL_ID_V4L1_BRIGHTNESS:
1999  V4L_picture.brightness = value;
2000  break;
2001  case IMGCTRL_ID_V4L1_HUE:
2002  V4L_picture.hue = value;
2003  break;
2004  case IMGCTRL_ID_V4L1_COLOR:
2005  V4L_picture.colour = value;
2006  break;
2007  case IMGCTRL_ID_V4L1_CONTRAST:
2008  V4L_picture.contrast = value;
2009  break;
2010  case IMGCTRL_ID_V4L1_WHITENESS:
2011  V4L_picture.whiteness = value;
2012  break;
2013  default:
2014  return EXIT_FAILURE;
2015  }
2016  if(-1 == xioctl(VIDIOCSPICT,&V4L_picture))
2017  {
2018  kDebug() << "Device seems to not support adjusting image brightness. Fallback to it is not yet implemented.";
2019  return EXIT_FAILURE;
2020  }
2021  return EXIT_SUCCESS;
2022 #endif
2023 #endif
2024  case VIDEODEV_DRIVER_NONE:
2025  default:
2026  break;
2027  }
2028  return EXIT_FAILURE;
2029 }
2030 
2031 pixel_format VideoDevice::pixelFormatForPalette( int palette )
2032 {
2033  switch(m_driver)
2034  {
2035 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
2036 #ifdef V4L2_CAP_VIDEO_CAPTURE
2037  case VIDEODEV_DRIVER_V4L2:
2038  switch(palette)
2039  {
2040  case 0 : return PIXELFORMAT_NONE; break;
2041 
2042 // Packed RGB formats
2043  case V4L2_PIX_FMT_RGB332 : return PIXELFORMAT_RGB332; break;
2044 #if defined( V4L2_PIX_FMT_RGB444 )
2045  case V4L2_PIX_FMT_RGB444 : return PIXELFORMAT_RGB444; break;
2046 #endif
2047  case V4L2_PIX_FMT_RGB555 : return PIXELFORMAT_RGB555; break;
2048  case V4L2_PIX_FMT_RGB565 : return PIXELFORMAT_RGB565; break;
2049  case V4L2_PIX_FMT_RGB555X : return PIXELFORMAT_RGB555X; break;
2050  case V4L2_PIX_FMT_RGB565X : return PIXELFORMAT_RGB565X; break;
2051  case V4L2_PIX_FMT_BGR24 : return PIXELFORMAT_BGR24; break;
2052  case V4L2_PIX_FMT_RGB24 : return PIXELFORMAT_RGB24; break;
2053  case V4L2_PIX_FMT_BGR32 : return PIXELFORMAT_BGR32; break;
2054  case V4L2_PIX_FMT_RGB32 : return PIXELFORMAT_RGB32; break;
2055 
2056 // Bayer RGB format
2057  case V4L2_PIX_FMT_SBGGR8 : return PIXELFORMAT_SBGGR8; break;
2058 
2059 // YUV formats
2060  case V4L2_PIX_FMT_GREY : return PIXELFORMAT_GREY; break;
2061  case V4L2_PIX_FMT_YUYV : return PIXELFORMAT_YUYV; break;
2062  case V4L2_PIX_FMT_UYVY : return PIXELFORMAT_UYVY; break;
2063  case V4L2_PIX_FMT_YUV420 : return PIXELFORMAT_YUV420P; break;
2064  case V4L2_PIX_FMT_YUV422P : return PIXELFORMAT_YUV422P; break;
2065 
2066 // Compressed formats
2067  case V4L2_PIX_FMT_JPEG : return PIXELFORMAT_JPEG; break;
2068  case V4L2_PIX_FMT_MPEG : return PIXELFORMAT_MPEG; break;
2069 
2070 // Reserved formats
2071  case V4L2_PIX_FMT_DV : return PIXELFORMAT_DV; break;
2072  case V4L2_PIX_FMT_ET61X251 : return PIXELFORMAT_ET61X251; break;
2073  case V4L2_PIX_FMT_HI240 : return PIXELFORMAT_HI240; break;
2074 #if defined( V4L2_PIX_FMT_HM12 )
2075  case V4L2_PIX_FMT_HM12 : return PIXELFORMAT_HM12; break;
2076 #endif
2077  case V4L2_PIX_FMT_MJPEG : return PIXELFORMAT_MJPEG; break;
2078  case V4L2_PIX_FMT_PWC1 : return PIXELFORMAT_PWC1; break;
2079  case V4L2_PIX_FMT_PWC2 : return PIXELFORMAT_PWC2; break;
2080  case V4L2_PIX_FMT_SN9C10X : return PIXELFORMAT_SN9C10X; break;
2081  case V4L2_PIX_FMT_WNVA : return PIXELFORMAT_WNVA; break;
2082  case V4L2_PIX_FMT_YYUV : return PIXELFORMAT_YYUV; break;
2083  }
2084  break;
2085 #endif
2086 #ifdef HAVE_V4L
2087  case VIDEODEV_DRIVER_V4L:
2088  switch(palette)
2089  {
2090  case 0 : return PIXELFORMAT_NONE; break;
2091  case VIDEO_PALETTE_GREY : return PIXELFORMAT_GREY; break;
2092  case VIDEO_PALETTE_HI240 : return PIXELFORMAT_RGB332; break;
2093  case VIDEO_PALETTE_RGB555 : return PIXELFORMAT_RGB555; break;
2094  case VIDEO_PALETTE_RGB565 : return PIXELFORMAT_RGB565; break;
2095  case VIDEO_PALETTE_RGB24 : return PIXELFORMAT_RGB24; break;
2096  case VIDEO_PALETTE_RGB32 : return PIXELFORMAT_RGB32; break;
2097  case VIDEO_PALETTE_YUYV : return PIXELFORMAT_YUYV; break;
2098  case VIDEO_PALETTE_UYVY : return PIXELFORMAT_UYVY; break;
2099  case VIDEO_PALETTE_YUV420 :
2100  case VIDEO_PALETTE_YUV420P : return PIXELFORMAT_YUV420P; break;
2101  case VIDEO_PALETTE_YUV422P : return PIXELFORMAT_YUV422P; break;
2102  }
2103  break;
2104 #endif
2105 #endif
2106  case VIDEODEV_DRIVER_NONE:
2107  default:
2108  return PIXELFORMAT_NONE; break;
2109  }
2110  return PIXELFORMAT_NONE;
2111 }
2112 
2113 int VideoDevice::pixelFormatCode(pixel_format pixelformat)
2114 {
2115  switch(m_driver)
2116  {
2117 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
2118 #ifdef V4L2_CAP_VIDEO_CAPTURE
2119  case VIDEODEV_DRIVER_V4L2:
2120  switch(pixelformat)
2121  {
2122  case PIXELFORMAT_NONE : return 0; break;
2123 
2124 // Packed RGB formats
2125  case PIXELFORMAT_RGB332 : return V4L2_PIX_FMT_RGB332; break;
2126 #if defined( V4L2_PIX_FMT_RGB444 )
2127  case PIXELFORMAT_RGB444 : return V4L2_PIX_FMT_RGB444; break;
2128 #endif
2129  case PIXELFORMAT_RGB555 : return V4L2_PIX_FMT_RGB555; break;
2130  case PIXELFORMAT_RGB565 : return V4L2_PIX_FMT_RGB565; break;
2131  case PIXELFORMAT_RGB555X: return V4L2_PIX_FMT_RGB555X; break;
2132  case PIXELFORMAT_RGB565X: return V4L2_PIX_FMT_RGB565X; break;
2133  case PIXELFORMAT_BGR24 : return V4L2_PIX_FMT_BGR24; break;
2134  case PIXELFORMAT_RGB24 : return V4L2_PIX_FMT_RGB24; break;
2135  case PIXELFORMAT_BGR32 : return V4L2_PIX_FMT_BGR32; break;
2136  case PIXELFORMAT_RGB32 : return V4L2_PIX_FMT_RGB32; break;
2137 
2138 // Bayer RGB format
2139  case PIXELFORMAT_SBGGR8 : return V4L2_PIX_FMT_SBGGR8; break;
2140 
2141 // YUV formats
2142  case PIXELFORMAT_GREY : return V4L2_PIX_FMT_GREY; break;
2143  case PIXELFORMAT_YUYV : return V4L2_PIX_FMT_YUYV; break;
2144  case PIXELFORMAT_UYVY : return V4L2_PIX_FMT_UYVY; break;
2145  case PIXELFORMAT_YUV420P: return V4L2_PIX_FMT_YUV420; break;
2146  case PIXELFORMAT_YUV422P: return V4L2_PIX_FMT_YUV422P; break;
2147 
2148 // Compressed formats
2149  case PIXELFORMAT_JPEG : return V4L2_PIX_FMT_JPEG; break;
2150  case PIXELFORMAT_MPEG : return V4L2_PIX_FMT_MPEG; break;
2151 
2152 // Reserved formats
2153  case PIXELFORMAT_DV : return V4L2_PIX_FMT_DV; break;
2154  case PIXELFORMAT_ET61X251:return V4L2_PIX_FMT_ET61X251;break;
2155  case PIXELFORMAT_HI240 : return V4L2_PIX_FMT_HI240; break;
2156 #if defined( V4L2_PIX_FMT_HM12 )
2157  case PIXELFORMAT_HM12 : return V4L2_PIX_FMT_HM12; break;
2158 #endif
2159  case PIXELFORMAT_MJPEG : return V4L2_PIX_FMT_MJPEG; break;
2160  case PIXELFORMAT_PWC1 : return V4L2_PIX_FMT_PWC1; break;
2161  case PIXELFORMAT_PWC2 : return V4L2_PIX_FMT_PWC2; break;
2162  case PIXELFORMAT_SN9C10X: return V4L2_PIX_FMT_SN9C10X; break;
2163  case PIXELFORMAT_WNVA : return V4L2_PIX_FMT_WNVA; break;
2164  case PIXELFORMAT_YYUV : return V4L2_PIX_FMT_YYUV; break;
2165  }
2166  break;
2167 #endif
2168 #ifdef HAVE_V4L
2169  case VIDEODEV_DRIVER_V4L:
2170  switch(pixelformat)
2171  {
2172  case PIXELFORMAT_NONE : return 0; break;
2173 
2174 // Packed RGB formats
2175  case PIXELFORMAT_RGB332 : return VIDEO_PALETTE_HI240; break;
2176  case PIXELFORMAT_RGB444 : return 0; break;
2177  case PIXELFORMAT_RGB555 : return VIDEO_PALETTE_RGB555; break;
2178  case PIXELFORMAT_RGB565 : return VIDEO_PALETTE_RGB565; break;
2179  case PIXELFORMAT_RGB555X: return 0; break;
2180  case PIXELFORMAT_RGB565X: return 0; break;
2181  case PIXELFORMAT_BGR24 : return 0; break;
2182  case PIXELFORMAT_RGB24 : return VIDEO_PALETTE_RGB24; break;
2183  case PIXELFORMAT_BGR32 : return 0; break;
2184  case PIXELFORMAT_RGB32 : return VIDEO_PALETTE_RGB32; break;
2185 
2186 // Bayer RGB format
2187  case PIXELFORMAT_SBGGR8 : return 0; break;
2188 
2189 // YUV formats
2190  case PIXELFORMAT_GREY : return VIDEO_PALETTE_GREY; break;
2191  case PIXELFORMAT_YUYV : return VIDEO_PALETTE_YUYV; break;
2192  case PIXELFORMAT_UYVY : return VIDEO_PALETTE_UYVY; break;
2193  case PIXELFORMAT_YUV420P: return VIDEO_PALETTE_YUV420; break;
2194  case PIXELFORMAT_YUV422P: return VIDEO_PALETTE_YUV422P; break;
2195 
2196 // Compressed formats
2197  case PIXELFORMAT_JPEG : return 0; break;
2198  case PIXELFORMAT_MPEG : return 0; break;
2199 
2200 // Reserved formats
2201  case PIXELFORMAT_DV : return 0; break;
2202  case PIXELFORMAT_ET61X251:return 0; break;
2203  case PIXELFORMAT_HI240 : return VIDEO_PALETTE_HI240; break;
2204  case PIXELFORMAT_HM12 : return 0; break;
2205  case PIXELFORMAT_MJPEG : return 0; break;
2206  case PIXELFORMAT_PWC1 : return 0; break;
2207  case PIXELFORMAT_PWC2 : return 0; break;
2208  case PIXELFORMAT_SN9C10X: return 0; break;
2209  case PIXELFORMAT_WNVA : return 0; break;
2210  case PIXELFORMAT_YYUV : return 0; break;
2211  }
2212  break;
2213 #endif
2214 #endif
2215  case VIDEODEV_DRIVER_NONE:
2216  default:
2217  return PIXELFORMAT_NONE; break;
2218  }
2219  return PIXELFORMAT_NONE;
2220 }
2221 
2222 int VideoDevice::pixelFormatDepth(pixel_format pixelformat)
2223 {
2224  switch(pixelformat)
2225  {
2226  case PIXELFORMAT_NONE : return 0; break;
2227 
2228 // Packed RGB formats
2229  case PIXELFORMAT_RGB332 : return 8; break;
2230  case PIXELFORMAT_RGB444 : return 16; break;
2231  case PIXELFORMAT_RGB555 : return 16; break;
2232  case PIXELFORMAT_RGB565 : return 16; break;
2233  case PIXELFORMAT_RGB555X: return 16; break;
2234  case PIXELFORMAT_RGB565X: return 16; break;
2235  case PIXELFORMAT_BGR24 : return 24; break;
2236  case PIXELFORMAT_RGB24 : return 24; break;
2237  case PIXELFORMAT_BGR32 : return 32; break;
2238  case PIXELFORMAT_RGB32 : return 32; break;
2239 
2240 // Bayer RGB format
2241  case PIXELFORMAT_SBGGR8 : return 0; break;
2242 
2243 // YUV formats
2244  case PIXELFORMAT_GREY : return 8; break;
2245  case PIXELFORMAT_YUYV : return 16; break;
2246  case PIXELFORMAT_UYVY : return 16; break;
2247  case PIXELFORMAT_YUV420P: return 16; break;
2248  case PIXELFORMAT_YUV422P: return 16; break;
2249 
2250 // Compressed formats
2251  case PIXELFORMAT_JPEG : return 0; break;
2252  case PIXELFORMAT_MPEG : return 0; break;
2253 
2254 // Reserved formats
2255  case PIXELFORMAT_DV : return 0; break;
2256  case PIXELFORMAT_ET61X251:return 0; break;
2257  case PIXELFORMAT_HI240 : return 8; break;
2258  case PIXELFORMAT_HM12 : return 0; break;
2259  case PIXELFORMAT_MJPEG : return 0; break;
2260  case PIXELFORMAT_PWC1 : return 0; break;
2261  case PIXELFORMAT_PWC2 : return 0; break;
2262  case PIXELFORMAT_SN9C10X: return 0; break;
2263  case PIXELFORMAT_WNVA : return 0; break;
2264  case PIXELFORMAT_YYUV : return 0; break;
2265  }
2266  return 0;
2267 }
2268 
2269 QString VideoDevice::pixelFormatName(pixel_format pixelformat)
2270 {
2271  QString returnvalue;
2272  returnvalue = "None";
2273  switch(pixelformat)
2274  {
2275  case PIXELFORMAT_NONE : returnvalue = "None"; break;
2276 
2277 // Packed RGB formats
2278  case PIXELFORMAT_RGB332 : returnvalue = "8-bit RGB332"; break;
2279  case PIXELFORMAT_RGB444 : returnvalue = "8-bit RGB444"; break;
2280  case PIXELFORMAT_RGB555 : returnvalue = "16-bit RGB555"; break;
2281  case PIXELFORMAT_RGB565 : returnvalue = "16-bit RGB565"; break;
2282  case PIXELFORMAT_RGB555X: returnvalue = "16-bit RGB555X"; break;
2283  case PIXELFORMAT_RGB565X: returnvalue = "16-bit RGB565X"; break;
2284  case PIXELFORMAT_BGR24 : returnvalue = "24-bit BGR24"; break;
2285  case PIXELFORMAT_RGB24 : returnvalue = "24-bit RGB24"; break;
2286  case PIXELFORMAT_BGR32 : returnvalue = "32-bit BGR32"; break;
2287  case PIXELFORMAT_RGB32 : returnvalue = "32-bit RGB32"; break;
2288 
2289 // Bayer RGB format
2290  case PIXELFORMAT_SBGGR8 : returnvalue = "Bayer RGB format"; break;
2291 
2292 // YUV formats
2293  case PIXELFORMAT_GREY : returnvalue = "8-bit Grayscale"; break;
2294  case PIXELFORMAT_YUYV : returnvalue = "Packed YUV 4:2:2"; break;
2295  case PIXELFORMAT_UYVY : returnvalue = "Packed YVU 4:2:2"; break;
2296  case PIXELFORMAT_YUV420P: returnvalue = "Planar YUV 4:2:0"; break;
2297  case PIXELFORMAT_YUV422P: returnvalue = "Planar YUV 4:2:2"; break;
2298 
2299 
2300 // Compressed formats
2301  case PIXELFORMAT_JPEG : returnvalue = "JPEG image"; break;
2302  case PIXELFORMAT_MPEG : returnvalue = "MPEG stream"; break;
2303 
2304 // Reserved formats
2305  case PIXELFORMAT_DV : returnvalue = "DV (unknown)"; break;
2306  case PIXELFORMAT_ET61X251:returnvalue = "ET61X251"; break;
2307  case PIXELFORMAT_HI240 : returnvalue = "8-bit HI240 (RGB332)"; break;
2308  case PIXELFORMAT_HM12 : returnvalue = "Packed YUV 4:2:2"; break;
2309  case PIXELFORMAT_MJPEG : returnvalue = "8-bit Grayscale"; break;
2310  case PIXELFORMAT_PWC1 : returnvalue = "PWC1"; break;
2311  case PIXELFORMAT_PWC2 : returnvalue = "PWC2"; break;
2312  case PIXELFORMAT_SN9C10X: returnvalue = "SN9C102"; break;
2313  case PIXELFORMAT_WNVA : returnvalue = "Winnov Videum"; break;
2314  case PIXELFORMAT_YYUV : returnvalue = "YYUV (unknown)"; break;
2315  }
2316  return returnvalue;
2317 }
2318 
2319 QString VideoDevice::pixelFormatName(int pixelformat)
2320 {
2321  QString returnvalue;
2322  returnvalue = "None";
2323  switch(m_driver)
2324  {
2325 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
2326 #ifdef V4L2_CAP_VIDEO_CAPTURE
2327  case VIDEODEV_DRIVER_V4L2:
2328  switch(pixelformat)
2329  {
2330  case 0 : returnvalue = pixelFormatName(PIXELFORMAT_NONE); break;
2331 
2332 // Packed RGB formats
2333  case V4L2_PIX_FMT_RGB332 : returnvalue = pixelFormatName(PIXELFORMAT_RGB332); break;
2334 #if defined( V4L2_PIX_FMT_RGB444 )
2335  case V4L2_PIX_FMT_RGB444 : returnvalue = pixelFormatName(PIXELFORMAT_RGB444); break;
2336 #endif
2337  case V4L2_PIX_FMT_RGB555 : returnvalue = pixelFormatName(PIXELFORMAT_RGB555); break;
2338  case V4L2_PIX_FMT_RGB565 : returnvalue = pixelFormatName(PIXELFORMAT_RGB565); break;
2339  case V4L2_PIX_FMT_RGB555X : returnvalue = pixelFormatName(PIXELFORMAT_RGB555X); break;
2340  case V4L2_PIX_FMT_RGB565X : returnvalue = pixelFormatName(PIXELFORMAT_RGB565X); break;
2341  case V4L2_PIX_FMT_BGR24 : returnvalue = pixelFormatName(PIXELFORMAT_BGR24); break;
2342  case V4L2_PIX_FMT_RGB24 : returnvalue = pixelFormatName(PIXELFORMAT_RGB24); break;
2343  case V4L2_PIX_FMT_BGR32 : returnvalue = pixelFormatName(PIXELFORMAT_BGR32); break;
2344  case V4L2_PIX_FMT_RGB32 : returnvalue = pixelFormatName(PIXELFORMAT_RGB32); break;
2345 
2346 // Bayer RGB format
2347  case V4L2_PIX_FMT_SBGGR8 : returnvalue = pixelFormatName(PIXELFORMAT_SBGGR8); break;
2348 
2349 // YUV formats
2350  case V4L2_PIX_FMT_GREY : returnvalue = pixelFormatName(PIXELFORMAT_GREY); break;
2351  case V4L2_PIX_FMT_YUYV : returnvalue = pixelFormatName(PIXELFORMAT_YUYV); break;
2352  case V4L2_PIX_FMT_UYVY : returnvalue = pixelFormatName(PIXELFORMAT_UYVY); break;
2353  case V4L2_PIX_FMT_YUV420 : returnvalue = pixelFormatName(PIXELFORMAT_YUV420P); break;
2354  case V4L2_PIX_FMT_YUV422P : returnvalue = pixelFormatName(PIXELFORMAT_YUV422P); break;
2355 
2356 // Compressed formats
2357  case V4L2_PIX_FMT_JPEG : returnvalue = pixelFormatName(PIXELFORMAT_JPEG); break;
2358  case V4L2_PIX_FMT_MPEG : returnvalue = pixelFormatName(PIXELFORMAT_MPEG); break;
2359 
2360 // Reserved formats
2361  case V4L2_PIX_FMT_DV : returnvalue = pixelFormatName(PIXELFORMAT_DV); break;
2362  case V4L2_PIX_FMT_ET61X251 : returnvalue = pixelFormatName(PIXELFORMAT_ET61X251); break;
2363  case V4L2_PIX_FMT_HI240 : returnvalue = pixelFormatName(PIXELFORMAT_HI240); break;
2364 #if defined( V4L2_PIX_FMT_HM12 )
2365  case V4L2_PIX_FMT_HM12 : returnvalue = pixelFormatName(PIXELFORMAT_HM12); break;
2366 #endif
2367  case V4L2_PIX_FMT_MJPEG : returnvalue = pixelFormatName(PIXELFORMAT_MJPEG); break;
2368  case V4L2_PIX_FMT_PWC1 : returnvalue = pixelFormatName(PIXELFORMAT_PWC1); break;
2369  case V4L2_PIX_FMT_PWC2 : returnvalue = pixelFormatName(PIXELFORMAT_PWC2); break;
2370  case V4L2_PIX_FMT_SN9C10X : returnvalue = pixelFormatName(PIXELFORMAT_SN9C10X); break;
2371  case V4L2_PIX_FMT_WNVA : returnvalue = pixelFormatName(PIXELFORMAT_WNVA); break;
2372  case V4L2_PIX_FMT_YYUV : returnvalue = pixelFormatName(PIXELFORMAT_YYUV); break;
2373  }
2374  break;
2375 #endif
2376 #ifdef HAVE_V4L
2377  case VIDEODEV_DRIVER_V4L:
2378  switch(pixelformat)
2379  {
2380  case VIDEO_PALETTE_GREY : returnvalue = pixelFormatName(PIXELFORMAT_GREY); break;
2381  case VIDEO_PALETTE_HI240 : returnvalue = pixelFormatName(PIXELFORMAT_RGB332); break;
2382  case VIDEO_PALETTE_RGB555 : returnvalue = pixelFormatName(PIXELFORMAT_RGB555); break;
2383  case VIDEO_PALETTE_RGB565 : returnvalue = pixelFormatName(PIXELFORMAT_RGB565); break;
2384  case VIDEO_PALETTE_RGB24 : returnvalue = pixelFormatName(PIXELFORMAT_RGB24); break;
2385  case VIDEO_PALETTE_RGB32 : returnvalue = pixelFormatName(PIXELFORMAT_RGB32); break;
2386  case VIDEO_PALETTE_YUYV : returnvalue = pixelFormatName(PIXELFORMAT_YUYV); break;
2387  case VIDEO_PALETTE_UYVY : returnvalue = pixelFormatName(PIXELFORMAT_UYVY); break;
2388  case VIDEO_PALETTE_YUV420 :
2389  case VIDEO_PALETTE_YUV420P : returnvalue = pixelFormatName(PIXELFORMAT_YUV420P); break;
2390  case VIDEO_PALETTE_YUV422P : returnvalue = pixelFormatName(PIXELFORMAT_YUV422P); break;
2391  }
2392  break;
2393 #endif
2394 #endif
2395  case VIDEODEV_DRIVER_NONE:
2396  default:
2397  break;
2398  }
2399  return returnvalue;
2400 }
2401 
2402 int VideoDevice::detectPixelFormats()
2403 {
2404  int err = 0;
2405  switch(m_driver)
2406  {
2407 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
2408 #ifdef V4L2_CAP_VIDEO_CAPTURE
2409  case VIDEODEV_DRIVER_V4L2:
2410  struct v4l2_fmtdesc fmtdesc;
2411  fmtdesc.index = 0;
2412  fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2413 
2414  while ( err == 0 )
2415  {
2416  if (-1 == xioctl (VIDIOC_ENUM_FMT, &fmtdesc))
2417 // if (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) < 0 )
2418  {
2419  perror("VIDIOC_ENUM_FMT");
2420  err = errno;
2421  }
2422  else
2423  {
2424  kDebug () << fmtdesc.pixelformat << " " << pixelFormatName(fmtdesc.pixelformat); // Need a cleanup. PixelFormatForPalette is a really bad name
2425  fmtdesc.index++;
2426  }
2427  }
2428 // break;
2429 #endif
2430  case VIDEODEV_DRIVER_V4L:
2431 // TODO: THis thing can be used to detec what pixel formats are supported in a API-independent way, but V4L2 has VIDIOC_ENUM_PIXFMT.
2432 // The correct thing to do is to isolate these calls and do a proper implementation for V4L and another for V4L2 when this thing will be migrated to a plugin architecture.
2433 
2434 // Packed RGB formats
2435  kDebug() << "Supported pixel formats:";
2436  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB332)) { kDebug() << pixelFormatName(PIXELFORMAT_RGB332); }
2437  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB444)) { kDebug() << pixelFormatName(PIXELFORMAT_RGB444); }
2438  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB555)) { kDebug() << pixelFormatName(PIXELFORMAT_RGB555); }
2439  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB565)) { kDebug() << pixelFormatName(PIXELFORMAT_RGB565); }
2440  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB555X)) { kDebug() << pixelFormatName(PIXELFORMAT_RGB555X); }
2441  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB565X)) { kDebug() << pixelFormatName(PIXELFORMAT_RGB565X); }
2442  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_BGR24)) { kDebug() << pixelFormatName(PIXELFORMAT_BGR24); }
2443  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB24)) { kDebug() << pixelFormatName(PIXELFORMAT_RGB24); }
2444  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_BGR32)) { kDebug() << pixelFormatName(PIXELFORMAT_BGR32); }
2445  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_RGB32)) { kDebug() << pixelFormatName(PIXELFORMAT_RGB32); }
2446 
2447 // Bayer RGB format
2448  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_SBGGR8)) { kDebug() << pixelFormatName(PIXELFORMAT_SBGGR8); }
2449 
2450 // YUV formats
2451  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_GREY)) { kDebug() << pixelFormatName(PIXELFORMAT_GREY); }
2452  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_YUYV)) { kDebug() << pixelFormatName(PIXELFORMAT_YUYV); }
2453  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_UYVY)) { kDebug() << pixelFormatName(PIXELFORMAT_UYVY); }
2454  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_YUV420P)) { kDebug() << pixelFormatName(PIXELFORMAT_YUV420P); }
2455  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_YUV422P)) { kDebug() << pixelFormatName(PIXELFORMAT_YUV422P); }
2456 
2457 // Compressed formats
2458  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_JPEG)) { kDebug() << pixelFormatName(PIXELFORMAT_JPEG); }
2459  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_MPEG)) { kDebug() << pixelFormatName(PIXELFORMAT_MPEG); }
2460 
2461 // Reserved formats
2462  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_DV)) { kDebug() << pixelFormatName(PIXELFORMAT_DV); }
2463  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_ET61X251)) { kDebug() << pixelFormatName(PIXELFORMAT_ET61X251); }
2464  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_HI240)) { kDebug() << pixelFormatName(PIXELFORMAT_HI240); }
2465  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_HM12)) { kDebug() << pixelFormatName(PIXELFORMAT_HM12); }
2466  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_MJPEG)) { kDebug() << pixelFormatName(PIXELFORMAT_MJPEG); }
2467  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_PWC1)) { kDebug() << pixelFormatName(PIXELFORMAT_PWC1); }
2468  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_PWC2)) { kDebug() << pixelFormatName(PIXELFORMAT_PWC2); }
2469  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_SN9C10X)) { kDebug() << pixelFormatName(PIXELFORMAT_SN9C10X); }
2470  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_WNVA)) { kDebug() << pixelFormatName(PIXELFORMAT_WNVA); }
2471  if(PIXELFORMAT_NONE != setPixelFormat(PIXELFORMAT_YYUV)) { kDebug() << pixelFormatName(PIXELFORMAT_YYUV); }
2472  break;
2473 #endif
2474  case VIDEODEV_DRIVER_NONE:
2475  default:
2476  return PIXELFORMAT_NONE; break;
2477  }
2478  return PIXELFORMAT_NONE;
2479 }
2480 
2481 __u64 VideoDevice::signalStandardCode(signal_standard standard)
2482 {
2483  switch(m_driver)
2484  {
2485 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
2486 #ifdef V4L2_CAP_VIDEO_CAPTURE
2487  case VIDEODEV_DRIVER_V4L2:
2488  switch(standard)
2489  {
2490  case STANDARD_PAL_B : return V4L2_STD_PAL_B; break;
2491  case STANDARD_PAL_B1 : return V4L2_STD_PAL_B1; break;
2492  case STANDARD_PAL_G : return V4L2_STD_PAL_G; break;
2493  case STANDARD_PAL_H : return V4L2_STD_PAL_H; break;
2494  case STANDARD_PAL_I : return V4L2_STD_PAL_I; break;
2495  case STANDARD_PAL_D : return V4L2_STD_PAL_D; break;
2496  case STANDARD_PAL_D1 : return V4L2_STD_PAL_D1; break;
2497  case STANDARD_PAL_K : return V4L2_STD_PAL_K; break;
2498 
2499  case STANDARD_PAL_M : return V4L2_STD_PAL_M; break;
2500  case STANDARD_PAL_N : return V4L2_STD_PAL_N; break;
2501  case STANDARD_PAL_Nc : return V4L2_STD_PAL_Nc; break;
2502  case STANDARD_PAL_60 : return V4L2_STD_PAL_60; break;
2503 
2504  case STANDARD_NTSC_M : return V4L2_STD_NTSC_M; break;
2505  case STANDARD_NTSC_M_JP : return V4L2_STD_NTSC_M_JP; break;
2506  case STANDARD_NTSC_443 : return V4L2_STD_NTSC_443; break;
2507  case STANDARD_NTSC_M_KR : return V4L2_STD_NTSC_M_KR; break;
2508 
2509  case STANDARD_SECAM_B : return V4L2_STD_SECAM_B; break;
2510  case STANDARD_SECAM_D : return V4L2_STD_SECAM_D; break;
2511  case STANDARD_SECAM_G : return V4L2_STD_SECAM_G; break;
2512  case STANDARD_SECAM_H : return V4L2_STD_SECAM_H; break;
2513  case STANDARD_SECAM_K : return V4L2_STD_SECAM_K; break;
2514  case STANDARD_SECAM_K1 : return V4L2_STD_SECAM_K1; break;
2515  case STANDARD_SECAM_L : return V4L2_STD_SECAM_L; break;
2516  case STANDARD_SECAM_LC : return V4L2_STD_SECAM_LC; break;
2517 
2518  case STANDARD_ATSC_8_VSB: return V4L2_STD_ATSC_8_VSB; break;
2519  case STANDARD_ATSC_16_VSB:return V4L2_STD_ATSC_16_VSB; break;
2520 
2521  case STANDARD_PAL_BG : return V4L2_STD_PAL_BG; break;
2522  case STANDARD_PAL_DK : return V4L2_STD_PAL_DK; break;
2523  case STANDARD_PAL : return V4L2_STD_PAL; break;
2524  case STANDARD_NTSC : return V4L2_STD_NTSC; break;
2525  case STANDARD_SECAM_DK : return V4L2_STD_SECAM_DK; break;
2526  case STANDARD_SECAM : return V4L2_STD_SECAM; break;
2527 
2528  case STANDARD_MN : return V4L2_STD_MN; break;
2529  case STANDARD_B : return V4L2_STD_B; break;
2530  case STANDARD_GH : return V4L2_STD_GH; break;
2531  case STANDARD_DK : return V4L2_STD_DK; break;
2532 
2533  case STANDARD_525_60 : return V4L2_STD_525_60; break;
2534  case STANDARD_625_50 : return V4L2_STD_625_50; break;
2535  case STANDARD_ATSC : return V4L2_STD_ATSC; break;
2536 
2537  case STANDARD_UNKNOWN : return V4L2_STD_UNKNOWN; break;
2538  case STANDARD_ALL : return V4L2_STD_ALL; break;
2539  }
2540  break;
2541 #endif
2542 #ifdef HAVE_V4L
2543  case VIDEODEV_DRIVER_V4L:
2544  switch(standard)
2545  {
2546  case STANDARD_PAL_B : return VIDEO_MODE_PAL; break;
2547  case STANDARD_PAL_B1 : return VIDEO_MODE_PAL; break;
2548  case STANDARD_PAL_G : return VIDEO_MODE_PAL; break;
2549  case STANDARD_PAL_H : return VIDEO_MODE_PAL; break;
2550  case STANDARD_PAL_I : return VIDEO_MODE_PAL; break;
2551  case STANDARD_PAL_D : return VIDEO_MODE_PAL; break;
2552  case STANDARD_PAL_D1 : return VIDEO_MODE_PAL; break;
2553  case STANDARD_PAL_K : return VIDEO_MODE_PAL; break;
2554 
2555  case STANDARD_PAL_M : return 5; break; // Undocumented value found to be compatible with V4L bttv driver
2556  case STANDARD_PAL_N : return 6; break; // Undocumented value found to be compatible with V4L bttv driver
2557  case STANDARD_PAL_Nc : return 4; break; // Undocumented value found to be compatible with V4L bttv driver
2558  case STANDARD_PAL_60 : return VIDEO_MODE_PAL; break;
2559 
2560  case STANDARD_NTSC_M : return VIDEO_MODE_NTSC; break;
2561  case STANDARD_NTSC_M_JP : return 7; break; // Undocumented value found to be compatible with V4L bttv driver
2562  case STANDARD_NTSC_443 : return VIDEO_MODE_NTSC; break;
2563  case STANDARD_NTSC_M_KR : return VIDEO_MODE_NTSC; break;
2564 
2565  case STANDARD_SECAM_B : return VIDEO_MODE_SECAM; break;
2566  case STANDARD_SECAM_D : return VIDEO_MODE_SECAM; break;
2567  case STANDARD_SECAM_G : return VIDEO_MODE_SECAM; break;
2568  case STANDARD_SECAM_H : return VIDEO_MODE_SECAM; break;
2569  case STANDARD_SECAM_K : return VIDEO_MODE_SECAM; break;
2570  case STANDARD_SECAM_K1 : return VIDEO_MODE_SECAM; break;
2571  case STANDARD_SECAM_L : return VIDEO_MODE_SECAM; break;
2572  case STANDARD_SECAM_LC : return VIDEO_MODE_SECAM; break;
2573 
2574  case STANDARD_ATSC_8_VSB: return VIDEO_MODE_AUTO; break;
2575  case STANDARD_ATSC_16_VSB:return VIDEO_MODE_AUTO; break;
2576 
2577  case STANDARD_PAL_BG : return VIDEO_MODE_PAL; break;
2578  case STANDARD_PAL_DK : return VIDEO_MODE_PAL; break;
2579  case STANDARD_PAL : return VIDEO_MODE_PAL; break;
2580  case STANDARD_NTSC : return VIDEO_MODE_NTSC; break;
2581  case STANDARD_SECAM_DK : return VIDEO_MODE_SECAM; break;
2582  case STANDARD_SECAM : return VIDEO_MODE_SECAM; break;
2583 
2584  case STANDARD_MN : return VIDEO_MODE_AUTO; break;
2585  case STANDARD_B : return VIDEO_MODE_AUTO; break;
2586  case STANDARD_GH : return VIDEO_MODE_AUTO; break;
2587  case STANDARD_DK : return VIDEO_MODE_AUTO; break;
2588 
2589  case STANDARD_525_60 : return VIDEO_MODE_PAL; break;
2590  case STANDARD_625_50 : return VIDEO_MODE_SECAM; break;
2591  case STANDARD_ATSC : return VIDEO_MODE_AUTO; break;
2592 
2593  case STANDARD_UNKNOWN : return VIDEO_MODE_AUTO; break;
2594  case STANDARD_ALL : return VIDEO_MODE_AUTO; break;
2595  }
2596  break;
2597 #endif
2598 #endif
2599  case VIDEODEV_DRIVER_NONE:
2600  default:
2601  return STANDARD_UNKNOWN; break;
2602  }
2603  return STANDARD_UNKNOWN;
2604 }
2605 
2606 QString VideoDevice::signalStandardName(signal_standard standard)
2607 {
2608  QString returnvalue;
2609  returnvalue = "None";
2610  switch(standard)
2611  {
2612  case STANDARD_PAL_B : returnvalue = "PAL-B"; break;
2613  case STANDARD_PAL_B1 : returnvalue = "PAL-B1"; break;
2614  case STANDARD_PAL_G : returnvalue = "PAL-G"; break;
2615  case STANDARD_PAL_H : returnvalue = "PAL-H"; break;
2616  case STANDARD_PAL_I : returnvalue = "PAL-I"; break;
2617  case STANDARD_PAL_D : returnvalue = "PAL-D"; break;
2618  case STANDARD_PAL_D1 : returnvalue = "PAL-D1"; break;
2619  case STANDARD_PAL_K : returnvalue = "PAL-K"; break;
2620 
2621  case STANDARD_PAL_M : returnvalue = "PAL-M"; break;
2622  case STANDARD_PAL_N : returnvalue = "PAL-N"; break;
2623  case STANDARD_PAL_Nc : returnvalue = "PAL-Nc"; break;
2624  case STANDARD_PAL_60 : returnvalue = "PAL-60"; break;
2625 
2626  case STANDARD_NTSC_M : returnvalue = "NTSC-M"; break;
2627  case STANDARD_NTSC_M_JP : returnvalue = "NTSC-M(JP)"; break;
2628  case STANDARD_NTSC_443 : returnvalue = "NTSC-443"; break;
2629  case STANDARD_NTSC_M_KR : returnvalue = "NTSC-M(KR)"; break;
2630 
2631  case STANDARD_SECAM_B : returnvalue = "SECAM-B"; break;
2632  case STANDARD_SECAM_D : returnvalue = "SECAM-D"; break;
2633  case STANDARD_SECAM_G : returnvalue = "SECAM-G"; break;
2634  case STANDARD_SECAM_H : returnvalue = "SECAM-H"; break;
2635  case STANDARD_SECAM_K : returnvalue = "SECAM-K"; break;
2636  case STANDARD_SECAM_K1 : returnvalue = "SECAM-K1"; break;
2637  case STANDARD_SECAM_L : returnvalue = "SECAM-L"; break;
2638  case STANDARD_SECAM_LC : returnvalue = "SECAM-LC"; break;
2639 
2640  case STANDARD_ATSC_8_VSB: returnvalue = "ATSC-8-VSB"; break;
2641  case STANDARD_ATSC_16_VSB:returnvalue = "ATSC-16-VSB"; break;
2642 
2643  case STANDARD_PAL_BG : returnvalue = "PAL-BG"; break;
2644  case STANDARD_PAL_DK : returnvalue = "PAL-DK"; break;
2645  case STANDARD_PAL : returnvalue = "PAL"; break;
2646  case STANDARD_NTSC : returnvalue = "NTSC"; break;
2647  case STANDARD_SECAM_DK : returnvalue = "SECAM-DK"; break;
2648  case STANDARD_SECAM : returnvalue = "SECAM"; break;
2649 
2650  case STANDARD_MN : returnvalue = "DK"; break;
2651  case STANDARD_B : returnvalue = "B"; break;
2652  case STANDARD_GH : returnvalue = "GH"; break;
2653  case STANDARD_DK : returnvalue = "DK"; break;
2654 
2655  case STANDARD_525_60 : returnvalue = "525 lines 60Hz";break;
2656  case STANDARD_625_50 : returnvalue = "625 lines 50Hz";break;
2657  case STANDARD_ATSC : returnvalue = "ATSC"; break;
2658 
2659  case STANDARD_UNKNOWN : returnvalue = "Unknown"; break;
2660  case STANDARD_ALL : returnvalue = "All"; break;
2661  }
2662  return returnvalue;
2663 }
2664 
2665 QString VideoDevice::signalStandardName(int standard)
2666 {
2667  QString returnvalue;
2668  returnvalue = "None";
2669  switch(m_driver)
2670  {
2671 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
2672 #ifdef V4L2_CAP_VIDEO_CAPTURE
2673  case VIDEODEV_DRIVER_V4L2:
2674  switch(standard)
2675  {
2676  case V4L2_STD_PAL_B : returnvalue = signalStandardName(STANDARD_PAL_B); break;
2677  case V4L2_STD_PAL_B1 : returnvalue = signalStandardName(STANDARD_PAL_B1); break;
2678  case V4L2_STD_PAL_G : returnvalue = signalStandardName(STANDARD_PAL_G); break;
2679  case V4L2_STD_PAL_H : returnvalue = signalStandardName(STANDARD_PAL_H); break;
2680  case V4L2_STD_PAL_I : returnvalue = signalStandardName(STANDARD_PAL_I); break;
2681  case V4L2_STD_PAL_D : returnvalue = signalStandardName(STANDARD_PAL_D); break;
2682  case V4L2_STD_PAL_D1 : returnvalue = signalStandardName(STANDARD_PAL_D1); break;
2683  case V4L2_STD_PAL_K : returnvalue = signalStandardName(STANDARD_PAL_K); break;
2684  case V4L2_STD_PAL_M : returnvalue = signalStandardName(STANDARD_PAL_M); break;
2685  case V4L2_STD_PAL_N : returnvalue = signalStandardName(STANDARD_PAL_N); break;
2686  case V4L2_STD_PAL_Nc : returnvalue = signalStandardName(STANDARD_PAL_Nc); break;
2687  case V4L2_STD_PAL_60 : returnvalue = signalStandardName(STANDARD_PAL_60); break;
2688  case V4L2_STD_NTSC_M : returnvalue = signalStandardName(STANDARD_NTSC_M); break;
2689  case V4L2_STD_NTSC_M_JP : returnvalue = signalStandardName(STANDARD_NTSC_M_JP); break;
2690  case V4L2_STD_NTSC_443 : returnvalue = signalStandardName(STANDARD_NTSC_443); break; // Commented out because my videodev2.h header seems to not include this standard in struct __u64 v4l2_std_id
2691  case V4L2_STD_NTSC_M_KR : returnvalue = signalStandardName(STANDARD_NTSC_M_KR); break; // Commented out because my videodev2.h header seems to not include this standard in struct __u64 v4l2_std_id
2692  case V4L2_STD_SECAM_B : returnvalue = signalStandardName(STANDARD_SECAM_B); break;
2693  case V4L2_STD_SECAM_D : returnvalue = signalStandardName(STANDARD_SECAM_D); break;
2694  case V4L2_STD_SECAM_G : returnvalue = signalStandardName(STANDARD_SECAM_G); break;
2695  case V4L2_STD_SECAM_H : returnvalue = signalStandardName(STANDARD_SECAM_H); break;
2696  case V4L2_STD_SECAM_K : returnvalue = signalStandardName(STANDARD_SECAM_K); break;
2697  case V4L2_STD_SECAM_K1 : returnvalue = signalStandardName(STANDARD_SECAM_K1); break;
2698  case V4L2_STD_SECAM_L : returnvalue = signalStandardName(STANDARD_SECAM_L); break;
2699  case V4L2_STD_SECAM_LC : returnvalue = signalStandardName(STANDARD_SECAM_LC); break;
2700 
2701  case V4L2_STD_ATSC_8_VSB: returnvalue = signalStandardName(STANDARD_ATSC_8_VSB);break;
2702  case V4L2_STD_ATSC_16_VSB:returnvalue = signalStandardName(STANDARD_ATSC_16_VSB);break;
2703 
2704  case V4L2_STD_PAL_BG : returnvalue = signalStandardName(STANDARD_PAL_BG); break;
2705  case V4L2_STD_PAL_DK : returnvalue = signalStandardName(STANDARD_PAL_DK); break;
2706  case V4L2_STD_PAL : returnvalue = signalStandardName(STANDARD_PAL); break;
2707  case V4L2_STD_NTSC : returnvalue = signalStandardName(STANDARD_NTSC); break;
2708  case V4L2_STD_SECAM_DK : returnvalue = signalStandardName(STANDARD_SECAM_DK); break;
2709  case V4L2_STD_SECAM : returnvalue = signalStandardName(STANDARD_SECAM); break;
2710 
2711  case V4L2_STD_MN : returnvalue = signalStandardName(STANDARD_MN); break;
2712  case V4L2_STD_B : returnvalue = signalStandardName(STANDARD_B); break;
2713  case V4L2_STD_GH : returnvalue = signalStandardName(STANDARD_GH); break;
2714  case V4L2_STD_DK : returnvalue = signalStandardName(STANDARD_DK); break;
2715 
2716  case V4L2_STD_525_60 : returnvalue = signalStandardName(STANDARD_525_60); break;
2717  case V4L2_STD_625_50 : returnvalue = signalStandardName(STANDARD_625_50); break;
2718  case V4L2_STD_ATSC : returnvalue = signalStandardName(STANDARD_ATSC); break;
2719 
2720  case V4L2_STD_UNKNOWN : returnvalue = signalStandardName(STANDARD_UNKNOWN); break;
2721  case V4L2_STD_ALL : returnvalue = signalStandardName(STANDARD_ALL); break;
2722  }
2723  break;
2724 #endif
2725 #ifdef HAVE_V4L
2726  case VIDEODEV_DRIVER_V4L:
2727  switch(standard)
2728  {
2729  case VIDEO_MODE_PAL : returnvalue = signalStandardName(STANDARD_PAL); break;
2730  case VIDEO_MODE_NTSC : returnvalue = signalStandardName(STANDARD_NTSC); break;
2731  case VIDEO_MODE_SECAM : returnvalue = signalStandardName(STANDARD_SECAM); break;
2732  case VIDEO_MODE_AUTO : returnvalue = signalStandardName(STANDARD_ALL); break; // It must be disabled until I find a correct way to handle those non-standard bttv modes
2733 // case VIDEO_MODE_PAL_Nc : returnvalue = signalStandardName(STANDARD_PAL_Nc); break; // Undocumented value found to be compatible with V4L bttv driver
2734  case VIDEO_MODE_PAL_M : returnvalue = signalStandardName(STANDARD_PAL_M); break; // Undocumented value found to be compatible with V4L bttv driver
2735  case VIDEO_MODE_PAL_N : returnvalue = signalStandardName(STANDARD_PAL_N); break; // Undocumented value found to be compatible with V4L bttv driver
2736  case VIDEO_MODE_NTSC_JP : returnvalue = signalStandardName(STANDARD_NTSC_M_JP); break; // Undocumented value found to be compatible with V4L bttv driver
2737  }
2738  break;
2739 #endif
2740 #endif
2741  case VIDEODEV_DRIVER_NONE:
2742  default:
2743  break;
2744  }
2745  return returnvalue;
2746 }
2747 
2752 int VideoDevice::detectSignalStandards()
2753 {
2754  kDebug() << "called.";
2755  if(isOpen())
2756  {
2757  switch(m_driver)
2758  {
2759 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV)
2760 #ifdef V4L2_CAP_VIDEO_CAPTURE
2761  case VIDEODEV_DRIVER_V4L2:
2762 
2763 
2764  struct v4l2_input input;
2765  struct v4l2_standard standard;
2766 
2767  memset (&input, 0, sizeof (input));
2768 
2769  if (-1 == xioctl (VIDIOC_G_INPUT, &input.index)) {
2770  perror ("VIDIOC_G_INPUT");
2771  return EXIT_FAILURE;
2772  }
2773 
2774  if (-1 == xioctl (VIDIOC_ENUMINPUT, &input)) {
2775  perror ("VIDIOC_ENUM_INPUT");
2776  return EXIT_FAILURE;
2777  }
2778 
2779 // printf ("Current input %s supports:\n", input.name);
2780 
2781  memset (&standard, 0, sizeof (standard));
2782  standard.index = 0;
2783 
2784  while (0 == xioctl (VIDIOC_ENUMSTD, &standard)) {
2785  if (standard.id & input.std)
2786  {
2787 // kDebug() << standard.name;
2788  kDebug() << signalStandardName(standard.id) << " (" << standard.id << ")" << V4L2_STD_NTSC;
2789  }
2790 
2791  standard.index++;
2792  }
2793 
2794 /* EINVAL indicates the end of the enumeration, which cannot be
2795  empty unless this device falls under the USB exception. */
2796 
2797  if (errno != EINVAL || standard.index == 0) {
2798  perror ("VIDIOC_ENUMSTD");
2799  return EXIT_FAILURE;
2800  }
2801 
2802 
2803  break;
2804 #endif
2805  case VIDEODEV_DRIVER_V4L:
2806  break;
2807 #endif
2808  case VIDEODEV_DRIVER_NONE:
2809  default:
2810  break;
2811  }
2812  //FIXME: return a real value
2813  return EXIT_SUCCESS;
2814  }
2815  return EXIT_FAILURE;
2816 }
2817 
2821 int VideoDevice::initRead()
2822 {
2824 
2825  kDebug() << "called.";
2826  if(isOpen())
2827  {
2828  m_rawbuffers.resize(1);
2829  if (m_rawbuffers.size()==0)
2830  {
2831  fprintf (stderr, "Out of memory\n");
2832  return EXIT_FAILURE;
2833  }
2834  kDebug() << "m_buffer_size: " << m_buffer_size;
2835 
2836 // m_rawbuffers[0].pixelformat=m_pixelformat;
2837  m_rawbuffers[0].length = m_buffer_size;
2838  m_rawbuffers[0].start = (uchar *)malloc (m_buffer_size);
2839 
2840  if (!m_rawbuffers[0].start)
2841  {
2842  fprintf (stderr, "Out of memory\n");
2843  return EXIT_FAILURE;
2844  }
2845  kDebug() << "exited successfuly.";
2846  return EXIT_SUCCESS;
2847  }
2848  return EXIT_FAILURE;
2849 }
2850 
2851 
2855 int VideoDevice::initMmap()
2856 {
2858 #define BUFFERS 2
2859  if(isOpen())
2860  {
2861  kDebug() << full_filename << " Trying to MMAP";
2862 #ifdef V4L2_CAP_VIDEO_CAPTURE
2863  struct v4l2_requestbuffers req;
2864 
2865  CLEAR (req);
2866 
2867  req.count = BUFFERS;
2868  req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2869  req.memory = V4L2_MEMORY_MMAP;
2870 
2871  if (-1 == xioctl (VIDIOC_REQBUFS, &req))
2872  {
2873  if (EINVAL == errno)
2874  {
2875  kDebug() << full_filename << " does not support memory mapping";
2876  return EXIT_FAILURE;
2877  }
2878  else
2879  {
2880  return errnoReturn ("VIDIOC_REQBUFS");
2881  }
2882  }
2883 
2884  if (req.count < BUFFERS)
2885  {
2886  kDebug() << "Insufficient buffer memory on " << full_filename;
2887  return EXIT_FAILURE;
2888  }
2889 
2890  m_rawbuffers.resize(req.count);
2891 
2892  if (m_rawbuffers.size()==0)
2893  {
2894  kDebug() << "Out of memory";
2895  return EXIT_FAILURE;
2896  }
2897 
2898  for (m_streambuffers = 0; m_streambuffers < req.count; ++m_streambuffers)
2899  {
2900  struct v4l2_buffer v4l2buffer;
2901 
2902  CLEAR (v4l2buffer);
2903 
2904  v4l2buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2905  v4l2buffer.memory = V4L2_MEMORY_MMAP;
2906  v4l2buffer.index = m_streambuffers;
2907 
2908  if (-1 == xioctl (VIDIOC_QUERYBUF, &v4l2buffer))
2909  return errnoReturn ("VIDIOC_QUERYBUF");
2910 
2911  m_rawbuffers[m_streambuffers].length = v4l2buffer.length;
2912 #ifdef HAVE_LIBV4L2
2913  m_rawbuffers[m_streambuffers].start = (uchar *) v4l2_mmap (NULL /* start anywhere */, v4l2buffer.length, PROT_READ | PROT_WRITE /* required */, MAP_SHARED /* recommended */, descriptor, v4l2buffer.m.offset);
2914 #else
2915  m_rawbuffers[m_streambuffers].start = (uchar *) mmap (NULL /* start anywhere */, v4l2buffer.length, PROT_READ | PROT_WRITE /* required */, MAP_SHARED /* recommended */, descriptor, v4l2buffer.m.offset);
2916 #endif
2917 
2918  if (MAP_FAILED == m_rawbuffers[m_streambuffers].start)
2919  return errnoReturn ("mmap");
2920  }
2921 #endif
2922  m_currentbuffer.data.resize(m_rawbuffers[0].length); // Makes the imagesize.data buffer size equal to the rawbuffer size
2923  kDebug() << full_filename << " m_currentbuffer.data.size(): " << m_currentbuffer.data.size();
2924  return EXIT_SUCCESS;
2925  }
2926  return EXIT_FAILURE;
2927 }
2928 
2929 
2933 int VideoDevice::initUserptr()
2934 {
2936  if(isOpen())
2937  {
2938 #ifdef V4L2_CAP_VIDEO_CAPTURE
2939  struct v4l2_requestbuffers req;
2940 
2941  CLEAR (req);
2942 
2943  req.count = 2;
2944  req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2945  req.memory = V4L2_MEMORY_USERPTR;
2946 
2947  if (-1 == xioctl (VIDIOC_REQBUFS, &req))
2948  {
2949  if (EINVAL == errno)
2950  {
2951  kDebug() << full_filename << " does not support memory mapping";
2952  return EXIT_FAILURE;
2953  }
2954  else
2955  {
2956  return errnoReturn ("VIDIOC_REQBUFS");
2957  }
2958  }
2959 
2960  m_rawbuffers.resize(4);
2961 
2962  if (m_rawbuffers.size()==0)
2963  {
2964  fprintf (stderr, "Out of memory\n");
2965  return EXIT_FAILURE;
2966  }
2967 
2968  for (m_streambuffers = 0; m_streambuffers < 4; ++m_streambuffers)
2969  {
2970  m_rawbuffers[m_streambuffers].length = m_buffer_size;
2971  m_rawbuffers[m_streambuffers].start = (uchar *) malloc (m_buffer_size);
2972 
2973  if (!m_rawbuffers[m_streambuffers].start)
2974  {
2975  kDebug() << "Out of memory";
2976  return EXIT_FAILURE;
2977  }
2978  }
2979 #endif
2980  return EXIT_SUCCESS;
2981  }
2982  return EXIT_FAILURE;
2983 }
2984 
2985 bool VideoDevice::canCapture()
2986 {
2987  return m_videocapture;
2988 }
2989 
2990 bool VideoDevice::canChromakey()
2991 {
2992  return m_videochromakey;
2993 }
2994 
2995 bool VideoDevice::canScale()
2996 {
2997  return m_videoscale;
2998 }
2999 
3000 bool VideoDevice::canOverlay()
3001 {
3002  return m_videooverlay;
3003 }
3004 
3005 bool VideoDevice::canRead()
3006 {
3007  return m_videoread;
3008 }
3009 
3010 bool VideoDevice::canAsyncIO()
3011 {
3012  return m_videoasyncio;
3013 }
3014 
3015 bool VideoDevice::canStream()
3016 {
3017  return m_videostream;
3018 }
3019 
3020 void VideoDevice::setUdi( const QString & udi )
3021 {
3022  m_udi = udi;
3023 }
3024 
3025 QString VideoDevice::udi() const
3026 {
3027  return m_udi;
3028 }
3029 
3030 
3031 #if (defined(__linux__) || defined(__FreeBSD__)) && defined(ENABLE_AV) && defined(V4L2_CAP_VIDEO_CAPTURE)
3032 
3038 const char *VideoDevice::getUnifiedV4L2StdCtrlName(quint32 std_ctrl_id)
3039 {
3040  switch (std_ctrl_id)
3041  {
3042  /* USER controls */
3043  case V4L2_CID_BRIGHTNESS: return I18N_NOOP("Brightness");
3044  case V4L2_CID_CONTRAST: return I18N_NOOP("Contrast");
3045  case V4L2_CID_SATURATION: return I18N_NOOP("Saturation");
3046  case V4L2_CID_HUE: return I18N_NOOP("Hue");
3047  case V4L2_CID_AUDIO_VOLUME: return I18N_NOOP("Volume");
3048  case V4L2_CID_AUDIO_BALANCE: return I18N_NOOP("Balance");
3049  case V4L2_CID_AUDIO_BASS: return I18N_NOOP("Bass");
3050  case V4L2_CID_AUDIO_TREBLE: return I18N_NOOP("Treble");
3051  case V4L2_CID_AUDIO_MUTE: return I18N_NOOP("Mute");
3052  case V4L2_CID_AUDIO_LOUDNESS: return I18N_NOOP("Loudness");
3053 #ifdef V4L2_CID_BLACK_LEVEL // deprecated, likely to be removed soon
3054  case V4L2_CID_BLACK_LEVEL: return I18N_NOOP("Black Level");
3055 #endif
3056  case V4L2_CID_AUTO_WHITE_BALANCE: return I18N_NOOP("Automatic White Balance");
3057  case V4L2_CID_DO_WHITE_BALANCE: return I18N_NOOP("Do White Balance");
3058  case V4L2_CID_RED_BALANCE: return I18N_NOOP("Red Balance");
3059  case V4L2_CID_BLUE_BALANCE: return I18N_NOOP("Blue Balance");
3060  case V4L2_CID_GAMMA: return I18N_NOOP("Gamma");
3061  case V4L2_CID_EXPOSURE: return I18N_NOOP("Exposure");
3062  case V4L2_CID_AUTOGAIN: return I18N_NOOP("Automatic Gain");
3063  case V4L2_CID_GAIN: return I18N_NOOP("Gain");
3064  case V4L2_CID_HFLIP: return I18N_NOOP("Horizontal Flip");
3065  case V4L2_CID_VFLIP: return I18N_NOOP("Vertical Flip");
3066 #ifdef V4L2_CID_HCENTER // removed in kernel 3.9
3067  case V4L2_CID_HCENTER: return I18N_NOOP("Horizontal Center");
3068  case V4L2_CID_VCENTER: return I18N_NOOP("Vertical Center");
3069 #endif
3070 #ifdef V4L2_CID_POWER_LINE_FREQUENCY // since kernel 2.6.25
3071  case V4L2_CID_POWER_LINE_FREQUENCY: return I18N_NOOP("Power Line Frequency");
3072  case V4L2_CID_HUE_AUTO: return I18N_NOOP("Automatic Hue");
3073  case V4L2_CID_WHITE_BALANCE_TEMPERATURE: return I18N_NOOP("White Balance Temperature");
3074  case V4L2_CID_SHARPNESS: return I18N_NOOP("Sharpness");
3075  case V4L2_CID_BACKLIGHT_COMPENSATION: return I18N_NOOP("Backlight Compensation");
3076 #endif
3077 #ifdef V4L2_CID_CHROMA_AGC // since kernel 2.6.26
3078  case V4L2_CID_CHROMA_AGC: return I18N_NOOP("Chroma AGC");
3079  case V4L2_CID_COLOR_KILLER: return I18N_NOOP("Color Killer");
3080 #endif
3081 #ifdef V4L2_CID_COLORFX // since kernel 2.6.30
3082  case V4L2_CID_COLORFX: return I18N_NOOP("Color Effects");
3083 #endif
3084 #ifdef V4L2_CID_ROTATE // since kernel 2.6.33
3085  case V4L2_CID_ROTATE: return I18N_NOOP("Rotate");
3086  case V4L2_CID_BG_COLOR: return I18N_NOOP("Background color");
3087 #endif
3088 #ifdef V4L2_CID_CHROMA_GAIN // since kernel 2.6.35
3089  case V4L2_CID_CHROMA_GAIN: return I18N_NOOP("Chroma Gain");
3090 #endif
3091 #ifdef V4L2_CID_ILLUMINATORS_1 // since kernel 2.6.37
3092  case V4L2_CID_ILLUMINATORS_1: return I18N_NOOP("Illuminator 1");
3093  case V4L2_CID_ILLUMINATORS_2: return I18N_NOOP("Illuminator 2");
3094 #endif
3095  default:
3096  return NULL;
3097  }
3098  /* NOTE: Unification is necessary for translation, because drivers use individual descriptions
3099  (different uppercase/lowercase combinations but also some strange interpretations).
3100  Otherwise we would end up with too many different (or even untranslated !)strings.
3101  */
3102  /* NOTE: We only mark the strings for translation, the translation is done for ALL controls
3103  (including custom controls) at a common place
3104  */
3105  /* NOTE: see kernel header file include/linux/videodev2.h */
3106 }
3107 #endif
3108 
3109 }
3110 
3111 }
Kopete::AV::VideoDevice::m_input
QVector< Kopete::AV::VideoInput > m_input
Definition: videodevice.h:338
Kopete::AV::imagebuffer
Definition: videodevice.h:215
Kopete::AV::STANDARD_SECAM_H
Definition: videodevice.h:175
Kopete::AV::VideoDevice::canOverlay
bool canOverlay()
Definition: videodevice.cpp:3000
Kopete::AV::NumericVideoControl::value_max
qint32 value_max
Definition: videodevice.h:259
Kopete::AV::PIXELFORMAT_BGR32
Definition: videodevice.h:117
Kopete::AV::VideoDevice::m_videooverlay
bool m_videooverlay
Definition: videodevice.h:395
Kopete::AV::VideoDevice::m_io_method
io_method m_io_method
Definition: videodevice.h:391
Kopete::AV::STANDARD_PAL_B1
Definition: videodevice.h:152
Kopete::AV::VideoDevice::setPixelFormat
virtual pixel_format setPixelFormat(pixel_format newformat)
Definition: videodevice.cpp:940
Kopete::AV::VideoDevice::getSupportedActionControls
QList< ActionVideoControl > getSupportedActionControls()
Returns the supported action-controls for the current input.
Definition: videodevice.cpp:1722
Kopete::AV::VideoDevice::m_pixelformat
pixel_format m_pixelformat
Definition: videodevice.h:389
Kopete::AV::VideoDevice::m_driver
videodev_driver m_driver
Definition: videodevice.h:368
Kopete::AV::STANDARD_PAL_B
Definition: videodevice.h:151
BUFFERS
#define BUFFERS
Kopete::AV::VideoDevice::canChromakey
bool canChromakey()
Definition: videodevice.cpp:2990
Kopete::AV::VideoDevice::maxHeight
int maxHeight()
Definition: videodevice.cpp:762
Kopete::AV::PIXELFORMAT_YUV420P
Definition: videodevice.h:126
Kopete::AV::VideoDevice::m_videostream
bool m_videostream
Definition: videodevice.h:398
Kopete::AV::VideoInput::m_standards
__u64 m_standards
Definition: videoinput.h:48
Kopete::AV::PIXELFORMAT_RGB555X
Definition: videodevice.h:113
Kopete::AV::PIXELFORMAT_MJPEG
Definition: videodevice.h:138
Kopete::AV::STANDARD_625_50
Definition: videodevice.h:200
Kopete::AV::STANDARD_PAL_G
Definition: videodevice.h:153
Kopete::AV::IO_METHOD_MMAP
Definition: videodevice.h:211
sonix_decompress_init
void sonix_decompress_init(void)
Definition: sonix_compress.cpp:29
Kopete::AV::NumericVideoControl
Definition: videodevice.h:255
Kopete::AV::PIXELFORMAT_RGB444
Definition: videodevice.h:110
Kopete::AV::STANDARD_PAL
Definition: videodevice.h:188
Kopete::AV::PIXELFORMAT_NONE
Definition: videodevice.h:107
Kopete::AV::VideoDevice::setupControls
void setupControls()
Sets up the supported video-controls for the current input.
Definition: videodevice.cpp:59
Kopete::AV::VideoDevice::setFileName
int setFileName(QString filename)
Definition: videodevice.cpp:303
Kopete::AV::VideoDevice::m_numericCtrls
QList< NumericVideoControl > m_numericCtrls
Definition: videodevice.h:360
Kopete::AV::VideoDevice::maxheight
int maxheight
Definition: videodevice.h:381
CLEAR
#define CLEAR(x)
Definition: videodevice.cpp:33
Kopete::AV::VideoDevice::getControlValue
int getControlValue(quint32 ctrl_id, qint32 *value)
Reads the value of a video-control.
Definition: videodevice.cpp:1736
Kopete::AV::VideoDevice::minheight
int minheight
Definition: videodevice.h:381
Kopete::AV::STANDARD_GH
Definition: videodevice.h:196
Kopete::AV::VideoDevice::xioctl
int xioctl(int request, void *arg)
Definition: videodevice.cpp:277
Kopete::AV::STANDARD_PAL_BG
Definition: videodevice.h:186
Kopete::AV::STANDARD_PAL_Nc
Definition: videodevice.h:162
Kopete::AV::VideoDevice::currentInput
int currentInput()
Definition: videodevice.cpp:1019
Kopete::AV::VideoDevice::pixelFormatName
QString pixelFormatName(pixel_format pixelformat)
Definition: videodevice.cpp:2269
Kopete::AV::STANDARD_ATSC
Definition: videodevice.h:201
Kopete::AV::VideoDevice::m_actionCtrls
QList< ActionVideoControl > m_actionCtrls
Definition: videodevice.h:363
Kopete::AV::VideoDevice::width
int width()
Definition: videodevice.cpp:737
Kopete::AV::STANDARD_MN
Definition: videodevice.h:194
Kopete::AV::VideoDevice::height
int height()
Definition: videodevice.cpp:752
Kopete::AV::PIXELFORMAT_SN9C10X
Definition: videodevice.h:141
Kopete::AV::VideoDevice::setUdi
void setUdi(const QString &)
Definition: videodevice.cpp:3020
Kopete::AV::VideoDevice::m_udi
QString m_udi
Definition: videodevice.h:366
Kopete::AV::STANDARD_SECAM_K
Definition: videodevice.h:176
Kopete::AV::VideoDevice::minWidth
int minWidth()
Definition: videodevice.cpp:742
Kopete::AV::VideoDevice::setControlValue
int setControlValue(quint32 ctrl_id, qint32 value)
Sets the value of a video-control.
Definition: videodevice.cpp:1878
Kopete::AV::VideoDevice::initMmap
int initMmap()
Definition: videodevice.cpp:2855
Kopete::AV::STANDARD_PAL_D
Definition: videodevice.h:156
Kopete::AV::VideoDevice::getImage
virtual int getImage(QImage *qimage)
Definition: videodevice.cpp:1288
Kopete::AV::VideoDevice::canScale
bool canScale()
Definition: videodevice.cpp:2995
Kopete::AV::VideoDevice::VideoDevice
VideoDevice()
Definition: videodevice.cpp:39
Kopete::AV::VideoDevice::showDeviceCapabilities
int showDeviceCapabilities()
Definition: videodevice.cpp:568
Kopete::AV::VideoDevice::getSupportedMenuControls
QList< MenuVideoControl > getSupportedMenuControls()
Returns the supported menu-controls for the current input.
Definition: videodevice.cpp:1712
Kopete::AV::imagebuffer::data
QVector< uchar > data
Definition: videodevice.h:220
Kopete::AV::PIXELFORMAT_RGB332
Definition: videodevice.h:109
videodevice.h
Kopete::AV::VideoDevice::setSize
virtual int setSize(int newwidth, int newheight)
Definition: videodevice.cpp:767
Kopete::AV::VideoDevice::maxwidth
int maxwidth
Definition: videodevice.h:381
Kopete::AV::STANDARD_525_60
Definition: videodevice.h:199
Kopete::AV::PIXELFORMAT_DV
Definition: videodevice.h:134
Kopete::AV::PIXELFORMAT_BGR24
Definition: videodevice.h:115
Kopete::AV::VideoDevice::detectPixelFormats
int detectPixelFormats()
Definition: videodevice.cpp:2402
I18N_NOOP
I18N_NOOP("Target KB")
Kopete::AV::STANDARD_SECAM
Definition: videodevice.h:191
sonix_decompress
int sonix_decompress(int width, int height, unsigned char *inp, unsigned char *outp)
Definition: sonix_compress.cpp:111
Kopete::AV::VideoDevice::m_model
QString m_model
Definition: videodevice.h:369
Kopete::AV::STANDARD_PAL_M
Definition: videodevice.h:160
Kopete::AV::PIXELFORMAT_RGB565
Definition: videodevice.h:112
Kopete::AV::VideoDevice::canCapture
bool canCapture()
Definition: videodevice.cpp:2985
Kopete::AV::IO_METHOD_NONE
Definition: videodevice.h:209
Kopete::AV::STANDARD_NTSC_M_KR
Definition: videodevice.h:170
Kopete::AV::VideoDevice::signalStandardCode
__u64 signalStandardCode(signal_standard standard)
Definition: videodevice.cpp:2481
Kopete::AV::VideoDevice::m_streambuffers
unsigned int m_streambuffers
Definition: videodevice.h:384
Kopete::AV::VideoDevice::m_buffer_size
int m_buffer_size
Definition: videodevice.h:386
Kopete::AV::VideoDevice::getSupportedBooleanControls
QList< BooleanVideoControl > getSupportedBooleanControls()
Returns the supported boolean controls for the current input.
Definition: videodevice.cpp:1702
Kopete::AV::STANDARD_PAL_H
Definition: videodevice.h:154
Kopete::AV::STANDARD_PAL_N
Definition: videodevice.h:161
Kopete::AV::VideoDevice::stopCapturing
virtual int stopCapturing()
Definition: videodevice.cpp:1603
Kopete::AV::STANDARD_ATSC_16_VSB
Definition: videodevice.h:183
Kopete::AV::PIXELFORMAT_RGB565X
Definition: videodevice.h:114
Kopete::AV::VIDEODEV_DRIVER_NONE
Definition: videodevice.h:93
Kopete::AV::VideoDevice::m_name
QString m_name
Definition: videodevice.h:337
Kopete::AV::imagebuffer::pixelformat
pixel_format pixelformat
Definition: videodevice.h:219
Kopete::AV::PIXELFORMAT_YYUV
Definition: videodevice.h:143
Kopete::AV::PIXELFORMAT_JPEG
Definition: videodevice.h:130
Kopete::AV::VideoDevice::checkDevice
virtual int checkDevice()
Definition: videodevice.cpp:369
Kopete::AV::PIXELFORMAT_HI240
Definition: videodevice.h:136
Kopete::AV::VideoInput::hastuner
int hastuner
Definition: videoinput.h:47
Kopete::AV::VideoDevice::inputs
int inputs()
Definition: videodevice.cpp:731
Kopete::AV::VideoDevice::fileName
QString fileName()
Definition: videodevice.cpp:313
Kopete::AV::VideoDevice::canStream
bool canStream()
Definition: videodevice.cpp:3015
Kopete::AV::VideoDevice::initDevice
virtual int initDevice()
Definition: videodevice.cpp:642
Kopete::AV::PIXELFORMAT_YUYV
Definition: videodevice.h:124
Kopete::AV::STANDARD_PAL_I
Definition: videodevice.h:155
Kopete::AV::STANDARD_B
Definition: videodevice.h:195
sonix_compress.h
Kopete::AV::STANDARD_SECAM_K1
Definition: videodevice.h:177
Kopete::AV::BooleanVideoControl
Definition: videodevice.h:245
Kopete::AV::VideoDevice::m_menuCtrls
QList< MenuVideoControl > m_menuCtrls
Definition: videodevice.h:362
Kopete::AV::VideoDevice::detectSignalStandards
int detectSignalStandards()
Definition: videodevice.cpp:2752
Kopete::AV::VideoDevice::startCapturing
virtual int startCapturing()
Definition: videodevice.cpp:1081
Kopete::AV::PIXELFORMAT_YUV422P
Definition: videodevice.h:127
Kopete::AV::STANDARD_SECAM_LC
Definition: videodevice.h:179
Kopete::AV::imagebuffer::width
int width
Definition: videodevice.h:218
Kopete::AV::PIXELFORMAT_PWC2
Definition: videodevice.h:140
Kopete::AV::PIXELFORMAT_WNVA
Definition: videodevice.h:142
Kopete::AV::STANDARD_ALL
Definition: videodevice.h:204
Kopete::AV::VideoDevice::selectInput
int selectInput(int input)
Definition: videodevice.cpp:1032
Kopete::AV::PIXELFORMAT_RGB32
Definition: videodevice.h:118
Kopete::AV::PIXELFORMAT_ET61X251
Definition: videodevice.h:135
Kopete::AV::VideoDevice::m_videoasyncio
bool m_videoasyncio
Definition: videodevice.h:397
Kopete::AV::VideoDevice::m_videoscale
bool m_videoscale
Definition: videodevice.h:394
Kopete::AV::VideoDevice::pixelFormatForPalette
pixel_format pixelFormatForPalette(int palette)
Definition: videodevice.cpp:2031
Kopete::AV::NumericVideoControl::value_step
qint32 value_step
Definition: videodevice.h:260
Kopete::AV::VideoInput::name
QString name
Definition: videoinput.h:46
Kopete::AV::imagebuffer::height
int height
Definition: videodevice.h:217
Kopete::AV::STANDARD_PAL_K
Definition: videodevice.h:158
Kopete::AV::PIXELFORMAT_PWC1
Definition: videodevice.h:139
Kopete::AV::VideoDevice::pixelFormatDepth
int pixelFormatDepth(pixel_format pixelformat)
Definition: videodevice.cpp:2222
Kopete::AV::VideoDevice::minHeight
int minHeight()
Definition: videodevice.cpp:757
Kopete::AV::PIXELFORMAT_GREY
Definition: videodevice.h:108
Kopete::AV::VideoDevice::pixelFormatCode
int pixelFormatCode(pixel_format pixelformat)
Definition: videodevice.cpp:2113
Kopete::AV::STANDARD_NTSC_443
Definition: videodevice.h:168
Kopete::AV::VideoDevice::~VideoDevice
virtual ~VideoDevice()
Definition: videodevice.cpp:47
Kopete::AV::VideoDevice::m_current_input
int m_current_input
Definition: videodevice.h:388
Kopete::AV::PIXELFORMAT_HM12
Definition: videodevice.h:137
__u64
#define __u64
Definition: videoinput.h:28
Kopete::AV::VideoDevice::currentwidth
int currentwidth
Definition: videodevice.h:381
Kopete::AV::IO_METHOD_READ
Definition: videodevice.h:210
Kopete::AV::VideoDevice::initUserptr
int initUserptr()
Definition: videodevice.cpp:2933
Kopete::AV::VideoDevice::initRead
int initRead()
Definition: videodevice.cpp:2821
Kopete::AV::VideoDevice::m_videochromakey
bool m_videochromakey
Definition: videodevice.h:393
bayer.h
Kopete::AV::STANDARD_UNKNOWN
Definition: videodevice.h:203
Kopete::AV::VideoDevice::m_currentbuffer
imagebuffer m_currentbuffer
Definition: videodevice.h:385
Kopete::AV::PIXELFORMAT_SBGGR8
Definition: videodevice.h:121
bayer2rgb24
void bayer2rgb24(unsigned char *dst, unsigned char *src, long int WIDTH, long int HEIGHT)
Definition: bayer.cpp:29
Kopete::AV::pixel_format
pixel_format
Definition: videodevice.h:104
Kopete::AV::STANDARD_SECAM_L
Definition: videodevice.h:178
Kopete::AV::STANDARD_ATSC_8_VSB
Definition: videodevice.h:182
Kopete::AV::VideoDevice::minwidth
int minwidth
Definition: videodevice.h:381
Kopete::AV::VideoDevice::open
virtual int open()
Definition: videodevice.cpp:321
Kopete::AV::VideoDevice::canRead
bool canRead()
Definition: videodevice.cpp:3005
Kopete::AV::VideoDevice::descriptor
int descriptor
Definition: videodevice.h:367
Kopete::AV::VideoDevice::m_rawbuffers
QVector< rawbuffer > m_rawbuffers
Definition: videodevice.h:383
Kopete::AV::STANDARD_PAL_DK
Definition: videodevice.h:187
Kopete::AV::STANDARD_PAL_60
Definition: videodevice.h:163
Kopete::AV::signal_standard
signal_standard
Definition: videodevice.h:148
Kopete::AV::VideoDevice::signalStandardName
QString signalStandardName(signal_standard standard)
Definition: videodevice.cpp:2606
Kopete::AV::PIXELFORMAT_RGB555
Definition: videodevice.h:111
Kopete::AV::VideoDevice::canAsyncIO
bool canAsyncIO()
Definition: videodevice.cpp:3010
Kopete::AV::VideoDevice::errnoReturn
int errnoReturn(const char *s)
Definition: videodevice.cpp:293
Kopete::AV::VideoDevice::maxWidth
int maxWidth()
Definition: videodevice.cpp:747
Kopete::AV::BooleanVideoControl::value_default
qint32 value_default
Definition: videodevice.h:248
Kopete::AV::ActionVideoControl::id
quint32 id
Definition: videodevice.h:237
Kopete::AV::VideoDevice::currentheight
int currentheight
Definition: videodevice.h:381
Kopete::AV::STANDARD_SECAM_B
Definition: videodevice.h:172
Kopete::AV::STANDARD_NTSC
Definition: videodevice.h:189
Kopete::AV::VideoDevice::close
virtual int close()
Closes the device.
Definition: videodevice.cpp:1657
Kopete::AV::STANDARD_NTSC_M
Definition: videodevice.h:166
Kopete::AV::STANDARD_SECAM_DK
Definition: videodevice.h:190
videoinput.h
Kopete::AV::PIXELFORMAT_MPEG
Definition: videodevice.h:131
Kopete::AV::PIXELFORMAT_RGB24
Definition: videodevice.h:116
Kopete::AV::VideoDevice::m_videocapture
bool m_videocapture
Definition: videodevice.h:392
Kopete::AV::STANDARD_NTSC_M_JP
Definition: videodevice.h:167
Kopete::AV::VideoInput
Definition: videoinput.h:42
Kopete::AV::IO_METHOD_USERPTR
Definition: videodevice.h:212
Kopete::AV::PIXELFORMAT_UYVY
Definition: videodevice.h:125
Kopete::AV::NumericVideoControl::value_min
qint32 value_min
Definition: videodevice.h:258
Kopete::AV::STANDARD_PAL_D1
Definition: videodevice.h:157
Kopete::AV::STANDARD_SECAM_G
Definition: videodevice.h:174
Kopete::AV::VideoDevice::m_videoread
bool m_videoread
Definition: videodevice.h:396
Kopete::AV::VideoDevice::full_filename
QString full_filename
Definition: videodevice.h:365
Kopete::AV::STANDARD_DK
Definition: videodevice.h:197
Kopete::AV::VideoDevice::isOpen
virtual bool isOpen()
Definition: videodevice.cpp:358
Kopete::AV::VideoDevice::m_booleanCtrls
QList< BooleanVideoControl > m_booleanCtrls
Definition: videodevice.h:361
Kopete::AV::STANDARD_SECAM_D
Definition: videodevice.h:173
Kopete::AV::VideoDevice::getSupportedNumericControls
QList< NumericVideoControl > getSupportedNumericControls()
Returns the supported numeric controls for the current input.
Definition: videodevice.cpp:1692
Kopete::AV::VideoDevice::getFrame
virtual int getFrame()
Definition: videodevice.cpp:1150
Kopete::AV::VideoDevice::udi
QString udi() const
Definition: videodevice.cpp:3025
Kopete::AV::ActionVideoControl::name
QString name
Definition: videodevice.h:238
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:51 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kopete/libkopete

Skip menu "kopete/libkopete"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal