22 #include <arpa/inet.h>
27 auto source_block_number = 0;
28 auto encoding_symbol_id = 0;
29 std::vector<EncodingSymbol> symbols;
31 if (encoding != ContentEncoding::NONE) {
32 throw "Only unencoded 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 "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) {
63 *((uint16_t*)ptr) = htons(first_symbol->source_block_number());
65 *((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;
76 encoded_data += symbol_len;
84 if (_fec_scheme == FecScheme::CompactNoCode) {
85 if (_data_len <= max_length) {
86 memcpy(buffer, _encoded_data, _data_len);
92 if (_fec_scheme == FecScheme::CompactNoCode) {
93 if (_data_len <= max_length) {
94 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.