pub struct ResampleSpec { /* private fields */ }resample only.Expand description
One end of a conversion: sample rate, sample format, channel layout.
Spelled in FFmpeg’s own vocabulary because construction is off the
AudioResampler trait and this is the backend that has to be
handed to swr_alloc_set_opts2. [FfmpegResampler] restates the
source spec in the vocabulary a decoded frame carries, so the
mid-stream check compares like with like without the caller ever
seeing two dialects.
Implementations§
Source§impl ResampleSpec
impl ResampleSpec
Sourcepub const fn new(rate: u32, format: Sample, layout: ChannelLayout) -> Self
pub const fn new(rate: u32, format: Sample, layout: ChannelLayout) -> Self
Constructs a spec from its three parts.
Deliberately total and const: a spec is a description, and
describing something swr cannot convert is not itself an error.
[FfmpegResampler::new] is the choke point every construction
route passes through, and it is what refuses a rate, a format or a
channel layout this backend cannot honour — see
[FfmpegResampler::new] for the roster and
ResampleError::UnsupportedLayout for why a layout can be
refused at all.
Sourcepub fn from_ticket(ticket: &CodecTicket) -> Option<Self>
pub fn from_ticket(ticket: &CodecTicket) -> Option<Self>
The spec a track declares, read off the owned codec ticket a
crate::FfmpegDemuxer track row carries
(track.extra().ticket()) — the “source from TrackInfo” path.
Reads the ticket directly rather than rebuilding an
AVCodecParameters to read three fields out of: the seats are
already owned, and a rebuild here would allocate extradata a
resampler has no use for.
Returns None for a non-audio track, for one whose declared
sample format is AV_SAMPLE_FMT_NONE (a codec whose format is
only known once its decoder opens), and for a custom or ambisonic
channel layout — see Self::from_decoder for the first case and
the note on [unspecified_layout] for the last.
Sourcepub fn from_parameters(parameters: &Parameters) -> Option<Self>
pub fn from_parameters(parameters: &Parameters) -> Option<Self>
Self::from_ticket, over a live AVCodecParameters — the road
for a caller holding one straight off stream.parameters().
Returns None in every case Self::from_ticket does, and also
for null-backed parameters: Parameters’ safe constructors hand
one back when FFmpeg’s allocation failed and report nothing, so a
caller can arrive here holding one without ever having been told.
Parameters that were never allocated describe no audio, which
this function already has a word for.
Sourcepub fn from_decoder(decoder: &Audio) -> Option<Self>
pub fn from_decoder(decoder: &Audio) -> Option<Self>
The spec an opened decoder will actually produce — its rate, sample format and channel layout, straight off the codec context.
Reach it through
FfmpegAudioStreamDecoder::inner.
None on a custom or ambisonic layout, and on a context whose
sample format is still unset (a decoder that has not been opened).
Sourcepub fn unspecified_layout(channels: i32) -> ChannelLayout
pub fn unspecified_layout(channels: i32) -> ChannelLayout
A layout that names a channel count and nothing else —
AV_CHANNEL_ORDER_UNSPEC.
Not a degenerate case: a WAV file without a WAVE_FORMAT_EXTENSIBLE
channel mask genuinely declares no layout, and FFmpeg faithfully
reports it as unspecified in the codec parameters, in the codec
context, and on every decoded frame. Substituting a default layout
would make the source spec disagree with the frames it is supposed
to describe, and every send_frame would be refused as a
mid-stream change. swr accepts an unspecified layout at either
end and maps the channels positionally.
Sourcepub const fn layout(&self) -> ChannelLayout
pub const fn layout(&self) -> ChannelLayout
Channel layout.
Trait Implementations§
Source§impl Clone for ResampleSpec
impl Clone for ResampleSpec
Source§fn clone(&self) -> ResampleSpec
fn clone(&self) -> ResampleSpec
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for ResampleSpec
Source§impl Debug for ResampleSpec
Debug that never reads undefined storage.
impl Debug for ResampleSpec
Debug that never reads undefined storage.
The derive delegated to ffmpeg_next::ChannelLayout’s own
formatter, which prints u.mask unconditionally — and for an
UNSPEC order that union is undefined per FFmpeg’s own header, so
merely logging a spec read storage nobody had written. The mask is
printed here only for the orders that define it; see [LayoutArm].
impl Eq for ResampleSpec
Source§impl PartialEq for ResampleSpec
Equality that never asks FFmpeg.
impl PartialEq for ResampleSpec
Equality that never asks FFmpeg.
The derive that stood here was a safe == with a raw pointer
dereference behind it, and it is the worst shape this branch found.
ffmpeg_next::ChannelLayout’s own PartialEq is
av_channel_layout_compare, which walks u.map[i] for a CUSTOM
order — so safe Rust could forge a layout with a positive
nb_channels and a null or dangling map, wrap it in two specs,
write a == b, and have FFmpeg dereference it. No preflight could
dominate that: == is reachable without constructing a resampler at
all, before any of this crate’s code runs.
So the comparison is structural and reads nothing through a pointer:
the raw order first, then the channel count, then — for every
order that describes its channels through the union’s mask arm —
the mask itself, a uint64_t.
§What a CUSTOM order compares as, and why
Pointer identity, never contents. A safe function cannot
establish that a map is as long as the count beside it, which is the
same wall
channel_layout_from_ffmpeg
meets and refuses at; here the answer is the one comparison that
needs no extent — are these the same map? Two custom layouts
describing identical channels through different allocations
therefore compare unequal.
That is conservative in the only direction that matters. The single
product use of layout equality is [check_pair]’s
source == target short-circuit, where “unequal” means the
rematrix check runs rather than being skipped; an answer that was
wrong the other way would skip a check. And the relation is still
an equivalence — reflexive, symmetric, transitive — which is what
Eq requires of it.