summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-h265.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-h265.c
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-h265.c')
-rw-r--r--epan/dissectors/packet-h265.c4779
1 files changed, 4779 insertions, 0 deletions
diff --git a/epan/dissectors/packet-h265.c b/epan/dissectors/packet-h265.c
new file mode 100644
index 00000000..eb71ca59
--- /dev/null
+++ b/epan/dissectors/packet-h265.c
@@ -0,0 +1,4779 @@
+/* packet-h265.c
+* Routines for H.265 dissection
+* Copyright 2018, Asaf Kave <kave.asaf[at]gmail.com>
+* Based on the H.264 dissector, thanks!
+*
+* Wireshark - Network traffic analyzer
+* By Gerald Combs <gerald@wireshark.org>
+* Copyright 1998 Gerald Combs
+*
+* SPDX-License-Identifier: GPL-2.0-or-later
+*
+* References:
+* https://tools.ietf.org/html/rfc7798
+* http://www.itu.int/rec/T-REC-H.265/en
+*/
+
+#include "config.h"
+
+
+#include <epan/packet.h>
+#include <epan/asn1.h>
+#include <epan/expert.h>
+#include <epan/prefs.h>
+#include "packet-h265.h"
+#include "math.h"
+
+void proto_register_h265(void);
+void proto_reg_handoff_h265(void);
+
+/* Initialize the protocol and registered fields */
+static int proto_h265 = -1;
+static int hf_h265_type = -1;
+static int hf_h265_nal_unit_type = -1;
+static int hf_h265_nuh_layer_id = -1;
+static int hf_h265_nuh_temporal_id_plus1 = -1;
+static int hf_h265_nal_f_bit = -1;
+static int hf_h265_start_bit = -1;
+static int hf_h265_end_bit = -1;
+static int hf_h265_rbsp_stop_bit = -1;
+static int hf_h265_rbsp_trailing_bits = -1;
+
+/* SDP */
+static int hf_h265_sdp_parameter_sprop_vps = -1;
+static int hf_h265_sdp_parameter_sprop_sps = -1;
+static int hf_h265_sdp_parameter_sprop_pps = -1;
+
+/*vps*/
+static int hf_h265_vps_video_parameter_set_id = -1;
+static int hf_h265_vps_base_layer_internal_flag = -1;
+static int hf_h265_vps_base_layer_available_flag = -1;
+static int hf_h265_vps_max_layers_minus1 = -1;
+static int hf_h265_vps_max_sub_layers_minus1 = -1;
+static int hf_h265_vps_temporal_id_nesting_flag = -1;
+static int hf_h265_vps_reserved_0xffff_16bits = -1;
+static int hf_h265_vps_sub_layer_ordering_info_present_flag = -1;
+static int hf_h265_vps_max_dec_pic_buffering_minus1/*[i]*/ = -1;
+static int hf_h265_vps_max_num_reorder_pics/*[i]*/ = -1;
+static int hf_h265_vps_max_latency_increase_plus1/*[i]*/ = -1;
+static int hf_h265_vps_max_layer_id = -1;
+static int hf_h265_vps_num_layer_sets_minus1 = -1;
+static int hf_h265_layer_id_included_flag/*[i][j]*/ = -1;
+static int hf_h265_vps_timing_info_present_flag = -1;
+static int hf_h265_vps_num_units_in_tick = -1;
+static int hf_h265_vps_time_scale = -1;
+static int hf_h265_vps_poc_proportional_to_timing_flag = -1;
+static int hf_h265_vps_num_ticks_poc_diff_one_minus1 = -1;
+static int hf_h265_vps_num_hrd_parameters = -1;
+static int hf_h265_hrd_layer_set_idx/*[i]*/ = -1;
+static int hf_h265_cprms_present_flag/*[i]*/ = -1;
+static int hf_h265_vps_extension_flag = -1;
+static int hf_h265_vps_extension_data_flag = -1;
+
+/* profile_tier_level */
+static int hf_h265_general_profile_space = -1;
+static int hf_h265_general_tier_flag = -1;
+static int hf_h265_general_profile_idc = -1;
+static int hf_h265_general_profile_compatibility_flags/*[j]*/ = -1;
+static int hf_h265_general_progressive_source_flag = -1;
+static int hf_h265_general_interlaced_source_flag = -1;
+static int hf_h265_general_non_packed_constraint_flag = -1;
+static int hf_h265_general_frame_only_constraint_flag = -1;
+static int hf_h265_general_max_12bit_constraint_flag = -1;
+static int hf_h265_general_max_10bit_constraint_flag = -1;
+static int hf_h265_general_max_8bit_constraint_flag = -1;
+static int hf_h265_general_max_422chroma_constraint_flag = -1;
+static int hf_h265_general_max_420chroma_constraint_flag = -1;
+static int hf_h265_general_max_monochrome_constraint_flag = -1;
+static int hf_h265_general_intra_constraint_flag = -1;
+static int hf_h265_general_one_picture_only_constraint_flag = -1;
+static int hf_h265_general_lower_bit_rate_constraint_flag = -1;
+static int hf_h265_general_max_14bit_constraint_flag = -1;
+static int hf_h265_general_reserved_zero_33bits = -1;
+static int hf_h265_general_reserved_zero_34bits = -1;
+static int hf_h265_general_reserved_zero_7bits = -1;
+static int hf_h265_general_reserved_zero_35bits = -1;
+static int hf_h265_general_reserved_zero_43bits = -1;
+static int hf_h265_general_inbld_flag = -1;
+static int hf_h265_general_reserved_zero_bit = -1;
+static int hf_h265_general_level_idc = -1;
+static int hf_h265_sub_layer_profile_present_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_level_present_flag/*[i]*/ = -1;
+static int hf_h265_reserved_zero_2bits/*[i]*/ = -1;
+static int hf_h265_sub_layer_profile_space/*[i]*/ = -1;
+static int hf_h265_sub_layer_tier_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_profile_idc/*[i]*/ = -1;
+static int hf_h265_sub_layer_profile_compatibility_flag/*[i][j]*/ = -1;
+static int hf_h265_sub_layer_progressive_source_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_interlaced_source_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_non_packed_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_frame_only_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_max_12bit_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_max_10bit_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_max_8bit_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_max_422chroma_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_max_420chroma_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_max_monochrome_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_intra_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_one_picture_only_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_lower_bit_rate_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_max_14bit_constraint_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_reserved_zero_33bits/*[i]*/ = -1;
+static int hf_h265_sub_layer_reserved_zero_34bits/*[i]*/ = -1;
+static int hf_h265_sub_layer_reserved_zero_7bits/*[i]*/ = -1;
+static int hf_h265_sub_layer_reserved_zero_35bits/*[i]*/ = -1;
+static int hf_h265_sub_layer_reserved_zero_43bits/*[i]*/ = -1;
+static int hf_h265_sub_layer_inbld_flag/*[i]*/ = -1;
+static int hf_h265_sub_layer_reserved_zero_bit/*[i]*/ = -1;
+static int hf_h265_sub_layer_level_idc/*[i]*/ = -1;
+
+/* hrd_parameters */
+static int hf_h265_nal_hrd_parameters_present_flag = -1;
+static int hf_h265_vcl_hrd_parameters_present_flag = -1;
+static int hf_h265_sub_pic_hrd_params_present_flag = -1;
+static int hf_h265_tick_divisor_minus2 = -1;
+static int hf_h265_du_cpb_removal_delay_increment_length_minus1 = -1;
+static int hf_h265_sub_pic_cpb_params_in_pic_timing_sei_flag = -1;
+static int hf_h265_dpb_output_delay_du_length_minus1 = -1;
+static int hf_h265_bit_rate_scale = -1;
+static int hf_h265_cpb_size_scale = -1;
+static int hf_h265_cpb_size_du_scale = -1;
+static int hf_h265_initial_cpb_removal_delay_length_minus1 = -1;
+static int hf_h265_au_cpb_removal_delay_length_minus1 = -1;
+static int hf_h265_dpb_output_delay_length_minus1 = -1;
+static int hf_h265_fixed_pic_rate_general_flag/*[i]*/ = -1;
+static int hf_h265_fixed_pic_rate_within_cvs_flag/*[i]*/ = -1;
+static int hf_h265_elemental_duration_in_tc_minus1/*[i]*/ = -1;
+static int hf_h265_low_delay_hrd_flag/*[i]*/ = -1;
+static int hf_h265_cpb_cnt_minus1/*[i]*/ = -1;
+/* sub-layer hrd_parameters */
+static int hf_h265_bit_rate_value_minus1/*[i]*/ = -1;
+static int hf_h265_cpb_size_value_minus1/*[i]*/ = -1;
+static int hf_h265_cpb_size_du_value_minus1/*[i]*/ = -1;
+static int hf_h265_bit_rate_du_value_minus1/*[i]*/ = -1;
+static int hf_h265_cbr_flag/*[i]*/ = -1;
+
+/*sps*/
+static int hf_h265_sps_video_parameter_set_id = -1;
+static int hf_h265_sps_max_sub_layers_minus1 = -1;
+static int hf_h265_sps_temporal_id_nesting_flag = -1;
+static int hf_h265_sps_seq_parameter_set_id = -1;
+static int hf_h265_chroma_format_idc = -1;
+static int hf_h265_separate_colour_plane_flag = -1;
+static int hf_h265_pic_width_in_luma_samples = -1;
+static int hf_h265_pic_height_in_luma_samples = -1;
+static int hf_h265_conformance_window_flag = -1;
+static int hf_h265_conf_win_left_offset = -1;
+static int hf_h265_conf_win_right_offset = -1;
+static int hf_h265_conf_win_top_offset = -1;
+static int hf_h265_conf_win_bottom_offset = -1;
+static int hf_h265_bit_depth_luma_minus8 = -1;
+static int hf_h265_bit_depth_chroma_minus8 = -1;
+static int hf_h265_log2_max_pic_order_cnt_lsb_minus4 = -1;
+static int hf_h265_sps_sub_layer_ordering_info_present_flag = -1;
+static int hf_h265_sps_max_dec_pic_buffering_minus1/*[i]*/ = -1;
+static int hf_h265_sps_max_num_reorder_pics/*[i]*/ = -1;
+static int hf_h265_sps_max_latency_increase_plus1/*[i]*/ = -1;
+static int hf_h265_log2_min_luma_coding_block_size_minus3 = -1;
+static int hf_h265_log2_diff_max_min_luma_coding_block_size = -1;
+static int hf_h265_log2_min_luma_transform_block_size_minus2 = -1;
+static int hf_h265_log2_diff_max_min_luma_transform_block_size = -1;
+static int hf_h265_max_transform_hierarchy_depth_inter = -1;
+static int hf_h265_max_transform_hierarchy_depth_intra = -1;
+static int hf_h265_scaling_list_enabled_flag = -1;
+static int hf_h265_sps_scaling_list_data_present_flag = -1;
+static int hf_h265_amp_enabled_flag = -1;
+static int hf_h265_sample_adaptive_offset_enabled_flag = -1;
+static int hf_h265_pcm_enabled_flag = -1;
+static int hf_h265_pcm_sample_bit_depth_luma_minus1 = -1;
+static int hf_h265_pcm_sample_bit_depth_chroma_minus1 = -1;
+static int hf_h265_log2_min_pcm_luma_coding_block_size_minus3 = -1;
+static int hf_h265_log2_diff_max_min_pcm_luma_coding_block_size = -1;
+static int hf_h265_pcm_loop_filter_disabled_flag = -1;
+static int hf_h265_num_short_term_ref_pic_sets = -1;
+static int hf_h265_long_term_ref_pics_present_flag = -1;
+static int hf_h265_num_long_term_ref_pics_sps = -1;
+static int hf_h265_lt_ref_pic_poc_lsb_sps/*[i]*/ = -1;
+static int hf_h265_used_by_curr_pic_lt_sps_flag/*[i]*/ = -1;
+static int hf_h265_sps_temporal_mvp_enabled_flag = -1;
+static int hf_h265_strong_intra_smoothing_enabled_flag = -1;
+static int hf_h265_vui_parameters_present_flag = -1;
+static int hf_h265_sps_extension_present_flag = -1;
+static int hf_h265_sps_range_extension_flag = -1;
+static int hf_h265_sps_multilayer_extension_flag = -1;
+static int hf_h265_sps_3d_extension_flag = -1;
+static int hf_h265_sps_scc_extension_flag = -1;
+static int hf_h265_sps_extension_4bits = -1;
+static int hf_h265_sps_extension_data_flag = -1;
+/* scaling_list_data */
+static int hf_h265_scaling_list_pred_mode_flag/*[sizeId][matrixId]*/ = -1;
+static int hf_h265_scaling_list_pred_matrix_id_delta/*[sizeId][matrixId]*/ = -1;
+static int hf_h265_scaling_list_dc_coef_minus8/*[sizeId - 2][matrixId]*/ = -1;
+static int hf_h265_scaling_list_delta_coef = -1;
+/* st_ref_pic_set */
+static int hf_h265_inter_ref_pic_set_prediction_flag = -1;
+static int hf_h265_delta_idx_minus1 = -1;
+static int hf_h265_delta_rps_sign = -1;
+static int hf_h265_abs_delta_rps_minus1 = -1;
+static int hf_h265_used_by_curr_pic_flag/*[j]*/ = -1;
+static int hf_h265_use_delta_flag/*[j]*/ = -1;
+static int hf_h265_num_negative_pics = -1;
+static int hf_h265_num_positive_pics = -1;
+static int hf_h265_delta_poc_s0_minus1/*[i]*/ = -1;
+static int hf_h265_used_by_curr_pic_s0_flag/*[i]*/ = -1;
+static int hf_h265_delta_poc_s1_minus1/*[i]*/ = -1;
+static int hf_h265_used_by_curr_pic_s1_flag/*[i]*/ = -1;
+/* sps_range_extension */
+static int hf_h265_transform_skip_rotation_enabled_flag = -1;
+static int hf_h265_transform_skip_context_enabled_flag = -1;
+static int hf_h265_implicit_rdpcm_enabled_flag = -1;
+static int hf_h265_explicit_rdpcm_enabled_flag = -1;
+static int hf_h265_extended_precision_processing_flag = -1;
+static int hf_h265_intra_smoothing_disabled_flag = -1;
+static int hf_h265_high_precision_offsets_enabled_flag = -1;
+static int hf_h265_persistent_rice_adaptation_enabled_flag = -1;
+static int hf_h265_cabac_bypass_alignment_enabled_flag = -1;
+/* sps_scc_extension */
+static int hf_h265_sps_curr_pic_ref_enabled_flag = -1;
+static int hf_h265_palette_mode_enabled_flag = -1;
+static int hf_h265_palette_max_size = -1;
+static int hf_h265_delta_palette_max_predictor_size = -1;
+static int hf_h265_sps_palette_predictor_initializers_present_flag = -1;
+static int hf_h265_sps_num_palette_predictor_initializers_minus1 = -1;
+static int hf_h265_sps_palette_predictor_initializer/*[comp][i]*/ = -1;
+static int hf_h265_motion_vector_resolution_control_idc = -1;
+static int hf_h265_intra_boundary_filtering_disabled_flag = -1;
+
+/* PPS */
+static int hf_h265_pps_pic_parameter_set_id = -1;
+static int hf_h265_pps_seq_parameter_set_id = -1;
+static int hf_h265_dependent_slice_segments_enabled_flag = -1;
+static int hf_h265_output_flag_present_flag = -1;
+static int hf_h265_num_extra_slice_header_bits = -1;
+static int hf_h265_sign_data_hiding_enabled_flag = -1;
+static int hf_h265_cabac_init_present_flag = -1;
+static int hf_h265_num_ref_idx_l0_default_active_minus1 = -1;
+static int hf_h265_num_ref_idx_l1_default_active_minus1 = -1;
+static int hf_h265_init_qp_minus26 = -1;
+static int hf_h265_constrained_intra_pred_flag = -1;
+static int hf_h265_transform_skip_enabled_flag = -1;
+static int hf_h265_cu_qp_delta_enabled_flag = -1;
+static int hf_h265_diff_cu_qp_delta_depth = -1;
+static int hf_h265_pps_cb_qp_offset = -1;
+static int hf_h265_pps_cr_qp_offset = -1;
+static int hf_h265_pps_slice_chroma_qp_offsets_present_flag = -1;
+static int hf_h265_weighted_pred_flag = -1;
+static int hf_h265_weighted_bipred_flag = -1;
+static int hf_h265_transquant_bypass_enabled_flag = -1;
+static int hf_h265_tiles_enabled_flag = -1;
+static int hf_h265_entropy_coding_sync_enabled_flag = -1;
+static int hf_h265_num_tile_columns_minus1 = -1;
+static int hf_h265_num_tile_rows_minus1 = -1;
+static int hf_h265_uniform_spacing_flag = -1;
+static int hf_h265_column_width_minus1/*[i]*/ = -1;
+static int hf_h265_row_height_minus1/*[i]*/ = -1;
+static int hf_h265_loop_filter_across_tiles_enabled_flag = -1;
+static int hf_h265_pps_loop_filter_across_slices_enabled_flag = -1;
+static int hf_h265_deblocking_filter_control_present_flag = -1;
+static int hf_h265_deblocking_filter_override_enabled_flag = -1;
+static int hf_h265_pps_deblocking_filter_disabled_flag = -1;
+static int hf_h265_pps_beta_offset_div2 = -1;
+static int hf_h265_pps_tc_offset_div2 = -1;
+static int hf_h265_pps_scaling_list_data_present_flag = -1;
+static int hf_h265_lists_modification_present_flag = -1;
+static int hf_h265_log2_parallel_merge_level_minus2 = -1;
+static int hf_h265_slice_segment_header_extension_present_flag = -1;
+static int hf_h265_pps_extension_present_flag = -1;
+static int hf_h265_pps_range_extension_flag = -1;
+static int hf_h265_pps_multilayer_extension_flag = -1;
+static int hf_h265_pps_3d_extension_flag = -1;
+static int hf_h265_pps_scc_extension_flag = -1;
+static int hf_h265_pps_extension_4bits = -1;
+static int hf_h265_pps_extension_data_flag = -1;
+/*pps_range_extension*/
+static int hf_h265_log2_max_transform_skip_block_size_minus2 = -1;
+static int hf_h265_cross_component_prediction_enabled_flag = -1;
+static int hf_h265_chroma_qp_offset_list_enabled_flag = -1;
+static int hf_h265_diff_cu_chroma_qp_offset_depth = -1;
+static int hf_h265_chroma_qp_offset_list_len_minus1 = -1;
+static int hf_h265_cb_qp_offset_list/*[i]*/ = -1;
+static int hf_h265_cr_qp_offset_list/*[i]*/ = -1;
+static int hf_h265_log2_sao_offset_scale_luma = -1;
+static int hf_h265_log2_sao_offset_scale_chroma = -1;
+/*pps_scc_extension*/
+static int hf_h265_pps_curr_pic_ref_enabled_flag = -1;
+static int hf_h265_residual_adaptive_colour_transform_enabled_flag = -1;
+static int hf_h265_pps_slice_act_qp_offsets_present_flag = -1;
+static int hf_h265_pps_act_y_qp_offset_plus5 = -1;
+static int hf_h265_pps_act_cb_qp_offset_plus5 = -1;
+static int hf_h265_pps_act_cr_qp_offset_plus3 = -1;
+static int hf_h265_pps_palette_predictor_initializers_present_flag = -1;
+static int hf_h265_pps_num_palette_predictor_initializers = -1;
+static int hf_h265_monochrome_palette_flag = -1;
+static int hf_h265_luma_bit_depth_entry_minus8 = -1;
+static int hf_h265_chroma_bit_depth_entry_minus8 = -1;
+static int hf_h265_pps_palette_predictor_initializer/*[comp][i]*/ = -1;
+
+/* VUI parameters */
+static int hf_h265_aspect_ratio_info_present_flag = -1;
+static int hf_h265_aspect_ratio_idc = -1;
+static int hf_h265_sar_width = -1;
+static int hf_h265_sar_height = -1;
+static int hf_h265_overscan_info_present_flag = -1;
+static int hf_h265_overscan_appropriate_flag = -1;
+static int hf_h265_video_signal_type_present_flag = -1;
+static int hf_h265_video_format = -1;
+static int hf_h265_video_full_range_flag = -1;
+static int hf_h265_colour_description_present_flag = -1;
+static int hf_h265_colour_primaries = -1;
+static int hf_h265_transfer_characteristics = -1;
+static int hf_h265_matrix_coeffs = -1;
+static int hf_h265_chroma_loc_info_present_flag = -1;
+static int hf_h265_chroma_sample_loc_type_top_field = -1;
+static int hf_h265_chroma_sample_loc_type_bottom_field = -1;
+static int hf_h265_neutral_chroma_indication_flag = -1;
+static int hf_h265_field_seq_flag = -1;
+static int hf_h265_frame_field_info_present_flag = -1;
+static int hf_h265_default_display_window_flag = -1;
+static int hf_h265_def_disp_win_left_offset = -1;
+static int hf_h265_def_disp_win_right_offset = -1;
+static int hf_h265_def_disp_win_top_offset = -1;
+static int hf_h265_def_disp_win_bottom_offset = -1;
+static int hf_h265_vui_timing_info_present_flag = -1;
+static int hf_h265_vui_num_units_in_tick = -1;
+static int hf_h265_vui_time_scale = -1;
+static int hf_h265_vui_poc_proportional_to_timing_flag = -1;
+static int hf_h265_vui_num_ticks_poc_diff_one_minus1 = -1;
+static int hf_h265_vui_hrd_parameters_present_flag = -1;
+static int hf_h265_bitstream_restriction_flag = -1;
+static int hf_h265_tiles_fixed_structure_flag = -1;
+static int hf_h265_motion_vectors_over_pic_boundaries_flag = -1;
+static int hf_h265_restricted_ref_pic_lists_flag = -1;
+static int hf_h265_min_spatial_segmentation_idc = -1;
+static int hf_h265_max_bytes_per_pic_denom = -1;
+static int hf_h265_max_bits_per_min_cu_denom = -1;
+static int hf_h265_log2_max_mv_length_horizontal = -1;
+static int hf_h265_log2_max_mv_length_vertical = -1;
+
+/* slice_segment_header */
+static int hf_h265_slice_pic_parameter_set_id = -1;
+static int hf_h265_slice_segment_address = -1;
+static int hf_h265_slice_type = -1;
+
+/* SEI */
+static int hf_h265_payloadsize = -1;
+static int hf_h265_payloadtype = -1;
+
+/* access unit delimiter */
+static int hf_h265_pic_type = -1;
+
+/* Initialize the subtree pointers */
+static int ett_h265 = -1;
+static int ett_h265_profile = -1;
+static int ett_h265_nal = -1;
+static int ett_h265_fu = -1;
+static int ett_h265_stream = -1;
+
+static int ett_h265_sps_multilayer_extension = -1;
+static int ett_h265_sps_3d_extension = -1;
+static int ett_h265_pps_multilayer_extension = -1;
+static int ett_h265_pps_3d_extension = -1;
+static int ett_h265_access_unit_delimiter_rbsp = -1;
+static int ett_h265_sei_rbsp = -1;
+static int ett_h265_filler_data_rbsp = -1;
+static int ett_h265_end_of_seq_rbsp = -1;
+static int ett_h265_end_of_bitstream_rbsp = -1;
+static int ett_h265_profile_tier_level = -1;
+static int ett_h265_ref_pic_set = -1;
+static int ett_h265_vui_parameters = -1;
+static int ett_h265_hrd_parameters = -1;
+static int ett_h265_sprop_parameters = -1;
+
+static expert_field ei_h265_undecoded = EI_INIT;
+static expert_field ei_h265_format_specific_parameter = EI_INIT;
+static expert_field ei_h265_oversized_exp_golomb_code = EI_INIT;
+static expert_field ei_h265_value_to_large = EI_INIT;
+
+static dissector_handle_t h265_handle;
+
+static gboolean dependent_slice_segments_enabled_flag = 0;
+static guint num_extra_slice_header_bits = 0;
+static guint log2_min_luma_coding_block_size_minus3 = 0;
+static guint log2_diff_max_min_luma_coding_block_size = 0;
+static guint pic_width_in_luma_samples = 0;
+static guint pic_height_in_luma_samples = 0;
+
+/* syntax tables in subclause 7.3 is equal to
+* ue(v), me(v), se(v), or te(v).
+*/
+typedef enum {
+ H265_UE_V = 0,
+ H265_ME_V = 1,
+ H265_SE_V = 2,
+ H265_TE_V = 3
+} h265_golomb_descriptors;
+
+
+static const true_false_string h265_f_bit_vals = {
+ "Bit errors or other syntax violations",
+ "No bit errors or other syntax violations"
+};
+
+static const true_false_string h265_start_bit_vals = {
+ "the first packet of FU-A picture",
+ "Not the first packet of FU-A picture"
+};
+
+static const true_false_string h265_end_bit_vals = {
+ "the last packet of FU-A picture",
+ "Not the last packet of FU-A picture"
+};
+
+static const value_string h265_type_values[] = {
+ { 0, "TRAIL_N - Coded slice segment of a non-TSA, non-STSA trailing picture" },
+ { 1, "TRAIL_R - Coded slice segment of a non-TSA, non-STSA trailing picture" },
+ { 2, "TSA_N - Coded slice segment of a TSA picture" },
+ { 3, "TSA_R - Coded slice segment of a TSA picture" },
+ { 4, "STSA_N - Coded slice segment of an STSA picture" },
+ { 5, "STSA_R - Coded slice segment of an STSA picture" },
+ { 6, "RADL_N - Coded slice segment of a RADL picture" },
+ { 7, "RADL_R - Coded slice segment of a RADL picture" },
+ { 8, "RASL_N - Coded slice segment of a RASL picture" },
+ { 9, "RASL_R - Coded slice segment of a RASL picture" },
+ { 10, "RSV_VCL_N10 - Reserved non-IRAP SLNR VCL NAL unit types" },
+ { 11, "RSV_VCL_R11 - Reserved non-IRAP sub-layer reference VCL NAL unit types" },
+ { 12, "RSV_VCL_N12 - Reserved non-IRAP SLNR VCL NAL unit types" },
+ { 13, "RSV_VCL_R13 - Reserved non-IRAP sub-layer reference VCL NAL unit types" },
+ { 14, "RSV_VCL_N14 - Reserved non-IRAP SLNR VCL NAL unit types" },
+ { 15, "RSV_VCL_R15 - Reserved non-IRAP sub-layer reference VCL NAL unit types" },
+ { 16, "BLA_W_LP - Coded slice segment of a BLA picture" },
+ { 17, "BLA_W_RADL - Coded slice segment of a BLA picture" },
+ { 18, "BLA_N_LP - Coded slice segment of a BLA picture" },
+ { 19, "IDR_W_RADL - Coded slice segment of an IDR picture" },
+ { 20, "IDR_N_LP - Coded slice segment of an IDR picture" },
+ { 21, "CRA_NUT - Coded slice segment of a CRA picture" },
+ { 22, "RSV_IRAP_VCL22 - Reserved IRAP VCL NAL unit types" },
+ { 23, "RSV_IRAP_VCL23 - Reserved IRAP VCL NAL unit types" },
+ { 24, "RSV_VCL24 - Reserved non-IRAP VCL NAL unit types" },
+ { 25, "RSV_VCL25 - Reserved non-IRAP VCL NAL unit types" },
+ { 26, "RSV_VCL26 - Reserved non-IRAP VCL NAL unit types" },
+ { 27, "RSV_VCL27 - Reserved non-IRAP VCL NAL unit types" },
+ { 28, "RSV_VCL28 - Reserved non-IRAP VCL NAL unit types" },
+ { 29, "RSV_VCL29 - Reserved non-IRAP VCL NAL unit types" },
+ { 30, "RSV_VCL30 - Reserved non-IRAP VCL NAL unit types" },
+ { 31, "RSV_VCL31 - Reserved non-IRAP VCL NAL unit types" },
+ { 32, "VPS_NUT - Video parameter set" },
+ { 33, "SPS_NUT - Sequence parameter set" },
+ { 34, "PPS_NUT - Picture parameter set" },
+ { 35, "AUD_NUT - Access unit delimiter" },
+ { 36, "EOS_NUT - End of sequence" },
+ { 37, "EOB_NUT - End of bitstream" },
+ { 38, "FD_NUT - Filler data" },
+ { 39, "PREFIX_SEI_NUT - Supplemental enhancement information" },
+ { 40, "SUFFIX_SEI_NUT - Supplemental enhancement information" },
+ { 41, "RSV_NVCL41 - Reserved" },
+ { 42, "RSV_NVCL42 - Reserved" },
+ { 43, "RSV_NVCL43 - Reserved" },
+ { 44, "RSV_NVCL44 - Reserved" },
+ { 45, "RSV_NVCL45 - Reserved" },
+ { 46, "RSV_NVCL46 - Reserved" },
+ { 47, "RSV_NVCL47 - Reserved" },
+ { 48, "APS - Aggregation Packets" },
+ { 49, "FU - Fragmentation Units" },
+ { 50, "PACI - PACI Packets" },
+ { 51, "UNSPEC51 - Unspecified" },
+ { 52, "UNSPEC52 - Unspecified" },
+ { 53, "UNSPEC53 - Unspecified" },
+ { 54, "UNSPEC54 - Unspecified" },
+ { 55, "UNSPEC55 - Unspecified" },
+ { 56, "UNSPEC56 - Unspecified" },
+ { 57, "UNSPEC57 - Unspecified" },
+ { 58, "UNSPEC58 - Unspecified" },
+ { 59, "UNSPEC59 - Unspecified" },
+ { 60, "UNSPEC60 - Unspecified" },
+ { 61, "UNSPEC61 - Unspecified" },
+ { 62, "UNSPEC62 - Unspecified" },
+ { 63, "UNSPEC63 - Unspecified" },
+ { 0, NULL }
+};
+
+static const value_string h265_type_summary_values[] = {
+ { 0, "TRAIL_N" },
+ { 1, "TRAIL_R" },
+ { 2, "TSA_N" },
+ { 3, "TSA_R" },
+ { 4, "STSA_N" },
+ { 5, "STSA_R" },
+ { 6, "RADL_N" },
+ { 7, "RADL_R" },
+ { 8, "RASL_N" },
+ { 9, "RASL_R" },
+ { 10, "RSV_VCL_N10" },
+ { 11, "RSV_VCL_R11" },
+ { 12, "RSV_VCL_N12" },
+ { 13, "RSV_VCL_R13" },
+ { 14, "RSV_VCL_N14" },
+ { 15, "RSV_VCL_R15" },
+ { 16, "BLA_W_LP" },
+ { 17, "BLA_W_RADL" },
+ { 18, "BLA_N_LP" },
+ { 19, "IDR_W_RADL" },
+ { 20, "IDR_N_LP" },
+ { 21, "CRA_NUT" },
+ { 22, "RSV_IRAP_VCL22" },
+ { 23, "RSV_IRAP_VCL23" },
+ { 24, "RSV_VCL24" },
+ { 25, "RSV_VCL25" },
+ { 26, "RSV_VCL26" },
+ { 27, "RSV_VCL27" },
+ { 28, "RSV_VCL28" },
+ { 29, "RSV_VCL29" },
+ { 30, "RSV_VCL30" },
+ { 31, "RSV_VCL31" },
+ { 32, "VPS_NUT" },
+ { 33, "SPS_NUT" },
+ { 34, "PPS_NUT" },
+ { 35, "AUD_NUT" },
+ { 36, "EOS_NUT" },
+ { 37, "EOB_NUT" },
+ { 38, "FD_NUT" },
+ { 39, "PREFIX_SEI_NUT" },
+ { 40, "SUFFIX_SEI_NUT" },
+ { 41, "RSV_NVCL41" },
+ { 42, "RSV_NVCL42" },
+ { 43, "RSV_NVCL43" },
+ { 44, "RSV_NVCL44" },
+ { 45, "RSV_NVCL45" },
+ { 46, "RSV_NVCL46" },
+ { 47, "RSV_NVCL47" },
+ { 48, "APS" },
+ { 49, "FU" },
+ { 50, "PACI" },
+ { 51, "UNSPEC51" },
+ { 52, "UNSPEC52" },
+ { 53, "UNSPEC53" },
+ { 54, "UNSPEC54" },
+ { 55, "UNSPEC55" },
+ { 56, "UNSPEC56" },
+ { 57, "UNSPEC57" },
+ { 58, "UNSPEC58" },
+ { 59, "UNSPEC59" },
+ { 60, "UNSPEC60" },
+ { 61, "UNSPEC61" },
+ { 62, "UNSPEC62" },
+ { 63, "UNSPEC63" },
+ { 0, NULL }
+};
+
+/* A.3 Profiles */
+static const value_string h265_profile_idc_values[] = {
+ { 1, "Main profile" },
+ { 2, "Main 10 and Main 10 Still Picture profiles" },
+ { 3, "Main Still Picture profile" },
+ { 4, "Format range extensions profiles" },
+ { 5, "High throughput profiles" },
+ { 9, "Screen content coding extensions profiles" },
+ { 0, NULL }
+};
+
+/* Table A.7-Tier and level limits for the video profiles */
+/* XXX - this looks as if the values are 10 times the level value
+ * in Table A.7. */
+static const value_string h265_level_main_tier_bitrate_values[] = {
+ { 10, "128 kb/s" },
+ { 20, "1.5 Mb/s" },
+ { 21, "3 Mb/s" },
+ { 30, "6 Mb/s" },
+ { 31, "10 Mb/s" },
+ { 40, "12 Mb/s" },
+ { 41, "20 Mb/s" },
+ { 50, "25 Mb/s" },
+ { 51, "40 Mb/s" },
+ { 52, "60 Mb/s" },
+ { 60, "60 Mb/s" },
+ { 61, "120 Mb/s" },
+ { 62, "240 Mb/s" },
+ { 0, NULL }
+};
+/*High tier*/
+static const value_string h265_level_high_tier_bitrate_values[] = {
+ { 40, "30 Mb/s" },
+ { 41, "50 Mb/s" },
+ { 50, "100 Mb/s" },
+ { 51, "160 Mb/s" },
+ { 52, "240 Mb/s" },
+ { 60, "240 Mb/s" },
+ { 61, "480 Mb/s" },
+ { 62, "800 Mb/s" },
+ { 0, NULL }
+};
+
+/* Table 7-7 - Name association to slice_type */
+static const value_string h265_slice_type_vals[] = {
+ { 0, "B (B slice)" },
+ { 1, "P (P slice)" },
+ { 2, "I (I slice)" },
+ { 0, NULL }
+};
+
+/* D.2 SEI payload syntax */
+static const value_string h265_sei_payload_vals[] = {
+ { 0, "buffering_period" },
+ { 1, "pic_timing" },
+ { 2, "pan_scan_rect" },
+ { 3, "filler_payload" },
+ { 4, "user_data_registered_itu_t_t35" },
+ { 5, "user_data_unregistered" },
+ { 6, "recovery_point" },
+ { 9, "scene_info" },
+ { 15, "picture_snapshot" },
+ { 16, "progressive_refinement_segment_start" },
+ { 17, "progressive_refinement_segment_end" },
+ { 19, "film_grain_characteristics" },
+ { 23, "tone_mapping_info" },
+ { 45, "frame_packing_arrangement" },
+ { 47, "display_orientation" },
+ { 56, "green_metadata" }, /* specified in ISO/IEC 23001-11 */
+ { 128, "structure_of_pictures_info" },
+ { 129, "active_parameter_sets" },
+ { 130, "decoding_unit_info" },
+ { 131, "temporal_sub_layer_zero_idx" },
+ { 133, "scalable_nesting" },
+ { 134, "region_refresh_info" },
+ { 135, "no_display" },
+ { 136, "time_code" },
+ { 137, "mastering_display_colour_volume" },
+ { 138, "segmented_rect_frame_packing_arrangement" },
+ { 139, "temporal_motion_constrained_tile_sets" },
+ { 140, "chroma_resampling_filter_hint" },
+ { 141, "knee_function_info" },
+ { 142, "colour_remapping_info" },
+ { 143, "deinterlaced_field_identification" },
+ { 144, "content_light_level_info" },
+ { 145, "dependent_rap_indication" },
+ { 146, "coded_region_completion" },
+ { 147, "alternative_transfer_characteristics" },
+ { 148, "ambient_viewing_environment" },
+ { 149, "content_colour_volume" },
+ { 150, "equirectangular_projection" },
+ { 151, "cubemap_projection" },
+ { 154, "sphere_rotation" },
+ { 155, "regionwise_packing" },
+ { 156, "omni_viewport" },
+ { 157, "regional_nesting" },
+ { 158, "mcts_extraction_info_sets" },
+ { 159, "mcts_extraction_info_nesting" },
+ { 160, "layers_not_present" }, /* specified in Annex F */
+ { 161, "inter_layer_constrained_tile_sets" }, /* specified in Annex F */
+ { 162, "bsp_nesting" }, /* specified in Annex F */
+ { 163, "bsp_initial_arrival_time" }, /* specified in Annex F */
+ { 164, "sub_bitstream_property" }, /* specified in Annex F */
+ { 165, "alpha_channel_info" }, /* specified in Annex F */
+ { 166, "overlay_info" }, /* specified in Annex F */
+ { 167, "temporal_mv_prediction_constraints" }, /* specified in Annex F */
+ { 168, "frame_field_info" }, /* specified in Annex F */
+ { 176, "three_dimensional_reference_displays_info" }, /* specified in Annex G */
+ { 177, "depth_representation_info" }, /* specified in Annex G */
+ { 178, "multiview_scene_info" }, /* specified in Annex G */
+ { 179, "multiview_acquisition_info" }, /* specified in Annex G */
+ { 180, "multiview_view_position" }, /* specified in Annex G */
+ { 181, "alternative_depth_info" }, /* specified in Annex I */
+ { 0, NULL }
+};
+
+/* Table 7-2 - Interpretation of pic_type */
+static const value_string h265_pic_type_vals[] = {
+ { 0, "I" },
+ { 1, "P, I" },
+ { 2, "B, P, I" },
+ { 0, NULL }
+};
+
+/* Ref 7.3.2.2 Sequence parameter set RBSP syntax
+ * num_short_term_ref_pic_sets specifies the number of st_ref_pic_set( ) syntax structures included in the SPS. The value
+ * of num_short_term_ref_pic_sets shall be in the range of 0 to 64, inclusive
+ */
+#define H265_MAX_NUM_SHORT_TERM_REF_PIC_SETS 64
+
+static int
+dissect_h265(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_);
+static int
+dissect_h265_profile_tier_level(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint offset, gboolean profilePresentFlag, gint vps_max_sub_layers_minus1);
+static int
+dissect_h265_hrd_parameters(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint bit_offset, gboolean commonInfPresentFlag, guint maxNumSubLayersMinus1);
+static int
+dissect_h265_scaling_list_data(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset);
+static int
+dissect_h265_st_ref_pic_set(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset, gint stRpsIdx, gint num_short_term_ref_pic_sets, gint32 NumDeltaPocs[H265_MAX_NUM_SHORT_TERM_REF_PIC_SETS]);
+static int
+dissect_h265_vui_parameters(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint bit_offset, guint8 sps_max_sub_layers_minus1);
+static int
+dissect_h265_sps_range_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset);
+static int
+dissect_h265_sps_multilayer_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset);
+static int
+dissect_h265_sps_3d_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset);
+static int
+dissect_h265_sps_scc_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset, guint chroma_format_idc, guint bit_depth_luma_minus8, guint bit_depth_chroma_minus8);
+static int
+dissect_h265_pps_range_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset, guint transform_skip_enabled_flag);
+static int
+dissect_h265_pps_scc_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset);
+static int
+dissect_h265_pps_multilayer_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset);
+static int
+dissect_h265_pps_3d_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset);
+static int
+dissect_h265_sei_message(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset, guint8 nal_unit_type);
+
+#if 0
+/* byte_aligned( ) is specified as follows.
+* - If the current position in the bitstream is on a byte boundary, i.e.,
+* the next bit in the bitstream is the first bit in a byte,
+* the return value of byte_aligned( ) is equal to TRUE.
+* - Otherwise, the return value of byte_aligned( ) is equal to FALSE.
+*/
+static gboolean
+h265_byte_aligned(gint bit_offset)
+{
+ if (bit_offset & 0x3)
+ return FALSE;
+
+ return TRUE;
+}
+
+/* more_data_in_payload( ) is specified as follows:
+* - If byte_aligned( ) is equal to TRUE and the current position in the sei_payload( ) syntax structure is
+* 8 * payloadSize bits from the beginning of the sei_payload( ) syntax structure, the return value of
+* more_data_in_payload( ) is equal to FALSE.
+* - Otherwise, the return value of more_data_in_payload( ) is equal to TRUE.
+*/
+static gboolean
+h265_more_data_in_payload(gint bit_start, gint bit_offset, gint payloadSize)
+{
+ if (h265_byte_aligned(bit_offset) && bit_start + 8 * payloadSize == bit_offset)
+ return FALSE;
+
+ return TRUE;
+}
+
+/* payload_extension_present( ) is specified as follows:
+* - If the current position in the sei_payload( ) syntax structure is not the position of the last (least significant, right-
+* most) bit that is equal to 1 that is less than 8 * payloadSize bits from the beginning of the syntax structure (i.e.,
+* the position of the payload_bit_equal_to_one syntax element), the return value of payload_extension_present( ) is equal to TRUE.
+* - Otherwise, the return value of payload_extension_present( )
+* is equal to FALSE.
+*/
+static gboolean
+h265_payload_extension_present(tvbuff_t* tvb, gint bit_start, gint bit_offset, gint payloadSize)
+{
+ if (bit_start + 8 * payloadSize > bit_offset && tvb_get_bits8(tvb, bit_offset, 1))
+ return TRUE;
+
+ return FALSE;
+}
+#endif
+
+/* Expect a tvb and a bit offset into the tvb
+* returns the value and bit_offset
+*
+* This supports 32 bit output values. If the exp-Golomb coded value overflows
+* the 32 bit type, it will return the actual bit offset but clamp the value
+* and add an expert info.
+*/
+#define cVALS(x) (const value_string*)(x)
+
+static guint32
+dissect_h265_exp_golomb_code(proto_tree *tree, int hf_index, tvbuff_t *tvb, packet_info *pinfo, gint *start_bit_offset, h265_golomb_descriptors descriptor)
+/*(tvbuff_t *tvb, gint *start_bit_offset) */
+{
+ proto_item *ti;
+
+ gint leading_zero_bits, bit_offset, start_offset;
+ guint32 codenum, mask, value, tmp;
+ gint32 se_value = 0;
+ gint b;
+ char *str;
+ int bit;
+ int i;
+ gboolean overflow = FALSE;
+ header_field_info *hf_field = NULL;
+
+ start_offset = *start_bit_offset >> 3;
+
+ if (hf_index > -1)
+ hf_field = proto_registrar_get_nth(hf_index);
+
+ /* Allow only gint32 for se(v), guint32 for others. */
+ switch (descriptor) {
+ case H265_SE_V:
+ DISSECTOR_ASSERT_FIELD_TYPE(hf_field, FT_INT32);
+ break;
+
+ default:
+ DISSECTOR_ASSERT_FIELD_TYPE(hf_field, FT_UINT32);
+ break;
+ }
+
+ bit_offset = *start_bit_offset;
+
+ /* prepare the string */
+ str = (char *)wmem_alloc(pinfo->pool, 256);
+ str[0] = '\0';
+ for (bit = 0; bit<((int)(bit_offset & 0x07)); bit++) {
+ if (bit && (!(bit % 4))) {
+ (void) g_strlcat(str, " ", 256);
+ }
+ (void) g_strlcat(str, ".", 256);
+ }
+
+
+ leading_zero_bits = -1;
+ for (b = 0; !b; leading_zero_bits++) {
+ if (bit && (!(bit % 4))) {
+ (void) g_strlcat(str, " ", 256);
+ }
+ if (bit && (!(bit % 8))) {
+ (void) g_strlcat(str, " ", 256);
+ }
+ b = tvb_get_bits8(tvb, bit_offset, 1);
+ if (b != 0) {
+ (void) g_strlcat(str, "1", 256);
+ }
+ else {
+ (void) g_strlcat(str, "0", 256);
+ }
+ bit++;
+ bit_offset++;
+ }
+
+ /* XXX: This could be handled in the general case and reduce code
+ * duplication. */
+ if (leading_zero_bits == 0) {
+ codenum = 0;
+ *start_bit_offset = bit_offset;
+ for (; bit % 8; bit++) {
+ if (bit && (!(bit % 4))) {
+ (void) g_strlcat(str, " ", 256);
+ }
+ (void) g_strlcat(str, ".", 256);
+ }
+ if (hf_field) {
+ (void) g_strlcat(str, " = ", 256);
+ (void) g_strlcat(str, hf_field->name, 256);
+ switch (descriptor) {
+ case H265_SE_V:
+ /* if the syntax element is coded as se(v),
+ * the value of the syntax element is derived by invoking the
+ * mapping process for signed Exp-Golomb codes as specified in
+ * subclause 9.1.1 with codeNum as the input.
+ */
+ if (hf_field->type == FT_INT32) {
+ if (hf_field->strings) {
+ proto_tree_add_int_format(tree, hf_index, tvb, start_offset, 1, codenum,
+ "%s: %s (%d)",
+ str,
+ val_to_str_const(codenum, cVALS(hf_field->strings), "Unknown "),
+ codenum);
+ }
+ else {
+ switch (hf_field->display) {
+ case BASE_DEC:
+ proto_tree_add_int_format(tree, hf_index, tvb, start_offset, 1, codenum,
+ "%s: %d",
+ str,
+ codenum);
+ break;
+ default:
+ DISSECTOR_ASSERT_NOT_REACHED();
+ break;
+ }
+ }
+ }
+ return codenum;
+ default:
+ break;
+ }
+ if (hf_field->type == FT_UINT32) {
+ if (hf_field->strings) {
+ proto_tree_add_uint_format(tree, hf_index, tvb, start_offset, 1, codenum,
+ "%s: %s (%u)",
+ str,
+ val_to_str_const(codenum, cVALS(hf_field->strings), "Unknown "),
+ codenum);
+ }
+ else {
+ switch (hf_field->display) {
+ case BASE_DEC:
+ proto_tree_add_uint_format(tree, hf_index, tvb, start_offset, 1, codenum,
+ "%s: %u",
+ str,
+ codenum);
+ break;
+ case BASE_HEX:
+ proto_tree_add_uint_format(tree, hf_index, tvb, start_offset, 1, codenum,
+ "%s: 0x%x",
+ str,
+ codenum);
+ break;
+ default:
+ DISSECTOR_ASSERT_NOT_REACHED();
+ break;
+ }
+ }
+ }
+ else {
+ /* Only allow guint32 */
+ DISSECTOR_ASSERT_NOT_REACHED();
+ }
+ }
+ return codenum;
+ }
+
+ /*
+ Syntax elements coded as ue(v), me(v), or se(v) are Exp-Golomb-coded. Syntax elements coded as te(v) are truncated
+ Exp-Golomb-coded. The parsing process for these syntax elements begins with reading the bits starting at the current
+ location in the bitstream up to and including the first non-zero bit, and counting the number of leading bits that are
+ equal to 0. This process is specified as follows:
+ leadingZeroBits = -1;
+ for (b = 0; !b; leadingZeroBits++)
+ b = read_bits( 1 )
+ The variable codeNum is then assigned as follows:
+ codeNum = 2leadingZeroBits - 1 + read_bits( leadingZeroBits )
+ where the value returned from read_bits( leadingZeroBits ) is interpreted as a binary representation of an unsigned
+ integer with most significant bit written first.
+ */
+ if (leading_zero_bits > 32) {
+ overflow = TRUE;
+ codenum = G_MAXUINT32;
+ if (descriptor == H265_SE_V) {
+ /* For signed, must read the last bit to get the sign. */
+ value = tvb_get_bits32(tvb, bit_offset + 32*(leading_zero_bits / 32), leading_zero_bits % 32, ENC_BIG_ENDIAN);
+ if (value % 2) {
+ se_value = G_MININT32;
+ } else {
+ se_value = G_MAXINT32;
+ }
+ }
+ } else if (leading_zero_bits == 32) {
+ value = tvb_get_bits32(tvb, bit_offset, leading_zero_bits, ENC_BIG_ENDIAN);
+ codenum = G_MAXUINT32;
+ /* One one value doesn't overflow a 32 bit integer, but they're
+ * different for unsigned and signed (because codenum G_MAXUINT32 maps
+ * to G_MAXINT32 + 1 and G_MAXUINT32 + 1 maps to G_MININT32.) */
+ if (descriptor == H265_SE_V) {
+ if (value != 1) {
+ overflow = TRUE;
+ }
+ if (value % 2) {
+ se_value = G_MININT32;
+ } else {
+ se_value = G_MAXINT32;
+ }
+ } else {
+ if (value != 0) {
+ overflow = TRUE;
+ }
+ }
+ mask = 1U << 31;
+ } else { /* Non-overflow general case */
+ if (leading_zero_bits > 16)
+ value = tvb_get_bits32(tvb, bit_offset, leading_zero_bits, ENC_BIG_ENDIAN);
+ else if (leading_zero_bits > 8)
+ value = tvb_get_bits16(tvb, bit_offset, leading_zero_bits, ENC_BIG_ENDIAN);
+ else
+ value = tvb_get_bits8(tvb, bit_offset, leading_zero_bits);
+
+ codenum = 1;
+ codenum = codenum << leading_zero_bits;
+ mask = codenum >> 1;
+ codenum = (codenum - 1) + value;
+
+ if (descriptor == H265_SE_V) {
+ /* if the syntax element is coded as se(v),
+ * the value of the syntax element is derived by invoking the
+ * mapping process for signed Exp-Golomb codes as specified in
+ * subclause 9.1.1 with codeNum as the input.
+ * k+1
+ * (-1) Ceil( k/2 )
+ */
+ se_value = (codenum + 1) >> 1;
+ if (!(codenum & 1)) {
+ se_value = -se_value;
+ }
+ }
+
+ }
+
+ bit_offset = bit_offset + leading_zero_bits;
+
+ if (overflow) {
+ *start_bit_offset = bit_offset;
+ /* We will probably get a BoundsError later in the packet. */
+ if (descriptor == H265_SE_V) {
+ ti = proto_tree_add_int_format_value(tree, hf_index, tvb, start_offset, (bit_offset >> 3) - start_offset + 1, codenum, "Invalid value (%d leading zero bits), clamped to %" PRId32, leading_zero_bits, se_value);
+ expert_add_info(NULL, ti, &ei_h265_oversized_exp_golomb_code);
+ return se_value;
+ } else {
+ ti = proto_tree_add_uint_format_value(tree, hf_index, tvb, start_offset, (bit_offset >> 3) - start_offset + 1, codenum, "Invalid value (%d leading zero bits), clamped to %" PRIu32, leading_zero_bits, codenum);
+ expert_add_info(NULL, ti, &ei_h265_oversized_exp_golomb_code);
+ return codenum;
+ }
+ }
+
+ /* read the bits for the int */
+ for (i = 0; i<leading_zero_bits; i++) {
+ if (bit && (!(bit % 4))) {
+ (void) g_strlcat(str, " ", 256);
+ }
+ if (bit && (!(bit % 8))) {
+ (void) g_strlcat(str, " ", 256);
+ }
+ bit++;
+ tmp = value & mask;
+ if (tmp != 0) {
+ (void) g_strlcat(str, "1", 256);
+ }
+ else {
+ (void) g_strlcat(str, "0", 256);
+ }
+ mask = mask >> 1;
+ }
+ for (; bit % 8; bit++) {
+ if (bit && (!(bit % 4))) {
+ (void) g_strlcat(str, " ", 256);
+ }
+ (void) g_strlcat(str, ".", 256);
+ }
+
+ if (hf_field) {
+ (void) g_strlcat(str, " = ", 256);
+ (void) g_strlcat(str, hf_field->name, 256);
+ switch (descriptor) {
+ case H265_SE_V:
+ (void) g_strlcat(str, "(se(v))", 256);
+ /* if the syntax element is coded as se(v),
+ * the value of the syntax element is derived by invoking the
+ * mapping process for signed Exp-Golomb codes as specified in
+ * subclause 9.1.1 with codeNum as the input.
+ */
+ break;
+ default:
+ break;
+ }
+ if (hf_field->type == FT_UINT32) {
+ if (hf_field->strings) {
+ proto_tree_add_uint_format(tree, hf_index, tvb, start_offset, 1, codenum,
+ "%s: %s (%u)",
+ str,
+ val_to_str_const(codenum, cVALS(hf_field->strings), "Unknown "),
+ codenum);
+ }
+ else {
+ switch (hf_field->display) {
+ case BASE_DEC:
+ proto_tree_add_uint_format(tree, hf_index, tvb, start_offset, 1, codenum,
+ "%s: %u",
+ str,
+ codenum);
+ break;
+ case BASE_HEX:
+ proto_tree_add_uint_format(tree, hf_index, tvb, start_offset, 1, codenum,
+ "%s: 0x%x",
+ str,
+ codenum);
+ break;
+ default:
+ DISSECTOR_ASSERT_NOT_REACHED();
+ break;
+ }
+ }
+ }
+ else if (hf_field->type == FT_INT32) {
+ if (hf_field->strings) {
+ proto_tree_add_int_format(tree, hf_index, tvb, start_offset, 1, codenum,
+ "%s: %s (%d)",
+ str,
+ val_to_str_const(codenum, cVALS(hf_field->strings), "Unknown "),
+ se_value);
+ }
+ else {
+ switch (hf_field->display) {
+ case BASE_DEC:
+ proto_tree_add_int_format(tree, hf_index, tvb, start_offset, 1, codenum,
+ "%s: %d",
+ str,
+ se_value);
+ break;
+ default:
+ DISSECTOR_ASSERT_NOT_REACHED();
+ break;
+ }
+ }
+ *start_bit_offset = bit_offset;
+ return se_value;
+
+ }
+ else {
+ DISSECTOR_ASSERT_NOT_REACHED();
+ }
+ }
+
+ *start_bit_offset = bit_offset;
+ return codenum;
+}
+
+
+static gboolean
+more_rbsp_data(proto_tree *tree _U_, tvbuff_t *tvb, packet_info *pinfo _U_, gint bit_offset)
+{
+ int offset;
+ int remaining_length;
+ int last_one_bit;
+ guint8 b = 0;
+
+ /* XXX might not be the best way of doing things but:
+ * Serch from the end of the tvb for the first '1' bit
+ * assuming that it's the RTBSP stop bit
+ */
+
+ /* Set offset to the byte we are treating */
+ offset = bit_offset >> 3;
+ remaining_length = tvb_reported_length_remaining(tvb, offset);
+ /* If there is more then 2 bytes left there *should* be more data */
+ if (remaining_length>2) {
+ return TRUE;
+ }
+ /* Start from last bit */
+ last_one_bit = (tvb_reported_length(tvb) << 3);
+
+ for (b = 0; !b; ) {
+ last_one_bit--;
+ b = tvb_get_bits8(tvb, last_one_bit, 1);
+ }
+
+ if (last_one_bit == bit_offset) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* 7.3.2.11 RBSP trailing bits syntax */
+static int
+dissect_h265_rbsp_trailing_bits(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint bit_offset)
+{
+ gint remaining_bits = 0;
+
+ proto_tree_add_bits_item(tree, hf_h265_rbsp_stop_bit, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if ((bit_offset & 0x7) != 0) {
+ remaining_bits = 8 - (bit_offset & 0x7);
+ proto_tree_add_bits_item(tree, hf_h265_rbsp_trailing_bits, tvb, bit_offset, remaining_bits, ENC_BIG_ENDIAN);
+ }
+
+ return bit_offset + remaining_bits;
+}
+
+/* Ref 7.3.2.1 Video parameter set RBSP syntax */
+static void
+dissect_h265_video_parameter_set_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ //proto_item *level_item;
+ gint bit_offset;
+ proto_tree *profile_tier_level_tree, *hrd_parameters_tree;
+
+ bit_offset = offset << 3;
+
+ proto_tree_add_bits_item(tree, hf_h265_vps_video_parameter_set_id, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 4;
+
+ proto_tree_add_bits_item(tree, hf_h265_vps_base_layer_internal_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 1;
+
+ proto_tree_add_bits_item(tree, hf_h265_vps_base_layer_available_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 1;
+
+ proto_tree_add_bits_item(tree, hf_h265_vps_max_layers_minus1, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 6;
+
+ guint8 vps_max_sub_layers_minus1 = tvb_get_bits8(tvb, bit_offset, 3);
+ proto_tree_add_bits_item(tree, hf_h265_vps_max_sub_layers_minus1, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 3;
+
+ proto_tree_add_bits_item(tree, hf_h265_vps_temporal_id_nesting_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 1;
+
+ proto_tree_add_bits_item(tree, hf_h265_vps_reserved_0xffff_16bits, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 16;
+
+ offset = bit_offset >> 3;
+ profile_tier_level_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_h265_profile_tier_level, NULL, "Profile, tier and level");
+ offset = dissect_h265_profile_tier_level(profile_tier_level_tree, tvb, pinfo, offset, 1, vps_max_sub_layers_minus1);
+ bit_offset = offset << 3;
+
+ guint8 vps_sub_layer_ordering_info_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_item(tree, hf_h265_vps_sub_layer_ordering_info_present_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 1;
+
+ for (int i = (vps_sub_layer_ordering_info_present_flag ? 0 : vps_max_sub_layers_minus1);
+ i <= vps_max_sub_layers_minus1; i++) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_vps_max_dec_pic_buffering_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_vps_max_num_reorder_pics, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_vps_max_latency_increase_plus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+
+ guint8 vps_max_layer_id = tvb_get_bits8(tvb, bit_offset, 6);
+ proto_tree_add_bits_item(tree, hf_h265_vps_max_layer_id, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 6;
+
+ guint32 vps_num_layer_sets_minus1 = dissect_h265_exp_golomb_code(tree, hf_h265_vps_num_layer_sets_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ for (unsigned i = 1; i <= vps_num_layer_sets_minus1; i++)
+ for (int j = 0; j <= vps_max_layer_id; j++) {
+ proto_tree_add_bits_item(tree, hf_h265_layer_id_included_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 1;
+ }
+
+ guint8 vps_timing_info_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_vps_timing_info_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 1;
+
+ if (vps_timing_info_present_flag) {
+ proto_tree_add_bits_item(tree, hf_h265_vps_num_units_in_tick, tvb, bit_offset, 32, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 32;
+ proto_tree_add_bits_item(tree, hf_h265_vps_time_scale, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 32;
+ guint8 vps_poc_proportional_to_timing_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_vps_poc_proportional_to_timing_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 1;
+
+ if (vps_poc_proportional_to_timing_flag) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_vps_num_ticks_poc_diff_one_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+ guint32 vps_num_hrd_parameters = dissect_h265_exp_golomb_code(tree, hf_h265_vps_num_hrd_parameters, tvb, pinfo, &bit_offset, H265_UE_V);
+ for (unsigned i = 0; i < vps_num_hrd_parameters; i++) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_hrd_layer_set_idx, tvb, pinfo, &bit_offset, H265_UE_V);
+ if (i > 0) {
+ gboolean cprms_present_flag/*[i]*/ = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_cprms_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 1;
+
+ offset = bit_offset >> 3;
+ hrd_parameters_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_h265_hrd_parameters, NULL, "HRD parameters");
+ bit_offset = offset << 3;
+
+ bit_offset = dissect_h265_hrd_parameters(hrd_parameters_tree, tvb, pinfo, bit_offset, cprms_present_flag/*[i]*/, vps_max_sub_layers_minus1);
+ }
+ }
+ }
+
+ guint8 vps_extension_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_vps_extension_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 1;
+
+ if (vps_extension_flag) {
+ while (more_rbsp_data(tree, tvb, pinfo, bit_offset)) {
+ proto_tree_add_bits_item(tree, hf_h265_vps_extension_data_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 1;
+ }
+ }
+ dissect_h265_rbsp_trailing_bits(tree, tvb, pinfo, bit_offset);
+}
+
+static void
+dissect_h265_seq_parameter_set_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ gint bit_offset;
+ guint8 i, sps_max_sub_layers_minus1, sps_extension_4bits = 0;
+ guint32 num_short_term_ref_pic_sets, num_long_term_ref_pics_sps, log2_max_pic_order_cnt_lsb_minus4, bit_depth_luma_minus8, bit_depth_chroma_minus8;
+ gboolean sps_sub_layer_ordering_info_present_flag = 0, scaling_list_enabled_flag = 0, sps_scaling_list_data_present_flag = 0,
+ pcm_enabled_flag = 0, long_term_ref_pics_present_flag = 0, vui_parameters_present_flag = 0, sps_extension_present_flag = 0,
+ sps_range_extension_flag = 0, sps_multilayer_extension_flag = 0, sps_3d_extension_flag = 0, sps_scc_extension_flag = 0;
+ gint32 NumDeltaPocs[H265_MAX_NUM_SHORT_TERM_REF_PIC_SETS] = { 0 }; // num_negative_pics + num_positive_pics;
+ proto_tree *profile_tier_level_tree, *vui_parameters_tree;
+
+ sps_max_sub_layers_minus1 = tvb_get_bits8(tvb, offset << 3, 8) >> 1 & 0x07;
+ proto_tree_add_item(tree, hf_h265_sps_video_parameter_set_id, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_h265_sps_max_sub_layers_minus1, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_h265_sps_temporal_id_nesting_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+
+ profile_tier_level_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_h265_profile_tier_level, NULL, "Profile, tier and level");
+ offset = dissect_h265_profile_tier_level(profile_tier_level_tree, tvb, pinfo, offset, 1, sps_max_sub_layers_minus1);
+
+ bit_offset = offset << 3;
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_sps_seq_parameter_set_id, tvb, pinfo, &bit_offset, H265_UE_V);
+ guint chroma_format_idc = dissect_h265_exp_golomb_code(tree, hf_h265_chroma_format_idc, tvb, pinfo, &bit_offset, H265_UE_V);
+ if (chroma_format_idc == 3)
+ {
+ proto_tree_add_bits_item(tree, hf_h265_separate_colour_plane_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ pic_width_in_luma_samples = dissect_h265_exp_golomb_code(tree, hf_h265_pic_width_in_luma_samples, tvb, pinfo, &bit_offset, H265_UE_V);
+ pic_height_in_luma_samples = dissect_h265_exp_golomb_code(tree, hf_h265_pic_height_in_luma_samples, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ gboolean conformance_window_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_conformance_window_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ if (conformance_window_flag) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_conf_win_left_offset, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_conf_win_right_offset, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_conf_win_top_offset, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_conf_win_bottom_offset, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+ bit_depth_luma_minus8 = dissect_h265_exp_golomb_code(tree, hf_h265_bit_depth_luma_minus8, tvb, pinfo, &bit_offset, H265_UE_V);
+ bit_depth_chroma_minus8 = dissect_h265_exp_golomb_code(tree, hf_h265_bit_depth_chroma_minus8, tvb, pinfo, &bit_offset, H265_UE_V);
+ log2_max_pic_order_cnt_lsb_minus4 = dissect_h265_exp_golomb_code(tree, hf_h265_log2_max_pic_order_cnt_lsb_minus4, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ sps_sub_layer_ordering_info_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_sps_sub_layer_ordering_info_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ for (i = (sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1);
+ i <= sps_max_sub_layers_minus1; i++) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_sps_max_dec_pic_buffering_minus1/*[i]*/, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_sps_max_num_reorder_pics/*[i]*/, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_sps_max_latency_increase_plus1/*[i]*/, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+ // data between packets TODO: move to "conversations"
+ log2_min_luma_coding_block_size_minus3 =
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_min_luma_coding_block_size_minus3, tvb, pinfo, &bit_offset, H265_UE_V);
+ // data between packets TODO: move to "conversations"
+ log2_diff_max_min_luma_coding_block_size =
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_diff_max_min_luma_coding_block_size, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_min_luma_transform_block_size_minus2, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_diff_max_min_luma_transform_block_size, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_max_transform_hierarchy_depth_inter, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_max_transform_hierarchy_depth_intra, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ scaling_list_enabled_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_scaling_list_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (scaling_list_enabled_flag) {
+ sps_scaling_list_data_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_sps_scaling_list_data_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ if (sps_scaling_list_data_present_flag)
+ bit_offset = dissect_h265_scaling_list_data(tree, tvb, pinfo, bit_offset);
+ }
+
+ proto_tree_add_bits_item(tree, hf_h265_amp_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_sample_adaptive_offset_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ pcm_enabled_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_pcm_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (pcm_enabled_flag) {
+
+ proto_tree_add_bits_item(tree, hf_h265_pcm_sample_bit_depth_luma_minus1, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 4;
+
+ proto_tree_add_bits_item(tree, hf_h265_pcm_sample_bit_depth_chroma_minus1, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 4;
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_min_pcm_luma_coding_block_size_minus3, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_diff_max_min_pcm_luma_coding_block_size, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ proto_tree_add_bits_item(tree, hf_h265_pcm_loop_filter_disabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+
+ num_short_term_ref_pic_sets = dissect_h265_exp_golomb_code(tree, hf_h265_num_short_term_ref_pic_sets, tvb, pinfo, &bit_offset, H265_UE_V);
+ if (num_short_term_ref_pic_sets > H265_MAX_NUM_SHORT_TERM_REF_PIC_SETS) {
+ proto_tree_add_expert(tree, pinfo, &ei_h265_value_to_large, tvb, bit_offset>>3, 1);
+ return;
+ }
+ for (i = 0; i < num_short_term_ref_pic_sets; i++)
+ bit_offset = dissect_h265_st_ref_pic_set(tree, tvb, pinfo, bit_offset, i, num_short_term_ref_pic_sets, NumDeltaPocs);
+
+ long_term_ref_pics_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_long_term_ref_pics_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (long_term_ref_pics_present_flag) {
+
+ num_long_term_ref_pics_sps = dissect_h265_exp_golomb_code(tree, hf_h265_num_long_term_ref_pics_sps, tvb, pinfo, &bit_offset, H265_UE_V);
+ for (i = 0; i < num_long_term_ref_pics_sps; i++) {
+
+ proto_tree_add_bits_item(tree, hf_h265_lt_ref_pic_poc_lsb_sps/*[i]*/, tvb, bit_offset, log2_max_pic_order_cnt_lsb_minus4 + 4, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + log2_max_pic_order_cnt_lsb_minus4 + 4;
+
+ proto_tree_add_bits_item(tree, hf_h265_used_by_curr_pic_lt_sps_flag/*[i]*/, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ }
+ proto_tree_add_bits_item(tree, hf_h265_sps_temporal_mvp_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_strong_intra_smoothing_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ vui_parameters_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_vui_parameters_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (vui_parameters_present_flag)
+ {
+ vui_parameters_tree = proto_tree_add_subtree(tree, tvb, bit_offset >> 3, 1, ett_h265_vui_parameters, NULL, "VUI parameters");
+ bit_offset = dissect_h265_vui_parameters(vui_parameters_tree, tvb, pinfo, bit_offset, sps_max_sub_layers_minus1);
+ }
+
+ sps_extension_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_sps_extension_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (sps_extension_present_flag)
+ {
+ sps_range_extension_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_sps_range_extension_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ sps_multilayer_extension_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_sps_multilayer_extension_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ sps_3d_extension_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_sps_3d_extension_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ sps_scc_extension_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_sps_scc_extension_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ sps_extension_4bits = tvb_get_bits8(tvb, bit_offset, 4);
+ proto_tree_add_bits_item(tree, hf_h265_sps_extension_4bits, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 4;
+ }
+ if (sps_range_extension_flag)
+ bit_offset = dissect_h265_sps_range_extension(tree, tvb, pinfo, bit_offset);
+ if (sps_multilayer_extension_flag)
+ bit_offset = dissect_h265_sps_multilayer_extension(tree, tvb, pinfo, bit_offset); /* specified in Annex F */
+ if (sps_3d_extension_flag)
+ bit_offset = dissect_h265_sps_3d_extension(tree, tvb, pinfo, bit_offset); /* specified in Annex I */
+ if (sps_scc_extension_flag)
+ bit_offset = dissect_h265_sps_scc_extension(tree, tvb, pinfo, bit_offset, chroma_format_idc, bit_depth_luma_minus8, bit_depth_chroma_minus8);
+ if (sps_extension_4bits)
+ while (more_rbsp_data(tree, tvb, pinfo, bit_offset)) {
+ proto_tree_add_bits_item(tree, hf_h265_sps_extension_data_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ dissect_h265_rbsp_trailing_bits(tree, tvb, pinfo, bit_offset);
+}
+
+/* Ref 7.3.2.3 Picture parameter set RBSP syntax */
+static void
+dissect_h265_pic_parameter_set_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ gint bit_offset;
+ guint num_tile_columns_minus1, num_tile_rows_minus1, i;
+ gboolean cu_qp_delta_enabled_flag, tiles_enabled_flag, uniform_spacing_flag;
+ gboolean deblocking_filter_control_present_flag, pps_deblocking_filter_disabled_flag;
+ gboolean pps_scaling_list_data_present_flag, pps_extension_present_flag;
+ gboolean pps_range_extension_flag = 0, pps_multilayer_extension_flag = 0, pps_3d_extension_flag = 0,
+ pps_scc_extension_flag = 0, pps_extension_4bits = 0, transform_skip_enabled_flag = 0;
+
+ bit_offset = offset << 3;
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_pps_pic_parameter_set_id, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_pps_seq_parameter_set_id, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ // data between packets TODO: move to "conversations"
+ dependent_slice_segments_enabled_flag = tvb_get_bits8(tvb, bit_offset, 1);
+
+ proto_tree_add_bits_item(tree, hf_h265_dependent_slice_segments_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_output_flag_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ // data between packets TODO: move to "conversations"
+ num_extra_slice_header_bits = tvb_get_bits8(tvb, bit_offset, 3);
+ proto_tree_add_bits_item(tree, hf_h265_num_extra_slice_header_bits, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 3;
+
+ proto_tree_add_bits_item(tree, hf_h265_sign_data_hiding_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_cabac_init_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_num_ref_idx_l0_default_active_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_num_ref_idx_l1_default_active_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_init_qp_minus26, tvb, pinfo, &bit_offset, H265_SE_V);
+
+ proto_tree_add_bits_item(tree, hf_h265_constrained_intra_pred_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ transform_skip_enabled_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_transform_skip_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ cu_qp_delta_enabled_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_cu_qp_delta_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (cu_qp_delta_enabled_flag) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_diff_cu_qp_delta_depth, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_pps_cb_qp_offset, tvb, pinfo, &bit_offset, H265_SE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_pps_cr_qp_offset, tvb, pinfo, &bit_offset, H265_SE_V);
+
+ proto_tree_add_bits_item(tree, hf_h265_pps_slice_chroma_qp_offsets_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_weighted_pred_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_weighted_bipred_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_transquant_bypass_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ tiles_enabled_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_tiles_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_entropy_coding_sync_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (tiles_enabled_flag) {
+
+ num_tile_columns_minus1 = dissect_h265_exp_golomb_code(tree, hf_h265_num_tile_columns_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ num_tile_rows_minus1 = dissect_h265_exp_golomb_code(tree, hf_h265_num_tile_rows_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ uniform_spacing_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_uniform_spacing_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ if (!uniform_spacing_flag) {
+ for (i = 0; i < num_tile_columns_minus1; i++)
+ dissect_h265_exp_golomb_code(tree, hf_h265_column_width_minus1/*[i]*/, tvb, pinfo, &bit_offset, H265_UE_V);
+ for (i = 0; i < num_tile_rows_minus1; i++)
+ dissect_h265_exp_golomb_code(tree, hf_h265_row_height_minus1/*[i]*/, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+
+ proto_tree_add_bits_item(tree, hf_h265_loop_filter_across_tiles_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+
+ proto_tree_add_bits_item(tree, hf_h265_pps_loop_filter_across_slices_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ deblocking_filter_control_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_deblocking_filter_control_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (deblocking_filter_control_present_flag) {
+ proto_tree_add_bits_item(tree, hf_h265_deblocking_filter_override_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ pps_deblocking_filter_disabled_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_pps_deblocking_filter_disabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (!pps_deblocking_filter_disabled_flag) {
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_pps_beta_offset_div2, tvb, pinfo, &bit_offset, H265_SE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_pps_tc_offset_div2, tvb, pinfo, &bit_offset, H265_SE_V);
+
+ }
+ }
+
+ pps_scaling_list_data_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_pps_scaling_list_data_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (pps_scaling_list_data_present_flag) {
+ bit_offset = dissect_h265_scaling_list_data(tree, tvb, pinfo, bit_offset);
+ }
+
+ proto_tree_add_bits_item(tree, hf_h265_lists_modification_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_parallel_merge_level_minus2, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ proto_tree_add_bits_item(tree, hf_h265_slice_segment_header_extension_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ pps_extension_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_pps_extension_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (pps_extension_present_flag) {
+ pps_range_extension_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_pps_range_extension_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ pps_multilayer_extension_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_pps_multilayer_extension_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ pps_3d_extension_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_pps_3d_extension_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ pps_scc_extension_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_pps_scc_extension_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ pps_extension_4bits = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_pps_extension_4bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+
+ if (pps_range_extension_flag)
+ bit_offset = dissect_h265_pps_range_extension(tree, tvb, pinfo, bit_offset, transform_skip_enabled_flag);
+ if (pps_multilayer_extension_flag)
+ bit_offset = dissect_h265_pps_multilayer_extension(tree, tvb, pinfo, bit_offset); /* specified in Annex F */
+ if (pps_3d_extension_flag)
+ bit_offset = dissect_h265_pps_3d_extension(tree, tvb, pinfo, bit_offset); /* specified in Annex I */
+ if (pps_scc_extension_flag)
+ bit_offset = dissect_h265_pps_scc_extension(tree, tvb, pinfo, bit_offset);
+ if (pps_extension_4bits)
+ while (more_rbsp_data(tree, tvb, pinfo, bit_offset)) {
+ proto_tree_add_bits_item(tree, hf_h265_pps_extension_data_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ dissect_h265_rbsp_trailing_bits(tree, tvb, pinfo, bit_offset);
+}
+
+/* Ref 7.3.2.4 Supplemental enhancement information RBSP syntax */
+static void
+dissect_h265_sei_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset, guint8 nal_unit_type)
+{
+ proto_tree *sei_rbsp_tree;
+ sei_rbsp_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_h265_sei_rbsp, NULL, "Supplemental enhancement information RBSP");
+
+ gint bit_offset;
+
+ bit_offset = offset << 3;
+
+ do
+ {
+ bit_offset = dissect_h265_sei_message(sei_rbsp_tree, tvb, pinfo, bit_offset, nal_unit_type);
+ } while (more_rbsp_data(sei_rbsp_tree, tvb, pinfo, bit_offset));
+
+ dissect_h265_rbsp_trailing_bits(sei_rbsp_tree, tvb, pinfo, bit_offset);
+}
+
+/* Ref 7.3.2.5 Access unit delimiter RBSP syntax */
+static void
+dissect_h265_access_unit_delimiter_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ gint bit_offset = offset << 3;
+
+ proto_tree *access_unit_delimiter_rbsp_tree;
+ access_unit_delimiter_rbsp_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_h265_access_unit_delimiter_rbsp, NULL, "Access unit delimiter RBSP");
+
+ /* pic_type u(3) */
+ proto_tree_add_bits_item(access_unit_delimiter_rbsp_tree, hf_h265_pic_type, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+ bit_offset += 3;
+
+ /* rbsp_trailing_bits */
+ dissect_h265_rbsp_trailing_bits(access_unit_delimiter_rbsp_tree, tvb, pinfo, bit_offset);
+}
+
+/* Ref 7.3.2.6 End of sequence RBSP syntax*/
+static void
+dissect_h265_end_of_seq_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree *end_of_seq_rbsp_tree;
+ end_of_seq_rbsp_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_h265_end_of_seq_rbsp, NULL, "End of sequence RBSP");
+ proto_tree_add_expert(end_of_seq_rbsp_tree, pinfo, &ei_h265_undecoded, tvb, offset, -1);
+}
+
+/* Ref 7.3.2.7 End of bitstream RBSP syntax*/
+static void
+dissect_h265_end_of_bitstream_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree *end_of_bitstream_rbsp_tree;
+ end_of_bitstream_rbsp_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_h265_end_of_bitstream_rbsp, NULL, "End of bitstream RBSP");
+ proto_tree_add_expert(end_of_bitstream_rbsp_tree, pinfo, &ei_h265_undecoded, tvb, offset, -1);
+}
+
+/* Ref 7.3.2.8 Filler data RBSP syntax */
+static void
+dissect_h265_filler_data_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset)
+{
+ proto_tree *filler_data_rbsp_tree;
+ filler_data_rbsp_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_h265_filler_data_rbsp, NULL, "Filler data RBSP");
+ proto_tree_add_expert(filler_data_rbsp_tree, pinfo, &ei_h265_undecoded, tvb, offset, -1);
+}
+
+/* Ref 7.3.3 Profile, tier and level syntax */
+static int
+dissect_h265_profile_tier_level(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo _U_, gint offset, gboolean profilePresentFlag, gint vps_max_sub_layers_minus1)
+{
+ proto_item *general_level_idc_item;
+ guint32 general_profile_idc, general_level_idc;
+ guint32 sub_layer_profile_idc[32] = { 0 };
+ gboolean general_tier_flag = 0;
+ gboolean general_profile_compatibility_flag[32] = { 0 };
+ gboolean sub_layer_profile_present_flag[32] = { 0 };
+ gboolean sub_layer_level_present_flag[32] = { 0 };
+ gboolean sub_layer_profile_compatibility_flag[32][32] = { { 0 } };
+
+ if (profilePresentFlag) {
+ proto_tree_add_item(tree, hf_h265_general_profile_space, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item_ret_boolean(tree, hf_h265_general_tier_flag, tvb, offset, 1, ENC_BIG_ENDIAN, &general_tier_flag);
+ proto_tree_add_item_ret_uint(tree, hf_h265_general_profile_idc, tvb, offset, 1, ENC_BIG_ENDIAN, &general_profile_idc);
+ offset++;
+
+ proto_tree_add_item(tree, hf_h265_general_profile_compatibility_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
+
+ gint bit_offset = offset << 3;
+ for (int j = 0; j < 32; j++)
+ general_profile_compatibility_flag[j] = tvb_get_bits8(tvb, bit_offset + j, 1);
+ bit_offset = bit_offset + 32;
+
+ proto_tree_add_bits_item(tree, hf_h265_general_progressive_source_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_interlaced_source_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_non_packed_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_frame_only_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (general_profile_idc == 4 || general_profile_compatibility_flag[4] ||
+ general_profile_idc == 5 || general_profile_compatibility_flag[5] ||
+ general_profile_idc == 6 || general_profile_compatibility_flag[6] ||
+ general_profile_idc == 7 || general_profile_compatibility_flag[7] ||
+ general_profile_idc == 8 || general_profile_compatibility_flag[8] ||
+ general_profile_idc == 9 || general_profile_compatibility_flag[9] ||
+ general_profile_idc == 10 || general_profile_compatibility_flag[10]) {
+ /* The number of bits in this syntax structure is not affected by this condition */
+ proto_tree_add_bits_item(tree, hf_h265_general_max_12bit_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_max_10bit_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_max_8bit_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_max_422chroma_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_max_420chroma_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_max_monochrome_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_intra_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_one_picture_only_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_lower_bit_rate_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ if (general_profile_idc == 5 || general_profile_compatibility_flag[5] ||
+ general_profile_idc == 9 || general_profile_compatibility_flag[9] ||
+ general_profile_idc == 10 || general_profile_compatibility_flag[10]) {
+ proto_tree_add_bits_item(tree, hf_h265_general_max_14bit_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_reserved_zero_33bits, tvb, bit_offset, 33, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 33;
+ }
+ else {
+ proto_tree_add_bits_item(tree, hf_h265_general_reserved_zero_34bits, tvb, bit_offset, 34, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 34;
+ }
+ }
+ else if (general_profile_idc == 2 || general_profile_compatibility_flag[2]) {
+ proto_tree_add_bits_item(tree, hf_h265_general_reserved_zero_7bits, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 7;
+ proto_tree_add_bits_item(tree, hf_h265_general_one_picture_only_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_general_reserved_zero_35bits, tvb, bit_offset, 35, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 35;
+ }
+ else {
+ proto_tree_add_bits_item(tree, hf_h265_general_reserved_zero_43bits, tvb, bit_offset, 43, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 43;
+ }
+
+ if ((general_profile_idc >= 1 && general_profile_idc <= 5) ||
+ general_profile_idc == 9 ||
+ general_profile_compatibility_flag[1] || general_profile_compatibility_flag[2] ||
+ general_profile_compatibility_flag[3] || general_profile_compatibility_flag[4] ||
+ general_profile_compatibility_flag[5] || general_profile_compatibility_flag[9])
+ /* The number of bits in this syntax structure is not affected by this condition */ {
+ proto_tree_add_bits_item(tree, hf_h265_general_inbld_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ }
+ else {
+ proto_tree_add_bits_item(tree, hf_h265_general_reserved_zero_bit, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ }
+ bit_offset++;
+
+ general_level_idc_item = proto_tree_add_item_ret_uint(tree, hf_h265_general_level_idc, tvb, bit_offset >> 3, 1, ENC_BIG_ENDIAN, &general_level_idc);
+ if (general_tier_flag) {
+ proto_item_append_text(general_level_idc_item, " [Level %.1f %s]", ((double)general_level_idc / 30), val_to_str_const(general_level_idc / 3, h265_level_high_tier_bitrate_values, "Unknown"));
+ }
+ else {
+ proto_item_append_text(general_level_idc_item, " [Level %.1f %s]", ((double)general_level_idc / 30), val_to_str_const(general_level_idc / 3, h265_level_main_tier_bitrate_values, "Unknown"));
+ }
+ bit_offset += 8;
+
+ for (int i = 0; i < vps_max_sub_layers_minus1; i++) {
+ sub_layer_profile_present_flag[i] = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_profile_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_level_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+
+ if (vps_max_sub_layers_minus1 > 0)
+ for (int i = vps_max_sub_layers_minus1; i < 8; i++) {
+ proto_tree_add_bits_item(tree, hf_h265_reserved_zero_2bits/*[i]*/, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 2;
+ }
+
+ for (int i = 0; i < vps_max_sub_layers_minus1; i++) {
+ if (sub_layer_profile_present_flag[i]) {
+ proto_tree_add_item(tree, hf_h265_sub_layer_profile_space, tvb, bit_offset >> 3, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_h265_sub_layer_tier_flag, tvb, bit_offset >> 3, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_h265_sub_layer_profile_idc, tvb, bit_offset >> 3, 1, ENC_BIG_ENDIAN);
+ sub_layer_profile_idc[i] = tvb_get_bits8(tvb, (bit_offset >> 3) + 3, 5);
+
+ bit_offset = bit_offset + 8;
+
+ for (int j = 0; j < 32; j++) {
+ sub_layer_profile_compatibility_flag[i][j] = tvb_get_bits8(tvb, bit_offset, 1);
+ }
+ proto_tree_add_item(tree, hf_h265_sub_layer_profile_compatibility_flag, tvb, bit_offset >> 3, 4, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 32;
+
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_progressive_source_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_interlaced_source_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_non_packed_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_frame_only_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (sub_layer_profile_idc[i] == 4 || sub_layer_profile_compatibility_flag[i][4] ||
+ sub_layer_profile_idc[i] == 5 || sub_layer_profile_compatibility_flag[i][5] ||
+ sub_layer_profile_idc[i] == 6 || sub_layer_profile_compatibility_flag[i][6] ||
+ sub_layer_profile_idc[i] == 7 || sub_layer_profile_compatibility_flag[i][7] ||
+ sub_layer_profile_idc[i] == 8 || sub_layer_profile_compatibility_flag[i][8] ||
+ sub_layer_profile_idc[i] == 9 || sub_layer_profile_compatibility_flag[i][9] ||
+ sub_layer_profile_idc[i] == 10 || sub_layer_profile_compatibility_flag[i][10]) {
+ /* The number of bits in this syntax structure is not affected by this condition */
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_max_12bit_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_max_10bit_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_max_8bit_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_max_422chroma_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_max_420chroma_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_max_monochrome_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_intra_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_one_picture_only_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_lower_bit_rate_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (sub_layer_profile_idc[i] == 5 ||
+ sub_layer_profile_compatibility_flag[i][5]) {
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_max_14bit_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_reserved_zero_33bits, tvb, bit_offset + 1, 33, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 34;
+ }
+ else {
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_reserved_zero_34bits, tvb, bit_offset + 1, 33, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 34;
+ }
+ }
+ else if (sub_layer_profile_idc[i] == 2 ||
+ sub_layer_profile_compatibility_flag[i][2]) {
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_reserved_zero_7bits, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 7;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_one_picture_only_constraint_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_reserved_zero_35bits, tvb, bit_offset, 35, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 35;
+ }
+ else {
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_reserved_zero_43bits, tvb, bit_offset, 43, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 43;
+ }
+ if ((sub_layer_profile_idc[i] >= 1 && sub_layer_profile_idc[i] <= 5) ||
+ sub_layer_profile_idc[i] == 9 ||
+ sub_layer_profile_compatibility_flag[i][1] ||
+ sub_layer_profile_compatibility_flag[i][2] ||
+ sub_layer_profile_compatibility_flag[i][3] ||
+ sub_layer_profile_compatibility_flag[i][4] ||
+ sub_layer_profile_compatibility_flag[i][5] ||
+ sub_layer_profile_compatibility_flag[i][9]) {
+ /* The number of bits in this syntax structure is not affected by this condition */
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_inbld_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ else {
+ proto_tree_add_bits_item(tree, hf_h265_sub_layer_reserved_zero_bit, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ }
+ if (sub_layer_level_present_flag[i]) {
+ proto_tree_add_item(tree, hf_h265_sub_layer_level_idc, tvb, bit_offset >> 3, 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 8;
+ }
+ }
+ offset = bit_offset >> 3;
+ }
+
+ return offset;
+}
+
+/* 7.3.6 Slice segment header syntax */
+/* Just parse a few bits same as in H.264 */
+/* TODO: if need more info from slice hedaer , do more parsing */
+static int
+dissect_h265_slice_segment_header(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint bit_offset, guint8 nal_unit_type)
+{
+ gboolean first_slice_segment_in_pic_flag = 0, /*no_output_of_prior_pics_flag = 0,*/ dependent_slice_segment_flag = 0;
+
+ guint MinCbLog2SizeY = log2_min_luma_coding_block_size_minus3 + 3;
+ guint CtbLog2SizeY = MinCbLog2SizeY + log2_diff_max_min_luma_coding_block_size;
+ guint CtbSizeY = 1 << CtbLog2SizeY;
+ double PicWidthInCtbsY = ceil(pic_width_in_luma_samples / CtbSizeY);
+ double PicHeightInCtbsY = ceil(pic_height_in_luma_samples / CtbSizeY);
+ double PicSizeInCtbsY = PicWidthInCtbsY * PicHeightInCtbsY;
+ guint nBits = (guint)(ceil(log2(PicSizeInCtbsY)));
+ guint i;
+
+ first_slice_segment_in_pic_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ bit_offset++;
+
+ if (nal_unit_type >= str_to_val("BLA_W_LP", h265_type_summary_values, 16) &&
+ nal_unit_type <= str_to_val("RSV_IRAP_VCL23", h265_type_summary_values, 23)) {
+ /*no_output_of_prior_pics_flag = tvb_get_bits8(tvb, bit_offset, 1);*/
+ bit_offset++;
+ }
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_slice_pic_parameter_set_id, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ if (!first_slice_segment_in_pic_flag) {
+ if (dependent_slice_segments_enabled_flag){
+ dependent_slice_segment_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ bit_offset++;
+ }
+ proto_tree_add_bits_item(tree, hf_h265_slice_segment_address, tvb, bit_offset, nBits, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + nBits;
+ }
+
+ if (!dependent_slice_segment_flag) {
+ for (i = 0; i < num_extra_slice_header_bits; i++) {
+ /* slice_reserved_flag[i] u(1) */
+ bit_offset++;
+ }
+ dissect_h265_exp_golomb_code(tree, hf_h265_slice_type, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+
+ return bit_offset;
+}
+
+/* 7.3.2.9 Slice segment layer RBSP syntax */
+static void
+dissect_h265_slice_segment_layer_rbsp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset, guint8 nal_unit_type)
+{
+ gint bit_offset;
+
+ bit_offset = offset << 3;
+
+ /* slice_segment_header( ) */
+ dissect_h265_slice_segment_header(tree, tvb, pinfo, bit_offset, nal_unit_type);
+ /* slice_segment_data( ) */
+ /* rbsp_slice_segment_trailing_bits( ) */
+}
+
+/* 7.3.4 Scaling list data syntax */
+static int
+dissect_h265_scaling_list_data(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo _U_, gint bit_offset)
+{
+ gboolean scaling_list_pred_mode_flag[4][6] = { { 0 } };
+ /*gint32 ScalingList[4][6][64] = { 0 };*/
+ gint sizeId, matrixId, nextCoef, coefNum, i;
+ gint32 scaling_list_dc_coef_minus8, scaling_list_delta_coef;
+ for (sizeId = 0; sizeId < 4; sizeId++)
+ for (matrixId = 0; matrixId < 6; matrixId += (sizeId == 3) ? 3 : 1) {
+ scaling_list_pred_mode_flag[sizeId][matrixId] = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_scaling_list_pred_mode_flag/*[sizeId][matrixId]*/, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ if (!scaling_list_pred_mode_flag[sizeId][matrixId])
+ dissect_h265_exp_golomb_code(tree, hf_h265_scaling_list_pred_matrix_id_delta/*[sizeId][matrixId]*/, tvb, pinfo, &bit_offset, H265_UE_V);
+ else {
+ nextCoef = 8;
+ coefNum = MIN(64, (1 << (4 + (sizeId << 1))));
+ if (sizeId > 1) {
+ scaling_list_dc_coef_minus8 = dissect_h265_exp_golomb_code(tree, hf_h265_scaling_list_dc_coef_minus8/*[sizeId - 2][matrixId]*/, tvb, pinfo, &bit_offset, H265_SE_V);
+ nextCoef = scaling_list_dc_coef_minus8 + 8;
+ }
+ for (i = 0; i < coefNum; i++) {
+ scaling_list_delta_coef = dissect_h265_exp_golomb_code(tree, hf_h265_scaling_list_delta_coef, tvb, pinfo, &bit_offset, H265_SE_V);
+ nextCoef = (nextCoef + scaling_list_delta_coef + 256) % 256;
+ /*ScalingList[sizeId][matrixId][i] = nextCoef;*/
+ }
+ }
+ }
+ return bit_offset;
+}
+
+/* D.2.1 General SEI message syntax */
+static int
+dissect_h265_sei_payload(proto_tree* tree _U_, tvbuff_t* tvb _U_, packet_info* pinfo _U_, gint bit_offset, guint payloadType _U_, guint payloadSize, guint8 nal_unit_type _U_)
+{
+ //gint bit_start = bit_offset;
+#if 0
+ if (nal_unit_type == str_to_val("PREFIX_SEI_NUT", h265_type_summary_values, 39)) {
+ if (payloadType == 0)
+ buffering_period(payloadSize);
+ else if (payloadType == 1)
+ pic_timing(payloadSize);
+ else if (payloadType == 2)
+ pan_scan_rect(payloadSize);
+ else if (payloadType == 3)
+ filler_payload(payloadSize);
+ else if (payloadType == 4)
+ user_data_registered_itu_t_t35(payloadSize);
+ else if (payloadType == 5)
+ user_data_unregistered(payloadSize);
+ else if (payloadType == 6)
+ recovery_point(payloadSize);
+ else if (payloadType == 9)
+ scene_info(payloadSize);
+ else if (payloadType == 15)
+ picture_snapshot(payloadSize);
+ else if (payloadType == 16)
+ progressive_refinement_segment_start(payloadSize);
+ else if (payloadType == 17)
+ progressive_refinement_segment_end(payloadSize);
+ else if (payloadType == 19)
+ film_grain_characteristics(payloadSize);
+ else if (payloadType == 22)
+ post_filter_hint(payloadSize);
+ else if (payloadType == 23)
+ tone_mapping_info(payloadSize);
+ else if (payloadType == 45)
+ frame_packing_arrangement(payloadSize);
+ else if (payloadType == 47)
+ display_orientation(payloadSize);
+ else if (payloadType == 56)
+ green_metadata(payloadSize); /* specified in ISO/IEC 23001-11 */
+ else if (payloadType == 128)
+ structure_of_pictures_info(payloadSize);
+ else if (payloadType == 129)
+ active_parameter_sets(payloadSize);
+ else if (payloadType == 130)
+ decoding_unit_info(payloadSize);
+ else if (payloadType == 131)
+ temporal_sub_layer_zero_idx(payloadSize);
+ else if (payloadType == 133)
+ scalable_nesting(payloadSize);
+ else if (payloadType == 134)
+ region_refresh_info(payloadSize);
+ else if (payloadType == 135)
+ no_display(payloadSize);
+ else if (payloadType == 136)
+ time_code(payloadSize);
+ else if (payloadType == 137)
+ mastering_display_colour_volume(payloadSize);
+ else if (payloadType == 138)
+ segmented_rect_frame_packing_arrangement(payloadSize);
+ else if (payloadType == 139)
+ temporal_motion_constrained_tile_sets(payloadSize);
+ else if (payloadType == 140)
+ chroma_resampling_filter_hint(payloadSize);
+ else if (payloadType == 141)
+ knee_function_info(payloadSize);
+ else if (payloadType == 142)
+ colour_remapping_info(payloadSize);
+ else if (payloadType == 143)
+ deinterlaced_field_identification(payloadSize);
+ else if (payloadType == 144)
+ content_light_level_info(payloadSize);
+ else if (payloadType == 145)
+ dependent_rap_indication(payloadSize);
+ else if (payloadType == 146)
+ coded_region_completion(payloadSize);
+ else if (payloadType == 147)
+ alternative_transfer_characteristics(payloadSize);
+ else if (payloadType == 148)
+ ambient_viewing_environment(payloadSize);
+ else if (payloadType == 149)
+ content_colour_volume(payloadSize);
+ else if (payloadType == 150)
+ equirectangular_projection(payloadSize);
+ else if (payloadType == 151)
+ cubemap_projection(payloadSize);
+ else if (payloadType == 154)
+ sphere_rotation(payloadSize);
+ else if (payloadType == 155)
+ regionwise_packing(payloadSize);
+ else if (payloadType == 156)
+ omni_viewport(payloadSize);
+ else if (payloadType == 157)
+ regional_nesting(payloadSize);
+ else if (payloadType == 158)
+ mcts_extraction_info_sets(payloadSize);
+ else if (payloadType == 159)
+ mcts_extraction_info_nesting(payloadSize);
+ else if (payloadType == 160)
+ layers_not_present(payloadSize); /* specified in Annex F */
+ else if (payloadType == 161)
+ inter_layer_constrained_tile_sets(payloadSize); /* specified in Annex F */
+ else if (payloadType == 162)
+ bsp_nesting(payloadSize); /* specified in Annex F */
+ else if (payloadType == 163)
+ bsp_initial_arrival_time(payloadSize); /* specified in Annex F */
+ else if (payloadType == 164)
+ sub_bitstream_property(payloadSize); /* specified in Annex F */
+ else if (payloadType == 165)
+ alpha_channel_info(payloadSize); /* specified in Annex F */
+ else if (payloadType == 166)
+ overlay_info(payloadSize); /* specified in Annex F */
+ else if (payloadType == 167)
+ temporal_mv_prediction_constraints(payloadSize); /* specified in Annex F */
+ else if (payloadType == 168)
+ frame_field_info(payloadSize); /* specified in Annex F */
+ else if (payloadType == 176)
+ three_dimensional_reference_displays_info(payloadSize); /* specified in Annex G */
+ else if (payloadType == 177)
+ depth_representation_info(payloadSize); /* specified in Annex G */
+ else if (payloadType == 178)
+ multiview_scene_info(payloadSize); /* specified in Annex G */
+ else if (payloadType == 179)
+ multiview_acquisition_info(payloadSize); /* specified in Annex G */
+ else if (payloadType == 180)
+ multiview_view_position(payloadSize); /* specified in Annex G */
+ else if (payloadType == 181)
+ alternative_depth_info(payloadSize); /* specified in Annex I */
+ else
+ reserved_sei_message(payloadSize);
+ }
+ else /* nal_unit_type == SUFFIX_SEI_NUT */ {
+ if (payloadType == 3)
+ filler_payload(payloadSize);
+ else if (payloadType == 4)
+ user_data_registered_itu_t_t35(payloadSize);
+ else if (payloadType == 5)
+ user_data_unregistered(payloadSize);
+ else if (payloadType == 17)
+ progressive_refinement_segment_end(payloadSize);
+ else if (payloadType == 22)
+ post_filter_hint(payloadSize);
+ else if (payloadType == 132)
+ decoded_picture_hash(payloadSize);
+ else if (payloadType == 146)
+ coded_region_completion(payloadSize);
+ else
+ reserved_sei_message(payloadSize);
+ }
+ if (h265_more_data_in_payload(bit_start, bit_offset, payloadSize)) {
+ if (h265_payload_extension_present(tvb, bit_start, bit_offset, payloadSize)) {
+ /*reserved_payload_extension_data u(v) */
+ guint nEarlierBits = bit_offset - bit_start;
+ guint v_bits = 8 * payloadSize - nEarlierBits - nPayloadZeroBits - 1;
+ bit_offset = bit_offset + v_bits;
+ }
+ /* payload_bit_equal_to_one (equal to 1) f(1) */
+ bit_offset++;
+ while (!h265_byte_aligned(bit_offset)) {
+ /* payload_bit_equal_to_zero (equal to 0) f(1)*/
+ bit_offset++;
+ }
+ }
+#else
+ bit_offset = bit_offset + (payloadSize << 3);
+#endif
+ return bit_offset;
+}
+
+/* 7.3.5 Supplemental enhancement information message syntax */
+static int
+dissect_h265_sei_message(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset, guint8 nal_unit_type)
+{
+ guint payloadType = 0, last_payload_type_byte, payloadSize, last_payload_size_byte;
+ gint start_bit_offset, length;
+
+ start_bit_offset = bit_offset;
+
+ while (tvb_get_bits8(tvb, bit_offset, 8) == 0xFF) {
+ bit_offset = bit_offset + 8;
+ payloadType += 255;
+ }
+
+ last_payload_type_byte = tvb_get_bits8(tvb, bit_offset, 8);
+ bit_offset = bit_offset + 8;
+
+ payloadType += last_payload_type_byte;
+ length = (bit_offset - start_bit_offset) >> 3;
+
+ proto_tree_add_uint(tree, hf_h265_payloadtype, tvb, start_bit_offset >> 3, length, payloadType);
+
+ payloadSize = 0;
+ start_bit_offset = bit_offset;
+ while (tvb_get_bits8(tvb, bit_offset, 8) == 0xFF) {
+ bit_offset = bit_offset + 8;
+ payloadSize += 255;
+ }
+
+ last_payload_size_byte = tvb_get_bits8(tvb, bit_offset, 8);
+ bit_offset = bit_offset + 8;
+
+ payloadSize += last_payload_size_byte;
+ length = (bit_offset - start_bit_offset) >> 3;
+ proto_tree_add_uint(tree, hf_h265_payloadsize, tvb, start_bit_offset >> 3, length, payloadSize);
+
+ bit_offset = dissect_h265_sei_payload(tree, tvb, pinfo, bit_offset, payloadType, payloadSize, nal_unit_type);
+
+ return bit_offset;
+}
+
+/* 7.3.7 Short-term reference picture set syntax */
+static int
+dissect_h265_st_ref_pic_set(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo _U_, gint bit_offset, gint stRpsIdx, gint num_short_term_ref_pic_sets, gint32 NumDeltaPocs[H265_MAX_NUM_SHORT_TERM_REF_PIC_SETS])
+{
+ gint j;
+ guint i;
+ guint32 num_negative_pics, num_positive_pics;
+ gboolean inter_ref_pic_set_prediction_flag = 0;
+ gboolean used_by_curr_pic_flag;
+ gint RefRpsIdx;
+ gint delta_idx_minus1 = 0;
+ tree = proto_tree_add_subtree_format(tree, tvb, bit_offset >> 3, 1, ett_h265_ref_pic_set, NULL, "ref_pic_set %d", stRpsIdx);
+
+ if (stRpsIdx != 0) {
+ inter_ref_pic_set_prediction_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_inter_ref_pic_set_prediction_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ if (inter_ref_pic_set_prediction_flag) {
+ if (stRpsIdx == num_short_term_ref_pic_sets) {
+ delta_idx_minus1 = dissect_h265_exp_golomb_code(tree, hf_h265_delta_idx_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+ proto_tree_add_bits_item(tree, hf_h265_delta_rps_sign, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ dissect_h265_exp_golomb_code(tree, hf_h265_abs_delta_rps_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ RefRpsIdx = stRpsIdx - (delta_idx_minus1 + 1);
+ for (j = 0; j <= NumDeltaPocs[RefRpsIdx]; j++) {
+ used_by_curr_pic_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_used_by_curr_pic_flag/*[j]*/, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ if (!used_by_curr_pic_flag/*[j]*/) {
+ proto_tree_add_bits_item(tree, hf_h265_use_delta_flag/*[j]*/, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ }
+ NumDeltaPocs[stRpsIdx] = NumDeltaPocs[RefRpsIdx];
+ }
+ else {
+ num_negative_pics = dissect_h265_exp_golomb_code(tree, hf_h265_num_negative_pics, tvb, pinfo, &bit_offset, H265_UE_V);
+ num_positive_pics = dissect_h265_exp_golomb_code(tree, hf_h265_num_positive_pics, tvb, pinfo, &bit_offset, H265_UE_V);
+ NumDeltaPocs[stRpsIdx] = num_negative_pics + num_positive_pics;
+ for (i = 0; i < num_negative_pics; i++) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_delta_poc_s0_minus1/*[i]*/, tvb, pinfo, &bit_offset, H265_UE_V);
+ proto_tree_add_bits_item(tree, hf_h265_used_by_curr_pic_s0_flag/*[i]*/, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ for (i = 0; i < num_positive_pics; i++) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_delta_poc_s1_minus1/*[i]*/, tvb, pinfo, &bit_offset, H265_UE_V);
+ proto_tree_add_bits_item(tree, hf_h265_used_by_curr_pic_s1_flag/*[i]*/, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ }
+ return bit_offset;
+}
+
+/* E.2.3 Sub-layer HRD parameters syntax */
+static int
+dissect_h265_sub_layer_hrd_parameters(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint bit_offset, guint subLayerId _U_, guint32 CpbCnt, gboolean sub_pic_hrd_params_present_flag)
+{
+ /*The variable CpbCnt is set equal to cpb_cnt_minus1[ subLayerId ] + 1.*/
+ guint i;
+ for (i = 0; i < CpbCnt; i++) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_bit_rate_value_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_cpb_size_value_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ if (sub_pic_hrd_params_present_flag) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_cpb_size_du_value_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_bit_rate_du_value_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+ proto_tree_add_bits_item(tree, hf_h265_cbr_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ return bit_offset;
+}
+
+/* E.2.2 HRD parameters syntax */
+static int
+dissect_h265_hrd_parameters(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint bit_offset, gboolean commonInfPresentFlag, guint maxNumSubLayersMinus1)
+{
+ guint subLayerId;
+ gboolean nal_hrd_parameters_present_flag = 0, vcl_hrd_parameters_present_flag = 0, sub_pic_hrd_params_present_flag = 0;
+ gboolean fixed_pic_rate_general_flag[32] = { 0 };
+ gboolean fixed_pic_rate_within_cvs_flag[32] = { 0 };
+ gboolean low_delay_hrd_flag[32] = { 0 };
+ guint32 cpb_cnt_minus1[32] = { 0 };
+
+ if (commonInfPresentFlag) {
+
+ nal_hrd_parameters_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_nal_hrd_parameters_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ vcl_hrd_parameters_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_vcl_hrd_parameters_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) {
+
+ sub_pic_hrd_params_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_sub_pic_hrd_params_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (sub_pic_hrd_params_present_flag) {
+ proto_tree_add_bits_item(tree, hf_h265_tick_divisor_minus2, tvb, bit_offset, 8, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 8;
+
+ proto_tree_add_bits_item(tree, hf_h265_du_cpb_removal_delay_increment_length_minus1, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 5;
+
+ proto_tree_add_bits_item(tree, hf_h265_sub_pic_cpb_params_in_pic_timing_sei_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_dpb_output_delay_du_length_minus1, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 5;
+
+ }
+
+ proto_tree_add_bits_item(tree, hf_h265_bit_rate_scale, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 4;
+
+ proto_tree_add_bits_item(tree, hf_h265_cpb_size_scale, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 4;
+
+ if (sub_pic_hrd_params_present_flag) {
+
+ proto_tree_add_bits_item(tree, hf_h265_cpb_size_du_scale, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 4;
+ }
+
+ proto_tree_add_bits_item(tree, hf_h265_initial_cpb_removal_delay_length_minus1, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 5;
+
+ proto_tree_add_bits_item(tree, hf_h265_au_cpb_removal_delay_length_minus1, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 5;
+
+ proto_tree_add_bits_item(tree, hf_h265_dpb_output_delay_length_minus1, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 5;
+ }
+ }
+ for (subLayerId = 0; subLayerId <= maxNumSubLayersMinus1; subLayerId++) {
+
+ fixed_pic_rate_general_flag[subLayerId] = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_fixed_pic_rate_general_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (!fixed_pic_rate_general_flag[subLayerId]) {
+
+ fixed_pic_rate_within_cvs_flag[subLayerId] = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_fixed_pic_rate_within_cvs_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ if (fixed_pic_rate_within_cvs_flag[subLayerId]) {
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_elemental_duration_in_tc_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+ else {
+
+ low_delay_hrd_flag[subLayerId] = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_low_delay_hrd_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+ if (!low_delay_hrd_flag[subLayerId]) {
+
+ cpb_cnt_minus1[subLayerId] = dissect_h265_exp_golomb_code(tree, hf_h265_cpb_cnt_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+ if (nal_hrd_parameters_present_flag) {
+
+ dissect_h265_sub_layer_hrd_parameters(tree, tvb, pinfo, bit_offset, subLayerId, cpb_cnt_minus1[subLayerId] + 1, sub_pic_hrd_params_present_flag);
+ }
+ if (vcl_hrd_parameters_present_flag) {
+
+ dissect_h265_sub_layer_hrd_parameters(tree, tvb, pinfo, bit_offset, subLayerId, cpb_cnt_minus1[subLayerId] + 1, sub_pic_hrd_params_present_flag);
+ }
+ }
+ return bit_offset;
+}
+
+#define EXTENDED_SAR 255
+
+/* Table E-2 - Meaning of video_format */
+static const value_string h265_video_format_vals[] = {
+ { 0, "Component" },
+ { 1, "PAL" },
+ { 2, "NTSC" },
+ { 3, "SECAM" },
+ { 4, "MAC" },
+ { 5, "Unspecified video format" },
+ { 0, NULL }
+};
+
+/* E.2.1 VUI parameters syntax */
+static int
+dissect_h265_vui_parameters(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint bit_offset, guint8 sps_max_sub_layers_minus1)
+{
+ guint8 aspect_ratio_info_present_flag, aspect_ratio_idc, overscan_info_present_flag;
+ guint8 video_signal_type_present_flag, colour_description_present_flag, chroma_loc_info_present_flag;
+ guint8 bitstream_restriction_flag, default_display_window_flag, vui_timing_info_present_flag;
+ guint8 vui_poc_proportional_to_timing_flag, vui_hrd_parameters_present_flag;
+
+ /* vui_parameters( ) {
+ * aspect_ratio_info_present_flag 0 u(1)
+ */
+ aspect_ratio_info_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_aspect_ratio_info_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (aspect_ratio_info_present_flag) {
+ /* aspect_ratio_idc 0 u(8) */
+ aspect_ratio_idc = tvb_get_bits8(tvb, bit_offset, 8);
+ proto_tree_add_bits_item(tree, hf_h265_aspect_ratio_idc, tvb, bit_offset, 8, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 8;
+
+ if (aspect_ratio_idc == EXTENDED_SAR) {
+ /* sar_width 0 u(16) */
+ proto_tree_add_bits_item(tree, hf_h265_sar_width, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 16;
+
+ /* sar_height 0 u(16) */
+ proto_tree_add_bits_item(tree, hf_h265_sar_height, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 16;
+ }
+ }
+ /* overscan_info_present_flag 0 u(1) */
+ overscan_info_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_overscan_info_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (overscan_info_present_flag) {
+ /* overscan_appropriate_flag 0 u(1) */
+ proto_tree_add_bits_item(tree, hf_h265_overscan_appropriate_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ }
+
+ /* video_signal_type_present_flag 0 u(1) */
+ video_signal_type_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_video_signal_type_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (video_signal_type_present_flag) {
+ /* video_format 0 u(3) > */
+ proto_tree_add_bits_item(tree, hf_h265_video_format, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 3;
+
+ /* video_full_range_flag 0 u(1)*/
+ proto_tree_add_bits_item(tree, hf_h265_video_full_range_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ /* colour_description_present_flag 0 u(1) */
+ colour_description_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_colour_description_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (colour_description_present_flag) {
+ /* colour_primaries 0 u(8) */
+ proto_tree_add_bits_item(tree, hf_h265_colour_primaries, tvb, bit_offset, 8, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 8;
+
+ /* transfer_characteristics 0 u(8) */
+ proto_tree_add_bits_item(tree, hf_h265_transfer_characteristics, tvb, bit_offset, 8, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 8;
+
+ /* matrix_coefficients 0 u(8)*/
+ proto_tree_add_bits_item(tree, hf_h265_matrix_coeffs, tvb, bit_offset, 8, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 8;
+ }
+ }
+
+ /* chroma_loc_info_present_flag 0 u(1) */
+ chroma_loc_info_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_chroma_loc_info_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (chroma_loc_info_present_flag) {
+ /* chroma_sample_loc_type_top_field 0 ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_chroma_sample_loc_type_top_field, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ /* chroma_sample_loc_type_bottom_field 0 ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_chroma_sample_loc_type_bottom_field, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+
+ /* neutral_chroma_indication_flag u(1) */
+ proto_tree_add_bits_item(tree, hf_h265_neutral_chroma_indication_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ /* field_seq_flag u(1) */
+ proto_tree_add_bits_item(tree, hf_h265_field_seq_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ /* frame_field_info_present_flag u(1) */
+ proto_tree_add_bits_item(tree, hf_h265_frame_field_info_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ /* default_display_window_flag u(1) */
+ default_display_window_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_default_display_window_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (default_display_window_flag) {
+ /* def_disp_win_left_offset ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_def_disp_win_left_offset, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ /* def_disp_win_right_offset ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_def_disp_win_right_offset, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ /* def_disp_win_top_offset ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_def_disp_win_top_offset, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ /* def_disp_win_bottom_offset ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_def_disp_win_bottom_offset, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+
+ /* vui_timing_info_present_flag u(1) */
+ vui_timing_info_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_vui_timing_info_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (vui_timing_info_present_flag) {
+ /* vui_num_units_in_tick u(32) */
+ proto_tree_add_bits_item(tree, hf_h265_vui_num_units_in_tick, tvb, bit_offset, 32, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 32;
+
+ /* vui_time_scale u(32) */
+ proto_tree_add_bits_item(tree, hf_h265_vui_time_scale, tvb, bit_offset, 32, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 32;
+
+ /* vui_poc_proportional_to_timing_flag u(1) */
+ vui_poc_proportional_to_timing_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_vui_poc_proportional_to_timing_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (vui_poc_proportional_to_timing_flag) {
+ /* vui_num_ticks_poc_diff_one_minus1 ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_vui_num_ticks_poc_diff_one_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+
+ /* vui_hrd_parameters_present_flag u(1) */
+ vui_hrd_parameters_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_vui_hrd_parameters_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (vui_hrd_parameters_present_flag) {
+ dissect_h265_hrd_parameters(tree, tvb, pinfo, bit_offset, 1, sps_max_sub_layers_minus1);
+ }
+ }
+
+ /* bitstream_restriction_flag 0 u(1) */
+ bitstream_restriction_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_bitstream_restriction_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (bitstream_restriction_flag) {
+ /* tiles_fixed_structure_flag u(1) */
+ proto_tree_add_bits_item(tree, hf_h265_tiles_fixed_structure_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ /* motion_vectors_over_pic_boundaries_flag u(1) */
+ proto_tree_add_bits_item(tree, hf_h265_motion_vectors_over_pic_boundaries_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ /* restricted_ref_pic_lists_flag u(1) */
+ proto_tree_add_bits_item(tree, hf_h265_restricted_ref_pic_lists_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ /* min_spatial_segmentation_idc ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_min_spatial_segmentation_idc, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ /* max_bytes_per_pic_denom ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_max_bytes_per_pic_denom, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ /* max_bits_per_min_cu_denom ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_max_bits_per_min_cu_denom, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ /* log2_max_mv_length_horizontal ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_max_mv_length_horizontal, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ /* log2_max_mv_length_vertical ue(v) */
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_max_mv_length_vertical, tvb, pinfo, &bit_offset, H265_UE_V);
+ }
+
+ return bit_offset;
+}
+
+/* 7.3.2.2.2 Sequence parameter set range extension syntax */
+static int
+dissect_h265_sps_range_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo _U_, gint bit_offset)
+{
+ proto_tree_add_bits_item(tree, hf_h265_transform_skip_rotation_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_transform_skip_context_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_implicit_rdpcm_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_explicit_rdpcm_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_extended_precision_processing_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_intra_smoothing_disabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_high_precision_offsets_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_persistent_rice_adaptation_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ proto_tree_add_bits_item(tree, hf_h265_cabac_bypass_alignment_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ return bit_offset;
+}
+
+/* F.7.3.2.2.4 Sequence parameter set multilayer extension syntax */
+static int
+dissect_h265_sps_multilayer_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset)
+{
+ proto_tree *sps_multilayer_extension_tree;
+ sps_multilayer_extension_tree = proto_tree_add_subtree(tree, tvb, bit_offset >> 3, 1, ett_h265_sps_multilayer_extension, NULL, "sps_multilayer_extension");
+ proto_tree_add_expert(sps_multilayer_extension_tree, pinfo, &ei_h265_undecoded, tvb, bit_offset >> 3, -1);
+ return bit_offset;
+}
+
+/* I.7.3.2.2.5 Sequence parameter set 3D extension syntax */
+static int
+dissect_h265_sps_3d_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset)
+{
+ proto_tree *sps_3d_extension_tree;
+ sps_3d_extension_tree = proto_tree_add_subtree(tree, tvb, bit_offset >> 3, 1, ett_h265_sps_3d_extension, NULL, "sps_3d_extension");
+ proto_tree_add_expert(sps_3d_extension_tree, pinfo, &ei_h265_undecoded, tvb, bit_offset >> 3, -1);
+ return bit_offset;
+}
+
+/* 7.3.2.2.3 Sequence parameter set screen content coding extension syntax */
+static int
+dissect_h265_sps_scc_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo _U_, gint bit_offset, guint chroma_format_idc, guint bit_depth_luma_minus8, guint bit_depth_chroma_minus8)
+{
+ guint BitDepthY = 8 + bit_depth_luma_minus8, BitDepthC = 8 + bit_depth_chroma_minus8;
+ gboolean palette_mode_enabled_flag, sps_palette_predictor_initializers_present_flag;
+ guint32 sps_num_palette_predictor_initializers_minus1;
+ guint32 numComps, comp, i;
+
+ proto_tree_add_bits_item(tree, hf_h265_sps_curr_pic_ref_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ palette_mode_enabled_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_palette_mode_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (palette_mode_enabled_flag) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_palette_max_size, tvb, pinfo, &bit_offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_delta_palette_max_predictor_size, tvb, pinfo, &bit_offset, H265_UE_V);
+
+ sps_palette_predictor_initializers_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_sps_palette_predictor_initializers_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+ if (sps_palette_predictor_initializers_present_flag) {
+ sps_num_palette_predictor_initializers_minus1 = dissect_h265_exp_golomb_code(tree, hf_h265_sps_num_palette_predictor_initializers_minus1, tvb, pinfo, &bit_offset, H265_UE_V);
+ numComps = (chroma_format_idc == 0) ? 1 : 3;
+ for (comp = 0; comp < numComps; comp++)
+ for (i = 0; i <= sps_num_palette_predictor_initializers_minus1; i++) {
+ if (comp == 0) {
+ proto_tree_add_bits_item(tree, hf_h265_sps_palette_predictor_initializer/*[comp][i]*/, tvb, bit_offset, (1 << BitDepthY) - 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + (1 << BitDepthY) - 1;
+ }
+ else {
+ proto_tree_add_bits_item(tree, hf_h265_sps_palette_predictor_initializer/*[comp][i]*/, tvb, bit_offset, (1 << BitDepthC) - 1, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + (1 << BitDepthC) - 1;
+ }
+ }
+ }
+ }
+
+ proto_tree_add_bits_item(tree, hf_h265_motion_vector_resolution_control_idc, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + 2;
+
+ proto_tree_add_bits_item(tree, hf_h265_intra_boundary_filtering_disabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ return bit_offset;
+}
+
+/* 7.3.2.3.2 Picture parameter set range extension syntax */
+static int
+dissect_h265_pps_range_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo _U_, gint bit_offset, guint transform_skip_enabled_flag)
+{
+ gboolean chroma_qp_offset_list_enabled_flag;
+ gint offset;
+ guint i, chroma_qp_offset_list_len_minus1;
+
+ if (transform_skip_enabled_flag) {
+ offset = bit_offset >> 3;
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_max_transform_skip_block_size_minus2, tvb, pinfo, &offset, H265_UE_V);
+
+ bit_offset = offset << 3;
+ }
+
+ proto_tree_add_bits_item(tree, hf_h265_cross_component_prediction_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ chroma_qp_offset_list_enabled_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_chroma_qp_offset_list_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ offset = bit_offset >> 3;
+
+ if (chroma_qp_offset_list_enabled_flag) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_diff_cu_chroma_qp_offset_depth, tvb, pinfo, &offset, H265_UE_V);
+ chroma_qp_offset_list_len_minus1 = dissect_h265_exp_golomb_code(tree, hf_h265_chroma_qp_offset_list_len_minus1, tvb, pinfo, &offset, H265_UE_V);
+
+ for (i = 0; i <= chroma_qp_offset_list_len_minus1; i++) {
+ dissect_h265_exp_golomb_code(tree, hf_h265_cb_qp_offset_list/*[i]*/, tvb, pinfo, &offset, H265_SE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_cr_qp_offset_list/*[i]*/, tvb, pinfo, &offset, H265_SE_V);
+ }
+ }
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_sao_offset_scale_luma, tvb, pinfo, &offset, H265_UE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_log2_sao_offset_scale_chroma, tvb, pinfo, &offset, H265_UE_V);
+
+ bit_offset = offset << 3;
+
+ return bit_offset;
+}
+
+/* 7.3.2.3.3 Picture parameter set screen content coding extension syntax */
+static int
+dissect_h265_pps_scc_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo _U_, gint bit_offset)
+{
+ gint offset;
+ guint pps_num_palette_predictor_initializers, numComps, comp, i;
+ gboolean residual_adaptive_colour_transform_enabled_flag, pps_palette_predictor_initializers_present_flag,
+ monochrome_palette_flag;
+ guint32 luma_bit_depth_entry_minus8 = 0, chroma_bit_depth_entry_minus8 = 0;
+
+ proto_tree_add_bits_item(tree, hf_h265_pps_curr_pic_ref_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ residual_adaptive_colour_transform_enabled_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_residual_adaptive_colour_transform_enabled_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (residual_adaptive_colour_transform_enabled_flag) {
+ proto_tree_add_bits_item(tree, hf_h265_pps_slice_act_qp_offsets_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ offset = bit_offset >> 3;
+
+ dissect_h265_exp_golomb_code(tree, hf_h265_pps_act_y_qp_offset_plus5, tvb, pinfo, &offset, H265_SE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_pps_act_cb_qp_offset_plus5, tvb, pinfo, &offset, H265_SE_V);
+ dissect_h265_exp_golomb_code(tree, hf_h265_pps_act_cr_qp_offset_plus3, tvb, pinfo, &offset, H265_SE_V);
+
+ bit_offset = offset << 3;
+ }
+
+ pps_palette_predictor_initializers_present_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_pps_palette_predictor_initializers_present_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ if (pps_palette_predictor_initializers_present_flag) {
+ offset = bit_offset >> 3;
+
+ pps_num_palette_predictor_initializers = dissect_h265_exp_golomb_code(tree, hf_h265_pps_num_palette_predictor_initializers, tvb, pinfo, &offset, H265_SE_V);
+ if (pps_num_palette_predictor_initializers > 0) {
+
+ bit_offset = offset << 3;
+
+ monochrome_palette_flag = tvb_get_bits8(tvb, bit_offset, 1);
+ proto_tree_add_bits_item(tree, hf_h265_monochrome_palette_flag, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+ bit_offset++;
+
+ offset = bit_offset >> 3;
+
+ luma_bit_depth_entry_minus8 = dissect_h265_exp_golomb_code(tree, hf_h265_luma_bit_depth_entry_minus8, tvb, pinfo, &offset, H265_UE_V);
+
+ if (!monochrome_palette_flag) {
+ chroma_bit_depth_entry_minus8 = dissect_h265_exp_golomb_code(tree, hf_h265_chroma_bit_depth_entry_minus8, tvb, pinfo, &offset, H265_UE_V);
+ }
+
+ numComps = monochrome_palette_flag ? 1 : 3;
+ for (comp = 0; comp < numComps; comp++)
+ for (i = 0; i < pps_num_palette_predictor_initializers; i++) {
+ bit_offset = offset << 3;
+
+ if (comp == 0) {
+ proto_tree_add_bits_item(tree, hf_h265_pps_palette_predictor_initializer/*[comp][i]*/, tvb, bit_offset, luma_bit_depth_entry_minus8 + 8, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + luma_bit_depth_entry_minus8 + 8;
+ }
+ else {
+ proto_tree_add_bits_item(tree, hf_h265_pps_palette_predictor_initializer/*[comp][i]*/, tvb, bit_offset, chroma_bit_depth_entry_minus8 + 8, ENC_BIG_ENDIAN);
+ bit_offset = bit_offset + chroma_bit_depth_entry_minus8 + 8;
+ }
+
+ offset = bit_offset >> 3;
+ }
+ }
+
+ bit_offset = offset << 3;
+ }
+
+ return bit_offset;
+}
+
+/* F.7.3.2.3.4 Picture parameter set multilayer extension syntax */
+static int
+dissect_h265_pps_multilayer_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset)
+{
+ proto_tree *pps_multilayer_extension_tree;
+ pps_multilayer_extension_tree = proto_tree_add_subtree(tree, tvb, bit_offset >> 3, 1, ett_h265_pps_multilayer_extension, NULL, "pps_multilayer_extension");
+ proto_tree_add_expert(pps_multilayer_extension_tree, pinfo, &ei_h265_undecoded, tvb, bit_offset >> 3, -1);
+
+ return bit_offset;
+}
+
+/* I.7.3.2.3.7 Picture parameter set 3D extension syntax */
+static int
+dissect_h265_pps_3d_extension(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, gint bit_offset)
+{
+ proto_tree *pps_3d_extension_tree;
+ pps_3d_extension_tree = proto_tree_add_subtree(tree, tvb, bit_offset >> 3, 1, ett_h265_pps_3d_extension, NULL, "pps_3d_extension");
+ proto_tree_add_expert(pps_3d_extension_tree, pinfo, &ei_h265_undecoded, tvb, bit_offset >> 3, -1);
+
+ return bit_offset;
+}
+
+
+static tvbuff_t *
+dissect_h265_unescap_nal_unit(tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ tvbuff_t *tvb_rbsp;
+ int length = tvb_reported_length_remaining(tvb, offset);
+ int NumBytesInRBSP = 0;
+ int i;
+ guint8 *buff;
+
+ buff = (gchar *)wmem_alloc(pinfo->pool, length);
+ for (i = 0; i < length; i++) {
+ if ((i + 2 < length) && (tvb_get_ntoh24(tvb, offset) == 0x000003)) {
+ buff[NumBytesInRBSP++] = tvb_get_guint8(tvb, offset);
+ buff[NumBytesInRBSP++] = tvb_get_guint8(tvb, offset + 1);
+ i += 2;
+ offset += 3;
+ }
+ else {
+ buff[NumBytesInRBSP++] = tvb_get_guint8(tvb, offset);
+ offset++;
+ }
+ }
+
+ tvb_rbsp = tvb_new_child_real_data(tvb, buff, NumBytesInRBSP, NumBytesInRBSP);
+ add_new_data_source(pinfo, tvb_rbsp, "Unescaped RSP Data");
+
+ return tvb_rbsp;
+}
+
+void
+dissect_h265_format_specific_parameter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo)
+{
+ int offset = 0;
+ proto_item *item;
+ proto_tree *h265_nal_tree;
+ guint8 type;
+ tvbuff_t *rbsp_tvb;
+
+ type = tvb_get_guint16(tvb, offset, ENC_BIG_ENDIAN) >> 9 & 0x3F;
+
+ /* Unescape NAL unit */
+ rbsp_tvb = dissect_h265_unescap_nal_unit(tvb, pinfo, offset + 2);
+
+ switch (type) {
+ case 32: /* VPS_NUT - Video parameter set */
+ item = proto_tree_add_item(tree, hf_h265_sdp_parameter_sprop_vps, tvb, offset, -1, ENC_NA);
+ h265_nal_tree = proto_item_add_subtree(item, ett_h265_sprop_parameters);
+ dissect_h265_video_parameter_set_rbsp(h265_nal_tree, rbsp_tvb, pinfo, 0);
+ break;
+ case 33: /* SPS_NUT - Sequence parameter set*/
+ item = proto_tree_add_item(tree, hf_h265_sdp_parameter_sprop_sps, tvb, offset, -1, ENC_NA);
+ h265_nal_tree = proto_item_add_subtree(item, ett_h265_sprop_parameters);
+ dissect_h265_seq_parameter_set_rbsp(h265_nal_tree, rbsp_tvb, pinfo, 0);
+ break;
+ case 34: /* PPS_NUT - Picture parameter set */
+ item = proto_tree_add_item(tree, hf_h265_sdp_parameter_sprop_pps, tvb, offset, -1, ENC_NA);
+ h265_nal_tree = proto_item_add_subtree(item, ett_h265_sprop_parameters);
+ dissect_h265_pic_parameter_set_rbsp(h265_nal_tree, rbsp_tvb, pinfo, 0);
+ break;
+ default:
+ proto_tree_add_expert(tree, pinfo, &ei_h265_format_specific_parameter, tvb, offset, -1);
+ break;
+ }
+}
+
+/* Code to actually dissect the packets */
+static int
+dissect_h265(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ proto_item *item;
+ proto_tree *h265_tree, *h265_nal_tree, *stream_tree, *fua_tree;
+ guint8 type;
+ tvbuff_t *rbsp_tvb;
+
+
+ /* Make entries in Protocol column and Info column on summary display */
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "H.265");
+
+ guint16 h265_nalu_hextet = tvb_get_guint16(tvb, offset, ENC_BIG_ENDIAN);
+ type = h265_nalu_hextet >> 9 & 0x3F;
+
+ col_append_fstr(pinfo->cinfo, COL_INFO, " %s",
+ val_to_str(type, h265_type_summary_values, "Unknown Type (%u)"));
+
+ /* if (tree) */ {
+ item = proto_tree_add_item(tree, proto_h265, tvb, 0, -1, ENC_NA);
+ h265_tree = proto_item_add_subtree(item, ett_h265);
+
+ /* if the type is 49, it would be draw another title */
+ if (type == 49)
+ h265_nal_tree = proto_tree_add_subtree(h265_tree, tvb, offset, 2, ett_h265_nal, NULL, "FU identifier");
+ else
+ h265_nal_tree = proto_tree_add_subtree(h265_tree, tvb, offset, 2, ett_h265_nal, NULL, "NAL unit header or first two bytes of the payload");
+
+ /* decode the HEVC payload header according to section 4:
+ 0 1
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ |F| Type | LayerId | TID |
+ +-------------+-----------------+
+ Forbidden zero (F): 1 bit
+ NAL unit type (Type): 6 bits
+ NUH layer ID (LayerId): 6 bits
+ NUH temporal ID plus 1 (TID): 3 bits
+ */
+
+ proto_tree_add_item(h265_nal_tree, hf_h265_nal_f_bit, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(h265_nal_tree, hf_h265_type, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(h265_nal_tree, hf_h265_nuh_layer_id, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(h265_nal_tree, hf_h265_nuh_temporal_id_plus1, tvb, offset, 2, ENC_BIG_ENDIAN);
+
+ offset++;
+ offset++;
+ if (type == 48) { // Aggregation Packets (APs)
+
+ }
+ else if (type == 49) { // Fragmentation Units
+ fua_tree = proto_tree_add_subtree(h265_tree, tvb, offset, 1, ett_h265_fu, NULL, "FU Header");
+ proto_tree_add_item(fua_tree, hf_h265_start_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(fua_tree, hf_h265_end_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(fua_tree, hf_h265_nal_unit_type, tvb, offset, 1, ENC_BIG_ENDIAN);
+ if ((tvb_get_guint8(tvb, offset) & 0x80) == 0x80) {
+ type = tvb_get_guint8(tvb, offset) & 0x1f;
+ col_append_fstr(pinfo->cinfo, COL_INFO, " Start:%s",
+ val_to_str(type, h265_type_summary_values, "Unknown Type (%u)"));
+ offset++;
+ }
+ else
+ {
+ if ((tvb_get_guint8(tvb, offset) & 0x40) == 0x40) {
+ col_append_fstr(pinfo->cinfo, COL_INFO, " End");
+ }
+ return offset;
+ }
+ }
+ else if (type == 50) { //PACI Packets
+
+ }
+
+ /* Unescape NAL unit */
+ rbsp_tvb = dissect_h265_unescap_nal_unit(tvb, pinfo, offset);
+
+ stream_tree = proto_tree_add_subtree(h265_tree, tvb, offset, -1, ett_h265_stream, NULL, "H265 NAL Unit Payload");
+ switch (type) {
+ case 0:
+ case 1: /* Coded slice segment of a non-TSA, non-STSA trailing picture */
+ case 2:
+ case 3: /* Coded slice segment of a TSA picture */
+ case 4:
+ case 5: /* Coded slice segment of an STSA picture */
+ case 6:
+ case 7: /* Coded slice segment of a RADL picture */
+ case 8:
+ case 9: /* Coded slice segment of a RASL picture */
+ dissect_h265_slice_segment_layer_rbsp(stream_tree, rbsp_tvb, pinfo, 0, type);
+ break;
+ case 10:
+ case 12:
+ case 14: /* Reserved non-IRAP SLNR VCL NAL unit types */
+ case 11:
+ case 13:
+ case 15: /* Reserved non-IRAP sub-layer reference VCL NAL unit types */
+ break;
+ case 16:
+ case 17:
+ case 18: /* Coded slice segment of a BLA picture */
+ case 19:
+ case 20: /* Coded slice segment of an IDR picture */
+ case 21: /* CRA_NUT - Coded slice segment of a CRA picture */
+ dissect_h265_slice_segment_layer_rbsp(stream_tree, rbsp_tvb, pinfo, 0, type);
+ break;
+ //case 22..31
+ case 32 : /* VPS_NUT - Video parameter set */
+ dissect_h265_video_parameter_set_rbsp(stream_tree, rbsp_tvb, pinfo, 0);
+ break;
+ case 33: /* SPS_NUT - Sequence parameter set*/
+ dissect_h265_seq_parameter_set_rbsp(stream_tree, rbsp_tvb, pinfo, 0);
+ break;
+ case 34: /* PPS_NUT - Picture parameter set */
+ dissect_h265_pic_parameter_set_rbsp(stream_tree, rbsp_tvb, pinfo, 0);
+ break;
+ case 35: /*AUD_NUT - Access unit delimiter*/
+ dissect_h265_access_unit_delimiter_rbsp(stream_tree, rbsp_tvb, pinfo, 0);
+ break;
+ case 36: /*EOS_NUT - End of sequence*/
+ dissect_h265_end_of_seq_rbsp(stream_tree, rbsp_tvb, pinfo, 0);
+ break;
+ case 37: /*EOB_NUT - End of bitstream*/
+ dissect_h265_end_of_bitstream_rbsp(stream_tree, rbsp_tvb, pinfo, 0);
+ break;
+ case 38: /*FD_NUT - Filler data*/
+ dissect_h265_filler_data_rbsp(stream_tree, rbsp_tvb, pinfo, 0);
+ break;
+ case 39: /*PREFIX_SEI_NUT - Supplemental enhancement information*/
+ case 40: /*SUFFIX_SEI_NUT - Supplemental enhancement information*/
+ dissect_h265_sei_rbsp(stream_tree, rbsp_tvb, pinfo, 0, type);
+ break;
+
+ case 49: /* FU - Fragmentation Units */
+ break;
+ case 50: /* PACI - PACI Packets */
+ break;
+ }
+ } /* if (tree) */
+ return tvb_captured_length(tvb);
+}
+
+/* Annex B "Byte stream format" */
+static int
+dissect_h265_bytestream(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ tvbuff_t *next_tvb; //, *rbsp_tvb;
+ gint offset = 0, end_offset;
+ guint32 dword;
+
+ /* Look for the first start word. Assume byte aligned. */
+ while (1) {
+ if (tvb_reported_length(tvb) < 4) {
+ return 0;
+ }
+ dword = tvb_get_guint32(tvb, offset, ENC_BIG_ENDIAN);
+ if ((dword >> 8) == 1 || dword == 1) {
+ break;
+ } else if (dword != 0) {
+ return 0;
+ }
+ offset += 2;
+ }
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "H.265");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ while (tvb_reported_length_remaining(tvb, offset)) {
+ dword = tvb_get_guint32(tvb, offset, ENC_BIG_ENDIAN);
+ if ((dword >> 8) != 1) {
+ /* zero_byte */
+ offset++;
+ }
+ /* start_code_prefix_one_3bytes */
+ offset += 3;
+ gint nal_length = tvb_reported_length_remaining(tvb, offset);
+ /* Search for \0\0\1 or \0\0\0\1 */
+ end_offset = tvb_find_guint16(tvb, offset, -1, 0);
+ while (end_offset != -1) {
+ if (tvb_find_guint16(tvb, end_offset + 1, 3, 1) != -1) {
+ nal_length = end_offset - offset;
+ break;
+ }
+ end_offset = tvb_find_guint16(tvb, end_offset + 1, -1, 0);
+ }
+
+ /* If end_offset is -1, we got to the end; assume this is the
+ * end of the NAL. Handling NALs split across lower level
+ * packets requires something like epan/stream.h
+ */
+
+ next_tvb = tvb_new_subset_length(tvb, offset, nal_length);
+
+ dissect_h265(next_tvb, pinfo, tree, data);
+ offset += nal_length;
+ }
+ return tvb_reported_length(tvb);
+}
+
+void
+proto_register_h265(void)
+{
+ module_t *h265_module;
+ expert_module_t* expert_h265;
+
+ /* Setup list of header fields See Section 1.6.1 for details*/
+ static hf_register_info hf[] = {
+ { &hf_h265_nal_f_bit,
+ { "F bit", "h265.f",
+ FT_BOOLEAN, 16, TFS(&h265_f_bit_vals), 0x8000,
+ NULL, HFILL }
+ },
+ { &hf_h265_type,
+ { "Type", "h265.nal_unit_type",
+ FT_UINT16, BASE_DEC, VALS(h265_type_values), 0x7E00,
+ NULL, HFILL }
+ },
+ { &hf_h265_nuh_layer_id,
+ { "LayerId", "h265.layer_id",
+ FT_UINT16, BASE_DEC, NULL, 0x01F8,
+ NULL, HFILL }
+ },
+ { &hf_h265_nuh_temporal_id_plus1,
+ { "TID", "h265.temporal_id",
+ FT_UINT16, BASE_DEC, NULL, 0x0007,
+ NULL, HFILL }
+ },
+ { &hf_h265_start_bit,
+ { "Start bit", "h265.start.bit",
+ FT_BOOLEAN, 8, TFS(&h265_start_bit_vals), 0x80,
+ NULL, HFILL }
+ },
+ { &hf_h265_end_bit,
+ { "End bit", "h265.end.bit",
+ FT_BOOLEAN, 8, TFS(&h265_end_bit_vals), 0x40,
+ NULL, HFILL }
+ },
+ { &hf_h265_nal_unit_type,
+ { "Nal_unit_type", "h265.nal_unit_type",
+ FT_UINT8, BASE_DEC, VALS(h265_type_values), 0x1f,
+ NULL, HFILL }
+ },
+ { &hf_h265_rbsp_stop_bit,
+ { "rbsp_stop_bit", "h265.rbsp_stop_bit",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_rbsp_trailing_bits,
+ { "rbsp_trailing_bits", "h265.rbsp_trailing_bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /*VPS*/
+ { &hf_h265_vps_video_parameter_set_id,
+ { "vps_video_parameter_set_id", "h265.vps_video_parameter_set_id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_base_layer_internal_flag,
+ { "vps_base_layer_internal_flag", "h265.vps_base_layer_internal_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_base_layer_available_flag,
+ { "vps_base_layer_available_flag", "h265.vps_base_layer_available_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_max_layers_minus1,
+ { "vps_max_layers_minus1", "h265.vps_max_layers_minus1",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_max_sub_layers_minus1,
+ { "vps_max_sub_layers_minus1", "h265.vps_max_sub_layers_minus1",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_temporal_id_nesting_flag,
+ { "vps_temporal_id_nesting_flag", "h265.vps_temporal_id_nesting_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_reserved_0xffff_16bits,
+ { "vps_reserved_0xffff_16bits", "h265.vps_reserved_0xffff_16bits",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /* profile, level and tier*/
+ { &hf_h265_general_profile_space,
+ { "general_profile_space", "h265.general_profile_space",
+ FT_UINT8, BASE_DEC, NULL, 0xC0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_tier_flag,
+ { "general_tier_flag", "h265.general_tier_flag",
+ FT_BOOLEAN, 8, NULL, 0x20,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_profile_idc,
+ { "general_profile_idc", "h265.general_profile_idc",
+ FT_UINT8, BASE_DEC, VALS(h265_profile_idc_values), 0x1F,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_profile_compatibility_flags,
+ { "general_profile_compatibility_flags", "h265.general_profile_compatibility_flags",
+ FT_UINT32, BASE_HEX, NULL, 0xFFFFFFFF,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_progressive_source_flag,
+ { "general_progressive_source_flag", "h265.general_progressive_source_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_interlaced_source_flag,
+ { "general_interlaced_source_flag", "h265.general_interlaced_source_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_non_packed_constraint_flag,
+ { "general_non_packed_constraint_flag", "h265.general_non_packed_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_frame_only_constraint_flag,
+ { "general_frame_only_constraint_flag", "h265.general_frame_only_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_max_12bit_constraint_flag,
+ { "general_max_12bit_constraint_flag", "h265.general_max_12bit_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_max_10bit_constraint_flag,
+ { "general_max_10bit_constraint_flag", "h265.general_max_10bit_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_max_8bit_constraint_flag,
+ { "general_max_8bit_constraint_flag", "h265.general_max_8bit_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_max_422chroma_constraint_flag,
+ { "general_max_422chroma_constraint_flag", "h265.general_max_422chroma_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_max_420chroma_constraint_flag,
+ { "general_max_420chroma_constraint_flag", "h265.general_max_420chroma_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_max_monochrome_constraint_flag,
+ { "general_max_monochrome_constraint_flag", "h265.general_max_monochrome_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_intra_constraint_flag,
+ { "general_intra_constraint_flag", "h265.general_intra_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_one_picture_only_constraint_flag,
+ { "general_one_picture_only_constraint_flag", "h265.general_one_picture_only_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_lower_bit_rate_constraint_flag,
+ { "general_lower_bit_rate_constraint_flag", "h265.general_lower_bit_rate_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_max_14bit_constraint_flag,
+ { "general_max_14bit_constraint_flag", "h265.general_max_14bit_constraint_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_reserved_zero_33bits,
+ { "general_reserved_zero_33bits", "h265.general_reserved_zero_33bits",
+ FT_UINT40, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_reserved_zero_34bits,
+ { "general_reserved_zero_34bits", "h265.general_reserved_zero_34bits",
+ FT_UINT40, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_reserved_zero_7bits,
+ { "general_reserved_zero_7bits", "h265.general_reserved_zero_7bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_reserved_zero_35bits,
+ { "general_reserved_zero_35bits", "h265.general_reserved_zero_35bits",
+ FT_UINT40, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_reserved_zero_43bits,
+ { "general_reserved_zero_43bits", "h265.general_reserved_zero_43bits",
+ FT_UINT48, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_inbld_flag,
+ { "general_inbld_flag", "h265.general_inbld_flag",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_reserved_zero_bit,
+ { "general_reserved_zero_bit", "h265.general_reserved_zero_bit",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_general_level_idc,
+ { "general_level_idc", "h265.general_level_idc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_profile_present_flag/*[i]*/,
+ { "sub_layer_profile_present_flag", "h265.sub_layer_profile_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_level_present_flag/*[i]*/,
+ { "sub_layer_level_present_flag", "h265.sub_layer_level_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_reserved_zero_2bits/*[i]*/,
+ { "reserved_zero_2bits", "h265.reserved_zero_2bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_profile_space/*[i]*/,
+ { "sub_layer_profile_space", "h265.sub_layer_profile_space",
+ FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_tier_flag/*[i]*/,
+ { "sub_layer_tier_flag", "h265.sub_layer_tier_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x04,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_profile_idc/*[i]*/,
+ { "sub_layer_profile_idc", "h265.sub_layer_profile_idc",
+ FT_UINT8, BASE_DEC, NULL, 0xF8,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_profile_compatibility_flag/*[i][j]*/,
+ { "sub_layer_profile_compatibility_flag", "h265.sub_layer_profile_compatibility_flag",
+ FT_UINT32, BASE_DEC, NULL, 0xFF,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_progressive_source_flag/*[i]*/,
+ { "sub_layer_progressive_source_flag", "h265.sub_layer_progressive_source_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+
+ { &hf_h265_sub_layer_interlaced_source_flag/*[i]*/,
+ { "sub_layer_interlaced_source_flag", "h265.sub_layer_interlaced_source_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_non_packed_constraint_flag/*[i]*/,
+ { "sub_layer_non_packed_constraint_flag", "h265.sub_layer_non_packed_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_frame_only_constraint_flag/*[i]*/,
+ { "sub_layer_frame_only_constraint_flag", "h265.sub_layer_frame_only_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_max_12bit_constraint_flag/*[i]*/,
+ { "sub_layer_max_12bit_constraint_flag", "h265.sub_layer_max_12bit_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_max_10bit_constraint_flag/*[i]*/,
+ { "sub_layer_max_10bit_constraint_flag", "h265.sub_layer_max_10bit_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_max_8bit_constraint_flag/*[i]*/,
+ { "sub_layer_max_8bit_constraint_flag", "h265.sub_layer_max_8bit_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_max_422chroma_constraint_flag/*[i]*/,
+ { "sub_layer_max_422chroma_constraint_flag", "h265.sub_layer_max_422chroma_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_max_420chroma_constraint_flag/*[i]*/,
+ { "sub_layer_max_420chroma_constraint_flag", "h265.sub_layer_max_420chroma_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_max_monochrome_constraint_flag/*[i]*/,
+ { "sub_layer_max_monochrome_constraint_flag", "h265.sub_layer_max_monochrome_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_intra_constraint_flag/*[i]*/,
+ { "sub_layer_intra_constraint_flag", "h265.sub_layer_intra_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_one_picture_only_constraint_flag/*[i]*/,
+ { "sub_layer_one_picture_only_constraint_flag", "h265.sub_layer_one_picture_only_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_lower_bit_rate_constraint_flag/*[i]*/,
+ { "sub_layer_lower_bit_rate_constraint_flag", "h265.sub_layer_lower_bit_rate_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_max_14bit_constraint_flag/*[i]*/,
+ { "sub_layer_max_14bit_constraint_flag", "h265.sub_layer_max_14bit_constraint_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_reserved_zero_33bits/*[i]*/,
+ { "sub_layer_reserved_zero_33bits", "h265.sub_layer_reserved_zero_33bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_reserved_zero_34bits/*[i]*/,
+ { "sub_layer_reserved_zero_34bits", "h265.sub_layer_reserved_zero_34bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_reserved_zero_7bits/*[i]*/,
+ { "sub_layer_reserved_zero_7bits", "h265.sub_layer_reserved_zero_7bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_reserved_zero_35bits/*[i]*/,
+ { "sub_layer_reserved_zero_35bits", "h265.sub_layer_reserved_zero_35bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_reserved_zero_43bits/*[i]*/,
+ { "sub_layer_reserved_zero_43bits", "h265.sub_layer_reserved_zero_43bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_inbld_flag/*[i]*/,
+ { "sub_layer_inbld_flag", "h265.sub_layer_inbld_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_reserved_zero_bit/*[i]*/,
+ { "sub_layer_reserved_zero_bit", "h265.sub_layer_reserved_zero_bit",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_layer_level_idc/*[i]*/,
+ { "sub_layer_level_idc", "h265.sub_layer_level_idc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_sub_layer_ordering_info_present_flag,
+ { "vps_sub_layer_ordering_info_present_flag", "h265.vps_sub_layer_ordering_info_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_max_dec_pic_buffering_minus1/*[i]*/,
+ { "vps_max_dec_pic_buffering_minus1", "h265.vps_max_dec_pic_buffering_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_max_num_reorder_pics/*[i]*/,
+ { "vps_max_num_reorder_pics", "h265.vps_max_num_reorder_pics",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_max_latency_increase_plus1/*[i]*/,
+ { "vps_max_latency_increase_plus1", "h265.vps_max_latency_increase_plus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_max_layer_id,
+ { "vps_max_layer_id", "h265.vps_max_layer_id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_num_layer_sets_minus1,
+ { "vps_num_layer_sets_minus1", "h265.vps_num_layer_sets_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_layer_id_included_flag/*[i][j]*/,
+ { "layer_id_included_flag", "h265.layer_id_included_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_timing_info_present_flag,
+ { "vps_timing_info_present_flag", "h265.vps_timing_info_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_num_units_in_tick,
+ { "vps_num_units_in_tick", "h265.vps_num_units_in_tick",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_time_scale,
+ { "vps_time_scale", "h265.vps_time_scale",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_poc_proportional_to_timing_flag,
+ { "vps_poc_proportional_to_timing_flag", "h265.vps_poc_proportional_to_timing_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_num_ticks_poc_diff_one_minus1,
+ { "vps_num_ticks_poc_diff_one_minus1", "h265.vps_num_ticks_poc_diff_one_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_num_hrd_parameters,
+ { "vps_num_hrd_parameters", "h265.vps_num_hrd_parameters",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_hrd_layer_set_idx/*[i]*/,
+ { "hrd_layer_set_idx", "h265.hrd_layer_set_idx",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cprms_present_flag/*[i]*/,
+ { "cprms_present_flag", "h265.cprms_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_extension_flag,
+ { "vps_extension_flag", "h265.vps_extension_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vps_extension_data_flag,
+ { "vps_extension_data_flag", "h265.vps_extension_data_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /*hrd_parameters*/
+ { &hf_h265_nal_hrd_parameters_present_flag,
+ { "nal_hrd_parameters_present_flag", "h265.nal_hrd_parameters_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vcl_hrd_parameters_present_flag,
+ { "vcl_hrd_parameters_present_flag", "h265.vcl_hrd_parameters_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_pic_hrd_params_present_flag,
+ { "sub_pic_hrd_params_present_flag", "h265.sub_pic_hrd_params_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_tick_divisor_minus2,
+ { "tick_divisor_minus2", "h265.tick_divisor_minus2",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_du_cpb_removal_delay_increment_length_minus1,
+ { "du_cpb_removal_delay_increment_length_minus1", "h265.du_cpb_removal_delay_increment_length_minus1",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sub_pic_cpb_params_in_pic_timing_sei_flag,
+ { "sub_pic_cpb_params_in_pic_timing_sei_flag", "h265.sub_pic_cpb_params_in_pic_timing_sei_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_dpb_output_delay_du_length_minus1,
+ { "dpb_output_delay_du_length_minus1", "h265.dpb_output_delay_du_length_minus1",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_bit_rate_scale,
+ { "bit_rate_scale", "h265.bit_rate_scale",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cpb_size_scale,
+ { "cpb_size_scale", "h265.cpb_size_scale",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cpb_size_du_scale,
+ { "cpb_size_du_scale", "h265.cpb_size_du_scale",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_initial_cpb_removal_delay_length_minus1,
+ { "initial_cpb_removal_delay_length_minus1", "h265.initial_cpb_removal_delay_length_minus1",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_au_cpb_removal_delay_length_minus1,
+ { "au_cpb_removal_delay_length_minus1", "h265.au_cpb_removal_delay_length_minus1",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_dpb_output_delay_length_minus1,
+ { "dpb_output_delay_length_minus1", "h265.dpb_output_delay_length_minus1",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_fixed_pic_rate_general_flag/*[i]*/,
+ { "fixed_pic_rate_general_flag", "h265.fixed_pic_rate_general_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_fixed_pic_rate_within_cvs_flag/*[i]*/,
+ { "fixed_pic_rate_within_cvs_flag", "h265.fixed_pic_rate_within_cvs_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_elemental_duration_in_tc_minus1/*[i]*/,
+ { "elemental_duration_in_tc_minus1", "h265.elemental_duration_in_tc_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_low_delay_hrd_flag/*[i]*/,
+ { "low_delay_hrd_flag", "h265.low_delay_hrd_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cpb_cnt_minus1/*[i]*/,
+ { "cpb_cnt_minus1", "h265.cpb_cnt_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /*sub_layer_hrd_parameters*/
+ { &hf_h265_bit_rate_value_minus1/*[i]*/,
+ { "bit_rate_value_minus1", "h265.bit_rate_value_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cpb_size_value_minus1/*[i]*/,
+ { "cpb_size_value_minus1", "h265.cpb_size_value_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cpb_size_du_value_minus1/*[i]*/,
+ { "cpb_size_du_value_minus1", "h265.cpb_size_du_value_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_bit_rate_du_value_minus1/*[i]*/,
+ { "bit_rate_du_value_minus1", "h265.bit_rate_du_value_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cbr_flag/*[i]*/,
+ { "cbr_flag", "h265.cbr_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /*SPS*/
+ { &hf_h265_sps_video_parameter_set_id,
+ { "sps_video_parameter_set_id", "h265.sps_video_parameter_set_id",
+ FT_UINT8, BASE_DEC, NULL, 0xF0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_max_sub_layers_minus1,
+ { "sps_max_sub_layers_minus1", "h265.sps_max_sub_layers_minus1",
+ FT_UINT8, BASE_DEC, NULL, 0x0E,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_temporal_id_nesting_flag,
+ { "sps_temporal_id_nesting_flag", "h265.sps_temporal_id_nesting_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_seq_parameter_set_id,
+ { "sps_seq_parameter_set_id", "h265.sps_seq_parameter_set_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_chroma_format_idc,
+ { "chroma_format_idc", "h265.chroma_format_idc",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_separate_colour_plane_flag,
+ { "separate_colour_plane_flag", "h265.separate_colour_plane_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pic_width_in_luma_samples,
+ { "pic_width_in_luma_samples", "h265.pic_width_in_luma_samples",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pic_height_in_luma_samples,
+ { "pic_height_in_luma_samples", "h265.pic_height_in_luma_samples",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_conformance_window_flag,
+ { "conformance_window_flag", "h265.conformance_window_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_conf_win_left_offset,
+ { "conf_win_left_offset", "h265.conf_win_left_offset",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_conf_win_right_offset,
+ { "conf_win_right_offset", "h265.conf_win_right_offset",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_conf_win_top_offset,
+ { "conf_win_top_offset", "h265.conf_win_top_offset",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_conf_win_bottom_offset,
+ { "conf_win_bottom_offset", "h265.conf_win_bottom_offset",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_bit_depth_luma_minus8,
+ { "bit_depth_luma_minus8", "h265.bit_depth_luma_minus8",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_bit_depth_chroma_minus8,
+ { "bit_depth_chroma_minus8", "h265.bit_depth_chroma_minus8",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_max_pic_order_cnt_lsb_minus4,
+ { "log2_max_pic_order_cnt_lsb_minus4", "h265.log2_max_pic_order_cnt_lsb_minus4",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_sub_layer_ordering_info_present_flag,
+ { "sps_sub_layer_ordering_info_present_flag", "h265.sps_sub_layer_ordering_info_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_max_dec_pic_buffering_minus1/*[i]*/,
+ { "sps_max_dec_pic_buffering_minus1", "h265.sps_max_dec_pic_buffering_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_max_num_reorder_pics/*[i]*/,
+ { "sps_max_num_reorder_pics", "h265.sps_max_num_reorder_pics",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_max_latency_increase_plus1/*[i]*/,
+ { "sps_max_latency_increase_plus1", "h265.sps_max_latency_increase_plus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_min_luma_coding_block_size_minus3,
+ { "log2_min_luma_coding_block_size_minus3", "h265.log2_min_luma_coding_block_size_minus3",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_diff_max_min_luma_coding_block_size,
+ { "log2_diff_max_min_luma_coding_block_size", "h265.log2_diff_max_min_luma_coding_block_size",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_min_luma_transform_block_size_minus2,
+ { "log2_min_luma_transform_block_size_minus2", "h265.log2_min_luma_transform_block_size_minus2",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_diff_max_min_luma_transform_block_size,
+ { "log2_diff_max_min_luma_transform_block_size", "h265.log2_diff_max_min_luma_transform_block_size",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_max_transform_hierarchy_depth_inter,
+ { "max_transform_hierarchy_depth_inter", "h265.max_transform_hierarchy_depth_inter",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_max_transform_hierarchy_depth_intra,
+ { "max_transform_hierarchy_depth_intra", "h265.max_transform_hierarchy_depth_intra",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_scaling_list_enabled_flag,
+ { "scaling_list_enabled_flag", "h265.scaling_list_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_scaling_list_data_present_flag,
+ { "sps_scaling_list_data_present_flag", "h265.sps_scaling_list_data_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_amp_enabled_flag,
+ { "amp_enabled_flag", "h265.amp_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sample_adaptive_offset_enabled_flag,
+ { "sample_adaptive_offset_enabled_flag", "h265.sample_adaptive_offset_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pcm_enabled_flag,
+ { "pcm_enabled_flag", "h265.pcm_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pcm_sample_bit_depth_luma_minus1,
+ { "pcm_sample_bit_depth_luma_minus1", "h265.pcm_sample_bit_depth_luma_minus1",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pcm_sample_bit_depth_chroma_minus1,
+ { "pcm_sample_bit_depth_chroma_minus1", "h265.pcm_sample_bit_depth_chroma_minus1",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_min_pcm_luma_coding_block_size_minus3,
+ { "log2_min_pcm_luma_coding_block_size_minus3", "h265.log2_min_pcm_luma_coding_block_size_minus3",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_diff_max_min_pcm_luma_coding_block_size,
+ { "log2_diff_max_min_pcm_luma_coding_block_size", "h265.log2_diff_max_min_pcm_luma_coding_block_size",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pcm_loop_filter_disabled_flag,
+ { "pcm_loop_filter_disabled_flag", "h265.pcm_loop_filter_disabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_num_short_term_ref_pic_sets,
+ { "num_short_term_ref_pic_sets", "h265.num_short_term_ref_pic_sets",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_long_term_ref_pics_present_flag,
+ { "long_term_ref_pics_present_flag", "h265.long_term_ref_pics_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_num_long_term_ref_pics_sps,
+ { "num_long_term_ref_pics_sps", "h265.num_long_term_ref_pics_sps",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_lt_ref_pic_poc_lsb_sps/*[i]*/,
+ { "lt_ref_pic_poc_lsb_sps", "h265.lt_ref_pic_poc_lsb_sps",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_used_by_curr_pic_lt_sps_flag/*[i]*/,
+ { "used_by_curr_pic_lt_sps_flag", "h265.used_by_curr_pic_lt_sps_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_temporal_mvp_enabled_flag,
+ { "sps_temporal_mvp_enabled_flag", "h265.sps_temporal_mvp_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_strong_intra_smoothing_enabled_flag,
+ { "strong_intra_smoothing_enabled_flag", "h265.strong_intra_smoothing_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vui_parameters_present_flag,
+ { "vui_parameters_present_flag", "h265.vui_parameters_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_extension_present_flag,
+ { "sps_extension_present_flag", "h265.sps_extension_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_range_extension_flag,
+ { "sps_range_extension_flag", "h265.sps_range_extension_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_multilayer_extension_flag,
+ { "sps_multilayer_extension_flag", "h265.sps_multilayer_extension_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_3d_extension_flag,
+ { "sps_3d_extension_flag", "h265.sps_3d_extension_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_scc_extension_flag,
+ { "sps_scc_extension_flag", "h265.sps_scc_extension_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_extension_4bits,
+ { "sps_extension_4bits", "h265.sps_extension_4bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_extension_data_flag,
+ { "sps_extension_data_flag", "h265.sps_extension_data_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /* scaling_list_data */
+ { &hf_h265_scaling_list_pred_mode_flag/*[sizeId][matrixId]*/,
+ { "scaling_list_pred_mode_flag", "h265.scaling_list_pred_mode_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_scaling_list_pred_matrix_id_delta/*[sizeId][matrixId]*/,
+ { "scaling_list_pred_matrix_id_delta", "h265.scaling_list_pred_matrix_id_delta",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_scaling_list_dc_coef_minus8/*[sizeId - 2][matrixId]*/,
+ { "scaling_list_dc_coef_minus8", "h265.scaling_list_dc_coef_minus8",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_scaling_list_delta_coef,
+ { "scaling_list_delta_coef", "h265.scaling_list_delta_coef",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /*st_ref_pic_set*/
+ { &hf_h265_inter_ref_pic_set_prediction_flag,
+ { "inter_ref_pic_set_prediction_flag", "h265.inter_ref_pic_set_prediction_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_delta_idx_minus1,
+ { "delta_idx_minus1", "h265.delta_idx_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_delta_rps_sign,
+ { "delta_rps_sign", "h265.delta_rps_sign",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_abs_delta_rps_minus1,
+ { "abs_delta_rps_minus1", "h265.abs_delta_rps_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_used_by_curr_pic_flag/*[j]*/,
+ { "used_by_curr_pic_flag", "h265.used_by_curr_pic_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_use_delta_flag/*[j]*/,
+ { "use_delta_flag", "h265.use_delta_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_num_negative_pics,
+ { "num_negative_pics", "h265.num_negative_pics",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_num_positive_pics,
+ { "num_positive_pics", "h265.num_positive_pics",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_delta_poc_s0_minus1/*[i]*/,
+ { "delta_poc_s0_minus1", "h265.delta_poc_s0_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_used_by_curr_pic_s0_flag/*[i]*/,
+ { "used_by_curr_pic_s0_flag", "h265.used_by_curr_pic_s0_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_delta_poc_s1_minus1/*[i]*/,
+ { "delta_poc_s1_minus1", "h265.delta_poc_s1_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_used_by_curr_pic_s1_flag/*[i]*/,
+ { "used_by_curr_pic_s1_flag", "h265.used_by_curr_pic_s1_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /*vui*/
+ { &hf_h265_aspect_ratio_info_present_flag,
+ { "aspect_ratio_info_present_flag", "h265.aspect_ratio_info_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_aspect_ratio_idc,
+ { "aspect_ratio_idc", "h265.aspect_ratio_idc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sar_width,
+ { "sar_width", "h265.sar_width",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sar_height,
+ { "sar_height", "h265.sar_height",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_overscan_info_present_flag,
+ { "overscan_info_present_flag", "h265.overscan_info_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_overscan_appropriate_flag,
+ { "overscan_appropriate_flag", "h265.overscan_appropriate_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_video_signal_type_present_flag,
+ { "video_signal_type_present_flag", "h265.video_signal_type_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_video_format,
+ { "video_format", "h265.video_format",
+ FT_UINT8, BASE_DEC, VALS(h265_video_format_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_video_full_range_flag,
+ { "video_full_range_flag", "h265.video_full_range_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_colour_description_present_flag,
+ { "colour_description_present_flag", "h265.colour_description_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_colour_primaries,
+ { "colour_primaries", "h265.colour_primaries",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_transfer_characteristics,
+ { "transfer_characteristics", "h265.transfer_characteristics",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_matrix_coeffs,
+ { "matrix_coefficients", "h265.matrix_coefficients",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_chroma_loc_info_present_flag,
+ { "chroma_loc_info_present_flag", "h265.chroma_loc_info_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_chroma_sample_loc_type_top_field,
+ { "chroma_sample_loc_type_top_field", "h265.chroma_sample_loc_type_top_field",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_chroma_sample_loc_type_bottom_field,
+ { "chroma_sample_loc_type_bottom_field", "h265.chroma_sample_loc_type_bottom_field",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_neutral_chroma_indication_flag,
+ { "neutral_chroma_indication_flag", "h265.neutral_chroma_indication_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ }, { &hf_h265_field_seq_flag,
+ { "field_seq_flag", "h265.field_seq_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ }, { &hf_h265_frame_field_info_present_flag,
+ { "frame_field_info_present_flag", "h265.frame_field_info_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ }, { &hf_h265_default_display_window_flag,
+ { "default_display_window_flag", "h265.default_display_window_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_def_disp_win_left_offset,
+ { "def_disp_win_left_offset", "h265.def_disp_win_left_offset",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_def_disp_win_right_offset,
+ { "def_disp_win_right_offset", "h265.def_disp_win_right_offset",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_def_disp_win_top_offset,
+ { "def_disp_win_top_offset", "h265.def_disp_win_top_offset",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_def_disp_win_bottom_offset,
+ { "def_disp_win_bottom_offset", "h265.def_disp_win_bottom_offset",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vui_timing_info_present_flag,
+ { "vui_timing_info_present_flag", "h265.vui_timing_info_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vui_num_units_in_tick,
+ { "vui_num_units_in_tick", "h265.vui_num_units_in_tick",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vui_time_scale,
+ { "vui_time_scale", "h265.vui_time_scale",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vui_poc_proportional_to_timing_flag,
+ { "vui_poc_proportional_to_timing_flag", "h265.vui_poc_proportional_to_timing_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vui_num_ticks_poc_diff_one_minus1,
+ { "vui_num_ticks_poc_diff_one_minus1", "h265.vui_num_ticks_poc_diff_one_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_vui_hrd_parameters_present_flag,
+ { "vui_hrd_parameters_present_flag", "h265.vui_hrd_parameters_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_bitstream_restriction_flag,
+ { "bitstream_restriction_flag", "h265.bitstream_restriction_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_tiles_fixed_structure_flag,
+ { "tiles_fixed_structure_flag", "h265.tiles_fixed_structure_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_motion_vectors_over_pic_boundaries_flag,
+ { "motion_vectors_over_pic_boundaries_flag", "h265.motion_vectors_over_pic_boundaries_flag",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_restricted_ref_pic_lists_flag,
+ { "restricted_ref_pic_lists_flag", "h265.restricted_ref_pic_lists_flag",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_min_spatial_segmentation_idc,
+ { "min_spatial_segmentation_idc", "h265.min_spatial_segmentation_idc",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_max_bytes_per_pic_denom,
+ { "max_bytes_per_pic_denom", "h265.max_bytes_per_pic_denom",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_max_bits_per_min_cu_denom,
+ { "max_bits_per_mb_denom", "h265.max_bits_per_mb_denom",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_max_mv_length_horizontal,
+ { "max_mv_length_horizontal", "h265.max_mv_length_horizontal",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_max_mv_length_vertical,
+ { "log2_max_mv_length_vertical", "h265.log2_max_mv_length_vertical",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /* sps_range_extension */
+ { &hf_h265_transform_skip_rotation_enabled_flag,
+ { "transform_skip_rotation_enabled_flag", "h265.transform_skip_rotation_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_transform_skip_context_enabled_flag,
+ { "transform_skip_context_enabled_flag", "h265.transform_skip_context_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_implicit_rdpcm_enabled_flag,
+ { "implicit_rdpcm_enabled_flag", "h265.implicit_rdpcm_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_explicit_rdpcm_enabled_flag,
+ { "explicit_rdpcm_enabled_flag", "h265.explicit_rdpcm_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_extended_precision_processing_flag,
+ { "extended_precision_processing_flag", "h265.extended_precision_processing_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_intra_smoothing_disabled_flag,
+ { "intra_smoothing_disabled_flag", "h265.intra_smoothing_disabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_high_precision_offsets_enabled_flag,
+ { "high_precision_offsets_enabled_flag", "h265.high_precision_offsets_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_persistent_rice_adaptation_enabled_flag,
+ { "persistent_rice_adaptation_enabled_flag", "h265.persistent_rice_adaptation_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cabac_bypass_alignment_enabled_flag,
+ { "cabac_bypass_alignment_enabled_flag", "h265.cabac_bypass_alignment_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /* sps_scc_extension */
+ { &hf_h265_sps_curr_pic_ref_enabled_flag,
+ { "sps_curr_pic_ref_enabled_flag", "h265.sps_curr_pic_ref_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_palette_mode_enabled_flag,
+ { "palette_mode_enabled_flag", "h265.palette_mode_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_palette_max_size,
+ { "palette_max_size", "h265.palette_max_size",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_delta_palette_max_predictor_size,
+ { "delta_palette_max_predictor_size", "h265.delta_palette_max_predictor_size",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_palette_predictor_initializers_present_flag,
+ { "sps_palette_predictor_initializers_present_flag", "h265.sps_palette_predictor_initializers_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_num_palette_predictor_initializers_minus1,
+ { "sps_num_palette_predictor_initializers_minus1", "h265.sps_num_palette_predictor_initializers_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sps_palette_predictor_initializer/*[comp][i]*/,
+ { "sps_palette_predictor_initializer", "h265.sps_palette_predictor_initializer",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_motion_vector_resolution_control_idc,
+ { "motion_vector_resolution_control_idc", "h265.motion_vector_resolution_control_idc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_intra_boundary_filtering_disabled_flag,
+ { "intra_boundary_filtering_disabled_flag", "h265.intra_boundary_filtering_disabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /* PPS */
+ { &hf_h265_pps_pic_parameter_set_id,
+ { "pps_pic_parameter_set_id", "h265.pps_pic_parameter_set_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_seq_parameter_set_id,
+ { "pps_seq_parameter_set_id", "h265.pps_seq_parameter_set_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_dependent_slice_segments_enabled_flag,
+ { "dependent_slice_segments_enabled_flag", "h265.dependent_slice_segments_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_output_flag_present_flag,
+ { "output_flag_present_flag", "h265.output_flag_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_num_extra_slice_header_bits,
+ { "num_extra_slice_header_bits", "h265.num_extra_slice_header_bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sign_data_hiding_enabled_flag,
+ { "sign_data_hiding_enabled_flag", "h265.sign_data_hiding_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cabac_init_present_flag,
+ { "cabac_init_present_flag", "h265.cabac_init_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_num_ref_idx_l0_default_active_minus1,
+ { "num_ref_idx_l0_default_active_minus1", "h265.num_ref_idx_l0_default_active_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_num_ref_idx_l1_default_active_minus1,
+ { "num_ref_idx_l1_default_active_minus1", "h265.num_ref_idx_l1_default_active_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_init_qp_minus26,
+ { "init_qp_minus26", "h265.init_qp_minus26",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_constrained_intra_pred_flag,
+ { "constrained_intra_pred_flag", "h265.constrained_intra_pred_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_transform_skip_enabled_flag,
+ { "transform_skip_enabled_flag", "h265.transform_skip_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cu_qp_delta_enabled_flag,
+ { "cu_qp_delta_enabled_flag", "h265.cu_qp_delta_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_diff_cu_qp_delta_depth,
+ { "diff_cu_qp_delta_depth", "h265.diff_cu_qp_delta_depth",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_cb_qp_offset,
+ { "pps_cb_qp_offset", "h265.pps_cb_qp_offset",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_cr_qp_offset,
+ { "pps_cr_qp_offset", "h265.pps_cr_qp_offset",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_slice_chroma_qp_offsets_present_flag,
+ { "pps_slice_chroma_qp_offsets_present_flag", "h265.pps_slice_chroma_qp_offsets_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_weighted_pred_flag,
+ { "weighted_pred_flag", "h265.weighted_pred_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_weighted_bipred_flag,
+ { "weighted_bipred_flag", "h265.weighted_bipred_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_transquant_bypass_enabled_flag,
+ { "transquant_bypass_enabled_flag", "h265.transquant_bypass_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_tiles_enabled_flag,
+ { "tiles_enabled_flag", "h265.tiles_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_entropy_coding_sync_enabled_flag,
+ { "entropy_coding_sync_enabled_flag", "h265.entropy_coding_sync_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_num_tile_columns_minus1,
+ { "num_tile_columns_minus1", "h265.num_tile_columns_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_num_tile_rows_minus1,
+ { "num_tile_rows_minus1", "h265.num_tile_rows_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_uniform_spacing_flag,
+ { "uniform_spacing_flag", "h265.uniform_spacing_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_column_width_minus1/*[i]*/,
+ { "column_width_minus1", "h265.column_width_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_row_height_minus1/*[i]*/,
+ { "row_height_minus1", "h265.row_height_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_loop_filter_across_tiles_enabled_flag,
+ { "loop_filter_across_tiles_enabled_flag", "h265.loop_filter_across_tiles_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_loop_filter_across_slices_enabled_flag,
+ { "pps_loop_filter_across_slices_enabled_flag", "h265.pps_loop_filter_across_slices_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_deblocking_filter_control_present_flag,
+ { "deblocking_filter_control_present_flag", "h265.deblocking_filter_control_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_deblocking_filter_override_enabled_flag,
+ { "deblocking_filter_override_enabled_flag", "h265.deblocking_filter_override_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_deblocking_filter_disabled_flag,
+ { "pps_deblocking_filter_disabled_flag", "h265.pps_deblocking_filter_disabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_beta_offset_div2,
+ { "pps_beta_offset_div2", "h265.pps_beta_offset_div2",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_tc_offset_div2,
+ { "pps_tc_offset_div2", "h265.pps_tc_offset_div2",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_scaling_list_data_present_flag,
+ { "pps_scaling_list_data_present_flag", "h265.pps_scaling_list_data_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_lists_modification_present_flag,
+ { "lists_modification_present_flag", "h265.lists_modification_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_parallel_merge_level_minus2,
+ { "log2_parallel_merge_level_minus2", "h265.log2_parallel_merge_level_minus2",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_slice_segment_header_extension_present_flag,
+ { "slice_segment_header_extension_present_flag", "h265.slice_segment_header_extension_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_extension_present_flag,
+ { "pps_extension_present_flag", "h265.pps_extension_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_range_extension_flag,
+ { "pps_range_extension_flag", "h265.pps_range_extension_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_multilayer_extension_flag,
+ { "pps_multilayer_extension_flag", "h265.pps_multilayer_extension_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_3d_extension_flag,
+ { "pps_3d_extension_flag", "h265.pps_3d_extension_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_scc_extension_flag,
+ { "pps_scc_extension_flag", "h265.pps_scc_extension_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_extension_4bits,
+ { "pps_extension_4bits", "h265.pps_extension_4bits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_extension_data_flag,
+ { "pps_extension_data_flag", "h265.pps_extension_data_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+
+ { &hf_h265_log2_max_transform_skip_block_size_minus2,
+ { "log2_max_transform_skip_block_size_minus2", "h265.log2_max_transform_skip_block_size_minus2",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cross_component_prediction_enabled_flag,
+ { "cross_component_prediction_enabled_flag", "h265.cross_component_prediction_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_chroma_qp_offset_list_enabled_flag,
+ { "chroma_qp_offset_list_enabled_flag", "h265.chroma_qp_offset_list_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_diff_cu_chroma_qp_offset_depth,
+ { "diff_cu_chroma_qp_offset_depth", "h265.diff_cu_chroma_qp_offset_depth",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_chroma_qp_offset_list_len_minus1,
+ { "chroma_qp_offset_list_len_minus1", "h265.chroma_qp_offset_list_len_minus1",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cb_qp_offset_list/*[i]*/,
+ { "cb_qp_offset_list", "h265.cb_qp_offset_list",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_cr_qp_offset_list/*[i]*/,
+ { "cr_qp_offset_list", "h265.cr_qp_offset_list",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_sao_offset_scale_luma,
+ { "log2_sao_offset_scale_luma", "h265.log2_sao_offset_scale_luma",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_log2_sao_offset_scale_chroma,
+ { "log2_sao_offset_scale_chroma", "h265.log2_sao_offset_scale_chroma",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ /*pps_scc_extension*/
+ { &hf_h265_pps_curr_pic_ref_enabled_flag,
+ { "pps_curr_pic_ref_enabled_flag", "h265.pps_curr_pic_ref_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ }, { &hf_h265_residual_adaptive_colour_transform_enabled_flag,
+ { "residual_adaptive_colour_transform_enabled_flag", "h265.residual_adaptive_colour_transform_enabled_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_slice_act_qp_offsets_present_flag,
+ { "pps_slice_act_qp_offsets_present_flag", "h265.pps_slice_act_qp_offsets_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_act_y_qp_offset_plus5,
+ { "pps_act_y_qp_offset_plus5", "h265.pps_act_y_qp_offset_plus5",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_act_cb_qp_offset_plus5,
+ { "pps_act_cb_qp_offset_plus5", "h265.pps_act_cb_qp_offset_plus5",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_act_cr_qp_offset_plus3,
+ { "pps_act_cr_qp_offset_plus3", "h265.pps_act_cr_qp_offset_plus3",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_palette_predictor_initializers_present_flag,
+ { "pps_palette_predictor_initializers_present_flag", "h265.pps_palette_predictor_initializers_present_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_num_palette_predictor_initializers,
+ { "pps_num_palette_predictor_initializers", "h265.pps_num_palette_predictor_initializers",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_monochrome_palette_flag,
+ { "monochrome_palette_flag", "h265.monochrome_palette_flag",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_luma_bit_depth_entry_minus8,
+ { "luma_bit_depth_entry_minus8", "h265.luma_bit_depth_entry_minus8",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_chroma_bit_depth_entry_minus8,
+ { "chroma_bit_depth_entry_minus8", "h265.chroma_bit_depth_entry_minus8",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pps_palette_predictor_initializer/*[comp][i]*/,
+ { "pps_palette_predictor_initializer", "h265.pps_palette_predictor_initializer",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+
+ /*Slice*/
+ { &hf_h265_slice_pic_parameter_set_id,
+ { "slice_pic_parameter_set_id", "h265.slice_pic_parameter_set_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_slice_segment_address,
+ { "slice_segment_address", "h265.slice_segment_address",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_slice_type,
+ { "slice_type", "h265.slice_type",
+ FT_UINT32, BASE_DEC, VALS(h265_slice_type_vals), 0x0,
+ NULL, HFILL }
+ },
+ /* SEI */
+ { &hf_h265_payloadsize,
+ { "PayloadSize", "h265.payloadsize",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_payloadtype,
+ { "payloadType", "h265.payloadtype",
+ FT_UINT32, BASE_DEC, VALS(h265_sei_payload_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_pic_type,
+ { "pic_type", "h265.pic_type",
+ FT_UINT8, BASE_DEC, VALS(h265_pic_type_vals), 0x0,
+ "slice_type values that may be present in the coded picture", HFILL }
+ },
+ /* SDP parameters*/
+ { &hf_h265_sdp_parameter_sprop_vps,
+ { "sprop-vps", "h265.sdp.sprop_vps",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sdp_parameter_sprop_sps,
+ { "sprop-sps", "h265.sdp.sprop_sps",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_h265_sdp_parameter_sprop_pps,
+ { "sprop-pps", "h265.sdp.sprop_pps",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }
+ },
+
+ };
+
+ /* Setup protocol subtree array */
+ static gint *ett[] = {
+ &ett_h265,
+ &ett_h265_profile,
+ &ett_h265_nal,
+ &ett_h265_fu,
+ &ett_h265_stream,
+ &ett_h265_sps_multilayer_extension,
+ &ett_h265_sps_3d_extension,
+ &ett_h265_pps_multilayer_extension,
+ &ett_h265_pps_3d_extension,
+ &ett_h265_access_unit_delimiter_rbsp,
+ &ett_h265_sei_rbsp,
+ &ett_h265_filler_data_rbsp,
+ &ett_h265_end_of_seq_rbsp,
+ &ett_h265_end_of_bitstream_rbsp,
+ &ett_h265_profile_tier_level,
+ &ett_h265_ref_pic_set,
+ &ett_h265_vui_parameters,
+ &ett_h265_hrd_parameters,
+ &ett_h265_sprop_parameters
+ };
+
+ static ei_register_info ei[] = {
+ { &ei_h265_undecoded,{ "h265.undecoded", PI_UNDECODED, PI_WARN, "[Not decoded yet]", EXPFILL } },
+ { &ei_h265_oversized_exp_golomb_code, {"h265.oversized_exp_golomb_code", PI_MALFORMED, PI_ERROR, "Exponential Golomb encoded value greater than 32 bit integer, clamped", EXPFILL } },
+ { &ei_h265_value_to_large,{ "h265.value_to_large", PI_PROTOCOL, PI_ERROR, "[Value to large, protocol violation]", EXPFILL } },
+ { &ei_h265_format_specific_parameter,{ "h265.format_specific_parameter", PI_UNDECODED, PI_WARN, "[Unspecified media format specific parameter]", EXPFILL } },
+ };
+
+ /* Register the protocol name and description */
+ proto_h265 = proto_register_protocol("H.265", "H.265", "h265");
+
+ /* Required function calls to register the header fields and subtrees used */
+ proto_register_field_array(proto_h265, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+ expert_h265 = expert_register_protocol(proto_h265);
+ expert_register_field_array(expert_h265, ei, array_length(ei));
+ /* Register a configuration option for port */
+
+
+ h265_module = prefs_register_protocol(proto_h265, NULL);
+
+ prefs_register_obsolete_preference(h265_module, "dynamic.payload.type");
+
+ h265_handle = register_dissector("h265", dissect_h265, proto_h265);
+ register_dissector_with_description("h265_bytestream", "H.265 Annex B Byte stream format", dissect_h265_bytestream, proto_h265);
+}
+
+/* Register the protocol with Wireshark */
+void
+proto_reg_handoff_h265(void)
+{
+ dissector_add_string("rtp_dyn_payload_type", "H265", h265_handle);
+ dissector_add_uint_range_with_preference("rtp.pt", "", h265_handle);
+}
+
+/*
+* Editor modelines - https://www.wireshark.org/tools/modelines.html
+*
+* Local variables:
+* c-basic-offset: 4
+* tab-width: 8
+* indent-tabs-mode: nil
+* End:
+*
+* vi: set shiftwidth=4 tabstop=8 expandtab:
+* :indentSize=4:tabSize=8:noTabs=true:
+*/