2424 * either License.
2525 */
2626
27- /* * @file Protonect .cpp Main application file. */
27+ /* * @file ProtonectSR .cpp Main tool application file. */
2828
2929#include < iostream>
3030#include < cstdlib>
3131#include < signal.h>
3232
33+ // For replay devices
34+ #if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__)
35+ #include < msdirent.h>
36+ #else
37+ #include < dirent.h>
38+ #endif
39+
3340// / [headers]
3441#include < libfreenect2/libfreenect2.hpp>
3542#include < libfreenect2/frame_listener_impl.h>
4350#include " viewer.h"
4451#endif
4552
46-
4753bool protonect_shutdown = false ; // /< Whether the running application should shut down.
4854
4955void sigint_handler (int s)
@@ -98,6 +104,15 @@ class MyFileLogger: public libfreenect2::Logger
98104};
99105// / [logger]
100106
107+ bool hasSuffix (const std::string& str, const std::string& suffix)
108+ {
109+ if (str.length () < suffix.length ())
110+ {
111+ return false ;
112+ }
113+ return str.compare (str.length () - suffix.length (), suffix.length (), suffix) == 0 ;
114+ }
115+
101116// / [main]
102117/* *
103118 * Main application entry point.
@@ -110,6 +125,7 @@ class MyFileLogger: public libfreenect2::Logger
110125 * - -noviewer Disable viewer window.
111126 * - -streamer Enable UDP Streaming of captured images.
112127 * - -recorder Enable recording of captured images.
128+ * - -replay Enable replay of captured images.
113129 */
114130int main (int argc, char *argv[])
115131// / [main]
@@ -119,10 +135,13 @@ int main(int argc, char *argv[])
119135 std::cerr << " Environment variables: LOGFILE=<protonect.log>" << std::endl;
120136 std::cerr << " Usage: " << program_path << " [-gpu=<id>] [gl | cl | clkde | cuda | cudakde | cpu] [<device serial>]" << std::endl;
121137 std::cerr << " [-noviewer] [-norgb | -nodepth] [-help] [-version]" << std::endl;
138+ std::cerr << " [-recorder] [-streamer] [-replay]" << std::endl;
122139 std::cerr << " [-frames <number of frames to process>]" << std::endl;
123- std::cerr << " To pause and unpause: pkill -USR1 Protonect " << std::endl;
124- size_t executable_name_idx = program_path.rfind (" Protonect " );
140+ std::cerr << " To pause and unpause: pkill -USR1 ProtonectSR " << std::endl;
141+ size_t executable_name_idx = program_path.rfind (" ProtonectSR " );
125142
143+ const std::string prog (argv[0 ]);
144+
126145 std::string binpath = " /" ;
127146
128147 if (executable_name_idx != std::string::npos)
@@ -149,6 +168,8 @@ int main(int argc, char *argv[])
149168
150169// / [context]
151170 libfreenect2::Freenect2 freenect2;
171+ // TODO: enable on merge
172+ // libfreenect2::Freenect2Replay freenect2replay;
152173 libfreenect2::Freenect2Device *dev = 0 ;
153174 libfreenect2::PacketPipeline *pipeline = 0 ;
154175// / [context]
@@ -158,6 +179,7 @@ int main(int argc, char *argv[])
158179 bool viewer_enabled = true ;
159180 bool streamer_enabled = false ;
160181 bool recorder_enabled = false ;
182+ bool replay_enabled = false ;
161183 bool enable_rgb = true ;
162184 bool enable_depth = true ;
163185 int deviceId = -1 ;
@@ -258,14 +280,18 @@ int main(int argc, char *argv[])
258280 return -1 ;
259281 }
260282 }
261- else if (arg == " -streamer" || arg == " --streamer" )
283+ else if (arg == " -streamer" || arg == " --streamer" || prog == " freenect2-stream " )
262284 {
263285 streamer_enabled = true ;
264286 }
265- else if (arg == " -recorder" || arg == " --recorder" )
287+ else if (arg == " -recorder" || arg == " --recorder" || prog == " freenect2-record " )
266288 {
267289 recorder_enabled = true ;
268290 }
291+ else if (arg == " -replay" || arg == " --replay" || prog == " freenect2-replay" )
292+ {
293+ replay_enabled = true ;
294+ }
269295 else
270296 {
271297 std::cout << " Unknown argument: " << arg << std::endl;
@@ -279,27 +305,75 @@ int main(int argc, char *argv[])
279305 }
280306
281307// / [discovery]
282- if (freenect2. enumerateDevices () == 0 )
308+ if (replay_enabled == false )
283309 {
284- std::cout << " no device connected!" << std::endl;
285- return -1 ;
286- }
310+ if (freenect2.enumerateDevices () == 0 )
311+ {
312+ std::cout << " no device connected!" << std::endl;
313+ return -1 ;
314+ }
287315
288- if (serial == " " )
289- {
290- serial = freenect2.getDefaultDeviceSerialNumber ();
316+ if (serial == " " )
317+ {
318+ serial = freenect2.getDefaultDeviceSerialNumber ();
319+ }
291320 }
292321// / [discovery]
293322
294- if (pipeline )
323+ if (replay_enabled == false )
295324 {
325+ if (pipeline)
326+ {
296327// / [open]
297- dev = freenect2.openDevice (serial, pipeline);
328+ dev = freenect2.openDevice (serial, pipeline);
298329// / [open]
330+ }
331+ else
332+ {
333+ dev = freenect2.openDevice (serial);
334+ }
299335 }
300336 else
301337 {
302- dev = freenect2.openDevice (serial);
338+ DIR *d;
339+ struct dirent *dir;
340+
341+ std::vector<std::string> frame_filenames;
342+
343+ d = opendir (" recordings/depth" );
344+
345+ if (!d)
346+ {
347+ std::cerr << " Could not open directory " << dir << " for replay." << std::endl;
348+ exit (1 );
349+ }
350+
351+ while ((dir = readdir (d)) != NULL )
352+ {
353+ std::string name = dir->d_name ;
354+
355+ if (hasSuffix (name, " .depth" ))
356+ {
357+ frame_filenames.push_back (name);
358+ }
359+ else
360+ {
361+ std::cerr << " Skipping currently unsupported frame filename: " << name << std::endl;
362+ }
363+ }
364+ // TODO: enable on merge
365+ /*
366+ if(pipeline)
367+ {
368+ /// [open]
369+ dev = freenect2replay.openDevice(frame_filenames, pipeline);
370+ /// [open]
371+ }
372+ else
373+ {
374+ dev = freenect2replay.openDevice(frame_filenames);
375+ }
376+ */
303377 }
304378
305379 if (dev == 0 )
@@ -359,18 +433,18 @@ int main(int argc, char *argv[])
359433 viewer_enabled = false ;
360434#endif
361435
362- Streamer streamer; // have to declare it outside statements to be accessible everywhere
363- Recorder recorder;
436+ Streamer streamer; // have to declare it outside statements to be accessible everywhere
437+ Recorder recorder;
364438
365- if (streamer_enabled)
366- {
367- streamer.initialize ();
368- }
439+ if (streamer_enabled)
440+ {
441+ streamer.initialize ();
442+ }
369443
370- if (recorder_enabled)
371- {
372- recorder.initialize ();
373- }
444+ if (recorder_enabled)
445+ {
446+ recorder.initialize ();
447+ }
374448
375449// / [loop start]
376450 while (!protonect_shutdown && (framemax == (size_t )-1 || framecount < framemax))
@@ -403,8 +477,8 @@ if (recorder_enabled)
403477 {
404478 // TODO: add recording timestamp if max frame number reached
405479 // + avoid recording new ones
406- recorder.record (depth," depth" );
407- recorder.record (®istered," registered" );
480+ recorder.record (depth, " depth" );
481+ recorder.record (®istered, " registered" );
408482 // recorder.record(rgb,"rgb");
409483
410484 recorder.registTimeStamp ();
0 commit comments