2525 */
2626#pragma once
2727
28+ #include < memory>
2829#include " libfreenect.h"
2930#include < stdexcept>
3031#include < sstream>
@@ -44,7 +45,7 @@ namespace Freenect {
4445 Noncopyable ( const Noncopyable& );
4546 const Noncopyable& operator =( const Noncopyable& );
4647 };
47-
48+
4849 class FreenectTiltState {
4950 friend class FreenectDevice ;
5051 FreenectTiltState (freenect_raw_tilt_state *_state):
@@ -104,17 +105,19 @@ namespace Freenect {
104105 }
105106 void setVideoFormat (freenect_video_format requested_format, freenect_resolution requested_resolution = FREENECT_RESOLUTION_MEDIUM) {
106107 if (requested_format != m_video_format || requested_resolution != m_video_resolution) {
107- bool wasRunning = (freenect_stop_video (m_dev) >= 0 );
108- freenect_frame_mode mode = freenect_find_video_mode (requested_resolution, requested_format);
108+ const bool wasRunning = (freenect_stop_video (m_dev) >= 0 );
109+ const freenect_frame_mode mode = freenect_find_video_mode (requested_resolution, requested_format);
109110 if (!mode.is_valid ) throw std::runtime_error (" Cannot set video format: invalid mode" );
110111 if (freenect_set_video_mode (m_dev, mode) < 0 ) throw std::runtime_error (" Cannot set video format" );
111- if (wasRunning)
112- freenect_start_video (m_dev);
112+
113113 m_video_format = requested_format;
114114 m_video_resolution = requested_resolution;
115- if (m_rgb_buffer != 0 ) delete[] m_rgb_buffer;
116- m_rgb_buffer = new uint8_t [getVideoBufferSize ()];
117- freenect_set_video_buffer (m_dev, m_rgb_buffer);
115+ m_rgb_buffer.reset (new uint8_t [mode.bytes ]);
116+ freenect_set_video_buffer (m_dev, m_rgb_buffer.get ());
117+
118+ if (wasRunning) {
119+ freenect_start_video (m_dev);
120+ }
118121 }
119122 }
120123 freenect_video_format getVideoFormat () {
@@ -176,7 +179,7 @@ namespace Freenect {
176179 freenect_depth_format m_depth_format;
177180 freenect_resolution m_video_resolution;
178181 freenect_resolution m_depth_resolution;
179- uint8_t * m_rgb_buffer = 0 ;
182+ std::unique_ptr< uint8_t []> m_rgb_buffer;
180183 static void freenect_depth_callback (freenect_device *dev, void *depth, uint32_t timestamp) {
181184 FreenectDevice* device = static_cast <FreenectDevice*>(freenect_get_user (dev));
182185 device->DepthCallback (depth, timestamp);
@@ -249,7 +252,7 @@ namespace Freenect {
249252 return NULL ;
250253 }
251254 protected:
252- freenect_context *m_ctx;
255+ freenect_context *m_ctx;
253256 private:
254257 volatile bool m_stop;
255258 pthread_t m_thread;
0 commit comments