summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice
diff options
context:
space:
mode:
authorChong Zhang <chz@google.com>2014-08-23 00:05:00 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-08-23 00:05:01 +0000
commit052efa490b595d17d1452ec019979996fe470a05 (patch)
tree481cb29e65c538a2d262918e33ac97bab8ed825c /media/libmediaplayerservice
parent43febe72dadc751acff410842e091d4099919fad (diff)
parent13d6faa02087ce3bb0d4a02b8495f1822f211433 (diff)
downloadframeworks_av-052efa490b595d17d1452ec019979996fe470a05.zip
frameworks_av-052efa490b595d17d1452ec019979996fe470a05.tar.gz
frameworks_av-052efa490b595d17d1452ec019979996fe470a05.tar.bz2
Merge "wait for flush to finish before returning setSurface" into lmp-dev
Diffstat (limited to 'media/libmediaplayerservice')
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayer.cpp7
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp20
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDriver.h2
3 files changed, 29 insertions, 0 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 60f0b8c..b79a5dd 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -1732,6 +1732,13 @@ void NuPlayer::performSetSurface(const sp<NativeWindowWrapper> &wrapper) {
// XXX - ignore error from setVideoScalingMode for now
setVideoScalingMode(mVideoScalingMode);
+
+ if (mDriver != NULL) {
+ sp<NuPlayerDriver> driver = mDriver.promote();
+ if (driver != NULL) {
+ driver->notifySetSurfaceComplete();
+ }
+ }
}
void NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
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 @@ NuPlayerDriver::NuPlayerDriver()
: mState(STATE_IDLE),
mIsAsyncPrepare(false),
mAsyncResult(UNKNOWN_ERROR),
+ mSetSurfaceInProgress(false),
mDurationUs(-1),
mPositionUs(-1),
mNotifyTimeRealUs(-1),
@@ -136,6 +137,10 @@ status_t NuPlayerDriver::setVideoSurfaceTexture(
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 @@ status_t NuPlayerDriver::setVideoSurfaceTexture(
break;
}
+ mSetSurfaceInProgress = true;
+
mPlayer->setVideoSurfaceTextureAsync(bufferProducer);
+ while (mSetSurfaceInProgress) {
+ mCondition.wait(mLock);
+ }
+
return OK;
}
@@ -533,6 +544,15 @@ void NuPlayerDriver::notifyResetComplete() {
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;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
index b0a52ad..e81d605 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
@@ -66,6 +66,7 @@ struct NuPlayerDriver : public MediaPlayerInterface {
void notifySetDataSourceCompleted(status_t err);
void notifyPrepareCompleted(status_t err);
void notifyResetComplete();
+ void notifySetSurfaceComplete();
void notifyDuration(int64_t durationUs);
void notifyPosition(int64_t positionUs);
void notifySeekComplete();
@@ -102,6 +103,7 @@ private:
// The following are protected through "mLock"
// >>>
+ bool mSetSurfaceInProgress;
int64_t mDurationUs;
int64_t mPositionUs;
int64_t mNotifyTimeRealUs;