diff --git a/tests/multimodal/media/test_video.py b/tests/multimodal/media/test_video.py index a5595121b2..d417b07fa9 100644 --- a/tests/multimodal/media/test_video.py +++ b/tests/multimodal/media/test_video.py @@ -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") diff --git a/vllm/multimodal/media/video.py b/vllm/multimodal/media/video.py index 124dcd7f7e..fd7e23293a 100644 --- a/vllm/multimodal/media/video.py +++ b/vllm/multimodal/media/video.py @@ -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. diff --git a/vllm/multimodal/video.py b/vllm/multimodal/video.py index 3e0969f1ad..d45e18d084 100644 --- a/vllm/multimodal/video.py +++ b/vllm/multimodal/video.py @@ -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,