use alloc::vec::Vec;
use crate::encodingsymbols::EncodingSymbol;
use crate::raptor;
pub struct SourceBlockDecoder {
raptor: raptor::Raptor,
}
impl SourceBlockDecoder {
pub fn new(nb_source_symbols: usize) -> Self {
SourceBlockDecoder {
raptor: raptor::Raptor::new(nb_source_symbols as u32),
}
}
pub fn push_encoding_symbol(&mut self, encoding_symbol: &[u8], esi: u32) {
let encoding_symbol = EncodingSymbol::new(encoding_symbol, esi);
self.raptor.add_encoding_symbol(&encoding_symbol);
}
pub fn fully_specified(&self) -> bool {
self.raptor.fully_specified()
}
pub fn decode(&mut self, source_block_length: usize) -> Option<Vec<u8>> {
self.raptor.decode(source_block_length)
}
}
pub fn decode_source_block(
encoding_symbols: &[Option<Vec<u8>>],
nb_source_symbols: usize,
source_block_length: usize,
) -> Option<Vec<u8>> {
let encoding_symbols = EncodingSymbol::from_option_block(encoding_symbols);
let mut raptor = raptor::Raptor::new(nb_source_symbols as u32);
raptor.add_encoding_symbols(&encoding_symbols);
raptor.decode(source_block_length)
}