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

Commit 197540a9 authored by Jayant Chowdhary's avatar Jayant Chowdhary Committed by Android (Google) Code Review
Browse files

Merge "cameraserver: Add support for session specific hal buffer manager switches" into main

parents f6529a3b 9d3a649f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -100,7 +100,7 @@ cc_defaults {
        "android.frameworks.cameraservice.service-V2-ndk",
        "android.frameworks.cameraservice.device-V2-ndk",
        "android.hardware.camera.common-V1-ndk",
        "android.hardware.camera.device-V2-ndk",
        "android.hardware.camera.device-V3-ndk",
        "android.hardware.camera.metadata-V2-ndk",
        "android.hardware.camera.provider@2.4",
        "android.hardware.camera.provider@2.5",
+44 −1
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@
#include <android-base/properties.h>
#include <android/hardware/camera/device/3.7/ICameraInjectionSession.h>
#include <android/hardware/camera2/ICameraDeviceUser.h>
#include <com_android_internal_camera_flags.h>

#include "CameraService.h"
#include "aidl/android/hardware/graphics/common/Dataspace.h"
@@ -76,6 +77,7 @@
using namespace android::camera3;
using namespace android::hardware::camera;

namespace flags = com::android::internal::camera::flags;
namespace android {

Camera3Device::Camera3Device(std::shared_ptr<CameraServiceProxyWrapper>& cameraServiceProxyWrapper,
@@ -2545,6 +2547,7 @@ status_t Camera3Device::configureStreamsLocked(int operatingMode,
    }

    config.streams = streams.editArray();
    config.use_hal_buf_manager = mUseHalBufManager;

    // Do the HAL configuration; will potentially touch stream
    // max_buffers, usage, and priv fields, as well as data_space and format
@@ -2568,7 +2571,22 @@ status_t Camera3Device::configureStreamsLocked(int operatingMode,
                strerror(-res), res);
        return res;
    }

    if (flags::session_hal_buf_manager()) {
        bool prevSessionHalBufManager = mUseHalBufManager;
        // It is possible that configureStreams() changed config.use_hal_buf_manager
        mUseHalBufManager = config.use_hal_buf_manager;
        if (prevSessionHalBufManager && !mUseHalBufManager) {
            mRequestBufferSM.deInit();
        } else if (!prevSessionHalBufManager && mUseHalBufManager) {
            res = mRequestBufferSM.initialize(mStatusTracker);
            if (res != OK) {
                SET_ERR_L("%s: Camera %s: RequestBuffer State machine couldn't be initialized!",
                          __FUNCTION__, mId.c_str());
                return res;
            }
        }
        mRequestThread->setHalBufferManager(mUseHalBufManager);
    }
    // Finish all stream configuration immediately.
    // TODO: Try to relax this later back to lazy completion, which should be
    // faster
@@ -3278,6 +3296,10 @@ void Camera3Device::RequestThread::setPaused(bool paused) {
    mDoPauseSignal.signal();
}

void Camera3Device::RequestThread::setHalBufferManager(bool enabled) {
    mUseHalBufManager = enabled;
}

status_t Camera3Device::RequestThread::waitUntilRequestProcessed(
        int32_t requestId, nsecs_t timeout) {
    ATRACE_CALL();
@@ -5231,6 +5253,27 @@ status_t Camera3Device::RequestBufferStateMachine::initialize(
    return OK;
}

status_t Camera3Device::RequestBufferStateMachine::deInit() {
    std::lock_guard<std::mutex> lock(mLock);
    sp<StatusTracker> statusTracker = mStatusTracker.promote();
    if (statusTracker == nullptr) {
        ALOGE("%s: statusTracker is null", __FUNCTION__);
        return INVALID_OPERATION;
    }
    if (mRequestBufferStatusId == StatusTracker::NO_STATUS_ID) {
        ALOGE("%s: RequestBufferStateMachine not initialized", __FUNCTION__);
        return INVALID_OPERATION;
    }
    statusTracker->removeComponent(mRequestBufferStatusId);
    // Bring back to de-initialized state
    mRequestBufferStatusId = StatusTracker::NO_STATUS_ID;
    mRequestThreadPaused = true;
    mInflightMapEmpty = true;
    mRequestBufferOngoing = false;
    mSwitchedToOffline = false;
    return OK;
}

bool Camera3Device::RequestBufferStateMachine::startRequestBuffer() {
    std::lock_guard<std::mutex> lock(mLock);
    if (mStatus == RB_STATUS_READY || mStatus == RB_STATUS_PENDING_STOP) {
+12 −3
Original line number Diff line number Diff line
@@ -543,7 +543,7 @@ class Camera3Device :

        uint32_t mNextStreamConfigCounter = 1;

        const bool mUseHalBufManager;
        bool mUseHalBufManager = false;
        bool mIsReconfigurationQuerySupported;

        const bool mSupportOfflineProcessing;
@@ -941,6 +941,13 @@ class Camera3Device :
         */
        void     setPaused(bool paused);

        /**
         * Set Hal buffer manager behavior
         * @param enabled Whether HAL buffer manager is enabled for the current session.
         *
         */
        void setHalBufferManager(bool enabled);

        /**
         * Wait until thread processes the capture request with settings'
         * android.request.id == requestId.
@@ -1181,7 +1188,7 @@ class Camera3Device :

        std::map<int32_t, std::set<std::string>> mGroupIdPhysicalCameraMap;

        const bool         mUseHalBufManager;
        bool               mUseHalBufManager = false;
        const bool         mSupportCameraMute;
        const bool         mOverrideToPortrait;
        const bool         mSupportSettingsOverride;
@@ -1372,7 +1379,7 @@ class Camera3Device :

    // Whether HAL request buffers through requestStreamBuffers API
    bool mUseHalBufManager = false;

    bool mSessionHalBufManager = false;
    // Lock to ensure requestStreamBuffers() callbacks are serialized
    std::mutex mRequestBufferInterfaceLock;

@@ -1408,6 +1415,8 @@ class Camera3Device :
      public:
        status_t initialize(sp<camera3::StatusTracker> statusTracker);

        status_t deInit();

        // Return if the state machine currently allows for requestBuffers
        // If the state allows for it, mRequestBufferOngoing will be set to true
        // and caller must call endRequestBuffer() later to unset the flag
+7 −0
Original line number Diff line number Diff line
@@ -106,6 +106,13 @@ status_t Camera3SharedOutputStream::attachBufferToSplitterLocked(
    return res;
}

void Camera3SharedOutputStream::setHalBufferManager(bool enabled) {
    Mutex::Autolock l(mLock);
    mUseHalBufManager = enabled;
    if (mStreamSplitter != nullptr) {
        mStreamSplitter->setHalBufferManager(enabled);
    }
}

status_t Camera3SharedOutputStream::notifyBufferReleased(ANativeWindowBuffer *anwBuffer) {
    Mutex::Autolock l(mLock);
+3 −1
Original line number Diff line number Diff line
@@ -51,6 +51,8 @@ public:

    virtual ~Camera3SharedOutputStream();

    void setHalBufferManager(bool enabled) override;

    virtual status_t notifyBufferReleased(ANativeWindowBuffer *buffer);

    virtual bool isConsumerConfigurationDeferred(size_t surface_id) const;
@@ -85,7 +87,7 @@ private:

    // Whether HAL is in control for buffer management. Surface sharing behavior
    // depends on this flag.
    const bool mUseHalBufManager;
    bool mUseHalBufManager;

    // Pair of an output Surface and its unique ID
    typedef std::pair<sp<Surface>, size_t> SurfaceUniqueId;
Loading