// 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;

/// A Stream represents timing, sequencing, and other camera-specific properties applied to a buffer
/// collection.
protocol Stream {
    /// 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.
    SetCropRegion(fuchsia.math.RectF? region);

    /// 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.
    WatchCropRegion() -> (fuchsia.math.RectF? region);

    /// 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.
    SetResolution(fuchsia.math.Size coded_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.
    WatchResolution() -> (fuchsia.math.Size coded_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.
    SetBufferCollection(fuchsia.sysmem.BufferCollectionToken? token);

    /// 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.
    WatchBufferCollection() -> (fuchsia.sysmem.BufferCollectionToken token);

    /// Request the next available frame for this stream. Returns when the stream has completed
    /// populating the buffer and may be read by the client, provided the number of unreleased
    /// buffers held by the client 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.
    GetNextFrame() -> (FrameInfo info);

    /// Request another connection to this Stream. This allows a client to delegate different
    /// operations to different coordinated clients.
    Rebind(request<Stream> request);
};

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

    /// 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.
    uint64 frame_counter;

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

    /// The client must close this when it has completed reading from the buffer.
    handle<eventpair> release_fence;
};

/// 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.
struct FrameRate {
    /// Fraction numerator.
    uint32 numerator;

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

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

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

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