diff options
Diffstat (limited to 'media/libstagefright/AwesomePlayer.cpp')
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 98 |
1 files changed, 76 insertions, 22 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 2b403f8..d25f7f6 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -37,21 +37,23 @@ namespace android { struct AwesomeEvent : public TimedEventQueue::Event { - AwesomeEvent(AwesomePlayer *player, int32_t code) + AwesomeEvent( + AwesomePlayer *player, + void (AwesomePlayer::*method)()) : mPlayer(player), - mCode(code) { + mMethod(method) { } protected: virtual ~AwesomeEvent() {} virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) { - mPlayer->onEvent(mCode); + (mPlayer->*mMethod)(); } private: AwesomePlayer *mPlayer; - int32_t mCode; + void (AwesomePlayer::*mMethod)(); AwesomeEvent(const AwesomeEvent &); AwesomeEvent &operator=(const AwesomeEvent &); @@ -115,13 +117,16 @@ AwesomePlayer::AwesomePlayer() DataSource::RegisterDefaultSniffers(); - mVideoEvent = new AwesomeEvent(this, 0); + mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent); mVideoEventPending = false; - mStreamDoneEvent = new AwesomeEvent(this, 1); + mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone); mStreamDoneEventPending = false; - mBufferingEvent = new AwesomeEvent(this, 2); + mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate); mBufferingEventPending = false; - mCheckAudioStatusEvent = new AwesomeEvent(this, 3); + + mCheckAudioStatusEvent = new AwesomeEvent( + this, &AwesomePlayer::onCheckAudioStatus); + mAudioStatusEventPending = false; mQueue.start(); @@ -287,12 +292,12 @@ void AwesomePlayer::reset_l() { mPrefetcher.clear(); } -void AwesomePlayer::notifyListener_l(int msg, int ext1) { +void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { if (mListener != NULL) { sp<MediaPlayerBase> listener = mListener.promote(); if (listener != NULL) { - listener->sendEvent(msg, ext1); + listener->sendEvent(msg, ext1, ext2); } } } @@ -623,18 +628,7 @@ status_t AwesomePlayer::setVideoSource(sp<MediaSource> source) { return mVideoSource != NULL ? OK : UNKNOWN_ERROR; } -void AwesomePlayer::onEvent(int32_t code) { - if (code == 1) { - onStreamDone(); - return; - } else if (code == 2) { - onBufferingUpdate(); - return; - } else if (code == 3) { - onCheckAudioStatus(); - return; - } - +void AwesomePlayer::onVideoEvent() { Mutex::Autolock autoLock(mLock); mVideoEventPending = false; @@ -819,5 +813,65 @@ void AwesomePlayer::onCheckAudioStatus() { postCheckAudioStatusEvent_l(); } +status_t AwesomePlayer::prepare() { + Mutex::Autolock autoLock(mLock); + + status_t err = prepareAsync_l(); + + if (err != OK) { + return err; + } + + while (mAsyncPrepareEvent != NULL) { + mPreparedCondition.wait(mLock); + } + + return OK; +} + +status_t AwesomePlayer::prepareAsync() { + Mutex::Autolock autoLock(mLock); + return prepareAsync_l(); +} + +status_t AwesomePlayer::prepareAsync_l() { + if (mAsyncPrepareEvent != NULL) { + return UNKNOWN_ERROR; // async prepare already pending. + } + + mAsyncPrepareEvent = new AwesomeEvent( + this, &AwesomePlayer::onPrepareAsyncEvent); + + mQueue.postEvent(mAsyncPrepareEvent); + + return OK; +} + +void AwesomePlayer::onPrepareAsyncEvent() { + sp<Prefetcher> prefetcher; + + { + Mutex::Autolock autoLock(mLock); + prefetcher = mPrefetcher; + } + + if (prefetcher != NULL) { + prefetcher->prepare(); + } + + Mutex::Autolock autoLock(mLock); + + if (mVideoWidth < 0 || mVideoHeight < 0) { + notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0); + } else { + notifyListener_l(MEDIA_SET_VIDEO_SIZE, mVideoWidth, mVideoHeight); + } + + notifyListener_l(MEDIA_PREPARED); + + mAsyncPrepareEvent = NULL; + mPreparedCondition.signal(); +} + } // namespace android |