X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=videoplayer%2Fsrc%2Fmain.rs;h=3f15d9462ec1cc64bc534d63d802817a5d5de399;hb=8686f9f650974a6065f93df178a76f8d24814ca7;hp=dcd4d0a3538fa51e2a15372f506c11cfbf032137;hpb=37f130a74415deaf920b04209e1c334a8876c381;p=nihav-player.git 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, ctime: &TimeKeep) -> Option { +fn try_display(disp_queue: &mut DispQueue, canvas: &mut Canvas, osd: &mut OSD, ctime: &TimeKeep) -> Option { 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, 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); }