Skip to content

Commit 8e25422

Browse files
smokhovxlz
authored andcommitted
ProtonectSR: Add replay and exe option handling.
add replay code invocation and option processing, but for now commenting out for merge. Make OS-indepdenent opendir(); to test.
1 parent 0666b64 commit 8e25422

File tree

2 files changed

+474
-28
lines changed

2 files changed

+474
-28
lines changed

tools/streamer_recorder/ProtonectSR.cpp

Lines changed: 102 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,19 @@
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>
@@ -43,7 +50,6 @@
4350
#include "viewer.h"
4451
#endif
4552

46-
4753
bool protonect_shutdown = false; ///< Whether the running application should shut down.
4854

4955
void 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
*/
114130
int 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(&registered,"registered");
480+
recorder.record(depth, "depth");
481+
recorder.record(&registered, "registered");
408482
// recorder.record(rgb,"rgb");
409483

410484
recorder.registTimeStamp();

0 commit comments

Comments
 (0)