blob: a2f9df502c972790f72359f0bccbf04f351a7189 [file] [log] [blame]
// 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.
@available(added=7)
library fuchsia.mediacodec;
using fuchsia.media;
using fuchsia.math;
using zx;
// CreateDecoder_Params
//
// Input parameters for creating a decoder (audio or video).
//
/// Whether buffers need to be secure. If not specified, the default is OFF.
///
/// This enum may have additional values added later; code handling this type
/// should be written with this in mind. For example, in C++, having a
/// "default" case in any switch statement on this type will avoid compilation
/// warnings/errors when a new value is added.
//
// Later we can add DYNAMIC, as needed.
type SecureMemoryMode = strict enum : uint32 {
// Normal memory. This is the default if a field of this type is not set.
OFF = 0;
// Secure memory.
ON = 1;
};
type CreateDecoder_Params = table {
/// Input mime type for a decoder.
///
/// The recognized mime types for now:
/// video/h264
/// video/vp9
/// audio/aac
/// input_details.oob_bytes must be an AudioSpecificConfig() as defined
/// by AAC spec.
/// audio/sbc
/// input_details.oob_bytes must be Codec Specific Information Elements
/// for SBC as defined by the A2DP spec.
1: input_details fuchsia.media.FormatDetails;
// The settings below nail down more details.
/// This must be true in order for the client to be permitted to put a
/// timestamp on an input packet, which is in turn required to get any
/// timestamps on any output packets.
///
/// It is always legal to provide separate Access Units (henceforth AUs) to a
/// decoder, but this boolean must be true for a decoder to accept and
/// propagate timestamp values.
///
/// This must be true when creating a video encoder, or the CodecFactory
/// channel will close.
///
/// If not set, interpreted as false.
2: promise_separate_access_units_on_input bool;
// "require" fields:
//
// Specifying any of these "require" fields can result in failure to get a
// Codec if there's no suitable codec. None of these correspond to any
// required features of a codec server.
//
// TODO(dustingreen): implement filtering codecs based on these fields.
/// Require that the selected codec be capable of accepting input where
/// AUs are not separated into separate packets.
///
/// This does not imply that the decoder can find the start of the first AU;
/// for that see require_can_find_start. This does not imply that the decoder
/// can re-sync on its own if the stream data is damaged; for that see
/// require_can_re_sync.
///
/// If both promise_separate_access_units_on_input and
/// require_can_stream_bytes_input are true, the CodecFactory channel will
/// close.
///
/// If this is false, the client must feed separate AUs on the fuchsia.ui.input. This
/// must be false for a video encoder, and if true the CodecFactory channel
/// will close.
///
/// Unless a client demands a decoder capable of taking concatenated AUs
/// (require_can_stream_bytes_input true), the client must feed a decoder
/// separate AUs. This means the client cannot have parts of two separate AUs
/// in the same packet, unless require_can_stream_bytes_input is true.
///
/// If not set, interpreted as false.
3: require_can_stream_bytes_input bool;
/// A decoder is allowed to be capable of streaming bytes but not capable of
/// searching for the start of the first usable AU. To require both, set both
/// require_can_stream_bytes_input and require_can_find_start. Setting
/// require_can_find_start without require_can_stream_bytes_input is invalid.
///
/// With require_can_stream_bytes_input true but require_can_find_start false,
/// the client must start the first packet with the start of an AU, but can
/// send a stream of bytes after that.
///
/// If not set, interpreted as false.
4: require_can_find_start bool;
/// On problematic input data, all decoders are expected to at least be able to
/// close the channel rather than getting stuck in a failed and/or broken
/// state.
///
/// A decoder returned from a request with require_can_re_sync is potentially
/// able to handle damaged input without closing the Codec channel. Such a
/// Codec is encouraged, but not required, to also satisfy requirements of
/// require_report_all_detected_errors.
///
/// If not set, interpreted as false.
5: require_can_re_sync bool;
/// Sometimes a client would rather fail an overall use of a decoder than fail
/// to notice data corruption. For such scenarios, the client can specify
/// require_report_all_detected_errors. For any codec returned from a
/// request with require_report_all_detected_errors set, on detection of
/// any input data corruption the codec will report in one or more of these
/// ways:
/// * closing the Codec channel
/// * OnStreamFailed()
/// * error_detected_before
/// * error_detected_during
///
/// If false, a codec may silently skip past corrupted input data.
///
/// No decoder can detect all corruption, because some corruption can look like
/// valid stream data. This requirement is only to request a codec that
/// is written to attempt to detect _and report_ input stream corruption.
///
/// This flag is not intended to be 100% bulletproof. If a client needs robust
/// assurance that _all_ detectable stream corruption is _always_ detected,
/// this flag is not enough of a guarantee to achieve that. Since some stream
/// corruption is inherently non-detectable in any case, such a client should
/// consider using stronger techniques upstream to ensure that corruption can
/// be detected with the needed probability very close to 1.
///
/// This flag being true doesn't imply anything about whether the codec will
/// discard damaged data vs. producing corresponding damaged output. Only that
/// the codec will set error_detected_* bools to true when appropriate.
///
/// Regardless of this setting, not all timestamp_ish values provided on input
/// are guaranteed to show up on output.
///
/// If not set, interpreted as false.
6: require_report_all_detected_errors bool;
/// If true, require that the returned codec is HW-accelerated. See also
/// `require_sw`.
///
/// If not set, interpreted as false.
7: require_hw bool;
/// permit_lack_of_split_header_handling
///
/// This field is a temporary field that will be going away.
///
/// TODO(dustingreen): Remove this field once we're down to zero codecs with
/// problems handling split headers.
///
/// By default, a Codec instance is required to handle "split headers", meaning
/// that a client is allowed to deliver parts of an AU one byte at a time,
/// including parts near the beginning of the AU, and the codec is required to
/// tolerate and handle that properly. However, unfortunately not all codecs
/// properly support split headers. If a client is willing to permit such a
/// codec to be used, the client can set this to true. Clients are not
/// encouraged to set this, but setting it may be necessary to find a codec for
/// some formats _for now_. If a client sets this to true, the client should
/// deliver data of each AU with many contiguous non-split bytes from the start
/// of each AU. The client is not strictly required to deliver one AU at a
/// time, only to ensure that either all the AU bytes are in a single packet or
/// that many bytes at the start of each AU are in a single packet.
///
/// The specification for how a client should use this and how a client should
/// behave if setting this to true is intentionally vague, because lack of
/// support for header splitting is not ideal, and is expected to be
/// temporary, and all codecs should handle split headers in the long run.
/// The main intent of this field is to avoid giving an innocent client using
/// default value of false here a codec that can't properly handle split
/// headers. This is not an attempt at a mechanism to fully work around a
/// codec that doesn't handle split headers.
///
/// If not set, interpreted as false.
//
// TODO(dustingreen): In the near term, wire this up so that SoftAAC2.cpp
// used for ADTS is not selected when this field is false, even if there is
// no other suitable codec. In the long term, fix or work around the header
// handling behavior of SoftAAC2 when used in ADTS mode (and any other
// similar issues in other codecs) and remove this field.
8: permit_lack_of_split_header_handling bool;
/// If set to ON, the decoder must support secure buffers on output, and
/// must reject non-secure buffers on output.
///
/// If set to OFF or not set, the created decoder will reject secure buffers
/// on output by closing the StreamProcessor channel.
///
/// If secure_input_mode ON, secure_output_mode must also be ON.
9: secure_output_mode SecureMemoryMode;
/// If set to ON, the decoder must support secure buffers on input and must
/// reject non-secure buffers on input.
///
/// If set to OFF or not set, the created decoder will reject secure buffers
/// on input by closing the StreamProcessor channel.
///
/// If secure_input_mode ON, secure_output_mode must also be ON.
10: secure_input_mode SecureMemoryMode;
/// If true, require that the returned codec is entirely SW-based, not
/// HW-accelerated (other than possibly using vector CPU instructions).
/// This can be useful for testing purposes or other special scenarios, but
/// is not recommended for performance-sensitive scenarios. Also, some
/// builds may lack a SW-based decoder for some formats. See also
/// `require_hw`.
///
/// If not set, interpreted as false.
11: require_sw bool;
};
/// Parameters used to request an encoder.
type CreateEncoder_Params = table {
/// The format of the uncompressed input data.
///
/// This field should be a raw mime_type (e.g. 'video/raw') and uncompressed
/// format details for the encoder to use when reading buffers.
///
/// To be elibigible an encoder must support the input format.
1: input_details fuchsia.media.FormatDetails;
/// If true, require that the returned codec is HW-accelerated.
///
/// If not set, interpreted as false.
2: require_hw bool;
};
type CodecType = strict enum {
DECODER = 0;
ENCODER = 1;
};
/// Constrain the mime_type to a size that won't cause problems.
const CODEC_FACTORY_MAX_MIME_TYPE_LENGTH uint32 = 256;
/// More than this many calls to AttachLifetimeTracking()
/// without a Create{X}() call will result in CodecFactory channel closing from
/// the server end.
const CODEC_FACTORY_LIFETIME_TRACKING_EVENTPAIR_PER_CREATE_MAX uint32 = 16;
/// Constrain the length of the vector indicated via `OnCodecList`, and constrain the max items in
/// any vector within the response from `GetDetailedCodecDescriptions`. The overall enforced limit
/// for codec caps information is the max channel message size however, since nested vectors each of
/// max size could otherwise exceed the max channel message size.
const CODEC_FACTORY_CODEC_LIST_SIZE_MAX uint32 = 256;
/// Deprecated.
///
/// Rather than listening for OnCodecList, clients needing codec information prior to just
/// requesting a codec with CodecFactory.CreateDecoder or CodecFactory.CreateEncoder should instead
/// use GetDetailedCodecDescriptions to get the DetailedCodecDescription table instead, which has
/// per-profile-entry equivalents of all these fields. Clients with no real need for codec
/// information prior to requesting a codec can call CodecFactory.CreateDecoder or
/// CodecFactory.CreateEncoder with relevant requirements set in that request, and then
/// StreamProcessor.Sync to see if a codec was actually created successfully.
///
/// In contrast to OnCodecList which uses FIDL structs (due to ordering of historical events),
/// GetDetailedCodecDescriptions uses FIDL tables so is not expected to need to be deprecated, since
/// we can add new table fields as needed, and gradually deprecate old table fields if appropriate,
/// without deprecating the whole thing.
///
/// Per-codec servers do not need to fill out this struct or send OnCodecList, as the main
/// CodecFactory will construct the OnCodecList info from the GetDetailedCodecDescriptions info, so
/// that each codec can (optionally) stop sending OnCodecList immediately, rather than having to
/// wait for all clients to stop listening to OnCodecList, which may take a while. All codecs _do_
/// need to implement GetDetailedCodecDescriptions however.
@available(added=7, deprecated=11)
type CodecDescription = struct {
/// Decoder or encoder.
codec_type CodecType;
/// The mime type of the compressed format. For decoders this is the mime
/// type of the input. For encoders, this is the mime type of the output.
mime_type string:CODEC_FACTORY_MAX_MIME_TYPE_LENGTH;
/// For each of these fields, the default is the most-capable setting, but
/// if a codec doesn't support the most-capable behavior, then the codec
/// must override the default.
@allow_deprecated_struct_defaults
can_stream_bytes_input bool = true;
@allow_deprecated_struct_defaults
can_find_start bool = true;
@allow_deprecated_struct_defaults
can_re_sync bool = true;
@allow_deprecated_struct_defaults
will_report_all_detected_errors bool = true;
@allow_deprecated_struct_defaults
is_hw bool = true;
@allow_deprecated_struct_defaults
split_header_handling bool = true;
};
/// Specification of the supported parameters of a given video decoder.
///
/// Fields in this table with the same name as fields in CodecDescription have the same meaning as
/// the fields in the CodecDescription struct when the corresponding field in this table is set.
///
/// When a corresponding field is un-set, each of these fields is interpreted according to the
/// corresponding doc comment on the field in this table (doc comments on fields in the
/// CodecDescription struct re. struct field defaults are not relevant to the interpretation of
/// un-set fields of this table).
///
/// For video decoders, the following is always required:
/// * Handling split input payload (distinct from split header), when an input frame is too large
/// for a single input buffer. The next portion (possibly the remainder) of the timstamped
/// input chunk is delivered in the next input packet.
///
/// For audio decoders, the following is always required:
/// * Concatenation of multiple compressed audio chunks via the input is always permitted.
@available(added=11)
type DecoderProfileDescription = table {
/// The codec profile that this decoder supports. If the client wants to use this
/// profile, the requirements specified in this table must be adhered to.
1: profile fuchsia.media.CodecProfile;
/// The minimum image size this decoder supports for the given |profile|.
/// Decoders must set this field, and this field must specify a size that is
/// >= the min size defined for the profile in the codec spec.
///
/// This size refers to the pixel layout in memory, not the display_rect which can be smaller
/// than the fuchsia.Images2.ImageFormat.size / fuchsia.sysmem.ImageFormat2.coded_width/height.
2: min_image_size fuchsia.math.SizeU;
/// The maximum image size this decoder supports for the given |profile|.
///
/// Decoders must set this field, and this field must specify a size that is <= the max size
/// defined for the profile in the codec spec.
///
/// This size refers to the pixel layout in memory, not the display_rect which can be smaller
/// than the fuchsia.Images2.ImageFormat.size / fuchsia.sysmem.ImageFormat2.coded_width/height.
///
/// By setting this field, a decoder is not required to fail to decode a stream that specifies a
/// size that is larger than the profile of the stream would normally allow. The decoder may or
/// may not fail to decode a stream which is not a listed profile or not within the size bounds
/// of a listed profile.
3: max_image_size fuchsia.math.SizeU;
/// This |profile| entry can apply to encrypted input data. If require_encryption is false or
/// unset, this |profile| entry can also apply to unencrypted input data.
///
/// This will be un-set (even when allow_input_protection or require_input_protection are true)
/// until Fuchsia supports decryption as part of decode (in contrast to it being a separate step
/// involving protected memory in between). When allow_encryption is false/un-set but
/// allow_input_protection is true, a client setting up DRM decode should set up decryption as a
/// separate step prior to decode with protected memory in between the decrypt and decode.
4: allow_encryption bool;
/// This |profile| entry applies only when input data is encrypted. This |profile| entry does
/// not apply for unencrypted input data. Un-set is interepted as false.
///
/// If this is set to true and there is no profile with require_encryption false in the same
/// DetailedCodecDescription, then this decoder only supports encrypted input.
///
/// This will be un-set until Fuchsia supports decryption as part of decode (even when
/// allow_input_protection or require_input_protection are true). See also allow_encryption,
/// allow_input_protection, require_input_protection.
5: require_encryption bool;
/// This |profile| entry can apply when input data delivered via protected memory. Whether to
/// protect input and which protected "heap" to use (if protecting input) is determined during
/// sysmem constraints aggregation and via DRM mechanisms. See also require_input_protection,
/// allow_encryption, require_encryption.
6: allow_input_protection bool;
/// This |profile| entry applies only when input data is delivered via protected memory. Whether
/// to protect input and which protected "heap" to use (if protecting input) is determined
/// during sysmem constraints aggregation, and by separate DRM mechanisms.
///
/// If this is set to true and there is no profile with require_input_protection false in the
/// same DetailedCodecDescription, then this decoder only supports protected input.
///
/// Output protection is negotiated separately during output buffer constraints aggregation in
/// sysmem, and via DRM mechanisms.
///
/// See also allow_input_protection, allow_encryption, require_encryption.
7: require_input_protection bool;
/// If set to true, the decoder can handle an input chunk payload (containing compressed data)
/// that's split across a packet boundary (between header and payload, or between payload
/// bytes), and the decoder can also handle more than one input chunk containing compressed
/// input data in a single input packet. See also split_header_handling to determine if the
/// decoder can also handle split headers.
///
/// Un-set means false.
///
/// While this field always indicates whether it's ok to split an input chunk across a packet
/// boundary or not, and this field being set always implies it's ok to have a single input
/// packet with bytes from more than one input chunk including when the input chunks contain
/// compressed input data, there is some additional somewhat-subtle meaning that differs between
/// video and audio decoders.
///
/// Audio decoders are always required to permit more than one input chunk in a single input
/// packet, including mulitple input chunks which each contain compressed input data (not just
/// prepended "context" headers), regardless of this field being set or unset. For audio
/// decoders, this field only indicates whether splitting an input chunk across packets is
/// allowed.
///
/// Audio decoders shouldn't set split_header_handling to true unless they also set
/// can_stream_bytes_input to true, since allowing splitting header bytes is meaningless unless
/// it's allowed to split an input chunk.
///
/// For video decoders, if this field is un-set or false, the decoder may not be able to handle
/// bytes of more than one input chunk in a single input packet. However, for all decoders
/// (both video and audio) it's always ok for preceding "context" headers such as the h264 SPS
/// and PPS headers to be in the same input packet as the following input chunk containing
/// compressed input data such as an h264 slice (for example). A video decoder is always
/// required to permit continuation of an input chunk in the next packet, with the split between
/// header byte and compressed input data byte or between two compressed input data bytes (but
/// not necessarily between two header bytes; see also split_header_handling).
///
/// It's expected to be fairly common for a decoder to set can_stream_bytes_input to true, but
/// leave split_header_handling un-set or set split_header_handling to false, due to parsing
/// limitations in the HW, FW, or driver. Decoders which set can_stream_bytes_input false or
/// leave can_stream_bytes_input un-set may be forcing input data to be re-packed in some
/// scenarios. Profiles which set allow_encryption are encouraged to also set
/// can_stream_bytes_input if feasible, as re-packing input data can be more difficult in some
/// scenarios involving encryption.
8: can_stream_bytes_input bool;
/// If set to true, the decoder can scan forward at the start of a stream to find the start of
/// the first fully-present input chunk, even if the input data starts at a byte that's in the
/// middle of a chunk.
///
/// For both video and audio decoders, setting this field to true also indicates the ability to
/// handle (skip or only partly use) any input chunks that are not possible to decode (or not
/// possible to fully decode) due to lack of referenced prior data.
///
/// If un-set or false, the decoder may not be able to scan forward to sync up with the input
/// stream unless the input stream starts with the beginning of a suitable chunk.
9: can_find_start bool;
/// If set to true, the decoder can resynchronize with the input stream (eventually) despite a
/// missing input chunk, and can handle partial input chunks without failing the stream or the
/// StreamProcessor control connection.
10: can_re_sync bool;
/// If set to true, the decoder makes efforts to indicate partial or detected-as-missing or
/// detected-as-corrupt input chunks by setting error_detected_before and/or
/// error_detected_during as appropriate. Even when this field is set to true, it is worth
/// noting that in general it is not possible for a decoder to detect all possible data
/// corruptions, as codecs generally aren't inclined to include error detection bits within the
/// stream. This is not a replacment for a real (as in robust with high probability against
/// random bit flips and bit insertion/deletion) data integrity check.
11: will_report_all_detected_errors bool;
/// If set to true, the decoder can handle the bytes of any header being split across packet
/// boundaries. If false or un-set, the decoder requires all header bytes of a header to be
/// within the same packet.
///
/// Starting a new packet at the spec-defined boundary between two headers that are officially
/// in separate input chunks is always permitted.
///
/// For purposes of this field, headers like the h264 SPS and PPS headers are considered
/// separate input chunks, and so such headers that have their own input chunk can be delivered
/// in a separate packet regardless of the setting of this field, and a subsequent h264 slice
/// header can be in yet another packet.
///
/// It is always permissible regardless of the setting of this field for "context" headers (such
/// as h264 SPS and PPS headers) to be delivered in the same packet as the subsequent chunk
/// which conveys compressed image data (such as an h264 slice).
///
/// Splitting a single header between codec_oob_bytes and the stream data is never supported (as
/// in, never to be relied on by clients), not even when this field is set to true.
///
/// See also can_stream_bytes_input.
///
/// Video decoders with can_stream_bytes_input true but split_header_handling false can handle
/// continuing an chunk in the next packet when split between header and payload or between
/// payload bytes, and can handle bytes of more than one input chunk in a single input packet,
/// but cannot handle splitting a header across packets. Video decoders with
/// can_stream_bytes_input false and split_header_handling true cannot tolerate bytes of more
/// than one input chunk in a single packet, but can tolerate continuation of an input chunk in
/// a following packet regardless of where the split occurs (such as in the middle of an h264
/// SPS, PPS, or slice header).
///
/// Audio decoders shouldn't set split_header_handling to true unless they also set
/// can_stream_bytes_input to true, since for an audio decoder, allowing splitting header bytes
/// is meaningless (for audio decoders) unless also allowing splitting an input chunk.
12: split_header_handling bool;
};
@available(added=11)
type EncoderProfileDescription = table {
1: profile fuchsia.media.CodecProfile;
// TODO(https://fxbug.dev/42073478): Add additional table fields to indicate more detailed per-codec-profile
// encoder caps.
};
@available(added=11)
type ProfileDescriptions = strict union {
/// A list of |DecoderProfileDescription| that describe what codec profiles this
/// decoder supports along with requirements that must be adhered to if the client
/// is to use the decoder. The CodecFactory guarantees to the client that each
/// |DecoderProfileDescription| within |decoder_profile_descriptions| will have an
/// unique |profile|.
1: decoder_profile_descriptions
vector<DecoderProfileDescription>:CODEC_FACTORY_CODEC_LIST_SIZE_MAX;
2: encoder_profile_descriptions
vector<EncoderProfileDescription>:CODEC_FACTORY_CODEC_LIST_SIZE_MAX;
};
/// Clients needing codec information prior to just requesting a codec with
/// CodecFactory.CreateDecoder or CodecFactory.CreateEncoder should use GetDetailedCodecDescriptions
/// to get this table, which has details re. the codec and the profile entries supported by the
/// codec.
///
/// Clients with no real need for codec information prior to requesting a codec can simply use
/// CodecFactory.CreateDecoder or CodecFactory.CreateEncoder with relevant requirements set in that
/// request, and then call StreamProcessor.Sync (round trip) to see if a codec was created
/// successfully.
@available(added=11)
type DetailedCodecDescription = table {
/// Decoder or encoder.
1: codec_type CodecType;
/// The mime type of the compressed format. For decoders this is the mime
/// type of the input. For encoders, this is the mime type of the output.
2: mime_type string:CODEC_FACTORY_MAX_MIME_TYPE_LENGTH;
/// If this decoder/encoder uses underlying hardware to perform its operations.
3: is_hw bool;
/// A list of profile descriptions that describe what codec profiles this
/// encoder/decoder supports along with requirements for using each profile.
4: profile_descriptions ProfileDescriptions;
};
// CodecFactory
//
/// The purpose of the media::CodecFactory interface is to create
/// media::StreamProcessor instances for decoders and encoders.
///
/// The interface methods don't attempt to homogenize all codec types,
/// preferring to have a separate dedicated message for decoders.
@discoverable
closed protocol CodecFactory {
/// Driver-based local CodecFactory(s) will send this once shortly after the
/// main CodecFactory connects to the driver-local CodecFactory.
///
/// For now, the main CodecFactory will not send this.
///
/// A SW-based local CodecFactory(s) will not send this event.
///
/// Each codec in the list must be separately-described, for clean aggregation.
//
// TODO(https://fxbug.dev/42073593): Remove OnCodecList when possible.
@available(added=7, deprecated=11, note="use GetDetailedCodecDescriptions()")
strict -> OnCodecList(struct {
codecs vector<CodecDescription>:CODEC_FACTORY_CODEC_LIST_SIZE_MAX;
});
// Requests:
/// A client should call |GetDetailedCodecDescriptions()| to get a list of
/// codecs supported either by software implementations or by underlying hardware.
@available(added=11)
strict GetDetailedCodecDescriptions() -> (table {
1: codecs vector<DetailedCodecDescription>:CODEC_FACTORY_CODEC_LIST_SIZE_MAX;
});
/// CreateDecoder:
///
/// decoder_params - See CreateDecoder_Params comments for required
/// and optional parameters for creating a decoder.
///
/// decoder - a Codec.NewRequest() which will hopefully be connected to
/// a Codec server, or the Codec channel will get closed if no suitable
/// codec can be found. We don't return any additional Codec-specific
/// status here because finding the Codec is allowed to be fully async, so
/// we don't necessarily yet know on return from this method which Codec
/// will be selected, if any.
///
/// Rough sequence to create a decoder:
///
/// factory = ConnectToEnvironmentService(CodecFactory);
/// CreateDecoder_Params params;
/// [fill out params]
/// CreateDecoder(params, decoder_request);
///
/// See use_media_decoder code for more detail.
strict CreateDecoder(resource struct {
decoder_params CreateDecoder_Params;
decoder server_end:fuchsia.media.StreamProcessor;
});
/// CreateEncoder:
///
/// encoder_params - See CreateEncoder_Params comments for required
/// and optional parameters for creating a decoder.
///
/// encoder - a Codec.NewRequest() which will hopefully be connected to
/// a Codec server, or the Codec channel will get closed if no suitable
/// codec can be found. We don't return any additional Codec-specific
/// status here because finding the Codec is allowed to be fully async, so
/// we don't necessarily yet know on return from this method which Codec
/// will be selected, if any.
strict CreateEncoder(resource struct {
encoder_params CreateEncoder_Params;
encoder server_end:fuchsia.media.StreamProcessor;
});
/// AttachLifetimeTracking:
///
/// Attach an eventpair endpoint to the next Create{X}(), so that the
/// codec_end will be closed when the number of buffers allocated reaches
/// 'buffers_remaining'. Multiple eventpair endpoints can be attached per
/// create, with an enforced limit of
/// CODEC_FACTORY_LIFETIME_TRACKING_EVENTPAIR_PER_CREATE_MAX.
///
/// The lifetime signalled by this event is intended to track all resources
/// used by the codec, including sysmem-allocated buffers created internally
/// by the codec. The sysmem buffer collections visible to the client, for
/// input and output buffers, are not included in the resources tracked
/// here, because those can be tracked separately via
/// fuchsia.sysmem.BufferCollection.AttachLifetimeTracking(). It is
/// permitted to send a duplicate of codec_end to both this
/// AttachLifetimeTracking() and also to
/// fuchsia.sysmem.BufferCollection.AttachLifetimeTracking().
/// The ZX_EVENTPAIR_PEER_CLOSED will happen when both/all lifetimes are
/// fully over. This conveniently avoids needing multiple separate async
/// waits by the client.
///
/// In the case of server process crashes, or failure of a codec to plumb
/// codec_end to sysmem, ZX_EVENTPAIR_PEER_CLOSED signalled on the peer of
/// codec_end may occur shortly before all resources are freed.
///
/// A maximum of CODEC_FACTORY_LIFETIME_TRACKING_EVENTPAIR_PER_CREATE_MAX
/// calls to AttachLifetimeTracking() are allowed
/// before any Create{X}(). There is no way to cancel an attach short of
/// closing the CodecFactory channel. Closing the client end of the
/// eventpair doesn't subtract from the number of pending attach(es). For
/// this reason, it can be good to only send attach message(s) immediately
/// before the relevant Create{X}(), when it's known by the client that both
/// the attach message(s) and the Create{X}() messages will be sent.
///
/// Closing the client's end doesn't result in any action by the server.
/// If the server listens to events from the client end at all, it is for
/// debug logging only.
///
/// The server intentionally doesn't "trust" any bits signalled by the
/// client. This mechanism intentionally uses only ZX_EVENTPAIR_PEER_CLOSED
/// which can't be triggered early, and is only triggered when all handles
/// to codec_end are closed. No meaning is associated with any of the other
/// signal bits, and clients should functionally ignore any other signal
/// bits on either end of the eventpair or its peer.
///
/// The codec_end may lack ZX_RIGHT_SIGNAL or ZX_RIGHT_SIGNAL_PEER, but must
/// have ZX_RIGHT_DUPLICATE (and must have ZX_RIGHT_TRANSFER to transfer
/// without causing CodecFactory channel failure).
strict AttachLifetimeTracking(resource struct {
codec_end zx.Handle:EVENTPAIR;
});
};