Skip to main content

CongestionControlInterceptor

Struct CongestionControlInterceptor 

Source
pub struct CongestionControlInterceptor<E: BandwidthEstimator> { /* private fields */ }
Expand description

Records every departing packet, resolves the remote’s feedback against it, and drives a BandwidthEstimator.

§Where this belongs in the chain

Wire-most. It is the only position that sees every byte that leaves: nothing exits the chain except through the interceptors ahead of it in the walk, so a retransmission emitted by the NACK responder and a repair packet emitted by the FEC encoder both arrive here, already paced and already numbered. An estimator reading a history that omits them sees fewer bytes than are on the wire, infers headroom, and raises the target during loss — a positive feedback loop that is hard to spot, because the estimator’s own accounting stays internally consistent throughout.

It also has to be below the pacer, so packet.now is the instant the packet was released rather than the instant the application enqueued it. A pacer can hold a packet for tens of milliseconds; counting that as network delay is exactly the error that makes a delay-based estimate collapse.

§How the estimate gets out

On the read leg, attached to the feedback packet that produced it, as Attribute::TargetBitrateChanged. The pacer sits application-ward of this interceptor, so it sees that packet after this one does and reads the attribute on its way past. That is the only leg the estimate can cross on: on the write leg this interceptor is last, and anything it attached would already have gone by everything that cares.

Implementations§

Source§

impl<E: BandwidthEstimator> CongestionControlInterceptor<E>

Source

pub fn estimator(&self) -> &E

The estimator, for reading its stats.

Source

pub fn outstanding(&self) -> usize

How many sent packets are still awaiting a verdict.

Trait Implementations§

Source§

impl<E: BandwidthEstimator> Interceptor for CongestionControlInterceptor<E>

Source§

fn bind_local_stream(&mut self, info: &StreamInfo)

bind_local_stream lets you modify any outgoing RTP packets. It is called once for per LocalStream. The returned method will be called once per rtp packet.
Source§

fn unbind_local_stream(&mut self, info: &StreamInfo)

unbind_local_stream is called when the Stream is removed. It can be used to clean up any data related to that track.
Source§

fn bind_remote_stream(&mut self, _info: &StreamInfo)

bind_remote_stream lets you modify any incoming RTP packets. It is called once for per RemoteStream. The returned method will be called once per rtp packet.
Source§

fn unbind_remote_stream(&mut self, _info: &StreamInfo)

unbind_remote_stream is called when the Stream is removed. It can be used to clean up any data related to that track.
Source§

impl<E: BandwidthEstimator> Protocol<TransportMessage<AttributedPacket>, TransportMessage<AttributedPacket>, ()> for CongestionControlInterceptor<E>

Source§

fn poll_timeout(&mut self) -> Option<Self::Time>

Whatever the estimator wants, and None when it wants nothing.

This interceptor has no timer of its own: pruning is bounded work that can ride any wake-up, and asking for one on its own account would wake the whole chain on an idle connection.

Source§

type Rout = TransportMessage<AttributedPacket>

Output read message type Read more
Source§

type Wout = TransportMessage<AttributedPacket>

Output write message type Read more
Source§

type Eout = ()

Output event type Read more
Source§

type Error = Error

Error type for protocol operations
Source§

type Time = Instant

Time/Instant type for timeout handling Read more
Source§

fn handle_read(&mut self, msg: TaggedPacket) -> Result<(), Self::Error>

Handle an incoming read message. Read more
Source§

fn poll_read(&mut self) -> Option<Self::Rout>

Poll for a processed read message. Read more
Source§

fn handle_write(&mut self, msg: TaggedPacket) -> Result<(), Self::Error>

Handle an outgoing write message. Read more
Source§

fn poll_write(&mut self) -> Option<Self::Wout>

Poll for a processed write message. Read more
Source§

fn handle_timeout(&mut self, now: Instant) -> Result<(), Self::Error>

Handle a timeout event. Read more
Source§

fn handle_event(&mut self, _evt: Ein) -> Result<(), Self::Error>

Handle a custom event. Read more
Source§

fn poll_event(&mut self) -> Option<Self::Eout>

Poll for a generated event. Read more
Source§

fn close(&mut self) -> Result<(), Self::Error>

Close the protocol. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.