FrameGrabber.hpp
00001 //
00002 // Class to interface with a frame grabber
00003 // Copyright 2008-2010 AQSENSE, S.L.
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 &param)
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 &param)
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 &param)
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