// Copyright 2018 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.media;

// Manages a set of payload buffers for a stream.
[FragileBase]
interface StreamBufferSet {
    // Adds a payload buffer for stream packets. StreamPacket structs reference
    // a payload buffer by ID using the StreamPacket.payload_buffer_id field.
    AddPayloadBuffer(uint32 id, handle<vmo> payload_buffer);

    // Removes a payload buffer.
    RemovePayloadBuffer(uint32 id);
};

// Consumes a stream of packets.
[FragileBase]
interface StreamSink {
    // Sends a packet to this object. The response is sent when this object is
    // done with the associated payload memory.
    SendPacket(StreamPacket packet) -> ();

    // Sends a packet to this object. This interface doesn't define how the client
    // knows when the sink is done with the associated payload memory. The
    // inheriting interface must define that.
    SendPacketNoReply(StreamPacket packet);

    // Indicates the stream has ended.
    EndOfStream();

    // Discards packets previously sent via SendPacket or SendPacketNoReply.
    DiscardAllPackets() -> ();
    DiscardAllPacketsNoReply();
};

// Produces a stream of packets.
[FragileBase]
interface StreamSource {
    // Delivers a packet produced by this object. Each packet delivered via this
    // event must be released with a call to ReleasePacket.
    -> OnPacketProduced(StreamPacket packet);

    // Indicates that the stream has ended.
    -> OnEndOfStream();

    // Releases a packet delivered via OnPacketProduced.
    ReleasePacket(StreamPacket packet);

    // Discards queued packets.
    DiscardAllPackets() -> ();
    DiscardAllPacketsNoReply();
};

// A StreamSink that uses StreamBufferSet for buffer management.
interface SimpleStreamSink : StreamSink, StreamBufferSet {
    ////////////////////////////////////////////////////////////////////////////
    // StreamBufferSet methods

    ////////////////////////////////////////////////////////////////////////////
    // StreamSink methods
};

// Describes a packet consumed by StreamSink or produced by StreamSource.
struct StreamPacket {
    // Time at which the packet is to be presented, according to the presentation
    // clock.
    int64 pts = NO_TIMESTAMP;

    // ID of the payload buffer used for this packet. When this struct is used
    // with StreamBufferSet, this field is the ID of a payload buffer provided
    // via StreamBufferSet.AddPayloadBuffer. Other interfaces may define other
    // semantics for this field.
    uint32 payload_buffer_id;

    // Offset of the packet payload in the payload buffer.
    uint64 payload_offset;

    // Size in bytes of the payload.
    uint64 payload_size;

    // A collection of flags (see constants below) describing properties of this
    // packet.
    uint32 flags = 0;

    // The buffer configuration associated with this packet. The semantics of
    // this field depend on the the interface with which this struct is used.
    // In many contexts, this field is not used.
    uint64 buffer_config = 0;

    // The stream associated with this packet. The semantics of this field
    // depend on the the interface with which this struct is used. In many
    // contexts, this field is not used.
    uint64 stream_id = 0;
};

const uint32 STREAM_PACKET_FLAG_KEY_FRAME = 0x01;
const uint32 STREAM_PACKET_FLAG_DROPPABLE = 0x02;
const uint32 STREAM_PACKET_FLAG_DISCONTINUITY = 0x04;

const int64 NO_TIMESTAMP = 0x7fffffffffffffff;
