pub struct D3d11VideoCompositor { /* private fields */ }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
impl D3d11VideoCompositor
Sourcepub fn new(
name: impl Into<String>,
device: &ID3D11Device,
context: Arc<Mutex<ID3D11DeviceContext>>,
options: VideoCompositorOptions,
) -> Result<(Self, D3d11VideoCompositorHandle), D3d11VideoCompositorError>
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.
pub fn width(&self) -> u32
pub fn height(&self) -> u32
pub fn frame_rate(&self) -> Rational
pub fn time_base(&self) -> Rational
Trait Implementations§
Source§impl Element for D3d11VideoCompositor
impl Element for D3d11VideoCompositor
Source§fn name(&self) -> Arc<str> ⓘ
fn name(&self) -> Arc<str> ⓘ
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
fn element_type(&self) -> ElementType
ElementType.Source§fn pp_log(&self) -> &PpLog
fn pp_log(&self) -> &PpLog
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
fn pp_log_mut(&mut self) -> &mut PpLog
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.impl Send for D3d11VideoCompositor
Source§impl SourceElement for D3d11VideoCompositor
impl SourceElement for D3d11VideoCompositor
Source§fn run(&mut self, control: &ControlReceiver, bus: &Bus) -> Result<()>
fn run(&mut self, control: &ControlReceiver, bus: &Bus) -> Result<()>
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 moreSource§fn seek(&mut self, _target: Duration) -> Result<Duration>
fn seek(&mut self, _target: Duration) -> Result<Duration>
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