Umíme to s Delphi: 141. díl – rozšířená hlavička, padding, patička ID3v2 tagu

Dnešní článek navazuje na problematiku otevřenou před týdnem. Budeme pokračovat v podrobném popisu formátu a struktury ID3v2 tagu, s nezbytným úvodním připomenutím toho, kam jsme dosud došli. Následně se podíváme na tři sekce tagů: na rozšířenou hlavičku, na padding a na patičku ID3v2 tagů.

Vítejte u dalšího pokračování našeho nekonečného seriálu. Dnes bezprostředně navážeme na téma, kterému jsme se věnovali minule, a to podrobnějšímu rozboru formátu a struktury tagů ID3v2.

Minule jsme začali rozebírat dokument uvedený na URL http://www.id3.org/id3v2.4.0-structure.txt. Jedná se o podrobnou specifikaci formátu a struktury ID3v2 tagů. My nebudeme na stránkách Živě podrobně rozebírat celý kompletní dokument, protože by nám to zabralo několik dalších dílů seriálu, ale zaměříme se na nejdůležitější fragmenty tagů ID3v2.

Pokud nemáte tušení, co zkratka ID3v2 znamená a o čem tedy celý dnešní díl vlastně je, doporučuji vám podívat se nejprve na předchozí díly, a to především na:

  • díl 136, který se zabývá obecným popisem ID3 tagů jako takových
  • díl 137, jehož náplní je praktická implementace podpory ID3 tagů v programech
  • díl 138 zabývající se také praktickou implementací, tentokráte modifikací ID3 tagů
  • díl 139, který zevrubně popisuje právě druhou verzi tagů (ID3v2) a shrnuje rozdíly mezi jednoduchou první a sofistikovanou druhou verzí
  • díl 140, který podrobně rozebírá formát a strukturu hlavičky ID3v2 tagů.

Na samotný úvod dnešního článku si ještě jednou připomeňme, jak takový ID3v2 tag vypadá. Povšechně se lze na ID3v2 tag dívat takhle:

+--------------------------------------+
|     Hlavička (Header) - 10 bajtů     |
+--------------------------------------+
| Rozšířená hlavička (Extended Header) |
|     (proměnná délka, NEPOVINNÁ)      |
+--------------------------------------+
|             Rámce (Frames)           |
|            (proměnná délka)          |
+--------------------------------------+
|               Padding                |
|     (proměnná délka, NEPOVINNÁ)      |
+--------------------------------------+
|            Patička (Footer)          |
|         (10 bajtů, NEPOVINNÁ)        |
+--------------------------------------+

V minulé části jsme se dostali k hlavičce tagu. Řekli jsme si, jak vypadá, z jakých informací se skládá a jakým způsobem díky znalosti uvedených informací detekovat přítomnost ID3v2 tagu v MP3 souboru.

Dnes navážeme další sekcí, a tou je rozšířená hlavička.

Rozšířená hlavička ID3v2 tagu (Extended Header)

Rozšířená hlavička slouží k uchování informací, které umožní další vhled do struktury tagu. Tyto informace však nejsou nezbytně nutné k "rozparsování" tagu, a proto je rozšířená hlavička nepovinná. Také my se jí budeme zabývat jen velmi povrchně.

Takže: obsahem rozšířené hlavičky jsou (z nejobecnějšího pohledu) tři údaje:

  • Extended header size 4 * %0xxxxxxx
  • Number of flag bytes $01
  • Extended Flags $xx

Extended header size udává velikost celé rozšířené hlavičky a nemůže být nikdy menší než 6 bajtů.

Pole rozšířených flagů, jehož velikost je udaná údajem Number of flag bytes, je definováno následovně:

%0bcd0000

Každý flag, který je v rozšířené hlavičce nastaven, obsahuje dále svá vlastní data. Pořadí dat souvisejících s jednotlivými flagy je přitom neměnné a odpovídá pořadí flagů, například data týkající se flagu d jsou vždy umístěna za daty souvisejícími s flagem c. Flagy, které nejsou nastavené (jejichž hodnota je 0) nemohou mít žádná související data. Při modifikaci tagu je vždy nutné zajistit splnění následujících dvou podmínek:

  • neznámé flagy musí být nastaveny na 0,
  • jejich související data musí být z tagu odstraněna.

