// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.mediacodec;

// Value
//
// Generic "value" for use within generic "Parameter" struct.
union Value {
  bool bool_value;
  uint64 uint64_value;
  int64 int64_value;
  string string_value;
  // Prefer using codec_oob_bytes instead.
  vector<uint8> bytes_value;
};

// Parameter
//
// Generic parameter.
//
// We want to minimize use of this generic "Parameter" structure by natively
// defining as many codec-specific parameter semantics as we can.
//
// TODO: When possible, describe the very limited scenarios in which it would
// still be reasonable to use a generic Parameter.
struct Parameter {
  // Some indication of the scope of applicability of this Parameter.
  string scope;
  // Specific name of this parameter, without the scope prefix.
  string name;
  // The particular value of this parameter.
  Value value;
};

// CodecFormatDetails
//
// The purpose of CodecFormatDetails is to fill in additional details not
// conveyed via other means.
//
// TODO(dustingreen): Where at all possible, definitions for the concepts
// within CodecFormatDetails should go in media_types.fidl or another location
// that's widely shared.  Maybe some encoder settings could remain
// codec-specific.
//
// For decoders input, the format details tend to be fairly sparse, since most
// compressed formats tend to be mostly self-describing.
//
// For decoder output and encoder input, the format details need to include all
// the out-of-band information regarding the uncompressed data, which tends not
// to be self-describing.
//
// For encoder output, we also include in CodecFormatDetails some additional
// encoding parameters which are needed to configure the encoder. These are not
// really needed by any downstream decoder under most circumstances, but these
// encoder config settings are legitimate optional format details, so we use
// the same overall structure, but name them "Encoder" to make it more obvious
// that these are mostly relevant to the encoder.  A downstream consumer could
// potentially benefit from knowing these settings, but most won't look at them.
//
// Settings that are completely redundant with the data in the format itself
// should not be in a required field here.  Some encoder parameters may also be
// represented in codec_oob_bytes on the output of an encoder - a downstream
// consumer can assume the codec_oob_bytes are correct and not check for whether
// encoder settings are present or consistent.
//
// With some exceptions made for encoder settings on output of an encoder, this
// stuff should be limited to things we need to know to properly process the
// data which we can't already determine from the data itself, and which isn't
// already covered by a format's defined OOB binary config blob, which is
// conveyed in codec_oob_bytes.
//
// TODO(dustingreen): Consider whether to split encoder settings into a
// separate struct - the main counter-argument would be if a consumer
// immediately downstream of an encoder may have good reason to know encoder
// settings to help process the data.  For example, the nominal bit-rate.

// Compressed formats tend to be much more self-describing than uncompressed
// formats.  (The "self" in "self-describing" includes the codec_oob_bytes.)
//
// Most decoders can have CodecFormatDetails.domain null.

// AudioCompressedFormat
//
// Format details relevant to compressed audio, mostly for encoder settings.
//
// Unless otherwise specified in a comment on a field in this structure,
// CodecFormatDetails.domain is null for a decoder.  A sub-structure whose name
// ends in "Encoder" is for encoder output settings.
//
// TODO(dustingreen): Consider whether splitting encoder settings out separately
// would be better.
union AudioCompressedFormat {
  // For an aac encoder, this field has settings the encoder needs which are
  // specific to AAC encoding.
  AudioCompressedFormatAacEncoder aac;
};

enum AudioBitrateMode {
  // Used mainly when a client is configuring an encoder's output format.  May
  // also be present in an OnOutputConfig() message from an encoder, but should
  // not be relied upon to be present by any consumer downstream of an encoder.
  UNSPECIFIED = 0;
  CBR = 1;
  VBR = 2;
};

// AudioCompressedFormatAacEncoder
//
// Encoder settings for an AAC encoder.
struct AudioCompressedFormatAacEncoder {
  // In SetOutputConfig():
  //
  // If zero, an encoder should generate 256 kbps, and a consumer should not
  // assume any particular bitrate.
  //
  // If not zero, the encoder should not exceed this bitrate.  In CBR the
  // encoder should use the highest available bitrate that doesn't exceed this
  // value, or if there is no such bitrate, the lowest available bitrate.  In
  // VBR, the encoder should stay at or below this bitrate.
  //
  // In VBR it's left up to the encoder to choose a reasonable ratio between
  // max bits per second and min bits per second, with the aim in VBR being
  // constant perceived quality.
  //
  // In OnOutputConfig():
  //
  // In CBR, the nominal bits per second.  In VBR, the nominal max bits per
  // second.
  uint32 bits_per_second;

  // In SetOutputConfig():
  //
  // If UNSPECIFIED, up to the encoder.  If CBR or VBR, a hint to the encoder
  // to use that mode.
  //
  // In OnOutputConfig():
  //
  // Actual mode being used.  UNSPECIFIED means the source is not specifying
  // which mode.
  AudioBitrateMode bitrate_mode;

