{"id":47704000,"url":"https://github.com/sharifhsn/wedeo","last_synced_at":"2026-04-04T20:01:40.533Z","repository":{"id":347677898,"uuid":"1194880608","full_name":"sharifhsn/wedeo","owner":"sharifhsn","description":"Rust rewrite of FFmpeg","archived":false,"fork":false,"pushed_at":"2026-04-01T18:54:26.000Z","size":20110,"stargazers_count":12,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-03T20:02:39.378Z","etag":null,"topics":["avc","codec","decoder","ffmpeg","h264","multimedia","rust","video"],"latest_commit_sha":null,"homepage":"https://github.com/sharifhsn/wedeo","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sharifhsn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"COPYING.LGPLv2.1","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-28T23:44:56.000Z","updated_at":"2026-04-03T14:52:01.000Z","dependencies_parsed_at":"2026-04-03T19:01:20.573Z","dependency_job_id":null,"html_url":"https://github.com/sharifhsn/wedeo","commit_stats":null,"previous_names":["sharifhsn/wedeo"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/sharifhsn/wedeo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharifhsn%2Fwedeo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharifhsn%2Fwedeo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharifhsn%2Fwedeo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharifhsn%2Fwedeo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sharifhsn","download_url":"https://codeload.github.com/sharifhsn/wedeo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sharifhsn%2Fwedeo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31411641,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T19:29:44.979Z","status":"ssl_error","status_checked_at":"2026-04-04T19:29:11.535Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avc","codec","decoder","ffmpeg","h264","multimedia","rust","video"],"created_at":"2026-04-02T17:49:07.992Z","updated_at":"2026-04-04T20:01:40.456Z","avatar_url":"https://github.com/sharifhsn.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wedeo\n\nRust rewrite of FFmpeg, verified against FFmpeg's output\nbit-for-bit.\n\n**This codebase is AI-generated.** Written by Claude (Anthropic) via\n[Claude Code](https://claude.ai/claude-code), directed by a\nhuman. The AI reads FFmpeg's C source and reimplements it in Rust. Every\nconformance claim below is verified by automated CI on every commit, comparing\nto FFmpeg's output.\n\nThe intention of this project is to push the boundaries of what is possible with\nAI rewriting codebases in Rust. It provides no additional features compared to\nFFmpeg, and despite incorporating FFmpeg's assembly code, is significantly slower.\n\n## Status\n\n| Component | Conformance | Notes |\n|-----------|-------------|-------|\n| H.264 decode | 79/79 BITEXACT | CAVLC + CABAC, Baseline through High profile |\n| H.264 FRext | 23/55 bitexact | Progressive 4:2:0 8-bit done; MBAFF/PAFF/10-bit remaining |\n| H.264 NEON (aarch64) | 1.75x speedup | MC, IDCT, deblock — FFmpeg's vendored assembly via `cc` |\n| WAV demuxer + PCM | bitexact | RIFF/RIFX/RF64/BW64, 17 PCM formats, 13/13 FATE files |\n| WAV muxer | bitexact | Roundtrip verified |\n| FLAC, WavPack | bitexact | Via symphonia adapter |\n| Vorbis, AAC, MP3 | ~120-140 dB SNR | Lossy codecs, float precision only |\n| AV1 | bitexact | Via rav1d adapter |\n| MP4 demuxer | working | H.264, AV1, AAC tracks |\n| Video player | 24fps 0-drop | GPU (wgpu), ffplay-style A/V sync, pause, volume |\n\n### H.264 decoder\n\nThe H.264 decoder is ~30K lines of Rust across 25 modules. It implements:\n\n- CAVLC and CABAC entropy coding\n- All intra prediction modes (4x4, 8x8, 16x16, chroma)\n- Quarter-pel motion compensation (6-tap FIR luma, bilinear chroma)\n- 4x4 and 8x8 IDCT with Hadamard DC transforms\n- In-loop deblocking filter\n- MMCO and sliding-window reference management\n- Weighted prediction (uni/bi)\n- B-frames with direct prediction (spatial + temporal)\n- High profile: 8x8 transforms, custom scaling matrices\n- MBAFF interlaced (partial — field/frame MB switching, CABAC context adaptation)\n- Frame-level threading with wavefront deblocking\n- aarch64 NEON assembly for MC, IDCT, and deblocking (feature-gated)\n\nArchitecture details: [H264.md](H264.md).\nKnown FFmpeg behavioral differences: [DIVERGENCES.md](DIVERGENCES.md).\n\n### Not yet implemented\n\nFFmpeg has hundreds of codecs and formats. wedeo currently covers a small\nsubset. Major gaps for parity:\n\n- **Video codecs** — VP9, HEVC/H.265, MPEG-2, MPEG-4 Part 2, VP8, Theora. H.264 is missing interlaced (MBAFF/PAFF), 10-bit, and 4:2:2/4:4:4.\n- **Video encoding** — no encoders exist yet (H.264, H.265, AV1 via rav1e)\n- **Muxers** — only WAV. No MP4/MOV, MKV/WebM, or MPEG-TS muxer.\n- **Demuxers** — no MKV/WebM, MPEG-TS, FLV, or AVI demuxer (MP4 and WAV only, plus symphonia-backed formats)\n- **Filters** — trait skeleton exists but no functional filter graph (no scale, crop, overlay, fps, etc.)\n- **Player** — no seek, no subtitle rendering, no hardware-accelerated decode\n- **Infrastructure** — no interruptible I/O (network streams), no chapter/program support, no `avformat_find_stream_info` equivalent\n\n## Quick start\n\n### Install the CLI\n\n```bash\n# From source (includes AV1 support via rav1d)\ncargo install --git https://github.com/sharifhsn/wedeo wedeo-cli\n```\n\n### Play a video\n\n```bash\n# Also from source — AV1, H.264, and audio all work\ncargo install --git https://github.com/sharifhsn/wedeo wedeo-play\nwedeo-play video.mp4\n```\n\n### Use as a library\n\n```toml\n# Cargo.toml — core crates are on crates.io\n[dependencies]\nwedeo = \"0.1.2\"\nwedeo-codec-h264 = \"0.1.2\"    # H.264 decoder\nwedeo-format-mp4 = \"0.1.2\"    # MP4 demuxer\nwedeo-symphonia = \"0.1.2\"     # audio codecs (AAC, MP3, FLAC, etc.)\n\n# AV1 requires a git dependency (rav1d is not yet on crates.io)\nwedeo-rav1d = { git = \"https://github.com/sharifhsn/wedeo\" }\n```\n\n### Build and test locally\n\n```bash\ncargo build\ncargo nextest run            # or cargo test\ncargo clippy\n```\n\nDecode a file and compare against FFmpeg:\n\n```bash\ncargo run --release --bin wedeo-framecrc -- input.264\nffmpeg -bitexact -i input.264 -f framecrc -\n```\n\n### FATE testing\n\nFFmpeg's native test suite.\n\n```bash\n./scripts/fetch-fate-suite.sh                    # downloads full suite (~1.2 GB)\nFATE_SUITE=./fate-suite cargo nextest run -p wedeo-fate\n```\n\n### JVT conformance (ITU test vectors)\n\n204 test vectors from the ITU JVT conformance suite, with MD5 ground truth\nfrom the [Fluster](https://github.com/fluendo/fluster) project. No FFmpeg\nrequired — comparison is against ITU-provided checksums.\n\n```bash\npython3 scripts/fetch_jvt.py                     # download vectors (~50 MB)\npython3 scripts/suite_runner.py --suite jvt-avc-v1,jvt-fr-ext --format yuv420p\n```\n\nThe unified suite runner also wraps the FATE suites:\n\n```bash\npython3 scripts/suite_runner.py --suite all --format yuv420p\npython3 scripts/suite_runner.py --suite fate-cavlc --save-snapshot\npython3 scripts/suite_runner.py --suite fate-cavlc --check-snapshot   # regression check\n```\n\n## Architecture\n\n```\nwedeo/\n  crates/\n    wedeo-core/          libavutil   — Rational, Buffer, Frame, Packet, errors\n    wedeo-codec/         libavcodec  — Decoder/Encoder traits, codec registry\n    wedeo-format/        libavformat — Demuxer/Muxer traits, I/O, InputContext\n    wedeo-filter/        libavfilter (stub)\n    wedeo-resample/      libswresample (rubato)\n    wedeo-scale/         libswscale (dcv-color-primitives)\n  codecs/\n    wedeo-codec-h264/    H.264 decoder — 30K lines, NEON assembly, 55 benchmarks\n    wedeo-codec-pcm/     PCM codec — 17 formats\n  formats/\n    wedeo-format-h264/   H.264 Annex B demuxer\n    wedeo-format-wav/    WAV demuxer + muxer\n    wedeo-format-mp4/    MP4/MOV demuxer\n  adapters/\n    wedeo-symphonia/     Wraps symphonia (FLAC, Vorbis, MP3, AAC, WavPack)\n    wedeo-rav1d/         Wraps rav1d (AV1)\n  bins/\n    wedeo-cli/           CLI tool\n    wedeo-play/          Video player — wgpu+winit, ffplay-style A/V sync\n  tests/\n    fate/                FATE cross-validation harness\n  scripts/\n    suite_runner.py      Unified conformance runner (FATE + JVT)\n    fetch_jvt.py         JVT vector downloader\n    conformance_full.py  FATE conformance report\n    regression_check.py  Quick regression check\n  test_suites/\n    h264/                JVT manifest JSONs (tracked)\n```\n\nEach FFmpeg library maps to one Rust crate. Codecs and formats register\nthemselves via `inventory` at link time — no central enum.\n\n## CI\n\nFive parallel jobs run on every PR (all required to merge):\n\n- **Lint** — clippy + rustfmt\n- **Test** — 462 unit and integration tests via nextest\n- **FATE Regression** — no previously-passing FATE test may regress (framecrc vs FFmpeg)\n- **JVT Regression** — no previously-passing JVT test may regress (MD5 vs ITU checksums)\n- **Deny** — license allow-list and advisory audit via cargo-deny\n\nConformance baselines are committed in `test_suites/baselines/`. To update\nafter expanding coverage:\n\n```bash\npython3 scripts/suite_runner.py --suite fate-cavlc,fate-cabac \\\n  --save-snapshot --snapshot-dir test_suites/baselines\n```\n\nPre-commit hook available: `pip install pre-commit \u0026\u0026 pre-commit install`\n\n## FFmpeg reference\n\nThe `FFmpeg/` submodule is pinned to `n8.1`. Optional — only needed to read\nthe C source or build a debug FFmpeg for development:\n\n```bash\ngit submodule update --init\ncd FFmpeg \u0026\u0026 ./configure --disable-optimizations --enable-debug=3 \\\n  --disable-stripping --disable-asm \u0026\u0026 make -j$(nproc) ffmpeg\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n### For AI agents\n\nThis repo is designed for AI-assisted development. [CLAUDE.md](CLAUDE.md)\ncontains the full project context: architecture, conventions, debugging\nprocedures, and technical requirements. It is the canonical reference for any\nAI agent working on this codebase — read it before writing code.\n\nThe [llms.txt](llms.txt) file provides a machine-readable project summary\nfollowing the [llms.txt convention](https://llmstxt.org/).\n\n## License\n\nLGPL-2.1-or-later. See [LICENSE](LICENSE) and [COPYING.LGPLv2.1](COPYING.LGPLv2.1).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsharifhsn%2Fwedeo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsharifhsn%2Fwedeo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsharifhsn%2Fwedeo/lists"}