Data každého flagu začínají bajtem udávajícím jejich délku (jako hodnotu v rozmezí 0 a 128, neboli $00 až $7f). Následují samotná data. Pokud flag nemá žádná související data, je pro udání jejich délky použita hodnota $00.

Nyní se pojďme velmi stručně podívat na význam jednotlivých položek rozšířené hlavičky. Budeme opravdu poměrně povrchní, protože zřejmě nemá smysl zabíhat úplně do hloubky; případní zájemci si podrobnosti snadno dohledají na uvedené webové adrese.

b - tag je update

Je-li nastaven flag b, je nalezený tag updatem tagu nalezeném dříve v aktuálním souboru nebo streamu. Rámce (definované jako unique, viz později) nalezené v tomto tagu mají vyšší prioritu (a měly by tedy přepsat) jakékoliv odpovídající rámce nalezené dříve.Tento flag nemá žádná související data, délka tagu (údaj Flag Data Length) je $00.

c - jsou obsažena data CRC

Pokud je nastaven flag c, znamená to, že v rozšířené hlavičce jsou obsažena data CRC-32. CRC je přitom vypočteno ze všech dat mezi hlavičkou a patičkou, jak je indikováno polem Tag Lenght Field v hlavičce tagu (tímto polem jsme se zabývali posledně), po odečtení délky rozšířené hlavičky. Flag data length je vždy $05. Pro případné čtenáře, kteří se dosud nesetkali s pojmem CRC, dodejme, že CRC součty jsou jednou z metod, jak ověřit integritu dat a jak pomocí matematických výpočtů ověřit správnost, konzistenci a integritu testovaných údajů. Jinak řečeno, pomocí CRC součtu lze ověřit, že celý tag je neporušen a že jsme jej (například ze streamu) přečetli správně.

d - omezení tagu

Pro některé aplikace může být užitečné, pokud můžeme omezit tag více než je umožněno definicemi v jeho originální specifikaci. Omezeními tagu se nebudeme zabývat podrobně, pouze uvedeme, že "omezením" typicky neovlivníme způsob, jakým je tag dekódován, spíše jako ovlivníme způsob, jakým je tag vytvářen.

Flag může být přitom omezen následujícími způsoby:

  • omezení velikosti tagu: lze nastavit maximální velikost tagu, a to např. na hodnotu 128 rámců/1 MB celková velikost tagu, na hodnotu 64 rámců/128 KB apod.
  • kódování textu: lze omezit způsob, jakým jsou kódovány řetězce, například na hodnoty ISO-8859-1 nebo UTF-8
  • omezení velikosti jednotlivých položek tagu: lze nastavit maximální délku jednotlivých řetězců v tagu, a to například na hodnotu 1024 znaků, 30 znaků apod.
  • omezení kódování obrázků: lze nastavit, jakým způsobem mohou být kódovány obrázky uložené v tagu, a to například na hodnoty PNG nebo JPEG
  • omezení velikosti obrázků: lze nastavit, jaká je maximální velikost obrázků uložených v tagu, a to například na hodnotu 256x256 pixelů, na hodnotu 64x64 pixelů apod.

Tolik k definici rozšířené hlavičky tagu. Nešli jsme příliš do hloubky, avšak věřím, že pro základní představu o významu a obsahu rozšířené hlavičky předchozí informace postačovaly.

Nyní se pojďme podívat na to, jaký význam má další z nepovinných sekcí v ID3v2 tagu, a to tzv. Padding. Při pohledu na výše uvedené schéma si možná říkáte, že jsme vynechali nejdůležitější sekci celého tagu, a tou jsou samotné rámce, protože jsme přeskočili od rozšířené hlavičky (umístěné v úvodu tagu) k paddingu, který je na samotném konci. Je to opravdu tag, rámce jsou nejpodstatnější součástí tagu a obsahují samotná data o skladbě. Právě proto jim budeme věnovat větší prostor, a to pravděpodobně v následující části seriálu.

