Esempio n. 1
0
        void ReadHrdParameters(H264Bitstream r)
        {
            var cpb_cnt_minus1 = r.ReadUe();
            var bit_rate_scale = r.ReadBits(4);
            var cpb_size_scale = r.ReadBits(4);
            for (var SchedSelIdx = 0; SchedSelIdx <= cpb_cnt_minus1; SchedSelIdx++)
            {
                var bit_rate_value_minus1_SchedSelIdx = r.ReadUe();
                var cpb_size_value_minus1_SchedSelIdx = r.ReadUe();
                var cbr_flag_SchedSelIdx = r.ReadBits(1);
            }
            var initial_cpb_removal_delay_length_minus1 = r.ReadBits(5);
            var cpb_removal_delay_length_minus1 = r.ReadBits(5);

            _cpbRemovalDelayLengthMinus1 = cpb_removal_delay_length_minus1;

            var dpb_output_delay_length_minus1 = r.ReadBits(5);

            _dpbOutputDelayLengthMinus1 = dpb_output_delay_length_minus1;

            var time_offset_length = r.ReadBits(5);

            _timeOffsetLength = time_offset_length;
        }
Esempio n. 2
0
        // ReSharper disable InconsistentNaming
        // ReSharper disable UnusedVariable

        void ReadVuiParameters(H264Bitstream r)
        {
            var aspect_ratio_info_present_flag = r.ReadBits(1);

            if (0 != aspect_ratio_info_present_flag)
            {
                var aspect_ratio_idc = r.ReadBits(8);

                const int Extended_SAR = 255;

                if (Extended_SAR == aspect_ratio_idc)
                {
                    var sar_width = r.ReadBits(16);
                    var sar_height = r.ReadBits(16);
                }
            }

            var overscan_info_present_flag = r.ReadBits(1);

            if (0 != overscan_info_present_flag)
            {
                var overscan_appropriate_flag = r.ReadBits(1);
            }

            var video_signal_type_present_flag = r.ReadBits(1);
            if (0 != video_signal_type_present_flag)
            {
                var video_format = r.ReadBits(3);
                var video_full_range_flag = r.ReadBits(1);
                var colour_description_present_flag = r.ReadBits(1);
                if (0 != colour_description_present_flag)
                {
                    var colour_primaries = r.ReadBits(8);
                    var transfer_characteristics = r.ReadBits(8);
                    var matrix_coefficients = r.ReadBits(8);
                }
            }

            var chroma_loc_info_present_flag = r.ReadBits(1);
            if (0 != chroma_loc_info_present_flag)
            {
                var chroma_sample_loc_type_top_field = r.ReadUe();
                var chroma_sample_loc_type_bottom_field = r.ReadUe();
            }

            var timing_info_present_flag = r.ReadBits(1);
            if (0 != timing_info_present_flag)
            {
                var num_units_in_tick = r.ReadBits(32);
                _numUnitsInTick = num_units_in_tick;

                var time_scale = r.ReadBits(32);
                _timeScale = time_scale;

                var fixed_frame_rate_flag = r.ReadBits(1);
                _fixedFrameRateFlag = 0 != fixed_frame_rate_flag;
            }

            var nal_hrd_parameters_present_flag = r.ReadBits(1);

            _nalHrdParametersPresentFlag = 0 != nal_hrd_parameters_present_flag;

            if (0 != nal_hrd_parameters_present_flag)
                ReadHrdParameters(r);

            var vcl_hrd_parameters_present_flag = r.ReadBits(1);

            _vclHrdParametersPresentFlag = 0 != vcl_hrd_parameters_present_flag;

            if (0 != vcl_hrd_parameters_present_flag)
                ReadHrdParameters(r);

            if (0 != nal_hrd_parameters_present_flag || 0 != vcl_hrd_parameters_present_flag)
            {
                var low_delay_hrd_flag = r.ReadBits(1);
            }

            var pic_struct_present_flag = r.ReadBits(1);

            _picStructPresentFlag = 0 != pic_struct_present_flag;

            var bitstream_restriction_flag = r.ReadBits(1);
            if (0 != bitstream_restriction_flag)
            {
                var motion_vectors_over_pic_boundaries_flag = r.ReadBits(1);
                var max_bytes_per_pic_denom = r.ReadUe();
                var max_bits_per_mb_denom = r.ReadUe();
                var log2_max_mv_length_horizontal = r.ReadUe();
                var log2_max_mv_length_vertical = r.ReadUe();
                var max_num_reorder_frames = r.ReadUe();
                var max_dec_frame_buffering = r.ReadUe();
            }
        }
