NuPlayer: fix behavior of setPlaybackParams.
setPlaybackParams with zero speed is equivalent to pause().
setPlaybackParams with non-zero speed should start playback when player has
been prepared.
Bug: 29032949
Change-Id: Ib7738da653208f4fe5a8f1d7cf98b8479b3dc798
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 9f63027..eb77af5 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -188,6 +188,7 @@
mPlaybackSettings(AUDIO_PLAYBACK_RATE_DEFAULT),
mVideoFpsHint(-1.f),
mStarted(false),
+ mPrepared(false),
mResetting(false),
mSourceStarted(false),
mPaused(false),
@@ -768,9 +769,17 @@
newRate.mSpeed = mPlaybackSettings.mSpeed;
mPlaybackSettings = newRate;
} else { /* rate.mSpeed != 0.f */
- onResume();
- mPausedByClient = false;
mPlaybackSettings = rate;
+ if (mStarted) {
+ // do not resume yet if the source is still buffering
+ if (!mPausedForBuffering) {
+ onResume();
+ }
+ } else if (mPrepared) {
+ onStart();
+ }
+
+ mPausedByClient = false;
}
}
@@ -2012,6 +2021,7 @@
}
mStarted = false;
+ mPrepared = false;
mResetting = false;
mSourceStarted = false;
}
@@ -2124,6 +2134,8 @@
new FlushDecoderAction(FLUSH_CMD_SHUTDOWN /* audio */,
FLUSH_CMD_SHUTDOWN /* video */));
processDeferredActions();
+ } else {
+ mPrepared = true;
}
sp<NuPlayerDriver> driver = mDriver.promote();
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h
index 7431532..ae17c76 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h
@@ -198,6 +198,7 @@
AVSyncSettings mSyncSettings;
float mVideoFpsHint;
bool mStarted;
+ bool mPrepared;
bool mResetting;
bool mSourceStarted;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
index 06bb53d..0f4dce9 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
@@ -243,7 +243,10 @@
status_t NuPlayerDriver::start() {
ALOGD("start(%p), state is %d, eos is %d", this, mState, mAtEOS);
Mutex::Autolock autoLock(mLock);
+ return start_l();
+}
+status_t NuPlayerDriver::start_l() {
switch (mState) {
case STATE_UNPREPARED:
{
@@ -357,8 +360,11 @@
if (rate.mSpeed == 0.f && mState == STATE_RUNNING) {
mState = STATE_PAUSED;
notifyListener_l(MEDIA_PAUSED);
- } else if (rate.mSpeed != 0.f && mState == STATE_PAUSED) {
- mState = STATE_RUNNING;
+ } else if (rate.mSpeed != 0.f
+ && (mState == STATE_PAUSED
+ || mState == STATE_STOPPED_AND_PREPARED
+ || mState == STATE_PREPARED)) {
+ err = start_l();
}
}
return err;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
index d5b4ba1..26d3a60 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
@@ -123,6 +123,7 @@
bool mAutoLoop;
status_t prepare_l();
+ status_t start_l();
void notifyListener_l(int msg, int ext1 = 0, int ext2 = 0, const Parcel *in = NULL);
DISALLOW_EVIL_CONSTRUCTORS(NuPlayerDriver);