// Copyright 2014 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 "gpu/ipc/common/mailbox_holder.mojom";
import "gpu/ipc/common/vulkan_ycbcr_info.mojom";
import "mojo/public/mojom/base/time.mojom";
import "mojo/public/mojom/base/values.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "ui/gfx/mojom/buffer_types.mojom";
import "ui/gfx/mojom/color_space.mojom";
import "ui/gfx/mojom/hdr_metadata.mojom";

// See media/base/audio_codecs.h for descriptions.
[Native]
enum AudioCodec;
[Native]
enum AudioCodecProfile;

// See media/base/buffering_state.h for descriptions.
[Native]
enum BufferingState;
[Native]
enum BufferingStateChangeReason;

// See media/base/channel_layout.h for descriptions.
[Native]
enum ChannelLayout;

// See media/base/decode_status.h for descriptions.
[Native]
enum DecodeStatus;

// See media/base/status_codes.h for descriptions.
[Native]
enum StatusCode;

// See media/base/media_content_type.h for descriptions.
[Native]
enum MediaContentType;

// See media/base/media_log_record.h for description.
[Native]
struct MediaLogRecord;

// See media/base/output_device_info.h for descriptions.
[Native]
enum OutputDeviceStatus;

// See media/base/pipeline_status.h for descriptions.
[Native]
enum PipelineStatus;

// See media/base/sample_format.h for descriptions.
[Native]
enum SampleFormat;

// See media/base/video_codecs.h for descriptions.
[Native]
enum VideoCodec;

// See media/base/video_codecs.h for descriptions.
[Native]
enum VideoCodecProfile;

// See media/base/video_types.h for descriptions.
[Native]
enum VideoPixelFormat;

// See media/base/decoder.h for descriptions.
[Native]
enum VideoDecoderType;

// See media/base/decoder.h for descriptions.
[Native]
enum AudioDecoderType;

// See media/base/video_transformation.h for descriptions.
enum VideoRotation {
  kVideoRotation0,
  kVideoRotation90,
  kVideoRotation180,
  kVideoRotation270,
};

// see media/base/video_frame_metadata.h for descriptions.
enum CopyMode {
  kCopyToNewTexture,
  kCopyMailboxesOnly,
};

// see third_party/blink/public/platform/web_fullscreen_video_status.h for
// descriptions.
[Native]
enum FullscreenVideoStatus;

// See media/base/video_transformation.h for descriptions.
struct VideoTransformation {
  VideoRotation rotation;
  bool mirrored;
};

// See media/base/waiting.h for descriptions.
[Native]
enum WaitingReason;

// See media/base/watch_time_keys.h for descriptions.
[Native]
enum WatchTimeKey;

// See media/base/container_names.h for descriptions.
[Native]
enum MediaContainerName;

// See media/base/media_status.h for description.
[Native]
enum MediaStatusState;

// This defines a mojo transport format for media::EncryptionPattern
// See media/base/encryption_pattern.h for description.
[Stable]
struct EncryptionPattern {
  uint32 crypt_byte_block;
  uint32 skip_byte_block;
};

// See media/base/encryption_scheme.h for description.
[Native]
enum EncryptionScheme;

// See media::EncryptionType for descriptions.
enum EncryptionType {
  kNone,
  kClear,
  kEncrypted,
  kEncryptedWithClearLead,
};

// See media/base/svc_scalability_mode.h for description.
// This mojo enum only list hardware codec supported scalability mode.
enum SVCScalabilityMode {
  // kUnsupportedMode is used to handle the enum differ of C++ and Mojo
  // SVCScalabilityMode in ToMojom, should not be used in other place.
  kUnsupportedMode,
  kL1T2,
  kL1T3,
  kL2T2Key,
  kL2T3Key,
  kL3T2Key,
  kL3T3Key,
};

// This defines a mojo transport format for media::VideoColorSpace.
// See media/base/video_color_space.h for description.
struct VideoColorSpace {
  [Native]
  enum PrimaryID;

