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::Scaler 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
pub fn new( name: impl Into<String>, options: SwAudioEncoderOptions, ) -> Result<Self>
Sourcepub fn parameters(&self) -> Parameters
pub fn parameters(&self) -> Parameters
This encoder’s own codec parameters — what a
crate::elements::Mp4Muxer 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.impl Send for SwAudioEncoder
Source§impl Sink for SwAudioEncoder
impl Sink for SwAudioEncoder
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.