Loading services/camera/libcameraservice/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -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", Loading services/camera/libcameraservice/device3/Camera3Device.cpp +44 −1 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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, Loading Loading @@ -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 Loading @@ -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 Loading Loading @@ -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(); Loading Loading @@ -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) { Loading services/camera/libcameraservice/device3/Camera3Device.h +12 −3 Original line number Diff line number Diff line Loading @@ -543,7 +543,7 @@ class Camera3Device : uint32_t mNextStreamConfigCounter = 1; const bool mUseHalBufManager; bool mUseHalBufManager = false; bool mIsReconfigurationQuerySupported; const bool mSupportOfflineProcessing; Loading Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading services/camera/libcameraservice/device3/Camera3SharedOutputStream.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -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); Loading services/camera/libcameraservice/device3/Camera3SharedOutputStream.h +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
services/camera/libcameraservice/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -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", Loading
services/camera/libcameraservice/device3/Camera3Device.cpp +44 −1 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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, Loading Loading @@ -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 Loading @@ -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 Loading Loading @@ -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(); Loading Loading @@ -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) { Loading
services/camera/libcameraservice/device3/Camera3Device.h +12 −3 Original line number Diff line number Diff line Loading @@ -543,7 +543,7 @@ class Camera3Device : uint32_t mNextStreamConfigCounter = 1; const bool mUseHalBufManager; bool mUseHalBufManager = false; bool mIsReconfigurationQuerySupported; const bool mSupportOfflineProcessing; Loading Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading
services/camera/libcameraservice/device3/Camera3SharedOutputStream.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
services/camera/libcameraservice/device3/Camera3SharedOutputStream.h +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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