use nihav_core::codecs::*;
use nihav_core::demuxers::*;
use nihav_core::muxers::*;
-use nihav_core::reorder::*;
use nihav_registry::detect;
use nihav_registry::register;
use nihav_hlblocks::demux::*;
nstreams += sm.get_num_streams();
}
- for (&is_off, (dmx, _)) in is_offset.iter().zip(demuxers.iter_mut()) {
- for i in 0..dmx.get_num_streams() {
- let s = dmx.get_stream(i).unwrap();
- if (transcoder.no_video && s.get_media_type() == StreamType::Video) ||
- (transcoder.no_audio && s.get_media_type() == StreamType::Audio) {
- transcoder.decoders.push(None);
- continue;
- }
-
- let info = s.get_info();
- let decfunc = full_reg.dec_reg.find_decoder(info.get_name());
- let str_id = (s.get_num() + is_off) as u32;
- if let Some(create_dec) = decfunc {
- let mut decoder = (create_dec)();
- let mut dsupp = Box::new(NADecoderSupport::new());
- let ret = decoder.init(&mut dsupp, info.clone());
- if ret.is_err() {
- println!("Error initialising decoder '{}' for stream {}", info.get_name(), str_id);
- transcoder.debug_log(DebugLog::GENERAL, &format!("Error initialising decoder '{}' for stream {str_id}", info.get_name()));
- if !ignerr {
- return;
- } else {
- transcoder.decoders.push(None);
- continue;
- }
- }
- transcoder.apply_decoder_options(decoder.as_mut(), str_id);
- let desc = register::get_codec_description(info.get_name());
- let caps = if let Some(desc) = desc {
- desc.caps
- } else if s.get_media_type() == StreamType::Video {
- println!("No codec description found, using B-frame reorderer.");
- transcoder.debug_log(DebugLog::GENERAL, &format!("No codec description found for stream {str_id}, using B-frame reorderer"));
- register::CODEC_CAP_REORDER
- } else {
- 0
- };
- let reorderer: Box<dyn FrameReorderer> = if (caps & register::CODEC_CAP_COMPLEX_REORDER) != 0 {
- transcoder.debug_log(DebugLog::DECODE, &format!(" Stream {str_id} - complex reorderer"));
- Box::new(ComplexReorderer::new())
- } else if (caps & register::CODEC_CAP_REORDER) != 0 {
- transcoder.debug_log(DebugLog::DECODE, &format!(" Stream {str_id} - B-frame reorderer"));
- Box::new(IPBReorderer::new())
- } else {
- transcoder.debug_log(DebugLog::DECODE, &format!(" Stream {str_id} - no reorderer"));
- Box::new(NoReorderer::new())
- };
- transcoder.decoders.push(Some(DecodeContext{ dsupp, decoder, reorderer }));
- } else {
- println!("No decoder for stream {} ({}) is found", str_id, info.get_name());
- transcoder.debug_log(DebugLog::GENERAL, &format!("No decoder found for stream {str_id} ({})", info.get_name()));
- transcoder.decoders.push(None);
- }
- }
- if transcoder.start != NATimePoint::None {
- let ret = dmx.seek(transcoder.start);
- if ret.is_err() {
- println!(" failed to seek to {} error {:?}", transcoder.start, ret.err().unwrap());
- transcoder.debug_log(DebugLog::GENERAL, &format!("Failed to seek to {}", transcoder.start));
- }
- }
+ if !transcoder.create_decoders(&full_reg, &is_offset, &mut demuxers, ignerr) {
+ return;
}
if skip_unknown {
use nihav_core::muxers::*;
use nihav_core::reorder::*;
use nihav_core::scale::*;
+use nihav_registry::register;
use crate::acvt::*;
use crate::palettise::*;
}
true
}
+ pub fn create_decoders(&mut self, full_reg: &FullRegister, is_offset: &[usize], demuxers: &mut [(DemuxerObject, bool)], ignerr: bool) -> bool {
+ for (&is_off, (dmx, _)) in is_offset.iter().zip(demuxers.iter_mut()) {
+ for i in 0..dmx.get_num_streams() {
+ let s = dmx.get_stream(i).unwrap();
+ if (self.no_video && s.get_media_type() == StreamType::Video) ||
+ (self.no_audio && s.get_media_type() == StreamType::Audio) {
+ self.decoders.push(None);
+ continue;
+ }
+
+ let info = s.get_info();
+ let decfunc = full_reg.dec_reg.find_decoder(info.get_name());
+ let str_id = (s.get_num() + is_off) as u32;
+ if let Some(create_dec) = decfunc {
+ let mut decoder = (create_dec)();
+ let mut dsupp = Box::new(NADecoderSupport::new());
+ let ret = decoder.init(&mut dsupp, info.clone());
+ if ret.is_err() {
+ println!("Error initialising decoder '{}' for stream {}", info.get_name(), str_id);
+ self.debug_log(DebugLog::GENERAL, &format!("Error initialising decoder '{}' for stream {str_id}", info.get_name()));
+ if !ignerr {
+ return false;
+ } else {
+ self.decoders.push(None);
+ continue;
+ }
+ }
+ self.apply_decoder_options(decoder.as_mut(), str_id);
+ let desc = register::get_codec_description(info.get_name());
+ let caps = if let Some(desc) = desc {
+ desc.caps
+ } else if s.get_media_type() == StreamType::Video {
+ println!("No codec description found, using B-frame reorderer.");
+ self.debug_log(DebugLog::GENERAL, &format!("No codec description found for stream {str_id}, using B-frame reorderer"));
+ register::CODEC_CAP_REORDER
+ } else {
+ 0
+ };
+ let reorderer: Box<dyn FrameReorderer> = if (caps & register::CODEC_CAP_COMPLEX_REORDER) != 0 {
+ self.debug_log(DebugLog::DECODE, &format!(" Stream {str_id} - complex reorderer"));
+ Box::new(ComplexReorderer::new())
+ } else if (caps & register::CODEC_CAP_REORDER) != 0 {
+ self.debug_log(DebugLog::DECODE, &format!(" Stream {str_id} - B-frame reorderer"));
+ Box::new(IPBReorderer::new())
+ } else {
+ self.debug_log(DebugLog::DECODE, &format!(" Stream {str_id} - no reorderer"));
+ Box::new(NoReorderer::new())
+ };
+ self.decoders.push(Some(DecodeContext{ dsupp, decoder, reorderer }));
+ } else {
+ println!("No decoder for stream {} ({}) is found", str_id, info.get_name());
+ self.debug_log(DebugLog::GENERAL, &format!("No decoder found for stream {str_id} ({})", info.get_name()));
+ self.decoders.push(None);
+ }
+ }
+ if self.start != NATimePoint::None {
+ let ret = dmx.seek(self.start);
+ if ret.is_err() {
+ println!(" failed to seek to {} error {:?}", self.start, ret.err().unwrap());
+ self.debug_log(DebugLog::GENERAL, &format!("Failed to seek to {}", self.start));
+ }
+ }
+ }
+ true
+ }
pub fn debug_log(&mut self, level: u32, msg: &str) {
if let Some(ref mut dbg) = self.debug {
dbg.log(level, msg);