Esempio n. 3
0
        public void ReadSps(H264Bitstream r)
        {
            _ppsSeqParameterSetId = null;

            uint profile_idc;
            uint constraint_sets;
            uint level_idc;
            uint width;
            uint height;

            var forbidden_zero_bit = r.ReadBits(1);
            var nal_ref_idc = r.ReadBits(2);
            var nal_unit_type = r.ReadBits(5);

            profile_idc = r.ReadBits(8);
            constraint_sets = r.ReadBits(8);
            level_idc = r.ReadBits(8);
            var seq_parameter_set_id = r.ReadUe();

            _seqParameterSetId = seq_parameter_set_id;

            if (Array.BinarySearch(ProfileIdcHasChromaFormat, profile_idc) >= 0)
            {
                var chroma_format_idc = r.ReadUe();

                _chromaFormatIdc = chroma_format_idc;

                if (3 == chroma_format_idc)
                {
                    var separate_colour_plane_flag = r.ReadBits(1);

                    _separateColourPlaneFlag = separate_colour_plane_flag;
                }

                var bit_depth_luma_minus8 = r.ReadUe();

                var bit_depth_chroma_minus8 = r.ReadUe();

                var qpprime_y_zero_transform_bypass_flag = r.ReadBits(1);

                var seq_scaling_matrix_present_flag = r.ReadBits(1);

                if (0 != seq_scaling_matrix_present_flag)
                {
                    for (var i = 0; i < (3 != chroma_format_idc ? 8 : 12); ++i)
                    {
                        var seq_scaling_list_present_flag = r.ReadBits(1);

                        if (0 != seq_scaling_list_present_flag)
                            ParseScalingList(r, i < 6 ? 16 : 64);
                    }
                }
            }

            var log2_max_frame_num_minus4 = r.ReadUe();

            _log2MaxFrameNumMinus4 = log2_max_frame_num_minus4;

            var pic_order_cnt_type = r.ReadUe();

            _picOrderCntType = pic_order_cnt_type;

            if (0 == pic_order_cnt_type)
            {
                var log2_max_pic_order_cnt_lsb_minus4 = r.ReadUe();
            }
            else if (1 == pic_order_cnt_type)
            {
                var delta_pic_order_always_zero_flag = r.ReadBits(1);

                _deltaPicOrderAlwaysZeroFlag = delta_pic_order_always_zero_flag;

                var offset_for_non_ref_pic = r.ReadSe();
                var offset_for_top_to_bottom_field = r.ReadSe();
                var num_ref_frames_in_pic_order_cnt_cycle = r.ReadUe();

                for (var i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; ++i)
                {
                    var offset_for_ref_frame = r.ReadSe();
                }
            }

            var max_num_ref_frames = r.ReadUe();
            var gaps_in_frame_num_value_allowed_flag = r.ReadBits(1);
            var pic_width_in_mbs_minus1 = r.ReadUe();
            var pic_height_in_map_units_minus1 = r.ReadUe();
            var frame_mbs_only_flag = r.ReadBits(1);

            _frameMbsOnlyFlag = frame_mbs_only_flag;

            if (0 == frame_mbs_only_flag)
            {
                var mb_adaptive_frame_field_flag = r.ReadBits(1);
            }

            var direct_8x8_inference_flag = r.ReadBits(1);
            var frame_cropping_flag = r.ReadBits(1);

            width = ((pic_width_in_mbs_minus1 + 1) * 16);
            height = ((2 - frame_mbs_only_flag) * (pic_height_in_map_units_minus1 + 1) * 16);

            if (0 != frame_cropping_flag)
            {
                var frame_crop_left_offset = r.ReadUe();
                var frame_crop_right_offset = r.ReadUe();
                var frame_crop_top_offset = r.ReadUe();
                var frame_crop_bottom_offset = r.ReadUe();

                width = width - frame_crop_left_offset * 2 - frame_crop_right_offset * 2;
                height = height - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2);
            }

            var vui_parameters_present_flag = r.ReadBits(1);

            if (0 != vui_parameters_present_flag)
            {
                ReadVuiParameters(r);
            }

            Height = (int)height;
            Width = (int)width;

            var profileName = ProfileName(profile_idc, constraint_sets);

            Name = String.Format("H.264 \"{0}\" profile, level {1} {2}x{3}",
                profileName, level_idc / 10.0, width, height);
        }
