summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/SurfaceMediaSource.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-09-28 10:23:51 -0700
committerAndreas Huber <andih@google.com>2012-09-28 10:23:51 -0700
commita7f7e0ac9436a8417bb9f31aecedfec1909d4630 (patch)
tree985431aed55374521a2a40fc0b12c782a91a5db9 /media/libstagefright/SurfaceMediaSource.cpp
parent8397243efdd4e70ba75a9cf50d882c24dad250a2 (diff)
downloadframeworks_av-a7f7e0ac9436a8417bb9f31aecedfec1909d4630.zip
frameworks_av-a7f7e0ac9436a8417bb9f31aecedfec1909d4630.tar.gz
frameworks_av-a7f7e0ac9436a8417bb9f31aecedfec1909d4630.tar.bz2
Various improvements to a cleaner shutdown of the wifi display connection.
Change-Id: Id029a89939e53c2bd1d20e572d3975ec2795c239 related-to-bug: 7247918
Diffstat (limited to 'media/libstagefright/SurfaceMediaSource.cpp')
-rw-r--r--media/libstagefright/SurfaceMediaSource.cpp32
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();
}