diff options
author | Andreas Huber <andih@google.com> | 2010-08-24 11:20:57 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-08-24 11:20:57 -0700 |
commit | d9734dc5f25730944ec4e62bb028092e1841e4a3 (patch) | |
tree | 7f04418ef7d469232cd02cfb7381d72253fc3ef3 /media/libstagefright/rtsp | |
parent | a8c88e810ea1b8e90fd6c250d4c0a87eb628d4d8 (diff) | |
parent | 441fe026c7cfda8bb7e3ec91b251fc55df3d6493 (diff) | |
download | frameworks_av-d9734dc5f25730944ec4e62bb028092e1841e4a3.zip frameworks_av-d9734dc5f25730944ec4e62bb028092e1841e4a3.tar.gz frameworks_av-d9734dc5f25730944ec4e62bb028092e1841e4a3.tar.bz2 |
am 31e71131: am 3e22ef1e: Merge "Better handling of rtsp connection and disconnection." into gingerbread
Merge commit '31e71131049c943a388134e796087e109248efcc'
* commit '31e71131049c943a388134e796087e109248efcc':
Better handling of rtsp connection and disconnection.
Diffstat (limited to 'media/libstagefright/rtsp')
-rw-r--r-- | media/libstagefright/rtsp/ARTSPController.cpp | 67 | ||||
-rw-r--r-- | media/libstagefright/rtsp/MyHandler.h | 25 |
2 files changed, 78 insertions, 14 deletions
diff --git a/media/libstagefright/rtsp/ARTSPController.cpp b/media/libstagefright/rtsp/ARTSPController.cpp index 195323e..ceae3a6 100644 --- a/media/libstagefright/rtsp/ARTSPController.cpp +++ b/media/libstagefright/rtsp/ARTSPController.cpp @@ -26,31 +26,57 @@ namespace android { ARTSPController::ARTSPController(const sp<ALooper> &looper) - : mLooper(looper) { + : mState(DISCONNECTED), + mLooper(looper) { + mReflector = new AHandlerReflector<ARTSPController>(this); + looper->registerHandler(mReflector); } ARTSPController::~ARTSPController() { + disconnect(); + mLooper->unregisterHandler(mReflector->id()); } status_t ARTSPController::connect(const char *url) { - if (mHandler != NULL) { + Mutex::Autolock autoLock(mLock); + + if (mState != DISCONNECTED) { return ERROR_ALREADY_CONNECTED; } + sp<AMessage> msg = new AMessage(kWhatConnectDone, mReflector->id()); + mHandler = new MyHandler(url, mLooper); - mHandler->connect(); - sleep(10); + mState = CONNECTING; + + mHandler->connect(msg); + + while (mState == CONNECTING) { + mCondition.wait(mLock); + } + + if (mState != CONNECTED) { + mHandler.clear(); + } - return OK; + return mConnectionResult; } void ARTSPController::disconnect() { - if (mHandler == NULL) { + Mutex::Autolock autoLock(mLock); + + if (mState != CONNECTED) { return; } - mHandler->disconnect(); + sp<AMessage> msg = new AMessage(kWhatDisconnectDone, mReflector->id()); + mHandler->disconnect(msg); + + while (mState == CONNECTED) { + mCondition.wait(mLock); + } + mHandler.clear(); } @@ -75,4 +101,31 @@ sp<MetaData> ARTSPController::getTrackMetaData( return mHandler->getPacketSource(index)->getFormat(); } +void ARTSPController::onMessageReceived(const sp<AMessage> &msg) { + switch (msg->what()) { + case kWhatConnectDone: + { + Mutex::Autolock autoLock(mLock); + + CHECK(msg->findInt32("result", &mConnectionResult)); + mState = (mConnectionResult == OK) ? CONNECTED : DISCONNECTED; + + mCondition.signal(); + break; + } + + case kWhatDisconnectDone: + { + Mutex::Autolock autoLock(mLock); + mState = DISCONNECTED; + mCondition.signal(); + break; + } + + default: + TRESPASS(); + break; + } +} + } // namespace android diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h index 3e75ffe..b2419bf 100644 --- a/media/libstagefright/rtsp/MyHandler.h +++ b/media/libstagefright/rtsp/MyHandler.h @@ -45,18 +45,21 @@ struct MyHandler : public AHandler { PRIORITY_HIGHEST); } - void connect() { + void connect(const sp<AMessage> &doneMsg) { + mDoneMsg = doneMsg; + mLooper->registerHandler(this); mLooper->registerHandler(mConn); (1 ? mNetLooper : mLooper)->registerHandler(mRTPConn); - sp<AMessage> reply = new AMessage('conn', id()); + sp<AMessage> reply = new AMessage('conn', id()); mConn->connect(mSessionURL.c_str(), reply); } - void disconnect() { - sp<AMessage> reply = new AMessage('disc', id()); - mConn->disconnect(reply); + void disconnect(const sp<AMessage> &doneMsg) { + mDoneMsg = doneMsg; + + (new AMessage('abor', id()))->post(); } virtual void onMessageReceived(const sp<AMessage> &msg) { @@ -250,8 +253,9 @@ struct MyHandler : public AHandler { CHECK_EQ(response->mStatusCode, 200u); - sp<AMessage> msg = new AMessage('abor', id()); - msg->post(60000000ll); + mDoneMsg->setInt32("result", OK); + mDoneMsg->post(); + mDoneMsg = NULL; } else { sp<AMessage> reply = new AMessage('disc', id()); mConn->disconnect(reply); @@ -301,6 +305,11 @@ struct MyHandler : public AHandler { case 'quit': { + if (mDoneMsg != NULL) { + mDoneMsg->setInt32("result", UNKNOWN_ERROR); + mDoneMsg->post(); + mDoneMsg = NULL; + } break; } @@ -380,6 +389,8 @@ private: }; Vector<TrackInfo> mTracks; + sp<AMessage> mDoneMsg; + void setupTrack(size_t index) { sp<APacketSource> source = new APacketSource(mSessionDesc, index); |