00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __CVD_V4L2BUFFER_H
00023 #define __CVD_V4L2BUFFER_H
00024
00025 #include <cvd/yc.h>
00026
00027 #include <string>
00028
00029 #include <cvd/videobuffer.h>
00030 #include <cvd/Linux/v4l2frame.h>
00031
00032 #define V4L2BUFFERS 3
00033
00034 namespace CVD {
00035
00037 enum V4L2BufferBlockMethod{
00038 V4L2BBMselect,
00039 V4L2BBMsleep,
00040 V4L2BBMchew
00041 };
00042
00043
00044
00045
00046
00047
00048
00049 namespace Exceptions
00050 {
00053 namespace V4L2Buffer
00054 {
00057 struct All: public CVD::Exceptions::VideoBuffer::All{};
00060 struct DeviceOpen: public All {DeviceOpen(std::string dev);
00061 };
00064 struct DeviceSetup: public All {DeviceSetup(std::string dev, std::string action);
00065 };
00068 struct PutFrame: public All {PutFrame(std::string dev);
00069 };
00072 struct GetFrame: public All {GetFrame(std::string dev);
00073 };
00074 }
00075 }
00076
00077 template<class T>
00078 struct V4L2_Traits;
00079
00080 template<>
00081 struct V4L2_Traits<unsigned char>{
00082 static const unsigned int pix_code=V4L2_PIX_FMT_GREY;
00083 };
00084
00085 template<>
00086 struct V4L2_Traits<CVD::YC>{
00087 static const unsigned int pix_code=V4L2_PIX_FMT_YUYV;
00088 };
00089
00090
00091
00096 class V4L2Buffer_Base
00097 {
00098 public:
00105 V4L2Buffer_Base(const char *devname, bool fields, V4L2BufferBlockMethod block, int input, int numbufs, unsigned long int pixtpe);
00106 ~V4L2Buffer_Base();
00107
00108 ImageRef size()
00109 {
00110 return my_image_size;
00111 }
00112
00113 V4L2FrameT<unsigned char>* get_frame();
00115 void put_frame(VideoFrame<unsigned char>* f);
00117 void put_frame(V4L2FrameT<unsigned char>* f);
00118 bool frame_pending();
00119
00120 double frame_rate()
00121 {
00122 return my_frame_rate;
00123 }
00124
00125 private:
00126 std::string device;
00127 int my_dropped_frames;
00128 int my_prev_frame_no;
00129 int num_buffers;
00130 bool i_am_using_fields;
00131 double my_frame_rate;
00132 ImageRef my_image_size;
00133 V4L2BufferBlockMethod my_block_method;
00134 struct v4l2_buffer* m_sv4l2Buffer;
00135 void** m_pvVideoBuffer;
00136 int m_nVideoFileDesc;
00137
00138
00139 int my_fd;
00140
00141 V4L2Buffer_Base( V4L2Buffer_Base& copyof );
00142 int operator = ( V4L2Buffer_Base& copyof );
00143
00144 };
00145
00146 template<class T>
00147 class V4L2BufferT : public VideoBuffer<T>,
00148 public V4L2Buffer_Base
00149 {
00150 public:
00151 V4L2BufferT(const char *devname, bool fields, V4L2BufferBlockMethod block, int input=1, int numbufs=V4L2BUFFERS)
00152 :VideoBuffer<T>(VideoBufferType::Flushable),V4L2Buffer_Base(devname, fields, block, input, numbufs, V4L2_Traits<T>::pix_code)
00153 {}
00154
00155 virtual ImageRef size()
00156 {
00157 return V4L2Buffer_Base::size();
00158 }
00159
00160 virtual VideoFrame<T>* get_frame() {return reinterpret_cast<V4L2FrameT<T>*>(V4L2Buffer_Base::get_frame());}
00161
00163 virtual void put_frame(VideoFrame<T>* f) {V4L2Buffer_Base::put_frame(reinterpret_cast<V4L2FrameT<unsigned char>*>(f));}
00164
00165 virtual bool frame_pending() {return V4L2Buffer_Base::frame_pending();}
00166 virtual double frame_rate() {return V4L2Buffer_Base::frame_rate();}
00167 };
00168
00170 typedef V4L2BufferT<unsigned char> V4L2Buffer;
00171
00172 }
00173
00174 #endif
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190