// 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.media;

using fuchsia.sysmem;

const MAX_KEY_ID_SIZE uint32 = 16;
const MAX_INIT_VECTOR_SIZE uint32 = 16;
const MAX_ENCRYPTION_SCHEME_SIZE uint32 = 100;

/// Value
///
/// Generic "value" for use within generic "Parameter" struct.
type Value = strict union {
    1: bool_value bool;
    2: uint64_value uint64;
    3: int64_value int64;
    4: string_value string;
    // Prefer using oob_bytes instead.
    5: bytes_value bytes;
};

/// Parameter
///
/// Generic parameter.
///
/// We want to minimize use of this generic "Parameter" structure by natively
/// defining as many stream-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.
type Parameter = struct {
    // Some indication of the scope of applicability of this Parameter.
    scope string;
    // Specific name of this parameter, without the scope prefix.
    name string;
    // The particular value of this parameter.
    value Value;
};

/// StreamError
///
/// This error code encapsulates various errors that might emanate from a
/// StreamProcessor server. It can be sent either as an OnStreamFailed event or
/// as an epitaph for the channel.
type StreamError = strict enum : uint32 {
    // Common errors 0x00
    /// An internal error with an unspecified reason.
    UNKNOWN = 0x00000001;
    /// The client provided invalid input format details.
    INVALID_INPUT_FORMAT_DETAILS = 0x00000002;
    /// The server received buffers that are not suitable for the operation to
    /// be performed. An example of this would be if a Decoder received output
    /// buffers that are too small to decode a frame into.
    INCOMPATIBLE_BUFFERS_PROVIDED = 0x00000003;
    /// Processing of input EOS (end of stream) failed, so the stream failed.
    /// Currently this can occur if a core codec watchdog fires while processing
    /// EOS.
    EOS_PROCESSING = 0x00000004;

    // Decoder errors 0x01
    /// An internal decoder error with an unspecified reason.
    DECODER_UNKNOWN = 0x01000001;
    /// Input data that can't be parsed.  Only some parsing problems/errors are
    /// reported this way.  Corrupt input data may be reported as other
    /// StreamError, or may not cause a StreamError.
    DECODER_DATA_PARSING = 0x01000002;

    // Encoder errors 0x02
    /// An internal encoder error with an unspecified reason.
    ENCODER_UNKNOWN = 0x02000001;

    // Decryptor errors 0x03
    /// An internal decryptor error with an unspecified reason.
    DECRYPTOR_UNKNOWN = 0x03000001;
    /// The requested KeyId is not available for use by the Decryptor. The
    /// client may try again later if that key becomes available.
    DECRYPTOR_NO_KEY = 0x03000002;
};

type AudioCompressedFormat = flexible union {
    1: aac AudioCompressedFormatAac;
    2: sbc AudioCompressedFormatSbc;
};

type AudioBitrateMode = strict enum {
    // Used mainly when a client is configuring an encoder's output format.  May
    // also be present in an OnOutputConstraints() 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;
};

type AudioCompressedFormatAac = struct {};

type AudioCompressedFormatSbc = struct {};

