12 #ifndef ROC_FEC_COMPOSER_H_
13 #define ROC_FEC_COMPOSER_H_
25 template <
class PayloadID, PayloadID_Type Type, PayloadID_Pos Pos>
33 : inner_composer_(inner_composer) {
39 if ((
unsigned long)buffer.
data() % payload_alignment != 0) {
40 roc_panic(
"fec composer: unexpected non-aligned buffer");
44 header_size +=
sizeof(PayloadID);
47 if (inner_composer_ == NULL) {
53 "fec composer: not enough space for alignment: padding=%lu cap=%lu",
63 return inner_composer_->
align(buffer, header_size, payload_alignment);
73 if (payload_id.
capacity() <
sizeof(PayloadID)) {
75 "fec composer: not enough space for fec header: size=%lu cap=%lu",
76 (
unsigned long)
sizeof(PayloadID),
77 (
unsigned long)payload_id.
capacity());
80 payload_id.
resize(
sizeof(PayloadID));
86 if (inner_composer_) {
87 if (!inner_composer_->
prepare(packet, payload, payload_size)) {
91 payload.
resize(payload_size);
97 if (payload_id.
capacity() <
sizeof(PayloadID)) {
99 "fec composer: not enough space for fec header: size=%lu cap=%lu",
100 (
unsigned long)
sizeof(PayloadID),
101 (
unsigned long)payload_id.
capacity());
104 payload_id.
resize(
sizeof(PayloadID));
126 if (inner_composer_) {
127 return inner_composer_->
pad(packet, padding_size);
137 roc_panic(
"fec composer: unexpected non-fec packet");
141 roc_panic(
"fec composer: unexpected payload id size");
161 if (inner_composer_) {
162 return inner_composer_->
compose(packet);
Base class for non-copyable objects.
void resize(size_t new_size)
Change slice size, up to the available capacity.
size_t capacity() const
Get maximum possible number of elements in slice.
T * data() const
Get slice data.
Slice range(size_t from, size_t to) const
Construct a slice pointing to a part of this slice.
size_t size() const
Get number of elements in slice.
FECFRAME packet composer.
virtual bool pad(packet::Packet &packet, size_t padding_size)
Pad packet.
virtual bool compose(packet::Packet &packet)
Compose packet to buffer.
Composer(packet::IComposer *inner_composer)
Initialization.
virtual bool prepare(packet::Packet &packet, core::Slice< uint8_t > &buffer, size_t payload_size)
Prepare buffer for composing a packet.
virtual bool align(core::Slice< uint8_t > &buffer, size_t header_size, size_t payload_alignment)
Adjust buffer to align payload.
Packet composer interface.
virtual bool align(core::Slice< uint8_t > &buffer, size_t header_size, size_t payload_alignment)=0
Adjust buffer to align payload.
virtual bool pad(Packet &packet, size_t padding_size)=0
Pad packet.
virtual bool prepare(Packet &packet, core::Slice< uint8_t > &buffer, size_t payload_size)=0
Prepare buffer for composing a packet.
virtual bool compose(Packet &packet)=0
Compose packet to buffer.
@ FlagRepair
Packet contains repair FEC symbols.
@ FlagFEC
Packet contains FEC header.
const FEC * fec() const
FEC packet.
void add_flags(unsigned flags)
Add flags.
Packet composer interface.
#define roc_log(...)
Print message to log.
size_t padding(size_t size, size_t alignment)
Calculate padding required for given alignment.
@ Header
PayloadID comes before payload.
@ Footer
PayloadID comes after payload.
@ Repair
Source packet header of footer.
#define roc_panic_if(x)
Panic if condition is true.
#define roc_panic(...)
Print error message and terminate program gracefully.
core::Slice< uint8_t > payload
FECFRAME payload.
size_t encoding_symbol_id
The index number of packet in a block.
size_t source_block_length
Number of source packets in the block to which this packet belongs to.
FECScheme fec_scheme
The FEC scheme to which the packet belongs to.
size_t block_length
Number of source packets and repair in the block to which this packet belongs to.
blknum_t source_block_number
Number of a source block in a packet stream.
core::Slice< uint8_t > payload_id
FECFRAME header or footer.