X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=videoplayer%2Fsrc%2Fmain.rs;h=cd35eb5e8d2e6d8cb9aff0d314c2041e34abaf1e;hb=e5ccd68db9e8cf512c1506e8769ca2e0a07d0b0e;hp=c681e9c459b97593f58749829a1bb05050ddcb2b;hpb=c66ce56577a58f3e5fc4885fbeab9135151c8f01;p=nihav-player.git diff --git a/videoplayer/src/main.rs b/videoplayer/src/main.rs index c681e9c..cd35eb5 100644 --- a/videoplayer/src/main.rs +++ b/videoplayer/src/main.rs @@ -92,6 +92,41 @@ macro_rules! debug_log { ($log: expr; $blk: block) => {}; } +enum ScaleSize { + Auto, + Times(f32), + Fixed(usize, usize) +} + +impl FromStr for ScaleSize { + type Err = (); + fn from_str(s: &str) -> Result { + if matches!(s, "" | "auto") { + Ok(ScaleSize::Auto) + } else if s.ends_with('x') || s.ends_with('X') { + let factor = s[..s.len() - 1].parse::().map_err(|_| ())?; + if factor > 0.0 { + Ok(ScaleSize::Times(factor)) + } else { + Err(()) + } + } else if s.contains('x') | s.contains('X') { + let mut dims = if s.contains('x') { s.split('x') } else { s.split('X') }; + let w = dims.next().unwrap(); + let h = dims.next().unwrap(); + let width = w.parse::().map_err(|_| ())?; + let height = h.parse::().map_err(|_| ())?; + if width > 0 && height > 0 { + Ok(ScaleSize::Fixed(width, height)) + } else { + Err(()) + } + } else { + Err(()) + } + } +} + pub enum PktSendEvent { Packet(NAPacket), GetFrames, @@ -303,6 +338,7 @@ struct Player { has_audio: bool, video_str: u32, audio_str: u32, + sc_size: ScaleSize, vthreads: usize, use_mt: bool, @@ -340,6 +376,7 @@ impl Player { has_audio: false, video_str: 0, audio_str: 0, + sc_size: ScaleSize::Auto, vthreads: 3, use_mt: true, @@ -488,7 +525,7 @@ impl Player { println!(); return Ok(true); }, - Keycode::Return => return Ok(true), + Keycode::Return | Keycode::KpEnter => return Ok(true), Keycode::Right => { self.seek(10, true, dmx, disp_queue)?; }, Keycode::Left => { self.seek(10, false, dmx, disp_queue)?; }, Keycode::Up => { self.seek(60, true, dmx, disp_queue)?; }, @@ -523,7 +560,11 @@ impl Player { self.vcontrol.try_send_video(PktSendEvent::HurryUp); }, Keycode::O => { - self.osd.toggle(); + if keymod.contains(Mod::RSHIFTMOD) || keymod.contains(Mod::LSHIFTMOD) { + self.osd.toggle_perm(); + } else { + self.osd.toggle(); + } }, _ => {}, }; @@ -541,6 +582,11 @@ impl Player { // prepare data source let path = Path::new(name); let mut file = if let Ok(handle) = File::open(path) { + if let Ok(meta) = handle.metadata() { + if meta.is_dir() { + return window; + } + } handle } else { println!("failed to open {}", name); @@ -698,10 +744,26 @@ impl Player { return window; } - while (width <= 384) && (height <= 288) { - width <<= 1; - height <<= 1; - } + match self.sc_size { + ScaleSize::Auto => { + while (width <= 384) && (height <= 288) { + width <<= 1; + height <<= 1; + } + }, + ScaleSize::Times(factor) => { + let nw = ((width as f32) * factor).ceil() as usize; + let nh = ((height as f32) * factor).ceil() as usize; + if nw > 0 && nh > 0 { + width = nw; + height = nh; + } + }, + ScaleSize::Fixed(w, h) => { + width = w; + height = h; + }, + }; // prepare playback structure let mut new_vcontrol = VideoControl::new(video_dec, width, height, tb_num, tb_den); @@ -726,7 +788,9 @@ impl Player { "NihAV player".to_owned() }; window.set_title(&wname).expect("set window title"); - window.set_size(width as u32, height as u32).expect("resize window"); + if window.size() != (width as u32, height as u32) { + window.set_size(width as u32, height as u32).expect("resize window"); + } window.show(); let mut canvas = window.into_canvas().build().expect("should be able to build canvas"); let texture_creator = canvas.texture_creator(); @@ -916,6 +980,15 @@ fn main() { } } }, + "-scale" => { + if let Some(arg) = aiter.next() { + if let Ok(ssize) = arg.parse::() { + player.sc_size = ssize; + } else { + println!("invalid scale size"); + } + } + }, _ => { window = player.play(window, arg, seek_time); if player.end { break; }