diff options
| author | metamuffin <metamuffin@disroot.org> | 2023-01-14 10:39:06 +0100 | 
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2023-01-14 10:39:06 +0100 | 
| commit | 855a8896175ee45a3376775203fa20e629d809b3 (patch) | |
| tree | a63cfbbb3118ec976da2ab4f3d2f24630ab33400 /ebml | |
| parent | 36e91c20eb59e76d5aeb35e644e7fb391f346dc6 (diff) | |
| download | jellything-855a8896175ee45a3376775203fa20e629d809b3.tar jellything-855a8896175ee45a3376775203fa20e629d809b3.tar.bz2 jellything-855a8896175ee45a3376775203fa20e629d809b3.tar.zst  | |
matroska part 1
Diffstat (limited to 'ebml')
| -rw-r--r-- | ebml/src/bin/experiment.rs | 6 | ||||
| -rw-r--r-- | ebml/src/lib.rs | 66 | ||||
| -rw-r--r-- | ebml/src/matroska.rs | 561 | ||||
| -rw-r--r-- | ebml/src/read.rs | 39 | 
4 files changed, 347 insertions, 325 deletions
diff --git a/ebml/src/bin/experiment.rs b/ebml/src/bin/experiment.rs index d332b41..13b6895 100644 --- a/ebml/src/bin/experiment.rs +++ b/ebml/src/bin/experiment.rs @@ -1,12 +1,12 @@ -use std::fs::File;  use ebml::read::EbmlReader; +use std::{fs::File, io::BufReader};  fn main() {      env_logger::init_from_env("LOG");      let f = File::open(std::env::args().skip(1).next().unwrap()).unwrap(); -    let mut r = EbmlReader::new(f); +    let mut r = EbmlReader::new(BufReader::new(f));      loop { -        println!("{:?}", r.read_tag().unwrap()); +        println!("{:?}", r.read_tag());      }  } diff --git a/ebml/src/lib.rs b/ebml/src/lib.rs index acebae3..7445bbc 100644 --- a/ebml/src/lib.rs +++ b/ebml/src/lib.rs @@ -1,8 +1,4 @@ -use crate::read::EbmlSize; - -use self::read::EbmlReader; -use anyhow::{bail, Result}; -use log::debug; +use anyhow::bail;  pub mod matroska;  pub mod read; @@ -14,53 +10,28 @@ pub enum Master {      End,  } -#[derive(Debug, Clone)] -pub enum MatroskaTag { -    Ebml(Master), -    EbmlVersion(u64), -    EbmlReadVersion(u64), -    EbmlMaxIdLength(u64), -    EbmlMaxSizeLength(u64), -    DocType(String), -    DocTypeVersion(u64), -    DocTypeReadVersion(u64), -    DocTypeExtension(Master), -} - -impl EbmlReader { -    pub fn read_tag(&mut self) -> Result<MatroskaTag> { -        let id = self.read_tag_id()?; -        let size = EbmlSize::from_vint(self.read_vint_len()?); -        debug!("tag id={id:x}, size={size:?}"); -        Ok(match id { -            0x1a45dfa3 => MatroskaTag::Ebml(Master::Start), -            0x4286 => MatroskaTag::EbmlVersion(self.read_vint()?), -            0x42f7 => MatroskaTag::EbmlReadVersion(self.read_vint()?), -            0x42f2 => MatroskaTag::EbmlMaxIdLength(self.read_vint()?), -            0x42f3 => MatroskaTag::EbmlMaxSizeLength(self.read_vint()?), -            0x4282 => MatroskaTag::DocType(self.read_utf8(size)?), -            0x4287 => MatroskaTag::DocTypeVersion(self.read_vint()?), -            0x4285 => MatroskaTag::DocTypeReadVersion(self.read_vint()?), -            0x4281 => MatroskaTag::DocTypeExtension(Master::Start), - -            _ => bail!("thats not a tag we know..."), -        }) -    } -} -  pub trait ValueFromBuf: Sized {      fn from_buf(buf: &[u8]) -> anyhow::Result<Self>;  }  impl ValueFromBuf for u64 {      fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { -        if buf.len() != 8 { -            bail!("u64 is not 64 bits long") +        // if buf.len() != 8 { +        //     bail!("u64 is not 64 bits long") +        // } +        // Ok((buf[0] as u64) << 24 +        //     | (buf[1] as u64) << 16 +        //     | (buf[2] as u64) << 8 +        //     | (buf[3] as u64) << 0) +        if buf.len() > 8 { +            bail!("u64 too big") +        } +        let mut val = 0u64; +        for byte in buf { +            val <<= 8; +            val |= *byte as u64;          } -        Ok((buf[0] as u64) << 24 -            | (buf[1] as u64) << 16 -            | (buf[2] as u64) << 8 -            | (buf[3] as u64) << 0) +        Ok(val)      }  }  impl ValueFromBuf for Vec<u8> { @@ -73,8 +44,3 @@ impl ValueFromBuf for String {          Ok(String::from_utf8(Vec::from(buf))?)      }  } -impl ValueFromBuf for Master { -    fn from_buf(_buf: &[u8]) -> anyhow::Result<Self> { -        Ok(Master::Start) -    } -} diff --git a/ebml/src/matroska.rs b/ebml/src/matroska.rs index 966530c..c9198bb 100644 --- a/ebml/src/matroska.rs +++ b/ebml/src/matroska.rs @@ -17,266 +17,313 @@ define_ebml! {              DocTypeExtensionVersion[0x4284]: Uint,          },      }, -} -//   #[id=0x18538067] Segment(Master), -//   #[id=0x1941A469] Segment/Attachments(Master), -//   #[id=0x61A7] Segment/Attachments/AttachedFile(Master), -//   #[id=0x465C] Segment/Attachments/AttachedFile/FileData(Vec<u8>), -//   #[id=0x467E] Segment/Attachments/AttachedFile/FileDescription(Utf8), -//   #[id=0x4660] Segment/Attachments/AttachedFile/FileMimeType(Utf8), -//   #[id=0x466E] Segment/Attachments/AttachedFile/FileName(Utf8), -//   #[id=0x4675] Segment/Attachments/AttachedFile/FileReferral(Vec<u8>), -//   #[id=0x46AE] Segment/Attachments/AttachedFile/FileUID(Uint), -//   #[id=0x4662] Segment/Attachments/AttachedFile/FileUsedEndTime(Uint), -//   #[id=0x4661] Segment/Attachments/AttachedFile/FileUsedStartTime(Uint), - -//   #[id=0x1043A770] Segment/Chapters(Master), -//   #[id=0x45B9] Segment/Chapters/EditionEntry(Master), -//   #[id=0xB6] Segment/Chapters/EditionEntry/ChapterAtom(Master), -//   #[id=0x6944] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess(Master), -//   #[id=0x6955] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessCodecID(Uint), -//   #[id=0x6911] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessCommand(Master), -//   #[id=0x6933] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessCommand/ChapProcessData(Vec<u8>), -//   #[id=0x6922] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessCommand/ChapProcessTime(Uint), -//   #[id=0x450D] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessPrivate(Vec<u8>), -//   #[id=0x80] Segment/Chapters/EditionEntry/ChapterAtom/ChapterDisplay(Master), -//   #[id=0x437E] Segment/Chapters/EditionEntry/ChapterAtom/ChapterDisplay/ChapCountry(Utf8), -//   #[id=0x437C] Segment/Chapters/EditionEntry/ChapterAtom/ChapterDisplay/ChapLanguage(Utf8), -//   #[id=0x437D] Segment/Chapters/EditionEntry/ChapterAtom/ChapterDisplay/ChapLanguageIETF(Utf8), -//   #[id=0x85] Segment/Chapters/EditionEntry/ChapterAtom/ChapterDisplay/ChapString(Utf8), -//   #[id=0x4598] Segment/Chapters/EditionEntry/ChapterAtom/ChapterFlagEnabled(Uint), -//   #[id=0x98] Segment/Chapters/EditionEntry/ChapterAtom/ChapterFlagHidden(Uint), -//   #[id=0x63C3] Segment/Chapters/EditionEntry/ChapterAtom/ChapterPhysicalEquiv(Uint), -//   #[id=0x6EBC] Segment/Chapters/EditionEntry/ChapterAtom/ChapterSegmentEditionUID(Uint), -//   #[id=0x6E67] Segment/Chapters/EditionEntry/ChapterAtom/ChapterSegmentUID(Vec<u8>), -//   #[id=0x5654] Segment/Chapters/EditionEntry/ChapterAtom/ChapterStringUID(Utf8), -//   #[id=0x92] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTimeEnd(Uint), -//   #[id=0x91] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTimeStart(Uint), -//   #[id=0x8F] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTrack(Master), -//   #[id=0x89] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTrack/ChapterTrackUID(Uint), -//   #[id=0x73C4] Segment/Chapters/EditionEntry/ChapterAtom/ChapterUID(Uint), -//   #[id=0x45DB] Segment/Chapters/EditionEntry/EditionFlagDefault(Uint), -//   #[id=0x45BD] Segment/Chapters/EditionEntry/EditionFlagHidden(Uint), -//   #[id=0x45DD] Segment/Chapters/EditionEntry/EditionFlagOrdered(Uint), -//   #[id=0x45BC] Segment/Chapters/EditionEntry/EditionUID(Uint), - -//   #[id=0x1F43B675] Segment/Cluster(Master), -//   #[id=0xA0] Segment/Cluster/BlockGroup(Master), -//   #[id=0xA1] Segment/Cluster/BlockGroup/Block(Vec<u8>), -//   #[id=0x75A1] Segment/Cluster/BlockGroup/BlockAdditions(Master), -//   #[id=0xA6] Segment/Cluster/BlockGroup/BlockAdditions/BlockMore(Master), -//   #[id=0xEE] Segment/Cluster/BlockGroup/BlockAdditions/BlockMore/BlockAddID(Uint), -//   #[id=0xA5] Segment/Cluster/BlockGroup/BlockAdditions/BlockMore/BlockAdditional(Vec<u8>), -//   #[id=0x9B] Segment/Cluster/BlockGroup/BlockDuration(Uint), -//   #[id=0xA2] Segment/Cluster/BlockGroup/BlockVirtual(Vec<u8>), -//   #[id=0xA4] Segment/Cluster/BlockGroup/CodecState(Vec<u8>), -//   #[id=0x75A2] Segment/Cluster/BlockGroup/DiscardPadding(Integer), -//   #[id=0xFB] Segment/Cluster/BlockGroup/ReferenceBlock(Integer), -//   #[id=0xC8] Segment/Cluster/BlockGroup/ReferenceFrame(Master), -//   #[id=0xC9] Segment/Cluster/BlockGroup/ReferenceFrame/ReferenceOffset(Uint), -//   #[id=0xCA] Segment/Cluster/BlockGroup/ReferenceFrame/ReferenceTimestamp(Uint), -//   #[id=0xFA] Segment/Cluster/BlockGroup/ReferencePriority(Uint), -//   #[id=0xFD] Segment/Cluster/BlockGroup/ReferenceVirtual(Integer), -//   #[id=0x8E] Segment/Cluster/BlockGroup/Slices(Master), -//   #[id=0xE8] Segment/Cluster/BlockGroup/Slices/TimeSlice(Master), -//   #[id=0xCB] Segment/Cluster/BlockGroup/Slices/TimeSlice/BlockAdditionID(Uint), -//   #[id=0xCE] Segment/Cluster/BlockGroup/Slices/TimeSlice/Delay(Uint), -//   #[id=0xCD] Segment/Cluster/BlockGroup/Slices/TimeSlice/FrameNumber(Uint), -//   #[id=0xCC] Segment/Cluster/BlockGroup/Slices/TimeSlice/LaceNumber(Uint), -//   #[id=0xCF] Segment/Cluster/BlockGroup/Slices/TimeSlice/SliceDuration(Uint), -//   #[id=0xAF] Segment/Cluster/EncryptedBlock(Vec<u8>), -//   #[id=0xA7] Segment/Cluster/Position(Uint), -//   #[id=0xAB] Segment/Cluster/PrevSize(Uint), -//   #[id=0x5854] Segment/Cluster/SilentTracks(Master), -//   #[id=0x58D7] Segment/Cluster/SilentTracks/SilentTrackNumber(Uint), -//   #[id=0xA3] Segment/Cluster/SimpleBlock(Vec<u8>), -//   #[id=0xE7] Segment/Cluster/Timestamp(Uint), +    Segment[0x18538067]: { +        Attachments[0x1941A469]: { +            AttachedFile[0x61A7]: { +                FileData[0x465C]: Binary, +                FileDescription[0x467E]: Utf8, +                FileMimeType[0x4660]: Utf8, +                FileName[0x466E]: Utf8, +                FileReferral[0x4675]: Binary, +                FileUID[0x46AE]: Uint, +                FileUsedEndTime[0x4662]: Uint, +                FileUsedStartTime[0x4661]: Uint, +            }, +        }, +        Chapters[0x1043A770]: { +            EditionEntry[0x45B9]: { +                ChapPterAtom[0xB6]: { +                    ChapProcess[0x6944]: { +                        ChapProcessCodecID[0x6955]: Uint, +                        ChapProcessCommand[0x6911]: { +                            ChapProcessData[0x6933]: Binary, +                            ChapProcessTime[0x6922]: Uint, +                        }, +                        ChapProcessPrivate[0x450D]: Binary, +                    }, +                    ChapterDisplay[0x80]: { +                        ChapCountry[0x437E]: Utf8, +                        ChapLanguage[0x437C]: Utf8, +                        ChapLanguageIETF[0x437D]: Utf8, +                        ChapString[0x85]: Utf8, +                    }, +                    ChapterFlagEnabled[0x4598]: Uint, +                    ChapterFlagHidden[0x98]: Uint, +                    ChapterPhysicalEquiv[0x63C3]: Uint, +                    ChapterSegmentEditionUID[0x6EBC]: Uint, +                    ChapterSegmentUID[0x6E67]: Binary, +                    ChapterStringUID[0x5654]: Utf8, +                    ChapterTimeEnd[0x92]: Uint, +                    ChapterTimeStart[0x91]: Uint, +                    ChapterUID[0x73C4]: Uint, +                    ChapterTrack[0x8F]: { +                        ChapterTrackUID[0x89]: Uint, +                    }, +                }, +                EditionFlagDefault[0x45DB]: Uint, +                EditionFlagHidden[0x45BD]: Uint, +                EditionFlagOrdered[0x45DD]: Uint, +                EditionUID[0x45BC]: Uint, +            }, +        }, -//   #[id=0x1C53BB6B] Segment/Cues(Master), -//   #[id=0xBB] Segment/Cues/CuePoint(Master), -//   #[id=0xB3] Segment/Cues/CuePoint/CueTime(Uint), -//   #[id=0xB7] Segment/Cues/CuePoint/CueTrackPositions(Master), -//   #[id=0x5378] Segment/Cues/CuePoint/CueTrackPositions/CueBlockNumber(Uint), -//   #[id=0xF1] Segment/Cues/CuePoint/CueTrackPositions/CueClusterPosition(Uint), -//   #[id=0xEA] Segment/Cues/CuePoint/CueTrackPositions/CueCodecState(Uint), -//   #[id=0xB2] Segment/Cues/CuePoint/CueTrackPositions/CueDuration(Uint), -//   #[id=0xDB] Segment/Cues/CuePoint/CueTrackPositions/CueReference(Master), -//   #[id=0x97] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefCluster(Uint), -//   #[id=0xEB] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefCodecState(Uint), -//   #[id=0x535F] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefNumber(Uint), -//   #[id=0x96] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefTime(Uint), -//   #[id=0xF0] Segment/Cues/CuePoint/CueTrackPositions/CueRelativePosition(Uint), -//   #[id=0xF7] Segment/Cues/CuePoint/CueTrackPositions/CueTrack(Uint), +        Cluster[0x1F43B675]: { +            #[id=0xA0] BlockGroup: { +                #[id=0xA1] Block(Binary), +                #[id=0x75A1] BlockAdditions: { +                    #[id=0xA6] BlockMore: { +                        #[id=0xEE] BlockAddID(Uint), +                        #[id=0xA5] BlockAdditional(Binary), +                    }, +                }, +                #[id=0x9B] BlockDuration(Uint), +                #[id=0xA2] BlockVirtual(Binary), +                #[id=0xA4] CodecState(Binary), +                #[id=0x75A2] DiscardPadding(Integer), +                #[id=0xFB] ReferenceBlock(Integer), +                #[id=0xC8] ReferenceFrame: { +                    #[id=0xC9] ReferenceOffset(Uint), +                    #[id=0xCA] ReferenceTimestamp(Uint), +                }, +                #[id=0xFA] ReferencePriority(Uint), +                #[id=0xFD] ReferenceVirtual(Integer), +                #[id=0x8E] Slices: { +                    #[id=0xE8] TimeSlice: { +                        #[id=0xCB] BlockAdditionID(Uint), +                        #[id=0xCE] Delay(Uint), +                        #[id=0xCD] FrameNumber(Uint), +                        #[id=0xCC] LaceNumber(Uint), +                        #[id=0xCF] SliceDuration(Uint), +                    }, +                }, +            }, +            #[id=0xAF] EncryptedBlock(Binary), +            #[id=0xA7] Position(Uint), +            #[id=0xAB] PrevSize(Uint), +            #[id=0x5854] SilentTracks: { +                #[id=0x58D7] SilentTrackNumber(Uint), +            }, +            #[id=0xA3] SimpleBlock(Binary), +            #[id=0xE7] Timestamp(Uint), +        } +     +        #[id=0x1C53BB6B] Cues: { +            #[id=0xBB] CuePoint: { +                #[id=0xB3] CueTime(Uint), +                #[id=0xB7] CueTrackPositions: { +                    #[id=0x5378] CueBlockNumber(Uint), +                    #[id=0xF1] CueClusterPosition(Uint), +                    #[id=0xEA] CueCodecState(Uint), +                    #[id=0xB2] CueDuration(Uint), +                    #[id=0xDB] CueReference: { +                        #[id=0x97] CueRefCluster(Uint), +                        #[id=0xEB] CueRefCodecState(Uint), +                        #[id=0x535F] CueRefNumber(Uint), +                        #[id=0x96] CueRefTime(Uint), +                    }, +                    #[id=0xF0] CueRelativePosition(Uint), +                    #[id=0xF7] CueTrack(Uint), +                }, +            }, +        }, -//   #[id=0x1549A966] Segment/Info(Master), -//   #[id=0x6924] Segment/Info/ChapterTranslate(Master), -//   #[id=0x69BF] Segment/Info/ChapterTranslate/ChapterTranslateCodec(Uint), -//   #[id=0x69FC] Segment/Info/ChapterTranslate/ChapterTranslateEditionUID(Uint), -//   #[id=0x69A5] Segment/Info/ChapterTranslate/ChapterTranslateID(Vec<u8>), -//   #[id=0x4461] Segment/Info/DateUTC(Integer), -//   #[id=0x4489] Segment/Info/Duration(Float), -//   #[id=0x4D80] Segment/Info/MuxingApp(Utf8), -//   #[id=0x3E83BB] Segment/Info/NextFilename(Utf8), -//   #[id=0x3EB923] Segment/Info/NextUID(Vec<u8>), -//   #[id=0x3C83AB] Segment/Info/PrevFilename(Utf8), -//   #[id=0x3CB923] Segment/Info/PrevUID(Vec<u8>), -//   #[id=0x4444] Segment/Info/SegmentFamily(Vec<u8>), -//   #[id=0x7384] Segment/Info/SegmentFilename(Utf8), -//   #[id=0x73A4] Segment/Info/SegmentUID(Vec<u8>), -//   #[id=0x2AD7B1] Segment/Info/TimestampScale(Uint), -//   #[id=0x7BA9] Segment/Info/Title(Utf8), -//   #[id=0x5741] Segment/Info/WritingApp(Utf8), +        #[id=0x1549A966] Info: { +            #[id=0x6924] ChapterTranslate: { +                #[id=0x69BF] ChapterTranslateCodec(Uint), +                #[id=0x69FC] ChapterTranslateEditionUID(Uint), +                #[id=0x69A5] ChapterTranslateID(Binary), +            } +            #[id=0x4461] DateUTC(Integer), +            #[id=0x4489] Duration(Float), +            #[id=0x4D80] MuxingApp(Utf8), +            #[id=0x3E83BB] NextFilename(Utf8), +            #[id=0x3EB923] NextUID(Binary), +            #[id=0x3C83AB] PrevFilename(Utf8), +            #[id=0x3CB923] PrevUID(Binary), +            #[id=0x4444] SegmentFamily(Binary), +            #[id=0x7384] SegmentFilename(Utf8), +            #[id=0x73A4] SegmentUID(Binary), +            #[id=0x2AD7B1] TimestampScale(Uint), +            #[id=0x7BA9] Title(Utf8), +            #[id=0x5741] WritingApp(Utf8), +        }, -//   #[id=0x114D9B74] Segment/SeekHead(Master), -//   #[id=0x4DBB] Segment/SeekHead/Seek(Master), -//   #[id=0x53AB] Segment/SeekHead/Seek/SeekID(Vec<u8>), -//   #[id=0x53AC] Segment/SeekHead/Seek/SeekPosition(Uint), +        #[id=0x114D9B74] SeekHead: { +            #[id=0x4DBB] Seek: { +                #[id=0x53AB] SeekID(Binary), +                #[id=0x53AC] SeekPosition(Uint), +            }, +        }, -//   #[id=0x1254C367] Segment/Tags(Master), -//   #[id=0x7373] Segment/Tags/Tag(Master), -//   #[id=0x67C8] Segment/Tags/Tag/SimpleTag(Master), -//   #[id=0x4485] Segment/Tags/Tag/SimpleTag/TagBinary(Vec<u8>), -//   #[id=0x4484] Segment/Tags/Tag/SimpleTag/TagDefault(Uint), -//   #[id=0x44B4] Segment/Tags/Tag/SimpleTag/TagDefaultBogus(Uint), -//   #[id=0x447A] Segment/Tags/Tag/SimpleTag/TagLanguage(Utf8), -//   #[id=0x447B] Segment/Tags/Tag/SimpleTag/TagLanguageIETF(Utf8), -//   #[id=0x45A3] Segment/Tags/Tag/SimpleTag/TagName(Utf8), -//   #[id=0x4487] Segment/Tags/Tag/SimpleTag/TagString(Utf8), -//   #[id=0x63C0] Segment/Tags/Tag/Targets(Master), -//   #[id=0x63C6] Segment/Tags/Tag/Targets/TagAttachmentUID(Uint), -//   #[id=0x63C4] Segment/Tags/Tag/Targets/TagChapterUID(Uint), -//   #[id=0x63C9] Segment/Tags/Tag/Targets/TagEditionUID(Uint), -//   #[id=0x63C5] Segment/Tags/Tag/Targets/TagTrackUID(Uint), -//   #[id=0x63CA] Segment/Tags/Tag/Targets/TargetType(Utf8), -//   #[id=0x68CA] Segment/Tags/Tag/Targets/TargetTypeValue(Uint), +        #[id=0x1254C367] Tags: { +            #[id=0x7373] Tag: { +                #[id=0x67C8] SimpleTag: { +                    #[id=0x4485] TagBinary(Binary), +                    #[id=0x4484] TagDefault(Uint), +                    #[id=0x44B4] TagDefaultBogus(Uint), +                    #[id=0x447A] TagLanguage(Utf8), +                    #[id=0x447B] TagLanguageIETF(Utf8), +                    #[id=0x45A3] TagName(Utf8), +                    #[id=0x4487] TagString(Utf8), +                }, +                #[id=0x63C0] Targets: { +                    #[id=0x63C6] TagAttachmentUID(Uint), +                    #[id=0x63C4] TagChapterUID(Uint), +                    #[id=0x63C9] TagEditionUID(Uint), +                    #[id=0x63C5] TagTrackUID(Uint), +                    #[id=0x63CA] TargetType(Utf8), +                    #[id=0x68CA] TargetTypeValue(Uint), +                }, +            }, +        }, -//   #[id=0x1654AE6B] Segment/Tracks(Master), -//   #[id=0xAE] Segment/Tracks/TrackEntry(Master), -//   #[id=0x7446] Segment/Tracks/TrackEntry/AttachmentLink(Uint), -//   #[id=0xE1] Segment/Tracks/TrackEntry/Audio(Master), -//   #[id=0x6264] Segment/Tracks/TrackEntry/Audio/BitDepth(Uint), -//   #[id=0x7D7B] Segment/Tracks/TrackEntry/Audio/ChannelPositions(Vec<u8>), -//   #[id=0x9F] Segment/Tracks/TrackEntry/Audio/Channels(Uint), -//   #[id=0x78B5] Segment/Tracks/TrackEntry/Audio/OutputSamplingFrequency(Float), -//   #[id=0xB5] Segment/Tracks/TrackEntry/Audio/SamplingFrequency(Float), -//   #[id=0x41E4] Segment/Tracks/TrackEntry/BlockAdditionMapping(Master), -//   #[id=0x41ED] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDExtraData(Vec<u8>), -//   #[id=0x41A4] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDName(Utf8), -//   #[id=0x41E7] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDType(Uint), -//   #[id=0x41F0] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDValue(Uint), -//   #[id=0xAA] Segment/Tracks/TrackEntry/CodecDecodeAll(Uint), -//   #[id=0x56AA] Segment/Tracks/TrackEntry/CodecDelay(Uint), -//   #[id=0x26B240] Segment/Tracks/TrackEntry/CodecDownloadURL(Utf8), -//   #[id=0x86] Segment/Tracks/TrackEntry/CodecID(Utf8), -//   #[id=0x3B4040] Segment/Tracks/TrackEntry/CodecInfoURL(Utf8), -//   #[id=0x258688] Segment/Tracks/TrackEntry/CodecName(Utf8), -//   #[id=0x63A2] Segment/Tracks/TrackEntry/CodecPrivate(Vec<u8>), -//   #[id=0x3A9697] Segment/Tracks/TrackEntry/CodecSettings(Utf8), -//   #[id=0x6D80] Segment/Tracks/TrackEntry/ContentEncodings(Master), -//   #[id=0x6240] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding(Master), -//   #[id=0x5034] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentCompression(Master), -//   #[id=0x4254] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentCompression/ContentCompAlgo(Uint), -//   #[id=0x4255] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentCompression/ContentCompSettings(Vec<u8>), -//   #[id=0x5031] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingOrder(Uint), -//   #[id=0x5032] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingScope(Uint), -//   #[id=0x5033] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingType(Uint), -//   #[id=0x5035] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption(Master), -//   #[id=0x47E7] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncAESSettings(Master), -//   #[id=0x47E8] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncAESSettings/AESSettingsCipherMode(Uint), -//   #[id=0x47E1] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncAlgo(Uint), -//   #[id=0x47E2] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncKeyID(Vec<u8>), -//   #[id=0x47E5] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSigAlgo(Uint), -//   #[id=0x47E6] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSigHashAlgo(Uint), -//   #[id=0x47E4] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSigKeyID(Vec<u8>), -//   #[id=0x47E3] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSignature(Vec<u8>), -//   #[id=0x234E7A] Segment/Tracks/TrackEntry/DefaultDecodedFieldDuration(Uint), -//   #[id=0x23E383] Segment/Tracks/TrackEntry/DefaultDuration(Uint), -//   #[id=0x55AF] Segment/Tracks/TrackEntry/FlagCommentary(Uint), -//   #[id=0x88] Segment/Tracks/TrackEntry/FlagDefault(Uint), -//   #[id=0xB9] Segment/Tracks/TrackEntry/FlagEnabled(Uint), -//   #[id=0x55AA] Segment/Tracks/TrackEntry/FlagForced(Uint), -//   #[id=0x55AB] Segment/Tracks/TrackEntry/FlagHearingImpaired(Uint), -//   #[id=0x9C] Segment/Tracks/TrackEntry/FlagLacing(Uint), -//   #[id=0x55AE] Segment/Tracks/TrackEntry/FlagOriginal(Uint), -//   #[id=0x55AD] Segment/Tracks/TrackEntry/FlagTextDescriptions(Uint), -//   #[id=0x55AC] Segment/Tracks/TrackEntry/FlagVisualImpaired(Uint), -//   #[id=0x22B59C] Segment/Tracks/TrackEntry/Language(Utf8), -//   #[id=0x22B59D] Segment/Tracks/TrackEntry/LanguageIETF(Utf8), -//   #[id=0x55EE] Segment/Tracks/TrackEntry/MaxBlockAdditionID(Uint), -//   #[id=0x6DF8] Segment/Tracks/TrackEntry/MaxCache(Uint), -//   #[id=0x6DE7] Segment/Tracks/TrackEntry/MinCache(Uint), -//   #[id=0x536E] Segment/Tracks/TrackEntry/Name(Utf8), -//   #[id=0x56BB] Segment/Tracks/TrackEntry/SeekPreRoll(Uint), -//   #[id=0xD7] Segment/Tracks/TrackEntry/TrackNumber(Uint), -//   #[id=0x537F] Segment/Tracks/TrackEntry/TrackOffset(Integer), -//   #[id=0xE2] Segment/Tracks/TrackEntry/TrackOperation(Master), -//   #[id=0xE3] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes(Master), -//   #[id=0xE4] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes/TrackPlane(Master), -//   #[id=0xE6] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes/TrackPlane/TrackPlaneType(Uint), -//   #[id=0xE5] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes/TrackPlane/TrackPlaneUID(Uint), -//   #[id=0xE9] Segment/Tracks/TrackEntry/TrackOperation/TrackJoinBlocks(Master), -//   #[id=0xED] Segment/Tracks/TrackEntry/TrackOperation/TrackJoinBlocks/TrackJoinUID(Uint), -//   #[id=0x6FAB] Segment/Tracks/TrackEntry/TrackOverlay(Uint), -//   #[id=0x23314F] Segment/Tracks/TrackEntry/TrackTimestampScale(Float), -//   #[id=0x6624] Segment/Tracks/TrackEntry/TrackTranslate(Master), -//   #[id=0x66BF] Segment/Tracks/TrackEntry/TrackTranslate/TrackTranslateCodec(Uint), -//   #[id=0x66FC] Segment/Tracks/TrackEntry/TrackTranslate/TrackTranslateEditionUID(Uint), -//   #[id=0x66A5] Segment/Tracks/TrackEntry/TrackTranslate/TrackTranslateTrackID(Vec<u8>), -//   #[id=0x83] Segment/Tracks/TrackEntry/TrackType(Uint), -//   #[id=0x73C5] Segment/Tracks/TrackEntry/TrackUID(Uint), -//   #[id=0xC4] Segment/Tracks/TrackEntry/TrickMasterTrackSegmentUID(Vec<u8>), -//   #[id=0xC7] Segment/Tracks/TrackEntry/TrickMasterTrackUID(Uint), -//   #[id=0xC6] Segment/Tracks/TrackEntry/TrickTrackFlag(Uint), -//   #[id=0xC1] Segment/Tracks/TrackEntry/TrickTrackSegmentUID(Vec<u8>), -//   #[id=0xC0] Segment/Tracks/TrackEntry/TrickTrackUID(Uint), -//   #[id=0xE0] Segment/Tracks/TrackEntry/Video(Master), -//   #[id=0x53C0] Segment/Tracks/TrackEntry/Video/AlphaMode(Uint), -//   #[id=0x54B3] Segment/Tracks/TrackEntry/Video/AspectRatioType(Uint), -//   #[id=0x55B0] Segment/Tracks/TrackEntry/Video/Colour(Master), -//   #[id=0x55B2] Segment/Tracks/TrackEntry/Video/Colour/BitsPerChannel(Uint), -//   #[id=0x55B5] Segment/Tracks/TrackEntry/Video/Colour/CbSubsamplingHorz(Uint), -//   #[id=0x55B6] Segment/Tracks/TrackEntry/Video/Colour/CbSubsamplingVert(Uint), -//   #[id=0x55B7] Segment/Tracks/TrackEntry/Video/Colour/ChromaSitingHorz(Uint), -//   #[id=0x55B8] Segment/Tracks/TrackEntry/Video/Colour/ChromaSitingVert(Uint), -//   #[id=0x55B3] Segment/Tracks/TrackEntry/Video/Colour/ChromaSubsamplingHorz(Uint), -//   #[id=0x55B4] Segment/Tracks/TrackEntry/Video/Colour/ChromaSubsamplingVert(Uint), -//   #[id=0x55D0] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata(Master), -//   #[id=0x55D9] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/LuminanceMax(Float), -//   #[id=0x55DA] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/LuminanceMin(Float), -//   #[id=0x55D5] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/PrimaryBChromaticityX(Float), -//   #[id=0x55D6] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/PrimaryBChromaticityY(Float), -//   #[id=0x55D3] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/PrimaryGChromaticityX(Float), -//   #[id=0x55D4] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/PrimaryGChromaticityY(Float), -//   #[id=0x55D1] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/PrimaryRChromaticityX(Float), -//   #[id=0x55D2] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/PrimaryRChromaticityY(Float), -//   #[id=0x55D7] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/WhitePointChromaticityX(Float), -//   #[id=0x55D8] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/WhitePointChromaticityY(Float), -//   #[id=0x55B1] Segment/Tracks/TrackEntry/Video/Colour/MatrixCoefficients(Uint), -//   #[id=0x55BC] Segment/Tracks/TrackEntry/Video/Colour/MaxCLL(Uint), -//   #[id=0x55BD] Segment/Tracks/TrackEntry/Video/Colour/MaxFALL(Uint), -//   #[id=0x55BB] Segment/Tracks/TrackEntry/Video/Colour/Primaries(Uint), -//   #[id=0x55B9] Segment/Tracks/TrackEntry/Video/Colour/Range(Uint), -//   #[id=0x55BA] Segment/Tracks/TrackEntry/Video/Colour/TransferCharacteristics(Uint), -//   #[id=0x54BA] Segment/Tracks/TrackEntry/Video/DisplayHeight(Uint), -//   #[id=0x54B2] Segment/Tracks/TrackEntry/Video/DisplayUnit(Uint), -//   #[id=0x54B0] Segment/Tracks/TrackEntry/Video/DisplayWidth(Uint), -//   #[id=0x9D] Segment/Tracks/TrackEntry/Video/FieldOrder(Uint), -//   #[id=0x9A] Segment/Tracks/TrackEntry/Video/FlagInterlaced(Uint), -//   #[id=0x2383E3] Segment/Tracks/TrackEntry/Video/FrameRate(Float), -//   #[id=0x2FB523] Segment/Tracks/TrackEntry/Video/GammaValue(Float), -//   #[id=0x53B9] Segment/Tracks/TrackEntry/Video/OldStereoMode(Uint), -//   #[id=0x54AA] Segment/Tracks/TrackEntry/Video/PixelCropBottom(Uint), -//   #[id=0x54CC] Segment/Tracks/TrackEntry/Video/PixelCropLeft(Uint), -//   #[id=0x54DD] Segment/Tracks/TrackEntry/Video/PixelCropRight(Uint), -//   #[id=0x54BB] Segment/Tracks/TrackEntry/Video/PixelCropTop(Uint), -//   #[id=0xBA] Segment/Tracks/TrackEntry/Video/PixelHeight(Uint), -//   #[id=0xB0] Segment/Tracks/TrackEntry/Video/PixelWidth(Uint), -//   #[id=0x7670] Segment/Tracks/TrackEntry/Video/Projection(Master), -//   #[id=0x7674] Segment/Tracks/TrackEntry/Video/Projection/ProjectionPosePitch(Float), -//   #[id=0x7675] Segment/Tracks/TrackEntry/Video/Projection/ProjectionPoseRoll(Float), -//   #[id=0x7673] Segment/Tracks/TrackEntry/Video/Projection/ProjectionPoseYaw(Float), -//   #[id=0x7672] Segment/Tracks/TrackEntry/Video/Projection/ProjectionPrivate(Vec<u8>), -//   #[id=0x7671] Segment/Tracks/TrackEntry/Video/Projection/ProjectionType(Uint), -//   #[id=0x53B8] Segment/Tracks/TrackEntry/Video/StereoMode(Uint), -//   #[id=0x2EB524] Segment/Tracks/TrackEntry/Video/UncompressedFourCC(Vec<u8>) +        #[id=0x1654AE6B] Tracks: { +            #[id=0xAE] TrackEntry: { +                #[id=0x7446] AttachmentLink(Uint), +                #[id=0xE1] Audio: { +                    #[id=0x6264] BitDepth(Uint), +                    #[id=0x7D7B] ChannelPositions(Binary), +                    #[id=0x9F] Channels(Uint), +                    #[id=0x78B5] OutputSamplingFrequency(Float), +                    #[id=0xB5] SamplingFrequency(Float), +                } +                #[id=0x41E4] BlockAdditionMapping: { +                    #[id=0x41ED] BlockAddIDExtraData(Binary), +                    #[id=0x41A4] BlockAddIDName(Utf8), +                    #[id=0x41E7] BlockAddIDType(Uint), +                    #[id=0x41F0] BlockAddIDValue(Uint), +                } +                #[id=0xAA] CodecDecodeAll(Uint), +                #[id=0x56AA] CodecDelay(Uint), +                #[id=0x26B240] CodecDownloadURL(Utf8), +                #[id=0x86] CodecID(Utf8), +                #[id=0x3B4040] CodecInfoURL(Utf8), +                #[id=0x258688] CodecName(Utf8), +                #[id=0x63A2] CodecPrivate(Binary), +                #[id=0x3A9697] CodecSettings(Utf8), +                #[id=0x6D80] ContentEncodings: { +                    #[id=0x6240] ContentEncoding: { +                        #[id=0x5034] ContentCompression: { +                            #[id=0x4254] ContentCompAlgo(Uint), +                            #[id=0x4255] ContentCompSettings(Binary), +                        }, +                        #[id=0x5031] ContentEncodingOrder(Uint), +                        #[id=0x5032] ContentEncodingScope(Uint), +                        #[id=0x5033] ContentEncodingType(Uint), +                        #[id=0x5035] ContentEncryption: { +                            #[id=0x47E7] ContentEncAESSettings: { +                                #[id=0x47E8] AESSettingsCipherMode(Uint), +                            } +                            #[id=0x47E1] ContentEncAlgo(Uint), +                            #[id=0x47E2] ContentEncKeyID(Binary), +                            #[id=0x47E5] ContentSigAlgo(Uint), +                            #[id=0x47E6] ContentSigHashAlgo(Uint), +                            #[id=0x47E4] ContentSigKeyID(Binary), +                            #[id=0x47E3] ContentSignature(Binary), +                        }, +                    }, +                }, +                #[id=0x234E7A] DefaultDecodedFieldDuration(Uint), +                #[id=0x23E383] DefaultDuration(Uint), +                #[id=0x55AF] FlagCommentary(Uint), +                #[id=0x88] FlagDefault(Uint), +                #[id=0xB9] FlagEnabled(Uint), +                #[id=0x55AA] FlagForced(Uint), +                #[id=0x55AB] FlagHearingImpaired(Uint), +                #[id=0x9C] FlagLacing(Uint), +                #[id=0x55AE] FlagOriginal(Uint), +                #[id=0x55AD] FlagTextDescriptions(Uint), +                #[id=0x55AC] FlagVisualImpaired(Uint), +                #[id=0x22B59C] Language(Utf8), +                #[id=0x22B59D] LanguageIETF(Utf8), +                #[id=0x55EE] MaxBlockAdditionID(Uint), +                #[id=0x6DF8] MaxCache(Uint), +                #[id=0x6DE7] MinCache(Uint), +                #[id=0x536E] Name(Utf8), +                #[id=0x56BB] SeekPreRoll(Uint), +                #[id=0xD7] TrackNumber(Uint), +                #[id=0x537F] TrackOffset(Integer), +                #[id=0xE2] TrackOperation: { +                    #[id=0xE3] TrackCombinePlanes: { +                        #[id=0xE4] TrackPlane: { +                            #[id=0xE6] TrackPlaneType(Uint), +                            #[id=0xE5] TrackPlaneUID(Uint), +                        }, +                    }, +                    #[id=0xE9] TrackJoinBlocks: { +                        #[id=0xED] TrackJoinUID(Uint), +                    }, +                } +                #[id=0x6FAB] TrackOverlay(Uint), +                #[id=0x23314F] TrackTimestampScale(Float), +                #[id=0x6624] TrackTranslate: { +                    #[id=0x66BF] TrackTranslateCodec(Uint), +                    #[id=0x66FC] TrackTranslateEditionUID(Uint), +                    #[id=0x66A5] TrackTranslateTrackID(Binary), +                }, +                #[id=0x83] TrackType(Uint), +                #[id=0x73C5] TrackUID(Uint), +                #[id=0xC4] TrickMasterTrackSegmentUID(Binary), +                #[id=0xC7] TrickMasterTrackUID(Uint), +                #[id=0xC6] TrickTrackFlag(Uint), +                #[id=0xC1] TrickTrackSegmentUID(Binary), +                #[id=0xC0] TrickTrackUID(Uint), +                #[id=0xE0] Video: { +                    #[id=0x53C0] AlphaMode(Uint), +                    #[id=0x54B3] AspectRatioType(Uint), +                    #[id=0x55B0] Colour: { +                        #[id=0x55B2] BitsPerChannel(Uint), +                        #[id=0x55B5] CbSubsamplingHorz(Uint), +                        #[id=0x55B6] CbSubsamplingVert(Uint), +                        #[id=0x55B7] ChromaSitingHorz(Uint), +                        #[id=0x55B8] ChromaSitingVert(Uint), +                        #[id=0x55B3] ChromaSubsamplingHorz(Uint), +                        #[id=0x55B4] ChromaSubsamplingVert(Uint), +                        #[id=0x55D0] MasteringMetadata: { +                            #[id=0x55D9] LuminanceMax(Float), +                            #[id=0x55DA] LuminanceMin(Float), +                            #[id=0x55D5] PrimaryBChromaticityX(Float), +                            #[id=0x55D6] PrimaryBChromaticityY(Float), +                            #[id=0x55D3] PrimaryGChromaticityX(Float), +                            #[id=0x55D4] PrimaryGChromaticityY(Float), +                            #[id=0x55D1] PrimaryRChromaticityX(Float), +                            #[id=0x55D2] PrimaryRChromaticityY(Float), +                            #[id=0x55D7] WhitePointChromaticityX(Float), +                            #[id=0x55D8] WhitePointChromaticityY(Float), +                        }, +                        #[id=0x55B1] MatrixCoefficients(Uint), +                        #[id=0x55BC] MaxCLL(Uint), +                        #[id=0x55BD] MaxFALL(Uint), +                        #[id=0x55BB] Primaries(Uint), +                        #[id=0x55B9] Range(Uint), +                        #[id=0x55BA] TransferCharacteristics(Uint), +                    }, +                    #[id=0x54BA] DisplayHeight(Uint), +                    #[id=0x54B2] DisplayUnit(Uint), +                    #[id=0x54B0] DisplayWidth(Uint), +                    #[id=0x9D] FieldOrder(Uint), +                    #[id=0x9A] FlagInterlaced(Uint), +                    #[id=0x2383E3] FrameRate(Float), +                    #[id=0x2FB523] GammaValue(Float), +                    #[id=0x53B9] OldStereoMode(Uint), +                    #[id=0x54AA] PixelCropBottom(Uint), +                    #[id=0x54CC] PixelCropLeft(Uint), +                    #[id=0x54DD] PixelCropRight(Uint), +                    #[id=0x54BB] PixelCropTop(Uint), +                    #[id=0xBA] PixelHeight(Uint), +                    #[id=0xB0] PixelWidth(Uint), +                    #[id=0x7670] Projection: { +                        #[id=0x7674] ProjectionPosePitch(Float), +                        #[id=0x7675] ProjectionPoseRoll(Float), +                        #[id=0x7673] ProjectionPoseYaw(Float), +                        #[id=0x7672] ProjectionPrivate(Binary), +                        #[id=0x7671] ProjectionType(Uint), +                    }, +                    #[id=0x53B8] StereoMode(Uint), +                    #[id=0x2EB524] UncompressedFourCC(Binary), +                }, +            }, +        }, +    }, +}
\ No newline at end of file diff --git a/ebml/src/read.rs b/ebml/src/read.rs index 7431683..23b4e21 100644 --- a/ebml/src/read.rs +++ b/ebml/src/read.rs @@ -1,5 +1,7 @@ +use anyhow::{bail, Result};  use std::io::{Read, Seek}; -use anyhow::Result; + +use crate::matroska::MatroskaTag;  trait ReadAndSeek: Read + Seek {}  impl<T: Read + Seek> ReadAndSeek for T {} @@ -37,9 +39,12 @@ impl EbmlReader {      pub fn read_vint_len(&mut self) -> Result<(u64, usize)> {          let s = self.read_byte()?;          let len = s.leading_zeros() + 1; +        if len > 8 { +            bail!("varint too long"); +        }          let mut value = s as u64;          value -= 1 << (8 - len); -        for _ in 0..(len - 1) { +        for _ in 1..len {              value <<= 8;              value += self.read_byte()? as u64;          } @@ -52,11 +57,23 @@ impl EbmlReader {          let b = self.read_buf(size)?;          Ok(String::from_utf8(b)?)      } -      pub fn read_tag_id(&mut self) -> Result<u64> {          let (value, len) = self.read_vint_len()?;          Ok(value + (1 << (7 * len)))      } +    pub fn read_tag_size(&mut self) -> Result<EbmlSize> { +        Ok(EbmlSize::from_vint(self.read_vint_len()?)) +    } +    pub fn read_tag(&mut self) -> Result<MatroskaTag> { +        let id = self.read_tag_id()?; +        let size = self.read_tag_size()?; +        if MatroskaTag::is_master(id)? { +            Ok(MatroskaTag::parse(id, &[])?) +        } else { +            let data = self.read_buf(size)?; +            Ok(MatroskaTag::parse(id, &data)?) +        } +    }  }  #[derive(Debug, Clone, Copy)] @@ -65,20 +82,12 @@ pub enum EbmlSize {      Unknown,  }  impl EbmlSize { -    #[rustfmt::skip]      pub fn from_vint((value, len): (u64, usize)) -> EbmlSize { -        match len { -            1 => if value == ((1 << (7))     - 1) { return Self::Unknown; }, -            2 => if value == ((1 << (7 * 2)) - 1) { return Self::Unknown; }, -            3 => if value == ((1 << (7 * 3)) - 1) { return Self::Unknown; }, -            4 => if value == ((1 << (7 * 4)) - 1) { return Self::Unknown; }, -            5 => if value == ((1 << (7 * 5)) - 1) { return Self::Unknown; }, -            6 => if value == ((1 << (7 * 6)) - 1) { return Self::Unknown; }, -            7 => if value == ((1 << (7 * 7)) - 1) { return Self::Unknown; }, -            8 => if value == ((1 << (7 * 8)) - 1) { return Self::Unknown; }, -            _ => {}, +        if value == ((1 << (7 * len)) - 1) { +            Self::Unknown +        } else { +            Self::Exact(value as usize)          } -        Self::Exact(len)      }  }  impl Into<usize> for EbmlSize {  |