OSDN Git Service

use dedicated looper for GenericSource
authorChong Zhang <chz@google.com>
Wed, 13 Aug 2014 04:25:48 +0000 (21:25 -0700)
committerChong Zhang <chz@google.com>
Thu, 14 Aug 2014 19:18:48 +0000 (12:18 -0700)
- 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

media/libmediaplayerservice/nuplayer/GenericSource.cpp
media/libmediaplayerservice/nuplayer/GenericSource.h
media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
media/libmediaplayerservice/nuplayer/NuPlayer.cpp
media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
media/libmediaplayerservice/nuplayer/NuPlayerDriver.h
media/libmediaplayerservice/nuplayer/RTSPSource.cpp
media/libmediaplayerservice/nuplayer/RTSPSource.h

index 6676461..76e1d54 100644 (file)
@@ -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<AMessage> msg = new AMessage(kWhatPrepareAsync, id());
+    msg->post();
+}
+
+void NuPlayer::GenericSource::onPrepareAsync() {
     // delayed data source creation
     AString sniffedMIME;
     sp<DataSource> dataSource;
@@ -267,6 +284,11 @@ status_t NuPlayer::GenericSource::feedMoreTSData() {
 
 void NuPlayer::GenericSource::onMessageReceived(const sp<AMessage> &msg) {
     switch (msg->what()) {
+      case kWhatPrepareAsync:
+      {
+          onPrepareAsync();
+          break;
+      }
       case kWhatFetchSubtitleData:
       {
           fetchTextData(kWhatSendSubtitleData, MEDIA_TRACK_TYPE_SUBTITLE,
index 44d690e..d3081de 100644 (file)
@@ -70,6 +70,7 @@ protected:
 
 private:
     enum {
+        kWhatPrepareAsync,
         kWhatFetchSubtitleData,
         kWhatFetchTimedTextData,
         kWhatSendSubtitleData,
@@ -104,12 +105,17 @@ private:
     int64_t mOffset;
     int64_t mLength;
 
+    sp<ALooper> mLooper;
+
+
     void resetDataSource();
 
     status_t initFromDataSource(
             const sp<DataSource> &dataSource,
             const char *mime);
 
+    void onPrepareAsync();
+
     void fetchTextData(
             uint32_t what, media_track_type type,
             int32_t curGen, sp<AnotherPacketSource> packets, sp<AMessage> msg);
index c713d39..a003c81 100644 (file)
@@ -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<AMessage> notify = new AMessage(kWhatSessionNotify, id());
 
index 9a4e811..fea43f1 100644 (file)
@@ -372,7 +372,6 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
             CHECK(msg->findObject("source", &obj));
             if (obj != NULL) {
                 mSource = static_cast<Source *>(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<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) {
index e33e647..bf7542f 100644 (file)
@@ -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<IGraphicBufferProducer> &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;
index 9424aae..a9ff8b6 100644 (file)
@@ -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;
index a911f6c..ffacb8f 100644 (file)
@@ -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<RTSPSource>(this);
-        mLooper->registerHandler(mReflector);
+        mLooper->registerHandler(this);
     }
 
     CHECK(mHandler == NULL);
     CHECK(mSDPLoader == NULL);
 
-    sp<AMessage> notify = new AMessage(kWhatNotify, mReflector->id());
+    sp<AMessage> 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<AMessage> msg = new AMessage(kWhatDisconnect, mReflector->id());
+    sp<AMessage> msg = new AMessage(kWhatDisconnect, id());
 
     sp<AMessage> 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<AMessage> msg = new AMessage(kWhatPerformSeek, mReflector->id());
+    sp<AMessage> 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<AMessage> &msg) {
             ALOGE("Unable to find url in SDP");
             err = UNKNOWN_ERROR;
         } else {
-            sp<AMessage> notify = new AMessage(kWhatNotify, mReflector->id());
+            sp<AMessage> notify = new AMessage(kWhatNotify, id());
 
             mHandler = new MyHandler(rtspUri.c_str(), notify, mUIDValid, mUID);
             mLooper->registerHandler(mHandler);
index 3718bf9..f1cae53 100644 (file)
@@ -22,8 +22,6 @@
 
 #include "ATSParser.h"
 
-#include <media/stagefright/foundation/AHandlerReflector.h>
-
 namespace android {
 
 struct ALooper;
@@ -102,7 +100,6 @@ private:
     bool mBuffering;
 
     sp<ALooper> mLooper;
-    sp<AHandlerReflector<RTSPSource> > mReflector;
     sp<MyHandler> mHandler;
     sp<SDPLoader> mSDPLoader;