  [Native]
  enum TransferID;

  [Native]
  enum MatrixID;

  [Native]
  enum RangeID;

  PrimaryID primaries;
  TransferID transfer;
  MatrixID matrix;
  RangeID range;
};

// This defines a mojo transport format for media::AudioDecoderConfig.
// See media/base/audio_decoder_config.h for descriptions.
// TODO(crbug.com/1232205): Support `channels_` set by SetChannelsForDiscrete().
struct AudioDecoderConfig {
  AudioCodec codec;
  SampleFormat sample_format;
  ChannelLayout channel_layout;
  int32 samples_per_second;
  array<uint8> extra_data;
  EncryptionScheme encryption_scheme;
  mojo_base.mojom.TimeDelta seek_preroll;
  int32 codec_delay;
  AudioCodecProfile profile;
  ChannelLayout target_output_channel_layout;
  bool should_discard_decoder_delay;
  array<uint8> aac_extra_data;
};

// This defines a mojo transport format for media::VideoDecoderConfig.
// See media/base/video_decoder_config.h for descriptions.
struct VideoDecoderConfig {
  VideoCodec codec;
  VideoCodecProfile profile;
  uint32 level;
  bool has_alpha;
  VideoTransformation transformation;
  gfx.mojom.Size coded_size;
  gfx.mojom.Rect visible_rect;
  gfx.mojom.Size natural_size;
  array<uint8> extra_data;
  EncryptionScheme encryption_scheme;
  VideoColorSpace color_space_info;
  gfx.mojom.HDRMetadata? hdr_metadata;
};

// Native struct media::SubsampleEntry;
[Native]
struct SubsampleEntry;

// See media::CdmSessionClosedReason for descriptions.
enum CdmSessionClosedReason {
  kInternalError,
  kClose,
  kReleaseAcknowledged,
  kHardwareContextReset,
  kResourceEvicted,
};

// This defines a mojo transport format for media::DecryptConfig.
// See media/base/decrypt_config.h for descriptions.
struct DecryptConfig {
  EncryptionScheme encryption_scheme;
  string key_id;
  string iv;
  array<SubsampleEntry> subsamples;
  EncryptionPattern? encryption_pattern;
};

// This defines a mojo transport format for media::DecoderBuffer.
struct DecoderBuffer {
  mojo_base.mojom.TimeDelta timestamp;
  mojo_base.mojom.TimeDelta duration;

  // Whether the buffer is an end-of-stream (EOS) buffer.
  bool is_end_of_stream;

  // The number of bytes present in this buffer. The data is not serialized
  // along with this structure and must be read from a separate DataPipe.
  // Note that |data_size| could be zero even for a non-EOS buffer (e.g.
  // with non-empty |size_data|). See http://crbug.com/663438
  uint32 data_size;

  // Indicates whether or not this buffer is a random access point.
  bool is_key_frame;

  // Empty when |side_data| doesn't exist.
  array<uint8> side_data;

  // DecryptConfig for a encrypted buffer. NULL if the buffer is not encrypted.
  DecryptConfig? decrypt_config;

  // These fields indicate the amount of data to discard after decoding.
  mojo_base.mojom.TimeDelta front_discard;
  mojo_base.mojom.TimeDelta back_discard;
};

// This defines a mojo transport format for media::AudioBuffer.
struct AudioBuffer {
  // Format of the audio.
  SampleFormat sample_format;

  // How the channels are laid out.
  ChannelLayout channel_layout;

  // Number of channels.
  int32 channel_count;

  // Sample rate of the buffer.
  int32 sample_rate;

  // Number of frames in the buffer.
  int32 frame_count;

  // True if end of stream.
  bool end_of_stream;

  // Timestamp in microseconds of the first frame.
  mojo_base.mojom.TimeDelta timestamp;

  // Channel data. Will be empty for EOS buffers.
  array<uint8> data;
};

