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

am: 57abaabdaf

Change-Id: I55d6931832e68549c2db3f7b4a992f605a2cb73d
gugelfrei
Yin-Chia Yeh 7 years ago committed by android-build-merger
commit 4fd7bbca1f

@ -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