// 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);
};