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

Commit b45ee924 authored by Eino-Ville Talvala's avatar Eino-Ville Talvala Committed by Android (Google) Code Review
Browse files

Merge "Camera service: Add support for camera.device@3.3" into oc-mr1-dev

parents 1392f273 91cd3f89
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -77,7 +77,8 @@ LOCAL_SHARED_LIBRARIES:= \
    android.hardware.camera.common@1.0 \
    android.hardware.camera.provider@2.4 \
    android.hardware.camera.device@1.0 \
    android.hardware.camera.device@3.2
    android.hardware.camera.device@3.2 \
    android.hardware.camera.device@3.3

LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libbinder libcamera_client libfmq

+2 −2
Original line number Diff line number Diff line
@@ -324,7 +324,7 @@ status_t StreamingProcessor::recordingStreamNeedsUpdate(
            streamInfo.width != (uint32_t)params.videoWidth ||
            streamInfo.height != (uint32_t)params.videoHeight ||
            !streamInfo.matchFormat((uint32_t)params.videoFormat) ||
            streamInfo.dataSpace != params.videoDataSpace) {
            !streamInfo.matchDataSpace(params.videoDataSpace)) {
        *needsUpdate = true;
        return res;
    }
@@ -356,7 +356,7 @@ status_t StreamingProcessor::updateRecordingStream(const Parameters &params) {
        if (streamInfo.width != (uint32_t)params.videoWidth ||
                streamInfo.height != (uint32_t)params.videoHeight ||
                !streamInfo.matchFormat((uint32_t)params.videoFormat) ||
                streamInfo.dataSpace != params.videoDataSpace) {
                !streamInfo.matchDataSpace(params.videoDataSpace)) {
            // TODO: Should wait to be sure previous recording has finished
            res = device->deleteStream(mRecordingStreamId);

+21 −2
Original line number Diff line number Diff line
@@ -145,23 +145,42 @@ class CameraDeviceBase : public virtual RefBase {
    struct StreamInfo {
        uint32_t width;
        uint32_t height;

        uint32_t format;
        bool formatOverridden;
        uint32_t originalFormat;

        android_dataspace dataSpace;
        bool dataSpaceOverridden;
        android_dataspace originalDataSpace;

        StreamInfo() : width(0), height(0), format(0), formatOverridden(false), originalFormat(0),
                dataSpace(HAL_DATASPACE_UNKNOWN) {}
                dataSpace(HAL_DATASPACE_UNKNOWN), dataSpaceOverridden(false),
                originalDataSpace(HAL_DATASPACE_UNKNOWN) {}
        /**
         * Check whether the format matches the current or the original one in case
         * it got overridden.
         */
        bool matchFormat(uint32_t clientFormat) {
        bool matchFormat(uint32_t clientFormat) const {
            if ((formatOverridden && (originalFormat == clientFormat)) ||
                    (format == clientFormat)) {
                return true;
            }
            return false;
        }

        /**
         * Check whether the dataspace matches the current or the original one in case
         * it got overridden.
         */
        bool matchDataSpace(android_dataspace clientDataSpace) const {
            if ((dataSpaceOverridden && (originalDataSpace == clientDataSpace)) ||
                    (dataSpace == clientDataSpace)) {
                return true;
            }
            return false;
        }

    };

    /**
+76 −17
Original line number Diff line number Diff line
@@ -154,6 +154,15 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager) {
                resultQueueRet.description().c_str());
        return DEAD_OBJECT;
    }
    IF_ALOGV() {
        session->interfaceChain([](
            ::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) {
                ALOGV("Session interface chain:");
                for (auto iface : interfaceChain) {
                    ALOGV("  %s", iface.c_str());
                }
            });
    }

    mInterface = new HalInterface(session, queue);
    std::string providerType;
@@ -460,6 +469,11 @@ int Camera3Device::mapToFrameworkFormat(
    return static_cast<uint32_t>(pixelFormat);
}

android_dataspace Camera3Device::mapToFrameworkDataspace(
        DataspaceFlags dataSpace) {
    return static_cast<android_dataspace>(dataSpace);
}

uint64_t Camera3Device::mapConsumerToFrameworkUsage(
        BufferUsageFlags usage) {
    return usage;
@@ -1382,6 +1396,8 @@ status_t Camera3Device::getStreamInfo(int id, StreamInfo *streamInfo) {
    streamInfo->dataSpace = mOutputStreams[idx]->getDataSpace();
    streamInfo->formatOverridden = mOutputStreams[idx]->isFormatOverridden();
    streamInfo->originalFormat = mOutputStreams[idx]->getOriginalFormat();
    streamInfo->dataSpaceOverridden = mOutputStreams[idx]->isDataSpaceOverridden();
    streamInfo->originalDataSpace = mOutputStreams[idx]->getOriginalDataSpace();
    return OK;
}

@@ -3196,11 +3212,24 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat

    // Invoke configureStreams

    HalStreamConfiguration finalConfiguration;
    device::V3_3::HalStreamConfiguration finalConfiguration;
    common::V1_0::Status status;
    auto err = mHidlSession->configureStreams(requestedConfiguration,

    // See if we have v3.3 HAL
    sp<device::V3_3::ICameraDeviceSession> hidlSession_3_3;
    auto castResult = device::V3_3::ICameraDeviceSession::castFrom(mHidlSession);
    if (castResult.isOk()) {
        hidlSession_3_3 = castResult;
    } else {
        ALOGE("%s: Transaction error when casting ICameraDeviceSession: %s", __FUNCTION__,
                castResult.description().c_str());
    }
    if (hidlSession_3_3 != nullptr) {
        // We do; use v3.3 for the call
        ALOGV("%s: v3.3 device found", __FUNCTION__);
        auto err = hidlSession_3_3->configureStreams_3_3(requestedConfiguration,
            [&status, &finalConfiguration]
            (common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) {
            (common::V1_0::Status s, const device::V3_3::HalStreamConfiguration& halConfiguration) {
                finalConfiguration = halConfiguration;
                status = s;
            });
@@ -3208,6 +3237,27 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat
            ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
            return DEAD_OBJECT;
        }
    } else {
        // We don't; use v3.2 call and construct a v3.3 HalStreamConfiguration
        ALOGV("%s: v3.2 device found", __FUNCTION__);
        HalStreamConfiguration finalConfiguration_3_2;
        auto err = mHidlSession->configureStreams(requestedConfiguration,
                [&status, &finalConfiguration_3_2]
                (common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) {
                    finalConfiguration_3_2 = halConfiguration;
                    status = s;
                });
        if (!err.isOk()) {
            ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
            return DEAD_OBJECT;
        }
        finalConfiguration.streams.resize(finalConfiguration_3_2.streams.size());
        for (size_t i = 0; i < finalConfiguration_3_2.streams.size(); i++) {
            finalConfiguration.streams[i].v3_2 = finalConfiguration_3_2.streams[i];
            finalConfiguration.streams[i].overrideDataSpace =
                    requestedConfiguration.streams[i].dataSpace;
        }
    }

    if (status != common::V1_0::Status::OK ) {
        return CameraProviderManager::mapToStatusT(status);
@@ -3223,7 +3273,7 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat
        size_t realIdx = i;
        bool found = false;
        for (size_t idx = 0; idx < finalConfiguration.streams.size(); idx++) {
            if (finalConfiguration.streams[realIdx].id == streamId) {
            if (finalConfiguration.streams[realIdx].v3_2.id == streamId) {
                found = true;
                break;
            }
@@ -3234,42 +3284,51 @@ status_t Camera3Device::HalInterface::configureStreams(camera3_stream_configurat
                    __FUNCTION__, streamId);
            return INVALID_OPERATION;
        }
        HalStream &src = finalConfiguration.streams[realIdx];
        device::V3_3::HalStream &src = finalConfiguration.streams[realIdx];

        Camera3Stream* dstStream = Camera3Stream::cast(dst);
        dstStream->setFormatOverride(false);
        int overrideFormat = mapToFrameworkFormat(src.overrideFormat);
        dstStream->setDataSpaceOverride(false);
        int overrideFormat = mapToFrameworkFormat(src.v3_2.overrideFormat);
        android_dataspace overrideDataSpace = mapToFrameworkDataspace(src.overrideDataSpace);

        if (dst->format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
            if (dst->format != overrideFormat) {
                ALOGE("%s: Stream %d: Format override not allowed for format 0x%x", __FUNCTION__,
                        streamId, dst->format);
            }
            if (dst->data_space != overrideDataSpace) {
                ALOGE("%s: Stream %d: DataSpace override not allowed for format 0x%x", __FUNCTION__,
                        streamId, dst->format);
            }
        } else {
            dstStream->setFormatOverride((dst->format != overrideFormat) ? true : false);
            dstStream->setOriginalFormat(dst->format);
            dstStream->setDataSpaceOverride((dst->data_space != overrideDataSpace) ? true : false);

            // Override allowed with IMPLEMENTATION_DEFINED
            dst->format = overrideFormat;
            dst->data_space = overrideDataSpace;
        }

        if (dst->stream_type == CAMERA3_STREAM_INPUT) {
            if (src.producerUsage != 0) {
            if (src.v3_2.producerUsage != 0) {
                ALOGE("%s: Stream %d: INPUT streams must have 0 for producer usage",
                        __FUNCTION__, streamId);
                return INVALID_OPERATION;
            }
            Camera3Stream::cast(dst)->setUsage(
                    mapConsumerToFrameworkUsage(src.consumerUsage));
            dstStream->setUsage(
                    mapConsumerToFrameworkUsage(src.v3_2.consumerUsage));
        } else {
            // OUTPUT
            if (src.consumerUsage != 0) {
            if (src.v3_2.consumerUsage != 0) {
                ALOGE("%s: Stream %d: OUTPUT streams must have 0 for consumer usage",
                        __FUNCTION__, streamId);
                return INVALID_OPERATION;
            }
            Camera3Stream::cast(dst)->setUsage(
                    mapProducerToFrameworkUsage(src.producerUsage));
            dstStream->setUsage(
                    mapProducerToFrameworkUsage(src.v3_2.producerUsage));
        }
        dst->max_buffers = src.maxBuffers;
        dst->max_buffers = src.v3_2.maxBuffers;
    }

    return res;
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@

#include <android/hardware/camera/device/3.2/ICameraDevice.h>
#include <android/hardware/camera/device/3.2/ICameraDeviceSession.h>
#include <android/hardware/camera/device/3.3/ICameraDeviceSession.h>
#include <android/hardware/camera/device/3.2/ICameraDeviceCallback.h>
#include <fmq/MessageQueue.h>
#include <hardware/camera3.h>
@@ -595,6 +596,8 @@ class Camera3Device :
            /*out*/ hardware::camera::device::V3_2::StreamConfigurationMode *mode);
    static camera3_buffer_status_t mapHidlBufferStatus(hardware::camera::device::V3_2::BufferStatus status);
    static int mapToFrameworkFormat(hardware::graphics::common::V1_0::PixelFormat pixelFormat);
    static android_dataspace mapToFrameworkDataspace(
            hardware::camera::device::V3_2::DataspaceFlags);
    static uint64_t mapConsumerToFrameworkUsage(
            hardware::camera::device::V3_2::BufferUsageFlags usage);
    static uint64_t mapProducerToFrameworkUsage(
Loading