[go: nahoru, domu]

blob: 8fc1c27a7f7dc6999d4093f2ae960832fd7503de [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// 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/mojom/media_log.mojom";
import "media/mojo/mojom/media_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/color_space.mojom";
import "media/mojo/mojom/video_encoder_info.mojom";
import "sandbox/policy/mojom/sandbox.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.
enum VideoEncodeAcceleratorSupportedRateControlMode {
kNoMode,
kConstantMode,
kVariableMode,
kExternalMode
};
struct VideoEncodeAcceleratorSupportedProfile {
VideoCodecProfile profile;
gfx.mojom.Size min_resolution;
gfx.mojom.Size max_resolution;
uint32 max_framerate_numerator;
uint32 max_framerate_denominator;
array<VideoEncodeAcceleratorSupportedRateControlMode> rate_control_modes;
array<SVCScalabilityMode> scalability_modes;
bool is_software_codec;
};
// A renderer process calls this interface's functions. GPU process implements
// this interface.
interface VideoEncodeAcceleratorProvider {
// Creates a VideoEncodeAccelerator bound to |receiver|.
CreateVideoEncodeAccelerator(
pending_receiver<VideoEncodeAccelerator> receiver);
// Get a VideoEncodeAccelerator supported profiles.
GetVideoEncodeAcceleratorSupportedProfiles()
=> (array<VideoEncodeAcceleratorSupportedProfile> profiles);
};
// This interface allows the browser process to broker
// VideoEncodeAcceleratorProvider connection requests on behalf of a renderer.
// The browser creates the mojo pipe and gives the receiver to a utility
// process. The expected usage is as follows:
//
// 1) The browser process receives a request from a renderer process to bind a
// pending_receiver<VideoEncodeAcceleratorProvider>.
//
// 2) To satisfy that request, the browser process first starts a utility
// process that hosts a VideoEncodeAcceleratorProviderFactory if it hasn't
// already done so -- note that each renderer process should get its own
// corresponding utility process.
//
// 3) The browser process calls CreateVideoEncodeAcceleratorProvider() passing
// the pending_receiver<VideoEncodeAcceleratorProvider> received from the
// renderer process.
[EnableIf=is_linux_or_chromeos,
ServiceSandbox=sandbox.mojom.Sandbox.kHardwareVideoEncoding]
interface VideoEncodeAcceleratorProviderFactory {
// Creates a VideoEncodeAcceleratorProvider and should be called by the
// browser process.
CreateVideoEncodeAcceleratorProvider(
pending_receiver<VideoEncodeAcceleratorProvider> receiver);
};
// This defines a mojo transport format used in the
// mojo::VideoBitrateAllocation that corresponds to media::Bitrate::peak_bps_
struct VariableBitratePeak {
uint32 bps;
};
// Class that describes how video bitrate, in bps, is allocated across temporal
// and spatial layers. See media::VideoBitrateAllocation for more details.
struct VideoBitrateAllocation {
array<uint32> bitrates;
VariableBitratePeak? variable_bitrate_peak;
};
// This defines a mojo transport format for
// media::VideoEncodeAccelerator::Config::SpatialLayer.
struct SpatialLayer {
int32 width;
int32 height;
uint32 bitrate_bps;
uint32 framerate;
uint8 max_qp;
uint8 num_of_temporal_layers;
};
// This defines a mojo transport format for a media::Bitrate of type kConstant.
// The default target here matches that in media::Bitrate.
struct ConstantBitrate {
uint32 target_bps = 0;
};
// This defines a mojo transport format for a media::Bitrate of type kVariable.
// The default target here matches that in media::Bitrate.
struct VariableBitrate {
uint32 target_bps = 0;
uint32 peak_bps;
};
struct ExternalBitrate {
};
// This defines a mojo transport format for media::Bitrate.
union Bitrate {
ConstantBitrate constant;
VariableBitrate variable;
ExternalBitrate external;
};
// This defines a mojo transport format for
// media::VideoEncodeAccelerator::Config.
struct VideoEncodeAcceleratorConfig {
// See media::VideoEncodeAccelerator::Config::ContentType
enum ContentType {
kCamera,
kDisplay
};
// See media::VideoEncodeAccelerator::Config::StorageType
enum StorageType {
kShmem,
kGpuMemoryBuffer,
};
// See media::VideoEncodeAccelerator::Config::EncoderType
enum EncoderType {
kHardware,
kSoftware,
kNoPreference,
};
VideoPixelFormat input_format;
gfx.mojom.Size input_visible_size;
VideoCodecProfile output_profile;
Bitrate bitrate;
uint32 initial_framerate;
bool has_initial_framerate; // Whether or not config has initial framerate
uint32 gop_length;
bool has_gop_length; // Whether or not config has group of picture length
uint8 h264_output_level;
bool has_h264_output_level; // Whether or not config has H264 output level
bool is_constrained_h264;
StorageType storage_type;
bool has_storage_type; // Whether or not config has storage type config
ContentType content_type;
// See VideoEncodeAccelerator::Config for detail. Since this is a percentage
// between 0 and 100, the type is uint8.
uint8 drop_frame_thresh_percentage;
array<SpatialLayer> spatial_layers;
SVCInterLayerPredMode inter_layer_pred;
bool require_low_delay;
EncoderType required_encoder_type;
};
// Options for encoding a single frame by VideoEncodeAccelerator.
// This defines a mojo transport format for a
// media::VideoEncoder::EncodeOptions.
struct VideoEncodeOptions {
// If True, next frame must be encoded as I-frame (random access point)
bool force_keyframe;
// Quantizer(QP) value for encoding of the given frame.
// This value is only heeded if VEA configured with external rate control mode
// TODO(crbug.com/657632): All negative values mean "ignore this field",
// we don't use proper optional field because Java bindgen doesn't support
// optional primitive types.
int32 quantizer;
};
// The interface to access the hardware video encoding accelerator.
interface VideoEncodeAccelerator {
// Responded by VideoEncodeAcceleratorClient.RequireBitstreamBuffers().
[Sync]
Initialize(VideoEncodeAcceleratorConfig config,
pending_associated_remote<VideoEncodeAcceleratorClient> client,
pending_remote<MediaLog> media_log)
=> (bool result);
// Encodes a |frame|, being completely done with it after its callback.
Encode(VideoFrame frame, VideoEncodeOptions options) => ();
UseOutputBitstreamBuffer(int32 bitstream_buffer_id,
mojo_base.mojom.UnsafeSharedMemoryRegion region);
// Request a change to the encoding parameters.
// This method is intended for use with spatial or temporal layers,
// and is implicitly a constant bitrate encoding.
// Parameters:
// |bitrate_allocation| is the requested new bitrate, per spatial and
// temporal layer.
// |framerate| is the requested new framerate, in frames per second.
// |size| is the requested new input visible frame size. Clients can request
// frame size change only when there is no pending frame in the
// encoder.
RequestEncodingParametersChangeWithLayers(
VideoBitrateAllocation bitrate_allocation,
uint32 framerate,
gfx.mojom.Size? size);
// Request a change to the encoding parameters. This method is for use
// with non-layered bitrates, and may make requests for constant or
// variable bitrates based on the initially-configured bitrate mode.
// Parameters:
// |bitrate| is the requested new bitrate for non-layered encoding, which
// may be constant or variable bitrate. This should not change the
// encoding mode (constant -> variable or variable -> constant).
// |framerate| is the requested new framerate, in frames per second.
// |size| is the requested new input visible frame size. Clients can request
// frame size change only when there is no pending frame in the
// encoder.
RequestEncodingParametersChangeWithBitrate(
Bitrate bitrate,
uint32 framerate,
gfx.mojom.Size? size);
[Sync]
IsFlushSupported() => (bool result);
Flush() => (bool result);
};
// H264Metadata, H265metadata, Vp8Metadata, Vp9Metadata and Av1Metadata define
// mojo transport formats for media::H264Metadata, H265Metadata,
// media::Vp8Metadata, media::Vp9Metadata and media::Av1Metadata, respectively.
// See the structures defined video_encode_accelerator.h for the descriptions of
// the variables.
// Either of them is filled in GPU process only in the case of temporal/spatial
// SVC encoding. That is, none of them is filled in the case of non
// temporal/spatial SVC encoding. Thus CodecMetadata is union and CodecMetadata
// exists as optional in BitstreamBufferMetadata.
// BitstreamBufferMetadata is metadata about a bitstream buffer produced by a
// hardware encoder. The structure is passed from GPU process to renderer
// process in BitstreamBufferReady() call.
struct H264Metadata {
uint8 temporal_idx;
bool layer_sync;
};
struct H265Metadata {
uint8 temporal_idx;
};
struct Vp8Metadata {
bool non_reference;
uint8 temporal_idx;
bool layer_sync;
};
struct Vp9Metadata {
bool inter_pic_predicted;
bool temporal_up_switch;
bool referenced_by_upper_spatial_layers;
bool reference_lower_spatial_layers;
uint8 temporal_idx;
uint8 spatial_idx;
array<gfx.mojom.Size> spatial_layer_resolutions;
uint8 begin_active_spatial_layer_index;
uint8 end_active_spatial_layer_index;
array<uint8> p_diffs;
};
struct Av1Metadata {
uint8 temporal_idx;
};
// Codec specific metadata.
union CodecMetadata {
H264Metadata h264;
H265Metadata h265;
Vp8Metadata vp8;
Vp9Metadata vp9;
Av1Metadata av1;
};
struct BitstreamBufferMetadata {
uint32 payload_size_bytes;
bool key_frame;
mojo_base.mojom.TimeDelta timestamp;
bool end_of_picture;
int32 qp;
CodecMetadata? codec_metadata;
gfx.mojom.Size? encoded_size;
gfx.mojom.ColorSpace? encoded_color_space;
};
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,
BitstreamBufferMetadata metadata);
// VideoEncodeAccelerator calls this when the error occurs and it cannot
// perform encoding any more. |status| represents the detail about the error.
NotifyErrorStatus(EncoderStatus status);
// VideoEncodeAccelerator calls this when its VideoEncoderInfo is changed.
// |info| is the updated VideoEncoderInfo.
NotifyEncoderInfoChange(VideoEncoderInfo info);
};