Skip to main content

NoopInterceptor

Struct NoopInterceptor 

Source
pub struct NoopInterceptor { /* private fields */ }
Expand description

Decides what becomes of inbound RTCP once the interceptors have had it, and passes everything else through.

§Why this exists

Inbound RTCP is for the interceptors: a receiver report feeds the sender-side statistics, a NACK is answered by the responder, transport-wide feedback drives the bandwidth estimate. Handing it onward by default would give an application a stream of control traffic it did not ask for and cannot act on, mixed in with its media — so by default it stops here.

An application that does read RTCP puts an interceptor of its own in the chain and has it attach Attribute::DeliverToApplication to the packets it wants. That makes delivery a per-packet judgement, made by the one component that knows which packets matter: an SFU forwarding PLIs wants those and not the receiver reports its own chain is already acting on. A chain-wide switch could only offer “all of it or none of it”, and every application that wanted one kind of packet had to take the lot and filter afterwards.

§Where this belongs in the chain

Last, so every interceptor that reads RTCP has already seen it by the time it is dropped. Anywhere else it would starve the ones beyond it — a NACK responder placed after this would never see a NACK. Registry::build appends it for that reason, rather than leaving the position to each caller.

§Why marking is the mechanism, and not re-emitting a copy

Under the nested chain an application could add an interceptor that kept a copy of each RTCP packet and returned it from its own poll_read ahead of delegating inward. That worked because a local poll_read queue was terminal: the copy bypassed everything below and escaped this one.

On the belt it does not. What an interceptor emits from poll_read rejoins the belt behind itself, so it arrives here like any other packet and is dropped like any other packet — the original and the copy, twice over. Since this is always the last interceptor, no position exists from which to forward past it. Marking the packet works precisely because it does not try to get around this one: the packet travels the whole chain as normal, and this reads the mark when it arrives.

§Naming

It was a no-op in the nested chain, where its job was to terminate the recursion and hand packets back. The belt needs no terminator, so all that is left is the one decision it always quietly made.

Implementations§

Source§

impl NoopInterceptor

Source

pub fn new() -> Self

A terminus

Trait Implementations§

Source§

impl Default for NoopInterceptor

Source§

fn default() -> NoopInterceptor

Returns the “default value” for a type. Read more
Source§

impl Interceptor for NoopInterceptor

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 Protocol<TransportMessage<AttributedPacket>, TransportMessage<AttributedPacket>, ()> for NoopInterceptor

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_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 handle_timeout(&mut self, _now: Self::Time) -> Result<(), Self::Error>

Handle a timeout event. Read more
Source§

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

Poll for the next timeout deadline. 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, !>

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.