am 7ab900ed: Merge change Ic8093c11 into eclair

Merge commit '7ab900edd69324e5eeb2c6b01ef3ef5e836689a3' into eclair-mr2

* commit '7ab900edd69324e5eeb2c6b01ef3ef5e836689a3':
  Hold a lock while we access the preview heap.
This commit is contained in:
Dave Sparks
2009-11-06 14:11:20 -08:00
committed by Android Git Automerger

View File

@@ -1215,20 +1215,27 @@ void CameraService::Client::copyFrameAndPostCopiedFrame(const sp<ICameraClient>&
// the callback. For efficiency, reuse the same MemoryHeapBase // the callback. For efficiency, reuse the same MemoryHeapBase
// provided it's big enough. Don't allocate the memory or // provided it's big enough. Don't allocate the memory or
// perform the copy if there's no callback. // perform the copy if there's no callback.
if (mPreviewBuffer == 0) {
mPreviewBuffer = new MemoryHeapBase(size, 0, NULL); // hold the lock while we grab a reference to the preview buffer
} else if (size > mPreviewBuffer->virtualSize()) { sp<MemoryHeapBase> previewBuffer;
mPreviewBuffer.clear(); {
mPreviewBuffer = new MemoryHeapBase(size, 0, NULL); Mutex::Autolock lock(mLock);
if (mPreviewBuffer == 0) {
mPreviewBuffer = new MemoryHeapBase(size, 0, NULL);
} else if (size > mPreviewBuffer->virtualSize()) {
mPreviewBuffer.clear();
mPreviewBuffer = new MemoryHeapBase(size, 0, NULL);
}
if (mPreviewBuffer == 0) { if (mPreviewBuffer == 0) {
LOGE("failed to allocate space for preview buffer"); LOGE("failed to allocate space for preview buffer");
return; return;
} }
previewBuffer = mPreviewBuffer;
} }
memcpy(mPreviewBuffer->base(), memcpy(previewBuffer->base(),
(uint8_t *)heap->base() + offset, size); (uint8_t *)heap->base() + offset, size);
sp<MemoryBase> frame = new MemoryBase(mPreviewBuffer, 0, size); sp<MemoryBase> frame = new MemoryBase(previewBuffer, 0, size);
if (frame == 0) { if (frame == 0) {
LOGE("failed to allocate space for frame callback"); LOGE("failed to allocate space for frame callback");
return; return;