// Copyright 2019 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 cros.mojom;

import "media/capture/mojom/image_capture.mojom";
import "media/capture/video/chromeos/mojom/camera_common.mojom";
import "media/capture/video/chromeos/mojom/camera_metadata.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "ui/gfx/range/mojom/range.mojom";

// Effect that recognized by Chrome OS.
enum Effect {
  NO_EFFECT = 0,
  PORTRAIT_MODE = 1,
};

// Stream types that can be observed by camera app device.
// This is a mirror of the StreamType in camera_device_delegate.h
enum StreamType {
  PREVIEW_OUTPUT = 0,
  JPEG_OUTPUT = 1,
  YUV_INPUT = 2,
  YUV_OUTPUT = 3,
  UNKNOWN = 4,
};

// Status code for getting camera app device.
enum GetCameraAppDeviceStatus {
  SUCCESS = 0,
  ERROR_INVALID_ID = 1,
};

// The purpose of this capture is to help the camera device decide optimal
// configurations.
enum CaptureIntent {
  DEFAULT = 0,
  VIDEO_RECORD = 1,
  STILL_CAPTURE = 2,
  DOCUMENT = 3,
};

// Interface to let Chrome Camera App (Remote) get specific CameraAppDevice from
// Chrome (Receiver).
interface CameraAppDeviceProvider {
  // Gets the interface to communicate with specific camera device given by
  // |source_id|. If the |status| is not success, the |device| would be null.
  GetCameraAppDevice(string source_id)
      => (GetCameraAppDeviceStatus status,
          pending_remote<CameraAppDevice>? device);

  // Checks if the device supports direct communication between camera devices
  // and camera app. Currently only devices running camera HAL v3 support this
  // feature.
  IsSupported() => (bool is_supported);

  // Add/Remove a virtual device for recording stream according to |enabled|.
  // The virtual device has the same config as |device_id| except facing
  // attribute.
  SetMultipleStreamsEnabled(string device_id, bool enabled) => (bool success);
};

// Inner interface that used to communicate between browser process (Remote) and
// the Video Capture service (Receiver).
interface CameraAppDeviceBridge {
  // Gets the interface to communicate with specific camera device given by
  // |device_id|. If the |status| is not success, the |device| would be null.
  GetCameraAppDevice(string device_id)
      => (GetCameraAppDeviceStatus status,
          pending_remote<CameraAppDevice>? device);

  // Checks if the device supports direct communication between camera devices
  // and camera app. Currently only devices running camera HAL v3 support this
  // feature.
  IsSupported() => (bool is_supported);

  // Add/Remove a virtual device for recording stream according to |enabled|.
  // The virtual device has the same config as |device_id| except facing
  // attribute.
  SetMultipleStreamsEnabled(string device_id, bool enabled) => (bool success);
};

// Interface for communication from the Chrome Camera App (Remote) to the camera
// device (Receiver). The Chrome Camera App is a system web app and runs inside
// a renderer process, with all the code resides in the Chrome OS rootfs. The
// camera device runs inside the browser process.
interface CameraAppDevice {
  // Gets camera information |camera_info| which includes camera facing,
  // characteristics, orientation, etc.
  GetCameraInfo() => (CameraInfo camera_info);

  // Sets reprocess options to bind with the coming take photo request. When
  // this method is called, the reprocess options will be queued. All reprocess
  // options in the queue will be consumed when ImageCapture::TakePhoto() is
  // triggered and all the queued reprocess options will be bound to that take
  // photo request.
  SetReprocessOptions(array<Effect> effects,
                      pending_remote<ReprocessResultListener> listener) => ();

  // Sets the fps range for upcoming configured camera stream.
  // The caller sets the |fps_range|.
  // If the given fps range is valid and set successfully, |is_success| returns
  // true. If the given fps range is invalid, the fps range which is cached
  // previously will be cleared and |is_success| will return false.
  SetFpsRange(gfx.mojom.Range fps_range) => (bool is_success);

  // Sets the |resolution| for still capture stream which should be
  // configured later so that we can configure the most suitable properties.
  SetStillCaptureResolution(gfx.mojom.Size resolution) => ();

  // Sets the intent for the upcoming capture session. The underlying video
  // capture device should configure the streams accordingly. Returns an empty
  // response after the intent is set, which could be used to sequence the
  // other calls such as getUserMedia().
  SetCaptureIntent(CaptureIntent intent) => ();

  // Adds the remote of a ResultMetadataObserver to CameraAppDevice.
  // The |observer| will have a remote call from camera device.
  AddResultMetadataObserver(pending_remote<ResultMetadataObserver> observer,
                            StreamType stream_type) => ();

  // Adds an observer for camera events. The |observer| is the remote of the
  // observer to be added.
  AddCameraEventObserver(pending_remote<CameraEventObserver> observer) => ();

  // Sets whether to disable the camera frame rotation at source. Sets
  // |is_success| to true if |is_enabled| is correctly set.
  SetCameraFrameRotationEnabledAtSource(bool is_enabled) => (bool is_success);

  // Gets the clock-wise rotation in degree applied, or needs to be applied if
  // the rotation is disabled at source, on the raw camera frame in order to
  // display the camera preview upright in the UI. The only valid values for
  // |rotation| are 0, 90, 180, and 270.
  GetCameraFrameRotation() => (uint32 rotation);

  // Registers the document corners observer for preview.
  RegisterDocumentCornersObserver(
      pending_remote<DocumentCornersObserver> observer) => ();
};

// Interface for camera device to send camera metadata to Chrome Camera App.
interface ResultMetadataObserver {
  // Remotely invoked by camera device whenever a |camera_metadata| of a frame
  // is produced.
  OnMetadataAvailable(CameraMetadata camera_metadata);
};

// Interface for observing camera events such as shutter done.
interface CameraEventObserver {
  // Triggered when the shutter is done for a still capture image.
  OnShutterDone();
};

// Interface for document corners detection.
interface DocumentCornersObserver {
  // Triggered when the detected document |corners| should be updated.
  // The amount of corners will be either 0, indicating there are no corners
  // detected, or 4, which are in top-left => bottom-left => bottom-right =>
  // top-right order. The value of the coordinate of a corner will be in [0, 1).
  OnDocumentCornersUpdated(array<gfx.mojom.PointF> corners);
};

// Interface for the listener of reprocess results.
interface ReprocessResultListener {
  // Triggered when reprocess done for target |effect|.
  OnReprocessDone(Effect effect, int32 status, media.mojom.Blob? blob);
};
