-
Notifications
You must be signed in to change notification settings - Fork 60
Open
Description
My invoke flow is:
invoke with an url -> read from file -> player.set_input_size -> invoke player.push_data in 5 secs
note : i havn't called player.play yet.
Here is my code snippet:
pub fn set_up_media(context_ver: u32) -> Result<InnerPlayer, AnyError> {
let (sender, receiver) = ipc::channel::<PlayerEvent>().unwrap();
let player = ServoMedia::get().unwrap().create_player(
&ClientContextId::build(context_ver, 1),
StreamType::Seekable,
sender,
None,
None,
Box::new(PlayerContextDummy()),
);
let inner_player = InnerPlayer {
player,
loop_: Arc::new(AtomicBool::default()),
playback_position: Arc::new(AtomicU64::default()),
playback_start_time: Arc::new(Mutex::new(0.)),
playback_rate: Arc::new(Mutex::new(1.)),
duration: Arc::new(Mutex::new(f64::INFINITY)),
data: Arc::new(Mutex::new(vec![])),
};
let inner_player_clone = inner_player.clone();
ROUTER.add_route(
receiver.to_opaque(),
Box::new(move |message| {
let event = message.to().unwrap();
inner_player_clone.handle_player_event(event);
}),
);
Ok(inner_player)
}
pub fn handle_player_event(&self, event: PlayerEvent) {
match event {
PlayerEvent::EndOfStream => {
log::debug!("player end of stream.");
if self.looping() {
log::debug!("need loop from start.");
}
}
PlayerEvent::Error(e) => {
log::debug!("player error happened, {}", e);
}
PlayerEvent::VideoFrameUpdated => {
log::debug!("player video frame updated.")
}
PlayerEvent::MetadataUpdated(ref m) => {
log::debug!("player metadata updated: {:?}", m);
self.playback_position.store(0, Ordering::Relaxed);
if let Some(duration) = m.duration {
*self.duration.lock().unwrap() = duration.as_secs_f64();
}
let mut jumped = false;
let start_position = self.playback_start_time.lock().unwrap();
if *start_position > 0. {
jumped = true;
self.seek(*start_position);
}
*self.playback_start_time.lock().unwrap() = 0.;
}
PlayerEvent::NeedData => {
log::debug!("player need data.")
}
PlayerEvent::EnoughData => {
log::debug!("player enough data.")
}
PlayerEvent::PositionChanged(pos) => {
log::debug!("player position changed: {}", pos);
self.playback_position.store(pos, Ordering::Relaxed);
}
PlayerEvent::SeekData(pos, ref seek_lock) => {
log::debug!("player seek data event with pos: {}", pos);
seek_lock.unlock(true);
if let Err(e) = self
.player
.lock()
.unwrap()
.push_data(self.data.lock().unwrap()[pos as usize..].to_vec())
{
log::error!("push data failed: {:?}", e);
}
log::debug!("player seek data pushed.");
}
PlayerEvent::SeekDone(s) => {
log::debug!("player seek done: {}", s);
}
PlayerEvent::StateChanged(ref state) => {
log::debug!("player state changed to: {:?}, time: {:?}", state, std::time::Instant::now());
}
}
}
pub fn seek(&self, time: f64) {
log::debug!("player seek called: {}", time);
let time = f64::min(time, self.duration());
let time = f64::max(time, 0.);
let player = self.player.lock().unwrap();
if let Err(e) = player.seek(time) {
log::error!("player seek failed: {:?}", e);
}
}
`
Metadata
Metadata
Assignees
Labels
No labels