@@ -13,7 +13,7 @@ use byteorder::{BigEndian, ReadBytesExt};
1313
1414pub ( crate ) enum ParsedFrame < ' a > {
1515 Next ( Frame < ' a > ) ,
16- Skipped ,
16+ Skip { size : u32 } ,
1717 Eof ,
1818}
1919
@@ -26,13 +26,15 @@ impl<'a> ParsedFrame<'a> {
2626 where
2727 R : Read ,
2828 {
29+ let mut size = 0u32 ;
30+
2931 // The header will be upgraded to ID3v2.4 past this point, so they can all be treated the same
3032 let parse_header_result = match version {
31- Id3v2Version :: V2 => parse_v2_header ( reader) ,
32- Id3v2Version :: V3 => parse_header ( reader, false ) ,
33- Id3v2Version :: V4 => parse_header ( reader, true ) ,
33+ Id3v2Version :: V2 => parse_v2_header ( reader, & mut size ) ,
34+ Id3v2Version :: V3 => parse_header ( reader, & mut size , false ) ,
35+ Id3v2Version :: V4 => parse_header ( reader, & mut size , true ) ,
3436 } ;
35- let ( id, mut size , mut flags) = match parse_header_result {
37+ let ( id, mut flags) = match parse_header_result {
3638 Ok ( None ) => {
3739 // Stop reading
3840 return Ok ( Self :: Eof ) ;
@@ -44,7 +46,7 @@ impl<'a> ParsedFrame<'a> {
4446 ParsingMode :: BestAttempt | ParsingMode :: Relaxed => {
4547 // Skip this frame and continue reading
4648 // TODO: Log error?
47- return Ok ( Self :: Skipped ) ;
49+ return Ok ( Self :: Skip { size } ) ;
4850 } ,
4951 }
5052 } ,
@@ -116,14 +118,28 @@ impl<'a> ParsedFrame<'a> {
116118 return handle_encryption ( & mut compression_reader, size, id, flags) ;
117119 }
118120
119- return parse_frame ( & mut compression_reader, id, flags, version, parse_mode) ;
121+ return parse_frame (
122+ & mut compression_reader,
123+ size,
124+ id,
125+ flags,
126+ version,
127+ parse_mode,
128+ ) ;
120129 }
121130
122131 if flags. encryption . is_some ( ) {
123132 return handle_encryption ( & mut unsynchronized_reader, size, id, flags) ;
124133 }
125134
126- return parse_frame ( & mut unsynchronized_reader, id, flags, version, parse_mode) ;
135+ return parse_frame (
136+ & mut unsynchronized_reader,
137+ size,
138+ id,
139+ flags,
140+ version,
141+ parse_mode,
142+ ) ;
127143 } ,
128144 // Possible combinations:
129145 //
@@ -138,7 +154,14 @@ impl<'a> ParsedFrame<'a> {
138154 return handle_encryption ( & mut compression_reader, size, id, flags) ;
139155 }
140156
141- return parse_frame ( & mut compression_reader, id, flags, version, parse_mode) ;
157+ return parse_frame (
158+ & mut compression_reader,
159+ size,
160+ id,
161+ flags,
162+ version,
163+ parse_mode,
164+ ) ;
142165 } ,
143166 // Possible combinations:
144167 //
@@ -151,7 +174,7 @@ impl<'a> ParsedFrame<'a> {
151174 } ,
152175 // Everything else that doesn't have special flags
153176 _ => {
154- return parse_frame ( & mut reader, id, flags, version, parse_mode) ;
177+ return parse_frame ( & mut reader, size , id, flags, version, parse_mode) ;
155178 } ,
156179 }
157180 }
@@ -194,13 +217,14 @@ fn handle_encryption<R: Read>(
194217
195218fn parse_frame < R : Read > (
196219 reader : & mut R ,
220+ size : u32 ,
197221 id : FrameId < ' static > ,
198222 flags : FrameFlags ,
199223 version : Id3v2Version ,
200224 parse_mode : ParsingMode ,
201225) -> Result < ParsedFrame < ' static > > {
202226 match parse_content ( reader, id. as_str ( ) , version, parse_mode) ? {
203227 Some ( value) => Ok ( ParsedFrame :: Next ( Frame { id, value, flags } ) ) ,
204- None => Ok ( ParsedFrame :: Skipped ) ,
228+ None => Ok ( ParsedFrame :: Skip { size } ) ,
205229 }
206230}
0 commit comments