www.pudn.com > Gesture[20040824].rar > CamAvi.cpp


// CamAvi.cpp: implementation of the CCamAvi class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Gesture.h" 
#include "CamAvi.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
bool CCamAvi::Initialize (const char* filename) 
{ 
	long hr; 
	AVISTREAMINFO info; 
	//ICINFO icinfo; 
	 
	m_init = false; 
	m_pos = 0; 
	 
	AVIFileInit (); 
	 
	hr = AVIFileOpen (&m_paf, filename, OF_READ, NULL); 
	if (hr!=0) return false; 
 
	hr = AVIFileGetStream (m_paf, &m_pas, streamtypeVIDEO, 0); 
	if (hr!=0) return false; 
 
	hr = AVIStreamInfo (m_pas, &info, sizeof (info));	 
	if (hr!=0) return false; 
 
	hr = sizeof (m_bi); 
	hr = AVIStreamReadFormat (m_pas, 0, &m_bi, &hr); 
	if (hr!=0) return false;	 
	 
	if (m_bi.bmiHeader.biCompression!=0) 
	{ 
		// find decompressor 
		m_hic = ICOpen (ICTYPE_VIDEO, info.fccHandler ,ICMODE_DECOMPRESS); 
		if (m_hic==0) return false; 
	} 
	AVISTREAMINFO a; 
	AVIStreamInfo (m_pas, &a, sizeof (a)); 
	m_length = a.dwLength; 
	hr = AVIStreamBeginStreaming (m_pas, 0, 100, 1000);	 
	m_init = true; 
	 
	m_pos = AVIStreamStart (m_pas); 
	if (m_bi.bmiHeader.biCompression!=0)  
	{ 
		hr = ICDecompressGetFormat (m_hic, &m_bi, &m_bi_out); 
	} 
	else m_bi_out = m_bi; 
	m_data = new BYTE[m_bi.bmiHeader.biSizeImage]; 
 
	m_frame->Create(m_bi_out.bmiHeader.biWidth, m_bi_out.bmiHeader.biHeight, m_bi_out.bmiHeader.biBitCount); 
	return true; 
} 
 
void CCamAvi::Uninitialize () 
{ 
	m_init = false; 
 
	AVIFileRelease (m_paf); 
	delete m_data; 
	return; 
} 
 
CCamAvi::CCamAvi() 
{ 
	m_hDIB = NULL; 
	m_palDIB = NULL; 
	m_pos = 0; 
 
	m_init = false; 
	m_frame = new CImage; 
} 
 
CCamAvi::~CCamAvi () 
{ 
	if (m_data) delete m_data; 
	delete m_frame; 
} 
 
void CCamAvi::GetFrameFromAvi() 
{ 
	IplImage* img = m_frame->GetImage(); 
	BITMAPINFOHEADER *b; 
	long written, s_written; 
 
	long err = AVIStreamRead (m_pas, m_pos, 1, m_data, m_bi.bmiHeader.biSizeImage, &written, &s_written); 
	if (err!=0) return; 
 
	if (m_bi.bmiHeader.biCompression!=0)  
	{ 
		// decompress data  
		if ( m_hDIB!=NULL ) ::GlobalFree( m_hDIB ); 
		m_hDIB = (HDIB) ICImageDecompress(m_hic, 0, &m_bi, m_data, &m_bi_out); 
		b = (BITMAPINFOHEADER*)GlobalLock(m_hDIB); 
		iplConvertFromDIB(b, img);	 
		GlobalUnlock(m_hDIB); 
	} else { 
		iplConvertFromDIBSep(&m_bi.bmiHeader, (const char*) m_data, img); 
		/*m_hDIB = (HDIB)::GlobalAlloc(GMEM_FIXED,sizeof(m_bi)+m_bi.bmiHeader.biSizeImage); 
		b = (BITMAPINFOHEADER*)GlobalLock(m_hDIB); 
		b = m_bi;*/ 
	} 
	InitDIBData(); 
	//m_pos = (m_pos+1)%m_length; 
} 
 
void CCamAvi::SetReaderPosition(int pos) 
{ 
	m_pos = pos%m_length; 
} 
 
void CCamAvi::NextFrame() 
{ 
	m_pos = (m_pos+1)%m_length; 
} 
 
void CCamAvi::PrevFrame() 
{ 
	m_pos = (m_pos-1)%m_length; 
} 
 
void CCamAvi::FirstFrame() 
{ 
	m_pos = 0; 
} 
	 
void CCamAvi::LastFrame() 
{ 
	m_pos = m_length-1; 
} 
 
bool CCamAvi::IsLastFrame() 
{ 
	if ( m_pos==m_length-1 ) return true; 
	return false; 
} 
 
bool CCamAvi::IsFirstFrame() 
{ 
	if ( m_pos==0 ) return true; 
	return false; 
} 
 
void CCamAvi::InitDIBData() 
{ 
	if (m_palDIB != NULL) { 
		delete m_palDIB; 
		m_palDIB = NULL; 
	} 
 
	if (m_hDIB == NULL) 
		return; 
	// Set up document size 
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB); 
	if (::DIBWidth(lpDIB) > INT_MAX ||::DIBHeight(lpDIB) > INT_MAX) 
	{ 
		::GlobalUnlock((HGLOBAL) m_hDIB); 
		::GlobalFree((HGLOBAL) m_hDIB); 
		m_hDIB = NULL; 
		CString strMsg; 
		strMsg.LoadString(IDS_DIB_TOO_BIG); 
		MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK); 
		return; 
	} 
	::GlobalUnlock((HGLOBAL) m_hDIB); 
	// Create copy of palette 
	m_palDIB = new CPalette; 
	if (m_palDIB == NULL) 
	{ 
		// we must be really low on memory 
		::GlobalFree((HGLOBAL) m_hDIB); 
		m_hDIB = NULL; 
		return; 
	} 
	if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL) 
	{ 
		// DIB may not have a palette 
		delete m_palDIB; 
		m_palDIB = NULL; 
		return; 
	} 
}