@@ -375,3 +375,113 @@ impl BitStreamRestriction {
375375 self . min_spatial_segmentation_idc + 4
376376 }
377377}
378+
379+ #[ cfg( test) ]
380+ #[ cfg_attr( all( test, coverage_nightly) , coverage( off) ) ]
381+ mod tests {
382+ use std:: io:: { Read , Write } ;
383+ use std:: num:: NonZero ;
384+
385+ use byteorder:: { BigEndian , WriteBytesExt } ;
386+ use scuffle_bytes_util:: { BitReader , BitWriter } ;
387+ use scuffle_expgolomb:: BitWriterExpGolombExt ;
388+
389+ use crate :: sps:: vui_parameters:: { BitStreamRestriction , DefaultDisplayWindow } ;
390+ use crate :: { AspectRatioIdc , ConformanceWindow , VideoFormat , VuiParameters } ;
391+
392+ #[ test]
393+ fn vui_parameters ( ) {
394+ let mut data = Vec :: new ( ) ;
395+ let mut writer = BitWriter :: new ( & mut data) ;
396+
397+ writer. write_bit ( true ) . unwrap ( ) ; // aspect_ratio_info_present_flag
398+ writer. write_u8 ( AspectRatioIdc :: ExtendedSar . 0 ) . unwrap ( ) ; // aspect_ratio_idc
399+ writer. write_u16 :: < BigEndian > ( 1 ) . unwrap ( ) ; // sar_width
400+ writer. write_u16 :: < BigEndian > ( 1 ) . unwrap ( ) ; // sar_height
401+
402+ writer. write_bit ( true ) . unwrap ( ) ; // overscan_info_present_flag
403+ writer. write_bit ( true ) . unwrap ( ) ; // overscan_appropriate_flag
404+
405+ writer. write_bit ( false ) . unwrap ( ) ; // video_signal_type_present_flag
406+ writer. write_bit ( false ) . unwrap ( ) ; // chroma_loc_info_present_flag
407+ writer. write_bit ( false ) . unwrap ( ) ; // neutral_chroma_indication_flag
408+ writer. write_bit ( false ) . unwrap ( ) ; // field_seq_flag
409+ writer. write_bit ( false ) . unwrap ( ) ; // frame_field_info_present_flag
410+
411+ writer. write_bit ( true ) . unwrap ( ) ; // default_display_window_flag
412+ writer. write_exp_golomb ( 0 ) . unwrap ( ) ; // def_disp_win_left_offset
413+ writer. write_exp_golomb ( 10 ) . unwrap ( ) ; // def_disp_win_right_offset
414+ writer. write_exp_golomb ( 0 ) . unwrap ( ) ; // def_disp_win_top_offset
415+ writer. write_exp_golomb ( 10 ) . unwrap ( ) ; // def_disp_win_bottom_offset
416+
417+ writer. write_bit ( false ) . unwrap ( ) ; // vui_timing_info_present_flag
418+ writer. write_bit ( false ) . unwrap ( ) ; // bitstream_restriction_flag
419+
420+ writer. write_bits ( 0 , 5 ) . unwrap ( ) ; // fill the byte
421+ writer. flush ( ) . unwrap ( ) ;
422+
423+ for b in data. bytes ( ) {
424+ print ! ( "{:08b} " , b. unwrap( ) ) ;
425+ }
426+
427+ let vui_parameters = VuiParameters :: parse (
428+ & mut BitReader :: new ( data. as_slice ( ) ) ,
429+ 0 ,
430+ 8 ,
431+ 8 ,
432+ 1 ,
433+ false ,
434+ false ,
435+ false ,
436+ & ConformanceWindow {
437+ conf_win_left_offset : 2 ,
438+ conf_win_right_offset : 2 ,
439+ conf_win_top_offset : 2 ,
440+ conf_win_bottom_offset : 2 ,
441+ } ,
442+ 1 ,
443+ NonZero :: new ( 1920 ) . unwrap ( ) ,
444+ 1 ,
445+ NonZero :: new ( 1080 ) . unwrap ( ) ,
446+ )
447+ . unwrap ( ) ;
448+
449+ assert_eq ! (
450+ vui_parameters. aspect_ratio_info,
451+ super :: AspectRatioInfo :: ExtendedSar {
452+ sar_width: 1 ,
453+ sar_height: 1
454+ }
455+ ) ;
456+ assert_eq ! ( vui_parameters. overscan_appropriate_flag, Some ( true ) ) ;
457+ assert_eq ! ( vui_parameters. video_signal_type. video_format, VideoFormat :: Unspecified ) ;
458+ assert ! ( !vui_parameters. video_signal_type. video_full_range_flag) ;
459+ assert_eq ! ( vui_parameters. video_signal_type. color_primaries, 2 ) ;
460+ assert_eq ! ( vui_parameters. video_signal_type. transfer_characteristics, 2 ) ;
461+ assert_eq ! ( vui_parameters. video_signal_type. matrix_coeffs, 2 ) ;
462+ assert_eq ! ( vui_parameters. chroma_loc_info, None ) ;
463+ assert ! ( !vui_parameters. neutral_chroma_indication_flag) ;
464+ assert ! ( !vui_parameters. field_seq_flag) ;
465+ assert ! ( !vui_parameters. frame_field_info_present_flag) ;
466+ assert_eq ! (
467+ vui_parameters. default_display_window,
468+ DefaultDisplayWindow {
469+ def_disp_win_left_offset: 0 ,
470+ def_disp_win_right_offset: 10 ,
471+ def_disp_win_top_offset: 0 ,
472+ def_disp_win_bottom_offset: 10 ,
473+ left_offset: 2 ,
474+ right_offset: 12 ,
475+ top_offset: 2 ,
476+ bottom_offset: 12
477+ }
478+ ) ;
479+ assert_eq ! ( vui_parameters. default_display_window. left_offset( ) , 2 ) ;
480+ assert_eq ! ( vui_parameters. default_display_window. right_offset( ) , 12 ) ;
481+ assert_eq ! ( vui_parameters. default_display_window. top_offset( ) , 2 ) ;
482+ assert_eq ! ( vui_parameters. default_display_window. bottom_offset( ) , 12 ) ;
483+ assert_eq ! ( vui_parameters. vui_timing_info, None ) ;
484+ assert_eq ! ( vui_parameters. bitstream_restriction, BitStreamRestriction :: default ( ) ) ;
485+ assert_eq ! ( vui_parameters. bitstream_restriction. min_spatial_segmentation_times4( ) , 4 ) ;
486+ }
487+ }
0 commit comments