2 Commits

2 changed files with 8 additions and 17 deletions

View File

@@ -33,13 +33,12 @@ impl<'a> Context<'a> {
pub fn update(&mut self, bit: bool) { pub fn update(&mut self, bit: bool) {
let old = self.state.contexts[self.index]; let old = self.state.contexts[self.index];
let offset = if !bit { if bit {
ONE_PROB as i32 >> UPDATE_RATE
} else {
0
};
self.state.contexts[self.index] = self.state.contexts[self.index] =
(offset + old as i32 - ((old as i32 + UPDATE_ADD) >> UPDATE_RATE)) as u8; old - ((old as i32 + UPDATE_ADD) >> UPDATE_RATE) as u8;
} else {
self.state.contexts[self.index] =
old + (((ONE_PROB as i32 - old as i32) + UPDATE_ADD) >> UPDATE_RATE) as u8;
}
} }
} }

View File

@@ -10,16 +10,12 @@ fn main() -> Result<()> {
Some("pack") => { Some("pack") => {
let level = args.opt_value_from_str(["-l", "--level"])?.unwrap_or(2u8); let level = args.opt_value_from_str(["-l", "--level"])?.unwrap_or(2u8);
let use_bitstream = args.contains(["-b", "--bitstream"]); let use_bitstream = args.contains(["-b", "--bitstream"]);
let reverse = args.contains(["-r", "--reverse"]);
let infile = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?; let infile = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?;
let outfile = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?; let outfile = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?;
let mut data = vec![]; let mut data = vec![];
File::open(infile)?.read_to_end(&mut data)?; File::open(infile)?.read_to_end(&mut data)?;
if reverse {
data.reverse();
}
let mut pb = pbr::ProgressBar::new(data.len() as u64); let mut pb = pbr::ProgressBar::new(data.len() as u64);
pb.set_units(pbr::Units::Bytes); pb.set_units(pbr::Units::Bytes);
@@ -43,18 +39,14 @@ fn main() -> Result<()> {
} }
Some("unpack") => { Some("unpack") => {
let use_bitstream = args.contains(["-b", "--bitstream"]); let use_bitstream = args.contains(["-b", "--bitstream"]);
let reverse = args.contains(["-r", "--reverse"]);
let infile = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?; let infile = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?;
let outfile = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?; let outfile = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?;
let mut data = vec![]; let mut data = vec![];
File::open(infile)?.read_to_end(&mut data)?; File::open(infile)?.read_to_end(&mut data)?;
let mut unpacked_data = upkr::unpack(&data, use_bitstream); let packed_data = upkr::unpack(&data, use_bitstream);
if reverse { File::create(outfile)?.write_all(&packed_data)?;
unpacked_data.reverse();
}
File::create(outfile)?.write_all(&unpacked_data)?;
} }
Some(other) => { Some(other) => {
bail!("Unknown subcommand '{}'", other); bail!("Unknown subcommand '{}'", other);