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 に記述されています。