Move the sources to trunk
[opencv] / apps / Common / CamAvi.cpp
1 #include "CamAvi.h"\r
2 \r
3 bool CCamAvi::Initialize (char* filename)\r
4 {\r
5         long hr;\r
6         AVISTREAMINFO info;\r
7         \r
8         m_init=false;\r
9         m_pos=0;\r
10         \r
11         AVIFileInit ();\r
12         \r
13         hr=AVIFileOpen (&m_paf, filename, OF_READ, NULL);\r
14         if (hr!=0) return false;\r
15 \r
16         hr=AVIFileGetStream (m_paf, &m_pas, streamtypeVIDEO, 0);\r
17         if (hr!=0) return false;\r
18 \r
19         hr= AVIStreamInfo (m_pas, &info, sizeof (info));        \r
20         if (hr!=0) return false;\r
21 \r
22         hr=sizeof (m_bi);\r
23         hr= AVIStreamReadFormat (m_pas, 0, &m_bi, &hr);\r
24         if (hr!=0) return false;        \r
25         \r
26         if (m_bi.bmiHeader.biCompression!=0)\r
27         {\r
28                 // find decompressor\r
29                 m_hic=ICOpen (ICTYPE_VIDEO, info.fccHandler ,ICMODE_DECOMPRESS);\r
30                 if (m_hic==0) return false;\r
31         }\r
32         m_data=new unsigned char[m_bi.bmiHeader.biSizeImage];\r
33         AVISTREAMINFO a;\r
34         AVIStreamInfo (m_pas, &a, sizeof (a));\r
35         m_length=a.dwLength;\r
36         hr=AVIStreamBeginStreaming (m_pas, 0, 100, 1000);       \r
37         m_init=true;\r
38 \r
39     m_FrameRate = (double)a.dwRate / a.dwScale;\r
40         \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
44         {\r
45                 hr=ICDecompressGetFormat (m_hic, &m_bi, &m_bi_out);\r
46         }\r
47         else m_bi_out=m_bi;\r
48         m_frame.Create (m_bi_out.bmiHeader.biWidth, m_bi_out.bmiHeader.biHeight, m_bi_out.bmiHeader.biBitCount);\r
49         return true;\r
50 }\r
51 \r
52 void CCamAvi::Uninitialize ()\r
53 {\r
54         AVIFileRelease (m_paf);\r
55         delete m_data;\r
56         return;\r
57 }\r
58 \r
59 CCamAvi::CCamAvi()\r
60 {\r
61     m_FrameRate = 25;\r
62 }\r
63 \r
64 CCamAvi::~CCamAvi ()\r
65 {\r
66 //      if (m_data) delete m_data;\r
67 }\r
68 \r
69 CImage& CCamAvi::GetFrame ()\r
70 {\r
71         m_frame.Create (m_bi_out.bmiHeader.biWidth, m_bi_out.bmiHeader.biHeight, m_bi_out.bmiHeader.biBitCount);\r
72 \r
73         HANDLE h = 0;\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
80         {\r
81                 // decompress data\r
82                 h=ICImageDecompress (m_hic, 0, &m_bi, m_data, &m_bi_out);\r
83         if( h )\r
84         {\r
85                     b=(BITMAPINFOHEADER*)GlobalLock(h);\r
86                     iplConvertFromDIB (b, img); \r
87                     GlobalUnlock(h);\r
88             GlobalFree(h);\r
89         }\r
90         }\r
91         else\r
92         {\r
93                 \r
94                 iplConvertFromDIBSep (&m_bi.bmiHeader, (const char*) m_data, img);      \r
95         }\r
96         \r
97         return m_frame;\r
98 }\r