]> git.nihav.org Git - nihav-player.git/commitdiff
videoplayer: use nihav_hlblocks for demuxer code
authorKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 31 Jan 2026 16:01:14 +0000 (17:01 +0100)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 31 Jan 2026 16:01:14 +0000 (17:01 +0100)
videoplayer/Cargo.toml
videoplayer/src/main.rs

index 8cdc4a2bb96312807f13b82ff47b4bb0dd34c8eb..2afe1b38a05c87fa7a31d47d17db8e6a0f4a3554 100644 (file)
@@ -8,6 +8,7 @@ edition = "2018"
 nihav_core = { path="../../nihav-core" }
 nihav_registry = { path="../../nihav-registry" }
 nihav_allstuff = { path="../../nihav-allstuff" }
+nihav_hlblocks = { path="../../nihav-hlblocks", features = ["demuxer"] }
 hwdec_vaapi = { path="../hwdec-vaapi", optional = true }
 
 sdl2 = "^0.33"
index 63b9675f4fc8c2515ded1e30d6aaa8f000a2960e..59d09eb9e64a27851f3e4983f3f26988ee84fc92 100644 (file)
@@ -20,13 +20,13 @@ use sdl2::render::{Canvas, Texture, TextureCreator};
 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")]
@@ -424,6 +424,8 @@ struct Player {
     vsystem:        sdl2::VideoSubsystem,
     asystem:        sdl2::AudioSubsystem,
 
+    full_reg:       FullRegister,
+
     acontrol:       AudioControl,
     vcontrol:       VideoControl,
 
@@ -474,6 +476,8 @@ impl Player {
 
             acontrol, vcontrol,
 
+            full_reg:       FullRegister::new(),
+
             thr_w:          384,
             thr_h:          288,
 
@@ -508,7 +512,7 @@ impl Player {
             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) };
@@ -546,7 +550,7 @@ impl Player {
         }
         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()));
@@ -604,7 +608,7 @@ impl Player {
             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;
@@ -717,7 +721,7 @@ impl Player {
 
         // 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;
@@ -728,40 +732,13 @@ impl Player {
                 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() {
@@ -793,8 +770,8 @@ impl Player {
         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}");
@@ -1118,6 +1095,12 @@ fn main() {
     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() {