From a7f7e0ac9436a8417bb9f31aecedfec1909d4630 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Fri, 28 Sep 2012 10:23:51 -0700 Subject: Various improvements to a cleaner shutdown of the wifi display connection. Change-Id: Id029a89939e53c2bd1d20e572d3975ec2795c239 related-to-bug: 7247918 --- media/libstagefright/SurfaceMediaSource.cpp | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'media/libstagefright/SurfaceMediaSource.cpp') diff --git a/media/libstagefright/SurfaceMediaSource.cpp b/media/libstagefright/SurfaceMediaSource.cpp index 3d3f421..9d39d0e 100644 --- a/media/libstagefright/SurfaceMediaSource.cpp +++ b/media/libstagefright/SurfaceMediaSource.cpp @@ -191,6 +191,23 @@ status_t SurfaceMediaSource::stop() ALOGV("stop"); Mutex::Autolock lock(mMutex); + if (mStopped) { + return OK; + } + + while (mNumPendingBuffers > 0) { + ALOGI("Still waiting for %d buffers to be returned.", + mNumPendingBuffers); + +#if DEBUG_PENDING_BUFFERS + for (size_t i = 0; i < mPendingBuffers.size(); ++i) { + ALOGI("%d: %p", i, mPendingBuffers.itemAt(i)); + } +#endif + + mMediaBuffersAvailableCondition.wait(mMutex); + } + mStopped = true; mFrameAvailableCondition.signal(); mMediaBuffersAvailableCondition.signal(); @@ -335,6 +352,12 @@ status_t SurfaceMediaSource::read( MediaBuffer **buffer, ++mNumPendingBuffers; +#if DEBUG_PENDING_BUFFERS + mPendingBuffers.push_back(*buffer); +#endif + + ALOGV("returning mbuf %p", *buffer); + return OK; } @@ -391,6 +414,15 @@ void SurfaceMediaSource::signalBufferReturned(MediaBuffer *buffer) { CHECK(!"signalBufferReturned: bogus buffer"); } +#if DEBUG_PENDING_BUFFERS + for (size_t i = 0; i < mPendingBuffers.size(); ++i) { + if (mPendingBuffers.itemAt(i) == buffer) { + mPendingBuffers.removeAt(i); + break; + } + } +#endif + --mNumPendingBuffers; mMediaBuffersAvailableCondition.broadcast(); } -- cgit v1.1