diff options
| author | Andreas Huber <andih@google.com> | 2010-02-18 16:45:13 -0800 |
|---|---|---|
| committer | Andreas Huber <andih@google.com> | 2010-02-18 16:45:13 -0800 |
| commit | 406a18b5b3d53466a3e03b66413ff3a50243a6a8 (patch) | |
| tree | e9585ff0cf444ac6f4e433992cc4f60bf35f7c1c | |
| parent | 5706329cf42db714582fa698eb9f408350276f16 (diff) | |
| download | frameworks_base-406a18b5b3d53466a3e03b66413ff3a50243a6a8.zip frameworks_base-406a18b5b3d53466a3e03b66413ff3a50243a6a8.tar.gz frameworks_base-406a18b5b3d53466a3e03b66413ff3a50243a6a8.tar.bz2 | |
Implement legacy behaviour for MediaPlayer's behaviour of starting from the start of the media on a start() call instead of resuming at the current position, if previously reached the end of the stream. Also properly report number of frames played to audio flinger. Finally, delay spawing the queue thread until actually used.
related-to-bug: 2453220
| -rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 2 | ||||
| -rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 27 | ||||
| -rw-r--r-- | media/libstagefright/include/AwesomePlayer.h | 2 |
3 files changed, 25 insertions, 6 deletions
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index b4fc035..50dad33 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1614,6 +1614,8 @@ void MediaPlayerService::AudioOutput::CallbackWrapper( size_t actualSize = (*me->mCallback)( me, buffer->raw, buffer->size, me->mCallbackCookie); + buffer->size = actualSize; + if (actualSize > 0) { me->snoopWrite(buffer->raw, actualSize); } diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 59a5f9d..b3a73b0 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -178,7 +178,8 @@ void AwesomeLocalRenderer::init( } AwesomePlayer::AwesomePlayer() - : mTimeSource(NULL), + : mQueueStarted(false), + mTimeSource(NULL), mVideoRendererIsPreview(false), mAudioPlayer(NULL), mFlags(0), @@ -201,13 +202,13 @@ AwesomePlayer::AwesomePlayer() mAudioStatusEventPending = false; - mQueue.start(); - reset(); } AwesomePlayer::~AwesomePlayer() { - mQueue.stop(); + if (mQueueStarted) { + mQueue.stop(); + } reset(); @@ -443,6 +444,8 @@ void AwesomePlayer::onStreamDone() { notifyListener_l(MEDIA_PLAYBACK_COMPLETE); pause_l(); + + mFlags |= AT_EOS; } } @@ -517,6 +520,12 @@ status_t AwesomePlayer::play_l() { postBufferingEvent_l(); + if (mFlags & AT_EOS) { + // Legacy behaviour, if a stream finishes playing and then + // is started again, we play from the start... + seekTo_l(0); + } + return OK; } @@ -651,6 +660,7 @@ status_t AwesomePlayer::seekTo(int64_t timeUs) { status_t AwesomePlayer::seekTo_l(int64_t timeUs) { mSeeking = true; mSeekTimeUs = timeUs; + mFlags &= ~AT_EOS; seekAudioIfNecessary_l(); @@ -989,6 +999,11 @@ status_t AwesomePlayer::prepareAsync_l() { return UNKNOWN_ERROR; // async prepare already pending } + if (!mQueueStarted) { + mQueue.start(); + mQueueStarted = true; + } + mFlags |= PREPARING; mAsyncPrepareEvent = new AwesomeEvent( this, &AwesomePlayer::onPrepareAsyncEvent); @@ -1089,7 +1104,7 @@ status_t AwesomePlayer::suspend() { state->mUriHeaders = mUriHeaders; state->mFileSource = mFileSource; - state->mFlags = mFlags & (PLAYING | LOOPING); + state->mFlags = mFlags & (PLAYING | LOOPING | AT_EOS); getPosition_l(&state->mPositionUs); if (mLastVideoBuffer) { @@ -1150,7 +1165,7 @@ status_t AwesomePlayer::resume() { seekTo_l(state->mPositionUs); - mFlags = state->mFlags & LOOPING; + mFlags = state->mFlags & (LOOPING | AT_EOS); if (state->mLastVideoFrame && mISurface != NULL) { mVideoRenderer = diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index 114d4c6..ce8eeae 100644 --- a/media/libstagefright/include/AwesomePlayer.h +++ b/media/libstagefright/include/AwesomePlayer.h @@ -92,12 +92,14 @@ private: FIRST_FRAME = 4, PREPARING = 8, PREPARED = 16, + AT_EOS = 32, }; mutable Mutex mLock; OMXClient mClient; TimedEventQueue mQueue; + bool mQueueStarted; wp<MediaPlayerBase> mListener; sp<ISurface> mISurface; |
