2015-09-06 19:57:33 +02:00
|
|
|
#include "./ebmlid.h"
|
|
|
|
#include "./matroskaid.h"
|
2015-04-22 19:22:01 +02:00
|
|
|
|
|
|
|
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";
|
2017-08-17 23:20:38 +02:00
|
|
|
case PrevUID: return "previous unique id";
|
2015-04-22 19:22:01 +02:00
|
|
|
case PrevFileName: return "previous file name";
|
2017-08-17 23:20:38 +02:00
|
|
|
case NexUID: return "next unique ID";
|
|
|
|
case NextFileName: return "next file name";
|
2015-04-22 19:22:01 +02:00
|
|
|
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";
|
2015-08-13 03:23:28 +02:00
|
|
|
case CodecID: return "codec id";
|
|
|
|
case CodecPrivate: return "codec private";
|
2015-04-22 19:22:01 +02:00
|
|
|
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";
|
2017-08-17 23:20:38 +02:00
|
|
|
case TagTrackUID: return "tag track UID";
|
|
|
|
case TagEditionUID: return "tag edition UID";
|
|
|
|
case TagChapterUID: return "tag chapter UID";
|
|
|
|
case TagAttachmentUID: return "tag attachment UID";
|
2015-04-22 19:22:01 +02:00
|
|
|
|
|
|
|
// 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 "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-18 00:10:48 +02:00
|
|
|
/*!
|
|
|
|
* \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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-04-22 19:22:01 +02:00
|
|
|
|
|
|
|
}
|