diff options
| author | 2010-07-22 13:57:39 -0700 | |
|---|---|---|
| committer | 2010-07-22 13:57:39 -0700 | |
| commit | 8dac3bf922de433bc7d08c9968dfc5087de34b86 (patch) | |
| tree | 8be3551b5d81b03ec0500f695a612d51f24997ed | |
| parent | 95675137f417173dc711a2d39232a1f545799013 (diff) | |
| parent | b72d3180dc8d41d6269664bea808b04410bbe40f (diff) | |
am b72d3180: am 81046c8c: Merge "Various changes to improve rtsp networking, reduce packet loss and adapt to ALooper API changes." into gingerbread
Merge commit 'b72d3180dc8d41d6269664bea808b04410bbe40f'
* commit 'b72d3180dc8d41d6269664bea808b04410bbe40f':
Various changes to improve rtsp networking, reduce packet loss and adapt to ALooper API changes.
| -rw-r--r-- | cmds/stagefright/stagefright.cpp | 41 | ||||
| -rw-r--r-- | include/media/stagefright/foundation/ALooper.h | 4 | ||||
| -rw-r--r-- | media/libstagefright/foundation/ALooper.cpp | 5 | ||||
| -rw-r--r-- | media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp | 5 | ||||
| -rw-r--r-- | media/libstagefright/rtsp/ARTSPController.cpp | 3 | ||||
| -rw-r--r-- | media/libstagefright/rtsp/MyHandler.h | 31 |
6 files changed, 77 insertions, 12 deletions
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp index f74240f3eaf2..4a1d27b73919 100644 --- a/cmds/stagefright/stagefright.cpp +++ b/cmds/stagefright/stagefright.cpp @@ -25,6 +25,8 @@ #include <binder/IServiceManager.h> #include <binder/ProcessState.h> #include <media/IMediaPlayerService.h> +#include <media/stagefright/foundation/ALooper.h> +#include "include/ARTSPController.h" #include <media/stagefright/AudioPlayer.h> #include <media/stagefright/DataSource.h> #include <media/stagefright/JPEGSource.h> @@ -365,6 +367,9 @@ int main(int argc, char **argv) { gPlaybackAudio = false; gWriteMP4 = false; + sp<ALooper> looper; + sp<ARTSPController> rtspController; + int res; while ((res = getopt(argc, argv, "han:lm:b:ptsow:k")) >= 0) { switch (res) { @@ -576,7 +581,8 @@ int main(int argc, char **argv) { sp<DataSource> dataSource = DataSource::CreateFromURI(filename); - if (strncasecmp(filename, "sine:", 5) && dataSource == NULL) { + if ((strncasecmp(filename, "sine:", 5) + && strncasecmp(filename, "rtsp://", 7)) && dataSource == NULL) { fprintf(stderr, "Unable to create data source.\n"); return 1; } @@ -601,10 +607,28 @@ int main(int argc, char **argv) { } mediaSource = new SineSource(sampleRate, 1); } else { - sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); - if (extractor == NULL) { - fprintf(stderr, "could not create extractor.\n"); - return -1; + sp<MediaExtractor> extractor; + + if (!strncasecmp("rtsp://", filename, 7)) { + if (looper == NULL) { + looper = new ALooper; + looper->start(); + } + + rtspController = new ARTSPController(looper); + status_t err = rtspController->connect(filename); + if (err != OK) { + fprintf(stderr, "could not connect to rtsp server.\n"); + return -1; + } + + extractor = rtspController.get(); + } else { + extractor = MediaExtractor::Create(dataSource); + if (extractor == NULL) { + fprintf(stderr, "could not create extractor.\n"); + return -1; + } } size_t numTracks = extractor->countTracks(); @@ -654,6 +678,13 @@ int main(int argc, char **argv) { } else { playSource(&client, mediaSource); } + + if (rtspController != NULL) { + rtspController->disconnect(); + rtspController.clear(); + + sleep(3); + } } client.disconnect(); diff --git a/include/media/stagefright/foundation/ALooper.h b/include/media/stagefright/foundation/ALooper.h index 194f1fc92529..153ead9a4bd7 100644 --- a/include/media/stagefright/foundation/ALooper.h +++ b/include/media/stagefright/foundation/ALooper.h @@ -41,7 +41,9 @@ struct ALooper : public RefBase { status_t start( bool runOnCallingThread = false, - bool canCallJava = false); + bool canCallJava = false, + int32_t priority = PRIORITY_DEFAULT + ); status_t stop(); diff --git a/media/libstagefright/foundation/ALooper.cpp b/media/libstagefright/foundation/ALooper.cpp index cd4f34992f0d..77afb010e630 100644 --- a/media/libstagefright/foundation/ALooper.cpp +++ b/media/libstagefright/foundation/ALooper.cpp @@ -73,7 +73,8 @@ void ALooper::unregisterHandler(handler_id handlerID) { gLooperRoster.unregisterHandler(handlerID); } -status_t ALooper::start(bool runOnCallingThread, bool canCallJava) { +status_t ALooper::start( + bool runOnCallingThread, bool canCallJava, int32_t priority) { if (runOnCallingThread) { { Mutex::Autolock autoLock(mLock); @@ -99,7 +100,7 @@ status_t ALooper::start(bool runOnCallingThread, bool canCallJava) { mThread = new LooperThread(this, canCallJava); - status_t err = mThread->run("ALooper"); + status_t err = mThread->run("ALooper", priority); if (err != OK) { mThread.clear(); } diff --git a/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp b/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp index 0549d8412d45..7e5510639805 100644 --- a/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp +++ b/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp @@ -144,6 +144,11 @@ void AMPEG4AudioAssembler::submitAccessUnit() { accessUnit->meta()->setInt64("ntp-time", ntpTime); +#if 0 + printf(mAccessUnitDamaged ? "X" : "."); + fflush(stdout); +#endif + if (mAccessUnitDamaged) { accessUnit->meta()->setInt32("damaged", true); } diff --git a/media/libstagefright/rtsp/ARTSPController.cpp b/media/libstagefright/rtsp/ARTSPController.cpp index 7b87d4299d31..195323ed025e 100644 --- a/media/libstagefright/rtsp/ARTSPController.cpp +++ b/media/libstagefright/rtsp/ARTSPController.cpp @@ -38,6 +38,8 @@ status_t ARTSPController::connect(const char *url) { } mHandler = new MyHandler(url, mLooper); + mHandler->connect(); + sleep(10); return OK; @@ -48,6 +50,7 @@ void ARTSPController::disconnect() { return; } + mHandler->disconnect(); mHandler.clear(); } diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h index 719ebf314043..15901cdf728f 100644 --- a/media/libstagefright/rtsp/MyHandler.h +++ b/media/libstagefright/rtsp/MyHandler.h @@ -34,19 +34,33 @@ namespace android { struct MyHandler : public AHandler { MyHandler(const char *url, const sp<ALooper> &looper) : mLooper(looper), + mNetLooper(new ALooper), mConn(new ARTSPConnection), mRTPConn(new ARTPConnection), mSessionURL(url), mSetupTracksSuccessful(false), mFirstAccessUnit(true), mFirstAccessUnitNTP(-1) { + + mNetLooper->start(false /* runOnCallingThread */, + false /* canCallJava */, + PRIORITY_HIGHEST); + } + + void connect() { mLooper->registerHandler(this); mLooper->registerHandler(mConn); - mLooper->registerHandler(mRTPConn); + (1 ? mNetLooper : mLooper)->registerHandler(mRTPConn); 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); + } + virtual void onMessageReceived(const sp<AMessage> &msg) { switch (msg->what()) { case 'conn': @@ -290,7 +304,6 @@ struct MyHandler : public AHandler { case 'quit': { - mLooper->stop(); break; } @@ -320,8 +333,17 @@ struct MyHandler : public AHandler { accessUnit->meta()->setInt64("ntp-time", ntpTime); - TrackInfo *track = &mTracks.editItemAt(trackIndex); - track->mPacketSource->queueAccessUnit(accessUnit); +#if 0 + int32_t damaged; + if (accessUnit->meta()->findInt32("damaged", &damaged) + && damaged != 0) { + LOG(INFO) << "ignoring damaged AU"; + } else +#endif + { + TrackInfo *track = &mTracks.editItemAt(trackIndex); + track->mPacketSource->queueAccessUnit(accessUnit); + } break; } @@ -344,6 +366,7 @@ struct MyHandler : public AHandler { private: sp<ALooper> mLooper; + sp<ALooper> mNetLooper; sp<ARTSPConnection> mConn; sp<ARTPConnection> mRTPConn; sp<ASessionDescription> mSessionDesc; |