pub struct FfmpegEncoderSession {
event_queue: Arc<SyncEventQueue<EncoderEvent>>,
codec_jobs: VecDeque<CodecJob>,
output_queue: VecDeque<(u32, MemoryMappingArena)>,
is_flushing: bool,
context: AvCodecContext,
next_input_buffer_id: u32,
next_output_buffer_id: u32,
}
Fields§
§event_queue: Arc<SyncEventQueue<EncoderEvent>>
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.
output_queue: VecDeque<(u32, MemoryMappingArena)>
Queue of (unfilled) output buffers to fill with upcoming encoder output.
is_flushing: bool
true
if a flush is pending. While a pending flush exist, input buffers are temporarily
held on and not sent to the encoder. An actual flush call will be issued when we run out of
output buffers (to defend against FFmpeg bugs), and we’ll try to receive outputs again
until we receive another code indicating the flush has completed, at which point this
flag will be reset.
context: AvCodecContext
The libav context for this session.
next_input_buffer_id: u32
§next_output_buffer_id: u32
Implementations§
source§impl FfmpegEncoderSession
impl FfmpegEncoderSession
sourcefn try_send_input_job(&mut self) -> Result<bool, VideoError>
fn try_send_input_job(&mut self) -> Result<bool, VideoError>
Try to send one input frame to the codec for encode.
Returns Ok(true)
if the frame was successfully queued, Ok(false)
if the frame was not
queued due to the queue being full or an in-progress flushing, and Err
in case of errors.
sourcefn try_receive_packet(&mut self) -> Result<bool, VideoError>
fn try_receive_packet(&mut self) -> Result<bool, VideoError>
Try to retrieve one encoded packet from the codec, and if success, deliver it to the guest.
Returns Ok(true)
if the packet was successfully retrieved and the guest was signaled,
Ok(false)
if there’s no full packet available right now, and Err
in case of error.
sourcefn try_encode(&mut self) -> Result<(), VideoError>
fn try_encode(&mut self) -> Result<(), VideoError>
Try to progress through the encoding pipeline, either by sending input frames or by retrieving output packets and delivering them to the guest.
Trait Implementations§
source§impl EncoderSession for FfmpegEncoderSession
impl EncoderSession for FfmpegEncoderSession
source§fn encode(
&mut self,
resource: GuestResource,
timestamp: u64,
force_keyframe: bool
) -> Result<u32, VideoError>
fn encode( &mut self, resource: GuestResource, timestamp: u64, force_keyframe: bool ) -> Result<u32, VideoError>
resource
.
force_keyframe
forces the frame to be encoded as a keyframe.
When the buffer has been successfully processed, a ProcessedInputBuffer
event will
be readable from the event pipe, with the same InputBufferId
as returned by this
function.
When the corresponding encoded data is ready, ProcessedOutputBuffer
events will be
readable from the event pipe, with the same timestamp as provided timestamp
.source§fn use_output_buffer(
&mut self,
resource: GuestResourceHandle,
offset: u32,
size: u32
) -> Result<u32, VideoError>
fn use_output_buffer( &mut self, resource: GuestResourceHandle, offset: u32, size: u32 ) -> Result<u32, VideoError>
resource
to store encoded output, where offset
and size
define the
region of memory to use.
When the buffer has been filled with encoded output, a ProcessedOutputBuffer
event will be
readable from the event pipe, with the same OutputBufferId
as returned by this function.source§fn flush(&mut self) -> Result<(), VideoError>
fn flush(&mut self) -> Result<(), VideoError>
EncoderEvent::FlushResponse
event will
be readable from the event pipe.source§fn request_encoding_params_change(
&mut self,
bitrate: Bitrate,
framerate: u32
) -> Result<(), VideoError>
fn request_encoding_params_change( &mut self, bitrate: Bitrate, framerate: u32 ) -> Result<(), VideoError>
bitrate
and framerate
.source§fn event_pipe(&self) -> &dyn AsRawDescriptor
fn event_pipe(&self) -> &dyn AsRawDescriptor
source§fn read_event(&mut self) -> Result<EncoderEvent, VideoError>
fn read_event(&mut self) -> Result<EncoderEvent, VideoError>
event_pipe
is readable.Auto Trait Implementations§
impl RefUnwindSafe for FfmpegEncoderSession
impl !Send for FfmpegEncoderSession
impl !Sync for FfmpegEncoderSession
impl Unpin for FfmpegEncoderSession
impl UnwindSafe for FfmpegEncoderSession
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.