@@ -61,7 +61,9 @@ namespace Freenect {
6161
6262class 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+ {
6567if (freenect_open_device (_ctx, &m_dev, _index) < 0 ) throw std::runtime_error (" Cannot open Kinect" );
6668freenect_set_user (m_dev, this );
6769freenect_set_video_mode (m_dev, freenect_find_video_mode (FREENECT_RESOLUTION_MEDIUM, FREENECT_VIDEO_RGB));
@@ -96,32 +98,40 @@ namespace Freenect {
9698FreenectTiltState getState () const {
9799return 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 ) {
101103freenect_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);
103105if (!mode.is_valid ) throw std::runtime_error (" Cannot set video format: invalid mode" );
104106if (freenect_set_video_mode (m_dev, mode) < 0 ) throw std::runtime_error (" Cannot set video format" );
105107freenect_start_video (m_dev);
106108m_video_format = requested_format;
109+ m_video_resolution = requested_resolution;
107110}
108111}
109112freenect_video_format getVideoFormat () {
110113return 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) {
114120freenect_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);
116122if (!mode.is_valid ) throw std::runtime_error (" Cannot set depth format: invalid mode" );
117123if (freenect_set_depth_mode (m_dev, mode) < 0 ) throw std::runtime_error (" Cannot set depth format" );
118124freenect_start_depth (m_dev);
119125m_depth_format = requested_format;
126+ m_depth_resolution = requested_resolution;
120127}
121128}
122129freenect_depth_format getDepthFormat () {
123130return m_depth_format;
124131}
132+ freenect_resolution getDepthResolution () {
133+ return m_depth_resolution;
134+ }
125135// Do not call directly even in child
126136virtual void VideoCallback (void *video, uint32_t timestamp) = 0;
127137// Do not call directly even in child
@@ -136,7 +146,7 @@ namespace Freenect {
136146case FREENECT_VIDEO_IR_10BIT_PACKED:
137147case FREENECT_VIDEO_YUV_RGB:
138148case 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 ;
140150default :
141151return 0 ;
142152}
@@ -148,6 +158,8 @@ namespace Freenect {
148158freenect_device *m_dev;
149159freenect_video_format m_video_format;
150160freenect_depth_format m_depth_format;
161+ freenect_resolution m_video_resolution;
162+ freenect_resolution m_depth_resolution;
151163static void freenect_depth_callback (freenect_device *dev, void *depth, uint32_t timestamp) {
152164FreenectDevice* device = static_cast <FreenectDevice*>(freenect_get_user (dev));
153165device->DepthCallback (depth, timestamp);
0 commit comments