add PNM image sequence as possible input source
[nihav-encoder.git] / src / demux.rs
index 0297c2fadc25636c181da1eff8f7c1ac69ede595..61ddbaf08646d747fb052a6a61cbcd0e9f61cfe1 100644 (file)
@@ -6,6 +6,7 @@ use nihav_registry::detect;
 use nihav_core::io::byteio::ByteReader;
 use nihav_allstuff::*;
 use crate::null::*;
+use crate::imgseq::*;
 
 pub struct FullRegister {
     pub dmx_reg:    RegisteredDemuxers,
@@ -57,6 +58,7 @@ pub enum DemuxerObject<'a> {
     Normal(Demuxer<'a>),
     Raw(RawDemuxer<'a>, Vec<Option<Box<dyn NAPacketiser + Send>>>, bool),
     RawStream(RawStreamCtx<'a>),
+    ImageSequence(ImgSeqDemuxer),
 }
 
 impl<'a> DemuxerObject<'a> {
@@ -141,6 +143,9 @@ impl<'a> DemuxerObject<'a> {
             DemuxerObject::None
         }
     }
+    pub fn create_imgseq(isd: ImgSeqDemuxer) -> Self {
+        DemuxerObject::ImageSequence(isd)
+    }
     pub fn is_none(&self) -> bool {
         matches!(*self, DemuxerObject::None)
     }
@@ -160,6 +165,7 @@ impl<'a> DemuxerObject<'a> {
             DemuxerObject::Normal(ref dmx) => dmx.get_num_streams(),
             DemuxerObject::Raw(ref dmx, _, _) => dmx.get_num_streams(),
             DemuxerObject::RawStream(_) => 1,
+            DemuxerObject::ImageSequence(_) => 1,
         }
     }
     pub fn get_stream(&self, idx: usize) -> Option<NAStreamRef> {
@@ -167,6 +173,7 @@ impl<'a> DemuxerObject<'a> {
             DemuxerObject::Normal(ref dmx) => dmx.get_stream(idx),
             DemuxerObject::Raw(ref dmx, _, _) => dmx.get_stream(idx),
             DemuxerObject::RawStream(ref ctx) if idx == 0 => Some(ctx.stream.clone()),
+            DemuxerObject::ImageSequence(ref ctx) if idx == 0 => Some(ctx.stream.clone()),
             _ => None,
         }
     }
@@ -175,6 +182,7 @@ impl<'a> DemuxerObject<'a> {
             DemuxerObject::Normal(ref dmx) => dmx.get_streams(),
             DemuxerObject::Raw(ref dmx, _, _) => dmx.get_streams(),
             DemuxerObject::RawStream(ref ctx) => ctx.sm.iter(),
+            DemuxerObject::ImageSequence(ref ctx) => ctx.sm.iter(),
             _ => unreachable!(),
         }
     }
@@ -183,6 +191,7 @@ impl<'a> DemuxerObject<'a> {
             DemuxerObject::Normal(ref dmx) => dmx.get_stream_manager(),
             DemuxerObject::Raw(ref dmx, _, _) => dmx.get_stream_manager(),
             DemuxerObject::RawStream(ref ctx) => &ctx.sm,
+            DemuxerObject::ImageSequence(ref ctx) => &ctx.sm,
             _ => unreachable!(),
         }
     }
@@ -262,6 +271,7 @@ impl<'a> DemuxerObject<'a> {
                     };
                 }
             },
+            DemuxerObject::ImageSequence(ref mut ctx) => ctx.get_frame(),
             _ => unreachable!(),
         }
     }
@@ -269,6 +279,7 @@ impl<'a> DemuxerObject<'a> {
         match *self {
             DemuxerObject::Normal(ref mut dmx) => dmx.seek(seek_time),
             DemuxerObject::Raw(ref mut dmx, _, _) => dmx.seek(seek_time),
+            DemuxerObject::ImageSequence(ref mut ctx) => ctx.seek(seek_time),
             _ => Err(DemuxerError::NotImplemented),
         }
     }
@@ -279,6 +290,7 @@ impl<'a> NAOptionHandler for DemuxerObject<'a> {
         match *self {
             DemuxerObject::Normal(ref dmx) => dmx.get_supported_options(),
             DemuxerObject::Raw(ref dmx, _, _) => dmx.get_supported_options(),
+            DemuxerObject::ImageSequence(ref ctx) => ctx.get_supported_options(),
             _ => &[],
         }
     }
@@ -286,6 +298,7 @@ impl<'a> NAOptionHandler for DemuxerObject<'a> {
         match *self {
             DemuxerObject::Normal(ref mut dmx) => dmx.set_options(options),
             DemuxerObject::Raw(ref mut dmx, _, _) => dmx.set_options(options),
+            DemuxerObject::ImageSequence(ref mut ctx) => ctx.set_options(options),
             _ => {},
         }
     }
@@ -293,6 +306,7 @@ impl<'a> NAOptionHandler for DemuxerObject<'a> {
         match *self {
             DemuxerObject::Normal(ref dmx) => dmx.query_option_value(name),
             DemuxerObject::Raw(ref dmx, _, _) => dmx.query_option_value(name),
+            DemuxerObject::ImageSequence(ref ctx) => ctx.query_option_value(name),
             _ => None,
         }
     }