camera_usb
cam_config.h
Go to the documentation of this file.
1 /*
2  * \file cam_gst.h
3  *
4  * \brief Allows to create a default GStreamer pipeline, which requests images using v4l2,
5  * converts them to jpegs and gives access to the image data.
6  *
7  * German Research Center for Artificial Intelligence\n
8  * Project: Rimres
9  *
10  * \date 23.11.11
11  *
12  * \author Stefan.Haase@dfki.de
13  */
14 
15 #ifndef _CAM_V4L2_CONFIG_H_
16 #define _CAM_V4L2_CONFIG_H_
17 
18 // for v4l2 api (everything required?)
19 #include <errno.h>
20 #include <fcntl.h> // for open()
21 #include <linux/videodev2.h>
22 #include <stdint.h>
23 #include <stdio.h>
24 #include <string.h>
25 #include <sys/ioctl.h>
26 #include <sys/mman.h>
27 #include <unistd.h>
28 #include <sys/types.h>
29 #include <sys/time.h>
30 #include <stdlib.h>
31 
32 // e-CAM32 v4l2 controls
33 #include "omap_v4l2.h"
34 
35 #include <map>
36 #include <stdexcept>
37 #include <string>
38 #include <vector>
39 #include <set>
40 #include <iostream>
41 
42 #include <base-logging/Logging.hpp>
43 
44 #include <base/samples/Frame.hpp>
45 
46 #include "helpers.h"
47 
48 namespace camera
49 {
50 
56 class CamConfigException : public std::runtime_error {
57  public:
58  CamConfigException(const std::string& what_arg) : std::runtime_error(what_arg) {}
59 };
60 
67 class CamConfig
68 {
69  public: // STRUCTURES
73  struct CamCtrl {
74  public:
75  CamCtrl() : mCtrl(), mMenuItems(), mValue(0),
76  mWriteable(true), mReadable(true) {
77  memset(&mCtrl, 0, sizeof(struct v4l2_queryctrl));
78  }
79 
81  }
82 
83  struct v4l2_queryctrl mCtrl;
84  std::vector<std::string> mMenuItems;
85  int32_t mValue;
86  bool mWriteable; // Above values are set to zero.
87  bool mReadable;
88  };
89 
90  public: // CAMCONFIG
98  CamConfig(std::string const& device);
99 
100  ~CamConfig();
101 
102  inline int getFd() {
103  return mFd;
104  }
105 
106  public: // CAPABILITY
107  void readCapability();
108 
109  void listCapabilities();
110 
111  std::string getCapabilityDriver();
112 
113  std::string getCapabilityCard();
114 
115  std::string getCapabilityBusInfo();
116 
117  std::string getCapabilityVersion();
118 
123  bool hasCapability(uint32_t capability_field);
124 
125  public: // CONTROL
132  void readControl();
133 
137  void readControl(struct v4l2_queryctrl& queryctrl_tmp);
138 
147  int32_t readControlValue(uint32_t const id);
148 
158  void writeControlValue(uint32_t const id, int32_t value, bool just_write=false);
159 
163  std::vector<uint32_t> getControlValidIDs();
164 
168  std::vector<struct CamConfig::CamCtrl> getControlList();
169 
170  void listControls();
171 
175  bool isControlIdValid(uint32_t const id) const;
176 
181  bool isControlIdWritable(uint32_t const id) const;
182 
187  bool getControlValue(uint32_t const id, int32_t* value);
188 
189  bool getControlType(uint32_t const id, uint32_t* type);
190 
191  bool getControlName(uint32_t const id, std::string* name);
192 
193  bool getControlMinimum(uint32_t const id, int32_t* minimum);
194 
195  bool getControlMaximum(uint32_t const id, int32_t* maximum);
196 
197  bool getControlStep(uint32_t const id, int32_t* step);
198 
199  bool getControlDefaultValue(uint32_t const id, int32_t* default_value);
200 
208  bool getControlFlag(uint32_t const id, uint32_t const flag, bool* set);
209 
215 
216  public: // IMAGE
217  void readImageFormat();
218 
228  void writeImagePixelFormat(uint32_t const width=0, uint32_t const height=0,
229  uint32_t const pixelformat=0);
230 
231  void listImageFormat();
232 
233  bool getImageWidth(uint32_t* width);
234 
235  bool getImageHeight(uint32_t* height);
236 
237  bool getImagePixelformat(uint32_t* pixelformat);
238 
239  bool getImagePixelformatString(std::string* pixelformat_str);
240 
244  bool getImageField(uint32_t* field);
245 
249  bool getImageBytesperline(uint32_t* bytesperline);
250 
251  bool getImageSizeimage(uint32_t* sizeimage);
252 
253  bool getImageColorspace(uint32_t* colorspace);
254 
261  uint32_t toV4L2ImageFormat(base::samples::frame::frame_mode_t mode);
262 
263  public: // STREAMPARM, not suoported by e-CAM32!
264  void readStreamparm();
265 
270  void writeStreamparm(uint32_t const numerator, uint32_t const denominator);
271 
272  void listStreamparm();
273 
277  bool readFPS(float* fps);
278 
283  void writeFPS(uint32_t const fps);
284 
292  bool getFPS(float* fps);
293 
298  bool hasCapabilityStreamparm(uint32_t capability_field);
299 
304  bool hasCapturemodeStreamparm(uint32_t capturemode);
305 
306  public: // REQUEST IMAGE
307 
308  void initRequesting();
309 
313  bool isImageAvailable(int32_t timeout_ms);
314 
319  bool getBuffer(std::vector<uint8_t>& buffer, bool blocking_read, int32_t timeout_ms);
320 
321  void cleanupRequesting();
322 
323  private:
324  int mFd;
325 
326  // Capability
327  struct v4l2_capability mCapability;
328  // Control
329  std::map<uint32_t, struct CamCtrl> mCamCtrls;
330  // Image
331  struct v4l2_format mFormat;
332  struct v4l2_cropcap mCropcap;
333  std::vector<struct v4l2_fmtdesc> mFormatDescriptions;
334  // Stream
335  struct v4l2_streamparm mStreamparm;
336  // Used to collect all controls depending on another control.
337  // E.g. V4L2_CID_FOCUS_ABSOLUTE and V4L2_CID_FOCUS_RELATIVE can only be changed
338  // if V4L2_CID_FOCUS_AUTO is set to 0 (manual).
339  std::set<uint32_t> mAutoManualDependentControlIds;
340  // Points to the image which has been requested via ioctl.
341  uint8_t* mmapBuffer;
342  bool mStreamingActivated;
343  bool mConversionRequiredYUYV2RGB; // YUVU is not yet supported by Rock.
344  Helpers helpers;
345 
346  CamConfig() {}
347 
351  void getQueryBuffer(struct v4l2_buffer& query_buffer);
352 
356  int xioctl(int fd, int request, void *arg);
357 
358 };
359 
360 } // end namespace camera
361 
362 #endif
struct v4l2_queryctrl mCtrl
Definition: cam_config.h:83
int32_t readControlValue(uint32_t const id)
Definition: cam_config.cpp:429
bool getControlMaximum(uint32_t const id, int32_t *maximum)
Definition: cam_config.cpp:627
void writeImagePixelFormat(uint32_t const width=0, uint32_t const height=0, uint32_t const pixelformat=0)
Definition: cam_config.cpp:756
CamCtrl()
Definition: cam_config.h:75
void writeControlValue(uint32_t const id, int32_t value, bool just_write=false)
Definition: cam_config.cpp:446
bool getFPS(float *fps)
Definition: cam_config.cpp:1066
std::string getCapabilityDriver()
Definition: cam_config.cpp:130
bool mWriteable
Definition: cam_config.h:86
std::vector< uint32_t > getControlValidIDs()
Definition: cam_config.cpp:516
bool getBuffer(std::vector< uint8_t > &buffer, bool blocking_read, int32_t timeout_ms)
Definition: cam_config.cpp:1175
bool getControlMinimum(uint32_t const id, int32_t *minimum)
Definition: cam_config.cpp:613
std::string getCapabilityCard()
Definition: cam_config.cpp:136
bool getImageSizeimage(uint32_t *sizeimage)
Definition: cam_config.cpp:896
bool getControlName(uint32_t const id, std::string *name)
Definition: cam_config.cpp:596
void readStreamparm()
Definition: cam_config.cpp:960
bool hasCapturemodeStreamparm(uint32_t capturemode)
Definition: cam_config.cpp:1087
void initRequesting()
Definition: cam_config.cpp:1105
Definition: cam_config.h:56
bool getControlValue(uint32_t const id, int32_t *value)
Definition: cam_config.cpp:568
bool readFPS(float *fps)
Definition: cam_config.cpp:1041
std::vector< std::string > mMenuItems
Definition: cam_config.h:84
bool getImagePixelformatString(std::string *pixelformat_str)
Definition: cam_config.cpp:858
void listImageFormat()
Definition: cam_config.cpp:788
bool getImagePixelformat(uint32_t *pixelformat)
Definition: cam_config.cpp:849
void readImageFormat()
Definition: cam_config.cpp:706
bool getImageWidth(uint32_t *width)
Definition: cam_config.cpp:831
void listCapabilities()
Definition: cam_config.cpp:84
bool getImageHeight(uint32_t *height)
Definition: cam_config.cpp:840
std::string getCapabilityBusInfo()
Definition: cam_config.cpp:142
bool getControlDefaultValue(uint32_t const id, int32_t *default_value)
Definition: cam_config.cpp:655
CamConfigException(const std::string &what_arg)
Definition: cam_config.h:58
uint32_t toV4L2ImageFormat(base::samples::frame::frame_mode_t mode)
Definition: cam_config.cpp:918
bool getControlFlag(uint32_t const id, uint32_t const flag, bool *set)
Definition: cam_config.cpp:669
Definition: cam_config.h:73
Definition: cam_config.h:67
bool mReadable
Definition: cam_config.h:87
void cleanupRequesting()
Definition: cam_config.cpp:1214
std::string getCapabilityVersion()
Definition: cam_config.cpp:148
bool getImageField(uint32_t *field)
Definition: cam_config.cpp:874
bool isControlIdValid(uint32_t const id) const
Definition: cam_config.cpp:559
Definition: helpers.h:24
bool hasCapability(uint32_t capability_field)
Definition: cam_config.cpp:155
void writeStreamparm(uint32_t const numerator, uint32_t const denominator)
Definition: cam_config.cpp:977
bool getControlStep(uint32_t const id, int32_t *step)
Definition: cam_config.cpp:641
int getFd()
Definition: cam_config.h:102
void readControl()
Definition: cam_config.cpp:173
void setControlValuesToDefault()
Definition: cam_config.cpp:695
int32_t mValue
Definition: cam_config.h:85
bool getControlType(uint32_t const id, uint32_t *type)
Definition: cam_config.cpp:582
bool getImageBytesperline(uint32_t *bytesperline)
Definition: cam_config.cpp:885
void listStreamparm()
Definition: cam_config.cpp:1012
bool isControlIdWritable(uint32_t const id) const
Definition: cam_config.cpp:564
bool hasCapabilityStreamparm(uint32_t capability_field)
Definition: cam_config.cpp:1070
~CamConfig()
Definition: cam_config.cpp:63
std::vector< struct CamConfig::CamCtrl > getControlList()
Definition: cam_config.cpp:527
bool getImageColorspace(uint32_t *colorspace)
Definition: cam_config.cpp:907
void readCapability()
Definition: cam_config.cpp:69
bool isImageAvailable(int32_t timeout_ms)
Definition: cam_config.cpp:1146
void listControls()
Definition: cam_config.cpp:538
~CamCtrl()
Definition: cam_config.h:80
void writeFPS(uint32_t const fps)
Definition: cam_config.cpp:1057