blob: 860eb94e022e72d6e634dd785b411af9bb708b31 [file] [log] [blame]
// Copyright 2016 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.
module media.mojom;
import "media/mojo/mojom/media_types.mojom";
import "media/mojo/mojom/remoting_common.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
interface RemoterFactory {
// Create a new Remoter associated with the given RemotingSource and bind it
// to the given interface receiver. The RemotingSource will be notified when
// the Remoter becomes available for use (or becomes unavailable).
Create(pending_remote<RemotingSource> source,
pending_receiver<Remoter> remoter);
};
// Interface used by the source to control when media bitstream data is read
// from a data pipe and then sent to the remote endpoint. There is one
// RemotingDataStreamSender per data pipe.
interface RemotingDataStreamSender {
// Enqueues another frame for transmission to the remote endpoint, whose
// payload is |frame_size| bytes, to be read from the data pipe.
SendFrame(uint32 frame_size);
// Cancels the transmission of all in-flight data to the remote, up to and
// including the last SendFrame() call; and also discard any data chunks
// that were consumed from the data pipe for the next frame. This is used to
// optimize seeking, when it is known that any in-flight data is no longer
// needed by the remote. There is no guarantee as to how much of the in-flight
// data will actually reach the remote before the cancellation takes effect.
CancelInFlightData();
};
// Interface used by the source to start/stop remoting and send data to the
// sink.
interface Remoter {
// Starts a remoting session (once the sink has been reported to be available;
// see RemotingSource). Either RemotingSource.OnStarted() or OnStartFailed()
// will be called to indicate success or failure. Once OnStarted() has been
// invoked, the source may then make calls to SendMessageToSink() and expect
// messages from the remote via RemotingSource.OnMessageFromSink().
Start();
// Starts remoting the media data streams. This is called after Start() to
// provide data pipes from which the audio/video bitstream data is consumed
// and then transported to the remote device. RemotingDataStreamSenders are
// used by the source to control when data should be consumed from the data
// pipes and sent. One or both pipes (and their corresponding
// RemotingDataStreamSender interface receivers) must be provided.
StartDataStreams(handle<data_pipe_consumer>? audio_pipe,
handle<data_pipe_consumer>? video_pipe,
pending_receiver<RemotingDataStreamSender>? audio_sender,
pending_receiver<RemotingDataStreamSender>? video_sender);
// Stops remoting media. Messages in both directions will be dropped after this
// point as well as any pending or in-transit media bitstream data.
Stop(RemotingStopReason reason);
// Sends |message| to the sink. |message| is a serialized protobuf from
// src/media/remoting/proto.
SendMessageToSink(array<uint8> message);
// Estimates the transmission capacity. Returns the result in
// bytes per second.
EstimateTransmissionCapacity() => (double rate);
};
// Interface used for sending notifications back to the local source's control
// logic, and to pass messages from the sink back to the local media pipeline.
interface RemotingSource {
// Pass the sink's metadata. It is up to the source's control logic to decide
// whether/when to start remoting.
OnSinkAvailable(RemotingSinkMetadata metadata);
// Notifies the source that the sink is no longer available for remoting. This
// may happen, for example, because the sink has been shut down, or because
// another source has started remoting.
OnSinkGone();
// One of these is called after the source attempts to start remoting. If
// OnStarted() is called, messages may begin flowing; and this will continue
// until OnStopped() is called. On the other hand, if OnStartFailed() is
// called, then no messages are being passed between source and sink and
// remoting is not taking place.
OnStarted();
OnStartFailed(RemotingStartFailReason reason);
// Passes a |message| from the sink back to the source. The |message| consists
// of a serialized protobuf from src/media/remoting/proto. This will only be
// called after OnStarted() and before OnStopped().
OnMessageFromSink(array<uint8> message);
// Notifies the source that remoting has terminated. This may or may not be in
// response to a Remoter.Stop() call, as other events (possibly external) may
// have caused remoting to end.
OnStopped(RemotingStopReason reason);
};
// Interface that is implemented by the host of RemotingSink and
// RemotingDataStreamReceiver. Remotee implementation would be implemented in
// the browser process in order to receive serialized RPC messages and frame
// data from the sender.
interface Remotee {
// Used by RemotingSink to notify Remotee that it is ready for remoting.
OnRemotingSinkReady(pending_remote<RemotingSink> sink);
// Used by the RemotingSink to send a serialized RPC message to sender side.
// |message| is a serialized protobuf from src/media/remoting/proto.
SendMessageToSource(array<uint8> message);
// Initialize the data pipe for RemotingDataStreamReceiver to allow Remotee to
// send frame data to it.
// Remoting media could be audio-only media, video-only media, or media has
// both audio and video. So, at least one of audio stream or video stream
// should be passed.
StartDataStreams(
pending_remote<RemotingDataStreamReceiver>? audio_stream,
pending_remote<RemotingDataStreamReceiver>? video_stream);
// Used by RemotingSink to notify Remotee that FlushUntil is happening in
// order to not send NACK for the frames that are ignored. The implementation
// should also forward the |{audio/video}_frame_count| to FlushUntil() of
// {audio|video} streams which are RemotingDataStreamReceiver implementations.
OnFlushUntil(uint32 audio_frame_count, uint32 video_frame_count);
// Used by RemotingSink to notify Remotee that VideoNaturalSizeChange is
// happening.
OnVideoNaturalSizeChange(gfx.mojom.Size size);
};
// Interface that is used to receive messages from the sender.
interface RemotingSink {
// Used by the Remotee to send a serialized RPC message to the sink.
// |message| is a serialized protobuf from src/media/remoting/proto.
OnMessageFromSource(array<uint8> message);
};
// Interface that is implemented by either an audio or a video demuxer stream at
// the receiver side to receive frame data. Passed to a Remotee which will send
// it frame data.
interface RemotingDataStreamReceiver {
// Used by the Remotee implementation to bind a data pipe to
// RemotingDataStreamReceiver.
InitializeDataPipe(handle<data_pipe_consumer> data_pipe);
// Used by the Remotee implementation to send frame data to
// RemotingDataStreamReceiver.
ReceiveFrame(uint32 frame_count, DecoderBuffer buffer);
// Used by the Remotee implementation to flush frames until the given frame
// count.
FlushUntil(uint32 frame_count);
};