Skip to content

Commit daf8ee9

Browse files
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.
1 parent 7dcb585 commit daf8ee9

1 file changed

Lines changed: 65 additions & 19 deletions

File tree

README.md

Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44
> and now **Grundig DSS** — on any Linux box. No Windows, no GUI, no commercial
55
> software. A production recipe *and* the reverse-engineering trail behind it. 🔓
66
7-
[![CI](https://github.com/Guillain-RDCDE/DS2-Anywhere/actions/workflows/ci.yml/badge.svg)](https://github.com/Guillain-RDCDE/DS2-Anywhere/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Latest release](https://img.shields.io/github/v/release/Guillain-RDCDE/DS2-Anywhere)](https://github.com/Guillain-RDCDE/DS2-Anywhere/releases) ![Status](https://img.shields.io/badge/status-production-green) ![Platform](https://img.shields.io/badge/platform-linux-blue)
7+
[![CI](https://github.com/Guillain-RDCDE/DS2-Anywhere/actions/workflows/ci.yml/badge.svg)](https://github.com/Guillain-RDCDE/DS2-Anywhere/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Latest release](https://img.shields.io/github/v/release/Guillain-RDCDE/DS2-Anywhere)](https://github.com/Guillain-RDCDE/DS2-Anywhere/releases) ![Status](https://img.shields.io/badge/status-production-green) ![FFmpeg](https://img.shields.io/badge/FFmpeg-patches%20in%20review-orange) ![Platform](https://img.shields.io/badge/platform-linux-blue)
8+
9+
**In one sentence:** doctors, lawyers and police dictate into small voice recorders;
10+
the file format those recorders produce was kept secret for thirty years; this project
11+
opens it on any Linux machine — and gives the fix back to the open-source tools everyone
12+
uses.
813

914
---
1015

@@ -19,12 +24,34 @@ from its DLLs.
1924

2025
All of it is in here: the working code, and exactly how it was done.
2126

27+
## Contents
28+
29+
- [New here? Three words in plain English](#new-here-three-words-in-plain-english)
30+
- [Pick your way in](#pick-your-way-in) — four doors, choose your depth
31+
- [Try it in 30 seconds](#try-it-in-30-seconds)
32+
- [What it does, in one picture](#what-it-does-in-one-picture)
33+
- [The technical trail](#the-technical-trail) — the story, chapter by chapter
34+
- [Where it stands now](#where-it-stands-now) — giving it back to FFmpeg & preservation
35+
- [Real-world numbers](#real-world-numbers)
36+
- [What's in this repo](#whats-in-this-repo)
37+
- [Credits](#credits--proper-order) · [License](#license)
38+
39+
## New here? Three words in plain English
40+
41+
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+
2249
## Pick your way in
2350

2451
| | |
2552
|---|---|
2653
| 📖 **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. |
2855
| 🌐 **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. |
2956
| 🛠 **Run it yourself** | **[30 seconds ↓](#try-it-in-30-seconds)** — drop a file in, get an MP3 out. |
3057

@@ -51,6 +78,8 @@ Production install (config + cron + systemd + web UI): `sudo ./src/bin/install.s
5178

5279
## What it does, in one picture
5380

81+
The whole point in one diagram: a Windows VM running commercial software, replaced by a small local binary.
82+
5483
```
5584
BEFORE AFTER
5685
@@ -72,18 +101,15 @@ A Windows VM with commercial software in the loop, replaced by a bash wrapper, a
72101

73102
---
74103

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
83105

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.
85111

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
87113
resisted, and how Kieran Hirpara reverse-engineered the codec from the Olympus DLLs
88114
(the genius part — not ours).
89115
2. **[Putting it in production](docs/02-integration.md)** — turning a decoder into a
@@ -94,23 +120,43 @@ Climb at your own pace:
94120
4. **[Cracking the re-sync block](docs/07-cracking-the-resync-block.md)** — the sequel:
95121
we ran the closed-source Olympus decoder *inside a debugger we built from its own
96122
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,
98128
and the chapter we're proudest of. A rigorous case for a "last bug" ([the research
99129
paper](docs/09-the-resync-excitation-anomaly.md)), then *overturned* — there was no
100130
bug; it was a person stepping away from the mic. How careful work can be confidently
101131
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
103133
finale. The Grundig grandfather format that *nobody* decoded — not us, not FFmpeg,
104134
not even Olympus's own software. We extracted Grundig's decoder, ran it under a
105135
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
137+
[FFmpeg patch](ffmpeg-upstream/patches/avcodec-grundig_sp-decoder.patch).
109138

110139
> Short on time? **5 min** → this page · **20 min** → chapter 1 · **30 min** → the two
111-
> detective stories (3 & 4) · **the twist**5 · **the finale**6 · **everything**
140+
> detective stories (3 & 4) · **the twist**6 · **the finale**7 · **everything**
112141
> [docs/](docs/) in order, "impossible for thirty years" to "production in a weekend."
113142
143+
## Where it stands now
144+
145+
The work didn't stop at our own servers — it's being handed back to the tools everyone else uses:
146+
147+
- **Into FFmpeg.** FFmpeg is the audio/video engine inside VLC, Chrome, OBS and much of
148+
the internet. The Olympus DS2 decoder + demuxer and the DSS-SP paused-recording fix
149+
have been **submitted to the `ffmpeg-devel` mailing list and are in review**; the
150+
Grundig SP decoder patch is staged behind them. Once merged, *every* program built on
151+
FFmpeg reads these files for free, forever — no recipe required.
152+
- **A public specification.** [The first one ever written](docs/SPEC-grundig-dss-sp.md)
153+
for the Grundig DSS-SP codec, bit-exact — so nobody has to reverse-engineer it again.
154+
- **Digital preservation.** A [PRONOM submission](docs/preservation/PRONOM-submission.md)
155+
so archives and forensic tools can even *recognise* these files in the first place.
156+
157+
That's the throughline of the project: not just open the lock for ourselves, but leave
158+
the door open for everyone.
159+
114160
## Real-world numbers
115161

116162
The decision to ship rested on **an A/B against the reference Windows implementation
@@ -131,7 +177,7 @@ sample. [Full methodology →](docs/03-validation-campaign.md)
131177
- 📖 **[docs/](docs/)** — the full didactic trail above, plus [the benchmarks](docs/benchmarks/).
132178
- 🛠 **[src/](src/)** — the integration code: CLI, cron, HTTP daemon, admin web UI. Sanitized; the patterns are reusable as-is.
133179
- 🎙 **[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.
135181
- 📐 **[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.
136182

137183
## Credits — proper order

0 commit comments

Comments
 (0)