00001 #ifndef VIDEO_DEVICE_HPP
00002 #define VIDEO_DEVICE_HPP
00003
00004 #ifdef HAVE_CONFIG_H
00005 #include <config.h>
00006 #endif
00007
00008 #include <sys/types.h>
00009 #include <linux/videodev.h>
00010
00011 #include <qarray.h>
00012 #include <qcolor.h>
00013 #include <qimage.h>
00014 #include <qobject.h>
00015 #include <qsocketnotifier.h>
00016 #include <qtimer.h>
00017 #include <qvector.h>
00018
00019 #include "VideoDeviceInput.h"
00020 #include "VideoAudioInput.h"
00021
00022 class CVideoDevice: public QObject
00023 {
00024 friend class CVideoDeviceInput;
00025 friend class CVideoDeviceTuner;
00026 friend class CVideoAudioInput;
00027 Q_OBJECT
00028 private:
00029 bool validated;
00030 QString NodeName, IntfName;
00031 int CamFD, Opened;
00032 bool UseSelect, HasFramerate;
00033 int Capturing;
00034 int Palette, FrameRate;
00035 int PalRGB, PalYUV;
00036 struct video_picture VPic;
00037 struct video_mbuf VMBuf;
00038 int Buffers, CurBuffer;
00039
00040 QVector <CVideoDeviceInput>VideoInputs;
00041 int CurrentVideoInput;
00042 QVector <CVideoAudioInput>AudioInputs;
00043 int CurrentAudioInput;
00044
00045 QVector<QImage> RGB;
00046 QVector<QImage> Y, U, V;
00047 QImage *pNullImage;
00048 QRgb GrayScale[256];
00049
00050 int image_w, image_h;
00051 int max_w, max_h;
00052 int min_w, min_h;
00053 uchar *vid_io_buffer;
00054 uchar *rgb_vid_buffer;
00055 uchar *yuv_vid_buffer;
00056 QArray<int> vid_io_offsets, rgb_vid_offsets, yuv_vid_offsets;
00057 int vid_io_buffer_size, vid_io_image_size;
00058
00059 QSocketNotifier *pImageSocket;
00060 QTimer *pImageTimer;
00061
00062 void Init();
00063 void CleanUp();
00064
00065 bool TryPalette(int pal, int depth);
00066 void SetPalette();
00067 void CalcVidIoSize();
00068
00069 int MCapture(int buf);
00070 int MSync();
00071
00072 void CreateImagesRGB();
00073 void ResetImagesRGB();
00074 void CreateImagesYUV();
00075 void ResetImagesYUV();
00076
00077 void StartCapture();
00078 void StopCapture();
00079
00080 private slots:
00081 void LoadImage();
00082
00083 public:
00084 CVideoDevice(const QString &node_name);
00085 ~CVideoDevice();
00086
00087 bool IsValid();
00088
00089 int Open(int buffers = 1);
00090 void Close();
00091 int GetDescriptor() const;
00092
00093 void EnableRGB(bool isOn);
00094 void EnableYUV(bool isOn);
00095
00096 QString GetNodeName() const;
00097 QString GetIntfName() const;
00098
00099 QSize GetMinSize() const;
00100 QSize GetSize();
00101 QSize GetMaxSize() const;
00102 bool SetSize(int width, int height);
00103 bool SetSize(const QSize &new_size);
00104 int GetFramerate() const;
00105 bool SetFramerate(int fps);
00106 int GetMBuffers() const;
00107 int GetBuffers() const;
00108
00109 int GetVideoInputs() const;
00110 int GetCurrentVideoInput() const;
00111 CVideoDeviceInput *GetVideoInput(int number = -1) const;
00112 bool SelectVideoInput(int number);
00113
00114 int GetAudioInputs() const;
00115 CVideoAudioInput *GetAudioInput(int number = -1) const;
00116 bool SelectAudioInput(int number);
00117
00118 int GetBrightness() const;
00119 bool SetBrightness(int val);
00120 int GetContrast() const;
00121 bool SetContrast(int val);
00122 int GetHue() const;
00123 bool SetHue(int val);
00124 int GetColour() const;
00125 bool SetColour(int val);
00126 int GetWhiteness() const;
00127 bool SetWhiteness(int val);
00128
00129 int ReadImage();
00130
00131 QImage *GetRGB(int offset = 0) const;
00132 QImage *GetY(int offset = 0) const;
00133 QImage *GetU(int offset = 0) const;
00134 QImage *GetV(int offset = 0) const;
00135
00136 signals:
00138 void Notify();
00140 void Closed();
00142 void Resized(const QSize &new_size);
00144 void FramerateChanged(int);
00146 void ChangedVideoInput(int input);
00148 void ChangedTunerNorm(int tuner, int norm);
00150 void Error(int err_num);
00151 };
00152
00153 #endif