Loading camera/aidl/android/hardware/ICameraService.aidl +7 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,13 @@ interface ICameraService const int EVENT_USER_SWITCHED = 1; // The argument is the set of new foreground user IDs. oneway void notifySystemEvent(int eventId, in int[] args); /** * Notify the camera service of a display configuration change. * * Callers require the android.permission.CAMERA_SEND_SYSTEM_EVENTS permission. */ oneway void notifyDisplayConfigurationChange(); /** * Notify the camera service of a device physical status change. May only be called from * a privileged process. Loading services/camera/libcameraservice/CameraService.cpp +60 −10 Original line number Diff line number Diff line Loading @@ -800,8 +800,8 @@ Status CameraService::filterGetInfoErrorCode(status_t err) { Status CameraService::makeClient(const sp<CameraService>& cameraService, const sp<IInterface>& cameraCb, const String16& packageName, const std::optional<String16>& featureId, const String8& cameraId, int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid, int deviceVersion, apiLevel effectiveApiLevel, int api1CameraId, int facing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid, int deviceVersion, apiLevel effectiveApiLevel, /*out*/sp<BasicClient>* client) { // Create CameraClient based on device version reported by the HAL. Loading @@ -824,13 +824,13 @@ Status CameraService::makeClient(const sp<CameraService>& cameraService, sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get()); *client = new Camera2Client(cameraService, tmp, packageName, featureId, cameraId, api1CameraId, facing, clientPid, clientUid, facing, sensorOrientation, clientPid, clientUid, servicePid); } else { // Camera2 API route sp<hardware::camera2::ICameraDeviceCallbacks> tmp = static_cast<hardware::camera2::ICameraDeviceCallbacks*>(cameraCb.get()); *client = new CameraDeviceClient(cameraService, tmp, packageName, featureId, cameraId, facing, clientPid, clientUid, servicePid); cameraId, facing, sensorOrientation, clientPid, clientUid, servicePid); } break; default: Loading Loading @@ -1645,7 +1645,7 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8& sp<BasicClient> tmp = nullptr; if(!(ret = makeClient(this, cameraCb, clientPackageName, clientFeatureId, cameraId, api1CameraId, facing, cameraId, api1CameraId, facing, orientation, clientPid, clientUid, getpid(), deviceVersion, effectiveApiLevel, /*out*/&tmp)).isOk()) { Loading Loading @@ -2030,6 +2030,49 @@ Status CameraService::notifyDeviceStateChange(int64_t newState) { return Status::ok(); } Status CameraService::notifyDisplayConfigurationChange() { ATRACE_CALL(); const int callingPid = CameraThreadState::getCallingPid(); const int selfPid = getpid(); // Permission checks if (callingPid != selfPid) { // Ensure we're being called by system_server, or similar process with // permissions to notify the camera service about system events if (!checkCallingPermission(sCameraSendSystemEventsPermission)) { const int uid = CameraThreadState::getCallingUid(); ALOGE("Permission Denial: cannot send updates to camera service about orientation" " changes from pid=%d, uid=%d", callingPid, uid); return STATUS_ERROR_FMT(ERROR_PERMISSION_DENIED, "No permission to send updates to camera service about orientation" " changes from pid=%d, uid=%d", callingPid, uid); } } Mutex::Autolock lock(mServiceLock); // Don't do anything if rotate-and-crop override via cmd is active if (mOverrideRotateAndCropMode != ANDROID_SCALER_ROTATE_AND_CROP_AUTO) return Status::ok(); const auto clients = mActiveClientManager.getAll(); for (auto& current : clients) { if (current != nullptr) { const auto basicClient = current->getValue(); if (basicClient.get() != nullptr) { if (CameraServiceProxyWrapper::isRotateAndCropOverrideNeeded( basicClient->getPackageName(), basicClient->getCameraOrientation(), basicClient->getCameraFacing())) { basicClient->setRotateAndCropOverride(ANDROID_SCALER_ROTATE_AND_CROP_90); } else { basicClient->setRotateAndCropOverride(ANDROID_SCALER_ROTATE_AND_CROP_NONE); } } } } return Status::ok(); } Status CameraService::getConcurrentCameraIds( std::vector<ConcurrentCameraIdCombination>* concurrentCameraIds) { ATRACE_CALL(); Loading Loading @@ -2690,13 +2733,13 @@ CameraService::Client::Client(const sp<CameraService>& cameraService, const String16& clientPackageName, const std::optional<String16>& clientFeatureId, const String8& cameraIdStr, int api1CameraId, int cameraFacing, int api1CameraId, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid) : CameraService::BasicClient(cameraService, IInterface::asBinder(cameraClient), clientPackageName, clientFeatureId, cameraIdStr, cameraFacing, cameraIdStr, cameraFacing, sensorOrientation, clientPid, clientUid, servicePid), mCameraId(api1CameraId) Loading Loading @@ -2726,10 +2769,10 @@ sp<CameraService> CameraService::BasicClient::BasicClient::sCameraService; CameraService::BasicClient::BasicClient(const sp<CameraService>& cameraService, const sp<IBinder>& remoteCallback, const String16& clientPackageName, const std::optional<String16>& clientFeatureId, const String8& cameraIdStr, int cameraFacing, const String8& cameraIdStr, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid): mCameraIdStr(cameraIdStr), mCameraFacing(cameraFacing), mCameraIdStr(cameraIdStr), mCameraFacing(cameraFacing), mOrientation(sensorOrientation), mClientPackageName(clientPackageName), mClientFeatureId(clientFeatureId), mClientPid(clientPid), mClientUid(clientUid), mServicePid(servicePid), Loading Loading @@ -2826,6 +2869,13 @@ String16 CameraService::BasicClient::getPackageName() const { return mClientPackageName; } int CameraService::BasicClient::getCameraFacing() const { return mCameraFacing; } int CameraService::BasicClient::getCameraOrientation() const { return mOrientation; } int CameraService::BasicClient::getClientPid() const { return mClientPid; Loading services/camera/libcameraservice/CameraService.h +13 −2 Original line number Diff line number Diff line Loading @@ -167,6 +167,8 @@ public: virtual binder::Status notifyDeviceStateChange(int64_t newState); virtual binder::Status notifyDisplayConfigurationChange(); // OK = supports api of that version, -EOPNOTSUPP = does not support virtual binder::Status supportsCameraApi( const String16& cameraId, int32_t apiVersion, Loading Loading @@ -246,6 +248,12 @@ public: // Return the package name for this client virtual String16 getPackageName() const; // Return the camera facing for this client virtual int getCameraFacing() const; // Return the camera orientation for this client virtual int getCameraOrientation() const; // Notify client about a fatal error virtual void notifyError(int32_t errorCode, const CaptureResultExtras& resultExtras) = 0; Loading Loading @@ -292,6 +300,7 @@ public: const std::optional<String16>& clientFeatureId, const String8& cameraIdStr, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid); Loading @@ -308,6 +317,7 @@ public: static sp<CameraService> sCameraService; const String8 mCameraIdStr; const int mCameraFacing; const int mOrientation; String16 mClientPackageName; std::optional<String16> mClientFeatureId; pid_t mClientPid; Loading Loading @@ -385,6 +395,7 @@ public: const String8& cameraIdStr, int api1CameraId, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid); Loading Loading @@ -1073,7 +1084,7 @@ private: static binder::Status makeClient(const sp<CameraService>& cameraService, const sp<IInterface>& cameraCb, const String16& packageName, const std::optional<String16>& featureId, const String8& cameraId, int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid, int facing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid, int deviceVersion, apiLevel effectiveApiLevel, /*out*/sp<BasicClient>* client); Loading Loading @@ -1102,7 +1113,7 @@ private: // Aggreated audio restriction mode for all camera clients int32_t mAudioRestriction; // Current override rotate-and-crop mode // Current override cmd rotate-and-crop mode; AUTO means no override uint8_t mOverrideRotateAndCropMode = ANDROID_SCALER_ROTATE_AND_CROP_AUTO; // Current image dump mask Loading services/camera/libcameraservice/api1/Camera2Client.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -55,11 +55,12 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService, const String8& cameraDeviceId, int api1CameraId, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid): Camera2ClientBase(cameraService, cameraClient, clientPackageName, clientFeatureId, cameraDeviceId, api1CameraId, cameraFacing, cameraDeviceId, api1CameraId, cameraFacing, sensorOrientation, clientPid, clientUid, servicePid), mParameters(api1CameraId, cameraFacing) { Loading services/camera/libcameraservice/api1/Camera2Client.h +1 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,7 @@ public: const String8& cameraDeviceId, int api1CameraId, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid); Loading Loading
camera/aidl/android/hardware/ICameraService.aidl +7 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,13 @@ interface ICameraService const int EVENT_USER_SWITCHED = 1; // The argument is the set of new foreground user IDs. oneway void notifySystemEvent(int eventId, in int[] args); /** * Notify the camera service of a display configuration change. * * Callers require the android.permission.CAMERA_SEND_SYSTEM_EVENTS permission. */ oneway void notifyDisplayConfigurationChange(); /** * Notify the camera service of a device physical status change. May only be called from * a privileged process. Loading
services/camera/libcameraservice/CameraService.cpp +60 −10 Original line number Diff line number Diff line Loading @@ -800,8 +800,8 @@ Status CameraService::filterGetInfoErrorCode(status_t err) { Status CameraService::makeClient(const sp<CameraService>& cameraService, const sp<IInterface>& cameraCb, const String16& packageName, const std::optional<String16>& featureId, const String8& cameraId, int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid, int deviceVersion, apiLevel effectiveApiLevel, int api1CameraId, int facing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid, int deviceVersion, apiLevel effectiveApiLevel, /*out*/sp<BasicClient>* client) { // Create CameraClient based on device version reported by the HAL. Loading @@ -824,13 +824,13 @@ Status CameraService::makeClient(const sp<CameraService>& cameraService, sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get()); *client = new Camera2Client(cameraService, tmp, packageName, featureId, cameraId, api1CameraId, facing, clientPid, clientUid, facing, sensorOrientation, clientPid, clientUid, servicePid); } else { // Camera2 API route sp<hardware::camera2::ICameraDeviceCallbacks> tmp = static_cast<hardware::camera2::ICameraDeviceCallbacks*>(cameraCb.get()); *client = new CameraDeviceClient(cameraService, tmp, packageName, featureId, cameraId, facing, clientPid, clientUid, servicePid); cameraId, facing, sensorOrientation, clientPid, clientUid, servicePid); } break; default: Loading Loading @@ -1645,7 +1645,7 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8& sp<BasicClient> tmp = nullptr; if(!(ret = makeClient(this, cameraCb, clientPackageName, clientFeatureId, cameraId, api1CameraId, facing, cameraId, api1CameraId, facing, orientation, clientPid, clientUid, getpid(), deviceVersion, effectiveApiLevel, /*out*/&tmp)).isOk()) { Loading Loading @@ -2030,6 +2030,49 @@ Status CameraService::notifyDeviceStateChange(int64_t newState) { return Status::ok(); } Status CameraService::notifyDisplayConfigurationChange() { ATRACE_CALL(); const int callingPid = CameraThreadState::getCallingPid(); const int selfPid = getpid(); // Permission checks if (callingPid != selfPid) { // Ensure we're being called by system_server, or similar process with // permissions to notify the camera service about system events if (!checkCallingPermission(sCameraSendSystemEventsPermission)) { const int uid = CameraThreadState::getCallingUid(); ALOGE("Permission Denial: cannot send updates to camera service about orientation" " changes from pid=%d, uid=%d", callingPid, uid); return STATUS_ERROR_FMT(ERROR_PERMISSION_DENIED, "No permission to send updates to camera service about orientation" " changes from pid=%d, uid=%d", callingPid, uid); } } Mutex::Autolock lock(mServiceLock); // Don't do anything if rotate-and-crop override via cmd is active if (mOverrideRotateAndCropMode != ANDROID_SCALER_ROTATE_AND_CROP_AUTO) return Status::ok(); const auto clients = mActiveClientManager.getAll(); for (auto& current : clients) { if (current != nullptr) { const auto basicClient = current->getValue(); if (basicClient.get() != nullptr) { if (CameraServiceProxyWrapper::isRotateAndCropOverrideNeeded( basicClient->getPackageName(), basicClient->getCameraOrientation(), basicClient->getCameraFacing())) { basicClient->setRotateAndCropOverride(ANDROID_SCALER_ROTATE_AND_CROP_90); } else { basicClient->setRotateAndCropOverride(ANDROID_SCALER_ROTATE_AND_CROP_NONE); } } } } return Status::ok(); } Status CameraService::getConcurrentCameraIds( std::vector<ConcurrentCameraIdCombination>* concurrentCameraIds) { ATRACE_CALL(); Loading Loading @@ -2690,13 +2733,13 @@ CameraService::Client::Client(const sp<CameraService>& cameraService, const String16& clientPackageName, const std::optional<String16>& clientFeatureId, const String8& cameraIdStr, int api1CameraId, int cameraFacing, int api1CameraId, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid) : CameraService::BasicClient(cameraService, IInterface::asBinder(cameraClient), clientPackageName, clientFeatureId, cameraIdStr, cameraFacing, cameraIdStr, cameraFacing, sensorOrientation, clientPid, clientUid, servicePid), mCameraId(api1CameraId) Loading Loading @@ -2726,10 +2769,10 @@ sp<CameraService> CameraService::BasicClient::BasicClient::sCameraService; CameraService::BasicClient::BasicClient(const sp<CameraService>& cameraService, const sp<IBinder>& remoteCallback, const String16& clientPackageName, const std::optional<String16>& clientFeatureId, const String8& cameraIdStr, int cameraFacing, const String8& cameraIdStr, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid): mCameraIdStr(cameraIdStr), mCameraFacing(cameraFacing), mCameraIdStr(cameraIdStr), mCameraFacing(cameraFacing), mOrientation(sensorOrientation), mClientPackageName(clientPackageName), mClientFeatureId(clientFeatureId), mClientPid(clientPid), mClientUid(clientUid), mServicePid(servicePid), Loading Loading @@ -2826,6 +2869,13 @@ String16 CameraService::BasicClient::getPackageName() const { return mClientPackageName; } int CameraService::BasicClient::getCameraFacing() const { return mCameraFacing; } int CameraService::BasicClient::getCameraOrientation() const { return mOrientation; } int CameraService::BasicClient::getClientPid() const { return mClientPid; Loading
services/camera/libcameraservice/CameraService.h +13 −2 Original line number Diff line number Diff line Loading @@ -167,6 +167,8 @@ public: virtual binder::Status notifyDeviceStateChange(int64_t newState); virtual binder::Status notifyDisplayConfigurationChange(); // OK = supports api of that version, -EOPNOTSUPP = does not support virtual binder::Status supportsCameraApi( const String16& cameraId, int32_t apiVersion, Loading Loading @@ -246,6 +248,12 @@ public: // Return the package name for this client virtual String16 getPackageName() const; // Return the camera facing for this client virtual int getCameraFacing() const; // Return the camera orientation for this client virtual int getCameraOrientation() const; // Notify client about a fatal error virtual void notifyError(int32_t errorCode, const CaptureResultExtras& resultExtras) = 0; Loading Loading @@ -292,6 +300,7 @@ public: const std::optional<String16>& clientFeatureId, const String8& cameraIdStr, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid); Loading @@ -308,6 +317,7 @@ public: static sp<CameraService> sCameraService; const String8 mCameraIdStr; const int mCameraFacing; const int mOrientation; String16 mClientPackageName; std::optional<String16> mClientFeatureId; pid_t mClientPid; Loading Loading @@ -385,6 +395,7 @@ public: const String8& cameraIdStr, int api1CameraId, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid); Loading Loading @@ -1073,7 +1084,7 @@ private: static binder::Status makeClient(const sp<CameraService>& cameraService, const sp<IInterface>& cameraCb, const String16& packageName, const std::optional<String16>& featureId, const String8& cameraId, int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid, int facing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid, int deviceVersion, apiLevel effectiveApiLevel, /*out*/sp<BasicClient>* client); Loading Loading @@ -1102,7 +1113,7 @@ private: // Aggreated audio restriction mode for all camera clients int32_t mAudioRestriction; // Current override rotate-and-crop mode // Current override cmd rotate-and-crop mode; AUTO means no override uint8_t mOverrideRotateAndCropMode = ANDROID_SCALER_ROTATE_AND_CROP_AUTO; // Current image dump mask Loading
services/camera/libcameraservice/api1/Camera2Client.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -55,11 +55,12 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService, const String8& cameraDeviceId, int api1CameraId, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid): Camera2ClientBase(cameraService, cameraClient, clientPackageName, clientFeatureId, cameraDeviceId, api1CameraId, cameraFacing, cameraDeviceId, api1CameraId, cameraFacing, sensorOrientation, clientPid, clientUid, servicePid), mParameters(api1CameraId, cameraFacing) { Loading
services/camera/libcameraservice/api1/Camera2Client.h +1 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,7 @@ public: const String8& cameraDeviceId, int api1CameraId, int cameraFacing, int sensorOrientation, int clientPid, uid_t clientUid, int servicePid); Loading