From fe25772aa97beb8bcb07ea49e06a2892b521a7ed Mon Sep 17 00:00:00 2001 From: Canlin Guo Date: Thu, 20 Nov 2025 12:38:12 +0800 Subject: [PATCH] [Bugfix] Handle broken frames in video loading (#29001) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: gcanlin Signed-off-by: 凌葭 Co-authored-by: 凌葭 --- tests/multimodal/assets/corrupted.mp4 | Bin 0 -> 91678 bytes tests/multimodal/test_video.py | 37 ++++++++ vllm/multimodal/video.py | 118 ++++++++++++++++---------- 3 files changed, 112 insertions(+), 43 deletions(-) create mode 100644 tests/multimodal/assets/corrupted.mp4 diff --git a/tests/multimodal/assets/corrupted.mp4 b/tests/multimodal/assets/corrupted.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c355bb932ceeeae13cc2d0a4752dcdf8c5136720 GIT binary patch literal 91678 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 PURJL-Sb14F*xCOJAC9)u literal 0 HcmV?d00001 diff --git a/tests/multimodal/test_video.py b/tests/multimodal/test_video.py index 6572616769a91..6ed21de368ac3 100644 --- a/tests/multimodal/test_video.py +++ b/tests/multimodal/test_video.py @@ -18,6 +18,7 @@ from .utils import cosine_similarity, create_video_from_image, normalize_image pytestmark = pytest.mark.cpu_test +ASSETS_DIR = Path(__file__).parent / "assets" NUM_FRAMES = 10 FAKE_OUTPUT_1 = np.random.rand(NUM_FRAMES, 1280, 720, 3) FAKE_OUTPUT_2 = np.random.rand(NUM_FRAMES, 1280, 720, 3) @@ -140,3 +141,39 @@ def test_opencv_video_io_colorspace(is_color: bool, fourcc: str, ext: str): ) assert np.sum(np.isnan(sim)) / sim.size < 0.001 assert np.nanmean(sim) > 0.99 + + +def test_video_backend_handles_broken_frames(monkeypatch: pytest.MonkeyPatch): + """ + Regression test for handling videos with broken frames. + This test uses a pre-corrupted video file (assets/corrupted.mp4) that + contains broken/unreadable frames to verify the video loader handles + them gracefully without crashing and returns accurate metadata. + """ + with monkeypatch.context() as m: + m.setenv("VLLM_VIDEO_LOADER_BACKEND", "opencv") + + # Load the pre-corrupted video file that contains broken frames + corrupted_video_path = ASSETS_DIR / "corrupted.mp4" + + with open(corrupted_video_path, "rb") as f: + video_data = f.read() + + loader = VIDEO_LOADER_REGISTRY.load("opencv") + frames, metadata = loader.load_bytes(video_data, num_frames=-1) + + # Verify metadata consistency: + # frames_indices must match actual loaded frames + assert frames.shape[0] == len(metadata["frames_indices"]), ( + f"Frames array size must equal frames_indices length. " + f"Got {frames.shape[0]} frames but " + f"{len(metadata['frames_indices'])} indices" + ) + + # Verify that broken frames were skipped: + # loaded frames should be less than total + assert frames.shape[0] < metadata["total_num_frames"], ( + f"Should load fewer frames than total due to broken frames. " + f"Expected fewer than {metadata['total_num_frames']} frames, " + f"but loaded {frames.shape[0]} frames" + ) diff --git a/vllm/multimodal/video.py b/vllm/multimodal/video.py index 369c5e6cb4d10..5c75bee54dd30 100644 --- a/vllm/multimodal/video.py +++ b/vllm/multimodal/video.py @@ -63,6 +63,63 @@ class VideoLoader: ) -> tuple[npt.NDArray, dict[str, Any]]: raise NotImplementedError + @staticmethod + def _read_frames( + cap, + frame_indices: set[int], + num_expected_frames: int, + max_frame_idx: int, + ) -> tuple[npt.NDArray, int, list[int]]: + import cv2 + + width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) + frames = np.empty((num_expected_frames, height, width, 3), dtype=np.uint8) + + i = 0 + valid_frame_indices = [] + for idx in range(max_frame_idx + 1): + ok = cap.grab() + if not ok: + # Frame is broken/unreadable, log warning + if idx in frame_indices: + logger.warning( + "Failed to grab frame %d during video loading. " + "This frame will be skipped.", + idx, + ) + continue + if idx in frame_indices: + ret, frame = cap.retrieve() + if ret: + frames[i] = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + valid_frame_indices.append(idx) + i += 1 + else: + # retrieve() failed even though grab() succeeded + logger.warning( + "Failed to retrieve frame %d during video loading. " + "This frame will be skipped.", + idx, + ) + + valid_num_frames = len(valid_frame_indices) + if valid_num_frames < num_expected_frames: + logger.warning( + "Video loading completed with %d broken/unreadable frames. " + "Expected %d frames but only loaded %d frames.", + num_expected_frames - valid_num_frames, + num_expected_frames, + valid_num_frames, + ) + + assert i == valid_num_frames, ( + f"Expected reading {valid_num_frames} frames, " + f"but only loaded {i} frames from video." + ) + + return frames[:valid_num_frames], valid_num_frames, valid_frame_indices + VIDEO_LOADER_REGISTRY = ExtensionManager() @@ -120,24 +177,10 @@ class OpenCVVideoBackend(VideoLoader): ) frame_idx = uniform_sampled_frames.tolist() - width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) - height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) - frames = np.empty((len(frame_idx), height, width, 3), dtype=np.uint8) - - i = 0 - for idx in range(max(frame_idx) + 1): - ok = cap.grab() - if not ok: - break - if idx in frame_idx: - ret, frame = cap.retrieve() - if ret: - frames[i] = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - i += 1 - - assert i == num_frames_to_sample, ( - f"Expected reading {num_frames_to_sample} frames, " - f"but only loaded {i} frames from video." + # Convert to set for O(1) lookup performance + frame_idx_set = set(frame_idx) + frames, valid_num_frames, valid_frame_indices = cls._read_frames( + cap, frame_idx_set, num_frames_to_sample, max(frame_idx) ) # Use transformers transformers.video_utils.VideoMetadata format @@ -148,10 +191,10 @@ class OpenCVVideoBackend(VideoLoader): "fps": original_fps, "duration": duration, "video_backend": "opencv", - "frames_indices": list(frame_idx), + "frames_indices": valid_frame_indices, # extra field used to control hf processor's video # sampling behavior - "do_sample_frames": num_frames_to_sample == total_frames_num, + "do_sample_frames": valid_num_frames == total_frames_num, } return frames, metadata @@ -185,10 +228,10 @@ class OpenCVDynamicVideoBackend(OpenCVVideoBackend): # Refer to: # https://github.com/huggingface/transformers/blob/v4.55.4/src/transformers/models/glm4v/video_processing_glm4v.py#L103-L140 - frame_indices: range | list[int] + frame_indices_list: list[int] if duration <= max_duration: n = int(math.floor(duration * fps)) - frame_indices = sorted( + frame_indices_list = sorted( { min(max_frame_idx, int(math.ceil(i * original_fps / fps))) for i in range(n) @@ -197,34 +240,23 @@ class OpenCVDynamicVideoBackend(OpenCVVideoBackend): else: num_samples = int(max_duration * fps) if num_samples >= total_frames_num: - frame_indices = range(total_frames_num) + frame_indices_list = list(range(total_frames_num)) else: target_seconds = np.linspace(0, duration, num_samples, endpoint=True) - frame_indices = sorted( + frame_indices_list = sorted( { min(max_frame_idx, int(math.ceil(t * original_fps))) for t in target_seconds } ) - width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) - height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) - frames = np.empty((len(frame_indices), height, width, 3), dtype=np.uint8) - - i = 0 - for idx in range(total_frames_num): - ok = cap.grab() - if not ok: - break - if idx in frame_indices: - ret, frame = cap.retrieve() - if ret: - frames[i] = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - i += 1 - - assert i == len(frame_indices), ( - f"Expected reading {len(frame_indices)} frames, " - f"but only loaded {i} frames from video." + # Convert to set for O(1) lookup performance + frame_indices_set = set(frame_indices_list) + frames, valid_num_frames, valid_frame_indices = cls._read_frames( + cap, + frame_indices_set, + len(frame_indices_list), + total_frames_num - 1, ) # Use transformers transformers.video_utils.VideoMetadata format @@ -233,7 +265,7 @@ class OpenCVDynamicVideoBackend(OpenCVVideoBackend): "fps": original_fps, "duration": duration, "video_backend": "opencv_dynamic", - "frames_indices": list(frame_indices), + "frames_indices": valid_frame_indices, "do_sample_frames": False, }