pub struct D3d11Upload { /* private fields */ }d3d11 and (crate features d3d11 or d3d12) only.Expand description
Uploads CPU-resident Pixel::NV12 video frames to GPU-resident Video
frames tagged Pixel::D3D11 — the D3D11 sibling of
crate::elements::D3d12Upload, for a pipeline built entirely on one
shared ID3D11Device (see crate::elements::D3d11Renderer’s own
docs on why). Only accepts Pixel::NV12 input — chain a
crate::elements::Scaler (dst_format = Pixel::NV12) in front of
this if the source produces something else.
Unlike D3d12Upload, this does not go through FFmpeg’s
av_hwframe_get_buffer/av_hwframe_transfer_data hwframe-pool
machinery at all — consume creates a plain ID3D11Texture2D directly
via ordinary windows-rs calls (with the CPU pixel data as its initial
contents) every call, then wraps it as a Pixel::D3D11 frame via
wrap_d3d11_texture. See that function’s own docs for why: driving
D3D11VA’s real frames-context init from a hand-mirrored
AVD3D11VAFramesContext* corrupted memory in testing, for a reason not
fully root-caused even against FFmpeg’s real (version-matched) source.
This is plain, well-understood D3D11 API usage instead — no
struct-layout guessing, at the cost of a fresh texture allocation per
frame rather than a pre-sized pool (not pooled/reused across calls the
way D3d12Upload’s GPU textures are, since there’s no
av_hwframe_ctx-managed pool here to reuse from).
width/height are fixed for this element’s lifetime, set once in
D3d11Upload::new — every frame consume receives must match
exactly.
Implementations§
Source§impl D3d11Upload
impl D3d11Upload
Sourcepub fn new(
name: impl Into<String>,
device: &ID3D11Device,
width: u32,
height: u32,
) -> Self
pub fn new( name: impl Into<String>, device: &ID3D11Device, width: u32, height: u32, ) -> Self
device must outlive this element (and, transitively, every frame
it produces that’s still alive downstream), and must be the same
ID3D11Device every other D3D11 element in this pipeline shares —
see crate::elements::D3d11Renderer’s own docs on why.
Trait Implementations§
Source§impl Element for D3d11Upload
impl Element for D3d11Upload
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.Source§impl Sink for D3d11Upload
impl Sink for D3d11Upload
fn consume(&mut self, buf: MediaBuffer) -> Result<()>
Source§fn control(&mut self, msg: ControlMsg) -> Result<()>
fn control(&mut self, msg: ControlMsg) -> Result<()>
ControlMsg (pause/resume/stop) and, for anything
with a downstream of its own, forwards it on — same shape as
consume, just a separate channel from MediaBuffer so it can
reach every element (not just ones that already know how to
interpret a data buffer) and, at a crate::queue::Queue, jump
ahead of whatever data is backed up instead of waiting behind it.
No default: every Sink has to consciously decide what this means
for it, rather than silently dropping it.