// 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.
// Ordinal range: 0x0200-0x2ff
[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.
    0x0201: AddPayloadBuffer(uint32 id, handle<vmo> payload_buffer);

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

// Consumes a stream of packets.
// Ordinal range: 0x0300-03ff
[FragileBase]
interface StreamSink {
    // Sends a packet to this object. The response is sent when this object is
    // done with the associated payload memory.
    0x0301: 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.
    0x0302: SendPacketNoReply(StreamPacket packet);

    // Indicates the stream has ended.
    0x0303: EndOfStream();

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

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

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

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

    // Discards queued packets.
    0x0404: DiscardAllPackets() -> ();
    0x0405: 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;
