[media] StreamProcessor Comments -> Doc Comments
This CL updates StreamProcessor FIDL comments to be doc comments, so
that they are visible in rendered FIDL reference and language binding
documentation.
This change was performed manually.
* Some blocks are rearranged to flow through to rendered docs in a
sensible place.
* Tags on comments indicating what element they document have been
removed as tooling now makes this association based on position.
* References to stream_processor.md have been removed as this does
not exist.
* Promotes deprecation comments to [Deprecated] FIDL attributes.
TEST: docs only change
Change-Id: I173713895437459f908e556ddd4ff3f32054cdea
diff --git a/sdk/fidl/fuchsia.media/fuchsia.media.api b/sdk/fidl/fuchsia.media/fuchsia.media.api
index 663c855..bd95409 100644
--- a/sdk/fidl/fuchsia.media/fuchsia.media.api
+++ b/sdk/fidl/fuchsia.media/fuchsia.media.api
@@ -7,7 +7,7 @@
"fidl/fuchsia.media/metadata.fidl": "b9960fdbc41d5c2d5a56ebb8c68091cb",
"fidl/fuchsia.media/stream.fidl": "3448eded0321f9308535708fa2ed53a1",
"fidl/fuchsia.media/stream_common.fidl": "94f8089f2e58955d82560b6ef74247c3",
- "fidl/fuchsia.media/stream_processor.fidl": "23a6b5cd1ccacc2b104209281aab0325",
+ "fidl/fuchsia.media/stream_processor.fidl": "70520b0295fb3d076499200110a2a54d",
"fidl/fuchsia.media/stream_type.fidl": "51b26d41607bec6c23b7335de736c756",
"fidl/fuchsia.media/timeline_function.fidl": "10e9c5225e1b4596150724cf45d2a8a4",
"fidl/fuchsia.media/usage_reporter.fidl": "a6edde0921f0adb903a4c37f9aa2b13a"
diff --git a/sdk/fidl/fuchsia.media/stream_processor.fidl b/sdk/fidl/fuchsia.media/stream_processor.fidl
index 0dd2c12..8719249 100644
--- a/sdk/fidl/fuchsia.media/stream_processor.fidl
+++ b/sdk/fidl/fuchsia.media/stream_processor.fidl
@@ -6,410 +6,342 @@
using fuchsia.sysmem;
-// See stream_processor.md for detailed interface documentation. The comments
-// here are a summary only. Client implementers should see stream_processor.md
-// for more detail on any message that doesn't seem sufficiently-described
-// here. StreamProcessor server implementers should probably read
-// stream_processor.md before implementing.
-
-// Overview of operation:
-//
-// 1. Create
-// * create via CodecFactory - see CodecFactory
-// * create via LicenseSession - see LicenseSession
-// 2. Get input constraints
-// * OnInputConstraints() - sent unsolicited by stream processor shortly after
-// stream processor creation.
-// 3. Provide input buffers
-// * SetInputBufferPartialSettings() (current way)
-// * SetInputBufferSettings() / AddInputBuffer() (old deprecated way)
-// 4. Deliver input data
-// * QueueInputPacket() + OnFreeInputPacket(), for as long as it takes,
-// possibly working through all input packets repeatedly before...
-// 5. Get output constraints and format
-// * OnOutputConstraints()
-// * This is not sent until after at least one QueueInput* message is sent by
-// the client, even if the underlying processor behind the StreamProcessor
-// doesn't fundamentally need any input data to determine its output
-// constraints. This server behavior prevents clients taking an incorrect
-// dependency on the output constraints showing up before input is
-// delivered.
-// * A client must tolerate this arriving as late as after substantial input
-// data has been delivered, including lots of input packet recycling via
-// OnFreeInputPacket().
-// * This message can arrive more than once before the first output data.
-// 6. Provide output buffers
-// * SetOutputBufferPartialSettings() / CompleteOutputBufferPartialSettings()
-// (current way)
-// * SetOutputBufferSettings() / AddOutputBuffer()
-// (old deprecated way)
-// 7. Data flows, with optional EndOfStream
-// * OnOutputPacket() / RecycleOutputPacket() / QueueInputPacket() /
-// OnFreeInputPacket() / QueueInputEndOfStream() / OnOutputEndOfStream()
-//
-// It's possible to re-use a StreamProcessor instance for another stream, and
-// doing so can sometimes skip over re-allocation of buffers. This can be a
-// useful thing to do for cases like seeking to a new location - at the
-// StreamProcessor interface that can look like switching to a new stream.
-
-// StreamBufferConstraints
-//
-// This struct helps ensure that packet count and buffer space are sufficient
-// to avoid major problems. For example, a video decoder needs sufficient
-// video frame buffers to hold all potential reference frames concurrently +
-// one more video buffer to decode into. Else, the whole video decode pipe can
-// easily deadlock.
-//
-// The secondary purpose of this struct is to help ensure that packet count and
-// buffer space are sufficient to achieve reasonably performant operation.
-//
-
-// There are separate instances of this struct for stream input and stream
-// output.
+/// StreamBufferConstraints
+///
+/// This struct helps ensure that packet count and buffer space are sufficient
+/// to avoid major problems. For example, a video decoder needs sufficient
+/// video frame buffers to hold all potential reference frames concurrently +
+/// one more video buffer to decode into. Else, the whole video decode pipe can
+/// easily deadlock.
+///
+/// The secondary purpose of this struct is to help ensure that packet count and
+/// buffer space are sufficient to achieve reasonably performant operation.
+///
+/// There are separate instances of this struct for stream input and stream
+/// output.
+///
+/// Notes about fields:
+///
+/// For uncompressed video, separate and complete frames in their
+/// separate buffers (buffer-per-packet mode) are always a requirement.
+///
+/// per_packet_buffer_bytes.*: These per-packet buffer bytes constraints apply to
+/// both buffer-per-packet mode and single-buffer mode (see `single_buffer_mode`).
+/// If buffer-per-packet mode, the constraints apply to each buffer separately.
+/// If single-buffer mode, the constraints need to be multiplied by the number
+/// of packets to determine the constraints on the single buffer.
//
// TODO(dustingreen): Some of the buffer-focused fields in this structure will
// go away in favor of using sysmem for those aspects. The packet count fields
// will stay. The single-buffer fields will stay.
table StreamBufferConstraints {
- // This is a version number the server sets on the constraints to allow the
- // server to determine when the client has caught up with the latest
- // constraints sent by the server. The server won't emit output data until
- // the client has configured output settings and buffers with a
- // buffer_constraints_version_ordinal >= the latest
- // buffer_constraints_version_ordinal that had
- // buffer_constraints_action_required true. See
- // buffer_constraints_action_required comments for more.
- //
- // A buffer_constraints_version_ordinal of 0 is not permitted, to simplify
- // initial state handling. Other than 0, both odd and even version ordinals
- // are allowed (in contrast to the stream_lifetime_ordinal, neither the
- // client nor server ever has a reason to consider the latest version to be
- // stale, so there would be no benefit to disallowing even values).
+ /// This is a version number the server sets on the constraints to allow the
+ /// server to determine when the client has caught up with the latest
+ /// constraints sent by the server. The server won't emit output data until
+ /// the client has configured output settings and buffers with a
+ /// buffer_constraints_version_ordinal >= the latest
+ /// buffer_constraints_version_ordinal that had
+ /// buffer_constraints_action_required true. See
+ /// buffer_constraints_action_required comments for more.
+ ///
+ /// A buffer_constraints_version_ordinal of 0 is not permitted, to simplify
+ /// initial state handling. Other than 0, both odd and even version ordinals
+ /// are allowed (in contrast to the stream_lifetime_ordinal, neither the
+ /// client nor server ever has a reason to consider the latest version to be
+ /// stale, so there would be no benefit to disallowing even values).
1: uint64 buffer_constraints_version_ordinal;
- // default_settings
- //
- // These settings are "default" settings, not "recommended" settings.
- //
- // These "default" settings can be passed to SetInputBufferSettings() /
- // SetOutputBufferSettings() as-is without modification, but a client doing
- // that must still obey the semantics of packet_count_for_client, despite
- // the stream processor server not having any way to really know the proper
- // setting for that field.
- //
- // For StreamBufferConstraints fields whose names end in "recommended", the
- // default_settings will have the corresponding setting field set to that
- // recommended value.
- //
- // The stream processor promises that these default settings as-is (except
- // for buffer_lifetime_ordinal) are guaranteed to satisfy the constraints
- // indicated by the other fields of StreamBufferConstraints. While
- // client-side checking that these settings are within the constraints is
- // likely unnecessary in the client, the client should still check that
- // these values are within client-side reasonable-ness bounds before using
- // these values, to avoid letting a stream processor server cause problems
- // for the client.
- //
- // This structure will always have single_buffer_mode false. See
- // single_buffer_mode_allowed for whether single_buffer_mode true is
- // allowed.
- //
- // The client must set the buffer_lifetime_ordinal field to a proper value
- // before sending back to the server. The 0 initially in this field will
- // be rejected by the server if sent back as-is. See comments on
- // StreamBufferSettings.buffer_lifetime_ordinal.
+ /// default_settings
+ ///
+ /// These settings are "default" settings, not "recommended" settings.
+ ///
+ /// These "default" settings can be passed to SetInputBufferSettings() /
+ /// SetOutputBufferSettings() as-is without modification, but a client doing
+ /// that must still obey the semantics of packet_count_for_client, despite
+ /// the stream processor server not having any way to really know the proper
+ /// setting for that field.
+ ///
+ /// For StreamBufferConstraints fields whose names end in "recommended", the
+ /// default_settings will have the corresponding setting field set to that
+ /// recommended value.
+ ///
+ /// The stream processor promises that these default settings as-is (except
+ /// for buffer_lifetime_ordinal) are guaranteed to satisfy the constraints
+ /// indicated by the other fields of StreamBufferConstraints. While
+ /// client-side checking that these settings are within the constraints is
+ /// likely unnecessary in the client, the client should still check that
+ /// these values are within client-side reasonable-ness bounds before using
+ /// these values, to avoid letting a stream processor server cause problems
+ /// for the client.
+ ///
+ /// This structure will always have `single_buffer_mode` false. See
+ /// `single_buffer_mode_allowed` for whether `single_buffer_mode` true is
+ /// allowed.
+ ///
+ /// The client must set the buffer_lifetime_ordinal field to a proper value
+ /// before sending back to the server. The 0 initially in this field will
+ /// be rejected by the server if sent back as-is. See comments on
+ /// StreamBufferSettings.buffer_lifetime_ordinal.
2: StreamBufferSettings default_settings;
- // For uncompressed video, separate and complete frames, each in its own
- // separate buffer (buffer-per-packet mode), is always a requirement.
-
- // per_packet_buffer_bytes.*:
- //
- // These per-packet buffer bytes constraints apply to both buffer-per-packet
- // mode and single-buffer mode (see single_buffer_mode). If
- // buffer-per-packet mode, the constraints apply to each buffer separately.
- // If single-buffer mode, the constraints need to be multiplied by the number
- // of packets to determine the constraints on the single buffer.
-
- // per_packet_buffer_bytes_min:
- //
- // If a client is using buffer per packet mode, each buffer must be at least
- // this large. If a client is using single-buffer mode, the one buffer must
- // be at least per_packet_buffer_bytes_min * packet_count_for_server_min in
- // size.
+ /// If a client is using buffer per packet mode, each buffer must be at least
+ /// this large. If a client is using single-buffer mode, the one buffer must
+ /// be at least per_packet_buffer_bytes_min * packet_count_for_server_min in
+ /// size.
3: uint32 per_packet_buffer_bytes_min;
- // Must be >= per_packet_buffer_bytes_min. Delivering more than
- // this per input packet might not perform any better, and in fact might
- // perform worse.
+ /// Must be >= per_packet_buffer_bytes_min. Delivering more than
+ /// this per input packet might not perform any better, and in fact might
+ /// perform worse.
4: uint32 per_packet_buffer_bytes_recommended;
- // Must be >= per_packet_buffer_bytes_recommended. Can be 0xFFFFFFFF if
- // there is no explicitly-enforced limit.
+ /// Must be >= per_packet_buffer_bytes_recommended. Can be 0xFFFFFFFF if
+ /// there is no explicitly-enforced limit.
5: uint32 per_packet_buffer_bytes_max;
- // Minimum number of packet_count_for_server.
- //
- // Re. input and output:
- //
- // This is a strict min for packet_count_for_server, but a client can use
- // more packets overall if the client wants to, by using a larger value for
- // packet_count_for_server and/or using a non-zero packets_for_client. A
- // good reason to do the former would be if the client might tend to
- // deliver a few not-very-full buffers occasionally - or to have a few
- // extra packets within which to satisfy stream_input_bytes_min. A good
- // reason to do the latter would be if a client needs to hold onto some
- // packets for any "extra" duration.
- //
- // If a client specifies a larger packet_count_for_server value than
- // packet_count_for_server_min, a server is permitted (but not encouraged)
- // to not make progress until packet_count_for_server are with the server,
- // not merely packet_count_for_server_min.
- //
- // For decoder input and audio encoder input: The
- // packet_count_for_server_min may or may not contain enough data to allow
- // the stream processor to make progress without copying into an internal
- // side buffer. If there isn't enough data delivered in
- // packet_count_for_server_min packets to permit progress, the stream
- // processor must copy into its own side buffer internally to make
- // progress.
- //
- // If a client intends to use extra packets for client-side purposes, the
- // client should specify the extra packets in packets_for_client instead of
- // packet_count_for_server, but packet_count_for_server must still be >=
- // packet_count_for_server_min.
- //
- // See stream_processor.md for more on packet_count_for_server_min.
+ /// Minimum number of packet_count_for_server.
+ ///
+ /// Re. input and output:
+ ///
+ /// This is a strict min for packet_count_for_server, but a client can use
+ /// more packets overall if the client wants to, by using a larger value for
+ /// packet_count_for_server and/or using a non-zero packets_for_client. A
+ /// good reason to do the former would be if the client might occasionally
+ /// deliver a few not-very-full buffers - or to have a few
+ /// extra packets within which to satisfy stream_input_bytes_min. A good
+ /// reason to do the latter would be if a client needs to hold onto some
+ /// packets for any extra duration.
+ ///
+ /// If a client specifies a larger packet_count_for_server value than
+ /// packet_count_for_server_min, a server is permitted (but not encouraged)
+ /// to not make progress until packet_count_for_server are with the server,
+ /// not merely packet_count_for_server_min.
+ ///
+ /// For decoder input and audio encoder input: The
+ /// packet_count_for_server_min may or may not contain enough data to allow
+ /// the stream processor to make progress without copying into an internal
+ /// side buffer. If there isn't enough data delivered in
+ /// packet_count_for_server_min packets to permit progress, the stream
+ /// processor must copy into its own side buffer internally to make
+ /// progress.
+ ///
+ /// If a client intends to use extra packets for client-side purposes, the
+ /// client should specify the extra packets in packets_for_client instead of
+ /// packet_count_for_server, but packet_count_for_server must still be >=
+ /// packet_count_for_server_min.
6: uint32 packet_count_for_server_min;
- // This must be at least packet_count_for_server_min and at most
- // packet_count_for_server_recommended_max.
- //
- // This value is likely to be used as-is by most clients, so if having one
- // additional packet is a big performance win in a large percentage of
- // scenarios, it can be good for the server to include that additional
- // packet in this value.
+ /// This must be at least packet_count_for_server_min and at most
+ /// packet_count_for_server_recommended_max.
+ ///
+ /// This value is likely to be used as-is by most clients, so if having one
+ /// additional packet is a big performance win in a large percentage of
+ /// scenarios, it can be good for the server to include that additional
+ /// packet in this value.
7: uint32 packet_count_for_server_recommended;
- // This can be the same as packet_count_for_server_max or can be lower.
- // Values above this value and <= packet_count_for_server_max are not
- // recommended by the stream processor, but should still work given
- // sufficient resources available to both the client and the stream
- // processor.
+ /// This can be the same as packet_count_for_server_max or can be lower.
+ /// Values above this value and <= packet_count_for_server_max are not
+ /// recommended by the stream processor, but should still work given
+ /// sufficient resources available to both the client and the stream
+ /// processor.
8: uint32 packet_count_for_server_recommended_max;
- // This can be 0xFFFFFFFF if there's no stream processor-enforced max, but
- // stream processors are encouraged to set a large but still
- // plausibly-workable max, and clients are encouraged to request a number
- // of packets that isn't excessively large for the client's scenario.
+ /// This can be 0xFFFFFFFF if there's no stream processor-enforced max, but
+ /// stream processors are encouraged to set a large but still
+ /// plausibly-workable max, and clients are encouraged to request a number
+ /// of packets that isn't excessively large for the client's scenario.
9: uint32 packet_count_for_server_max;
- // Normally this would be an implicit 0, but for now we have a min so we can
- // force the total number of packets to be a specific number that we know
- // works for the moment.
+ /// Normally this would be an implicit 0, but for now we have a min so we can
+ /// force the total number of packets to be a specific number that we know
+ /// works for the moment.
10: uint32 packet_count_for_client_min;
- // packet_count_for_client_max
- //
- // The client must set packet_count_for_client to be <=
- // packet_count_for_client_max.
- //
- // This value must be at least 1. This can be 0xFFFFFFFF if there's no
- // stream-processor-enforced max. Clients are encouraged to request a
- // number of packets that isn't excessively large for the client's
- // scenario.
+ /// The client must set packet_count_for_client to be <=
+ /// packet_count_for_client_max.
+ ///
+ /// This value must be at least 1. This can be 0xFFFFFFFF if there's no
+ /// stream-processor-enforced max. Clients are encouraged to request a
+ /// number of packets that isn't excessively large for the client's
+ /// scenario.
11: uint32 packet_count_for_client_max;
- // single_buffer_mode_allowed false allows a stream processor that's not
- // required to support single-buffer mode for a given input or output the
- // ability to decline to support single-buffer mode on that input/output.
- //
- // All encoder output, regardless of audio or video: server support for
- // single-buffer mode is optional. Please see stream_processor.md for all
- // the rules regarding single-buffer mode on output before using
- // single-buffer mode on an output.
- //
- // Audio decoder output: server support for single-buffer mode is required.
- //
- // Video decoder output: There is little reason for a video decoder to
- // support single-buffer mode on output. Nearly all video decoders will set
- // this to false for their output.
- //
- // All decoder inputs: Servers must support single-buffer mode on input.
- // The client is responsible for managing the input buffer space such that
- // filling an input packet doesn't over-write any portion of an input
- // packet already in flight to the stream processor.
- //
- // Encoder inputs: Server support for single-buffer mode on encoder input is
- // optional. This is more often useful for audio than for video.
- //
- // Support for buffer-per-packet mode is always required on both input and
- // output, regardless of stream processor type.
+ /// `single_buffer_mode_allowed` false allows a stream processor that's not
+ /// required to support single-buffer mode for a given input or output the
+ /// ability to decline to support single-buffer mode on that input/output.
+ ///
+ /// All encoder output, regardless of audio or video: server support for
+ /// single-buffer mode is optional.
+ ///
+ /// Audio decoder output: server support for single-buffer mode is required.
+ ///
+ /// Video decoder output: There is little reason for a video decoder to
+ /// support single-buffer mode on output. Nearly all video decoders will set
+ /// this to false for their output.
+ ///
+ /// All decoder inputs: Servers must support single-buffer mode on input.
+ /// The client is responsible for managing the input buffer space such that
+ /// filling an input packet doesn't over-write any portion of an input
+ /// packet already in flight to the stream processor.
+ ///
+ /// Encoder inputs: Server support for single-buffer mode on encoder input is
+ /// optional. This is more often useful for audio than for video.
+ ///
+ /// Support for buffer-per-packet mode is always required on both input and
+ /// output, regardless of stream processor type.
12: bool single_buffer_mode_allowed;
- // If true, the buffers need to be physically contiguous pages, such as can
- // be allocated using zx_vmo_create_contiguous() (this syscall requires a
- // bti handle which many clients won't have - the client will most likely
- // want to use sysmem to allocate buffers).
+ /// If true, the buffers need to be physically contiguous pages, such as those
+ /// allocated using zx_vmo_create_contiguous().
13: bool is_physically_contiguous_required;
- // VERY TEMPORARY HACK / KLUDGE - we want the BufferAllocator (or one of
- // the participant drivers that needs physically contiguous buffers) to
- // call zx_vmo_create_contiguous(), definitely not the StreamProcessor
- // client, but until the BufferAllocator can be reached from a driver, this
- // is to grant the client special powers it really shouldn't have, very
- // temporarily until BufferAllocator is hooked up properly at which point
- // this can be removed. Strictly speaking we could reverse which end
- // allocates buffers in the StreamProcessor interface to avoid this hack
- // even before BufferAllocator, but the overall path seems shorter if we
- // jump directly from this to using BufferAllocator.
- //
+ /// VERY TEMPORARY HACK / KLUDGE - we want the BufferAllocator (or one of
+ /// the participant drivers that needs physically contiguous buffers) to
+ /// call zx_vmo_create_contiguous(), definitely not the StreamProcessor
+ /// client, but until the BufferAllocator can be reached from a driver, this
+ /// is to grant the client special powers it really shouldn't have, very
+ /// temporarily until BufferAllocator is hooked up properly at which point
+ /// this can be removed. Strictly speaking we could reverse which end
+ /// allocates buffers in the StreamProcessor interface to avoid this hack
+ /// even before BufferAllocator, but the overall path seems shorter if we
+ /// jump directly from this to using BufferAllocator.
+ ///
// TODO(dustingreen): remove once zero clients need this (zero clients that
// need to allocate physically contiguous buffers directly / all relevant
// clients using sysmem).
14: handle very_temp_kludge_bti_handle;
};
-// StreamOutputConstraints
+/// The stream-processor-controlled output configuration, including both
+/// StreamBufferConstraints for the output and FormatDetails for the output.
//
-// The stream-processor-controlled output configuration, including both
-// StreamBufferConstraints for the output and FormatDetails for the output.
-//
-
// TODO(dustingreen): Need a better name for this struct, but still short
// hopefully. It's stuff the stream processor gets to control, not the client.
// It's different than output buffer settings, which the client does get to
// control to some extent. It's different than any configurable output
// settings the client might specify for output of an encoder.
table StreamOutputConstraints {
- // A client which always immediately re-configures output buffers on
- // receipt of OnOutputConstraints() with buffer_constraints_action_required
- // true can safely ignore this field.
-
- // A client is permitted to ignore an OnOutputConstraints() message even with
- // buffer_constraints_action_required true if the client knows the server
- // has already been told to discard the remainder of the stream with the
- // same stream_lifetime_ordinal or if this stream_lifetime_ordinal field is
- // set to 0. The server is required to re-send needed output config via
- // OnOutputConstraints() with new stream_lifetime_ordinal and
- // buffer_constraints_action_required true, if the most recent completed
- // server-side output config isn't what the server wants/needs yet for the
- // new stream.
+ /// A client which always immediately re-configures output buffers on
+ /// receipt of OnOutputConstraints() with buffer_constraints_action_required
+ /// true can safely ignore this field.
+ ///
+ /// A client is permitted to ignore an OnOutputConstraints() message even with
+ /// buffer_constraints_action_required true if the client knows the server
+ /// has already been told to discard the remainder of the stream with the
+ /// same stream_lifetime_ordinal or if this stream_lifetime_ordinal field is
+ /// set to 0. The server is required to re-send needed output config via
+ /// OnOutputConstraints() with new stream_lifetime_ordinal and
+ /// buffer_constraints_action_required true, if the most recent completed
+ /// server-side output config isn't what the server wants/needs yet for the
+ /// new stream.
1: uint64 stream_lifetime_ordinal;
- // buffer_constraints_action_required
- //
- // When the buffer constraints are delivered, they indicate whether action
- // is required. A false value here permits delivery of constraints which
- // are fresher without forcing a buffer reconfiguration. If this is false,
- // a client cannot assume that it's safe to immediately re-configure output
- // buffers. If this is true, the client can assume it's safe to
- // immediately configure output buffers once.
- //
- // A client is permitted to ignore buffer constraint versions which have
- // buffer_constraints_action_required false. The server is not permitted
- // to change buffer_constraints_action_required from false to true for the
- // same buffer_constraints_version_ordinal.
- //
- // For each configuration, a client must use new buffers, never buffers
- // that were previously used for anything else, and never buffers
- // previously used for any other StreamProcessor purposes. This rule
- // exists for multiple good reasons, relevant to both mid-stream changes,
- // and changes on stream boundaries. A client should just use new buffers
- // each time.
- //
- // When this is true, the server has already de-refed as many low-level
- // output buffers as the server can while still performing efficient
- // transition to the new buffers and will de-ref the rest asap. A Sync()
- // is not necessary to achieve non-overlap of resource usage to the extent
- // efficiently permitted by the formats involved.
- //
- // If buffer_constraints_action_required is true, the server _must_ not
- // deliver more output data until after output buffers have been configured
- // (or re-configured) by the client.
- //
- // See stream_processor.md for more on buffer_constraints_action_required.
+ /// When the buffer constraints are delivered, they indicate whether action
+ /// is required. A false value here permits delivery of constraints which
+ /// are fresher without forcing a buffer reconfiguration. If this is false,
+ /// a client cannot assume that it's safe to immediately re-configure output
+ /// buffers. If this is true, the client can assume it's safe to
+ /// immediately configure output buffers once.
+ ///
+ /// A client is permitted to ignore buffer constraint versions which have
+ /// buffer_constraints_action_required false. The server is not permitted
+ /// to change buffer_constraints_action_required from false to true for the
+ /// same buffer_constraints_version_ordinal.
+ ///
+ /// For each configuration, a client must use new buffers, never buffers
+ /// that were previously used for anything else, and never buffers
+ /// previously used for any other StreamProcessor purposes. This rule
+ /// exists for multiple good reasons, relevant to both mid-stream changes,
+ /// and changes on stream boundaries. A client should just use new buffers
+ /// each time.
+ ///
+ /// When this is true, the server has already de-refed as many low-level
+ /// output buffers as the server can while still performing efficient
+ /// transition to the new buffers and will de-ref the rest asap. A Sync()
+ /// is not necessary to achieve non-overlap of resource usage to the extent
+ /// efficiently permitted by the formats involved.
+ ///
+ /// If buffer_constraints_action_required is true, the server _must_ not
+ /// deliver more output data until after output buffers have been configured
+ /// (or re-configured) by the client.
2: bool buffer_constraints_action_required;
3: StreamBufferConstraints buffer_constraints;
};
table StreamOutputFormat {
- // A client is permitted to ignore an OnOutputFormat() message even with
- // buffer_constraints_action_required true if the client knows the server
- // has already been told to discard the remainder of the stream with the
- // same stream_lifetime_ordinal or if this stream_lifetime_ordinal field is
- // set to 0. The server is required to re-send needed output config via
- // OnOutputConstraints() with new stream_lifetime_ordinal and
- // buffer_constraints_action_required true, if the most recent completed
- // server-side output config isn't what the server wants/needs yet for the
- // new stream.
- //
- // The server is required to send an OnOutputFormat() before the first
- // output packet of a stream.
+ /// A client is permitted to ignore an OnOutputFormat() message even with
+ /// buffer_constraints_action_required true if the client knows the server
+ /// has already been told to discard the remainder of the stream with the
+ /// same stream_lifetime_ordinal or if this stream_lifetime_ordinal field is
+ /// set to 0. The server is required to re-send needed output config via
+ /// OnOutputConstraints() with new stream_lifetime_ordinal and
+ /// buffer_constraints_action_required true, if the most recent completed
+ /// server-side output config isn't what the server wants/needs yet for the
+ /// new stream.
+ ///
+ /// The server is required to send an OnOutputFormat() before the first
+ /// output packet of a stream.
1: uint64 stream_lifetime_ordinal;
- // format_details
- //
- // It's up to the client to determine if a change in
- // format_details.format_details_version_ordinal implies any client action
- // is required, based on particular fields in format_details vs. any old
- // value. The server guarantees that if the format has changed, then
- // format_details.format_details_version_ordinal will change, but a change
- // to format_details.format_details_version_ordinal does not guarantee that
- // the format details actually changed. Servers are strongly encouraged to
- // not change format_details.format_details_version_ordinal other than
- // before the first output data of a stream unless there is a real
- // mid-stream format change in the stream. Unnecessary mid-stream format
- // changes can cause simpler clients that have no need to handle mid-stream
- // format changes to just close the channel. Format changes before the
- // first output data of a stream are not "mid-stream" in this context -
- // those can be useful for stream format detection / setup reasons.
- //
- // Note that in case output buffers don't really need to be re-configured
- // despite a format change, a server is encouraged, but not required, to
- // set buffer_constraints_action_required false on the message that conveys
- // the new format details. Simpler servers may just treat the whole output
- // situation as one big thing and demand output buffer reconfiguration on
- // any change in the output situation.
- //
- // A client may or may not actually handle a new buffer_constraints with
- // buffer_constraints_action_required false, but the client should always
- // track the latest format_details.
- //
- // An updated format_details is ordered with respect to emitted output
- // packets, and applies to all subsequent packets until the next
- // format_details with larger version_ordinal. A simple client that does
- // not intend to handle mid-stream format changes should still keep track
- // of the most recently received format_details until the first output
- // packet arrives, then lock down the format details, handle those format
- // details, and verify that any
- // format_details.format_details_version_ordinal received from the server
- // is the same as the locked-down format_details, until the client is done
- // with the stream. Even such a simple client must tolerate
- // format_details.format_details_version_ordinal changing multiple times
- // before the start of data output from a stream (any stream - the first
- // stream or a subsequent stream). This allows a stream processor to
- // request that output buffers and output format be configured
- // speculatively, and for the output config to be optionally adjusted by
- // the server before the first data output from a stream after the server
- // knows everything it needs to know to fully establish the initial output
- // format details. This simplifies stream processor server implementation,
- // and allows a clever stream processor server to guess it's output config
- // for lower latency before any input data, while still being able to fix
- // the output config (including format details) if the guess turns out to
- // be wrong.
- //
- // Whether the format_details.format_details_version_ordinal will actually
- // change mid-stream is a per-stream-processor and per-stream detail that
- // is not specified in comments here, and in most cases also depends on
- // whether the format changes on the input to the stream processor.
- // Probably it'll be fairly common for a client to use a format which
- // technically supports mid-stream format change, but the client happens to
- // know that none of the streams the client intends to process will ever
- // have a mid-stream format change.
+ /// If format_details.format_details_version_ordinal changes, the client
+ /// should inspect the new format details and determine if it must adjust to
+ /// the new format. The server guarantees that if the format has changed, then
+ /// format_details.format_details_version_ordinal will change, but a change
+ /// to format_details.format_details_version_ordinal does not guarantee that
+ /// the format details actually changed. Servers are strongly encouraged to
+ /// not change format_details.format_details_version_ordinal other than
+ /// before the first output data of a stream unless there is a real
+ /// mid-stream format change in the stream. Unnecessary mid-stream format
+ /// changes can cause simpler clients that have no need to handle mid-stream
+ /// format changes to just close the channel. Format changes before the
+ /// first output data of a stream are not "mid-stream" in this context -
+ /// those can be useful for stream format detection / setup reasons.
+ ///
+ /// Note that in case output buffers don't really need to be re-configured
+ /// despite a format change, a server is encouraged, but not required, to
+ /// set buffer_constraints_action_required false on the message that conveys
+ /// the new format details. Simpler servers may just treat the whole output
+ /// situation as one big thing and demand output buffer reconfiguration on
+ /// any change in the output situation.
+ ///
+ /// A client may or may not actually handle a new buffer_constraints with
+ /// buffer_constraints_action_required false, but the client should always
+ /// track the latest format_details.
+ ///
+ /// An updated format_details is ordered with respect to emitted output
+ /// packets, and applies to all subsequent packets until the next
+ /// format_details with larger version_ordinal. A simple client that does
+ /// not intend to handle mid-stream format changes should still keep track
+ /// of the most recently received format_details until the first output
+ /// packet arrives, then lock down the format details, handle those format
+ /// details, and verify that any
+ /// format_details.format_details_version_ordinal received from the server
+ /// is the same as the locked-down format_details, until the client is done
+ /// with the stream. Even such a simple client must tolerate
+ /// format_details.format_details_version_ordinal changing multiple times
+ /// before the start of data output from a stream (any stream - the first
+ /// stream or a subsequent stream). This allows a stream processor to
+ /// request that output buffers and output format be configured
+ /// speculatively, and for the output config to be optionally adjusted by
+ /// the server before the first data output from a stream after the server
+ /// knows everything it needs to know to fully establish the initial output
+ /// format details. This simplifies stream processor server implementation,
+ /// and allows a clever stream processor server to guess it's output config
+ /// for lower latency before any input data, while still being able to fix
+ /// the output config (including format details) if the guess turns out to
+ /// be wrong.
+ ///
+ /// Whether the format_details.format_details_version_ordinal will actually
+ /// change mid-stream is a per-stream-processor and per-stream detail that
+ /// is not specified in comments here, and in most cases also depends on
+ /// whether the format changes on the input to the stream processor.
+ /// Probably it'll be fairly common for a client to use a format which
+ /// technically supports mid-stream format change, but the client happens to
+ /// know that none of the streams the client intends to process will ever
+ /// have a mid-stream format change.
2: FormatDetails format_details;
};
-// DEPRECATED - this is splitting into StreamOutputConstraints and
-// StreamOutputFormat instead. See those tables.
+[Deprecated = "Use StreamOutputFormat instead."]
table StreamOutputConfig {
1: uint64 stream_lifetime_ordinal;
2: bool buffer_constraints_action_required;
@@ -417,252 +349,223 @@
4: FormatDetails format_details;
};
-// Default values for input and output
-// StreamBufferConstraints.default_settings.packet_count_for_server.
-//
-// These are defined as "const" in FIDL to avoid all server implementations
-// needing to separately define their own values, and these should be
-// reasonable as default values, but strictly speaking this is not intended to
-// promise that this value won't change from build to build. If a client cares
-// about a specific number, the client should separately define what that
-// number is and ensure that StreamBufferSettings.packet_count_for_client is
-// at least large enough.
-//
-// In contrast to packet_count_for_client, the packet_count_for_server is much
-// more stream-processor-specific, so this file has no numbers for that - each
-// stream processor will set those as appropriate for the specific stream
-// processor.
-//
-// These are not "recommended" values, only "default" values, in the sense that
-// the stream processor doesn't really know what the correct setting for these
-// values is for a given client, and if the default is not appropriate for a
-// client, large problems could result such as deadlock. See the comments on
-// packet_count_for_client.
-//
-// Despite these defaults, every client should ideally care about the
-// packet_count_for_client setting and should ensure that the setting is at
-// least large enough to cover the number of packets the client might ever need
-// to camp on for any non-transient duration concurrently. The defaults are
-// only intended to be plausible for some clients, not all clients.
-//
-// One for the client to be filling and one in transit.
+/// Default values for input and output
+/// StreamBufferConstraints.default_settings.packet_count_for_server.
+///
+/// These are defined as "const" in FIDL to avoid all server implementations
+/// needing to separately define their own values, and these should be
+/// reasonable as default values, but strictly speaking this is not intended to
+/// promise that this value won't change from build to build. If a client cares
+/// about a specific number, the client should separately define what that
+/// number is and ensure that StreamBufferSettings.packet_count_for_client is
+/// at least large enough.
+///
+/// In contrast to packet_count_for_client, the packet_count_for_server is much
+/// more stream-processor-specific, so this file has no numbers for that - each
+/// stream processor will set those as appropriate for the specific stream
+/// processor.
+///
+/// These are not "recommended" values, only "default" values, in the sense that
+/// the stream processor doesn't really know what the correct setting for these
+/// values is for a given client, and if the default is not appropriate for a
+/// client, large problems could result such as deadlock. See the comments on
+/// packet_count_for_client.
+///
+/// Despite these defaults, every client should ideally care about the
+/// packet_count_for_client setting and should ensure that the setting is at
+/// least large enough to cover the number of packets the client might ever need
+/// to camp on for any non-transient duration concurrently. The defaults are
+/// only intended to be plausible for some clients, not all clients.
+///
+/// One for the client to be filling and one in transit.
const uint32 kDefaultInputPacketCountForClient = 2;
-// One for the client to be rendering, and one in transit.
+/// One for the client to be rendering, and one in transit.
const uint32 kDefaultOutputPacketCountForClient = 2;
-// For input, this is the default on a fairly arbitrary basis.
+/// For input, this is the default on a fairly arbitrary basis.
//
// TODO(dustingreen): Do we want the default for audio encoding to be
-// single_buffer_mode true instead? If so, we may split this up by audio/video
+// `single_buffer_mode` true instead? If so, we may split this up by audio/video
// encoder/decoder.
const bool kDefaultInputIsSingleBufferMode = false;
const bool kDefaultOutputIsSingleBufferMode = false;
-// StreamBufferSettings
-//
-// See relevant corresponding constraints in StreamBufferConstraints. The
-// settings must satisfy the constraints.
-//
-
-// The client informs the stream processor of these settings and then
-// separately informs the stream processor of each buffer.
+/// See relevant corresponding constraints in StreamBufferConstraints. The
+/// settings must satisfy the constraints.
+///
+/// The client informs the stream processor of these settings and then
+/// separately informs the stream processor of each buffer.
+///
+/// The total packet count is split into two pieces to disambiguate how many
+/// packets are allocated for the client to hold onto for whatever reason,
+/// vs. how many packets are allocated for the server to hold onto for
+/// whatever reason.
+///
+/// Extra packets to provide slack for performance reasons can be in either
+/// category, but typically packet_count_for_server_recommended will already
+/// include any performance-relevant slack for the server's benefit.
table StreamBufferSettings {
- // buffer_lifetime_ordinal
- //
- // The containing message starts a new buffer_lifetime_ordinal.
- //
- // There is a separate buffer_lifetime_ordinal for input vs. output.
- //
- // Re-use of the same value is not allowed. Values must be odd. Values
- // must only increase (increasing by more than 2 is permitted).
- //
- // A buffer_lifetime_ordinal lifetime starts at SetInputBufferSettings() or
- // SetOutputBufferSettings(), and ends at the earlier of
- // CloseCurrentStream() with release_input_buffers/release_output_buffers
- // set or SetOutputBufferSettings() with new buffer_lifetime_ordinal in the
- // case of mid-stream output config change.
- //
- // See stream_processor.md for more on buffer_lifetime_ordinal.
+ /// The containing message starts a new buffer_lifetime_ordinal.
+ ///
+ /// There is a separate buffer_lifetime_ordinal for input vs. output.
+ ///
+ /// Re-use of the same value is not allowed. Values must be odd. Values
+ /// must only increase (increasing by more than 2 is permitted).
+ ///
+ /// A buffer_lifetime_ordinal lifetime starts at SetInputBufferSettings() or
+ /// SetOutputBufferSettings(), and ends at the earlier of
+ /// CloseCurrentStream() with release_input_buffers/release_output_buffers
+ /// set or SetOutputBufferSettings() with new buffer_lifetime_ordinal in the
+ /// case of mid-stream output config change.
1: uint64 buffer_lifetime_ordinal;
- // buffer_constraints_version_ordinal
- //
- // This value indicates which version of constraints the client is/was aware
- // of so far.
- //
- // For input, this must always be 0 because constraints don't change for
- // input (settings can change, but there's no settings vs current
- // constraints synchronization issue on input).
- //
- // For output, this allows the server to know when the client is
- // sufficiently caught up before the server will generate any more output.
- //
- // When there is no active stream, a client is permitted to re-configure
- // buffers again using the same buffer_constraints_version_ordinal.
- //
- // See stream_processor.md for more on buffer_constraints_version_ordinal.
+ /// This value indicates which version of constraints the client is/was aware
+ /// of so far.
+ ///
+ /// For input, this must always be 0 because constraints don't change for
+ /// input (settings can change, but there's no settings vs current
+ /// constraints synchronization issue on input).
+ ///
+ /// For output, this allows the server to know when the client is
+ /// sufficiently caught up before the server will generate any more output.
+ ///
+ /// When there is no active stream, a client is permitted to re-configure
+ /// buffers again using the same buffer_constraints_version_ordinal.
2: uint64 buffer_constraints_version_ordinal;
- // The total packet count is split into two pieces to disambiguate how many
- // packets are allocated for the client to hold onto for whatever reason,
- // vs. how many packets are allocated for the server to hold onto for
- // whatever reason.
- //
- // Extra packets to provide slack for performance reasons can be in either
- // category, but typically packet_count_for_server_recommended will already
- // include any performance-relevant slack for the server's benefit.
-
- // packet_count_for_server
- //
- // How many packets the client is allocating for the stream processor
- // server's use. This must be >=
- // StreamBufferConstraints.packet_count_for_server_min. If constraints
- // change such that this would no longer be true, the server will send an
- // OnOutputConstraints() event.
- //
- // The stream processor server is allowed to demand that all of
- // packet_count_for_server become free before making further progress, even
- // if packet_count_for_server is > packet_count_for_server_min.
- //
- // A reasonable value for this is
- // StreamBufferConstraints.packet_count_for_server_recommended.
- //
- // See stream_processor.md for more on packet_count_for_server.
+ /// How many packets the client is allocating for the stream processor
+ /// server's use. This must be >=
+ /// StreamBufferConstraints.packet_count_for_server_min. If constraints
+ /// change such that this would no longer be true, the server will send an
+ /// OnOutputConstraints() event.
+ ///
+ /// The stream processor server is allowed to demand that all of
+ /// packet_count_for_server become free before making further progress, even
+ /// if packet_count_for_server is > packet_count_for_server_min.
+ ///
+ /// A reasonable value for this is
+ /// StreamBufferConstraints.packet_count_for_server_recommended.
3: uint32 packet_count_for_server;
- // packet_count_for_client
- //
- // This must be at least 1. The server will close the channel if this is 0.
- //
- // How many packets the client is allocating for the client's use. The
- // client may hold onto this many packets for arbitrarily-long duration
- // without handing these packets to the stream processor, and despite doing
- // so, the stream processor will continue to make progress and function
- // normally without getting stuck. The client holding onto additional
- // packets transiently is ok, but the client needs to hand those additional
- // packets back to the stream processor eventually if the client wants the
- // stream processor to make further progress.
- //
- // In addition to this value needing to include at least as many packets as
- // the client ever intends to concurrently camp on indefinitely, any extra
- // slack to benefit client-side performance should also be included here.
- //
- // A typical value for this could be at least 2, but it depends strongly on
- // client implementation and overall client buffering goals. It is up to
- // the client to determine how many packets are needed in this category by
- // any parts of the overall system that will be holding onto packets for
- // any reason. Those parts of the system should have a documented and
- // possibly queryable defined value to help determine this number. Setting
- // this value lower than it actually needs to be can result in the stream
- // processor not making progress as it sits waiting for packets, with the
- // client unable to recycle any more packets to the stream processor. That
- // situation can be difficult to diagnose, while excessively-large values
- // here are wasteful, so care is warranted to set this value properly.
+ /// This must be at least 1. The server will close the channel if this is 0.
+ ///
+ /// How many packets the client is allocating for the client's use. The
+ /// client may hold onto this many packets for arbitrarily-long duration
+ /// without handing these packets to the stream processor, and despite doing
+ /// so, the stream processor will continue to make progress and function
+ /// normally without getting stuck. The client holding onto additional
+ /// packets transiently is ok, but the client needs to hand those additional
+ /// packets back to the stream processor eventually if the client wants the
+ /// stream processor to make further progress.
+ ///
+ /// In addition to this value needing to include at least as many packets as
+ /// the client ever intends to concurrently camp on indefinitely, any extra
+ /// slack to benefit client-side performance should also be included here.
+ ///
+ /// A typical value for this could be at least 2, but it depends strongly on
+ /// client implementation and overall client buffering goals. It is up to
+ /// the client to determine how many packets are needed in this category by
+ /// any parts of the overall system that will be holding onto packets for
+ /// any reason. Those parts of the system should have a documented and
+ /// possibly queryable defined value to help determine this number. Setting
+ /// this value lower than it actually needs to be can result in the stream
+ /// processor not making progress as it sits waiting for packets, with the
+ /// client unable to recycle any more packets to the stream processor. That
+ /// situation can be difficult to diagnose, while excessively-large values
+ /// here are wasteful, so care is warranted to set this value properly.
4: uint32 packet_count_for_client;
- // per_packet_buffer_bytes
- //
- // In buffer-per-packet mode, we require that each buffer have usable bytes
- // equal to per_packet_buffer_bytes. Use of differently-sized low-level
- // buffers is possible, but the size of the portion used via the
- // StreamProcessor interface per StreamBuffer must be the same for all the
- // buffers.
- //
- // In single-buffer mode, we require the portion of the low-level buffer
- // used via the StreamProcessor interface to be size
- // (packet_count_for_server + packet_count_for_client) *
- // per_packet_buffer_bytes.
+ /// In buffer-per-packet mode, we require that each buffer have usable bytes
+ /// equal to per_packet_buffer_bytes. Use of differently-sized low-level
+ /// buffers is possible, but the size of the portion used via the
+ /// StreamProcessor interface per StreamBuffer must be the same for all the
+ /// buffers.
+ ///
+ /// In single-buffer mode, we require the portion of the low-level buffer
+ /// used via the StreamProcessor interface to be size
+ /// (packet_count_for_server + packet_count_for_client) *
+ /// per_packet_buffer_bytes.
//
// TODO(dustingreen): determine if we need to relax these restrictions a bit
// for convenience when using gralloc video buffers.
5: uint32 per_packet_buffer_bytes;
- // If true there is only one buffer, with index 0, which all packets
- // must explicitly refer to with buffer_index == 0.
- //
- // While it's possible to set up single_buffer_mode false with each buffer
- // referring to the same underlying VMO, single_buffer_mode true is more
- // efficient for that case since only one mapping is created.
+ /// If true there is only one buffer, with index 0, which all packets
+ /// must explicitly refer to with buffer_index == 0.
+ ///
+ /// While it's possible to set up `single_buffer_mode` false with each buffer
+ /// referring to the same underlying VMO, `single_buffer_mode` true is more
+ /// efficient for that case since only one mapping is created.
6: bool single_buffer_mode;
};
-// StreamBufferPartialSettings
-//
-// This struct is used instead of StreamBufferSettings when sysmem is used to
-// allocate buffers. The settings in StreamBufferSettings that are missing from
-// StreamBufferPartialSettings can be conveyed from the client directly to
-// sysmem.
+/// This struct is used instead of StreamBufferSettings when sysmem is used to
+/// allocate buffers. The settings in StreamBufferSettings that are missing from
+/// StreamBufferPartialSettings can be conveyed from the client directly to
+/// sysmem.
//
// TODO(dustingreen): Consider renaming this to StreamBufferSettings once that's
// an option.
table StreamBufferPartialSettings {
- // buffer_lifetime_ordinal
- //
- // The containing message starts a new buffer_lifetime_ordinal.
- //
- // There is a separate buffer_lifetime_ordinal for input vs. output.
- //
- // Re-use of the same value is not allowed. Values must be odd. Values
- // must only increase (increasing by more than 2 is permitted).
- //
- // A buffer_lifetime_ordinal lifetime starts at SetInputBufferSettings() or
- // SetOutputBufferSettings(), and ends at the earlier of
- // CloseCurrentStream() with release_input_buffers/release_output_buffers
- // set or SetOutputBufferSettings() with new buffer_lifetime_ordinal in the
- // case of mid-stream output config change.
- //
- // See stream_processor.md for more on buffer_lifetime_ordinal.
+ /// The containing message starts a new buffer_lifetime_ordinal.
+ ///
+ /// There is a separate buffer_lifetime_ordinal for input vs. output.
+ ///
+ /// Re-use of the same value is not allowed. Values must be odd. Values
+ /// must only increase (increasing by more than 2 is permitted).
+ ///
+ /// A buffer_lifetime_ordinal lifetime starts at SetInputBufferSettings() or
+ /// SetOutputBufferSettings(), and ends at the earlier of
+ /// CloseCurrentStream() with release_input_buffers/release_output_buffers
+ /// set or SetOutputBufferSettings() with new buffer_lifetime_ordinal in the
+ /// case of mid-stream output config change.
1: uint64 buffer_lifetime_ordinal;
- // buffer_constraints_version_ordinal
- //
- // This value indicates which version of constraints the client is/was aware
- // of so far.
- //
- // For input, this must always be 0 because constraints don't change for
- // input (settings can change, but there's no settings vs current
- // constraints synchronization issue on input).
- //
- // For output, this allows the server to know when the client is
- // sufficiently caught up before the server will generate any more output.
- //
- // When there is no active stream, a client is permitted to re-configure
- // buffers again using the same buffer_constraints_version_ordinal.
- //
- // See stream_processor.md for more on buffer_constraints_version_ordinal.
+ /// This value indicates which version of constraints the client is/was aware
+ /// of so far.
+ ///
+ /// For input, this must always be 0 because constraints don't change for
+ /// input (settings can change, but there's no settings vs current
+ /// constraints synchronization issue on input).
+ ///
+ /// For output, this allows the server to know when the client is
+ /// sufficiently caught up before the server will generate any more output.
+ ///
+ /// When there is no active stream, a client is permitted to re-configure
+ /// buffers again using the same buffer_constraints_version_ordinal.
2: uint64 buffer_constraints_version_ordinal;
- // If true, there is only one buffer, but still typically more than one
- // packet. If false, the # of packets == the number of buffers.
- //
- // While it's possible to set up single_buffer_mode false with each buffer
- // referring to the same underlying VMO, single_buffer_mode true is more
- // efficient for that case since only one mapping is created.
- //
- // This setting is specified by the client, and influences the constraints
- // delivered from the StreamProcessor to sysmem (whether there's more than
- // one buffer allocated overall or not). For single_buffer_mode true, the
- // StreamProcessor is the one to ask sysmem for a buffer - the client should
- // refrain from doing so or the StreamProcessor will just fail when more
- // than one buffer gets allocated by sysmem.
+ /// If true, there is only one buffer, but still typically more than one
+ /// packet. If false, the # of packets == the number of buffers.
+ ///
+ /// While it's possible to set up `single_buffer_mode` false with each buffer
+ /// referring to the same underlying VMO, `single_buffer_mode` true is more
+ /// efficient for that case since only one mapping is created.
+ ///
+ /// This setting is specified by the client, and influences the constraints
+ /// delivered from the StreamProcessor to sysmem (whether there's more than
+ /// one buffer allocated overall or not). For `single_buffer_mode` true, the
+ /// StreamProcessor is the one to ask sysmem for a buffer - the client should
+ /// refrain from doing so or the StreamProcessor will just fail when more
+ /// than one buffer gets allocated by sysmem.
3: bool single_buffer_mode;
- /// When single_buffer_mode is false:
+ /// When `single_buffer_mode` is false:
///
/// The actual packet count will be
/// max(packet_count_for_server + packet_count_for_client, sysmem_buffers).
/// The sysmem_buffers is BufferCollectionInfo.buffer_count from sysmem if
/// using sysmem, or 0 if not using sysmem.
///
- /// When single_buffer_mode is true:
+ /// When `single_buffer_mode` is true:
///
/// The actual packet count is packet_count_for_server +
/// packet_count_for_client.
///
- /// If not using sysmem, or if using single_buffer_mode, these fields must be
+ /// If not using sysmem, or if using `single_buffer_mode`, these fields must be
/// set and consistent with correpsonding fields in StreamBufferConstraints.
///
- /// If single_buffer_mode false and using sysmem, these fields can both be
+ /// If `single_buffer_mode` false and using sysmem, these fields can both be
/// non-set, or can both be set and consistent with correpsonding fields in
/// StreamBufferConstraints. If not set, the value used for the fields in
/// the "max" expression above is 0, so buffer_count.
@@ -672,67 +575,58 @@
// TODO(FIDL-609): Default to 0.
5: uint32 packet_count_for_client;
- // The client end of a BufferCollectionToken channel, which the
- // StreamProcessor will use to deliver constraints to sysmem and learn of
- // buffers allocated by sysmem.
- //
- // The client guarantees that the token is already known to sysmem (via
- // BufferCollectionToken.Sync(), BufferCollection.Sync(), or
- // BufferCollectionEvents.OnDuplicatedTokensKnownByServer()).
+ /// The client end of a BufferCollectionToken channel, which the
+ /// StreamProcessor will use to deliver constraints to sysmem and learn of
+ /// buffers allocated by sysmem.
+ ///
+ /// The client guarantees that the token is already known to sysmem (via
+ /// BufferCollectionToken.Sync(), BufferCollection.Sync(), or
+ /// BufferCollectionEvents.OnDuplicatedTokensKnownByServer()).
6: fuchsia.sysmem.BufferCollectionToken sysmem_token;
};
-// StreamBuffer
-//
-// The StreamBuffer struct represents a pre-configured buffer.
-//
-// Both input and output uses StreamBuffer(s), but the two sets of buffers are
-// separate.
-//
-// The client uses SetInputBufferSettings() + AddInputBuffer() * N to inform
-// the stream processor about all the input buffers.
-//
-// The client uses SetOutputBufferSettings() + AddOutputBuffer() * N to inform
-// the stream processor about all the output buffers.
-//
-
-// When single_buffer_mode is true, there is only buffer_index 0 shared by all
-// packet(s) of the relevant input or output.
+/// The StreamBuffer struct represents a pre-configured buffer.
+///
+/// Both input and output uses StreamBuffer(s), but the two sets of buffers are
+/// separate.
+///
+/// The client uses SetInputBufferSettings() + AddInputBuffer() * N to inform
+/// the stream processor about all the input buffers.
+///
+/// The client uses SetOutputBufferSettings() + AddOutputBuffer() * N to inform
+/// the stream processor about all the output buffers.
+///
+/// When `single_buffer_mode` is true, there is only buffer_index 0 shared by all
+/// packet(s) of the relevant input or output.
table StreamBuffer {
- // When using AddOutputBuffer()/AddInputBuffer(), this must match the
- // buffer_lifetime_ordinal of the most recent
- // SetOutputBufferSettings()/SetInputBufferSettings().
+ /// When using AddOutputBuffer()/AddInputBuffer(), this must match the
+ /// buffer_lifetime_ordinal of the most recent
+ /// SetOutputBufferSettings()/SetInputBufferSettings().
1: uint64 buffer_lifetime_ordinal;
- // Buffers must be added via AddOutputBuffer() / AddInputBuffer() in order
- // by buffer_index. The buffer_index is always equal to 0 if
- // single_buffer_mode is true.
+ /// Buffers must be added via AddOutputBuffer() / AddInputBuffer() in order
+ /// by buffer_index. The buffer_index is always equal to 0 if
+ /// `single_buffer_mode` is true.
2: uint32 buffer_index;
- // For each new buffer_lifetime_ordinal, a client must use new low-level
- // buffers. This rule exists for multiple very good reasons, and is
- // relevant to mid-stream changes, changes on stream boundaries, and both
- // input and output buffers. A new buffer_lifetime_ordinal needs new
- // low-level buffers, not just new StreamBuffer(s). If you find yourself
- // copying compressed input data into new low-level input buffers solely
- // due to this rule, consider asking the source of the data for the ability
- // to directly fill new VMOs. The rule exists for good reasons, even for
- // input buffers.
- //
- // The previous paragraph does not prohibit carving up VMOs into sub-pieces
- // and using different sub-pieces as different StreamBuffer(s), with some
- // VMOs used for more than one StreamBuffer and possibly others used for
- // only one StreamBuffer. While this is permitted and enables some
- // optimizations, it's not expected to be particularly common.
- //
- // See stream_processor.md for more on StreamBufferData, and more on why we
- // never re-use the same low-level buffers for different
- // buffer_lifetime_ordinal(s).
+ /// For each new buffer_lifetime_ordinal, a client must use new low-level
+ /// buffers. This rule exists for multiple very good reasons, and is
+ /// relevant to mid-stream changes, changes on stream boundaries, and both
+ /// input and output buffers. A new buffer_lifetime_ordinal needs new
+ /// low-level buffers, not just new StreamBuffer(s). If you find yourself
+ /// copying compressed input data into new low-level input buffers solely
+ /// due to this rule, consider asking the source of the data for the ability
+ /// to directly fill new VMOs. The rule exists for good reasons, even for
+ /// input buffers.
+ ///
+ /// The previous paragraph does not prohibit carving up VMOs into sub-pieces
+ /// and using different sub-pieces as different StreamBuffer(s), with some
+ /// VMOs used for more than one StreamBuffer and possibly others used for
+ /// only one StreamBuffer. While this is permitted and enables some
+ /// optimizations, it's not expected to be particularly common.
3: StreamBufferData data;
};
-/// StreamBufferData
-///
/// For the moment, a VMO per buffer is the only type of buffer.
///
/// This is extremely likely to change significantly when adding gralloc stuff,
@@ -749,19 +643,19 @@
///
/// Details for a buffer backed by a VMO.
table StreamBufferDataVmo {
- // The same VMO can be used by more than one StreamBuffer (only of the same
- // buffer_lifetime_ordinal), but each vmo_handle must be a separate handle.
+ /// The same VMO can be used by more than one StreamBuffer (only of the same
+ /// buffer_lifetime_ordinal), but each vmo_handle must be a separate handle.
1: handle<vmo> vmo_handle;
- // Offset within the VMO of the first usable byte. Must be < the VMO's size
- // in bytes.
+ /// Offset within the VMO of the first usable byte. Must be < the VMO's size
+ /// in bytes.
2: uint64 vmo_usable_start;
- // VMO-relative offset that's one past the last usable byte. This can point
- // one byte beyond the end of the VMO if desired. In other words, this can
- // be equal to the VMO's size, to indicate that the last byte of the VMO is
- // usable (and possibly many byte before that, depending on
- // vmo_usable_start).
+ /// VMO-relative offset that's one past the last usable byte. This can point
+ /// one byte beyond the end of the VMO if desired. In other words, this can
+ /// be equal to the VMO's size, to indicate that the last byte of the VMO is
+ /// usable (and possibly many byte before that, depending on
+ /// vmo_usable_start).
3: uint64 vmo_usable_size;
};
@@ -773,61 +667,58 @@
///
/// A populated Packet also has a PacketHeader.
table PacketHeader {
- // This is which buffer configuration lifetime this header is referring to.
- //
- // A packet_index is only really meaningful with respect to a particular
- // buffer_lifetime_ordinal.
- //
- // See StreamBufferSettings.buffer_lifetime_ordinal.
- //
- // For QueueInputPacket(), a server receiving a buffer_lifetime_ordinal that
- // isn't the current input buffer_lifetime_ordinal will close the channel.
- //
- // For OnFreeInputPacket() and RecycleOutputPacket(), the receiver (client
- // or server) must ignore a message with stale buffer_lifetime_ordinal.
+ /// This is which buffer configuration lifetime this header is referring to.
+ ///
+ /// A packet_index is only really meaningful with respect to a particular
+ /// buffer_lifetime_ordinal.
+ ///
+ /// See StreamBufferSettings.buffer_lifetime_ordinal.
+ ///
+ /// For QueueInputPacket(), a server receiving a buffer_lifetime_ordinal that
+ /// isn't the current input buffer_lifetime_ordinal will close the channel.
+ ///
+ /// For OnFreeInputPacket() and RecycleOutputPacket(), the receiver (client
+ /// or server) must ignore a message with stale buffer_lifetime_ordinal.
1: uint64 buffer_lifetime_ordinal;
- // The overall set of packet_index values is densely packed from 0..count-1
- // for input and output separately. They can be queued in any order.
- //
- // Both the client and server should validate the packet_index against the
- // known bound and disconnect if it's out of bounds.
- //
- // When running in single-buffer mode, the buffer index is always 0.
- //
- // The packet_index values don't imply anything about order of use of
- // packets. The client should not expect the ordering to remain the same
- // over time - the stream processor is free to hold on to an input or
- // output packet for a while during which other packet_index values may be
- // used multiple times.
- //
- // For a given properly-functioning StreamProcessor instance, packet_index
- // values will be unique among concurrently-outstanding packets. Servers
- // should validate that a client isn't double-using a packet and clients
- // should validate as necessary to avoid undefined or unexpected client
- // behavior.
+ /// The overall set of packet_index values is densely packed from 0..count-1
+ /// for input and output separately. They can be queued in any order.
+ ///
+ /// Both the client and server should validate the packet_index against the
+ /// known bound and disconnect if it's out of bounds.
+ ///
+ /// When running in single-buffer mode, the buffer index is always 0.
+ ///
+ /// The packet_index values don't imply anything about order of use of
+ /// packets. The client should not expect the ordering to remain the same
+ /// over time - the stream processor is free to hold on to an input or
+ /// output packet for a while during which other packet_index values may be
+ /// used multiple times.
+ ///
+ /// For a given properly-functioning StreamProcessor instance, packet_index
+ /// values will be unique among concurrently-outstanding packets. Servers
+ /// should validate that a client isn't double-using a packet and clients
+ /// should validate as necessary to avoid undefined or unexpected client
+ /// behavior.
2: uint32 packet_index;
};
-// Packet
-//
-// A Packet represents a chunk of input or output data to or from a stream
-// processor.
-//
-// stream processor output:
-//
-// While the Packet is outstanding with the client via OnOutputPacket(), the
-// stream processor will avoid modifying the referenced output data. After the
-// client calls RecycleOutputPacket(packet_index), the stream processor is
-// notified that the client is again ok with the referenced data changing.
-//
-// stream processor input:
-//
-
-// The client initially has all packet_index(es) available to fill, and later
-// gets packet_index(s) that are again ready to fill via OnFreeInputPacket().
-// The client must not modify the referenced data in between QueueInputPacket()
-// and OnFreeInputPacket().
+/// A Packet represents a chunk of input or output data to or from a stream
+/// processor.
+///
+/// stream processor output:
+///
+/// While the Packet is outstanding with the client via OnOutputPacket(), the
+/// stream processor will avoid modifying the referenced output data. After the
+/// client calls RecycleOutputPacket(packet_index), the stream processor is
+/// notified that the client is again ok with the referenced data changing.
+///
+/// stream processor input:
+///
+/// The client initially has all packet_index(es) available to fill, and later
+/// gets packet_index(s) that are again ready to fill via OnFreeInputPacket().
+/// The client must not modify the referenced data in between QueueInputPacket()
+/// and OnFreeInputPacket().
table Packet {
1: PacketHeader header;
@@ -847,40 +738,34 @@
// TODO(FIDL-609): Default to 0x80000000.
2: uint32 buffer_index;
- // stream_lifetime_ordinal
- //
- // The value 1 is the lowest permitted value after stream processor
- // creation. Values sent by the client must be odd. Values must only
- // increase.
- //
- // A stream_lifetime_ordinal represents the lifetime of a stream. All
- // messages that are specific to a stream have the stream_lifetime_ordinal
- // value and the value is the same for all messages relating to a given
- // stream.
- //
- // See stream_processor.md for more on stream_lifetime_ordinal.
+ /// The value 1 is the lowest permitted value after stream processor
+ /// creation. Values sent by the client must be odd. Values must only
+ /// increase.
+ ///
+ /// A stream_lifetime_ordinal represents the lifetime of a stream. All
+ /// messages that are specific to a stream have the stream_lifetime_ordinal
+ /// value and the value is the same for all messages relating to a given
+ /// stream.
3: uint64 stream_lifetime_ordinal;
- // start_offset and valid_length_bytes
- //
- // Which part of the relevant buffer is this packet using. These are valid
- // for input data that's in-flight to the stream processor, and are valid
- // for output data from the stream processor.
- //
- // For compressed formats and uncompressed audio, the data in
- // [start_offset, start_offset + valid_length_bytes) is the contiguously
- // valid data referred to by this packet.
- //
- // For uncompressed video frames, FormatDetails is the primary means of
- // determining which bytes are relevant. The offsets in FormatDetails
- // are relative to the start_offset here. The valid_length_bytes must be
- // large enough to include the full last line of pixel data, including the
- // full line stride of the last line (not just the width in pixels of the
- // last line).
- //
- // Despite these being filled out, some uncompressed video buffers are of
- // types that are not readable by the CPU. These fields being here don't
- // imply there's any way for the CPU to read an uncompressed frame.
+ /// Which part of the relevant buffer is this packet using. These are valid
+ /// for input data that's in-flight to the stream processor, and are valid
+ /// for output data from the stream processor.
+ ///
+ /// For compressed formats and uncompressed audio, the data in
+ /// [start_offset, start_offset + valid_length_bytes) is the contiguously
+ /// valid data referred to by this packet.
+ ///
+ /// For uncompressed video frames, FormatDetails is the primary means of
+ /// determining which bytes are relevant. The offsets in FormatDetails
+ /// are relative to the start_offset here. The valid_length_bytes must be
+ /// large enough to include the full last line of pixel data, including the
+ /// full line stride of the last line (not just the width in pixels of the
+ /// last line).
+ ///
+ /// Despite these being filled out, some uncompressed video buffers are of
+ /// types that are not readable by the CPU. These fields being here don't
+ /// imply there's any way for the CPU to read an uncompressed frame.
//
// TODO(dustingreen): Do we have any reason to require that these be filled
// out for opaque uncompressed video frames that the CPU can't read? In
@@ -891,200 +776,221 @@
// specifying which bytes are actually relevant.
4: uint32 start_offset;
- // valid_length_bytes
- //
- // This must be > 0.
- //
- // The semantics for valid data per packet vary depending on data type as
- // follows.
- //
- // uncompressed video - A video frame can't be split across packets. Each
- // packet is one video frame.
- //
- // uncompressed audio - Regardless of float or int, linear or uLaw, or
- // number of channels, a packet must contain an non-negative number of
- // complete audio frames, where a single audio frame consists of data for
- // all the channels for the same single point in time. Any
- // stream-processor-specific internal details re. lower rate sampling for
- // LFE channel or the like should be hidden by the StreamProcessor server
- // implementation.
- //
- // compressed data input - A packet must contain at least one byte of data.
- // See also stream_input_bytes_min. Splitting AUs at arbitrary byte
- // boundaries is permitted, including at boundaries that are in AU headers.
- //
- // compressed data output - The stream processor is not required to fully
- // fill each output packet's buffer.
+ /// This must be > 0.
+ ///
+ /// The semantics for valid data per packet vary depending on data type as
+ /// follows.
+ ///
+ /// uncompressed video - A video frame can't be split across packets. Each
+ /// packet is one video frame.
+ ///
+ /// uncompressed audio - Regardless of float or int, linear or uLaw, or
+ /// number of channels, a packet must contain an non-negative number of
+ /// complete audio frames, where a single audio frame consists of data for
+ /// all the channels for the same single point in time. Any
+ /// stream-processor-specific internal details re. lower rate sampling for
+ /// LFE channel or the like should be hidden by the StreamProcessor server
+ /// implementation.
+ ///
+ /// compressed data input - A packet must contain at least one byte of data.
+ /// See also stream_input_bytes_min. Splitting AUs at arbitrary byte
+ /// boundaries is permitted, including at boundaries that are in AU headers.
+ ///
+ /// compressed data output - The stream processor is not required to fully
+ /// fill each output packet's buffer.
5: uint32 valid_length_bytes;
- // This value is not strictly speaking a timestamp. It is an arbitrary
- // unsigned 64-bit number that, under some circumstances, will be passed by
- // a stream processor unmodified from an input packet to the
- // exactly-corresponding output packet.
- //
- // For timestamp_ish values to be propagated from input to output the
- // following conditions must be true:
- // * promise_separate_access_units_on_input must be true
- // * has_timestamp_ish must be true for a given input packet, to have that
- // timestamp_ish value (potentially) propagate through to an output
- // * the StreamProcessor instance itself decides (async) that the input
- // packet generates an output packet - if a given input never generates
- // an output packet then the timestamp_ish value on the input will never
- // show up on any output packet - depending on the characteristics of the
- // input and output formats, and whether a decoder is willing to join
- // mid-stream, etc this can be more or less likely to occur, but clients
- // should be written to accommodate timestamp_ish values that are fed on
- // input but never show up on output, at least to a reasonable degree
- // (not crashing, not treating as an error).
- //
- // See stream_processor.md for more on timestamp_ish.
+ /// This value is not strictly speaking a timestamp. It is an arbitrary
+ /// unsigned 64-bit number that, under some circumstances, will be passed by
+ /// a stream processor unmodified from an input packet to the
+ /// exactly-corresponding output packet.
+ ///
+ /// For timestamp_ish values to be propagated from input to output the
+ /// following conditions must be true:
+ /// * promise_separate_access_units_on_input must be true
+ /// * has_timestamp_ish must be true for a given input packet, to have that
+ /// timestamp_ish value (potentially) propagate through to an output
+ /// * the StreamProcessor instance itself decides (async) that the input
+ /// packet generates an output packet - if a given input never generates
+ /// an output packet then the timestamp_ish value on the input will never
+ /// show up on any output packet - depending on the characteristics of the
+ /// input and output formats, and whether a decoder is willing to join
+ /// mid-stream, etc this can be more or less likely to occur, but clients
+ /// should be written to accommodate timestamp_ish values that are fed on
+ /// input but never show up on output, at least to a reasonable degree
+ /// (not crashing, not treating as an error).
6: uint64 timestamp_ish;
- // start_access_unit
- //
- // If promise_separate_access_units_on_input (TODO(dustingreen): or any
- // similar mode for output) is true, this bool must be set appropriately
- // depending on whether byte 0 _is_ or _is not_ the start of an access
- // unit. The client is required to know, and required to set this boolean
- // properly. The server is allowed to infer that when this boolean is
- // false, byte 0 is the first byte of a continuation of a
- // previously-started AU. (The byte at start_offset is "byte 0".)
- //
- // If promise_separate_access_units_on_input is false, this boolean is
- // ignored.
+ /// start_access_unit
+ ///
+ /// If promise_separate_access_units_on_input (TODO(dustingreen): or any
+ /// similar mode for output) is true, this bool must be set appropriately
+ /// depending on whether byte 0 _is_ or _is not_ the start of an access
+ /// unit. The client is required to know, and required to set this boolean
+ /// properly. The server is allowed to infer that when this boolean is
+ /// false, byte 0 is the first byte of a continuation of a
+ /// previously-started AU. (The byte at start_offset is "byte 0".)
+ ///
+ /// If promise_separate_access_units_on_input is false, this boolean is
+ /// ignored.
7: bool start_access_unit;
- // known_end_access_unit
- //
- // A client is never required to set this boolean to true.
- //
- // If promise_separate_access_units_on_input is true, for input data, this
- // boolean must be false if the last byte of this packet is not the last
- // byte of an AU, and this boolean _may_ be true if the last byte of this
- // packet is the last byte of an AU. A client delivering one AU at a time
- // that's interested in the lowest possible latency via the decoder should
- // set this boolean to true when it can be set to true.
- //
- // If promise_separate_access_units_on_input is false, this boolean is
- // ignored.
+ /// known_end_access_unit
+ ///
+ /// A client is never required to set this boolean to true.
+ ///
+ /// If promise_separate_access_units_on_input is true, for input data, this
+ /// boolean must be false if the last byte of this packet is not the last
+ /// byte of an AU, and this boolean _may_ be true if the last byte of this
+ /// packet is the last byte of an AU. A client delivering one AU at a time
+ /// that's interested in the lowest possible latency via the decoder should
+ /// set this boolean to true when it can be set to true.
+ ///
+ /// If promise_separate_access_units_on_input is false, this boolean is
+ /// ignored.
8: bool known_end_access_unit;
};
-// StreamProcessor
-//
-// The StreamProcessor interface exists to anchor the configuration of input
-// and output buffers, and depending on StreamProcessor server hosting
-// strategy, the StreamProcessor interface can, in some configurations, be 1:1
-// with a stream processor isolate (process), especially when using SW codecs.
-// The StreamProcessor can be used to process up to one stream at a time.
-//
-// Descriptions of actions taken by methods of this interface and the states of
-// things are given as if the methods are synchronously executed by the stream
-// processor server, but in reality, as is typical of FIDL interfaces, the
-// message processing is async. The states described are to be read as the
-// state from the client's point of view unless otherwise stated. Events
-// coming back from the server are of course delivered async, and a client that
-// processes more than one stream per StreamProcessor instance needs to care
-// whether a given event is from the current stream vs. some older
-// soon-to-be-gone stream.
-//
-// The Sync() method's main purpose is to enable the client to robustly prevent
-// having both old and new buffers allocated in the system at the same time,
-// since media buffers can be significantly large, depending. The Sync() method
-// achieves this by only delivering it's response when all previous calls to
-// the StreamProcessor interface have actually taken effect in the
-// StreamControl ordering domain. Sync() can also be used to wait for the
-// stream processor server to catch up if there's a possibility that a client
-// might otherwise get too far ahead of the StreamProcessor server, by for
-// example requesting creation of a large number of streams in a row. It can
-// also be used during debugging to ensure that a stream processor server
-// hasn't gotten stuck. Calling Sync() is entirely optional and never required
-// for correctness - only potentially required to de-overlap resource usage.
-//
-
-// Semi-trusted StreamProcessor server - SW decoders run in an isolate (with
-// very few capabilities) just in case the decoding SW has a vulnerability
-// which could be used to take over the StreamProcessor server. Clients of the
-// stream processor interface using decoders and processing streams of separate
-// security contexts, to a greater extent than some other interfaces, need to
-// protect themselves against invalid server behavior, such as double-free of a
-// packet_index and any other invalid server behavior. Having fed in
-// compressed data of one security context, don't place too much trust in a
-// single StreamProcessor instance to not mix data among any buffers that
-// StreamProcessor server has ever been told about. Instead, create separate
-// StreamProcessor instances for use by security-separate client-side contexts.
-// While the picture for HW-based decoders looks somewhat different and is out
-// of scope of this paragraph, the client should always use separate
-// StreamProcessor instances for security-separate client-side contexts.
+/// Overview of operation:
+///
+/// 1. Create
+/// * create via CodecFactory - see CodecFactory
+/// * create via LicenseSession - see LicenseSession
+/// 2. Get input constraints
+/// * OnInputConstraints() - sent unsolicited by stream processor shortly after
+/// stream processor creation.
+/// 3. Provide input buffers
+/// * SetInputBufferPartialSettings() (current way)
+/// * SetInputBufferSettings() / AddInputBuffer() (old deprecated way)
+/// 4. Deliver input data
+/// * QueueInputPacket() + OnFreeInputPacket(), for as long as it takes,
+/// possibly working through all input packets repeatedly before...
+/// 5. Get output constraints and format
+/// * OnOutputConstraints()
+/// * This is not sent until after at least one QueueInput* message is sent by
+/// the client, even if the underlying processor behind the StreamProcessor
+/// doesn't fundamentally need any input data to determine its output
+/// constraints. This server behavior prevents clients taking an incorrect
+/// dependency on the output constraints showing up before input is
+/// delivered.
+/// * A client must tolerate this arriving as late as after substantial input
+/// data has been delivered, including lots of input packet recycling via
+/// OnFreeInputPacket().
+/// * This message can arrive more than once before the first output data.
+/// 6. Provide output buffers
+/// * SetOutputBufferPartialSettings() / CompleteOutputBufferPartialSettings()
+/// (current way)
+/// * SetOutputBufferSettings() / AddOutputBuffer()
+/// (old deprecated way)
+/// 7. Data flows, with optional EndOfStream
+/// * OnOutputPacket() / RecycleOutputPacket() / QueueInputPacket() /
+/// OnFreeInputPacket() / QueueInputEndOfStream() / OnOutputEndOfStream()
+///
+/// Semi-trusted StreamProcessor server - SW decoders run in an isolate (with
+/// very few capabilities) just in case the decoding SW has a vulnerability
+/// which could be used to take over the StreamProcessor server. Clients of the
+/// stream processor interface using decoders and processing streams of separate
+/// security contexts, to a greater extent than some other interfaces, need to
+/// protect themselves against invalid server behavior, such as double-free of a
+/// packet_index and any other invalid server behavior. Having fed in
+/// compressed data of one security context, don't place too much trust in a
+/// single StreamProcessor instance to not mix data among any buffers that
+/// StreamProcessor server has ever been told about. Instead, create separate
+/// StreamProcessor instances for use by security-separate client-side contexts.
+/// While the picture for HW-based decoders looks somewhat different and is out
+/// of scope of this paragraph, the client should always use separate
+/// StreamProcessor instances for security-separate client-side contexts.
+///
+/// Descriptions of actions taken by methods of this protocol and the states of
+/// things are given as if the methods are synchronously executed by the stream
+/// processor server, but in reality, as is typical of FIDL interfaces, the
+/// message processing is async. The states described are to be read as the
+/// state from the client's point of view unless otherwise stated. Events
+/// coming back from the server are of course delivered async, and a client that
+/// processes more than one stream per StreamProcessor instance needs to care
+/// whether a given event is from the current stream vs. some older
+/// soon-to-be-gone stream.
+///
+/// The Sync() method's main purpose is to enable the client to robustly prevent
+/// having both old and new buffers allocated in the system at the same time,
+/// since media buffers can be significantly large, depending. The Sync() method
+/// achieves this by only delivering it's response when all previous calls to
+/// the StreamProcessor protocol have actually taken effect in the
+/// StreamControl ordering domain. Sync() can also be used to wait for the
+/// stream processor server to catch up if there's a possibility that a client
+/// might otherwise get too far ahead of the StreamProcessor server, by for
+/// example requesting creation of a large number of streams in a row. It can
+/// also be used during debugging to ensure that a stream processor server
+/// hasn't gotten stuck. Calling Sync() is entirely optional and never required
+/// for correctness - only potentially required to de-overlap resource usage.
+///
+/// It's possible to re-use a StreamProcessor instance for another stream, and
+/// doing so can sometimes skip over re-allocation of buffers. This can be a
+/// useful thing to do for cases like seeking to a new location - at the
+/// StreamProcessor interface that can look like switching to a new stream.
protocol StreamProcessor {
- // EnableOnStreamFailed()
- //
- // Permit the server to use OnStreamFailed() instead of the server just
- // closing the whole StreamProcessor channel on stream failure.
- //
- // If the server hasn't seen this message by the time a stream fails, the
- // server will close the StreamProcessor channel instead of sending
- // OnStreamFailed().
+ /// Permit the server to use OnStreamFailed() instead of the server just
+ /// closing the whole StreamProcessor channel on stream failure.
+ ///
+ /// If the server hasn't seen this message by the time a stream fails, the
+ /// server will close the StreamProcessor channel instead of sending
+ /// OnStreamFailed().
EnableOnStreamFailed();
- // OnStreamFailed()
- //
- // The stream has failed, but the StreamProcessor instance is still usable
- // for a new stream.
- //
- // This message is only ever sent by the server if the client previously
- // sent EnableOnStreamFailed(). If the client didn't send
- // EnableOnStreamFailed() then the server closes the StreamProcessor
- // channel instead.
- //
- // StreamProcessor server implementations are encouraged to handle stream
- // errors (and ideally to also report them via error_ bools of
- // OnOutputPacket() and OnOutputEndOfStream()) without failing the whole
- // stream, but if a stream processor server is unable to do that, but still
- // can cleanly contain the failure to the stream, the stream processor
- // server can (assuming EnableOnStreamFailed() was called) use
- // OnStreamFailed() to indicate the stream failure to the client without
- // closing the StreamProcessor channel.
- //
- // An ideal StreamProcessor server handles problems with input data without
- // sending this message, but sending this message is preferred vs. closing
- // the server end of the StreamProcessor channel if the StreamProcessor
- // server can 100% reliably contain the stream failure to the stream,
- // without any adverse impact to any later stream.
- //
- // No further messages will arrive from the server regarding the failed
- // stream. This includes any OnOutputEndOfStream() that the client would
- // have otherwise expected.
+ /// The stream has failed, but the StreamProcessor instance is still usable
+ /// for a new stream.
+ ///
+ /// This message is only ever sent by the server if the client previously
+ /// sent EnableOnStreamFailed(). If the client didn't send
+ /// EnableOnStreamFailed() then the server closes the StreamProcessor
+ /// channel instead.
+ ///
+ /// StreamProcessor server implementations are encouraged to handle stream
+ /// errors (and ideally to also report them via error_ bools of
+ /// OnOutputPacket() and OnOutputEndOfStream()) without failing the whole
+ /// stream, but if a stream processor server is unable to do that, but still
+ /// can cleanly contain the failure to the stream, the stream processor
+ /// server can (assuming EnableOnStreamFailed() was called) use
+ /// OnStreamFailed() to indicate the stream failure to the client without
+ /// closing the StreamProcessor channel.
+ ///
+ /// An ideal StreamProcessor server handles problems with input data without
+ /// sending this message, but sending this message is preferred vs. closing
+ /// the server end of the StreamProcessor channel if the StreamProcessor
+ /// server can 100% reliably contain the stream failure to the stream,
+ /// without any adverse impact to any later stream.
+ ///
+ /// No further messages will arrive from the server regarding the failed
+ /// stream. This includes any OnOutputEndOfStream() that the client would
+ /// have otherwise expected.
-> OnStreamFailed(uint64 stream_lifetime_ordinal, StreamError error);
- // OnInputConstraints()
- //
- // The server sends this shortly after StreamProcessor creation to indicate
- // input buffer constraints. The "min" and "max" input constraints don't
- // change for the life of the StreamProcessor.
- //
- // The "max" values for buffer size and count are large enough to support
- // the most demanding format the server supports on input. The
- // "recommended" values should be workable for use with the input
- // FormatDetails conveyed during StreamProcessor creation. The
- // "recommended" values are not necessarily suitable if the client uses
- // QueueInputFormatDetails() to change the input format. In that case it's
- // up to the client to determine suitable values, either by creating a new
- // StreamProcessor instance instead, or knowing suitable values outside the
- // scope of this protocol.
- //
- // See comments on StreamBufferConstraints.
- //
- // This message is guaranteed to be sent unsolicited to the StreamProcessor
- // client during or shortly after StreamProcessor creation. Clients should
- // not depend on this being the very first message to arrive at the client.
- //
- // The "min" and "max" input constraints are guaranteed not to change for a
- // given StreamProcessor instance. The "recommended" values may
- // effectively change when the server processes QueueInputFormatDetails().
- // There is not any way in the protocol short of creating a new
- // StreamProcessor instance for the client to get those new "recommended"
- // values.
+ /// The server sends this shortly after StreamProcessor creation to indicate
+ /// input buffer constraints. The "min" and "max" input constraints don't
+ /// change for the life of the StreamProcessor.
+ ///
+ /// The "max" values for buffer size and count are large enough to support
+ /// the most demanding format the server supports on input. The
+ /// "recommended" values should be workable for use with the input
+ /// FormatDetails conveyed during StreamProcessor creation. The
+ /// "recommended" values are not necessarily suitable if the client uses
+ /// QueueInputFormatDetails() to change the input format. In that case it's
+ /// up to the client to determine suitable values, either by creating a new
+ /// StreamProcessor instance instead, or knowing suitable values outside the
+ /// scope of this protocol.
+ ///
+ /// See comments on StreamBufferConstraints.
+ ///
+ /// This message is guaranteed to be sent unsolicited to the StreamProcessor
+ /// client during or shortly after StreamProcessor creation. Clients should
+ /// not depend on this being the very first message to arrive at the client.
+ ///
+ /// The "min" and "max" input constraints are guaranteed not to change for a
+ /// given StreamProcessor instance. The "recommended" values may
+ /// effectively change when the server processes QueueInputFormatDetails().
+ /// There is not any way in the protocol short of creating a new
+ /// StreamProcessor instance for the client to get those new "recommended"
+ /// values.
//
// TODO(dustingreen): Maybe provide a way for the client to get updated
// "recommended" values for input, maybe only on request rather than via
@@ -1092,556 +998,504 @@
// the recommendations from the constraints.
-> OnInputConstraints(StreamBufferConstraints input_constraints);
- // SetInputBufferSettings() and AddInputBuffer() (deprecated)
- //
- // Clients should use SetInputBufferPartialSettings() instead.
- //
- // Configuring input buffers (the old way) consists of calling
- // SetInputBufferSettings() followed by a number of calls to
- // AddInputBuffer() equal to the number of buffers set via
- // SetInputBufferSettings(). In buffer-per-packet mode, this is the same as
- // the number of packets. In single-buffer mode, this is 1.
- //
- // After OnInputConstraints(), the client uses these two methods to set up
- // input buffers and packets.
- //
- // Configuring input buffers is required before QueueInputPacket().
- //
- // The client can also re-set-up input buffers any time there is no current
- // stream. The client need not wait until all previously-set-up input
- // buffers are with the client via OnFreeInputPacket(). The old
- // buffer_lifetime_ordinal just ends. See stream_processor.md for more
- // info on "buffer lifetime".
- //
- // The recommended way to de-overlap resource usage (when/if the client
- // wants to) is to send CloseCurrentStream() with release_input_buffers
- // true then send Sync() and wait for its response before allocating any
- // new buffers. How to cause other parts of the system to release their
- // references on low-level buffers is outside the scope of this interface.
- //
- // This call ends any previous buffer_lifetime_ordinal, and starts a new
- // one.
+ /// Clients should use SetInputBufferPartialSettings() instead.
+ ///
+ /// Configuring input buffers (the old way) consists of calling
+ /// SetInputBufferSettings() followed by a number of calls to
+ /// AddInputBuffer() equal to the number of buffers set via
+ /// SetInputBufferSettings(). In buffer-per-packet mode, this is the same as
+ /// the number of packets. In single-buffer mode, this is 1.
+ ///
+ /// After OnInputConstraints(), the client uses these two methods to set up
+ /// input buffers and packets.
+ ///
+ /// Configuring input buffers is required before QueueInputPacket().
+ ///
+ /// The client can also re-set-up input buffers any time there is no current
+ /// stream. The client need not wait until all previously-set-up input
+ /// buffers are with the client via OnFreeInputPacket(). The old
+ /// buffer_lifetime_ordinal just ends.
+ ///
+ /// The recommended way to de-overlap resource usage (when/if the client
+ /// wants to) is to send CloseCurrentStream() with release_input_buffers
+ /// true then send Sync() and wait for its response before allocating any
+ /// new buffers. How to cause other parts of the system to release their
+ /// references on low-level buffers is outside the scope of this interface.
+ ///
+ /// This call ends any previous buffer_lifetime_ordinal, and starts a new
+ /// one.
+ [Deprecated = "Use SetInputBufferPartialSettings instead."]
SetInputBufferSettings(StreamBufferSettings input_settings);
- // The client is required to add all the input buffers before sending any
- // message that starts a new stream else the stream processor will close
- // the StreamProcessor channel.
- //
- // When the last buffer is added with this message, all the input packets
- // effectively jump from non-existent to free with the client. The
- // StreamProcessor will not generate an OnFreeInputPacket() for each new
- // input packet. The client can immediately start sending
- // QueueInputPacket() after sending the last AddInputBuffer().
+ /// The client is required to add all the input buffers before sending any
+ /// message that starts a new stream else the stream processor will close
+ /// the StreamProcessor channel.
+ ///
+ /// When the last buffer is added with this message, all the input packets
+ /// effectively jump from non-existent to free with the client. The
+ /// StreamProcessor will not generate an OnFreeInputPacket() for each new
+ /// input packet. The client can immediately start sending
+ /// QueueInputPacket() after sending the last AddInputBuffer().
+ [Deprecated = "Use SetInputBufferPartialSettings instead."]
AddInputBuffer(StreamBuffer buffer);
- // SetInputBufferPartialSettings()
- //
- // This is the replacement for SetInputBufferSettings().
- //
- // When the client is using sysmem to allocate buffers, this message is
- // used instead of SetInputBufferSettings()+AddInputBuffer(). Instead, a
- // single SetInputBufferPartialSettings() provides the StreamProcessor with
- // the client-specified input settings and a BufferCollectionToken which
- // the StreamProcessor will use to convey constraints to sysmem. Both the
- // client and the StreamProcessor will be informed of the allocated buffers
- // directly by sysmem via their BufferCollection channel (not via the
- // StreamProcessor channel).
- //
- // The client must not QueueInput...() until after sysmem informs the client
- // that buffer allocation has completed and was successful.
- //
- // The server should be prepared to see QueueInput...() before the server
- // has necessarily heard from sysmem that the buffers are allocated - the
- // server must tolerate either ordering, as the QueueInput...() and
- // notification of sysmem allocation completion arrive on different
- // channels, so the client having heard that allocation is complete doesn't
- // mean the server knows that allocation is complete yet. However, the
- // server can expect that allocation is in fact complete and can expect to
- // get the allocation information from sysmem immediately upon requesting
- // the information from sysmem.
+ /// This is the replacement for SetInputBufferSettings().
+ ///
+ /// When the client is using sysmem to allocate buffers, this message is
+ /// used instead of SetInputBufferSettings()+AddInputBuffer(). Instead, a
+ /// single SetInputBufferPartialSettings() provides the StreamProcessor with
+ /// the client-specified input settings and a BufferCollectionToken which
+ /// the StreamProcessor will use to convey constraints to sysmem. Both the
+ /// client and the StreamProcessor will be informed of the allocated buffers
+ /// directly by sysmem via their BufferCollection channel (not via the
+ /// StreamProcessor channel).
+ ///
+ /// The client must not QueueInput...() until after sysmem informs the client
+ /// that buffer allocation has completed and was successful.
+ ///
+ /// The server should be prepared to see QueueInput...() before the server
+ /// has necessarily heard from sysmem that the buffers are allocated - the
+ /// server must tolerate either ordering, as the QueueInput...() and
+ /// notification of sysmem allocation completion arrive on different
+ /// channels, so the client having heard that allocation is complete doesn't
+ /// mean the server knows that allocation is complete yet. However, the
+ /// server can expect that allocation is in fact complete and can expect to
+ /// get the allocation information from sysmem immediately upon requesting
+ /// the information from sysmem.
SetInputBufferPartialSettings(StreamBufferPartialSettings input_settings);
- // OnOutputConstraints()
- //
- // This event informs the client of new output constraints.
- //
- // This message is ordered with respect to other output (such as output
- // packets, output format, output end-of-stream).
- //
- // Before the first OnOutputPacket() of a stream, the server guarantees that
- // at least one OnOutputConstraints() and exactly one OnOutputFormat() will
- // be sent. The server may not set buffer_constraints_action_required true
- // in OnOutputConstraints() if the buffer config is already suitable for the
- // stream (buffer_constraints_action_required false means the buffer config
- // is already fine). The client must tolerate multiple
- // OnOutputConstraints() (and 1 OnOutputFormat() message) before the first
- // output packet. As long as the client hasn't moved to a new stream, the
- // server won't send another OnOutputConstraints() until after the client
- // has configured output buffers.
- //
- // This message can be sent mid-stream by a server. If
- // buffer_constraints_action_required false, the message is safe to
- // ignore, but a client may choose to stash the new constraints for
- // later use the next time the client wants to unilaterally re-configure
- // buffers (when allowed). If later the server needs the output config to
- // change, the server may send a new OnOutputConstraints() with
- // buffer_constraints_action_required true.
- //
- // On buffer_constraints_action_required true, a client that does not wish
- // to fully handle mid-stream output buffer config changes should either
- // give up completely on the processing, or at least re-config the output
- // as specified before starting a new stream (and possibly re-delivering
- // input data, if the client wants). This avoids useless retry with a new
- // stream starting from just before the output buffer config change which
- // would hit the same mid-stream output config change again.
- //
- // Similarly, some servers may only partly support mid-stream format
- // changes, or only support a mid-stream format change if the buffers are
- // already large enough to handle both before and after the format change.
- // Such servers should still indicate buffer_constraints_action_required
- // true, but then send OnStreamFailed() after the client has re-configured
- // output buffers (seamlessly dealing with the mid-stream output config
- // change is even better of course, but is not always feasible depending on
- // format). When the client retries with a new stream starting from a
- // nearby location in the client's logical overall media timeline, the
- // output buffers will already be suitable for the larger size output, so
- // the new stream will not need any mid-stream output buffer re-config,
- // only a mid-stream OnOutputFormat(). This strategy avoids the problem
- // that would otherwise occur if a client were to retry with a new stream
- // starting just before the mid-stream output buffer config change (the
- // retry wouldn't be effective since the same need for an output buffer
- // config change would be hit again). Servers are discouraged from sending
- // OnStreamFailed() solely due to a mid-stream need for different output
- // buffer config without first sending OnOutputConstraints() with
- // buffer_constraints_action_required true and waiting for the client to
- // re-configure output buffers (to avoid the useless client retry with a
- // new stream from a logical location before the config change).
- //
- // When buffer_constraints_action_required true, the server will not send
- // any OnOutputPacket() for this stream until after the client has
- // configured/re-configured output buffers.
- //
- // A client that gives up on processing a stream on any mid-stream
- // OnOutputConstraints() or mid-stream OnOutputFormat() should completely
- // ignore any OnOutputConstraints() with buffer_constraints_action_required
- // false. Otherwise the client may needlessly fail processing, or server
- // implementations might not be able to use
- // buffer_constraints_action_required false for fear of simpler clients
- // just disconnecting.
- //
- // All clients, even those which don't want to support any mid-stream
- // output buffer re-config or mid-stream OnOutputFormat() are required to
- // deal with 1..multiple OnOutputConstraints() messages before the first
- // output packet, and 1 OnOutputFormat() messages before the first output
- // packet.
- //
- // This message is ordered with respect to output packets, and with respect
- // to OnOutputFormat().
- //
- // For more on OnOutputConstraints(), see stream_processor.md.
+ /// This event informs the client of new output constraints.
+ ///
+ /// This message is ordered with respect to other output (such as output
+ /// packets, output format, output end-of-stream).
+ ///
+ /// Before the first OnOutputPacket() of a stream, the server guarantees that
+ /// at least one OnOutputConstraints() and exactly one OnOutputFormat() will
+ /// be sent. The server may not set buffer_constraints_action_required true
+ /// in OnOutputConstraints() if the buffer config is already suitable for the
+ /// stream (buffer_constraints_action_required false means the buffer config
+ /// is already fine). The client must tolerate multiple
+ /// OnOutputConstraints() (and 1 OnOutputFormat() message) before the first
+ /// output packet. As long as the client hasn't moved to a new stream, the
+ /// server won't send another OnOutputConstraints() until after the client
+ /// has configured output buffers.
+ ///
+ /// This message can be sent mid-stream by a server. If
+ /// buffer_constraints_action_required false, the message is safe to
+ /// ignore, but a client may choose to stash the new constraints for
+ /// later use the next time the client wants to unilaterally re-configure
+ /// buffers (when allowed). If later the server needs the output config to
+ /// change, the server may send a new OnOutputConstraints() with
+ /// buffer_constraints_action_required true.
+ ///
+ /// On buffer_constraints_action_required true, a client that does not wish
+ /// to fully handle mid-stream output buffer config changes should either
+ /// give up completely on the processing, or at least re-config the output
+ /// as specified before starting a new stream (and possibly re-delivering
+ /// input data, if the client wants). This avoids useless retry with a new
+ /// stream starting from just before the output buffer config change which
+ /// would hit the same mid-stream output config change again.
+ ///
+ /// Similarly, some servers may only partly support mid-stream format
+ /// changes, or only support a mid-stream format change if the buffers are
+ /// already large enough to handle both before and after the format change.
+ /// Such servers should still indicate buffer_constraints_action_required
+ /// true, but then send OnStreamFailed() after the client has re-configured
+ /// output buffers (seamlessly dealing with the mid-stream output config
+ /// change is even better of course, but is not always feasible depending on
+ /// format). When the client retries with a new stream starting from a
+ /// nearby location in the client's logical overall media timeline, the
+ /// output buffers will already be suitable for the larger size output, so
+ /// the new stream will not need any mid-stream output buffer re-config,
+ /// only a mid-stream OnOutputFormat(). This strategy avoids the problem
+ /// that would otherwise occur if a client were to retry with a new stream
+ /// starting just before the mid-stream output buffer config change (the
+ /// retry wouldn't be effective since the same need for an output buffer
+ /// config change would be hit again). Servers are discouraged from sending
+ /// OnStreamFailed() solely due to a mid-stream need for different output
+ /// buffer config without first sending OnOutputConstraints() with
+ /// buffer_constraints_action_required true and waiting for the client to
+ /// re-configure output buffers (to avoid the useless client retry with a
+ /// new stream from a logical location before the config change).
+ ///
+ /// When buffer_constraints_action_required true, the server will not send
+ /// any OnOutputPacket() for this stream until after the client has
+ /// configured/re-configured output buffers.
+ ///
+ /// A client that gives up on processing a stream on any mid-stream
+ /// OnOutputConstraints() or mid-stream OnOutputFormat() should completely
+ /// ignore any OnOutputConstraints() with buffer_constraints_action_required
+ /// false. Otherwise the client may needlessly fail processing, or server
+ /// implementations might not be able to use
+ /// buffer_constraints_action_required false for fear of simpler clients
+ /// just disconnecting.
+ ///
+ /// All clients, even those which don't want to support any mid-stream
+ /// output buffer re-config or mid-stream OnOutputFormat() are required to
+ /// deal with 1..multiple OnOutputConstraints() messages before the first
+ /// output packet, and 1 OnOutputFormat() messages before the first output
+ /// packet.
+ ///
+ /// This message is ordered with respect to output packets, and with respect
+ /// to OnOutputFormat().
-> OnOutputConstraints(StreamOutputConstraints output_config);
- // OnOutputFormat()
- //
- // This message is sent by the server before the first output packet of any
- // stream, and potentially mid-stream between output packets of the stream,
- // ordered with respect to output packets, and ordered with respect to
- // OnOutputConstraints().
- //
- // The server guarantees that the first packet of every stream will be
- // preceeded by an OnOutputFormat().
- //
- // The server guarantees that there will be an OnOutputFormat() between an
- // OnOutputConstraints() with buffer_constraints_action_required true and an
- // OnOutputPacket(). In other words, the client is essentially allowed to
- // forget what the output format is on any OnOutputConstraints() with
- // buffer_constraints_action_required true, because the server promises a
- // subsequent OnOutputFormat() before any OnOutputPacket().
- //
- // If the server sets buffer_constraints_action_required true in
- // OnOutputConstraints(), the server won't send OnOutputFormat() (and
- // therefore also won't send OnOutputPacket()) until the client has
- // re-configured output buffers.
- //
- // The server is allowed to send an OnOutputFormat() mid-stream between two
- // output packets.
- //
- // A server won't send two adjacent OnOutputFormat() messages without any
- // output packet in between. However an OnOutputFormat() message doesn't
- // guarantee a subsequent packet, because for example the server could send
- // OnOutputEndOfStream() or OnStreamFailed() instead.
- //
- // A client that does not wish to seamlessly handle mid-stream output format
- // changes should either ensure that no stream processed by the client
- // ever has any mid-stream format change, or the client should ensure that
- // any retry of processing starts the new attempt at a point logically at or
- // after the point where the old format has ended and the new format starts,
- // else the client could just hit the same mid-stream format change again.
- //
- // An example of this message being sent mid-stream is mid-stream change
- // of dimensions of video frames output from a video decoder.
- //
- // Not all servers will support seamless handling of format change. Those
- // that do support seamless handling of format change may require that the
- // format change not also require output buffer re-config, in order for the
- // handling to be seamless. See the comment block for OnOutputConstraints()
- // for more discussion of how servers and clients should behave - in
- // particular when they don't seamlessly handle output constraint change
- // and/or output format change.
- //
- // If this message isn't being sent by the server when expected at the
- // start of a stream, the most common reason is that a OnOutputConstraints()
- // with buffer_constraints_action_required true hasn't been processed by the
- // client (by configuring output buffers using
- // SetOutputBufferPartialSettings() etc).
+ /// This message is sent by the server before the first output packet of any
+ /// stream, and potentially mid-stream between output packets of the stream,
+ /// ordered with respect to output packets, and ordered with respect to
+ /// OnOutputConstraints().
+ ///
+ /// The server guarantees that the first packet of every stream will be
+ /// preceeded by an OnOutputFormat().
+ ///
+ /// The server guarantees that there will be an OnOutputFormat() between an
+ /// OnOutputConstraints() with buffer_constraints_action_required true and an
+ /// OnOutputPacket(). In other words, the client is essentially allowed to
+ /// forget what the output format is on any OnOutputConstraints() with
+ /// buffer_constraints_action_required true, because the server promises a
+ /// subsequent OnOutputFormat() before any OnOutputPacket().
+ ///
+ /// If the server sets buffer_constraints_action_required true in
+ /// OnOutputConstraints(), the server won't send OnOutputFormat() (and
+ /// therefore also won't send OnOutputPacket()) until the client has
+ /// re-configured output buffers.
+ ///
+ /// The server is allowed to send an OnOutputFormat() mid-stream between two
+ /// output packets.
+ ///
+ /// A server won't send two adjacent OnOutputFormat() messages without any
+ /// output packet in between. However an OnOutputFormat() message doesn't
+ /// guarantee a subsequent packet, because for example the server could send
+ /// OnOutputEndOfStream() or OnStreamFailed() instead.
+ ///
+ /// A client that does not wish to seamlessly handle mid-stream output format
+ /// changes should either ensure that no stream processed by the client
+ /// ever has any mid-stream format change, or the client should ensure that
+ /// any retry of processing starts the new attempt at a point logically at or
+ /// after the point where the old format has ended and the new format starts,
+ /// else the client could just hit the same mid-stream format change again.
+ ///
+ /// An example of this message being sent mid-stream is mid-stream change
+ /// of dimensions of video frames output from a video decoder.
+ ///
+ /// Not all servers will support seamless handling of format change. Those
+ /// that do support seamless handling of format change may require that the
+ /// format change not also require output buffer re-config, in order for the
+ /// handling to be seamless. See the comment block for OnOutputConstraints()
+ /// for more discussion of how servers and clients should behave - in
+ /// particular when they don't seamlessly handle output constraint change
+ /// and/or output format change.
+ ///
+ /// If this message isn't being sent by the server when expected at the
+ /// start of a stream, the most common reason is that a OnOutputConstraints()
+ /// with buffer_constraints_action_required true hasn't been processed by the
+ /// client (by configuring output buffers using
+ /// SetOutputBufferPartialSettings() etc).
-> OnOutputFormat(StreamOutputFormat output_format);
- // SetOutputBufferSettings() and AddOutputBuffer() (deprecated)
- //
- // Client code should use SetOutputBufferPartialSettings() instead.
- //
- // These are not permitted until after the first OnOutputConstraints().
- //
- // Roughly speaking, these messages are sent in response to
- // OnOutputConstraints() with buffer_constraints_action_required true.
- //
- // Configuring output buffers consists of calling SetOutputBufferSettings()
- // followed by a number of calls to AddOutputBuffer() equal to the number
- // of buffers set via SetOutputBufferSettings(). In buffer-per-packet
- // mode, this is the same as the number of packets. In single-buffer mode,
- // this is 1.
- //
- // Configuring output buffers is _required_ after OnOutputConstraints() is
- // received by the client with buffer_constraints_action_required true and
- // stream_lifetime_ordinal equal to the client's current
- // stream_lifetime_ordinal (even if there is an active stream), and is
- // _permitted_ any time there is no current stream.
- //
- // Closing the current stream occurs on the StreamControl ordering domain,
- // so after a CloseCurrentStream() or FlushEndOfStreamAndCloseStream(), a
- // subsequent Sync() completion must be received by the client before the
- // client knows that there's no longer a current stream.
- //
- // For more on SetOutputBufferSettings() and AddOutputBuffer(), see
- // stream_processor.md.
+ /// These are not permitted until after the first OnOutputConstraints().
+ ///
+ /// Roughly speaking, these messages are sent in response to
+ /// OnOutputConstraints() with buffer_constraints_action_required true.
+ ///
+ /// Configuring output buffers consists of calling SetOutputBufferSettings()
+ /// followed by a number of calls to AddOutputBuffer() equal to the number
+ /// of buffers set via SetOutputBufferSettings(). In buffer-per-packet
+ /// mode, this is the same as the number of packets. In single-buffer mode,
+ /// this is 1.
+ ///
+ /// Configuring output buffers is _required_ after OnOutputConstraints() is
+ /// received by the client with buffer_constraints_action_required true and
+ /// stream_lifetime_ordinal equal to the client's current
+ /// stream_lifetime_ordinal (even if there is an active stream), and is
+ /// _permitted_ any time there is no current stream.
+ ///
+ /// Closing the current stream occurs on the StreamControl ordering domain,
+ /// so after a CloseCurrentStream() or FlushEndOfStreamAndCloseStream(), a
+ /// subsequent Sync() completion must be received by the client before the
+ /// client knows that there's no longer a current stream.
+ [Deprecated = "Use SetOutputBufferPartialSettings instead."]
SetOutputBufferSettings(StreamBufferSettings output_settings);
+ [Deprecated = "Use SetOutputBufferPartialSettings instead."]
AddOutputBuffer(StreamBuffer buffer);
- // SetOutputBufferPartialSettings()
- //
- // This is the replacement for SetOutputBufferSettings().
- //
- // When the client is using sysmem to allocate buffers, this message is
- // used instead of SetOutputBufferSettings()+AddOutputBuffer(). Instead, a
- // single SetOutputBufferPartialSettings() provides the StreamProcessor
- // with the client-specified output settings and a BufferCollectionToken
- // which the StreamProcessor will use to convey constraints to sysmem.
- // Both the client and the StreamProcessor will be informed of the
- // allocated buffers directly by sysmem via their BufferCollection channel
- // (not via the StreamProcessor channel).
- //
- // Configuring output buffers is _required_ after OnOutputConstraints() is
- // received by the client with buffer_constraints_action_required true and
- // stream_lifetime_ordinal equal to the client's current
- // stream_lifetime_ordinal (even if there is an active stream), and is
- // _permitted_ any time there is no current stream.
- //
- // Closing the current stream occurs on the StreamControl ordering domain,
- // so after a CloseCurrentStream() or FlushEndOfStreamAndCloseStream(), a
- // subsequent Sync() completion must be received by the client before the
- // client knows that there's no longer a current stream.
- //
- // See also CompleteOutputBufferPartialSettings().
+ /// This is the replacement for SetOutputBufferSettings().
+ ///
+ /// When the client is using sysmem to allocate buffers, this message is
+ /// used instead of SetOutputBufferSettings()+AddOutputBuffer(). Instead, a
+ /// single SetOutputBufferPartialSettings() provides the StreamProcessor
+ /// with the client-specified output settings and a BufferCollectionToken
+ /// which the StreamProcessor will use to convey constraints to sysmem.
+ /// Both the client and the StreamProcessor will be informed of the
+ /// allocated buffers directly by sysmem via their BufferCollection channel
+ /// (not via the StreamProcessor channel).
+ ///
+ /// Configuring output buffers is _required_ after OnOutputConstraints() is
+ /// received by the client with buffer_constraints_action_required true and
+ /// stream_lifetime_ordinal equal to the client's current
+ /// stream_lifetime_ordinal (even if there is an active stream), and is
+ /// _permitted_ any time there is no current stream.
+ ///
+ /// Closing the current stream occurs on the StreamControl ordering domain,
+ /// so after a CloseCurrentStream() or FlushEndOfStreamAndCloseStream(), a
+ /// subsequent Sync() completion must be received by the client before the
+ /// client knows that there's no longer a current stream.
+ ///
+ /// See also CompleteOutputBufferPartialSettings().
SetOutputBufferPartialSettings(StreamBufferPartialSettings output_settings);
- // After SetOutputBufferPartialSettings(), the server won't send
- // OnOutputConstraints(), OnOutputFormat(), OnOutputPacket(), or
- // OnOutputEndOfStream() until after the client sends
- // CompleteOutputBufferPartialSettings().
- //
- // Some clients may be able to send
- // CompleteOutputBufferPartialSettings() immediately after
- // SetOutputBufferPartialSettings() - in that case the client needs to be
- // prepared to receive output without knowing the buffer count or packet
- // count yet - such clients may internally delay processing the received
- // output until the client has heard from sysmem (which is when the client
- // will learn the buffer count and packet count).
- //
- // Other clients may first wait for sysmem to allocate, prepare to receive
- // output, and then send CompleteOutputBufferPartialSettings().
+ /// After SetOutputBufferPartialSettings(), the server won't send
+ /// OnOutputConstraints(), OnOutputFormat(), OnOutputPacket(), or
+ /// OnOutputEndOfStream() until after the client sends
+ /// CompleteOutputBufferPartialSettings().
+ ///
+ /// Some clients may be able to send
+ /// CompleteOutputBufferPartialSettings() immediately after
+ /// SetOutputBufferPartialSettings() - in that case the client needs to be
+ /// prepared to receive output without knowing the buffer count or packet
+ /// count yet - such clients may internally delay processing the received
+ /// output until the client has heard from sysmem (which is when the client
+ /// will learn the buffer count and packet count).
+ ///
+ /// Other clients may first wait for sysmem to allocate, prepare to receive
+ /// output, and then send CompleteOutputBufferPartialSettings().
CompleteOutputBufferPartialSettings(uint64 buffer_lifetime_ordinal);
- // FlushEndOfStreamAndCloseStream()
- //
- // This message is optional.
- //
- // This message is only valid after QueueInputEndOfStream() for this stream.
- // The stream_lifetime_ordinal input parameter must match the
- // stream_lifetime_ordinal of the QueueInputEndOfStream(), else the server
- // will close the channel.
- //
- // A client can use this message to flush through (not discard) the last
- // input data of a stream so that the stream processor server generates
- // corresponding output data for all the input data before the server moves
- // on to the next stream, without forcing the client to wait for
- // OnOutputEndOfStream() before queueing data of another stream.
- //
- // The difference between QueueInputEndOfStream() and
- // FlushEndOfStreamAndCloseStream(): QueueInputEndOfStream() is a promise
- // from the client that there will not be any more input data for the
- // stream (and this info is needed by some stream processors for the stream
- // processor to ever emit the very last output data). The
- // QueueInputEndOfStream() having been sent doesn't prevent the client from
- // later completely discarding the rest of the current stream by closing
- // the current stream (with or without a stream switch). In contrast,
- // FlushEndOfStreamAndCloseStream() is a request from the client that all
- // the previously-queued input data be processed including the logical
- // "EndOfStream" showing up as OnOutputEndOfStream() (in success case)
- // before moving on to any newer stream - this essentially changes the
- // close-stream handling from discard to flush-through for this stream
- // only.
- //
- // A client using this message can start providing input data for a new
- // stream without that causing discard of old stream data. That's the
- // purpose of this message - to allow a client to flush through (not
- // discard) the old stream's last data (instead of the default when closing
- // or switching streams which is discard).
- //
- // Because the old stream is not done processing yet and the old stream's
- // data is not being discarded, the client must be prepared to continue to
- // process OnOutputConstraints() messages until the stream_lifetime_ordinal
- // is done. The client will know the stream_lifetime_ordinal is done when
- // OnOutputEndOfStream(), OnStreamFailed(), or the StreamProcessor channel
- // closes.
- //
- // For more on FlushEndOfStreamAndCloseStream(), see stream_processor.md.
+ /// This message is optional.
+ ///
+ /// This message is only valid after QueueInputEndOfStream() for this stream.
+ /// The stream_lifetime_ordinal input parameter must match the
+ /// stream_lifetime_ordinal of the QueueInputEndOfStream(), else the server
+ /// will close the channel.
+ ///
+ /// A client can use this message to flush through (not discard) the last
+ /// input data of a stream so that the stream processor server generates
+ /// corresponding output data for all the input data before the server moves
+ /// on to the next stream, without forcing the client to wait for
+ /// OnOutputEndOfStream() before queueing data of another stream.
+ ///
+ /// The difference between QueueInputEndOfStream() and
+ /// FlushEndOfStreamAndCloseStream(): QueueInputEndOfStream() is a promise
+ /// from the client that there will not be any more input data for the
+ /// stream (and this info is needed by some stream processors for the stream
+ /// processor to ever emit the very last output data). The
+ /// QueueInputEndOfStream() having been sent doesn't prevent the client from
+ /// later completely discarding the rest of the current stream by closing
+ /// the current stream (with or without a stream switch). In contrast,
+ /// FlushEndOfStreamAndCloseStream() is a request from the client that all
+ /// the previously-queued input data be processed including the logical
+ /// "EndOfStream" showing up as OnOutputEndOfStream() (in success case)
+ /// before moving on to any newer stream - this essentially changes the
+ /// close-stream handling from discard to flush-through for this stream
+ /// only.
+ ///
+ /// A client using this message can start providing input data for a new
+ /// stream without that causing discard of old stream data. That's the
+ /// purpose of this message - to allow a client to flush through (not
+ /// discard) the old stream's last data (instead of the default when closing
+ /// or switching streams which is discard).
+ ///
+ /// Because the old stream is not done processing yet and the old stream's
+ /// data is not being discarded, the client must be prepared to continue to
+ /// process OnOutputConstraints() messages until the stream_lifetime_ordinal
+ /// is done. The client will know the stream_lifetime_ordinal is done when
+ /// OnOutputEndOfStream(), OnStreamFailed(), or the StreamProcessor channel
+ /// closes.
FlushEndOfStreamAndCloseStream(uint64 stream_lifetime_ordinal);
- // CloseCurrentStream()
- //
- // This "closes" the current stream, leaving no current stream. In
- // addition, this message can optionally release input buffers or output
- // buffers.
- //
- // If there has never been any active stream, the stream_lifetime_ordinal
- // must be zero or the server will close the channel. If there has been an
- // active stream, the stream_lifetime_ordinal must be the most recent
- // active stream whether that stream is still active or not. Else the
- // server will close the channel.
- //
- // Multiple of this message without any new active stream in between is not
- // to be considered an error, which allows a client to use this message to
- // close the current stream to stop wasting processing power on a stream the
- // user no longer cares about, then later decide that buffers should be
- // released and send this message again with release_input_buffers and/or
- // release_output_buffers true to get the buffers released, if the client is
- // interested in trying to avoid overlap in resource usage between old
- // buffers and new buffers (not all clients are).
- //
- // See also Sync().
- //
- // For more on CloseCurrentStream(), see stream_processor.md.
+ /// This "closes" the current stream, leaving no current stream. In
+ /// addition, this message can optionally release input buffers or output
+ /// buffers.
+ ///
+ /// If there has never been any active stream, the stream_lifetime_ordinal
+ /// must be zero or the server will close the channel. If there has been an
+ /// active stream, the stream_lifetime_ordinal must be the most recent
+ /// active stream whether that stream is still active or not. Else the
+ /// server will close the channel.
+ ///
+ /// Multiple of this message without any new active stream in between is not
+ /// to be considered an error, which allows a client to use this message to
+ /// close the current stream to stop wasting processing power on a stream the
+ /// user no longer cares about, then later decide that buffers should be
+ /// released and send this message again with release_input_buffers and/or
+ /// release_output_buffers true to get the buffers released, if the client is
+ /// interested in trying to avoid overlap in resource usage between old
+ /// buffers and new buffers (not all clients are).
+ ///
+ /// See also Sync().
CloseCurrentStream(
uint64 stream_lifetime_ordinal,
bool release_input_buffers,
bool release_output_buffers);
- // Sync() -> ()
- //
- // On completion, all previous StreamProcessor calls have done what they're
- // going to do server-side, _except_ for processing of data queued using
- // QueueInputPacket().
- //
- // The main purpose of this call is to enable the client to wait until
- // CloseCurrentStream() with release_input_buffers and/or
- // release_output_buffers set to true to take effect, before the client
- // allocates new buffers and re-sets-up input and/or output buffers. This
- // de-overlapping of resource usage can be worthwhile for media buffers
- // which can consume resource types whose overall pools aren't necessarily
- // vast in comparison to resources consumed. Especially if a client is
- // reconfiguring buffers multiple times.
- //
- // Note that Sync() prior to allocating new media buffers is not alone
- // sufficient to achieve non-overlap of media buffer resource usage system
- // wide, but it can be a useful part of achieving that.
- //
- // The Sync() transits the Output ordering domain and the StreamControl
- // ordering domain, but not the InputData ordering domain. For more on
- // ordering domains see stream_processor.md.
- //
- // This request can be used to avoid hitting kMaxInFlightStreams which is
- // presently 10. A client that stays <= 8 in-flight streams will
- // comfortably stay under the limit of 10. While the protocol permits
- // repeated SetInputBufferSettings() and the like, a client that spams the
- // channel can expect that the channel will just close if the server or the
- // channel itself gets too far behind.
+ /// On completion, all previous StreamProcessor calls have done what they're
+ /// going to do server-side, _except_ for processing of data queued using
+ /// QueueInputPacket().
+ ///
+ /// The main purpose of this call is to enable the client to wait until
+ /// CloseCurrentStream() with release_input_buffers and/or
+ /// release_output_buffers set to true to take effect, before the client
+ /// allocates new buffers and re-sets-up input and/or output buffers. This
+ /// de-overlapping of resource usage can be worthwhile for media buffers
+ /// which can consume resource types whose overall pools aren't necessarily
+ /// vast in comparison to resources consumed. Especially if a client is
+ /// reconfiguring buffers multiple times.
+ ///
+ /// Note that Sync() prior to allocating new media buffers is not alone
+ /// sufficient to achieve non-overlap of media buffer resource usage system
+ /// wide, but it can be a useful part of achieving that.
+ ///
+ /// The Sync() transits the Output ordering domain and the StreamControl
+ /// ordering domain, but not the InputData ordering domain.
+ ///
+ /// This request can be used to avoid hitting kMaxInFlightStreams which is
+ /// presently 10. A client that stays <= 8 in-flight streams will
+ /// comfortably stay under the limit of 10. While the protocol permits
+ /// repeated SetInputBufferSettings() and the like, a client that spams the
+ /// channel can expect that the channel will just close if the server or the
+ /// channel itself gets too far behind.
Sync() -> ();
- // OnOutputPacket()
- //
- // This is how the stream processor emits an output packet to the stream
- // processor client.
- //
- // Order is significant.
- //
- // The client should eventually call RecycleOutputPacket() (possibly after
- // switching streams multiple times), unless the buffer_lifetime_ordinal
- // has moved on. A stream change doesn't change which packets are busy
- // with the client vs. free with the server. See "packet lifetime" in
- // stream_processor.md for more.
- //
- // The relevant buffer is always the one specified in the packet's buffer_index field.
- //
- // For low-level buffer types that support it, a StreamProcessor is free to
- // emit an output packet before the low-level buffer actually has any
- // usable data in the buffer, with the mechanism for signalling the
- // presence of data separate from the OnOutputPacket() message. For such
- // low-level buffer types, downstream consumers of data from the emitted
- // packet must participate in the low-level buffer signalling mechanism to
- // know when it's safe to consume the data. This is most likely to be
- // relevant when using a video decoder and gralloc-style buffers.
- //
- // The error_ bool(s) allow (but do not require) a StreamProcessor server
- // to report errors that happen during an AU or between AUs.
- //
- // The scope of error_detected_before starts at the end of the last
- // delivered output packet on this stream, or the start of stream if there
- // were no previous output packets on this stream. The scope ends at the
- // start of the output_packet.
- //
- // The error_detected_before bool is separate so that discontinuities can be
- // indicated separately from whether the current packet is damaged.
- //
- // The scope of error_detected_during is from the start to the end of this
- // output_packet.
+ /// This is how the stream processor emits an output packet to the stream
+ /// processor client.
+ ///
+ /// Order is significant.
+ ///
+ /// The client should eventually call RecycleOutputPacket() (possibly after
+ /// switching streams multiple times), unless the buffer_lifetime_ordinal
+ /// has moved on. A stream change doesn't change which packets are busy
+ /// with the client vs. free with the server.
+ ///
+ /// The relevant buffer is always the one specified in the packet's buffer_index field.
+ ///
+ /// For low-level buffer types that support it, a StreamProcessor is free to
+ /// emit an output packet before the low-level buffer actually has any
+ /// usable data in the buffer, with the mechanism for signalling the
+ /// presence of data separate from the OnOutputPacket() message. For such
+ /// low-level buffer types, downstream consumers of data from the emitted
+ /// packet must participate in the low-level buffer signalling mechanism to
+ /// know when it's safe to consume the data. This is most likely to be
+ /// relevant when using a video decoder and gralloc-style buffers.
+ ///
+ /// The error_ bool(s) allow (but do not require) a StreamProcessor server
+ /// to report errors that happen during an AU or between AUs.
+ ///
+ /// The scope of error_detected_before starts at the end of the last
+ /// delivered output packet on this stream, or the start of stream if there
+ /// were no previous output packets on this stream. The scope ends at the
+ /// start of the output_packet.
+ ///
+ /// The error_detected_before bool is separate so that discontinuities can be
+ /// indicated separately from whether the current packet is damaged.
+ ///
+ /// The scope of error_detected_during is from the start to the end of this
+ /// output_packet.
-> OnOutputPacket(
Packet output_packet,
bool error_detected_before,
bool error_detected_during);
- // RecycleOutputPacket()
- //
- // After the client is done with an output packet, the client needs to tell
- // the stream processor that the output packet can be re-used for more
- // output, via this method.
- //
- // It's not permitted to recycle an output packet that's already free with
- // the stream processor server. It's permitted but discouraged for a
- // client to recycle an output packet that has been deallocated by an
- // explicit or implicit output buffer de-configuration(). See
- // buffer_lifetime_ordinal for more on that. A server must ignore any such
- // stale RecycleOutputPacket() calls.
- //
- // For more on RecycleOutputPacket(), see stream_processor.md.
+ /// After the client is done with an output packet, the client needs to tell
+ /// the stream processor that the output packet can be re-used for more
+ /// output, via this method.
+ ///
+ /// It's not permitted to recycle an output packet that's already free with
+ /// the stream processor server. It's permitted but discouraged for a
+ /// client to recycle an output packet that has been deallocated by an
+ /// explicit or implicit output buffer de-configuration(). See
+ /// buffer_lifetime_ordinal for more on that. A server must ignore any such
+ /// stale RecycleOutputPacket() calls.
RecycleOutputPacket(PacketHeader available_output_packet);
- // OnOutputEndOfStream()
- //
- // After QueueInputEndOfStream() is sent by the StreamProcessor client,
- // within a reasonable duration the corresponding OnOutputEndOfStream()
- // will be sent by the StreamProcessor server. Similar to
- // QueueInputEndOfStream(), OnOutputEndOfStream() is sent a maximum of once
- // per stream.
- //
- // No more stream data for this stream will be sent after this message. All
- // input data for this stream was processed.
- //
- // While a StreamProcessor client is not required to
- // QueueInputEndOfStream() (unless the client wants to use
- // FlushEndOfStreamAndCloseStream()), if a StreamProcessor server receives
- // QueueInputEndOfStream(), and the client hasn't closed the stream, the
- // StreamProcessor server must generate a corresponding
- // OnOutputEndOfStream() if nothing went wrong, or must send
- // OnStreamFailed(), or must close the server end of the StreamProcessor
- // channel. An ideal StreamProcessor server would handle and report stream
- // errors via the error_ flags and complete stream processing without
- // sending OnStreamFailed(), but in any case, the above-listed options are
- // the only ways that an OnOutputEndOfStream() won't happen after
- // QueueInputEndOfStream().
- //
- // There will be no more OnOutputPacket() or OnOutputConstraints() messages
- // for this stream_lifetime_ordinal after this message - if a server doesn't
- // follow this rule, a client should close the StreamProcessor channel.
- //
- // The error_detected_before bool has the same semantics as the
- // error_detected_before bool in OnOutputPacket().
+ /// After QueueInputEndOfStream() is sent by the StreamProcessor client,
+ /// within a reasonable duration the corresponding OnOutputEndOfStream()
+ /// will be sent by the StreamProcessor server. Similar to
+ /// QueueInputEndOfStream(), OnOutputEndOfStream() is sent a maximum of once
+ /// per stream.
+ ///
+ /// No more stream data for this stream will be sent after this message. All
+ /// input data for this stream was processed.
+ ///
+ /// While a StreamProcessor client is not required to
+ /// QueueInputEndOfStream() (unless the client wants to use
+ /// FlushEndOfStreamAndCloseStream()), if a StreamProcessor server receives
+ /// QueueInputEndOfStream(), and the client hasn't closed the stream, the
+ /// StreamProcessor server must generate a corresponding
+ /// OnOutputEndOfStream() if nothing went wrong, or must send
+ /// OnStreamFailed(), or must close the server end of the StreamProcessor
+ /// channel. An ideal StreamProcessor server would handle and report stream
+ /// errors via the error_ flags and complete stream processing without
+ /// sending OnStreamFailed(), but in any case, the above-listed options are
+ /// the only ways that an OnOutputEndOfStream() won't happen after
+ /// QueueInputEndOfStream().
+ ///
+ /// There will be no more OnOutputPacket() or OnOutputConstraints() messages
+ /// for this stream_lifetime_ordinal after this message - if a server doesn't
+ /// follow this rule, a client should close the StreamProcessor channel.
+ ///
+ /// The error_detected_before bool has the same semantics as the
+ /// error_detected_before bool in OnOutputPacket().
-> OnOutputEndOfStream(
uint64 stream_lifetime_ordinal,
bool error_detected_before);
- //
- // Stream specific messages:
- //
-
- // QueueInputFormatDetails()
- //
// TODO(dustingreen): Rename from QueueInputFormatDetails() to
// QueueInputFormat().
//
- // If the input format details are still the same as specified during
- // StreamProcessor creation, this message is unnecessary and does not need
- // to be sent.
- //
- // If the stream doesn't exist yet, this message creates the stream.
- //
- // The server won't send OnOutputConstraints() until after the client has
- // sent at least one QueueInput* message.
- //
- // All servers must permit QueueInputFormatDetails() at the start of a
- // stream without failing, as long as the new format is supported by the
- // StreamProcessor instance. Technically this allows for a server to only
- // support the exact input format set during StreamProcessor creation, and
- // that is by design. A client that tries to switch formats and gets a
- // StreamProcessor channel failure should try again one more time with a
- // fresh StreamProcessor instance created with CodecFactory using the new
- // input format during creation, before giving up.
- //
- // These format details override the format details specified during stream
- // processor creation for this stream only. The next stream will default
- // back to the format details set during stream processor creation.
- //
- // This message is permitted at the start of the first stream (just like at
- // the start of any stream). The format specified need not match what was
- // specified during stream processor creation, but if it doesn't match, the
- // StreamProcessor channel might close as described above.
+ /// If the input format details are still the same as specified during
+ /// StreamProcessor creation, this message is unnecessary and does not need
+ /// to be sent.
+ ///
+ /// If the stream doesn't exist yet, this message creates the stream.
+ ///
+ /// The server won't send OnOutputConstraints() until after the client has
+ /// sent at least one QueueInput* message.
+ ///
+ /// All servers must permit QueueInputFormatDetails() at the start of a
+ /// stream without failing, as long as the new format is supported by the
+ /// StreamProcessor instance. Technically this allows for a server to only
+ /// support the exact input format set during StreamProcessor creation, and
+ /// that is by design. A client that tries to switch formats and gets a
+ /// StreamProcessor channel failure should try again one more time with a
+ /// fresh StreamProcessor instance created with CodecFactory using the new
+ /// input format during creation, before giving up.
+ ///
+ /// These format details override the format details specified during stream
+ /// processor creation for this stream only. The next stream will default
+ /// back to the format details set during stream processor creation.
+ ///
+ /// This message is permitted at the start of the first stream (just like at
+ /// the start of any stream). The format specified need not match what was
+ /// specified during stream processor creation, but if it doesn't match, the
+ /// StreamProcessor channel might close as described above.
QueueInputFormatDetails(
uint64 stream_lifetime_ordinal, FormatDetails format_details);
- // QueueInputPacket()
- //
- // This message queues input data to the stream processor for processing.
- //
- // If the stream doesn't exist yet, this message creates the new stream.
- //
- // The server won't send OnOutputConstraints() until after the client has
- // sent at least one QueueInput* message.
- //
- // The client must continue to deliver input data via this message even if
- // the stream processor has not yet generated the first OnOutputConstraints(),
- // and even if the StreamProcessor is generating OnFreeInputPacket() for
- // previously-queued input packets. The input data must continue as long
- // as there are free packets to be assured that the server will ever
- // generate the first OnOutputConstraints().
- //
- // For more on QueueInputPacket(), see stream_processor.md.
+ /// This message queues input data to the stream processor for processing.
+ ///
+ /// If the stream doesn't exist yet, this message creates the new stream.
+ ///
+ /// The server won't send OnOutputConstraints() until after the client has
+ /// sent at least one QueueInput* message.
+ ///
+ /// The client must continue to deliver input data via this message even if
+ /// the stream processor has not yet generated the first OnOutputConstraints(),
+ /// and even if the StreamProcessor is generating OnFreeInputPacket() for
+ /// previously-queued input packets. The input data must continue as long
+ /// as there are free packets to be assured that the server will ever
+ /// generate the first OnOutputConstraints().
QueueInputPacket(Packet packet);
- // OnFreeInputPacket()
- //
- // The server sends this message when the stream processor is done
- // consuming this packet and the packet can be re-filled by the client.
- //
- // This is not sent for all packets when a new buffer_lifetime_ordinal
- // starts as in that case all the packets are initially free with the
- // client.
- //
- // See comments on QueueInputBuffer() and "packet lifetime" in
- // stream_processor.md for for description of buffer lifetime and packet
- // lifetime.
- //
- // After receiving the available input buffer via this event, the stream
- // processor client can call later call QueueInputBuffer with appropriate
- // offset and length set.
+ /// The server sends this message when the stream processor is done
+ /// consuming this packet and the packet can be re-filled by the client.
+ ///
+ /// This is not sent for all packets when a new buffer_lifetime_ordinal
+ /// starts as in that case all the packets are initially free with the
+ /// client.
+ ///
+ /// After receiving the available input buffer via this event, the stream
+ /// processor client can call later call QueueInputBuffer with appropriate
+ /// offset and length set.
//
// TODO(dustingreen): At the moment, there is no guarantee re. the order of
// these messages with respect to the order of QueueInputPacket(), but at
@@ -1651,41 +1505,41 @@
// make sense. For video encoders probably not.
-> OnFreeInputPacket(PacketHeader free_input_packet);
- // Inform the server that all QueueInputPacket() messages for this stream
- // have been sent.
- //
- // If the stream isn't closed first (by the client, or by OnStreamFailed(),
- // or StreamProcessor channel closing), there will later be a corresponding
- // OnOutputEndOfStream().
- //
- // The corresponding OnOutputEndOfStream() message will be generated only if
- // the server finishes processing the stream before the server sees the
- // client close the stream (such as by starting a new stream). A way to
- // force the server to finish the stream before closing is to use
- // FlushEndOfStreamAndCloseStream() after QueueInputEndOfStream() before any
- // new stream. Another way to force the server to finish the stream before
- // closing is to wait for the OnOutputEndOfStream() before taking any action
- // that closes the stream.
- //
- // In addition to serving as an "EndOfStream" marker to make it obvious
- // client-side when all input data has been processed, if a client never
- // sends QueueInputEndOfStream(), no amount of waiting will necessarily
- // result in all input data getting processed through to the output. Some
- // stream processors have some internally-delayed data which only gets
- // pushed through by additional input data _or_ by this EndOfStream marker.
- // In that sense, this message can be viewed as a flush-through at
- // InputData domain level, but the flush-through only takes effect if the
- // stream processor even gets that far before the stream is just closed at
- // StreamControl domain level. This message is not alone sufficient to act
- // as an overall flush-through at StreamControl level. For that, send this
- // message first and then send FlushEndOfStreamAndCloseStream() (at which
- // point it becomes possible to queue input data for a new stream without
- // causing discard of this older stream's data), or wait for the
- // OnOutputEndOfStream() before closing the current stream.
- //
- // If a client sends QueueInputPacket(), QueueInputFormatDetails(),
- // QueueInputEndOfStream() for this stream after the first
- // QueueInputEndOfStream() for this stream, a server should close the
- // StreamProcessor channel.
+ /// Inform the server that all QueueInputPacket() messages for this stream
+ /// have been sent.
+ ///
+ /// If the stream isn't closed first (by the client, or by OnStreamFailed(),
+ /// or StreamProcessor channel closing), there will later be a corresponding
+ /// OnOutputEndOfStream().
+ ///
+ /// The corresponding OnOutputEndOfStream() message will be generated only if
+ /// the server finishes processing the stream before the server sees the
+ /// client close the stream (such as by starting a new stream). A way to
+ /// force the server to finish the stream before closing is to use
+ /// FlushEndOfStreamAndCloseStream() after QueueInputEndOfStream() before any
+ /// new stream. Another way to force the server to finish the stream before
+ /// closing is to wait for the OnOutputEndOfStream() before taking any action
+ /// that closes the stream.
+ ///
+ /// In addition to serving as an "EndOfStream" marker to make it obvious
+ /// client-side when all input data has been processed, if a client never
+ /// sends QueueInputEndOfStream(), no amount of waiting will necessarily
+ /// result in all input data getting processed through to the output. Some
+ /// stream processors have some internally-delayed data which only gets
+ /// pushed through by additional input data _or_ by this EndOfStream marker.
+ /// In that sense, this message can be viewed as a flush-through at
+ /// InputData domain level, but the flush-through only takes effect if the
+ /// stream processor even gets that far before the stream is just closed at
+ /// StreamControl domain level. This message is not alone sufficient to act
+ /// as an overall flush-through at StreamControl level. For that, send this
+ /// message first and then send FlushEndOfStreamAndCloseStream() (at which
+ /// point it becomes possible to queue input data for a new stream without
+ /// causing discard of this older stream's data), or wait for the
+ /// OnOutputEndOfStream() before closing the current stream.
+ ///
+ /// If a client sends QueueInputPacket(), QueueInputFormatDetails(),
+ /// QueueInputEndOfStream() for this stream after the first
+ /// QueueInputEndOfStream() for this stream, a server should close the
+ /// StreamProcessor channel.
QueueInputEndOfStream(uint64 stream_lifetime_ordinal);
};