Camera: Add support for stream combination query
Camera devices 3.5 and later can optionally support
stream combination queries. These use the regular
'StreamConfiguration' structure however in contrast
to normal stream configuration, the query will be
much faster and will not cause any HW/SW side effects.
Additionally it will be possible to run stream
combination queries at any time after the camera
device is open.
Implement stream combination query for the external
camera provider.
Bug: 111593096
Test: vts-tradefed run commandAndExit vts --skip-all-system-status-check
--skip-preconditions --module VtsHalCameraProviderV2_4Target -l INFO
Change-Id: I59ec936d17dabc89ba49407a750df1cd2e61b145
diff --git a/camera/device/3.4/default/ExternalCameraDeviceSession.cpp b/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
index 4ef5fc9..66b17db 100644
--- a/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
+++ b/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
@@ -2163,7 +2163,8 @@
}
}
-bool ExternalCameraDeviceSession::isSupported(const Stream& stream) {
+bool ExternalCameraDeviceSession::isSupported(const Stream& stream,
+ const std::vector<SupportedV4L2Format>& supportedFormats) {
int32_t ds = static_cast<int32_t>(stream.dataSpace);
PixelFormat fmt = stream.format;
uint32_t width = stream.width;
@@ -2206,7 +2207,7 @@
// Assume we can convert any V4L2 format to any of supported output format for now, i.e,
// ignoring v4l2Fmt.fourcc for now. Might need more subtle check if we support more v4l format
// in the futrue.
- for (const auto& v4l2Fmt : mSupportedFormats) {
+ for (const auto& v4l2Fmt : supportedFormats) {
if (width == v4l2Fmt.width && height == v4l2Fmt.height) {
return true;
}
@@ -2541,11 +2542,9 @@
mV4L2BufferReturned.notify_one();
}
-Status ExternalCameraDeviceSession::configureStreams(
+Status ExternalCameraDeviceSession::isStreamCombinationSupported(
const V3_2::StreamConfiguration& config,
- V3_3::HalStreamConfiguration* out,
- uint32_t blobBufferSize) {
- ATRACE_CALL();
+ const std::vector<SupportedV4L2Format>& supportedFormats) {
if (config.operationMode != StreamConfigurationMode::NORMAL_MODE) {
ALOGE("%s: unsupported operation mode: %d", __FUNCTION__, config.operationMode);
return Status::ILLEGAL_ARGUMENT;
@@ -2560,7 +2559,7 @@
int numStallStream = 0;
for (const auto& stream : config.streams) {
// Check if the format/width/height combo is supported
- if (!isSupported(stream)) {
+ if (!isSupported(stream, supportedFormats)) {
return Status::ILLEGAL_ARGUMENT;
}
if (stream.format == PixelFormat::BLOB) {
@@ -2582,7 +2581,21 @@
return Status::ILLEGAL_ARGUMENT;
}
- Status status = initStatus();
+ return Status::OK;
+}
+
+Status ExternalCameraDeviceSession::configureStreams(
+ const V3_2::StreamConfiguration& config,
+ V3_3::HalStreamConfiguration* out,
+ uint32_t blobBufferSize) {
+ ATRACE_CALL();
+
+ Status status = isStreamCombinationSupported(config, mSupportedFormats);
+ if (status != Status::OK) {
+ return status;
+ }
+
+ status = initStatus();
if (status != Status::OK) {
return status;
}