// This defines a mojo transport format for an interleaved, signed
// 16-bit audio buffer.
struct AudioDataS16 {
  // Number of channels.
  int32 channel_count;

  // Sample rate of the buffer.
  int32 sample_rate;

  // Number of frames in the buffer.
  int32 frame_count;

  // Channel data.
  array<int16> data;
};

// See media/base/video_frame_metadata.h for a description of fields.
// TODO(crbug.com/657632): Remove |has_*| values and use nullable types.
struct VideoFrameMetadata {
  bool allow_overlay;

  mojo_base.mojom.TimeTicks? capture_begin_time;
  mojo_base.mojom.TimeTicks? capture_end_time;

  bool has_capture_counter;
  int32 capture_counter;

  gfx.mojom.Rect? capture_update_rect;

  bool has_copy_mode;
  CopyMode copy_mode;

  bool end_of_stream;

  mojo_base.mojom.TimeDelta? frame_duration;

  bool has_frame_rate;
  double frame_rate;

  bool interactive_content;

  mojo_base.mojom.TimeTicks? reference_time;

  bool read_lock_fences_enabled;

  VideoTransformation? transformation;

  bool texture_owner;

  bool wants_promotion_hint;

  bool protected_video;

  bool hw_protected;

  mojo_base.mojom.UnguessableToken? overlay_plane_id;

  bool power_efficient;

  bool texture_origin_is_top_left;

  bool has_device_scale_factor;
  double device_scale_factor;

  bool has_page_scale_factor;
  double page_scale_factor;

  bool has_root_scroll_offset_x;
  double root_scroll_offset_x;

  bool has_root_scroll_offset_y;
  double root_scroll_offset_y;

  bool has_top_controls_visible_height;
  double top_controls_visible_height;

  mojo_base.mojom.TimeTicks? decode_begin_time;
  mojo_base.mojom.TimeTicks? decode_end_time;

  mojo_base.mojom.TimeDelta? processing_time;

  bool has_rtp_timestamp;
  double rtp_timestamp;

  mojo_base.mojom.TimeTicks? receive_time;

  mojo_base.mojom.TimeDelta? wallclock_frame_duration;

  uint32 hw_protected_validation_id;
};

// This defines a mojo transport format for media::VideoFrame.
struct VideoFrame {
  // Format of the frame.
  VideoPixelFormat format;

  // Width and height of the video frame, in pixels.
  gfx.mojom.Size coded_size;

  // Visible size of the frame.
  gfx.mojom.Rect visible_rect;

  // Natural size of the frame.
  gfx.mojom.Size natural_size;

  // Timestamp in microseconds of the associated frame.
  mojo_base.mojom.TimeDelta timestamp;

  // Contents of the video frame (or EOS marker).
  VideoFrameData data;

  // Extra properties associated with the VideoFrame.
  VideoFrameMetadata metadata;

  gfx.mojom.ColorSpace color_space;
  gfx.mojom.HDRMetadata? hdr_metadata;
};

// Possible choices for storing VideoFrame data.
union VideoFrameData {
  EosVideoFrameData eos_data;
  SharedBufferVideoFrameData shared_buffer_data;
  GpuMemoryBufferVideoFrameData gpu_memory_buffer_data;
  MailboxVideoFrameData mailbox_data;
};

// A marker for EOS frames.
struct EosVideoFrameData {
};

// This defines video frame data stored in a Mojo shared buffer.
struct SharedBufferVideoFrameData {
  // Reference to the shared memory containing the frame's data.
  handle<shared_buffer> frame_data;
  uint64 frame_data_size;

  // Stride and offsets for each plane. Offsets are relative to the start
  // of |frame_data|.
  array<int32> strides;
  array<uint32> offsets;
};

struct GpuMemoryBufferVideoFrameData {
  gfx.mojom.GpuMemoryBufferHandle gpu_memory_buffer_handle;
  array<gpu.mojom.MailboxHolder, 4> mailbox_holder;
};

