Skip to content

v1.1.0 — 30fps & 60fps YouTube 4K Full Recovery

Latest

Choose a tag to compare

@EfrainGaray EfrainGaray released this 23 Mar 13:14
· 55 commits to main since this release

What's New

Proven Recovery Results

  • 30 fps: 14/14 chunks PASS, SHA256-verified, ~140 MB real archive
  • 60 fps: 14/14 chunks PASS, SHA256-verified, same archive
  • BCH ECC with t=16 corrects all errors introduced by YouTube VP9 transcoding
  • End-to-end fidelity at 4K (3840×2160), 1 bit per pixel

Critical Bug Fixes

AAC edit list DTS offset (bundle concat)
The AAC encoder delay introduces an elst atom that offsets video DTS by ~0.021 s. When using ffmpeg -f concat -c copy, the concat demuxer duplicates frame 0 and shifts every subsequent frame by +1, corrupting all inter-frame references. Fixed by stripping audio (-an -c:v copy -video_track_timescale <fps>) from every clip before concat.

ECC header corruption recovery
The unprotected 25-byte global header can be corrupted by VP9 transcoding. BCHPayloadCodec.decode() now recovers silently from header bit-flips using self.config + expected_size_bytes when the AGB1 magic is intact.

Production Config Updates

  • PipelineConfig.ecc_t: 8 → 16 (30 bytes overhead/block, corrects more errors)
  • PipelineConfig.max_fps: 6 → 60
  • CLI --max-fps default: 6 → 30 (both pipeline encode and production receive)

Web Control Plane

  • FPS selector on upload form: 30 fps default, 60 fps as opt-in advanced option
  • FPS stored per-upload in the web DB and displayed in gallery and detail view
  • --max-fps passed automatically to agatha production receive

VP9 Format Codes

  • ≤30 fps: format 313 (VP9 2160p 30fps)
  • 60 fps: format 315 (VP9 2160p 60fps)

Known Limitations

  • Frame extraction buffers entire video in RAM (subprocess.run with capture_output=True) — ~2 GB at 60fps 4K. Needs streaming replacement for very large archives.
  • Packed bundle format (zero inter-chunk white padding) reduces file size 24× but VP9 bit-amplification effect is lost — error rate rises above t=16 threshold. Not usable until a low-entropy bitmap format is designed.
  • production receive CLI defaults to --max-fps 30. 60fps must be specified explicitly from CLI (the web sends it automatically).

Next Steps

See Active Goals in CLAUDE.md.