// Copyright 2020 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 "mojo/public/mojom/base/time.mojom";
import "services/media_session/public/mojom/media_session.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";

// Implemented by HTMLMediaElement in the renderer process to allow the
// browser to control media playback.
interface MediaPlayer {
  // Requests the media player to start or resume media playback.
  RequestPlay();

  // Requests the media player to pause media playback.
  RequestPause(bool triggered_by_user);

  // Requests the media player to move forward the media playback position.
  RequestSeekForward(mojo_base.mojom.TimeDelta seek_time);

  // Requests the media player to move backward the media playback position.
  RequestSeekBackward(mojo_base.mojom.TimeDelta seek_time);

  // Requests the media player to move to a specific time.
  RequestSeekTo(mojo_base.mojom.TimeDelta seek_time);

  // Requests the media player to enter the Picture-in-Picture mode.
  RequestEnterPictureInPicture();

  // Requests the media player to exit the Picture-in-Picture mode.
  RequestExitPictureInPicture();

  // Requests the media player to mute or unmute.
  RequestMute(bool mute);

  // Set the volume multiplier to control audio ducking.
  // Output volume should be set to |player_volume| * |multiplier|. The range
  // of |multiplier| is [0, 1], where 1 indicates normal (non-ducked) playback.
  SetVolumeMultiplier(double multiplier);

  // Set the player as the persistent video. Persistent video should hide its
  // controls and go fullscreen.
  SetPersistentState(bool persistent);

  // Notify the player that it is now eligible to start recording power
  // measurements if |state| is true, else it is no longer eligible.
  SetPowerExperimentState(bool enabled);

  // Set the media player sink id to |sink_id|.
  SetAudioSinkId(string sink_id);

  // Suspends the media player when the host frame is closed.
  SuspendForFrameClosed();
};

// Implemented by the MediaWebContentsObserver. The remote lives in the renderer
// process and the receiver lives in the browser process.
interface MediaPlayerObserverClient {
  // Gets a flag indicating whether media has been played before.
  GetHasPlayedBefore() => (bool has_played_before);
};

// Implemented by MediaWebContentsObserver::MediaPlayerObserverHostImpl in the
// browser process.
interface MediaPlayerObserver {
  // Notifies that the media player started playing content.
  OnMediaPlaying();

  // Notifies that the media player stopped playing content,
  // indicating in |stream_ended| if playback has reached the end of the stream.
  OnMediaPaused(bool stream_ended);

  // Notifies that the muted status of the media player has changed.
  OnMutedStatusChanged(bool muted);

  // Notifies that the media metadata of the media player has changed, along
  // with the kind of tracks the media player has, and the type of content.
  OnMediaMetadataChanged(
      bool has_audio, bool has_video, MediaContentType content_type);

  // Notifies the browser process that the media playback position has changed,
  // and reports the new current position via |media_position|.
  OnMediaPositionStateChanged(media_session.mojom.MediaPosition media_position);

  // Notifies that the player has entered fullscreen.
  // This does not differentiate native controls fullscreen and custom controls
  // fullscreen. |status| is used by MediaWebContentsObserver to trigger
  // automatically Picture-in-Picture for fullscreen videos.
  OnMediaEffectivelyFullscreenChanged(FullscreenVideoStatus status);

  // Notifies that the size of the media player has changed.
  OnMediaSizeChanged(gfx.mojom.Size size);

  // Notifies the browser process of PictureinPicture playback's availability.
  OnPictureInPictureAvailabilityChanged(bool available);

  // Notifies that the audio output sink has changed.
  OnAudioOutputSinkChanged(string hashed_device_id);

  // Notifies that the playback starts/stops using AudioService.
  OnUseAudioServiceChanged(bool uses_audio_service);

  // Notifies the browser process that the ability to switch audio output
  // devices for the associated media player has been disabled.
  OnAudioOutputSinkChangingDisabled();

  // Notifies that a buffer underflow event happened for the media player.
  OnBufferUnderflow();

  // Notifies that a playback seek event happened for the media player.
  OnSeek();
};

// Implemented by MediaWebContentsObserver::MediaPlayerHostImpl in the browser
// process.
interface MediaPlayerHost {
  // Sends a message to the browser notifying the render frame associated to the
  // document owning the HTMLMediaElement that a new MediaPlayer is available,
  // passing a pending remote (i.e. |player_remote|) that will be used in the
  // browser process to establish a channel with the HTMLMediaElement.
  // |observer| starts observing the MediaPlayer as soon as the player is
  // created.
  OnMediaPlayerAdded(pending_associated_remote<MediaPlayer> player_remote,
                     pending_associated_receiver<MediaPlayerObserver> observer,
                     int32 player_id);
};
