20 #include <arpa/inet.h>
22 #include "spdlog/spdlog.h"
26 auto source_block_number = 0;
27 auto encoding_symbol_id = 0;
28 std::vector<EncodingSymbol> symbols;
30 if (encoding != ContentEncoding::NONE && encoding != ContentEncoding::GZIP) {
31 throw "Only unencoded or gzipped content is supported";
34 if (fec_oti.encoding_id == FecScheme::CompactNoCode) {
35 source_block_number = ntohs(*(uint16_t*)encoded_data);
37 encoding_symbol_id = ntohs(*(uint16_t*)encoded_data);
41 throw "Only compact no-code FEC is supported";
44 int nof_symbols = std::ceil((
float)data_len / (
float)fec_oti.encoding_symbol_length);
45 for (
int i = 0; i < nof_symbols; i++) {
46 if (fec_oti.encoding_id == FecScheme::CompactNoCode) {
47 symbols.emplace_back(encoding_symbol_id, source_block_number, encoded_data, std::min(data_len, (
size_t)fec_oti.encoding_symbol_length), fec_oti.encoding_id);
49 encoded_data += fec_oti.encoding_symbol_length;
59 auto ptr = encoded_data;
60 auto first_symbol = symbols.begin();
61 if (fec_oti.encoding_id == FecScheme::CompactNoCode && data_len >= 4) {
62 *((uint16_t*)ptr) = htons(first_symbol->source_block_number());
64 *((uint16_t*)ptr) = htons(first_symbol->id());
69 throw "Only compact no-code FEC is supported";
72 for (
const auto& symbol : symbols) {
73 if (symbol.len() <= data_len) {
74 auto symbol_len = symbol.encode_to(ptr, data_len);
75 data_len -= symbol_len;
79 spdlog::warn(
"Not enough space in payload buffer for encoding symbol");
87 if (_fec_scheme == FecScheme::CompactNoCode) {
88 if (_data_len <= max_length) {
89 memcpy(buffer, _encoded_data, _data_len);
95 if (_fec_scheme == FecScheme::CompactNoCode) {
96 if (_data_len <= max_length) {
97 memcpy(buffer, _encoded_data, _data_len);
static size_t to_payload(const std::vector< EncodingSymbol > &, char *encoded_data, size_t data_len, const FecOti &fec_oti, ContentEncoding encoding)
Write encoding symbols to a packet payload buffer.
size_t encode_to(char *buffer, size_t max_length) const
Encode to a buffer.
static std::vector< EncodingSymbol > from_payload(char *encoded_data, size_t data_len, const FecOti &fec_oti, ContentEncoding encoding)
Parse and construct all encoding symbols from a payload data buffer.
void decode_to(char *buffer, size_t max_length) const
Decode to a buffer.
ContentEncoding
Content Encodings.