pub struct D3d12vaDecoder { /* private fields */ }d3d12 and (crate features d3d11 or d3d12) only.Expand description
Decodes one video stream’s Packets into GPU-resident Video frames
via D3D12VA hardware acceleration, instead of crate::elements::SwDecoder’s
plain libavcodec software path. A Filter, same shape as SwDecoder.
Frames this produces are still plain MediaBuffer::Video — nothing
downstream needs to change to receive them. Pacer/Tee/
FrameCounter only ever touch .pts() or match the enum variant, so
they work unmodified. Only crate::elements::D3d12Renderer cares:
it checks frame.format() and, for Pixel::D3D12, takes the
zero-copy path via d3d12va_texture instead of reading pixel bytes.
Implementations§
Source§impl D3d12vaDecoder
impl D3d12vaDecoder
Sourcepub fn new(
name: impl Into<String>,
params: Parameters,
device: &ID3D12Device,
) -> Result<Self, D3d12vaDecoderError>
pub fn new( name: impl Into<String>, params: Parameters, device: &ID3D12Device, ) -> Result<Self, D3d12vaDecoderError>
device must outlive this decoder (and, transitively, every frame
it produces that’s still alive downstream) — the D3D12VA hw device
context borrows it without taking its own reference, matching how
FFmpeg’s hwcontext_d3d12va.c doesn’t AddRef a caller-provided
device either. Pass the same ID3D12Device your
crate::elements::D3d12Renderer’s own
crate::elements::D3d12FrameRenderer impl renders with (see
that trait’s own device()) so decoded frames land on the same
device the renderer reads from — required for the zero-copy path
to be valid at all; checked at render time, not just documented,
via D3d12Renderer’s own device-mismatch guard.
Trait Implementations§
Source§impl Drop for D3d12vaDecoder
impl Drop for D3d12vaDecoder
Source§impl Element for D3d12vaDecoder
impl Element for D3d12vaDecoder
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 D3d12vaDecoder
Source§impl Sink for D3d12vaDecoder
impl Sink for D3d12vaDecoder
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.