X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-game%2Fsrc%2Fcodecs%2Fvmd.rs;h=3e002ea40f6a39f1cda820402380d2dc87f4192b;hb=ce742854b2912b880fb3d3e330042b049dac8504;hp=c6d98aa2d52dcfc1b26967883372e971426f8005;hpb=9895bd7b1732a96f0b3f61bf7c95ba342bd08b1e;p=nihav.git diff --git a/nihav-game/src/codecs/vmd.rs b/nihav-game/src/codecs/vmd.rs index c6d98aa..3e002ea 100644 --- a/nihav-game/src/codecs/vmd.rs +++ b/nihav-game/src/codecs/vmd.rs @@ -1,5 +1,6 @@ use nihav_core::codecs::*; use nihav_core::io::byteio::*; +use nihav_codec_support::codecs::HAMShuffler; use std::str::FromStr; macro_rules! lz_op { @@ -142,12 +143,12 @@ fn decode_frame_data(br: &mut ByteReader, dst: &mut [u8], mut dpos: usize, strid } Ok(false) }, - _ => return Err(DecoderError::InvalidData), + _ => Err(DecoderError::InvalidData), } } struct VMDVideoDecoder { - info: Rc, + info: NACodecInfoRef, pal: [u8; 768], buf: Vec, width: usize, @@ -158,7 +159,7 @@ struct VMDVideoDecoder { impl VMDVideoDecoder { fn new() -> Self { Self { - info: Rc::new(NACodecInfo::default()), + info: NACodecInfoRef::default(), pal: [0; 768], buf: Vec::new(), width: 0, @@ -169,7 +170,7 @@ impl VMDVideoDecoder { fn decode_frame(&mut self, br: &mut ByteReader, buf: &mut NAVideoBuffer) -> DecoderResult { let paloff = buf.get_offset(1); let stride = buf.get_stride(0); - let mut data = buf.get_data_mut(); + let data = buf.get_data_mut().unwrap(); let dst = data.as_mut_slice(); let frame_x = br.read_u16le()? as usize; @@ -202,7 +203,7 @@ impl VMDVideoDecoder { let method = br.read_byte()?; let is_intra; if (method & 0x80) != 0 { - validate!(self.buf.len() > 0); + validate!(!self.buf.is_empty()); lz_unpack(br, &mut self.buf)?; let mut mr = MemoryReader::new_read(&self.buf); let mut buf_br = ByteReader::new(&mut mr); @@ -215,12 +216,12 @@ impl VMDVideoDecoder { } impl NADecoder for VMDVideoDecoder { - fn init(&mut self, info: Rc) -> DecoderResult<()> { + fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { self.width = vinfo.get_width(); self.height = vinfo.get_height(); let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(self.width, self.height, false, PAL8_FORMAT)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); + self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref(); validate!(info.get_extradata().is_some()); if let Some(ref edata) = info.get_extradata() { @@ -239,7 +240,7 @@ impl NADecoder for VMDVideoDecoder { Err(DecoderError::InvalidData) } } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult { + fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult { let src = pkt.get_buffer(); validate!(src.len() >= 10); @@ -251,9 +252,7 @@ impl NADecoder for VMDVideoDecoder { 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.hams.add_frame(buf); buf = self.hams.get_output_frame().unwrap(); @@ -264,12 +263,15 @@ impl NADecoder for VMDVideoDecoder { let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::Video(buf)); frm.set_keyframe(is_intra); frm.set_frame_type(if is_intra { FrameType::I } else { FrameType::P }); - Ok(Rc::new(RefCell::new(frm))) + Ok(frm.into_ref()) + } + fn flush(&mut self) { + self.hams.clear(); } } -pub fn get_decoder_video() -> Box { +pub fn get_decoder_video() -> Box { Box::new(VMDVideoDecoder::new()) } @@ -324,18 +326,18 @@ impl VMDAudioDecoder { } else { let mut pred: [i32; 2] = [0; 2]; for ch in 0..channels { - pred[ch] = br.read_u16le()? as i32; + pred[ch] = i32::from(br.read_u16le()?); dst[off[ch]] = pred[ch] as i16; off[ch] += 1; } let mut ch = 0; let flip_ch = if channels == 2 { 1 } else { 0 }; - for _ in 1..self.blk_align { + for _ in channels..self.blk_align*channels { let b = br.read_byte()? as usize; if (b & 0x80) != 0 { - pred[ch] -= SOL_AUD_STEPS16[b & 0x7F] as i32; + pred[ch] -= i32::from(SOL_AUD_STEPS16[b & 0x7F]); } else { - pred[ch] += SOL_AUD_STEPS16[b & 0x7F] as i32; + pred[ch] += i32::from(SOL_AUD_STEPS16[b & 0x7F]); } //pred[ch] = pred[ch].max(-32768).min(32767); dst[off[ch]] = pred[ch] as i16; @@ -351,19 +353,20 @@ impl VMDAudioDecoder { } impl NADecoder for VMDAudioDecoder { - fn init(&mut self, info: Rc) -> DecoderResult<()> { + fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { let fmt; if ainfo.get_format().get_bits() == 8 { fmt = SND_U8_FORMAT; self.is16bit = false; self.blk_size = ainfo.get_block_len(); + self.blk_align = ainfo.get_block_len() / (ainfo.get_channels() as usize); } else { fmt = SND_S16P_FORMAT; self.is16bit = true; self.blk_size = (ainfo.get_block_len() + 1) * (ainfo.get_channels() as usize); + self.blk_align = ainfo.get_block_len(); }; - self.blk_align = ainfo.get_block_len() / (ainfo.get_channels() as usize); self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), ainfo.get_channels(), fmt, ainfo.get_block_len()); self.chmap = NAChannelMap::from_str(if ainfo.get_channels() == 1 { "C" } else { "L,R" }).unwrap(); Ok(()) @@ -371,7 +374,7 @@ impl NADecoder for VMDAudioDecoder { Err(DecoderError::InvalidData) } } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult { + fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult { let info = pkt.get_stream().get_info(); if let NACodecTypeInfo::Audio(_) = info.get_properties() { let pktbuf = pkt.get_buffer(); @@ -397,11 +400,11 @@ impl NADecoder for VMDAudioDecoder { if self.is16bit { let mut adata = abuf.get_abuf_i16().unwrap(); let off1 = adata.get_offset(1); - let mut dst = adata.get_data_mut(); + let mut dst = adata.get_data_mut().unwrap(); self.decode_16bit(&mut dst, off1, &mut br, nblocks, mask)?; } else { let mut adata = abuf.get_abuf_u8().unwrap(); - let mut dst = adata.get_data_mut(); + let dst = adata.get_data_mut().unwrap(); let mut doff = 0; let mut mask = mask; let channels = self.chmap.num_channels(); @@ -410,12 +413,21 @@ impl NADecoder for VMDAudioDecoder { for i in 0..self.blk_align * channels { dst[doff + i] = 0; } - } else { - for i in 0..self.blk_align * channels { + } else if channels == 1 { + for i in 0..self.blk_size { dst[doff + i] = br.read_byte()?; } + } else { + for i in 0..self.blk_size { + let val = br.read_byte()?; + if val < 128 { + dst[doff + i] = 127 - val; + } else { + dst[doff + i] = val; + } + } } - doff += self.blk_align; + doff += self.blk_align * channels; mask >>= 1; } } @@ -423,14 +435,16 @@ impl NADecoder for VMDAudioDecoder { let mut frm = NAFrame::new_from_pkt(pkt, info, abuf); frm.set_duration(Some(samples as u64)); frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) + Ok(frm.into_ref()) } else { Err(DecoderError::InvalidData) } } + fn flush(&mut self) { + } } -pub fn get_decoder_audio() -> Box { +pub fn get_decoder_audio() -> Box { Box::new(VMDAudioDecoder::new()) } @@ -438,9 +452,9 @@ pub fn get_decoder_audio() -> Box { mod test { use nihav_core::codecs::RegisteredDecoders; use nihav_core::demuxers::RegisteredDemuxers; - use nihav_core::test::dec_video::*; - use crate::codecs::game_register_all_codecs; - use crate::demuxers::game_register_all_demuxers; + use nihav_codec_support::test::dec_video::*; + use crate::game_register_all_codecs; + use crate::game_register_all_demuxers; #[test] fn test_vmd_video() { let mut dmx_reg = RegisteredDemuxers::new(); @@ -448,8 +462,8 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); game_register_all_codecs(&mut dec_reg); -// let file = "assets/1491.VMD"; - let file = "assets/128.vmd"; +// let file = "assets/Game/1491.VMD"; + let file = "assets/Game/128.vmd"; test_file_decoding("vmd", file, Some(10), true, false, None/*Some("vmd")*/, &dmx_reg, &dec_reg); } #[test] @@ -459,8 +473,10 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); game_register_all_codecs(&mut dec_reg); -// let file = "assets/1491.VMD"; - let file = "assets/128.vmd"; - test_decode_audio("vmd", file, None, "vmd", &dmx_reg, &dec_reg); +// let file = "assets/Game/1491.VMD"; + let file = "assets/Game/128.vmd"; +// let file = "assets/Game/1000.VMD"; +// let file = "assets/Game/235.VMD"; + test_decode_audio("vmd", file, None, None/*Some("vmd")*/, &dmx_reg, &dec_reg); } }