From 1228d6b175de8b21787cbe0c6c4bb5642f4d555e Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Tue, 12 Aug 2014 21:25:48 -0700 Subject: [PATCH] use dedicated looper for GenericSource - handle setVideoSurface in deferred action, and return to client immediately - handle GenericSource's prepareAsync on its own looper, instead of sharing looper with NuPlayer - let HTTPLiveSource share looper with LiveSession, instead of NuPlayer - remove reflector in RTSPSource Bug: 16892748 Change-Id: I1aed557320052012065f5a90adbcb03c238da988 --- .../nuplayer/GenericSource.cpp | 22 ++++++++++++++++++++++ .../libmediaplayerservice/nuplayer/GenericSource.h | 6 ++++++ .../nuplayer/HTTPLiveSource.cpp | 15 +++++++++++---- media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 10 ---------- .../nuplayer/NuPlayerDriver.cpp | 20 -------------------- .../nuplayer/NuPlayerDriver.h | 2 -- .../libmediaplayerservice/nuplayer/RTSPSource.cpp | 12 ++++++------ media/libmediaplayerservice/nuplayer/RTSPSource.h | 3 --- 8 files changed, 45 insertions(+), 45 deletions(-) diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp index 66764616ce..76e1d549a0 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp +++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp @@ -192,9 +192,26 @@ status_t NuPlayer::GenericSource::setBuffers( } NuPlayer::GenericSource::~GenericSource() { + if (mLooper != NULL) { + mLooper->unregisterHandler(id()); + mLooper->stop(); + } } void NuPlayer::GenericSource::prepareAsync() { + if (mLooper == NULL) { + mLooper = new ALooper; + mLooper->setName("generic"); + mLooper->start(); + + mLooper->registerHandler(this); + } + + sp msg = new AMessage(kWhatPrepareAsync, id()); + msg->post(); +} + +void NuPlayer::GenericSource::onPrepareAsync() { // delayed data source creation AString sniffedMIME; sp dataSource; @@ -267,6 +284,11 @@ status_t NuPlayer::GenericSource::feedMoreTSData() { void NuPlayer::GenericSource::onMessageReceived(const sp &msg) { switch (msg->what()) { + case kWhatPrepareAsync: + { + onPrepareAsync(); + break; + } case kWhatFetchSubtitleData: { fetchTextData(kWhatSendSubtitleData, MEDIA_TRACK_TYPE_SUBTITLE, diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.h b/media/libmediaplayerservice/nuplayer/GenericSource.h index 44d690eb24..d3081de31e 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.h +++ b/media/libmediaplayerservice/nuplayer/GenericSource.h @@ -70,6 +70,7 @@ protected: private: enum { + kWhatPrepareAsync, kWhatFetchSubtitleData, kWhatFetchTimedTextData, kWhatSendSubtitleData, @@ -104,12 +105,17 @@ private: int64_t mOffset; int64_t mLength; + sp mLooper; + + void resetDataSource(); status_t initFromDataSource( const sp &dataSource, const char *mime); + void onPrepareAsync(); + void fetchTextData( uint32_t what, media_track_type type, int32_t curGen, sp packets, sp msg); diff --git a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp index c713d3926b..a003c81372 100644 --- a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp +++ b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp @@ -62,17 +62,24 @@ NuPlayer::HTTPLiveSource::HTTPLiveSource( NuPlayer::HTTPLiveSource::~HTTPLiveSource() { if (mLiveSession != NULL) { mLiveSession->disconnect(); - mLiveSession.clear(); + mLiveLooper->unregisterHandler(mLiveSession->id()); + mLiveLooper->unregisterHandler(id()); mLiveLooper->stop(); + + mLiveSession.clear(); mLiveLooper.clear(); } } void NuPlayer::HTTPLiveSource::prepareAsync() { - mLiveLooper = new ALooper; - mLiveLooper->setName("http live"); - mLiveLooper->start(); + if (mLiveLooper == NULL) { + mLiveLooper = new ALooper; + mLiveLooper->setName("http live"); + mLiveLooper->start(); + + mLiveLooper->registerHandler(this); + } sp notify = new AMessage(kWhatSessionNotify, id()); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index 9a4e81190d..fea43f190b 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -372,7 +372,6 @@ void NuPlayer::onMessageReceived(const sp &msg) { CHECK(msg->findObject("source", &obj)); if (obj != NULL) { mSource = static_cast(obj.get()); - looper()->registerHandler(mSource); } else { err = UNKNOWN_ERROR; } @@ -1688,8 +1687,6 @@ void NuPlayer::performReset() { if (mSource != NULL) { mSource->stop(); - looper()->unregisterHandler(mSource->id()); - mSource.clear(); } @@ -1722,13 +1719,6 @@ void NuPlayer::performSetSurface(const sp &wrapper) { // XXX - ignore error from setVideoScalingMode for now setVideoScalingMode(mVideoScalingMode); - - if (mDriver != NULL) { - sp driver = mDriver.promote(); - if (driver != NULL) { - driver->notifySetSurfaceComplete(); - } - } } void NuPlayer::onSourceNotify(const sp &msg) { diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp index e33e647695..bf7542f3f9 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp @@ -34,7 +34,6 @@ NuPlayerDriver::NuPlayerDriver() : mState(STATE_IDLE), mIsAsyncPrepare(false), mAsyncResult(UNKNOWN_ERROR), - mSetSurfaceInProgress(false), mDurationUs(-1), mPositionUs(-1), mNumFramesTotal(0), @@ -135,10 +134,6 @@ status_t NuPlayerDriver::setVideoSurfaceTexture( const sp &bufferProducer) { Mutex::Autolock autoLock(mLock); - if (mSetSurfaceInProgress) { - return INVALID_OPERATION; - } - switch (mState) { case STATE_SET_DATASOURCE_PENDING: case STATE_RESET_IN_PROGRESS: @@ -148,14 +143,8 @@ status_t NuPlayerDriver::setVideoSurfaceTexture( break; } - mSetSurfaceInProgress = true; - mPlayer->setVideoSurfaceTextureAsync(bufferProducer); - while (mSetSurfaceInProgress) { - mCondition.wait(mLock); - } - return OK; } @@ -483,15 +472,6 @@ 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 9424aae127..a9ff8b65da 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.h @@ -66,7 +66,6 @@ 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(); @@ -99,7 +98,6 @@ private: // The following are protected through "mLock" // >>> - bool mSetSurfaceInProgress; int64_t mDurationUs; int64_t mPositionUs; int64_t mNumFramesTotal; diff --git a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp index a911f6c8e8..ffacb8fa2c 100644 --- a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp +++ b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp @@ -70,6 +70,7 @@ NuPlayer::RTSPSource::RTSPSource( NuPlayer::RTSPSource::~RTSPSource() { if (mLooper != NULL) { + mLooper->unregisterHandler(id()); mLooper->stop(); } } @@ -80,14 +81,13 @@ void NuPlayer::RTSPSource::prepareAsync() { mLooper->setName("rtsp"); mLooper->start(); - mReflector = new AHandlerReflector(this); - mLooper->registerHandler(mReflector); + mLooper->registerHandler(this); } CHECK(mHandler == NULL); CHECK(mSDPLoader == NULL); - sp notify = new AMessage(kWhatNotify, mReflector->id()); + sp notify = new AMessage(kWhatNotify, id()); CHECK_EQ(mState, (int)DISCONNECTED); mState = CONNECTING; @@ -118,7 +118,7 @@ void NuPlayer::RTSPSource::stop() { if (mLooper == NULL) { return; } - sp msg = new AMessage(kWhatDisconnect, mReflector->id()); + sp msg = new AMessage(kWhatDisconnect, id()); sp dummy; msg->postAndAwaitResponse(&dummy); @@ -305,7 +305,7 @@ status_t NuPlayer::RTSPSource::getDuration(int64_t *durationUs) { } status_t NuPlayer::RTSPSource::seekTo(int64_t seekTimeUs) { - sp msg = new AMessage(kWhatPerformSeek, mReflector->id()); + sp msg = new AMessage(kWhatPerformSeek, id()); msg->setInt32("generation", ++mSeekGeneration); msg->setInt64("timeUs", seekTimeUs); msg->post(200000ll); @@ -613,7 +613,7 @@ void NuPlayer::RTSPSource::onSDPLoaded(const sp &msg) { ALOGE("Unable to find url in SDP"); err = UNKNOWN_ERROR; } else { - sp notify = new AMessage(kWhatNotify, mReflector->id()); + sp notify = new AMessage(kWhatNotify, id()); mHandler = new MyHandler(rtspUri.c_str(), notify, mUIDValid, mUID); mLooper->registerHandler(mHandler); diff --git a/media/libmediaplayerservice/nuplayer/RTSPSource.h b/media/libmediaplayerservice/nuplayer/RTSPSource.h index 3718bf9fab..f1cae536f2 100644 --- a/media/libmediaplayerservice/nuplayer/RTSPSource.h +++ b/media/libmediaplayerservice/nuplayer/RTSPSource.h @@ -22,8 +22,6 @@ #include "ATSParser.h" -#include - namespace android { struct ALooper; @@ -102,7 +100,6 @@ private: bool mBuffering; sp mLooper; - sp > mReflector; sp mHandler; sp mSDPLoader; -- 2.11.0