00001
00002
00003
00004
00005 #if !defined (AQSENSE_SAL3DPP_FRAME_GRABBER_HPP)
00006 #define AQSENSE_SAL3DPP_FRAME_GRABBER_HPP
00007
00008 #if defined (_MSC_VER) && (_MSC_VER >= 1020)
00009 #pragma once
00010 #endif
00011
00012 #include <sal3d/framegrabber.h>
00013 #include <sal3dpp/Frame.hpp>
00014 #include <stdexcept>
00015 #include <string>
00016
00017 namespace sal3d
00018 {
00019
00024 class Timeout: public std::runtime_error
00025 {
00026 public:
00027 Timeout ():
00028 std::runtime_error ("timeout")
00029 {
00030 }
00031 };
00032
00075 class FrameGrabber
00076 {
00077 public:
00092 explicit FrameGrabber (const std::string &fileName,
00093 const std::string ¶m)
00094 {
00095 _grabber.p = 0;
00096 init (fileName, param);
00097 }
00098
00111 explicit FrameGrabber (const std::string &fileName)
00112 {
00113 init (fileName, "");
00114 }
00115
00121 FrameGrabber (const FrameGrabber &grabber):
00122 _grabber (grabber._grabber)
00123 {
00124 Error e;
00125 sal3d_frame_grabber_share (_grabber, &e.e);
00126 if ( 0 > e.e.value )
00127 throw e;
00128 }
00129
00133 virtual ~FrameGrabber ()
00134 {
00135 sal3d_frame_grabber_release (_grabber);
00136 }
00137
00152 virtual Frame
00153 frame ()
00154 {
00155 Error e;
00156 sal3d_frame frame;
00157 sal3d_frame_grabber_get_frame (_grabber, &frame, &e.e);
00158 if ( 0 > e.e.value )
00159 throw e;
00160
00161 return Frame (frame);
00162 }
00163
00170 virtual void
00171 freeze ()
00172 {
00173 Error e;
00174 sal3d_frame_grabber_freeze (_grabber, &e.e);
00175 if ( 0 > e.e.value )
00176 throw e;
00177 }
00178
00191 virtual void
00192 grab ()
00193 {
00194 Error e;
00195 sal3d_frame_grabber_grab (_grabber, &e.e);
00196 if ( 0 > e.e.value )
00197 throw e;
00198 }
00199
00208 virtual int
00209 lostCount ()
00210 {
00211 Error e;
00212 int count = sal3d_frame_grabber_get_lost_frames_counter (_grabber,
00213 &e.e);
00214 if ( 0 > e.e.value )
00215 throw e;
00216 return count;
00217 }
00218
00228 FrameGrabber &
00229 operator= (const FrameGrabber &rhs)
00230 {
00231 Error e;
00232 sal3d_frame_grabber_share (rhs._grabber, &e.e);
00233 if ( 0 > e.e.value )
00234 throw e;
00235
00236 sal3d_frame_grabber_release (_grabber);
00237
00238 _grabber = rhs._grabber;
00239
00240 return *this;
00241 }
00242
00243 virtual void
00244 reconfig (const std::string ¶m)
00245 {
00246 Error e;
00247 sal3d_frame_grabber_reconfig (_grabber,
00248 param.c_str(), &e.e);
00249 if ( 0 > e.e.value )
00250 throw e;
00251 }
00252
00272 void
00273 setSize (int width, int height)
00274 {
00275 Error e;
00276 sal3d_frame_grabber_set_size (_grabber, width,
00277 height, &e.e);
00278 if ( 0 > e.e.value )
00279 throw e;
00280 }
00281
00303 virtual void
00304 wait (int timeout = -1)
00305 {
00306 Error e;
00307 sal3d_frame_grabber_wait (_grabber, timeout, &e.e);
00308 if ( 0 > e.e.value )
00309 {
00310 if (e.e.value == SAL3D_ERROR_TIMEOUT)
00311 throw Timeout();
00312 throw e;
00313 }
00314 }
00315
00316 protected:
00358 void *
00359 getDriverData ()
00360 {
00361 Error e;
00362 void * result = sal3d_frame_grabber_get_driver_data (_grabber,
00363 &e.e);
00364 if ( 0 > e.e.value )
00365 throw e;
00366 return result;
00367 }
00368
00375 void *
00376 getFunctionPointer (const std::string &name)
00377 {
00378 Error e;
00379 void * result = sal3d_frame_grabber_get_function_pointer (_grabber, name.c_str(),
00380 &e.e);
00381 if ( 0 > e.e.value )
00382 throw e;
00383 return result;
00384 }
00385
00386
00387 private:
00393 void init (const std::string &fileName,
00394 const std::string ¶m)
00395 {
00396 Error e;
00397 sal3d_frame_grabber_new_from_file (fileName.c_str (),
00398 param.c_str (), &_grabber, &e.e);
00399 if ( 0 > e.e.value )
00400 throw e;
00401 }
00402
00404 sal3d_frame_grabber _grabber;
00405 };
00406 }
00407
00408 #endif // !AQSENSE_SAL3DPP_FRAME_GRABBER_HPP