Skip to main content

Encoder

Struct Encoder 

Source
pub struct Encoder { /* private fields */ }
Expand description

Video encoder. Build one with Encoder::new, feed it raw Frames via encode, and publish the resulting Encoded access units through a Producer built for the same Codec.

Implementations§

Source§

impl Encoder

Source

pub fn new(config: &Config) -> Result<Self, Error>

Open an encoder for config.

Source

pub fn name(&self) -> &str

The encoder name in use, e.g. "videotoolbox".

Source

pub fn size(&self) -> Size

The resolution this encoder emits, which every frame fed to it must match.

Source

pub fn bitrate(&self) -> u64

The current target bitrate in bits per second: what Config::bitrate resolved to at open, or the last value set_bitrate accepted.

Source

pub fn set_bitrate(&mut self, bitrate: u64) -> Result<(), Error>

Retune the live encoder to bitrate bits per second, taking effect from roughly the next frame. No IDR is forced, so this is cheap enough to drive from a congestion controller: pair it with rate::Control, which decides when the target is worth moving.

Setting the rate the encoder is already at does nothing and succeeds.

§Errors

Returns Error::BitrateUnsupported if this backend can’t retune while running. That’s not fatal: the encoder keeps running at its current rate, so a caller driving a control loop should stop adapting rather than stop encoding.

Source

pub fn codec(&self) -> Codec

The codec this encoder emits. A Producer must be built for the same codec to publish its packets.

Source

pub fn keyframe(&mut self)

Ask for the next frame to be encoded as a keyframe (an IDR), on top of the ones Config::gop already inserts on its own.

Rarely needed: the encoder keys frames automatically, so reach for this only when something outside the encoder needs a decodable starting point at a specific frame. Opening a new group is the usual reason (a subscriber has to be able to start there); resuming after an idle gap is another.

The request waits for the next encode rather than applying at once, so it is safe to call before the frame exists. Calling it repeatedly before a frame arrives asks for one keyframe, not several.

Source

pub fn encode(&mut self, frame: &Frame) -> Result<Vec<Encoded>, Error>

Encode one raw Frame, whether it came from capture, a decoder (the transcode input path), or your own pixels via Surface::rgba.

Returns zero or more encoded access units, each carrying the timestamp of the raw frame it came from: a backend that buffers hands back an earlier frame’s output, so the two don’t always line up.

A GPU surface feeds a hardware encoder on the same device directly (NVDEC -> NVENC never leaves the GPU, a CVPixelBuffer goes straight to VideoToolbox); anything else falls back to a CPU I420 upload. The frame must already be at the encoder’s resolution: decode with decode::Config::resize, or scale first with Frame::resize.

Source

pub fn flush(&mut self) -> Result<Vec<Encoded>, Error>

Return every access unit the codec is still holding, leaving the encoder ready for the frames that follow. Each keeps the timestamp of the raw frame it was encoded from, so a drained tail stays in step with what came before it.

Reach for this at a boundary the output has to respect, which for a live broadcast is a group: a hardware codec that pipelines holds the last frames of a group past its end, and they would otherwise be published into the next group ahead of its keyframe, where a consumer joining there cannot decode them. Publishing frame-by-frame with no group structure needs none of this.

Not free: emptying the pipeline gives up the overlap between one frame’s encode and the next frame’s submission, so flush at boundaries rather than per frame.

Source

pub fn finish(self) -> Result<Vec<Encoded>, Error>

Flush the encoder, returning any buffered frames. Each keeps the timestamp of the raw frame it was encoded from, so a drained tail stays in step with what was published before it.

Consumes the encoder: nothing can be encoded after a flush, so this is the last call rather than one leaving a drained encoder in your hands.

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<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> MaybeSend for T
where T: Send,

Source§

impl<T> MaybeSend for T
where T: Send,

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