import type { HybridObject } from 'react-native-nitro-modules';
import type { CameraOrientation } from '../common-types/CameraOrientation';
import type { MediaType } from '../common-types/MediaType';
import type { Size } from '../common-types/Size';
/**
 * A {@linkcode CameraOutput} is the base-class of all
 * outputs that can be connected to the {@linkcode CameraSession}.
 *
 * @discussion
 * You can extend the {@linkcode CameraOutput} Nitro spec
 * in native and conform to the `NativeCameraOutput`
 * interface/protocol to create custom outputs which can
 * be connected to the {@linkcode CameraSession}.
 * This is useful for building custom capture pipelines,
 * such as private HDR implementations, or fully custom
 * video pipelines (e.g. for batching/segmenting video).
 */
export interface CameraOutput extends HybridObject<{
    ios: 'swift';
    android: 'kotlin';
}> {
    /**
     * The media type of the content being streamed
     * by this {@linkcode CameraOutput}.
     */
    readonly mediaType: MediaType;
    /**
     * Gets or sets the output orientation of this {@linkcode CameraOutput}.
     *
     * Individual implementations of {@linkcode CameraOutput}
     * may choose different strategies for implementing
     * output orientation, for example:
     * - A Photo output might apply orientation via EXIF flags.
     * - A Video output might apply orientation via track transform metadata.
     * - A Preview output might apply orientation via view transforms.
     * - A Frame output might not apply orientation and only pass it as a
     * property via the `Frame` object, unless explicitly configured to
     * physically rotate buffers.
     */
    outputOrientation: CameraOrientation;
    /**
     * The resolution that the underlying capture pipeline has resolved
     * this {@linkcode CameraOutput} to, in sensor-native (un-rotated) pixels,
     * or `undefined` if the output has not yet been connected to a
     * {@linkcode CameraSession}.
     *
     * @discussion
     * The selected {@linkcode Size} may differ from the requested
     * {@linkcode Size} (e.g. from {@linkcode PhotoOutputOptions.targetResolution}),
     * as the {@linkcode CameraSession} negotiates resolutions across
     * attached {@linkcode CameraOutput}s, connected {@linkcode CameraDevice}
     * capabilities, and enabled {@linkcode Constraint}s.
     *
     * @discussion
     * For outputs that are not pixel-based (e.g. metadata-only outputs),
     * this reports the resolution of the upstream video stream feeding
     * the output, or `undefined` if no video input is attached.
     */
    readonly currentResolution?: Size;
}
