Skip to main content

D3d11Upload

Struct D3d11Upload 

Source
pub struct D3d11Upload { /* private fields */ }
Available on Windows and crate feature 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

Source

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

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 Sink for D3d11Upload

Source§

fn consume(&mut self, buf: MediaBuffer) -> Result<()>

Source§

fn control(&mut self, msg: ControlMsg) -> Result<()>

Reacts to a 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.
Source§

impl Source for D3d11Upload

Source§

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

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> Filter for T
where T: Source + Sink,

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