#ifndef _VIDCAP_VIDCAP_HPP_ #define _VIDCAP_VIDCAP_HPP_ #ifndef _COMMON_AVICAP_HPP_ #include #endif #ifndef _COMMON_INSTANCEDATA_HPP_ #include #endif #ifndef _COMMON_GLOBALDATA_HPP_ #include #endif #ifndef _COMMON_BITMAPINFO_HPP_ #include #endif #ifndef _VIDCAP_DRVINFO_HPP_ #include #endif #ifndef _VIDCAP_CAPTUREPARAMS_HPP_ #include #endif #ifndef _VIDCAP_CAPSTATUS_HPP_ #include #endif #ifndef _VIDCAP_DRVCAPS_HPP_ #include #endif class VidCap { public: VidCap(); virtual ~VidCap(); bool create(HWND hParentWnd,DWORD width=DefaultWidth,DWORD height=DefaultHeight); bool connect(const String &driverName); bool connect(WORD driverIndex); bool connect(void); bool sequenceNoFile(void); bool sequence(void); bool capStop(void)const; bool capAbort(void)const; bool grabFrame(void)const; bool grabFrameNoStop(void)const; bool getDriverCaps(DriverCaps &someDriverCaps); bool getCaptureParams(CaptureParams &someCaptureParams); bool setCaptureParams(CaptureParams &someCaptureParams); bool getCaptureStatus(CaptureStatus &someCaptureStatus); bool getVideoFormat(BitmapInfo &bitmapInfo); bool setVideoFormat(BitmapInfo &someBitmapInfo); bool setMCIDeviceName(const String &mciDeviceName); bool getMCIDeviceName(String &mciDeviceName); bool setPreviewRate(DWORD milliseconds); bool dialogVideoSource(void); bool dialogVideoFormat(void); bool dialogVideoDisplay(void); bool preview(bool preview); bool isConnected(void)const; bool isOkay(void)const; void disconnect(void); static void getDrivers(Block &capDrivers); protected: virtual void errorHandler(int errorID,const String &errorString); virtual void statusHandler(int nID,const String &statusString); virtual void videoHandler(VIDEOHDR &videoHeader); virtual void frameHandler(VIDEOHDR &videoHeader); private: enum{ControlID=101,DefaultWidth=160,DefaultHeight=120}; void isConnected(bool isConnected); void installHandlers(void); void removeHandlers(void); void destroy(void); static void WINAPI errorCallback(HWND hWnd,int nErrorID,LPSTR lpszErrorText); static void WINAPI statusCallback(HWND hWnd,int nID,LPSTR lpszStatusText); static void WINAPI videoCallback(HWND hWnd,LPVIDEOHDR lpVideoHeader); static void WINAPI frameCallback(HWND hWnd,LPVIDEOHDR lpVideoHeader); HWND mhCaptureWnd; HWND mhParentWnd; bool mIsConnected; InstanceData mInstanceData; CaptureParams mCaptureParams; CaptureStatus mCaptureStatus; }; inline bool VidCap::isConnected(void)const { return mIsConnected; } inline void VidCap::isConnected(bool isConnected) { mIsConnected=isConnected; } inline bool VidCap::isOkay(void)const { return (mhCaptureWnd?TRUE:FALSE); } inline bool VidCap::capStop(void)const { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_STOP,(WPARAM)0,(LPARAM)0); } inline bool VidCap::capAbort(void)const { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_ABORT,(WPARAM)0,(LPARAM)0); } inline bool VidCap::grabFrame(void)const { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_GRAB_FRAME,(WPARAM)0,(LPARAM)0); } inline bool VidCap::grabFrameNoStop(void)const { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_GRAB_FRAME_NOSTOP,(WPARAM)0,(LPARAM)0); } inline bool VidCap::sequenceNoFile(void) { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_SEQUENCE_NOFILE,0,0L); } inline bool VidCap::sequence(void) { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_SEQUENCE,0,0L); } inline bool VidCap::setPreviewRate(DWORD milliseconds) { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_SET_PREVIEWRATE,milliseconds,0L); } inline bool VidCap::preview(bool preview) { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_SET_PREVIEW,preview,0L); } inline bool VidCap::getCaptureStatus(CaptureStatus &someCaptureStatus) { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_GET_STATUS,(WPARAM)sizeof(CAPSTATUS),(LPARAM)(LPVOID)&((CAPSTATUS&)someCaptureStatus)); } inline bool VidCap::getCaptureParams(CaptureParams &someCaptureParams) { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_GET_SEQUENCE_SETUP,(WPARAM)sizeof(CAPTUREPARMS),(LPARAM)(LPVOID)&((CAPTUREPARMS&)someCaptureParams)); } inline bool VidCap::setCaptureParams(CaptureParams &someCaptureParams) { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_SET_SEQUENCE_SETUP,(WPARAM)sizeof(CAPTUREPARMS),(LPARAM)(LPVOID)&((CAPTUREPARMS&)someCaptureParams)); } inline bool VidCap::getDriverCaps(DriverCaps &someDriverCaps) { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_DRIVER_GET_CAPS,(WPARAM)sizeof(CAPDRIVERCAPS),(LPARAM)(LPVOID)&someDriverCaps); } inline bool VidCap::setVideoFormat(BitmapInfo &someBitmapInfo) { if(!isOkay()||!isConnected())return false; if(!someBitmapInfo.width()||!someBitmapInfo.height())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_SET_VIDEOFORMAT,(WPARAM)sizeof(BITMAPINFOHEADER),(LPARAM)&((BITMAPINFOHEADER&)someBitmapInfo)); } inline bool VidCap::setMCIDeviceName(const String &mciDeviceName) { if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_SET_MCI_DEVICE,0,(LPARAM)mciDeviceName.str()); } inline bool VidCap::getMCIDeviceName(String &mciDeviceName) { bool returnCode=false; mciDeviceName.reserve(512); if(!isOkay()||!isConnected())return false; return ::SendMessage(mhCaptureWnd,WM_CAP_GET_MCI_DEVICE,512,(LPARAM)mciDeviceName.str()); } #endif