00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef WEBCAM_H_
00010 #define WEBCAM_H_
00011
00012 #include <qsqldatabase.h>
00013 #include <qregexp.h>
00014 #include <qtimer.h>
00015 #include <qptrlist.h>
00016 #include <qthread.h>
00017 #include <qdatetime.h>
00018
00019 #include <sys/types.h>
00020 #include <sys/stat.h>
00021 #include <fcntl.h>
00022
00023 #ifndef WIN32
00024 #include <sys/ioctl.h>
00025 #include <linux/videodev.h>
00026 #include <mythtv/mythwidgets.h>
00027 #include <mythtv/dialogbox.h>
00028 #else
00029 #include <windows.h>
00030 #include <vfw.h>
00031 #endif
00032
00033
00034 #define RGB24_LEN(w,h) ((w) * (h) * 3)
00035 #define RGB32_LEN(w,h) ((w) * (h) * 4)
00036 #define YUV420P_LEN(w,h) (((w) * (h) * 3) / 2)
00037 #define YUV422P_LEN(w,h) ((w) * (h) * 2)
00038
00039
00040 #define _S(a) (a)>255 ? 255 : (a)<0 ? 0 : (a)
00041 #define _R(y,u,v) (0x2568*(y) + 0x3343*(u)) /0x2000
00042 #define _G(y,u,v) (0x2568*(y) - 0x0c92*(v) - 0x1a1e*(u)) /0x2000
00043 #define _B(y,u,v) (0x2568*(y) + 0x40cf*(v)) /0x2000
00044
00045 #ifdef WIN32
00046 #define VIDEO_PALETTE_YUV420P 0
00047 #define VIDEO_PALETTE_YUV422 1
00048 #define VIDEO_PALETTE_YUV422P 2
00049 #define VIDEO_PALETTE_RGB32 3
00050 #define VIDEO_PALETTE_RGB24 4
00051 #define VIDEO_PALETTE_GREY 5
00052 #endif
00053
00054
00055 #ifdef WIN32
00056 #define WCHEIGHT bitmapInfo.bmiHeader.biHeight
00057 #define WCWIDTH bitmapInfo.bmiHeader.biWidth
00058 #else
00059 #define WCWIDTH vWin.width
00060 #define WCHEIGHT vWin.height
00061 #endif
00062
00063
00064 #define WC_CLIENT_BUFFERS 2
00065
00066 struct wcClient
00067 {
00068 QObject *eventWindow;
00069 int format;
00070 int frameSize;
00071 int fps;
00072 int actualFps;
00073 int interframeTime;
00074 int framesDelivered;
00075 QPtrList<unsigned char> BufferList;
00076 QPtrList<unsigned char> FullBufferList;
00077 QTime timeLastCapture;
00078
00079 };
00080
00081
00082 class WebcamEvent : public QCustomEvent
00083 {
00084 public:
00085 enum Type { FrameReady = (QEvent::User + 200), WebcamErrorEv, WebcamDebugEv };
00086
00087 WebcamEvent(Type t, wcClient *c) : QCustomEvent(t) { client=c; }
00088 WebcamEvent(Type t, QString s) : QCustomEvent(t) { text=s; }
00089 ~WebcamEvent() {}
00090
00091 wcClient *getClient() { return client; }
00092 QString msg() { return text;}
00093
00094 private:
00095 wcClient *client;
00096 QString text;
00097 };
00098
00099
00100
00101 class Webcam : public QThread
00102 {
00103
00104 public:
00105
00106 Webcam(QWidget *parent=0, QWidget *localVideoWidget=0);
00107 virtual ~Webcam(void);
00108 virtual void run();
00109
00110 static QString devName(QString WebcamName);
00111 bool camOpen(QString WebcamName, int width, int height);
00112 void camClose(void);
00113 bool SetPalette(unsigned int palette);
00114 unsigned int GetPalette(void);
00115 #ifndef WIN32
00116 int SetBrightness(int v);
00117 int SetContrast(int v);
00118 int SetColour(int v);
00119 int SetHue(int v);
00120 int GetBrightness(void) { return (vPic.brightness);};
00121 int GetColour(void) { return (vPic.colour);};
00122 int GetContrast(void) { return (vPic.contrast);};
00123 int GetHue(void) { return (vPic.hue);};
00124 QString GetName(void) { return vCaps.name; };
00125 #else
00126 HWND GetHwnd() { return hwndCap; };
00127 #endif
00128 void SetFlip(bool b) { wcFlip=b; }
00129
00130
00131 int SetTargetFps(wcClient *client, int fps);
00132 int GetActualFps();
00133 void GetMaxSize(int *x, int *y);
00134 void GetMinSize(int *x, int *y);
00135 void GetCurSize(int *x, int *y);
00136 int isGreyscale(void);
00137
00138 wcClient *RegisterClient(int format, int fps, QObject *eventWin);
00139 void UnregisterClient(wcClient *client);
00140 void ChangeClientFps(wcClient *client, int fps);
00141 unsigned char *GetVideoFrame(wcClient *client);
00142 void FreeVideoBuffer(wcClient *client, unsigned char *buffer);
00143 void ProcessFrame(unsigned char *frame, int fSize);
00144
00145
00146 private:
00147 void StartThread();
00148 void KillThread();
00149 void WebcamThreadWorker();
00150
00151 #ifdef WIN32
00152 HWND hwndCap;
00153 HWND hwndWebcam;
00154 static LRESULT CALLBACK frameReadyCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr);
00155 static LRESULT CALLBACK ErrorCallbackProc(HWND hWnd, int nErrID, LPSTR lpErrorText);
00156 static LRESULT CALLBACK StatusCallbackProc(HWND hWnd, int nID, LPSTR lpStatusText);
00157 #endif
00158
00159 QPtrList<wcClient> wcClientList;
00160 QMutex WebcamLock;
00161
00162 void SetSize(int width, int height);
00163
00164 void readCaps(void);
00165
00166 int hDev;
00167 QString DevName;
00168 unsigned char *picbuff1;
00169 int imageLen;
00170 int frameSize;
00171 int fps;
00172 int actualFps;
00173 bool killWebcamThread;
00174 int wcFormat;
00175 bool wcFlip;
00176
00177 QTime cameraTime;
00178 int frameCount;
00179 int totalCaptureMs;
00180
00181
00182 #ifdef WIN32
00183 CAPTUREPARMS capParams;
00184 BITMAPINFO bitmapInfo;
00185 #else
00186 struct video_capability vCaps;
00187 struct video_window vWin;
00188 struct video_picture vPic;
00189 struct video_clip vClips;
00190 #endif
00191
00192 };
00193
00194 #endif