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
impl FfmpegDecoderSession
sourcefn queue_event(&mut self, event: DecoderEvent) -> Result<()>
fn queue_event(&mut self, event: DecoderEvent) -> Result<()>
Queue an event for the client to receive.
sourcefn change_resolution(
&mut self,
new_visible_res: (usize, usize)
) -> Result<(), ChangeResolutionError>
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
.
sourcefn try_send_packet(
&mut self,
input_packet: &AvPacket<'static>
) -> Result<bool, TrySendPacketError>
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.
sourcefn try_send_input_job(&mut self) -> Result<bool, TrySendPacketError>
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.
sourcefn try_receive_frame(&mut self) -> Result<bool, TryReceiveFrameError>
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.
sourcefn try_send_frame(&mut self) -> Result<bool, TrySendFrameError>
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.
sourcefn try_decode(&mut self) -> Result<(), TryDecodeError>
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
impl DecoderSession for FfmpegDecoderSession
source§fn set_output_parameters(
&mut self,
buffer_count: usize,
format: Format
) -> Result<(), VideoError>
fn set_output_parameters( &mut self, buffer_count: usize, format: Format ) -> Result<(), VideoError>
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>
fn decode( &mut self, resource_id: u32, timestamp: u64, resource: GuestResourceHandle, offset: u32, bytes_used: u32 ) -> Result<(), VideoError>
offset
..offset
+bytes_used
] of the shared
memory in the input resource
. Read moresource§fn flush(&mut self) -> Result<(), VideoError>
fn flush(&mut self) -> Result<(), VideoError>
source§fn reset(&mut self) -> Result<(), VideoError>
fn reset(&mut self) -> Result<(), VideoError>
source§fn clear_output_buffers(&mut self) -> Result<(), VideoError>
fn clear_output_buffers(&mut self) -> Result<(), VideoError>
use_output_buffer()
and
reuse_output_buffer()
.source§fn event_pipe(&self) -> &dyn AsRawDescriptor
fn event_pipe(&self) -> &dyn AsRawDescriptor
source§fn use_output_buffer(
&mut self,
picture_buffer_id: i32,
resource: GuestResource
) -> Result<(), VideoError>
fn use_output_buffer( &mut self, picture_buffer_id: i32, resource: GuestResource ) -> Result<(), VideoError>
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 moresource§fn reuse_output_buffer(
&mut self,
picture_buffer_id: i32
) -> Result<(), VideoError>
fn reuse_output_buffer( &mut self, picture_buffer_id: i32 ) -> Result<(), VideoError>
use_output_buffer
and that has previously been returned to the decoder
in a PictureReady
event. Read moresource§fn read_event(&mut self) -> Result<DecoderEvent, VideoError>
fn read_event(&mut self) -> Result<DecoderEvent, VideoError>
Auto Trait Implementations§
impl RefUnwindSafe for FfmpegDecoderSession
impl !Send for FfmpegDecoderSession
impl !Sync for FfmpegDecoderSession
impl Unpin for FfmpegDecoderSession
impl UnwindSafe for FfmpegDecoderSession
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.