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;
}