Beispiel #1
0
        void ParseScalingList(H264Bitstream r, int sizeOfScalingList)
        {
            var lastScale = 8;
            var nextScale = 8;

            for (var j = 0; j < sizeOfScalingList; ++j)
            {
                if (0 != nextScale)
                {
                    var delta_scale = r.ReadSe();

                    nextScale = (lastScale + delta_scale + 256) & 0xff;
                    var useDefaultScalingMatrixFlag = (0 == j && 0 == nextScale);
                }

                var scalingList = 0 == nextScale ? lastScale : nextScale;
                lastScale = scalingList;
            }
        }
Beispiel #2
0
 void ReadScalingList(H264Bitstream r, int sizeOfScalingList)
 {
     var lastScale = 8;
     var nextScale = 8;
     for (var j = 0; j < sizeOfScalingList; j++)
     {
         if (nextScale != 0)
         {
             var delta_scale = r.ReadSe();
             nextScale = (lastScale + delta_scale + 256) % 256;
             var useDefaultScalingMatrixFlag = (j == 0 && nextScale == 0);
         }
         var scalingList_j = (nextScale == 0) ? lastScale : nextScale;
         lastScale = scalingList_j;
     }
 }
Beispiel #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);
        }
Beispiel #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();
            }
        }
Beispiel #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();
                }
            }
        }