tagparser/matroska/matroskaid.cpp

471 lines
16 KiB
C++

#include "./ebmlid.h"
#include "./matroskaid.h"
namespace Media {
/*!
* \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.
*/
const char *matroskaIdName(uint32 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 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 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 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 "";
}
}
/*!
* \brief Returns the level at which elements with the specified \a matroskaId are supposed
* to occur in a Matroska file.
*/
MatroskaElementLevel matroskaIdLevel(uint32 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 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;
}
}
}