From a438123bd96c7faf145683876702387efe5628d9 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Wed, 12 Sep 2012 16:25:14 -0700 Subject: [PATCH] Various improvements to cleanly shutdown a wfd session. Change-Id: I86f0a27d7e8eb96200153bab847a862f21a19d13 --- .../wifi-display/source/Converter.cpp | 4 ++ .../wifi-display/source/MediaPuller.cpp | 25 ++++++- .../wifi-display/source/MediaPuller.h | 1 + .../wifi-display/source/PlaybackSession.cpp | 76 ++++++++++++---------- .../wifi-display/source/PlaybackSession.h | 2 + .../wifi-display/source/WifiDisplaySource.cpp | 27 ++++---- 6 files changed, 86 insertions(+), 49 deletions(-) diff --git a/media/libstagefright/wifi-display/source/Converter.cpp b/media/libstagefright/wifi-display/source/Converter.cpp index 7c3b90846a..0e10b8d04d 100644 --- a/media/libstagefright/wifi-display/source/Converter.cpp +++ b/media/libstagefright/wifi-display/source/Converter.cpp @@ -49,6 +49,10 @@ Converter::~Converter() { mEncoder->release(); mEncoder.clear(); } + + AString mime; + CHECK(mInputFormat->findString("mime", &mime)); + ALOGI("encoder (%s) shut down.", mime.c_str()); } status_t Converter::initCheck() const { diff --git a/media/libstagefright/wifi-display/source/MediaPuller.cpp b/media/libstagefright/wifi-display/source/MediaPuller.cpp index 786029a589..35ae5392ee 100644 --- a/media/libstagefright/wifi-display/source/MediaPuller.cpp +++ b/media/libstagefright/wifi-display/source/MediaPuller.cpp @@ -33,7 +33,13 @@ MediaPuller::MediaPuller( const sp &source, const sp ¬ify) : mSource(source), mNotify(notify), - mPullGeneration(0) { + mPullGeneration(0), + mIsAudio(false) { + sp meta = source->getFormat(); + const char *mime; + CHECK(meta->findCString(kKeyMIMEType, &mime)); + + mIsAudio = !strncasecmp(mime, "audio/", 6); } MediaPuller::~MediaPuller() { @@ -77,7 +83,14 @@ void MediaPuller::onMessageReceived(const sp &msg) { schedulePull(); } } else { + sp meta = mSource->getFormat(); + const char *tmp; + CHECK(meta->findCString(kKeyMIMEType, &tmp)); + AString mime = tmp; + + ALOGI("MediaPuller(%s) stopping.", mime.c_str()); err = mSource->stop(); + ALOGI("MediaPuller(%s) stopped.", mime.c_str()); ++mPullGeneration; } @@ -124,7 +137,15 @@ void MediaPuller::onMessageReceived(const sp &msg) { mbuf->range_length()); accessUnit->meta()->setInt64("timeUs", timeUs); - accessUnit->meta()->setPointer("mediaBuffer", mbuf); + + if (mIsAudio) { + mbuf->release(); + mbuf = NULL; + } else { + // video encoder will release MediaBuffer when done + // with underlying data. + accessUnit->meta()->setPointer("mediaBuffer", mbuf); + } sp notify = mNotify->dup(); diff --git a/media/libstagefright/wifi-display/source/MediaPuller.h b/media/libstagefright/wifi-display/source/MediaPuller.h index 5297501819..134e1c0821 100644 --- a/media/libstagefright/wifi-display/source/MediaPuller.h +++ b/media/libstagefright/wifi-display/source/MediaPuller.h @@ -49,6 +49,7 @@ private: sp mSource; sp mNotify; int32_t mPullGeneration; + bool mIsAudio; status_t postSynchronouslyAndReturnError(const sp &msg); void schedulePull(); diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp index a6bb8c6fef..41beba4278 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp +++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp @@ -159,6 +159,8 @@ status_t WifiDisplaySource::PlaybackSession::Track::stop() { err = mMediaPuller->stop(); } + mConverter.clear(); + mStarted = false; return err; @@ -288,41 +290,6 @@ WifiDisplaySource::PlaybackSession::~PlaybackSession() { mLogFile = NULL; } #endif - - mTracks.clear(); - - mPacketizer.clear(); - - if (mSerializer != NULL) { - mSerializer->stop(); - - looper()->unregisterHandler(mSerializer->id()); - mSerializer.clear(); - } - - mTracks.clear(); - - if (mSerializerLooper != NULL) { - mSerializerLooper->stop(); - mSerializerLooper.clear(); - } - - if (mLegacyMode) { - sp sm = defaultServiceManager(); - sp binder = sm->getService(String16("SurfaceFlinger")); - sp service = interface_cast(binder); - CHECK(service != NULL); - - service->connectDisplay(NULL); - } - - if (mRTCPSessionID != 0) { - mNetSession->destroySession(mRTCPSessionID); - } - - if (mRTPSessionID != 0) { - mNetSession->destroySession(mRTPSessionID); - } } int32_t WifiDisplaySource::PlaybackSession::getRTPPort() const { @@ -369,6 +336,45 @@ status_t WifiDisplaySource::PlaybackSession::pause() { return OK; } +status_t WifiDisplaySource::PlaybackSession::destroy() { + mTracks.clear(); + + mPacketizer.clear(); + + if (mSerializer != NULL) { + mSerializer->stop(); + + looper()->unregisterHandler(mSerializer->id()); + mSerializer.clear(); + } + + mTracks.clear(); + + if (mSerializerLooper != NULL) { + mSerializerLooper->stop(); + mSerializerLooper.clear(); + } + + if (mLegacyMode) { + sp sm = defaultServiceManager(); + sp binder = sm->getService(String16("SurfaceFlinger")); + sp service = interface_cast(binder); + CHECK(service != NULL); + + service->connectDisplay(NULL); + } + + if (mRTCPSessionID != 0) { + mNetSession->destroySession(mRTCPSessionID); + } + + if (mRTPSessionID != 0) { + mNetSession->destroySession(mRTPSessionID); + } + + return OK; +} + void WifiDisplaySource::PlaybackSession::onMessageReceived( const sp &msg) { switch (msg->what()) { diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.h b/media/libstagefright/wifi-display/source/PlaybackSession.h index 528a039fc8..cd0308e018 100644 --- a/media/libstagefright/wifi-display/source/PlaybackSession.h +++ b/media/libstagefright/wifi-display/source/PlaybackSession.h @@ -44,6 +44,8 @@ struct WifiDisplaySource::PlaybackSession : public AHandler { const char *clientIP, int32_t clientRtp, int32_t clientRtcp, bool useInterleavedTCP); + status_t destroy(); + int32_t getRTPPort() const; int64_t getLastLifesignUs() const; diff --git a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp index 8e8f04a106..aeefcf3e3c 100644 --- a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp +++ b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp @@ -200,11 +200,14 @@ void WifiDisplaySource::onMessageReceived(const sp &msg) { CHECK(msg->senderAwaitsResponse(&replyID)); for (size_t i = mPlaybackSessions.size(); i-- > 0;) { - const sp &playbackSession = + sp playbackSession = mPlaybackSessions.valueAt(i); - looper()->unregisterHandler(playbackSession->id()); mPlaybackSessions.removeItemsAt(i); + + playbackSession->destroy(); + looper()->unregisterHandler(playbackSession->id()); + playbackSession.clear(); } if (mClient != NULL) { @@ -454,9 +457,7 @@ status_t WifiDisplaySource::sendM16(int32_t sessionID) { const ClientInfo &info = mClientInfos.valueFor(sessionID); request.append(StringPrintf("Session: %d\r\n", info.mPlaybackSessionID)); - - request.append("Content-Length: 0\r\n"); - request.append("\r\n"); + request.append("\r\n"); // Empty body status_t err = mNetSession->sendRequest(sessionID, request.c_str(), request.size()); @@ -761,7 +762,7 @@ void WifiDisplaySource::onSetupRequest( return; } #if 1 - // The LG dongle doesn't specify client_port=xxx apparently. + // The older LG dongles doesn't specify client_port=xxx apparently. } else if (transport == "RTP/AVP/UDP;unicast") { clientRtp = 19000; clientRtcp = clientRtp + 1; @@ -966,19 +967,21 @@ void WifiDisplaySource::onSetParameterRequest( int32_t cseq, const sp &data) { int32_t playbackSessionID; -#if 0 - // XXX the dongle does not include a "Session:" header in this request. sp playbackSession = findPlaybackSession(data, &playbackSessionID); +#if 1 + // XXX the older dongles do not include a "Session:" header in this request. + if (playbackSession == NULL) { + CHECK_EQ(mPlaybackSessions.size(), 1u); + playbackSessionID = mPlaybackSessions.keyAt(0); + playbackSession = mPlaybackSessions.valueAt(0); + } +#else if (playbackSession == NULL) { sendErrorResponse(sessionID, "454 Session Not Found", cseq); return; } -#else - CHECK_EQ(mPlaybackSessions.size(), 1u); - playbackSessionID = mPlaybackSessions.keyAt(0); - sp playbackSession = mPlaybackSessions.valueAt(0); #endif playbackSession->updateLiveness(); -- 2.11.0