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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? arithmetic_codec.cpp

?? 算術編碼程序源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
    x = M.distribution[s] * (length >> DM__LengthShift);
    base   += x;                                            // update interval
    length -= x;                                          // no product needed
  }
  else {
    x = M.distribution[s] * (length >>= DM__LengthShift);
    base   += x;                                            // update interval
    length  = M.distribution[s+1] * length - x;
  }
             
  if (init_base > base) propagate_carry();                 // overflow = carry

  if (length < AC__MinLength) renorm_enc_interval();        // renormalization
}

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

unsigned Arithmetic_Codec::decode(Static_Data_Model & M)
{
#ifdef _DEBUG
  if (mode != 2) AC_Error("decoder not initialized");
#endif

  unsigned s, n, x, y = length, m = M.first_tests[1];
  unsigned z = M.distribution[m] * (length >>= DM__LengthShift);

  if (z > value) {             // first predefined test based on probabilities
    n = m;               // initialize search from bottom and define next test
    y = z;
    x = s = 0;
    m = M.first_tests[0];
  }
  else {                    // initialize search from top and define next test
    s = m;
    x = z;
    n = M.data_symbols;
    m = M.first_tests[2];
  }

  if (n - s > 1)                  // if necessary finish with bisection search
    do {
      z = length * M.distribution[m];
      if (z > value) {
        n = m;
        y = z;                                             // value is smaller
      }
      else {
        s = m;
        x = z;                                     // value is larger or equal
      }
    } while ((m = (s + n) >> 1) != s);

  value -= x;                                               // update interval
  length = y - x;

  if (length < AC__MinLength) renorm_dec_interval();        // renormalization

  return M.data[s];                               // return decoded data value
}

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

void Arithmetic_Codec::encode(unsigned data,
                              Adaptive_Data_Model & M)
{
#ifdef _DEBUG
  if (mode != 1) AC_Error("encoder not initialized");
  if (data >= M.data_symbols) AC_Error("invalid data symbol");
#endif

  unsigned x, init_base = base, s = M.rank[data];             // symbol = rank
                                                           // compute products
  if (s == M.most_probable_symbol) {
    x = M.distribution[s] * (length >> DM__LengthShift);
    base   += x;                                            // update interval
    length -= x;                                          // no product needed
  }
  else {
    x = M.distribution[s] * (length >>= DM__LengthShift);
    base   += x;                                            // update interval
    length  = M.distribution[s+1] * length - x;
  }
             
  if (init_base > base) propagate_carry();                 // overflow = carry

  if (length < AC__MinLength) renorm_enc_interval();        // renormalization

  ++M.symbol_count[s];
  if (--M.symbols_until_update == 0) M.update();      // periodic model update
}

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

unsigned Arithmetic_Codec::decode(Adaptive_Data_Model & M)
{
#ifdef _DEBUG
  if (mode != 2) AC_Error("decoder not initialized");
#endif

  unsigned s, n, x, y = length, m = M.first_tests[1];
  unsigned z = M.distribution[m] * (length >>= DM__LengthShift);

  if (z > value) {             // first predefined test based on probabilities
    n = m;               // initialize search from bottom and define next test
    y = z;
    x = s = 0;
    m = M.first_tests[0];
  }
  else {                    // initialize search from top and define next test
    s = m;
    x = z;
    n = M.data_symbols;
    m = M.first_tests[2];
  }

  if (n - s > 1)                  // if necessary finish with bisection search
    do {
      z = length * M.distribution[m];
      if (z > value) {
        n = m;
        y = z;                                             // value is smaller
      }
      else {
        s = m;
        x = z;                                     // value is larger or equal
      }
    } while ((m = (s + n) >> 1) != s);

  value -= x;                                               // update interval
  length = y - x;

  if (length < AC__MinLength) renorm_dec_interval();        // renormalization

  ++M.symbol_count[s];
  if (--M.symbols_until_update) return M.data[s];       // return decoded data
    
  unsigned data = M.data[s];                 // save data value before changes
  M.update();                                         // periodic model update
  return data;                                          // return decoded data
}


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - Other Arithmetic_Codec implementations  - - - - - - - - - - - - - - - -

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

Arithmetic_Codec::Arithmetic_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);
}

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

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

