blob: 32675d2ff4fe7ad97ccef3fb4437098393003284 [file] [log] [blame]
// 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 media.mojom;
import "media/capture/mojom/video_capture_buffer.mojom";
import "media/capture/mojom/video_capture_types.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";
// This file decribes the communication between a given Renderer Host interface
// implementation (VideoCaptureHost) and a remote VideoCaptureObserver.
// VideoCaptureHost offers a stateless part (GetDeviceSupportedFormats() and
// GetDeviceFormatsInUse()) that can be invoked at any time, and a stateful part
// sandwiched between Start() and Stop(). A Client's OnStateChanged() can be
// notified any time during the stateful part. The stateful part is composed of
// a preamble where a Renderer client sends a command to Start() the capture,
// registering itself as the associated remote VideoCaptureObserver. The Host
// will then create and pre- share a number of buffers:
//
// Observer VideoCaptureHost
// | ---> StartCapture |
// | OnStateChanged(STARTED) <--- |
// | OnNewBuffer(1) <--- |
// | OnNewBuffer(2) <--- |
// = =
// and capture will then refer to those preallocated buffers:
// | OnBufferReady(1) <--- |
// | OnBufferReady(2) <--- |
// | ---> ReleaseBuffer(1) |
// | OnBufferReady(1) <--- |
// | ---> ReleaseBuffer(2) |
// | OnBufferReady(2) <--- |
// | ---> ReleaseBuffer(1) |
// | ... |
// = =
// Buffers can be reallocated with a larger size, if e.g. resolution changes.
// | (resolution change) |
// | OnBufferDestroyed(1) <--- |
// | OnNewBuffer(3) <--- |
// | OnBufferReady(3) <--- |
// | ---> ReleaseBuffer(2) |
// | OnBufferDestroyed(2) <--- |
// | OnNewBuffer(5) <--- |
// | OnBufferReady(5) <--- |
// = =
// In the communication epilogue, the client Stop()s capture, receiving a last
// status update:
// | ---> StopCapture |
// | OnStateChanged(STOPPED) <--- |
enum VideoCaptureState {
STARTED,
PAUSED,
RESUMED,
STOPPED,
FAILED,
ENDED,
};
// Interface for notifications from Browser/Host back to Renderer/Client. This
// interface is used between VideoCaptureHost.Start() and Stop().
interface VideoCaptureObserver {
// Gets notified about a VideoCaptureState update.
OnStateChanged(VideoCaptureState state);
// Registers a |buffer_handle| at the Renderer/Client using the given
// |buffer_id|. The Browser/Host may subsequently use |buffer_id| to share
// video frames via calls to OnBufferReady().
OnNewBuffer(int32 buffer_id, media.mojom.VideoBufferHandle buffer_handle);
// |buffer| and |scaled_buffers| have capture data ready for consumption.
OnBufferReady(ReadyBuffer buffer, array<ReadyBuffer> scaled_buffers);
// The buffer handle previously registered for |buffer_id| via OnNewBuffer(),
// is no longer going to be used by the Browser/Host.
OnBufferDestroyed(int32 buffer_id);
};
interface VideoCaptureHost {
// Start the |session_id| session with |params|. The video capture will be
// identified as |device_id|, a new id picked by the renderer process.
// |observer| will be used for notifications.
Start(mojo_base.mojom.UnguessableToken device_id,
mojo_base.mojom.UnguessableToken session_id,
VideoCaptureParams params,
pending_remote<VideoCaptureObserver> observer);
// Closes the video capture specified by |device_id|.
Stop(mojo_base.mojom.UnguessableToken device_id);
// Pauses the video capture specified by |device_id|.
Pause(mojo_base.mojom.UnguessableToken device_id);
// Resume |device_id| video capture, in |session_id| and with |params|.
Resume(mojo_base.mojom.UnguessableToken device_id,
mojo_base.mojom.UnguessableToken session_id,
VideoCaptureParams params);
// Requests that the video capturer send a frame "soon" (e.g., to resolve
// picture loss or quality issues).
RequestRefreshFrame(mojo_base.mojom.UnguessableToken device_id);
// Indicates that a renderer has finished using a previously shared buffer.
ReleaseBuffer(mojo_base.mojom.UnguessableToken device_id, int32 buffer_id,
VideoCaptureFeedback feedback);
// Get the formats supported by a device referenced by |session_id|.
GetDeviceSupportedFormats(mojo_base.mojom.UnguessableToken device_id,
mojo_base.mojom.UnguessableToken session_id)
=> (array<VideoCaptureFormat> formats_supported);
// Get the format(s) in use by a device referenced by |session_id|.
GetDeviceFormatsInUse(mojo_base.mojom.UnguessableToken device_id,
mojo_base.mojom.UnguessableToken session_id)
=> (array<VideoCaptureFormat> formats_in_use);
// Notifies the host about a frame being dropped.
OnFrameDropped(mojo_base.mojom.UnguessableToken device_id,
media.mojom.VideoCaptureFrameDropReason reason);
// Sends a log message to the VideoCaptureHost.
OnLog(mojo_base.mojom.UnguessableToken device_id, string message);
};