  // TODO(dustingreen): AAC profile settings.
};

// AudioPcmMode
//
// TODO(dustingreen): Keep or discard any non-linear formats for purposes of the
// Codec interface?
enum AudioPcmMode {
  // 16 bit signed int linear or 32 bit float linear, for now
  // 1-N channels ok, with "A.B" channels designated as A+B channel_count - the
  // channel map is separately specified.  So 5.1 becomes channel_count 6.
  LINEAR = 0;
  // G.711 8 bit format-defined waveform semantics
  // 1 channel
  ALAW = 1;
  // G.711 8 bit format-defined waveform semantics
  // 1 channel
  MULAW = 2;
};

// AudioChannelId
//
// Used in specifying which audio channel is for which speaker location / type.
//
// TODO(dustingreen): Do we need more channel IDs than this?
//
// TODO(dustingreen): Check with mpuryear@ re. naming consistency for "S" vs.
// "R" as we move these to a common definition.  Also the ordering of LS/RS vs.
// LR/RR - probably LR/RR being first would make more sense re. how channels
// get added incrementally, but changing the order would no longer match
// Android's ordering.
enum AudioChannelId {
  SKIP = 0; // unused channel
  LF = 1;   // left front
  RF = 2;   // right front
  CF = 3;   // center front
  LS = 4;   // left surround
  RS = 5;   // right surround
  LFE = 6;  // low frequency effects
  CS = 7;   // back surround
  LR = 8;   // left rear
  RR = 9;   // right rear
  // This is the last explicitly-defined value + 1.  This name will be
  // re-defined in future if we add more defined channel IDs above.
  END_DEFINED = 10;
  // This is where format-specific (or ad-hoc) channel ID values should go, to
  // avoid colliding with any additional values allocated above.  The values
  // here are not guaranteed to avoid collision across different formats.
  EXTENDED_CHANNEL_ID_BASE = 0x6f000000;
  // Extended channel IDs should be <= Max.
  MAX = 0x7fffffff;
};

// PcmFormat
//
// PCM audio format details.
//
// TODO(dustingreen): Discuss with mpuryear@ re. where definitions for these
// details go and make sure the common details can specify at least this much.
struct PcmFormat {
  // Implicit details:
  //   * For bits_per_sample > 8, host-endian is implied.
  //   * At least for now, for channel_count >= 2, interleaved layout is
  //     implied.

  AudioPcmMode pcm_mode;

  // bits_per_sample
  //
  // A "sample" is for a single channel.
  //
  // For example, CD quality is 16.  See PcmMode comments, as the mode
  // constrains this value.
  uint32 bits_per_sample;

  // frames_per_second
  //
  // A "frame" is one datapoint (one "sample") for each channel.  Each channel
  // is sampled this many times per second.  For example, CD quality is 44100.
  uint32 frames_per_second;

  // channel_map
  //
  // channel_map.size() is the channel count.  See PcmMode comments, as some
  // modes constrain the channel count to 1.
  //
  // Values from AudioChannelId should be used if they are suitable.
  //
  // If a channel has no suitable AudioChannelId, an ad-hoc value can be used in
  // a range starting from AudioChannel_ExtendedChannelIdBase.
  vector<AudioChannelId>:16 channel_map;

  // TODO(dustingreen): Add unsigned 8 bit, float 32 bit, maybe others. FWIW,
  // AOSP appears to support signed 16 bit, unsigned 8 bit, and float 32 bit
  // under "Pcm", AFAICT based on OMX_NUMERICALDATATYPE and ACodec.cpp code.
};

// AudioUncompressedFormat
//
// Uncompressed audio format details.
union AudioUncompressedFormat {
  PcmFormat pcm;
};

// AudioFormat
//
// Audio format details.
union AudioFormat {
  AudioCompressedFormat compressed;
  AudioUncompressedFormat uncompressed;
};

// VideoCompressedFormat
//
// Compressed video format details.
//
// Mostly encoder settings will go under here.
//
// If a compressed video format is missing any fields here other than encoder
// settings, it's because it's a good format and is already self-describing
// given the mime_type + format-defined codec_oob_bytes as appropriate +
// in-band data.
union VideoCompressedFormat {
  // TODO(dustingreen): Any compressed video formats that aren't sufficiently
  // self-describing to select and create a Codec instance to decode it?

  // TODO(dustingreen): temp field to make the compiler happy until we have at
  // least one real field.
  uint32 temp_field_todo_remove;
};

