use audiodec::*;
mod videodec;
use videodec::*;
+mod osd;
+use osd::*;
#[cfg(feature="debug")]
macro_rules! debug_log {
}
}
- 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
}
}
}
}
-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();
} 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();
tkeep: TimeKeep,
debug: bool,
+ osd: OSD,
#[cfg(feature="debug")]
logfile: File,
tkeep: TimeKeep::new(),
debug: false,
+ osd: OSD::new(),
#[cfg(feature="debug")]
logfile: File::create("debug.log").unwrap(),
}
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 {
Keycode::H => {
self.vcontrol.try_send_video(PktSendEvent::HurryUp);
},
+ Keycode::O => {
+ self.osd.toggle();
+ },
_ => {},
};
if !self.paused {
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();
}
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);
}