📄 ccapture.h
字号:
//CCapture.h
#ifndef __CCAPTURE_H__
#define __CCAPTURE_H__
#include <vfw.h>
typedef void CapCallBackFunc(BYTE * pbyFrameContent,UINT uFrameLength,LPVOID lpUserInstance);
typedef CapCallBackFunc * PCapCallBackFunc;
LRESULT CALLBACK MyCallBackProc(HWND,LPVIDEOHDR);
#define m_byImageFormat 1//1-yu420p(bt848), 2-yuv2(philiphs)
class CCapture
{
friend LRESULT CALLBACK MyCallBackProc(HWND hWnd,LPVIDEOHDR lpHdr);
private:
BOOL m_bInitialize;
int m_nWidth;
int m_nHeight;
int m_nFrameRate;
BOOL m_bPreviewOrOverlay;
BOOL m_bVisible;
LPVOID m_lpUserInstance;
HWND m_hParentWnd;
BITMAPINFO m_bitMapInfo;
static int m_nDriverID;
PCapCallBackFunc m_pCapCallBackFunc;
CAPDRIVERCAPS m_CapDriverCaps;
CAPSTATUS m_CapStatus;
CAPTUREPARMS m_captureParms;
BYTE* pbyFrame;
void FormatTwoLine(BYTE* pbyLine1,BYTE*pbyLine2,
BYTE* pbyY,BYTE* pbyU,BYTE* pbyV,
int nLineLength);
void FormatImage(BYTE * pBuffer,BYTE* pFrame,int nWidth,int nHeight);
public:
HWND m_hWndCap;
CCapture(PCapCallBackFunc pCapCallBackFunc=NULL);
virtual ~CCapture();
BOOL InitCap(HWND hParentWnd=NULL,LPVOID lpUserInstance=NULL);
BOOL SetCapSize(int nWidth=176,int nHeight=144);
int GetCapWidth();
int GetCapHeight();
BOOL SetFrameRate(int nFrameRate=10);
int GetFrameRate();
BOOL StartCap();
void EndCap();
void DisableVisible(BOOL bInvisible);
void LetUserSetVideoSource();
void LetUserSetVideoFormat();
BOOL SetDisplaySize(int nWidth,int nHeight);
HWND GetCapWndHandle(void){return m_hWndCap;}
BOOL AbortCap();
};
inline BOOL CCapture::AbortCap()
{
if(m_bInitialize)
return capCaptureAbort(m_hWndCap);
else
return FALSE;
}
inline int CCapture::GetCapWidth()
{
if(!m_bInitialize)
return m_nWidth;
if(!capGetStatus(m_hWndCap,&m_CapStatus,sizeof(m_CapStatus)))return 0;
return m_nWidth=m_CapStatus.uiImageWidth;
}
inline int CCapture::GetCapHeight()
{
if(!m_bInitialize)
return m_nHeight;
if(!capGetStatus(m_hWndCap,&m_CapStatus,sizeof(m_CapStatus)))return 0;
return m_nHeight=m_CapStatus.uiImageHeight;
}
inline int CCapture::GetFrameRate()
{
return m_nFrameRate;
}
inline void CCapture::LetUserSetVideoSource()
{
if(!m_bInitialize)return;
if(!capDriverGetCaps(m_hWndCap,&m_CapDriverCaps,sizeof(CAPDRIVERCAPS)))
return;
if(m_CapDriverCaps.fHasDlgVideoSource)
capDlgVideoSource(m_hWndCap);
}
inline void CCapture::LetUserSetVideoFormat()
{
if(!m_bInitialize)return;
if(!capDriverGetCaps(m_hWndCap,&m_CapDriverCaps,sizeof(CAPDRIVERCAPS)))
return;
if(m_CapDriverCaps.fHasDlgVideoFormat)
capDlgVideoFormat(m_hWndCap);
}
inline void CCapture::FormatTwoLine(BYTE* pbyLine1,BYTE*pbyLine2,
BYTE* pbyY,BYTE* pbyU,BYTE* pbyV,
int nLineLength)
{
int i=0;
switch(m_byImageFormat)
{
case 1:
for(i=0;i<nLineLength;i+=12)
{
*pbyY++=*(pbyLine1+1);
*pbyY++=*(pbyLine1+3);
*pbyY++=*(pbyLine1+5);
*pbyY++=*(pbyLine1+7);
*pbyY++=*(pbyLine1+8);
*pbyY++=*(pbyLine1+9);
*pbyY++=*(pbyLine1+10);
*pbyY++=*(pbyLine1+11);
*pbyU++=*(pbyLine1);
*pbyU++=*(pbyLine2+i);
*pbyU++=*(pbyLine1+4);
*pbyU++=*(pbyLine2+i+4);
*pbyV++=*(pbyLine1+2);
*pbyV++=*(pbyLine2+i+2);
*pbyV++=*(pbyLine1+6);
*pbyV++=*(pbyLine2+i+6);
pbyLine1+=12;
}
for(i=0;i<nLineLength;i+=12)
{
*pbyY++=*(pbyLine2+1);
*pbyY++=*(pbyLine2+3);
*pbyY++=*(pbyLine2+5);
*pbyY++=*(pbyLine2+7);
*pbyY++=*(pbyLine2+8);
*pbyY++=*(pbyLine2+9);
*pbyY++=*(pbyLine2+10);
*pbyY++=*(pbyLine2+11);
pbyLine2+=12;
}
break;
case 2:
for(i=0;i<nLineLength;i+=8)
{
*pbyU++=*(pbyLine1+i+1);
*pbyV++=*(pbyLine1+i+3);
*pbyU++=*(pbyLine2+i+1);
*pbyV++=*(pbyLine2+i+3);
}
for(i=0;i<nLineLength;i+=2)
*pbyY++=*(pbyLine1+i);
for(i=0;i<nLineLength;i+=2)
*pbyY++=*(pbyLine2+i);
break;
}
}
#endif __CCAPTURE_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -