From d3c6bf23fb08c1efaeccd4dc78a2f7054ddaa953 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Thu, 2 Apr 2026 19:31:49 +0200 Subject: [PATCH] mov: improve and extend tests Test data is based on pre-refactored version. --- nihav-commonfmt/src/demuxers/mov/mod.rs | 248 ++++++++++++++++-------- 1 file changed, 169 insertions(+), 79 deletions(-) diff --git a/nihav-commonfmt/src/demuxers/mov/mod.rs b/nihav-commonfmt/src/demuxers/mov/mod.rs index ad95837..25cb58f 100644 --- a/nihav-commonfmt/src/demuxers/mov/mod.rs +++ b/nihav-commonfmt/src/demuxers/mov/mod.rs @@ -801,110 +801,200 @@ impl DemuxerCreator for MacResForkMOVDemuxerCreator { mod test { use super::*; use std::fs::File; + use nihav_codec_support::test::dmx_test::*; - #[test] - fn test_mov_demux() { - // sample: https://samples.mplayerhq.hu/V-codecs/IV32/cubes.mov - let mut file = File::open("assets/Indeo/cubes.mov").unwrap(); + fn test_core(name: &str, demux_mode: DemuxMode, nframes: usize, test_mode: DemuxerTestMode) { + let mut file = File::open(name).unwrap(); let mut br = FileReader::new_read(&mut file); - let mut dmx = MOVDemuxer::new(&mut br); + let mut dmx = match demux_mode { + DemuxMode::Normal => MOVDemuxer::new(&mut br), + DemuxMode::MacBin => MOVDemuxer::new_macbinary(&mut br), + DemuxMode::ResFork => MOVDemuxer::new_resfork(&mut br), + }; let mut sm = StreamManager::new(); let mut si = SeekIndex::new(); dmx.open(&mut sm, &mut si).unwrap(); - - loop { - let pktres = dmx.get_frame(&mut sm); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - println!("Got {}", pkt); - } + test_demuxer(&mut dmx, &mut sm, nframes, test_mode); + } + #[test] + fn test_mov_demux() { + // sample: https://samples.mplayerhq.hu/V-codecs/IV32/cubes.mov + test_core("assets/Indeo/cubes.mov", DemuxMode::Normal, 10, DemuxerTestMode::Demux); } #[test] fn test_dash_demux() { // sample: a stream downloaded with youtube-dl - let mut file = File::open("assets/ITU/dash.m4a").unwrap(); - let mut br = FileReader::new_read(&mut file); - let mut dmx = MOVDemuxer::new(&mut br); - let mut sm = StreamManager::new(); - let mut si = SeekIndex::new(); - dmx.open(&mut sm, &mut si).unwrap(); - - loop { - let pktres = dmx.get_frame(&mut sm); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - println!("Got {}", pkt); - } + test_core("assets/ITU/dash.m4a", DemuxMode::Normal, 10, DemuxerTestMode::Test(vec![ + DPacket::new(0, Some(0), Some(0), 371, true), + DPacket::new(0, Some(1), Some(1), 372, false), + DPacket::new(0, Some(2), Some(2), 371, false), + DPacket::new(0, Some(3), Some(3), 372, false), + DPacket::new(0, Some(4), Some(4), 371, false), + DPacket::new(0, Some(5), Some(5), 372, false), + DPacket::new(0, Some(6), Some(6), 371, false), + DPacket::new(0, Some(7), Some(7), 372, false), + DPacket::new(0, Some(8), Some(8), 371, false), + DPacket::new(0, Some(9), Some(9), 372, false)])); } #[test] fn test_macbinary_demux() { // sample from King's Quest VI Macintosh edition - let mut file = File::open("assets/QT/Halfdome.bin").unwrap(); - let mut br = FileReader::new_read(&mut file); - let mut dmx = MOVDemuxer::new_macbinary(&mut br); - let mut sm = StreamManager::new(); - let mut si = SeekIndex::new(); - dmx.open(&mut sm, &mut si).unwrap(); - - loop { - let pktres = dmx.get_frame(&mut sm); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - println!("Got {}", pkt); - } + test_core("assets/QT/Halfdome.bin", DemuxMode::MacBin, 10, DemuxerTestMode::Test(vec![ + DPacket::new(0, Some(0), Some(0), 11604, true), + DPacket::new(0, Some(1), Some(1), 12344, false), + DPacket::new(0, Some(2), Some(2), 8348, false), + DPacket::new(0, Some(3), Some(3), 8344, false), + DPacket::new(0, Some(4), Some(4), 8336, false), + DPacket::new(0, Some(5), Some(5), 8348, false), + DPacket::new(0, Some(6), Some(6), 8312, false), + DPacket::new(0, Some(7), Some(7), 8344, false), + DPacket::new(0, Some(8), Some(8), 12324, false), + DPacket::new(0, Some(9), Some(9), 12276, false)])); } - #[test] fn test_beta_qt() { // sample from Apple Reference & Presentation Library 8 - let mut file = File::open("assets/QT/Smallwhale2").unwrap(); - let mut br = FileReader::new_read(&mut file); - let mut dmx = MOVDemuxer::new_macbinary(&mut br); - let mut sm = StreamManager::new(); - let mut si = SeekIndex::new(); - dmx.open(&mut sm, &mut si).unwrap(); - - loop { - let pktres = dmx.get_frame(&mut sm); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - println!("Got {}", pkt); - } + test_core("assets/QT/Smallwhale2", DemuxMode::MacBin, 10, DemuxerTestMode::Test(vec![ + DPacket::new(0, Some(0), Some(0), 9216, true), + DPacket::new(1, Some(0), Some(0), 6144, true), + DPacket::new(0, Some(17), Some(17), 9216, true), + DPacket::new(1, Some(6144), Some(6144), 6144, true), + DPacket::new(0, Some(33), Some(33), 9216, true), + DPacket::new(0, Some(48), Some(48), 9216, true), + DPacket::new(1, Some(12288), Some(12288), 6144, true), + DPacket::new(0, Some(64), Some(64), 9216, true), + DPacket::new(0, Some(81), Some(81), 9216, true), + DPacket::new(1, Some(18432), Some(18432), 6144, true)])); } #[test] fn test_resfork_demux() { // sample from The Wonders of Electricity: An Adventure in Safety - let mut file = File::open("assets/QT/car.mov").unwrap(); - let mut br = FileReader::new_read(&mut file); - let mut dmx = MOVDemuxer::new_resfork(&mut br); - let mut sm = StreamManager::new(); - let mut si = SeekIndex::new(); - dmx.open(&mut sm, &mut si).unwrap(); + test_core("assets/QT/car.mov", DemuxMode::ResFork, 10, DemuxerTestMode::Test(vec![ + DPacket::new(0, Some(0), Some(0), 6144, true), + DPacket::new(0, Some(6144), Some(6144), 4882, true), + DPacket::new(0, Some(11026), Some(11026), 6144, true), + DPacket::new(0, Some(17170), Some(17170), 4882, true), + DPacket::new(0, Some(22052), Some(22052), 6144, true), + DPacket::new(0, Some(28196), Some(28196), 4882, true), + DPacket::new(0, Some(33078), Some(33078), 6144, true), + DPacket::new(0, Some(39222), Some(39222), 4882, true), + DPacket::new(0, Some(44104), Some(44104), 6144, true), + DPacket::new(0, Some(50248), Some(50248), 4882, true)])); + } - loop { - let pktres = dmx.get_frame(&mut sm); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - println!("Got {}", pkt); - } + #[test] + fn test_demux_rle_qdmc() { + // sample from https://samples.mplayerhq.hu/V-codecs/QTRLE/ + test_core("assets/QT/tidemo1-24bit-rle.mov", DemuxMode::Normal, 32, DemuxerTestMode::Test(vec![ + DPacket::new(0, Some(0), Some(0), 1486, true), + DPacket::new(1, Some(0), Some(0), 309332, true), + DPacket::new(0, Some(1), Some(1), 1486, false), + DPacket::new(1, Some(240), Some(240), 10051, false), + DPacket::new(0, Some(2), Some(2), 1486, false), + DPacket::new(0, Some(3), Some(3), 1486, true), + DPacket::new(1, Some(300), Some(300), 23679, false), + DPacket::new(1, Some(360), Some(360), 51289, false), + DPacket::new(0, Some(4), Some(4), 1486, false), + DPacket::new(1, Some(420), Some(420), 41900, false), + DPacket::new(1, Some(480), Some(480), 46795, false), + DPacket::new(0, Some(5), Some(5), 1486, false), + DPacket::new(1, Some(540), Some(540), 24484, false), + DPacket::new(1, Some(600), Some(600), 27925, false), + DPacket::new(0, Some(6), Some(6), 1486, true), + DPacket::new(1, Some(660), Some(660), 19757, false), + DPacket::new(1, Some(1680), Some(1680), 46203, false), + DPacket::new(0, Some(7), Some(7), 1486, false), + DPacket::new(0, Some(8), Some(8), 1486, false), + DPacket::new(0, Some(9), Some(9), 1486, true), + DPacket::new(0, Some(10), Some(10), 1486, false), + DPacket::new(0, Some(11), Some(11), 1486, true), + DPacket::new(0, Some(12), Some(12), 1486, false), + DPacket::new(0, Some(13), Some(13), 1486, false), + DPacket::new(0, Some(14), Some(14), 1486, true), + DPacket::new(0, Some(15), Some(15), 1486, false), + DPacket::new(0, Some(16), Some(16), 1486, false), + DPacket::new(1, Some(1740), Some(1740), 42094, false), + DPacket::new(1, Some(1800), Some(1800), 12453, false), + DPacket::new(0, Some(17), Some(17), 1486, true), + DPacket::new(1, Some(2040), Some(2040), 14418, false), + DPacket::new(0, Some(18), Some(18), 1486, false)])); + } + #[test] + fn test_demux_asp_adpcm() { + // sample from https://samples.mplayerhq.hu/A-codecs/ima-adpcm/ + test_core("assets/QT/shuffle-ima41.mov", DemuxMode::Normal, 32, DemuxerTestMode::Test(vec![ + DPacket::new(0, Some(0), Some(0), 68, true), + DPacket::new(1, Some(0), Some(0), 11494, true), + DPacket::new(0, Some(1), Some(1), 68, false), + DPacket::new(1, Some(1), Some(1), 3070, false), + DPacket::new(0, Some(2), Some(2), 68, false), + DPacket::new(0, Some(3), Some(3), 68, false), + DPacket::new(0, Some(4), Some(4), 68, false), + DPacket::new(0, Some(5), Some(5), 68, false), + DPacket::new(0, Some(6), Some(6), 68, false), + DPacket::new(0, Some(7), Some(7), 68, false), + DPacket::new(0, Some(8), Some(8), 68, false), + DPacket::new(0, Some(9), Some(9), 68, false), + DPacket::new(0, Some(10), Some(10), 68, false), + DPacket::new(0, Some(11), Some(11), 68, false), + DPacket::new(0, Some(12), Some(12), 68, false), + DPacket::new(0, Some(13), Some(13), 68, false), + DPacket::new(0, Some(14), Some(14), 68, false), + DPacket::new(0, Some(15), Some(15), 68, false), + DPacket::new(0, Some(16), Some(16), 68, false), + DPacket::new(0, Some(17), Some(17), 68, false), + DPacket::new(0, Some(18), Some(18), 68, false), + DPacket::new(0, Some(19), Some(19), 68, false), + DPacket::new(0, Some(20), Some(20), 68, false), + DPacket::new(0, Some(21), Some(21), 68, false), + DPacket::new(0, Some(22), Some(22), 68, false), + DPacket::new(0, Some(23), Some(23), 68, false), + DPacket::new(0, Some(24), Some(24), 68, false), + DPacket::new(0, Some(25), Some(25), 68, false), + DPacket::new(0, Some(26), Some(26), 68, false), + DPacket::new(0, Some(27), Some(27), 68, false), + DPacket::new(0, Some(28), Some(28), 68, false), + DPacket::new(0, Some(29), Some(29), 68, false)])); + } + #[test] + fn test_demux_svq3_mp3() { + // sample from https://samples.mplayerhq.hu/V-codecs/SVQ3/ + test_core("assets/QT/broken_sword_Large.mov", DemuxMode::Normal, 32, DemuxerTestMode::Test(vec![ + DPacket::new(0, Some(0), Some(0), 4620, true), + DPacket::new(1, Some(0), Some(0), 834, true), + DPacket::new(0, Some(24), Some(24), 1454, false), + DPacket::new(1, Some(1), Some(1), 834, false), + DPacket::new(0, Some(48), Some(48), 278, false), + DPacket::new(1, Some(2), Some(2), 834, false), + DPacket::new(0, Some(72), Some(72), 484, false), + DPacket::new(1, Some(3), Some(3), 834, false), + DPacket::new(0, Some(96), Some(96), 264, false), + DPacket::new(1, Some(4), Some(4), 834, false), + DPacket::new(0, Some(120), Some(120), 484, false), + DPacket::new(0, Some(144), Some(144), 264, false), + DPacket::new(1, Some(5), Some(5), 834, false), + DPacket::new(0, Some(168), Some(168), 484, false), + DPacket::new(1, Some(6), Some(6), 834, false), + DPacket::new(0, Some(192), Some(192), 264, false), + DPacket::new(1, Some(7), Some(7), 834, false), + DPacket::new(0, Some(216), Some(216), 484, false), + DPacket::new(0, Some(240), Some(240), 264, false), + DPacket::new(1, Some(8), Some(8), 834, false), + DPacket::new(0, Some(264), Some(264), 484, false), + DPacket::new(1, Some(9), Some(9), 834, false), + DPacket::new(0, Some(288), Some(288), 264, false), + DPacket::new(1, Some(10), Some(10), 834, true), + DPacket::new(0, Some(312), Some(312), 484, false), + DPacket::new(0, Some(336), Some(336), 264, false), + DPacket::new(1, Some(11), Some(11), 834, false), + DPacket::new(0, Some(360), Some(360), 484, false), + DPacket::new(1, Some(12), Some(12), 834, false), + DPacket::new(0, Some(384), Some(384), 264, false), + DPacket::new(1, Some(13), Some(13), 834, false), + DPacket::new(0, Some(408), Some(408), 484, false)])); } } -- 2.39.5