高级会员

- 积分
- 801
- 金钱
- 801
- 注册时间
- 2012-6-29
- 在线时间
- 0 小时
|
case M_DHT: //定义哈夫曼表(0xFF,0xC4)
llength=MAKEWORD(*(lp+1),*lp);//长度 (高字节, 低字节)
if (llength<0xd0) // Huffman Table信息 (1 u8)
{
huftab1=(short)(*(lp+2))>>4; //huftab1=0,1(HT 类型,0 = DC 1 = AC)
huftab2=(short)(*(lp+2))&0x0f; //huftab2=0,1(HT 号 ,0 = Y 1 = UV)
huftabindex=huftab1*2+huftab2; //0 = YDC 1 = UVDC 2 = YAC 3 = UVAC
lptemp=lp+3;//!!!
//在这里可能出现余度不够,多于512字节,则会导致出错!!!!
for (i=0; i<16; i++) //16 bytes: 长度是 1..16 代码的符号数
code_len_table[huftabindex]=(short)(*(lptemp++));//码长为i的码字个数
j=0;
for (i=0; i<16; i++) //得出HT的所有码字的对应值
{
if(code_len_table[huftabindex]!=0)
{
k=0;
while(k<code_len_table[huftabindex])
{
code_value_table[huftabindex][k+j]=(short)(*(lptemp++));//最可能的出错地方
k++;
}
j+=k;
}
}
i=0;
while (code_len_table[huftabindex]==0)i++;
for (j=0;j<i;j++)
{
huf_min_value[huftabindex][j]=0;
huf_max_value[huftabindex][j]=0;
}
huf_min_value[huftabindex]=0;
huf_max_value[huftabindex]=code_len_table[huftabindex]-1;
for (j=i+1;j<16;j++)
{
huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-1]+1)<<1;
huf_max_value[huftabindex][j]=huf_min_value[huftabindex][j]+code_len_table[huftabindex][j]-1;
}
code_pos_table[huftabindex][0]=0;
for (j=1;j<16;j++)
code_pos_table[huftabindex][j]=code_len_table[huftabindex][j-1]+code_pos_table[huftabindex][j-1];
lp+=llength;
lp-=P_Cal(lp);
}//if
上面灰色部分,似乎有问题吧:
while (code_len_table[huftabindex]==0)i++;判断的是huffman表内从1bit码长的码数到第i-1bit码长的码数都为0的情况。后面没有对码数表后面出现0码数的情况进行标记。
如果i bit码长的码数不为0,而在后面出现i+m bit码长的码数为0时,huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-1]+1)<<1;的代码方式好像有错。应该是huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-x]+1)<<x;(x是中间连续出现码数为0的某码长的种类--根据huffman编码原理)。
huffman的编码是:(假设)如果码长为3bit的码字其最后的码权是110,如果没有4、5bit码长的码数(都为0),那么6bit码长的起始码权值应该是((110+001)<<3)==111000
而如果按照原子提供的代码,6bit码长的起始码权值就是1110了啊。
原子哥:能否给个解释?
或是我理解错误了...............
|
|