📄 vfwwrapper.cpp
字号:
// VFWWrapper.cpp: implementation of the CVFWWrapper class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ScreenChattingServer.h"
#include "VFWWrapper.h"
//#include "WinBmpEx.h"
//#include <mmsystem.h>
#include <mmreg.h>
#define DEF_CAPTURE_FPS 15
#define MIN_CAPTURE_FPS (1.0 / 60) // one frame per minute
#define MAX_CAPTURE_FPS 100
#define FPS_TO_MS(f) ((DWORD) ((double)1.0e6 / f))
#define DEF_CAPTURE_RATE FPS_TO_MS(DEF_CAPTURE_FPS)
#define MIN_CAPTURE_RATE FPS_TO_MS(MIN_CAPTURE_FPS)
#define MAX_CAPTURE_RATE FPS_TO_MS(MAX_CAPTURE_FPS)
#define CAP_SMALL_INDEX (30 * 60 * 15) // 15 minutes @ 30fps
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CVFWWrapper,CObject,1)
CVFWWrapper::CVFWWrapper()
{
m_pCapWnd=NULL;
m_pParentWnd=NULL;
m_uDriverCount=0;
m_bHaveHardware=FALSE;
m_uDeviceIndex=0;
EnumDrivers();
}
CVFWWrapper::~CVFWWrapper()
{
m_pCapWnd->Detach();
delete m_pCapWnd;
m_pCapWnd=NULL;
m_pParentWnd=NULL;
m_uDriverCount=0;
m_bHaveHardware=FALSE;
m_uDeviceIndex=0;
}
CVFWWrapper::CVFWWrapper(BOOL bCreateCaptureWindow,CRect rect,CWnd *pParentWnd,UINT uIndex)
{
m_pCapWnd=NULL;
m_pParentWnd=NULL;
m_uDriverCount=0;
m_bHaveHardware=FALSE;
m_uDeviceIndex=0;
EnumDrivers();
if (!Initialize(bCreateCaptureWindow,TRUE,rect,pParentWnd,uIndex)) ::MessageBox(pParentWnd->m_hWnd,"檬扁拳俊 角菩沁嚼聪促.","VFWWrapper",MB_OK);
}
BOOL CVFWWrapper::Initialize(BOOL bCreateCaptureWindow,BOOL bPreview,CRect rect,CWnd *pParentWnd,UINT uIndex)
{
if (!pParentWnd) return FALSE;
m_pParentWnd=pParentWnd;
try
{
if (bCreateCaptureWindow)
{
HWND hCapWnd=capCreateCaptureWindow("VFWWrapper",WS_CHILD|WS_VISIBLE,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,pParentWnd->m_hWnd,1);
if (!hCapWnd) return FALSE;
m_pCapWnd=new CWnd;
m_pCapWnd->Attach(hCapWnd);
if (!capCaptureGetSetup(m_pCapWnd->m_hWnd,&m_capParms,sizeof(CAPTUREPARMS))) return FALSE;
}
else
{
if (!capCaptureGetSetup(m_pParentWnd->m_hWnd,&m_capParms,sizeof(CAPTUREPARMS))) return FALSE;
m_pCapWnd=NULL;
}
if (!InitHardware(uIndex)) return FALSE;
if (bPreview)
{
if (bCreateCaptureWindow)
{
if (!capPreview(m_pCapWnd->m_hWnd,TRUE)) return FALSE;
if (!capCaptureSequenceNoFile(m_pCapWnd->m_hWnd)) return FALSE;
}
else
{
if (!capPreview(m_pParentWnd->m_hWnd,TRUE)) return FALSE;
if (!capCaptureSequenceNoFile(m_pCapWnd->m_hWnd)) return FALSE;
}
}
}
catch(CException e)
{
::MessageBox(pParentWnd->m_hWnd,"檬扁拳俊 角菩沁嚼聪促.","VFWWrapper",MB_OK);
return FALSE;
}
return TRUE;
}
void CVFWWrapper::Serialize(CArchive& archive)
{
if (archive.IsLoading())
{
}
else
{
}
}
BOOL CVFWWrapper::InitHardware(UINT uIndex)
{
UINT uError;
char szName[MAX_PATH];
char szVersion[MAX_PATH];
CWnd *pCapConcernedWnd;
if (!m_pCapWnd) pCapConcernedWnd=m_pParentWnd;
else pCapConcernedWnd=m_pCapWnd;
if (uError=capDriverConnect(pCapConcernedWnd->m_hWnd, uIndex))
{
m_bHaveHardware=TRUE;
m_uDeviceIndex=uIndex;
}
else
{
m_bHaveHardware=FALSE;
}
if (!capDriverGetCaps(pCapConcernedWnd->m_hWnd,&m_capDriverCaps,sizeof(CAPDRIVERCAPS))) return FALSE;
if (!capGetStatus(pCapConcernedWnd->m_hWnd,&m_capStatus,sizeof(m_capStatus))) return FALSE;
if (!capGetDriverDescription(uIndex,szName,sizeof(szName),szVersion,sizeof (szVersion))) return FALSE;
if (!capPreviewRate(pCapConcernedWnd->m_hWnd,m_bHaveHardware?33:0)) return FALSE;
// if (!capOverlay(pCapConcernedWnd->m_hWnd,0)) return FALSE;
/*
CAPTUREPARMS capParams;
capParams.dwRequestMicroSecPerFrame=100000;
// capParams.fMakeUserHitOKToCapture=
// capParams.wPercentDropForError=
capParams.fYield=TRUE;
// capParams.dwIndexSize=
// capParams.wChunkGranularity=
// capParams.fUsingDOSMemory=
// capParams.wNumVideoRequested=
capParams.fCaptureAudio=FALSE;
// capParams.wNumAudioRequested=
capParams.vKeyAbort=VK_ESCAPE;
capParams.fAbortLeftMouse=FALSE;
capParams.fAbortRightMouse=FALSE;
capParams.fLimitEnabled=FALSE;
// capParams.wTimeLimit=
capParams.fMCIControl=FALSE;
// capParams.fStepMCIDevice=
// capParams.dwMCIStartTime=
// capParams.dwMCIStopTime=
// capParams.fStepCaptureAt2x=
// capParams.wStepCaptureAverageFrames=
// capParams.dwAudioBufferSize=
// capParams.fDisableWriteCache=
// capParams.AVStreamMaster=
if (!capCaptureSetSetup(pCapConcernedWnd->m_hWnd,&capParams,sizeof(capParams))) return FALSE;
*/
strcat(szName,", ");
strcat(szName,szVersion);
return m_bHaveHardware;
}
BOOL CVFWWrapper::EnumDrivers()
{
char achDeviceVersion[80];
char achDeviceAndVersion[160];
UINT uIndex;
for (uIndex=0;uIndex<MAXVIDDRIVERS;uIndex++)
{
if (capGetDriverDescription(uIndex,(LPSTR)achDeviceAndVersion,sizeof(achDeviceAndVersion),(LPSTR)achDeviceVersion,sizeof(achDeviceVersion)))
{
lstrcat(achDeviceAndVersion,", ");
lstrcat(achDeviceAndVersion,achDeviceVersion);
m_strDeviceAndVersion[m_uDriverCount]=achDeviceAndVersion;
m_uDriverCount++;
}
else break;
}
return TRUE;
}
BOOL CVFWWrapper::CaptureFrame()
{
if (!m_pCapWnd) return FALSE;
if (!capPreview(m_pCapWnd->m_hWnd,FALSE)) return FALSE;
if (!capGrabFrameNoStop(m_pCapWnd->m_hWnd)) return FALSE;
return TRUE;
}
BOOL CVFWWrapper::SetHandler(FARPROC fpErrorCallback, FARPROC fpYieldCallback, FARPROC fpStatusCallback,FARPROC fpVideoStreamCallback,FARPROC fpFrameCallback)
{
CWnd *pCapConcernedWnd;
if (!m_pCapWnd) pCapConcernedWnd=m_pParentWnd;
else pCapConcernedWnd=m_pCapWnd;
if (!capSetCallbackOnError(pCapConcernedWnd->m_hWnd,fpErrorCallback)) return FALSE;
if (!capSetCallbackOnYield(pCapConcernedWnd->m_hWnd,fpYieldCallback)) return FALSE;
if (!capSetCallbackOnStatus(pCapConcernedWnd->m_hWnd,fpStatusCallback)) return FALSE;
if (!capSetCallbackOnVideoStream(pCapConcernedWnd->m_hWnd,fpVideoStreamCallback)) return FALSE;
if (!capSetCallbackOnFrame(pCapConcernedWnd->m_hWnd,fpFrameCallback)) return FALSE;
return TRUE;
}
BITMAPINFO * CVFWWrapper::GetBitmapInfo()
{
CWnd *pCapConcernedWnd;
if (!m_pCapWnd) pCapConcernedWnd=m_pParentWnd;
else pCapConcernedWnd=m_pCapWnd;
BITMAPINFO *pBi=new BITMAPINFO;
capGetVideoFormat(pCapConcernedWnd->m_hWnd,pBi,sizeof(BITMAPINFO));
return pBi;
}
BOOL CVFWWrapper::ChangeFormat()
{
if (m_capDriverCaps.fHasDlgVideoFormat)
{
// oldhelpid = SetCurrentHelpContext(IDA_VIDFORMAT);
if (capDlgVideoFormat(m_pCapWnd->m_hWnd))
{
if (!capGetStatus(m_pCapWnd->m_hWnd,&m_capStatus,sizeof(CAPSTATUS))) return FALSE;
// vidcapLayout(hWnd);
}
}
else return FALSE;
return TRUE;
}
BOOL CVFWWrapper::ChangeSource()
{
if (m_capDriverCaps.fHasDlgVideoSource)
{
// oldhelpid = SetCurrentHelpContext(IDA_VIDFORMAT);
if (capDlgVideoSource(m_pCapWnd->m_hWnd))
{
if (!capGetStatus(m_pCapWnd->m_hWnd,&m_capStatus,sizeof(CAPSTATUS))) return FALSE;
// vidcapLayout(hWnd);
}
}
else return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -