// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.camera3;

using fuchsia.math;
using fuchsia.sysmem;
using zx;

const MAX_RESOLUTIONS_PER_STREAM uint32 = 256;

/// A Stream represents timing, sequencing, and other camera-specific properties applied to a buffer
/// collection.
closed protocol Stream {
    /// Gets the properties associated with this stream. The value returned is identical to the one
    /// corresponding to this stream as returned by |Device.GetConfigurations|.
    @deprecated("Use GetProperties2")
    strict GetProperties() -> (struct {
        properties StreamProperties;
    });

    /// Gets the properties associated with this stream. The value returned is identical to the one
    /// corresponding to this stream as returned by |Device.GetConfigurations|.
    strict GetProperties2() -> (struct {
        properties StreamProperties2;
    });

    /// Sets the Stream's crop region to the provided region, with the top-left of the image
    /// represented by (0,0) and the bottom-right of the image represented by (1,1). The resulting
    /// content is subsequently scaled to fill the output buffer. If the implementation does not
    /// precisely support the provided value, it will be expanded to the minimum region that covers
    /// the provided region. If region is set to null, the crop region is unset, which is equivalent
    /// to specifying a region covering the entire image. Upon initial connection, the region is
    /// unset. If the stream does not support crop region, the connection is closed with the
    /// ZX_ERR_NOT_SUPPORTED epitaph.
    strict SetCropRegion(struct {
        region box<fuchsia.math.RectF>;
    });

    /// Returns the crop region if it has changed from a previously returned value, or is called by
    /// a client for the first time. Frame callbacks received after receiving this callback reflect
    /// the use of the new region. See SetCropRegion for a description of the region parameter.
    strict WatchCropRegion() -> (struct {
        region box<fuchsia.math.RectF>;
    });

    /// Sets the resolution of the stream to the provided value. If the implementation does not
    /// precisely support the provided value, it will be expanded to the minimum resolution that
    /// exceeds the provided resolution.
    strict SetResolution(struct {
        coded_size fuchsia.math.Size;
    });

    /// Returns the resolution if it has changed from a previously returned value, or is called by
    /// a client for the first time. Frame callbacks received after receiving this callback reflect
    /// the new resolution.
    strict WatchResolution() -> (struct {
        coded_size fuchsia.math.Size;
    });

    /// If non-null, requests renegotiation of the buffer collection backing this stream, and
    /// identifies this client as a participant in buffer negotiation. If null, identifies this
    /// client as a non-participant in buffer negotiation. Upon initial connection, the client is a
    /// non-participant. After registering as a participant, clients must always have an outstanding
    /// call to WatchBufferCollection to receive tokens from the server so that they are able to
    /// respond to current and future renegotiation requests.
    strict SetBufferCollection(resource struct {
        token client_end:<fuchsia.sysmem.BufferCollectionToken, optional>;
    });

    /// Returns when the server or any buffer negotiation participant (including the current client)
    /// requires buffer renegotiation, and the current client is registered as a participant. Frame
    /// callbacks received after receiving this callback apply to the newly negotiated collection.
    ///
    /// Because the camera can output directly to these collections, each client should support
    /// reading from a |fuchsia.sysmem.CoherencyDomain| of RAM, and set |ram_domain_supported| in
    /// their |fuchsia.sysmem.BufferMemoryConstraints|.
    strict WatchBufferCollection() -> (resource struct {
        token client_end:fuchsia.sysmem.BufferCollectionToken;
    });

    /// Returns the orientation if it has changed from a previously returned value, or is called by
    /// a client for the first time. Frame callbacks received after receiving this callback reflect
    /// the new orientation.
    strict WatchOrientation() -> (struct {
        orientation Orientation;
    });

    /// See GetNextFrame2.
    @deprecated("Use GetNextFrame2")
    strict GetNextFrame() -> (resource struct {
        info FrameInfo;
    });

    /// Request the next available frame for this stream that has not yet been acquired by the
    /// current client. Multiple participating clients may concurrently hold the same frame. Returns
    /// when the stream has completed populating the buffer and may be read by the client, provided
    /// the number of unreleased buffers is less than the count provided via the most recently
    /// negotiated buffer collection token. If a buffer renegotiation is in progress, this call will
    /// return only after the negotiation is complete and a new collection is available.
    strict GetNextFrame2() -> (resource struct {
        info FrameInfo2;
    });

    /// Request another connection to this Stream. This allows a client to delegate different
    /// operations to different coordinated clients, or have multiple clients concurrently observe
    /// frames produced by the stream.
    strict Rebind(resource struct {
        request server_end:Stream;
    });
};

