Skip to content

Commit 241f3a0

Browse files
committed
test(h265): add hrd parameter test
1 parent c399619 commit 241f3a0

File tree

1 file changed

+232
-0
lines changed

1 file changed

+232
-0
lines changed

crates/h265/src/sps/vui_parameters/hrd_parameters.rs

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,3 +412,235 @@ impl SubLayerHrdParameters {
412412
(value + 1) * 2u64.pow(4 + cpb_size_scale as u32)
413413
}
414414
}
415+
416+
#[cfg(test)]
417+
#[cfg_attr(all(test, coverage_nightly), coverage(off))]
418+
mod tests {
419+
use byteorder::WriteBytesExt;
420+
use scuffle_bytes_util::{BitReader, BitWriter};
421+
use scuffle_expgolomb::BitWriterExpGolombExt;
422+
423+
use super::HrdParameters;
424+
425+
#[test]
426+
fn test_parse() {
427+
let mut data = Vec::new();
428+
let mut bit_writer = BitWriter::new(&mut data);
429+
430+
bit_writer.write_bit(true).unwrap(); // nal_hrd_parameters_present_flag
431+
bit_writer.write_bit(true).unwrap(); // vcl_hrd_parameters_present_flag
432+
433+
bit_writer.write_bit(false).unwrap(); // sub_pic_hrd_params_present_flag
434+
bit_writer.write_bits(0, 4).unwrap(); // bit_rate_scale
435+
bit_writer.write_bits(0, 4).unwrap(); // cpb_size_scale
436+
bit_writer.write_bits(0, 5).unwrap(); // initial_cpb_removal_delay_length_minus1
437+
bit_writer.write_bits(0, 5).unwrap(); // au_cpb_removal_delay_length_minus1
438+
bit_writer.write_bits(0, 5).unwrap(); // dpb_output_delay_length_minus1
439+
440+
// Sub-layers
441+
bit_writer.write_bit(true).unwrap(); // fixed_pic_rate_general_flag
442+
443+
bit_writer.write_exp_golomb(0).unwrap(); // elemental_duration_in_tc_minus1
444+
445+
bit_writer.write_exp_golomb(0).unwrap(); // cpb_cnt_minus1
446+
447+
// SubLayerHrdParameters
448+
bit_writer.write_exp_golomb(0).unwrap(); // bit_rate_value_minus1
449+
bit_writer.write_exp_golomb(0).unwrap(); // cpb_size_value_minus1
450+
bit_writer.write_bit(false).unwrap(); // cbr_flag
451+
452+
// SubLayerHrdParameters
453+
bit_writer.write_exp_golomb(0).unwrap(); // bit_rate_value_minus1
454+
bit_writer.write_exp_golomb(0).unwrap(); // cpb_size_value_minus1
455+
bit_writer.write_bit(false).unwrap(); // cbr_flag
456+
457+
bit_writer.write_bits(0, 8).unwrap(); // fill remaining bits
458+
459+
let mut bit_reader = BitReader::new(&data[..]);
460+
let hrd_parameters = HrdParameters::parse(&mut bit_reader, true, 0).unwrap();
461+
assert_eq!(hrd_parameters.common_inf.bit_rate_scale, Some(0));
462+
assert_eq!(hrd_parameters.common_inf.cpb_size_scale, Some(0));
463+
assert_eq!(hrd_parameters.common_inf.initial_cpb_removal_delay_length_minus1, 0);
464+
assert_eq!(hrd_parameters.common_inf.au_cpb_removal_delay_length_minus1, 0);
465+
assert_eq!(hrd_parameters.common_inf.dpb_output_delay_length_minus1, 0);
466+
assert_eq!(hrd_parameters.sub_layers.len(), 1);
467+
assert!(hrd_parameters.sub_layers[0].fixed_pic_rate_general_flag);
468+
assert!(hrd_parameters.sub_layers[0].fixed_pic_rate_within_cvs_flag);
469+
assert_eq!(hrd_parameters.sub_layers[0].elemental_duration_in_tc_minus1, Some(0));
470+
assert!(!hrd_parameters.sub_layers[0].low_delay_hrd_flag);
471+
assert_eq!(hrd_parameters.sub_layers[0].cpb_cnt_minus1, 0);
472+
assert_eq!(hrd_parameters.sub_layers[0].sub_layer_parameters.len(), 2);
473+
assert_eq!(hrd_parameters.sub_layers[0].sub_layer_parameters[0].bit_rate_value_minus1, 0);
474+
assert_eq!(hrd_parameters.sub_layers[0].sub_layer_parameters[0].cpb_size_value_minus1, 0);
475+
assert_eq!(
476+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].cpb_size_du_value_minus1,
477+
None
478+
);
479+
assert_eq!(
480+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].bit_rate_du_value_minus1,
481+
None
482+
);
483+
assert!(!hrd_parameters.sub_layers[0].sub_layer_parameters[0].cbr_flag);
484+
assert_eq!(hrd_parameters.sub_layers[0].sub_layer_parameters[1].bit_rate_value_minus1, 0);
485+
assert_eq!(hrd_parameters.sub_layers[0].sub_layer_parameters[1].cpb_size_value_minus1, 0);
486+
assert_eq!(
487+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].cpb_size_du_value_minus1,
488+
None
489+
);
490+
assert_eq!(
491+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].bit_rate_du_value_minus1,
492+
None
493+
);
494+
assert!(!hrd_parameters.sub_layers[0].sub_layer_parameters[1].cbr_flag);
495+
496+
assert_eq!(
497+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].bit_rate(false, 0, 0, 0, 0),
498+
64
499+
);
500+
assert_eq!(
501+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].bit_rate(true, 0, 0, 0, 0),
502+
64
503+
);
504+
assert_eq!(
505+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].bit_rate(false, 0, 0, 0, 0),
506+
64
507+
);
508+
assert_eq!(
509+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].bit_rate(true, 0, 0, 0, 0),
510+
64
511+
);
512+
513+
assert_eq!(
514+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].cpb_size(false, 0, 0, 0, 0),
515+
16
516+
);
517+
assert_eq!(
518+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].cpb_size(true, 0, 0, 0, 0),
519+
16
520+
);
521+
assert_eq!(
522+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].cpb_size(false, 0, 0, 0, 0),
523+
16
524+
);
525+
assert_eq!(
526+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].cpb_size(true, 0, 0, 0, 0),
527+
16
528+
);
529+
}
530+
531+
#[test]
532+
fn test_parse_sub_pic_hrd_params_present_flag() {
533+
let mut data = Vec::new();
534+
let mut bit_writer = BitWriter::new(&mut data);
535+
536+
bit_writer.write_bit(true).unwrap(); // nal_hrd_parameters_present_flag
537+
bit_writer.write_bit(true).unwrap(); // vcl_hrd_parameters_present_flag
538+
539+
bit_writer.write_bit(true).unwrap(); // sub_pic_hrd_params_present_flag
540+
bit_writer.write_u8(42).unwrap(); // tick_divisor_minus2
541+
bit_writer.write_bits(0, 5).unwrap(); // du_cpb_removal_delay_increment_length_minus1
542+
bit_writer.write_bit(false).unwrap(); // sub_pic_cpb_params_in_pic_timing_sei_flag
543+
bit_writer.write_bits(0, 5).unwrap(); // dpb_output_delay_du_length_minus1
544+
bit_writer.write_bits(0, 4).unwrap(); // bit_rate_scale
545+
bit_writer.write_bits(0, 4).unwrap(); // cpb_size_scale
546+
bit_writer.write_bits(0, 4).unwrap(); // cpb_size_du_scale
547+
bit_writer.write_bits(0, 5).unwrap(); // initial_cpb_removal_delay_length_minus1
548+
bit_writer.write_bits(0, 5).unwrap(); // au_cpb_removal_delay_length_minus1
549+
bit_writer.write_bits(0, 5).unwrap(); // dpb_output_delay_length_minus1
550+
551+
// Sub-layers
552+
bit_writer.write_bit(true).unwrap(); // fixed_pic_rate_general_flag
553+
554+
bit_writer.write_exp_golomb(0).unwrap(); // elemental_duration_in_tc_minus1
555+
556+
bit_writer.write_exp_golomb(0).unwrap(); // cpb_cnt_minus1
557+
558+
// SubLayerHrdParameters
559+
bit_writer.write_exp_golomb(0).unwrap(); // bit_rate_value_minus1
560+
bit_writer.write_exp_golomb(0).unwrap(); // cpb_size_value_minus1
561+
bit_writer.write_exp_golomb(0).unwrap(); // cpb_size_du_value_minus1
562+
bit_writer.write_exp_golomb(0).unwrap(); // bit_rate_du_value_minus1
563+
bit_writer.write_bit(false).unwrap(); // cbr_flag
564+
565+
// SubLayerHrdParameters
566+
bit_writer.write_exp_golomb(0).unwrap(); // bit_rate_value_minus1
567+
bit_writer.write_exp_golomb(0).unwrap(); // cpb_size_value_minus1
568+
bit_writer.write_exp_golomb(0).unwrap(); // cpb_size_du_value_minus1
569+
bit_writer.write_exp_golomb(0).unwrap(); // bit_rate_du_value_minus1
570+
bit_writer.write_bit(false).unwrap(); // cbr_flag
571+
572+
bit_writer.write_bits(0, 8).unwrap(); // fill remaining bits
573+
574+
let mut bit_reader = BitReader::new(&data[..]);
575+
let hrd_parameters = HrdParameters::parse(&mut bit_reader, true, 0).unwrap();
576+
assert_eq!(hrd_parameters.common_inf.bit_rate_scale, Some(0));
577+
assert_eq!(hrd_parameters.common_inf.cpb_size_scale, Some(0));
578+
assert_eq!(hrd_parameters.common_inf.initial_cpb_removal_delay_length_minus1, 0);
579+
assert_eq!(hrd_parameters.common_inf.au_cpb_removal_delay_length_minus1, 0);
580+
assert_eq!(hrd_parameters.common_inf.dpb_output_delay_length_minus1, 0);
581+
assert!(hrd_parameters.common_inf.sub_pic_hrd_params.is_some());
582+
assert_eq!(hrd_parameters.sub_layers.len(), 1);
583+
assert!(hrd_parameters.sub_layers[0].fixed_pic_rate_general_flag);
584+
assert!(hrd_parameters.sub_layers[0].fixed_pic_rate_within_cvs_flag);
585+
assert_eq!(hrd_parameters.sub_layers[0].elemental_duration_in_tc_minus1, Some(0));
586+
assert!(!hrd_parameters.sub_layers[0].low_delay_hrd_flag);
587+
assert_eq!(hrd_parameters.sub_layers[0].cpb_cnt_minus1, 0);
588+
assert_eq!(hrd_parameters.sub_layers[0].sub_layer_parameters.len(), 2);
589+
assert_eq!(hrd_parameters.sub_layers[0].sub_layer_parameters[0].bit_rate_value_minus1, 0);
590+
assert_eq!(hrd_parameters.sub_layers[0].sub_layer_parameters[0].cpb_size_value_minus1, 0);
591+
assert_eq!(
592+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].cpb_size_du_value_minus1,
593+
Some(0)
594+
);
595+
assert_eq!(
596+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].bit_rate_du_value_minus1,
597+
Some(0)
598+
);
599+
assert!(!hrd_parameters.sub_layers[0].sub_layer_parameters[0].cbr_flag);
600+
assert_eq!(hrd_parameters.sub_layers[0].sub_layer_parameters[1].bit_rate_value_minus1, 0);
601+
assert_eq!(hrd_parameters.sub_layers[0].sub_layer_parameters[1].cpb_size_value_minus1, 0);
602+
assert_eq!(
603+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].cpb_size_du_value_minus1,
604+
Some(0)
605+
);
606+
assert_eq!(
607+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].bit_rate_du_value_minus1,
608+
Some(0)
609+
);
610+
assert!(!hrd_parameters.sub_layers[0].sub_layer_parameters[1].cbr_flag);
611+
612+
assert_eq!(
613+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].bit_rate(false, 0, 0, 0, 0),
614+
64
615+
);
616+
assert_eq!(
617+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].bit_rate(true, 0, 0, 0, 0),
618+
64
619+
);
620+
assert_eq!(
621+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].bit_rate(false, 0, 0, 0, 0),
622+
64
623+
);
624+
assert_eq!(
625+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].bit_rate(true, 0, 0, 0, 0),
626+
64
627+
);
628+
629+
assert_eq!(
630+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].cpb_size(false, 0, 0, 0, 0),
631+
16
632+
);
633+
assert_eq!(
634+
hrd_parameters.sub_layers[0].sub_layer_parameters[0].cpb_size(true, 0, 0, 0, 0),
635+
16
636+
);
637+
assert_eq!(
638+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].cpb_size(false, 0, 0, 0, 0),
639+
16
640+
);
641+
assert_eq!(
642+
hrd_parameters.sub_layers[0].sub_layer_parameters[1].cpb_size(true, 0, 0, 0, 0),
643+
16
644+
);
645+
}
646+
}

0 commit comments

Comments
 (0)