X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-indeo%2Fsrc%2Fcodecs%2Fivibr.rs;h=8ce4d1b03d1729538c4447b6cc0417e488f45cb1;hp=edeec468b352fe07b92b91150f6c7c9dec04785a;hb=379524159c95f1c3639976ccf35f9d47cd9732ac;hpb=171860fcc4a4ba3ec28bc4b720b9f582377be4cf diff --git a/nihav-indeo/src/codecs/ivibr.rs b/nihav-indeo/src/codecs/ivibr.rs index edeec46..8ce4d1b 100644 --- a/nihav-indeo/src/codecs/ivibr.rs +++ b/nihav-indeo/src/codecs/ivibr.rs @@ -1,14 +1,13 @@ use std::mem; -use std::rc::Rc; -pub use std::cell::{Ref,RefCell}; use nihav_core::io::bitreader::*; //use io::intcode::*; use nihav_core::codecs::*; +use nihav_core::frame::NABufferRef; use super::ivi::*; use super::ividsp::*; pub fn scale_mv(val: i32, scale: u8) -> i32 { - (val + (if val > 0 { 1 } else { 0 }) + (scale as i32) - 1) >> scale + (val + (if val > 0 { 1 } else { 0 }) + i32::from(scale) - 1) >> scale } #[derive(Clone,Copy)] @@ -103,7 +102,7 @@ impl<'a> IVICodebookReader for BitReader<'a> { Ok(base + add) } else { let nbits = cb.bits[0]; - return Ok(IVI_REVS[nbits as usize][self.read(nbits)? as usize]); + Ok(IVI_REVS[nbits as usize][self.read(nbits)? as usize]) } } #[inline(always)] @@ -146,6 +145,7 @@ pub const IVI_BLK_CB: &[IVICodebook; 8] = &[ ]; #[allow(unused_variables)] +#[allow(clippy::many_single_char_names)] fn read_trans_band_header(br: &mut BitReader, w: usize, h: usize, dst: &mut [i16], dstride: usize) -> DecoderResult<()> { let color_plane = br.read(2)?; let bit_depth = br.read(3)?; @@ -171,6 +171,7 @@ fn read_trans_band_header(br: &mut BitReader, w: usize, h: usize, dst: &mut [i16 for i in 0..cb.len { cb.bits[i] = br.read(4)? as u8; } + cb = cb.init(); br.align(); let tile_start = br.tell(); @@ -227,7 +228,8 @@ let tile_end = tile_start + len * 8; Ok(()) } -fn decode_block8x8(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams8x8, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: &TrFunc) -> DecoderResult<()> { +#[allow(clippy::cast_lossless)] +fn decode_block8x8(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams8x8, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: TrFunc) -> DecoderResult<()> { let mut idx: isize = -1; let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter }; while idx <= 64 { @@ -259,7 +261,7 @@ fn decode_block8x8(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tabl validate!((idx >= 0) && (idx < 64)); let spos = tables.scan[idx as usize]; - let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9; + let q = (u32::from(quant_mat[spos]) * u32::from(quant)) >> 9; if q > 1 { let qq = q as i32; let bias = (((q ^ 1) - 1) >> 1) as i32; @@ -277,7 +279,8 @@ fn decode_block8x8(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tabl (transform)(coeffs); Ok(()) } -fn decode_block4x4(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams4x4, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: &TrFunc) -> DecoderResult<()> { +#[allow(clippy::cast_lossless)] +fn decode_block4x4(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams4x4, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: TrFunc) -> DecoderResult<()> { let mut idx: isize = -1; let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter }; while idx <= 64 { @@ -308,7 +311,7 @@ fn decode_block4x4(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tabl validate!((idx >= 0) && (idx < 16)); let spos = tables.scan[idx as usize]; - let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9; + let q = (u32::from(quant_mat[spos]) * u32::from(quant)) >> 9; if q > 1 { let qq = q as i32; let bias = (((q ^ 1) - 1) >> 1) as i32; @@ -329,24 +332,24 @@ fn decode_block4x4(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tabl fn put_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) { unsafe { - let mut dptr = frame.as_mut_ptr().offset(offs as isize); + let mut dptr = frame.as_mut_ptr().add(offs); for y in 0..blk_size { for x in 0..blk_size { - *dptr.offset(x as isize) = blk[x + y * blk_size] as i16; + *dptr.add(x) = blk[x + y * blk_size] as i16; } - dptr = dptr.offset(stride as isize); + dptr = dptr.add(stride); } } } fn add_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) { unsafe { - let mut dptr = frame.as_mut_ptr().offset(offs as isize); + let mut dptr = frame.as_mut_ptr().add(offs); for y in 0..blk_size { for x in 0..blk_size { - *dptr.offset(x as isize) = (*dptr.offset(x as isize)).wrapping_add(blk[x + y * blk_size] as i16); + *dptr.add(x) = (*dptr.add(x)).wrapping_add(blk[x + y * blk_size] as i16); } - dptr = dptr.offset(stride as isize); + dptr = dptr.add(stride); } } } @@ -363,12 +366,12 @@ fn align(val: usize, bits: u8) -> usize { } impl FrameData { - fn new() -> Rc> { - Rc::new(RefCell::new(FrameData { + fn new() -> NABufferRef { + NABufferRef::new(FrameData { plane_buf: [Vec::new(), Vec::new(), Vec::new(), Vec::new()], plane_stride: [0, 0, 0, 0], pic_hdr: PictureHeader::new_null(IVIFrameType::Intra), - })) + }) } fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> { let width = align(pic_hdr.width, 6); @@ -407,6 +410,7 @@ impl FrameData { } } +#[allow(clippy::many_single_char_names)] fn do_mc(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, is_hpel: bool, blk_size: usize) { let (xoff, yoff, mv_mode) = if is_hpel { (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8) @@ -428,6 +432,7 @@ fn do_mc(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, x: usize, } } +#[allow(clippy::many_single_char_names)] fn do_mc_b(dst: &mut [i16], dstride: usize, src1: &[i16], sstride1: usize, src2: &[i16], sstride2: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, mv2_x: i32, mv2_y: i32, is_hpel: bool, blk_size: usize) { let (xoff1, yoff1, mv_mode1) = if is_hpel { (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8) @@ -459,7 +464,7 @@ fn do_mc_b(dst: &mut [i16], dstride: usize, src1: &[i16], sstride1: usize, src2: pub trait IndeoXParser { fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult; fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult; - fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band_hdr: &BandHeader, tile: &mut IVITile, ref_tile: Option>, mv_scale: u8) -> DecoderResult<()>; + fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band_hdr: &BandHeader, tile: &mut IVITile, ref_tile: Option<&IVITile>, mv_scale: u8) -> DecoderResult<()>; fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize); } @@ -467,7 +472,7 @@ const MISSING_REF: usize = 42; pub struct IVIDecoder { ftype: IVIFrameType, - frames: [Rc>; 4], + frames: [NABufferRef; 4], cur_frame: usize, prev_frame: usize, next_frame: usize, @@ -479,7 +484,7 @@ pub struct IVIDecoder { bref: Option, bands: Vec, - tiles: Vec>>, + tiles: Vec, num_tiles: [[usize; 4]; 4], tile_start: [[usize; 4]; 4], } @@ -497,7 +502,7 @@ impl IVIDecoder { vinfoa: NAVideoInfo::new(0, 0, false, YUVA410_FORMAT), bref: None, - bands: bands, + bands, tiles: Vec::new(), tile_start: [[0; 4]; 4], num_tiles: [[0; 4]; 4], } } @@ -505,8 +510,8 @@ impl IVIDecoder { fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> { let planes = if pic_hdr.transparent { 4 } else { 3 }; - //self.bands.truncate(0); - self.tiles.truncate(0); + //self.bands.clear(); + self.tiles.clear(); self.num_tiles = [[0; 4]; 4]; self.tile_start = [[0; 4]; 4]; let mut tstart: usize = 0; @@ -536,7 +541,7 @@ impl IVIDecoder { while x < band_w { let cur_w = if x + tile_w <= band_w { tile_w } else { band_w - x }; let tile = IVITile::new(band_xoff + x, band_yoff + y, cur_w, cur_h); - self.tiles.push(Rc::new(RefCell::new(tile))); + self.tiles.push(tile); self.num_tiles[plane][band] += 1; tstart += 1; x += tile_w; @@ -547,7 +552,7 @@ impl IVIDecoder { } Ok(()) } - fn decode_band(&mut self, pic_hdr: &PictureHeader, dec: &mut IndeoXParser, br: &mut BitReader, plane_no: usize, band_no: usize) -> DecoderResult<()> { + fn decode_band(&mut self, pic_hdr: &PictureHeader, dec: &mut dyn IndeoXParser, br: &mut BitReader, plane_no: usize, band_no: usize) -> DecoderResult<()> { let bidx = match plane_no { 0 => { band_no }, _ => { pic_hdr.luma_bands + plane_no - 1 }, @@ -572,12 +577,12 @@ impl IVIDecoder { }; for tile_no in tstart..tend { { - let mut tile = self.tiles[tile_no].borrow_mut(); + let tile = &mut self.tiles[tile_no]; let mb_w = (tile.w + mb_size - 1) / mb_size; let mb_h = (tile.h + mb_size - 1) / mb_size; tile.mb_w = mb_w; tile.mb_h = mb_h; - tile.mb.truncate(0); + tile.mb.clear(); tile.mb.resize(mb_w * mb_h, MB::new(0, 0)); } @@ -595,16 +600,17 @@ impl IVIDecoder { validate!(tile_end > br.tell()); validate!(tile_end <= br.tell() + (br.left() as usize)); { - let mut tile = self.tiles[tile_no].borrow_mut(); - let ref_tile: Option>; + let ref_tile: Option<&IVITile>; let mv_scale; if (plane_no == 0) && (band_no == 0) { mv_scale = 0; } else { mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8; } + let (ref_tiles, cur_tiles) = self.tiles.split_at_mut(tile_no); + let tile = &mut cur_tiles[0]; if plane_no != 0 || band_no != 0 { - let rtile = self.tiles[0].borrow(); + let rtile = &ref_tiles[0]; if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) { ref_tile = None; } else { @@ -613,24 +619,25 @@ impl IVIDecoder { } else { ref_tile = None; } - dec.decode_mb_info(br, pic_hdr, &band, &mut tile, ref_tile, mv_scale)?; + dec.decode_mb_info(br, pic_hdr, &band, tile, ref_tile, mv_scale)?; } - self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?; + self.decode_tile(br, &band, tile_no, tr, tr_dc)?; let skip_part = tile_end - br.tell(); br.skip(skip_part as u32)?; } else { { - let mut tile = self.tiles[tile_no].borrow_mut(); - let ref_tile: Option>; + let ref_tile: Option<&IVITile>; let mv_scale; if (plane_no == 0) && (band_no == 0) { mv_scale = 0; } else { mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8; } + let (ref_tiles, cur_tiles) = self.tiles.split_at_mut(tile_no); + let tile = &mut cur_tiles[0]; if plane_no != 0 || band_no != 0 { - let rtile = self.tiles[0].borrow(); + let rtile = &ref_tiles[0]; if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) { ref_tile = None; } else { @@ -658,18 +665,18 @@ br.skip(skip_part as u32)?; } } } - self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?; + self.decode_tile(br, &band, tile_no, tr, tr_dc)?; } } self.bands[bidx] = band; br.align(); Ok(()) } - fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: &TrFunc, transform_dc: &TrFuncDC) -> DecoderResult<()> { + fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: TrFunc, transform_dc: TrFuncDC) -> DecoderResult<()> { let mut mb_idx = 0; let mut prev_dc: i32 = 0; - let mut tile = self.tiles[tile_no].borrow_mut(); - let mut frame = self.frames[self.cur_frame].borrow_mut(); + let tile = &mut self.tiles[tile_no]; + let mut frame = self.frames[self.cur_frame].clone(); let stride = frame.plane_stride[band.plane_no]; let mut dstidx = tile.pos_x + tile.pos_y * stride; @@ -697,7 +704,7 @@ br.skip(skip_part as u32)?; } else { idx = self.next_frame; } - let pf = self.frames[idx].borrow(); + let pf = &self.frames[idx]; do_mc(&mut dst[dstidx + boff..], stride, &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no], pos_x + mb_x * band.mb_size + (blk_no & 1) * band.blk_size, @@ -705,8 +712,8 @@ br.skip(skip_part as u32)?; pos_x, pos_x + tile_w, pos_y, pos_y + tile_h, mb.mv_x, mb.mv_y, band.halfpel, band.blk_size); } else { - let pf = self.frames[self.prev_frame].borrow(); - let nf = self.frames[self.next_frame].borrow(); + let pf = &self.frames[self.prev_frame]; + let nf = &self.frames[self.next_frame]; do_mc_b(&mut dst[dstidx + boff..], stride, &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no], &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no], @@ -752,7 +759,7 @@ br.skip(skip_part as u32)?; } else { idx = self.next_frame; } - let pf = self.frames[idx].borrow(); + let pf = &self.frames[idx]; do_mc(&mut dst[dstidx + mb_x * band.blk_size..], stride, &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no], pos_x + mb_x * band.mb_size, @@ -760,8 +767,8 @@ br.skip(skip_part as u32)?; pos_x, pos_x + tile_w, pos_y, pos_y + tile_h, mb.mv_x, mb.mv_y, band.halfpel, band.blk_size); } else { - let pf = self.frames[self.prev_frame].borrow(); - let nf = self.frames[self.next_frame].borrow(); + let pf = &self.frames[self.prev_frame]; + let nf = &self.frames[self.next_frame]; do_mc_b(&mut dst[dstidx + mb_x * band.blk_size..], stride, &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no], &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no], @@ -820,7 +827,7 @@ br.skip(skip_part as u32)?; unreachable!(); } - fn decode_single_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult { + fn decode_single_frame<'a>(&mut self, dec: &mut dyn IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult { let pic_hdr = dec.decode_picture_header(br)?; self.ftype = pic_hdr.ftype; if pic_hdr.ftype.is_null() { @@ -857,17 +864,12 @@ br.skip(skip_part as u32)?; _ => {}, }; - let mut vinfo; - if pic_hdr.transparent { - vinfo = self.vinfoa.clone(); - } else { - vinfo = self.vinfo.clone(); - } + let mut vinfo = if pic_hdr.transparent { self.vinfoa } else { self.vinfo }; vinfo.set_width(pic_hdr.width); vinfo.set_height(pic_hdr.height); let mut buftype = alloc_video_buffer(vinfo, 0)?; self.realloc(&pic_hdr)?; - self.frames[self.cur_frame].borrow_mut().realloc(&pic_hdr)?; + self.frames[self.cur_frame].realloc(&pic_hdr)?; for plane in 0..3 { let num_bands = if plane == 0 { pic_hdr.luma_bands } else { pic_hdr.chroma_bands }; @@ -875,7 +877,7 @@ br.skip(skip_part as u32)?; self.decode_band(&pic_hdr, dec, br, plane, band)?; } if let NABufferType::Video(ref mut vb) = buftype { - let mut frame = self.frames[self.cur_frame].borrow_mut(); + let mut frame = self.frames[self.cur_frame].clone(); if num_bands == 1 { frame.fill_plane(vb, plane); } else { @@ -889,7 +891,7 @@ br.skip(skip_part as u32)?; } } if pic_hdr.transparent { - let mut frame = self.frames[self.cur_frame].borrow_mut(); + let mut frame = self.frames[self.cur_frame].clone(); let stride = frame.plane_stride[3]; read_trans_band_header(br, pic_hdr.width, pic_hdr.height, &mut frame.plane_buf[3], stride)?; if let NABufferType::Video(ref mut vb) = buftype { @@ -898,7 +900,7 @@ br.skip(skip_part as u32)?; } match self.ftype { - IVIFrameType::Intra | IVIFrameType::Inter => { + IVIFrameType::Intra | IVIFrameType::Intra1 | IVIFrameType::Inter => { self.iref_1 = self.iref_0; self.iref_0 = self.cur_frame; self.scal_ref = self.cur_frame; @@ -912,7 +914,7 @@ br.skip(skip_part as u32)?; Ok(buftype) } - pub fn decode_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult { + pub fn decode_frame<'a>(&mut self, dec: &mut dyn IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult { let res = self.decode_single_frame(dec, br); if res.is_err() { return res; } if (self.ftype == IVIFrameType::Intra) && (br.left() > 16) { @@ -929,8 +931,8 @@ br.skip(skip_part as u32)?; let seq = br.peek(21); if seq == 0xBFFF8 { let res2 = self.decode_single_frame(dec, br); - if res2.is_ok() { - self.bref = Some(res2.unwrap()); + if let Ok(res) = res2 { + self.bref = Some(res); } } self.ftype = IVIFrameType::Intra; @@ -947,10 +949,18 @@ br.skip(skip_part as u32)?; res } - pub fn is_intra(&mut self) -> bool { + pub fn flush(&mut self) { + self.prev_frame = MISSING_REF; + self.next_frame = MISSING_REF; + self.iref_0 = MISSING_REF; + self.iref_1 = MISSING_REF; + self.scal_ref = MISSING_REF; + } + + pub fn is_intra(&self) -> bool { self.ftype.is_intra() } - pub fn get_frame_type(&mut self) -> FrameType { + pub fn get_frame_type(&self) -> FrameType { match self.ftype { IVIFrameType::Intra => { FrameType::I }, IVIFrameType::Intra1 => { FrameType::I }, @@ -976,7 +986,7 @@ impl Clone for RVMap { let mut valtab: [i8; 256] = [0; 256]; runtab.copy_from_slice(&self.runtab); valtab.copy_from_slice(&self.valtab); - RVMap { eob_sym: self.eob_sym, esc_sym: self.esc_sym, runtab: runtab, valtab: valtab } + RVMap { eob_sym: self.eob_sym, esc_sym: self.esc_sym, runtab, valtab } } }