void OpenNIDevice::DepthDataThreadFunction () throw (OpenNIException) { while (running_) { // lock before checking running flag unique_lock<mutex> depth_lock (depth_mutex_); if (!running_) return; depth_condition_.wait (depth_lock); if (!running_) return; depth_generator_.WaitAndUpdateData (); xn::DepthMetaData depth_data; depth_generator_.GetMetaData (depth_data); depth_lock.unlock (); DepthImage depth_image (depth_data, baseline_, getDepthFocalLength (), shadow_value_, no_sample_value_); for (map< OpenNIDevice::CallbackHandle, ActualDepthImageCallbackFunction >::iterator callbackIt = depth_callback_.begin (); callbackIt != depth_callback_.end (); ++callbackIt) { callbackIt->second.operator()(depth_image); } } }
/** * Reallocate the video buffer if the video format or resolution changes */ void allocateBufferVideo( ImageBuffer& buffer, const freenect_video_format& format, const freenect_resolution& resolution, const freenect_registration& registration) { // Obtain a lock on the buffer. This is mostly for debugging, as allocate // buffer should only be called when the buffer is not being used by the // freenect thread boost::lock_guard<boost::mutex> buffer_lock(buffer.mutex); // Deallocate the buffer incase an exception happens (the buffer should no // longer be valid) buffer.image_buffer.reset(); switch (format) { case FREENECT_VIDEO_RGB: case FREENECT_VIDEO_BAYER: case FREENECT_VIDEO_YUV_RGB: case FREENECT_VIDEO_IR_8BIT: case FREENECT_VIDEO_IR_10BIT: case FREENECT_VIDEO_IR_10BIT_PACKED: switch (resolution) { case FREENECT_RESOLUTION_HIGH: case FREENECT_RESOLUTION_MEDIUM: buffer.metadata = freenect_find_video_mode(resolution, format); if (!buffer.metadata.is_valid) { throw std::runtime_error("libfreenect: Invalid video fmt, res: " + boost::lexical_cast<std::string>(format) + "," + boost::lexical_cast<std::string>(resolution)); } break; default: throw std::runtime_error("libfreenect: Invalid video resolution: " + boost::lexical_cast<std::string>(resolution)); } break; default: throw std::runtime_error("libfreenect: Invalid video format: " + boost::lexical_cast<std::string>(format)); } // All is good, reallocate the buffer and calculate other pieces of info buffer.image_buffer.reset(new unsigned char[buffer.metadata.bytes]); switch(format) { case FREENECT_VIDEO_RGB: case FREENECT_VIDEO_BAYER: case FREENECT_VIDEO_YUV_RGB: buffer.focal_length = getRGBFocalLength(buffer.metadata.width); break; case FREENECT_VIDEO_IR_8BIT: case FREENECT_VIDEO_IR_10BIT: case FREENECT_VIDEO_IR_10BIT_PACKED: buffer.focal_length = getDepthFocalLength(registration, buffer.metadata.width); break; default: throw std::runtime_error("libfreenect: shouldn't reach here"); } buffer.is_registered = false; }