Tech と Culture

テクノロジーとカルチャー

IJGソフト内部 ハフマン符号化 2

全体の流れは、 decode_mcuという関数内に記述されています。
MCU一つ分のハフマンデコードを行います。
細かい所を省略して流れ部分を書き出すと以下のようなものです。
コメント文として全体の流れを書き込んで説明しています。

decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
{
for(blkn=0; blkn <= cinfo->blocks_in_MCU;blkn++){
/*****DC成分のデコード*****/
  /*****符号のデコード(後に続く数値ビットが何ビットかをデコード)*****/
  HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);

  /*****上で得られたビット数分の数値を得て、符号拡張*****/
  if (s) {
   CHECK_BIT_BUFFER(br_state, s, return FALSE);
   r = GET_BITS(s);
   s = HUFF_EXTEND(r, s);
  }

  /*****一つ前のDC成分に取得した数値を加算して現ブロックのDC成分を書き込む*****/
  if(entropy->dc_needed[blkn]){
    s += state.last_dc_val[ci];
    state.last_dc_val[ci]=s;
    (*block)[0] = (JCOEF) s
  }

  /***** AC成分のデコード あらかじめ配列の64要素はすべて0にされた後にコールされている *****/
  if(entropy->ac_needed[blkn]) {
    /***** kはAC成分のアドレス (1〜63) *****/
    for (k = 1; k < DCTSIZE2; k++) {
      /***** ハフマンデコードを行う *****/
      HUFF_DECODE(s, br_state, actbl, return FALSE, label2);
      /***** ランレングス(r)と数値ビット数(s)を取得 *****/
      r = s >> 4;
      s &= 15;
      if (s) {
        /***** ランレングス分アドレスを加算 *****/
        k += r;
        /***** ビット数分の数値を得て、符号拡張 *****/
        CHECK_BIT_BUFFER(br_state, s, return FALSE);
        r = GET_BITS(s);
        s = HUFF_EXTEND(r, s);
        /***** ジグザグオーダーの場所に書き込み *****/
        (*block)[jpeg_natural_order[k]] = (JCOEF) s;
      } else {
        /***** EOBや、0が15個の場合の処理 *****/
        if (r != 15)
        break;
        k += 15;
      }
    }
  }
}

HUFF_DECODE,CHECK_BIT_BUFFER,GET_BITS,HUFF_EXTENDが実際の部分処理を行っています。
これは、マクロになっており、jdhuff.h に記述されています。