You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(readme): reorganise for clarity + beginner on-ramps, surface the FFmpeg upstreaming
Top-to-bottom readable without losing a newcomer, navigable in one click:
- one-sentence plain-English opener + clickable table of contents
- New here? three-words glossary (codec / decode-demux / reverse-engineering)
- plain intro line on each major section
- new 'Where it stands now': the DS2 + DSS-SP fixes submitted to ffmpeg-devel
(in review), the public spec, the PRONOM preservation submission
- FFmpeg 'patches in review' badge; chapter 13 added to the trail; ffmpeg-upstream
bullet updated from 'staged' to 'submitted'
Keeps the thriller hook, 30s quickstart, before/after diagram, prod numbers, credits.
You don't need any audio or programming background to follow this repo. Three terms cover most of it:
42
+
43
+
-**Codec** — the secret "recipe" that squeezes a voice recording into a tiny file, and rebuilds it on playback. Without the recipe, the file is just unreadable noise.
44
+
-**Decode** (and **demux**) — turning that tiny file back into sound. *Demux* is the first step (split the file into the right little chunks, called *frames*); *decode* is the second (turn frames into audio). Most of our hardest bugs were in the *demux* step — getting the chunks lined up.
45
+
-**Reverse-engineering** — working out the secret recipe yourself, by careful observation, because the manufacturer never published it.
46
+
47
+
That's it. Everything below builds gently from these.
48
+
22
49
## Pick your way in
23
50
24
51
|||
25
52
|---|---|
26
53
| 📖 **Read it like a thriller**|**[The Story →](docs/THE-STORY.md)** — no code, ~10 minutes. A locked format, a relay of strangers, a bug that turned out to be a human being, and a German lawyer's drawer. It really happened, and every twist links to the chapter that proves it. |
27
-
| 🔧 **Follow the technical trail**|**[Go deeper ↓](#go-deeper-the-technical-trail)** — from "what even *is* a `.ds2` file" up to running a closed-source decoder under a debugger. Built to be readable if you've never reverse-engineered anything. |
54
+
| 🔧 **Follow the technical trail**|**[Go deeper ↓](#the-technical-trail)** — from "what even *is* a `.ds2` file" up to running a closed-source decoder under a debugger. Built to be readable if you've never reverse-engineered anything. |
28
55
| 🌐 **Decode one right now**|**[Open the in-browser decoder →](https://guillain-rdcde.github.io/DS2-Anywhere/)** — drop a `.ds2`/`.dss` (Olympus, Grundig, even encrypted) and get audio back. Nothing uploaded, nothing installed. |
29
56
| 🛠 **Run it yourself**|**[30 seconds ↓](#try-it-in-30-seconds)** — drop a file in, get an MP3 out. |
30
57
@@ -51,6 +78,8 @@ Production install (config + cron + systemd + web UI): `sudo ./src/bin/install.s
51
78
52
79
## What it does, in one picture
53
80
81
+
The whole point in one diagram: a Windows VM running commercial software, replaced by a small local binary.
82
+
54
83
```
55
84
BEFORE AFTER
56
85
@@ -72,18 +101,15 @@ A Windows VM with commercial software in the loop, replaced by a bash wrapper, a
72
101
73
102
---
74
103
75
-
## Go deeper: the technical trail
76
-
77
-
**New to any of this?** A `.dss`/`.ds2` file is a voice recording squeezed *tiny* by
78
-
a secret algorithm (a "codec"). "Decoding" it means rebuilding the original sound
79
-
from those bytes — and to do that you need the algorithm, which the manufacturers
80
-
never published. The whole trail below is the story of getting it anyway. You don't
81
-
need a background in audio or reverse-engineering to follow it; each chapter starts
82
-
from the ground.
104
+
## The technical trail
83
105
84
-
Climb at your own pace:
106
+
**Start from zero.** A `.dss`/`.ds2` file is a voice recording squeezed *tiny* by a
107
+
secret algorithm (see [the three words above](#new-here-three-words-in-plain-english)).
108
+
"Decoding" it means rebuilding the original sound — and to do that you need the
109
+
algorithm, which the manufacturers never published. The chapters below are the story of
110
+
getting it anyway. Each one starts from the ground; you can stop at any rung.
85
111
86
-
1.**[The ten-year lock](docs/01-reverse-engineering.md)** — what a DS2 file is, why it
112
+
1.**[The thirty-year lock](docs/01-reverse-engineering.md)** — what a DS2 file is, why it
87
113
resisted, and how Kieran Hirpara reverse-engineered the codec from the Olympus DLLs
88
114
(the genius part — not ours).
89
115
2.**[Putting it in production](docs/02-integration.md)** — turning a decoder into a
@@ -94,23 +120,43 @@ Climb at your own pace:
94
120
4.**[Cracking the re-sync block](docs/07-cracking-the-resync-block.md)** — the sequel:
95
121
we ran the closed-source Olympus decoder *inside a debugger we built from its own
96
122
DLLs*, and read the format's last undocumented rule straight off the silicon.
97
-
5.**[The bug that wasn't](docs/10-the-reckoning-the-bug-that-wasnt.md)** — the twist,
123
+
5.**[The re-sync block, again — and into FFmpeg](docs/13-the-sp-resync-block.md)** — the
124
+
same trick a second time, on Olympus's *other* format (DSS SP). We re-hosted the
125
+
vendor's decoder, read the rule off the live parser, fixed it in one branch — and this
126
+
time **sent the fix to FFmpeg itself** (see [where it stands](#where-it-stands-now)).
127
+
6.**[The bug that wasn't](docs/10-the-reckoning-the-bug-that-wasnt.md)** — the twist,
98
128
and the chapter we're proudest of. A rigorous case for a "last bug" ([the research
99
129
paper](docs/09-the-resync-excitation-anomaly.md)), then *overturned* — there was no
100
130
bug; it was a person stepping away from the mic. How careful work can be confidently
101
131
wrong, and how to catch it.
102
-
6.**[Cracking the Grundig SP codec](docs/12-cracking-the-grundig-sp-codec.md)** — the
132
+
7.**[Cracking the Grundig SP codec](docs/12-cracking-the-grundig-sp-codec.md)** — the
103
133
finale. The Grundig grandfather format that *nobody* decoded — not us, not FFmpeg,
104
134
not even Olympus's own software. We extracted Grundig's decoder, ran it under a
105
135
debugger, patched out the instruction it used to delete its own evidence, and
106
-
rebuilt the codec **bit-exact**. Now a [native Python decoder](grundig/), an
107
-
[FFmpeg patch](ffmpeg-upstream/patches/avcodec-grundig_sp-decoder.patch), and a PR
108
-
to the upstream codec.
136
+
rebuilt the codec **bit-exact**. Now a [native Python decoder](grundig/) and an
- 📖 **[docs/](docs/)** — the full didactic trail above, plus [the benchmarks](docs/benchmarks/).
132
178
- 🛠 **[src/](src/)** — the integration code: CLI, cron, HTTP daemon, admin web UI. Sanitized; the patterns are reusable as-is.
133
179
- 🎙 **[grundig/](grundig/)** — the native Grundig DSS-SP decoder (pure Python, bit-exact) + its tables.
134
-
- 🎬 **[ffmpeg-upstream/](ffmpeg-upstream/)** — the FFmpeg patches (DS2 container generalization + the Grundig SP decoder), staged for upstream.
180
+
- 🎬 **[ffmpeg-upstream/](ffmpeg-upstream/)** — the FFmpeg patches (DS2 decoder + demuxer, the DSS-SP paused-recording fix, and the Grundig SP decoder), the ones submitted to `ffmpeg-devel` plus their test samples and cover notes.
135
181
- 📐 **[the formal spec](docs/SPEC-grundig-dss-sp.md)** — the world's first public specification of the Grundig DSS-SP codec (bit-exact), plus a [PRONOM submission](docs/preservation/PRONOM-submission.md) so digital-preservation tools can identify these files at all.
0 commit comments