pub struct X11Pipeline { /* private fields */ }Expand description
Everything the X11 host-ARGB path has to remember between frames.
Unlike the Wayland backend, X11 capture has no compositor to report what changed, so this
context exists to hold the state that stands in for that missing damage signal: the per-stripe
hashes and the persistent encoder session that let process() discover damage by comparing
content frame-to-frame. A full-frame encoder runs through decide_hw_fullframe; the striped
software path (JPEG, striped or full-frame software H.264) runs through encode_cpu with
hash_damage=true.
Recording fan-out (socket sink and MP4 recorder) is handled at the delivery layer; a
consumer needing a keyframe goes through X11Pipeline::request_idr like everyone else.
Implementations§
Source§impl X11Pipeline
impl X11Pipeline
Sourcepub fn new(settings: RustCaptureSettings) -> Self
pub fn new(settings: RustCaptureSettings) -> Self
Build the context, choosing the full-frame encoder for the X11 host-BGRA path through
the shared ladder (select_frame_encoder): the hardware backend the encode node’s driver
selects, then the codec’s software encoder, or the striped software path for JPEG and
H.264. A codec no backend serves falls through to the video codecs the host does serve,
JPEG last.
Sourcepub fn request_idr(&mut self)
pub fn request_idr(&mut self)
Request an on-demand keyframe on the next processed frame.
Sourcepub fn take_report(&mut self, report: ReferenceReport)
pub fn take_report(&mut self, report: ReferenceReport)
Apply what the consumers say of a frame (FrameEncoder::take_report): a loss leaves it and
every frame after it out of the predictions, a key frame where the encoder cannot.
Sourcepub fn encoder_name(&self) -> String
pub fn encoder_name(&self) -> String
The encoder’s name for the stream log: the hardware backend, the software library of a
full-frame session, or CPU with the library of the striped software path.
Sourcepub fn is_hardware(&self) -> bool
pub fn is_hardware(&self) -> bool
Whether the pipeline encodes on a GPU.
Sourcepub fn fixed_rate_control(&self) -> Option<&'static str>
pub fn fixed_rate_control(&self) -> Option<&'static str>
The encoder’s one rate control where its backend has one alone
(FrameEncoder::fixed_rate_control), for this pipeline’s stream log.
Sourcepub fn holds_quantizer(&self) -> bool
pub fn holds_quantizer(&self) -> bool
Whether the encoder holds a cleanup at the quantizer asked for
(FrameEncoder::holds_quantizer, software::stripes_hold_quantizer), for this
pipeline’s stream log.
Sourcepub fn colorspace_desc(&self) -> &'static str
pub fn colorspace_desc(&self) -> &'static str
The Colorspace: field for this pipeline’s stream log, describing what its encoder settled
on: a hardware session only reaches 4:4:4 when the device carries it, the software path
only when the build’s encoder for the codec does.
Sourcepub fn reshape(
&mut self,
settings: &RustCaptureSettings,
size_changed: bool,
) -> bool
pub fn reshape( &mut self, settings: &RustCaptureSettings, size_changed: bool, ) -> bool
Adapt the live pipeline to recreated capture surfaces without rebuilding it.
§Arguments
settings- New geometry plus current live rates.size_changed- Whether the capture dimensions changed.
§Returns
true if the pipeline was successfully adapted in place; false when the active encoder
cannot follow (VAAPI on resize) and the caller must rebuild.
Sourcepub fn update_rate(&mut self, bitrate_kbps: i32, vbv_multiplier: f64, fps: f64)
pub fn update_rate(&mut self, bitrate_kbps: i32, vbv_multiplier: f64, fps: f64)
Apply a runtime rate-control / framerate change: the CBR target bitrate + VBV (kbps /
kb; ignored unless CBR is active) and the target fps. NVENC and libvpx reconfigure their
live session, as x265 does unless the frame rate moved; x265 then re-opens, as kvazaar
and SVT-AV1 always do; a VA-API session starts a new sequence; the striped software path
picks the new values up on the next process() (encode_cpu reads the updated settings
and reconfigures each stripe’s encoder).
Sourcepub fn update_tunables(&mut self, t: &LiveTunables)
pub fn update_tunables(&mut self, t: &LiveTunables)
Apply live per-frame tunables (quality, paint-over, streaming mode, keyframe cadence); every encoder re-reads them from the settings on the next process().
Sourcepub fn process(&mut self, argb: &[u8], stride: usize) -> Vec<EncodedStripe>
pub fn process(&mut self, argb: &[u8], stride: usize) -> Vec<EncodedStripe>
Encode one host-ARGB frame and return the encoded stripes.
Damage is read from the content hash (hash_bands). Without Turbo the hash decides whether
a frame (or a stripe) is sent, so it runs first. Turbo sends every video frame, and only
its cleanup reads the damage, so there the frame’s hash runs beside its encode
(hash_beside) and the cleanup reads the frame before’s (turbo_dirty; the striped path
as the rows it maps onto its stripes): the hash, a millisecond and a half at 1080p and six
at 4K, stays off the path to the client. A frame the cleanup codes at its own quality is
hashed before its encode instead, so a change landing on it is coded at the session’s.
With the paint-over off nothing reads it, and Turbo hashes nothing.
§Arguments
argb- Packed BGRA pixel buffer (B,G,R,A byte order,stridebytes per row).stride- Bytes per row (must equalwidth * 4for the software path).
§Returns
Vec of EncodedStripe — empty when nothing changed.
Auto Trait Implementations§
impl !Sync for X11Pipeline
impl Freeze for X11Pipeline
impl RefUnwindSafe for X11Pipeline
impl Send for X11Pipeline
impl Unpin for X11Pipeline
impl UnsafeUnpin for X11Pipeline
impl UnwindSafe for X11Pipeline
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> 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