// 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 video_capture.mojom;

import "mojom/video_capture_types.mojom";
import "mojom/device.mojom";
import "mojom/devices_changed_observer.mojom";
import "mojom/producer.mojom";
import "mojom/virtual_device.mojom";

enum DeviceAccessResultCode {
  NOT_INITIALIZED,
  SUCCESS,
  ERROR_DEVICE_NOT_FOUND
};

// Enables access to a set of video capture devices.
// Typical operation is to first call GetDeviceInfos() to obtain
// information about available devices. The |device_id| of the infos can
// subsequently be used to create an instance of
// video_capture.mojom.Device using CreateDevice().
// The factory guarantees that no two device infos it returns use the
// same |device_id|.
interface DeviceFactory {
  GetDeviceInfos()
      => (array<media.mojom.VideoCaptureDeviceInfo> device_infos);

  // Provides exclusive access to the device identified by |device_id|. The
  // access is valid until either the message pipe associated with
  // |device_receiver| is closed by the client, or a subsequent call to
  // CreateDevice() is made. When a subsequent call is made while the
  // |device_receiver| from a previous call has not yet been closed, the service
  // "revokes" that previous |device_receiver| (by closing the connection) and
  // the exclusive access goes to the new |device_receiver|.
  // Note: This design avoids the issue of it not being clear how soon after a
  // |device_receiver| has been (asynchronously) discarded a subsequent call to
  // CreateDevice() would succeed if it were to deny access while still in use.
  CreateDevice(string device_id, Device& device_request)
      => (DeviceAccessResultCode result_code);

  // Creates a new virtual capture device, which will be exposed by the device
  // factory using the given |device_info|. The returned |virtual_device| is to
  // be used by the caller to subsequently push video frames. These frames will
  // appear to clients of the device as if they were produced by the device.
  // If |send_buffer_handles_to_producer_as_raw_file_descriptors| is set to
  // true, buffers requested via
  // |SharedMemoryVirtualDevice.RequestFrameBuffer()| will be shared with
  // |producer| as |VideoBufferHandle.shared_memory_via_raw_file_descriptor|,
  // and otherwise as |VideoBufferHandle.shared_buffer_handle|.
  // The virtual device is removed either when the caller releases
  // |virtual_device| or the given |producer| is closed.
  AddSharedMemoryVirtualDevice(
      media.mojom.VideoCaptureDeviceInfo device_info,
      Producer producer,
      bool send_buffer_handles_to_producer_as_raw_file_descriptors,
      SharedMemoryVirtualDevice& virtual_device);

  // Similar to AddSharedMemoryVirtualDevice() but for virtual devices that
  // are fed with textures (via MailboxHolders) allocated by the caller instead
  // of shared memory buffers provided by the service on demand.
  AddTextureVirtualDevice(
      media.mojom.VideoCaptureDeviceInfo device_info,
      TextureVirtualDevice& virtual_device);

  // Registered observers will get notified whenever a virtual device is added
  // or removed. Note: Changes to non-virtual devices are currently being
  // monitored outside the video capture service, and therefore the service
  // does not offer such monitoring.
  RegisterVirtualDevicesChangedObserver(
      DevicesChangedObserver observer,
      bool raise_event_if_virtual_devices_already_present);
};