void Arithmetic_Codec::set_buffer(unsigned max_code_bytes,
                                  unsigned char * user_buffer)
{
                                                  // test for reasonable sizes
  if ((max_code_bytes < 16) || (max_code_bytes > 0x1000000U))
    AC_Error("invalid codec buffer size");
  if (mode != 0) AC_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+16]) == 0) // 16 extra bytes
    AC_Error("cannot assign memory for compressed data buffer");
  code_buffer = new_buffer;                  // set buffer for compressed data
}

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

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

  mode   = 1;
  base   = 0;            // initialize encoder variables: interval and pointer
  length = AC__MaxLength;
  ac_pointer = code_buffer;                       // pointer to next data byte
}

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

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

                  // initialize decoder: interval, pointer, initial code value
  mode   = 2;
  length = AC__MaxLength;
  ac_pointer = code_buffer + 3;
  value = (unsigned(code_buffer[0]) << 24)|(unsigned(code_buffer[1]) << 16) |
          (unsigned(code_buffer[2]) <<  8)| unsigned(code_buffer[3]);
}

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

void Arithmetic_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)
      AC_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) AC_Error("code buffer overflow");
  if (fread(code_buffer, 1, code_bytes, code_file) != code_bytes)
    AC_Error("cannot read code from file");

  start_decoder();                                       // initialize decoder
}

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

unsigned Arithmetic_Codec::stop_encoder(void)
{
  if (mode != 1) AC_Error("invalid to stop encoder");
  mode = 0;

  unsigned init_base = base;            // done encoding: set final data bytes

  if (length > 2 * AC__MinLength) {
    base  += AC__MinLength;                                     // base offset
    length = AC__MinLength >> 1;             // set new length for 1 more byte
  }
  else {
    base  += AC__MinLength >> 1;                                // base offset
    length = AC__MinLength >> 9;            // set new length for 2 more bytes
  }

  if (init_base > base) propagate_carry();                 // overflow = carry

  renorm_enc_interval();                // renormalization = output last bytes

  unsigned code_bytes = unsigned(ac_pointer - code_buffer);
  if (code_bytes > buffer_size) AC_Error("code buffer overflow");

  return code_bytes;                                   // number of bytes used
}

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

