| // 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 uint32 MAX_KEY_ID_SIZE = 16; |
| const uint32 MAX_INIT_VECTOR_SIZE = 16; |
| const uint32 MAX_ENCRYPTION_SCHEME_SIZE = 100; |
| |
| /// Value |
| /// |
| /// Generic "value" for use within generic "Parameter" struct. |
| union Value { |
| 1: bool bool_value; |
| 2: uint64 uint64_value; |
| 3: int64 int64_value; |
| 4: string string_value; |
| // Prefer using oob_bytes instead. |
| 5: bytes bytes_value; |
| }; |
| |
| /// 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. |
| 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; |
| }; |
| |
| /// 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. |
| enum StreamError : 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; |
| }; |
| |
| flexible union AudioCompressedFormat { |
| 1: AudioCompressedFormatAac aac; |
| 2: AudioCompressedFormatSbc sbc; |
| }; |
| |
| enum AudioBitrateMode { |
| // 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; |
| }; |
| |
| struct AudioCompressedFormatAac { |
| }; |
| |
| struct AudioCompressedFormatSbc { |
| }; |
| |
| /// 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 { |
| 1: PcmFormat pcm; |
| }; |
| |
| /// AudioFormat |
| /// |
| // Audio format details. |
| union AudioFormat { |
| 1: AudioCompressedFormat compressed; |
| 2: AudioUncompressedFormat uncompressed; |
| }; |
| |
| /// 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. |
| 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. |
| 1: 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. |
| // In progress - see image_format field below which will take the place of this |
| // struct/table. |
| struct VideoUncompressedFormat { |
| // TODO(dustingreen): This will replace VideoUncompressedFormat (after |
| // struct to table change merges). |
| fuchsia.sysmem.ImageFormat_2 image_format; |
| |
| // 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 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. |
| 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; |
| }; |
| |
| /// 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. |
| union VideoFormat { |
| 1: VideoCompressedFormat compressed; |
| 2: VideoUncompressedFormat uncompressed; |
| }; |
| |
| // 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. |
| using EncryptionScheme = string:MAX_ENCRYPTION_SCHEME_SIZE; |
| const string ENCRYPTION_SCHEME_UNENCRYPTED = "unencrypted"; |
| const string ENCRYPTION_SCHEME_CENC = "cenc"; |
| const string ENCRYPTION_SCHEME_CBC1 = "cbc1"; |
| const string ENCRYPTION_SCHEME_CENS = "cens"; |
| const string ENCRYPTION_SCHEME_CBCS = "cbcs"; |
| |
| using KeyId = bytes:MAX_KEY_ID_SIZE; |
| using 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. |
| struct SubsampleEntry { |
| uint32 clear_bytes; |
| uint32 encrypted_bytes; |
| }; |
| |
| /// 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. |
| struct EncryptionPattern { |
| uint32 clear_blocks; |
| uint32 encrypted_blocks; |
| }; |
| |
| /// 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. |
| table EncryptedFormat { |
| 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: string scheme; |
| |
| /// `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: KeyId key_id; |
| |
| /// `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: InitVector init_vector; |
| |
| /// `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: vector<SubsampleEntry> subsamples; |
| |
| /// `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: EncryptionPattern pattern; |
| }; |
| |
| /// 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. |
| table DecryptedFormat { |
| // TODO(FIDL-709): Empty tables cause dart analysis error. Remove this |
| // unused field once the issue is resolved. |
| 1: bool ignore_this_field; |
| }; |
| |
| /// CryptoFormat |
| /// |
| /// Crypto (encrypted or decrypted) format details. |
| flexible union CryptoFormat { |
| 1: EncryptedFormat encrypted; |
| 2: DecryptedFormat decrypted; |
| }; |
| |
| /// DomainFormat |
| /// |
| // Domain-specific format details (audio or video, compressed or uncompressed). |
| union DomainFormat { |
| 1: AudioFormat audio; |
| 2: VideoFormat video; |
| 3: CryptoFormat crypto; |
| }; |
| |
| const uint64 kMaxOobBytesSize = 8192; |
| |
| enum SbcSubBands { |
| SUB_BANDS_4 = 4; |
| SUB_BANDS_8 = 8; |
| }; |
| |
| enum SbcBlockCount { |
| BLOCK_COUNT_4 = 4; |
| BLOCK_COUNT_8 = 8; |
| BLOCK_COUNT_12 = 12; |
| BLOCK_COUNT_16 = 16; |
| }; |
| |
| enum SbcAllocation { |
| ALLOC_LOUDNESS = 0; |
| ALLOC_SNR = 1; |
| }; |
| |
| enum SbcChannelMode { |
| 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. |
| struct SbcEncoderSettings { |
| SbcSubBands sub_bands = SbcSubBands.SUB_BANDS_8; |
| SbcAllocation allocation = SbcAllocation.ALLOC_LOUDNESS; |
| SbcBlockCount block_count = SbcBlockCount.BLOCK_COUNT_4; |
| SbcChannelMode channel_mode; |
| /// SBC bit pool value. |
| uint64 bit_pool; |
| }; |
| |
| /// Raw AAC access units. |
| struct AacTransportRaw { |
| }; |
| |
| /// AAC inside LATM |
| struct AacTransportLatm { |
| /// Whether MuxConfiguration stream element is present |
| bool mux_config_present; |
| }; |
| |
| /// AAC inside ADTS |
| struct AacTransportAdts { |
| }; |
| |
| flexible union AacTransport { |
| 1: AacTransportRaw raw; |
| 2: AacTransportLatm latm; |
| 3: AacTransportAdts adts; |
| }; |
| |
| enum AacChannelMode { |
| MONO = 0; |
| STEREO = 2; |
| }; |
| |
| struct AacConstantBitRate { |
| /// Bits per second |
| uint32 bit_rate; |
| }; |
| |
| /// 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 |
| enum AacVariableBitRate { |
| V1 = 1; |
| V2 = 2; |
| V3 = 3; |
| V4 = 4; |
| V5 = 5; |
| }; |
| |
| union AacBitRate { |
| 1: AacConstantBitRate constant; |
| 2: AacVariableBitRate variable; |
| }; |
| |
| enum AacAudioObjectType { |
| /// MPEG-2 Low Complexity |
| MPEG2_AAC_LC = 0; |
| }; |
| |
| struct AacEncoderSettings { |
| AacTransport transport; |
| AacChannelMode channel_mode; |
| AacBitRate bit_rate; |
| AacAudioObjectType aot; |
| }; |
| |
| table H264EncoderSettings { |
| }; |
| |
| /// Settings for encoders that tell them how to encode raw |
| /// formats. |
| flexible union EncoderSettings { |
| 1: SbcEncoderSettings sbc; |
| 2: AacEncoderSettings aac; |
| 3: H264EncoderSettings h264; |
| }; |
| |
| /// 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. |
| table FormatDetails { |
| // 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: 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 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: string mime_type; |
| |
| // 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: bytes oob_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: 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 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: vector<Parameter> pass_through_parameters; |
| |
| /// 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: EncoderSettings encoder_settings; |
| |
| /// 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: uint64 timebase; |
| }; |