@@ -61,7 +61,9 @@ namespace Freenect {
6161
6262 class FreenectDevice : Noncopyable {
6363 public:
64- FreenectDevice (freenect_context *_ctx, int _index) {
64+ FreenectDevice (freenect_context *_ctx, int _index)
65+ : m_video_resolution(FREENECT_RESOLUTION_MEDIUM), m_depth_resolution(FREENECT_RESOLUTION_MEDIUM)
66+ {
6567 if (freenect_open_device (_ctx, &m_dev, _index) < 0 ) throw std::runtime_error (" Cannot open Kinect" );
6668 freenect_set_user (m_dev, this );
6769 freenect_set_video_mode (m_dev, freenect_find_video_mode (FREENECT_RESOLUTION_MEDIUM, FREENECT_VIDEO_RGB));
@@ -96,32 +98,40 @@ namespace Freenect {
9698 FreenectTiltState getState () const {
9799 return FreenectTiltState (freenect_get_tilt_state (m_dev));
98100 }
99- void setVideoFormat (freenect_video_format requested_format) {
100- if (requested_format != m_video_format) {
101+ void setVideoFormat (freenect_video_format requested_format, freenect_resolution requested_resolution = FREENECT_RESOLUTION_MEDIUM ) {
102+ if (requested_format != m_video_format || requested_resolution != m_video_resolution ) {
101103 freenect_stop_video (m_dev);
102- freenect_frame_mode mode = freenect_find_video_mode (FREENECT_RESOLUTION_MEDIUM , requested_format);
104+ freenect_frame_mode mode = freenect_find_video_mode (requested_resolution , requested_format);
103105 if (!mode.is_valid ) throw std::runtime_error (" Cannot set video format: invalid mode" );
104106 if (freenect_set_video_mode (m_dev, mode) < 0 ) throw std::runtime_error (" Cannot set video format" );
105107 freenect_start_video (m_dev);
106108 m_video_format = requested_format;
109+ m_video_resolution = requested_resolution;
107110 }
108111 }
109112 freenect_video_format getVideoFormat () {
110113 return m_video_format;
111114 }
112- void setDepthFormat (freenect_depth_format requested_format) {
113- if (requested_format != m_depth_format) {
115+ freenect_resolution getVideoResolution () {
116+ return m_video_resolution;
117+ }
118+ void setDepthFormat (freenect_depth_format requested_format, freenect_resolution requested_resolution = FREENECT_RESOLUTION_MEDIUM) {
119+ if (requested_format != m_depth_format || requested_resolution != m_depth_resolution) {
114120 freenect_stop_depth (m_dev);
115- freenect_frame_mode mode = freenect_find_depth_mode (FREENECT_RESOLUTION_MEDIUM , requested_format);
121+ freenect_frame_mode mode = freenect_find_depth_mode (requested_resolution , requested_format);
116122 if (!mode.is_valid ) throw std::runtime_error (" Cannot set depth format: invalid mode" );
117123 if (freenect_set_depth_mode (m_dev, mode) < 0 ) throw std::runtime_error (" Cannot set depth format" );
118124 freenect_start_depth (m_dev);
119125 m_depth_format = requested_format;
126+ m_depth_resolution = requested_resolution;
120127 }
121128 }
122129 freenect_depth_format getDepthFormat () {
123130 return m_depth_format;
124131 }
132+ freenect_resolution getDepthResolution () {
133+ return m_depth_resolution;
134+ }
125135 // Do not call directly even in child
126136 virtual void VideoCallback (void *video, uint32_t timestamp) = 0;
127137 // Do not call directly even in child
@@ -136,7 +146,7 @@ namespace Freenect {
136146 case FREENECT_VIDEO_IR_10BIT_PACKED:
137147 case FREENECT_VIDEO_YUV_RGB:
138148 case FREENECT_VIDEO_YUV_RAW:
139- return freenect_find_video_mode (FREENECT_RESOLUTION_MEDIUM , m_video_format).bytes ;
149+ return freenect_find_video_mode (m_video_resolution , m_video_format).bytes ;
140150 default :
141151 return 0 ;
142152 }
@@ -148,6 +158,8 @@ namespace Freenect {
148158 freenect_device *m_dev;
149159 freenect_video_format m_video_format;
150160 freenect_depth_format m_depth_format;
161+ freenect_resolution m_video_resolution;
162+ freenect_resolution m_depth_resolution;
151163 static void freenect_depth_callback (freenect_device *dev, void *depth, uint32_t timestamp) {
152164 FreenectDevice* device = static_cast <FreenectDevice*>(freenect_get_user (dev));
153165 device->DepthCallback (depth, timestamp);
0 commit comments