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

📄 huffman_decomp.c

📁 Develop Zigbee network real-time Os
💻 C
字号:
#ifndef __AVR_ATmega128__#define prog_uint8_t uint8_t#endif#define DECOMPRESSOR#include <inttypes.h>#include <errno.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include "../buffer.h"#include CODESETuint8_t membuffer[MEMBUFSIZE];uint8_t *data;uint8_t read_count;uint16_t buffer;static uint8_t read_bits(uint8_t len){  uint8_t res;  // Fill the buffer  while (read_count < len) {    buffer <<= 8;    buffer |= *data++;    read_count += 8;  }    res = (buffer >> (read_count - len)) & ((1 << len) - 1);  read_count -= len;  buffer &= (1 << read_count) - 1;  return res;}uint16_t bits_left(){  uint16_t res = MEMBUFSIZE - (data - membuffer); // Amount of unread data;    /*    printf("Length: %d, data: %p, data_start: %p, diff: %d\n",    length, data, data_start, data - data_start);  */    res *= 8;  res += read_count; // Bits read, but not outputted yet.    //    printf("Bits left: %d\n", res);    return res;}void fill_buffer(){  if (fread(membuffer, MEMBUFSIZE, 1, stdin) != 1) {    fprintf(stderr, "Error reading from stdin: %s\n", 	    strerror(errno));    exit(1);  }    read_count = 0;  buffer = 0;  data = membuffer;}int16_t get_sample(){  struct huffman_node_t *cur_node = huffman_root;  while (cur_node->type == NT_Node) {    uint8_t tmp;    if (bits_left() == 0)      fill_buffer();        tmp = read_bits(1);    //    fprintf(stderr, "%d", tmp);    cur_node = tmp ? cur_node->left : cur_node->right;  }  //  fprintf(stderr, " = sample with value: %d\n", cur_node->value);  return cur_node->value;}int decompress_sample(int16_t *digi_x, int16_t *digi_y, 		      int16_t *digi_z, uint16_t *analog_x,		      uint16_t *analog_y){  static int first = 1;  static int16_t last_vals[3];  int i;  if (first) {    fill_buffer();    first = 0;#ifdef HUFFMAN_DIFFERENCE    for (i = 0; i < 3; i++) {      last_vals[i] = 0;      last_vals[i] |= (uint16_t)read_bits(4) << 8;      last_vals[i] |= read_bits(8);      if (last_vals[i] & 0x0800)	last_vals[i] |= 0xF000;      //      fprintf(stderr, "Sample is %d\n", last_vals[i]);    }    *digi_x = last_vals[0];    *digi_y = last_vals[1];    *digi_z = last_vals[2];    return 0;#endif  }   for (i = 0; i < 3; i++) {#ifdef HUFFMAN_WHOLE_SYMBOLS    int16_t tmp = get_sample();#else    int16_t tmp = get_sample() & 0xFF;    tmp |= (get_sample() << 8) & 0xFF00;#endif#ifdef HUFFMAN_DIFFERENCE# ifdef HUFFMAN_WHOLE_SYMBOLS    last_vals[i] = ((last_vals[i] & 0xFFF) + tmp - 4096) & 0xFFF;		if (last_vals[i] & 0x800)			last_vals[i] |= 0xF000;# else    last_vals[i] += tmp - 4096;# endif    //      fprintf(stderr, "Read sample is %d, last_val is now %d\n",     //	      tmp, last_vals[i]);#else# ifdef HUFFMAN_WHOLE_SYMBOLS    last_vals[i] = tmp - 2048;# else    last_vals[i] = tmp;# endif#endif  }  *digi_x = last_vals[0];  *digi_y = last_vals[1];  *digi_z = last_vals[2];  return 0;}

⌨️ 快捷键说明

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