Implement session param injection in CameraService
- This allows injecting session params into existing camera clients.
- The injection is cleared upon the camera closing, and we do not keep
state from one camera open to the next.
- We restrict the injection to only allow overriding vendor tags for now.
- The actionable parts of the change are gated behind the inject_session_params
flag to allow easy flipping. When false, this feature will have no effect.
Bug: 308984721
Test: I tested that this works using adb shell.
Change-Id: I27d955d035dde57b63a220c5d68b505ec636c401
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index feb9c75..6acf0b6 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -1092,6 +1092,39 @@
}
}
+Status CameraService::injectSessionParams(
+ const std::string& cameraId,
+ const CameraMetadata& sessionParams) {
+ if (!checkCallingPermission(toString16(sCameraInjectExternalCameraPermission))) {
+ const int pid = CameraThreadState::getCallingPid();
+ const int uid = CameraThreadState::getCallingUid();
+ ALOGE("%s: Permission Denial: can't inject session params pid=%d, uid=%d",
+ __FUNCTION__, pid, uid);
+ return STATUS_ERROR(ERROR_PERMISSION_DENIED,
+ "Permission Denial: no permission to inject session params");
+ }
+
+ std::unique_ptr<AutoConditionLock> serviceLockWrapper =
+ AutoConditionLock::waitAndAcquire(mServiceLockWrapper);
+
+ auto clientDescriptor = mActiveClientManager.get(cameraId);
+ if (clientDescriptor == nullptr) {
+ ALOGI("%s: No active client for camera id %s", __FUNCTION__, cameraId.c_str());
+ return STATUS_ERROR_FMT(ERROR_INVALID_OPERATION,
+ "No active client for camera id %s", cameraId.c_str());
+ }
+
+ sp<BasicClient> clientSp = clientDescriptor->getValue();
+ status_t res = clientSp->injectSessionParams(sessionParams);
+
+ if (res != OK) {
+ return STATUS_ERROR_FMT(ERROR_INVALID_OPERATION,
+ "Error injecting session params into camera \"%s\": %s (%d)",
+ cameraId.c_str(), strerror(-res), res);
+ }
+ return Status::ok();
+}
+
std::vector<std::string> CameraService::findOriginalIdsForRemappedCameraId(
const std::string& inputCameraId, int clientUid) {
std::string packageName = getPackageNameFromUid(clientUid);