Skip to main content

ResampleSpec

Struct ResampleSpec 

Source
pub struct ResampleSpec { /* private fields */ }
Available on crate feature 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

Source

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.

Source

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.

Source

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.

Source

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).

Source

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.

Source

pub const fn rate(&self) -> u32

Sample rate in Hz.

Source

pub const fn format(&self) -> Sample

Sample format.

Source

pub const fn layout(&self) -> ChannelLayout

Channel layout.

Source

pub fn channels(&self) -> i32

Channel count, from the layout.

Trait Implementations§

Source§

impl Clone for ResampleSpec

Source§

fn clone(&self) -> ResampleSpec

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for ResampleSpec

Source§

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].

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for ResampleSpec

Source§

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.

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more