use sdl2::pixels::PixelFormatEnum;
use sdl2::video::{Window, WindowContext};
-use nihav_registry::detect;
use nihav_core::frame::*;
-use nihav_core::io::byteio::{ByteIO,FileReader};
+use nihav_core::io::byteio::FileReader;
use nihav_core::reorder::*;
use nihav_core::codecs::*;
use nihav_core::demuxers::*;
use nihav_registry::register::*;
+use nihav_hlblocks::demux::*;
use nihav_allstuff::*;
#[cfg(feature="hwaccel")]
vsystem: sdl2::VideoSubsystem,
asystem: sdl2::AudioSubsystem,
+ full_reg: FullRegister,
+
acontrol: AudioControl,
vcontrol: VideoControl,
acontrol, vcontrol,
+ full_reg: FullRegister::new(),
+
thr_w: 384,
thr_h: 288,
logfile: File::create("debug.log").expect("'debug.log' should be available for writing"),
}
}
- fn seek(&mut self, off: u64, fwd: bool, dmx: &mut Demuxer, disp_queue: &mut DispQueue) -> Result<(), ()> {
+ fn seek(&mut self, off: u64, fwd: bool, dmx: &mut DemuxerObject, disp_queue: &mut DispQueue) -> Result<(), ()> {
let cur_time = self.tkeep.get_cur_time();
let seektime = if fwd { cur_time + off * 1000 } else {
cur_time.saturating_sub(off * 1000) };
}
Ok(())
}
- fn prefill(&mut self, dmx: &mut Demuxer, disp_queue: &mut DispQueue) -> Result<(), ()> {
+ fn prefill(&mut self, dmx: &mut DemuxerObject, disp_queue: &mut DispQueue) -> Result<(), ()> {
debug_log!(self; {" prefilling"});
while self.vcontrol.get_queue_size() < FRAME_QUEUE_LEN {
let mut try_send = self.acontrol.get_queue_size() < FRAME_QUEUE_LEN && (!self.has_video || (!self.vcontrol.is_filled(FRAME_QUEUE_LEN) && !disp_queue.is_full()));
self.acontrol.resume();
}
}
- fn handle_events(&mut self, event_pump: &mut sdl2::EventPump, canvas: &mut Canvas<Window>, dmx: &mut Demuxer, disp_queue: &mut DispQueue) -> Result<bool, ()> {
+ fn handle_events(&mut self, event_pump: &mut sdl2::EventPump, canvas: &mut Canvas<Window>, dmx: &mut DemuxerObject, disp_queue: &mut DispQueue) -> Result<bool, ()> {
for event in event_pump.poll_iter() {
if let Event::Quit {..} = event {
self.end = true;
// prepare data source
let path = Path::new(name);
- let mut file = if let Ok(handle) = File::open(path) {
+ let file = if let Ok(handle) = File::open(path) {
if let Ok(meta) = handle.metadata() {
if meta.is_dir() {
return window;
println!("failed to open {}", name);
return window;
};
- let mut br = FileReader::new_read(&mut file);
- let res = detect::detect_format(name, &mut br);
- if res.is_none() {
- println!("cannot detect format for {}", name);
- return window;
- }
- let (dmx_name, _score) = res.unwrap();
- debug_log!(self; {format!(" found demuxer {} with score {:?}", dmx_name, _score)});
- if !self.quiet {
- println!("trying demuxer {} on {}", dmx_name, name);
- }
-
- let mut dmx_reg = RegisteredDemuxers::new();
- nihav_register_all_demuxers(&mut dmx_reg);
- let mut dec_reg = RegisteredDecoders::new();
- nihav_register_all_decoders(&mut dec_reg);
- let mut mtdec_reg = RegisteredMTDecoders::new();
- if self.use_mt {
- nihav_register_all_mt_decoders(&mut mtdec_reg);
- }
-
- let ret = dmx_reg.find_demuxer(dmx_name);
- if ret.is_none() {
- println!("error finding {} demuxer", dmx_name);
- return window;
- }
- let dmx_fact = ret.unwrap();
- br.seek(SeekFrom::Start(0)).expect("should be able to seek to the start");
- let ret = create_demuxer(dmx_fact, &mut br);
- if ret.is_err() {
+ let br = Box::new(FileReader::new_read(file));
+ let mut dmx = DemuxerObject::create(br, &self.full_reg, name, None, false, &[], !self.quiet);
+ if dmx.is_none() {
println!("error creating demuxer");
return window;
}
- let mut dmx = ret.unwrap();
+
if start_time != NATimePoint::None {
debug_log!(self; {format!(" start seek to {}", start_time)});
if dmx.seek(start_time).is_err() {
for i in 0..dmx.get_num_streams() {
let s = dmx.get_stream(i).unwrap();
let info = s.get_info();
- let decfunc = dec_reg.find_decoder(info.get_name());
- let decfunc_mt = mtdec_reg.find_decoder(info.get_name());
+ let decfunc = self.full_reg.dec_reg.find_decoder(info.get_name());
+ let decfunc_mt = if self.use_mt { self.full_reg.mtdec_reg.find_decoder(info.get_name()) } else { None };
let stream_info = format_stream_info(i, &s);
if !self.quiet {
println!("{stream_info}");
let mut builder = player.vsystem.window("NihAV Player", 640, 480);
let mut window = builder.position_centered().hidden().build().expect("should be able to centre window");
+ nihav_register_all_demuxers(&mut player.full_reg.dmx_reg);
+ nihav_register_all_raw_demuxers(&mut player.full_reg.rdmx_reg);
+ nihav_register_all_decoders(&mut player.full_reg.dec_reg);
+ nihav_register_all_mt_decoders(&mut player.full_reg.mtdec_reg);
+ nihav_register_all_packetisers(&mut player.full_reg.pkt_reg);
+
#[cfg(not(target_os = "windows"))]
#[allow(deprecated)]
if let Some(home_path) = std::env::home_dir() {