Merge "Camera: fix use after disconnect error" am: 06d588e89b

am: 677755f2e4

Change-Id: I9bbaf6f73a28dfa4dceef329f08e0aa424bce6f5
gugelfrei
Yin-Chia Yeh 7 years ago committed by android-build-merger
commit 57abaabdaf

@ -508,7 +508,7 @@ void CameraClient::releaseRecordingFrame(const sp<IMemory>& mem) {
void CameraClient::releaseRecordingFrameHandle(native_handle_t *handle) {
if (handle == nullptr) return;
Mutex::Autolock lock(mLock);
sp<IMemory> dataPtr;
{
Mutex::Autolock l(mAvailableCallbackBuffersLock);
@ -532,17 +532,22 @@ void CameraClient::releaseRecordingFrameHandle(native_handle_t *handle) {
return;
}
VideoNativeHandleMetadata *metadata = (VideoNativeHandleMetadata*)(dataPtr->pointer());
metadata->eType = kMetadataBufferTypeNativeHandleSource;
metadata->pHandle = handle;
mHardware->releaseRecordingFrame(dataPtr);
if (mHardware != nullptr) {
VideoNativeHandleMetadata *metadata = (VideoNativeHandleMetadata*)(dataPtr->pointer());
metadata->eType = kMetadataBufferTypeNativeHandleSource;
metadata->pHandle = handle;
mHardware->releaseRecordingFrame(dataPtr);
}
}
void CameraClient::releaseRecordingFrameHandleBatch(const std::vector<native_handle_t*>& handles) {
Mutex::Autolock lock(mLock);
bool disconnected = (mHardware == nullptr);
size_t n = handles.size();
std::vector<sp<IMemory>> frames;
frames.reserve(n);
if (!disconnected) {
frames.reserve(n);
}
bool error = false;
for (auto& handle : handles) {
sp<IMemory> dataPtr;
@ -566,10 +571,12 @@ void CameraClient::releaseRecordingFrameHandleBatch(const std::vector<native_han
break;
}
VideoNativeHandleMetadata *metadata = (VideoNativeHandleMetadata*)(dataPtr->pointer());
metadata->eType = kMetadataBufferTypeNativeHandleSource;
metadata->pHandle = handle;
frames.push_back(dataPtr);
if (!disconnected) {
VideoNativeHandleMetadata *metadata = (VideoNativeHandleMetadata*)(dataPtr->pointer());
metadata->eType = kMetadataBufferTypeNativeHandleSource;
metadata->pHandle = handle;
frames.push_back(dataPtr);
}
}
if (error) {
@ -577,7 +584,7 @@ void CameraClient::releaseRecordingFrameHandleBatch(const std::vector<native_han
native_handle_close(handle);
native_handle_delete(handle);
}
} else {
} else if (!disconnected) {
mHardware->releaseRecordingFrameBatch(frames);
}
return;

Loading…
Cancel
Save