📄 huffman.c
字号:
{ 4, 4, 0, 0,t6HB, t6l},
{ 6, 6, 0, 0,t7HB, t7l},
{ 6, 6, 0, 0,t8HB, t8l},
{ 6, 6, 0, 0,t9HB, t9l},
{ 8, 8, 0, 0,t10HB, t10l},
{ 8, 8, 0, 0,t11HB, t11l},
{ 8, 8, 0, 0,t12HB, t12l},
{16,16, 0, 0,t13HB, t13l},
{ 0, 0, 0, 0,NULL,NULL},/* Apparently not used */
{16,16, 0, 0,t15HB, t15l},
{16,16, 1, 1,t16HB, t16l},
{16,16, 2, 3,t16HB, t16l},
{16,16, 3, 7,t16HB, t16l},
{16,16, 4, 15,t16HB, t16l},
{16,16, 6, 63,t16HB, t16l},
{16,16, 8, 255,t16HB, t16l},
{16,16,10,1023,t16HB, t16l},
{16,16,13,8191,t16HB, t16l},
{16,16, 4, 15,t24HB, t24l},
{16,16, 5, 31,t24HB, t24l},
{16,16, 6, 63,t24HB, t24l},
{16,16, 7, 127,t24HB, t24l},
{16,16, 8, 255,t24HB, t24l},
{16,16, 9, 511,t24HB, t24l},
{16,16,11,2047,t24HB, t24l},
{16,16,13,8191,t24HB, t24l},
{ 1,16, 0, 0,t32HB, t32l},
{ 1,16, 0, 0,t33HB, t33l},
};
/* do the huffman coding, */
/* note! for counta,countb - the 4 bit value is passed in y, set x to 0 */
/* return value: 0-no error, 1 decode error */
void huffman_coder(unsigned int x,
unsigned int y,
struct huffcodetab *h,
L3_bitstream_t *bs)
{
HUFFBITS huffbits; /* data left aligned */
HUFFBITS linbitsX;
HUFFBITS linbitsY;
unsigned int len;
unsigned int xl1 = h->xlen-1;
unsigned int yl1 = h->ylen-1;
linbitsX = 0;
linbitsY = 0;
if (h->table == NULL) return;
if (((x < xl1) || (xl1==0)) && (y < yl1)) {
huffbits = h->table[x*(h->xlen)+y];
len = h->hlen[x*(h->xlen)+y];
putbits(bs,huffbits,len);
return;
}
else if (x >= xl1) {
linbitsX = x-xl1;
if (linbitsX > h->linmax) {
linbitsX= h->linmax;
};
if (y >= yl1) {
huffbits = h->table[(h->ylen)*(h->xlen)-1];
len = h->hlen[(h->ylen)*(h->xlen)-1];
putbits(bs,huffbits,len);
linbitsY = y-yl1;
if (linbitsY > h->linmax) {
linbitsY = h->linmax;
};
if (h->linbits) {
putbits(bs,linbitsX,h->linbits);
putbits(bs,linbitsY,h->linbits);
}
}
else { /* x>= h->xlen, y<h->ylen */
huffbits = h->table[(h->ylen)*xl1+y];
len = h->hlen[(h->ylen)*xl1+y];
putbits(bs,huffbits,len);
if (h->linbits) {
putbits(bs,linbitsX,h->linbits);
}
}
}
else { /* ((x < h->xlen) && (y>=h->ylen)) */
huffbits = h->table[(h->ylen)*x+yl1];
len = h->hlen[(h->ylen)*x+yl1];
putbits(bs,huffbits,len);
linbitsY = y-yl1;
if (linbitsY > h->linmax) {
linbitsY = h->linmax;
};
if (h->linbits) {
putbits(bs,linbitsY,h->linbits);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -