@@ -12,20 +12,58 @@ use lofty_attr::ebml_master_elements;
1212pub struct ElementHeader {
1313 pub ( crate ) id : ElementId ,
1414 pub ( crate ) size : VInt < u64 > ,
15+ /// Number of bytes that the `id` field occupied when parsed
16+ pub ( crate ) size_of_id : u8 ,
17+ /// Number of bytes that the `size` field occupied when parsed
18+ pub ( crate ) size_of_size : u8 ,
1519}
1620
1721impl ElementHeader {
1822 fn read < R > ( reader : & mut R , max_id_length : u8 , max_vint_length : u8 ) -> Result < Self >
1923 where
2024 R : Read ,
2125 {
26+ let ( id, id_bytes_read) = ElementId :: parse ( reader, max_id_length) ?;
27+ let ( size, size_bytes_read) = VInt :: < u64 > :: parse ( reader, max_vint_length) ?;
28+
2229 Ok ( Self {
23- id : ElementId :: parse ( reader, max_id_length) ?,
24- size : VInt :: < u64 > :: parse ( reader, max_vint_length) ?,
30+ id,
31+ size,
32+ size_of_id : id_bytes_read,
33+ size_of_size : size_bytes_read,
2534 } )
2635 }
2736}
2837
38+ /// Same as [`ElementHeader`], but with a known ID
39+ #[ derive( Copy , Clone , Eq , PartialEq , Debug ) ]
40+ pub struct KnownElementHeader {
41+ pub ( crate ) id : ElementIdent ,
42+ pub ( crate ) size : VInt < u64 > ,
43+ /// Number of bytes that the `id` field occupied when parsed
44+ pub ( crate ) size_of_id : u8 ,
45+ /// Number of bytes that the `size` field occupied when parsed
46+ pub ( crate ) size_of_size : u8 ,
47+ }
48+
49+ impl KnownElementHeader {
50+ /// The number of bytes the header took occupied when parsed
51+ pub fn len ( self ) -> usize {
52+ ( self . size_of_id + self . size_of_size ) as usize
53+ }
54+ }
55+
56+ impl From < KnownElementHeader > for ElementHeader {
57+ fn from ( header : KnownElementHeader ) -> Self {
58+ Self {
59+ id : ElementId ( header. id as u64 ) ,
60+ size : header. size ,
61+ size_of_id : header. size_of_id ,
62+ size_of_size : header. size_of_size ,
63+ }
64+ }
65+ }
66+
2967#[ derive( Copy , Clone , Eq , PartialEq , Debug ) ]
3068pub enum ElementDataType {
3169 SignedInt ,
@@ -255,7 +293,7 @@ ebml_master_elements! {
255293 children: [
256294 FileDescription : { 0x467E , String } ,
257295 FileName : { 0x466E , Utf8 } ,
258- FileMimeType : { 0x4660 , String } ,
296+ FileMediaType : { 0x4660 , String } ,
259297 FileData : { 0x465C , Binary } ,
260298 FileUID : { 0x46AE , UnsignedInt } ,
261299 FileReferral : { 0x4675 , Binary } ,
@@ -348,29 +386,30 @@ impl ElementReaderContext {
348386 }
349387}
350388
351- #[ derive( Debug ) ]
389+ #[ derive( Copy , Clone , Debug ) ]
352390pub ( crate ) enum ElementReaderYield {
353- Master ( ( ElementIdent , VInt < u64 > ) ) ,
391+ Master ( KnownElementHeader ) ,
354392 Child ( ( ChildElementDescriptor , VInt < u64 > ) ) ,
355393 Unknown ( ElementHeader ) ,
356394 Eof ,
357395}
358396
359397impl ElementReaderYield {
360- pub fn ident ( & self ) -> Option < u64 > {
398+ pub fn ident ( & self ) -> Option < ElementId > {
361399 match self {
362- ElementReaderYield :: Master ( ( ident, _) ) => Some ( * ident as u64 ) ,
363- ElementReaderYield :: Child ( ( child, _) ) => Some ( child. ident as u64 ) ,
364- ElementReaderYield :: Unknown ( header) => Some ( header. id . value ( ) ) ,
400+ ElementReaderYield :: Master ( KnownElementHeader { id, .. } ) => {
401+ Some ( ElementId ( * id as u64 ) )
402+ } ,
403+ ElementReaderYield :: Child ( ( child, _) ) => Some ( ElementId ( child. ident as u64 ) ) ,
404+ ElementReaderYield :: Unknown ( header) => Some ( header. id ) ,
365405 _ => None ,
366406 }
367407 }
368408
369409 pub fn size ( & self ) -> Option < u64 > {
370410 match self {
371- ElementReaderYield :: Master ( ( _, size) ) | ElementReaderYield :: Child ( ( _, size) ) => {
372- Some ( size. value ( ) )
373- } ,
411+ ElementReaderYield :: Master ( KnownElementHeader { size, .. } )
412+ | ElementReaderYield :: Child ( ( _, size) ) => Some ( size. value ( ) ) ,
374413 ElementReaderYield :: Unknown ( header) => Some ( header. size . value ( ) ) ,
375414 _ => None ,
376415 }
@@ -421,13 +460,21 @@ impl<R> ElementReader<R>
421460where
422461 R : Read ,
423462{
424- pub ( crate ) fn new ( reader : R ) -> Self {
463+ pub fn new ( reader : R ) -> Self {
425464 Self {
426465 reader,
427466 ctx : ElementReaderContext :: default ( ) ,
428467 }
429468 }
430469
470+ pub fn into_inner ( self ) -> R {
471+ self . reader
472+ }
473+
474+ pub fn inner ( & self ) -> & R {
475+ & self . reader
476+ }
477+
431478 pub ( crate ) fn set_max_id_length ( & mut self , len : u8 ) {
432479 self . ctx . max_id_length = len
433480 }
@@ -437,7 +484,7 @@ where
437484 }
438485
439486 fn push_new_master ( & mut self , master : MasterElement , size : VInt < u64 > ) -> Result < ( ) > {
440- log:: debug !( "New master element: {:?}" , master. id) ;
487+ log:: trace !( "New master element: {:?}" , master. id) ;
441488
442489 if self . ctx . depth == MAX_DEPTH {
443490 decode_err ! ( @BAIL Ebml , "Maximum depth reached" ) ;
@@ -477,8 +524,7 @@ where
477524 }
478525
479526 if self . ctx . depth == ROOT_DEPTH {
480- return Err ( io:: Error :: new (
481- io:: ErrorKind :: Other ,
527+ return Err ( io:: Error :: other (
482528 "Cannot go to previous master element, already at root" ,
483529 ) ) ;
484530 }
@@ -504,7 +550,12 @@ where
504550
505551 self . push_new_master ( * master, header. size ) ?;
506552
507- Ok ( ElementReaderYield :: Master ( ( master. id , header. size ) ) )
553+ Ok ( ElementReaderYield :: Master ( KnownElementHeader {
554+ id : master. id ,
555+ size : header. size ,
556+ size_of_id : header. size_of_id ,
557+ size_of_size : header. size_of_size ,
558+ } ) )
508559 }
509560
510561 pub ( crate ) fn next ( & mut self ) -> Result < ElementReaderYield > {
@@ -539,7 +590,12 @@ where
539590 self . push_new_master ( master, header. size ) ?;
540591
541592 // We encountered a nested master element
542- return Ok ( ElementReaderYield :: Master ( ( child. ident , header. size ) ) ) ;
593+ return Ok ( ElementReaderYield :: Master ( KnownElementHeader {
594+ id : child. ident ,
595+ size : header. size ,
596+ size_of_id : header. size_of_id ,
597+ size_of_size : header. size_of_size ,
598+ } ) ) ;
543599 }
544600
545601 Ok ( ElementReaderYield :: Child ( ( * child, header. size ) ) )
@@ -593,7 +649,7 @@ where
593649 }
594650
595651 pub ( crate ) fn skip_element ( & mut self , element_header : ElementHeader ) -> Result < ( ) > {
596- log:: debug !(
652+ log:: trace !(
597653 "Encountered unknown EBML element: {:X}, skipping" ,
598654 element_header. id. 0
599655 ) ;
@@ -608,6 +664,11 @@ where
608664 decode_err ! ( @BAIL Ebml , "Invalid size for signed int element" )
609665 }
610666
667+ // "a Signed Integer Element with a zero-octet length represents an integer value of zero."
668+ if element_length == 0 {
669+ return Ok ( 0 ) ;
670+ }
671+
611672 let mut buf = [ 0 ; 8 ] ;
612673 self . read_exact ( & mut buf[ 8 - element_length as usize ..] ) ?;
613674 let value = u64:: from_be_bytes ( buf) ;
@@ -625,6 +686,11 @@ where
625686 decode_err ! ( @BAIL Ebml , "Invalid size for unsigned int element" )
626687 }
627688
689+ // "an Unsigned Integer Element with a zero-octet length represents an integer value of zero."
690+ if element_length == 0 {
691+ return Ok ( 0 ) ;
692+ }
693+
628694 let mut buf = [ 0 ; 8 ] ;
629695 self . read_exact ( & mut buf[ 8 - element_length as usize ..] ) ?;
630696 Ok ( u64:: from_be_bytes ( buf) )
@@ -634,7 +700,7 @@ where
634700 pub ( crate ) fn read_flag ( & mut self , element_length : u64 ) -> Result < bool > {
635701 let val = self . read_unsigned_int ( element_length) ?;
636702 if val > 1 {
637- log:: warn!( "Flag value `{}` is out of range, assuming true" , val ) ;
703+ log:: warn!( "Flag value `{val }` is out of range, assuming true" ) ;
638704 }
639705
640706 Ok ( val != 0 )
@@ -722,14 +788,18 @@ where
722788 Self { reader }
723789 }
724790
725- pub ( crate ) fn next ( & mut self ) -> Result < Option < ElementReaderYield > > {
791+ pub ( crate ) fn next ( & mut self ) -> Option < Result < ElementReaderYield > > {
726792 match self . reader . next ( ) {
727793 Ok ( ElementReaderYield :: Unknown ( header) ) => {
728- self . reader . skip_element ( header) ?;
794+ if let Err ( e) = self . reader . skip_element ( header) {
795+ return Some ( Err ( e) ) ;
796+ }
797+
729798 self . next ( )
730799 } ,
731- Err ( e) => Err ( e) ,
732- element => element. map ( Some ) ,
800+ Ok ( ElementReaderYield :: Eof ) => None ,
801+ Err ( e) => Some ( Err ( e) ) ,
802+ element => Some ( element) ,
733803 }
734804 }
735805
0 commit comments