From: Kostya Shishkov Date: Wed, 9 Apr 2025 16:16:20 +0000 (+0200) Subject: handle demuxer creation errors more gracefully X-Git-Url: https://git.nihav.org/?a=commitdiff_plain;h=2b0a517e7f50c7c192d1796be3d423fa876855b3;p=nihav-encoder.git handle demuxer creation errors more gracefully --- diff --git a/src/demux.rs b/src/demux.rs index 58eed7f..75b53e3 100644 --- a/src/demux.rs +++ b/src/demux.rs @@ -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) { // 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; diff --git a/src/transcoder.rs b/src/transcoder.rs index fe4c318..7c3dd08 100644 --- a/src/transcoder.rs +++ b/src/transcoder.rs @@ -50,6 +50,21 @@ impl SelfBorrow { obj.dst = Some(create(ptr)); obj } + pub fn try_new(src: T, create: F) -> Option>> + where F: Fn(*mut T) -> Option { + 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