diff options
author | James Dong <jdong@google.com> | 2010-06-09 15:57:48 -0700 |
---|---|---|
committer | James Dong <jdong@google.com> | 2010-06-09 21:30:43 -0700 |
commit | 9d7f58a7da8502a4174a17ac49fcba6efa35a457 (patch) | |
tree | ed1ad79bb159ed04f2f88d063dbaf28df3bc3201 /media/libstagefright/CameraSource.cpp | |
parent | 36ef8cf54e2bf2f96b8c7f47cd534c00ccb7b64f (diff) | |
download | frameworks_av-9d7f58a7da8502a4174a17ac49fcba6efa35a457.zip frameworks_av-9d7f58a7da8502a4174a17ac49fcba6efa35a457.tar.gz frameworks_av-9d7f58a7da8502a4174a17ac49fcba6efa35a457.tar.bz2 |
Remove the lock/unlock workaround from CameraService
bug - 2677772
Change-Id: I7c996daad8b3bfc89e9fa2d655dc18c9a5c68f2f
Diffstat (limited to 'media/libstagefright/CameraSource.cpp')
-rw-r--r-- | media/libstagefright/CameraSource.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp index 67759c0..0ab76b3 100644 --- a/media/libstagefright/CameraSource.cpp +++ b/media/libstagefright/CameraSource.cpp @@ -19,7 +19,7 @@ #include <utils/Log.h> #include <OMX_Component.h> - +#include <binder/IPCThreadState.h> #include <media/stagefright/CameraSource.h> #include <media/stagefright/MediaDebug.h> #include <media/stagefright/MediaDefs.h> @@ -125,7 +125,11 @@ CameraSource::CameraSource(const sp<Camera> &camera) mNumFramesDropped(0), mCollectStats(false), mStarted(false) { + + int64_t token = IPCThreadState::self()->clearCallingIdentity(); String8 s = mCamera->getParameters(); + IPCThreadState::self()->restoreCallingIdentity(token); + printf("params: \"%s\"\n", s.string()); int32_t width, height, stride, sliceHeight; @@ -166,8 +170,11 @@ status_t CameraSource::start(MetaData *) { && (!strcmp(value, "1") || !strcasecmp(value, "true"))) { mCollectStats = true; } + + int64_t token = IPCThreadState::self()->clearCallingIdentity(); mCamera->setListener(new CameraSourceListener(this)); CHECK_EQ(OK, mCamera->startRecording()); + IPCThreadState::self()->restoreCallingIdentity(token); mStarted = true; return OK; @@ -179,16 +186,17 @@ status_t CameraSource::stop() { mStarted = false; mFrameAvailableCondition.signal(); + int64_t token = IPCThreadState::self()->clearCallingIdentity(); mCamera->setListener(NULL); mCamera->stopRecording(); - releaseQueuedFrames(); - while (!mFramesBeingEncoded.empty()) { LOGI("Waiting for outstanding frames being encoded: %d", mFramesBeingEncoded.size()); mFrameCompleteCondition.wait(mLock); } + mCamera = NULL; + IPCThreadState::self()->restoreCallingIdentity(token); if (mCollectStats) { LOGI("Frames received/encoded/dropped: %d/%d/%d in %lld us", @@ -219,7 +227,11 @@ void CameraSource::signalBufferReturned(MediaBuffer *buffer) { for (List<sp<IMemory> >::iterator it = mFramesBeingEncoded.begin(); it != mFramesBeingEncoded.end(); ++it) { if ((*it)->pointer() == buffer->data()) { + + int64_t token = IPCThreadState::self()->clearCallingIdentity(); mCamera->releaseRecordingFrame((*it)); + IPCThreadState::self()->restoreCallingIdentity(token); + mFramesBeingEncoded.erase(it); ++mNumFramesEncoded; buffer->setObserver(0); @@ -273,7 +285,9 @@ void CameraSource::dataCallbackTimestamp(int64_t timestampUs, LOGV("dataCallbackTimestamp: timestamp %lld us", timestampUs); Mutex::Autolock autoLock(mLock); if (!mStarted) { + int64_t token = IPCThreadState::self()->clearCallingIdentity(); mCamera->releaseRecordingFrame(data); + IPCThreadState::self()->restoreCallingIdentity(token); ++mNumFramesReceived; ++mNumFramesDropped; return; |