X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fcodecs%2Fh263%2Fdecoder.rs;h=08b47516b901bc58df4a105c984f31c69a2aae06;hb=47add47cb6a02a68e6e94755ba24ff348ca2065b;hp=b200bd55460655cb32839f6418f3e9204cbe7159;hpb=effbebce8a7acf0cbdd6075b523bbe0b1c33bb57;p=nihav.git diff --git a/src/codecs/h263/decoder.rs b/src/codecs/h263/decoder.rs index b200bd5..08b4751 100644 --- a/src/codecs/h263/decoder.rs +++ b/src/codecs/h263/decoder.rs @@ -81,7 +81,7 @@ impl MVInfo { _ => {}, }; } - + new_mv } fn set_zero_mv(&mut self, mb_x: usize) { @@ -133,6 +133,7 @@ pub struct H263BaseDecoder { b_data: Vec, pred_coeffs: Vec, is_gob: bool, + slice_reset: bool, may_have_b_frames: bool, mv_data: Vec, } @@ -153,7 +154,7 @@ fn clip_ac(ac: i16) -> i16 { #[allow(dead_code)] impl H263BaseDecoder { - pub fn new_with_opts(is_gob: bool, may_have_b_frames: bool) -> Self { + pub fn new_with_opts(is_gob: bool, slice_reset: bool, may_have_b_frames: bool) -> Self { H263BaseDecoder{ w: 0, h: 0, mb_w: 0, mb_h: 0, num_mb: 0, ftype: Type::Special, @@ -161,16 +162,16 @@ impl H263BaseDecoder { last_ts: 0, next_ts: 0, tsdiff: 0, has_b: false, b_data: Vec::new(), pred_coeffs: Vec::new(), - is_gob: is_gob, + is_gob: is_gob, slice_reset: slice_reset, may_have_b_frames: may_have_b_frames, mv_data: Vec::new(), } } pub fn new(is_gob: bool) -> Self { - Self::new_with_opts(is_gob, false) + Self::new_with_opts(is_gob, true, false) } pub fn new_b_frames(is_gob: bool) -> Self { - Self::new_with_opts(is_gob, true) + Self::new_with_opts(is_gob, true, true) } pub fn is_intra(&self) -> bool { self.ftype == Type::I } @@ -242,19 +243,21 @@ impl H263BaseDecoder { self.pred_coeffs.truncate(0); self.pred_coeffs.resize(self.mb_w * self.mb_h, ZERO_PRED_COEFFS); } + sstate.quant = slice.quant; for mb_y in 0..self.mb_h { for mb_x in 0..self.mb_w { for i in 0..6 { for j in 0..64 { blk[i][j] = 0; } } if slice.is_at_end(mb_pos) || (slice.needs_check() && mb_pos > 0 && bd.is_slice_end()) { slice = bd.decode_slice_header(&pinfo)?; - if !self.is_gob { + if !self.is_gob && self.slice_reset { mvi.reset(self.mb_w, mb_x, pinfo.get_mvmode()); if is_b || pinfo.is_pb() { mvi2.reset(self.mb_w, mb_x, pinfo.get_mvmode()); } cbpi.reset(self.mb_w); sstate.reset_slice(mb_x, mb_y); + sstate.quant = slice.quant; } } @@ -262,6 +265,7 @@ impl H263BaseDecoder { let cbp = binfo.get_cbp(); cbpi.set_cbp(mb_x, cbp); cbpi.set_q(mb_x, binfo.get_q()); + sstate.quant = binfo.get_q(); if binfo.is_intra() { if save_b_data { self.mv_data.push(BlockMVInfo::Intra);