]> git.nihav.org Git - nihav-player.git/commitdiff
videoplayer: add option for initial seek on all played files master
authorKostya Shishkov <kostya.shishkov@gmail.com>
Sun, 2 Aug 2026 17:16:30 +0000 (19:16 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Sun, 2 Aug 2026 17:16:30 +0000 (19:16 +0200)
videoplayer/src/main.rs

index 8f98bc245dd112b6e5fd8b14523954ab54399d19..e55bfe577cae78a6fa8d529d2d0f6f7edf7f02f7 100644 (file)
@@ -170,6 +170,23 @@ pub struct DecoderStuff {
     pub dec:    DecoderType,
 }
 
+#[derive(Clone,Copy)]
+enum OptionLifetime<T: Copy> {
+    None,
+    Once(T),
+    Permanent(T),
+}
+
+impl<T: Copy> OptionLifetime<T> {
+    fn get_val(&self) -> Option<T> {
+        match *self {
+            OptionLifetime::None => None,
+            OptionLifetime::Once(val) => Some(val),
+            OptionLifetime::Permanent(val) => Some(val),
+        }
+    }
+}
+
 fn format_time(ms: u64) -> String {
     let s = ms / 1000;
     let ds = (ms % 1000) / 100;
@@ -792,7 +809,7 @@ impl Player {
         }
         Ok(false)
     }
-    fn play(&mut self, mut window: Window, name: &str, start_time: NATimePoint) -> Window {
+    fn play(&mut self, mut window: Window, name: &str, start_time: &OptionLifetime<NATimePoint>) -> Window {
         if self.loglevel != LogLevel::Quiet {
             println!("Playing {name}");
         }
@@ -820,9 +837,9 @@ impl Player {
             return window;
         }
 
-        if start_time != NATimePoint::None {
-            debug_log!(self; {format!(" start seek to {}", start_time)});
-            if dmx.seek(start_time).is_err() {
+        if let Some(start_time_val) = start_time.get_val() {
+            debug_log!(self; {format!(" start seek to {}", start_time_val)});
+            if dmx.seek(start_time_val).is_err() {
                 println!("initial seek failed");
             }
         }
@@ -1288,7 +1305,7 @@ fn main() {
     }
 
     let mut aiter = args.iter().skip(1);
-    let mut seek_time = NATimePoint::None;
+    let mut seek_time = OptionLifetime::None;
     while let Some(arg) = aiter.next() {
         match arg.as_str() {
             "-an" => { player.play_audio = false; },
@@ -1298,10 +1315,20 @@ fn main() {
             "-seek" | "-start" => {
                 if let Some(arg) = aiter.next() {
                     if let Ok(time) = arg.parse::<NATimePoint>() {
-                        seek_time = time;
+                        seek_time = OptionLifetime::Once(time);
+                    } else {
+                        println!("wrong seek time");
+                        seek_time = OptionLifetime::None;
+                    }
+                }
+            },
+            "-seekall" | "-startall" => {
+                if let Some(arg) = aiter.next() {
+                    if let Ok(time) = arg.parse::<NATimePoint>() {
+                        seek_time = OptionLifetime::Permanent(time);
                     } else {
                         println!("wrong seek time");
-                        seek_time = NATimePoint::None;
+                        seek_time = OptionLifetime::None;
                     }
                 }
             },
@@ -1407,9 +1434,11 @@ fn main() {
                 }
             },
             _ => {
-                window = player.play(window, arg, seek_time);
+                window = player.play(window, arg, &seek_time);
                 if player.end { break; }
-                seek_time = NATimePoint::None;
+                if !matches!(seek_time, OptionLifetime::Permanent(_)) {
+                    seek_time = OptionLifetime::None;
+                }
             },
         };
     }