1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//! Classical (DSP-only) fingerprinters.
//!
//! Three independent extractors, all `no_std + alloc` in API shape.
//! Each makes a different storage / robustness tradeoff; pick the one
//! that matches your workload. The current FFT dependency chain still
//! keeps the no_std path host-only today:
//!
//! | Algorithm | Output | Sample rate | Frame rate | Storage / sec | Best for |
//! | ----------- | ----------------------- | ----------- | ---------- | ------------------- | --------------------------------------- |
//! | [`Wang`] | Anchor-target landmarks | 8 kHz | 62.5 fps | ~2.4 KB (fan-out 10)| Music ID, Shazam-style |
//! | [`Panako`] | Triplet hashes | 8 kHz | 62.5 fps | ~2.0 KB (fan-out 5) | Tempo-robust music ID (±5 % stretch) |
//! | [`Haitsma`] | 32 sign bits / frame | 5 kHz | 78.125 fps | 312 B | Compact dense IDs, fastest extraction |
//!
//! Each fingerprinter has an offline ([`crate::Fingerprinter`]) and a
//! streaming ([`crate::StreamingFingerprinter`]) variant. The streaming
//! variants emit hashes incrementally with **bit-exact** parity to the
//! offline extractor under arbitrary chunking — verified down to the
//! 1-sample-per-push pathological case.
//!
//! All hash structs are `bytemuck::Pod` (cast-to-bytes safe), so you can
//! persist them directly to mmap'd files or ship them across an FFI
//! boundary without serialisation.
pub
pub use ;
pub use ;
pub use ;
/// Clamp the shared limit fields of [`WangConfig`] / [`PanakoConfig`] to
/// safe bounds: min-1 floors prevent underflow/empty output, ceilings
/// prevent OOM from extreme values, and zero-value limits are rejected
/// (they would reject all inputs/outputs).
pub use sanitize_cfg;