blob: da31dfd48b90b7e1c53fab51970e2790230367cf [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
[DartPackage="mojo_services"]
module mojo.media;
import "mojo/services/media/common/interfaces/media_common.mojom";
import "mojo/services/media/common/interfaces/media_types.mojom";
// MediaPacketRegion
//
// A small structure used to keep track of a portion of a shared buffer used by
// a MediaPacket to hold its payload.
struct MediaPacketRegion {
uint64 offset;
uint64 length;
};
// MediaPacket
//
// A structure which hold the definition of an atomic unit of media which may be
// sent across a media pipe. MediaPackets consist of the metadata for the unit
// of media, as well as the set of offset/lengths in the pipe's shared buffer
// which define the payload of the packet itself.
struct MediaPacket {
const int64 kNoTimestamp = 0x7fffffffffffffff;
// Presentation Time Stamp. Time at which the media should be presented,
// according to the media timeline.
int64 pts = kNoTimestamp;
// Indicates whether this is the last packet in the stream.
bool end_of_stream;
// Bookkeeping to determine where this MediaPacket's payload exists in its
// MediaPipe's shared buffer.
//
// For simple cases, only the payload field is used. It provides the offset
// into the shared buffer for the payload, as well as its length. In more
// complicated cases (circular buffer, arbitrary scatter-gather), additional
// regions may be described in the extra_payload array. Logically, the
// payload is the concatination of the payload region, followed by the extra
// payload regions, from index 0 to index N-1.
//
// TODO(johngro): Depending on what happens with mojo struct marshalling,
// consider merging payload and extra_payload into just a single array. The
// intention was to not need any extra allocations if there way only a single
// payload region, but right now we always need to allocate an array, even if
// it is zero length. If this is not going to change, then we should just
// merge these two fields.
MediaPacketRegion payload;
array<MediaPacketRegion>? extra_payload;
// TODO(johngro): do we need to describe the MediaType of this payload, or is
// its type implicit based on the channel over which it is being pushed?
// TODO(johngro): how do we attach per-packet media specific metadata to this
// packet?
};
// Models a stream producer. A MediaProducer allows a client to connect the
// producer to a MediaConsumer so packets flow from the producer to the
// consumer. Clients who want to receive packets directly from the producer
// should use MediaPullModeProducer instead.
//
// The client calls Connect to connect producer and consumer. The producer then
// calls PushPacket on the consumer to deliver packets.
interface MediaProducer {
// Connects this MediaProducer to a MediaConsumer.
Connect(MediaConsumer consumer) => ();
// Disconnects this MediaProducer from a previously-connected MediaConsumer.
Disconnect();
};
// Models a stream producer. A MediaPullModeProducer allows a client to receive
// packets directly from the producer. Clients who want to connect the producer
// to a MediaConsumer should use MediaProducer instead.
//
// The client calls PullPacket to get a packet. Once the client is done with
// the packet, it calls ReleasePacket to let the producer know that the packet
// buffer region can be reused. Alternatively, the client can piggyback a
// release on a PullPacket call using the to_release parameter.
interface MediaPullModeProducer {
// Gets the shared buffer in which packet payload will be located.
GetBuffer() => (handle<shared_buffer> buffer);
// Pulls a packet from the producer. When the client is done with the
// packet buffer region, it should call ReleasePacket or PullPacket passing
// the locator. Note that the optional locator passed in PullPacket is
// a locator to be released and probably won't be the same locator passed
// back in the callback.
PullPacket(MediaPacket? to_release) => (MediaPacket packet);
// Signals the producer that the client is done with the buffer region.
ReleasePacket(MediaPacket to_release);
};
// Models a stream consumer. A MediaConsumer allows a client to send packets
// directly to the consumer or to connect the consumer to a MediaProducer so
// packets flow from the producer to the consumer.
//
// In the former scenario, the client calls PushPacket to deliver a packet. The
// callback notifies the client that the consumer is done with the packet
// buffer region.
//
// In the latter scenario, the client calls Connect on the producer to connect
// producer and consumer. The producer then calls PushPacket on the consumer to
// deliver packets.
interface MediaConsumer {
const uint64 kMaxBufferLen = 0x3FFFFFFFFFFFFFFF;
// An enumeration used to indicate the ultimate fate of packets sent across
// the pipe using the SendPacket method.
enum SendResult {
CONSUMED, // Media was completely consumed.
FLUSHED, // Some or all of the media was flushed before being consumed.
};
// Sets the shared buffer in which packet payload will be located.
SetBuffer(handle<shared_buffer> buffer, uint64 size) => ();
// Sends a packet to the consumer. The callback signals that the consumer
// is done with the packet buffer region.
SendPacket(MediaPacket packet) => (SendResult result);
// Primes the stream. The callback signals that the prime operation is
// complete.
Prime() => ();
// Flushes the stream. The callback signals that the flush operation is
// complete.
Flush() => ();
};