亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? binary_codec.cpp

?? 惠普實(shí)驗(yàn)室的經(jīng)典代碼。用于huffman編碼的快速實(shí)現(xiàn)
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#endif

  while (bit_position >= 8)                                     // fill buffer
    bit_buffer |= unsigned(*bc_pointer++) << (bit_position -= 8);

  int data = C.decd_table[bit_buffer>>C.table_shift];        // table decoding

  if (data >= 0)
    bit_buffer <<= C.length[data];                                     // done
  else {
    bit_buffer <<= C.table_bits;                 // codeword longer than table
    do {                                                     // read more bits
      data = C.tree[bit_buffer>>31][-data];
      bit_buffer <<= 1;
    } while (data < 0);
  }

  bit_position += C.length[data];

  return data;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

unsigned Binary_Codec::decode(Adaptive_Huffman_Code & C)
{
#ifdef _DEBUG
  if (mode != 2) HC_Error("decoder not initialized");
#endif

  while (bit_position >= 8)                                     // fill buffer
    bit_buffer |= unsigned(*bc_pointer++) << (bit_position -= 8);

  int data = C.decd_table[bit_buffer>>C.table_shift];        // table decoding

  if (data >= 0)
    bit_buffer <<= C.length[data];                                     // done
  else {
    bit_buffer <<= C.table_bits;                 // codeword longer than table
    do {                                                     // read more bits
      data = C.tree[bit_buffer>>31][-data];
      bit_buffer <<= 1;
    } while (data < 0);
  }

  bit_position += C.length[data];

  ++C.symbol_count[data];                          // update symbol statistics
  if (--C.symbols_until_update == 0) C.update(false);   // periodic adaptation

  return data;
}

#endif


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - Other Binary_Codec implementations  - - - - - - - - - - - - - - - - - -

Binary_Codec::Binary_Codec(void)
{
  mode = buffer_size = 0;
  new_buffer = code_buffer = 0;
}

Binary_Codec::Binary_Codec(unsigned max_code_bytes,
                           unsigned char * user_buffer)
{
  mode = buffer_size = 0;
  new_buffer = code_buffer = 0;
  set_buffer(max_code_bytes, user_buffer);
}

