2727#include < libfreenect2/depth_packet_stream_parser.h>
2828#include < iostream>
2929#include < memory.h>
30- #include < algorithm>
3130
3231namespace 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
6059void 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