Esempio n. 4
0
        public void ReadPps(H264Bitstream r)
        {
            _slicePicParameterSetId = null;

            var forbidden_zero_bit = r.ReadBits(1);
            var nal_ref_idc = r.ReadBits(2);
            var nal_unit_type = r.ReadBits(5);

            var pic_parameter_set_id = r.ReadUe();

            _picParameterSetId = pic_parameter_set_id;

            var seq_parameter_set_id = r.ReadUe();

            _ppsSeqParameterSetId = seq_parameter_set_id;

            var entropy_coding_mode_flag = r.ReadBits(1);
            var bottom_field_pic_order_in_frame_present_flag = r.ReadBits(1);

            _bottomFieldPicOrderInFramePresentFlag = bottom_field_pic_order_in_frame_present_flag;

            var num_slice_groups_minus1 = r.ReadUe();

            if (num_slice_groups_minus1 > 0)
            {
                var slice_group_map_type = r.ReadUe();
                if (0 == slice_group_map_type)
                {
                    for (var iGroup = 0; iGroup <= num_slice_groups_minus1; iGroup++)
                    {
                        var run_length_minus1_iGroup = r.ReadUe();
                    }
                }
                else if (2 == slice_group_map_type)
                {
                    for (var iGroup = 0; iGroup < num_slice_groups_minus1; iGroup++)
                    {
                        var top_left_iGroup = r.ReadUe();
                        var bottom_right_iGroup = r.ReadUe();
                    }
                }
                else if (3 == slice_group_map_type || 4 == slice_group_map_type || 5 == slice_group_map_type)
                {
                    var slice_group_change_direction_flag = r.ReadBits(1);
                    var slice_group_change_rate_minus1 = r.ReadUe();
                }
                else if (6 == slice_group_map_type)
                {
                    var nsgBits = GetBitSize(num_slice_groups_minus1);

                    var pic_size_in_map_units_minus1 = r.ReadUe();
                    for (var i = 0; i <= pic_size_in_map_units_minus1; i++)
                    {
                        var slice_group_id_i = r.ReadBits(nsgBits);
                    }
                }
            }

            var num_ref_idx_l0_default_active_minus1 = r.ReadUe();
            var num_ref_idx_l1_default_active_minus1 = r.ReadUe();
            var weighted_pred_flag = r.ReadBits(1);
            var weighted_bipred_idc = r.ReadBits(2);
            var pic_init_qp_minus26 /* relative to 26 */ = r.ReadSe();
            var pic_init_qs_minus26 /* relative to 26 */ = r.ReadSe();
            var chroma_qp_index_offset = r.ReadSe();
            var deblocking_filter_control_present_flag = r.ReadBits(1);
            var constrained_intra_pred_flag = r.ReadBits(1);
            var redundant_pic_cnt_present_flag = r.ReadBits(1);

            _redundantPicCntPresentFlag = redundant_pic_cnt_present_flag;

            if (more_rbsp_data(r))
            {
                var transform_8x8_mode_flag = r.ReadBits(1);
                var pic_scaling_matrix_present_flag = r.ReadBits(1);
                if (0 != pic_scaling_matrix_present_flag)
                {
                    for (var i = 0; i < 6 + ((_chromaFormatIdc != 3) ? 2 : 6) * transform_8x8_mode_flag; i++)
                    {
                        var pic_scaling_list_present_flag_i = r.ReadBits(1);
                        if (0 != pic_scaling_list_present_flag_i)
                        {
                            if (i < 6)
                            {
                                ReadScalingList(r, 16);
                                //scaling_list(ScalingList4x4[i], 16, UseDefaultScalingMatrix4x4Flag[i]);
                            }
                            else
                            {
                                ReadScalingList(r, 64);
                                //scaling_list(ScalingList8x8[i - 6], 64, UseDefaultScalingMatrix8x8Flag[i - 6]);
                            }
                        }
                    }
                }

                var second_chroma_qp_index_offset = r.ReadSe();
            }
        }
Esempio n. 5
0
        public void ReadSliceHeader(H264Bitstream r, bool IdrPicFlag)
        {
            var first_mb_in_slice = r.ReadUe();
            var slice_type = r.ReadUe();
            var pic_parameter_set_id = r.ReadUe();

            _slicePicParameterSetId = pic_parameter_set_id;

            if (_separateColourPlaneFlag == 1)
            {
                var colour_plane_id = r.ReadBits(2);
            }

            var frame_num = r.ReadBits((int)(_log2MaxFrameNumMinus4 ?? 0) + 4);

            uint field_pic_flag = 0;

            if (0 == _frameMbsOnlyFlag)
            {
                field_pic_flag = r.ReadBits(1);
                if (0 != field_pic_flag)
                {
                    var bottom_field_flag = r.ReadBits(1);
                }
            }

            _fieldPicFlag = 0 != field_pic_flag;

            if (IdrPicFlag)
            {
                var idr_pic_id = r.ReadUe();

                if (_picOrderCntType == 0)
                {
                    var pic_order_cnt_lsb = r.ReadBits((int)(_log2MaxFrameNumMinus4 ?? 0) + 4);

                    if (0 != _bottomFieldPicOrderInFramePresentFlag && 0 == field_pic_flag)
                    {
                        var delta_pic_order_cnt_bottom = r.ReadSe();
                    }
                }
                if (_picOrderCntType == 1 && 0 == _deltaPicOrderAlwaysZeroFlag)
                {
                    var delta_pic_order_cnt_0 = r.ReadSe();

                    if (0 != _bottomFieldPicOrderInFramePresentFlag && 0 == field_pic_flag)
                    {
                        var delta_pic_order_cnt_1 = r.ReadSe();
                    }
                }

                if (0 != _redundantPicCntPresentFlag)
                {
                    var redundant_pic_cnt = r.ReadUe();
                }
            }
        }