RLE a Huffmanovy kodeky: ======================== Optimalni sada 4 Huffmanovych kodeku (0003-001C, 0004-001D az 0004-001F) spolu s distribucni tabulkou pro jednotlive stupne zkresleni (viz Wavelet- quant.txt) a Mallatovy bloky je popsana v souborech: tuning.txt odkazy na kodeky, distribucni tabulka podle stupne zkresleni a cisla Mallatova bloku 0003-001C.txt definice jednotlivych Huffmanovych kodeku, 0004-001X.txt nejdulezitejsi je sloupecek c. 2 a c. 6 (posledni) KODER: ====== Kodovani ZRLE (preskakovani nulovych sekvenci): ----------------------------------------------- Pouziva se u kodeku 0004-XXXX (cislo 1 az 3). Po male uprave by se dalo pouzit i pro kodek 0003-XXXX (trochu by to zhorsilo kompresni pomer, ale HW navrh by byl jednodussi). Citac nul je 10-bitovy a pocita od 0 do 1023. Pri dosazeni hodnoty 1023 se bez ohledu na pokracovani vzdy vyprazdni citac (flush). Citac se tez musi vyprazdnit na konci kazdeho Mallatova bloku! Nacitana hodnota Z - spodnich 5 bitu (Z0 az Z4) se posle do tabulky obsahujici kod (pokud je Z5 az Z9 nenulove, tabulka se indexuje nulou! - nulovy pocet nul jinak nevyuziji). Tabulka pro jeden kodek: 32 x 12 bitu Polozka tabulky: direct:1 Huff-kod:8 delka:3 /---------------------------------------------------------------------------------\ | Z5 az Z9 | direct Huff-kod delka | akce | |---------------------------------------------------------------------------------| | 00000 | 0 kod delka | zakoduje se "zlit5": | | 00000 | 1 kod delka | primy kod "zZ": | | nenula | 0 kod delka | zakoduje se "zlit10": | \---------------------------------------------------------------------------------/ Pozn: da se pouzit i pro kodovani jedine nuly a vzhledem k nasludujicimu koderu to doporucuji! Dalsi duvod PRO: ukoncovani Mallatovych bloku (jednotne vyprazdnovani citace nul => pokud je nenulovy, dela se to shodne) Kodovani nenulovych hodnot: --------------------------- Pouziva se u vsech kodeku (0003-XXXX i 0004-XXXX). Vstupem je 10-bitova NENULOVA hodnota V (V0 az V9) - spodnich 5 bitu (V0 az V4) se zavede do kodovaci tabulky. Nula se koduje JEDINE pomoci ZRLE, v tabulce tedy zbyva nepouzita polozka 00000 - ta se vyuziva pro "lit10": pokud je V5 az V9 nehomogenni (tj ani 00000 ani 11111), do tabulky jdou same nuly misto V0 az V4. Tabulka pro jeden kodek: 32 x 12 bitu Polozka tabulky: direct:1 Huff-kod:8 delka:3 /---------------------------------------------------------------------------------\ | V5 az V9 | direct Huff-kod delka | akce | |---------------------------------------------------------------------------------| | 00000 nebo 11111 | 0 kod delka | "lit5": | | 00000 nebo 11111 | 1 kod delka | primy kod: | | neco jineho | 0 kod delka | "lit10": | \---------------------------------------------------------------------------------/ DEKODER: ======== Vstup se zavadi po jednotlivych bitech do 8-bitoveho shift-registru (musi se zajistit zavedeni uvodnich nul). Dekodovaci tabulka je spolecna pro vsechny 4 dekodery a ma celkem 128 x 8 bitu (je asociativni?). Prvni nalezena shoda je poslana do dalsi tabulky obsahujici "prikazy mezikodu": tato tabulka muze byt take spolecna pro vsechny dekodery a ma sirku 8 bitu (tj. dalsich 128 x 8 bitu): literal:1 shift10:1 ZRLE:1 direct:5 (sign!) znamena nutnost provest znamenkove rozsireni: bitem V4 se naplni vsechny vyssi bity V5 az V9: /-----------------------------------------------------------------------------------\ | literal shift10 ZRLE direct | akce | |-----------------------------------------------------------------------------------| | 1 1 0 | "lit10": prectu dalsich 10 bitu ze vstupu | | 1 0 0 | "lit5": prectu dalsich 5 bitu ze vstupu (sign!) | | 0 0 direct | prima hodnota: (sign!) | | 1 1 1 | "zlit10": dalsich 10 bitu naplni generator nul | | 1 0 1 | "zlit5": dalsich 5 bitu naplni generator nul | | 0 1 direct | hodnotou se naplni generator nul | \-----------------------------------------------------------------------------------/ Po dekodovani kazdeho Huffmanova symbolu se vynuluje shift-registr a pokud byl literal==1, a na vstupu se provede dalsi shift o 5 nebo 10 bitu (podle shift10). Dal se zase bude posunovat po 1 bitu (nez nastane shoda atd...).