Skip to content

Commit 9c23155

Browse files
committed
Clean up depth stream parser
Remove magic footer scanning: may appear in the middle. Assume fixed packet size.
1 parent 26c7619 commit 9c23155

File tree

1 file changed

+22
-54
lines changed

1 file changed

+22
-54
lines changed

examples/protonect/src/depth_packet_stream_parser.cpp

Lines changed: 22 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
#include <libfreenect2/depth_packet_stream_parser.h>
2828
#include <iostream>
2929
#include <memory.h>
30-
#include <algorithm>
3130

3231
namespace libfreenect2
3332
{
@@ -43,8 +42,8 @@ DepthPacketStreamParser::DepthPacketStreamParser() :
4342
buffer_.front().length = buffer_.front().capacity;
4443
buffer_.back().length = buffer_.back().capacity;
4544

46-
work_buffer_.data = new unsigned char[single_image * 2];
47-
work_buffer_.capacity = single_image * 2;
45+
work_buffer_.data = new unsigned char[single_image];
46+
work_buffer_.capacity = single_image;
4847
work_buffer_.length = 0;
4948
}
5049

@@ -59,43 +58,38 @@ void DepthPacketStreamParser::setPacketProcessor(libfreenect2::BaseDepthPacketPr
5958

6059
void DepthPacketStreamParser::onDataReceived(unsigned char* buffer, size_t in_length)
6160
{
62-
// TODO: simplify this crap (so code, such unreadable, wow ;)
6361
Buffer &wb = work_buffer_;
6462

65-
size_t in_offset = 0;
66-
67-
while(in_offset < in_length)
63+
if(in_length == 0)
64+
{
65+
//synchronize to subpacket boundary
66+
wb.length = 0;
67+
}
68+
else
6869
{
69-
unsigned char *ptr_in = buffer + in_offset, *ptr_out = wb.data + wb.length;
7070
DepthSubPacketFooter *footer = 0;
7171
bool footer_found = false;
7272

73-
size_t max_length = std::min<size_t>(wb.capacity - wb.length, in_length - 8);
74-
75-
for(; in_offset < max_length; ++in_offset)
73+
if(wb.length + in_length == wb.capacity + sizeof(DepthSubPacketFooter))
7674
{
77-
footer = reinterpret_cast<DepthSubPacketFooter *>(ptr_in);
78-
79-
if(footer->magic0 == 0x0 && footer->magic1 == 0x9)
80-
{
81-
footer_found = true;
82-
break;
83-
}
75+
in_length -= sizeof(DepthSubPacketFooter);
76+
footer = reinterpret_cast<DepthSubPacketFooter *>(&buffer[in_length]);
77+
footer_found = true;
78+
}
8479

85-
*ptr_out = *ptr_in;
86-
++ptr_in;
87-
++ptr_out;
80+
if(wb.length + in_length > wb.capacity)
81+
{
82+
std::cerr << "[DepthPacketStreamParser::onDataReceived] subpacket too large" << std::endl;
83+
wb.length = 0;
84+
return;
8885
}
8986

90-
wb.length = ptr_out - wb.data;
87+
memcpy(wb.data + wb.length, buffer, in_length);
88+
wb.length += in_length;
9189

9290
if(footer_found)
9391
{
94-
if((in_length - in_offset) < sizeof(DepthSubPacketFooter))
95-
{
96-
std::cerr << "[DepthPacketStreamParser::onDataReceived] incomplete footer detected!" << std::endl;
97-
}
98-
else if(footer->length > wb.length)
92+
if(footer->length != wb.length)
9993
{
10094
std::cerr << "[DepthPacketStreamParser::onDataReceived] image data too short!" << std::endl;
10195
}
@@ -118,7 +112,7 @@ void DepthPacketStreamParser::onDataReceived(unsigned char* buffer, size_t in_le
118112
}
119113
else
120114
{
121-
//std::cerr << "[DepthPacketStreamParser::handleNewData] skipping depth packet!" << std::endl;
115+
std::cerr << "[DepthPacketStreamParser::onDataReceived] skipping depth packet" << std::endl;
122116
}
123117
}
124118
else
@@ -147,32 +141,6 @@ void DepthPacketStreamParser::onDataReceived(unsigned char* buffer, size_t in_le
147141

148142
// reset working buffer
149143
wb.length = 0;
150-
// skip header
151-
in_offset += sizeof(DepthSubPacketFooter);
152-
}
153-
else
154-
{
155-
if((wb.length + 8) >= wb.capacity)
156-
{
157-
std::cerr << "[DepthPacketStreamParser::onDataReceived] working buffer full, resetting it!" << std::endl;
158-
wb.length = 0;
159-
ptr_out = wb.data;
160-
}
161-
162-
// copy remaining 8 bytes
163-
if((in_length - in_offset) != 8)
164-
{
165-
std::cerr << "[DepthPacketStreamParser::onDataReceived] remaining data should be 8 bytes, but is " << (in_length - in_offset) << std::endl;
166-
}
167-
168-
for(; in_offset < in_length; ++in_offset)
169-
{
170-
*ptr_out = *ptr_in;
171-
++ptr_in;
172-
++ptr_out;
173-
}
174-
175-
wb.length = ptr_out - wb.data;
176144
}
177145
}
178146
}

0 commit comments

Comments
 (0)