21 #include <arpa/inet.h>
23 #include "spdlog/spdlog.h"
27 auto source_block_number = 0;
28 auto encoding_symbol_id = 0;
29 std::vector<EncodingSymbol> symbols;
31 if (encoding != ContentEncoding::NONE && encoding != ContentEncoding::GZIP) {
32 throw std::runtime_error(
"Only unencoded or gzipped content is supported");
35 if (fec_oti.encoding_id == FecScheme::CompactNoCode) {
36 source_block_number = ntohs(*(uint16_t*)encoded_data);
38 encoding_symbol_id = ntohs(*(uint16_t*)encoded_data);
42 throw std::runtime_error(
"Only compact no-code FEC is supported");
45 int nof_symbols = std::ceil((
float)data_len / (
float)fec_oti.encoding_symbol_length);
46 for (
int i = 0; i < nof_symbols; i++) {
47 if (fec_oti.encoding_id == FecScheme::CompactNoCode) {
48 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);
50 encoded_data += fec_oti.encoding_symbol_length;
60 auto ptr = encoded_data;
61 auto first_symbol = symbols.begin();
62 if (fec_oti.encoding_id == FecScheme::CompactNoCode && data_len >= 4) {
63 *((uint16_t*)ptr) = htons(first_symbol->source_block_number());
65 *((uint16_t*)ptr) = htons(first_symbol->id());
70 throw std::runtime_error(
"Only compact no-code FEC is supported");
73 for (
const auto& symbol : symbols) {
74 if (symbol.len() <= data_len) {
75 auto symbol_len = symbol.encode_to(ptr, data_len);
76 data_len -= symbol_len;
80 spdlog::warn(
"Not enough space in payload buffer for encoding symbol");
88 if (_fec_scheme == FecScheme::CompactNoCode) {
89 if (_data_len <= max_length) {
90 memcpy(buffer, _encoded_data, _data_len);
96 if (_fec_scheme == FecScheme::CompactNoCode) {
97 if (_data_len <= max_length) {
98 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.