Skip to content

Commit 95f197e

Browse files
committed
update rgb streamer.
inspecting to find magic markers. copy data in chunks. Verify by packetlength and sequence of footer and header.
1 parent 3f58e13 commit 95f197e

File tree

4 files changed

+68
-32
lines changed

4 files changed

+68
-32
lines changed

examples/protonect/include/libfreenect2/frame_listener.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#define FRAME_LISTENER_HPP_
2929

3030
#include <cstddef>
31+
#include <stdint.h>
3132

3233
namespace libfreenect2
3334
{
@@ -41,6 +42,7 @@ struct Frame
4142
Depth = 4
4243
};
4344

45+
uint32_t timestamp;
4446
size_t width, height, bytes_per_pixel;
4547
unsigned char* data;
4648

examples/protonect/include/libfreenect2/rgb_packet_processor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ namespace libfreenect2
3939
struct RgbPacket
4040
{
4141
uint32_t sequence;
42-
42+
uint32_t timestamp;
4343
unsigned char *jpeg_buffer;
4444
size_t jpeg_buffer_length;
4545
};

examples/protonect/src/rgb_packet_stream_parser.cpp

Lines changed: 63 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,34 @@
2828
#include <memory.h>
2929
#include <iostream>
3030

31+
3132
namespace libfreenect2
3233
{
3334

3435

3536
struct RawRgbPacket
3637
{
3738
uint32_t sequence;
38-
uint32_t unknown0;
39+
uint32_t magicHeader; // is 'BBBB' equal 0x42424242
3940

4041
unsigned char jpeg_buffer[0];
4142
};
4243

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+
4359
RgbPacketStreamParser::RgbPacketStreamParser() :
4460
processor_(noopProcessor<RgbPacket>())
4561
{
@@ -57,49 +73,65 @@ void RgbPacketStreamParser::setPacketProcessor(BaseRgbPacketProcessor *processor
5773

5874
void RgbPacketStreamParser::onDataReceived(unsigned char* buffer, size_t length)
5975
{
76+
// if no data return
77+
if (length == 0)
78+
return;
79+
6080
Buffer &fb = buffer_.front();
6181

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++)
6484
{
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);
6891
fb.length += length;
69-
}
70-
else
71-
{
72-
std::cerr << "[RgbPacketStreamParser::handleNewData] buffer overflow!" << std::endl;
73-
}
7492

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);
8496

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);
90106

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;
93117
}
94118
else
95119
{
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;
97123
}
98-
99-
// reset front buffer
100-
buffer_.front().length = 0;
101124
}
102125
}
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;
103135
}
104136

105137
} /* namespace libfreenect2 */

examples/protonect/src/turbo_jpeg_rgb_packet_processor.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ void TurboJpegRgbPacketProcessor::process(const RgbPacket &packet)
112112
{
113113
impl_->startTiming();
114114

115+
impl_->frame->timestamp = packet.timestamp;
116+
115117
int r = tjDecompress2(impl_->decompressor, packet.jpeg_buffer, packet.jpeg_buffer_length, impl_->frame->data, 1920, 1920 * tjPixelSize[TJPF_BGR], 1080, TJPF_BGR, 0);
116118

117119
if(r == 0)

0 commit comments

Comments
 (0)