Skip to main content

## Capabilities

# Struct Capabilities

Source

    pub struct Capabilities {
        pub video: bool,
        pub audio_settings: bool,
        pub subtitle_switching: bool,
        pub audio_track_switching: bool,
        pub seeks_transcoded_in_place: bool,
    }

Expand description

What an engine can do, so callers adapt without naming engines.

If a caller ever branches on which engine it holds, this struct is missing something — add it here rather than sniffing. Engine identity leaking into callers is the coupling DR-238 came from.

## Fields§

§ `video: bool`

The engine renders pictures, not only sound.

§ `audio_settings: bool`

Audio settings (EQ, normalisation, gapless) are honoured.

§ `subtitle_switching: bool`

Subtitle tracks can be selected without re-opening.

§ `audio_track_switching: bool`

Audio tracks can be selected without re-opening.

§ `seeks_transcoded_in_place: bool`

A server-side transcode can be seeked without re-opening the stream.

True for hls.js, which seeks within the VOD playlist it is handed and lets the server catch up. False for mpv, whose HLS demuxer cannot make the server transcode from a new offset.

Declared by the engine rather than inferred by the caller. The previous design decided this from `is_hls` and `use_html5` in a command handler — on behalf of engines it did not own — which is how “who renders” came to mean “how do I seek” and why a transcoded seek silently did nothing the moment native video changed the renderer (DR-238).

Re-negotiating a stream needs the repository, which sits above the engine, so the engine states the capability and the caller acts on it.

## Implementations§

Source §

### impl Capabilities

Source

#### pub fn mpv() -> Self

mpv.

Cannot seek a server-side transcode in place: its HLS demuxer will not make the server produce segments from a new offset, so the stream has to be re-opened.

Source

#### pub fn exoplayer() -> Self

ExoPlayer.

Can seek a transcode in place. It is a full HLS client, so like hls.js it seeks within the VOD playlist it was handed and lets the server catch up. Grouping it with mpv as “a native engine” gets this exactly backwards — being native is not the property that matters here, speaking HLS is, and that is the whole reason this is declared per engine rather than inferred from a category.

Source

#### pub fn webview() -> Self

An engine that renders through the webview element, where hls.js seeks within the playlist it was handed.

## Trait Implementations§

Source §

### impl Clone for Capabilities

Source §

#### fn clone(&self) -> Capabilities

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 Debug for Capabilities

Source §

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

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

### impl PartialEq for Capabilities

Source §

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

Tests for `self` and `other` values to be equal, and is used by `==`.
1.0.0 (const: unstable) · Source §

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

Tests for `!=`. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source §

### impl Copy for Capabilities

Source §

### impl Eq for Capabilities

Source §

### impl StructuralPartialEq for Capabilities

## Auto Trait Implementations§

§

### impl Freeze for Capabilities

§

### impl RefUnwindSafe for Capabilities

§

### impl Send for Capabilities

§

### impl Sync for Capabilities

§

### impl Unpin for Capabilities

§

### impl UnsafeUnpin for Capabilities

§

### impl UnwindSafe for Capabilities

## 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<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
§

### impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

#### fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

### impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

#### fn equivalent(&self, key: &K) -> bool

Compare self to `key` and return `true` if they are equal.
§

### impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

#### fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source §

### impl<T> From<T> for T

Source §

#### fn from(t: T) -> T

Returns the argument unchanged.

§

### impl<T> Instrument for T

§

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

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

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

§

### impl<T> PolicyExt for T
where T: ?Sized,

§

#### fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new `Policy` that returns [`Action::Follow`] only if `self` and `other` return `Action::Follow`. Read more
§

#### fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new `Policy` that returns [`Action::Follow`] if either `self` or `other` returns `Action::Follow`. Read more
Source §

### impl<T> Same for T

Source §

#### type Output = T

Should always be `Self`
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 = Infallible

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

#### fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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

### impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

#### fn vzip(self) -> V

§

### impl<T> WithSubscriber for T

§

#### 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
§

#### fn with_current_subscriber(self) -> WithDispatch<Self>

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

### impl<T> UserEvent for T
where T: Debug + Clone + Send + 'static,