chromium/chromeos/crosapi/mojom/video_capture.mojom

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module crosapi.mojom;

import "media/capture/mojom/image_capture.mojom";
import "media/capture/mojom/video_capture_types.mojom";
import "mojo/public/mojom/base/shared_memory.mojom";
import "mojo/public/mojom/base/time.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "ui/gfx/mojom/native_handle_types.mojom";

// This API is used to forward requests/respond of video_capture::DeviceFactory
// and video_capture::Device from Lacros (Client) to the actual implementation
// in Ash-Chrome.
// In addition, to avoid affecting too much on non-Chrome OS components and
// depends on components which will cause cyclic dependency, we used some
// similar but simplified version of structures rather than directly depends on
// the structures in other components.

// Similar to |gfx.mojom.NativePixmapHandle| but does not contain fields which
// are not available on Chrome OS.
// Next min field ID: 2
[Stable]
struct NativePixmapHandle {
  array<gfx.mojom.NativePixmapPlane> planes@0;

  uint64 modifier@1;
};

// Similar to |gfx.mojom.GpuMemoryBufferPlatformHandle| but does not contain
// fields which are not available on Chrome OS.
// Next min field ID: 2
[Stable]
union GpuMemoryBufferPlatformHandle {
  mojo_base.mojom.UnsafeSharedMemoryRegion shared_memory_handle@0;

  NativePixmapHandle native_pixmap_handle@1;
};

// Similar to |gfx.mojom.GpuMemoryBufferHandle| but does not depend on
// |gfx.mojom.GpuMemoryBufferPlatformHandle|.
// Next min field ID: 4
[Stable]
struct GpuMemoryBufferHandle {
  int32 id@0;

  uint32 offset@1;

  uint32 stride@2;

  GpuMemoryBufferPlatformHandle? platform_handle@3;
};

// Similar to |media.mojom.VideoBufferHandle| but does not contain fields which
// are not used in Chrome OS implementation.
// Next min field ID: 3
[Stable, Uuid="0259e126-6da3-4cbb-8774-da1a7bf7f2f8"]
union VideoBufferHandle {
  handle<shared_buffer> shared_buffer_handle@0;

  GpuMemoryBufferHandle gpu_memory_buffer_handle@1;

  // TODO(crbug.com/40202148): Until unions truly support versioning, we
  // don't have a way to check this/it ends up ignored. Currently this is only
  // set by code in ash to be read by lacros, which is strictly guaranteed to be
  // flowing from an older version to a newer version, so this is fine. It can
  // be proxied by checking if VideoCaptureDevice supports RequestRefreshFrame,
  // which was added at the same time.
  [MinVersion=1]
  mojo_base.mojom.ReadOnlySharedMemoryRegion read_only_shmem_region@2;
};

[Stable, Extensible]
enum DeviceAccessResultCode {
  NOT_INITIALIZED,
  SUCCESS,
  ERROR_DEVICE_NOT_FOUND
};

// Identical to |media.mojom.VideoRotation|.
[Stable, Extensible]
enum VideoRotation {
  kVideoRotation0,
  kVideoRotation90,
  kVideoRotation180,
  kVideoRotation270,
};

// Similar to |media.mojom.VideoFrameInfo| but without some fields which does
// not implement on Chrome OS. In addition, since most of the fields in
// |metadata| field is not used in Chrome OS implementation, we also simplify
// the structure by only containing |rotation| and |reference_time|.
// Next min field ID: 6
[Stable]
struct VideoFrameInfo {
  mojo_base.mojom.TimeDelta timestamp@0;

  media.mojom.VideoCapturePixelFormat pixel_format@1;

  gfx.mojom.Size coded_size@2;

  gfx.mojom.Rect visible_rect@3;

  // The following fields are the fields we may use for constructing
  // media::VideoFrameMetadata.
  VideoRotation rotation@4;

  mojo_base.mojom.TimeTicks reference_time@5;
};

// Similar to |video_capture.mojom.ReadyFrameInBuffer| but does not depend on
// |media.mojom.VideoFrameInfo| and
// |video_capture.mojom.ScopedAccessPermission|.
// Next min field ID: 4
[Stable]
struct ReadyFrameInBuffer {
  int32 buffer_id@0;

  int32 frame_feedback_id@1;

  pending_remote<ScopedAccessPermission> access_permission@2;

  VideoFrameInfo frame_info@3;
};

// Identical to |video_capture.mojom.ScopedAccessPermission|.
// Next min method ID: 0
[Stable, Uuid="bf0f3239-26d2-45f8-9875-490563f5af97"]
interface ScopedAccessPermission {};

// Similar to |video_capture.mojom.VideoFrameHandler| but depends on simplified
// structures.
// Next min method ID: 14
[Stable, Uuid="590ab36a-9162-4c9d-8429-1753108825ea"]
interface VideoFrameHandler {
  [MinVersion=3]
  OnCaptureConfigurationChanged@11();

  OnNewBuffer@0(int32 buffer_id, VideoBufferHandle buffer_handle);

  // Deprecated in favor of OnFrameReadyInBuffer() without `scaled_buffers`.
  // TODO(crbug.com/40938620): Delete when safe to do so.
  DEPRECATED_OnFrameReadyInBuffer@1(ReadyFrameInBuffer buffer,
                                    array<ReadyFrameInBuffer> scaled_buffers);
  [MinVersion=13]
  OnFrameReadyInBuffer@13(ReadyFrameInBuffer buffer);

  OnBufferRetired@2(int32 buffer_id);

  OnError@3(media.mojom.VideoCaptureError error);

  OnFrameDropped@4(media.mojom.VideoCaptureFrameDropReason reason);

  // Deprecated in favor of OnNewSubCaptureTargetVersion.
  [MinVersion=2]
  DEPRECATED_OnNewCropVersion@10(uint32 crop_version);

  [MinVersion=4]
  OnNewSubCaptureTargetVersion@12(uint32 sub_capture_target_version);

  [MinVersion=1]
  OnFrameWithEmptyRegionCapture@9();

  OnLog@5(string message);

  OnStarted@6();

  OnStartedUsingGpuDecode@7();

  OnStopped@8();
};

// Similar to |video_capture.mojom.Device| but depends on simplified structures.
// Next min method ID: 8
[Stable, Uuid="f50f1672-d512-451e-9c70-998ed45ab596"]
interface VideoCaptureDevice {
  // It is assumed that it will be called only once.
  Start@0(media.mojom.VideoCaptureParams requested_settings,
          pending_remote<VideoFrameHandler> handler);

  MaybeSuspend@1();

  Resume@2();

  GetPhotoState@3() => (media.mojom.PhotoState? capabilities);

  SetPhotoOptions@4(media.mojom.PhotoSettings settings) => (bool success);

  TakePhoto@5() => (media.mojom.Blob? blob);

  ProcessFeedback@6(media.mojom.VideoCaptureFeedback feedback);

  [MinVersion = 1]
  RequestRefreshFrame@7();
};

// Similar to |video_capture.mojom.DeviceFactory| but depends on simplified
// structures.
// Next min method ID: 2
[Stable, Uuid="b79ed8be-cf39-4d0d-a819-2d299022124a"]
interface VideoCaptureDeviceFactory {
  GetDeviceInfos@0()
      => (array<media.mojom.VideoCaptureDeviceInfo> device_infos);

  CreateDevice@1(string device_id,
                 pending_receiver<VideoCaptureDevice> device_receiver)
      => (DeviceAccessResultCode result_code);
};