3 bool CCamAvi::Initialize (char* filename)
\r
13 hr=AVIFileOpen (&m_paf, filename, OF_READ, NULL);
\r
14 if (hr!=0) return false;
\r
16 hr=AVIFileGetStream (m_paf, &m_pas, streamtypeVIDEO, 0);
\r
17 if (hr!=0) return false;
\r
19 hr= AVIStreamInfo (m_pas, &info, sizeof (info));
\r
20 if (hr!=0) return false;
\r
23 hr= AVIStreamReadFormat (m_pas, 0, &m_bi, &hr);
\r
24 if (hr!=0) return false;
\r
26 if (m_bi.bmiHeader.biCompression!=0)
\r
28 // find decompressor
\r
29 m_hic=ICOpen (ICTYPE_VIDEO, info.fccHandler ,ICMODE_DECOMPRESS);
\r
30 if (m_hic==0) return false;
\r
32 m_data=new unsigned char[m_bi.bmiHeader.biSizeImage];
\r
34 AVIStreamInfo (m_pas, &a, sizeof (a));
\r
35 m_length=a.dwLength;
\r
36 hr=AVIStreamBeginStreaming (m_pas, 0, 100, 1000);
\r
39 m_FrameRate = (double)a.dwRate / a.dwScale;
\r
41 m_pos=AVIStreamStart (m_pas);
\r
42 m_data=new BYTE[m_bi.bmiHeader.biSizeImage];
\r
43 if (m_bi.bmiHeader.biCompression!=0)
\r
45 hr=ICDecompressGetFormat (m_hic, &m_bi, &m_bi_out);
\r
48 m_frame.Create (m_bi_out.bmiHeader.biWidth, m_bi_out.bmiHeader.biHeight, m_bi_out.bmiHeader.biBitCount);
\r
52 void CCamAvi::Uninitialize ()
\r
54 AVIFileRelease (m_paf);
\r
64 CCamAvi::~CCamAvi ()
\r
66 // if (m_data) delete m_data;
\r
69 CImage& CCamAvi::GetFrame ()
\r
71 m_frame.Create (m_bi_out.bmiHeader.biWidth, m_bi_out.bmiHeader.biHeight, m_bi_out.bmiHeader.biBitCount);
\r
74 IplImage* img=m_frame.GetImage();
\r
75 BITMAPINFOHEADER *b;
\r
76 long written, s_written;
\r
77 long err=AVIStreamRead (m_pas, m_pos, 1, m_data, m_bi.bmiHeader.biSizeImage, &written, &s_written);
\r
78 m_pos=(m_pos+1)%m_length;
\r
79 if (m_bi.bmiHeader.biCompression!=0)
\r
82 h=ICImageDecompress (m_hic, 0, &m_bi, m_data, &m_bi_out);
\r
85 b=(BITMAPINFOHEADER*)GlobalLock(h);
\r
86 iplConvertFromDIB (b, img);
\r
94 iplConvertFromDIBSep (&m_bi.bmiHeader, (const char*) m_data, img);
\r