www.pudn.com > sfalic-03-src.rar.rar > cfamily.c
/* Rodzina kodow moja (wersja bez adjusted binary codes, dla glebi do 16 bpp, ograniczenie dlugosci do 32 bitow) R. Starosolski, W. Skarbek: Modified Golomb-Rice Codes for Lossless Compression of Medical Images", Proceedings of International Conference on E-health in Common Europe, pp. 423-37, Krakow, 2003 */
#include "cfamily.h"
#include "bppmask.h"
static const unsigned int bitat[32] ={
0x00000001,0x00000002,0x00000004,0x00000008,
0x00000010,0x00000020,0x00000040,0x00000080,
0x00000100,0x00000200,0x00000400,0x00000800,
0x00001000,0x00002000,0x00004000,0x00008000,
0x00010000,0x00020000,0x00040000,0x00080000,
0x00100000,0x00200000,0x00400000,0x00800000,
0x01000000,0x02000000,0x04000000,0x08000000,
0x10000000,0x20000000,0x40000000,0x80000000 /* [31]*/
};
static unsigned int nGRcodewords[MAXNUMCODES]; /* dla kolejnych kodow liczby niezmodyfikowanych slow kodu GR w kodzie */
static unsigned int notGRcwlen[MAXNUMCODES]; /* dla kolejnych kodow dlugosc slowa kodowego nie-GR*/
static unsigned int notGRprefixlen[MAXNUMCODES]; /* dla kolejnych kodow dlugosc prefiksu slowa kodowego nie-GR */
static unsigned int notGRsuffixlen[MAXNUMCODES]; /* dla kolejnych kodow dlugosc sufiksu slowa kodowego nie-GR */
/* funkcje krytyczne dla predkosci, na razie tylko kodowanie, eksportowane */
/* argumenty: wartosc do zakodowania:n, numer kodu:l, adres, gdzie nalezy zapisac slowo kodowe:tcw */
void GolombCoding(const unsigned int n, const unsigned int l,
unsigned int * const codeword, unsigned int * const codewordlen)
{
if(n>l)+l+1;
}
else
{
(*codeword) = n-nGRcodewords[l];
(*codewordlen) = notGRcwlen[l];
}
}
unsigned int GolombCodeLen(const unsigned int n, const unsigned int l)
{
if(n> l)+1+l;
else
return notGRcwlen[l];
}
/* funkcje nie krytyczne, nie eksportowane */
#include "ceillog2.h"
#include "exitit.h"
#include "clalloc.h"
static unsigned int lzeroes[256]; /* liczba wiodacych zer w bajcie, inicjalizowane w familyinit */
/* pobierz z bufora ile bitow */
void eatbits(unsigned int ile, struct bitinstatus * bs)
{
bs->bits<<=ile;
while(ile>bs->inthebyte)
{
ile-=bs->inthebyte;
bs->bits|=(bs->thebyte<thebyte=*bs->readptr++;
bs->inthebyte=8;
}
bs->inthebyte-=ile;
bs->bits|=(bs->thebyte>>bs->inthebyte);
if(!bs->inthebyte)
{
bs->thebyte=*bs->readptr++;
bs->inthebyte=8;
}
}
/* pobierz ile bitow i zwroc jako najmlodsze bity wyniku */
unsigned int getbits(const unsigned int ile, struct bitinstatus * bs)
{
if(ile)
{
const unsigned result=bs->bits>>(32-ile);
eatbits(ile, bs);
return result;
}
else
return 0;
}
/* pobierz bity az do napotkania 1 albo do przeczytania max zer */
/* zwróc liczbe przeczytanych zer */
/* z bufora usun przeczytane zera i jedynke jezeli byla przeczytana */
unsigned int eatzeroes(const unsigned int max, struct bitinstatus * bs)
{
if(!(bs->bits & ~bppmask[32-max]))
{
eatbits(max, bs);
return max;
}
else
{
int cntr=lzeroes[bs->bits>>24];
if (bs->bits<=0x00ffffff)
{
cntr+=lzeroes[bs->bits>>16];
if (bs->bits<=0x00ffff)
{
cntr+=lzeroes[bs->bits>>8];
if (bs->bits<=0x00ff)
{
cntr+=lzeroes[bs->bits>>8];
}
}
}
eatbits(cntr+1, bs);
return cntr;
}
}
/* funkcje eksportowane */
/* rodzina (GOLOMB_MYJPEGLS), przerobiona na glebie do 16+ bpp (sprawdzone do 20) */
/* ograniczenie dlugosci sprawdzone do 32+ bit (40) */
/* ostatnia grupa (golomb lub limit32) kodowana */
/* z prefiksem bez jedynki na koncu, kody binarne */
/* bpp-bitowe lub krotsze */
unsigned int GolombDecoding(const unsigned int l, struct bitinstatus * bs)
{
/* prefix */
const unsigned result=eatzeroes(notGRprefixlen[l], bs);
if (notGRprefixlen[l] != result) /* Golomb */
return (result<bits=*bs->readptr++; // nowe
bs->bits<<=8;
bs->bits|=*bs->readptr++;
bs->bits<<=8;
bs->bits|=*bs->readptr++;
bs->bits<<=8;
bs->bits|=*bs->readptr++;
bs->thebyte=*bs->readptr++;
bs->inthebyte=8;
}
/* inicjalizacja */
void familyinit(int bpp, int limit)
{
int l;
assert(limit<=32);
assert(bpp<=MAXNUMCODES);
assert(limit>bpp);
for (l=0; l (int)(bppmask[bpp-l]))
altprefixlen=bppmask[bpp-l];
altcodewords=bppmask[bpp]+1-(altprefixlen<0; n--)
lzeroes[l++]=8-i;
i++;
}
}
return;
}
/* zwolnienie struktur rodziny kodow - dla porzadku*/
void familyfree()
{
return;
}