Padding

Padding, v překladu cosi jako "vycpávka", je nepovinnou součástí tagu a pokud je obsažen, najdeme jej na úplném konci tagu namísto patičky. Jinak řečeno, v žádném tagu nenajdete obě součásti, jak patičku tak padding. Tag vždy obsahuje jen jednu z těchto dvou položek.

Jaký je význam vycpávky? Jejím použitím můžeme zjednodušit přidávání dalších rámců do tagu, případně modifikovat (zvětšovat) aktuálně používané rámce bez nutnosti přepsat celý soubor. Hodnota všech bajtů obsažených v padding musí být $00. Tag nesmí obsahovat žádnou vycpávku mezi jednotlivými rámci nebo mezi hlavičkou a prvním rámcem. Kromě toho, tag nesmí obsahovat žádný padding v případě, že je obsažena patička tagu.

Jinak řečeno, použitím Paddingu znamená připojení určitého počtu nulových bajtů na samotný konec tagu. Význam tohoto kroku je zřejmý: při nutnosti rozšířit jakkoliv tag (přidat nové rámce, rozšířit stávající rámce apod.) není nutné přepisovat celé okolí tagu (typicky celý soubor), stačí pouze zaměnit nulové (vycpávkové) bajty požadovanými informacemi (rámci).

Ještě jeden pohled na věc: použijeme-li padding, je jeho velikost přičtena k celkové velikosti rámců a tedy ovlivňuje celkovou velikost tagu (která je uvedena v hlavičce tagu, jak jsme si ukázali posledně). Celková, skutečná velikost rámců je ale menší než údaj v hlavičce, protože ten započítává i velikost vycpávky. Jinak řečeno, použitím vycpávky způsobíme, že skutečná velikost rámců bude menší než údaj v hlavičce tagu. Jinak řečeno, tag můžeme následně bezbolestně rozšiřovat až do okamžiku, kdy skutečná velikost rámců bude rovna údaji v hlavičce (což nastane v okamžiku, kdy přepíšeme celou vycpávku).

Poslední sekcí, na kterou se dnes podíváme, je patička tagu (Footer).

Patička tagu (Footer)

Patička tagu je nepovinnou sekcí (s jedinou výjimkou, viz níže), takže nemusí být v tagu obsažena. Jejím použitím můžeme zvýšit rychlost procesu lokalizování ID3v2 tagu v souboru, a to v případě, že prohledáváme soubor od jeho konce.

Jediným případem, kdy je použití hlavičky z definice vyžadováno a tedy povinné, je situace, v níž je tag připojen k souboru, tedy kdy je tag umístěn až za všemi audio daty.

Patička je ve své podstatě kopií hlavičky a obsahuje také stejné informace: jedinou výjimkou je identifikátor hlavičky, který je zrcadlově obrácen. Neobsahuje tedy znaky "ID3", ale "3DI".

Na strukturu patičky se můžete podívat zde:

     ID3v2 identifier           "3DI"
     ID3v2 version              $04 00
     ID3v2 flags                %abcd0000
     ID3v2 size             4 * %0xxxxxxx

Kromě modifikovaného identifikátoru jsou všechna ostatní pole stejná, mají stejnou strukturu i význam.

Na závěr

V dnešním článku jsme se podívali na to, jakým způsobem jsou organizovány další tři důležité sekce ID3v2 tagů: rozšířená hlavička (Extended Header), vycpávka (Padding) a patička (Footer). Vysvětlili jsme si význam těchto sekcí a definovali jejich povinnou strukturu.

V příští části nás čeká nejdůležitější sekce celého tagu, a tím jsou samotné rámce obsahující data. Těším se nashledanou.

Váš názor Další článek: Novell představil ZenWorks 7 a SuSE Professional 9.3

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,