diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
commit | e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch) | |
tree | 68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-h265.c | |
parent | Initial commit. (diff) | |
download | wireshark-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.c | 4779 |
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: +*/ |