KJpegHuffman.c
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:2k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KJpegDeocode.cpp
  5. // Date: 2000.08.08
  6. // Code: Daniel Wang
  7. // Desc: Jpeg Huffman Table 的解码
  8. // From: Cloud Wu's JPEG Decoder
  9. //---------------------------------------------------------------------------
  10. #include <windows.h>
  11. #include "KJpegLib.h"
  12. //---------------------------------------------------------------------------
  13. // 函数: read_DHT
  14. // 功能: read defined huffman table
  15. // 参数: stream Jpeg数据流
  16. // 返回: void* Jpeg数据流
  17. //---------------------------------------------------------------------------
  18. PBYTE jpeg_read_DHT(PBYTE stream)
  19. {
  20. JPEG_HCODE* htb;
  21. WORD seg_size;
  22. int i,j,p,code,si;
  23. PBYTE stream_end;
  24. PBYTE code_len;
  25. BYTE htb_id;
  26. READ_WORD(seg_size, stream);
  27. stream_end = stream + seg_size - 2;
  28. while (stream < stream_end)
  29. {
  30. // 取信息码
  31. htb_id = READ_BYTE(stream);
  32. htb_id = (htb_id & 0x10)? (htb_id & 3 | 4) : (htb_id & 3);
  33. // 统计HTB长度,分配内存
  34. code_len = (BYTE *)stream;
  35. for (i = 0; i < 16; i++)
  36. {
  37. jpeg_htable[htb_id].num += code_len[i];
  38. }
  39. stream = stream + 16;
  40. htb = (JPEG_HCODE*) malloc(jpeg_htable[htb_id].num * sizeof(JPEG_HCODE));
  41. jpeg_htable[htb_id].htb = htb;
  42. // 计算代码表
  43. for (i = 0, p = 0; i < 16; i++)
  44. {
  45. for (j = 0; j < code_len[i]; j++)
  46. {
  47. htb[p].num = READ_BYTE(stream);
  48. htb[p++].len = i + 1;
  49. }
  50. }
  51. for (si = htb[0].len, i = code = 0; i < p; code <<= 1, si++)
  52. {
  53. while (htb[i].len == si) 
  54. {
  55. htb[i++].code = code++;
  56. }
  57. }
  58. }
  59. if (stream != stream_end)
  60. return NULL;
  61. return stream_end;
  62. }
  63. //---------------------------------------------------------------------------