pub struct SwEncoder { /* private fields */ }Expand description
Encodes Pixel::YUV420P Video frames into Packets via a software
encoder (see VideoCodec) — the mirror image of
crate::elements::SwDecoder’s decode direction. A Filter: receives
via Sink, pushes what it produces into its own (single) src pad.
One frame can turn into zero or one packets per send_frame (B-frame
reordering delays some frames’ packets until later ones arrive, or
until Eos flushes whatever’s left) — consume drains receive_packet
in a loop after every send_frame/send_eof, same shape as
SwDecoder’s own receive_frame drain loop.
Implementations§
Source§impl SwEncoder
impl SwEncoder
Sourcepub fn new(name: impl Into<String>, options: SwEncoderOptions) -> Result<Self>
pub fn new(name: impl Into<String>, options: SwEncoderOptions) -> Result<Self>
Opens the requested software video encoder with the supplied output definition.
Sourcepub fn parameters(&self) -> Parameters
pub fn parameters(&self) -> Parameters
This encoder’s own codec parameters — what you need to construct
a matching crate::elements::SwDecoder to decode the Packets
this produces, or what a crate::elements::FileMuxer track needs
(same pattern crate::elements::SwAudioEncoder::parameters
documents for audio), when there’s no container/demuxer in the loop
to get them from otherwise (e.g. encoding straight into a Tee/RTSP
sink, or decoding straight back out for a round-trip smoke test).
Trait Implementations§
Source§impl Element for SwEncoder
impl Element for SwEncoder
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§fn graph_id(&self) -> Option<ElementId>
fn graph_id(&self) -> Option<ElementId>
ChainBuilder and keep the default None implementation.Source§fn attach_context(&mut self, _context: &Arc<Context>)
fn attach_context(&mut self, _context: &Arc<Context>)
Element::pp_log_mut hands it the pipeline’s
identity: the clock, the playback clock and the bus are the
pipeline’s to give, not the caller’s to choose. Read moreSource§impl Sink for SwEncoder
impl Sink for SwEncoder
Source§fn input_contract(&self) -> InputContract
fn input_contract(&self) -> InputContract
System memory specifically: this encoder reads the frame’s planes on the CPU, so a D3D11 or CUDA frame is not merely the wrong format here, it is unreachable memory.
Source§fn consume(&mut self, buf: MediaBuffer) -> Result<()>
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.Source§fn ready_consume(&mut self) -> bool
fn ready_consume(&mut self) -> bool
Self::consume can make progress now. Read more