OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6097|回复: 4

关于JPEG解码的int InitTag(void)函数的代码问题

[复制链接]

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
发表于 2013-3-31 01:10:57 | 显示全部楼层 |阅读模式
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了啊。

原子哥:能否给个解释?
或是我理解错误了...............

http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-31 10:09:04 | 显示全部楼层
这个我也不熟...搬别人代码过来的.
你可以按你的理解实际测试下了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
 楼主| 发表于 2013-3-31 19:46:22 | 显示全部楼层
经过试验:
    原作者的代码是可行的,只不过跟我的“绝对理论”--完全根据huffman解码原理--有区别;
    理由:
/*【中间出现码数为0的情况,本函数也适用】
1.理论:如果3bit码长的最高编码为101,没有4bit码,那么5bit码起始码为101+001<<2==11000
2.代码:如果3bit码长的最高编码为101,不变;
那么4bit码的最值空间不为零:Min=101+001<<1==1100;Max=Min+码数-1=1100+0-1=1011;
for循环,那么5bit的最值为:Min=上一个Max+1<<1=1011+1<<1==11000.正好与理论值相同;
3.结论:A、当出现中间出现码数为0的情况,照常编码,只是码数为0的最值编码是中间编码,而且由“码数为0”判定为无效编码。
B、当连续出现多个0的情况,编码照样正确。
C、出现码数为0的最值码权值起到承上启下的作用。其中最大码权值内的【码数-1】起到关键作用。保证下一个码段(码数不为0)的起始值能够正确编码
D、本段代码,不管码数是否为0,都有最值编码码权,只要根据码数不为0判断码权的有效性。

原作者是巧用了码数为0时产生的中间编码来达到码数不为0的码权的最值的正确性。
提出了问题,原来在于理解角度不同。
     我原本想,如果码数为0的时候,让他的最值码权都为0,而靠最近一个码数不为0的码段的最大码权填充若干个0来实现正确编码。

呵呵...................................
*/
http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
回复 支持 反对

使用道具 举报

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
 楼主| 发表于 2013-3-31 19:49:23 | 显示全部楼层
呵呵........大家有空可以多探讨一下代码的由来(实现依据).....................以达共同进步的目标。。。。。。。。。。。。
http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-31 21:42:22 | 显示全部楼层
回复【4楼】moline:
---------------------------------
没研究这么深,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-22 06:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表