Skip to main contentModule h264_decode
Source - BCtx 🔒
- B の MB が使う参照リストと、空間ダイレクトの co-located の取り方。
- CabacReader 🔒
- CABAC の MB 層の読み手(9.3.2 二値化・9.3.3.1.1 文脈選択)。近傍の情報は同じスライスの
MB だけを見る(可用性は
DecState::avail_px)。スライスごとに作り直す。 - DecState 🔒
- デコーダ状態。YUV 平面に加え、4x4 ブロック単位の近傍情報グリッドを持つ。
- DecodedYuv
- MbDeblock 🔒
- MB ごとのデブロック設定(スライスヘッダの値)。
- Motion
- 参照ピクチャの動き情報(輝度 4x4 ブロック単位)。B の空間ダイレクトの co-located に使う。
refi が L0/L1 とも -1 のブロックはイントラ。 - MvNeighbor 🔒
- パーティション (px,py,pw) の近傍 A/B/C を返す: ((一致,mv) x3)。
一致 = インターで refIdx=0。C は利用不可なら D(左上)で代用。
動きベクトル予測の近傍(8.4.1.3.2)。可用か・refIdxL0(イントラ/不可用は -1)・MV。
- RefEntry
- 参照リストの 1 要素。
id は参照ピクチャの識別子(POC)で、デブロックの bS 判定で
「同じ参照ピクチャか」を refIdx ではなくピクチャそのもので比べるのに使う(8.7.2.1)。 - RefFrames
- 短期参照フレームのスライディングウィンドウ(8.2.5.3)と POC の状態。復号の新しい順に持つ。
IDR で空にする。長期参照・MMCO は未対応(スライスヘッダの解析で失敗を返す)。
【2026-10-17】B スライス対応で POC と動き情報を持つようにした。B の参照リストは POC の
大小で組み(8.2.4.2.3)、空間ダイレクトは RefPicList1[0] の co-located の動きを見る。
- RefLists 🔒
- スライスの種別ごとの初期参照リスト(並べ替え無し、8.2.4.2)。
p は P の RefPicList0(復号の新しい順)、b は B の RefPicList0/1(POC 順)。 - RefPic
- DPB の 1 枚(短期参照フレーム)。
- SpatialDirect 🔒
- 空間ダイレクトの MB 単位の導出結果(8.4.1.2.2)。
- VideoDecoder
- MP4/AVCC 経路用のステートフルなビデオデコーダ。参照フレームを保持して P/B を復号し、
B による並べ替えを POC 順に戻して返す。
- MvDir 🔒
- MV 予測の方向ヒント(16x8/8x16 の特例)。
- ResBlock 🔒
- 残差ブロックの種類と位置(CAVLC は nC、CABAC は coded_block_flag の文脈に使う)。
- WpMode 🔒
- 重み付き予測のモード(8.4.2.3)。
- ALPHA_TABLE 🔒
- BETA_TABLE 🔒
- B_PART_PAIRS 🔒
- B_x_y_16x8 / 8x16(mb_type 4..=21)の 2 パーティションの予測リスト(表 7-14、2 つずつ同じ組)。
- B_SUB_MB 🔒
- B_8x8 の sub_mb_type(表 7-18)→ (予測リスト, 幅, 高さ)。0 は B_Direct_8x8。
- CBP_INTER_MAP 🔒
- CBP_INTRA_MAP 🔒
- COEFF_TOKEN_0 🔒
- COEFF_TOKEN_2 🔒
- COEFF_TOKEN_4 🔒
- COEFF_TOKEN_CHROMA_DC 🔒
- LAST_CTX_8X8 🔒
- CABAC の 8x8 の last_significant_coeff_flag の ctxIdxInc(表 9-43)。
- LUMA_4X4_BLOCK_XY 🔒
- MBF_DIRECT16 🔒
- MBF_I16 🔒
- MBF_INTRA 🔒
- MBF_PCM 🔒
- MBF_SKIP 🔒
- NORM_ADJUST_8X8 🔒
- normAdjust8x8 の 6 つの値(8.5.9、qP % 6 ごと)。
- PRED_BI 🔒
- PRED_L0 🔒
- パーティションの予測リスト(ビット 0 = L0、ビット 1 = L1、3 = 双予測)。
- PRED_L1 🔒
- RUN_BEFORE 🔒
- SIG_CTX_8X8_FRAME 🔒
- CABAC の 8x8(cat 5、フレーム)の significant_coeff_flag の ctxIdxInc(表 9-43)。
- TC0_TABLE 🔒
- TOTAL_ZEROS_16 🔒
- TOTAL_ZEROS_CHROMA 🔒
- ZIGZAG_4X4 🔒
- ZIGZAG_8X8 🔒
- 8x8 のジグザグ走査(フレーム): 走査位置 → ラスタ位置。
- MbSyntax 🔒
- MB 層の構文要素の読み手。値の番号付けは CAVLC(表 7-11/7-13/7-14/7-17/7-18)に揃える。
- add_inter_chroma_residual 🔒
- インター MB のクロマ残差を MC 予測へ加算(DC 2x2 Hadamard + AC)。
- add_inter_luma_residual 🔒
- インター MB の輝度残差を MC 予測へ加算(4x4 ブロックごと)。
- boundary_strength 🔒
- フレーム全体にデブロッキングを適用(I スライス: MB 境界 bS=4、内部 bS=3)。
2 つの 4x4 ブロック間の境界強度(8.7.2.1)。I/P 両対応。
p_li/q_li: 輝度 4x4 ブロックの線形 index。is_mb_edge: MB 境界エッジか。
- check_token_complete 🔒
- coeff_token テーブルに有効な (tc, t1) 組が漏れなく 1 回ずつあるか検査。
max_tc までの全組(tc=0:(0,0)、tc>=1: t1=0..min(tc,3))を期待。
- chroma_nc 🔒
- クロマ 4x4 ブロックの nC(クロマプレーン内の左/上 nnz から)。
- chroma_qp 🔒
- 輝度 QP -> クロマ QP(Table 8-15、qPi>=30 の写像)。
- clip1 🔒
- col_zero 🔒
- co-located(RefPicList1[0] の同じ位置)の 4x4 ブロックが「ほぼ静止」か(colZeroFlag、8.4.1.2.2)。
(bx, by) は MB 内の 4x4 位置。direct_8x8_inference では 8x8 の外側の角を使う(8.4.1.2.1)。 - combine_nc 🔒
- 近傍 2 ブロックの nnz から nC を求める(-1 は不可用)。
- crop_rgb 🔒
- RGB24 のフレーム(
fwxfh)から表示領域(frame_cropping)を切り出す。
領域が不正なら切り出さずに返す。例: 640x360 は 640x368(MB 単位)を復号して下 8 行を落とす。 - deblock_chroma_edge 🔒
- クロマ 1 エッジ(4:2:0、p0/q0 のみ修正)。
- deblock_frame 🔒
- deblock_luma_edge 🔒
- 輝度 1 エッジ(長さ len)をフィルタ。vert: 垂直エッジ。(ex,ey)=q 側左上(フレーム座標)。
- deblock_thresh 🔒
- indexA/indexB から (alpha, beta, tc0) を引く。
- decode_b8x8 🔒
- B_8x8: 4 つの sub_mb_type(表 7-18)。B_Direct_8x8 の 8x8 は空間ダイレクト。
- decode_b_direct_mb 🔒
- B_Skip / B_Direct_16x16 の予測(残差は呼び出し側)。
- decode_chroma 🔒
- クロマ復号(4:2:0)。予測 + 残差(DC: 2x2 Hadamard、AC: cbp_chroma==2 のとき)。
- decode_inter_residual 🔒
- インター MB(P/B の符号化 MB)の coded_block_pattern・mb_qp_delta・残差。
- decode_mb 🔒
- decode_mb_b 🔒
- B スライスの符号化 MB(mb_type: 0 = B_Direct_16x16、1..=21 = 16x16/16x8/8x16、22 = B_8x8、
23 以上 = イントラ)。mb_pred の並びは ref_idx_l0 → ref_idx_l1 → mvd_l0 → mvd_l1(7.3.5.1)。
- decode_mb_i4x4 🔒
- decode_mb_i8x8 🔒
- I_NxN で transform_size_8x8_flag = 1(Intra8x8)。4 つの 8x8 の予測モード → クロマ予測モード
→ cbp → mb_qp_delta → 8x8 ごとの残差(7.3.5)。
- decode_mb_i16x16 🔒
- decode_mb_ipcm 🔒
- I_PCM マクロブロック: 生の画素値をそのまま格納(予測・変換なし)。
- decode_mb_p 🔒
- インター: mb_type 0=16x16, 1=16x8, 2=8x16, 3/4=P_8x8。
- decode_p8x8 🔒
- decode_picture
- 1 フレーム(1 つ以上のスライス)を復号する。
slices は同じフレームのスライスの RBSP を
並び順に渡す。refs は RefPicList0(先頭が refIdx 0)。並べ替え無しの P では短期参照を
PicNum の降順=新しい順に並べたもの(8.2.4.2.1)。呼び出し側が DPB を持つ(RefFrames)。
nal_ref_idc が 0 なら dec_ref_pic_marking は無い(7.3.3)。
【2026-10-17】複数スライスに対応。従来は 1 スライス=1 フレーム前提で、2 枚目以降のスライスが
別フレームとして組まれていた(first_mb_in_slice も読み捨て)。 - decode_picture_lists 🔒
decode_picture の本体。復号したフレームと、その動き情報(次の B の co-located 用)を返す。- decode_pskip 🔒
- P_Skip マクロブロックのデコード。
- decode_slice
- 単一スライス(I または P、IDR/非IDR、4:2:0、CAVLC)をデコードして YUV 平面を返す。
reference は P スライスの動き補償に使う直前のフレーム。
- decode_slice_into 🔒
- 1 スライスを
st へ組み込む(first_mb_in_slice から more_rbsp_data() が尽きるまで)。 - decode_slice_refs
- 1 スライス=1 フレームのときの簡易版(
decode_picture に 1 スライスを渡す)。 - dequant_8x8 🔒
- 8x8 の逆量子化(8.5.13.1、平坦な weightScale = 16)。
b はラスタ順。 - direct_8x8 🔒
- 空間ダイレクトの 8x8(
i 番目)を予測・格納する。direct_8x8_inference が無ければ 4x4 ごと。 - golden_test
- 起動時に呼ぶゴールデン検証。結果をログ出力する。
- iclip 🔒
- idct8_1d 🔒
- 8x8 の 1 次元逆変換(8.5.13.2)。
- implicit_weights 🔒
- 暗黙の重み付き双予測の重み (w0, w1)(8.4.2.3.1、logWD = 5)。POC の距離の比から求め、
範囲外・同じ距離なら等分(32, 32)。
- interp_chroma_sample 🔒
- クロマのサブ画素補間(8.4.2.2.2、双線形 1/8 画素)。
- interp_luma_core 🔒
- 6タップ補間のコア(8.4.2.2.1)。get(dx,dy) でサンプル取得(クランプ有無は呼び出し側)。
- interp_luma_sample 🔒
- 端のクランプ付きで 1 サンプル補間(フレーム境界をまたぐパーティション用)。
- inverse_hadamard_2x2 🔒
- 2x2 クロマ DC の逆 Hadamard 変換(raster 2x2、c[0..3])。
- inverse_hadamard_4x4 🔒
- I_16x16 輝度 DC の 4x4 逆 Hadamard 変換(in-place、raster)。丸め無し。
- inverse_transform_8x8 🔒
- 8x8 の逆変換(行 → 列、最後に (x + 32) >> 6)。
b はラスタ順で、残差に置き換える。 - is_prefix_free 🔒
- (len, code) 群が prefix-free か検査。衝突する組を見つけたら false。
- mc_part 🔒
- パーティションの MC(輝度 + クロマ)。
- mc_part_chroma 🔒
- クロマパーティション(輝度 pw×ph @ (px,py) に対応)の動き補償(サブ画素 1/8)。
- mc_part_luma 🔒
- 輝度パーティション pw×ph @ (px,py) の動き補償(サブ画素対応)。
- mc_pred 🔒
- 予測リストに応じた動き補償(8.4.2)。双予測は L0・L1 の予測の平均 (a + b + 1) >> 1
(重み無しの既定、8.4.2.3.1)。戻り値は各リストの参照ピクチャ識別子(使わないリストは 0)。
- median3 🔒
- min_positive 🔒
- MinPositive(x, y)(8.4.1.2.2)。
- modify_ref_list 🔒
- 参照リストの並べ替え(8.2.4.3.1、短期参照のみ)。
list は初期リスト(num_active で切ったもの)、
all は短期参照のすべて。指された PicNum のピクチャを refIdx の位置へ入れ、後ろの重複を除く。 - mv_predict 🔒
- パーティションの MV 予測(8.4.1.3、単一参照 refIdx=0、方向ヒント対応)。
ref_idx はこのパーティションの refIdxL0。
【2026-10-17】複数参照に対応。従来は「インターの隣=一致」とみなしており(単一参照前提)、
「B・C が不可用で A 可用なら A」も画面上の位置で近似していた。8.4.1.3 どおり refIdx の一致と
実際の可用性(画面外・未復号)で判定する。 - mv_predict_16x16 🔒
- 16x16 パーティションの明示的 MV 予測(8.4.1.3、単一参照 refIdx=0 前提)。
重要: 「利用可能(デコード済み・画面内)」と「一致(インターで refIdx=0)」を区別する。
C(右上)の D 代用は C が 利用不可 のときのみ(イントラで利用可能なら代用しない)。
- mv_predict_l 🔒
mv_predict のリスト指定版(B の L1 用)。- norm8_class 🔒
- 8x8 の係数位置 (i, j) が normAdjust8x8 のどの値を使うか。
- part_neighbors 🔒
- pic_num 🔒
- FrameNumWrap(= フレームの PicNum、8.2.4.1)。現在の frame_num より大きいものは前の周回。
- predict_pskip_mv 🔒
- P_Skip の動きベクトル導出(8.4.1.1)。
- read_coeff_token 🔒
- coeff_token を読み (total_coeff, trailing_ones) を返す。table は上記のいずれか。
- read_coeff_token_nc 🔒
- coeff_token を nC に応じて復号。nC>=8 は 6bit FLC、nC==-1 はクロマ DC 表。
- read_ref_idx 🔒
- P スライスの符号化 MB。intra MB(mb_type>=5)は intra デコーダへ委譲。
P_8x8 / P_8x8ref0: 4 つの 8x8 サブ MB、各 sub_mb_type でさらに分割。
ref_idx_l0(te(v)、7.4.5.1)。値域が 0..=1 のときだけ 1 ビットの反転、それ以外は ue(v)。
参照が 1 枚なら読まずに 0。 - read_run_before 🔒
- read_total_zeros 🔒
- reconstruct_luma_4x4 🔒
- 輝度 4x4 ブロックの再構成(予測 + 残差)を行い、グリッドを更新する。
- residual_8x8_to_pixels 🔒
- 8x8 の係数(走査順)→ 逆量子化・逆変換済みの残差(ラスタ順)。
- residual_block_cavlc 🔒
- CAVLC で 1 残差ブロックを復号。スキャン順の係数配列と total_coeff を返す。
n_c: 近傍係数数(-1=chroma DC, >=8=FLC)。tz_tables: total_zeros VLC 群。
- run_golden 🔒
- ゴールデン素材 1 本をデコードし、Y 面の一致画素数を返す。
- run_golden_debug 🔒
- 不一致を 16x16 MB 単位で集計してデバッグ出力(複数フレーム対応、最後のフレームを比較)。
- scale_chroma_dc 🔒
- クロマ DC のスケーリング(8.5.11.1): dcC = ((f * LevelScale(qPc%6,0,0)) << (qPc/6)) >> 5。
- scale_luma_dc 🔒
- I_16x16 輝度 DC のスケーリング(8.5.10)。
- set_mb_inter_grids 🔒
- インター MB(P_Skip 含む)の近傍グリッドを更新。
- slice_first_mb
- スライスの
first_mb_in_slice(先頭の ue(v))。0 なら新しいフレームの始まり。 - spatial_direct 🔒
- 空間ダイレクトの refIdx と MV 予測を MB の近傍 A/B/C(16x16 として)から求める。
MB 内のパーティションを 1 つも格納する前に呼ぶこと。
- store_part 🔒
- パーティションの MV・refIdx(L0/L1)をグリッドへ格納(後続パーティション/MB の予測・
デブロック・次のピクチャの co-located 用)。使わないリストは refIdx = -1・MV = 0。
- store_part_mv 🔒
- L0 だけのパーティション(P)の MV をグリッドへ格納する。
id は参照ピクチャの識別子。 - sub_part_offsets 🔒
- 幅×高さのサブパーティションの左上オフセット(8x8 の中)。
- tables_selftest
- 全 CAVLC VLC テーブルの prefix-free 性 + coeff_token の完全性を検査。
- weight_single 🔒
- 単方向予測の明示的な重み付け(8.4.2.3.2)。明示モード以外は何もしない(暗黙モードの
単方向は既定)。予測済みの領域をその場で置き換える。
- yuv_to_rgb
- YUV420 → RGB24(BT.601、各画素 [R,G,B])。描画経路用。
- TokEntry 🔒