pub struct PacketHeader {
pub buffer_lifetime_ordinal: Option<u64>,
pub packet_index: Option<u32>,
/* private fields */
}Expand description
PacketHeader
When referring to a free packet, we use PacketHeader alone instead of Packet, since while a packet is free it doesn’t really have meaningful offset or length etc.
A populated Packet also has a PacketHeader.
Fields§
§buffer_lifetime_ordinal: Option<u64>This is which buffer configuration lifetime this header is referring to.
See
[fuchsia.mediacodec/StreamBufferPartialSettings.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 output packets, this can be an old buffer_lifetime_ordinal only if EnableOldOutputBuffers was sent by the client. See also RemoveBuffer to determine when it’s safe to stop tracking old output buffers (only relevant to some video bitstream formats such as VP9, and only relevant to decoders). Streams that want to emit old output buffers are rare outside of bitstream format test streams.
packet_index: Option<u32>When using SetInputBufferPartialSettings or
SetOutputBufferPartialSettings to allocate buffers, the valid range of
packet_index is from 0..buffer_count-1, where buffer_count is the
length of [fuchsia.sysmem2/BufferCollectionInfo.buffers], considering
input and output separately.
When using ParticipateInBufferAllocation and AddBuffer to allocate
and add buffers, the valid range of packet_index is unconstrained (any
uint32 value). The client and server must still ensure that
packet_index values aren’t re-used until the other end has indicated
the packet_index value is again available and can be re-used.
The number of concurrently in-flight packet_index values is limited
per port (input vs. output) and buffer_lifetime_ordinal. If a client
never puts the same input buffer in flight using more than one input
packet concurrently, this inherently ensures the client will conform to
this limit. Most clients can safely ignore this limit for output from
the server. The limit is as follows:
- When sending a packet, the sender must ensure that the number of
concurrently in-flight
packet_indexvalues under the port (input or output) andbuffer_lifetime_ordinaldoes not exceed the high-water-mark number of buffers that have concurrently existed from the server’s point of view under thebuffer_lifetime_ordinalso far. When usingSetInputBufferPartialSettings, this is buffer_count as defined above. - When using
AddBuffer, the high-water-mark value is determined slightly differently for input vs. output.- For input, this high-water-mark value is the maximum value so far
under the
buffer_lifetime_ordinalof the total number ofAddBuffermessages regarding thebuffer_lifetime_ordinalminus the total number ofRemoveBuffermessages regarding thebuffer_lifetime_ordinal.- If a client never puts an input buffer in flight more than once
concurrently using multiple different input
packet_indexvalues, then the client will inherently stay under this limit for input.
- If a client never puts an input buffer in flight more than once
concurrently using multiple different input
- For output, this high-water-mark value is the maximum so far under
the
buffer_lifetime_ordinalof the total number ofAddBuffermessages regarding thebuffer_lifetime_ordinalminus the total number of completed buffer removals under thebuffer_lifetime_ordinal. This is without regard to which buffer removals had a correspondingRemoveBuffercompletion.- If a client wishes to (optionally) validate this server
behavior, the client can rely on the server to not complete a
RemoveBufferuntil after completion of buffer removal server-side (else the server is failing to conform toRemoveBuffersemantics or failing to conform to this limit).
- If a client wishes to (optionally) validate this server
behavior, the client can rely on the server to not complete a
- For input, this high-water-mark value is the maximum value so far
under the
For input, the client chooses an available packet_index value
arbitrarily when sending an input packet with QueueInputPacket, and
the client doesn’t re-use the value until the server has sent
OnFreeInputPacket with that packet_index value.
For output, the server chooses an available packet_index value
arbitrarily (among all uint32 values) when sending an output packet with
OnOutputPacket, and doesn’t re-use the value until the client has sent
RecycleOutputPacket with that packet_index value.
Available packet_index values can be queued in arbitrary order.
Both the client and server should validate the packet_index against the known bound (if any; see above) and disconnect if it’s out of bounds.
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 some other packet_index values may be re-used multiple times.
For a given properly-functioning StreamProcessor instance, output packet_index values will be unique among concurrently-outstanding packets.
Servers should validate that a client isn’t double-using a packet and
clients may similarly validate packet_index values from the server.
Trait Implementations§
Source§impl Clone for PacketHeader
impl Clone for PacketHeader
Source§fn clone(&self) -> PacketHeader
fn clone(&self) -> PacketHeader
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PacketHeader
impl Debug for PacketHeader
Source§impl<D> Decode<PacketHeader, D> for PacketHeaderwhere
D: ResourceDialect,
impl<D> Decode<PacketHeader, D> for PacketHeaderwhere
D: ResourceDialect,
Source§fn new_empty() -> PacketHeader
fn new_empty() -> PacketHeader
Self. The specific value does not matter,
since it will be overwritten by decode.Source§impl Default for PacketHeader
impl Default for PacketHeader
Source§fn default() -> PacketHeader
fn default() -> PacketHeader
Source§impl<D> Encode<PacketHeader, D> for &PacketHeaderwhere
D: ResourceDialect,
impl<D> Encode<PacketHeader, D> for &PacketHeaderwhere
D: ResourceDialect,
Source§impl PartialEq for PacketHeader
impl PartialEq for PacketHeader
Source§fn eq(&self, other: &PacketHeader) -> bool
fn eq(&self, other: &PacketHeader) -> bool
self and other values to be equal, and is used by ==.Source§impl TypeMarker for PacketHeader
impl TypeMarker for PacketHeader
Source§type Owned = PacketHeader
type Owned = PacketHeader
Source§fn inline_align(_context: Context) -> usize
fn inline_align(_context: Context) -> usize
Source§fn inline_size(_context: Context) -> usize
fn inline_size(_context: Context) -> usize
inline_align.Source§fn encode_is_copy() -> bool
fn encode_is_copy() -> bool
Self::Owned matches the FIDL wire
format and encoding requires no validation. When true, we can optimize
encoding arrays and vectors of Self::Owned to a single memcpy. Read moreSource§fn decode_is_copy() -> bool
fn decode_is_copy() -> bool
Self::Owned matches the FIDL wire
format and decoding requires no validation. When true, we can optimize
decoding arrays and vectors of Self::Owned to a single memcpy.Source§impl ValueTypeMarker for PacketHeader
impl ValueTypeMarker for PacketHeader
Source§type Borrowed<'a> = &'a PacketHeader
type Borrowed<'a> = &'a PacketHeader
Encode<Self>
type cheaply obtainable from &Self::Owned. There are three cases: Read moreSource§fn borrow(
value: &<PacketHeader as TypeMarker>::Owned,
) -> <PacketHeader as ValueTypeMarker>::Borrowed<'_>
fn borrow( value: &<PacketHeader as TypeMarker>::Owned, ) -> <PacketHeader as ValueTypeMarker>::Borrowed<'_>
&Self::Owned to Self::Borrowed.