// 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/capture/mojom/video_capture_buffer.mojom";
import "media/capture/mojom/video_capture_types.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";

// This file decribes the communication between a given Renderer Host interface
// implementation (VideoCaptureHost) and a remote VideoCaptureObserver.
// VideoCaptureHost offers a stateless part (GetDeviceSupportedFormats() and
// GetDeviceFormatsInUse()) that can be invoked at any time, and a stateful part
// sandwiched between Start() and Stop(). A Client's OnStateChanged() can be
// notified any time during the stateful part. The stateful part is composed of
// a preamble where a Renderer client sends a command to Start() the capture,
// registering itself as the associated remote VideoCaptureObserver. The Host
// will then create and pre- share a number of buffers:
//
//   Observer                                        VideoCaptureHost
//      | ---> StartCapture                                     |
//      |                        OnStateChanged(STARTED) <---   |
//      |                                 OnNewBuffer(1) <---   |
//      |                                 OnNewBuffer(2) <---   |
//      =                                                       =
// and capture will then refer to those preallocated buffers:
//      |                               OnBufferReady(1) <---   |
//      |                               OnBufferReady(2) <---   |
//      | ---> ReleaseBuffer(1)                                 |
//      |                               OnBufferReady(1) <---   |
//      | ---> ReleaseBuffer(2)                                 |
//      |                               OnBufferReady(2) <---   |
//      | ---> ReleaseBuffer(1)                                 |
//      |                         ...                           |
//      =                                                       =
// Buffers can be reallocated with a larger size, if e.g. resolution changes.
//      |                 (resolution change)                   |
//      |                           OnBufferDestroyed(1) <---   |
//      |                                 OnNewBuffer(3) <---   |
//      |                               OnBufferReady(3) <---   |
//      | ---> ReleaseBuffer(2)                                 |
//      |                           OnBufferDestroyed(2) <---   |
//      |                                 OnNewBuffer(5) <---   |
//      |                               OnBufferReady(5) <---   |
//      =                                                       =
// In the communication epilogue, the client Stop()s capture, receiving a last
// status update:
//      | ---> StopCapture                                      |
//      |                        OnStateChanged(STOPPED) <---   |

enum VideoCaptureState {
  STARTED,
  PAUSED,
  RESUMED,
  STOPPED,
  FAILED,
  ENDED,
};

// Interface for notifications from Browser/Host back to Renderer/Client. This
// interface is used between VideoCaptureHost.Start() and Stop().
interface VideoCaptureObserver {
  // Gets notified about a VideoCaptureState update.
  OnStateChanged(VideoCaptureState state);

  // Registers a |buffer_handle| at the Renderer/Client using the given
  // |buffer_id|. The Browser/Host may subsequently use |buffer_id| to share
  // video frames via calls to OnBufferReady().
  OnNewBuffer(int32 buffer_id, media.mojom.VideoBufferHandle buffer_handle);

  // |buffer| and |scaled_buffers| have capture data ready for consumption.
  OnBufferReady(ReadyBuffer buffer, array<ReadyBuffer> scaled_buffers);

  // The buffer handle previously registered for |buffer_id| via OnNewBuffer(),
  // is no longer going to be used by the Browser/Host.
  OnBufferDestroyed(int32 buffer_id);
};

interface VideoCaptureHost {
  // Start the |session_id| session with |params|. The video capture will be
  // identified as |device_id|, a new id picked by the renderer process.
  // |observer| will be used for notifications.
  Start(mojo_base.mojom.UnguessableToken device_id,
        mojo_base.mojom.UnguessableToken session_id,
        VideoCaptureParams params,
        pending_remote<VideoCaptureObserver> observer);

  // Closes the video capture specified by |device_id|.
  Stop(mojo_base.mojom.UnguessableToken device_id);

  // Pauses the video capture specified by |device_id|.
  Pause(mojo_base.mojom.UnguessableToken device_id);

  // Resume |device_id| video capture, in |session_id| and with |params|.
  Resume(mojo_base.mojom.UnguessableToken device_id,
         mojo_base.mojom.UnguessableToken session_id,
         VideoCaptureParams params);

  // Requests that the video capturer send a frame "soon" (e.g., to resolve
  // picture loss or quality issues).
  RequestRefreshFrame(mojo_base.mojom.UnguessableToken device_id);

  // Indicates that a renderer has finished using a previously shared buffer.
  ReleaseBuffer(mojo_base.mojom.UnguessableToken device_id, int32 buffer_id,
                VideoCaptureFeedback feedback);

  // Get the formats supported by a device referenced by |session_id|.
  GetDeviceSupportedFormats(mojo_base.mojom.UnguessableToken device_id,
                            mojo_base.mojom.UnguessableToken session_id)
    => (array<VideoCaptureFormat> formats_supported);

  // Get the format(s) in use by a device referenced by |session_id|.
  GetDeviceFormatsInUse(mojo_base.mojom.UnguessableToken device_id,
                        mojo_base.mojom.UnguessableToken session_id)
    => (array<VideoCaptureFormat> formats_in_use);

  // Notifies the host about a frame being dropped.
  OnFrameDropped(mojo_base.mojom.UnguessableToken device_id,
                 media.mojom.VideoCaptureFrameDropReason reason);

  // Sends a log message to the VideoCaptureHost.
  OnLog(mojo_base.mojom.UnguessableToken device_id, string message);
};
