#include "./matroskaid.h" #include "./ebmlid.h" namespace TagParser { /*! * \brief Encapsulates the most common Matroska element IDs. */ namespace MatroskaIds { } /*! * \brief Encapsulates the most common Matroska track IDs. */ namespace MatroskaTrackType { } /*! * \brief Returns a string for the specified \a matroskaId * if known; otherwise returns an empty string. */ std::string_view matroskaIdName(std::uint32_t matroskaId) { using namespace EbmlIds; using namespace MatroskaIds; switch (matroskaId) { // top-level IDs case Header: return "header"; case Version: return "version"; case ReadVersion: return "read version"; case MaxIdLength: return "max id length"; case MaxSizeLength: return "max size length"; case DocType: return "document type"; case DocTypeVersion: return "document version"; case DocTypeReadVersion: return "document read version"; case Void: return "void"; case Crc32: return "CRC-32"; case Segment: return "segment"; case SegmentInfo: return "segment info"; case Tracks: return "tracks"; case Cues: return "cues"; case Tags: return "tags"; case SeekHead: return "seek head"; case Cluster: return "cluster"; case Attachments: return "attachments"; case Chapters: return "chapters"; // IDs in the SeekHead master case Seek: return "seek"; // IDs in the Seek master case SeekID: return "seek id"; case SeekPosition: return "seek position"; // IDs in the SegmentInfo master case TimeCodeScale: return "time scale code"; case Duration: return "duration"; case WrittingApp: return "writing application"; case MuxingApp: return "muxing application"; case DateUTC: return "date UTC"; case SegmentUID: return "unique segment ID"; case SegmentFileName: return "segment file name"; case PrevUID: return "previous unique id"; case PrevFileName: return "previous file name"; case NexUID: return "next unique ID"; case NextFileName: return "next file name"; case Title: return "title"; case SegmentFamily: return "segment family"; case ChapterTranslate: return "chapter translate"; // IDs in ChapterTranslate master case ChapterTranslateEditionUID: return "chapter translate edition UID"; case ChapterTranslateCodec: return "chapter translate codec"; case ChapterTranslateID: return "chapter translate ID"; // IDs in the Tracks master case TrackEntry: return "track entry"; // IDs in the TrackEntry master case TrackNumber: return "track number"; case TrackUID: return "unique track id"; case TrackType: return "track type"; case TrackAudio: return "audio track"; case TrackVideo: return "video track"; case ContentEncodings: return "content encodings"; case CodecID: return "codec id"; case CodecPrivate: return "codec private"; case CodecName: return "codec name"; case TrackName: return "track name"; case TrackLanguage: return "track language"; case TrackLanguageIETF: return "track language IETF"; case TrackFlagEnabled: return "track enabled"; case TrackFlagDefault: return "default track"; case TrackFlagForced: return "forced track"; case TrackFlagLacing: return "track lacing"; case MinCache: return "track minimum cache"; case MaxCache: return "track maximum cache"; case DefaultDuration: return "track default duration"; case TrackTimeCodeScale: return "track time code scale"; case MaxBlockAdditionId: return "max block addition ID"; case AttachmentLink: return "track attachment link"; case TrackOverlay: return "track overlay"; case TrackTranslate: return "track translate"; case TrackOffset: return "track offset"; case CodecSettings: return "codec settings"; case CodecInfoUrl: return "codec info url"; case CodecDownloadUrl: return "codec download url"; case CodecDecodeAll: return "codec decode all"; // IDs in the TrackTranslate master case TrackTranslateEditionUID: return "track translate edition UID"; case TrackTranslateCodec: return "track translate codec"; case TrackTranslateTrackID: return "track translate ID"; // IDs in the TrackVideo master case FrameRate: return "video frame rate"; case DisplayWidth: return "video display width"; case DisplayHeight: return "video display height"; case DisplayUnit: return "video display unit"; case PixelWidth: return "video pixel width"; case PixelHeight: return "video pixel height"; case PixelCropBottom: return "video pixel crop bottom"; case PixelCropTop: return "video pixel crop top"; case PixelCropLeft: return "video pixel crop left"; case PixelCropRight: return "video pixel crop right"; case FlagInterlaced: return "video flag interlaced"; case StereoMode: return "video stereo mode"; case AspectRatioType: return "video aspect ratio type"; case ColorSpace: return "video color space"; case GammaValue: return "video gamma value"; // IDs in the TrackAudio master case SamplingFrequency: return "audio sampling frequence"; case BitDepth: return "audio bit depth"; case Channels: return "audio channels"; case ChannelsPositions: return "audio channel positions"; case OutputSamplingFrequency: return "audio output sample frequence"; // IDs in the TrackOperation master case TrackCombinePlanes: return "track combine planes"; case TrackJoinBlocks: return "track join blocks"; // IDs in the TrackCombinePlanes master case TrackPlane: return "track plane"; // IDs in the TrackPlane master case TrackPlaneUID: return "track plane UID"; case TrackPlaneType: return "track plane type"; // IDs in the TrackJoinBlocks master case TrackJoinUID: return "track join UID"; // IDs in the ContentEncoding master case ContentEncodingOrder: return "content encoding order"; case ContentEncodingScope: return "content encoding scope"; case ContentEncodingType: return "content encoding type"; case ContentCompression: return "content encoding compression"; case ContentEncryption: return "content encoding encryption"; // IDs in the ContentEncryption master case ContentEncAlgo: return "content encryption algorithmus"; case ContentEncKeyID: return "content encryption key ID"; case ContentSignature: return "content encryption signature"; case ContentSigKeyID: return "content encryption signature key ID"; case ContentSigAlgo: return "content encryption signature algorithmus"; case ContentSigHashAlgo: return "content encryption signature hash algorithmus"; // IDs in the Tags master case Tag: return "tag"; // IDs in the Tag master case SimpleTag: return "simple tag"; case Targets: return "targets"; // IDs in the SimpleTag master case TagName: return "tag name"; case TagString: return "tag string"; case TagLanguage: return "tag language"; case TagLanguageIETF: return "tag language IETF"; case TagDefault: return "tag default"; case TagBinary: return "tag binary"; // IDs in the Targets master case TargetTypeValue: return "target type value"; case TargetType: return "target type"; case TagTrackUID: return "tag track UID"; case TagEditionUID: return "tag edition UID"; case TagChapterUID: return "tag chapter UID"; case TagAttachmentUID: return "tag attachment UID"; // IDs in the Cues master case CuePoint: return "cue point"; // IDs in the CuePoint master case CueTime: return "cue time"; case CueTrackPositions: return "cue track positions"; // IDs in the CueTrackPositions master case CueTrack: return "cue track"; case CueClusterPosition: return "cue cluster position"; case CueRelativePosition: return "cue relative position"; case CueDuration: return "cue duration"; case CueBlockNumber: return "cue block number"; case CueCodecState: return "cue codec state"; case CueReference: return "cue reference"; // IDs in the CueReference master case CueRefTime: return "cue reference time"; case CueRefCluster: return "cue reference cluster"; case CueRefNumber: return "cue reference number"; case CueRefCodecState: return "cue reference codec state"; // IDs in the Attachments master case AttachedFile: return "attached file"; // IDs in the AttachedFile master case FileDescription: return "file description"; case FileName: return "file name"; case FileMimeType: return "file mime type"; case FileData: return "file data"; case FileUID: return "file UID"; case FileReferral: return "file referral"; case FileUsedStartTime: return "file used start time"; case FileUsedEndTime: return "file used end time"; // IDs in the Chapters master case EditionEntry: return "edition entry"; // IDs in the EditionEntry master case EditionUID: return "edition UID"; case EditionFlagHidden: return "edition flag hidden"; case EditionFlagDefault: return "edition flag default"; case EditionFlagOrdered: return "edition flag ordered"; case ChapterAtom: return "chapter atom"; // IDs in the ChapterAtom master case ChapterUID: return "chapter UID"; case ChapterStringUID: return "chapter string UID"; case ChapterTimeStart: return "chapter time start"; case ChapterTimeEnd: return "chapter time end"; case ChapterFlagHidden: return "chapter flag hidden"; case ChapterFlagEnabled: return "chapter flag enabled"; case ChapterSegmentUID: return "chapter segment UID"; case ChapterSegmentEditionUID: return "chapter segment edition UID"; case ChapterPhysicalEquiv: return "chapter physical equiv"; case ChapterTrack: return "chapter track"; case ChapterDisplay: return "chapter display"; case ChapProcess: return "chapter process"; // IDs in the ChaptgerTrack master case ChapterTrackNumber: return "chapter track number"; // IDs in the ChapterDisplay master case ChapString: return "chap string"; case ChapLanguage: return "chap language"; case ChapLanguageIETF: return "chap language IETF"; case ChapCountry: return "chap country"; // IDs in the ChapProcess master case ChapProcessCodecID: return "chap process ID"; case ChapProcessPrivate: return "chap process private"; case ChapProcessCommand: return "chap process command"; // IDs in the ChapProcessCommand master case ChapProcessTime: return "chap process time"; case ChapProcessData: return "chap process data"; // IDs in the Cluster master case Timecode: return "timecode"; case SilentTracks: return "silent tracks"; case Position: return "position"; case PrevSize: return "previous size"; case SimpleBlock: return "simple block"; case BlockGroup: return "block group"; case EncryptedBlock: return "encrypted block"; // IDs in the SilentTracks master case SilentTrackNumber: return "silent track number"; // IDs in the BlockGroup master case Block: return "block"; case BlockVirtual: return "block virtual"; case BlockAdditions: return "block additions"; case BlockDuration: return "block duration"; case ReferencePriority: return "reference priority"; case ReferenceBlock: return "reference block"; case ReferenceVirtual: return "reference virtual"; case CodecState: return "codec state"; case DiscardPadding: return "discard padding"; case Slices: return "slices"; case ReferenceFrame: return "reference frame"; // IDs in the BlockAdditions master case BlockMore: return "block more"; // IDs in the BlockMore master case BlockAddID: return "block add ID"; case BlockAdditional: return "block additional"; // IDs in the Slices master case TimeSlice: return "time slice"; // IDs in the TimeSlice master case LaceNumber: return "lace number"; case FrameNumber: return "frame number"; case BlockAdditionID: return "block addition ID"; case Delay: return "delay"; case SliceDuration: return "slice duration"; // IDs in the ReferenceFrame master case ReferenceOffset: return "reference offset"; case ReferenceTimeCode: return "reference time code"; default: return std::string_view(); } } /*! * \brief Returns the level at which elements with the specified \a matroskaId are supposed * to occur in a Matroska file. */ MatroskaElementLevel matroskaIdLevel(std::uint32_t matroskaId) { using namespace EbmlIds; using namespace MatroskaIds; switch (matroskaId) { case Header: case Segment: return MatroskaElementLevel::TopLevel; case SeekHead: case SegmentInfo: case Cluster: case Tracks: case Cues: case Attachments: case Chapters: case Tags: return MatroskaElementLevel::Level1; case Seek: case SegmentUID: case SegmentFileName: case PrevUID: case PrevFileName: case NexUID: case NextFileName: case SegmentFamily: case ChapterTranslate: case TimeCodeScale: case Duration: case DateUTC: case Title: case MuxingApp: case WrittingApp: case Timecode: case SilentTracks: case Position: case PrevSize: case SimpleBlock: case BlockGroup: case EncryptedBlock: case TrackEntry: case CuePoint: case AttachedFile: case EditionEntry: case Tag: return MatroskaElementLevel::Level2; case SeekID: case SeekPosition: case ChapterTranslateEditionUID: case ChapterTranslateCodec: case ChapterTranslateID: case SilentTrackNumber: case BlockVirtual: case BlockAdditions: case BlockDuration: case ReferencePriority: case ReferenceBlock: case ReferenceVirtual: case CodecState: case DiscardPadding: case Slices: case TrackNumber: case TrackUID: case TrackType: case TrackFlagEnabled: case TrackFlagDefault: case TrackFlagForced: case TrackFlagLacing: case MinCache: case MaxCache: case DefaultDuration: case DefaultDecodedFieldDuration: case TrackTimeCodeScale: case TrackOffset: case MaxBlockAdditionId: case TrackName: case TrackLanguage: case TrackLanguageIETF: case CodecID: case CodecPrivate: case CodecName: case AttachmentLink: case CodecSettings: case CodecInfoUrl: case CodecDownloadUrl: case CodecDecodeAll: case TrackOverlay: case CodecDelay: case SeekPreRoll: case TrackTranslate: case TrackVideo: case TrackAudio: case ContentEncodings: case CueTime: case CueTrackPositions: case FileDescription: case FileName: case FileMimeType: case FileData: case FileUID: case FileReferral: case FileUsedStartTime: case FileUsedEndTime: case EditionUID: case EditionFlagHidden: case EditionFlagDefault: case EditionFlagOrdered: case Targets: return MatroskaElementLevel::Level3; case BlockMore: case TimeSlice: case ContentEncoding: case CueTrack: case CueClusterPosition: case CueRelativePosition: case CueDuration: case CueBlockNumber: case CueCodecState: case CueReference: case TargetTypeValue: case TargetType: case TagTrackUID: case TagEditionUID: case TagChapterUID: case TagAttachmentUID: return MatroskaElementLevel::Level4; case BlockAddID: case BlockAdditional: case LaceNumber: case FrameNumber: case BlockAdditionID: case Delay: case SliceDuration: case ReferenceFrame: case ReferenceOffset: case ReferenceTimeCode: case CueRefTime: case CueRefCluster: case CueRefNumber: case CueRefCodecState: return MatroskaElementLevel::Level5; case Void: case Crc32: return MatroskaElementLevel::Global; default: return MatroskaElementLevel::Unknown; } } } // namespace TagParser