cameraservice: Pipe session identifier to the Camera HAL
For data analysis from HAL logs, it is helpful to get some higher level
information of the camera usage (such as the client's package name).
HALs are denied access to this higher level information at runtime.
To help data with data analysis, cameraservice will now pass a session
identifier when configuring streams. This identifier can be used to
correlate HAL logs with cameraservice logs at the time of log
consumption, but not at runtime. This identifier has no functional
purpose and is randomly generated, so does not contain any identifying
information about the high level client.
Bug: 271171714
Test: Manually verified that cameraservice passes the session identifier
to the camera HAL.
Change-Id: Id980b11f9062369e5bca354a5113d6b5040de8be
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index fc35e56..37a2c39 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -2451,8 +2451,9 @@
// max_buffers, usage, and priv fields, as well as data_space and format
// fields for IMPLEMENTATION_DEFINED formats.
+ int64_t logId = mCameraServiceProxyWrapper->getCurrentLogIdForCamera(mId);
const camera_metadata_t *sessionBuffer = sessionParams.getAndLock();
- res = mInterface->configureStreams(sessionBuffer, &config, bufferSizes);
+ res = mInterface->configureStreams(sessionBuffer, &config, bufferSizes, logId);
sessionParams.unlock(sessionBuffer);
if (res == BAD_VALUE) {
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index 6985514..6b98d9f 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -411,7 +411,7 @@
virtual status_t configureStreams(const camera_metadata_t * sessionParams,
/*inout*/ camera_stream_configuration_t * config,
- const std::vector<uint32_t>& bufferSizes) = 0;
+ const std::vector<uint32_t>& bufferSizes, int64_t logId) = 0;
// The injection camera configures the streams to hal.
virtual status_t configureInjectedStreams(
diff --git a/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.cpp b/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.cpp
index 30f6d18..610bffb 100644
--- a/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.cpp
+++ b/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.cpp
@@ -874,8 +874,9 @@
}
status_t AidlCamera3Device::AidlHalInterface::configureStreams(
- const camera_metadata_t *sessionParams,
- camera_stream_configuration *config, const std::vector<uint32_t>& bufferSizes) {
+ const camera_metadata_t *sessionParams,
+ camera_stream_configuration *config, const std::vector<uint32_t>& bufferSizes,
+ int64_t logId) {
using camera::device::StreamType;
using camera::device::StreamConfigurationMode;
@@ -960,6 +961,7 @@
requestedConfiguration.streamConfigCounter = mNextStreamConfigCounter++;
requestedConfiguration.multiResolutionInputImage = config->input_is_multi_resolution;
+ requestedConfiguration.logId = logId;
auto err = mAidlSession->configureStreams(requestedConfiguration, &finalConfiguration);
if (!err.isOk()) {
ALOGE("%s: Transaction error: %s", __FUNCTION__, err.getMessage());
diff --git a/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.h b/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.h
index e61f8f7..8ee5c63 100644
--- a/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.h
+++ b/services/camera/libcameraservice/device3/aidl/AidlCamera3Device.h
@@ -101,7 +101,9 @@
virtual status_t configureStreams(const camera_metadata_t *sessionParams,
/*inout*/ camera_stream_configuration_t *config,
- const std::vector<uint32_t>& bufferSizes) override;
+ const std::vector<uint32_t>& bufferSizes,
+ int64_t logId) override;
+
// The injection camera configures the streams to hal.
virtual status_t configureInjectedStreams(
const camera_metadata_t* sessionParams,
diff --git a/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.cpp b/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.cpp
index 382b287..42ff7ca 100644
--- a/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.cpp
+++ b/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.cpp
@@ -880,7 +880,8 @@
status_t HidlCamera3Device::HidlHalInterface::configureStreams(
const camera_metadata_t *sessionParams,
- camera_stream_configuration *config, const std::vector<uint32_t>& bufferSizes) {
+ camera_stream_configuration *config, const std::vector<uint32_t>& bufferSizes,
+ int64_t /*logId*/) {
ATRACE_NAME("CameraHal::configureStreams");
if (!valid()) return INVALID_OPERATION;
status_t res = OK;
diff --git a/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.h b/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.h
index 15bd5ba..7b216b2 100644
--- a/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.h
+++ b/services/camera/libcameraservice/device3/hidl/HidlCamera3Device.h
@@ -110,7 +110,8 @@
virtual status_t configureStreams(const camera_metadata_t *sessionParams,
/*inout*/ camera_stream_configuration_t *config,
- const std::vector<uint32_t>& bufferSizes) override;
+ const std::vector<uint32_t>& bufferSizes,
+ int64_t logId) override;
// The injection camera configures the streams to hal.
virtual status_t configureInjectedStreams(
diff --git a/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp b/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp
index 1b80de2..4225366 100644
--- a/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp
+++ b/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.cpp
@@ -101,6 +101,11 @@
mSessionStats.mStreamStats.clear();
}
+int64_t CameraServiceProxyWrapper::CameraSessionStatsWrapper::getLogId() {
+ Mutex::Autolock l(mLock);
+ return mSessionStats.mLogId;
+}
+
/**
* CameraServiceProxyWrapper functions
*/
@@ -303,6 +308,21 @@
return ret;
}
+int64_t CameraServiceProxyWrapper::getCurrentLogIdForCamera(const String8& cameraId) {
+ std::shared_ptr<CameraSessionStatsWrapper> stats;
+ {
+ Mutex::Autolock _l(mLock);
+ if (mSessionStatsMap.count(cameraId) == 0) {
+ ALOGE("%s: SessionStatsMap should contain camera %s before asking for its logging ID.",
+ __FUNCTION__, cameraId.c_str());
+ return 0;
+ }
+
+ stats = mSessionStatsMap[cameraId];
+ }
+ return stats->getLogId();
+}
+
int64_t CameraServiceProxyWrapper::generateLogId(std::random_device& randomDevice) {
int64_t ret = 0;
do {
diff --git a/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.h b/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.h
index 2868e26..d47c738 100644
--- a/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.h
+++ b/services/camera/libcameraservice/utils/CameraServiceProxyWrapper.h
@@ -64,6 +64,9 @@
int64_t requestCount, int64_t resultErrorCount, bool deviceError,
const std::string& userTag, int32_t videoStabilizationMode,
const std::vector<hardware::CameraStreamStats>& streamStats);
+
+ // Returns the logId associated with this event.
+ int64_t getLogId();
};
// Lock for camera session stats map
@@ -119,6 +122,11 @@
// Detect if the camera is disabled by device policy.
bool isCameraDisabled(int userId);
+
+ // Returns the logId currently associated with the given cameraId. See 'mLogId' in
+ // frameworks/av/camera/include/camera/CameraSessionStats.h for more details about this
+ // identifier. Returns a non-0 value on success.
+ int64_t getCurrentLogIdForCamera(const String8& cameraId);
};
} // android