Jak hakowałem Dolby Digital EX – historia z czasów modemów, impulsów i bitów

W czasach, gdy Internet nie był oceanem informacji, ale kapryśnym sygnałem telefonicznym, który kosztował realne pieniądze za każdą rozpoczętą trzyminutówkę, kino domowe wyglądało inaczej.
Nie było automatycznej kalibracji, eARC, forów, Discordów ani filmów „10 rzeczy, których nie wiesz o Dolby Digital”.

Był Usenet, modem 56k, i ludzie, którzy wiedzieli, że jeśli coś ma działać, to trzeba to najpierw zrozumieć.

Wśród nich – ja, który na przełomie wieków robiłem rzeczy, które dziś nazwalibyśmy… reverse engineeringiem.

Epoka offline: kiedy pobieranie postów było rytuałem

Początek lat 2000.
Internet działał tylko, gdy modem dosłownie zadzwonił do sieci.
Każdy impuls telefoniczny = pieniądze.
Dlatego robiło się to tak:

  • Szybkie połączenie
  • Pobranie wszystkich nowych wiadomości z grup
  • Natychmiastowe rozłączenie
  • Czytanie i pisanie odpowiedzi offline
  • Ponowne połączenie na kolejne trzy minuty, tylko po to, by je wysłać

Tak wyglądało „forum audio” w 2002 roku.
I właśnie w takim środowisku rodziły się najbardziej szczegółowe analizy kina domowego w Polsce.

Dolby Digital EX – technologia, która budziła kontrowersje

Wtedy Dolby Digital EX było gorącym tematem.

Jedni twierdzili, że działa.
Inni – że nie.
Jeszcze inni – że wszystko zależy od tego, czy flaga EX została poprawnie ustawiona na płycie DVD.
A producenci filmów… bywali niekonsekwentni.

Do tego dochodziła tajemnica:
czy ścieżka z lektorem nadal ma zakodowany kanał matrycowany EX, czy nie?

Ludzie próbowali to ustalić słuchem.
Ja – nie.

Ja sprawdzałem bity w strumieniu AC-3.

Reverse engineering: Surroundmaniak kontra strumień Dolby Digital

Podczas gdy przeciętny użytkownik patrzył w instrukcję amplitunera i zastanawiał się „czemu ta lampka EX nie świeci”, ja otwierałem pliki zgrane z płyty DVD, analizowałem ramki AC-3 i sprawdzałem, które bity zmieniają się między różnymi ścieżkami audio.

To nie była zabawa w „wydaje mi się”.
To była analiza od poziomu zero-jedynkowej fizyki dźwięku.

To była epoka, w której prawdziwi pasjonaci kina domowego rozkręcali temat od strony, od której nawet Dolby by się uśmiechnęło.

Oryginalny post z grupy pl.rec.kino-domowe z 2002 roku

From: "Radoslaw POZNANCZYK" <jedi_master@kinotechnikaSPAMER_W_PIEKLE_SMAZYC_SIE_BEDZIE.pl>
Newsgroups: pl.rec.kino-domowe
References: <3DEB41C9.13BEDC71@po.opole.pl> <asg31g$avl$1@news.onet.pl> <3DEC6AD2.B12AD8AE@po.opole.pl> <ashsoh$ha0$1@news.onet.pl> <3DEC9B89.798E2C69@po.opole.pl> <asi6pn$fct$1@news.onet.pl> <3DEC9FCC.39F82456@po.opole.pl> <asi7rf$iar$1@news.onet.pl> <3DECAAD6.E4FB427@po.opole.pl> <asia74$p97$1@news.onet.pl> <asibaq$scj$1@news.onet.pl> <3DECB3AA.16FAC794@po.opole.pl> <asid4g$3vk$1@news.onet.pl> <asido3$5hh$1@news.onet.pl> <3DECBD6C.6D3D75B4@po.opole.pl>
Subject: Re: Gdzie ten DD-EX?
Date: Wed, 4 Dec 2002 11:19:19 +0100
Lines: 232
MIME-Version: 1.0
Content-Type: text/plain;
	charset="iso-8859-2"
Content-Transfer-Encoding: 8bit
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1106
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106

Witam Panów Crackerów ;-)

>> Znalazlem jeszcze cos takiego, co byc moze potwierdza teorie, ze te
>> 2 bity ktore sie zmieniaja sa bardzo wazna informacja.
>
> Moze rzeczywiscie to jest to. Ciekawe czy zmiana ich na "statyczne"
> hex'y cos da? Byc moze bedzie kulturalnie gral jako DD 5.1.

