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
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 @@
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 @@
}
AwesomePlayer::AwesomePlayer()
- : mTimeSource(NULL),
+ : mQueueStarted(false),
+ mTimeSource(NULL),
mVideoRendererIsPreview(false),
mAudioPlayer(NULL),
mFlags(0),
@@ -201,13 +202,13 @@
mAudioStatusEventPending = false;
- mQueue.start();
-
reset();
}
AwesomePlayer::~AwesomePlayer() {
- mQueue.stop();
+ if (mQueueStarted) {
+ mQueue.stop();
+ }
reset();
@@ -443,6 +444,8 @@
notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
pause_l();
+
+ mFlags |= AT_EOS;
}
}
@@ -517,6 +520,12 @@
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_l(int64_t timeUs) {
mSeeking = true;
mSeekTimeUs = timeUs;
+ mFlags &= ~AT_EOS;
seekAudioIfNecessary_l();
@@ -989,6 +999,11 @@
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 @@
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 @@
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 @@
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;