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
// provided it's big enough. Don't allocate the memory or
// perform the copy if there's no callback.
if (mPreviewBuffer == 0) {
mPreviewBuffer = new MemoryHeapBase(size, 0, NULL);
} else if (size > mPreviewBuffer->virtualSize()) {
mPreviewBuffer.clear();
mPreviewBuffer = new MemoryHeapBase(size, 0, NULL);
// hold the lock while we grab a reference to the preview buffer
sp<MemoryHeapBase> previewBuffer;
{
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) {
LOGE("failed to allocate space for preview buffer");
return;
}
previewBuffer = mPreviewBuffer;
}
memcpy(mPreviewBuffer->base(),
memcpy(previewBuffer->base(),
(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) {
LOGE("failed to allocate space for frame callback");
return;