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

Commit 52778d44 authored by Yin-Chia Yeh's avatar Yin-Chia Yeh
Browse files

Camera: patching camera service for treble

Bug: 30985004
Change-Id: Idf3ec26abb6b10a0e3839e301e84c8b05ac165c5
parent 0b1cb14c
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1645,8 +1645,8 @@ Status CameraService::setTorchMode(const String16& cameraId, bool enabled,

    StatusInternal cameraStatus = state->getStatus();
    if (cameraStatus != StatusInternal::PRESENT &&
            cameraStatus != StatusInternal::NOT_PRESENT) {
        ALOGE("%s: camera id is invalid %s", __FUNCTION__, id.string());
            cameraStatus != StatusInternal::NOT_AVAILABLE) {
        ALOGE("%s: camera id is invalid %s, status %d", __FUNCTION__, id.string(), (int)cameraStatus);
        return STATUS_ERROR_FMT(ERROR_ILLEGAL_ARGUMENT,
                "Camera ID \"%s\" is a not valid camera ID", id.string());
    }
@@ -1668,7 +1668,7 @@ Status CameraService::setTorchMode(const String16& cameraId, bool enabled,
        }

        if (status == TorchModeStatus::NOT_AVAILABLE) {
            if (cameraStatus == StatusInternal::NOT_PRESENT) {
            if (cameraStatus == StatusInternal::NOT_AVAILABLE) {
                ALOGE("%s: torch mode of camera %s is not available because "
                        "camera is in use", __FUNCTION__, id.string());
                return STATUS_ERROR_FMT(ERROR_CAMERA_IN_USE,
+3 −4
Original line number Diff line number Diff line
@@ -427,8 +427,7 @@ status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name,
}

status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {
    dprintf(fd, "    %s: v%d.%d, %zu devices:\n", mProviderName.c_str(),
            mInterface->version.get_major(), mInterface->version.get_minor(), mDevices.size());
    dprintf(fd, "    %s: %zu devices:\n", mProviderName.c_str(), mDevices.size());

    for (auto& device : mDevices) {
        dprintf(fd, "        %s: Resource cost: %d\n", device->mName.c_str(),
@@ -450,7 +449,7 @@ hardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusCh
    sp<StatusListener> listener;
    std::string id;
    {
        std::lock_guard<std::mutex> lock(mManager->mInterfaceMutex);
        std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex);
        bool known = false;
        for (auto& deviceInfo : mDevices) {
            if (deviceInfo->mName == cameraDeviceName) {
@@ -487,7 +486,7 @@ hardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChang
    sp<StatusListener> listener;
    std::string id;
    {
        std::lock_guard<std::mutex> lock(mManager->mInterfaceMutex);
        std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex);
        bool known = false;
        for (auto& deviceInfo : mDevices) {
            if (deviceInfo->mName == cameraDeviceName) {
+2 −0
Original line number Diff line number Diff line
@@ -194,6 +194,8 @@ private:
    // All private members, unless otherwise noted, expect mInterfaceMutex to be locked before use
    mutable std::mutex mInterfaceMutex;

    // the status listener update callbacks will lock mStatusMutex
    mutable std::mutex mStatusListenerMutex;
    wp<StatusListener> mListener;
    ServiceInteractionProxy* mServiceProxy;

+54 −48
Original line number Diff line number Diff line
@@ -196,8 +196,10 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager) {
        session->close();
        return res;
    }
    hardware::hidl_version version = session->getInterfaceVersion();
    mDeviceVersion = HARDWARE_DEVICE_API_VERSION(version.get_major(), version.get_minor());

    // TODO: camera service will absorb 3_2/3_3/3_4 differences in the future
    //       for now use 3_4 to keep legacy devices working
    mDeviceVersion = CAMERA_DEVICE_API_VERSION_3_4;
    mInterface = std::make_unique<HalInterface>(session);

    return initializeCommonLocked();
@@ -247,8 +249,7 @@ status_t Camera3Device::initializeCommonLocked() {
    // Determine whether we need to derive sensitivity boost values for older devices.
    // If post-RAW sensitivity boost range is listed, so should post-raw sensitivity control
    // be listed (as the default value 100)
    if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_4 &&
            mDeviceInfo.exists(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE)) {
    if (mDeviceInfo.exists(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE)) {
        mDerivePostRawSensKey = true;
    }

@@ -899,6 +900,7 @@ hardware::Return<void> Camera3Device::processCaptureResult(
    camera3_capture_result r;
    status_t res;
    r.frame_number = result.frameNumber;
    if (result.result.size() != 0) {
        r.result = reinterpret_cast<const camera_metadata_t*>(result.result.data());
        size_t expected_metadata_size = result.result.size();
        if ((res = validate_camera_metadata_structure(r.result, &expected_metadata_size)) != OK) {
@@ -906,6 +908,9 @@ hardware::Return<void> Camera3Device::processCaptureResult(
                    __FUNCTION__, result.frameNumber, strerror(-res), res);
            return hardware::Void();
        }
    } else {
        r.result = nullptr;
    }

    std::vector<camera3_stream_buffer_t> outputBuffers(result.outputBuffers.size());
    std::vector<buffer_handle_t> outputBufferHandles(result.outputBuffers.size());
@@ -946,7 +951,7 @@ hardware::Return<void> Camera3Device::processCaptureResult(
    r.output_buffers = outputBuffers.data();

    camera3_stream_buffer_t inputBuffer;
    if (result.inputBuffer.buffer == nullptr) {
    if (result.inputBuffer.streamId == -1) {
        r.input_buffer = nullptr;
    } else {
        if (mInputStream->getId() != result.inputBuffer.streamId) {
@@ -3214,7 +3219,6 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat
status_t Camera3Device::HalInterface::processCaptureRequest(
        camera3_capture_request_t *request) {
    ATRACE_NAME("CameraHal::processCaptureRequest");
    (void) request;
    if (!valid()) return INVALID_OPERATION;
    status_t res = OK;

@@ -3230,6 +3234,8 @@ status_t Camera3Device::HalInterface::processCaptureRequest(
                    reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(request->settings)),
                    get_camera_metadata_size(request->settings));
        }

        {
            std::lock_guard<std::mutex> lock(mInflightLock);
            if (request->input_buffer != nullptr) {
                int32_t streamId = Camera3Stream::cast(request->input_buffer->stream)->getId();
@@ -3248,6 +3254,7 @@ status_t Camera3Device::HalInterface::processCaptureRequest(
                pushInflightBufferLocked(captureRequest.frameNumber, streamId,
                        request->input_buffer->buffer);
            }

            captureRequest.outputBuffers.resize(request->num_output_buffers);
            for (size_t i = 0; i < request->num_output_buffers; i++) {
                const camera3_stream_buffer_t *src = request->output_buffers + i;
@@ -3268,13 +3275,12 @@ status_t Camera3Device::HalInterface::processCaptureRequest(
                pushInflightBufferLocked(captureRequest.frameNumber, streamId,
                        src->buffer);
            }

        }
        common::V1_0::Status status = mHidlSession->processCaptureRequest(captureRequest);

        for (auto& handle : handlesCreated) {
            native_handle_delete(handle);
        }

        res = CameraProviderManager::mapToStatusT(status);
    }
    return res;