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

Commit 57abaabd authored by Yin-Chia Yeh's avatar Yin-Chia Yeh Committed by android-build-merger
Browse files

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

am: 677755f2

Change-Id: I9bbaf6f73a28dfa4dceef329f08e0aa424bce6f5
parents 19a128b3 677755f2
Loading
Loading
Loading
Loading
+19 −12
Original line number Original line Diff line number Diff line
@@ -508,7 +508,7 @@ void CameraClient::releaseRecordingFrame(const sp<IMemory>& mem) {


void CameraClient::releaseRecordingFrameHandle(native_handle_t *handle) {
void CameraClient::releaseRecordingFrameHandle(native_handle_t *handle) {
    if (handle == nullptr) return;
    if (handle == nullptr) return;

    Mutex::Autolock lock(mLock);
    sp<IMemory> dataPtr;
    sp<IMemory> dataPtr;
    {
    {
        Mutex::Autolock l(mAvailableCallbackBuffersLock);
        Mutex::Autolock l(mAvailableCallbackBuffersLock);
@@ -532,17 +532,22 @@ void CameraClient::releaseRecordingFrameHandle(native_handle_t *handle) {
        return;
        return;
    }
    }


    if (mHardware != nullptr) {
        VideoNativeHandleMetadata *metadata = (VideoNativeHandleMetadata*)(dataPtr->pointer());
        VideoNativeHandleMetadata *metadata = (VideoNativeHandleMetadata*)(dataPtr->pointer());
        metadata->eType = kMetadataBufferTypeNativeHandleSource;
        metadata->eType = kMetadataBufferTypeNativeHandleSource;
        metadata->pHandle = handle;
        metadata->pHandle = handle;

        mHardware->releaseRecordingFrame(dataPtr);
        mHardware->releaseRecordingFrame(dataPtr);
    }
    }
}


void CameraClient::releaseRecordingFrameHandleBatch(const std::vector<native_handle_t*>& handles) {
void CameraClient::releaseRecordingFrameHandleBatch(const std::vector<native_handle_t*>& handles) {
    Mutex::Autolock lock(mLock);
    bool disconnected = (mHardware == nullptr);
    size_t n = handles.size();
    size_t n = handles.size();
    std::vector<sp<IMemory>> frames;
    std::vector<sp<IMemory>> frames;
    if (!disconnected) {
        frames.reserve(n);
        frames.reserve(n);
    }
    bool error = false;
    bool error = false;
    for (auto& handle : handles) {
    for (auto& handle : handles) {
        sp<IMemory> dataPtr;
        sp<IMemory> dataPtr;
@@ -566,18 +571,20 @@ void CameraClient::releaseRecordingFrameHandleBatch(const std::vector<native_han
            break;
            break;
        }
        }


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


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