range_encoding/opus/
encode.rs1
2use ::{ CumulativeDistributionFrequency };
3
4use opus::imported_encode;
5
6use std;
7
8pub struct Writer<W> where W: std::io::Write {
9    state: imported_encode::ec_enc<W>,
10}
11
12impl<W> Writer<W> where W: std::io::Write {
13    pub fn new(out: W) -> Self {
14        Self {
15            state: imported_encode::ec_enc {
16                out,
17                end_window: 0,
18                nend_bits: 0,
19                nbits_total: 33,
20                offs: 0,
21                rng: std::u32::MAX / 2 + 1,
22                rem: -1,
23                val: 0,
24                ext: 0,
25                end_buffer: vec![],
26            }
27        }
28    }
29
30    pub fn symbol(&mut self, index: usize, icdf: &CumulativeDistributionFrequency) -> Result<(), std::io::Error> {
32        let width = icdf.width();
33        let segment = icdf.at_index(index).ok_or_else(|| {
34            std::io::Error::new(std::io::ErrorKind::InvalidInput, "Invalid symbol")
35        })?;
36        unsafe {
37            imported_encode::ec_encode(&mut self.state, segment.low, segment.next, width)?;
38        };
39        Ok(())
40    }
41
42pub fn done(mut self) -> Result<W, std::io::Error> {
58        unsafe {
59            imported_encode::ec_enc_done(&mut self.state)?;
60        };
61        Ok(self.state.out)
62    }
63}