diff options
Diffstat (limited to 'media/libstagefright/SurfaceMediaSource.cpp')
-rw-r--r-- | media/libstagefright/SurfaceMediaSource.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
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(); } |