2019-01-24 06:11:55 +00:00
|
|
|
use std::cmp::min;
|
|
|
|
|
2019-01-23 06:53:23 +00:00
|
|
|
// As defined in section 3.2
|
|
|
|
pub struct PayloadId {
|
|
|
|
pub source_block_number: u8,
|
|
|
|
pub encoding_symbol_id: u32
|
|
|
|
}
|
|
|
|
|
|
|
|
impl PayloadId {
|
|
|
|
pub fn new(source_block_number: u8, encoding_symbol_id: u32) -> Option<PayloadId> {
|
|
|
|
// Encoding Symbol ID must be a 24-bit unsigned int
|
|
|
|
if encoding_symbol_id >= 16777216 {
|
|
|
|
return None
|
|
|
|
}
|
|
|
|
Some(PayloadId {
|
|
|
|
source_block_number,
|
|
|
|
encoding_symbol_id
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// As defined in section 4.4.2
|
|
|
|
pub struct EncodingPacket {
|
|
|
|
pub payload_id: PayloadId,
|
|
|
|
pub symbol: Vec<u8>
|
2019-01-24 05:21:48 +00:00
|
|
|
}
|
|
|
|
|
2019-01-24 06:11:55 +00:00
|
|
|
// Deg[v] as defined in section 5.3.5.2
|
|
|
|
pub fn deg(v: u32, lt_symbols: u32) -> u32 {
|
|
|
|
assert!(v < 1048576);
|
|
|
|
let f: [u32; 31] = [
|
|
|
|
0, 5243, 529531, 704294, 791675, 844104, 879057, 904023, 922747, 937311, 948962,
|
|
|
|
958494, 966438, 973160, 978921, 983914, 988283, 992138, 995565, 998631, 1001391,
|
|
|
|
1003887, 1006157, 1008229, 1010129, 1011876, 1013490, 1014983, 1016370, 1017662, 1048576];
|
|
|
|
|
|
|
|
for d in 1..f.len() {
|
|
|
|
if v < f[d] {
|
|
|
|
return min(d as u32, lt_symbols - 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panic!();
|
|
|
|
}
|