use CumulativeDistributionFrequency;
use opus::imported_decode;
use std;
pub struct Reader<R>
where
R: std::io::Read,
{
state: imported_decode::ec_dec<R>,
}
impl<R> Reader<R>
where
R: std::io::Read,
{
pub fn new(input: R) -> Result<Self, std::io::Error> {
let mut state = imported_decode::ec_dec {
inp: input,
end_window: 0,
nend_bits: 0,
nbits_total: 0,
rng: 0,
rem: 0,
val: 0,
ext: 0,
};
unsafe {
imported_decode::ec_dec_init(&mut state)?;
}
Ok(Reader { state })
}
pub fn symbol(
&mut self,
icdf: &CumulativeDistributionFrequency,
) -> Result<u32, std::io::Error> {
let index = unsafe {
let frequency = imported_decode::ec_decode(&mut self.state, icdf.width());
let indexed = icdf.find(frequency).ok_or_else(|| {
std::io::Error::new(std::io::ErrorKind::InvalidInput, "Invalid probability")
})?;
imported_decode::ec_dec_update(
&mut self.state,
indexed.segment.low,
indexed.segment.next,
icdf.width(),
)?;
indexed.index
};
Ok(index as u32)
}
pub fn done(self) {
}
}