pub struct ReferenceSlots { /* private fields */ }Expand description
The buffers a VP8 or VP9 encoder predicts from, with the frame each holds and whether a client reported it lost.
Some buffers are spent on anchors older than the last few frames, so a loss up to twelve frames deep still finds a frame older than it. VP8 has three, LAST, GOLDEN, and ALTREF: every frame lands in LAST, and every twelfth in GOLDEN and ALTREF by turns, so one anchor is always twelve to twenty-three frames old. VP9 has eight: the last four frames by turns in the first four, and every fourth frame by turns in the other four, the oldest twelve to fifteen frames back. A frame predicts from the newest buffer whose frame the client still has, the first such buffer when others are as new, and a VP8 frame coded from an anchor rather than LAST refreshes all three, since it is the newest picture both sides hold. The frame ids wrap; the timestamps are the session’s own count of encoded frames and do not, and the recent ones are kept so a lost frame no buffer holds still dates the buffers coded after it.
Implementations§
Source§impl ReferenceSlots
impl ReferenceSlots
Sourcepub fn acknowledge(&mut self, frame_id: u16, held: bool) -> bool
pub fn acknowledge(&mut self, frame_id: u16, held: bool) -> bool
Note that every consumer holds frame_id, or where not held was sent it, as
ReferenceWindow::acknowledge does: the anchor buffer holding the newest frame they all
hold is then pinned, and one they were all sent is kept until they hold it
(PENDING_PERIODS). False for a frame not remembered or from before the key frame.
Whether a frame coded under plan is an anchor on the schedule predicting from a buffer
holding a frame every consumer was sent, so each can decode it (FRAME_ANCHOR). One
predicting past a loss is not flagged: a consumer it reaches takes it as the end of its
run, while a flagged one would wait for room behind the consumer’s queue.
Sourcepub fn has_reference(&self) -> bool
pub fn has_reference(&self) -> bool
Whether a frame not coded as a key frame has a buffer left to predict from.
Sourcepub fn slot(&self, slot: u8) -> Option<(u16, u64, bool)>
pub fn slot(&self, slot: u8) -> Option<(u16, u64, bool)>
What each buffer holds: the frame’s id and timestamp and whether it was reported lost.
Sourcepub fn plan(&self, key: bool) -> SlotPlan
pub fn plan(&self, key: bool) -> SlotPlan
The buffer the next frame predicts from (the newest one the client still has) and the buffers it refreshes; a key frame refreshes all of them and predicts from none.
Sourcepub fn record(&mut self, frame_id: u16, plan: SlotPlan) -> Reference
pub fn record(&mut self, frame_id: u16, plan: SlotPlan) -> Reference
Record the frame just encoded under plan and answer what it predicted from.
Sourcepub fn invalidate(&mut self, frame_id: u16) -> Invalidation
pub fn invalidate(&mut self, frame_id: u16) -> Invalidation
Leave frame_id and every frame encoded after it out of the references.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for ReferenceSlots
impl RefUnwindSafe for ReferenceSlots
impl Send for ReferenceSlots
impl Sync for ReferenceSlots
impl Unpin for ReferenceSlots
impl UnsafeUnpin for ReferenceSlots
impl UnwindSafe for ReferenceSlots
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> NoneValue for Twhere
T: Default,
impl<T> NoneValue for Twhere
T: Default,
type NoneType = T
§fn null_value() -> T
fn null_value() -> T
§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().