]> git.nihav.org Git - nihav.git/commitdiff
nihav_qt: introduce a public function for custom creating of QDraw decoder
authorKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 19 Sep 2026 08:28:39 +0000 (10:28 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 19 Sep 2026 08:28:39 +0000 (10:28 +0200)
It is needed for the various QuickTime codecs support inside QuickDraw data.

nihav-qt/src/codecs/mod.rs
nihav-qt/src/codecs/qdraw.rs
nihav-qt/src/lib.rs

index 2cd99753ffd6adcc3563d1fe01f8be0dd30a8d53..f11a7b78084fb335fbdac1e6384eabf16de2aef1 100644 (file)
@@ -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;
index 683a5a98d19641a8a787fb6fbc218bac6d2a87df..f60930037ea1570505e988f5faf6e180f30d6a32 100644 (file)
@@ -40,11 +40,14 @@ struct QDrawDecoder {
     hams:       HAMShuffler<u8>,
     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<dyn NADecoder + Send> {
     Box::new(QDrawDecoder::new())
 }
 
+pub fn get_qdraw_decoder_with_external_decreg(ref_decs: &RegisteredDecoders) -> Box<dyn NADecoder + Send> {
+    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;
index 5396a3ecfd089431c3b0c6dc88188eaeb7a012ce..be9b169fee993ebe0c38d01af32799b27ce54f82 100644 (file)
@@ -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;