00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __DVBUFFER_3_H
00024 #define __DVBUFFER_3_H
00025 #include <cvd/videobuffer.h>
00026 #include <cvd/byte.h>
00027 #include <cvd/rgb.h>
00028 #include <inttypes.h>
00029 #include <cvd/colourspaces.h>
00030
00031 namespace CVD
00032 {
00033 namespace Exceptions
00034 {
00035 namespace DVBuffer3
00036 {
00039 struct All : public CVD::Exceptions::VideoBuffer::All
00040 {
00041 All(std::string sWhat)
00042 {
00043 what = "DVBuffer3: " + sWhat;
00044 }
00045 };
00046 }
00047 }
00048
00050 namespace DV3
00051 {
00054 enum DV3Feature { BRIGHTNESS, EXPOSURE, SHARPNESS,
00055 WHITE_BALANCE, HUE, SATURATION,
00056 GAMMA, SHUTTER, GAIN, IRIS,
00057 FOCUS, ZOOM, PAN, TILT, FRAME_RATE};
00058
00061 enum DV3ColourSpace { MONO8, MONO16, MONO16S,
00062 RGB8, RGB16, RGB16S,
00063 YUV411, YUV422, YUV444,
00064 RAW8, RAW16};
00065
00069 enum DV3ColourFilter { UNDEFINED = -1, RGGB = 0, GBRG = 1, GRBG = 2, BGGR = 3 };
00070
00071 #ifndef DOXYGEN_IGNORE_INTERNAL
00072
00073 template<class C>
00074 struct CSConvert
00075 { static const DV3ColourSpace space = C::Error__type_not_valid_for_camera; };
00076 template<> struct CSConvert<byte>
00077 { static const DV3ColourSpace space = MONO8;};
00078 template<> struct CSConvert<short unsigned int>
00079 { static const DV3ColourSpace space = MONO16;};
00080 template<> struct CSConvert<yuv411>
00081 { static const DV3ColourSpace space = YUV411;};
00082 template<> struct CSConvert<yuv422>
00083 { static const DV3ColourSpace space = YUV422;};
00084 template<> struct CSConvert<Rgb<byte> >
00085 { static const DV3ColourSpace space = RGB8;};
00086 template<> struct CSConvert<bayer_bggr>
00087 { static const DV3ColourSpace space = RAW8; };
00088 template<> struct CSConvert<bayer_gbrg>
00089 { static const DV3ColourSpace space = RAW8; };
00090 template<> struct CSConvert<bayer_grbg>
00091 { static const DV3ColourSpace space = RAW8; };
00092 template<> struct CSConvert<bayer_rggb>
00093 { static const DV3ColourSpace space = RAW8; };
00094 template<> struct CSConvert<bayer_bggr16be>
00095 { static const DV3ColourSpace space = RAW16; };
00096 template<> struct CSConvert<bayer_gbrg16be>
00097 { static const DV3ColourSpace space = RAW16; };
00098 template<> struct CSConvert<bayer_grbg16be>
00099 { static const DV3ColourSpace space = RAW16; };
00100 template<> struct CSConvert<bayer_rggb16be>
00101 { static const DV3ColourSpace space = RAW16; };
00102
00103 template<class C> struct CSFilter { static const DV3ColourFilter filter = UNDEFINED; };
00104 template<> struct CSFilter<bayer_bggr> { static const DV3ColourFilter filter = BGGR; };
00105 template<> struct CSFilter<bayer_gbrg> { static const DV3ColourFilter filter = GBRG; };
00106 template<> struct CSFilter<bayer_grbg> { static const DV3ColourFilter filter = GRBG; };
00107 template<> struct CSFilter<bayer_rggb> { static const DV3ColourFilter filter = RGGB; };
00108 template<> struct CSFilter<bayer_bggr16be> { static const DV3ColourFilter filter = BGGR; };
00109 template<> struct CSFilter<bayer_gbrg16be> { static const DV3ColourFilter filter = GBRG; };
00110 template<> struct CSFilter<bayer_grbg16be> { static const DV3ColourFilter filter = GRBG; };
00111 template<> struct CSFilter<bayer_rggb16be> { static const DV3ColourFilter filter = RGGB; };
00112
00113 struct LibDCParams;
00114 #endif
00115
00120 class RawDVBuffer3: public virtual RawVideoBuffer
00121 {
00122 public:
00131 RawDVBuffer3(DV3ColourSpace colourspace,
00132 int nCamNumber=0,
00133 uint64_t cam_guid=-1,
00134 int cam_unit=-1,
00135 bool verbose=0,
00136 bool bus_reset=0,
00137 ImageRef irSize = ImageRef(-1,-1),
00138 float fFrameRate=-1.0,
00139 ImageRef irOffset = ImageRef(-1,-1),
00140 int format7_mode=-1);
00141
00142 ~RawDVBuffer3();
00143 static void stopAllTransmissions(void);
00144 inline ImageRef size() {return mirSize;}
00145 inline ImageRef offset() {return mirOffset;}
00146 inline double frame_rate() {return mdFramerate;}
00147 inline DV3ColourFilter colour_filter() { return mColourfilter; }
00148
00149 VideoFrame<byte>* get_frame();
00150 void put_frame(VideoFrame<byte>* f);
00151 bool frame_pending();
00152
00153 void set_feature_value(DV3Feature nFeature, unsigned int nValue);
00154 unsigned int get_feature_value(DV3Feature nFeature);
00155 std::pair<unsigned int, unsigned int> get_feature_min_max(DV3Feature nFeature);
00156 void auto_on_off(DV3Feature nFeature, bool bValue);
00157 void power_on_off(DV3Feature nFeature, bool bValue);
00158
00159 private:
00160
00161 ImageRef mirSize;
00162 ImageRef mirOffset;
00163 double mdFramerate;
00164 DV3ColourFilter mColourfilter;
00166 LibDCParams *mpLDCP;
00167 };
00168
00169 }
00170
00175 template <class pixel_T>
00176 class DVBuffer3 : public VideoBuffer<pixel_T>, public DV3::RawDVBuffer3
00177 {
00178 public:
00179 DVBuffer3(unsigned int nCamNumber=0,
00180 ImageRef irSize = ImageRef(-1,-1),
00181 float fFPS = -1.0,
00182 ImageRef irOffset = ImageRef(-1,-1),
00183 bool verbose=0,
00184 bool bus_reset=0,
00185 int format7_mode=-1)
00186 : VideoBuffer<pixel_T>(VideoBufferType::Live),
00187 RawDVBuffer3(DV3::CSConvert<pixel_T>::space, nCamNumber, 0, -1, verbose, bus_reset, irSize, fFPS, irOffset, format7_mode)
00188 {
00189 if(DV3::CSFilter<pixel_T>::filter != DV3::UNDEFINED && colour_filter() != DV3::CSFilter<pixel_T>::filter )
00190 throw(Exceptions::DVBuffer3::All("wrong colour filter expected"));
00191 }
00192
00193 virtual ~DVBuffer3() {}
00194 double frame_rate() {return RawDVBuffer3::frame_rate(); }
00195 ImageRef size() {return RawDVBuffer3::size(); }
00196 virtual VideoFrame<pixel_T>* get_frame()
00197 {
00198 return reinterpret_cast<VideoFrame<pixel_T>*>(RawDVBuffer3::get_frame());
00199 }
00200 virtual void put_frame(VideoFrame<pixel_T>* f)
00201 {
00202 RawDVBuffer3::put_frame(reinterpret_cast<VideoFrame<byte>*>(f));
00203 }
00204 virtual bool frame_pending() {return RawDVBuffer3::frame_pending();}
00205 virtual void seek_to(double){}
00206 };
00207
00208 }
00209
00210 #endif