(pattern_glob: str, out_mp4: Path, fps: int, lossless: bool = False)
| 137 | return imageio_ffmpeg.get_ffmpeg_exe() |
| 138 | |
| 139 | def encode_sequence(pattern_glob: str, out_mp4: Path, fps: int, lossless: bool = False): |
| 140 | out_mp4.parent.mkdir(parents=True, exist_ok=True) |
| 141 | ff = ffmpeg_exe() |
| 142 | |
| 143 | if lossless: |
| 144 | # Use H.264 lossless mode (qp=0) for lossless encoding (preserves exact pixel values) |
| 145 | cmd = [ff, "-y", "-hide_banner", "-loglevel", "error", |
| 146 | "-framerate", str(fps), |
| 147 | "-pattern_type", "glob", "-i", pattern_glob, |
| 148 | "-c:v", "libx264", "-qp", "0", |
| 149 | "-pix_fmt", "gray", |
| 150 | "-vf", "pad=ceil(iw/2)*2:ceil(ih/2)*2", |
| 151 | str(out_mp4)] |
| 152 | else: |
| 153 | # Standard lossy encoding for RGB videos |
| 154 | cmd = [ff, "-y", "-hide_banner", "-loglevel", "error", |
| 155 | "-framerate", str(fps), |
| 156 | "-pattern_type", "glob", "-i", pattern_glob, |
| 157 | "-c:v", "libx264", "-pix_fmt", "yuv420p", |
| 158 | "-vf", "pad=ceil(iw/2)*2:ceil(ih/2)*2", |
| 159 | str(out_mp4)] |
| 160 | subprocess.run(cmd, check=True) |
| 161 | |
| 162 | def generate_one(rng, out_dir: Path, |
| 163 | kubasic_source, gso_source, hdri_source, |
no test coverage detected