Binary_Codec::~Binary_Codec(void)
{
  delete [] new_buffer;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Binary_Codec::set_buffer(unsigned max_code_bytes,
                              unsigned char * user_buffer)
{
                                                  // test for reasonable sizes
  if ((max_code_bytes < 16) || (max_code_bytes > 0x1000000U))
    HC_Error("invalid codec buffer size");
  if (mode != 0) HC_Error("cannot set buffer while encoding or decoding");

  if (user_buffer != 0) {                       // user provides memory buffer
    buffer_size = max_code_bytes;
    code_buffer = user_buffer;               // set buffer for compressed data
    delete [] new_buffer;                 // free anything previously assigned
    new_buffer = 0;
    return;
  }

  if (max_code_bytes <= buffer_size) return;               // enough available

  buffer_size = max_code_bytes;                           // assign new memory
  delete [] new_buffer;                   // free anything previously assigned
  if ((new_buffer = new unsigned char[buffer_size+8]) == 0)   // 8 extra bytes
    HC_Error("cannot assign memory for compressed data buffer");
  code_buffer = new_buffer;                  // set buffer for compressed data
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Binary_Codec::start_encoder(void)
{
  if (mode != 0) HC_Error("cannot start encoder");
  if (buffer_size == 0) HC_Error("no code buffer set");

  mode         =  1;             // initialize encoder bit-buffer and pointers
  bit_buffer   =  0;
  bit_position = 32;
  bc_pointer   = code_buffer;                     // pointer to next data byte
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Binary_Codec::start_decoder(void)
{
  if (mode != 0) HC_Error("cannot start decoder");
  if (buffer_size == 0) HC_Error("no code buffer set");

  mode         =  2;             // initialize decoder bit-buffer and pointers
  bit_buffer   =  0;
  bit_position = 32;
  bc_pointer   = code_buffer;                     // pointer to next data byte
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Binary_Codec::read_from_file(FILE * code_file)
{
  unsigned shift = 0, code_bytes = 0;
  int file_byte;
                      // read variable-length header with number of code bytes
  do {
    if ((file_byte = getc(code_file)) == EOF)
      HC_Error("cannot read code from file");
    code_bytes |= unsigned(file_byte & 0x7F) << shift;
    shift += 7;
  } while (file_byte & 0x80);
                                                       // read compressed data
  if (code_bytes > buffer_size) HC_Error("code buffer overflow");
  if (fread(code_buffer, 1, code_bytes, code_file) != code_bytes)
    HC_Error("cannot read code from file");

  start_decoder();                                       // initialize decoder
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

unsigned Binary_Codec::stop_encoder(void)
{
  if (mode != 1) HC_Error("invalid to stop encoder");

  mode = 0;                  // done encoding: set final data byte, reset mode

  if (bit_position < 32) *bc_pointer++ = (unsigned char) (bit_buffer >> 24);

  unsigned code_bytes = unsigned(bc_pointer - code_buffer);
  if (code_bytes > buffer_size) HC_Error("code buffer overflow");

  return code_bytes;                                   // number of bytes used
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

unsigned Binary_Codec::write_to_file(FILE * code_file)
{
  unsigned header_bytes = 0, code_bytes = stop_encoder(), nb = code_bytes;

                     // write variable-length header with number of code bytes
  do {
    int file_byte = int(nb & 0x7FU);
    if ((nb >>= 7) > 0) file_byte |= 0x80;
    if (putc(file_byte, code_file) == EOF)
      HC_Error("cannot write compressed data to file");
    header_bytes++;
  } while (nb);
                                                      // write compressed data
  if (fwrite(code_buffer, 1, code_bytes, code_file) != code_bytes)
    HC_Error("cannot write compressed data to file");

  return code_bytes + header_bytes;                              // bytes used
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Binary_Codec::stop_decoder(void)
{
  if (mode != 2) HC_Error("invalid to stop decoder");
  mode = 0;
}


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - Static Huffman code implementation  - - - - - - - - - - - - - - - - - -

Static_Huffman_Code::Static_Huffman_Code(void)                  // constructor
{
  code_data    = 0;
  data_symbols = 0;
}

Static_Huffman_Code::~Static_Huffman_Code(void)                  // destructor
{
  delete [] code_data;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Static_Huffman_Code::set_distribution(unsigned number_of_symbols,
                                           const double probability[])
{
  if ((number_of_symbols < 3) || (number_of_symbols > (1 << 16)))
    HC_Error("invalid number of data symbols");

  if (data_symbols != number_of_symbols) {      // assign memory for code data

    data_symbols = number_of_symbols;
    delete [] code_data;                    // free previously assigned memory

    for (table_bits = 2; (1U << table_bits) < data_symbols; ++table_bits);

    unsigned table_size = 1U << ++table_bits;
    table_shift = 32 - table_bits;
                                                   // single memory assignment
    if ((code_data = new int[table_size+4*data_symbols]) == 0)
      HC_Error("cannot assign Huffman code memory");

    decd_table = code_data;                    // define pointers to code data
    tree[0] = code_data + table_size;
    tree[1] = tree[0]   + data_symbols;
    length  = (unsigned *) (tree[1] + data_symbols);
    codeword = length + data_symbols;
  }

  unsigned n, * symbol_count = codeword;        // temporarily use this memory
  if (probability == 0)
    for (n = 0; n < data_symbols; n++)
      symbol_count[n] = 1;
  else
    for (n = 0; n < data_symbols; n++)                  // convert to integers
      symbol_count[n] = unsigned(1.0 + 1e6 * probability[n]);

                                                     // construct optimal code
  Form_Huffman_Tree(data_symbols, symbol_count, tree[0], tree[1]);
  Set_Huffman_Code(table_bits, tree, decd_table, codeword, length);
}


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - Adaptive data model implementation  - - - - - - - - - - - - - - - - - -

Adaptive_Huffman_Code::Adaptive_Huffman_Code(void)             // constructors
{
  code_data    = 0;
  data_symbols = 0;
}

Adaptive_Huffman_Code::Adaptive_Huffman_Code(unsigned number_of_symbols)
{
  code_data    = 0;
  data_symbols = 0;
  set_alphabet(number_of_symbols);
}

Adaptive_Huffman_Code::~Adaptive_Huffman_Code(void)             // destructors
{
  delete [] code_data;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Adaptive_Huffman_Code::set_alphabet(unsigned number_of_symbols)
{
  if ((number_of_symbols < 3) || (number_of_symbols > (1 << 12)))
    HC_Error("invalid number of data symbols");

  if (data_symbols != number_of_symbols) {     // assign memory for code data

    data_symbols = number_of_symbols;
    delete [] code_data;                    // free previously assigned memory

    for (table_bits = 2; (1U << table_bits) < data_symbols; ++table_bits);

    unsigned table_size = 1U << ++table_bits;
    table_shift = 32 - table_bits;
                                                   // single memory assignment
    if ((code_data = new int[table_size+5*data_symbols]) == 0)
      HC_Error("cannot assign Huffman code memory");

    decd_table = code_data;                    // define pointers to code data
    tree[0] = code_data + table_size;
    tree[1] = tree[0]   + data_symbols;
    length  = (unsigned *) (tree[1] + data_symbols);
    codeword = length + data_symbols;
    symbol_count = codeword + data_symbols;
  }

  reset();
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Adaptive_Huffman_Code::update(bool encoder)
{
  total_count += update_cycle;
  while (total_count >= HC__MaxCount)
    for (unsigned n = total_count = 0; n < data_symbols; n++)
      total_count += (symbol_count[n] = (symbol_count[n] + 1) >> 1);

                                                // compute optimal Hufman code
  Form_Huffman_Tree(data_symbols, symbol_count, tree[0], tree[1]);
  if (encoder)
    Set_Huffman_Code(tree, codeword, length);              // no decoder table
  else
    Set_Huffman_Code(table_bits, tree, decd_table, codeword, length);

  if (update_cycle < (data_symbols << 4))
    update_cycle = 1 + ((5 * update_cycle) >> 2);
  symbols_until_update = update_cycle;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Adaptive_Huffman_Code::reset(void)
{                                                      // uniform distribution
  total_count = 0;
  for (unsigned k = 0; k < data_symbols; k++) symbol_count[k] = 1;
  update_cycle = symbols_until_update = data_symbols;
  update(false);
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲大尺度视频在线观看| 日本一区二区三区久久久久久久久不 | 精品久久国产字幕高潮| 欧美日韩久久久| 欧美性极品少妇| 欧美日韩国产色站一区二区三区| 色噜噜狠狠一区二区三区果冻| 92国产精品观看| 国产不卡免费视频| 99久久亚洲一区二区三区青草| 粉嫩蜜臀av国产精品网站| 粉嫩aⅴ一区二区三区四区五区| 国产成人aaaa| 91免费看视频| 欧美日本国产一区| 日韩免费性生活视频播放| 337p日本欧洲亚洲大胆精品| 久久日韩粉嫩一区二区三区 | 久久久99精品久久| 国产精品久久久久久久久晋中| 日韩理论片网站| 日韩影院在线观看| 国产米奇在线777精品观看| 99re在线精品| 欧美日韩视频在线一区二区| 精品国产不卡一区二区三区| 国产精品每日更新在线播放网址| 亚洲欧洲国产日韩| 免费观看在线综合| 日本强好片久久久久久aaa| 成人久久18免费网站麻豆 | 国产精品超碰97尤物18| 亚洲成人资源网| 国产综合久久久久影院| 91蜜桃免费观看视频| 日韩欧美国产系列| 日韩伦理免费电影| 久久av中文字幕片| 在线观看不卡一区| 久久夜色精品国产欧美乱极品| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲一区二区三区视频在线播放 | 丁香网亚洲国际| 欧美日韩一区精品| 国产精品视频观看| 日本人妖一区二区| 91国偷自产一区二区三区成为亚洲经典 | 不卡的av中国片| 日韩欧美国产电影| 亚洲一级片在线观看| 成人精品国产一区二区4080| 日韩一级二级三级| 一区2区3区在线看| 成人激情小说乱人伦| 日韩欧美一级二级三级久久久| 亚洲私人影院在线观看| 国产精品77777| 欧美成人欧美edvon| 日韩国产在线一| 欧美日韩一级黄| 伊人一区二区三区| 成人激情免费视频| 国产欧美一区二区三区沐欲| 久久99精品久久久久久| 欧美一区二区三区啪啪| 亚洲国产精品久久久久婷婷884| 99riav久久精品riav| 亚洲丝袜美腿综合| 91亚洲午夜精品久久久久久| 国产精品丝袜91| 粉嫩av一区二区三区在线播放 | 成人午夜在线免费| 国产日韩成人精品| 国产成人精品综合在线观看| 亚洲精品一区二区三区影院| 男人的天堂亚洲一区| 在线播放欧美女士性生活| 亚洲成人av资源| 欧美久久高跟鞋激| 日本不卡免费在线视频| 欧美刺激脚交jootjob| 精品一区二区三区久久久| 精品久久五月天| 国产高清成人在线| 国产精品三级在线观看| 99re这里只有精品6| 亚洲综合999| 日韩一区二区三区在线观看| 精品无人码麻豆乱码1区2区| 国产色产综合色产在线视频| 成人听书哪个软件好| 自拍视频在线观看一区二区| 欧美色欧美亚洲另类二区| 日本怡春院一区二区| 日韩精品综合一本久道在线视频| 韩国女主播一区| 亚洲三级理论片| 欧美日本不卡视频| 国产精品主播直播| 一区二区三区高清在线| 欧美一级电影网站| 99久久精品一区二区| 亚洲成av人片在线观看无码| 久久看人人爽人人| 91国偷自产一区二区三区观看| 丝袜美腿成人在线| 久久久精品天堂| 欧美亚洲动漫另类| 国产激情精品久久久第一区二区 | 精品国产乱码久久久久久夜甘婷婷| 国产成人综合亚洲网站| 一区二区欧美在线观看| 精品99久久久久久| 91福利社在线观看| 国产乱妇无码大片在线观看| 一区二区三区欧美在线观看| 欧美大片在线观看一区二区| 成人黄色免费短视频| 日韩精品亚洲专区| 亚洲女与黑人做爰| 久久综合色鬼综合色| 欧美三级韩国三级日本一级| 国产激情视频一区二区在线观看| 亚洲国产成人高清精品| 国产精品久久久久婷婷| 91精品国产综合久久久蜜臀图片 | 国产乱理伦片在线观看夜一区| 亚洲精品国产一区二区精华液| 精品日韩在线观看| 欧美高清视频一二三区| 色综合天天狠狠| 高清在线观看日韩| 美女网站色91| 日韩vs国产vs欧美| 水野朝阳av一区二区三区| 成人免费一区二区三区视频 | 国内精品国产成人国产三级粉色| 亚洲视频网在线直播| 国产亚洲成年网址在线观看| 日韩一区二区三| 6080午夜不卡| 欧美日韩电影一区| 欧美区在线观看| 欧美三区在线观看| 在线一区二区视频| 色屁屁一区二区| 色婷婷久久综合| 91福利在线播放| 欧美视频日韩视频| 欧美在线你懂的| 欧美偷拍一区二区| 欧美亚洲高清一区| 在线91免费看| 日韩欧美一二三四区| 精品国产一区二区三区四区四| 日韩一区二区三区电影 | 中文字幕精品综合| 中文字幕在线观看一区| 中文字幕在线不卡| 亚洲免费av观看| 午夜精品久久久久久久久久| 首页国产欧美久久| 久久99久久久久| 黄色小说综合网站| 丰满亚洲少妇av| 91色视频在线| 欧美裸体一区二区三区| 欧美成人精精品一区二区频| 欧美精品一区二区三区久久久| 久久久久国产一区二区三区四区 | 精品久久久久一区| 国产精品素人一区二区| 亚洲欧美日本在线| 亚洲成人免费看| 国产毛片一区二区| 99久久99久久久精品齐齐| 色偷偷一区二区三区| 欧美人伦禁忌dvd放荡欲情| 欧美va亚洲va在线观看蝴蝶网| 国产亚洲欧美中文| 夜色激情一区二区| 久久97超碰色| 92精品国产成人观看免费| 欧美蜜桃一区二区三区| 26uuu国产电影一区二区| 成人免费一区二区三区在线观看| 亚洲va欧美va天堂v国产综合| 久久99久久久久久久久久久| 成人黄页在线观看| 欧美一级片在线看| 国产精品久久久久久久浪潮网站| 亚洲午夜激情av| 成人精品视频网站| 91精品国产欧美一区二区| 中文字幕一区二区5566日韩| 美女视频免费一区| 91高清视频在线| 国产精品欧美精品| 看电视剧不卡顿的网站| 色又黄又爽网站www久久|