import type { HybridObject } from 'react-native-nitro-modules'; import type { Constraint } from './common-types/Constraint'; import type { OrientationSource } from './common-types/OrientationSource'; import type { PermissionStatus } from './common-types/PermissionStatus'; import type { FrameRenderer } from './FrameRenderer.nitro'; import type { TapToFocusGestureController } from './gestures/TapToFocusGestureController.nitro'; import type { ZoomGestureController } from './gestures/ZoomGestureController.nitro'; import type { CameraDevice } from './inputs/CameraDevice.nitro'; import type { CameraDeviceFactory } from './inputs/CameraDeviceFactory.nitro'; import type { MeteringPoint } from './metering/MeteringPoint.nitro'; import type { OrientationManager } from './orientation/OrientationManager.nitro'; import type { CameraDepthFrameOutput, DepthFrameOutputOptions } from './outputs/CameraDepthFrameOutput.nitro'; import type { CameraFrameOutput, FrameOutputOptions } from './outputs/CameraFrameOutput.nitro'; import type { CameraObjectOutput, ObjectOutputOptions } from './outputs/CameraObjectOutput.nitro'; import type { CameraOutput } from './outputs/CameraOutput.nitro'; import type { CameraOutputSynchronizer } from './outputs/CameraOutputSynchronizer.nitro'; import type { CameraPhotoOutput, PhotoOutputOptions } from './outputs/CameraPhotoOutput.nitro'; import type { CameraPreviewOutput } from './outputs/CameraPreviewOutput.nitro'; import type { CameraVideoOutput, VideoOutputOptions } from './outputs/CameraVideoOutput.nitro'; import type { CameraOutputConfiguration } from './session/CameraOutputConfiguration'; import type { CameraSession } from './session/CameraSession.nitro'; import type { CameraSessionConfig } from './session/CameraSessionConfig.nitro'; /** * The {@linkcode CameraFactory} allows creating various other * Camera related objects with arguments. */ export interface CameraFactory extends HybridObject<{ ios: 'swift'; android: 'kotlin'; }> { /** * Get the current Camera {@linkcode PermissionStatus}. */ readonly cameraPermissionStatus: PermissionStatus; /** * Get the current Microphone {@linkcode PermissionStatus}. */ readonly microphonePermissionStatus: PermissionStatus; /** * Request Camera permission. * @returns `true` if Camera permission has now been granted, `false` otherwise. */ requestCameraPermission(): Promise; /** * Request Microphone permission. * @returns `true` if Microphone permission has now been granted, `false` otherwise. */ requestMicrophonePermission(): Promise; /** * Gets whether the platform supports creating multi-cam * {@linkcode CameraSession}s. * * Older phones may not be able to support this. * @see {@linkcode createCameraSession | createCameraSession(enableMultiCam)} */ readonly supportsMultiCamSessions: boolean; /** * Creates a new {@linkcode CameraSession}. * * - If {@linkcode enableMultiCam} is `true`, the {@linkcode CameraSession} * supports attaching multiple {@linkcode CameraDevice}s as inputs/connections * at the same time. * - If {@linkcode enableMultiCam} is `false`, the {@linkcode CameraSession} * only supports a single {@linkcode CameraDevice} input at a time. * * @throws If {@linkcode enableMultiCam} is `true`, but {@linkcode supportsMultiCamSessions} is `false`. */ createCameraSession(enableMultiCam: boolean): Promise; /** * Resolves the given {@linkcode constraints} to a fully validated * {@linkcode CameraSessionConfig} respecting the given {@linkcode device}'s * capabilities negotiated with the given {@linkcode outputConfigurations}. * * The given {@linkcode constraints} are ranked by priority in their * order passed in the array, descending. * The first item (index `0`) has highest priority, while the last item * has lowest priority. * * @discussion * On a device that supports every possible combination of features, * the returned {@linkcode CameraSessionConfig} features exactly what was * described in the given {@linkcode constraints}. * Most devices however negotiate available features across the given * {@linkcode outputConfigurations} because of bandwidth constraints or * simply feature compatibility - for example, 10-bit Video HDR is often * not supported when used in conjunction with 100+ FPS. * Also, maximum available video resolution is often only available when * using a lower photo resolution, and vice-versa. * * @discussion * The `resolutionPreference` {@linkcode Constraint} is optional, but * may rank the given {@linkcode CameraOutput}'s resolution above other * {@linkcode Constraint}s. * If a `resolutionPreference` {@linkcode Constraint} is omitted, it is * treated as last priority - other {@linkcode Constraint}s shall be met * first, if possible. * * @example * For a Photo HDR session configuration, use this: * ```ts * const device = ... * const photoOutput = ... * const config = await resolveConstraints( * device, * [photoOutput], * [ * { resolutionPreference: photoOutput }, * { photoHDR: true }, * ] * ) * ``` * @example * To also enable Video HDR (if available), but still prefer Photo HDR if both are not * supported concurrently, use this: * ```ts * const device = ... * const photoOutput = ... * const videoOutput = ... * const config = await resolveConstraints( * device, * [photoOutput, videoOutput], * [ * { resolutionPreference: photoOutput }, * { resolutionPreference: videoOutput }, * { photoHDR: true }, * { videoDynamicRange: CommonDynamicRanges.ANY_HDR }, * ] * ) * ``` */ resolveConstraints(device: CameraDevice, outputConfigurations: CameraOutputConfiguration[], constraints: Constraint[], requiresMultiCam?: boolean): Promise; /** * Asynchronously create a new {@linkcode CameraDeviceFactory}. */ createDeviceFactory(): Promise; /** * Create a new {@linkcode CameraPhotoOutput} * with the given {@linkcode PhotoOutputOptions}. */ createPhotoOutput(options: PhotoOutputOptions): CameraPhotoOutput; /** * Create a new {@linkcode CameraVideoOutput} * with the given {@linkcode VideoOutputOptions}. */ createVideoOutput(options: VideoOutputOptions): CameraVideoOutput; /** * Create a new {@linkcode CameraFrameOutput} * with the given {@linkcode FrameOutputOptions}. */ createFrameOutput(options: FrameOutputOptions): CameraFrameOutput; /** * Create a new {@linkcode CameraDepthFrameOutput} * with the given {@linkcode DepthFrameOutputOptions}. */ createDepthFrameOutput(options: DepthFrameOutputOptions): CameraDepthFrameOutput; /** * Create a new {@linkcode CameraPreviewOutput}. */ createPreviewOutput(): CameraPreviewOutput; /** * Create a new {@linkcode CameraObjectOutput} * with the given {@linkcode ObjectOutputOptions}. * @platform iOS */ createObjectOutput(options: ObjectOutputOptions): CameraObjectOutput; /** * Create a new {@linkcode CameraOutputSynchronizer} that * synchronizes the given {@linkcode outputs}. * @platform iOS */ createOutputSynchronizer(outputs: CameraOutput[]): CameraOutputSynchronizer; /** * Creates a new {@linkcode ZoomGestureController}. */ createZoomGestureController(): ZoomGestureController; /** * Creates a new {@linkcode TapToFocusGestureController}. */ createTapToFocusGestureController(): TapToFocusGestureController; /** * Creates a new {@linkcode OrientationManager}. */ createOrientationManager(orientationSource: OrientationSource): OrientationManager; /** * Create a new {@linkcode FrameRenderer}. */ createFrameRenderer(): FrameRenderer; /** * Creates a normalized {@linkcode MeteringPoint}, where `x` and `y` are * values in the normalized range from 0.0 to 1.0. * * Your are responsible for handling orientation, cropping and scaling. * @param x The X coordinate ranging from 0.0 to 1.0 * @param y The Y coordinate ranging from 0.0 to 1.0 * @param size The size/radius of the {@linkcode MeteringPoint} */ createNormalizedMeteringPoint(x: number, y: number, size?: number): MeteringPoint; }