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

Commit e579d8bb authored by Emilian Peev's avatar Emilian Peev
Browse files

Camera: Disable composite Jpeg/R support in case of Hal support

Detect whether camera devices can output Jpeg/R natively. In case
support is available, automatically disable the internal composite
Jpeg/R functionality.

Bug: 262265296
Test: test -c -d
cts/tests/camera/src/android/hardware/camera2/cts/ImageReaderTest.java#testJpegR

Change-Id: I7739511216792af0cdb5b85f8cd941be35b7b297
parent 49ae1e4a
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -956,7 +956,8 @@ binder::Status CameraDeviceClient::createStream(
            camera3::DepthCompositeStream::isDepthCompositeStream(surfaces[0]);
    bool isHeicCompositeStream = camera3::HeicCompositeStream::isHeicCompositeStream(surfaces[0]);
    bool isJpegRCompositeStream =
        camera3::JpegRCompositeStream::isJpegRCompositeStream(surfaces[0]);
        camera3::JpegRCompositeStream::isJpegRCompositeStream(surfaces[0]) &&
        !mDevice->supportNativeJpegR();
    if (isDepthCompositeStream || isHeicCompositeStream || isJpegRCompositeStream) {
        sp<CompositeStream> compositeStream;
        if (isDepthCompositeStream) {
@@ -1841,7 +1842,8 @@ binder::Status CameraDeviceClient::switchToOffline(
            sp<Surface> s = new Surface(gbp, false /*controlledByApp*/);
            isCompositeStream = camera3::DepthCompositeStream::isDepthCompositeStream(s) ||
                camera3::HeicCompositeStream::isHeicCompositeStream(s) ||
                camera3::JpegRCompositeStream::isJpegRCompositeStream(s);
                (camera3::JpegRCompositeStream::isJpegRCompositeStream(s) &&
                 !mDevice->supportNativeJpegR());
            if (isCompositeStream) {
                auto compositeIdx = mCompositeStreamMap.indexOfKey(IInterface::asBinder(gbp));
                if (compositeIdx == NAME_NOT_FOUND) {
+2 −0
Original line number Diff line number Diff line
@@ -113,6 +113,8 @@ class CameraDeviceBase : public virtual FrameProducer {
     */
    virtual const CameraMetadata& infoPhysical(const String8& physicalId) const = 0;

    virtual bool supportNativeJpegR() const { return false; };

    struct PhysicalCameraSettings {
        std::string cameraId;
        CameraMetadata metadata;
+13 −1
Original line number Diff line number Diff line
@@ -316,6 +316,18 @@ bool CameraProviderManager::supportNativeZoomRatio(const std::string &id) const
    return deviceInfo->supportNativeZoomRatio();
}

bool CameraProviderManager::supportNativeJpegR(const std::string &id) const {
    std::lock_guard<std::mutex> lock(mInterfaceMutex);
    return supportNativeJpegRLocked(id);
}

bool CameraProviderManager::supportNativeJpegRLocked(const std::string &id) const {
    auto deviceInfo = findDeviceInfoLocked(id);
    if (deviceInfo == nullptr) return false;

    return deviceInfo->supportNativeJpegR();
}

status_t CameraProviderManager::getResourceCost(const std::string &id,
        CameraResourceCost* cost) const {
    std::lock_guard<std::mutex> lock(mInterfaceMutex);
@@ -1108,7 +1120,7 @@ bool CameraProviderManager::isConcurrentDynamicRangeCaptureSupported(
}

status_t CameraProviderManager::ProviderInfo::DeviceInfo3::deriveJpegRTags(bool maxResolution) {
    if (kFrameworkJpegRDisabled) {
    if (kFrameworkJpegRDisabled || mSupportsNativeJpegR) {
        return OK;
    }

+10 −1
Original line number Diff line number Diff line
@@ -247,6 +247,11 @@ public:
     */
    bool supportNativeZoomRatio(const std::string &id) const;

    /**
     * Return true if the camera device has native Jpeg/R support.
     */
    bool supportNativeJpegR(const std::string &id) const;

    /**
     * Return the resource cost of this camera device
     */
@@ -568,6 +573,7 @@ private:

            bool hasFlashUnit() const { return mHasFlashUnit; }
            bool supportNativeZoomRatio() const { return mSupportNativeZoomRatio; }
            bool supportNativeJpegR() const { return mSupportsNativeJpegR; }
            virtual status_t setTorchMode(bool enabled) = 0;
            virtual status_t turnOnTorchWithStrengthLevel(int32_t torchStrength) = 0;
            virtual status_t getTorchStrengthLevel(int32_t *torchStrength) = 0;
@@ -609,13 +615,14 @@ private:
                    mParentProvider(parentProvider), mTorchStrengthLevel(0),
                    mTorchMaximumStrengthLevel(0), mTorchDefaultStrengthLevel(0),
                    mHasFlashUnit(false), mSupportNativeZoomRatio(false),
                    mPublicCameraIds(publicCameraIds) {}
                    mPublicCameraIds(publicCameraIds), mSupportsNativeJpegR(false) {}
            virtual ~DeviceInfo() {}
        protected:

            bool mHasFlashUnit; // const after constructor
            bool mSupportNativeZoomRatio; // const after constructor
            const std::vector<std::string>& mPublicCameraIds;
            bool mSupportsNativeJpegR;
        };
        std::vector<std::unique_ptr<DeviceInfo>> mDevices;
        std::unordered_set<std::string> mUniqueCameraIds;
@@ -804,6 +811,8 @@ private:
    // No guarantees on the order of traversal
    ProviderInfo::DeviceInfo* findDeviceInfoLocked(const std::string& id) const;

    bool supportNativeJpegRLocked(const std::string &id) const;

    // Map external providers to USB devices in order to handle USB hotplug
    // events for lazy HALs
    std::pair<std::vector<std::string>, sp<ProviderInfo>>
+7 −3
Original line number Diff line number Diff line
@@ -483,6 +483,9 @@ AidlProviderInfo::AidlDeviceInfo3::AidlDeviceInfo3(
        }
    }

    mSupportsNativeJpegR = mCameraCharacteristics.exists(
            ANDROID_JPEGR_AVAILABLE_JPEG_R_STREAM_CONFIGURATIONS);

    mSystemCameraKind = getSystemCameraKind();

    status_t res = fixupMonochromeTags();
@@ -732,8 +735,8 @@ status_t AidlProviderInfo::AidlDeviceInfo3::isSessionConfigurationSupported(
    camera::device::StreamConfiguration streamConfiguration;
    bool earlyExit = false;
    auto bRes = SessionConfigurationUtils::convertToHALStreamCombination(configuration,
            String8(mId.c_str()), mCameraCharacteristics, getMetadata, mPhysicalIds,
            streamConfiguration, overrideForPerfClass, &earlyExit);
            String8(mId.c_str()), mCameraCharacteristics, mSupportsNativeJpegR, getMetadata,
            mPhysicalIds, streamConfiguration, overrideForPerfClass, &earlyExit);

    if (!bRes.isOk()) {
        return UNKNOWN_ERROR;
@@ -798,7 +801,8 @@ status_t AidlProviderInfo::convertToAidlHALStreamCombinationAndCameraIdsLocked(
        bStatus =
            SessionConfigurationUtils::convertToHALStreamCombination(
                    cameraIdAndSessionConfig.mSessionConfiguration,
                    String8(cameraId.c_str()), deviceInfo, getMetadata,
                    String8(cameraId.c_str()), deviceInfo,
                    mManager->supportNativeJpegRLocked(cameraId), getMetadata,
                    physicalCameraIds, streamConfiguration,
                    overrideForPerfClass, &shouldExit);
        if (!bStatus.isOk()) {
Loading