// VideoUncompressedFormatSpecificDetails
//
// Extended format-specific uncompressed video format details.
//
// TODO(dustingreen): Switch to FIDL table instead.
union VideoUncompressedFormatSpecificDetails {
  // TODO(dustingreen): Which formats that we care about really require special
  // format-specific details here?

  // TODO(dustingreen): temp field to make the compiler happy until we have at
  // least one real field.
  uint32 temp_field_todo_remove;
};

enum VideoColorSpace {
  // TODO(dustingreen): add to this list
  INVALID = 0;
};

// VideoUncompressedFormat
//
// Uncompressed video format details.
//
// TODO(dustingreen): Integrate with a system-wide structure for this purpose.
struct VideoUncompressedFormat {
  // fourcc
  //
  // A human-readable fourcc like RGBA should be 0x41424752 in the fourcc field
  // (regardless of host endian-ness). Note that the R (first character) of the
  // fourcc is in the low-order byte of this fourcc field.
  //
  // There are some fourcc codes that don't format nicely as a string.  While I
  // don't foresee any use of any of the purely numeric fourcc codes (not
  // corresponding to packed ascii character values), those would be stored
  // such that their numeric value has it's low-order byte in the low-order
  // byte of this fourcc value.  So a fourcc with "hex value" 0x00000001 would
  // have the numeric value 1 in this field.
  //
  // The endian-ness of fourcc values stored in files or in network packets is
  // outside the scope of these comments, other than to state that regardless
  // of the source of the fourcc code and the order that storage / transmission
  // format stores these bytes, a human-readable fourcc should have its
  // human-read first ascii character value in the low order byte of this
  // field.
  uint32 fourcc;

  // For formats with different planes having different resolution, this is the
  // resolution of the highest-resolution plane(s).  Else it's the resolution
  // of all the planes.
  uint32 primary_width_pixels;
  uint32 primary_height_pixels;

  // For formats where the seconary planes are the same resolution, these fields
  // will be the same as primary_width_pixels and primary_height_pixels.  For
  // formats with smaller secondary resolutions, these indicate that resolution.
  uint32 secondary_width_pixels;
  uint32 secondary_height_pixels;

  // Planar means the various planes are separately stored in their own chunks
  // of memory.
  bool planar;

  // If a format is swizzled, the swizzling parameters are not directly here.
  bool swizzled;

  uint32 primary_line_stride_bytes;
  // Formats with the same stride for all planes will have this field equal to
  // primary_line_stride_bytes.
  uint32 secondary_line_stride_bytes;

  // R or Y
  uint32 primary_start_offset;
  // G or U
  uint32 secondary_start_offset;
  // B or V
  uint32 tertiary_start_offset;

  uint32 primary_pixel_stride;
  // For formats with the same pixel stride for all planes, this field will be
  // equal to primary_pixel_stride.
  uint32 secondary_pixel_stride;

  // These override the primary_width_pixels and primary_height_pixels for
  // purposes of display (but not for purposes of determining the pixel layout
  // in memory).  These can crop on the right and bottom.  These must be <= the
  // corresponding coded dimension.
  //
  // This value must be <= primary_width_pixels.
  uint32 primary_display_width_pixels;
  // This value must be <= primary_height_pixels.
  uint32 primary_display_height_pixels;

  // The pixel_aspect_ratio_width : pixel_aspect_ratio_height is the pixel
  // aspect ratio (AKA sample aspect ratio aka SAR) for the luma (AKA Y)
  // samples. A pixel_aspect_ratio of 1:1 mean square pixels. A
  // pixel_aspect_ratio of 2:1 would mean pixels that are displayed twice as
  // wide as they are tall. Codec implementation should ensure these two values
  // are relatively prime by reducing the fraction (dividing both by GCF) if
  // necessary.
  //
  // When has_pixel_aspect_ratio == false, pixel_aspect_ratio_width and
  // pixel_aspect_ratio_height will both be 1, but in that case the
  // pixel_aspect_ratio_width : pixel_aspect_ratio_height of 1:1 is just a very
  // weak suggestion re. reasonable-ish handling, not in any way authoritative.
  // In this case (or in any case really) the receiver of this message may have
  // other OOB means to determine the actual pixel_aspect_ratio.
  bool has_pixel_aspect_ratio = false;
  uint32 pixel_aspect_ratio_width = 1;
  uint32 pixel_aspect_ratio_height = 1;

  // TODO(dustingreen): Currently this assumes 8 bits per channel, but we'll
  // need fields to indicate more bits per pixel such as 10 or 12 bits per
  // pixel.  Also, potentially a way to indicate different number of bits per
  // channel for 565 16 bit RGB + packing details.  Also, potentially
  // endian-ness.
  //
  // TODO(dustingreen): Also, an easy way to get a template
  // VideoUncompressedFormat that's pre-populated with reasonably-plausible
  // values, based on a fourcc or enum value + maybe primary resolution.

