pub struct D3d11Decoder { /* private fields */ }d3d11 and (crate features d3d11 or d3d12) only.Expand description
Decodes one video stream’s Packets into GPU-resident Video frames
via D3D11VA hardware acceleration — the D3D11 sibling of
crate::elements::D3d12vaDecoder, for a pipeline built entirely on
one shared ID3D11Device (see crate::elements::D3d11Renderer’s own
docs on why that means no explicit fence/sync is needed anywhere in
this stack, unlike the D3D12 side). A Filter, same shape as
SwDecoder/D3d12vaDecoder.
Implementations§
Source§impl D3d11Decoder
impl D3d11Decoder
Sourcepub fn new(
name: impl Into<String>,
params: Parameters,
device: &ID3D11Device,
extra_hw_frames: i32,
) -> Result<Self, D3d11vaDecoderError>
pub fn new( name: impl Into<String>, params: Parameters, device: &ID3D11Device, extra_hw_frames: i32, ) -> Result<Self, D3d11vaDecoderError>
device must outlive this decoder (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 this whole
stack requires exactly one shared device/context, not just a
same-adapter one.
extra_hw_frames sets AVCodecContext.extra_hw_frames — how many
additional decode surfaces to allocate beyond what the codec’s own
reference-frame count strictly requires. Unlike
crate::elements::D3d12vaDecoder (no equivalent parameter needed),
D3D11VA’s decode surface pool is a fixed-size texture array,
sized once at av_hwframe_ctx_init() time and never grown — every
decoded frame still alive downstream (sitting in a
crate::queue::Queue, held by a slow renderer, …) keeps one pool
slot occupied, and once the pool runs out, decode itself starts
failing (AVERROR(ENOMEM), “Static surface pool size exceeded” in
the log) instead of just blocking. Pass at least as many extra frames
as the deepest queue/buffer this decoder’s output can pile up in
(e.g. match a downstream ChainBuilder::queue depth) — too few
reproduces exactly that failure under real playback, not just in
theory.
Trait Implementations§
Source§impl Drop for D3d11Decoder
impl Drop for D3d11Decoder
Source§impl Element for D3d11Decoder
impl Element for D3d11Decoder
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 D3d11Decoder
Source§impl Sink for D3d11Decoder
impl Sink for D3d11Decoder
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.