Skip to main content

Module h264_decode

Module h264_decode 

Source

Structs§

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 順に戻して返す。

Enums§

MvDir 🔒
MV 予測の方向ヒント(16x8/8x16 の特例)。
ResBlock 🔒
残差ブロックの種類と位置(CAVLC は nC、CABAC は coded_block_flag の文脈に使う)。
WpMode 🔒
重み付き予測のモード(8.4.2.3)。

Constants§

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 のジグザグ走査(フレーム): 走査位置 → ラスタ位置。

Traits§

MbSyntax 🔒
MB 層の構文要素の読み手。値の番号付けは CAVLC(表 7-11/7-13/7-14/7-17/7-18)に揃える。

Functions§

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])。描画経路用。

Type Aliases§

TokEntry 🔒