Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00021
00022 #ifndef UVC_CAM_H
00023 #define UVC_CAM_H
00024
00025 #include <string>
00026 #include <linux/videodev2.h>
00027 #include <stdint.h>
00028
00029 namespace uvc_cam
00030 {
00031
00032 enum v4l2_uvc_exposure_auto_type
00033 {
00034 V4L2_UVC_EXPOSURE_MANUAL = 1,
00035 V4L2_UVC_EXPOSURE_AUTO = 2,
00036 V4L2_UVC_EXPOSURE_SHUTTER_PRIORITY = 4,
00037 V4L2_UVC_EXPOSURE_APERTURE_PRIORITY = 8
00038 };
00039
00040
00041 static const int exp_vals[]=
00042 {
00043 V4L2_UVC_EXPOSURE_MANUAL,
00044 V4L2_UVC_EXPOSURE_AUTO,
00045 V4L2_UVC_EXPOSURE_SHUTTER_PRIORITY,
00046 V4L2_UVC_EXPOSURE_APERTURE_PRIORITY
00047 };
00048
00049
00050
00051 #define CSU32 const static uint32_t
00052
00053 class Cam
00054 {
00055 public:
00056 enum mode_t { MODE_RGB, MODE_MJPG, MODE_YUYV } mode;
00057 Cam(const char *device, mode_t _mode = MODE_RGB,
00058 int _width = 640, int _height = 480, int _fps = 30);
00059 ~Cam();
00060 static void enumerate();
00061 int grab(unsigned char **frame, uint32_t &bytes_used);
00062 void release(unsigned buf_idx);
00063 bool set_auto_white_balance(bool on);
00064 void set_motion_thresholds(int lum, int count);
00065 void set_control(uint32_t id, int val);
00066 void mjpeg2rgb(char *MJPEG, int len, char *RGB, int NumPixels);
00067 private:
00068 std::string device;
00069 int fd, motion_threshold_luminance, motion_threshold_count;
00070 unsigned width, height, fps;
00071 v4l2_format fmt;
00072 v4l2_capability cap;
00073 v4l2_streamparm streamparm;
00074 v4l2_requestbuffers rb;
00075 v4l2_buffer buf;
00076 v4l2_timecode timecode;
00077 static const unsigned NUM_BUFFER = 2;
00078 void *mem[NUM_BUFFER];
00079 unsigned buf_length;
00080 unsigned char *rgb_frame, *last_yuv_frame;
00081 int init_mjpeg_decoder(int image_width, int image_height);
00082
00083
00084 CSU32 V4L2_CTRL_CLASS_USER_NEW = 0x00980000;
00085 CSU32 V4L2_CID_BASE_NEW = V4L2_CTRL_CLASS_USER_NEW | 0x900;
00086 CSU32 V4L2_CID_POWER_LINE_FREQUENCY_NEW = V4L2_CID_BASE_NEW + 24;
00087 CSU32 V4L2_CID_HUE_AUTO_NEW = V4L2_CID_BASE_NEW + 25;
00088 CSU32 V4L2_CID_WHITE_BALANCE_TEMPERATURE_NEW = V4L2_CID_BASE_NEW + 26;
00089 CSU32 V4L2_CID_SHARPNESS_NEW = V4L2_CID_BASE_NEW + 27;
00090 CSU32 V4L2_CID_BACKLIGHT_COMPENSATION_NEW = V4L2_CID_BASE_NEW + 28;
00091 CSU32 V4L2_CID_LAST_NEW = V4L2_CID_BASE_NEW + 29;
00092
00093 CSU32 V4L2_CTRL_CLASS_CAMERA_NEW = 0x009A0000;
00094 CSU32 V4L2_CID_CAMERA_CLASS_BASE_NEW = V4L2_CTRL_CLASS_CAMERA_NEW | 0x900;
00095 CSU32 V4L2_CID_EXPOSURE_AUTO_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 1;
00096 CSU32 V4L2_CID_EXPOSURE_ABSOLUTE_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 2;
00097 CSU32 V4L2_CID_EXPOSURE_AUTO_PRIORITY_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW+3;
00098 CSU32 V4L2_CID_PAN_RELATIVE_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 4;
00099 CSU32 V4L2_CID_TILT_RELATIVE_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 5;
00100 CSU32 V4L2_CID_PAN_RESET_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 6;
00101 CSU32 V4L2_CID_TILT_RESET_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 7;
00102 CSU32 V4L2_CID_PAN_ABSOLUTE_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 8;
00103 CSU32 V4L2_CID_TILT_ABSOLUTE_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 9;
00104 CSU32 V4L2_CID_FOCUS_ABSOLUTE_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 10;
00105 CSU32 V4L2_CID_FOCUS_RELATIVE_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 11;
00106 CSU32 V4L2_CID_FOCUS_AUTO_NEW = V4L2_CID_CAMERA_CLASS_BASE_NEW + 12;
00107 CSU32 V4L2_CID_CAMERA_CLASS_LAST = V4L2_CID_CAMERA_CLASS_BASE_NEW + 13;
00108
00109
00110 CSU32 V4L2_CID_PRIVATE_BASE_OLD = 0x08000000;
00111 CSU32 V4L2_CID_BACKLIGHT_COMPENSATION_OLD = V4L2_CID_PRIVATE_BASE_OLD + 0;
00112 CSU32 V4L2_CID_POWER_LINE_FREQUENCY_OLD = V4L2_CID_PRIVATE_BASE_OLD + 1;
00113 CSU32 V4L2_CID_SHARPNESS_OLD = V4L2_CID_PRIVATE_BASE_OLD + 2;
00114 CSU32 V4L2_CID_HUE_AUTO_OLD = V4L2_CID_PRIVATE_BASE_OLD + 3;
00115 CSU32 V4L2_CID_FOCUS_AUTO_OLD = V4L2_CID_PRIVATE_BASE_OLD + 4;
00116 CSU32 V4L2_CID_FOCUS_ABSOLUTE_OLD = V4L2_CID_PRIVATE_BASE_OLD + 5;
00117 CSU32 V4L2_CID_FOCUS_RELATIVE_OLD = V4L2_CID_PRIVATE_BASE_OLD + 6;
00118 CSU32 V4L2_CID_PAN_RELATIVE_OLD = V4L2_CID_PRIVATE_BASE_OLD + 7;
00119 CSU32 V4L2_CID_TILT_RELATIVE_OLD = V4L2_CID_PRIVATE_BASE_OLD + 8;
00120 CSU32 V4L2_CID_PANTILT_RESET_OLD = V4L2_CID_PRIVATE_BASE_OLD + 9;
00121 CSU32 V4L2_CID_EXPOSURE_AUTO_OLD = V4L2_CID_PRIVATE_BASE_OLD + 10;
00122 CSU32 V4L2_CID_EXPOSURE_ABSOLUTE_OLD = V4L2_CID_PRIVATE_BASE_OLD + 11;
00123 CSU32 V4L2_CID_WHITE_BALANCE_TEMP_AUTO_OLD = V4L2_CID_PRIVATE_BASE_OLD+12;
00124 CSU32 V4L2_CID_WHITE_BALANCE_TEMP_OLD = V4L2_CID_PRIVATE_BASE_OLD + 13;
00125 CSU32 V4L2_CID_PRIVATE_LAST = V4L2_CID_WHITE_BALANCE_TEMP_OLD + 1;
00126
00127 CSU32 UVC_CTRL_DATA_TYPE_RAW = 0;
00128 CSU32 UVC_CTRL_DATA_TYPE_SIGNED = 1;
00129 CSU32 UVC_CTRL_DATA_TYPE_UNSIGNED = 2;
00130 CSU32 UVC_CTRL_DATA_TYPE_BOOLEAN = 3;
00131 CSU32 UVC_CTRL_DATA_TYPE_ENUM = 4;
00132 CSU32 UVC_CTRL_DATA_TYPE_BITMASK = 5;
00133 CSU32 V4L2_CID_BASE_EXTCTR = 0x0A046D01;
00134 CSU32 V4L2_CID_BASE_LOGITECH = V4L2_CID_BASE_EXTCTR;
00135
00136
00137 CSU32 V4L2_CID_PANTILT_RESET_LOGITECH = V4L2_CID_BASE_LOGITECH + 2;
00138 CSU32 V4L2_CID_FOCUS_LOGITECH = V4L2_CID_BASE_LOGITECH + 3;
00139 CSU32 V4L2_CID_LED1_MODE_LOGITECH = V4L2_CID_BASE_LOGITECH + 4;
00140 CSU32 V4L2_CID_LED1_FREQUENCY_LOGITECH = V4L2_CID_BASE_LOGITECH + 5;
00141 CSU32 V4L2_CID_DISABLE_PROCESSING_LOGITECH = V4L2_CID_BASE_LOGITECH + 0x70;
00142 CSU32 V4L2_CID_RAW_BITS_PER_PIXEL_LOGITECH = V4L2_CID_BASE_LOGITECH + 0x71;
00143 CSU32 V4L2_CID_LAST_EXTCTR = V4L2_CID_RAW_BITS_PER_PIXEL_LOGITECH;
00144
00145 };
00146
00147 }
00148
00149 #endif
00150
00151