/// Metadata concerning a given frame.
type FrameInfo = resource struct {
    /// Identifies the buffer used for this frame as an index into the most recently negotiated
    /// buffer collection.
    buffer_index uint32;

    /// A monotonically increasing counter indicating the number of frames written to this stream's
    /// most recently negotiated buffer collection. Clients can use this to detect dropped frames
    /// or generate nominal timestamps using the associated stream's framerate.
    frame_counter uint64;

    /// The value of the system monotonic clock, measured at the time the hardware completed
    /// populating the buffer.
    timestamp zx.Time;

    /// The client must close this when it has completed reading from the buffer.
    release_fence zx.Handle:EVENTPAIR;
};

/// Metadata concerning a given frame.
type FrameInfo2 = resource table {
    /// Identifies the buffer used for this frame as an index into the most recently negotiated
    /// buffer collection.
    1: buffer_index uint32;

    /// A monotonically increasing counter indicating the number of frames written to this stream's
    /// most recently negotiated buffer collection. Clients can use this to detect dropped frames
    /// or generate nominal timestamps using the associated stream's framerate.
    2: frame_counter uint64;

    /// The value of the system monotonic clock, measured at the time the hardware completed
    /// populating the buffer.
    3: timestamp zx.Time;

    /// The value of the system monotonic clock, measured at the time the hardware completed
    /// populating the original buffer used to derive the contents of this buffer.
    4: capture_timestamp zx.Time;

    /// The client must close this when it has completed reading from the buffer.
    5: release_fence zx.Handle:EVENTPAIR;
};

/// The frequency at which a Stream produces frames. The value is `numerator` / `denominator`, with
/// units of frames-per-second (Hz). The representation is not necessarily an irreducible fraction.
type FrameRate = struct {
    /// Fraction numerator.
    numerator uint32;

    /// Fraction denominator. This value will not be zero.
    denominator uint32;
};

/// Describes the properties of a given stream.
type StreamProperties = struct {
    /// Describes the native image format used by a stream.
    image_format fuchsia.sysmem.ImageFormat_2;

    /// Describes the framerate used by a stream.
    frame_rate FrameRate;

    /// Indicates whether a stream supports the SetCropRegion method.
    supports_crop_region bool;
};

/// Describes the properties of a given stream.
type StreamProperties2 = table {
    /// Describes the native image format used by a stream.
    1: image_format fuchsia.sysmem.ImageFormat_2;

    /// Describes the framerate used by a stream.
    2: frame_rate FrameRate;

    /// Indicates whether a stream supports the SetCropRegion method.
    3: supports_crop_region bool;

    /// Describes the precise resolutions supported by a stream, i.e. those for which SetResolution
    /// results in a WatchResolution callback of the same value. If empty, it indicates that the
    /// stream supports arbitrary resolutions. If non-empty, the list contains at least one element
    /// reflecting the native resolution specified by |image_format|.
    4: supported_resolutions vector<fuchsia.math.Size>:MAX_RESOLUTIONS_PER_STREAM;
};

/// Describes the intended orientation of a given stream relative to its encoded data. For clarity,
/// the documentation for each enum value is accompanied by an orientation of the chiral '⮬' symbol
/// illustrating the orientation of the stream's encoded data.
type Orientation = strict enum {
    /// ⮬: The content is already in the correct orientation.
    UP = 1;

    /// ⮯: The content must be rotated 180 degrees to appear correct.
    DOWN = 2;

    /// ⮫: The content must be rotated 90 degrees left (counter-clockwise) to appear correct.
    LEFT = 3;

    /// ⮨: The content must be rotated 90 degrees right (clockwise) to appear correct.
    RIGHT = 4;

    /// ⮭: The content must be flipped horizontally to appear correct.
    UP_FLIPPED = 5;

    /// ⮮: The content must be flipped horizontally then rotated 180 degrees to appear correct.
    DOWN_FLIPPED = 6;

    /// ⮪: The content must be flipped horizontally then rotated 90 degrees left (counter-clockwise) to appear correct.
    LEFT_FLIPPED = 7;

    /// ⮩: The content must be flipped horizontally then rotated 90 degrees right (clockwise) to appear correct.
    RIGHT_FLIPPED = 8;
};
