fix(security): classify DeepStream as GPU backend and enforce pixel limits (#50755)
Signed-off-by: jperezde <jperezde@redhat.com>
This commit is contained in:
@@ -470,3 +470,31 @@ class TestMergeKwargsGpuBackendPolicy:
|
||||
)
|
||||
assert result.get("backend") != "pynvvideocodec"
|
||||
assert result["video_backend"] == "pynvvideocodec"
|
||||
|
||||
def test_deepstream_requires_gpu(self):
|
||||
assert VIDEO_LOADER_REGISTRY.backend_requires_gpu("deepstream")
|
||||
|
||||
def test_strips_backend_deepstream_when_not_static(self):
|
||||
result = VideoMediaIO.merge_kwargs(
|
||||
default_kwargs=None,
|
||||
runtime_kwargs={"backend": "deepstream"},
|
||||
)
|
||||
assert result.get("backend") != "deepstream"
|
||||
|
||||
def test_preserves_backend_deepstream_when_static(self):
|
||||
result = VideoMediaIO.merge_kwargs(
|
||||
default_kwargs={"backend": "deepstream"},
|
||||
runtime_kwargs={"backend": "deepstream", "num_frames": 8},
|
||||
)
|
||||
assert result["backend"] == "deepstream"
|
||||
assert result["num_frames"] == 8
|
||||
|
||||
def test_strips_pool_size_from_runtime(self):
|
||||
result = VideoMediaIO.merge_kwargs(
|
||||
default_kwargs={"backend": "deepstream"},
|
||||
runtime_kwargs={"backend": "deepstream", "pool_size": 4},
|
||||
)
|
||||
assert "pool_size" not in result
|
||||
|
||||
def test_unknown_backend_not_treated_as_gpu(self):
|
||||
assert not VIDEO_LOADER_REGISTRY.backend_requires_gpu("totally_unknown")
|
||||
|
||||
@@ -35,6 +35,7 @@ class VideoMediaIO(MediaIO[MediaWithBytes[tuple[npt.NDArray, dict[str, Any]]]]):
|
||||
# Decoder GPU memory is reserved from the startup value.
|
||||
runtime_kwargs = dict(runtime_kwargs)
|
||||
runtime_kwargs.pop("hw_decoders", None)
|
||||
runtime_kwargs.pop("pool_size", None)
|
||||
|
||||
# Block request-level selection of GPU video backends that
|
||||
# were not configured (and VRAM-reserved) at startup.
|
||||
|
||||
@@ -92,6 +92,10 @@ class VideoLoaderRegistry(ExtensionManager):
|
||||
|
||||
return self.processor2backend.get(video_processor)
|
||||
|
||||
def register_gpu_codec(self, name: str) -> None:
|
||||
"""Mark a codec name as requiring GPU without registering a loader."""
|
||||
self._requires_gpu[name] = True
|
||||
|
||||
def backend_requires_gpu(self, name: str) -> bool:
|
||||
return self._requires_gpu.get(name, False)
|
||||
|
||||
@@ -208,6 +212,7 @@ class VideoLoader:
|
||||
|
||||
|
||||
VIDEO_LOADER_REGISTRY = VideoLoaderRegistry()
|
||||
VIDEO_LOADER_REGISTRY.register_gpu_codec("deepstream")
|
||||
|
||||
PYNVVIDEOCODEC_VIDEO_BACKEND: Literal["pynvvideocodec"] = "pynvvideocodec"
|
||||
# Per-decoder upper bound reserved for persistent PyNvVideoCodec surfaces.
|
||||
@@ -1136,6 +1141,7 @@ class VideoBackend(
|
||||
from nvidia.deepstream_videodecode import probe_metadata
|
||||
|
||||
total_frames, original_fps, duration, _w, _h, codec = probe_metadata(data)
|
||||
_check_frame_pixel_limit(_w, _h)
|
||||
source = cls._prepare_source(
|
||||
VideoSourceMetadata(
|
||||
total_frames_num=total_frames,
|
||||
|
||||
Reference in New Issue
Block a user