// This defines video frame data stored in texture mailboxes.
struct MailboxVideoFrameData {
  // Size must be kept in sync with media::VideoFrame::kMaxPlanes.
  array<gpu.mojom.MailboxHolder, 4> mailbox_holder;
  gpu.mojom.VulkanYCbCrInfo? ycbcr_data;
};

struct PipelineStatistics {
  uint64 audio_bytes_decoded;
  uint64 video_bytes_decoded;
  uint32 video_frames_decoded;
  uint32 video_frames_dropped;
  int64 audio_memory_usage;
  int64 video_memory_usage;
};

// Set of features for MediaCapabilities prediction.
// TODO(liberato): consider generalizing this.
struct PredictionFeatures {
    // It would be nice to initialize this to VIDEO_CODEC_PROFILE_UNKNOWN (-1),
    // but we can't do that with native enums.
    VideoCodecProfile profile;
    gfx.mojom.Size video_size;
    // Frames per second may ultimately be a bucketed as an integer, but we want
    // to do that as late as possible. Using a double avoids early truncation.
    double frames_per_sec = 0;
    // Name of the key system used for EME playbacks.
    string key_system;
    // Indicates when CDM will use HW secure decoding for EME playbacks.
    bool use_hw_secure_codecs = false;
};

// Target values for MediaCapabilities predictions.
// TODO(liberato): consider generalizing this.
struct PredictionTargets {
  uint32 frames_decoded = 0;
  uint32 frames_dropped = 0;
  uint32 frames_power_efficient = 0;
};

// See media/base/pipeline_status.h for descriptions.
struct AudioPipelineInfo {
  AudioDecoderType decoder_type;
  bool is_platform_decoder = false;
  bool has_decrypting_demuxer_stream = false;
  EncryptionType encryption_type;
};

// See media/base/pipeline_status.h for descriptions.
struct VideoPipelineInfo {
  VideoDecoderType decoder_type;
  bool is_platform_decoder = false;
  bool has_decrypting_demuxer_stream = false;
  EncryptionType encryption_type;
};

// See media/base/status.h for descriptions.
struct StatusData {
  string group;
  uint16 code;
  string message;
  array<mojo_base.mojom.Value> frames;
  array<StatusData> causes;
  mojo_base.mojom.Value data;
};

struct Status {
  StatusData? internal;
};

// Types of media stream, categorised by the media stream's source.
// The enum values are emitted to metrics. Do not reorder.
enum MediaStreamType {
  kLocalElementCapture = 0, // The source is a local capture from element.
  kLocalDeviceCapture = 1, // The source is a local device capture, e.g. webcam.
  kLocalTabCapture = 2, // The source is a local tab capture.
  kLocalDesktopCapture = 3, // The source is a local desktop capture.
  kLocalDisplayCapture = 4, // The source is a local display capture.
  kRemote = 5, // The source is a remote peer connection.
  kNone = 6, // Not a media stream.
};

// Error codes propagated by Input media streams OnError methods to indicate the
// reason for an error.
enum InputStreamErrorCode {
  kUnknown = 0,
  kSystemPermissions = 1,
  kDeviceInUse = 2,
};

// See media/base/renderer_factory_selector.h for description.
enum RendererType {
  kDefault = 0,          // DefaultRendererFactory
  kMojo = 1,             // MojoRendererFactory
  kMediaPlayer = 2,      // MediaPlayerRendererClientFactory
  kCourier = 3,          // CourierRendererFactory
  kFlinging = 4,         // FlingingRendererClientFactory
  kCast = 5,             // CastRendererClientFactory
  kMediaFoundation = 6,  // MediaFoundationRendererClientFactory
  kFuchsia = 7,          // FuchsiaRendererFactory
  kRemoting = 8,         // RemotingRendererFactory for remoting::Receiver
  kCastStreaming = 9,    // CastStreamingRendererFactory
};
