diff options
| -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; |
