Read a single input frame. Returns: (image_float32, stem_name, is_linear_override)
(
self,
clip: ClipEntry,
frame_index: int,
input_files: list[str],
input_cap: Any | None,
input_is_linear: bool,
)
| 424 | # --- Frame I/O Helpers --- |
| 425 | |
| 426 | def _read_input_frame( |
| 427 | self, |
| 428 | clip: ClipEntry, |
| 429 | frame_index: int, |
| 430 | input_files: list[str], |
| 431 | input_cap: Any | None, |
| 432 | input_is_linear: bool, |
| 433 | ) -> tuple[np.ndarray | None, str, bool]: |
| 434 | """Read a single input frame. |
| 435 | |
| 436 | Returns: |
| 437 | (image_float32, stem_name, is_linear_override) |
| 438 | """ |
| 439 | logger.debug(f"Reading input frame {frame_index} for '{clip.name}'") |
| 440 | input_stem = f"{frame_index:05d}" |
| 441 | |
| 442 | if input_cap: |
| 443 | ret, frame = input_cap.read() |
| 444 | if not ret: |
| 445 | return None, input_stem, False |
| 446 | img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) |
| 447 | return img_rgb.astype(np.float32) / 255.0, input_stem, input_is_linear |
| 448 | else: |
| 449 | if frame_index >= len(input_files): |
| 450 | logger.warning( |
| 451 | f"Clip '{clip.name}': frame_index {frame_index} out of range (have {len(input_files)} frames)" |
| 452 | ) |
| 453 | return None, f"{frame_index:05d}", input_is_linear |
| 454 | fpath = os.path.join(clip.input_asset.path, input_files[frame_index]) |
| 455 | input_stem = os.path.splitext(input_files[frame_index])[0] |
| 456 | img = read_image_frame(fpath) |
| 457 | validate_frame_read(img, clip.name, frame_index, fpath) |
| 458 | return img, input_stem, input_is_linear |
| 459 | |
| 460 | def _read_alpha_frame( |
| 461 | self, |
no test coverage detected