1+ mod segment;
2+
13use super :: EbmlFile ;
2- use crate :: ebml:: element_reader:: { ElementIdent , ElementReader , ElementReaderYield } ;
4+ use crate :: ebml:: element_reader:: { ElementHeader , ElementIdent , ElementReader , ElementReaderYield } ;
5+ use crate :: ebml:: vint:: VInt ;
36use crate :: ebml:: EbmlProperties ;
47use crate :: error:: Result ;
58use crate :: macros:: decode_err;
@@ -15,35 +18,38 @@ where
1518 // new ones all scattered throughout the file
1619 let mut properties = EbmlProperties :: default ( ) ;
1720
21+ let mut ebml_tag = None ;
22+
1823 let mut element_reader = ElementReader :: new ( reader) ;
1924
2025 // First we need to go through the elements in the EBML master element
2126 read_ebml_header ( & mut element_reader, parse_options, & mut properties) ?;
2227
2328 loop {
24- let ident;
25- let data_ty;
26- let size;
27-
2829 let res = element_reader. next ( ) ?;
2930 match res {
30- ElementReaderYield :: Master ( _) => continue ,
31- ElementReaderYield :: Child ( ( child, size_) ) => {
32- ident = child. ident ;
33- data_ty = child. data_type ;
34- size = size_;
31+ ElementReaderYield :: Master ( ( ElementIdent :: Segment , _) ) => {
32+ ebml_tag = segment:: read_from ( & mut element_reader, parse_options, & mut properties) ?;
33+ break ;
3534 } ,
36- ElementReaderYield :: Unknown ( element) => {
37- log:: debug!( "Encountered unknown EBML element: {}" , element. id. 0 ) ;
38- element_reader. skip ( element. size . value ( ) ) ?;
35+ // CRC-32 (0xBF) and Void (0xEC) elements can occur at the top level.
36+ // This is valid, and we can just skip them.
37+ ElementReaderYield :: Unknown ( ElementHeader {
38+ id : VInt ( id @ ( 0xBF | 0xEC ) ) ,
39+ size,
40+ } ) => {
41+ log:: debug!( "Skipping global element: {:X}" , id) ;
42+ element_reader. skip ( size. value ( ) ) ?;
3943 continue ;
4044 } ,
41- ElementReaderYield :: Eof => break ,
45+ _ => {
46+ decode_err ! ( @BAIL Ebml , "File does not contain a segment element" )
47+ } ,
4248 }
4349 }
4450
4551 Ok ( EbmlFile {
46- ebml_tag : None ,
52+ ebml_tag,
4753 properties,
4854 } )
4955}
7884 } ,
7985 ElementReaderYield :: Unknown ( element) => {
8086 log:: debug!(
81- "Encountered unknown EBML element in header: {}" ,
87+ "Encountered unknown EBML element in header: {:X }" ,
8288 element. id. 0
8389 ) ;
8490 element_reader. skip ( element. size . value ( ) ) ?;
0 commit comments