diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2023-06-15 18:35:25 +0200 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2023-06-15 18:35:25 +0200 |
commit | 8686f9f650974a6065f93df178a76f8d24814ca7 (patch) | |
tree | c4d938f9808b7832726dd2ce1dc922403706fad7 /videoplayer/src/main.rs | |
parent | 37f130a74415deaf920b04209e1c334a8876c381 (diff) | |
download | nihav-player-8686f9f650974a6065f93df178a76f8d24814ca7.tar.gz |
implement displaying time on screen
Diffstat (limited to 'videoplayer/src/main.rs')
-rw-r--r-- | videoplayer/src/main.rs | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/videoplayer/src/main.rs b/videoplayer/src/main.rs index dcd4d0a..3f15d94 100644 --- a/videoplayer/src/main.rs +++ b/videoplayer/src/main.rs @@ -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); } |