⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpeg_huffman.c

📁 swf 解码源程序, 纯C代码
💻 C
字号:
#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <cogcompat.h>#include <liboil/liboil.h>#include <string.h>#include "jpeg.h"/* misc helper function definitions */static char *sprintbits (char *str, unsigned int bits, int n);voidhuffman_table_dump (HuffmanTable * table){  unsigned int n_bits;  unsigned int code;  char str[33];  int i;  HuffmanEntry *entry;  COG_DEBUG ("dumping huffman table %p", table);  for (i = 0; i < table->len; i++) {    entry = table->entries + i;    n_bits = entry->n_bits;    code = entry->symbol >> (16 - n_bits);    sprintbits (str, code, n_bits);    COG_DEBUG ("%s --> %d", str, entry->value);  }}voidhuffman_table_init (HuffmanTable *table){  memset (table, 0, sizeof(HuffmanTable));}voidhuffman_table_add (HuffmanTable * table, uint32_t code, int n_bits, int value){  HuffmanEntry *entry = table->entries + table->len;  entry->value = value;  entry->symbol = code << (16 - n_bits);  entry->mask = 0xffff ^ (0xffff >> n_bits);  entry->n_bits = n_bits;  table->len++;}unsigned inthuffman_table_decode_jpeg (JpegDecoder *dec, HuffmanTable * tab, JpegBits * bits){  unsigned int code;  int i;  char str[33];  HuffmanEntry *entry;  code = peekbits (bits, 16);  for (i = 0; i < tab->len; i++) {    entry = tab->entries + i;    if ((code & entry->mask) == entry->symbol) {      code = getbits (bits, entry->n_bits);      sprintbits (str, code, entry->n_bits);      COG_DEBUG ("%s --> %d", str, entry->value);      return entry->value;    }  }  COG_ERROR ("huffman sync lost");  return -1;}inthuffman_table_decode_macroblock (JpegDecoder *dec, short *block, HuffmanTable * dc_tab,    HuffmanTable * ac_tab, JpegBits * bits){  int r, s, x, rs;  int k;  char str[33];  memset (block, 0, sizeof (short) * 64);  s = huffman_table_decode_jpeg (dec, dc_tab, bits);  if (s < 0)    return -1;  x = getbits (bits, s);  if ((x >> (s - 1)) == 0) {    x -= (1 << s) - 1;  }  COG_DEBUG ("s=%d (block[0]=%d)", s, x);  block[0] = x;  for (k = 1; k < 64; k++) {    rs = huffman_table_decode_jpeg (dec, ac_tab, bits);    if (rs < 0) {      COG_DEBUG ("huffman error");      return -1;    }    if (bits->ptr > bits->end) {      COG_DEBUG ("overrun");      return -1;    }    s = rs & 0xf;    r = rs >> 4;    if (s == 0) {      if (r == 15) {        COG_DEBUG ("r=%d s=%d (skip 16)", r, s);        k += 15;      } else {        COG_DEBUG ("r=%d s=%d (eob)", r, s);        break;      }    } else {      k += r;      if (k >= 64) {        jpeg_decoder_error (dec, "macroblock overrun");        return -1;      }      x = getbits (bits, s);      sprintbits (str, x, s);      if ((x >> (s - 1)) == 0) {        x -= (1 << s) - 1;      }      block[k] = x;      COG_DEBUG ("r=%d s=%d (%s -> block[%d]=%d)", r, s, str, k, x);    }  }  return 0;}inthuffman_table_decode (JpegDecoder *dec, HuffmanTable * dc_tab, HuffmanTable * ac_tab,    JpegBits * bits){  int16_t zz[64];  int ret;  while (bits->ptr < bits->end) {    ret = huffman_table_decode_macroblock (dec, zz, dc_tab, ac_tab, bits);    if (ret < 0)      return -1;  }  return 0;}/* misc helper functins */static char *sprintbits (char *str, unsigned int bits, int n){  int i;  int bit = 1 << (n - 1);  for (i = 0; i < n; i++) {    str[i] = (bits & bit) ? '1' : '0';    bit >>= 1;  }  str[i] = 0;  return str;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -