@@ -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