Skip to content

Strange log in android when using Player #422

@cxg1023

Description

@cxg1023

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions