From 9850f60743bbf4b1e63de60f4579dc62e585941a Mon Sep 17 00:00:00 2001 From: Fanli Lin Date: Wed, 31 Dec 2025 16:56:16 +0800 Subject: [PATCH] [BugFix] Fix video frame extraction in text-to-video and image-to-video examples (#565) Signed-off-by: Lin, Fanli --- .../image_to_video/image_to_video.py | 25 +++++++++++++++++++ .../text_to_video/text_to_video.py | 25 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/examples/offline_inference/image_to_video/image_to_video.py b/examples/offline_inference/image_to_video/image_to_video.py index 09dcbf296..3b1b2e84c 100644 --- a/examples/offline_inference/image_to_video/image_to_video.py +++ b/examples/offline_inference/image_to_video/image_to_video.py @@ -123,6 +123,31 @@ def main(): except ImportError: raise ImportError("diffusers is required for export_to_video.") + # Extract video frames from OmniRequestOutput + if isinstance(frames, list) and len(frames) > 0: + first_item = frames[0] + + # Check if it's an OmniRequestOutput + if hasattr(first_item, "final_output_type"): + if first_item.final_output_type != "image": + raise ValueError( + f"Unexpected output type '{first_item.final_output_type}', expected 'image' for video generation." + ) + + # Pipeline mode: extract from nested request_output + if hasattr(first_item, "is_pipeline_output") and first_item.is_pipeline_output: + if isinstance(first_item.request_output, list) and len(first_item.request_output) > 0: + inner_output = first_item.request_output[0] + if isinstance(inner_output, dict) and "images" in inner_output: + frames = inner_output["images"][0] if inner_output["images"] else None + if frames is None: + raise ValueError("No video frames found in output.") + # Diffusion mode: use direct images field + elif hasattr(first_item, "images") and first_item.images: + frames = first_item.images + else: + raise ValueError("No video frames found in OmniRequestOutput.") + # frames may be np.ndarray (preferred) or torch.Tensor # export_to_video expects a list of frames with values in [0, 1] if isinstance(frames, torch.Tensor): diff --git a/examples/offline_inference/text_to_video/text_to_video.py b/examples/offline_inference/text_to_video/text_to_video.py index 6a93f4b83..c1aa60d6e 100644 --- a/examples/offline_inference/text_to_video/text_to_video.py +++ b/examples/offline_inference/text_to_video/text_to_video.py @@ -72,6 +72,31 @@ def main(): except ImportError: raise ImportError("diffusers is required for export_to_video.") + # Extract video frames from OmniRequestOutput + if isinstance(frames, list) and len(frames) > 0: + first_item = frames[0] + + # Check if it's an OmniRequestOutput + if hasattr(first_item, "final_output_type"): + if first_item.final_output_type != "image": + raise ValueError( + f"Unexpected output type '{first_item.final_output_type}', expected 'image' for video generation." + ) + + # Pipeline mode: extract from nested request_output + if hasattr(first_item, "is_pipeline_output") and first_item.is_pipeline_output: + if isinstance(first_item.request_output, list) and len(first_item.request_output) > 0: + inner_output = first_item.request_output[0] + if isinstance(inner_output, dict) and "images" in inner_output: + frames = inner_output["images"][0] if inner_output["images"] else None + if frames is None: + raise ValueError("No video frames found in output.") + # Diffusion mode: use direct images field + elif hasattr(first_item, "images") and first_item.images: + frames = first_item.images + else: + raise ValueError("No video frames found in OmniRequestOutput.") + # frames may be np.ndarray (preferred) or torch.Tensor # export_to_video expects a list of frames with values in [0, 1] if isinstance(frames, torch.Tensor):