aac: clear M/S flags
[nihav.git] / nihav-duck / src / codecs / vp6.rs
index 15bd832452a40974383391912bc9514fef74c7d0..916711cddbc00b5392b75c4f1c7f6b28ba257f7e 100644 (file)
@@ -54,7 +54,6 @@ impl VP56Parser for VP6BR {
             hdr.multistream = true;
         }
         let bytes = br.tell() >> 3;
-        std::mem::drop(br);
         bc.skip_bytes(bytes);
         self.loop_mode = 0;
         if hdr.is_intra {
@@ -478,15 +477,17 @@ struct VP6Decoder {
     info:       NACodecInfoRef,
     br:         VP6BR,
     has_alpha:  bool,
+    flipped:    bool,
 }
 
 impl VP6Decoder {
-    fn new(has_alpha: bool) -> Self {
+    fn new(flipped: bool, has_alpha: bool) -> Self {
         Self {
-            dec:        VP56Decoder::new(6, has_alpha, true),
+            dec:        VP56Decoder::new(6, has_alpha, flipped),
             info:       NACodecInfoRef::default(),
             br:         VP6BR::new(),
             has_alpha,
+            flipped,
         }
     }
 }
@@ -499,7 +500,15 @@ impl NADecoder for VP6Decoder {
                 } else {
                     VP_YUVA420_FORMAT
                 };
-            let myvinfo = NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), false, fmt);
+            let mut width  = vinfo.get_width();
+            let mut height = vinfo.get_height();
+            if let (false, Some(edta)) = (self.flipped, info.get_extradata()) {
+                if (width & 0xF) == 0 && (height & 0xF) == 0 {
+                    width  -= usize::from(edta[0] >> 4);
+                    height -= usize::from(edta[0] & 0xF);
+                }
+            }
+            let myvinfo = NAVideoInfo::new(width, height, self.flipped, fmt);
             let myinfo = NACodecTypeInfo::Video(myvinfo);
             self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
             self.dec.init(supp, myvinfo)?;
@@ -530,11 +539,15 @@ impl NAOptionHandler for VP6Decoder {
 }
 
 pub fn get_decoder_vp6() -> Box<dyn NADecoder + Send> {
-    Box::new(VP6Decoder::new(false))
+    Box::new(VP6Decoder::new(true, false))
+}
+
+pub fn get_decoder_vp6f() -> Box<dyn NADecoder + Send> {
+    Box::new(VP6Decoder::new(false, false))
 }
 
 pub fn get_decoder_vp6_alpha() -> Box<dyn NADecoder + Send> {
-    Box::new(VP6Decoder::new(true))
+    Box::new(VP6Decoder::new(false, true))
 }
 
 #[cfg(test)]
@@ -552,6 +565,7 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         duck_register_all_decoders(&mut dec_reg);
 
+        // sample from a private collection
         test_decoding("avi", "vp6", "assets/Duck/selection_720x576_300kBit_vp60i.avi", Some(16),
                       &dmx_reg, &dec_reg,
                       ExpectedTestResult::MD5([0x042c3e96, 0x8a9b26a2, 0x4dcbaf66, 0x1b788d03]));
@@ -563,6 +577,7 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         duck_register_all_decoders(&mut dec_reg);
 
+        // sample: https://samples.mplayerhq.hu/V-codecs/VP6/vp6_crash.avi
         test_decoding("avi", "vp6", "assets/Duck/vp6_crash.avi", Some(4),
                       &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![
                             [0xdcd70fa0, 0x0d075ce2, 0xc9e65077, 0xb003a92e],
@@ -578,6 +593,7 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         duck_register_all_decoders(&mut dec_reg);
 
+        // sample created by remuxing some VP6A in FLV
         test_decoding("avi", "vp6a", "assets/Duck/vp6a.avi", Some(25),
                       &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![
                             [0xaf903d79, 0x17ddb3c7, 0xf0a381e8, 0x26b36a7d],
@@ -605,6 +621,6 @@ mod test {
                             [0xd3801a96, 0x1b5384ff, 0x422b228c, 0x9c4582c4],
                             [0x8ddb0dfe, 0x302eb1ed, 0x10e64e22, 0x5a5a62b9],
                             [0x79338328, 0x06113781, 0x8b116d18, 0xde56707e],
-                            [0x671fa1b3, 0x0b3e41e9, 0xeb3a494c, 0xcdd24b1b]]));
+                            [0xdb58433b, 0x1de4ce67, 0x15fcbcee, 0x1df9de61]]));
     }
 }