use nihav_core::io::byteio::*;
use nihav_core::io::bitreader::*;
use nihav_core::io::codebook::*;
+use nihav_codec_support::codecs::{IPShuffler, HAMShuffler};
const SKIP_BLOCK: u8 = 0;
const SCALED_BLOCK: u8 = 1;
if br.read_bool()? {
let len = br.read(3)? as usize;
let mut present: [bool; 16] = [false; 16];
- for i in 0..len+1 {
+ for i in 0..=len {
self.syms[i] = br.read(4)? as u8;
present[self.syms[i] as usize] = true;
}
let len = br.read(2)? as usize;
let mut syms: [u8; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
let mut tmp: [u8; 16] = [0; 16];
- for bits in 0..len+1 {
+ for bits in 0..=len {
let size = 1 << bits;
for arr in syms.chunks_mut(size * 2) {
let mut ptr0 = 0;
self.dec_pos = self.data.len();
self.read_pos = self.data.len() - 1;
}
-println!(" read {} of {} bits", len, self.bits);
Ok(len)
}
fn get_val(&mut self) -> DecoderResult<T> {
struct BinkDecoder {
info: NACodecInfoRef,
ips: IPShuffler,
- hams: HAMShuffler,
+ hams: HAMShuffler<u8>,
is_ver_b: bool,
is_ver_i: bool,
self.run.data.resize(size, 0);
}
fn init_bundle_lengths(&mut self, w: usize, bw: usize) {
+ let w = (w + 7) & !7;
self.btype.bits = calc_len(w >> 3);
self.sbtype.bits = calc_len(w >> 4);
self.colors.bits = calc_len(bw * 64);
}
fn read_bundles_binkb(&mut self, br: &mut BitReader) -> DecoderResult<()> {
self.btype.read_binkb(br)?;
-println!(" @ {}", br.tell());
self.colors.read_binkb(br)?;
-println!(" @ {}", br.tell());
self.pattern.read_binkb(br)?;
-println!(" @ {}", br.tell());
self.xoff.read_binkb(br)?;
-println!(" @ {}", br.tell());
self.yoff.read_binkb(br)?;
-println!(" @ {}", br.tell());
self.intradc.read_binkb(br)?;
-println!(" @ {}", br.tell());
self.interdc.read_binkb(br)?;
-println!(" @ {}", br.tell());
self.intraq.read_binkb(br)?;
-println!(" @ {}", br.tell());
self.interq.read_binkb(br)?;
-println!(" @ {}", br.tell());
self.nresidues.read_binkb(br)?;
-println!(" @ {}", br.tell());
Ok(())
}
fn read_bundles(&mut self, br: &mut BitReader) -> DecoderResult<()> {
let ybias = if self.key_frame { -15 } else { 0 };
let yoff = yoff1 + ybias;
-println!(" copy from {}.{} + {},{}({})", bx*8, by*8, xoff, yoff, ybias);
let xpos = ((bx * 8) as isize) + (xoff as isize);
let ypos = ((by * 8) as isize) + (yoff as isize);
validate!((xpos >= 0) && (xpos + 8 <= (self.cur_w as isize)));
self.cur_h = (height + 7) & !7;
self.cur_plane = plane_no;
self.init_bundle_lengths_binkb();
-println!(" plane {}", plane_no);
for by in 0..bh {
self.read_bundles_binkb(br)?;
-println!(" bline {} @ {}", by, br.tell());
for bx in 0..bw {
let mut coeffs: [i32; 64] = [0; 64];
let btype = self.btype.get_val()?;
-println!(" blk {}.{} type {}", bx,by,btype);
match btype {
0 => { // skip
},
let q_index = if let Some(qidx) = q { qidx } else { br.read(4)? as usize };
let qmat = &quant_matrices[q_index];
block[0] = block[0].wrapping_mul(qmat[0]) >> 11;
- for idx in coef_idx.into_iter().take(coef_count) {
+ for idx in coef_idx.iter().take(coef_count) {
block[scan[*idx]] = block[scan[*idx]].wrapping_mul(qmat[*idx]) >> 11;
}
}
mask >>= 1;
}
-
+
Ok(())
}
const BINK_FLAG_GRAY: u32 = 0x00020000;
impl NADecoder for BinkDecoder {
- fn init(&mut self, info: NACodecInfoRef) -> DecoderResult<()> {
+ fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
let w = vinfo.get_width();
let h = vinfo.get_height();
Err(DecoderError::InvalidData)
}
}
- fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
+ fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
let src = pkt.get_buffer();
- let mut br = BitReader::new(&src, src.len(), BitReaderMode::LE);
+ let mut br = BitReader::new(&src, BitReaderMode::LE);
let mut buf;
self.key_frame = pkt.is_keyframe();
if let Some(bbuf) = bufret {
buf = bbuf;
} else {
- let bufret = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 4);
- if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
- let bufinfo = bufret.unwrap();
+ let bufinfo = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 4)?;
buf = bufinfo.get_vbuf().unwrap();
self.key_frame = true;
self.hams.add_frame(buf);
buf = self.hams.get_output_frame().unwrap();
}
} else {
- let bufret = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 4);
- if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
- let bufinfo = bufret.unwrap();
+ let bufinfo = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 4)?;
buf = bufinfo.get_vbuf().unwrap();
}
-println!("decode frame {} b={} i={}", pkt.get_pts().unwrap(), self.is_ver_b, self.is_ver_i);
let nplanes = if self.is_gray { 1 } else { 3 };
if self.has_alpha {
validate!(!self.is_ver_b);
frm.set_frame_type(FrameType::P);
Ok(frm.into_ref())
}
+ fn flush(&mut self) {
+ self.ips.clear();
+ }
+}
+
+impl NAOptionHandler for BinkDecoder {
+ fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
+ fn set_options(&mut self, _options: &[NAOption]) { }
+ fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
}
-pub fn get_decoder() -> Box<NADecoder> {
+pub fn get_decoder() -> Box<dyn NADecoder + Send> {
Box::new(BinkDecoder::new())
}
mod test {
use nihav_core::codecs::RegisteredDecoders;
use nihav_core::demuxers::RegisteredDemuxers;
- use nihav_core::test::dec_video::*;
- use crate::codecs::rad_register_all_codecs;
- use crate::demuxers::rad_register_all_demuxers;
+ use nihav_codec_support::test::dec_video::*;
+ use crate::rad_register_all_codecs;
+ use crate::rad_register_all_demuxers;
#[test]
- fn test_binkvid() {
+ fn test_binkvid_b() {
let mut dmx_reg = RegisteredDemuxers::new();
rad_register_all_demuxers(&mut dmx_reg);
let mut dec_reg = RegisteredDecoders::new();
rad_register_all_codecs(&mut dec_reg);
- let file = "assets/RAD/NEW.BIK";
- //let file = "assets/RAD/NWCLOGO.BIK";
- test_file_decoding("bink", file, Some(42), true, false, None/*Some("bink-b")*/, &dmx_reg, &dec_reg);
+ test_decoding("bink", "bink-video", "assets/RAD/NEW.BIK", Some(16), &dmx_reg, &dec_reg,
+ ExpectedTestResult::MD5Frames(vec![
+ [0x00edef7e, 0x7efad3b1, 0x7e8bdd74, 0x3f6b00ba],
+ [0xbc40683f, 0xbeb1c5e4, 0x934777b5, 0x8a8a350d],
+ [0x68b78627, 0x28ceb63d, 0xfdb1171a, 0x23e69d90],
+ [0xc8d907a0, 0xb8d44079, 0x0286336b, 0x996479f3],
+ [0x57bbe4ec, 0xdb8bb9c2, 0x0e6f1fd6, 0xe180125e],
+ [0xd43c2ae0, 0x4010007f, 0x2a6360a1, 0xb5203a05],
+ [0xa883acf6, 0x25843f92, 0x4ced9a46, 0x6d513ad9],
+ [0x959e843f, 0x8d8182b9, 0x3f12d29b, 0x2af8d39f],
+ [0x93840946, 0x1188c6d1, 0xd5499833, 0x62aac0c6],
+ [0x4e5a56a6, 0x21517d9a, 0xbe1f270d, 0xe5621945],
+ [0x1b133742, 0x1eb1bf0a, 0x68cab2e3, 0x92176b5d],
+ [0x0cf78c43, 0x4bc15549, 0x3dd94323, 0x737eaaae],
+ [0xdd731c4a, 0x801453b3, 0xa38bef3e, 0x285cfdfe],
+ [0xe1fec4ee, 0x46737abc, 0x8c452209, 0xc8c6addd],
+ [0x2978aa50, 0x5f1e6d5a, 0x1f5b0fba, 0xb8e32196],
+ [0x2e1e95ab, 0x8e31a0b0, 0xfe998512, 0xea9397b6],
+ [0xf7f6c0d8, 0x893e77a7, 0xdfe0309f, 0xf5e644e2]]));
+ }
+ #[test]
+ fn test_binkvid() {
+ let mut dmx_reg = RegisteredDemuxers::new();
+ rad_register_all_demuxers(&mut dmx_reg);
+ let mut dec_reg = RegisteredDecoders::new();
+ rad_register_all_codecs(&mut dec_reg);
- //let file = "assets/RAD/bink_dct.bik";
- //let file = "assets/RAD/day3-b.bik";
- let file = "assets/RAD/ActivisionLogo.bik";
- //let file = "assets/RAD/ATI-9700-Animusic-Movie-v1.0.bik";
- //let file = "assets/RAD/original.bik";
- test_file_decoding("bink", file, Some(42), true, false, None/*Some("bink-")*/, &dmx_reg, &dec_reg);
+ test_decoding("bink", "bink-video", "assets/RAD/ActivisionLogo.bik", Some(42),
+ &dmx_reg, &dec_reg,
+ ExpectedTestResult::MD5([0x41128884, 0x73a8c710, 0x5072ea4a, 0x8caca428]));
}
}