Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06d588e8 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Camera: fix use after disconnect error"

parents 3d0a566b f44c24ad
Loading
Loading
Loading
Loading
+19 −12
Original line number Diff line number Diff line
@@ -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;
    }

    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;
    if (!disconnected) {
        frames.reserve(n);
    }
    bool error = false;
    for (auto& handle : handles) {
        sp<IMemory> dataPtr;
@@ -566,18 +571,20 @@ void CameraClient::releaseRecordingFrameHandleBatch(const std::vector<native_han
            break;
        }

        if (!disconnected) {
            VideoNativeHandleMetadata *metadata = (VideoNativeHandleMetadata*)(dataPtr->pointer());
            metadata->eType = kMetadataBufferTypeNativeHandleSource;
            metadata->pHandle = handle;
            frames.push_back(dataPtr);
        }
    }

    if (error) {
        for (auto& handle : handles) {
            native_handle_close(handle);
            native_handle_delete(handle);
        }
    } else {
    } else if (!disconnected) {
        mHardware->releaseRecordingFrameBatch(frames);
    }
    return;