unsigned Arithmetic_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)
      AC_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)
    AC_Error("cannot write compressed data to file");

  return code_bytes + header_bytes;                              // bytes used
}

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产麻豆91精品| 亚洲综合色噜噜狠狠| 国产一区二区剧情av在线| 日韩精品一区二区三区在线| 美女在线视频一区| 久久久久久97三级| 99re热这里只有精品视频| 亚洲欧美国产77777| 色综合久久久久| 性做久久久久久久免费看| 91精品蜜臀在线一区尤物| 久久精品免费看| 国产精品日产欧美久久久久| 色一区在线观看| 婷婷亚洲久悠悠色悠在线播放 | 亚洲国产精品av| 99国产精品久| 天天做天天摸天天爽国产一区| 日韩欧美一级片| av日韩在线网站| 人人爽香蕉精品| 国产亚洲一区二区三区| 色视频欧美一区二区三区| 天堂蜜桃一区二区三区| 国产欧美一区二区三区在线老狼 | 色婷婷精品久久二区二区蜜臀av| 亚洲大片一区二区三区| 久久香蕉国产线看观看99| 99久久99久久精品免费看蜜桃| 亚洲不卡在线观看| 久久精品人人做人人综合| 色哟哟在线观看一区二区三区| 免费的国产精品| 亚洲欧美一区二区三区国产精品| 欧美一区二区三区免费在线看| 国产99精品在线观看| 同产精品九九九| 国产精品麻豆网站| 日韩三级视频在线看| 91在线你懂得| 国产精品一二三| 天天操天天干天天综合网| 亚洲人成精品久久久久| 精品国偷自产国产一区| 欧美在线看片a免费观看| 国产另类ts人妖一区二区| 舔着乳尖日韩一区| 亚洲手机成人高清视频| 久久夜色精品国产噜噜av| 欧美日韩成人在线一区| 色综合夜色一区| 成人综合在线观看| 麻豆专区一区二区三区四区五区| 中文字幕亚洲一区二区va在线| 精品欧美一区二区久久| 欧美日韩视频在线一区二区| 不卡av在线免费观看| 韩国精品主播一区二区在线观看| 香蕉av福利精品导航 | 亚洲超碰精品一区二区| 最近中文字幕一区二区三区| 国产亚洲制服色| 久久影视一区二区| 日韩免费观看高清完整版| 在线观看免费一区| 91久久精品一区二区二区| 成人国产精品免费观看视频| 国产精品2024| 国产一区二区免费视频| 精彩视频一区二区三区| 日韩av不卡在线观看| 日精品一区二区三区| 一区二区三区不卡视频在线观看| ...中文天堂在线一区| 日本一区二区成人| 国产精品美女一区二区三区| 国产欧美一区二区精品性色| 久久久国产精华| 欧美激情在线看| 亚洲欧洲成人精品av97| 综合精品久久久| 洋洋成人永久网站入口| 一区二区三区四区五区视频在线观看| 成人免费在线观看入口| 亚洲免费大片在线观看| 夜夜亚洲天天久久| 亚洲五月六月丁香激情| 石原莉奈在线亚洲二区| 免费一区二区视频| 国产一区二区视频在线| 国产成人亚洲精品青草天美| 成人一区二区视频| 一本色道亚洲精品aⅴ| 欧美在线视频全部完| 欧美一级高清大全免费观看| 日韩精品一区二区三区在线观看| 久久精品欧美一区二区三区不卡| 欧美国产日本视频| 亚洲一区二区三区精品在线| 日本少妇一区二区| 国产成人免费xxxxxxxx| 99久久精品免费观看| 欧美熟乱第一页| 日韩一区二区三区电影| 久久久高清一区二区三区| 亚洲婷婷在线视频| 日韩国产欧美在线播放| 国产乱码一区二区三区| 91福利资源站| 日韩欧美在线影院| 国产精品理伦片| 首页国产欧美久久| 高清久久久久久| 777亚洲妇女| 国产精品乱人伦| 日精品一区二区| 99视频精品在线| 欧美大片在线观看一区| 中文字幕一区二| 极品少妇一区二区三区精品视频| 99re8在线精品视频免费播放| 777色狠狠一区二区三区| 日本一区二区免费在线| 婷婷成人激情在线网| 成人午夜短视频| 777xxx欧美| 亚洲色图在线播放| 精品中文字幕一区二区| 精品视频1区2区3区| 欧美激情一区二区三区全黄 | 久久国产精品99精品国产 | 欧美喷水一区二区| 国产精品午夜春色av| 美女免费视频一区二区| 欧美视频一区二区三区四区| 中文字幕免费不卡| 国产一区视频在线看| 91精品久久久久久蜜臀| 一区二区三区蜜桃| 成人永久aaa| 亚洲图片另类小说| 国产jizzjizz一区二区| 精品欧美久久久| 婷婷国产在线综合| 在线观看一区日韩| 一区精品在线播放| 丰满放荡岳乱妇91ww| 久久亚洲综合av| 免费成人在线视频观看| 欧美日韩国产精品成人| 亚洲一区二区三区不卡国产欧美| 99国产精品国产精品久久| 国产精品久久免费看| 国产成人在线视频免费播放| 2024国产精品| 韩国成人在线视频| 日韩一区二区三区三四区视频在线观看 | 国产一区二区免费视频| 日韩女优av电影在线观看| 日韩电影在线免费| 538prom精品视频线放| 性做久久久久久免费观看欧美| 91成人国产精品| 亚洲美腿欧美偷拍| 91亚洲国产成人精品一区二三| 欧美激情一区二区三区不卡| 国产成a人亚洲| 国产精品免费aⅴ片在线观看| 国产成人精品免费一区二区| 国产女主播一区| 风间由美一区二区三区在线观看| 国产精品亲子伦对白| aaa欧美大片| 一区二区不卡在线播放 | 欧美一级二级在线观看| 美脚の诱脚舐め脚责91 | 国产精品久久久久婷婷| 成人免费高清视频| 最新日韩av在线| 一本大道久久a久久综合婷婷| 亚洲免费av观看| 91精品在线麻豆| 国产尤物一区二区在线| 国产精品视频观看| 欧亚一区二区三区| 日产欧产美韩系列久久99| 久久香蕉国产线看观看99| 成人短视频下载| 亚洲午夜av在线| 精品sm捆绑视频| 91亚洲精品乱码久久久久久蜜桃| 婷婷一区二区三区| 久久精品视频网| 色婷婷久久综合| 久久国产精品第一页| 中文字幕亚洲区| 91精品国产一区二区三区香蕉| 国产精品538一区二区在线| 亚洲激情五月婷婷| 精品久久久久久久人人人人传媒|