Implements the content-derived spectral-peak signature from JRay-public-server/SPEC.md §3 so a truth file is self-identifying: 120 s window centred on the media midpoint, mono at 11025 Hz, 4096/1024 Hann STFT, 32 log-spaced bins over 300-3000 Hz, one byte per frame (5-bit peak band + 2-bit energy class), base64, `v1:` prefix. Audio decode is a second stream from the FFmpeg libraries the pipeline already links for video; libswresample is added to the existing ffmpeg_libs interface target. The FFT is written out rather than pulled from a library for the same reason the plugin vendors one: the output has to be bit-identical across two languages, so a dependency whose version could change the numerics is a liability. The server spec fixes the geometry but not enough to reproduce a byte stream — Hann periodicity, band aggregation, the energy-class definition, tie-breaking and the base64 alphabet are all unconstrained by it. Those are pinned in audio_signature.hpp and mirrored in the golden fixture, so the plugin can be implemented from the fixture alone. IR-005: tests/fixtures/audio/ carries a deterministic 120 s tone (FLAC — lossless, so identical PCM to the WAV make_fixture.py emits, and 3.5x smaller in git) plus the signature it must produce, the decoded-PCM checksum and the full parameter contract. That directory is the artefact shared with the plugin repo; the PCM checksum is separate from the signature so a codec-level difference is distinguishable from a DSP one. IR-007: media under 120 s emits no signature. Same for a file with no audio stream or one that will not open — UR-9 is an enhancement and must never be able to break a fetch. Verified against an independent Python reference implementation: same bytes. All 32 bands and all 4 energy classes appear in the golden vector, and the window-centring test wraps the fixture in 90 s of silence either side and requires the golden value back. Not wired into the truth-file output yet — that is the schema_version bump under IR-002/IR-003 and is deliberately out of scope here. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
120 lines
3.3 KiB
Plaintext
120 lines
3.3 KiB
Plaintext
# Build
|
|
build/
|
|
cmake-build-*/
|
|
CMakeCache.txt
|
|
CMakeFiles/
|
|
*.cmake
|
|
Makefile
|
|
install_manifest.txt
|
|
compile_commands.json
|
|
|
|
# Compiled objects
|
|
*.o
|
|
*.a
|
|
*.so
|
|
*.dylib
|
|
*.json
|
|
# Exception: small, curated result summaries backing specific numbers quoted
|
|
# in docs/ (cross-model held-out scores, per-film training breakdown, gallery
|
|
# coverage). Regenerate with scripts/docs/run_holdout_all_models.py and
|
|
# scripts/docs/gallery_coverage_per_film.py.
|
|
!docs_data/*.json
|
|
# Exception: test fixtures are inputs, not build output. The audio golden
|
|
# vector (IR-005) is shared verbatim with the jRay plugin repo, so it has to be
|
|
# tracked. Regenerate the media with tests/fixtures/audio/make_fixture.py.
|
|
!tests/fixtures/**
|
|
# Video files
|
|
*.mp4
|
|
*.mkv
|
|
*.avi
|
|
*.mov
|
|
|
|
# ONNX models in models/ are tracked via Git LFS (see .gitattributes).
|
|
# Any stray ONNX elsewhere is generated/downloaded and not tracked.
|
|
external/*.onnx
|
|
|
|
# Generated TensorRT engines (rebuilt by ORT / scripts/build_trt_engines.sh)
|
|
trt_cache/
|
|
|
|
# ORT pre-optimized model cache (generated on first run, provider-specific)
|
|
ort_cache/
|
|
|
|
# Gallery files (generated — HDF5 only, see src/gallery/gallery_store.cpp).
|
|
# Legacy JSON galleries from before that switch are also excluded.
|
|
gallery.json
|
|
gallery_*.json
|
|
gallery.h5
|
|
gallery_*.h5
|
|
|
|
# Calibration cache (generated alongside a gallery, per-embedder)
|
|
*.calib_cache.csv
|
|
*.calib_cache.png
|
|
|
|
# Cameo detection run outputs (generated by scripts/cameo_*.py)
|
|
cameo_progress.txt
|
|
cameo_report.txt
|
|
|
|
# Analysis plot outputs (scene-gap histograms / KDEs, etc.)
|
|
scene_gap_*.png
|
|
|
|
# Per-frame debug images
|
|
images/
|
|
|
|
# Annotations output
|
|
annotations.json
|
|
*_annotations.json
|
|
|
|
# MovieNet evaluation data
|
|
movienet-ps/
|
|
|
|
# Eval probe images (data, regenerable)
|
|
eval/probe/
|
|
|
|
# Local reference repos kept for inspiration (each has its own .git)
|
|
inspiration/
|
|
|
|
# experiments/ has its own nested .gitignore for HDF5 galleries/dumps/X-Ray
|
|
# corpus (all pushed/pulled via scripts/artifacts/{push,pull}_artifacts.sh to
|
|
# the Gitea generic package registry instead of committed).
|
|
# Exception to the blanket *.json rule above: the committed placeholder for
|
|
# experiments/file-lut.json (see experiments/.gitignore).
|
|
!experiments/file-lut.template.json
|
|
|
|
# Site build output (mkdocs build). Rendered site is deployed to a
|
|
# gitea-pages branch, never committed to a working branch.
|
|
site/
|
|
docs_site/
|
|
|
|
# Images staged into docs/ from the artifact registry at build time
|
|
# (scripts/docs/build_site.sh) — not committed, pulled fresh on each build.
|
|
# Exception: pipeline_topology.svg is small and hand-authored (not pulled from
|
|
# anywhere) and the README references it directly, so it needs to render on a
|
|
# plain Gitea repo view too, not just the built Pages site. (A directory-level
|
|
# ignore can't be un-ignored file-by-file below it, so this must NOT blanket-
|
|
# ignore docs/assets/ itself — only its contents, minus the one exception.)
|
|
docs/assets/images/*
|
|
!docs/assets/images/pipeline_topology.svg
|
|
# These frames are referenced directly by README.md, which renders on the
|
|
# plain Gitea repo view — committed for the same reason as the SVG above.
|
|
!docs/assets/images/lovelace_perfect_second.jpg
|
|
!docs/assets/images/valerian_screen_call.jpg
|
|
|
|
# Python
|
|
__pycache__/
|
|
*.pyc
|
|
*.pyo
|
|
.venv/
|
|
venv/
|
|
|
|
# Local secrets (API keys — never commit)
|
|
.env
|
|
|
|
# Editor / OS
|
|
.vscode/
|
|
.idea/
|
|
.claude/settings.local.json
|
|
*.swp
|
|
*.swo
|
|
.DS_Store
|
|
Thumbs.db
|