| 80 | } |
| 81 | |
| 82 | void RgbPacketStreamParser::onDataReceived(unsigned char* buffer, size_t length) |
| 83 | { |
| 84 | if (packet_.memory == NULL || packet_.memory->data == NULL) |
| 85 | { |
| 86 | LOG_ERROR << "Packet buffer is NULL"; |
| 87 | return; |
| 88 | } |
| 89 | Buffer &fb = *packet_.memory; |
| 90 | |
| 91 | // package containing data |
| 92 | if(length > 0) |
| 93 | { |
| 94 | if(fb.length + length <= fb.capacity) |
| 95 | { |
| 96 | memcpy(fb.data + fb.length, buffer, length); |
| 97 | fb.length += length; |
| 98 | } |
| 99 | else |
| 100 | { |
| 101 | LOG_INFO << "buffer overflow!"; |
| 102 | fb.length = 0; |
| 103 | return; |
| 104 | } |
| 105 | |
| 106 | // not enough data to do anything |
| 107 | if (fb.length <= sizeof(RawRgbPacket) + sizeof(RgbPacketFooter)) |
| 108 | return; |
| 109 | |
| 110 | RgbPacketFooter* footer = reinterpret_cast<RgbPacketFooter *>(&fb.data[fb.length - sizeof(RgbPacketFooter)]); |
| 111 | |
| 112 | if (footer->magic_header == 0x39393939 && footer->magic_footer == 0x42424242) |
| 113 | { |
| 114 | RawRgbPacket *raw_packet = reinterpret_cast<RawRgbPacket *>(fb.data); |
| 115 | |
| 116 | if (fb.length != footer->packet_size || raw_packet->sequence != footer->sequence) |
| 117 | { |
| 118 | LOG_INFO << "packetsize or sequence doesn't match!"; |
| 119 | fb.length = 0; |
| 120 | return; |
| 121 | } |
| 122 | |
| 123 | if (fb.length - sizeof(RawRgbPacket) - sizeof(RgbPacketFooter) < footer->filler_length) |
| 124 | { |
| 125 | LOG_INFO << "not enough space for packet filler!"; |
| 126 | fb.length = 0; |
| 127 | return; |
| 128 | } |
| 129 | |
| 130 | size_t jpeg_length = 0; |
| 131 | //check for JPEG EOI 0xff 0xd9 within 0 to 3 alignment bytes |
| 132 | size_t length_no_filler = fb.length - sizeof(RawRgbPacket) - sizeof(RgbPacketFooter) - footer->filler_length; |
| 133 | for (size_t i = 0; i < 4; i++) |
| 134 | { |
| 135 | if (length_no_filler < i + 2) |
| 136 | break; |
| 137 | size_t eoi = length_no_filler - i; |
| 138 | |
| 139 | if (raw_packet->jpeg_buffer[eoi - 2] == 0xff && raw_packet->jpeg_buffer[eoi - 1] == 0xd9) |
no test coverage detected