From f89ed772a59c9c3e3293c6f333149f5e91ba56e2 Mon Sep 17 00:00:00 2001 From: cesandovalp Date: Sat, 15 Dec 2018 13:31:03 -0500 Subject: [PATCH 1/2] Set video buffer in setVideoFormat Signed-off-by: cesandovalp --- wrappers/cpp/libfreenect.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wrappers/cpp/libfreenect.hpp b/wrappers/cpp/libfreenect.hpp index 21498228..4373ca38 100644 --- a/wrappers/cpp/libfreenect.hpp +++ b/wrappers/cpp/libfreenect.hpp @@ -109,6 +109,9 @@ namespace Freenect { freenect_start_video(m_dev); m_video_format = requested_format; m_video_resolution = requested_resolution; + if(m_rgb_buffer != 0) delete[] m_rgb_buffer; + m_rgb_buffer = new uint8_t[getVideoBufferSize()]; + freenect_set_video_buffer(m_dev, m_rgb_buffer); } } freenect_video_format getVideoFormat() { @@ -170,6 +173,7 @@ namespace Freenect { freenect_depth_format m_depth_format; freenect_resolution m_video_resolution; freenect_resolution m_depth_resolution; + uint8_t* m_rgb_buffer = 0; static void freenect_depth_callback(freenect_device *dev, void *depth, uint32_t timestamp) { FreenectDevice* device = static_cast(freenect_get_user(dev)); device->DepthCallback(depth, timestamp); From 015db1a9d76c300dd420878c59a440637c7f58d8 Mon Sep 17 00:00:00 2001 From: cesandovalp Date: Sat, 15 Dec 2018 19:57:46 -0500 Subject: [PATCH 2/2] Video buffer memory management Signed-off-by: cesandovalp --- wrappers/cpp/libfreenect.hpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/wrappers/cpp/libfreenect.hpp b/wrappers/cpp/libfreenect.hpp index 4373ca38..1d3db068 100644 --- a/wrappers/cpp/libfreenect.hpp +++ b/wrappers/cpp/libfreenect.hpp @@ -74,6 +74,7 @@ namespace Freenect { } virtual ~FreenectDevice() { if(freenect_close_device(m_dev) < 0){} //FN_WARNING("Device did not shutdown in a clean fashion"); + delete[] m_rgb_buffer; } void startVideo() { if(freenect_start_video(m_dev) < 0) throw std::runtime_error("Cannot start RGB callback"); @@ -105,13 +106,21 @@ namespace Freenect { freenect_frame_mode mode = freenect_find_video_mode(requested_resolution, requested_format); if (!mode.is_valid) throw std::runtime_error("Cannot set video format: invalid mode"); if (freenect_set_video_mode(m_dev, mode) < 0) throw std::runtime_error("Cannot set video format"); - if (wasRunning) + if (wasRunning) { + freenect_stop_video(m_dev); + m_video_format = requested_format; + m_video_resolution = requested_resolution; + if(m_rgb_buffer != 0) delete[] m_rgb_buffer; + m_rgb_buffer = new uint8_t[getVideoBufferSize()]; + freenect_set_video_buffer(m_dev, m_rgb_buffer); freenect_start_video(m_dev); + return; + } m_video_format = requested_format; m_video_resolution = requested_resolution; if(m_rgb_buffer != 0) delete[] m_rgb_buffer; m_rgb_buffer = new uint8_t[getVideoBufferSize()]; - freenect_set_video_buffer(m_dev, m_rgb_buffer); + freenect_set_video_buffer(m_dev, m_rgb_buffer); } } freenect_video_format getVideoFormat() {