pub enum DeviceResidency {
Host,
Cuda,
Provider(Arc<dyn GpuPipelineProvider>),
}Expand description
Where decoded frames reside after the media bridge.
Controls whether the pipeline tail maps frames to host memory
(default), uses the built-in CUDA path, or delegates to a custom
GpuPipelineProvider.
§Resolution order
The pipeline builder resolves the device residency strategy in this order:
Provider— the provider builds the pipeline tail and bridges frames. No built-in CUDA elements are needed. If the provider fails, pipeline construction returns an error — there is no silent fallback to Host, because the user explicitly selected a specific hardware integration.Cuda— the built-in upstream CUDA path (cudaupload,cudaconvert). Requires thecudacargo feature and GStreamer ≥ 1.20. Falls back toHostwith a warning if the elements are not available.Host— standardvideoconvert → appsinkpath. Frames arrive in CPU-accessible mapped memory.
§Feature gating
Cudarequires thecudacargo feature onnv-media. Without it, requestingCudareturnsMediaError::Unsupported.Providerdoes not require thecudafeature — the provider decides which GStreamer elements to use.
§Hardware extension
To add support for a new hardware backend (e.g., AMD ROCm), implement
GpuPipelineProvider in a new crate
and pass DeviceResidency::Provider(Arc::new(MyProvider::new())).
No changes to the core library are needed.
Variants§
Host
Frames are mapped to CPU-accessible memory (zero-copy GStreamer buffer mapping). This is the standard path.
Cuda
Frames remain on the GPU as CUDA device memory via the built-in
upstream GStreamer CUDA elements (cudaupload, cudaconvert).
Requires the cuda cargo feature. On GStreamer < 1.20 (where the
CUDA elements are unavailable), falls back to Host with a
warning.
Stages access the device pointer via
FrameEnvelope::accelerated_handle::<CudaBufferHandle>().
CPU consumers can still call
FrameEnvelope::require_host_data()
— the materializer downloads device data on first access and
caches the result.
Provider(Arc<dyn GpuPipelineProvider>)
Frames remain on a device managed by the supplied provider.
The provider controls pipeline tail construction and frame
bridging. This variant does not require the cuda cargo
feature — the provider decides which GStreamer elements and
memory model to use.
See GpuPipelineProvider for the
trait contract.
Implementations§
Trait Implementations§
Source§impl Clone for DeviceResidency
impl Clone for DeviceResidency
Source§fn clone(&self) -> DeviceResidency
fn clone(&self) -> DeviceResidency
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for DeviceResidency
impl Debug for DeviceResidency
Source§impl Default for DeviceResidency
impl Default for DeviceResidency
Source§fn default() -> DeviceResidency
fn default() -> DeviceResidency
Auto Trait Implementations§
impl Freeze for DeviceResidency
impl !RefUnwindSafe for DeviceResidency
impl Send for DeviceResidency
impl Sync for DeviceResidency
impl Unpin for DeviceResidency
impl UnsafeUnpin for DeviceResidency
impl !UnwindSafe for DeviceResidency
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more