  VideoUncompressedFormatSpecificDetails special_formats;
};

// VideoFormat
//
// Video (compress or uncompressed) format details.
union VideoFormat {
  VideoCompressedFormat compressed;
  VideoUncompressedFormat uncompressed;
};

// DomainFormat
//
// Domain-specific format details (audio or video, compressed or uncompressed).
union DomainFormat {
  AudioFormat audio;
  VideoFormat video;
};

const uint64 kMaxCodecOobBytesSize = 8192;

// CodecFormatDetails
//
// This describes/details the format on input or output of a codec (separate
// instances for input vs. output).
struct CodecFormatDetails {
  // Particular instances of CodecFormatDetails will set this field to make it
  // easier for a receiver to determine if any part of the format has changed
  // vs. the last CodecFormatDetails received for the same context.
  uint64 format_details_version_ordinal;

  // "mime_type" strings used by particular decoders / encoders so far:
  //
  // SW AAC decoder:
  //   * input:
  //     * "audio/aac-adts" - ATDS AAC; self-contained format, but
  //       implementation for now requires codec_oob_bytes to contain
  //       AudioSpecificConfig() reconstructed from ADTS header data - see also
  //       make_AudioSpecificConfig_from_ADTS_header() for now.
  //   * output:
  //     * "audio/raw" - stereo linear 16 bit integer PCM
  //
  // TODO(dustingreen): avoid requiring codec_oob_bytes when using SoftAAC2.cpp
  // for AAC ADTS.
  //
  // TODO(dustingreen): Add non-ADTS AAC support (which naturally needs
  // codec_oob_bytes).
  //
  // TODO(dustingreen): Consider "pseudo_mime_type", or an enum, + "domain"
  // details as needed instead, since calling this "mime_type" could lead to
  // confusion.
  string mime_type;

  // Some codecs have their own binary codec configuration structure.  For those
  // codecs we allow that binary structure to be directly conveyed to the codec
  // here.
  //
  // audio/aac - this is an AudioSpecificConfig().
  // audio/aac-adts - this is not set.
  // TODO(dustingreen): make the audio/aac-adts statement true soon.  At the
  // moment we set this with make_AudioSpecificConfig_from_ADTS_header(), but
  // that should not be the client's job for ADTS.
  //
  // For some formats whose "ES" data format is self-contained, or for which
  // there is no format-defined binary OOB config, this is null.
  //
  // A server can close the channel if the count of bytes is >
  // kMaxCodecOobBytesSize or is larger than makes any sense for the codec.  If
  // any codec actually needs more than kMaxCodecOobBytesSize bytes here, we
  // could potentially increase this restriction some, but this interface isn't
  // designed to support codec OOB config blobs that approach
  // ZX_CHANNEL_MAX_MSG_BYTES.
  vector<uint8>? codec_oob_bytes;

  // Decoder input format:
  //
  // If a format is not self-describing given the mime_type and a
  // format-spec-defined codec_oob_bytes, this domain field can be set to
  // provide the additional compressed-format-specific details.  This is
  // expected to be fairly rare, so most compressed input formats will have
  // only the mime_type and possibly codec_oob_bytes set, with domain typically
  // null.  If an encoder is upstream however, domain may be set to convey the
  // encoder settings that were used, but a decoder consumer doesn't need to
  // look at those.
  //
  // Encoder output format:
  //
  // The encoder's compressed data output typically needs some configuration
  // (provided in this field) that's convenient to provide in a form that's not
  // codec_oob_bytes, and the codec can convert that config to codec_oob_bytes
  // on encoder output via OnOutputConfig().  We retain these encoder settings
  // in the output CodecFormatDetails to allow for cases where a downstream
  // consumer knowing the encoder settings could be useful.
  //
  // TODO(dustingreen): Decide if we want to retain this, or if we'd prefer to
  // split out config settings and maybe only represent a few encoder settings
  // as best-effort optional aux data, like bitrate.
  //
  // Encoder input format / decoder output format:
  //
  // This field contains fairly detailed information re. uncompressed data
  // format details, which tends to _not_ be self-describing in-band.
  DomainFormat? domain;

  // See comments above on Parameter.  At the time we lock relevant FIDL
  // interfaces, there should be zero use of this field outside tests, but this
  // is here in case we need to allow a codec client to convey additional config
  // parameters to/from a codec which we didn't anticipate before locking.
  //
  // If there are any known "official" exceptions to the previous paragraph,
  // we'll list them here by corresponding mime_type (none so far):
  //   * "<mime_type>" - <usage_description>
  //
  // For codecs that define their own codec-specific config/OOB data, put that
  // in codec_oob_bytes above instead of this field.
  vector<Parameter>? pass_through_parameters;
};
