encoder: Export import_picture to separate trait
diff --git a/src/backend/vaapi/encoder.rs b/src/backend/vaapi/encoder.rs
index b33c307..eb882ac 100644
--- a/src/backend/vaapi/encoder.rs
+++ b/src/backend/vaapi/encoder.rs
@@ -28,6 +28,7 @@
use crate::encoder::stateless::BackendPromise;
use crate::encoder::stateless::StatelessBackendError;
use crate::encoder::stateless::StatelessBackendResult;
+use crate::encoder::stateless::StatelessEncoderBackendImport;
use crate::encoder::stateless::StatelessVideoEncoderBackend;
use crate::encoder::FrameMetadata;
use crate::Fourcc;
@@ -170,18 +171,24 @@
}
}
-impl<M, H> StatelessVideoEncoderBackend<H> for VaapiBackend<M, H>
+impl<M, H> StatelessVideoEncoderBackend for VaapiBackend<M, H>
where
M: SurfaceMemoryDescriptor,
H: std::borrow::Borrow<Surface<M>>,
{
type Picture = H;
+}
+impl<M, Handle> StatelessEncoderBackendImport<Handle, Handle> for VaapiBackend<M, Handle>
+where
+ M: SurfaceMemoryDescriptor,
+ Handle: std::borrow::Borrow<Surface<M>>,
+{
fn import_picture(
&mut self,
_metadata: &FrameMetadata,
- handle: H,
- ) -> StatelessBackendResult<Self::Picture> {
+ handle: Handle,
+ ) -> StatelessBackendResult<Handle> {
Ok(handle)
}
}
diff --git a/src/encoder/stateless.rs b/src/encoder/stateless.rs
index 17b8379..0e2e563 100644
--- a/src/encoder/stateless.rs
+++ b/src/encoder/stateless.rs
@@ -146,22 +146,24 @@
}
/// Generic trait for stateless encoder backends
-pub trait StatelessVideoEncoderBackend<H> {
+pub trait StatelessVideoEncoderBackend {
/// Backend's specific representation of the input frame, transformed with [`import_picture`].
/// Might be a wrapper of the input handle with additional backend specific data or a copy of
/// an input frame in internal backend's representation.
///
- /// [`import_picture`]: StatelessVideoEncoderBackend::import_picture
+ /// [`import_picture`]: StatelessEncoderBackendImport::import_picture
type Picture;
+}
- /// Imports the input handle from client and transforms into [`Picture`]
+pub trait StatelessEncoderBackendImport<Handle, Picture> {
+ /// Imports the input [`Handle`] from client and transforms into [`Picture`]
///
/// [`Picture`]: StatelessVideoEncoderBackend::Picture
fn import_picture(
&mut self,
metadata: &FrameMetadata,
- handle: H,
- ) -> StatelessBackendResult<Self::Picture>;
+ handle: Handle,
+ ) -> StatelessBackendResult<Picture>;
}
/// Stateless video encoder interface.
diff --git a/src/encoder/stateless/h264.rs b/src/encoder/stateless/h264.rs
index beca9e9..eae914e 100644
--- a/src/encoder/stateless/h264.rs
+++ b/src/encoder/stateless/h264.rs
@@ -18,6 +18,7 @@
use crate::encoder::stateless::OutputQueue;
use crate::encoder::stateless::Predictor;
use crate::encoder::stateless::StatelessBackendResult;
+use crate::encoder::stateless::StatelessEncoderBackendImport;
use crate::encoder::stateless::StatelessVideoEncoder;
use crate::encoder::stateless::StatelessVideoEncoderBackend;
use crate::encoder::Bitrate;
@@ -188,7 +189,7 @@
}
/// Trait for stateless encoder backend for H.264
-pub trait StatelessH264EncoderBackend<H>: StatelessVideoEncoderBackend<H> {
+pub trait StatelessH264EncoderBackend: StatelessVideoEncoderBackend {
type Reference;
type CodedPromise: BackendPromise<Output = Vec<u8>>;
type ReconPromise: BackendPromise<Output = Self::Reference>;
@@ -203,7 +204,7 @@
pub struct StatelessEncoder<H, B>
where
- B: StatelessH264EncoderBackend<H>,
+ B: StatelessH264EncoderBackend,
B::Picture: 'static,
B::Reference: 'static,
{
@@ -226,11 +227,13 @@
/// [`StatelessH264EncoderBackend`] instance to delegate [`BackendRequest`] to
backend: B,
+
+ _phantom: std::marker::PhantomData<H>,
}
impl<H, B> StatelessEncoder<H, B>
where
- B: StatelessH264EncoderBackend<H>,
+ B: StatelessH264EncoderBackend,
B::Picture: 'static,
B::Reference: 'static,
{
@@ -246,6 +249,7 @@
coded_queue: Default::default(),
output_queue: OutputQueue::new(mode),
recon_queue: OutputQueue::new(mode),
+ _phantom: Default::default(),
})
}
@@ -295,7 +299,8 @@
impl<H, B> StatelessVideoEncoder<H> for StatelessEncoder<H, B>
where
- B: StatelessH264EncoderBackend<H>,
+ B: StatelessH264EncoderBackend,
+ B: StatelessEncoderBackendImport<H, B::Picture>,
{
fn encode(&mut self, metadata: FrameMetadata, handle: H) -> EncodeResult<()> {
log::trace!(
diff --git a/src/encoder/stateless/h264/vaapi.rs b/src/encoder/stateless/h264/vaapi.rs
index f1c8cc4..137434c 100644
--- a/src/encoder/stateless/h264/vaapi.rs
+++ b/src/encoder/stateless/h264/vaapi.rs
@@ -344,7 +344,7 @@
}
}
-impl<M, H> StatelessH264EncoderBackend<H> for VaapiBackend<M, H>
+impl<M, H> StatelessH264EncoderBackend for VaapiBackend<M, H>
where
M: SurfaceMemoryDescriptor,
H: Borrow<Surface<M>>,
@@ -476,7 +476,7 @@
use crate::encoder::stateless::h264::StatelessEncoder;
use crate::encoder::stateless::simple_encode_loop;
use crate::encoder::stateless::BackendPromise;
- use crate::encoder::stateless::StatelessVideoEncoderBackend;
+ use crate::encoder::stateless::StatelessEncoderBackendImport;
use crate::encoder::FrameMetadata;
use crate::FrameLayout;
use crate::PlaneLayout;