Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 #include <pcl/pcl_config.h>
00039 #ifdef HAVE_OPENNI
00040 
00041 #ifdef __GNUC__
00042 #pragma GCC diagnostic ignored "-Wold-style-cast"
00043 #endif
00044 
00045 #include <pcl/io/openni_camera/openni_device_oni.h>
00046 #include <pcl/io/openni_camera/openni_image_rgb24.h>
00047 
00049 openni_wrapper::DeviceONI::DeviceONI (
00050     xn::Context& context, 
00051     const std::string& file_name, 
00052     bool repeat, 
00053     bool streaming)
00054   : OpenNIDevice (context)
00055   , streaming_  (streaming)
00056   , depth_stream_running_ (false)
00057   , image_stream_running_ (false)
00058   , ir_stream_running_ (false)
00059 {
00060   XnStatus status;
00061 #if (XN_MINOR_VERSION >= 3)
00062   status = context_.OpenFileRecording (file_name.c_str(), player_);
00063   if (status != XN_STATUS_OK)
00064     THROW_OPENNI_EXCEPTION ("Could not open ONI file. Reason: %s", xnGetStatusString (status));
00065 #else
00066   status = context_.OpenFileRecording (file_name.c_str());
00067   if (status != XN_STATUS_OK)
00068     THROW_OPENNI_EXCEPTION ("Could not open ONI file. Reason: %s", xnGetStatusString (status));
00069 
00070   status = context_.FindExistingNode (XN_NODE_TYPE_PLAYER, player_);
00071   if (status != XN_STATUS_OK)
00072     THROW_OPENNI_EXCEPTION ("Failed to find player node: %s\n", xnGetStatusString (status));
00073 #endif
00074 
00075   status = context_.FindExistingNode (XN_NODE_TYPE_DEPTH, depth_generator_);
00076   if (status != XN_STATUS_OK)
00077     THROW_OPENNI_EXCEPTION ("could not find depth stream in file %s. Reason: %s", file_name.c_str(), xnGetStatusString (status));
00078   else
00079   {
00080     available_depth_modes_.push_back (getDepthOutputMode ());
00081     depth_generator_.RegisterToNewDataAvailable (static_cast<xn::StateChangedHandler> (NewONIDepthDataAvailable), this, depth_callback_handle_);
00082   }
00083 
00084   status = context_.FindExistingNode (XN_NODE_TYPE_IMAGE, image_generator_);
00085   if (status == XN_STATUS_OK)
00086   {
00087     available_image_modes_.push_back (getImageOutputMode ());
00088     image_generator_.RegisterToNewDataAvailable (static_cast<xn::StateChangedHandler> (NewONIImageDataAvailable), this, image_callback_handle_);
00089   }
00090 
00091   status = context_.FindExistingNode(XN_NODE_TYPE_IR, ir_generator_);
00092   if (status == XN_STATUS_OK)
00093     ir_generator_.RegisterToNewDataAvailable (static_cast<xn::StateChangedHandler> (NewONIIRDataAvailable), this, ir_callback_handle_);
00094 
00095   device_node_info_ = player_.GetInfo ();
00096   Init ();
00097 
00098   player_.SetRepeat (repeat);
00099   if (streaming_)
00100     player_thread_ = boost::thread (&DeviceONI::PlayerThreadFunction, this);
00101 }
00102 
00104 openni_wrapper::DeviceONI::~DeviceONI() throw ()
00105 {
00106   if (streaming_)
00107   {
00108     quit_ = true;
00109     player_thread_.join();
00110   }
00111 }
00112 
00114 void 
00115 openni_wrapper::DeviceONI::startImageStream ()
00116 {
00117   if (hasImageStream() && !image_stream_running_)
00118     image_stream_running_ = true;
00119 }
00120 
00122 void 
00123 openni_wrapper::DeviceONI::stopImageStream ()
00124 {
00125   if (hasImageStream() && image_stream_running_)
00126     image_stream_running_ = false;
00127 }
00128 
00130 void 
00131 openni_wrapper::DeviceONI::startDepthStream ()
00132 {
00133   if (hasDepthStream() && !depth_stream_running_)
00134     depth_stream_running_ = true;
00135 }
00136 
00138 void 
00139 openni_wrapper::DeviceONI::stopDepthStream ()
00140 {
00141   if (hasDepthStream() && depth_stream_running_)
00142     depth_stream_running_ = false;
00143 }
00144 
00146 void 
00147 openni_wrapper::DeviceONI::startIRStream ()
00148 {
00149   if (hasIRStream() && !ir_stream_running_)
00150     ir_stream_running_ = true;
00151 }
00152 
00154 void 
00155 openni_wrapper::DeviceONI::stopIRStream ()
00156 {
00157   if (hasIRStream() && ir_stream_running_)
00158     ir_stream_running_ = false;
00159 }
00160 
00162 bool 
00163 openni_wrapper::DeviceONI::isImageStreamRunning () const throw ()
00164 {
00165  return (image_stream_running_);
00166 }
00167 
00169 bool 
00170 openni_wrapper::DeviceONI::isDepthStreamRunning () const throw ()
00171 {
00172   return (depth_stream_running_);
00173 }
00174 
00176 bool 
00177 openni_wrapper::DeviceONI::isIRStreamRunning () const throw ()
00178 {
00179   return (ir_stream_running_);
00180 }
00181 
00183 bool 
00184 openni_wrapper::DeviceONI::trigger (int relative_offset)
00185 {
00186   if (streaming_)
00187     THROW_OPENNI_EXCEPTION ("Virtual device is in streaming mode. Trigger not available.");
00188 
00189   if (relative_offset < 0)
00190   {
00191     XnStatus res = player_.SeekToFrame (depth_generator_.GetName (), relative_offset, XN_PLAYER_SEEK_CUR);
00192     if (res != XN_STATUS_OK) 
00193       return (false); 
00194   }
00195   else
00196   {
00197     if (player_.IsEOF ())
00198       return (false);
00199   }
00200 
00201   player_.ReadNext ();
00202   return (true);
00203 }
00204 
00206 bool 
00207 openni_wrapper::DeviceONI::isStreaming () const throw ()
00208 {
00209   return (streaming_);
00210 }
00211 
00213 void 
00214 openni_wrapper::DeviceONI::PlayerThreadFunction ()
00215 {
00216   quit_ = false;
00217   while (!quit_)
00218     player_.ReadNext ();
00219 }
00220 
00222 void __stdcall 
00223 openni_wrapper::DeviceONI::NewONIDepthDataAvailable (xn::ProductionNode&, void* cookie) throw ()
00224 {
00225   DeviceONI* device = reinterpret_cast<DeviceONI*>(cookie);
00226   if (device->depth_stream_running_)
00227     device->depth_condition_.notify_all ();
00228 }
00229 
00231 void __stdcall 
00232 openni_wrapper::DeviceONI::NewONIImageDataAvailable (xn::ProductionNode&, void* cookie) throw ()
00233 {
00234   DeviceONI* device = reinterpret_cast<DeviceONI*> (cookie);
00235   if (device->image_stream_running_)
00236     device->image_condition_.notify_all ();
00237 }
00238 
00240 void __stdcall 
00241 openni_wrapper::DeviceONI::NewONIIRDataAvailable (xn::ProductionNode&, void* cookie) throw ()
00242 {
00243   DeviceONI* device = reinterpret_cast<DeviceONI*> (cookie);
00244   if (device->ir_stream_running_)
00245     device->ir_condition_.notify_all ();
00246 }
00247 
00249 boost::shared_ptr<openni_wrapper::Image> 
00250 openni_wrapper::DeviceONI::getCurrentImage(boost::shared_ptr<xn::ImageMetaData> image_meta_data) const throw ()
00251 {
00252   return (boost::shared_ptr<openni_wrapper::Image> (new openni_wrapper::ImageRGB24 (image_meta_data)));
00253 }
00254 
00256 bool 
00257 openni_wrapper::DeviceONI::isImageResizeSupported(unsigned input_width, unsigned input_height, unsigned output_width, unsigned output_height) const throw ()
00258 {
00259   return (openni_wrapper::ImageRGB24::resizingSupported (input_width, input_height, output_width, output_height));
00260 }
00261 
00262 #endif //HAVE_OPENNI
00263