pub struct WlCapture {Show 24 fields
pub settings: RustCaptureSettings,
pub callback: Option<Arc<Py<PyAny>>>,
pub video_encoder: Option<GpuEncoder>,
pub vaapi_state: StripeState,
pub recording_sink: Option<Arc<RecordingSink>>,
pub deliver_tx: Option<SyncSender<Vec<EncodedStripe>>>,
pub deliver_join: Option<JoinHandle<()>>,
pub deliver_discard: Option<Arc<AtomicBool>>,
pub pending_hw_delivery: Option<Vec<EncodedStripe>>,
pub pending_hw_damage: bool,
pub encode_pool: Option<Arc<WlFramePool>>,
pub encode_join: Option<JoinHandle<Option<GpuEncoder>>>,
pub encode_controls: Arc<WlEncodeControls>,
pub encode_stats: Arc<WlEncodeStats>,
pub pool_last_render: Vec<u64>,
pub render_seq: u64,
pub pool_content_gen: Vec<u64>,
pub content_gen: u64,
pub frame_counter: u16,
pub pending_force_idr: bool,
pub needs_full_render: bool,
pub last_tick: Option<Instant>,
pub hw_error_streak: u32,
pub hw_rebuilt: bool,
}Expand description
One capture pipeline bound to one output (display id): its settings, encoder set,
frame pools, delivery thread, and per-stream bookkeeping. Exactly one capture may run per
output; all fields mirror the pipeline strategy documented on AppState, instantiated
per display.
Fields§
§settings: RustCaptureSettings§callback: Option<Arc<Py<PyAny>>>The Python frame callback, shared with the delivery thread. Kept here so a
reconfigure the calloop performs on its own (a host that kept a different mode)
can respawn delivery with the same consumer; None for a recorder-owned capture.
video_encoder: Option<GpuEncoder>Zero-copy GPU session (GLES render + same-GPU dmabuf encode), calloop-affine;
None whenever a readback path is active for this display.
vaapi_state: StripeState§recording_sink: Option<Arc<RecordingSink>>§deliver_tx: Option<SyncSender<Vec<EncodedStripe>>>§deliver_join: Option<JoinHandle<()>>§deliver_discard: Option<Arc<AtomicBool>>Raised at teardown so the deliver thread stops calling into Python and only drains: its exit is then bounded by the one in-flight callback.
pending_hw_delivery: Option<Vec<EncodedStripe>>§pending_hw_damage: bool§encode_pool: Option<Arc<WlFramePool>>§encode_join: Option<JoinHandle<Option<GpuEncoder>>>§encode_controls: Arc<WlEncodeControls>§encode_stats: Arc<WlEncodeStats>§pool_last_render: Vec<u64>§render_seq: u64§pool_content_gen: Vec<u64>§content_gen: u64§frame_counter: u16§pending_force_idr: bool§needs_full_render: bool§last_tick: Option<Instant>Last tick this capture actually rendered; paces per-display fps under the one shared render timer (which fires at the fastest active capture’s rate).
hw_error_streak: u32Consecutive zero-copy encode failures; reset by any frame that encodes cleanly.
Reaching HW_ERROR_RECOVERY_THRESHOLD triggers recovery.
hw_rebuilt: boolWhether the zero-copy session has already been rebuilt without a clean frame since. Recovery rebuilds once and demotes to readback on the next streak, so a session that constructs but never encodes cannot loop rebuilding forever.
Implementations§
Source§impl WlCapture
impl WlCapture
Sourcepub fn request_idr(&mut self)
pub fn request_idr(&mut self)
Arm a keyframe on whichever path is live, plus a full render so a static
screen still produces the frame. Exactly ONE flag is set: the pool encode
loop consumes the atomic, every other path consumes pending_force_idr —
setting both would leave one armed forever (the host-mode idle gate polls
them every tick, so a stuck flag disables idle skipping for the session).
Auto Trait Implementations§
impl !RefUnwindSafe for WlCapture
impl !Sync for WlCapture
impl !UnwindSafe for WlCapture
impl Freeze for WlCapture
impl Send for WlCapture
impl Unpin for WlCapture
impl UnsafeUnpin for WlCapture
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>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> 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