1
+ mod segment;
2
+
1
3
use 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 ;
3
6
use crate :: ebml:: EbmlProperties ;
4
7
use crate :: error:: Result ;
5
8
use crate :: macros:: decode_err;
@@ -15,35 +18,38 @@ where
15
18
// new ones all scattered throughout the file
16
19
let mut properties = EbmlProperties :: default ( ) ;
17
20
21
+ let mut ebml_tag = None ;
22
+
18
23
let mut element_reader = ElementReader :: new ( reader) ;
19
24
20
25
// First we need to go through the elements in the EBML master element
21
26
read_ebml_header ( & mut element_reader, parse_options, & mut properties) ?;
22
27
23
28
loop {
24
- let ident;
25
- let data_ty;
26
- let size;
27
-
28
29
let res = element_reader. next ( ) ?;
29
30
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 ;
35
34
} ,
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 ( ) ) ?;
39
43
continue ;
40
44
} ,
41
- ElementReaderYield :: Eof => break ,
45
+ _ => {
46
+ decode_err ! ( @BAIL Ebml , "File does not contain a segment element" )
47
+ } ,
42
48
}
43
49
}
44
50
45
51
Ok ( EbmlFile {
46
- ebml_tag : None ,
52
+ ebml_tag,
47
53
properties,
48
54
} )
49
55
}
78
84
} ,
79
85
ElementReaderYield :: Unknown ( element) => {
80
86
log:: debug!(
81
- "Encountered unknown EBML element in header: {}" ,
87
+ "Encountered unknown EBML element in header: {:X }" ,
82
88
element. id. 0
83
89
) ;
84
90
element_reader. skip ( element. size . value ( ) ) ?;
0 commit comments