// 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);
};
