implement displaying time on screen
[nihav-player.git] / videoplayer / src / main.rs
index dcd4d0a3538fa51e2a15372f506c11cfbf032137..3f15d9462ec1cc64bc534d63d802817a5d5de399 100644 (file)
@@ -29,6 +29,8 @@ mod audiodec;
 use audiodec::*;
 mod videodec;
 use videodec::*;
+mod osd;
+use osd::*;
 
 #[cfg(feature="debug")]
 macro_rules! debug_log {
@@ -159,10 +161,20 @@ impl<'a> DispQueue<'a> {
         }
     }
 
-    fn get_last_texture(&self) -> &Texture<'a> {
+    fn get_last_texture(&mut self, osd: &OSD) -> &Texture<'a> {
         if self.pool[self.len].is_yuv {
+            if osd.is_active() {
+                self.pool[self.len].yuv_tex.with_lock(None, |buffer: &mut [u8], pitch: usize| {
+                        osd.draw_yuv(buffer, pitch);
+                    }).unwrap();
+            }
             &self.pool[self.len].yuv_tex
         } else {
+            if osd.is_active() {
+                self.pool[self.len].rgb_tex.with_lock(None, |buffer: &mut [u8], pitch: usize| {
+                        osd.draw_rgb(buffer, pitch);
+                    }).unwrap();
+            }
             &self.pool[self.len].rgb_tex
         }
     }
@@ -186,7 +198,7 @@ impl<'a> DispQueue<'a> {
     }
 }
 
-fn try_display(disp_queue: &mut DispQueue, canvas: &mut Canvas<Window>, ctime: &TimeKeep) -> Option<u64> {
+fn try_display(disp_queue: &mut DispQueue, canvas: &mut Canvas<Window>, osd: &mut OSD, ctime: &TimeKeep) -> Option<u64> {
     while !disp_queue.is_empty() {
         let disp_time = disp_queue.first_ts;
         let ctime = ctime.get_cur_time();
@@ -195,8 +207,25 @@ fn try_display(disp_queue: &mut DispQueue, canvas: &mut Canvas<Window>, ctime: &
         } else if disp_time + 10 < ctime {
             disp_queue.move_start();
         } else {
-            let frm = &disp_queue.pool[disp_queue.start];
-            let texture = if frm.is_yuv { &frm.yuv_tex } else { &frm.rgb_tex };
+            if osd.is_active() {
+                osd.prepare(ctime);
+            }
+            let frm = &mut disp_queue.pool[disp_queue.start];
+            let texture = if frm.is_yuv {
+                    if osd.is_active() {
+                        frm.yuv_tex.with_lock(None, |buffer: &mut [u8], pitch: usize| {
+                                osd.draw_yuv(buffer, pitch);
+                            }).unwrap();
+                    }
+                    &frm.yuv_tex
+                } else {
+                    if osd.is_active() {
+                        frm.rgb_tex.with_lock(None, |buffer: &mut [u8], pitch: usize| {
+                                osd.draw_rgb(buffer, pitch);
+                            }).unwrap();
+                    }
+                    &frm.rgb_tex
+                };
             canvas.clear();
             canvas.copy(texture, None, None).unwrap();
             canvas.present();
@@ -238,6 +267,7 @@ struct Player {
     tkeep:          TimeKeep,
 
     debug:          bool,
+    osd:            OSD,
 
     #[cfg(feature="debug")]
     logfile:        File,
@@ -274,6 +304,7 @@ impl Player {
             tkeep:          TimeKeep::new(),
 
             debug:          false,
+            osd:            OSD::new(),
 
             #[cfg(feature="debug")]
             logfile:        File::create("debug.log").unwrap(),
@@ -367,7 +398,7 @@ impl Player {
             }
             if let Event::Window {win_event: WindowEvent::Exposed, ..} = event {
                 canvas.clear();
-                canvas.copy(disp_queue.get_last_texture(), None, None).unwrap();
+                canvas.copy(disp_queue.get_last_texture(&self.osd), None, None).unwrap();
                 canvas.present();
             }
             if let Event::KeyDown {keycode: Some(keycode), ..} = event {
@@ -425,6 +456,9 @@ impl Player {
                     Keycode::H => {
                         self.vcontrol.try_send_video(PktSendEvent::HurryUp);
                     },
+                    Keycode::O => {
+                        self.osd.toggle();
+                    },
                     _ => {},
                 };
                 if !self.paused {
@@ -611,7 +645,7 @@ impl Player {
         let mut disp_q = DispQueue::new(&texture_creator, width, height, if self.has_video { FRAME_QUEUE_LEN } else { 0 });
         if !self.has_video {
             canvas.clear();
-            canvas.copy(disp_q.get_last_texture(), None, None).unwrap();
+            canvas.copy(disp_q.get_last_texture(&self.osd), None, None).unwrap();
             canvas.present();
         }
 
@@ -674,7 +708,7 @@ impl Player {
                 debug_log!(self; {format!(" time {}", self.tkeep.get_cur_time())});
                 if self.has_video {
                     debug_log!(self; {format!("  disp queue {}-{}, {}-{} vqueue fill {}", disp_q.first_ts, disp_q.last_ts, disp_q.start, disp_q.end, self.vcontrol.get_queue_size())});
-                    let ret = try_display(&mut disp_q, &mut canvas, &self.tkeep);
+                    let ret = try_display(&mut disp_q, &mut canvas, &mut self.osd, &self.tkeep);
                     if let Some(next_time) = ret {
                         sleep_time = sleep_time.min(next_time);
                     }