From: Kostya Shishkov Date: Sat, 19 Sep 2026 08:28:39 +0000 (+0200) Subject: nihav_qt: introduce a public function for custom creating of QDraw decoder X-Git-Url: https://git.nihav.org/?a=commitdiff_plain;h=75d3834fe8703d410810957bb6d295a1aacd9d97;p=nihav.git nihav_qt: introduce a public function for custom creating of QDraw decoder It is needed for the various QuickTime codecs support inside QuickDraw data. --- diff --git a/nihav-qt/src/codecs/mod.rs b/nihav-qt/src/codecs/mod.rs index 2cd9975..f11a7b7 100644 --- a/nihav-qt/src/codecs/mod.rs +++ b/nihav-qt/src/codecs/mod.rs @@ -13,7 +13,7 @@ macro_rules! validate { mod eightbps; #[cfg(feature="decoder_qdraw")] -mod qdraw; +pub(crate) mod qdraw; #[cfg(feature="decoder_rle")] mod rle; diff --git a/nihav-qt/src/codecs/qdraw.rs b/nihav-qt/src/codecs/qdraw.rs index 683a5a9..f609300 100644 --- a/nihav-qt/src/codecs/qdraw.rs +++ b/nihav-qt/src/codecs/qdraw.rs @@ -40,11 +40,14 @@ struct QDrawDecoder { hams: HAMShuffler, width: usize, height: usize, + decs: RegisteredDecoders, } impl QDrawDecoder { fn new() -> Self { - Self::default() + let mut decs = RegisteredDecoders::new(); + crate::qt_register_all_decoders(&mut decs); + Self{ decs, ..Default::default() } } } @@ -325,8 +328,6 @@ impl NADecoder for QDrawDecoder { br.read_buf(&mut data)?; br.seek(SeekFrom::Start(end))?; - let mut decs = RegisteredDecoders::new(); - crate::qt_register_all_decoders(&mut decs); let cname = match &fcc { b"8BPS" => "8bps", b"cvid" => "cinepak", @@ -341,7 +342,7 @@ impl NADecoder for QDrawDecoder { b"SVQ3" | b"svq3" => "sorenson-video3", _ => "unknown", }; - let decfunc = if let Some(df) = decs.find_decoder(cname) { + let decfunc = if let Some(df) = self.decs.find_decoder(cname) { df } else { println!("can't find {cname} decoder"); @@ -423,6 +424,14 @@ pub fn get_decoder() -> Box { Box::new(QDrawDecoder::new()) } +pub fn get_qdraw_decoder_with_external_decreg(ref_decs: &RegisteredDecoders) -> Box { + let mut decs = RegisteredDecoders::new(); + for dec in ref_decs.iter() { + decs.add_decoder(*dec); + } + Box::new(QDrawDecoder{ decs, ..Default::default() }) +} + #[cfg(test)] mod test { use nihav_core::codecs::RegisteredDecoders; diff --git a/nihav-qt/src/lib.rs b/nihav-qt/src/lib.rs index 5396a3e..be9b169 100644 --- a/nihav-qt/src/lib.rs +++ b/nihav-qt/src/lib.rs @@ -10,6 +10,14 @@ mod codecs; pub use crate::codecs::qt_register_all_decoders; #[cfg(feature="encoders")] pub use crate::codecs::qt_register_all_encoders; +///! Creates QuickDraw with externally provided list of other decoders. +///! +///! QuickDraw data may actually encode picture with some other QuickTime codec, +///! e.g. RoadPizza or Cinepak. So in order to decode that data it may need +///! to create another decoder, which may be implemented elsewhere. +///! Hence the need for this special function. +#[cfg(feature="decoder_qdraw")] +pub use crate::codecs::qdraw::get_qdraw_decoder_with_external_decreg; #[cfg(feature="demuxers")] mod demuxers;