Newer
Older
RaptorQ__v1::Work_State state =
RaptorQ__v1::Work_State::KEEP_WORKING;
Decoder_Result::DECODED != ret) {
}
}
Impl::De_Interleaver<Fwd_It> de_interleaving (dec_ptr->get_symbols(),
uint64_t max_bytes = block_size (sbn);
if (sbn == (blocks() - 1)) {
// size of the data (_size) is different from the sum of the size of
// all blocks. get the real size, so we do not write more.
// we obviously need to consider this only for the last block.
uint64_t all_blocks = 0;
for (uint8_t id = 0; id < blocks(); ++id)
all_blocks += block_size (sbn);
const uint64_t diff = all_blocks - _size;
max_bytes -= diff;
}
uint64_t bytes_written = de_interleaving (tmp_start, end, max_bytes,
new_skip);
written += bytes_written;
uint64_t bytes_and_skip = new_skip + bytes_written;
new_skip = bytes_and_skip %
sizeof(typename std::iterator_traits<Fwd_It>::value_type);
if (bytes_written == 0)
return written;
//new_skip = block_size (sbn) %
// sizeof(typename std::iterator_traits<Fwd_It>::value_type);
// if we ended decoding in the middle of a Fwd_It, do not advance
// start too much, or we will end up having additional zeros.
uint64_t it_written = bytes_and_skip /
sizeof(typename std::iterator_traits<Fwd_It>::value_type);
// RaptorQ handles at most 881GB per rfc, so
// casting uint64 to int64 is safe
// we can not do "--start" since it's a forward iterator
start += std::max (static_cast<int64_t> (0),
static_cast<int64_t> (it_written - 1));
uint64_t Decoder<In_It, Fwd_It>::decode_block_bytes (Fwd_It &start,
const Fwd_It end,
const uint8_t skip,
std::shared_ptr<RaptorQ__v1::Impl::Raw_Decoder<In_It>> dec_ptr = nullptr;
std::unique_lock<std::mutex> lock (_mtx);
if (it == decoders.end())
return 0; // did not receiveany data yet.
if (use_pool) {
dec_ptr = it->second.dec;
lock.unlock();
if (!dec_ptr->ready())
return 0; // did not receive enough data, or could not decode yet.
} else {
dec_ptr = it->second.dec;
lock.unlock();
if (!dec_ptr->ready()) {
if (!dec_ptr->can_decode())
return 0;
RaptorQ__v1::Work_State keep_working =
RaptorQ__v1::Work_State::KEEP_WORKING;
dec_ptr->decode (&keep_working);
if (!dec_ptr->ready())
return 0;
}
}
// decoder has decoded the block
Impl::De_Interleaver<Fwd_It> de_interleaving (dec_ptr->get_symbols(),
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
uint64_t max_bytes = block_size (sbn);
if (sbn == (blocks() - 1)) {
// size of the data (_size) is different from the sum of the size of
// all blocks. get the real size, so we do not write more.
// we obviously need to consider this only for the last block.
uint64_t all_blocks = 0;
for (uint8_t id = 0; id < blocks(); ++id)
all_blocks += block_size (sbn);
const uint64_t diff = all_blocks - _size;
max_bytes -= diff;
}
return de_interleaving (start, end, max_bytes, skip);
}
template <typename In_It, typename Fwd_It>
std::pair<size_t, uint8_t> Decoder<In_It, Fwd_It>::decode_aligned (
Fwd_It &start,
const Fwd_It end,
const uint8_t skip)
{
const uint64_t bytes = decode_bytes (start, end, skip);
const uint64_t skip_and_bytes = skip + bytes;
const uint64_t iterators = skip_and_bytes /
sizeof(typename std::iterator_traits<Fwd_It>::value_type);
const uint8_t new_skip = skip_and_bytes %
sizeof(typename std::iterator_traits<Fwd_It>::value_type);
return {iterators, new_skip};
}
template <typename In_It, typename Fwd_It>
std::pair<size_t, uint8_t> Decoder<In_It, Fwd_It>::decode_block_aligned (
Fwd_It &start,
const Fwd_It end,
const uint8_t skip,
const uint8_t sbn)
{
const uint64_t bytes = decode_block_bytes (start, end, skip, sbn);
const uint64_t skip_and_bytes = skip + bytes;
const uint64_t iterators = skip_and_bytes /
sizeof(typename std::iterator_traits<Fwd_It>::value_type);
const uint8_t new_skip = skip_and_bytes %
sizeof(typename std::iterator_traits<Fwd_It>::value_type);
return {iterators, new_skip};
template <typename In_It, typename Fwd_It>
uint64_t Decoder<In_It, Fwd_It>::bytes() const
template <typename In_It, typename Fwd_It>
uint8_t Decoder<In_It, Fwd_It>::blocks() const
template <typename In_It, typename Fwd_It>
uint32_t Decoder<In_It, Fwd_It>::block_size (const uint8_t sbn) const
{
if (sbn < part.num (0)) {
return part.size (0) * _symbol_size;
} else if (sbn - part.num (0) < part.num (1)) {
return part.size (1) * _symbol_size;
}
return 0;
}
template <typename In_It, typename Fwd_It>
uint16_t Decoder<In_It, Fwd_It>::symbol_size() const
template <typename In_It, typename Fwd_It>
uint16_t Decoder<In_It, Fwd_It>::symbols (const uint8_t sbn) const
{
if (sbn < part.num (0)) {
return part.size (0);
} else if (sbn - part.num (0) < part.num (1)) {
return part.size (1);
}
return 0;
}
} // namespace Impl
} // namespace RFC6330__v1