Skip to main content

D3d11VideoCompositor

Struct D3d11VideoCompositor 

Source
pub struct D3d11VideoCompositor { /* private fields */ }
Available on Windows and crate feature d3d11 only.
Expand description

Composites the latest frames from any number of independent GPU-backed input pipelines into one fixed-rate opaque Pixel::D3D11 (BGRA) stream, entirely on the GPU via a D3D11 pixel shader — the D3D11 sibling of crate::elements::VideoCompositor (which does the same job on the CPU via libswscale). Same VideoLayer/video_layer::VideoRect/ video_layer::VideoFit API — a caller’s layer-control code doesn’t change shape when switching between the two.

Every input must already be a Pixel::D3D11 frame (from crate::elements::D3d11Upload, crate::elements::D3d11Decoder, or crate::elements::DxgiCaptureSource’s GPU mode) on the exact same ID3D11Device/shared context this compositor was built with — see D3d11VideoCompositor::new’s own docs on why context specifically must be shared, not just the device.

Like crate::elements::VideoCompositor, this is a SourceElement, not a conventional one-input filter: upstream pipelines terminate at the sinks returned by D3d11VideoCompositorHandle::add_source, while this element’s own pipeline drives output on its independent clock.

Implementations§

Source§

impl D3d11VideoCompositor

Source

pub fn new( name: impl Into<String>, device: &ID3D11Device, context: Arc<Mutex<ID3D11DeviceContext>>, options: VideoCompositorOptions, ) -> Result<(Self, D3d11VideoCompositorHandle), D3d11VideoCompositorError>

device must be the same ID3D11Device every producer feeding this compositor’s inputs uses. context must be the exact same shared Arc<Mutex<ID3D11DeviceContext>> every other context-touching D3D11 consumer in this pipeline uses (e.g. render_common::D3d11GpuContext::context()) — reading a texture via CopySubresourceRegion/Map (crate::elements::D3d11Download) or drawing with it (a window renderer) are both context-level operations, and only funneling every one of them through one shared, mutex-guarded context is what lets this whole stack skip explicit GPU fences once a consumer has submitted its read. Output texture reuse is governed separately by the output frame’s downstream Arc lifetime, because a frame waiting inside a Queue has not submitted that read yet.

Source

pub fn width(&self) -> u32

Source

pub fn height(&self) -> u32

Source

pub fn frame_rate(&self) -> Rational

Source

pub fn time_base(&self) -> Rational

Trait Implementations§

Source§

impl Element for D3d11VideoCompositor

Source§

fn name(&self) -> Arc<str>

Returns a cheap clone (refcount bump, not a deep copy) of this element’s name — crate::bus::BusEvent stores names as Arc<str> for exactly this reason: a hot path like crate::queue::Queue posting BusEvent::Dropped once per overflowed buffer shouldn’t pay for a fresh heap allocation every time it wants to report which element it is.
Source§

fn element_type(&self) -> ElementType

Source§

fn pp_log(&self) -> &PpLog

This element’s identity for crate::bus::Bus::post — same id/name as Element::name, just already wrapped as the crate::pp_log::PpLog its pp_info!/pp_warn!/pp_error! macros need. A stored private field, not built fresh per call, for the same reason name() returns a cheap Arc<str> clone instead of a fresh String — see its own docs.
Source§

fn pp_log_mut(&mut self) -> &mut PpLog

Mutable access to the same field Element::pp_log reads — used by crate::pipeline::ChainBuilder to stamp the owning crate::pipeline::Pipeline’s id onto every element that passes through it, via element_pp_log. Not meant to be called from anywhere else.
Source§

fn graph_id(&self) -> Option<ElementId>

A pre-reserved graph identity for elements that expose dynamic attachment handles. Most elements receive an ID from ChainBuilder and keep the default None implementation.
Source§

impl Send for D3d11VideoCompositor

Source§

impl Source for D3d11VideoCompositor

Source§

fn src_pads(&mut self) -> &mut [SrcPad]

Source§

impl SourceElement for D3d11VideoCompositor

Source§

fn run(&mut self, control: &ControlReceiver, bus: &Bus) -> Result<()>

Drives this source until Eos (normal completion), crate::pipeline::Pipeline::finish, or Stop (see ControlMsg::Stop) — call crate::control::drain_control once per loop iteration to make control responsive between blocking reads. Read more
Source§

fn seek(&mut self, _target: Duration) -> Result<Duration>

Repositions this source to target, an absolute position from the start of the media (e.g. av_seek_frame for crate::elements::FileDemuxer). Called by crate::control::drain_control as part of handling ControlMsg::Seek, before that message is forwarded to the source’s own pads — so whatever’s read next comes from the new position by the time downstream elements are told to flush for it. 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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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.

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

type Error = Infallible

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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more