Wydaje mi się, że to co chcesz zrobić to przysłowiowe szukanie igły w
stogu siana. Mało tego! Jest jeszcze więcej problemów. W pierwszym
poście pytasz się gdzie i czy są wkodowane tylne kanały w DD. Wnioskuję
z tego że raczej są małe szanse sukcesu...

Dziwi mnie twierdzenie większości, że pierwsza ścieżka DD LOTR jest
Surround EX, a druga z dodanym lektorem już nie jest Surround EX. Czyżby
oprócz dodania lektora do kanału centralnego, ponownie zmiksowali kanały
surround, tak aby kompletnie zepsuć efekt Surround EX? Sądzicie tak
tylko dlatego, że Warner napisał że ścieżka z lektorem nie jest 'EX'?
Niby czym mają się różnić kanały surround w jednej i w drugiej ścieżce?
To że jedna ścieżka ma flagę EX a druga nie to o niczym nie świadczy.
Obie są ścieżkami dla rozszerzenia EX i tyle.
No dobrze, to była tylko taka dygresja przed najważniejszym tematem.

Widzę że zaopatrzyłeś się w porządny edytor (UltraEdit), więc można
zacząć zabawę. Jednak nie do końca będzie to zabawa, bo będą także
smutne akcenty.

Chcesz wyciąć flagę EX ze strumienia DD? Wiesz już że ramka strumienia
ma pewien "nagłówek", który powtarza się co jakiś czas. Ja mogę tą flagę
EX znaleźć bez problemu, ale to nie rozwiązuje problemu. Sprawa jest
dużo bardzie skomplikowana niż Ci się wydaje (takie mam wrażenie po
Twoich postach). Więc zacznijmy najpierw zabawę, a smutne rzeczy pójdą
na koniec.

Po pierwsze jeśli chcesz cokolwiek sensownego zrobić ze strumieniem
Dolby Digital, to musisz przejrzeć ten dokument:
http://www.atsc.org/standards/a_52a.pdf - bez tego ani rusz!!! To jest
jakieś 140 stron, ale ładnie, przystępnie i przejrzycie wyłożone - same
konkrety. Nawet początkujący programista powinien to łyknąć
bezproblemowo.

OK, wyciąłem sobie kawałek ścieżki dźwiękowej (jakieś parę sekund) z
Pearl Harbor (ma flagę Surround EX w strumieniu na 100%). Odpalam
UltraEdit i co widzę:

0b 77 46 17 1c 30 e3 fc 19 cb d9 65 c0 00 07 e0
bf da 96 a0 a0 80 00 14 60 78 18 0e 89 8d 8d 80
.... itd.

No widzę liczby w kodzie szesnastkowym.

W zasadzie nas interesuje pierwsza linijka. Zaczyna się pięknie od
16-bitowego słowa zawierającego informację o synchronizacji. Tak, to
właśnie 0b 77. Zamienię sobie pierwszą linijką na kod binarny abym mógł
operować na pojedynczych bitach:

0000101101110111010001100001011100011100001100001110001111111100
0001100111001011110110010110010111000000000000000000011111100000

Zrobiłem to tylko dla pierwszej linijki kodu szesnastkowego. Teraz
bazując na tym co jest w dokumencie
http://www.atsc.org/standards/a_52a.pdf  mogę bezproblemowo i bezbłędnie
rozszyfrować wszystkie bity i je zinterpretować (podana tam jest liczba
bitów przypadająca na każdą flagę i może to być 1 bit, 2, 3, 4, 5, 6,
itd.):

UWAGA: Jeśli wcięcia są nieczytelne, to musicie sobie zmienić czcionkę
na taką o stałej szerokości liter, np. Lucida, Verdana, Courier New.

----początek_syncinfo----

0000101101110111 syncword (informacja o synchronizacji czyli właśnie
magiczne 0b77) - 16 bitów

0100011000010111 crc1 też 16 bitów

00   fscod (zakodowana częstotliwość próbkowania - 00 oznacza 48kHz) 2
bity

011100   frmsizecod (długość ramki. 11100 to 28, i z tablicy mozna
wyczytac że ta liczba odpowiada długości 1535bitów)

-----koniec_syncinfo-----

To było pierwsze 40 bitów (po kolei). Powyższe flagi występują zawsze w
każdym strumieniu DD. Ważny tutaj jest kod crc1 który odpowiada za
pierwszą 5/8 część ramki. crc2 jest na końcu drugiej części ramki i nas
to teraz nie interesuje. Chodzi o to że dekoder może zacząć dekodować
strumień już w momencie kiedy dotrze do niego pierwsza część ramki (o
ile CRC wyliczone przez dekoder będzie się zgadzało z crc1). I to jest
problem, ponieważ jeśli zmienisz choć jeden bit w edytorze to musisz
policzyć od nowa kod CRC. Jeśli zostawisz stary kod, to dekoder nie
odtworzy żadnego dźwięku. Teraz policz sobie CRC dla każdej ramki, a
tych ramek przecież miliony jest. Ale co tam, idziemy dalej:

