]> git.nihav.org Git - nihav.git/blobdiff - nihav-realmedia/src/codecs/rv3040.rs
realmedia/rv40dsp: fix typos in loop filters
[nihav.git] / nihav-realmedia / src / codecs / rv3040.rs
index f3d17435af43ff316de3803057b21d9fdcd08301..c3526196356ca9da336dfd4f891b17c46affa7a1 100644 (file)
@@ -1,9 +1,10 @@
 use nihav_core::formats::YUV420_FORMAT;
 use nihav_core::frame::{NABufferType, NAVideoInfo, NAVideoBuffer, NAVideoBufferRef, FrameType, alloc_video_buffer};
-use nihav_core::codecs::{NADecoderSupport, MV, ZERO_MV, DecoderError, DecoderResult, IPBShuffler};
+use nihav_core::codecs::{NADecoderSupport, DecoderError, DecoderResult};
+use nihav_codec_support::codecs::{MV, ZERO_MV, IPBShuffler};
 use nihav_core::io::bitreader::{BitReader,BitReaderMode};
 use nihav_core::io::intcode::*;
-use nihav_core::data::GenericCache;
+use nihav_codec_support::data::GenericCache;
 use std::mem;
 
 use super::rv34codes::*;
@@ -502,7 +503,7 @@ pub trait RV34BitstreamDecoder {
 }
 
 pub trait RV34DSP {
-    fn loop_filter(&self, frame: &mut NAVideoBuffer<u8>, ftype: FrameType, mbinfo: &[RV34MBInfo], mb_w: usize, row: usize);
+    fn loop_filter(&self, frame: &mut NAVideoBuffer<u8>, ftype: FrameType, mbinfo: &[RV34MBInfo], mb_w: usize, mb_h: usize, row: usize);
     fn do_luma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, mv: MV, use16: bool, avg: bool);
     fn do_chroma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, comp: usize, mv: MV, use8: bool, avg: bool);
 }
@@ -538,10 +539,23 @@ fn decode_slice_header(br: &mut BitReader, bd: &mut RV34BitstreamDecoder, slice_
     if slice_no < slice_offs.len() - 1 {
         let cur_pos = br.tell() as u32;
         br.seek((slice_offs[slice_no + 1] * 8) as u32)?;
-        let nhdr = bd.decode_slice_header(br, shdr.width, shdr.height)?;
+        if let Ok(nhdr) = bd.decode_slice_header(br, shdr.width, shdr.height) {
+            validate!(nhdr.start > shdr.start);
+            shdr.end = nhdr.start;
+        } else {
+            if slice_no + 2 < slice_offs.len() {
+                br.seek((slice_offs[slice_no + 2] * 8) as u32)?;
+                if let Ok(nhdr) = bd.decode_slice_header(br, shdr.width, shdr.height) {
+                    validate!(nhdr.start > shdr.start);
+                    shdr.end = nhdr.start;
+                } else {
+                    shdr.end = ((shdr.width + 15) >> 4) * ((shdr.height + 15) >> 4);
+                }
+            } else {
+                shdr.end = ((shdr.width + 15) >> 4) * ((shdr.height + 15) >> 4);
+            }
+        }
         br.seek(cur_pos)?;
-        validate!(nhdr.start > shdr.start);
-        shdr.end = nhdr.start;
     } else {
         shdr.end = ((shdr.width + 15) >> 4) * ((shdr.height + 15) >> 4);
     }
@@ -1251,12 +1265,12 @@ impl RV34Decoder {
                 mb_pos += 1;
             }
             if hdr0.deblock && (mb_y >= 1) {
-                self.dsp.loop_filter(&mut buf, hdr0.ftype, &mbinfo, mb_w, mb_y - 1);
+                self.dsp.loop_filter(&mut buf, hdr0.ftype, &mbinfo, mb_w, mb_h, mb_y - 1);
             }
             imode.update();
         }
         if hdr0.deblock {
-            self.dsp.loop_filter(&mut buf, hdr0.ftype, &mbinfo, mb_w, mb_h - 1);
+            self.dsp.loop_filter(&mut buf, hdr0.ftype, &mbinfo, mb_w, mb_h, mb_h - 1);
         }
         if !self.is_b {
             self.ipbs.add_frame(buf.clone());