wireshark/epan/dissectors/packet-h265.c

4698 lines
181 KiB
C

/* 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;
/* 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 }
};
/* 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)
{
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");
proto_tree_add_expert(access_unit_delimiter_rbsp_tree, pinfo, &ei_h265_undecoded, tvb, offset, -1);
}
/* 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, 1, ett_h265_nal, NULL, "FU identifier");
else
h265_nal_tree = proto_tree_add_subtree(h265_tree, tvb, offset, 1, ett_h265_nal, NULL, "NAL unit header or first byte 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);
}
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, 0xFF,
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, 0xFF,
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 }
},
/* 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 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:
*/