// Copyright 2017 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/mojo/interfaces/media_types.mojom"; import "mojo/public/mojom/base/time.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; // This file is the Mojo version of the media::VideoEncodeAccelerator interface // and describes the communication between a Client and a remote "service" // VideoEncodeAccelerator (VEA) with the purpose of encoding Video Frames by // means of hardware accelerated features. // // Client VideoEncodeAccelerator // | ---> Initialize | // | RequireBitstreamBuffers(N) <--- | // | ---> UseOutputBitstreamBuffer(0) | // | ---> UseOutputBitstreamBuffer(1) | // | ... | // = = // The Client requests a remote Encode() and eventually the VEA will leave the // encoded results in a pre-shared BitstreamBuffer, that is then restored to the // VEA when the Client is finished with it. Note that there might not be a 1:1 // relationship between Encode() and BitstreamBufferReady() calls. // | ---> Encode() | // | BitstreamBufferReady(k) <--- | // | ---> UseOutputBitstreamBuffer(k) | // = = // At any time the VEA can send a NotifyError() to the Client. Similarly at any // time the Client can send a RequestEncodingParametersChange() to the VEA. None // of these messages are acknowledged. interface VideoEncodeAcceleratorProvider { CreateVideoEncodeAccelerator(VideoEncodeAccelerator& request); }; interface VideoEncodeAccelerator { // See media::VideoEncodeAccelerator::Error enum Error { ILLEGAL_STATE, INVALID_ARGUMENT, PLATFORM_FAILURE }; // Responded by VideoEncodeAcceleratorClient.RequireBitstreamBuffers(). // TODO(mcasas): Update to asynchronous, https://crbug.com/744210. [Sync] Initialize(VideoPixelFormat input_format, gfx.mojom.Size input_visible_size, VideoCodecProfile output_profile, uint32 initial_bitrate, VideoEncodeAcceleratorClient client) => (bool result); // Encodes a |frame|, being completely done with it after its callback. Encode(VideoFrame frame, bool force_keyframe) => (); UseOutputBitstreamBuffer(int32 bitstream_buffer_id, handle buffer); RequestEncodingParametersChange(uint32 bitrate, uint32 framerate); }; interface VideoEncodeAcceleratorClient { // Response to VideoEncodeAccelerator.Initialize(). RequireBitstreamBuffers(uint32 input_count, gfx.mojom.Size input_coded_size, uint32 output_buffer_size); BitstreamBufferReady(int32 bitstream_buffer_id, uint32 payload_size, bool key_frame, mojo_base.mojom.TimeDelta timestamp); NotifyError(VideoEncodeAccelerator.Error error); };