46 lines
1.8 KiB
Rust
46 lines
1.8 KiB
Rust
//! WarzonePhone FEC Layer
|
|
//!
|
|
//! Forward Error Correction using RaptorQ fountain codes with temporal interleaving.
|
|
//!
|
|
//! This crate provides:
|
|
//! - [`RaptorQFecEncoder`] — accumulates audio frames into FEC blocks and generates repair symbols
|
|
//! - [`RaptorQFecDecoder`] — reassembles source blocks from received source and repair symbols
|
|
//! - [`Interleaver`] — spreads symbols across blocks to mitigate burst losses
|
|
//! - [`BlockManager`](block_manager) — tracks block lifecycle on encoder and decoder sides
|
|
//! - [`AdaptiveFec`] — maps quality profiles to FEC parameters
|
|
|
|
pub mod adaptive;
|
|
pub mod block_manager;
|
|
pub mod decoder;
|
|
pub mod encoder;
|
|
pub mod interleave;
|
|
|
|
pub use adaptive::AdaptiveFec;
|
|
pub use block_manager::{
|
|
DecoderBlockManager, DecoderBlockState, EncoderBlockManager, EncoderBlockState,
|
|
};
|
|
pub use decoder::RaptorQFecDecoder;
|
|
pub use encoder::RaptorQFecEncoder;
|
|
pub use interleave::Interleaver;
|
|
|
|
pub use wzp_proto::{FecDecoder, FecEncoder, QualityProfile};
|
|
|
|
/// Create an encoder/decoder pair configured for the given quality profile.
|
|
pub fn create_fec_pair(profile: &QualityProfile) -> (RaptorQFecEncoder, RaptorQFecDecoder) {
|
|
let cfg = AdaptiveFec::from_profile(profile);
|
|
let encoder = cfg.build_encoder();
|
|
let decoder = RaptorQFecDecoder::new(cfg.frames_per_block, cfg.symbol_size);
|
|
(encoder, decoder)
|
|
}
|
|
|
|
/// Create an encoder configured for the given quality profile.
|
|
pub fn create_encoder(profile: &QualityProfile) -> RaptorQFecEncoder {
|
|
AdaptiveFec::from_profile(profile).build_encoder()
|
|
}
|
|
|
|
/// Create a decoder configured for the given quality profile.
|
|
pub fn create_decoder(profile: &QualityProfile) -> RaptorQFecDecoder {
|
|
let cfg = AdaptiveFec::from_profile(profile);
|
|
RaptorQFecDecoder::new(cfg.frames_per_block, cfg.symbol_size)
|
|
}
|