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