Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 22af94c2 authored by malikakash's avatar malikakash
Browse files

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
parent 35ab180d
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -148,6 +148,18 @@ interface ICameraService
     */
    void remapCameraIds(in CameraIdRemapping cameraIdRemapping);

    /**
     * Inject Session Params into an existing camera session.
     *
     * @param cameraId the camera id session to inject session params into. Note that
     *                 if there is no active session for the input cameraid, this operation
     *                 will be a no-op. In addition, future camera sessions for cameraid will
     *                 not be affected.
     * @param sessionParams the session params to override for the existing session.
     */
    void injectSessionParams(@utf8InCpp String cameraId,
            in CameraMetadataNative sessionParams);

    /**
     * Remove listener for changes to camera device and flashlight state.
     */
+33 −0
Original line number Diff line number Diff line
@@ -1092,6 +1092,39 @@ void CameraService::remapCameraIds(const TCameraIdRemapping& cameraIdRemapping)
    }
}

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);
+9 −1
Original line number Diff line number Diff line
@@ -234,6 +234,10 @@ public:
    virtual binder::Status remapCameraIds(const hardware::CameraIdRemapping&
            cameraIdRemapping);

    virtual binder::Status injectSessionParams(
            const std::string& cameraId,
            const hardware::camera2::impl::CameraMetadataNative& sessionParams);

    virtual binder::Status createDefaultRequest(const std::string& cameraId, int templateId,
            /*out*/
            hardware::camera2::impl::CameraMetadataNative* request);
@@ -412,6 +416,10 @@ public:
        // Stop the injection camera and restore to internal camera session.
        virtual status_t stopInjection() = 0;

        // Inject session parameters into an existing session.
        virtual status_t injectSessionParams(
                const hardware::camera2::impl::CameraMetadataNative& sessionParams) = 0;

    protected:
        BasicClient(const sp<CameraService>& cameraService,
                const sp<IBinder>& remoteCallback,
+7 −0
Original line number Diff line number Diff line
@@ -383,5 +383,12 @@ status_t CameraOfflineSessionClient::stopInjection() {
    return OK;
}

status_t CameraOfflineSessionClient::injectSessionParams(
        const hardware::camera2::impl::CameraMetadataNative& sessionParams) {
    ALOGV("%s: This client doesn't support the injecting session parameters camera.",
            __FUNCTION__);
    (void)sessionParams;
    return OK;
}
// ----------------------------------------------------------------------------
}; // namespace android
+2 −0
Original line number Diff line number Diff line
@@ -120,6 +120,8 @@ public:
    status_t injectCamera(const std::string& injectedCamId,
            sp<CameraProviderManager> manager) override;
    status_t stopInjection() override;
    status_t injectSessionParams(
        const hardware::camera2::impl::CameraMetadataNative& sessionParams) override;

private:
    mutable Mutex mBinderSerializationLock;
Loading