Introduction
Annex I of ITU-T H.265 (01/2026, version 11) defines 3D-HEVC. It is built on the
multi-layer structure of Annex F: each view
has a texture layer and a depth layer (DepthLayerFlag 1, dimension 0 of the
scalability mask), and the coding tools predict between views and between a texture layer
and its depth layer. The syntax of Annexes F and G applies except where this page
replaces it. In the 3D Main profile depth layers are monochrome (4:0:0). The tools it adds are: disparity vectors
derived from depth, inter-view merging and residual prediction, view synthesis
prediction, illumination compensation, depth-based block partitioning (DBBP), and, for
depth layers, wedgelet and contour intra modes, DC-only blocks and prediction of the coding
quadtree from the texture. The 3D Main profile is general_profile_idc 8.
VPS 3D extension (I.7.3.2.1.7)
Camera parameter conversion from depth to disparity. In Annex I the VPS has, after
vps_extension(), vps_extension2_flag; when it is 1 then
vps_3d_extension_flag u(1), and when that is 1 alignment bits
equal to 1 and vps_3d_extension(), then vps_extension3_flag and
extension data bits. ViewOIdxList[n] lists the view order indices of the
views of the VPS.
| Field | Coding | Condition | Meaning |
|---|---|---|---|
cp_precision | ue(v) | 0 to 5; cp_precision + BitDepthY − 1 is the precision of the scale and inverse scale parameters (vps_cp_scale, vps_cp_inv_scale_plus_scale, cp_scale, cp_inv_scale_plus_scale) | |
num_cp[i] | u(6) | per view i from the second | how many reference views have conversion parameters |
cp_in_slice_segment_header_flag[i] | u(1) | num_cp[i] > 0 | 1: the parameters are in the slice segment headers of view i, not in the VPS; inferred 0 |
cp_ref_voi[i][m] | ue(v) | m < num_cp[i] | view order index j of the view the m-th parameter set relates to, 0 to 65535, all different |
vps_cp_scale[i][j], vps_cp_off[i][j], vps_cp_inv_scale_plus_scale[i][j], vps_cp_inv_off_plus_off[i][j] | se(v) each | flag 0 | parameters for deriving the horizontal component of a disparity vector from a depth value, for view i with respect to view j (the inverse ones are coded as the sum with the forward ones, as the names say). When both a texture and a depth layer exist they belong to the texture layer. They can also initialise the slice header values. CpPresentFlag[i][j] is 1 for the listed pairs |
SPS 3D extension (I.7.3.2.2.5)
Present when sps_3d_extension_flag is 1 (SPS
and the multi-layer SPS). Two copies of
each flag are sent, d = 0 for texture layers and 1 for depth layers
(DepthFlag). Every flag is inferred 0 when absent.
| Field | Coding | Sent for | Meaning |
|---|---|---|---|
iv_di_mc_enabled_flag[d] | u(1) | both | 1: inter-view predicted merging candidates and disparity information merging candidates may be used |
iv_mv_scal_enabled_flag[d] | u(1) | both | 1: motion vectors used for inter-view prediction may be scaled using the view_id_val values |
log2_ivmc_sub_pb_size_minus3[0] | ue(v) | texture | minimum sub-block size of the inter-layer merging candidate − 3 (log2); between MinCbLog2SizeY − 3 and CtbLog2SizeY − 3, inferred CtbLog2SizeY − 3 |
iv_res_pred_enabled_flag[0] | u(1) | texture | 1: iv_res_pred_weight_idx may be present (inter-view residual prediction) |
depth_ref_enabled_flag[0] | u(1) | texture | 1: a depth picture may be used to derive disparity vectors for texture |
vsp_mc_enabled_flag[0] | u(1) | texture | 1: a view synthesis prediction merging candidate may be used |
dbbp_enabled_flag[0] | u(1) | texture | 1: dbbp_flag may be present |
tex_mc_enabled_flag[1] | u(1) | depth | 1: the texture merge candidate (motion from the collocated texture) may be used |
log2_texmc_sub_pb_size_minus3[1] | ue(v) | depth | sub-block size for the texture merge candidate, same range |
intra_contour_enabled_flag[1] | u(1) | depth | 1: intra mode INTRA_CONTOUR may be used |
intra_dc_only_wedge_enabled_flag[1] | u(1) | depth | 1: dc_only_flag may occur in intra CUs and INTRA_WEDGE may be used |
cqt_cu_part_pred_enabled_flag[1] | u(1) | depth | 1: coding quadtree and CU partitioning may be predicted from the texture |
inter_dc_only_enabled_flag[1] | u(1) | depth | 1: dc_only_flag may occur in inter CUs |
skip_intra_enabled_flag[1] | u(1) | depth | 1: skip_intra_flag may occur |
PPS 3D extension and depth look-up tables (I.7.3.2.3.7, I.7.3.2.3.8)
A depth look-up table (DLT) maps the few depth values that actually occur to indices, which makes depth DC offsets cheaper to code. It lives in the PPS.
| Field | Coding | Condition | Meaning |
|---|---|---|---|
dlts_present_flag | u(1) | 1: the DLT fields follow | |
pps_depth_layers_minus1 | u(6) | flag | depth layers − 1; equal to NumDepthLayers − 1 from the VPS (DepIdxToLId[] lists their nuh_layer_id in order) |
pps_bit_depth_for_depth_layers_minus8 | u(4) | flag | depth sample bit depth − 8, equal to bit_depth_luma_minus8; depthMaxValue = (1 << (value + 8)) − 1 |
dlt_flag[i] | u(1) | per depth layer | 1: layer DepIdxToLId[i] has a table in this PPS; inferred 0 |
dlt_pred_flag[i] | u(1) | dlt_flag | 1: predicted from the table of the first depth layer (0 for the first, and 0 whenever the first has none) |
dlt_val_flags_present_flag[i] | u(1) | no prediction | 1: the table is a bitmap of dlt_value_flag[i][j]; 0: it is given by delta_dlt(). Inferred 0 |
dlt_value_flag[i][j] | u(1) | j = 0 to depthMaxValue | 1: depth value j is an entry; entries in increasing order form DltVal[layer][n] and NumValDlt |
delta_dlt(i) (all u(v)): | |||
num_val_delta_dlt | u(v), depth bit depth bits | length of the list of values to add or remove | |
max_diff | u(v), depth bit depth bits | list longer than 1 | largest difference between consecutive list elements; inferred 0 |
min_diff_minus1 | u(v), Ceil(Log2(max_diff + 1)) bits | list longer than 2 and max_diff > 0 | smallest difference − 1; inferred max_diff − 1; minDiff = min_diff_minus1 + 1 |
delta_dlt_val0 | u(v), depth bit depth bits | list not empty | first list element |
delta_val_diff_minus_min[k] | u(v), Ceil(Log2(max_diff − minDiff + 1)) bits | k from 1, max_diff > minDiff | element k = element k − 1 + this + minDiff (I-15); inferred 0 |
The table of a layer from delta_dlt() holds every value from 0 to
depthMaxValue for which "is in the reference table" (when predicted, else
false) differs from "is in the delta list" (I-16): the list toggles entries of the
prediction.
Slice segment header (I.7.3.6.1)
The multi-layer header with
these differences and additions. Annex I uses NumRefListLayers where
Annex F has NumDirectRefLayers in the inter-layer conditions.
| Field | Coding | Condition | Meaning |
|---|---|---|---|
in_comp_pred_flag | u(1) | inCmpPredAvailFlag: all reference component layers are available and, for texture, vsp_mc_enabled_flag, dbbp_enabled_flag or depth_ref_enabled_flag; for depth, intra_contour_enabled_flag, cqt_cu_part_pred_enabled_flag or tex_mc_enabled_flag (I-17, I-18) | 1: every reference picture needed for inter-component prediction is in the DPB (same PicOrderCntVal) and it is enabled; inferred 0 |
slice_ic_enabled_flag | u(1) | P or B slice without weighted prediction, texture layer with reference layers | 1: illu_comp_flag may be present in CUs; inferred 0 |
slice_ic_disabled_merge_zero_idx_flag | u(1) | slice_ic_enabled_flag | 1: no illu_comp_flag for CUs merged with merge_idx 0; inferred 0 |
five_minus_max_num_merge_cand | ue(v) | MaxNumMergeCand = 5 + NumExtraMergeCand − value (I-36), 1 to 5 + NumExtraMergeCand | |
cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], cp_inv_off_plus_off[j] | se(v) each | cp_in_slice_segment_header_flag[ViewIdx], for each of num_cp[ViewIdx] reference views j = cp_ref_voi | the depth to disparity conversion parameters of the VPS, per slice; when absent they are the VPS values. Equal across slices of a view |
Coding quadtree and coding unit (I.7.3.8.4, I.7.3.8.5)
Annex I replaces the coding quadtree and coding
unit syntax; the rest of slice segment data (prediction unit, transform tree,
residual, palette, …) is as in Annex F. The variables
CqtCuPartPredEnabledFlag, IntraContourEnabledFlag and the other
capitalised flags are the SPS flags of the layer's DepthFlag (set up in the
slice semantics together with DispAvailFlag, RpRefPicAvailFlag and
DisparityDerivationFlag).
Changes to the ordinary elements
| Element | Coding | Change |
|---|---|---|
split_cu_flag | ae(v) | not sent when predSplitCuFlag is 1. predSplitCuFlag is log2CbSize <= log2TextCbSize of the collocated texture CU when CqtCuPartPredEnabledFlag is 1, else 0. When absent it is 1 if log2CbSize > MinCbLog2SizeY and predSplitCuFlag is 0, otherwise 0 |
cu_skip_flag | ae(v) | a skipped CU can still carry merge_idx, iv_res_pred_weight_idx and illu_comp_flag |
skip_intra_flag | ae(v) | sent when SkipIntraEnabledFlag and not cu_skip_flag; 1 means only skip_intra_mode_idx follows and the CU is intra |
pred_mode_flag | ae(v) | not in I slices or after skip_intra_flag; then the CU is intra |
part_mode | ae(v) | not sent when predPartModeFlag is 1 (log2TextCbSize equals log2CbSize and the texture CU is 2N×2N); with partPredIdc 1 or 2 only two shapes are allowed (Table I.1 below) |
rqt_root_cbf | ae(v) | when absent inferred as not DcOnlyFlag |
partPredIdc, for depth layers with CqtCuPartPredEnabledFlag: 0
when the texture CU has a different size or is 2N×2N or N×N; 1 when it is 2N×N, 2N×nU or
"2NxnL" (as printed in the text; no such partition exists, so 2N×nD is probably meant);
otherwise 2. The part
mode table (Table I.1) is the ordinary one for partPredIdc 0 (intra 2N×2N and
N×N; inter 0 to 7 as 2N×2N, 2N×N, N×2N, N×N, 2N×nU, 2N×nD, nL×2N, nR×2N), and for
partPredIdc 1: 0 2N×2N, 1 2N×N, 2 2N×nU, 3 2N×nD; for 2: 0 2N×2N, 1 N×2N, 2
nL×2N, 3 nR×2N. Its binarisation (Table I.16) lists the ordinary codes for
partPredIdc 0 and gives the restricted forms short codes:
partPredIdc 1 gives 2N×N 0 (01 with AMP above the minimum size), 2N×nU 000 and
2N×nD 001; partPredIdc 2 gives N×2N 0 (01), nL×2N 000 and
nR×2N 001; 2N×2N is 1 in every case.
Added elements
| Element | Coding | Condition | Meaning |
|---|---|---|---|
no_dim_flag[x0][y0] | ae(v) | intra PU of a depth layer with INTRA_WEDGE or INTRA_CONTOUR enabled, log2PbSize < 6 | 1: neither depth intra mode (DIM) is used; inferred 1. When 0, DimFlag is 1 and the normal intra mode fields are not sent. Must be 1 when log2CbSize exceeds the maximum transform size unless DC only |
depth_intra_mode_idx_flag[x0][y0] | ae(v) | not no_dim_flag, both DIM tools enabled | 0: INTRA_WEDGE, 1: INTRA_CONTOUR. Inferred (!IntraDcOnlyWedgeEnabledFlag || IntraContourEnabledFlag); must be 0 in IRAP pictures |
wedge_full_tab_idx[x0][y0] | ae(v) | not no_dim_flag and wedgelet | index into WedgePatternTable[log2PbSize], a table of line partitions of the block generated by the process of I.6.6 |
skip_intra_mode_idx[x0][y0] | ae(v) | skip_intra_flag | 0: INTRA_ANGULAR26 (vertical), 1: INTRA_ANGULAR10 (horizontal), 2 or 3: INTRA_SINGLE |
dbbp_flag[x0][y0] | ae(v) | not skipped, DbbpEnabledFlag, disparity available, log2CbSize > 3, part mode 2N×N or N×2N | 1: inter prediction by depth predicted sub-block partitions (the split mask comes from the depth); bi-prediction is not allowed for it. Inferred 0 |
dc_only_flag[x0][y0] | ae(v) | 2N×2N, not skipped, and IntraDcOnlyWedgeEnabledFlag (intra) or InterDcOnlyEnabledFlag (inter) | 1: no transform_tree(), only depth_dcs(); 0 for PCM; inferred 0 |
iv_res_pred_weight_idx[x0][y0] | ae(v) | inter 2N×2N, IvResPredEnabledFlag and a reference picture available | 0: no inter-view residual prediction, otherwise the weighting factor index of the bilinear sample interpolation and residual prediction process |
illu_comp_flag[x0][y0] | ae(v) | inter 2N×2N, slice_ic_enabled_flag, icCuEnableFlag, weight index 0 | 1: illumination compensated prediction. icCuEnableFlag is merge_idx != 0 || !slice_ic_disabled_merge_zero_idx_flag for merged CUs, else true when a used reference picture belongs to another view (I-48, I-49). Inferred 0 |
depth_dc_present_flag[x][y] | ae(v) | intra DC-only CU, per segment | 1: depth_dc_abs follows; inferred 1 |
depth_dc_abs[x][y][i] | ae(v) | per DC segment i of dcNumSeg (2 for DIM blocks, else 1) | with the sign gives the offset DcOffset = (1 − 2 · depth_dc_sign_flag) · (depth_dc_abs − dcNumSeg + 2) (I-51); 0 when absent |
depth_dc_sign_flag[x][y][i] | ae(v) | depth_dc_abs − dcNumSeg + 2 > 0 | 1: negative |
A CU codes cu_extension() after its prediction data, then
depth_dcs() when it is DC-only or intra and not skip_intra, then
the transform tree unless it is skipped, skip_intra, DC-only or PCM. Intra
prediction units loop over the CU (or its four parts for N×N) sending
intra_mode_ext() first for each, then the usual MPM fields only where
no_dim_flag is 1. A DC-only or DIM block predicts each of its one or two
segments from the DLT-mapped DC offset; the intra sample processes (INTRA_WEDGE,
INTRA_CONTOUR, INTRA_SINGLE, segment DC derivation) are in I.8.4.
CABAC for the added elements (I.9.3)
Appended to the tables of the HEVC CABAC page
(Tables I.4 to I.18). initType is 0, 1 or 2 as there; the tables below give
initValue per initType.
| Element | Binarisation | Bins and ctxInc | initValue (initType 0, 1, 2) |
|---|---|---|---|
skip_intra_flag | FL, cMax 1 | bin 0 ctx 0 | 185, 185, 185 |
no_dim_flag | FL, cMax 1 | bin 0 ctx 0 | 154, 141, 155 |
depth_intra_mode_idx_flag | FL, cMax 1 | bin 0 ctx 0 | 154, 154, 154 |
wedge_full_tab_idx | FL, cMax NumWedgePattern[log2PbSize] − 1 | all bins bypass | none |
skip_intra_mode_idx | TR, cMax 3, cRiceParam 0 | bin 0 ctx 0, bins 1 and 2 bypass | 137, 137, 137 |
dbbp_flag | FL, cMax 1 | bin 0 ctx 0 | 154, 154, 154 |
dc_only_flag | FL, cMax 1 | bin 0 ctx 0 | 154, 154, 154 |
iv_res_pred_weight_idx | TR, cMax 2, cRiceParam 0 | bin 0 ctx 0 or 1 (ctxInc is 1 when the left neighbour is available and its iv_res_pred_weight_idx is non-zero, Table I.18), bin 1 ctx 2 | initType 1: 162, 153, 162; initType 2: 162, 153, 162 (contexts 0 to 2 and 3 to 5; none for type 0) |
illu_comp_flag | FL, cMax 1 | bin 0 ctx 0 | initType 1: 154; initType 2: 154 (none for type 0) |
depth_dc_present_flag | FL, cMax 1 | bin 0 ctx 0 | 0, 0, 64 |
depth_dc_abs | prefix TR(Min(value, 3), cMax 3, cRiceParam 0); when the prefix value is 3 or more a suffix EG0(value − 3) | bins 0 to 2 ctx 0, further bins bypass | 154, 154, 154 |
depth_dc_sign_flag | FL, cMax 1 | bin 0 bypass | none |
The CU part mode binarisation changes as described above (Table I.16). All other elements use the single-layer rules.
3D Main profile (I.11.1.1)
Indicated by general_profile_idc 8 (or compatibility flag 8) with
general_max_12bit_constraint_flag, general_max_10bit_constraint_flag,
general_max_8bit_constraint_flag, general_max_422chroma_constraint_flag,
general_max_420chroma_constraint_flag and
general_lower_bit_rate_constraint_flag 1 and the monochrome, intra and
one-picture flags 0 (the sub_layer_ forms for a lower temporal operation
point). The base layer is Main. Texture layers are 4:2:0 and depth layers 4:0:0, all 8-bit.
The VPS has at most 16 representation formats. Only the view order and depth dimensions
are used. Alternative output layers are off. Layers other than the first have no
reference location offsets, the same picture size as their reference layers, and no
colour mapping. No range extension or SCC syntax, CtbLog2SizeY 4 to 6, a
layer has at most 9 direct and indirect reference layers, tiles are at least 256 × 64 and
not combined with wavefronts. Layers of one kind have increasing view order index, and a
depth layer directly follows the texture layer of its view in the VPS. Level limits (I.11.2)
are not reproduced.
SEI messages
The messages of Annexes F and G apply, including the multiview and depth ones. Annex I adds type 181.
| Type | Name | Fields and meaning |
|---|---|---|
| 181 | alternative_depth_info | alternative_depth_info_cancel_flag u(1) (1 ends the previous message); else depth_type u(2): 0 global view and depth (GVD), 1 warp map; others reserved and the message ignored. GVD: the non-base view carries up to four half-size constituent pictures (the same arrangement as the H.264 message): num_constituent_views_gvd_minus1 ue(v), depth_present_gvd_flag, z_gvd_flag, intrinsic_param_gvd_flag, rotation_gvd_flag, translation_gvd_flag u(1), then the same z near and far, precision and per-camera intrinsic, rotation and translation fields as in H.264 (sign, 7-bit exponent for z or 6-bit for the others, mantissa; binToFp). The depth representation information message must accompany it. Warp map: min_offset_x_int se(v) and min_offset_x_frac u(8) (offset = int + frac ÷ 256), max_offset_x_int, max_offset_x_frac, offset_y_present_flag u(1) and, when set, the four y values, warp_map_size_present_flag u(1) and, when set, warp_map_width_minus2 and warp_map_height_minus2 ue(v) (the size stays until the next message that sets one): the decoded depth gives a sparse set of positional correspondences between views for image-domain warping. Persists until a new CVS, the end of the bitstream or output of a picture with a later picture order count that carries a message |
Not covered on this page
The 3D decoding processes of I.8 (candidate lists for disparity vectors, DLT derivation, depth intra prediction, merge candidates, illumination compensation, bilinear residual prediction, DBBP and view synthesis), the wedgelet pattern table generation (I.6.6), the 3D level limits (I.11.2) and the 3D forms of the scalable nesting SEI semantics. Source: ITU-T H.265 (01/2026, version 11), Annex I.