wait for flush to finish before returning setSurface
Bug: 17187598
Change-Id: I091219e57158a4532044ca49342b57277d6ecb15
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
index 60beb9d..2f60072 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
@@ -34,6 +34,7 @@
: mState(STATE_IDLE),
mIsAsyncPrepare(false),
mAsyncResult(UNKNOWN_ERROR),
+ mSetSurfaceInProgress(false),
mDurationUs(-1),
mPositionUs(-1),
mNotifyTimeRealUs(-1),
@@ -136,6 +137,10 @@
const sp<IGraphicBufferProducer> &bufferProducer) {
Mutex::Autolock autoLock(mLock);
+ if (mSetSurfaceInProgress) {
+ return INVALID_OPERATION;
+ }
+
switch (mState) {
case STATE_SET_DATASOURCE_PENDING:
case STATE_RESET_IN_PROGRESS:
@@ -145,8 +150,14 @@
break;
}
+ mSetSurfaceInProgress = true;
+
mPlayer->setVideoSurfaceTextureAsync(bufferProducer);
+ while (mSetSurfaceInProgress) {
+ mCondition.wait(mLock);
+ }
+
return OK;
}
@@ -533,6 +544,15 @@
mCondition.broadcast();
}
+void NuPlayerDriver::notifySetSurfaceComplete() {
+ Mutex::Autolock autoLock(mLock);
+
+ CHECK(mSetSurfaceInProgress);
+ mSetSurfaceInProgress = false;
+
+ mCondition.broadcast();
+}
+
void NuPlayerDriver::notifyDuration(int64_t durationUs) {
Mutex::Autolock autoLock(mLock);
mDurationUs = durationUs;