FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/hevc/ps.h
Date: 2026-07-22 00:55:30
Exec Total Coverage
Lines: 2 2 100.0%
Functions: 1 1 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 /*
2 * HEVC parameter set parsing
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #ifndef AVCODEC_HEVC_PS_H
22 #define AVCODEC_HEVC_PS_H
23
24 #include <stdint.h>
25
26 #include "libavutil/pixfmt.h"
27 #include "libavutil/rational.h"
28
29 #include "libavcodec/avcodec.h"
30 #include "libavcodec/get_bits.h"
31 #include "libavcodec/h2645_vui.h"
32
33 #include "hevc.h"
34
35 #define HEVC_VPS_MAX_LAYERS 2
36
37 typedef struct HEVCSublayerHdrParams {
38 uint32_t bit_rate_value_minus1[HEVC_MAX_CPB_CNT];
39 uint32_t cpb_size_value_minus1[HEVC_MAX_CPB_CNT];
40 uint32_t cpb_size_du_value_minus1[HEVC_MAX_CPB_CNT];
41 uint32_t bit_rate_du_value_minus1[HEVC_MAX_CPB_CNT];
42 uint32_t cbr_flag;
43 } HEVCSublayerHdrParams;
44
45 // flags in bitmask form
46 typedef struct HEVCHdrFlagParams {
47 uint8_t fixed_pic_rate_general_flag;
48 uint8_t fixed_pic_rate_within_cvs_flag;
49 uint8_t low_delay_hrd_flag;
50 } HEVCHdrFlagParams;
51
52 typedef struct HEVCHdrParams {
53 HEVCHdrFlagParams flags;
54 uint8_t nal_hrd_parameters_present_flag;
55 uint8_t vcl_hrd_parameters_present_flag;
56 uint8_t sub_pic_hrd_params_present_flag;
57 uint8_t sub_pic_cpb_params_in_pic_timing_sei_flag;
58
59 uint8_t tick_divisor_minus2;
60 uint8_t du_cpb_removal_delay_increment_length_minus1;
61 uint8_t dpb_output_delay_du_length_minus1;
62 uint8_t bit_rate_scale;
63 uint8_t cpb_size_scale;
64 uint8_t cpb_size_du_scale;
65 uint8_t initial_cpb_removal_delay_length_minus1;
66 uint8_t au_cpb_removal_delay_length_minus1;
67 uint8_t dpb_output_delay_length_minus1;
68 uint8_t cpb_cnt_minus1[HEVC_MAX_SUB_LAYERS];
69 uint16_t elemental_duration_in_tc_minus1[HEVC_MAX_SUB_LAYERS];
70
71 HEVCSublayerHdrParams nal_params[HEVC_MAX_SUB_LAYERS];
72 HEVCSublayerHdrParams vcl_params[HEVC_MAX_SUB_LAYERS];
73 } HEVCHdrParams;
74
75 typedef struct ShortTermRPS {
76 int32_t delta_poc[32];
77 uint32_t used;
78
79 uint8_t delta_idx;
80 uint8_t num_negative_pics;
81 uint8_t num_delta_pocs;
82 uint8_t rps_idx_num_delta_pocs;
83
84 uint16_t abs_delta_rps;
85 unsigned delta_rps_sign:1;
86
87 unsigned rps_predict:1;
88 unsigned use_delta:1;
89 } ShortTermRPS;
90
91 typedef struct HEVCWindow {
92 unsigned int left_offset;
93 unsigned int right_offset;
94 unsigned int top_offset;
95 unsigned int bottom_offset;
96 } HEVCWindow;
97
98 typedef struct VUI {
99 H2645VUI common;
100
101 int neutra_chroma_indication_flag;
102
103 int field_seq_flag;
104 int frame_field_info_present_flag;
105
106 int default_display_window_flag;
107 HEVCWindow def_disp_win;
108
109 int vui_timing_info_present_flag;
110 uint32_t vui_num_units_in_tick;
111 uint32_t vui_time_scale;
112 int vui_poc_proportional_to_timing_flag;
113 int vui_num_ticks_poc_diff_one_minus1;
114 int vui_hrd_parameters_present_flag;
115
116 int bitstream_restriction_flag;
117 int tiles_fixed_structure_flag;
118 int motion_vectors_over_pic_boundaries_flag;
119 int restricted_ref_pic_lists_flag;
120 int min_spatial_segmentation_idc;
121 int max_bytes_per_pic_denom;
122 int max_bits_per_min_cu_denom;
123 int log2_max_mv_length_horizontal;
124 int log2_max_mv_length_vertical;
125 } VUI;
126
127 typedef struct PTLCommon {
128 uint8_t profile_space;
129 uint8_t tier_flag;
130 uint8_t profile_idc;
131 uint8_t profile_compatibility_flag[32];
132 uint8_t progressive_source_flag;
133 uint8_t interlaced_source_flag;
134 uint8_t non_packed_constraint_flag;
135 uint8_t frame_only_constraint_flag;
136 uint8_t max_12bit_constraint_flag;
137 uint8_t max_10bit_constraint_flag;
138 uint8_t max_8bit_constraint_flag;
139 uint8_t max_422chroma_constraint_flag;
140 uint8_t max_420chroma_constraint_flag;
141 uint8_t max_monochrome_constraint_flag;
142 uint8_t intra_constraint_flag;
143 uint8_t one_picture_only_constraint_flag;
144 uint8_t lower_bit_rate_constraint_flag;
145 uint8_t max_14bit_constraint_flag;
146 uint8_t inbld_flag;
147 uint8_t level_idc;
148 } PTLCommon;
149
150 typedef struct PTL {
151 PTLCommon general_ptl;
152 PTLCommon sub_layer_ptl[HEVC_MAX_SUB_LAYERS];
153
154 uint8_t sub_layer_profile_present_flag[HEVC_MAX_SUB_LAYERS];
155 uint8_t sub_layer_level_present_flag[HEVC_MAX_SUB_LAYERS];
156 } PTL;
157
158 typedef struct RepFormat {
159 uint16_t pic_width_in_luma_samples;
160 uint16_t pic_height_in_luma_samples;
161 uint8_t chroma_format_idc;
162 uint8_t separate_colour_plane_flag;
163 uint8_t bit_depth_luma; ///< bit_depth_vps_luma_minus8 + 8
164 uint8_t bit_depth_chroma; ///< bit_depth_vps_chroma_minus8 + 8
165 HEVCWindow conf_win;
166 } RepFormat;
167
168 typedef struct HEVCVPS {
169 unsigned int vps_id;
170
171 uint8_t vps_temporal_id_nesting_flag;
172 int vps_max_layers;
173 int vps_max_sub_layers; ///< vps_max_temporal_layers_minus1 + 1
174
175 PTL ptl;
176 int vps_sub_layer_ordering_info_present_flag;
177 unsigned int vps_max_dec_pic_buffering[HEVC_MAX_SUB_LAYERS];
178 unsigned int vps_num_reorder_pics[HEVC_MAX_SUB_LAYERS];
179 unsigned int vps_max_latency_increase[HEVC_MAX_SUB_LAYERS];
180 int vps_max_layer_id;
181 int vps_num_layer_sets; ///< vps_num_layer_sets_minus1 + 1
182 uint8_t vps_timing_info_present_flag;
183 uint32_t vps_num_units_in_tick;
184 uint32_t vps_time_scale;
185 uint8_t vps_poc_proportional_to_timing_flag;
186 int vps_num_ticks_poc_diff_one; ///< vps_num_ticks_poc_diff_one_minus1 + 1
187 int vps_num_hrd_parameters;
188
189 HEVCHdrParams *hdr;
190
191 /* VPS extension */
192
193 /* Number of layers this VPS was parsed for, between 1 and
194 * min(HEVC_VPS_MAX_LAYERS, vps_max_layers).
195 *
196 * Note that vps_max_layers contains the layer count declared in the
197 * bitstream, while nb_layers contains the number of layers exported to
198 * users of this API (which may be smaller as we only support a subset of
199 * multilayer extensions).
200 *
201 * Arrays below documented as [layer_idx] have nb_layers valid entries.
202 */
203 int nb_layers;
204
205 uint16_t scalability_mask_flag;
206
207 // LayerIdxInVps[nuh_layer_id], i.e. a mapping of nuh_layer_id to VPS layer
208 // indices. Valid values are between 0 and HEVC_VPS_MAX_LAYERS. Entries for
209 // unmapped values of nuh_layer_id are set to -1.
210 int8_t layer_idx[HEVC_MAX_NUH_LAYER_ID + 1];
211
212 uint8_t layer_id_in_nuh[HEVC_VPS_MAX_LAYERS];
213
214 uint8_t default_ref_layers_active;
215 uint8_t max_one_active_ref_layer;
216 uint8_t poc_lsb_aligned;
217 // bitmask of poc_lsb_not_present[layer_idx]
218 uint8_t poc_lsb_not_present;
219
220 struct {
221 unsigned max_dec_pic_buffering; // max_vps_dec_pic_buffering_minus1 + 1
222 unsigned max_num_reorder_pics; // max_vps_num_reorder_pics
223 unsigned max_latency_increase; // max_vps_latency_increase_plus1 - 1
224 } dpb_size;
225
226 // ViewId[layer_idx]
227 uint16_t view_id[HEVC_VPS_MAX_LAYERS];
228
229 // NumOutputLayerSets
230 uint8_t num_output_layer_sets;
231 // Bitmasks specifying output layer sets. i-th bit set means layer with VPS
232 // index i is present in the layer set.
233 uint64_t ols[HEVC_VPS_MAX_LAYERS];
234
235 // NumDirectRefLayers[layer_idx]
236 uint8_t num_direct_ref_layers[HEVC_VPS_MAX_LAYERS];
237 uint8_t num_add_layer_sets;
238
239 RepFormat rep_format;
240
241 uint8_t *data;
242 int data_size;
243 } HEVCVPS;
244
245 typedef struct ScalingList {
246 /* This is a little wasteful, since sizeID 0 only needs 8 coeffs,
247 * and size ID 3 only has 2 arrays, not 6. */
248 uint8_t sl[4][6][64];
249 uint8_t sl_dc[2][6];
250 } ScalingList;
251
252 typedef struct HEVCSPS {
253 unsigned vps_id;
254 int chroma_format_idc;
255
256 HEVCWindow output_window;
257
258 HEVCWindow pic_conf_win;
259
260 HEVCHdrParams hdr;
261
262 int bit_depth;
263 int bit_depth_chroma;
264 int pixel_shift;
265 enum AVPixelFormat pix_fmt;
266
267 unsigned int log2_max_poc_lsb;
268
269 int max_sub_layers;
270 struct {
271 int max_dec_pic_buffering;
272 int num_reorder_pics;
273 int max_latency_increase;
274 } temporal_layer[HEVC_MAX_SUB_LAYERS];
275
276 int vui_present;
277 VUI vui;
278 PTL ptl;
279
280 ScalingList scaling_list;
281
282 unsigned int nb_st_rps;
283 ShortTermRPS st_rps[HEVC_MAX_SHORT_TERM_REF_PIC_SETS];
284
285 uint16_t lt_ref_pic_poc_lsb_sps[HEVC_MAX_LONG_TERM_REF_PICS];
286 uint32_t used_by_curr_pic_lt;
287 uint8_t num_long_term_ref_pics_sps;
288
289 struct {
290 uint8_t bit_depth;
291 uint8_t bit_depth_chroma;
292 unsigned int log2_min_pcm_cb_size;
293 unsigned int log2_max_pcm_cb_size;
294 } pcm;
295
296 unsigned int log2_min_cb_size;
297 unsigned int log2_diff_max_min_coding_block_size;
298 unsigned int log2_min_tb_size;
299 unsigned int log2_max_trafo_size;
300 unsigned int log2_ctb_size;
301 unsigned int log2_min_pu_size;
302 unsigned int log2_diff_max_min_transform_block_size;
303
304 int max_transform_hierarchy_depth_inter;
305 int max_transform_hierarchy_depth_intra;
306
307 uint8_t separate_colour_plane;
308 uint8_t conformance_window;
309 uint8_t pcm_enabled;
310 uint8_t pcm_loop_filter_disabled;
311 uint8_t sublayer_ordering_info;
312 uint8_t temporal_id_nesting;
313 uint8_t extension_present;
314 uint8_t scaling_list_enabled;
315 uint8_t amp_enabled;
316 uint8_t sao_enabled;
317 uint8_t long_term_ref_pics_present;
318 uint8_t temporal_mvp_enabled;
319 uint8_t strong_intra_smoothing_enabled;
320 uint8_t range_extension;
321 uint8_t transform_skip_rotation_enabled;
322 uint8_t transform_skip_context_enabled;
323 uint8_t implicit_rdpcm_enabled;
324 uint8_t explicit_rdpcm_enabled;
325 uint8_t extended_precision_processing;
326 uint8_t intra_smoothing_disabled;
327 uint8_t high_precision_offsets_enabled;
328 uint8_t persistent_rice_adaptation_enabled;
329 uint8_t cabac_bypass_alignment_enabled;
330
331 uint8_t multilayer_extension;
332 uint8_t sps_3d_extension;
333
334 uint8_t scc_extension;
335 uint8_t curr_pic_ref_enabled;
336 uint8_t palette_mode_enabled;
337 uint8_t palette_predictor_initializers_present;
338 uint8_t intra_boundary_filtering_disabled;
339
340 int palette_max_size;
341 int delta_palette_max_predictor_size;
342 int sps_num_palette_predictor_initializers;
343 int sps_palette_predictor_initializer[3][HEVC_MAX_PALETTE_PREDICTOR_SIZE];
344 int motion_vector_resolution_control_idc;
345
346 /// coded frame dimension in various units
347 int width;
348 int height;
349 int ctb_width;
350 int ctb_height;
351 int ctb_size;
352 int min_cb_width;
353 int min_cb_height;
354 int min_tb_width;
355 int min_tb_height;
356 int min_pu_width;
357 int min_pu_height;
358 int tb_mask;
359
360 int hshift[3];
361 int vshift[3];
362
363 int qp_bd_offset;
364
365 uint8_t *data;
366 int data_size;
367
368 const HEVCVPS *vps; ///< RefStruct reference
369 } HEVCSPS;
370
371 typedef struct HEVCPPS {
372 unsigned int pps_id;
373 unsigned int sps_id; ///< seq_parameter_set_id
374
375 uint8_t sign_data_hiding_flag;
376
377 uint8_t cabac_init_present_flag;
378
379 int num_ref_idx_l0_default_active; ///< num_ref_idx_l0_default_active_minus1 + 1
380 int num_ref_idx_l1_default_active; ///< num_ref_idx_l1_default_active_minus1 + 1
381 int pic_init_qp_minus26;
382
383 uint8_t constrained_intra_pred_flag;
384 uint8_t transform_skip_enabled_flag;
385
386 uint8_t cu_qp_delta_enabled_flag;
387 int diff_cu_qp_delta_depth;
388
389 int cb_qp_offset;
390 int cr_qp_offset;
391 uint8_t pic_slice_level_chroma_qp_offsets_present_flag;
392 uint8_t weighted_pred_flag;
393 uint8_t weighted_bipred_flag;
394 uint8_t output_flag_present_flag;
395 uint8_t transquant_bypass_enable_flag;
396
397 uint8_t dependent_slice_segments_enabled_flag;
398 uint8_t tiles_enabled_flag;
399 uint8_t entropy_coding_sync_enabled_flag;
400
401 uint16_t num_tile_columns; ///< num_tile_columns_minus1 + 1
402 uint16_t num_tile_rows; ///< num_tile_rows_minus1 + 1
403 uint8_t uniform_spacing_flag;
404 uint8_t loop_filter_across_tiles_enabled_flag;
405
406 uint8_t seq_loop_filter_across_slices_enabled_flag;
407
408 uint8_t deblocking_filter_control_present_flag;
409 uint8_t deblocking_filter_override_enabled_flag;
410 uint8_t disable_dbf;
411 int beta_offset; ///< beta_offset_div2 * 2
412 int tc_offset; ///< tc_offset_div2 * 2
413
414 uint8_t scaling_list_data_present_flag;
415 ScalingList scaling_list;
416
417 uint8_t lists_modification_present_flag;
418 int log2_parallel_merge_level; ///< log2_parallel_merge_level_minus2 + 2
419 int num_extra_slice_header_bits;
420 uint8_t slice_header_extension_present_flag;
421 uint8_t log2_max_transform_skip_block_size;
422 uint8_t pps_extension_present_flag;
423 uint8_t pps_range_extensions_flag;
424 uint8_t pps_multilayer_extension_flag;
425 uint8_t pps_3d_extension_flag;
426 uint8_t pps_scc_extension_flag;
427 uint8_t cross_component_prediction_enabled_flag;
428 uint8_t chroma_qp_offset_list_enabled_flag;
429 uint8_t diff_cu_chroma_qp_offset_depth;
430 uint8_t chroma_qp_offset_list_len_minus1;
431 int8_t cb_qp_offset_list[6];
432 int8_t cr_qp_offset_list[6];
433 uint8_t log2_sao_offset_scale_luma;
434 uint8_t log2_sao_offset_scale_chroma;
435
436 // Multilayer extension parameters
437 uint8_t poc_reset_info_present_flag;
438 uint8_t pps_infer_scaling_list_flag;
439 uint8_t pps_scaling_list_ref_layer_id;
440 uint8_t num_ref_loc_offsets;
441 uint8_t ref_loc_offset_layer_id[64];
442 uint8_t scaled_ref_layer_offset_present_flag[64];
443 int16_t scaled_ref_layer_left_offset[64];
444 int16_t scaled_ref_layer_top_offset[64];
445 int16_t scaled_ref_layer_right_offset[64];
446 int16_t scaled_ref_layer_bottom_offset[64];
447 uint8_t ref_region_offset_present_flag[64];
448 int16_t ref_region_left_offset[64];
449 int16_t ref_region_top_offset[64];
450 int16_t ref_region_right_offset[64];
451 int16_t ref_region_bottom_offset[64];
452 uint8_t resample_phase_set_present_flag[64];
453 uint8_t phase_hor_luma[64];
454 uint8_t phase_ver_luma[64];
455 int8_t phase_hor_chroma[64];
456 int8_t phase_ver_chroma[64];
457 uint8_t colour_mapping_enabled_flag;
458 uint8_t num_cm_ref_layers;
459 uint8_t cm_ref_layer_id[62];
460 uint8_t cm_octant_depth;
461 uint8_t cm_y_part_num_log2;
462 uint8_t luma_bit_depth_cm_input;
463 uint8_t chroma_bit_depth_cm_input;
464 uint8_t luma_bit_depth_cm_output;
465 uint8_t chroma_bit_depth_cm_output;
466 uint8_t cm_res_quant_bits;
467 uint8_t cm_delta_flc_bits;
468 int8_t cm_adapt_threshold_u_delta;
469 int8_t cm_adapt_threshold_v_delta;
470
471 // 3D extension parameters
472 uint8_t pps_bit_depth_for_depth_layers_minus8;
473
474 // SCC extension parameters
475 uint8_t pps_curr_pic_ref_enabled_flag;
476 uint8_t residual_adaptive_colour_transform_enabled_flag;
477 uint8_t pps_slice_act_qp_offsets_present_flag;
478 int8_t pps_act_y_qp_offset; // _plus5
479 int8_t pps_act_cb_qp_offset; // _plus5
480 int8_t pps_act_cr_qp_offset; // _plus3
481 uint8_t pps_palette_predictor_initializers_present_flag;
482 uint8_t pps_num_palette_predictor_initializers;
483 uint8_t monochrome_palette_flag;
484 uint8_t luma_bit_depth_entry;
485 uint8_t chroma_bit_depth_entry;
486 uint16_t pps_palette_predictor_initializer[3][HEVC_MAX_PALETTE_PREDICTOR_SIZE];
487
488 // Inferred parameters
489 unsigned int *column_width; ///< ColumnWidth
490 unsigned int *row_height; ///< RowHeight
491 unsigned int *col_bd; ///< ColBd
492 unsigned int *row_bd; ///< RowBd
493 int *col_idxX;
494
495 int *ctb_addr_rs_to_ts; ///< CtbAddrRSToTS
496 int *ctb_addr_ts_to_rs; ///< CtbAddrTSToRS
497 int *tile_id; ///< TileId
498 int *tile_pos_rs; ///< TilePosRS
499 int *min_tb_addr_zs; ///< MinTbAddrZS
500 int *min_tb_addr_zs_tab;///< MinTbAddrZS
501
502 uint8_t *data;
503 int data_size;
504
505 const HEVCSPS *sps; ///< RefStruct reference
506 } HEVCPPS;
507
508 typedef struct HEVCParamSets {
509 const HEVCVPS *vps_list[HEVC_MAX_VPS_COUNT]; ///< RefStruct references
510 const HEVCSPS *sps_list[HEVC_MAX_SPS_COUNT]; ///< RefStruct references
511 const HEVCPPS *pps_list[HEVC_MAX_PPS_COUNT]; ///< RefStruct references
512 } HEVCParamSets;
513
514 /**
515 * Parse the SPS from the bitstream into the provided HEVCSPS struct.
516 *
517 * @param sps_id the SPS id will be written here
518 * @param apply_defdispwin if set 1, the default display window from the VUI
519 * will be applied to the video dimensions
520 * @param vps_list if non-NULL, this function will validate that the SPS refers
521 * to an existing VPS
522 */
523 int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
524 unsigned nuh_layer_id, int apply_defdispwin,
525 const HEVCVPS * const *vps_list, AVCodecContext *avctx);
526
527 int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx,
528 HEVCParamSets *ps);
529 int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx,
530 HEVCParamSets *ps, unsigned nuh_layer_id,
531 int apply_defdispwin);
532 int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx,
533 HEVCParamSets *ps);
534
535 void ff_hevc_ps_uninit(HEVCParamSets *ps);
536
537 int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx,
538 ShortTermRPS *rps, const HEVCSPS *sps, int is_slice_header);
539
540 int ff_hevc_encode_nal_vps(HEVCVPS *vps, unsigned int id,
541 uint8_t *buf, int buf_size);
542
543 /**
544 * Compute POC of the current frame and return it.
545 */
546 int ff_hevc_compute_poc2(unsigned log2_max_poc_lsb, int pocTid0, int poc_lsb, int nal_unit_type);
547
548 32917 static inline int ff_hevc_compute_poc(const HEVCSPS *sps, int pocTid0, int poc_lsb, int nal_unit_type)
549 {
550 32917 return ff_hevc_compute_poc2(sps->log2_max_poc_lsb, pocTid0, poc_lsb, nal_unit_type);
551 }
552
553 #endif /* AVCODEC_HEVC_PS_H */
554