Reconstructed interoperable ADM BWF export¶
OpenJOC provides a standards-based reconstructed interchange export with a bounded compressed-media streaming path:
openjoc export-adm INPUT.ec3 -o OUTPUT.wav
openjoc validate-adm OUTPUT.wav
What this export means¶
For the explicitly admitted JOC profile, OpenJOC can associate decoded JOC object audio with the decoded movement metadata carried by the same JOC programme. The generated ADM Objects can therefore move. This reconstructs the object scene carried by JOC; it does not recover the original Atmos authoring master.
Generated names, numbers, and UIDs belong to the export. They are not the original DAW/Logic track identity, authored Object numbering, ADM Object UIDs, or source-stem PCM. JOC is lossy, so decoded movement can differ from source automation. Unsupported profiles remain neutral in best-effort mode or fail closed in strict mode. The detailed scope and report fields appear below.
Structural correctness and renderer equivalence¶
OpenJOC reconstructs an interoperability-oriented ADM representation of the decoded JOC object scene. It does not recover the original authored Dolby Atmos master, and it does not guarantee perceptually identical localization to a native JOC final renderer.
The reconstructed scene is validated at the decoded-data and ADM-structure boundaries: object PCM, carrier-local object binding, coordinates, timing, supported gain/state metadata, track identity, container structure, and ADM relationships are checked within the documented profile. Those checks establish structural and decoded-scene correctness; they do not establish native-renderer perceptual equivalence.
A residual localization difference was observed in at least one real-world validation programme after the reconstructed ADM passed the applicable technical checks. That observation is material-specific and non-generalizable. Native JOC playback remains the reference where renderer-identical spatial localization is required. This is a known limitation of reconstructed ADM interoperability, not a claim that the decoded object scene or export structure is invalid.
INPUT may also be a captured OpenJOC scene directory or a complete
ObjectScene JSON document. For raw E-AC-3 or seekable ordinary ISO BMFF, the
CLI performs a lightweight sequential preflight, reopens the input once, and
writes each bounded decoder AU directly from the renderer-independent
reconstruction boundary into RIFF/RF64 ADM BWF. It does not create a captured scene or
full-duration diagnostic row WAVs first. Explicit JSON and scene-directory
inputs retain their existing diagnostic in-memory model.
Production streaming and failure behavior¶
Compressed-media preflight establishes the sample rate, exact sample duration,
JOC/profile eligibility, stable ReconstructionBasis cardinality, Base LFE
presence, metadata counts, final track order, and checked u64 PCM size. A
bounded first-AU PCM decode verifies the admitted Base topology; the PCM pass
then occurs exactly once after reopening the seekable input.
The streaming writer retains one decoded AU and one interleaving buffer. Its PCM retention is proportional to track count times maximum AU samples, not to programme duration. The 128 MiB diagnostic capture limit remains unchanged and continues to apply to explicit capture products, not production ADM export.
Output is first written to a hidden sibling partial file. After exact sample
count finalization, the CLI validates ADM BWF by seeking across data, writes the
adjacent report to staging, and commits both paths with rollback-safe
replacement. Decode, range, validation, or I/O failure removes new staging and
does not publish a successful-looking output/report. Existing files are
preserved when an authorized replacement fails.
JOC reconstruction is kept in decoder-domain floating-point form until the
integer PCM boundary. The public JOC reconstruction equations are linear QMF
matrix sums and do not establish a [-1, 1] PCM invariant; therefore a legal
decoded object can contain floating-point headroom. The signed-24-bit ADM
writer checks every sample immediately before quantization and fails closed on
non-finite or out-of-range values. It never clips, saturates, applies a hidden
limiter, or normalizes individual objects/tracks. Successful reports include a
bounded pcm_headroom_census with whole-programme and per-signal statistics;
no programme-duration PCM copy is retained for that census.
Interactive stderr shows throttled analysis, export, finalization, and
validation progress. Redirected/non-TTY execution is quiet apart from the final
summary or error; --no-progress disables interactive updates explicitly.
The repository-owned external-tool smoke fixture can be generated without the private Logic oracle:
cargo run -p openjoc-adm --example synthetic_interop_fixture -- candidate.wav
openjoc validate-adm candidate.wav
It contains one second across two neutral reconstruction Objects and a generated 5.1 transport bed. Only the bed LFE carries the synthetic Base LFE input; the other five bed channels are explicit silence placeholders, plus an adjacent semantic report.
An OpenJOC-generated ADM BWF file is a reconstructed representation of the scene carried by an E-AC-3 JOC programme. It is not the ADM/BWF source master that was used before encoding. OpenJOC does not and cannot recover information discarded, quantized, merged, transformed, or never transmitted by the lossy encoding process. Multiple different source ADM masters can produce identical or observationally equivalent JOC data, so JOC → original ADM is not a unique inverse.
Reconstructed dynamic Objects¶
For the explicitly admitted decoded-JOC/OAMD profile, OpenJOC can associate each decoded JOC object signal with the corresponding decoded OAMD dynamic metadata. The export therefore emits generated ADM Objects with the decoded position events at their sample-domain boundaries. A reconstructed Object may move; it is not forced to a neutral position merely because its audio came from JOC.
The generated Object represents a decoded JOC Object carried by the stream. It is not a recovered authored Object. OpenJOC does not promise recovery of the original DAW/Logic track identity, authored Object numbering, ADM Object UID, Object name, source-stem PCM, unquantized automation, programme/content hierarchy, authoring metadata, Dolby authoring provenance, or a lossless JOC → ADM round trip.
OAMD and ADM Cartesian coordinates¶
Decoded OAMD room positions and ADM Cartesian positions are different public
coordinate domains. In the admitted in-room profile, OAMD uses normalized room
coordinates: X is left-wall 0 to right-wall 1, Y is front-wall 0 to
back-wall 1, and Z is floor -1 to ceiling 1. ADM Cartesian uses a
centered normalized cube: X is positive to the right, Y is positive to the
front, and Z is positive upward. OpenJOC converts explicitly at the ADM
boundary:
ADM X = 2 × OAMD X - 1
ADM Y = 1 - 2 × OAMD Y
ADM Z = OAMD Z
The bridge validates finite values and the supported normalized input/output ranges. It rejects unsupported coordinates rather than silently clamping them. This conversion does not alter decoded-object binding, the scene model, PCM, or any renderer-domain processing. Detailed reconciliation evidence remains in the repository's dated research record and is intentionally outside this published site.
Are these the original Atmos Objects?¶
No. OpenJOC Reconstructed JOC Object 04 is an OpenJOC-generated identity for
a decoded carrier-local object slot. It must not be read as proof that the
signal is authored Object 04 in the source Logic or ADM project. Encoding may
quantize metadata, reorganize object representation, change numbering, or
discard authoring information.
Why reconstructed Objects may differ from the source master¶
When reconstructed Objects move, their trajectories are the spatial metadata retained and decoded from the JOC programme. They are not guaranteed to be numerically identical to the original DAW automation. JOC is a lossy delivery representation, so the decoded scene can preserve meaningful movement while still differing from the source master.
Therefore:
reconstructed dynamic ADM != recovered original ADM master
Comparing an OpenJOC export with the original ADM is useful for evaluating what survived encoding. Compare movement and audio with the understanding that identities, numbering, and discarded authoring data are not guaranteed to correspond directly.
Why exported ADM objects may not move¶
If you open an exported ADM file in a DAW and some objects look still, this does not mean OpenJOC failed to decode movement or that direct JOC rendering is static. There are two export cases:
- In the admitted profile, decoded JOC audio and decoded OAMD movement are bound by the clean ordinal contract, so generated dynamic Objects carry position blocks and may move.
- Outside that profile, OpenJOC can recover audio and movement separately but cannot safely prove which signal belongs to which decoded metadata object. Best-effort output remains neutral/static and strict output rejects.
So “objects in exported ADM do not move” describes unsupported or unresolved profiles, not the admitted dynamic path.
Direct JOC rendering is a different pipeline from ADM export:
JOC decode → direct playback renderer
while export is:
JOC decode → reconstructed signals → reconstructed ADM export
Even a moving generated Object does not prove that the original authored Object was recovered. The decoded-object binding is carrier-local and does not answer the stronger authored-source or renderer questions.
The generated 5.1 bed can also look like “conversion to 5.1,” but it is mainly a minimum legal transport shape:
- if Base LFE is recovered, it goes to the LFE channel,
- the other five 5.1 bed channels are generated silence placeholders to complete a valid 5.1 DirectSpeakers structure.
These placeholder channels are there so downstream tools can accept a standard container; they are not extra authored object content.
The same distinction applies to decoded Base full-band PCM. Base/downmix channels are inputs to the JOC reconstruction domain, while an independent Base contribution in the final delivery scene requires a separate decoder- semantic proof. Decoded Base C energy, including vocal-correlated energy, does not by itself authorize adding Base C to this bed: doing so could duplicate the contribution already represented by decoded JOC Objects. The original authored Bed is not a source of evidence for this decision, and no authored Center-bed identity is recovered.
Supported binding profiles¶
The exporter consumes ObjectScene and ReconstructionBasis directly. It does
not consume a 7.1.4/22.2 speaker render, FinalLinkedGain output, or HRTF
output. Those are renderer-domain results and are not reconstructed scene
signals.
The exact clean-room admission profiles are
E_AC_3_JOC_OBSERVED_ORDINARY_PROFILE and the exact observed compatibility
variant E_AC_3_JOC_OBSERVED_ORDINARY_COMPAT_WARP3_PROFILE, each with:
- 15 decoded JOC Objects and 15 reconstruction rows;
- no OAMD bed, one leading Base LFE, and no ISF;
- 15 dynamic OAMD Objects and 16 total OAMD entries.
The compatibility variant is admitted only when the known deviation family
and the opaque raw3 element shape both match the clean-room whitelist. ETSI
strict classification remains ReservedWarpMode(3): OpenJOC preserves the
opaque raw3 payload, does not claim its full vendor meaning, and does not
apply a raw3-specific spatial transform. The observed decoded OAMD position
metadata is sufficient for the scoped bridge in this exact profile.
Within the same programme/discontinuity epoch, the typed mapping is:
joc_ordinal = j
oamd_dynamic_ordinal = j
oamd_total_index = j + 1
ResolvedWithinCarrier means this decoded JOC audio ↔ decoded OAMD relation
is admitted. It is not an authored-object identity. The +1 is a total-list
domain offset for the leading Base LFE, not an element-ID lookup or PCM
heuristic.
Unsupported profiles¶
Bed-bearing, ISF-bearing, alternate-LFE, count/order-mismatched,
unknown-deviation compatibility, incomplete-Base-LFE, or otherwise
unvalidated profiles
remain unresolved for dynamic binding. Best-effort export retains generated
Objects at neutral/static positions and records unsupported_binding_reason;
strict export rejects. Unsupported dynamic properties such as inactive
transitions, gain, extent, divergence, channel lock, and zones are not
fabricated into ADM. For supported dynamic Objects, the Dolby profile
jumpPosition transport uses interpolationLength=0 on the first block and
250 samples on every subsequent block; this is a target ADM profile rule,
not a copy of the source OAMD ramp_duration value.
The Dolby Atmos master profile does not allow a mono DirectSpeakers/LFE bed. When known Base LFE PCM is present, OpenJOC places it in the LFE position of the minimum allowed 5.1 bed and generates silent L, R, C, Ls, and Rs placeholders. Those five channels are named and reported as generated transport structure, not recovered authored PCM. No authored name, stem, object identity, or programme hierarchy is inferred.
Standards¶
The implementation targets the public standards subset described by:
- ITU-R BS.2076-3 (02/2025), Audio Definition Model.
- ITU-R BS.2088-2 (11/2025), long-form WAVE metadata chunks and size semantics.
- Dolby Atmos Master ADM Profile v1.0, interoperability element/ID/bed/BWF constraints.
- EBU Tech 3285 Supplement 6 (2009), public
dbmdenvelope semantics. - EBU Tech 3285 Supplement 7 (2018),
chnachunk reference semantics.
Primary public references: ITU-R BS.2076, ITU-R BS.2088-2, Dolby Atmos Master ADM Profile, EBU Tech 3285 Supplement 6, and EBU Tech 3285 Supplement 7.
When the complete file and data sizes fit the 32-bit WAVE fields, the writer
uses RIFF/WAVE with exact 32-bit sizes and a 64-byte leading JUNK reserve.
When they do not fit, it uses RF64/WAVE, a mandatory first ds64, 32-bit
sentinels, and checked 64-bit RIFF/data/sample counts. Both forms use
fmt, data, uncompressed axml, chna, and a minimal public EBU
Supplement 6 dbmd envelope in that order after the size reserve. Reserved
Atmos-specific DBMD segment payloads are neither copied nor invented. Audio is
signed 24-bit little-endian PCM. The writer rejects
non-finite or out-of-range samples and does not normalize, limit, compress, or
apply loudness processing.
The recommended .wav extension is the user-facing BWF/ADM convention used by
common Atmos workflows. .bw64 remains accepted as a legacy filename alias,
but it does not force a BW64 signature; representable output remains RIFF
and oversized output becomes RF64.
Supported ADM subset¶
The deterministic XML contains the minimum relationships needed for the exported PCM tracks:
- one neutral
audioProgrammeandaudioContent; - generated
audioObject,audioPackFormat,audioChannelFormat,audioStreamFormat,audioTrackFormat, andaudioTrackUIDelements; Objectschannel formats for reconstruction signals;- a legal room-centric 5.1 DirectSpeakers bed when Base LFE is present, with
RC_LFEcarrying recovered PCM and five reported silence placeholders; - Dolby Atmos object IDs beginning at
AO_100Band bed IDs in the bed range; - one sample-derived
audioBlockFormatper signal for neutral/unresolved output; - for the admitted profile, one deterministic position block per OAMD event
boundary, with exact sample-derived
rtime/duration coverage and profile-compliant first/subsequentjumpPositioninterpolation metadata; - cartesian neutral position for signals whose spatial binding is unresolved;
- standard ADM ID syntax and child-element IDRef relationships;
chnaUIDs/track-format/pack-format references matching the XML and PCM track indices.
Generated identities are stable and neutral. Unresolved output uses
OpenJOC Reconstructed Signal 01; admitted decoded-object output uses
OpenJOC Reconstructed JOC Object 01. Names such as “Lead Vocal”, “Dialogue”,
or “Music” are never guessed.
Mapping table¶
The same table is used by the writer and the reconstruction report.
| Semantic | Status | Current treatment |
|---|---|---|
| Reconstruction signal identity | EXACT |
Local ReconstructionBasis row identity only. |
| Audio ↔ spatial metadata binding | EXACT within scope / UNRESOLVED otherwise |
In the admitted profile, decoded JOC ordinal j maps to OAMD dynamic ordinal j and total index j+1; no authored identity is claimed. |
| Dynamic position/trajectory | EXACT within supported position scope / NOT_REPRESENTABLE otherwise |
Admitted OAMD position events become deterministic ADM blocks with profile-compliant jump interpolation metadata; unsupported properties or profiles remain neutral/rejected by policy. |
| Bed/direct-speaker identity for reconstruction rows | NOT_REPRESENTABLE |
Structural order is not promoted to authored identity. |
| Separately retained base LFE identity | EXACT |
Exported in the LFE position of a generated 5.1 DirectSpeakers bed. |
| Dolby Atmos bed transport placeholders | APPROXIMATED |
Five explicitly reported silent tracks complete the minimum allowed LFE-bearing bed. |
| Extent, channel lock, divergence, zones, JOC controls | NOT_REPRESENTABLE |
Not silently invented in ADM fields. |
| Original hierarchy, names, UIDs, comments | NOT_RECOVERABLE |
Neutral generated IDs are used only where required. |
| PCM sample timing and track order | EXACT |
Derived from the scene sample domain; object-block interpolation follows the Dolby profile's first-block 0/subsequent-block 250-sample rule. |
| Float-to-24-bit storage | APPROXIMATED |
Deterministic quantization, with no gain processing. |
| FinalLinkedGain, HRTF, speaker render | NOT_APPLICABLE |
Export occurs before those renderer stages. |
For the admitted dynamic path, the property boundary is deliberately narrow:
| OAMD property | Status | Export treatment |
|---|---|---|
| X/Y/Z position | ADMITTED |
Supported finite normalized OAMD room coordinates are converted once to normalized cartesian ADM position elements; unsupported ranges fail closed. |
| Active/inactive | PARTIAL |
Active slots are retained; an inactive transition rejects dynamic export and follows policy. |
| Gain | UNSUPPORTED |
Not copied into ADM dynamic blocks. |
| Timing / ramp | APPROXIMATED |
Sample-domain block boundaries are retained; source OAMD ramp values are not copied, and Dolby profile jump interpolation is emitted as 0 samples for the first block and 250 samples thereafter. |
| Extent/size/spread | UNSUPPORTED |
Not fabricated. |
| Divergence | UNSUPPORTED |
Not fabricated. |
| Channel lock | UNSUPPORTED |
Not fabricated. |
| Zones and opaque/additional data | OPAQUE |
Retained by the decoder boundary where applicable, not interpreted by this ADM path. |
Policy¶
Best-effort is the default:
openjoc export-adm INPUT.ec3 -o OUTPUT.wav --adm-policy best-effort
For the admitted profile it emits bound generated dynamic Objects and writes
every unsupported or omitted semantic to OUTPUT.adm-report.json. For other
profiles it preserves neutral best-effort output and records the binding reason.
Strict mode permits only the complete admitted dynamic path and rejects unsupported or unresolved profiles:
openjoc export-adm INPUT.ec3 -o OUTPUT.wav --adm-policy strict
This is intentional. Strict mode must not turn an unproven row/object correspondence or unsupported metadata property into a confident-looking ADM file.
Reconstruction report¶
The adjacent JSON report includes:
- OpenJOC and report schema versions;
- source format, selected RIFF/RF64 container, sample rate, duration, and PCM representation;
- reconstructed signal, metadata, dynamic, DirectSpeakers, and generated silent bed-placeholder counts;
- decoded binding state/profile, bound and unbound decoded-object counts, and whether dynamic metadata was exported;
dynamic_objects_with_bound_pcmis the admitted decoded-object count only when the corresponding dynamic metadata path succeeds;- the complete mapping table;
- generated signal identities;
- unrecoverable authoring information;
- approximations, omissions, warnings;
- the bounded
pcm_headroom_census, including finite/non-finite counts, nominal-range violations, extrema, first violation, and per-signal peaks; source_is_lossy_e_ac_3_joc: true;original_adm_master_recovered: false;lossless_round_trip: false.original_authored_identity_recovered: falseandunsupported_binding_reasonwhen the scoped path is unavailable.decoded_joc_object_binding_state,decoded_joc_binding_profile,decoded_joc_objects_bound,decoded_joc_objects_unbound, anddynamic_metadata_exportedare separate fields. A successful admitted dynamic export has a non-zero bound-object count; authored identity remains false.dolby_authorship_metadata_state: "not-generated".
FAQ¶
Why do Objects move now when they were static before?¶
The admitted profile now proves the decoded JOC audio-to-OAMD relationship. OpenJOC can attach each reconstructed decoded JOC Object signal to its corresponding decoded movement metadata.
Does that mean OpenJOC recovered my original ADM master?¶
No. The export reconstructs the object scene carried by JOC. It does not recover the original authored project, hierarchy, names, UIDs, or automation.
Is reconstructed Object #3 necessarily the same as Object #3 in my source project?¶
No. The numbering is generated from a carrier-local decoded ordinal. Encoding may reorganize object representation and numbering.
Why can its movement differ slightly from my source project?¶
JOC is lossy. The export uses the encoded and decoded metadata, which may have been quantized or otherwise transformed.
Can I compare an OpenJOC export with my original ADM?¶
Yes. That comparison can show which movement and audio information survived JOC encoding. Do not assume that names, IDs, numbering, or discarded authoring data line up directly.
Does a moving ball prove bit-perfect original-object recovery?¶
No. It proves only that the admitted decoded JOC scene carries meaningful decoded movement through the reconstructed export path.
openjoc validate-adm independently parses RIFF, RF64, and legacy BW64
containers. It checks container/file accounting, ds64 and table semantics
when applicable, all chunk boundaries/padding, complete signed-24-bit PCM
fmt arithmetic, chna capacity/track indices/UIDs, well-formed EBUCore ADM
XML, Dolby programme/content requirements, continuous profile IDs, legal
bed/object ID ranges, allowed room-centric bed configurations, IDRef
relationships, channel/block types and timing, exact AXML↔CHNA links, and the
public EBU DBMD envelope/checksums. It seeks over PCM rather than loading the
complete file; axml, chna, and dbmd remain bounded allocations. This is a
structural validator, not vendor certification.
The JSON validation summary lists DBMD segment IDs and whether reserved Dolby
segments are present. The plain-text result says STRUCTURE PASS; it does not
claim Dolby authoring provenance or DEE acceptance.
Determinism and limitations¶
XML ordering, IDs, names, time serialization, report ordering, chunk ordering, and integer PCM conversion are deterministic. Synthetic fixtures should be byte-identical across supported platforms.
R2 passes OpenJOC structural/profile validation and Logic Pro imports it as one
5.1 bed plus two Objects. DEE parses the ADM but rejects it with Content was
not authored with Dolby tools. OpenJOC deliberately does not generate the
reserved/private DBMD segments used for Dolby authoring provenance. Therefore
R2 is Logic-interoperable but is not directly DEE-ingestible. The maintainer
verified the authorized workflow: Logic imported R2, re-exported ADM BWF, and
DEE accepted the Logic-authored re-export. This does not make the byte-exact
OpenJOC output a direct DEE pass; direct DEE interoperability remains
unsupported and unclaimed.