Po bloku synchronizacji mamy blok informacji o strumieniu - czyli to co
nas bardzo interesuje.

------początek_bsi-------

00110        bsid (identyfikacja strumienia - standartowo
             jest 01000 a tu 00110 bo zmieniła się specyfikacja
             strumienia DD - więcej szczegółów później)

000          bsmod (tryb strumienia bitów. Tu 000 oznacza 'main
             audio service: complete main (CM)'

111          acmod (tryb kodowania dźwięku. Tu 111 oznacza
             3/2 czyli L, C, R, SL, SR)

 00          cmixlev (poziom miksowania kanału centralnego.
             Tu 00 oznacza -3dB)

 01          surmixlev (poziom miksowania kanału surround.
             Tu 01 oznacza -6dB)

1            lfeon (kanał niskich częstotliwości włączony bo 1)

11111        dialnorm (normalizacja dialogu. Tu 11111 to w
             kodzie dziesiętnym 31 czyli -31dB, i oznacza
             to jednocześnie że dekoder odtworzy taką ścieżkę
             4dB poniżej referencyjnego poziomu głośności.
             Czyli gdybyśmy porównywali tą sama ścieżkę ale w
             DTS, to ta byłaby 4dB głośniejsza)

1            compre (czy istnieją dane opisujące sposób
             kompresji dynamiki? Tutaj istnieją, bo compre = 1,
             a w następnej linijce są właśnie te dane zapisane
             na ośmiu bitach. Te osiem bitów w każdej
             następnej ramce będzie zazwyczaj inne)

 00000110    compr /* bo compre = 1 */

0            langcode (czy istnieje kod języka? Nie. Poniżej
             nie ma langcod bo langcode = 0)

1            audprodie (czy istnieją informacje o produkcji
             ścieżki? Tak, i dlatego poniżej mamy te
             informacje w dwóch linijkach, czyli razem 7 bitów)

 11001       mixlevel (absolutny poziom ciśnienia akustycznego
             pojedynczego kanału. Tu 11001 w kodzie
             dziesiętnym będzie 25.
             Czyli 80dB+25dB to jest 105dB.
 01          roomtyp (typ pomieszczenia mikserskiego.
             Tu 01 oznacza 'large room, X curve monitor'
             czyli pomieszczenia mikserskie jakich się
             zazwyczaj używa przy tworzeniu ścieżek filmowych.
             To oznacza, że gdy oglądamy taki film w domowych
             warunkach, to wypadałoby włączyć jakiś tryb THX
             z funkcją Re-Equalizacji)

1            copyrightb (materiał chroniony prawami autorskimi)

1            origbs (oryginalny strumień)

1            xbsi1e (kiedyś to był timecod1e, ale do niczego
             się nie przydawał. Jeśli xbsi1e = 1 to poniżej
             mamy pięć całkiem nowych flag)
 01          dmixmod (preferowany sposób downmiksu do dwóch
             kanałów Są dwa sposoby: Lt/Rt i Ro/Lo.
             Tu 01 oznacza 'Lt/Rt downmix preferred')
 100         ltrtcmixlev (po downmiksie do dwóch kanałów,
             wskazuje na nominalny poziom głośności kanału
             centralnego w odniesieniu do kanałów Lt/Rt.
             Tu 100 oznacza -3dB)
 101         ltrtsurmixlev (to samo ale dla kanału surround.
             Tu 101 oznacza -4.5dB)
 100         lorocmixlev (to samo ale dla downmiksu Ro/Lo)
 101         lorosurmixlev (to samo)

1            xbsi2e (kiedyś to był timecod2e, ale do niczego
             się nie przydawał, więc w nowej specyfikacji
             mamy coś takiego, i z tym właśnie mają problemy
             niektóre dekodery, jednak sama flaga dsurexmod
             która jest poniżej to nie problem. Problemem
             jest to, że w ogóle są wykorzystywane te
             timecody w nieco inny sposób. Jak widać, oprócz
             flagi EX jest parę innych nowych flag)
 10          -=]]]dsurexmod[[[=- 10 oznacza 'Dolby Surround
             EX encoded'
 00          dheadphonmod (wskazuje czy ścieżka dźwiękowa
             była przygotowana dla słuchawek. Tu nie)
 0           adconvtyp (typ przetwornika analogowo-cyforwego.
             Tu 0 oznacza standardowy. 1 oznaczałaby HDCD)
 00000000    xbsi2 (dodatkowe informacje o strumieniu.
             Na razie nie wykorzystywane.
             Powinny być zera i są zera)
 0           encinfo (informacje kodera. Dekoder z tego
             nie korzysta)

0            addbsie (czy istnieją dodatkowe informacje
             o strumieniu?  Tutaj nie, dlatego BSI się
             kończy a zaraz potem zaczyna audblk.
             Jeśli addbsie było by równe 1 to można zawrzeć
             po tym jeszcze maksymalnie do 64 BAJTÓW
             informacji)

------koniec_bsi----- /* bo addbsie = 0 */

A reszta to już 'audblk' czyli skompresowane próbki dźwięku
i parę innych rzeczy

000001111110000010111111110110101001011010100000101000001000000000000000
000101000110000001111000000110000000111010001001100011011000110110000000
itd., itp.

Podsumowując:

Nie zrobisz niczego sensownego jedynie przy pomocy UltraEdita. No chyba
że będziesz na piechotę liczył kody CRC dla każdej ramki ;-). Poza tym
niektóre zmiany spowodują że trzeba będzie wyciąć niektóre flagi, a to z
kolei pociąga za sobą przesunięcie całego bloku danych skompresowanych
ku początkowi ramki. Blok ten jest zawarty w jednej i drugiej części
ramki (5/8 i 3/8 cześć ramki), w związku z czym także musisz policzyć od
nowa drugi kod CRC dla tej drugiej części ramki. Po bloku danych
skompresowanych masz jeszcze blok AUXDATA który zawiera niewykorzystaną
przestrzeń (może się tak zdarzyć jeśli do zakodowania dźwięku nie
potrzeba będzie więcej bitów) i ta przestrzeń jest także oflagowana
flagą o nazwie auxdatal, która mówi o długości tego niewykorzystanego
bloku.

Generalnie wszystko jest oczywiście do zrobienia, ale na pewno nie
ręcznie. Jeśli masz ochotę, napisz jakiś programik którzy wszystkie
czynności wykona automatycznie. Dałem Ci wskazówki co, jak i gdzie. Mój
dekoder poprawnie dekoduje strumień z nowymi flagami, dlatego nie jestem
aż tak zdeterminowany do działania w tym kierunku.

Pozdrawiam cyfrowo

Radosław Poznańczyk    |    www.sm.kinotechnika.pl

Tam, gdzie inni słuchali – ja analizowałem bity

Nie definiował mnie sprzęt. Nie definiowały mnie logotypy Dolby, DTS czy THX na frontach amplitunerów.

Tym, co naprawdę tworzyło Surroundmaniaka, była głęboka potrzeba zrozumienia. Nie powierzchownego, nie „na ucho”, lecz takiego, które sięga do samych fundamentów – do ramek, hexów i bitów, w których zakodowany jest dźwięk.

To była era, w której:

nie było tutoriali,
nie było filmów typu „Dolby Digital EX explained”,
nie było forów z gotowymi FAQ,
a clickbaity o ustawieniach kina domowego jeszcze nie istniały.

Jeśli coś nie działało, nie było gdzie wpisać pytania. Można było co najwyżej… rozłożyć strumień AC-3 na czynniki pierwsze.

I właśnie to robiłem jako Surroundmaniak.

Wchodziłem tam, gdzie inni się nie zapuszczali – głęboko w sygnał, między bity i matryce surround. Nie po to, żeby zgadywać. Po to, żeby wiedzieć.

To była mentalność pionierów kina domowego. Epoka, w której prawdziwy pasjonat nie czekał na aktualizację firmware’u – sam analizował, dlaczego flaga EX jest tu, a nie tam, i czy jej brak naprawdę oznacza brak informacji.

Czemu o tym piszę?

Aby pokazać, jak wyglądało hobby audio zanim stało się wygodną aplikacją.
Kiedy trzeba było:

grzebać,
analizować,
kombinować,
testować,
i przede wszystkim – rozumieć.

To była prawdziwa era Maniaków Surround.
Era, w której wiedza była orężem, a każdy post na Usenecie mógł zmienić czyjeś brzmienie… albo rachunek telefoniczny.

Wspomniany w treści posta dokument opisujący standard telewizyjny AC-3 (http://www.atsc.org/standards/a_52a.pdf), jest obecnie dostępny w zaktualizowanej wersji z 2018 roku tutaj: https://www.atsc.org/a52-2018. Głównie dodano specyfikację E-AC-3.

Podobne wpisy

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *