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

Commit 6df4e929 authored by Akash Malik's avatar Akash Malik Committed by Android (Google) Code Review
Browse files

Merge "Implement session param injection in CameraService" into main

parents f1419f04 22af94c2
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