mute: bool,
volume: usize,
end: bool,
+ seeked: bool,
tkeep: TimeKeep,
mute: false,
volume: 100,
end: false,
+ seeked: false,
tkeep: TimeKeep::new(),
return Ok(()); //TODO: not ignore some of seek errors?
}
+ self.seeked = true;
+
self.acontrol.flush();
self.vcontrol.flush();
disp_queue.flush();
}
if try_send {
match dmx.get_frame() {
- Err(DemuxerError::EOF) => break,
+ Err(DemuxerError::EOF) => {
+ self.vcontrol.try_send_video(PktSendEvent::End);
+ self.acontrol.try_send_audio(PktSendEvent::End);
+ break;
+ },
Err(_) => break,
Ok(pkt) => {
let streamno = pkt.get_stream().get_id();
let mut last_disp = Instant::now();
let mut has_data = true;
'main: loop {
+ self.seeked = false;
let ret = self.handle_events(&mut event_pump, &mut canvas, &mut dmx, &mut disp_q);
if matches!(ret, Ok(true) | Err(_)) {
if !self.quiet {
}
break 'main;
}
+ if self.seeked {
+ has_data = true;
+ }
if !self.paused {
let mut try_send = self.acontrol.get_queue_size() < FRAME_QUEUE_LEN && self.vcontrol.get_queue_size() < FRAME_QUEUE_LEN;
if !self.vcontrol.try_send_queued() && self.vcontrol.is_filled(FRAME_QUEUE_LEN) {
while let Some((buf, time)) = vdec.more_frames(false) {
vfsend.send((buf, time)).expect("video frame should be sent");
}
- VDEC_STATE.set_state(DecodingState::Waiting);
+ if VDEC_STATE.get_state() != DecodingState::End {
+ VDEC_STATE.set_state(DecodingState::Waiting);
+ }
},
Ok(PktSendEvent::Flush) => {
vdec.flush();
}
}
VDEC_STATE.set_state(DecodingState::End);
- break;
},
Ok(PktSendEvent::ImmediateEnd) => {
VDEC_STATE.set_state(DecodingState::End);
matches!(VDEC_STATE.get_state(), DecodingState::End | DecodingState::Error)
}
pub fn wait_for_frames(&mut self) -> Result<(), ()> {
+ if self.is_video_end() {
+ return Ok(());
+ }
VDEC_STATE.set_state(DecodingState::Prefetch);
self.try_send_event(PktSendEvent::GetFrames);
while !self.try_send_queued() {