⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ccapture.h

📁 这是G.723和G.729的音频编解码的源代码
💻 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 + -