// 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/mojom/media_types.mojom";
import "mojo/public/mojom/base/time.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "media/mojo/mojom/video_encoder_info.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.


struct VideoEncodeAcceleratorSupportedProfile {
  VideoCodecProfile profile;
  gfx.mojom.Size min_resolution;
  gfx.mojom.Size max_resolution;
  uint32 max_framerate_numerator;
  uint32 max_framerate_denominator;
  array<SVCScalabilityMode> scalability_modes;
};

// 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);
};

// Class that describes how video bitrate, in bps, is allocated across temporal
// and spatial layers. See media::VideoBitrateAllocation for more details.
struct VideoBitrateAllocation {
  array<int32> bitrates;
};

// 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 media::Bitrate
struct Bitrate {
  // See media::Bitrate::Mode
  [Extensible]
  enum Mode {
    [Default] kConstant,
    kVariable
  };

  // The defaults here match those in media::Bitrate (CBR, which has no peak).
  // Target must be set for all bitrates.
  Mode mode = kConstant;
  uint32 target;
  uint32 peak = 0;
};

// 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::InterLayerPredMode
  enum InterLayerPredMode {
    kOff,
    kOn,
    kOnKeyPic
  };

  // See media::VideoEncodeAccelerator::Config::StorageType
  enum StorageType {
    kShmem,
    kGpuMemoryBuffer,
  };

  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;
  array<SpatialLayer> spatial_layers;
  InterLayerPredMode inter_layer_pred;
  bool require_low_delay;
};

interface VideoEncodeAccelerator {
  // See media::VideoEncodeAccelerator::Error
  enum Error {
    ILLEGAL_STATE,
    INVALID_ARGUMENT,
    PLATFORM_FAILURE
  };

  // Responded by VideoEncodeAcceleratorClient.RequireBitstreamBuffers().
  [Sync]
  Initialize(VideoEncodeAcceleratorConfig config,
             pending_remote<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<shared_buffer> buffer);

  // Request a change to the encoding parameters. This is only a request,
  // fulfilled on a best-effort basis. 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.
  RequestEncodingParametersChangeWithLayers(
    VideoBitrateAllocation bitrate_allocation,
    uint32 framerate);

  // Request a change to the encoding parameters. This is only a request,
  // fulfilled on a best-effort basis. 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.
  RequestEncodingParametersChangeWithBitrate(
    Bitrate bitrate,
    uint32 framerate);

  [Sync]
  IsFlushSupported() => (bool result);

  Flush() => (bool result);
};

// H264Metadata, Vp8Metadata, Vp9Metadata define mojo transport formats for
// media::H264Metadata, media::Vp8Metadata and media::Vp9Metadata, 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 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;
  bool end_of_picture;
  uint8 temporal_idx;
  uint8 spatial_idx;
  array<gfx.mojom.Size> spatial_layer_resolutions;
  array<uint8> p_diffs;
};

// Codec specific metadata.
union CodecMetadata {
  H264Metadata h264;
  Vp8Metadata vp8;
  Vp9Metadata vp9;
};

struct BitstreamBufferMetadata {
  uint32 payload_size_bytes;
  bool key_frame;
  mojo_base.mojom.TimeDelta timestamp;
  CodecMetadata? codec_metadata;
};

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);

  NotifyError(VideoEncodeAccelerator.Error error);

  // VideoEncodeAccelerator calls this when its VideoEncoderInfo is changed.
  // |info| is the updated VideoEncoderInfo.
  NotifyEncoderInfoChange(VideoEncoderInfo info);
};
