diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-13 20:21:45 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-13 20:21:45 +0100 |
commit | 36e91c20eb59e76d5aeb35e644e7fb391f346dc6 (patch) | |
tree | 45ea6dd876ec3af8e38857bce6d26faf630011de | |
parent | 8fc4b9792044d82e729e8b4ef993c6391d711c5b (diff) | |
download | jellything-36e91c20eb59e76d5aeb35e644e7fb391f346dc6.tar jellything-36e91c20eb59e76d5aeb35e644e7fb391f346dc6.tar.bz2 jellything-36e91c20eb59e76d5aeb35e644e7fb391f346dc6.tar.zst |
proc macro works
-rw-r--r-- | ebml/src/lib.rs | 31 | ||||
-rw-r--r-- | ebml/src/matroska.rs | 262 | ||||
-rw-r--r-- | ebml/src/read.rs | 6 | ||||
-rw-r--r-- | ebml_derive/src/lib.rs | 177 |
4 files changed, 295 insertions, 181 deletions
diff --git a/ebml/src/lib.rs b/ebml/src/lib.rs index 116b8e2..acebae3 100644 --- a/ebml/src/lib.rs +++ b/ebml/src/lib.rs @@ -47,3 +47,34 @@ impl EbmlReader { }) } } + +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") + } + Ok((buf[0] as u64) << 24 + | (buf[1] as u64) << 16 + | (buf[2] as u64) << 8 + | (buf[3] as u64) << 0) + } +} +impl ValueFromBuf for Vec<u8> { + fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { + Ok(buf.to_vec()) + } +} +impl ValueFromBuf for String { + fn from_buf(buf: &[u8]) -> anyhow::Result<Self> { + 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 802ce6a..966530c 100644 --- a/ebml/src/matroska.rs +++ b/ebml/src/matroska.rs @@ -5,16 +5,16 @@ define_ebml! { global Void[0xec]: Binary, Ebml[0x1a45dfa3]: { - EbmlVersion[0x4286]: u64, - EbmlReadVersion[0x42f7]: u64, - EbmlMaxIdLength[0x42f2]: u64, - EbmlMaxSizeLength[0x42f3]: u64, + EbmlVersion[0x4286]: Uint, + EbmlReadVersion[0x42f7]: Uint, + EbmlMaxIdLength[0x42f2]: Uint, + EbmlMaxSizeLength[0x42f3]: Uint, DocType[0x4282]: Utf8, - DocTypeVersion[0x4287]: u64, - DocTypeReadVersion[0x4285]: u64, + DocTypeVersion[0x4287]: Uint, + DocTypeReadVersion[0x4285]: Uint, DocTypeExtension[0x4281]: { DocTypeExtensionName[0x4283]: Utf8, - DocTypeExtensionVersion[0x4284]: u64, + DocTypeExtensionVersion[0x4284]: Uint, }, }, } @@ -27,92 +27,92 @@ define_ebml! { // #[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(u64), -// #[id=0x4662] Segment/Attachments/AttachedFile/FileUsedEndTime(u64), -// #[id=0x4661] Segment/Attachments/AttachedFile/FileUsedStartTime(u64), +// #[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(u64), +// #[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(u64), +// #[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(u64), -// #[id=0x98] Segment/Chapters/EditionEntry/ChapterAtom/ChapterFlagHidden(u64), -// #[id=0x63C3] Segment/Chapters/EditionEntry/ChapterAtom/ChapterPhysicalEquiv(u64), -// #[id=0x6EBC] Segment/Chapters/EditionEntry/ChapterAtom/ChapterSegmentEditionUID(u64), +// #[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(u64), -// #[id=0x91] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTimeStart(u64), +// #[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(u64), -// #[id=0x73C4] Segment/Chapters/EditionEntry/ChapterAtom/ChapterUID(u64), -// #[id=0x45DB] Segment/Chapters/EditionEntry/EditionFlagDefault(u64), -// #[id=0x45BD] Segment/Chapters/EditionEntry/EditionFlagHidden(u64), -// #[id=0x45DD] Segment/Chapters/EditionEntry/EditionFlagOrdered(u64), -// #[id=0x45BC] Segment/Chapters/EditionEntry/EditionUID(u64), +// #[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(u64), +// #[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(u64), +// #[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(u64), -// #[id=0xCA] Segment/Cluster/BlockGroup/ReferenceFrame/ReferenceTimestamp(u64), -// #[id=0xFA] Segment/Cluster/BlockGroup/ReferencePriority(u64), +// #[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(u64), -// #[id=0xCE] Segment/Cluster/BlockGroup/Slices/TimeSlice/Delay(u64), -// #[id=0xCD] Segment/Cluster/BlockGroup/Slices/TimeSlice/FrameNumber(u64), -// #[id=0xCC] Segment/Cluster/BlockGroup/Slices/TimeSlice/LaceNumber(u64), -// #[id=0xCF] Segment/Cluster/BlockGroup/Slices/TimeSlice/SliceDuration(u64), +// #[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(u64), -// #[id=0xAB] Segment/Cluster/PrevSize(u64), +// #[id=0xA7] Segment/Cluster/Position(Uint), +// #[id=0xAB] Segment/Cluster/PrevSize(Uint), // #[id=0x5854] Segment/Cluster/SilentTracks(Master), -// #[id=0x58D7] Segment/Cluster/SilentTracks/SilentTrackNumber(u64), +// #[id=0x58D7] Segment/Cluster/SilentTracks/SilentTrackNumber(Uint), // #[id=0xA3] Segment/Cluster/SimpleBlock(Vec<u8>), -// #[id=0xE7] Segment/Cluster/Timestamp(u64), +// #[id=0xE7] Segment/Cluster/Timestamp(Uint), // #[id=0x1C53BB6B] Segment/Cues(Master), // #[id=0xBB] Segment/Cues/CuePoint(Master), -// #[id=0xB3] Segment/Cues/CuePoint/CueTime(u64), +// #[id=0xB3] Segment/Cues/CuePoint/CueTime(Uint), // #[id=0xB7] Segment/Cues/CuePoint/CueTrackPositions(Master), -// #[id=0x5378] Segment/Cues/CuePoint/CueTrackPositions/CueBlockNumber(u64), -// #[id=0xF1] Segment/Cues/CuePoint/CueTrackPositions/CueClusterPosition(u64), -// #[id=0xEA] Segment/Cues/CuePoint/CueTrackPositions/CueCodecState(u64), -// #[id=0xB2] Segment/Cues/CuePoint/CueTrackPositions/CueDuration(u64), +// #[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(u64), -// #[id=0xEB] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefCodecState(u64), -// #[id=0x535F] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefNumber(u64), -// #[id=0x96] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefTime(u64), -// #[id=0xF0] Segment/Cues/CuePoint/CueTrackPositions/CueRelativePosition(u64), -// #[id=0xF7] Segment/Cues/CuePoint/CueTrackPositions/CueTrack(u64), +// #[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), // #[id=0x1549A966] Segment/Info(Master), // #[id=0x6924] Segment/Info/ChapterTranslate(Master), -// #[id=0x69BF] Segment/Info/ChapterTranslate/ChapterTranslateCodec(u64), -// #[id=0x69FC] Segment/Info/ChapterTranslate/ChapterTranslateEditionUID(u64), +// #[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), @@ -124,49 +124,49 @@ define_ebml! { // #[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(u64), +// #[id=0x2AD7B1] Segment/Info/TimestampScale(Uint), // #[id=0x7BA9] Segment/Info/Title(Utf8), // #[id=0x5741] Segment/Info/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(u64), +// #[id=0x53AC] Segment/SeekHead/Seek/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(u64), -// #[id=0x44B4] Segment/Tags/Tag/SimpleTag/TagDefaultBogus(u64), +// #[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(u64), -// #[id=0x63C4] Segment/Tags/Tag/Targets/TagChapterUID(u64), -// #[id=0x63C9] Segment/Tags/Tag/Targets/TagEditionUID(u64), -// #[id=0x63C5] Segment/Tags/Tag/Targets/TagTrackUID(u64), +// #[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(u64), +// #[id=0x68CA] Segment/Tags/Tag/Targets/TargetTypeValue(Uint), // #[id=0x1654AE6B] Segment/Tracks(Master), // #[id=0xAE] Segment/Tracks/TrackEntry(Master), -// #[id=0x7446] Segment/Tracks/TrackEntry/AttachmentLink(u64), +// #[id=0x7446] Segment/Tracks/TrackEntry/AttachmentLink(Uint), // #[id=0xE1] Segment/Tracks/TrackEntry/Audio(Master), -// #[id=0x6264] Segment/Tracks/TrackEntry/Audio/BitDepth(u64), +// #[id=0x6264] Segment/Tracks/TrackEntry/Audio/BitDepth(Uint), // #[id=0x7D7B] Segment/Tracks/TrackEntry/Audio/ChannelPositions(Vec<u8>), -// #[id=0x9F] Segment/Tracks/TrackEntry/Audio/Channels(u64), +// #[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(u64), -// #[id=0x41F0] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDValue(u64), -// #[id=0xAA] Segment/Tracks/TrackEntry/CodecDecodeAll(u64), -// #[id=0x56AA] Segment/Tracks/TrackEntry/CodecDelay(u64), +// #[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), @@ -176,71 +176,71 @@ define_ebml! { // #[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(u64), +// #[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(u64), -// #[id=0x5032] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingScope(u64), -// #[id=0x5033] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingType(u64), +// #[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(u64), -// #[id=0x47E1] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncAlgo(u64), +// #[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(u64), -// #[id=0x47E6] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSigHashAlgo(u64), +// #[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(u64), -// #[id=0x23E383] Segment/Tracks/TrackEntry/DefaultDuration(u64), -// #[id=0x55AF] Segment/Tracks/TrackEntry/FlagCommentary(u64), -// #[id=0x88] Segment/Tracks/TrackEntry/FlagDefault(u64), -// #[id=0xB9] Segment/Tracks/TrackEntry/FlagEnabled(u64), -// #[id=0x55AA] Segment/Tracks/TrackEntry/FlagForced(u64), -// #[id=0x55AB] Segment/Tracks/TrackEntry/FlagHearingImpaired(u64), -// #[id=0x9C] Segment/Tracks/TrackEntry/FlagLacing(u64), -// #[id=0x55AE] Segment/Tracks/TrackEntry/FlagOriginal(u64), -// #[id=0x55AD] Segment/Tracks/TrackEntry/FlagTextDescriptions(u64), -// #[id=0x55AC] Segment/Tracks/TrackEntry/FlagVisualImpaired(u64), +// #[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(u64), -// #[id=0x6DF8] Segment/Tracks/TrackEntry/MaxCache(u64), -// #[id=0x6DE7] Segment/Tracks/TrackEntry/MinCache(u64), +// #[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(u64), -// #[id=0xD7] Segment/Tracks/TrackEntry/TrackNumber(u64), +// #[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(u64), -// #[id=0xE5] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes/TrackPlane/TrackPlaneUID(u64), +// #[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(u64), -// #[id=0x6FAB] Segment/Tracks/TrackEntry/TrackOverlay(u64), +// #[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(u64), -// #[id=0x66FC] Segment/Tracks/TrackEntry/TrackTranslate/TrackTranslateEditionUID(u64), +// #[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(u64), -// #[id=0x73C5] Segment/Tracks/TrackEntry/TrackUID(u64), +// #[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(u64), -// #[id=0xC6] Segment/Tracks/TrackEntry/TrickTrackFlag(u64), +// #[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(u64), +// #[id=0xC0] Segment/Tracks/TrackEntry/TrickTrackUID(Uint), // #[id=0xE0] Segment/Tracks/TrackEntry/Video(Master), -// #[id=0x53C0] Segment/Tracks/TrackEntry/Video/AlphaMode(u64), -// #[id=0x54B3] Segment/Tracks/TrackEntry/Video/AspectRatioType(u64), +// #[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(u64), -// #[id=0x55B5] Segment/Tracks/TrackEntry/Video/Colour/CbSubsamplingHorz(u64), -// #[id=0x55B6] Segment/Tracks/TrackEntry/Video/Colour/CbSubsamplingVert(u64), -// #[id=0x55B7] Segment/Tracks/TrackEntry/Video/Colour/ChromaSitingHorz(u64), -// #[id=0x55B8] Segment/Tracks/TrackEntry/Video/Colour/ChromaSitingVert(u64), -// #[id=0x55B3] Segment/Tracks/TrackEntry/Video/Colour/ChromaSubsamplingHorz(u64), -// #[id=0x55B4] Segment/Tracks/TrackEntry/Video/Colour/ChromaSubsamplingVert(u64), +// #[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), @@ -252,31 +252,31 @@ define_ebml! { // #[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(u64), -// #[id=0x55BC] Segment/Tracks/TrackEntry/Video/Colour/MaxCLL(u64), -// #[id=0x55BD] Segment/Tracks/TrackEntry/Video/Colour/MaxFALL(u64), -// #[id=0x55BB] Segment/Tracks/TrackEntry/Video/Colour/Primaries(u64), -// #[id=0x55B9] Segment/Tracks/TrackEntry/Video/Colour/Range(u64), -// #[id=0x55BA] Segment/Tracks/TrackEntry/Video/Colour/TransferCharacteristics(u64), -// #[id=0x54BA] Segment/Tracks/TrackEntry/Video/DisplayHeight(u64), -// #[id=0x54B2] Segment/Tracks/TrackEntry/Video/DisplayUnit(u64), -// #[id=0x54B0] Segment/Tracks/TrackEntry/Video/DisplayWidth(u64), -// #[id=0x9D] Segment/Tracks/TrackEntry/Video/FieldOrder(u64), -// #[id=0x9A] Segment/Tracks/TrackEntry/Video/FlagInterlaced(u64), +// #[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(u64), -// #[id=0x54AA] Segment/Tracks/TrackEntry/Video/PixelCropBottom(u64), -// #[id=0x54CC] Segment/Tracks/TrackEntry/Video/PixelCropLeft(u64), -// #[id=0x54DD] Segment/Tracks/TrackEntry/Video/PixelCropRight(u64), -// #[id=0x54BB] Segment/Tracks/TrackEntry/Video/PixelCropTop(u64), -// #[id=0xBA] Segment/Tracks/TrackEntry/Video/PixelHeight(u64), -// #[id=0xB0] Segment/Tracks/TrackEntry/Video/PixelWidth(u64), +// #[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(u64), -// #[id=0x53B8] Segment/Tracks/TrackEntry/Video/StereoMode(u64), +// #[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>) diff --git a/ebml/src/read.rs b/ebml/src/read.rs index 9864ea5..7431683 100644 --- a/ebml/src/read.rs +++ b/ebml/src/read.rs @@ -1,9 +1,5 @@ use std::io::{Read, Seek}; - -use anyhow::{bail, Result}; -use log::debug; - -// use crate::matroska::{Master, MatroskaTag}; +use anyhow::Result; trait ReadAndSeek: Read + Seek {} impl<T: Read + Seek> ReadAndSeek for T {} diff --git a/ebml_derive/src/lib.rs b/ebml_derive/src/lib.rs index 2c9dd9c..07e60f9 100644 --- a/ebml_derive/src/lib.rs +++ b/ebml_derive/src/lib.rs @@ -1,63 +1,150 @@ -use proc_macro::{Delimiter, TokenStream, TokenTree}; +use proc_macro::{token_stream, Delimiter, Span, TokenStream, TokenTree}; use quote::quote; +use syn::{Fields, FieldsUnnamed, Ident, Variant}; struct Tag { id: u64, - path: Vec<String>, - name: String, + global: bool, + path: Vec<u64>, + name: Ident, r#type: Option<String>, // None -> Master } #[proc_macro] pub fn define_ebml(ts: TokenStream) -> TokenStream { - let mut next_glob = false; let mut ts = ts.into_iter(); - let mut tags = vec![]; + parse_kt(&mut tags, &mut ts, vec![]); - while let Some(t) = ts.next() { - match t { - TokenTree::Ident(ident) => { - let ident = ident.to_string(); - if &ident == "global" { - next_glob = true; - } else { - let glob = next_glob; - next_glob = false; - let id = if let Some(TokenTree::Group(gr)) = ts.next() { - assert_eq!(gr.delimiter(), Delimiter::Bracket); - let mut ts = gr.stream().into_iter(); - if let TokenTree::Literal(lit) = ts.next().unwrap() { - u64::from_str_radix(&lit.to_string()[2..], 16).unwrap() - } else { - panic!("literal expected") - } - } else { - panic!("group expected") - }; - if let Some(TokenTree::Punct(p)) = ts.next() { - assert_eq!(p.as_char(), ':') - } else { - panic!("colon expected") - } - match ts.next() { - Some(TokenTree::Group(_)) => {} - Some(TokenTree::Ident(ident)) => { - let r#type = ident.to_string(); - eprintln!("global={glob} id={id}, type={}", r#type); + let enum_variants = tags + .iter() + .map(|e| Variant { + ident: e.name.clone(), + attrs: vec![], + fields: Fields::Unnamed( + syn::parse2::<FieldsUnnamed>(match e.r#type.clone() { + None => quote!((Master)), + Some(r#type) => match r#type.as_str() { + "Uint" => quote!((u64)), + "Utf8" => quote!((String)), + "Binary" => quote!((Vec<u8>)), + _ => panic!("unsupported type {}", r#type), + }, + }) + .expect("parse type"), + ), + discriminant: None, + }) + .collect::<Vec<_>>(); + + let path_match = tags + .iter() + .map(|e| { + let name = &e.name; + let mut path = e.path.clone(); + path.reverse(); + if e.global { + quote! { Self::#name(_) => None } + } else { + quote! { Self::#name(_) => Some(&[#(#path),*]) } + } + }) + .collect::<Vec<_>>(); + + let parse_match = tags + .iter() + .map(|Tag { id, name, .. }| { + quote! { #id => Self::#name(crate::ValueFromBuf::from_buf(data)?) } + }) + .collect::<Vec<_>>(); + + quote! { + use crate::Master; + pub enum MatroskaTag { + #(#enum_variants),* + } + impl MatroskaTag { + /// returns path in **reverse** order or None if global. + pub fn path(&self) -> Option<&'static [u64]> { + match self { #(#path_match),* } + } + pub fn parse(id: u64, data: &[u8]) -> anyhow::Result<Self> { + Ok(match id { #(#parse_match),*, _ => anyhow::bail!("unknown id") }) + } + } + } + .into() +} + +fn parse_kt(tags: &mut Vec<Tag>, ts: &mut token_stream::IntoIter, path: Vec<u64>) { + let mut next_glob = false; + loop { + let global = next_glob; + next_glob = false; - } - _ => panic!("group or ident expected"), - } - if let Some(TokenTree::Punct(p)) = ts.next() { - assert_eq!(p.as_char(), ',') - } else { - panic!("colon expected") - } + let name = if let Some(tt) = ts.next() { + if let TokenTree::Ident(name) = tt { + if &name.to_string() == "global" { + next_glob = true; + continue; } + name.to_string() + } else { + panic!("expected ident") } - x => panic!("unexpected {x:?}"), + } else { + break; + }; + + let id = if let Some(TokenTree::Group(gr)) = ts.next() { + assert_eq!(gr.delimiter(), Delimiter::Bracket); + let mut ts = gr.stream().into_iter(); + if let TokenTree::Literal(lit) = ts.next().unwrap() { + u64::from_str_radix(&lit.to_string()[2..], 16).unwrap() + } else { + panic!("literal expected") + } + } else { + panic!("group expected") + }; + if let Some(TokenTree::Punct(p)) = ts.next() { + assert_eq!(p.as_char(), ':') + } else { + panic!("colon expected") + } + match ts.next() { + Some(TokenTree::Group(gr)) => { + // eprintln!("entering group"); + let mut ts = gr.stream().into_iter(); + tags.push(Tag { + global, + id, + name: Ident::new(&name, Span::call_site().into()), + path: path.clone(), + r#type: None, + }); + let mut path = path.clone(); + path.push(id); + parse_kt(tags, &mut ts, path); + // eprintln!("leaving group"); + } + Some(TokenTree::Ident(r#type)) => { + let r#type = r#type.to_string(); + // eprintln!("global={global} id={id}, type={}", r#type); + tags.push(Tag { + id, + name: Ident::new(&name, Span::call_site().into()), + path: path.clone(), + global, + r#type: Some(r#type), + }) + } + _ => panic!("group or ident expected"), + } + if let Some(TokenTree::Punct(p)) = ts.next() { + assert_eq!(p.as_char(), ',') + } else { + panic!("colon expected") } } - quote! {}.into() } |