Spaces:
Sleeping
Sleeping
| """Fixed-size causal chunk protocol for streaming restoration. | |
| A clip of length ``t = 4a + 1`` is split into one FIRST chunk, zero or more | |
| MIDDLE chunks and one LAST chunk so that the total number of input frames equals | |
| the total number of output frames. ``clip_len`` is the MIDDLE chunk size and | |
| must be a multiple of 4. | |
| """ | |
| from enum import Enum | |
| from dataclasses import dataclass | |
| from typing import List | |
| class ChunkType(Enum): | |
| FIRST = "first" | |
| MIDDLE = "middle" | |
| LAST = "last" | |
| class ChunkSpec: | |
| ctype: ChunkType | |
| frame_start: int | |
| frame_count: int | |
| b: int # LAST only: 4b + 1 input frames -> b + 1 latents | |
| clip_idx: int | |
| is_first_decode: bool # trim the decoder's causal-padding head frames | |
| def build_chunk_specs(t: int, clip_len: int) -> List[ChunkSpec]: | |
| assert clip_len % 4 == 0, f"clip_len must be a multiple of 4, got {clip_len}" | |
| if t <= clip_len + 4: | |
| return [ChunkSpec(ChunkType.LAST, 0, t, (t - 1) // 4, 0, True)] | |
| specs = [ChunkSpec(ChunkType.FIRST, 0, clip_len + 4, 0, 0, True)] | |
| remaining = t - (clip_len + 4) | |
| pos = clip_len + 4 | |
| cidx = 1 | |
| while remaining > 0: | |
| if remaining <= clip_len: | |
| specs.append(ChunkSpec(ChunkType.LAST, pos, remaining, (remaining - 1) // 4, cidx, False)) | |
| break | |
| specs.append(ChunkSpec(ChunkType.MIDDLE, pos, clip_len, 0, cidx, False)) | |
| remaining -= clip_len | |
| pos += clip_len | |
| cidx += 1 | |
| return specs | |