28
28
#include < memory.h>
29
29
#include < iostream>
30
30
31
+
31
32
namespace libfreenect2
32
33
{
33
34
34
35
35
36
struct RawRgbPacket
36
37
{
37
38
uint32_t sequence;
38
- uint32_t unknown0;
39
+ uint32_t magicHeader; // is 'BBBB' equal 0x42424242
39
40
40
41
unsigned char jpeg_buffer[0 ];
41
42
};
42
43
44
+ struct RgbPacketFooter {
45
+ uint32_t magicHeader; // is '9999' equal 0x39393939
46
+ uint32_t sequence;
47
+ int32_t unknown1; // varies from 0 to 60 with steps of 4
48
+ int32_t unknown2; // seems 0 always
49
+ int32_t unknown3; // seems 0 always
50
+ uint32_t timestamp;
51
+ float exposure; // ? ranges from 0.5 to about 60.0 with powerfull light at camera or totally covered
52
+ float gain; // ? ranges from 1.0 when camera is clear to 1.5 when camera is covered.
53
+ uint32_t magicFooter; // is 'BBBB' equal 0x42424242
54
+ uint32_t packet_size;
55
+ float version; // ? this seems to be consistent 1.0
56
+ uint8_t unknown4[12 ]; // seems to be 0 all the time.
57
+ };
58
+
43
59
RgbPacketStreamParser::RgbPacketStreamParser () :
44
60
processor_ (noopProcessor<RgbPacket>())
45
61
{
@@ -57,49 +73,65 @@ void RgbPacketStreamParser::setPacketProcessor(BaseRgbPacketProcessor *processor
57
73
58
74
void RgbPacketStreamParser::onDataReceived (unsigned char * buffer, size_t length)
59
75
{
76
+ // if no data return
77
+ if (length == 0 )
78
+ return ;
79
+
60
80
Buffer &fb = buffer_.front ();
61
81
62
- // package containing data
63
- if (length > 0 )
82
+ // iterate through each byte to detect footer
83
+ for ( size_t i = 0 ; i < length; i++ )
64
84
{
65
- if (fb.length + length <= fb.capacity )
66
- {
67
- memcpy (fb.data + fb.length , buffer, length);
85
+ RgbPacketFooter* footer = reinterpret_cast <RgbPacketFooter *>(&buffer[i]);
86
+
87
+ // if magic markers match
88
+ if (length - i >= sizeof (RgbPacketFooter) && footer->magicHeader == 0x39393939 && footer->magicFooter == 0x42424242 )
89
+ {
90
+ memcpy (&fb.data [fb.length ], buffer, length);
68
91
fb.length += length;
69
- }
70
- else
71
- {
72
- std::cerr << " [RgbPacketStreamParser::handleNewData] buffer overflow!" << std::endl;
73
- }
74
92
75
- // not full transfer buffer and we already have some data -> signals end of rgb image packet
76
- // TODO: better method, is unknown0 a magic? detect JPEG magic?
77
- if (length < 0x4000 && fb.length > sizeof (RgbPacket))
78
- {
79
- // can the processor handle the next image?
80
- if (processor_->ready ())
81
- {
82
- buffer_.swap ();
83
- Buffer &bb = buffer_.back ();
93
+ buffer_.swap ();
94
+ Buffer &bb = buffer_.back ();
95
+ RawRgbPacket *raw_packet = reinterpret_cast <RawRgbPacket *>(bb.data );
84
96
85
- RawRgbPacket *raw_packet = reinterpret_cast <RawRgbPacket *>(bb.data );
86
- RgbPacket rgb_packet;
87
- rgb_packet.sequence = raw_packet->sequence ;
88
- rgb_packet.jpeg_buffer = raw_packet->jpeg_buffer ;
89
- rgb_packet.jpeg_buffer_length = bb.length - sizeof (RawRgbPacket);
97
+ if (bb.length == footer->packet_size && raw_packet->sequence == footer->sequence )
98
+ {
99
+ if (processor_->ready ())
100
+ {
101
+ RgbPacket rgb_packet;
102
+ rgb_packet.sequence = raw_packet->sequence ;
103
+ rgb_packet.timestamp = footer->timestamp ;
104
+ rgb_packet.jpeg_buffer = raw_packet->jpeg_buffer ;
105
+ rgb_packet.jpeg_buffer_length = bb.length - sizeof (RawRgbPacket);
90
106
91
- // call the processor
92
- processor_->process (rgb_packet);
107
+ // call the processor
108
+ processor_->process (rgb_packet);
109
+ }
110
+ else
111
+ {
112
+ std::cerr << " [RgbPacketStreamParser::handleNewData] skipping rgb packet!" << std::endl;
113
+ }
114
+ // clear buffer and return
115
+ buffer_.front ().length = 0 ;
116
+ return ;
93
117
}
94
118
else
95
119
{
96
- std::cerr << " [RgbPacketStreamParser::handleNewData] skipping rgb packet!" << std::endl;
120
+ std::cerr << " [RgbPacketStreamParser::handleNewData] packetsize or sequence doesn't match!" << std::endl;
121
+ fb.length = 0 ;
122
+ return ;
97
123
}
98
-
99
- // reset front buffer
100
- buffer_.front ().length = 0 ;
101
124
}
102
125
}
126
+ // clear buffer if overflow of data
127
+ if (fb.length + length > fb.capacity )
128
+ {
129
+ std::cerr << " [RgbPacketStreamParser::handleNewData] Buffer overflow - resetting." << std::endl;
130
+ fb.length = 0 ;
131
+ }
132
+
133
+ memcpy (&fb.data [fb.length ], buffer, length);
134
+ fb.length += length;
103
135
}
104
136
105
137
} /* namespace libfreenect2 */
0 commit comments