aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2017-11-27 17:59:56 +0100
committerKostya Shishkov <kostya.shishkov@gmail.com>2017-11-27 17:59:56 +0100
commit6f21f5f488f8a82bcb156ff763ddf1737a7fd4a8 (patch)
treede81bc24b0dd45f59702b85058ebdb52769d85d7 /src
parent42a593529b69f5b4cac9e2e7fd8b4863c57e3caf (diff)
downloadnihav-6f21f5f488f8a82bcb156ff763ddf1737a7fd4a8.tar.gz
h263: track first line state too
Diffstat (limited to 'src')
-rw-r--r--src/codecs/h263/decoder.rs9
-rw-r--r--src/codecs/h263/mod.rs5
2 files changed, 9 insertions, 5 deletions
diff --git a/src/codecs/h263/decoder.rs b/src/codecs/h263/decoder.rs
index 15e18fc..420f6f8 100644
--- a/src/codecs/h263/decoder.rs
+++ b/src/codecs/h263/decoder.rs
@@ -215,8 +215,11 @@ impl H263BaseDecoder {
if slice.is_at_end(mb_pos) || (slice.needs_check() && mb_pos > 0 && bd.is_slice_end()) {
slice = bd.decode_slice_header(&pinfo)?;
- //mvi.reset(self.mb_w, mb_x, pinfo.get_mvmode());
- //cbpi.reset(self.mb_w);
+ if !self.is_gob {
+ mvi.reset(self.mb_w, mb_x, pinfo.get_mvmode());
+ cbpi.reset(self.mb_w);
+ sstate.first_line = true;
+ }
}
let binfo = bd.decode_block_header(&pinfo, &slice, &sstate)?;
@@ -228,7 +231,7 @@ impl H263BaseDecoder {
bd.decode_block_intra(&binfo, &sstate, binfo.get_q(), i, (cbp & (1 << (5 - i))) != 0, &mut blk[i])?;
if apply_acpred && (binfo.acpred != ACPredMode::None) {
let has_b = (i == 1) || (i == 3) || (mb_x > 0);
- let has_a = (i == 2) || (i == 3) || (mb_y > 0);
+ let has_a = (i == 2) || (i == 3) || !sstate.first_line;
let (b_mb, b_blk) = if has_b {
if (i == 1) || (i == 3) {
(mb_pos, i - 1)
diff --git a/src/codecs/h263/mod.rs b/src/codecs/h263/mod.rs
index c5d63fc..7e5064e 100644
--- a/src/codecs/h263/mod.rs
+++ b/src/codecs/h263/mod.rs
@@ -120,6 +120,7 @@ pub struct SliceState {
pub is_iframe: bool,
pub mb_x: usize,
pub mb_y: usize,
+ pub first_line: bool,
}
const SLICE_NO_END: usize = 99999999;
@@ -141,10 +142,10 @@ impl SliceInfo {
impl SliceState {
pub fn new(is_iframe: bool) -> Self {
- SliceState { is_iframe: is_iframe, mb_x: 0, mb_y: 0 }
+ SliceState { is_iframe: is_iframe, mb_x: 0, mb_y: 0, first_line: true }
}
pub fn next_mb(&mut self) { self.mb_x += 1; }
- pub fn new_row(&mut self) { self.mb_x = 0; self.mb_y += 1; }
+ pub fn new_row(&mut self) { self.mb_x = 0; self.mb_y += 1; self.first_line = false; }
}
#[derive(Debug,Clone,Copy)]