Skip to content

Commit f3a523b

Browse files
committed
update bitstream-io 2.2->4.9, BitRead trait
* update the `bitstream-io` dependency. This produces a ~10% improvement on some of the annexb and nal benchmarks. Besides needing a few internal changes, this is a breaking API change because `crate::bitstream_io` and `crate::rbsp::{Numeric, Primitive}` were exposed. * update MSRV 1.81->1.83 to match. (Arguable whether this is a breaking change. Many crates seem to say no. `h264-reader` doesn't have an explicit policy.) * update `BitRead` to match its `read` vs `read_var` change in <tuffy/bitstream-io@d45beee>. The same rationale there applies here. * `BitRead::read_bool` -> `BitRead::read_bit`, matching the upstream trait's name. The old name `read_bool` came from the `bitreader` crate we haven't used since 7a02a3b. I previously tried to match upstream in 7ffae81 but apparently missed this one. * rename `BitReaderError::ReadErrorFor` to `BitReaderError::ReadError`. This variant was introduced alongside `BitReaderError::ReadError` in e0d5ad0. After 7ffae81, callers finished migrated from the old methods that didn't take a syntax element name to the new ones that do and the old variant was removed. The `For` suffix is just puzzling now, and the `ExpGolombTooLarge` variant doesn't have it. * remove the unused and unexplained `BitReaderError::Unaligned` variant. * update a few comments. `read` previously said it was for unsigned values, but it actually supported either, and one field (`nal::sei::pic_timing::CountingType::time_offset`) took advantage of this.
1 parent 5dba6b0 commit f3a523b

File tree

17 files changed

+204
-171
lines changed

17 files changed

+204
-171
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44

55
### Changed
66

7+
* BREAKING CHANGE: Updated `bitstream-io` dependency from 2.2 to 4.9 and altered `rbsp::BitRead` trait to
8+
match its conventions.
79
* BREAKING CHANGE: `Profile::from_profile_idc()` now accepts `ConstraintFlags` to distinguish constrained/intra profile variants. Add `Profile` enum variants: `ConstrainedBaseline`, `ProgressiveHigh`, `ConstrainedHigh`, `High10Intra`, `High422Intra`, `High444Intra`, `ScalableConstrainedBaseline`, `ScalableConstrainedHigh`, `ScalableHighIntra`.
810
* BREAKING CHANGE: `SliceHeader::from_bits()` now takes an additional `header_extension: Option<&NalHeaderExtension>` parameter. Pass `None` for standard AVC NAL types (1/5). For MVC NAL types (20/21), pass the parsed extension to enable correct `idr_pic_flag` derivation and MVC ref pic list modification parsing.
11+
* Update minimum supported Rust version from 1.81 to 1.83.
912

1013
### Added
1114

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ readme = "README.md"
1010
repository = "https://github.com/dholroyd/h264-reader"
1111
edition = "2018"
1212
exclude = ["/*.h264"]
13+
rust-version = "1.83"
1314

1415
[dependencies]
15-
bitstream-io = "2.2"
16+
bitstream-io = "4.9"
1617
hex-slice = "0.1.4"
1718
memchr = "2.1.1"
1819
rfc6381-codec = "0.2"

benches/bench.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ fn h264_reader(c: &mut Criterion) {
108108
nal.header().unwrap(),
109109
None,
110110
) {
111-
Err(SliceHeaderError::RbspError(BitReaderError::ReaderErrorFor(_, e))) => {
111+
Err(SliceHeaderError::RbspError(BitReaderError::ReaderError(_, e))) => {
112112
assert_eq!(e.kind(), ErrorKind::WouldBlock);
113113
}
114114
Err(e) => panic!("{:?}", e),

rust-toolchain.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
[toolchain]
2-
channel = "1.81"
2+
channel = "1.83"

src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55

66
use std::fmt::Debug;
77

8-
pub use bitstream_io;
9-
108
pub mod annexb;
119
pub mod avcc;
1210
pub mod nal;

src/nal/aud.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ pub struct AccessUnitDelimiter {
6363

6464
impl AccessUnitDelimiter {
6565
pub fn from_bits<R: BitRead>(mut r: R) -> Result<AccessUnitDelimiter, AudError> {
66-
let val: u8 = r.read(3, "primary_pic_type")?;
66+
let val: u8 = r.read::<3, _>("primary_pic_type")?;
6767
let primary_pic_type =
6868
PrimaryPicType::from_id(val).map_err(AudError::InvalidPrimaryPicType)?;
6969
r.finish_rbsp()?;

src/nal/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,9 +350,9 @@ pub fn extended_rbsp_bytes<N: Nal>(nal: &N) -> rbsp::ByteReader<N::BufRead> {
350350
///
351351
/// // Reading RBSP as a bit sequence:
352352
/// let mut r = nal.rbsp_bits();
353-
/// assert_eq!(r.read::<u8>(4, "first nibble").unwrap(), 0x1);
354-
/// assert_eq!(r.read::<u8>(4, "second nibble").unwrap(), 0x2);
355-
/// assert_eq!(r.read::<u32>(23, "23 bits at a time").unwrap(), 0x1a_00_00);
353+
/// assert_eq!(r.read::<4, u8>("first nibble").unwrap(), 0x1);
354+
/// assert_eq!(r.read::<4, u8>("second nibble").unwrap(), 0x2);
355+
/// assert_eq!(r.read::<23, u32>("23 bits at a time").unwrap(), 0x1a_00_00);
356356
/// assert!(r.has_more_rbsp_data("more left").unwrap());
357357
/// ```
358358
pub trait Nal {

src/nal/pps.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ impl SliceGroup {
113113
}),
114114
3 | 4 | 5 => {
115115
let slice_group_change_direction_flag =
116-
r.read_bool("slice_group_change_direction_flag")?;
116+
r.read_bit("slice_group_change_direction_flag")?;
117117
let slice_group_change_rate_minus1 = r.read_ue("slice_group_change_rate_minus1")?;
118118
if slice_group_change_rate_minus1 > sps.pic_size_in_map_units() - 1 {
119119
return Err(PpsError::InvalidSliceGroupChangeRateMinus1(
@@ -180,7 +180,7 @@ impl SliceGroup {
180180
let size = (1f64 + f64::from(num_slice_groups_minus1)).log2().ceil() as u32;
181181
let mut run_length_minus1 = Vec::with_capacity(num_slice_groups_minus1 as usize + 1);
182182
for _ in 0..pic_size_in_map_units_minus1 + 1 {
183-
run_length_minus1.push(r.read(size, "slice_group_id")?);
183+
run_length_minus1.push(r.read_var(size, "slice_group_id")?);
184184
}
185185
Ok(run_length_minus1)
186186
}
@@ -199,7 +199,7 @@ impl PicScalingMatrix {
199199
sps: &sps::SeqParameterSet,
200200
transform_8x8_mode_flag: bool,
201201
) -> Result<Option<PicScalingMatrix>, PpsError> {
202-
let pic_scaling_matrix_present_flag = r.read_bool("pic_scaling_matrix_present_flag")?;
202+
let pic_scaling_matrix_present_flag = r.read_bit("pic_scaling_matrix_present_flag")?;
203203

204204
if !pic_scaling_matrix_present_flag {
205205
return Ok(None);
@@ -219,7 +219,7 @@ impl PicScalingMatrix {
219219
let mut scaling_list8x8 = Vec::with_capacity(count);
220220

221221
for i in 0..6 + count {
222-
let seq_scaling_list_present_flag = r.read_bool("seq_scaling_list_present_flag")?;
222+
let seq_scaling_list_present_flag = r.read_bit("seq_scaling_list_present_flag")?;
223223
if i < 6 {
224224
scaling_list4x4.push(
225225
sps::ScalingList::<16>::read(r, seq_scaling_list_present_flag)
@@ -258,7 +258,7 @@ impl PicParameterSetExtra {
258258
sps: &sps::SeqParameterSet,
259259
) -> Result<Option<PicParameterSetExtra>, PpsError> {
260260
Ok(if r.has_more_rbsp_data("transform_8x8_mode_flag")? {
261-
let transform_8x8_mode_flag = r.read_bool("transform_8x8_mode_flag")?;
261+
let transform_8x8_mode_flag = r.read_bit("transform_8x8_mode_flag")?;
262262
let extra = PicParameterSetExtra {
263263
transform_8x8_mode_flag,
264264
pic_scaling_matrix: PicScalingMatrix::read(r, sps, transform_8x8_mode_flag)?,
@@ -328,9 +328,9 @@ impl PicParameterSet {
328328
let pps = PicParameterSet {
329329
pic_parameter_set_id,
330330
seq_parameter_set_id,
331-
entropy_coding_mode_flag: r.read_bool("entropy_coding_mode_flag")?,
331+
entropy_coding_mode_flag: r.read_bit("entropy_coding_mode_flag")?,
332332
bottom_field_pic_order_in_frame_present_flag: r
333-
.read_bool("bottom_field_pic_order_in_frame_present_flag")?,
333+
.read_bit("bottom_field_pic_order_in_frame_present_flag")?,
334334
slice_groups: Self::read_slice_groups(&mut r, seq_parameter_set)?,
335335
num_ref_idx_l0_default_active_minus1: read_num_ref_idx(
336336
&mut r,
@@ -340,15 +340,15 @@ impl PicParameterSet {
340340
&mut r,
341341
"num_ref_idx_l1_default_active_minus1",
342342
)?,
343-
weighted_pred_flag: r.read_bool("weighted_pred_flag")?,
344-
weighted_bipred_idc: r.read(2, "weighted_bipred_idc")?,
343+
weighted_pred_flag: r.read_bit("weighted_pred_flag")?,
344+
weighted_bipred_idc: r.read::<2, _>("weighted_bipred_idc")?,
345345
pic_init_qp_minus26: r.read_se("pic_init_qp_minus26")?,
346346
pic_init_qs_minus26: r.read_se("pic_init_qs_minus26")?,
347347
chroma_qp_index_offset: r.read_se("chroma_qp_index_offset")?,
348348
deblocking_filter_control_present_flag: r
349-
.read_bool("deblocking_filter_control_present_flag")?,
350-
constrained_intra_pred_flag: r.read_bool("constrained_intra_pred_flag")?,
351-
redundant_pic_cnt_present_flag: r.read_bool("redundant_pic_cnt_present_flag")?,
349+
.read_bit("deblocking_filter_control_present_flag")?,
350+
constrained_intra_pred_flag: r.read_bit("constrained_intra_pred_flag")?,
351+
redundant_pic_cnt_present_flag: r.read_bit("redundant_pic_cnt_present_flag")?,
352352
extension: PicParameterSetExtra::read(&mut r, seq_parameter_set)?,
353353
};
354354
let qp_bd_offset_y = 6 * seq_parameter_set.chroma_info.bit_depth_luma_minus8;

src/nal/prefix.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,14 @@ impl PrefixNalUnit {
8383
NalHeaderExtension::Svc(_) => {
8484
// SVC prefix NAL: parse prefix_nal_unit_svc() per F.7.3.2.12.1
8585
if header.nal_ref_idc() != 0 {
86-
let store_ref_base_pic_flag = r.read_bool("store_ref_base_pic_flag")?;
86+
let store_ref_base_pic_flag = r.read_bit("store_ref_base_pic_flag")?;
8787
let dec_ref_base_pic_marking = if store_ref_base_pic_flag {
8888
Some(read_dec_ref_base_pic_marking(&mut r)?)
8989
} else {
9090
None
9191
};
9292
let additional_prefix_nal_unit_extension_flag =
93-
r.read_bool("additional_prefix_nal_unit_extension_flag")?;
93+
r.read_bit("additional_prefix_nal_unit_extension_flag")?;
9494
Some(PrefixNalUnitRef {
9595
store_ref_base_pic_flag,
9696
dec_ref_base_pic_marking,

src/nal/sei/buffering_period.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ fn read_cpb_removal_delay_list<R: BitRead>(
3636
let mut res = vec![];
3737
for _ in 0..count {
3838
res.push(InitialCpbRemoval {
39-
initial_cpb_removal_delay: r.read(length, "initial_cpb_removal_delay")?,
40-
initial_cpb_removal_delay_offset: r.read(length, "initial_cpb_removal_delay_offset")?,
39+
initial_cpb_removal_delay: r.read_var(length, "initial_cpb_removal_delay")?,
40+
initial_cpb_removal_delay_offset: r
41+
.read_var(length, "initial_cpb_removal_delay_offset")?,
4142
});
4243
}
4344
Ok(res)

0 commit comments

Comments
 (0)