summaryrefslogtreecommitdiffstats
path: root/videoplayer/src/main.rs
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2023-06-15 18:35:25 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2023-06-15 18:35:25 +0200
commit8686f9f650974a6065f93df178a76f8d24814ca7 (patch)
treec4d938f9808b7832726dd2ce1dc922403706fad7 /videoplayer/src/main.rs
parent37f130a74415deaf920b04209e1c334a8876c381 (diff)
downloadnihav-player-8686f9f650974a6065f93df178a76f8d24814ca7.tar.gz
implement displaying time on screen
Diffstat (limited to 'videoplayer/src/main.rs')
-rw-r--r--videoplayer/src/main.rs48
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);
}