/// AudioPcmMode
///
// TODO(dustingreen): Keep or discard any non-linear formats for purposes of the
// Codec interface?
type AudioPcmMode = strict enum {
    // 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.
type AudioChannelId = strict enum {
    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.
type PcmFormat = struct {
    // Implicit details:
    //   * For bits_per_sample > 8, host-endian is implied.
    //   * At least for now, for channel_count >= 2, interleaved layout is
    //     implied.

    pcm_mode AudioPcmMode;

    // 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.
    bits_per_sample uint32;

    // 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.
    frames_per_second uint32;

    // 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.
    channel_map vector<AudioChannelId>:16;

    // 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.
type AudioUncompressedFormat = strict union {
    1: pcm PcmFormat;
};

/// AudioFormat
///
// Audio format details.
type AudioFormat = strict union {
    1: compressed AudioCompressedFormat;
    2: uncompressed AudioUncompressedFormat;
};

/// VideoCompressedFormat
///
/// Compressed video format details.
///
// If a compressed video format has no fields here, it's because it's a good
// format and is already self-describing given the mime_type + format-defined
// oob_bytes as appropriate + in-band data.
type VideoCompressedFormat = strict union {
    // 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.
    1: temp_field_todo_remove uint32;
};

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

/// VideoUncompressedFormat
///
/// Uncompressed video format details.
///
// TODO(dustingreen): Integrate with a system-wide structure for this purpose.
// In progress - see image_format field below which will take the place of this
// struct/table.
type VideoUncompressedFormat = struct {
    // TODO(dustingreen): This will replace VideoUncompressedFormat (after
    // struct to table change merges).
    image_format fuchsia.sysmem.ImageFormat_2;

    // 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.
    fourcc uint32;

    // 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.
    primary_width_pixels uint32;
    primary_height_pixels uint32;

    // For formats where the secondary 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.
    secondary_width_pixels uint32;
    secondary_height_pixels uint32;

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

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

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

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

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

    // 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.
    primary_display_width_pixels uint32;
    // This value must be <= primary_height_pixels.
    primary_display_height_pixels uint32;

    // 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.
    @allow_deprecated_struct_defaults
    has_pixel_aspect_ratio bool = false;
    @allow_deprecated_struct_defaults
    pixel_aspect_ratio_width uint32 = 1;
    @allow_deprecated_struct_defaults
    pixel_aspect_ratio_height uint32 = 1;
};

/// VideoFormat
///
/// Video (compress or uncompressed) format details.  In this context,
/// "uncompressed" can include block-based image compression formats that still
/// permit fairly fast random access to image data.
type VideoFormat = strict union {
    1: compressed VideoCompressedFormat;
    2: uncompressed VideoUncompressedFormat;
};

// Encryption schemes as defined by ISO 23001-7: Common encryption in ISO base
// media file format files. These are defined as strings rather than enums so as
// to not limit the encryption schemes that an implementation supports to the
// constants that are defined here.
alias EncryptionScheme = string:MAX_ENCRYPTION_SCHEME_SIZE;
const ENCRYPTION_SCHEME_UNENCRYPTED string = "unencrypted";
const ENCRYPTION_SCHEME_CENC string = "cenc";
const ENCRYPTION_SCHEME_CBC1 string = "cbc1";
const ENCRYPTION_SCHEME_CENS string = "cens";
const ENCRYPTION_SCHEME_CBCS string = "cbcs";

alias KeyId = bytes:MAX_KEY_ID_SIZE;
alias InitVector = bytes:MAX_INIT_VECTOR_SIZE;

/// SubsampleEntry
///
/// A subsample is a byte range within a sample consisting of a clear byte range
/// followed by an encrypted byte range. This structure specifies the size of
/// each range in the subsample.
type SubsampleEntry = struct {
    clear_bytes uint32;
    encrypted_bytes uint32;
};

/// EncryptionPattern
///
/// Pattern encryption utilizes a pattern of encrypted and clear 16 byte blocks
/// over the protected range of a subsample (the encrypted_bytes of a
/// `SubsampleEntry`). This structure specifies the number of encrypted data
/// blocks followed by the number of clear data blocks.
type EncryptionPattern = struct {
    clear_blocks uint32;
    encrypted_blocks uint32;
};

/// EncryptedFormat
///
/// The stream format details payload of a decrypting stream processor. This is
/// a sparsely populated table to specify parameters necessary for decryption
/// other than the data stream. It is only necessary to update fields if they
/// changed, but not an error if the same value is repeated.
type EncryptedFormat = table {
    1: reserved;
    2: reserved;
    7: reserved;

    /// `scheme` specifies which encryption scheme to use, such as
    /// `fuchsia.media.ENCRYPTION_SCHEME_CENC`.
    /// Usage:
    ///  - It is required to be set prior to delivery of input packets.
    ///  - Changing the scheme mid-stream is only permitted in some scenarios.
    ///    Once an encrypted scheme is selected for a stream, the scheme may
    ///    only be set to `fuchsia.media.ENCRYPTION_SCHEME_UNENCRYPTED` or that
    ///    same initial encrypted scheme. The scheme may be set to
    ///    `fuchsia.media.ENCRYPTION_SCHEME_UNENCRYPTED` at any point.
    6: scheme string;

    /// `key_id` identifies the key that should be used for decrypting
    /// subsequent data.
    /// Usage:
    ///  - It is required to be set prior to delivery of input packets to a
    ///    decryptor.
    ///  - This may be changed multiple times during a data stream.
    8: key_id KeyId;

    /// `init_vector` is used in combination with a key and a block of content
    /// to create the first cipher block in a chain and derive subsequent cipher
    /// blocks in a cipher block chain.
    /// Usage:
    ///  - It is required to be set prior to the delivery of input packets to a
    ///    decryptor.
    ///  - This may be changed multiple times during a data stream.
    3: init_vector InitVector;

    /// `subsamples` is used to identify the clear and encrypted portions of a
    /// subsample.
    /// Usage:
    ///  - For whole sample encryption, this parameter should not be sent.
    ///  - This may be changed multiple times during a data stream.
    4: subsamples vector<SubsampleEntry>;

    /// `pattern` is used to identify the clear and encrypted blocks for pattern
    /// based encryption.
    /// Usage:
    /// - This is not allowed for CENC and CBC1 and required for CENS and CBCS.
    /// - If required, it must be set prior to the delivery of input packets to
    ///   a decryptor.
    /// - This may be changed multiple times during a data stream.
    5: pattern EncryptionPattern;
};

/// DecryptedFormat
///
/// This describes the format of the decrypted content. It is required to be
/// sent by the StreamProcessor server prior to the delivery of output packets.
/// Currently, there is no additional format details for decrypted output.
type DecryptedFormat = table {
    // TODO(fxbug.dev/8031): Empty tables cause dart analysis error. Remove this
    // unused field once the issue is resolved.
    1: ignore_this_field bool;
};

/// CryptoFormat
///
/// Crypto (encrypted or decrypted) format details.
type CryptoFormat = flexible union {
    1: encrypted EncryptedFormat;
    2: decrypted DecryptedFormat;
};

/// DomainFormat
///
// Domain-specific format details (audio or video, compressed or uncompressed).
type DomainFormat = strict union {
    1: audio AudioFormat;
    2: video VideoFormat;
    3: crypto CryptoFormat;
};

const kMaxOobBytesSize uint64 = 8192;

type SbcSubBands = strict enum {
    SUB_BANDS_4 = 4;
    SUB_BANDS_8 = 8;
};

type SbcBlockCount = strict enum {
    BLOCK_COUNT_4 = 4;
    BLOCK_COUNT_8 = 8;
    BLOCK_COUNT_12 = 12;
    BLOCK_COUNT_16 = 16;
};

type SbcAllocation = strict enum {
    ALLOC_LOUDNESS = 0;
    ALLOC_SNR = 1;
};

type SbcChannelMode = strict enum {
    MONO = 0;
    DUAL = 1;
    STEREO = 2;
    JOINT_STEREO = 3;
};

/// Settings for an SBC Encoder.
///
/// SBC Encoders take signed little endian 16 bit linear PCM samples and
/// return encoded SBC frames. SBC encoder PCM data in batches of
/// `sub_bands * block_count` PCM frames. This encoder will accept PCM data on
/// arbitrary frame boundaries, but the output flushed when EOS is queued may be
/// zero-padded to make a full batch for encoding.
type SbcEncoderSettings = struct {
    @allow_deprecated_struct_defaults
    sub_bands SbcSubBands = SbcSubBands.SUB_BANDS_8;
    @allow_deprecated_struct_defaults
    allocation SbcAllocation = SbcAllocation.ALLOC_LOUDNESS;
    @allow_deprecated_struct_defaults
    block_count SbcBlockCount = SbcBlockCount.BLOCK_COUNT_4;
    channel_mode SbcChannelMode;
    /// SBC bit pool value.
    bit_pool uint64;
};

/// Raw AAC access units.
type AacTransportRaw = struct {};

/// AAC inside LATM
type AacTransportLatm = struct {
    /// Whether MuxConfiguration stream element is present
    mux_config_present bool;
};

/// AAC inside ADTS
type AacTransportAdts = struct {};

type AacTransport = flexible union {
    1: raw AacTransportRaw;
    2: latm AacTransportLatm;
    3: adts AacTransportAdts;
};

type AacChannelMode = strict enum {
    MONO = 0;
    STEREO = 2;
};

type AacConstantBitRate = struct {
    /// Bits per second
    bit_rate uint32;
};

/// Variable bit rate modes. The actual resulting bitrate
/// varies based on input signal and other encoding settings.
///
/// See https://wiki.hydrogenaud.io/index.php?title=Fraunhofer_FDK_AAC#Bitrate_Modes
type AacVariableBitRate = strict enum {
    V1 = 1;
    V2 = 2;
    V3 = 3;
    V4 = 4;
    V5 = 5;
};

type AacBitRate = strict union {
    1: constant AacConstantBitRate;
    2: variable AacVariableBitRate;
};

type AacAudioObjectType = strict enum {
    /// MPEG-2 Low Complexity
    MPEG2_AAC_LC = 0;
    /// MPEG-4 Low Complexity
    MPEG4_AAC_LC = 1;
};

type AacEncoderSettings = struct {
    transport AacTransport;
    channel_mode AacChannelMode;
    bit_rate AacBitRate;
    aot AacAudioObjectType;
};

/// Customization of h264 encoder parameters for macroblock quantization. The values
/// can range from 0 to 51, with lower numbers indicating higher
/// quality/bitrate. While encoders should support these fields if feasible,
/// some encoders may ignore these fields. It's ok to not set this table, or
/// not set some of the fields in this table, as encoders can determine their
/// own defaults. If the targeted bitrate can't be achieved with the specified values,
/// then the user should expect the resulting encoded stream bitrate to differ from
/// the requested bitrate.
type H264QuantizationParameters = table {
    /// Starting value for quantization of key frames.
    1: i_base uint32;
    /// Smallest allowed value for quantization of key frames.
    2: i_min uint32;
    /// Largest allowed value for quantization of key frames.
    3: i_max uint32;
    /// Starting value for quantization of predicted frames.
    4: p_base uint32;
    /// Smallest allowed value for quantization of predicted frames.
    5: p_min uint32;
    /// Largest allowed value for quantization of predicted frames.
    6: p_max uint32;
};

/// Settings for H264 Encoders.
type H264EncoderSettings = table {
    /// Target bits per second for encoded stream.
    /// If omitted, interpreted as 200,000.
    1: bit_rate uint32;
    /// Target frames per second for encoded stream.
    /// If omitted, interpreted as 30.
    2: frame_rate uint32;
    /// Number of pictures per keyframe.  Setting to 0 will disable key frame
    /// encoding, except for if force_key_frame is set to true.
    /// If omitted, interpreted as 8.
    3: gop_size uint32;
    /// Whether to enable frame rate adjustments in order to meet target bitrate.
    /// If omitted, interpreted as false.
    4: variable_frame_rate bool;
    /// Lowest frame rate allowed if `variable_frame_rate` is enabled. If
    /// omitted, interpreted as 10.
    5: min_frame_rate uint32;
    /// If true, next frame encoded will be a key frame. If omitted, interpreted
    /// as false.
    6: force_key_frame bool;
    /// Allow customization of quantization parameters for encoding. Each frame
    /// submitted after setting this will use the new values. If omitted, no
    /// change from encoder defaults is made.
    7: quantization_params H264QuantizationParameters;
};

/// Settings for HEVC/H265 Encoders.
type HevcEncoderSettings = table {
    /// Target bits per second for encoded stream. Defaults to 200,000 if
    /// omitted.
    1: bit_rate uint32;
    /// Target frames per second for encoded stream. Defaults to 30 if omitted.
    2: frame_rate uint32;
    /// Number of pictures per keyframe. Defaults to 8 if omitted.
    3: gop_size uint32;
};

/// Settings for encoders that tell them how to encode raw
/// formats.
type EncoderSettings = flexible union {
    1: sbc SbcEncoderSettings;
    2: aac AacEncoderSettings;
    3: h264 H264EncoderSettings;
    4: hevc HevcEncoderSettings;
};

/// FormatDetails
///
/// This describes/details the format on input or output of a StreamProcessor
/// (separate instances for input vs. output).
//
// The purpose of FormatDetails is to fill in additional details not
// conveyed via other means.
//
// For decoder 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.
//
// Settings that are completely redundant with the data in the format itself
// should not be in a required field here. An encoder may set oob_bytes on its
// output.
//
// 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 oob_bytes.
//
// Most decoders can have FormatDetails.domain null.
type FormatDetails = table {
    // Particular instances of FormatDetails will set this field to make it
    // easier for a receiver to determine if any part of the format has changed
    // vs. the last FormatDetails received for the same context.
    1: format_details_version_ordinal uint64;

    // "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 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 oob_bytes when using SoftAAC2.cpp
    // for AAC ADTS.
    //
    // TODO(dustingreen): Add non-ADTS AAC support (which naturally needs
    // 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.
    2: mime_type string;

    // Some streams have their own binary configuration structure.  For those
    // streams we allow that binary structure to be directly conveyed to the
    // stream processor 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 >
    // kMaxOobBytesSize or is larger than makes any sense for the stream
    // processor.  If any stream actually needs more than kMaxOobBytesSize
    // bytes here, we could potentially increase this restriction some, but
    // this interface isn't designed to support OOB config blobs that approach
    // ZX_CHANNEL_MAX_MSG_BYTES.
    3: oob_bytes bytes;

    // Decoder input format:
    //
    // If a format is not self-describing given the mime_type and a
    // format-spec-defined 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 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 oob_bytes, and the codec can convert that config to oob_bytes on
    // encoder output via OnOutputConstraints().  We retain these encoder settings
    // in the output FormatDetails 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.
    4: domain DomainFormat;

    // 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 stream processor client to
    // convey additional config parameters to/from a stream processor 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 streams that define their own stream-specific config/OOB data, put
    // that in oob_bytes above instead of this field.
    5: pass_through_parameters vector<Parameter>;

    /// Instructs an encoder on how to encode raw data.
    ///
    /// Decoders may ignore this field but are entitled to rejected requests with
    /// this field set because it doesn't make sense.
    6: encoder_settings EncoderSettings;

    /// The number of ticks of the timebase of input packet timestamp_ish values
    /// per second.
    ///
    /// The timebase is only used used for optional extrapolation of timestamp_ish
    /// values when an input timestamp which applies to byte 0 of the valid portion
    /// of the input packet does not correspond directly to byte 0 of the valid
    /// portion of any output packet.
    ///
    /// Leave unset if timestamp extrapolation is not needed, either due to lack of
    /// timestamps on input, or due to input being provided in increments of the
    /// encoder's input chunk size (based on the encoder settings and calculated
    /// independently by the client).  Set if timestamp extrapolation is known to be
    /// needed or known to be acceptable to the client.
    7: timebase uint64;
};
