From eb609434b16e24d19df41c1e3bd97f201ecf16c0 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Wed, 11 Mar 2026 18:18:08 +0100 Subject: [PATCH] add support for alpha version of QuickTime (codename Warhol) --- nihav-allstuff/src/lib.rs | 3 +- nihav-commonfmt/src/demuxers/mov.rs | 10 + nihav-qt/Cargo.toml | 6 +- nihav-qt/src/demuxers/mod.rs | 28 ++ nihav-qt/src/demuxers/warhol.rs | 491 ++++++++++++++++++++++++++++ nihav-qt/src/lib.rs | 7 + 6 files changed, 543 insertions(+), 2 deletions(-) create mode 100644 nihav-qt/src/demuxers/mod.rs create mode 100644 nihav-qt/src/demuxers/warhol.rs diff --git a/nihav-allstuff/src/lib.rs b/nihav-allstuff/src/lib.rs index 544f63b..6f5ff69 100644 --- a/nihav-allstuff/src/lib.rs +++ b/nihav-allstuff/src/lib.rs @@ -18,7 +18,7 @@ use nihav_llaudio::*; use nihav_misc::*; use nihav_mpeg::*; use nihav_ms::*; -use nihav_qt::qt_register_all_decoders; +use nihav_qt::*; use nihav_rad::*; use nihav_realmedia::*; use nihav_vivo::*; @@ -66,6 +66,7 @@ pub fn nihav_register_all_demuxers(rd: &mut RegisteredDemuxers) { llaudio_register_all_demuxers(rd); misc_register_all_demuxers(rd); ms_register_all_demuxers(rd); + qt_register_all_demuxers(rd); rad_register_all_demuxers(rd); realmedia_register_all_demuxers(rd); vivo_register_all_demuxers(rd); diff --git a/nihav-commonfmt/src/demuxers/mov.rs b/nihav-commonfmt/src/demuxers/mov.rs index d8f4dd2..a9814b1 100644 --- a/nihav-commonfmt/src/demuxers/mov.rs +++ b/nihav-commonfmt/src/demuxers/mov.rs @@ -1836,6 +1836,11 @@ impl<'a> DemuxCore<'a> for MOVDemuxer<'a> { self.src.peek_buf(&mut peek_buf)?; if &peek_buf[4..] == b"moov" { self.src.read_skip(8)?; + self.src.peek_buf(&mut peek_buf)?; + if peek_buf == [0; 8] { + println!("This looks like an alpha version of the format, try warhol demuxer instead"); + return Err(DemuxerError::InvalidData); + } self.read_moov(strmgr, u64::from(rsize - 8))?; self.mdat_pos = 8; break; @@ -1854,6 +1859,11 @@ impl<'a> DemuxCore<'a> for MOVDemuxer<'a> { validate!(size >= 8); match &tag { b"moov" => { + self.src.peek_buf(&mut peek_buf)?; + if peek_buf == [0; 8] { + println!("This looks like an alpha version of the format, try warhol demuxer instead"); + return Err(DemuxerError::InvalidData); + } self.read_moov(strmgr, u64::from(size - 8))?; }, b"mdat" => { diff --git a/nihav-qt/Cargo.toml b/nihav-qt/Cargo.toml index f28aecc..8f34305 100644 --- a/nihav-qt/Cargo.toml +++ b/nihav-qt/Cargo.toml @@ -16,7 +16,7 @@ features = ["blockdsp", "fft", "qmf"] nihav_commonfmt = { path = "../nihav-commonfmt", default-features=false, features = ["all_demuxers"] } [features] -default = ["all_decoders"] +default = ["all_decoders", "all_demuxers"] all_decoders = ["all_video_decoders", "all_audio_decoders"] decoders = [] @@ -36,3 +36,7 @@ decoder_qcelp = ["decoders"] decoder_qdm = ["decoders"] decoder_qdm2 = ["decoders"] decoder_alac = ["decoders"] + +all_demuxers = ["demuxer_warhol"] +demuxers = [] +demuxer_warhol = ["demuxers"] diff --git a/nihav-qt/src/demuxers/mod.rs b/nihav-qt/src/demuxers/mod.rs new file mode 100644 index 0000000..68938db --- /dev/null +++ b/nihav-qt/src/demuxers/mod.rs @@ -0,0 +1,28 @@ +use nihav_core::demuxers::*; + + +#[cfg(debug_assertions)] +#[allow(unused_macros)] +macro_rules! validate { + ($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DemuxerError::InvalidData); } }; +} +#[cfg(not(debug_assertions))] +#[allow(unused_macros)] +macro_rules! validate { + ($a:expr) => { if !$a { return Err(DemuxerError::InvalidData); } }; +} + +#[cfg(feature="demuxer_warhol")] +mod warhol; + +const DEMUXERS: &[&dyn DemuxerCreator] = &[ +#[cfg(feature="demuxer_warhol")] + &warhol::WarholDemuxerCreator {}, +]; + +/// Registers all available demuxers provided by this crate. +pub fn qt_register_all_demuxers(rd: &mut RegisteredDemuxers) { + for demuxer in DEMUXERS.iter() { + rd.add_demuxer(*demuxer); + } +} diff --git a/nihav-qt/src/demuxers/warhol.rs b/nihav-qt/src/demuxers/warhol.rs new file mode 100644 index 0000000..0b985d9 --- /dev/null +++ b/nihav-qt/src/demuxers/warhol.rs @@ -0,0 +1,491 @@ +use nihav_core::demuxers::*; + +struct Track { + offsets: Vec, + sizes: Vec, + cur_frame: usize, +} + +struct WarholDemuxer<'a> { + src: &'a mut dyn ByteIO, + cur_track: usize, + tracks: Vec, +} + +impl<'a> DemuxCore<'a> for WarholDemuxer<'a> { + fn open(&mut self, strmgr: &mut StreamManager, _seek_index: &mut SeekIndex) -> DemuxerResult<()> { + self.src.seek(SeekFrom::Start(0x41))?; + let tag = self.src.read_tag()?; + validate!(&tag == b"MooV"); + self.src.read_skip(14)?; + let data_end = u64::from(self.src.read_u32be()?) + 0x80; + let rsrc_size = self.src.read_u32be()?; + validate!(rsrc_size > 0x100); + self.src.seek(SeekFrom::Start((data_end + 0x7F) & !0x7F))?; + let rsrc_end = self.src.tell() + u64::from(rsrc_size); + + let mut moov_end = 0; + while self.src.tell() + 12 < rsrc_end { + let size = self.src.read_u32be()?; + validate!(size >= 12 && self.src.tell() + u64::from(size - 4) <= rsrc_end); + let _size2 = self.src.read_u32be()?; + let tag = self.src.read_tag()?; + if &tag == b"moov" { + moov_end = self.src.tell() + u64::from(size - 12); + break; + } + self.src.read_skip(size as usize - 12)?; + } + self.src.read_skip(0x70)?; // unknown media header data + while self.src.tell() + 4 < moov_end { + let tsize = self.src.read_u32be()?; + let tag = self.src.read_tag()?; + validate!(tsize > 0x170 && self.src.tell() + u64::from(tsize - 8) <= moov_end); + validate!(&tag == b"trak"); + let trk_end = self.src.tell() + u64::from(tsize - 8); + self.src.read_skip(0x68)?; + let msize = self.src.read_u32be()?; + let tag = self.src.read_tag()?; + validate!(msize > 0x70 && self.src.tell() + u64::from(msize - 8) + 4 == trk_end); + validate!(&tag == b"mdia"); + self.src.read_skip(0x14)?; + let fps = self.src.read_u32be()?; + validate!((1..=1000).contains(&fps)); + self.src.read_skip(0x8)?; + let ndesc = self.src.read_u32be()? as usize; + validate!((1..=16).contains(&ndesc)); + self.src.read_u32be()?; + let nmaps = self.src.read_u32be()? as usize; + validate!((1..=16).contains(&nmaps)); + let nts = self.src.read_u32be()? as usize; + let duration = self.src.read_u32be()?; + self.src.read_u32be()?; + let smth = self.src.read_u32be()?; + self.src.read_skip(smth as usize + 8)?; + let tag = self.src.read_tag()?; + validate!(&tag == b"vide"); + let _vendor = self.src.read_tag()?; + let nlen = usize::from(self.src.read_byte()?); + self.src.read_skip(nlen)?; + self.src.read_skip(8)?; + let dsize = self.src.read_u32be()?; + validate!(dsize >= 20); + let desc_end = self.src.tell() + u64::from(dsize - 4); + let fcc = self.src.read_tag()?; + self.src.read_skip(0x18)?; + let width = usize::from(self.src.read_u16be()?); + let height = usize::from(self.src.read_u16be()?); + validate!((1..=1024).contains(&width) && (1..=1024).contains(&height)); + self.src.read_skip(14)?; // dpi and data size? + self.src.read_skip(32)?; // codec name + let depth = self.src.read_u16be()?; + let _ct_id = self.src.read_u16be()?; + let grayscale = depth > 0x20 || depth == 1; + let depth = if grayscale { depth & 0x1F } else { depth }; + self.src.read_skip(6)?; + + if depth != 8 { + return Err(DemuxerError::NotImplemented); + } + self.src.seek(SeekFrom::Start(desc_end))?; + if ndesc > 1 { + //println!("skipping {} track descriptor(s)", ndesc - 1); + for _ in 1..ndesc { + let dsize = self.src.read_u32be()? as usize; + validate!(dsize >= 20); + self.src.read_skip(dsize - 4)?; + } + } + let nframes = self.src.read_u32be()? as usize; + validate!((1..=10000).contains(&nframes)); + self.src.read_skip(nts * 4)?; + self.src.read_skip(nmaps * 4 * 4)?; // chunk mapping?? + let _one = self.src.read_u32be()?; + let mut offsets = Vec::with_capacity(nframes); + let mut sizes = Vec::with_capacity(nframes); + for _ in 0..nframes { + let off = self.src.read_u32be()?; + let sz = self.src.read_u32be()?; + validate!(sz < 10485760); + offsets.push(off); + sizes.push(sz); + } + self.src.seek(SeekFrom::Start(trk_end))?; + + let mut vhdr = NAVideoInfo::new(width, height, false, PAL8_FORMAT); + vhdr.bits = 8; + let codec_info = NACodecInfo::new(if &fcc == b"rle " { "qt-rle" } else { "unknown" }, NACodecTypeInfo::Video(vhdr), None); + strmgr.add_stream(NAStream::new(StreamType::Video, 0, codec_info, 1, fps, u64::from(duration))).ok_or(DemuxerError::MemoryError)?; + self.tracks.push(Track{ offsets, sizes, cur_frame: 0 }); + } + validate!(!self.tracks.is_empty()); + + Ok(()) + } + + fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult { + let start_track = self.cur_track; + let ntracks = self.tracks.len(); + loop { + let mut track = &mut self.tracks[self.cur_track]; + let stream = strmgr.get_stream(self.cur_track).unwrap(); + self.cur_track += 1; + if self.cur_track >= ntracks { + self.cur_track = 0; + } + if track.cur_frame >= track.sizes.len() { + if self.cur_track == start_track { + return Err(DemuxerError::EOF); + } + continue; + } + let size = track.sizes[track.cur_frame] as usize; + let offset = track.offsets[track.cur_frame]; + let ts = stream.make_ts(Some(track.cur_frame as u64), None, None); + let keyframe = track.cur_frame == 0; + track.cur_frame += 1; + self.src.seek(SeekFrom::Start(u64::from(offset) + 0x80))?; + let mut pkt = self.src.read_packet(stream, ts, keyframe, size)?; + if keyframe { + pkt.add_side_data(NASideData::Palette(true, Arc::new(MOV_DEFAULT_PAL_8BIT))); + } + return Ok(pkt); + } + } + + fn seek(&mut self, _time: NATimePoint, _seek_index: &SeekIndex) -> DemuxerResult<()> { + Err(DemuxerError::SeekError) + } + fn get_duration(&self) -> u64 { 0 } +} + +impl<'a> NAOptionHandler for WarholDemuxer<'a> { + fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } + fn set_options(&mut self, _options: &[NAOption]) { } + fn query_option_value(&self, _name: &str) -> Option { None } +} + +impl<'a> WarholDemuxer<'a> { + fn new(src: &'a mut dyn ByteIO) -> Self { + WarholDemuxer { + src, + cur_track: 0, + tracks: Vec::new(), + } + } +} + +pub struct WarholDemuxerCreator { } + +impl DemuxerCreator for WarholDemuxerCreator { + fn new_demuxer<'a>(&self, br: &'a mut dyn ByteIO) -> Box + 'a> { + Box::new(WarholDemuxer::new(br)) + } + fn get_name(&self) -> &'static str { "warhol" } +} + +#[cfg(test)] +mod test { + use super::*; + use std::fs::File; + + //test samples from Apple Reference & Presentation Library 8 + #[test] + fn test_warhol_single_desc() { + let mut file = File::open("assets/QT/MultiTasking.movie").unwrap(); + let mut br = FileReader::new_read(&mut file); + let mut dmx = WarholDemuxer::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] + fn test_warhol_multiple_desc() { + let mut file = File::open("assets/QT/VirtualMemory.movie").unwrap(); + let mut br = FileReader::new_read(&mut file); + let mut dmx = WarholDemuxer::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); + } + } +} + +static MOV_DEFAULT_PAL_8BIT: [u8; 256 * 4] = [ + 0xFF, 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0xCC, 0x00, + 0xFF, 0xFF, 0x99, 0x00, + 0xFF, 0xFF, 0x66, 0x00, + 0xFF, 0xFF, 0x33, 0x00, + 0xFF, 0xFF, 0x00, 0x00, + 0xFF, 0xCC, 0xFF, 0x00, + 0xFF, 0xCC, 0xCC, 0x00, + 0xFF, 0xCC, 0x99, 0x00, + 0xFF, 0xCC, 0x66, 0x00, + 0xFF, 0xCC, 0x33, 0x00, + 0xFF, 0xCC, 0x00, 0x00, + 0xFF, 0x99, 0xFF, 0x00, + 0xFF, 0x99, 0xCC, 0x00, + 0xFF, 0x99, 0x99, 0x00, + 0xFF, 0x99, 0x66, 0x00, + 0xFF, 0x99, 0x33, 0x00, + 0xFF, 0x99, 0x00, 0x00, + 0xFF, 0x66, 0xFF, 0x00, + 0xFF, 0x66, 0xCC, 0x00, + 0xFF, 0x66, 0x99, 0x00, + 0xFF, 0x66, 0x66, 0x00, + 0xFF, 0x66, 0x33, 0x00, + 0xFF, 0x66, 0x00, 0x00, + 0xFF, 0x33, 0xFF, 0x00, + 0xFF, 0x33, 0xCC, 0x00, + 0xFF, 0x33, 0x99, 0x00, + 0xFF, 0x33, 0x66, 0x00, + 0xFF, 0x33, 0x33, 0x00, + 0xFF, 0x33, 0x00, 0x00, + 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xCC, 0x00, + 0xFF, 0x00, 0x99, 0x00, + 0xFF, 0x00, 0x66, 0x00, + 0xFF, 0x00, 0x33, 0x00, + 0xFF, 0x00, 0x00, 0x00, + 0xCC, 0xFF, 0xFF, 0x00, + 0xCC, 0xFF, 0xCC, 0x00, + 0xCC, 0xFF, 0x99, 0x00, + 0xCC, 0xFF, 0x66, 0x00, + 0xCC, 0xFF, 0x33, 0x00, + 0xCC, 0xFF, 0x00, 0x00, + 0xCC, 0xCC, 0xFF, 0x00, + 0xCC, 0xCC, 0xCC, 0x00, + 0xCC, 0xCC, 0x99, 0x00, + 0xCC, 0xCC, 0x66, 0x00, + 0xCC, 0xCC, 0x33, 0x00, + 0xCC, 0xCC, 0x00, 0x00, + 0xCC, 0x99, 0xFF, 0x00, + 0xCC, 0x99, 0xCC, 0x00, + 0xCC, 0x99, 0x99, 0x00, + 0xCC, 0x99, 0x66, 0x00, + 0xCC, 0x99, 0x33, 0x00, + 0xCC, 0x99, 0x00, 0x00, + 0xCC, 0x66, 0xFF, 0x00, + 0xCC, 0x66, 0xCC, 0x00, + 0xCC, 0x66, 0x99, 0x00, + 0xCC, 0x66, 0x66, 0x00, + 0xCC, 0x66, 0x33, 0x00, + 0xCC, 0x66, 0x00, 0x00, + 0xCC, 0x33, 0xFF, 0x00, + 0xCC, 0x33, 0xCC, 0x00, + 0xCC, 0x33, 0x99, 0x00, + 0xCC, 0x33, 0x66, 0x00, + 0xCC, 0x33, 0x33, 0x00, + 0xCC, 0x33, 0x00, 0x00, + 0xCC, 0x00, 0xFF, 0x00, + 0xCC, 0x00, 0xCC, 0x00, + 0xCC, 0x00, 0x99, 0x00, + 0xCC, 0x00, 0x66, 0x00, + 0xCC, 0x00, 0x33, 0x00, + 0xCC, 0x00, 0x00, 0x00, + 0x99, 0xFF, 0xFF, 0x00, + 0x99, 0xFF, 0xCC, 0x00, + 0x99, 0xFF, 0x99, 0x00, + 0x99, 0xFF, 0x66, 0x00, + 0x99, 0xFF, 0x33, 0x00, + 0x99, 0xFF, 0x00, 0x00, + 0x99, 0xCC, 0xFF, 0x00, + 0x99, 0xCC, 0xCC, 0x00, + 0x99, 0xCC, 0x99, 0x00, + 0x99, 0xCC, 0x66, 0x00, + 0x99, 0xCC, 0x33, 0x00, + 0x99, 0xCC, 0x00, 0x00, + 0x99, 0x99, 0xFF, 0x00, + 0x99, 0x99, 0xCC, 0x00, + 0x99, 0x99, 0x99, 0x00, + 0x99, 0x99, 0x66, 0x00, + 0x99, 0x99, 0x33, 0x00, + 0x99, 0x99, 0x00, 0x00, + 0x99, 0x66, 0xFF, 0x00, + 0x99, 0x66, 0xCC, 0x00, + 0x99, 0x66, 0x99, 0x00, + 0x99, 0x66, 0x66, 0x00, + 0x99, 0x66, 0x33, 0x00, + 0x99, 0x66, 0x00, 0x00, + 0x99, 0x33, 0xFF, 0x00, + 0x99, 0x33, 0xCC, 0x00, + 0x99, 0x33, 0x99, 0x00, + 0x99, 0x33, 0x66, 0x00, + 0x99, 0x33, 0x33, 0x00, + 0x99, 0x33, 0x00, 0x00, + 0x99, 0x00, 0xFF, 0x00, + 0x99, 0x00, 0xCC, 0x00, + 0x99, 0x00, 0x99, 0x00, + 0x99, 0x00, 0x66, 0x00, + 0x99, 0x00, 0x33, 0x00, + 0x99, 0x00, 0x00, 0x00, + 0x66, 0xFF, 0xFF, 0x00, + 0x66, 0xFF, 0xCC, 0x00, + 0x66, 0xFF, 0x99, 0x00, + 0x66, 0xFF, 0x66, 0x00, + 0x66, 0xFF, 0x33, 0x00, + 0x66, 0xFF, 0x00, 0x00, + 0x66, 0xCC, 0xFF, 0x00, + 0x66, 0xCC, 0xCC, 0x00, + 0x66, 0xCC, 0x99, 0x00, + 0x66, 0xCC, 0x66, 0x00, + 0x66, 0xCC, 0x33, 0x00, + 0x66, 0xCC, 0x00, 0x00, + 0x66, 0x99, 0xFF, 0x00, + 0x66, 0x99, 0xCC, 0x00, + 0x66, 0x99, 0x99, 0x00, + 0x66, 0x99, 0x66, 0x00, + 0x66, 0x99, 0x33, 0x00, + 0x66, 0x99, 0x00, 0x00, + 0x66, 0x66, 0xFF, 0x00, + 0x66, 0x66, 0xCC, 0x00, + 0x66, 0x66, 0x99, 0x00, + 0x66, 0x66, 0x66, 0x00, + 0x66, 0x66, 0x33, 0x00, + 0x66, 0x66, 0x00, 0x00, + 0x66, 0x33, 0xFF, 0x00, + 0x66, 0x33, 0xCC, 0x00, + 0x66, 0x33, 0x99, 0x00, + 0x66, 0x33, 0x66, 0x00, + 0x66, 0x33, 0x33, 0x00, + 0x66, 0x33, 0x00, 0x00, + 0x66, 0x00, 0xFF, 0x00, + 0x66, 0x00, 0xCC, 0x00, + 0x66, 0x00, 0x99, 0x00, + 0x66, 0x00, 0x66, 0x00, + 0x66, 0x00, 0x33, 0x00, + 0x66, 0x00, 0x00, 0x00, + 0x33, 0xFF, 0xFF, 0x00, + 0x33, 0xFF, 0xCC, 0x00, + 0x33, 0xFF, 0x99, 0x00, + 0x33, 0xFF, 0x66, 0x00, + 0x33, 0xFF, 0x33, 0x00, + 0x33, 0xFF, 0x00, 0x00, + 0x33, 0xCC, 0xFF, 0x00, + 0x33, 0xCC, 0xCC, 0x00, + 0x33, 0xCC, 0x99, 0x00, + 0x33, 0xCC, 0x66, 0x00, + 0x33, 0xCC, 0x33, 0x00, + 0x33, 0xCC, 0x00, 0x00, + 0x33, 0x99, 0xFF, 0x00, + 0x33, 0x99, 0xCC, 0x00, + 0x33, 0x99, 0x99, 0x00, + 0x33, 0x99, 0x66, 0x00, + 0x33, 0x99, 0x33, 0x00, + 0x33, 0x99, 0x00, 0x00, + 0x33, 0x66, 0xFF, 0x00, + 0x33, 0x66, 0xCC, 0x00, + 0x33, 0x66, 0x99, 0x00, + 0x33, 0x66, 0x66, 0x00, + 0x33, 0x66, 0x33, 0x00, + 0x33, 0x66, 0x00, 0x00, + 0x33, 0x33, 0xFF, 0x00, + 0x33, 0x33, 0xCC, 0x00, + 0x33, 0x33, 0x99, 0x00, + 0x33, 0x33, 0x66, 0x00, + 0x33, 0x33, 0x33, 0x00, + 0x33, 0x33, 0x00, 0x00, + 0x33, 0x00, 0xFF, 0x00, + 0x33, 0x00, 0xCC, 0x00, + 0x33, 0x00, 0x99, 0x00, + 0x33, 0x00, 0x66, 0x00, + 0x33, 0x00, 0x33, 0x00, + 0x33, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0xFF, 0xCC, 0x00, + 0x00, 0xFF, 0x99, 0x00, + 0x00, 0xFF, 0x66, 0x00, + 0x00, 0xFF, 0x33, 0x00, + 0x00, 0xFF, 0x00, 0x00, + 0x00, 0xCC, 0xFF, 0x00, + 0x00, 0xCC, 0xCC, 0x00, + 0x00, 0xCC, 0x99, 0x00, + 0x00, 0xCC, 0x66, 0x00, + 0x00, 0xCC, 0x33, 0x00, + 0x00, 0xCC, 0x00, 0x00, + 0x00, 0x99, 0xFF, 0x00, + 0x00, 0x99, 0xCC, 0x00, + 0x00, 0x99, 0x99, 0x00, + 0x00, 0x99, 0x66, 0x00, + 0x00, 0x99, 0x33, 0x00, + 0x00, 0x99, 0x00, 0x00, + 0x00, 0x66, 0xFF, 0x00, + 0x00, 0x66, 0xCC, 0x00, + 0x00, 0x66, 0x99, 0x00, + 0x00, 0x66, 0x66, 0x00, + 0x00, 0x66, 0x33, 0x00, + 0x00, 0x66, 0x00, 0x00, + 0x00, 0x33, 0xFF, 0x00, + 0x00, 0x33, 0xCC, 0x00, + 0x00, 0x33, 0x99, 0x00, + 0x00, 0x33, 0x66, 0x00, + 0x00, 0x33, 0x33, 0x00, + 0x00, 0x33, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0xCC, 0x00, + 0x00, 0x00, 0x99, 0x00, + 0x00, 0x00, 0x66, 0x00, + 0x00, 0x00, 0x33, 0x00, + 0xEE, 0x00, 0x00, 0x00, + 0xDD, 0x00, 0x00, 0x00, + 0xBB, 0x00, 0x00, 0x00, + 0xAA, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, + 0x00, 0xEE, 0x00, 0x00, + 0x00, 0xDD, 0x00, 0x00, + 0x00, 0xBB, 0x00, 0x00, + 0x00, 0xAA, 0x00, 0x00, + 0x00, 0x88, 0x00, 0x00, + 0x00, 0x77, 0x00, 0x00, + 0x00, 0x55, 0x00, 0x00, + 0x00, 0x44, 0x00, 0x00, + 0x00, 0x22, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, + 0x00, 0x00, 0xEE, 0x00, + 0x00, 0x00, 0xDD, 0x00, + 0x00, 0x00, 0xBB, 0x00, + 0x00, 0x00, 0xAA, 0x00, + 0x00, 0x00, 0x88, 0x00, + 0x00, 0x00, 0x77, 0x00, + 0x00, 0x00, 0x55, 0x00, + 0x00, 0x00, 0x44, 0x00, + 0x00, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x11, 0x00, + 0xEE, 0xEE, 0xEE, 0x00, + 0xDD, 0xDD, 0xDD, 0x00, + 0xBB, 0xBB, 0xBB, 0x00, + 0xAA, 0xAA, 0xAA, 0x00, + 0x88, 0x88, 0x88, 0x00, + 0x77, 0x77, 0x77, 0x00, + 0x55, 0x55, 0x55, 0x00, + 0x44, 0x44, 0x44, 0x00, + 0x22, 0x22, 0x22, 0x00, + 0x11, 0x11, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x00 +]; + diff --git a/nihav-qt/src/lib.rs b/nihav-qt/src/lib.rs index 712dd86..3869a58 100644 --- a/nihav-qt/src/lib.rs +++ b/nihav-qt/src/lib.rs @@ -4,5 +4,12 @@ extern crate nihav_codec_support; #[allow(clippy::single_match)] #[allow(clippy::upper_case_acronyms)] +#[cfg(feature="decoders")] mod codecs; +#[cfg(feature="decoders")] pub use crate::codecs::qt_register_all_decoders; + +#[cfg(feature="demuxers")] +mod demuxers; +#[cfg(feature="demuxers")] +pub use crate::demuxers::qt_register_all_demuxers; -- 2.39.5