/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 2003-2011 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Phong Vo <kpv@research.att.com> *
* *
***********************************************************************/
#include "vchhdr.h"
/* Group segments of data for more effective Huffman coding.
**
** Written by Binh Dao Vo and Kiem-Phong Vo
*/
typedef struct _table_s
} Table_t;
typedef struct _obj_s
} Obj_t;
typedef struct _group_s
} Group_t;
/* sum frequencies for distinct objects */
switch(kk) \
}
} while(0)
/* accumulate coding size of all objects */
switch(kk) \
}
} while(0)
#if __STD_C
#else
#endif
{
int d;
return d;
}
/* Construct a list of distinct objects and frequencies from data[]. This list
** is used for fast computation of total frequencies, encoding lengths, etc.
** It is good for data transformed by a Burrows-Wheeler transform since the
** distribution is skewed toward a few small values.
*/
#if __STD_C
#else
#endif
{
return -1;
return -1;
return -1;
/* ptsz is such that a object frequency should fit in a byte */
for(k = 0; k < VCH_SIZE; ++k)
{ if(freq[k] != 0)
p += 1;
}
}
/* sort by code lengths */
}
return 0;
}
/* sorting parts by heaviest elements */
#if __STD_C
#else
#endif
{
int p, q, n, m, d;
if(m > n)
m = n;
if(m > 8)
m = 8;
for(n = 0; n < m; ++n )
return d;
for(n = 0; n < m; ++n )
return d;
return p-q;
}
/* compute an optimal clustering with ntbl clusters */
#if __STD_C
#else
int niter; /* # of iterations to run */
#endif
{
{ /* sort parts so that similar prefixes group together */
for(k = 0; k < npts; ++k)
sort[k] = k;
/* now make tables */
{ k = sort[p];
}
}
}
else /* increasing number of tables */
for(; n > 0; --n)
continue;
}
if(p < 0) /* if p >= 0, it's the highest cost table */
break;
/* split blocks of table p into two tables, p and q */
for(i = 0; i < npts; ++i)
{ if(work[i] != p)
continue;
if((z -= 1) == 0) /* start 2nd table */
}
/* make sure neither table will considered for further splitting */
}
}
for(k = 0; k < ntbl; ++k)
{ z += (z <= 4 ? 15 : z <= 8 ? 7 : z <= 16 ? 1 : 0);
for(p = 0; p < VCH_SIZE; ++p)
{ if(fr[p] != 0)
fr[p] = 0; /* clear frequency table */
else sz[p] = z; /* 0-freq obj gets dflt length */
}
}
}
for(i = 0; i < npts; i += 1)
/* find the table best matching this part */
else /* normal table, tally up the lengths */
{ bestz = z;
bestt = k;
}
}
}
/* remove empty tables */
for(p = k = 0; k < ntbl; ++k)
{ map[k] = k; /* start as identity map */
continue;
if(k > p) /* need to move this table */
map[k] = p; /* table at k was moved to p */
}
p += 1; /* move beyond known valid slot */
}
if(p < ntbl) /* tables were moved, reset part indexes */
{ for(i = 0; i < npts; ++i)
}
ntbl = p;
}
z = 0; /* recompute encoding cost given new grouping */
for(k = 0; k < ntbl; ++k)
p += (n + vcsizeu(n))*8;
z += p; /* add to total cost */
}
else
}
}
z += p + (n + vcsizeu(n))*8;
}
return;
}
}
return;
}
}
}
/* select a part size based on the data size. */
{
if(lnz >= 16)
}
return ptsz;
}
#if __STD_C
#else
#endif
{
ssize_t n, i, p, k;
if(dtsz == 0)
return 0;
/* get the size of doing Huffman alone */
/* set desired part size and bounds for number of groups */
/* initialize data structures for fast frequency calculations */
return -1;
/* now make the best grouping */
}
/* short-hands */
/* get space for output */
return -1;
/* output the coding tables and compute the coding bits */
for(k = 0; k < ntbl; ++k)
else /* coding a code table */
return -1;
}
}
/* compress and output the indices */
return -1;
return -1;
/* now write out the encoded data */
continue;
}
return -1;
if(out)
return n;
}
#if __STD_C
#else
#endif
{
if(dtsz == 0)
return 0;
return -1;
for(k = 0; k < GRP_NTBL; ++k)
goto done;
goto done;
goto done;
for(k = 0; k < ntbl; ++k)
goto done;
else /* construct code table and trie for fast matching */
goto done;
goto done;
}
}
/* reconstruct the array of part indices */
goto done;
goto done;
goto done;
/* buffer to reconstruct the original data */
goto done;
for(k = 0; k < npts; ++k)
while(o < dt)
*o++ = (Vcchar_t)p;
}
else /* reconstructing a Huffman-coded set of bytes */
p += (b >> (VC_BITSIZE-sz));
if(size[p] > 0)
if((o += 1) >= dt)
break;
}
else if(size[p] == 0)
return -1;
else
}
}
}
if(out)
if(trie[k])
vchdeltrie(trie[k]);
return rv;
}
/* Event handler */
#if __STD_C
#else
int type;
#endif
{
if(type == VC_OPENING)
return -1;
/* open the entropy coder handle */
goto do_closing;
return 0;
}
else if(type == VC_CLOSING)
{ rv = 0;
}
return rv;
}
else if(type == VC_FREEBUFFER)
}
return 0;
}
else return 0;
}
{ grphuff,
"huffgroup", "Huffman encoding by groups",
"[-version?huffgroup (AT&T Research) 2003-01-01]" USAGE_LICENSE,
0,
1024*1024,
0
};