+++ /dev/null
-#include "CamAvi.h"\r
-\r
-bool CCamAvi::Initialize (char* filename)\r
-{\r
- long hr;\r
- AVISTREAMINFO info;\r
- \r
- m_init=false;\r
- m_pos=0;\r
- \r
- AVIFileInit ();\r
- \r
- hr=AVIFileOpen (&m_paf, filename, OF_READ, NULL);\r
- if (hr!=0) return false;\r
-\r
- hr=AVIFileGetStream (m_paf, &m_pas, streamtypeVIDEO, 0);\r
- if (hr!=0) return false;\r
-\r
- hr= AVIStreamInfo (m_pas, &info, sizeof (info)); \r
- if (hr!=0) return false;\r
-\r
- hr=sizeof (m_bi);\r
- hr= AVIStreamReadFormat (m_pas, 0, &m_bi, &hr);\r
- if (hr!=0) return false; \r
- \r
- if (m_bi.bmiHeader.biCompression!=0)\r
- {\r
- // find decompressor\r
- m_hic=ICOpen (ICTYPE_VIDEO, info.fccHandler ,ICMODE_DECOMPRESS);\r
- if (m_hic==0) return false;\r
- }\r
- m_data=new unsigned char[m_bi.bmiHeader.biSizeImage];\r
- AVISTREAMINFO a;\r
- AVIStreamInfo (m_pas, &a, sizeof (a));\r
- m_length=a.dwLength;\r
- hr=AVIStreamBeginStreaming (m_pas, 0, 100, 1000); \r
- m_init=true;\r
-\r
- m_FrameRate = (double)a.dwRate / a.dwScale;\r
- \r
- m_pos=AVIStreamStart (m_pas);\r
- m_data=new BYTE[m_bi.bmiHeader.biSizeImage];\r
- if (m_bi.bmiHeader.biCompression!=0) \r
- {\r
- hr=ICDecompressGetFormat (m_hic, &m_bi, &m_bi_out);\r
- }\r
- else m_bi_out=m_bi;\r
- m_frame.Create (m_bi_out.bmiHeader.biWidth, m_bi_out.bmiHeader.biHeight, m_bi_out.bmiHeader.biBitCount);\r
- return true;\r
-}\r
-\r
-void CCamAvi::Uninitialize ()\r
-{\r
- AVIFileRelease (m_paf);\r
- delete m_data;\r
- return;\r
-}\r
-\r
-CCamAvi::CCamAvi()\r
-{\r
- m_FrameRate = 25;\r
-}\r
-\r
-CCamAvi::~CCamAvi ()\r
-{\r
-// if (m_data) delete m_data;\r
-}\r
-\r
-CImage& CCamAvi::GetFrame ()\r
-{\r
- m_frame.Create (m_bi_out.bmiHeader.biWidth, m_bi_out.bmiHeader.biHeight, m_bi_out.bmiHeader.biBitCount);\r
-\r
- HANDLE h = 0;\r
- IplImage* img=m_frame.GetImage();\r
- BITMAPINFOHEADER *b;\r
- long written, s_written;\r
- long err=AVIStreamRead (m_pas, m_pos, 1, m_data, m_bi.bmiHeader.biSizeImage, &written, &s_written);\r
- m_pos=(m_pos+1)%m_length;\r
- if (m_bi.bmiHeader.biCompression!=0) \r
- {\r
- // decompress data\r
- h=ICImageDecompress (m_hic, 0, &m_bi, m_data, &m_bi_out);\r
- if( h )\r
- {\r
- b=(BITMAPINFOHEADER*)GlobalLock(h);\r
- iplConvertFromDIB (b, img); \r
- GlobalUnlock(h);\r
- GlobalFree(h);\r
- }\r
- }\r
- else\r
- {\r
- \r
- iplConvertFromDIBSep (&m_bi.bmiHeader, (const char*) m_data, img); \r
- }\r
- \r
- return m_frame;\r
-}\r