]> git.nihav.org Git - nihav-encoder.git/commitdiff
handle demuxer creation errors more gracefully
authorKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 9 Apr 2025 16:16:20 +0000 (18:16 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 9 Apr 2025 16:16:20 +0000 (18:16 +0200)
src/demux.rs
src/transcoder.rs

index 58eed7fc3f04e8c9c1ef36754572463ee5289a09..75b53e309a2cad35561b28d9763f62681421dc12 100644 (file)
@@ -85,12 +85,17 @@ impl<'a> DemuxerObject<'a> {
                 if let Some(dmx_fact) = reg.dmx_reg.find_demuxer(dmx_name) {
                     br.seek(SeekFrom::Start(0)).unwrap();
 
-                    let dmx = SelfBorrow::new(brb, |br_| {
+                    let ret = SelfBorrow::try_new(brb, |br_| {
                             unsafe {
-                                create_demuxer(dmx_fact, br_.as_mut().unwrap().get_object_mut()).unwrap()
+                                create_demuxer(dmx_fact, br_.as_mut().unwrap().get_object_mut()).ok()
                             }
                         });
-                    return DemuxerObject::Normal(dmx);
+                    if let Some(dmx) = ret {
+                        return DemuxerObject::Normal(dmx);
+                    } else {
+                        println!("demuxer creation failed!");
+                        return DemuxerObject::None;
+                    }
                 }
             }
             if ifmt.is_some() {
@@ -102,22 +107,27 @@ impl<'a> DemuxerObject<'a> {
                 }
                 if let Some(rdmx_fact) = reg.rdmx_reg.find_demuxer(dmx_name) {
                     br.seek(SeekFrom::Start(0)).unwrap();
-                    let dmx = SelfBorrow::new(brb, |br_| {
+                    let ret = SelfBorrow::try_new(brb, |br_| {
                             unsafe {
-                                create_raw_demuxer(rdmx_fact, br_.as_mut().unwrap().get_object_mut()).unwrap()
+                                create_raw_demuxer(rdmx_fact, br_.as_mut().unwrap().get_object_mut()).ok()
                             }
                         });
-                    let mut pkts = Vec::new();
-                    for stream in dmx.get_object().get_streams() {
-                        if let Some(pcreate) = reg.pkt_reg.find_packetiser(stream.get_info().get_name()) {
-                            let mut packetiser = (pcreate)();
-                            packetiser.attach_stream(stream);
-                            pkts.push(Some(packetiser));
-                        } else {
-                            pkts.push(None);
+                    if let Some(dmx) = ret {
+                        let mut pkts = Vec::new();
+                        for stream in dmx.get_object().get_streams() {
+                            if let Some(pcreate) = reg.pkt_reg.find_packetiser(stream.get_info().get_name()) {
+                                let mut packetiser = (pcreate)();
+                                packetiser.attach_stream(stream);
+                                pkts.push(Some(packetiser));
+                            } else {
+                                pkts.push(None);
+                            }
                         }
+                        return DemuxerObject::Raw(dmx, pkts, false);
+                    } else {
+                        println!("raw demuxer creation failed!");
+                        return DemuxerObject::None;
                     }
-                    return DemuxerObject::Raw(dmx, pkts, false);
                 }
             }
             for rdmx in reg.rdmx_reg.iter() {
@@ -126,27 +136,35 @@ impl<'a> DemuxerObject<'a> {
                         println!("detected {} as {}", name, rdmx.get_name());
                     }
                     br.seek(SeekFrom::Start(0)).unwrap();
-                    let dmx = SelfBorrow::new(brb, |br_| {
+                    let ret = SelfBorrow::try_new(brb, |br_| {
                             unsafe {
-                                create_raw_demuxer(*rdmx, br_.as_mut().unwrap().get_object_mut()).unwrap()
+                                create_raw_demuxer(*rdmx, br_.as_mut().unwrap().get_object_mut()).ok()
                             }
                         });
-                    let mut pkts = Vec::new();
-                    for stream in dmx.get_object().get_streams() {
-                        if let Some(pcreate) = reg.pkt_reg.find_packetiser(stream.get_info().get_name()) {
-                            let packetiser = (pcreate)();
-                            pkts.push(Some(packetiser));
-                        } else {
-                            pkts.push(None);
+                    if let Some(dmx) = ret {
+                        let mut pkts = Vec::new();
+                        for stream in dmx.get_object().get_streams() {
+                            if let Some(pcreate) = reg.pkt_reg.find_packetiser(stream.get_info().get_name()) {
+                                let packetiser = (pcreate)();
+                                pkts.push(Some(packetiser));
+                            } else {
+                                pkts.push(None);
+                            }
                         }
+                        return DemuxerObject::Raw(dmx, pkts, false);
+                    } else {
+                        println!("raw demuxer creation failed!");
+                        return DemuxerObject::None;
                     }
-                    return DemuxerObject::Raw(dmx, pkts, false);
                 }
             }
         }
         br.seek(SeekFrom::Start(0)).unwrap();
         let mut buf = vec![0; 1048576];
-        let size = br.peek_buf(&mut buf).unwrap();
+        let size = if let Ok(val) = br.peek_buf(&mut buf) { val } else {
+                println!("cannot read any data");
+                return DemuxerObject::None;
+            };
         let mut pname = "";
 
         for pinfo in reg.pkt_reg.iter() {
@@ -354,7 +372,9 @@ pub fn detect_tags(br: &mut ByteReader) -> (bool, u64, Option<u64>) {
 
     // check for ID3v{2-4}
     let mut buf = [0; 5];
-    br.peek_buf(&mut buf).unwrap();
+    if br.peek_buf(&mut buf).is_err() {
+        return (false, 0, None);
+    }
     if &buf[0..3] == b"ID3" && buf[3] > 0 && buf[3] < 5 && buf[4] == 0 { //ID3 tag found, must be a raw stream
         br.read_skip(6).unwrap();
         let mut size = 0;
index fe4c31885e47f049d39a2a11ef1da674b20e6797..7c3dd082c81c26d4839351c66147f289d6356c90 100644 (file)
@@ -50,6 +50,21 @@ impl<T: Unpin, U: Unpin> SelfBorrow<T, U> {
         obj.dst = Some(create(ptr));
         obj
     }
+    pub fn try_new<F>(src: T, create: F) -> Option<Pin<Box<Self>>>
+            where F: Fn(*mut T) -> Option<U> {
+        let mut obj = Box::pin(Self{
+            bval: src,
+            dst: None,
+        });
+        let ptr = &mut obj.bval as *mut T;
+        let dst = create(ptr);
+        if dst.is_some() {
+            obj.dst = dst;
+            Some(obj)
+        } else {
+            None
+        }
+    }
     pub fn get_object(&self) -> &U {
         if let Some(ref dst) = self.dst {
             dst