A picture parameter set, NAL unit type 34, holds settings that can change from picture to
picture: the initial quantiser, which tools the slices may switch, and the tile layout. A
stream can hold up to 64, numbered by pps_pic_parameter_set_id, and each
slice header names one. The fields are bit-packed; the
coding column shows how each is
read.
Fields
| Name | Coding | Condition | Description |
|---|---|---|---|
pps_pic_parameter_set_id | ue(v) | 0 to 63 | |
pps_seq_parameter_set_id | ue(v) | the SPS it refers to; 0 to 15 | |
dependent_slice_segments_enabled_flag | u(1) | 1: slice headers may carry dependent_slice_segment_flag | |
output_flag_present_flag | u(1) | 1: slice headers carry pic_output_flag | |
num_extra_slice_header_bits | u(3) | number of reserved flags at the start of each slice header; 0 to 2 in current streams | |
sign_data_hiding_enabled_flag | u(1) | 1: the sign of one coefficient per 4 × 4 sub-block may be hidden in the parity of the level sum | |
cabac_init_present_flag | u(1) | 1: P and B slice headers carry cabac_init_flag | |
num_ref_idx_l0_default_active_minus1 | ue(v) | default size of reference list 0, minus 1; 0 to 14 | |
num_ref_idx_l1_default_active_minus1 | ue(v) | default size of list 1, minus 1; 0 to 14 | |
init_qp_minus26 | se(v) | starting quantiser for each slice, minus 26; −(26 + 6 × (luma bit depth − 8)) to +25 | |
constrained_intra_pred_flag | u(1) | 1: intra prediction uses only neighbouring samples of intra-coded blocks | |
transform_skip_enabled_flag | u(1) | 1: residuals may skip the transform (4 × 4 blocks, larger with the range extension) | |
cu_qp_delta_enabled_flag | u(1) | 1: the quantiser can change inside a slice | |
diff_cu_qp_delta_depth | ue(v) | flag above is 1 | the smallest block with its own QP change is the CTB size halved this many times |
pps_cb_qp_offset | se(v) | Cb quantiser offset; −12 to +12 | |
pps_cr_qp_offset | se(v) | Cr quantiser offset; −12 to +12 | |
pps_slice_chroma_qp_offsets_present_flag | u(1) | 1: slice headers carry their own chroma offsets | |
weighted_pred_flag | u(1) | 1: P slices carry a weighted prediction table | |
weighted_bipred_flag | u(1) | 1: B slices carry a weighted prediction table | |
transquant_bypass_enabled_flag | u(1) | 1: coding units may bypass transform, quantisation and loop filters (lossless) | |
tiles_enabled_flag | u(1) | 1: the picture is divided into tiles | |
entropy_coding_sync_enabled_flag | u(1) | 1: wavefront parallel processing: each CTB row starts with the arithmetic coder state saved after the second CTB of the row above | |
num_tile_columns_minus1 | ue(v) | tiles | tile columns, minus 1 |
num_tile_rows_minus1 | ue(v) | tiles | tile rows, minus 1; not both 0 |
uniform_spacing_flag | u(1) | tiles | 1: tile boundaries are spaced evenly |
column_width_minus1[i] | ue(v) | not uniform, every column but the last | width in CTBs, minus 1; the last column takes the rest |
row_height_minus1[i] | ue(v) | not uniform, every row but the last | height in CTBs, minus 1 |
loop_filter_across_tiles_enabled_flag | u(1) | tiles | 1: deblocking and SAO cross tile boundaries; 1 when absent |
pps_loop_filter_across_slices_enabled_flag | u(1) | 1: in-loop filters may cross the left and upper slice boundaries | |
deblocking_filter_control_present_flag | u(1) | 1: the next fields follow | |
deblocking_filter_override_enabled_flag | u(1) | control present | 1: slice headers may override the deblocking settings |
pps_deblocking_filter_disabled_flag | u(1) | control present | 1: deblocking is off unless a slice overrides it |
pps_beta_offset_div2 | se(v) | deblocking on | β offset ÷ 2; −6 to 6 |
pps_tc_offset_div2 | se(v) | deblocking on | tC offset ÷ 2; −6 to 6 |
pps_scaling_list_data_present_flag | u(1) | 1: scaling list data follows and replaces the SPS lists | |
lists_modification_present_flag | u(1) | 1: slice headers may reorder the reference lists | |
log2_parallel_merge_level_minus2 | ue(v) | merge candidates inside a block of 2this + 2 samples can be derived in parallel; 0 means 4 × 4 | |
slice_segment_header_extension_present_flag | u(1) | 1: slice headers end with extension bytes | |
pps_extension_present_flag | u(1) | 1: the next five fields follow | |
pps_range_extension_flag | u(1) | extension | 1: the range extension follows |
pps_multilayer_extension_flag | u(1) | extension | 1: pps_multilayer_extension() of Annex F follows |
pps_3d_extension_flag | u(1) | extension | 1: pps_3d_extension() of Annex I follows |
pps_scc_extension_flag | u(1) | extension | 1: the screen content coding extension follows |
pps_extension_4bits | u(4) | extension | 0 in current streams; otherwise pps_extension_data_flag bits follow, which decoders ignore |
rbsp_trailing_bits | see the byte stream page |
The multi-layer and 3D extensions are used only by the multiview, scalable and 3D profiles and are not listed here.
Tiles
Tiles are rectangles of whole CTBs, coded in raster order one after another; prediction
and entropy coding do not cross them. With uniform_spacing_flag set, column
i of N spans
((i + 1) × PicWidthInCtbsY) ÷ N − (i × PicWidthInCtbsY) ÷ N CTBs (integer division)
and rows likewise. The number of tile columns and rows is limited by the level. In the Main, Main 10 and format range extensions profiles a picture may not use tiles and wavefronts together, and each tile column must be at least 256 luma samples wide and each row 64 high. Where a slice starts several tiles or wavefront rows, its header gives entry point offsets to each.
Range extension
| Name | Coding | Condition | Description |
|---|---|---|---|
log2_max_transform_skip_block_size_minus2 | ue(v) | transform skip enabled | largest transform-skip block: 4 × 4 when 0 |
cross_component_prediction_enabled_flag | u(1) | 1: chroma residuals may be predicted from the luma residual (4:4:4 only) | |
chroma_qp_offset_list_enabled_flag | u(1) | 1: coding units may pick a chroma QP offset from a list | |
diff_cu_chroma_qp_offset_depth | ue(v) | list enabled | smallest block with its own chroma offset: CTB size halved this many times |
chroma_qp_offset_list_len_minus1 | ue(v) | list enabled | list length, minus 1; 0 to 5 |
cb_qp_offset_list[i], cr_qp_offset_list[i] | se(v) × 2 | per entry | −12 to +12 |
log2_sao_offset_scale_luma | ue(v) | SAO luma offsets are shifted left by this; 0 to max(0, bit depth − 10) | |
log2_sao_offset_scale_chroma | ue(v) | the same for chroma |
Screen content coding extension
| Name | Coding | Condition | Description |
|---|---|---|---|
pps_curr_pic_ref_enabled_flag | u(1) | 1: pictures may use themselves as a reference (intra block copy) | |
residual_adaptive_colour_transform_enabled_flag | u(1) | 1: an adaptive colour transform may be applied to residuals (4:4:4 only) | |
pps_slice_act_qp_offsets_present_flag | u(1) | flag above is 1 | 1: slice headers carry colour transform QP offsets |
pps_act_y_qp_offset_plus5 | se(v) | flag above is 1 | Y offset for transformed residuals, plus 5 |
pps_act_cb_qp_offset_plus5 | se(v) | flag above is 1 | Cb offset, plus 5 |
pps_act_cr_qp_offset_plus3 | se(v) | flag above is 1 | Cr offset, plus 3 |
pps_palette_predictor_initializers_present_flag | u(1) | 1: palette predictor entries follow and replace the SPS ones | |
pps_num_palette_predictor_initializers | ue(v) | flag above is 1 | number of entries, up to the largest predictor size |
monochrome_palette_flag | u(1) | entries present | 1: one component per entry; must match the chroma format |
luma_bit_depth_entry_minus8 | ue(v) | entries present | equal to bit_depth_luma_minus8 |
chroma_bit_depth_entry_minus8 | ue(v) | not monochrome | equal to bit_depth_chroma_minus8 |
pps_palette_predictor_initializer[comp][i] | u(v) | per component, per entry | sample values at the given bit depth |