Skip to content

Auro-3D audio detection #1471

Open
Open

Description

@paxter

Is it possible to add an Auro-3D audio codec detection to mediainfolib?
If needed, I can provide examples.

https://en.wikipedia.org/wiki/Auro-3D

Activity

  1. JeromeMartinez commented on Dec 14, 2021

    @JeromeMartinez
    Member

    Samples would be a first step for basic detection.
    For more, well... even before saying that priority will depends on the level of interest, we need to find specs...

  2. paxter commented on Dec 15, 2021

    @paxter
    Author

    I provided you three short samples.

    1. https://send.cm/drg0zjl1lb03 (Auro-3D only)
    2. https://send.cm/96ojtjsfkftc (Atmos and Auro-3D)
    3. https://send.cm/jhr28n584n69 (Atmos and Auro-4D)

    The audio title will show you the used audio type.
    Hope that helps. Let me know, if you need anything further.

  3. JeromeMartinez commented on Dec 18, 2021

    @JeromeMartinez
    Member

    I checked files and looks like that Auro-3D is hidden in DTS, without any spec available. As is, it is impossible to detect Auro-3D without big reverse engineering. Would not be done on free support.

  4. paxter commented on Dec 18, 2021

    @paxter
    Author

    Hm ok. Bad news, but thanks for checking @JeromeMartinez.

  5. paxter commented on Feb 2, 2022

    @paxter
    Author

    If needed, I can reupload the samples at any time. Just let me know.

  6. paxter commented on Feb 2, 2022

    @paxter
    Author

    The files are mkv and the size is between 1-2 GB.

  7. gphilipp commented on Nov 29, 2024

    @gphilipp

    @paxter would you mind sharing the samples again (links are dead)?

  8. paxter commented on Nov 29, 2024

    @paxter
    Author

    @gphilipp sorry, I can't find them anymore.

  9. jaloji commented on Apr 30, 2025

    @jaloji

    @gphilipp @JeromeMartinez I've some Auro3D files if you want

  10. JeromeMartinez commented on Apr 30, 2025

    @JeromeMartinez
    Member

    I've some Auro3D files if you want

    Still interested (but with same issue about specs)
    jerome@mediaarea.net if is can not be shared publicly.

  11. jaloji commented on Apr 30, 2025

    @jaloji

    @JeromeMartinez Sent.
    Its Auro3D on DTS-HDMA, I don't have Auro3D on PCM yet.

  12. JeromeMartinez commented on May 1, 2025

    @JeromeMartinez
    Member

    Its Auro3D on DTS-HDMA,

    I see no place in the file for encoded extra content.

    on PCM yet.

    If it is hidden in the raw content, this is something we won't implement without a sponsorship because it is not quick to implement, and for Auro3D on DTS-HDMA it would be even worse (not sure we want a DTS-HDMA decoder in MediaInfo, at least by default, we could add a plugin for that).

    So in practice and due to how it is made, little chance that we detect Auro3D...

  13. jaloji commented on May 1, 2025

    @jaloji

    @JeromeMartinez But something strange when its in m2ts I can see Extension Substream with mediainfo but once its in any other container like mkv or mp4 can't see that anymore

  14. JeromeMartinez commented on May 1, 2025

    @JeromeMartinez
    Member

    when its in m2ts I can see Extension Substream

    Please share a m2ts, I'll check if I can find a similar "magic code" in DTS XLL extension (maybe it is inside the XLL extension somewhere).

  15. 4 remaining items

  16. jaloji commented on May 2, 2025

    @jaloji

    Oh yeah ok my bad :/

  17. cjee21 commented on May 14, 2025

    @cjee21
    Contributor

    Not sure how accurate is this post about how it is encoded.

  18. cjee21 commented on May 14, 2025

    @cjee21
    Contributor

    A more authoritative (Auro's founder) source: https://www.audioholics.com/audio-technologies/auro-3d-interview

    The Auro-3D codec uses the 4 least significant bits (a noise floor you can’t hear) to put some metadata in, which allows us to reproduce each channel in high resolution quality.

    It is embedded in 24-bit PCM which may be further encoded with lossless codecs.

  19. almirus commented on May 27, 2025

    @almirus
    Contributor

    Here are a few more examples of files in Auro-3D format:
    https://disk.yandex.ru/d/S4m06yu-VbhySA
    The FLAC files were downloaded from the service:
    https://music.artistconnection.net/dashboard/home/albums/2187/2816

  20. cjee21 commented on May 27, 2025

    @cjee21
    Contributor

    There appears to be some pattern on the 3 least significant bits every 1000 samples looking at the supposedly silent part in the beginning of the video.

  21. JeromeMartinez commented on May 27, 2025

    @JeromeMartinez
    Member

    My understanding is that Auro3D just cheats by storing data in the lower bits, and in that case we need to decode, then reassemble, then catch the Auro3D (still no spec about it).
    decoding is doable with the FFmpeg.
    But without spec, no chance to catch the Auro3D bitstream (reverse engineering? May be easy to catch a magic code for indicating the presence of Auro3D, but likely not much more...)

    I (the main dev) don't plan to do that without sponsorship, but open to patch if someone else does it.

  22. cjee21 commented on May 27, 2025

    @cjee21
    Contributor

    I do not see any easily recognizable pattern in the beginning. So I guess whoever really wants Auro3D detection can look at all the bit-streams and try to find a pattern that can detect Auro3D with high accuracy without false positives.

  23. cjee21 commented on May 27, 2025

    @cjee21
    Contributor

    Looking at two files, I see some repeating pattern but the pattern is different for the two files and repeat at different sample intervals.

  24. almirus commented on May 27, 2025

    @almirus
    Contributor

    The artistconnection service hosts some interesting files in MP4 containers with Auro-3D audio, which MediaInfo recognizes as a3ds. The MPC-HC player even displays the number of audio channels and the sample rate, but of course, it cannot play them.
    https://disk.yandex.ru/d/D057pW3thcrdBA

    LAV Splitter
    LAV Splitter Source (internal)::Audio
    
    Media Type 0:
    --------------------------
    Audio: 0x3361 48000Hz 10ch 1236kbps
    
    AM_MEDIA_TYPE: 
    majortype: MEDIATYPE_Audio {73647561-0000-0010-8000-00AA00389B71}
    subtype: Unknown GUID Name {73643361-0000-0010-8000-00AA00389B71}
    formattype: FORMAT_WaveFormatEx {05589F81-C356-11CE-BF01-00AA0055595A}
    bFixedSizeSamples: 1
    bTemporalCompression: 0
    lSampleSize: 256000
    cbFormat: 18
    
    WAVEFORMATEX:
    wFormatTag: 0x3361
    nChannels: 10
    nSamplesPerSec: 48000
    nAvgBytesPerSec: 154564
    nBlockAlign: 0
    wBitsPerSample: 24
    cbSize: 0 (extra bytes)
    
    pbFormat:
    0000: 61 33 0a 00 80 bb 00 00 c4 5b 02 00 00 00 18 00 a3..�»..Ä[......
    0010: 00 00                                           ..
    
    
    Media Type 1:
    --------------------------
    Audio
    
    AM_MEDIA_TYPE: 
    majortype: MEDIATYPE_Audio {73647561-0000-0010-8000-00AA00389B71}
    subtype: Unknown GUID Name {AFBC2343-3DCB-4047-9655-E1E62A61B1C5}
    formattype: Unknown GUID Name {35189950-CAC9-4C8D-819D-B6FAEE15DD9D}
    bFixedSizeSamples: 1
    bTemporalCompression: 0
    lSampleSize: 256000
    cbFormat: 24
    
    WAVEFORMATEXFFMPEG:
    nCodecId: 0x0000
    
    WAVEFORMATEX:
    wFormatTag: 0x3361
    nChannels: 10
    nSamplesPerSec: 48000
    nAvgBytesPerSec: 154564
    nBlockAlign: 0
    wBitsPerSample: 24
    cbSize: 0 (extra bytes)
    
    pbFormat:
    0000: 00 00 00 00 61 33 0a 00 80 bb 00 00 c4 5b 02 00 ....a3..�»..Ä[..
    0010: 00 00 18 00 00 00 00 00                         ........
    
  25. cjee21 commented on May 27, 2025

    @cjee21
    Contributor

    MediaInfo recognizes as a3ds

    a3ds is "Auro-Cx 3D audio" in MP4 reg.

    Looks like a new codec
    https://www.audioholics.com/news/auro-cx

  26. JeromeMartinez commented on May 27, 2025

    @JeromeMartinez
    Member

    The MPC-HC player even displays the number of audio channels and the sample rate

    I have channelcount / samplesize / samplerate in the MP4:

    00001CE       Audio (103 bytes)
    00001CE        Header (8 bytes)
    00001CE         Size:                           103 (0x00000067)
    00001D2         Name:                           a3ds
    00001D6        Reserved:                        0 (0x0000000000000000)
    00001DC        Data reference index:            1 (0x0001)
    00001DE        reserved (0):                    0 (0x00000000)
    00001E2        reserved (0):                    0 (0x00000000)
    00001E6        channelcount (2):                10 (0x000A)
    00001E8        samplesize (16):                 24 (0x0018)
    00001EA        pre_defined (0):                 0 (0x0000)
    00001EC        reserved (0):                    0 (0x0000)
    00001EE        samplerate:                      48000 (0xBB80)
    00001F0        samplerate (0):                  0 (0x0000)
    00001F2        acxd (47 bytes)
    00001F2         Header (8 bytes)
    00001F2          Size:                          47 (0x0000002F)
    00001F6          Name:                          acxd
    00001FA         Unknown:                        (39 bytes)
    

    These fields use to be invalid in e.g. AAC when it is not MOV, so I don't read out them, but I can add an exception for this CodecID.

    a3ds is "Auro-Cx 3D audio" in MP4 reg.

    I need to update my DB :).

  27. cinema-ONE commented on Aug 22, 2026

    @cinema-ONE

    @cjee21's observation from May was right, and it resolves cleanly. I ended up chasing this for a media-server badge and have put the working method under MIT in case it is useful here: https://github.com/cinema-ONE/auro3d-detector

    No spec, no SDK, no NDA — everything below was measured from purchased discs plus Auro's published white papers and patent US8620465.

    Presence — an exact marker, not a statistical one

    Each block opens with sixteen consecutive 1-bits in bit 0, written at the same sample offset in every carrier channel, on a regular grid at a constant phase.

    Auro ch0:  0000 1111111111111111 0010     <- 16 ones, then a 0, then payload
    Auro ch1:  0000 1111111111111111 0010        all channels, same instant
    Auro ch2:  0000 1111111111111111 0000
    DTS:X ch0: 0111 1010100100110000 0100     <- same samples, no structure
    

    Two things make it safe to key on:

    The grid is per-stream and must be discovered. This is why two files looked like they repeated at different intervals: 800, 960, 1000 and 1024 samples all occur, and 1000 and 1024 each appear at both 48 kHz and 96 kHz. It does not follow the sample rate, so a hard-coded 1000 passes the common case and silently misses the rest.

    Require multi-channel phase agreement. A band-limited LFE throws long runs of 1s constantly — one DTS:X control gave 5,149 chance hits on its LFE alone. Requiring ≥2 channels to agree on one phase (mod grid) removed every false positive.

    Also confirmed: bit-stuffing is real — every 16th bit after the sync is 0, in 200 of 200 blocks on a channel whose payload is otherwise random. That is what makes the sync unambiguous.

    Cost

    Decoding ~1 second via ffmpeg is enough (~48 syncs). The whole check ran in 0.13 s wall clock including the ffmpeg call, in unoptimised Python. That may make this cheaper than the plugin/decoder concern above — it needs a decode, but only a very short one.

    Layout — works, but explicitly best-effort

    Header bits 40–45, read in bit planes 0, 1 and 2 on a channel carrying no payload, map to the Auro layout. Bit 0 alone cannot separate 9.1 from 11.1.

    bit 0 bit 1 bit 2 layout
    101011 001001 001101 Auro 9.1
    101000 001010 001101 Auro 10.1
    101011 001010 001100 Auro 11.1
    101011 001011 001101 Auro 13.1
    101011 001011 001100 Auro 11.1 (7+4)

    I want to be straight about the confidence split, because it is not the same for both halves:

    • Presence is solid. Confirmed in both directions by an Auro-3D-certified hardware decoder (StormAudio ISP Elite MK2, read over its TCP API) across 29 Auro tracks and 18 controls — TrueHD Atmos, AC-3, DTS:X and ordinary DTS-HD MA/HRA films.
    • Layout is best-effort. The mapping was derived by correlation against decoder-labelled streams, then blind-tested on ten it had never seen: nine valid trials, nine correct. It is not a parse of the format. CRC16-CCITT did not validate over any contiguous span I tried, so block framing is still not understood, and I cannot promise it generalises beyond the corpus.

    Two dead ends are documented in the repo so nobody repeats them: a plausible rule based on which channels carry payload survived seventeen decoder readings and was then falsified, and the CRC brute-force found nothing.

    Corpus was two Auro-3D demonstration Blu-rays swept track-by-track (175 streams), two commercial remuxes and a demo-trailer set. Happy to answer questions on any of it, or to run specific samples if that would help.

  28. cjee21 commented on Aug 22, 2026

    @cjee21
    Contributor

    @cinema-ONE There is already a PR that mentioned this issue (see above) that has reverse engineered this as well and has CRC computation.

  29. cinema-ONE commented on Aug 22, 2026

    @cinema-ONE

    @cjee21 thank you — that is a much better answer than mine, and I should have found #2531 before posting. @almirus has the actual parse where I only had a correlate.

    Rather than duplicate it, I ran Orua-D3 against my corpus as an independent check, because the one thing this thread has never had is verification against certified hardware rather than against another software implementation.

    Orua-D3 vs a hardware decoder: 7 of 7

    Ground truth is a StormAudio ISP Elite MK2 (Auro-3D certified), read over its TCP API — ssp.stream names the format and ssp.format gives the layout. Files it had never seen, two demonstration Blu-rays and two commercial remuxes:

    file StormAudio Orua-D3
    DragonHeart (1996), DTS-HD MA 7.1 13.1 7.1_5H_1T match
    Trinnov "Arrival" trailer 13.1 7.1_5H_1T match
    Daylight (1996), DTS-HD MA 5.1 11.1 5.1_5H_1T match
    Auro-3D Demo Disc 2014, stream 00000 9.1 5.1_4H match
    Auro-3D Demo Vol.2, stream 00021 (96 kHz) 9.1 5.1_4H match
    control — Dolby Atmos (TrueHD) none (nothing) match
    control — DTS:X none (nothing) match

    Both negatives are worth noting: the DTS:X control is a file that sits in a folder named Auro-3D, with Auro-3D in its filename, and contains no Auro layer at all. Orua-D3 correctly declines it.

    So the ADOL/opcode-0x1E route reproduces a certified decoder exactly, on material chosen independently of it. If the blocker on #2531 is confidence rather than effort, that may help.

    Why my own CRC attempt failed, since it may save someone else the time

    I could not get CRC16-CCITT to validate over any contiguous span — seven variants, all start offsets to 47, lengths to 223. The reason is now obvious: @almirus computes it over all three bytes of every 24-bit sample (with & 0xFD on the first byte of the first 16), whereas I was searching spans of the extracted LSB bitstream. Wrong data domain — no search of my space could ever have found it.

    For the record, the parts of my write-up that were independently correct still hold — the 16-sample sync, and that block size varies per stream (800/960/1000/1024 observed, with 1000 and 1024 at both 48 and 96 kHz). @almirus reads that properly from the header instead of discovering it empirically, which is strictly better.

    I've updated my repo to point at Orua-D3 as the more complete work. Happy to run further samples against the hardware decoder if additional validation would be useful to #2531 — that is the one thing I can offer that a software-only comparison cannot.

  30. cjee21 commented on Aug 22, 2026

    @cjee21
    Contributor

    There's more information here as well though I cannot read it without AI translator:
    https://touch-max.ru/zvuk/auro-3d-kak-v-obychnom-pcm-pryachut-vysotnye-kanaly

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions