CSharpRTMP.Core.Streaming.VideoAvc.ReadSPS C# (CSharp) Method

ReadSPS() private method

private ReadSPS ( BitReader spsReader, Variant spsInfo ) : bool
spsReader BitReader
spsInfo Variant
return bool
        private bool ReadSPS(BitReader spsReader, Variant spsInfo)
        {
            //7.3.2.1 Sequence parameter set RBSP syntax
            //14496-10.pdf 43/280
            spsInfo["profile_idc"] = spsReader.ReadBitsToByte();
            spsInfo["constraint_set0_flag"] = spsReader.ReadBool();
            spsInfo["constraint_set1_flag"] = spsReader.ReadBool();
            spsInfo["constraint_set2_flag"] = spsReader.ReadBool();
            spsInfo["reserved_zero_5bits"] = spsReader.ReadBitsToByte(5);
            spsInfo["level_idc"] = spsReader.ReadBitsToByte();
            spsInfo["seq_parameter_set_id"] = spsReader.ReadExpGolomb("seq_parameter_set_id");
            if (spsInfo["profile_idc"] >= 100)
            {
                spsInfo["chromformat_idc"] = spsReader.ReadExpGolomb("chromformat_idc");
                if (spsInfo["chromformat_idc"] == 3) spsInfo["residual_colour_transform_flag"] = spsReader.ReadBool();
                spsInfo["bit_depth_lumminus8"] = spsReader.ReadExpGolomb("bit_depth_lumminus8");
                spsInfo["bit_depth_chromminus8"] = spsReader.ReadExpGolomb("bit_depth_chromminus8");
                spsInfo["qpprime_y_zero_transform_bypass_flag"] = spsReader.ReadBool();
                spsInfo["seq_scaling_matrix_present_flag"] = spsReader.ReadBool();
                if (spsInfo["seq_scaling_matrix_present_flag"])
                {
                    for (byte i = 0; i < 8; i++)
                    {
                        if (spsReader.AvailableBits < 1)
                        {
                            Logger.FATAL("unable to read seq_scaling_list_present_flag not enought bits ");
                            return false;
                        }
                        if (spsReader.ReadBool())
                        {
                            if (i < 6)
                            {
                                if (scaling_list(spsReader, 16)) continue;
                                Logger.FATAL("scaling_list failed");
                                return false;
                            }
                            if (scaling_list(spsReader, 64)) continue;
                            Logger.FATAL("scaling_list failed");
                            return false;
                        }
                    }
                }
            }
            spsInfo["log2_max_frame_num_minus4"] = spsReader.ReadExpGolomb("log2_max_frame_num_minus4");
            spsInfo["pic_order_cnt_type"] = spsReader.ReadExpGolomb("pic_order_cnt_type");
            if ((ulong)spsInfo["pic_order_cnt_type"] == 0)
            {
                spsInfo["log2_max_pic_order_cnt_lsb_minus4"] = spsReader.ReadExpGolomb("log2_max_pic_order_cnt_lsb_minus4");
            }
            else if ((ulong)spsInfo["pic_order_cnt_type"] == 1)
            {
                spsInfo["deltpic_order_always_zero_flag"] = spsReader.ReadBool();
                spsInfo["offset_for_non_ref_pic"] = (long)spsReader.ReadExpGolomb("offset_for_non_ref_pic");
                spsInfo["offset_for_top_to_bottom_field"] = (long)spsReader.ReadExpGolomb("offset_for_top_to_bottom_field");
                spsInfo["num_ref_frames_in_pic_order_cnt_cycle"] = spsReader.ReadExpGolomb("num_ref_frames_in_pic_order_cnt_cycle");
                for (ulong i = 0; i < (ulong)spsInfo["num_ref_frames_in_pic_order_cnt_cycle"]; i++)
                {
                    var val = spsReader.ReadExpGolomb("offset_for_ref_frame value");
                    spsInfo["offset_for_ref_frame"].Add((long)val);
                }
            }
            spsInfo["num_ref_frames"] = spsReader.ReadExpGolomb("num_ref_frames");
            spsInfo["gaps_in_frame_num_value_allowed_flag"] = spsReader.ReadBool();
            spsInfo["pic_width_in_mbs_minus1"] = spsReader.ReadExpGolomb("pic_width_in_mbs_minus1");
            spsInfo["pic_height_in_map_units_minus1"] = spsReader.ReadExpGolomb("pic_height_in_map_units_minus1");
            spsInfo["frame_mbs_only_flag"] = spsReader.ReadBool();
            if (!spsInfo["frame_mbs_only_flag"])
                spsInfo["mb_adaptive_frame_field_flag"] = spsReader.ReadBool();
            spsInfo["direct_8x8_inference_flag"] = spsReader.ReadBool();
            spsInfo["frame_cropping_flag"] = spsReader.ReadBool();
            if (spsInfo["frame_cropping_flag"])
            {
                spsInfo["frame_crop_left_offset"] = spsReader.ReadExpGolomb("frame_crop_left_offset");
                spsInfo["frame_crop_right_offset"] = spsReader.ReadExpGolomb("frame_crop_right_offset");
                spsInfo["frame_crop_top_offset"] = spsReader.ReadExpGolomb("frame_crop_top_offset");
                spsInfo["frame_crop_bottom_offset"] = spsReader.ReadExpGolomb("frame_crop_bottom_offset");
            }
            spsInfo["vui_parameters_present_flag"] = spsReader.ReadBool();
            if (!spsInfo["vui_parameters_present_flag"]) return true;
           
            if (ReadSPSVUI(spsReader, spsInfo["vui_parameters"]= Variant.Get())) return true;
            Logger.FATAL("Unable to read VUI");
            return false;
        }