// Copyright 2021 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.video;

using fuchsia.math;
using fuchsia.media2;
using fuchsia.mediastreams;
using zx;

/// Represents a video consumer.
protocol Consumer {
    compose fuchsia.media2.ActiveConsumer;
    compose fuchsia.media2.ActiveConsumerStream;

    /// Connects a stream sink for the consumer with the indicated properties.
    ///
    /// + request `buffer_collection_token` a participant token for the buffer collection to be
    ///   used for this connection.
    /// + request `format` the format to be used for the is connection.
    /// + request `compression` the compression applied to packets in the stream. If this parameter
    ///   is not supplied, the stream is uncompressed (LPCM). If this parameter is supplied, its
    ///   value must be amoung the compression types listed in the `supported_compression_types`
    ///   field of the current consumer status. If the specified compression type used for a
    ///   connection ceases to be supported, the connection is closed, and the
    ///   `OnInputStreamDisconnected` event is signaled.
    /// + request `timestamp_units` the units used for timestamps on packets in this stream. If
    ///   this parameter is not supplied, packets may not have `specified` timestamps.
    /// + request `stream_sink_server_end` the server end of the `StreamSink` channel for this
    ///   connection.
    /// * error reason for connection failiure.
    ///
    /// Multiple stream sinks may be used sequentially for a given consumer. If the input stream is
    /// already connected, the new connection is used when the old one is closed from the client
    /// end and all messages from the old connection have been drained.
    ///
    /// This method responds when the connection is ready or the connect attempt fails.
    ConnectInputStream(resource struct {
        buffer_collection_token zx.handle:EVENTPAIR;
        format fuchsia.mediastreams.VideoFormat;
        compression box<fuchsia.mediastreams.Compression>;
        timestamp_units box<fuchsia.media2.PacketTimestampUnits>; // TODO: required?
        stream_sink_server_end server_end:fuchsia.media2.StreamSink;
    }) -> (struct {}) error fuchsia.media2.ConnectionError;

    /// Indicates that the current input stream has been disconnected unexpectedly.
    -> OnInputStreamDisconnected();

    /// Indicates that the stream sink previously created is invalid,
    /// and the client should create another one if it wishes to
    /// continue sending packets.
    -> OnInputStreamSinkInvalid();

    /// Gets the current status of the consumer using the long get pattern.
    ///
    /// - response `status` the current consumer status.
    ///
    /// The consumer replies immediately to this method when it is first called. The consumer
    /// replies to subsequent calls when the status has changed since the last call.
    WatchStatus() -> (struct {
        status ConsumerStatus;
    });
};

const MAX_COMPRESSION_TYPES uint32 = 256;

/// Represents the status of the consumer.
type ConsumerStatus = table {
    /// If present, indicates an error condition currently in effect.
    /// Absent if no error.
    1: error ConsumerError;

    /// If present, indicates the current relationship between the
    /// presentation timeline and reference clock. Absent initially.
    2: presentation_timeline fuchsia.media2.PresentationTimeline;

    /// Indicates the minimum lead time supported by this `Consumer`,
    /// that is, the minimum interval ahead of a packet’s effective
    /// presentation time that the packet must be submitted to prevent
    /// underflow.
    3: min_lead_time zx.duration;

    /// Indicates the maximum lead time supported by this `Consumer`,
    /// that is, the maximum interval ahead of a packet’s effective
    /// presentation time that the packet may be submitted to prevent
    /// overflow.
    4: max_lead_time zx.duration;

    /// Indicates whether rates other than 1.0 are supported.
    5: rate_supported bool;

    /// The currently-supported compression types. If this value is absent, no compression types
    /// are currently supported.
    6: supported_compression_types
            vector<fuchsia.mediastreams.CompressionType>:MAX_COMPRESSION_TYPES;

    // Whether uncompressed streams are currently supported. If this value is absent,
    // uncompressed streams are not currently supported.
    7: uncompressed_supported bool;

    /// The current display size of the video in pixels. If this value is absent, the display size
    /// is not yet known.
    8: size_in_pixels fuchsia.math.Size;

    /// The relative dimensions of a video pixels when displayed as intended. If this value is
    /// absent, the pixel aspect ratio is unknown.
    9: pixel_aspect_ratio fuchsia.math.Size;
};

/// Represents an `Consumer` error condition.
// TODO: Define
type ConsumerError = strict enum {
    INTERNAL = 1;
};
