pub struct FfmpegDecoderSession {
    event_queue: Arc<SyncEventQueue<DecoderEvent>>,
    codec_jobs: VecDeque<CodecJob>,
    is_flushing: bool,
    state: SessionState,
    current_visible_res: (usize, usize),
    context: AvCodecContext,
    avframe: Option<AvFrame>,
}
Expand description

A decoder session for the ffmpeg backend.

Fields§

§event_queue: Arc<SyncEventQueue<DecoderEvent>>

Queue of events waiting to be read by the client.

§codec_jobs: VecDeque<CodecJob>

FIFO of jobs submitted by the client and waiting to be performed.

§is_flushing: bool

Whether we are currently flushing.

§state: SessionState

Current state of the session.

§current_visible_res: (usize, usize)

Visible size of the decoded frames (width, height).

§context: AvCodecContext

The libav context for this session.

§avframe: Option<AvFrame>

The last frame to have been decoded, waiting to be copied into an output buffer and sent to the client.

Implementations§

source§

impl FfmpegDecoderSession

source

fn queue_event(&mut self, event: DecoderEvent) -> Result<()>

Queue an event for the client to receive.

source

fn change_resolution( &mut self, new_visible_res: (usize, usize) ) -> Result<(), ChangeResolutionError>

Start the resolution change process, buffers will now be of size new_visible_res.

source

fn try_send_packet( &mut self, input_packet: &AvPacket<'static> ) -> Result<bool, TrySendPacketError>

Try to send one input packet to the codec.

Returns true if a packet has successfully been queued, false if it could not be, either because all pending work has already been queued or because the codec could not accept more input at the moment.

source

fn try_send_input_job(&mut self) -> Result<bool, TrySendPacketError>

Try to run the next input job, if any.

Returns true if the next job has been submitted, false if it could not be, either because all pending work has already been queued or because the codec could not accept more input at the moment.

source

fn try_receive_frame(&mut self) -> Result<bool, TryReceiveFrameError>

Try to receive a frame from the codec and store it until we emit the corresponding PictureReady decoder event.

Returns true if a frame was successfully retrieved, or false if no frame was available at the time, a decoded frame is already waiting to be returned to the client, or the decoder needs more input data to proceed further.

source

fn try_send_frame(&mut self) -> Result<bool, TrySendFrameError>

Try to send a pending decoded frame to the client by copying its content into an output buffer.

This can only be done if self.avframe contains a decoded frame, and an output buffer is ready to be written into.

Returns true if a frame has been emitted, false if the conditions were not met for it to happen yet.

source

fn try_decode(&mut self) -> Result<(), TryDecodeError>

Try to progress as much as possible with decoding.

Our pipeline has three stages: send encoded input to libavcodec, receive decoded frames from libavcodec, and copy decoded frames into output buffers sent to the client. This method calls these three stages in a loop for as long as at least one makes progress.

Trait Implementations§

source§

impl DecoderSession for FfmpegDecoderSession

source§

fn set_output_parameters( &mut self, buffer_count: usize, format: Format ) -> Result<(), VideoError>

Tell how many output buffers will be used for this session and which format they will carry. This method must be called after a ProvidePictureBuffers event is emitted, and before the first call to use_output_buffer().
source§

fn decode( &mut self, resource_id: u32, timestamp: u64, resource: GuestResourceHandle, offset: u32, bytes_used: u32 ) -> Result<(), VideoError>

Decode the compressed stream contained in [offset..offset+bytes_used] of the shared memory in the input resource. Read more
source§

fn flush(&mut self) -> Result<(), VideoError>

Flush the decoder device, i.e. finish processing all queued decode requests and emit frames for them. Read more
source§

fn reset(&mut self) -> Result<(), VideoError>

Reset the decoder device, i.e. cancel all pending decoding requests. Read more
source§

fn clear_output_buffers(&mut self) -> Result<(), VideoError>

Immediately release all buffers passed using use_output_buffer() and reuse_output_buffer().
source§

fn event_pipe(&self) -> &dyn AsRawDescriptor

Returns the event pipe on which the availability of events will be signaled. Note that the returned value is borrowed and only valid as long as the session is alive.
source§

fn use_output_buffer( &mut self, picture_buffer_id: i32, resource: GuestResource ) -> Result<(), VideoError>

Ask the device to use resource to store decoded frames according to its layout. picture_buffer_id is the ID of the picture that will be reproduced in PictureReady events using this buffer. Read more
source§

fn reuse_output_buffer( &mut self, picture_buffer_id: i32 ) -> Result<(), VideoError>

Ask the device to reuse an output buffer previously passed to use_output_buffer and that has previously been returned to the decoder in a PictureReady event. Read more
source§

fn read_event(&mut self) -> Result<DecoderEvent, VideoError>

Blocking call to read a single event from the event pipe.

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
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

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, U> TryFrom<U> for T
where U: Into<T>,

§

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

§

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