cameraserver: Add support for stream specific hal buffer manager
Add support for the HAL to specify whether each stream should be hal
buffer managed, during the configureStreams HAL call.
Bug: 311263114
Test: Camera CTS(flag on + off) with HAL supporting stream specific HAL buffer manager
Change-Id: I6f81258782a80c25c27db1bf7e2790ba501086cd
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 28b2d78..47aac5c 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -80,7 +80,7 @@
namespace flags = com::android::internal::camera::flags;
namespace android {
-namespace flags = com::android::internal::camera::flags;
+
Camera3Device::Camera3Device(std::shared_ptr<CameraServiceProxyWrapper>& cameraServiceProxyWrapper,
const std::string &id, bool overrideForPerfClass, bool overrideToPortrait,
bool legacyClient):
@@ -145,17 +145,6 @@
/** Register in-flight map to the status tracker */
mInFlightStatusId = mStatusTracker->addComponent("InflightRequests");
- if (mUseHalBufManager) {
- res = mRequestBufferSM.initialize(mStatusTracker);
- if (res != OK) {
- SET_ERR_L("Unable to start request buffer state machine: %s (%d)",
- strerror(-res), res);
- mInterface->close();
- mStatusTracker.clear();
- return res;
- }
- }
-
/** Create buffer manager */
mBufferManager = new Camera3BufferManager();
@@ -1622,7 +1611,9 @@
mStatusWaiters++;
bool signalPipelineDrain = false;
- if (!active && mUseHalBufManager) {
+ if (!active &&
+ (mUseHalBufManager ||
+ (flags::session_hal_buf_manager() && mHalBufManagedStreamIds.size() != 0))) {
auto streamIds = mOutputStreams.getStreamIds();
if (mStatus == STATUS_ACTIVE) {
mRequestThread->signalPipelineDrain(streamIds);
@@ -2538,7 +2529,7 @@
}
config.streams = streams.editArray();
- config.use_hal_buf_manager = mUseHalBufManager;
+ config.hal_buffer_managed_streams = mHalBufManagedStreamIds;
// Do the HAL configuration; will potentially touch stream
// max_buffers, usage, and priv fields, as well as data_space and format
@@ -2562,13 +2553,17 @@
strerror(-res), res);
return res;
}
+ mUseHalBufManager = config.use_hal_buf_manager;
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) {
+ bool prevSessionHalBufManager = (mHalBufManagedStreamIds.size() != 0);
+ // It is possible that configureStreams() changed config.hal_buffer_managed_streams
+ mHalBufManagedStreamIds = config.hal_buffer_managed_streams;
+
+ bool thisSessionHalBufManager = mHalBufManagedStreamIds.size() != 0;
+
+ if (prevSessionHalBufManager && !thisSessionHalBufManager) {
mRequestBufferSM.deInit();
- } else if (!prevSessionHalBufManager && mUseHalBufManager) {
+ } else if (!prevSessionHalBufManager && thisSessionHalBufManager) {
res = mRequestBufferSM.initialize(mStatusTracker);
if (res != OK) {
SET_ERR_L("%s: Camera %s: RequestBuffer State machine couldn't be initialized!",
@@ -2576,7 +2571,7 @@
return res;
}
}
- mRequestThread->setHalBufferManager(mUseHalBufManager);
+ mRequestThread->setHalBufferManagedStreams(mHalBufManagedStreamIds);
}
// Finish all stream configuration immediately.
// TODO: Try to relax this later back to lazy completion, which should be
@@ -2904,7 +2899,8 @@
FlushInflightReqStates states {
mId, mInFlightLock, mInFlightMap, mUseHalBufManager,
- listener, *this, *mInterface, *this, mSessionStatsBuilder};
+ mHalBufManagedStreamIds, listener, *this, *mInterface, *this,
+ mSessionStatsBuilder};
camera3::flushInflightRequests(states);
}
@@ -2969,6 +2965,11 @@
return mBufferRecords.verifyBufferIds(streamId, bufIds);
}
+bool Camera3Device::HalInterface::isHalBufferManagedStream(int32_t streamId) const {
+ return (mUseHalBufManager || (flags::session_hal_buf_manager() &&
+ contains(mHalBufManagedStreamIds, streamId)));
+}
+
status_t Camera3Device::HalInterface::popInflightBuffer(
int32_t frameNumber, int32_t streamId,
/*out*/ buffer_handle_t **buffer) {
@@ -3287,8 +3288,9 @@
mDoPauseSignal.signal();
}
-void Camera3Device::RequestThread::setHalBufferManager(bool enabled) {
- mUseHalBufManager = enabled;
+void Camera3Device::RequestThread::setHalBufferManagedStreams(
+ const std::set<int32_t> &halBufferManagedStreams) {
+ mHalBufManagedStreamIds = halBufferManagedStreams;
}
status_t Camera3Device::RequestThread::waitUntilRequestProcessed(
@@ -3972,11 +3974,15 @@
nsecs_t waitDuration = kBaseGetBufferWait + parent->getExpectedInFlightDuration();
SurfaceMap uniqueSurfaceIdMap;
+ bool containsHalBufferManagedStream = false;
for (size_t j = 0; j < captureRequest->mOutputStreams.size(); j++) {
sp<Camera3OutputStreamInterface> outputStream =
captureRequest->mOutputStreams.editItemAt(j);
int streamId = outputStream->getId();
-
+ if (!containsHalBufferManagedStream) {
+ containsHalBufferManagedStream =
+ contains(mHalBufManagedStreamIds, streamId);
+ }
// Prepare video buffers for high speed recording on the first video request.
if (mPrepareVideoStream && outputStream->isVideoStream()) {
// Only try to prepare video stream on the first video request.
@@ -4008,7 +4014,7 @@
uniqueSurfaceIdMap.insert({streamId, std::move(uniqueSurfaceIds)});
}
- if (mUseHalBufManager) {
+ if (parent->isHalBufferManagedStream(streamId)) {
if (outputStream->isAbandoned()) {
ALOGV("%s: stream %d is abandoned, skipping request", __FUNCTION__, streamId);
return TIMED_OUT;
@@ -4099,6 +4105,9 @@
isZslCapture = true;
}
}
+ bool passSurfaceMap =
+ mUseHalBufManager ||
+ (flags::session_hal_buf_manager() && containsHalBufferManagedStream);
auto expectedDurationInfo = calculateExpectedDurationRange(settings);
res = parent->registerInFlight(halRequest->frame_number,
totalNumBuffers, captureRequest->mResultExtras,
@@ -4110,7 +4119,7 @@
requestedPhysicalCameras, isStillCapture, isZslCapture,
captureRequest->mRotateAndCropAuto, captureRequest->mAutoframingAuto,
mPrevCameraIdsWithZoom,
- (mUseHalBufManager) ? uniqueSurfaceIdMap :
+ passSurfaceMap ? uniqueSurfaceIdMap :
SurfaceMap{}, captureRequest->mRequestTimeNs);
ALOGVV("%s: registered in flight requestId = %" PRId32 ", frameNumber = %" PRId64
", burstId = %" PRId32 ".",
@@ -4213,7 +4222,8 @@
}
void Camera3Device::RequestThread::signalPipelineDrain(const std::vector<int>& streamIds) {
- if (!mUseHalBufManager) {
+ if (!mUseHalBufManager &&
+ (flags::session_hal_buf_manager() && mHalBufManagedStreamIds.size() == 0)) {
ALOGE("%s called for camera device not supporting HAL buffer management", __FUNCTION__);
return;
}
@@ -4365,22 +4375,28 @@
captureRequest->mInputStream->returnInputBuffer(captureRequest->mInputBuffer);
}
- // No output buffer can be returned when using HAL buffer manager
- if (!mUseHalBufManager) {
- for (size_t i = 0; i < halRequest->num_output_buffers; i++) {
- //Buffers that failed processing could still have
- //valid acquire fence.
- int acquireFence = (*outputBuffers)[i].acquire_fence;
- if (0 <= acquireFence) {
- close(acquireFence);
- outputBuffers->editItemAt(i).acquire_fence = -1;
- }
- outputBuffers->editItemAt(i).status = CAMERA_BUFFER_STATUS_ERROR;
- captureRequest->mOutputStreams.editItemAt(i)->returnBuffer((*outputBuffers)[i],
- /*timestamp*/0, /*readoutTimestamp*/0,
- /*timestampIncreasing*/true, std::vector<size_t> (),
- captureRequest->mResultExtras.frameNumber);
+ for (size_t i = 0; i < halRequest->num_output_buffers; i++) {
+ //Buffers that failed processing could still have
+ //valid acquire fence.
+ Camera3Stream *stream = Camera3Stream::cast((*outputBuffers)[i].stream);
+ int32_t streamId = stream->getId();
+ bool skipBufferForStream =
+ mUseHalBufManager || (flags::session_hal_buf_manager() &&
+ contains(mHalBufManagedStreamIds, streamId));
+ if (skipBufferForStream) {
+ // No output buffer can be returned when using HAL buffer manager for its stream
+ continue;
}
+ int acquireFence = (*outputBuffers)[i].acquire_fence;
+ if (0 <= acquireFence) {
+ close(acquireFence);
+ outputBuffers->editItemAt(i).acquire_fence = -1;
+ }
+ outputBuffers->editItemAt(i).status = CAMERA_BUFFER_STATUS_ERROR;
+ captureRequest->mOutputStreams.editItemAt(i)->returnBuffer((*outputBuffers)[i],
+ /*timestamp*/0, /*readoutTimestamp*/0,
+ /*timestampIncreasing*/true, std::vector<size_t> (),
+ captureRequest->mResultExtras.frameNumber);
}
if (sendRequestError) {
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index e32a36f..498ef55 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -97,6 +97,10 @@
return mInterface->getTransportType();
}
+ bool isHalBufferManagedStream(int32_t streamId) const {
+ return mInterface->isHalBufferManagedStream(streamId);
+ };
+
/**
* CameraDeviceBase interface
*/
@@ -476,6 +480,9 @@
/////////////////////////////////////////////////////////////////////
+ //Check if a stream is hal buffer managed
+ bool isHalBufferManagedStream(int32_t streamId) const;
+
// Get a vector of (frameNumber, streamId) pair of currently inflight
// buffers
void getInflightBufferKeys(std::vector<std::pair<int32_t, int32_t>>* out);
@@ -547,7 +554,9 @@
uint32_t mNextStreamConfigCounter = 1;
+ // TODO: This can be removed after flags::session_hal_buf_manager is removed
bool mUseHalBufManager = false;
+ std::set<int32_t > mHalBufManagedStreamIds;
bool mIsReconfigurationQuerySupported;
const bool mSupportOfflineProcessing;
@@ -948,11 +957,11 @@
void setPaused(bool paused);
/**
- * Set Hal buffer manager behavior
- * @param enabled Whether HAL buffer manager is enabled for the current session.
+ * Set Hal buffer managed streams
+ * @param halBufferManagedStreams The streams for which hal buffer manager is enabled
*
*/
- void setHalBufferManager(bool enabled);
+ void setHalBufferManagedStreams(const std::set<int32_t> &halBufferManagedStreams);
/**
* Wait until thread processes the capture request with settings'
@@ -1203,6 +1212,7 @@
std::map<int32_t, std::set<std::string>> mGroupIdPhysicalCameraMap;
bool mUseHalBufManager = false;
+ std::set<int32_t > mHalBufManagedStreamIds;
const bool mSupportCameraMute;
const bool mOverrideToPortrait;
const bool mSupportSettingsOverride;
@@ -1393,6 +1403,7 @@
// Whether HAL request buffers through requestStreamBuffers API
bool mUseHalBufManager = false;
+ std::set<int32_t > mHalBufManagedStreamIds;
bool mSessionHalBufManager = false;
// Lock to ensure requestStreamBuffers() callbacks are serialized
std::mutex mRequestBufferInterfaceLock;
diff --git a/services/camera/libcameraservice/device3/Camera3OfflineSession.cpp b/services/camera/libcameraservice/device3/Camera3OfflineSession.cpp
index 172b62a..1025061 100644
--- a/services/camera/libcameraservice/device3/Camera3OfflineSession.cpp
+++ b/services/camera/libcameraservice/device3/Camera3OfflineSession.cpp
@@ -58,6 +58,7 @@
mTagMonitor(offlineStates.mTagMonitor),
mVendorTagId(offlineStates.mVendorTagId),
mUseHalBufManager(offlineStates.mUseHalBufManager),
+ mHalBufManagedStreamIds(offlineStates.mHalBufManagedStreamIds),
mNeedFixupMonochromeTags(offlineStates.mNeedFixupMonochromeTags),
mUsePartialResult(offlineStates.mUsePartialResult),
mNumPartialResults(offlineStates.mNumPartialResults),
@@ -136,7 +137,7 @@
FlushInflightReqStates states {
mId, mOfflineReqsLock, mOfflineReqs, mUseHalBufManager,
- listener, *this, mBufferRecords, *this, mSessionStatsBuilder};
+ mHalBufManagedStreamIds, listener, *this, mBufferRecords, *this, mSessionStatsBuilder};
camera3::flushInflightRequests(states);
diff --git a/services/camera/libcameraservice/device3/Camera3OfflineSession.h b/services/camera/libcameraservice/device3/Camera3OfflineSession.h
index b5fd486..1ef3921 100644
--- a/services/camera/libcameraservice/device3/Camera3OfflineSession.h
+++ b/services/camera/libcameraservice/device3/Camera3OfflineSession.h
@@ -51,7 +51,8 @@
struct Camera3OfflineStates {
Camera3OfflineStates(
const TagMonitor& tagMonitor, const metadata_vendor_id_t vendorTagId,
- const bool useHalBufManager, const bool needFixupMonochromeTags,
+ const bool useHalBufManager, const std::set<int32_t> &halBufferManagedStreamIds,
+ const bool needFixupMonochromeTags,
const bool usePartialResult, const uint32_t numPartialResults,
const int64_t lastCompletedRegularFN, const int64_t lastCompletedReprocessFN,
const int64_t lastCompletedZslFN, const uint32_t nextResultFN,
@@ -64,7 +65,8 @@
const std::unordered_map<std::string, camera3::RotateAndCropMapper>&
rotateAndCropMappers) :
mTagMonitor(tagMonitor), mVendorTagId(vendorTagId),
- mUseHalBufManager(useHalBufManager), mNeedFixupMonochromeTags(needFixupMonochromeTags),
+ mUseHalBufManager(useHalBufManager), mHalBufManagedStreamIds(halBufferManagedStreamIds),
+ mNeedFixupMonochromeTags(needFixupMonochromeTags),
mUsePartialResult(usePartialResult), mNumPartialResults(numPartialResults),
mLastCompletedRegularFrameNumber(lastCompletedRegularFN),
mLastCompletedReprocessFrameNumber(lastCompletedReprocessFN),
@@ -85,6 +87,7 @@
const metadata_vendor_id_t mVendorTagId;
const bool mUseHalBufManager;
+ const std::set<int32_t > &mHalBufManagedStreamIds;
const bool mNeedFixupMonochromeTags;
const bool mUsePartialResult;
@@ -181,6 +184,7 @@
const metadata_vendor_id_t mVendorTagId;
const bool mUseHalBufManager;
+ const std::set<int32_t > &mHalBufManagedStreamIds;
const bool mNeedFixupMonochromeTags;
const bool mUsePartialResult;
diff --git a/services/camera/libcameraservice/device3/Camera3OutputUtils.cpp b/services/camera/libcameraservice/device3/Camera3OutputUtils.cpp
index 450f3dd..5d5c54c 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputUtils.cpp
+++ b/services/camera/libcameraservice/device3/Camera3OutputUtils.cpp
@@ -45,13 +45,17 @@
#include <camera/CameraUtils.h>
#include <camera/StringUtils.h>
#include <camera_metadata_hidden.h>
+#include <com_android_internal_camera_flags.h>
#include "device3/Camera3OutputUtils.h"
+#include "utils/SessionConfigurationUtils.h"
#include "system/camera_metadata.h"
using namespace android::camera3;
+using namespace android::camera3::SessionConfigurationUtils;
using namespace android::hardware::camera;
+namespace flags = com::android::internal::camera::flags;
namespace android {
namespace camera3 {
@@ -534,7 +538,8 @@
request.pendingOutputBuffers.size() == 0);
returnOutputBuffers(
- states.useHalBufManager, states.listener,
+ states.useHalBufManager, states.halBufManagedStreamIds,
+ states.listener,
request.pendingOutputBuffers.array(),
request.pendingOutputBuffers.size(), /*timestamp*/0, /*readoutTimestamp*/0,
/*requested*/true, request.requestTimeNs, states.sessionStatsBuilder,
@@ -794,7 +799,8 @@
result->num_output_buffers);
if (shutterTimestamp != 0) {
returnAndRemovePendingOutputBuffers(
- states.useHalBufManager, states.listener,
+ states.useHalBufManager, states.halBufManagedStreamIds,
+ states.listener,
request, states.sessionStatsBuilder);
}
@@ -845,6 +851,7 @@
void returnOutputBuffers(
bool useHalBufManager,
+ const std::set<int32_t> &halBufferManagedStreams,
sp<NotificationListener> listener,
const camera_stream_buffer_t *outputBuffers, size_t numBuffers,
nsecs_t timestamp, nsecs_t readoutTimestamp, bool requested,
@@ -871,7 +878,9 @@
}
if (outputBuffers[i].buffer == nullptr) {
- if (!useHalBufManager) {
+ if (!useHalBufManager &&
+ !(flags::session_hal_buf_manager() &&
+ contains(halBufferManagedStreams, streamId))) {
// With HAL buffer management API, HAL sometimes will have to return buffers that
// has not got a output buffer handle filled yet. This is though illegal if HAL
// buffer management API is not being used.
@@ -944,13 +953,14 @@
}
void returnAndRemovePendingOutputBuffers(bool useHalBufManager,
+ const std::set<int32_t> &halBufferManagedStreams,
sp<NotificationListener> listener, InFlightRequest& request,
SessionStatsBuilder& sessionStatsBuilder) {
bool timestampIncreasing =
!((request.zslCapture && request.stillCapture) || request.hasInputBuffer);
nsecs_t readoutTimestamp = request.resultExtras.hasReadoutTimestamp ?
request.resultExtras.readoutTimestamp : 0;
- returnOutputBuffers(useHalBufManager, listener,
+ returnOutputBuffers(useHalBufManager, halBufferManagedStreams, listener,
request.pendingOutputBuffers.array(),
request.pendingOutputBuffers.size(),
request.shutterTimestamp, readoutTimestamp,
@@ -1052,7 +1062,8 @@
r.rotateAndCropAuto, cameraIdsWithZoom, r.physicalMetadatas);
}
returnAndRemovePendingOutputBuffers(
- states.useHalBufManager, states.listener, r, states.sessionStatsBuilder);
+ states.useHalBufManager, states.halBufManagedStreamIds,
+ states.listener, r, states.sessionStatsBuilder);
removeInFlightRequestIfReadyLocked(states, idx);
}
@@ -1193,7 +1204,8 @@
for (size_t idx = 0; idx < states.inflightMap.size(); idx++) {
const InFlightRequest &request = states.inflightMap.valueAt(idx);
returnOutputBuffers(
- states.useHalBufManager, states.listener,
+ states.useHalBufManager, states.halBufManagedStreamIds,
+ states.listener,
request.pendingOutputBuffers.array(),
request.pendingOutputBuffers.size(), /*timestamp*/0, /*readoutTimestamp*/0,
/*requested*/true, request.requestTimeNs, states.sessionStatsBuilder,
diff --git a/services/camera/libcameraservice/device3/Camera3OutputUtils.h b/services/camera/libcameraservice/device3/Camera3OutputUtils.h
index 134c037..d155fa2 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputUtils.h
+++ b/services/camera/libcameraservice/device3/Camera3OutputUtils.h
@@ -48,6 +48,7 @@
// function also optionally calls notify(ERROR_BUFFER).
void returnOutputBuffers(
bool useHalBufManager,
+ const std::set<int32_t> &halBufferManagedStreams,
sp<NotificationListener> listener, // Only needed when outputSurfaces is not empty
const camera_stream_buffer_t *outputBuffers,
size_t numBuffers, nsecs_t timestamp,
@@ -65,6 +66,7 @@
// vector.
void returnAndRemovePendingOutputBuffers(
bool useHalBufManager,
+ const std::set<int32_t> &halBufferManagedStreams,
sp<NotificationListener> listener, // Only needed when outputSurfaces is not empty
InFlightRequest& request, SessionStatsBuilder& sessionStatsBuilder);
@@ -87,6 +89,7 @@
uint32_t& nextReprocResultFrameNum;
uint32_t& nextZslResultFrameNum; // end of outputLock scope
const bool useHalBufManager;
+ const std::set<int32_t > &halBufManagedStreamIds;
const bool usePartialResult;
const bool needFixupMonoChrome;
const uint32_t numPartialResults;
@@ -118,6 +121,7 @@
const std::string& cameraId;
std::mutex& reqBufferLock; // lock to serialize request buffer calls
const bool useHalBufManager;
+ const std::set<int32_t > &halBufManagedStreamIds;
StreamSet& outputStreams;
SessionStatsBuilder& sessionStatsBuilder;
SetErrorInterface& setErrIntf;
@@ -128,6 +132,7 @@
struct ReturnBufferStates {
const std::string& cameraId;
const bool useHalBufManager;
+ const std::set<int32_t > &halBufManagedStreamIds;
StreamSet& outputStreams;
SessionStatsBuilder& sessionStatsBuilder;
BufferRecordsInterface& bufferRecordsIntf;
@@ -138,6 +143,7 @@
std::mutex& inflightLock;
InFlightRequestMap& inflightMap; // end of inflightLock scope
const bool useHalBufManager;
+ const std::set<int32_t > &halBufManagedStreamIds;
sp<NotificationListener> listener;
InflightRequestUpdateInterface& inflightIntf;
BufferRecordsInterface& bufferRecordsIntf;
diff --git a/services/camera/libcameraservice/device3/Camera3OutputUtilsTemplated.h b/services/camera/libcameraservice/device3/Camera3OutputUtilsTemplated.h
index 3ac666b..2c30b15 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputUtilsTemplated.h
+++ b/services/camera/libcameraservice/device3/Camera3OutputUtilsTemplated.h
@@ -32,13 +32,17 @@
#include <camera/CameraUtils.h>
#include <camera_metadata_hidden.h>
+#include <com_android_internal_camera_flags.h>
#include "device3/Camera3OutputUtils.h"
+#include "utils/SessionConfigurationUtils.h"
#include "system/camera_metadata.h"
using namespace android::camera3;
+using namespace android::camera3::SessionConfigurationUtils;
using namespace android::hardware::camera;
+namespace flags = com::android::internal::camera::flags;
namespace android {
namespace camera3 {
@@ -207,7 +211,9 @@
bool noBufferReturned = false;
buffer_handle_t *buffer = nullptr;
- if (states.useHalBufManager) {
+ if (states.useHalBufManager ||
+ (flags::session_hal_buf_manager() &&
+ contains(states.halBufManagedStreamIds, bSrc.streamId))) {
// This is suspicious most of the time but can be correct during flush where HAL
// has to return capture result before a buffer is requested
if (bSrc.bufferId == BUFFER_ID_NO_BUFFER) {
@@ -294,13 +300,15 @@
template <class VecStreamBufferType>
void returnStreamBuffersT(ReturnBufferStates& states,
const VecStreamBufferType& buffers) {
- if (!states.useHalBufManager) {
- ALOGE("%s: Camera %s does not support HAL buffer managerment",
- __FUNCTION__, states.cameraId.c_str());
- return;
- }
for (const auto& buf : buffers) {
+ if (!states.useHalBufManager &&
+ !(flags::session_hal_buf_manager() &&
+ contains(states.halBufManagedStreamIds, buf.streamId))) {
+ ALOGE("%s: Camera %s does not support HAL buffer management for stream id %d",
+ __FUNCTION__, states.cameraId.c_str(), buf.streamId);
+ return;
+ }
if (buf.bufferId == BUFFER_ID_NO_BUFFER) {
ALOGE("%s: cannot return a buffer without bufferId", __FUNCTION__);
continue;
@@ -337,9 +345,10 @@
continue;
}
streamBuffer.stream = stream->asHalStream();
- returnOutputBuffers(states.useHalBufManager, /*listener*/nullptr,
- &streamBuffer, /*size*/1, /*timestamp*/ 0, /*readoutTimestamp*/0,
- /*requested*/false, /*requestTimeNs*/0, states.sessionStatsBuilder);
+ returnOutputBuffers(states.useHalBufManager, states.halBufManagedStreamIds,
+ /*listener*/nullptr, &streamBuffer, /*size*/1, /*timestamp*/ 0,
+ /*readoutTimestamp*/0, /*requested*/false, /*requestTimeNs*/0,
+ states.sessionStatsBuilder);
}
}
diff --git a/services/camera/libcameraservice/device3/InFlightRequest.h b/services/camera/libcameraservice/device3/InFlightRequest.h
index a7bd312..3626f20 100644
--- a/services/camera/libcameraservice/device3/InFlightRequest.h
+++ b/services/camera/libcameraservice/device3/InFlightRequest.h
@@ -35,6 +35,7 @@
uint32_t operation_mode;
bool input_is_multi_resolution;
bool use_hal_buf_manager = false;
+ std::set<int32_t> hal_buffer_managed_streams;
} camera_stream_configuration_t;
typedef struct camera_capture_request {
diff --git a/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.cpp b/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.cpp
index 97475f0..d3b874d 100644
--- a/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.cpp
+++ b/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.cpp
@@ -59,6 +59,7 @@
#include <com_android_internal_camera_flags.h>
#include "utils/CameraTraces.h"
+#include "utils/SessionConfigurationUtils.h"
#include "mediautils/SchedulingPolicyService.h"
#include "device3/Camera3OutputStream.h"
#include "device3/Camera3InputStream.h"
@@ -79,6 +80,7 @@
#include "AidlCamera3Device.h"
using namespace android::camera3;
+using namespace android::camera3::SessionConfigurationUtils;
using namespace aidl::android::hardware;
using aidl::android::hardware::camera::metadata::SensorPixelMode;
using aidl::android::hardware::camera::metadata::RequestAvailableDynamicRangeProfilesMap;
@@ -400,7 +402,7 @@
mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
mNextResultFrameNumber,
mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
- mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
+ mUseHalBufManager, mHalBufManagedStreamIds, mUsePartialResult, mNeedFixupMonochromeTags,
mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this,
@@ -442,7 +444,7 @@
mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
mNextResultFrameNumber,
mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
- mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
+ mUseHalBufManager, mHalBufManagedStreamIds, mUsePartialResult, mNeedFixupMonochromeTags,
mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this,
@@ -531,7 +533,7 @@
}
// When not using HAL buf manager, only allow streams requested by app to be preserved
- if (!mUseHalBufManager) {
+ if (!isHalBufferManagedStream(id)) {
if (std::find(streamsToKeep.begin(), streamsToKeep.end(), id) == streamsToKeep.end()) {
SET_ERR("stream ID %d must not be switched to offline!", id);
return UNKNOWN_ERROR;
@@ -611,14 +613,14 @@
// TODO: check if we need to lock before copying states
// though technically no other thread should be talking to Camera3Device at this point
Camera3OfflineStates offlineStates(
- mTagMonitor, mVendorTagId, mUseHalBufManager, mNeedFixupMonochromeTags,
- mUsePartialResult, mNumPartialResults, mLastCompletedRegularFrameNumber,
- mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber,
- mNextResultFrameNumber, mNextReprocessResultFrameNumber,
- mNextZslStillResultFrameNumber, mNextShutterFrameNumber,
- mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
- mDeviceInfo, mPhysicalDeviceInfoMap, mDistortionMappers,
- mZoomRatioMappers, mRotateAndCropMappers);
+ mTagMonitor, mVendorTagId, mUseHalBufManager, mHalBufManagedStreamIds,
+ mNeedFixupMonochromeTags, mUsePartialResult, mNumPartialResults,
+ mLastCompletedRegularFrameNumber, mLastCompletedReprocessFrameNumber,
+ mLastCompletedZslFrameNumber, mNextResultFrameNumber,
+ mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
+ mNextShutterFrameNumber, mNextReprocessShutterFrameNumber,
+ mNextZslStillShutterFrameNumber, mDeviceInfo, mPhysicalDeviceInfoMap,
+ mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers);
*session = new AidlCamera3OfflineSession(mId, inputStream, offlineStreamSet,
std::move(bufferRecords), offlineReqs, offlineStates, offlineSession);
@@ -688,8 +690,8 @@
aidl::android::hardware::camera::device::BufferRequestStatus* status) {
RequestBufferStates states {
- mId, mRequestBufferInterfaceLock, mUseHalBufManager, mOutputStreams,
- mSessionStatsBuilder, *this, *(mInterface), *this};
+ mId, mRequestBufferInterfaceLock, mUseHalBufManager, mHalBufManagedStreamIds,
+ mOutputStreams, mSessionStatsBuilder, *this, *(mInterface), *this};
camera3::requestStreamBuffers(states, bufReqs, outBuffers, status);
return ::ndk::ScopedAStatus::ok();
}
@@ -713,7 +715,7 @@
::ndk::ScopedAStatus AidlCamera3Device::returnStreamBuffers(
const std::vector<camera::device::StreamBuffer>& buffers) {
ReturnBufferStates states {
- mId, mUseHalBufManager, mOutputStreams, mSessionStatsBuilder,
+ mId, mUseHalBufManager, mHalBufManagedStreamIds, mOutputStreams, mSessionStatsBuilder,
*(mInterface)};
camera3::returnStreamBuffers(states, buffers);
return ::ndk::ScopedAStatus::ok();
@@ -900,11 +902,18 @@
std::set<int> activeStreams;
camera::device::StreamConfiguration requestedConfiguration;
requestedConfiguration.streams.resize(config->num_streams);
+ config->use_hal_buf_manager = mUseHalBufManager;
for (size_t i = 0; i < config->num_streams; i++) {
camera::device::Stream &dst = requestedConfiguration.streams[i];
camera3::camera_stream_t *src = config->streams[i];
Camera3Stream* cam3stream = Camera3Stream::cast(src);
+ // For stream configurations with multi res streams, hal buffer manager has to be used.
+ if (!flags::session_hal_buf_manager() && cam3stream->getHalStreamGroupId() != -1 &&
+ src->stream_type != CAMERA_STREAM_INPUT) {
+ mUseHalBufManager = true;
+ config->use_hal_buf_manager = true;
+ }
cam3stream->setBufferFreedListener(this);
int streamId = cam3stream->getId();
StreamType streamType;
@@ -975,31 +984,38 @@
requestedConfiguration.multiResolutionInputImage = config->input_is_multi_resolution;
requestedConfiguration.logId = logId;
ndk::ScopedAStatus err = ndk::ScopedAStatus::ok();
+ int32_t interfaceVersion = 0;
camera::device::ConfigureStreamsRet configureStreamsRet;
- if (flags::session_hal_buf_manager()) {
- int32_t interfaceVersion = 0;
- err = mAidlSession->getInterfaceVersion(&interfaceVersion);
- if (!err.isOk()) {
- ALOGE("%s: Transaction error getting interface version: %s", __FUNCTION__,
- err.getMessage());
- return AidlProviderInfo::mapToStatusT(err);
- }
- if (interfaceVersion >= AIDL_DEVICE_SESSION_V3 && mSupportSessionHalBufManager) {
- err = mAidlSession->configureStreamsV2(requestedConfiguration, &configureStreamsRet);
- finalConfiguration = std::move(configureStreamsRet.halStreams);
- } else {
- err = mAidlSession->configureStreams(requestedConfiguration, &finalConfiguration);
- }
+ err = mAidlSession->getInterfaceVersion(&interfaceVersion);
+ if (!err.isOk()) {
+ ALOGE("%s: Transaction error getting interface version: %s", __FUNCTION__,
+ err.getMessage());
+ return AidlProviderInfo::mapToStatusT(err);
+ }
+ if (flags::session_hal_buf_manager() && interfaceVersion >= AIDL_DEVICE_SESSION_V3
+ && mSupportSessionHalBufManager) {
+ err = mAidlSession->configureStreamsV2(requestedConfiguration, &configureStreamsRet);
+ finalConfiguration = std::move(configureStreamsRet.halStreams);
} else {
err = mAidlSession->configureStreams(requestedConfiguration, &finalConfiguration);
}
+
if (!err.isOk()) {
ALOGE("%s: Transaction error: %s", __FUNCTION__, err.getMessage());
return AidlProviderInfo::mapToStatusT(err);
}
- if (flags::session_hal_buf_manager() && mSupportSessionHalBufManager) {
- mUseHalBufManager = configureStreamsRet.enableHalBufferManager;
- config->use_hal_buf_manager = configureStreamsRet.enableHalBufferManager;
+
+ if (flags::session_hal_buf_manager()) {
+ std::set<int32_t> halBufferManagedStreamIds;
+ for (const auto &halStream: finalConfiguration) {
+ if ((interfaceVersion >= AIDL_DEVICE_SESSION_V3 &&
+ mSupportSessionHalBufManager && halStream.enableHalBufferManager)
+ || mUseHalBufManager) {
+ halBufferManagedStreamIds.insert(halStream.id);
+ }
+ }
+ mHalBufManagedStreamIds = std::move(halBufferManagedStreamIds);
+ config->hal_buffer_managed_streams = mHalBufManagedStreamIds;
}
// And convert output stream configuration from AIDL
for (size_t i = 0; i < config->num_streams; i++) {
@@ -1070,9 +1086,9 @@
}
dstStream->setUsage(
mapProducerToFrameworkUsage(src.producerUsage));
-
if (flags::session_hal_buf_manager()) {
- dstStream->setHalBufferManager(mUseHalBufManager);
+ dstStream->setHalBufferManager(
+ contains(config->hal_buffer_managed_streams, streamId));
}
}
dst->max_buffers = src.maxBuffers;
@@ -1396,7 +1412,7 @@
handlesCreated->push_back(acquireFence);
}
dst.acquireFence = camera3::dupToAidlIfNotNull(acquireFence);
- } else if (mUseHalBufManager) {
+ } else if (isHalBufferManagedStream(streamId)) {
// HAL buffer management path
dst.bufferId = BUFFER_ID_NO_BUFFER;
dst.buffer = aidl::android::hardware::common::NativeHandle();
@@ -1410,7 +1426,7 @@
dst.releaseFence = aidl::android::hardware::common::NativeHandle();
// Output buffers are empty when using HAL buffer manager
- if (!mUseHalBufManager) {
+ if (!isHalBufferManagedStream(streamId)) {
mBufferRecords.pushInflightBuffer(
captureRequest->frameNumber, streamId, src->buffer);
inflightBuffers->push_back(std::make_pair(captureRequest->frameNumber, streamId));
@@ -1456,8 +1472,9 @@
bool supportCameraMute,
bool overrideToPortrait,
bool supportSettingsOverride) :
- RequestThread(parent, statusTracker, interface, sessionParamKeys, useHalBufManager,
- supportCameraMute, overrideToPortrait, supportSettingsOverride) {}
+ RequestThread(parent, statusTracker, interface, sessionParamKeys,
+ useHalBufManager, supportCameraMute, overrideToPortrait,
+ supportSettingsOverride) {}
status_t AidlCamera3Device::AidlRequestThread::switchToOffline(
const std::vector<int32_t>& streamsToKeep,
@@ -1690,7 +1707,8 @@
bool overrideToPortrait,
bool supportSettingsOverride) {
return new AidlRequestThread(parent, statusTracker, interface, sessionParamKeys,
- useHalBufManager, supportCameraMute, overrideToPortrait, supportSettingsOverride);
+ useHalBufManager, supportCameraMute, overrideToPortrait,
+ supportSettingsOverride);
};
sp<Camera3Device::Camera3DeviceInjectionMethods>
diff --git a/services/camera/libcameraservice/device3/aidl/AidlCamera3OfflineSession.cpp b/services/camera/libcameraservice/device3/aidl/AidlCamera3OfflineSession.cpp
index 01c4e88..b55e0da 100644
--- a/services/camera/libcameraservice/device3/aidl/AidlCamera3OfflineSession.cpp
+++ b/services/camera/libcameraservice/device3/aidl/AidlCamera3OfflineSession.cpp
@@ -122,7 +122,7 @@
mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
mNextResultFrameNumber,
mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
- mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
+ mUseHalBufManager, mHalBufManagedStreamIds, mUsePartialResult, mNeedFixupMonochromeTags,
mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this,
@@ -169,7 +169,7 @@
mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
mNextResultFrameNumber,
mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
- mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
+ mUseHalBufManager, mHalBufManagedStreamIds, mUsePartialResult, mNeedFixupMonochromeTags,
mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this,
@@ -208,7 +208,8 @@
}
RequestBufferStates states {
- mId, mRequestBufferInterfaceLock, mUseHalBufManager, mOutputStreams, mSessionStatsBuilder,
+ mId, mRequestBufferInterfaceLock, mUseHalBufManager,
+ mHalBufManagedStreamIds, mOutputStreams, mSessionStatsBuilder,
*this, mBufferRecords, *this};
camera3::requestStreamBuffers(states, bufReqs, buffers, status);
return ::ndk::ScopedAStatus::ok();
@@ -241,7 +242,7 @@
}
ReturnBufferStates states {
- mId, mUseHalBufManager, mOutputStreams, mSessionStatsBuilder,
+ mId, mUseHalBufManager, mHalBufManagedStreamIds, mOutputStreams, mSessionStatsBuilder,
mBufferRecords};
camera3::returnStreamBuffers(states, buffers);
diff --git a/services/camera/libcameraservice/device3/aidl/AidlCamera3OutputUtils.cpp b/services/camera/libcameraservice/device3/aidl/AidlCamera3OutputUtils.cpp
index 74d4230..6be9e70 100644
--- a/services/camera/libcameraservice/device3/aidl/AidlCamera3OutputUtils.cpp
+++ b/services/camera/libcameraservice/device3/aidl/AidlCamera3OutputUtils.cpp
@@ -143,12 +143,6 @@
std::lock_guard<std::mutex> lock(states.reqBufferLock);
std::vector<StreamBufferRet> bufRets;
outBuffers->clear();
- if (!states.useHalBufManager) {
- ALOGE("%s: Camera %s does not support HAL buffer management",
- __FUNCTION__, states.cameraId.c_str());
- *status = BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS;
- return;
- }
SortedVector<int32_t> streamIds;
ssize_t sz = streamIds.setCapacity(bufReqs.size());
@@ -174,6 +168,13 @@
*status = BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS;
return;
}
+ if (!states.useHalBufManager &&
+ !contains(states.halBufManagedStreamIds, bufReq.streamId)) {
+ ALOGE("%s: Camera %s does not support HAL buffer management for stream id %d",
+ __FUNCTION__, states.cameraId.c_str(), bufReq.streamId);
+ *status = BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS;
+ return;
+ }
streamIds.add(bufReq.streamId);
}
@@ -316,7 +317,7 @@
sb.acquire_fence = -1;
sb.status = CAMERA_BUFFER_STATUS_ERROR;
}
- returnOutputBuffers(states.useHalBufManager, nullptr,
+ returnOutputBuffers(states.useHalBufManager,states.halBufManagedStreamIds, nullptr,
streamBuffers.data(), numAllocatedBuffers, 0,
0, false,
0, states.sessionStatsBuilder);
diff --git a/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.cpp b/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.cpp
index 4488067..f2e618f 100644
--- a/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.cpp
+++ b/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.cpp
@@ -47,6 +47,7 @@
#include <utils/Timers.h>
#include <cutils/properties.h>
#include <camera/StringUtils.h>
+#include <com_android_internal_camera_flags.h>
#include <android/hardware/camera/device/3.7/ICameraInjectionSession.h>
#include <android/hardware/camera2/ICameraDeviceUser.h>
@@ -66,6 +67,7 @@
using namespace android::hardware::camera;
using namespace android::hardware::camera::device::V3_2;
using android::hardware::camera::metadata::V3_6::CameraMetadataEnumAndroidSensorPixelMode;
+namespace flags = com::android::internal::camera::flags;
namespace android {
@@ -307,7 +309,8 @@
const hardware::hidl_vec<hardware::camera::device::V3_5::BufferRequest>& bufReqs,
requestStreamBuffers_cb _hidl_cb) {
RequestBufferStates states {
- mId, mRequestBufferInterfaceLock, mUseHalBufManager, mOutputStreams, mSessionStatsBuilder,
+ mId, mRequestBufferInterfaceLock, mUseHalBufManager, mHalBufManagedStreamIds,
+ mOutputStreams, mSessionStatsBuilder,
*this, *mInterface, *this};
camera3::requestStreamBuffers(states, bufReqs, _hidl_cb);
return hardware::Void();
@@ -316,7 +319,8 @@
hardware::Return<void> HidlCamera3Device::returnStreamBuffers(
const hardware::hidl_vec<hardware::camera::device::V3_2::StreamBuffer>& buffers) {
ReturnBufferStates states {
- mId, mUseHalBufManager, mOutputStreams, mSessionStatsBuilder, *mInterface};
+ mId, mUseHalBufManager, mHalBufManagedStreamIds, mOutputStreams,
+ mSessionStatsBuilder, *mInterface};
camera3::returnStreamBuffers(states, buffers);
return hardware::Void();
}
@@ -362,7 +366,7 @@
mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
mNextResultFrameNumber,
mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
- mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
+ mUseHalBufManager, mHalBufManagedStreamIds, mUsePartialResult, mNeedFixupMonochromeTags,
mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this, *this,
@@ -425,7 +429,7 @@
mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
mNextResultFrameNumber,
mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
- mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
+ mUseHalBufManager, mHalBufManagedStreamIds, mUsePartialResult, mNeedFixupMonochromeTags,
mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this, *this,
@@ -473,7 +477,7 @@
mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
mNextResultFrameNumber,
mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
- mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
+ mUseHalBufManager, mHalBufManagedStreamIds, mUsePartialResult, mNeedFixupMonochromeTags,
mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this, *this,
@@ -641,14 +645,14 @@
// TODO: check if we need to lock before copying states
// though technically no other thread should be talking to Camera3Device at this point
Camera3OfflineStates offlineStates(
- mTagMonitor, mVendorTagId, mUseHalBufManager, mNeedFixupMonochromeTags,
- mUsePartialResult, mNumPartialResults, mLastCompletedRegularFrameNumber,
- mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber,
- mNextResultFrameNumber, mNextReprocessResultFrameNumber,
- mNextZslStillResultFrameNumber, mNextShutterFrameNumber,
- mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
- mDeviceInfo, mPhysicalDeviceInfoMap, mDistortionMappers,
- mZoomRatioMappers, mRotateAndCropMappers);
+ mTagMonitor, mVendorTagId, mUseHalBufManager, mHalBufManagedStreamIds,
+ mNeedFixupMonochromeTags, mUsePartialResult, mNumPartialResults,
+ mLastCompletedRegularFrameNumber, mLastCompletedReprocessFrameNumber,
+ mLastCompletedZslFrameNumber, mNextResultFrameNumber,
+ mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
+ mNextShutterFrameNumber, mNextReprocessShutterFrameNumber,
+ mNextZslStillShutterFrameNumber, mDeviceInfo, mPhysicalDeviceInfoMap,
+ mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers);
*session = new HidlCamera3OfflineSession(mId, inputStream, offlineStreamSet,
std::move(bufferRecords), offlineReqs, offlineStates, offlineSession);
@@ -716,7 +720,8 @@
bool overrideToPortrait,
bool supportSettingsOverride) {
return new HidlRequestThread(parent, statusTracker, interface, sessionParamKeys,
- useHalBufManager, supportCameraMute, overrideToPortrait, supportSettingsOverride);
+ useHalBufManager, supportCameraMute, overrideToPortrait,
+ supportSettingsOverride);
};
sp<Camera3Device::Camera3DeviceInjectionMethods>
@@ -909,6 +914,7 @@
requestedConfiguration3_2.streams.resize(config->num_streams);
requestedConfiguration3_4.streams.resize(config->num_streams);
requestedConfiguration3_7.streams.resize(config->num_streams);
+ mHalBufManagedStreamIds.clear();
for (size_t i = 0; i < config->num_streams; i++) {
device::V3_2::Stream &dst3_2 = requestedConfiguration3_2.streams[i];
device::V3_4::Stream &dst3_4 = requestedConfiguration3_4.streams[i];
@@ -922,6 +928,9 @@
switch (src->stream_type) {
case CAMERA_STREAM_OUTPUT:
streamType = StreamType::OUTPUT;
+ if (flags::session_hal_buf_manager() && mUseHalBufManager) {
+ mHalBufManagedStreamIds.insert(streamId);
+ }
break;
case CAMERA_STREAM_INPUT:
streamType = StreamType::INPUT;
@@ -931,6 +940,7 @@
__FUNCTION__, streamId, config->streams[i]->stream_type);
return BAD_VALUE;
}
+
dst3_2.id = streamId;
dst3_2.streamType = streamType;
dst3_2.width = src->width;
diff --git a/services/camera/libcameraservice/device3/hidl/HidlCamera3OfflineSession.cpp b/services/camera/libcameraservice/device3/hidl/HidlCamera3OfflineSession.cpp
index e328ef6..aa4b762 100644
--- a/services/camera/libcameraservice/device3/hidl/HidlCamera3OfflineSession.cpp
+++ b/services/camera/libcameraservice/device3/hidl/HidlCamera3OfflineSession.cpp
@@ -103,7 +103,7 @@
mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
mNextResultFrameNumber,
mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
- mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
+ mUseHalBufManager, mHalBufManagedStreamIds, mUsePartialResult, mNeedFixupMonochromeTags,
mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this, *this,
@@ -145,7 +145,7 @@
mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
mNextResultFrameNumber,
mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
- mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
+ mUseHalBufManager, mHalBufManagedStreamIds, mUsePartialResult, mNeedFixupMonochromeTags,
mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this, *this,
@@ -182,7 +182,7 @@
mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
mNextResultFrameNumber,
mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
- mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
+ mUseHalBufManager, mHalBufManagedStreamIds, mUsePartialResult, mNeedFixupMonochromeTags,
mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this, *this,
@@ -207,7 +207,8 @@
}
RequestBufferStates states {
- mId, mRequestBufferInterfaceLock, mUseHalBufManager, mOutputStreams, mSessionStatsBuilder,
+ mId, mRequestBufferInterfaceLock, mUseHalBufManager,mHalBufManagedStreamIds,
+ mOutputStreams, mSessionStatsBuilder,
*this, mBufferRecords, *this};
camera3::requestStreamBuffers(states, bufReqs, _hidl_cb);
return hardware::Void();
@@ -224,7 +225,8 @@
}
ReturnBufferStates states {
- mId, mUseHalBufManager, mOutputStreams, mSessionStatsBuilder, mBufferRecords};
+ mId, mUseHalBufManager, mHalBufManagedStreamIds, mOutputStreams, mSessionStatsBuilder,
+ mBufferRecords};
camera3::returnStreamBuffers(states, buffers);
return hardware::Void();
diff --git a/services/camera/libcameraservice/utils/SessionConfigurationUtils.h b/services/camera/libcameraservice/utils/SessionConfigurationUtils.h
index 5b2ea5c..0545cea 100644
--- a/services/camera/libcameraservice/utils/SessionConfigurationUtils.h
+++ b/services/camera/libcameraservice/utils/SessionConfigurationUtils.h
@@ -179,6 +179,10 @@
void filterParameters(const CameraMetadata& src, const CameraMetadata& deviceInfo,
metadata_vendor_id_t vendorTagId, CameraMetadata& dst);
+template <typename T> bool contains(std::set<T> container, T value) {
+ return container.find(value) != container.end();
+}
+
constexpr int32_t MAX_SURFACES_PER_STREAM = 4;
constexpr int32_t ROUNDING_WIDTH_CAP = 1920;