pub struct SwAudioEncoder { /* private fields */ }Expand description
Encodes Audio frames into Packets via a software encoder (see
AudioCodec) — the audio sibling of
crate::elements::SwEncoder. A Filter: receives via Sink,
pushes what it produces into its own (single) src pad.
Unlike SwEncoder (which requires exactly Pixel::YUV420P in and
errors on anything else), this resamples whatever it’s fed —
building the resampler lazily from the first frame’s own
format/channel_layout/rate, same pattern
crate::elements::AudioMixer’s own InputBuffer::push uses — to
whatever sample_rate/channels SwAudioEncoderOptions asked for,
in whichever Sample::F32 layout (packed or planar) the opened codec
actually reports (queried via the codec’s own capabilities, not
assumed — aac’s native encoder wants planar, but nothing here
hardcodes that). This is what lets a
crate::elements::TestAudioSource/crate::elements::AudioMixer
(both fixed Sample::F32(Packed)) feed this directly with no
separate resampler element in between, the same way SwEncoder
leaning on a fixed Pixel::YUV420P input still needs a
crate::elements::SwScaler in front of it for anything else.
Most audio codecs (aac included) require a fixed number of samples
per send_frame call (encoder.frame_size()) — not whatever size
happened to arrive. Resampled samples are buffered per-channel
(pending) and only handed to the encoder once a full
frame_size-sample chunk is ready; a codec that reports frame_size == 0 (accepts any size) skips the buffering and encodes each
resampled chunk as-is. Eos flushes both the resampler’s own internal
delay line (a few samples of filter latency — see
ffmpeg::software::resampling::Context::flush) and whatever’s left
in pending (as one final, possibly short, frame — allowed for the
last frame only) before flushing the encoder itself.
Implementations§
Source§impl SwAudioEncoder
impl SwAudioEncoder
Sourcepub fn new(
name: impl Into<String>,
options: SwAudioEncoderOptions,
) -> Result<Self>
pub fn new( name: impl Into<String>, options: SwAudioEncoderOptions, ) -> Result<Self>
Opens the requested audio encoder and configures its output definition.
Sourcepub fn parameters(&self) -> Parameters
pub fn parameters(&self) -> Parameters
This encoder’s own codec parameters — what a
crate::elements::FileMuxer track needs, same pattern
crate::elements::SwEncoder::parameters documents for video.
Trait Implementations§
Source§impl Element for SwAudioEncoder
impl Element for SwAudioEncoder
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 moreimpl Send for SwAudioEncoder
Source§impl Sink for SwAudioEncoder
impl Sink for SwAudioEncoder
Source§fn input_contract(&self) -> InputContract
fn input_contract(&self) -> InputContract
The audio mirror of SwEncoder: decoded samples in, encoded packets out.
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