pub struct Sps {Show 28 fields
pub nal_ref_idc: u8,
pub nal_unit_type: NALUnitType,
pub profile_idc: u8,
pub constraint_set0_flag: bool,
pub constraint_set1_flag: bool,
pub constraint_set2_flag: bool,
pub constraint_set3_flag: bool,
pub constraint_set4_flag: bool,
pub constraint_set5_flag: bool,
pub level_idc: u8,
pub seq_parameter_set_id: u16,
pub ext: Option<SpsExtended>,
pub log2_max_frame_num_minus4: u8,
pub pic_order_cnt_type: u8,
pub log2_max_pic_order_cnt_lsb_minus4: Option<u8>,
pub pic_order_cnt_type1: Option<PicOrderCountType1>,
pub max_num_ref_frames: u8,
pub gaps_in_frame_num_value_allowed_flag: bool,
pub pic_width_in_mbs_minus1: u64,
pub pic_height_in_map_units_minus1: u64,
pub mb_adaptive_frame_field_flag: Option<bool>,
pub direct_8x8_inference_flag: bool,
pub frame_crop_info: Option<FrameCropInfo>,
pub sample_aspect_ratio: Option<SarDimensions>,
pub overscan_appropriate_flag: Option<bool>,
pub color_config: Option<ColorConfig>,
pub chroma_sample_loc: Option<ChromaSampleLoc>,
pub timing_info: Option<TimingInfo>,
}Expand description
The Sequence Parameter Set. ISO/IEC-14496-10-2022 - 7.3.2
Fields§
§nal_ref_idc: u8The nal_ref_idc is comprised of 2 bits.
A nonzero value means the NAL unit has any of the following: SPS, SPS extension, subset SPS, PPS, slice of a reference picture, slice of a data partition of a reference picture, or a prefix NAL unit preceeding a slice of a reference picture.
0 means that the stream is decoded using the process from Clauses 2-9 (ISO/IEC-14496-10-2022)
that the slice or slice data partition is part of a non-reference picture.
Additionally, if nal_ref_idc is 0 for a NAL unit with nal_unit_type
ranging from [1, 4] then nal_ref_idc must be 0 for all NAL units with nal_unit_type between [1, 4].
If the nal_unit_type is 5, then the nal_ref_idc cannot be 0.
If nal_unit_type is 6, 9, 10, 11, or 12, then the nal_ref_idc must be 0.
ISO/IEC-14496-10-2022 - 7.4.1
nal_unit_type: NALUnitTypeThe nal_unit_type is comprised of 5 bits. See the NALUnitType nutype enum for more info.
profile_idc: u8The profile_idc of the coded video sequence as a u8.
It is comprised of 8 bits or 1 byte. ISO/IEC-14496-10-2022 - 7.4.2.1.1
constraint_set0_flag: boolconstraint_set0_flag: 1 if it abides by the constraints in A.2.1, 0 if unsure or otherwise.
If profile_idc is 44, 100, 110, 122, or 244, this is automatically set to false.
It is a single bit. ISO/IEC-14496-10-2022 - 7.4.2.1.1
constraint_set1_flag: boolconstraint_set1_flag: 1 if it abides by the constraints in A.2.2, 0 if unsure or otherwise.
If profile_idc is 44, 100, 110, 122, or 244, this is automatically set to false.
It is a single bit. ISO/IEC-14496-10-2022 - 7.4.2.1.1
constraint_set2_flag: boolconstraint_set2_flag: 1 if it abides by the constraints in A.2.3, 0 if unsure or otherwise.
If profile_idc is 44, 100, 110, 122, or 244, this is automatically set to false.
It is a single bit. ISO/IEC-14496-10-2022 - 7.4.2.1.1
constraint_set3_flag: boolconstraint_set3_flag:
if (profile_idc == 66, 77, or 88) AND (level_idc == 11):
1 if it abides by the constraints in Annex A for level 1b
0 if it abides by the constraints in Annex A for level 1.1
elif profile_idc == 100 or 110:
1 if it abides by the constraints for the "High 10 Intra profile"
0 if unsure or otherwise
elif profile_idc == 122:
1 if it abides by the constraints in Annex A for the "High 4:2:2 Intra profile"
0 if unsure or otherwise
elif profile_idc == 44:
1 by default
0 is not possible.
elif profile_idc == 244:
1 if it abides by the constraints in Annex A for the "High 4:4:4 Intra profile"
0 if unsure or otherwise
else:
1 is reserved for future use
0 otherwiseIt is a single bit. ISO/IEC-14496-10-2022 - 7.4.2.1.1
constraint_set4_flag: boolconstraint_set4_flag:
if (profile_idc == 77, 88, 100, or 110):
1 if frame_mbs_only_flag == 1
0 if unsure or otherwise
elif (profile_idc == 118, 128, or 134):
1 if it abides by the constraints in G.6.1.1
0 if unsure or otherwise
else:
1 is reserved for future use
0 otherwiseIt is a single bit. ISO/IEC-14496-10-2022 - 7.4.2.1.1
constraint_set5_flag: boolconstraint_set5_flag:
if (profile_idc == 77, 88, or 100):
1 if there are no B slice types
0 if unsure or otherwise
elif profile_idc == 118:
1 if it abides by the constraints in G.6.1.2
0 if unsure or otherwise
else:
1 is reserved for future use
0 otherwiseIt is a single bit. ISO/IEC-14496-10-2022 - 7.4.2.1.1
level_idc: u8The level_idc of the coded video sequence as a u8.
It is comprised of 8 bits or 1 byte. ISO/IEC-14496-10-2022 - 7.4.2.1.1
seq_parameter_set_id: u16The seq_parameter_set_id is the id of the SPS referred to by the PPS (picture parameter set).
The value of this ranges from [0, 31].
This is a variable number of bits as it is encoded by an exp golomb (unsigned).
The smallest encoding would be for 0 which is encoded as 1, which is a single bit.
The largest encoding would be for 31 which is encoded as 000 0010 0000, which is 11 bits.
ISO/IEC-14496-10-2022 - 7.4.2.1.1
For more information:
ext: Option<SpsExtended>An optional SpsExtended. Refer to the SpsExtended struct for more info.
This will be parsed if profile_idc is equal to any of the following values:
44, 83, 86, 100, 110, 118, 122, 128, 134, 135, 138, 139, or 244.
log2_max_frame_num_minus4: u8The log2_max_frame_num_minus4 is the value used when deriving MaxFrameNum from the equation:
MaxFrameNum = 2^(log2_max_frame_num_minus4 + 4)
The value of this ranges from [0, 12].
This is a variable number of bits as it is encoded by an exp golomb (unsigned).
The smallest encoding would be for 0 which is encoded as 1, which is a single bit.
The largest encoding would be for 12 which is encoded as 000 1101, which is 7 bits.
ISO/IEC-14496-10-2022 - 7.4.2.1.1
For more information:
pic_order_cnt_type: u8The pic_order_cnt_type specifies how to decode the picture order count in subclause 8.2.1.
The value of this ranges from [0, 2].
This is a variable number of bits as it is encoded by an exp golomb (unsigned).
The smallest encoding would be for 0 which is encoded as 1, which is a single bit.
The largest encoding would be for 2 which is encoded as 011, which is 3 bits.
ISO/IEC-14496-10-2022 - 7.4.2.1.1
For more information:
https://en.wikipedia.org/wiki/Exponential-Golomb_coding
There are a few subsequent fields that are read if pic_order_cnt_type is 0 or 1.
In the case of 0, log2_max_pic_order_cnt_lsb_minus4 is read as an exp golomb (unsigned).
In the case of 1, delta_pic_order_always_zero_flag, offset_for_non_ref_pic,
offset_for_top_to_bottom_field, num_ref_frames_in_pic_order_cnt_cycle and
offset_for_ref_frame will be read and stored in pic_order_cnt_type1.
Refer to the PicOrderCountType1 struct for more info.
log2_max_pic_order_cnt_lsb_minus4: Option<u8>The log2_max_pic_order_cnt_lsb_minus4 is the value used when deriving MaxFrameNum from the equation:
MaxPicOrderCntLsb = 2^(log2_max_frame_num_minus4 + 4) from subclause 8.2.1.
This is an Option<u8> because the value is only set if pic_order_cnt_type == 0.
The value of this ranges from [0, 12].
This is a variable number of bits as it is encoded by an exp golomb (unsigned).
The smallest encoding would be for 0 which is encoded as 1, which is a single bit.
The largest encoding would be for 12 which is encoded as 000 1101, which is 7 bits.
ISO/IEC-14496-10-2022 - 7.4.2.1.1
For more information:
pic_order_cnt_type1: Option<PicOrderCountType1>An optional PicOrderCountType1. This is computed from other fields, and isn’t directly set.
If pic_order_cnt_type == 1, then the PicOrderCountType1 will be computed.
Refer to the PicOrderCountType1 struct for more info.
max_num_ref_frames: u8The max_num_ref_frames is the max short-term and long-term reference frames,
complementary reference field pairs, and non-paired reference fields that
can be used by the decoder for inter-prediction of pictures in the coded video.
The value of this ranges from [0, MaxDpbFrames], which is specified in subclause A.3.1 or A.3.2.
This is a variable number of bits as it is encoded by an exp golomb (unsigned).
The smallest encoding would be for 0 which is encoded as 1, which is a single bit.
The largest encoding would be for 14 which is encoded as 000 1111, which is 7 bits.
ISO/IEC-14496-10-2022 - 7.4.2.1.1
For more information:
gaps_in_frame_num_value_allowed_flag: boolThe gaps_in_frame_num_value_allowed_flag is a single bit.
The value specifies the allowed values of frame_num from subclause 7.4.3 and the decoding process
if there is an inferred gap between the values of frame_num from subclause 8.2.5.2.
pic_width_in_mbs_minus1: u64The pic_width_in_mbs_minus1 is the width of each decoded picture in macroblocks as a u64.
We then use this (along with the left and right frame crop offsets) to calculate the width as:
width = ((pic_width_in_mbs_minus1 + 1) * 16) - frame_crop_right_offset * 2 - frame_crop_left_offset * 2
This is a variable number of bits as it is encoded by an exp golomb (unsigned). ISO/IEC-14496-10-2022 - 7.4.2.1.1
For more information:
pic_height_in_map_units_minus1: u64The pic_height_in_map_units_minus1 is the height of each decoded frame in slice group map units as a u64.
We then use this (along with the bottom and top frame crop offsets) to calculate the height as:
height = ((2 - frame_mbs_only_flag as u64) * (pic_height_in_map_units_minus1 + 1) * 16) - frame_crop_bottom_offset * 2 - frame_crop_top_offset * 2
This is a variable number of bits as it is encoded by an exp golomb (unsigned). ISO/IEC-14496-10-2022 - 7.4.2.1.1
For more information:
mb_adaptive_frame_field_flag: Option<bool>The mb_adaptive_frame_field_flag is a single bit.
If frame_mbs_only_flag is NOT set then this field is read and stored.
0 means there is no switching between frame and field macroblocks in a picture.
1 means the might be switching between frame and field macroblocks in a picture.
ISO/IEC-14496-10-2022 - 7.4.2.1.1
direct_8x8_inference_flag: boolThe direct_8x8_inference_flag specifies the method used to derive the luma motion
vectors for B_Skip, B_Direct_8x8 and B_Direct_16x16 from subclause 8.4.1.2, and is a single bit.
ISO/IEC-14496-10-2022 - 7.4.2.1.1
frame_crop_info: Option<FrameCropInfo>An optional frame_crop_info struct. This is computed by other fields, and isn’t directly set.
If the frame_cropping_flag is set, then frame_crop_left_offset, frame_crop_right_offset,
frame_crop_top_offset, and frame_crop_bottom_offset will be read and stored.
Refer to the FrameCropInfo struct for more info.
sample_aspect_ratio: Option<SarDimensions>An optional SarDimensions struct. This is computed by other fields, and isn’t directly set.
If the aspect_ratio_info_present_flag is set, then the aspect_ratio_idc will be read and stored.
If the aspect_ratio_idc is 255, then the sar_width and sar_height will be read and stored.
Also known as sample_aspect_ratio in the spec.
The default values are set to 0 for the aspect_ratio_idc, sar_width, and sar_height.
Therefore, this will always be returned by the parse function.
ISO/IEC-14496-10-2022 - E.2.1
Refer to the SarDimensions struct for more info.
overscan_appropriate_flag: Option<bool>An optional overscan_appropriate_flag is a single bit.
If the overscan_info_present_flag is set, then this field will be read and stored.
0 means the overscan should not be used. (ex: screensharing or security cameras)
1 means the overscan can be used. (ex: entertainment TV programming or live video conference)
ISO/IEC-14496-10-2022 - E.2.1
color_config: Option<ColorConfig>An optional ColorConfig. This is computed from other fields, and isn’t directly set.
If video_signal_type_present_flag is set, then the ColorConfig will be computed, and
if the color_description_present_flag is set, then the ColorConfig will be
comprised of the video_full_range_flag (1 bit), color_primaries (1 byte as a u8),
transfer_characteristics (1 byte as a u8), and matrix_coefficients (1 byte as a u8).
Otherwise, color_primaries, transfer_characteristics, and matrix_coefficients are set
to 2 (unspecified) by default.
Refer to the ColorConfig struct for more info.
chroma_sample_loc: Option<ChromaSampleLoc>An optional ChromaSampleLoc. This is computed from other fields, and isn’t directly set.
If chrome_loc_info_present_flag is set, then the ChromaSampleLoc will be computed, and
is comprised of chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field.
Refer to the ChromaSampleLoc struct for more info.
timing_info: Option<TimingInfo>An optional TimingInfo. This is computed from other fields, and isn’t directly set.
If timing_info_present_flag is set, then the TimingInfo will be computed, and
is comprised of num_units_in_tick and time_scale.
Refer to the TimingInfo struct for more info.
Implementations§
Source§impl Sps
impl Sps
Sourcepub fn parse(reader: impl Read) -> Result<Self>
pub fn parse(reader: impl Read) -> Result<Self>
Parses an Sps from the input bytes.
Returns an Sps struct.
Sourcepub fn build(&self, writer: impl Write) -> Result<()>
pub fn build(&self, writer: impl Write) -> Result<()>
Builds the Sps struct into a byte stream. Returns a built byte stream.
Sourcepub fn parse_with_emulation_prevention(reader: impl Read) -> Result<Self>
pub fn parse_with_emulation_prevention(reader: impl Read) -> Result<Self>
Parses the Sps struct from a reader that may contain emulation prevention bytes.
Is the same as calling Self::parse with an EmulationPreventionIo wrapper.
Sourcepub fn build_with_emulation_prevention(self, writer: impl Write) -> Result<()>
pub fn build_with_emulation_prevention(self, writer: impl Write) -> Result<()>
Builds the Sps struct into a byte stream that may contain emulation prevention bytes.
Is the same as calling Self::build with an EmulationPreventionIo wrapper.
Sourcepub fn height(&self) -> u64
pub fn height(&self) -> u64
The height as a u64. This is computed from other fields, and isn’t directly set.
height = ((2 - frame_mbs_only_flag as u64) * (pic_height_in_map_units_minus1 + 1) * 16) - frame_crop_bottom_offset * 2 - frame_crop_top_offset * 2
We don’t directly store frame_mbs_only_flag since we can tell if it’s set:
If mb_adaptive_frame_field_flag is None, then frame_mbs_only_flag is set (1).
Otherwise mb_adaptive_frame_field_flag unset (0).
Sourcepub fn width(&self) -> u64
pub fn width(&self) -> u64
The width as a u64. This is computed from other fields, and isn’t directly set.
width = ((pic_width_in_mbs_minus1 + 1) * 16) - frame_crop_right_offset * 2 - frame_crop_left_offset * 2
Sourcepub fn frame_rate(&self) -> Option<f64>
pub fn frame_rate(&self) -> Option<f64>
Returns the frame rate as a f64.
If timing_info_present_flag is set, then the frame_rate will be computed, and
if num_units_in_tick is nonzero, then the framerate will be:
frame_rate = time_scale as f64 / (2.0 * num_units_in_tick as f64)