blob: b464ae5902f125e9424f534e5ae8713d23df8268 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.ui.composition.internal;
using fuchsia.ui.composition;
using fuchsia.math;
using zx;
/// Possible errors of the ScreenCapture protocol.
type ScreenCaptureError = flexible enum {
/// One or more of the arguments was missing.
MISSING_ARGS = 1;
/// One or more of the arguments was not valid.
INVALID_ARGS = 2;
/// Indicates that the client has sent an overwritten hanging get.
BAD_HANGING_GET = 3;
};
/// Rotation applied to the image.
/// For example, if the display is rotated 90 degrees according to its
/// `display_info` config file, the image can be captured as if the display
/// is not rotated (0 degrees) by applying CW_270_DEGREES.
type ScreenCaptureRotation = strict enum {
CW_0_DEGREES = 0;
CW_90_DEGREES = 1;
CW_180_DEGREES = 2;
CW_270_DEGREES = 3;
};
/// Fields required to set up a ScreenCapture protocol in the [`Configure`]
/// call. Notice some fields are optional.
type ScreenCaptureConfig = resource table {
/// The import token referencing a BufferCollection registered with the
/// Allocator.
/// Required.
1: import_token fuchsia.ui.composition.BufferCollectionImportToken;
/// The size of the image in pixels: width and height.
/// This should be the width and height calculated after the
/// rotation that will be applied.
/// Required.
2: image_size fuchsia.math.SizeU;
/// The rotation applied to the stream of images.
/// Defaults to CW_0_DEGREES (no rotation).
/// Optional.
3: image_rotation ScreenCaptureRotation;
};
/// Return fields of the [`GetNextFrame`] call. These fields hold the
/// frame’s information on buffer location, timing, and a way to release
/// after using it. All fields will be returned by the server.
type FrameInfo = resource table {
/// The index of the VMO where the requested frame has been rendered
/// in the buffer collection.
1: buffer_index uint32;
/// The time that the buffer was populated with the frame.
2: capture_timestamp zx.Time;
/// The release token for |buffer_index|. The client drops the eventpair
/// to signal to the server that |buffer_index| is free for writing.
/// If the eventpair is not dropped, then in the future calls to
/// [`GetNextFrame`], if there are no available buffers, the server will
/// wait until the client frees up a past buffer. If the client was holding
/// on to all buffers in the buffer collection and then
/// releases a buffer while hanging, the server will immediately return the
/// latest frame.
3: buffer_release_token zx.Handle:EVENTPAIR;
};
/// Provides a low-level streaming API for clients to use.
/// ScreenCapture clients should familiarize themselves with the
/// [`fuchsia.sysmem/BufferCollection`] and
/// [`fuchsia.ui.composition/Allocator`] protocols as those are necessary to
/// create the BufferCollections and images ScreenCapture uses.
@discoverable
closed protocol ScreenCapture {
/// Clients should first use the ['fuchsia.ui.composition/Allocator']
/// protocol to register a BufferCollection.
///
/// Similarly, the clients are responsible for specifying a buffer big
/// enough for the image. If the buffer is too small, an
/// attempt will be made to render the image, however, it will not be
/// guaranteed to contain the complete image.
strict Configure(ScreenCaptureConfig) -> () error ScreenCaptureError;
/// [`GetNextFrame`] returns the latest unseen-by-the-client frame as soon
/// as possible. On the first call to [`GetNextFrame`] and any subsequent
/// calls that have not recieved the previous expected requested frame,
/// [`GetNextFrame`] will return immediately with the last frame to be
/// rendered. If the client had requested the previous frame, the server
/// will wait until the next frame is produced to return.
///
/// After the client finishes processing the returned buffer, they should
/// drop the eventpair to signal to the server that the buffer can be
/// re-used.
///
/// It is invalid to call [`GetNextFrame`] while a previous call is still
/// pending. Doing so will return a BAD_HANGING_GET error and cause the
/// channel to close.
strict GetNextFrame() -> (FrameInfo) error ScreenCaptureError;
};