#include "src/ancestory.h"
#include "webm/id.h"
namespace webm {
bool Ancestory::ById(Id id, Ancestory* ancestory) {
static constexpr Id kEbmlAncestory[] = {
Id::kEbml,
};
static constexpr Id kSeekAncestory[] = {
Id::kSegment,
Id::kSeekHead,
Id::kSeek,
};
static constexpr Id kInfoAncestory[] = {
Id::kSegment,
Id::kInfo,
};
static constexpr Id kBlockMoreAncestory[] = {
Id::kSegment, Id::kCluster, Id::kBlockGroup,
Id::kBlockAdditions, Id::kBlockMore,
};
static constexpr Id kTimeSliceAncestory[] = {
Id::kSegment, Id::kCluster, Id::kBlockGroup, Id::kSlices, Id::kTimeSlice,
};
static constexpr Id kVideoAncestory[] = {
Id::kSegment,
Id::kTracks,
Id::kTrackEntry,
Id::kVideo,
};
static constexpr Id kAudioAncestory[] = {
Id::kSegment,
Id::kTracks,
Id::kTrackEntry,
Id::kAudio,
};
static constexpr Id kContentEncAesSettingsAncestory[] = {
Id::kSegment,
Id::kTracks,
Id::kTrackEntry,
Id::kContentEncodings,
Id::kContentEncoding,
Id::kContentEncryption,
Id::kContentEncAesSettings,
};
static constexpr Id kCueTrackPositionsAncestory[] = {
Id::kSegment,
Id::kCues,
Id::kCuePoint,
Id::kCueTrackPositions,
};
static constexpr Id kChapterDisplayAncestory[] = {
Id::kSegment, Id::kChapters, Id::kEditionEntry,
Id::kChapterAtom, Id::kChapterDisplay,
};
static constexpr Id kTargetsAncestory[] = {
Id::kSegment,
Id::kTags,
Id::kTag,
Id::kTargets,
};
static constexpr Id kSimpleTagAncestory[] = {
Id::kSegment,
Id::kTags,
Id::kTag,
Id::kSimpleTag,
};
switch (id) {
case Id::kEbmlVersion:
case Id::kEbmlReadVersion:
case Id::kEbmlMaxIdLength:
case Id::kEbmlMaxSizeLength:
case Id::kDocType:
case Id::kDocTypeVersion:
case Id::kDocTypeReadVersion:
*ancestory = Ancestory(kEbmlAncestory, 1);
return true;
case Id::kSeekHead:
case Id::kInfo:
case Id::kCluster:
case Id::kTracks:
case Id::kCues:
case Id::kChapters:
case Id::kTags:
*ancestory = Ancestory(kSeekAncestory, 1);
return true;
case Id::kSeek:
*ancestory = Ancestory(kSeekAncestory, 2);
return true;
case Id::kSeekId:
case Id::kSeekPosition:
*ancestory = Ancestory(kSeekAncestory, 3);
return true;
case Id::kTimecodeScale:
case Id::kDuration:
case Id::kDateUtc:
case Id::kTitle:
case Id::kMuxingApp:
case Id::kWritingApp:
*ancestory = Ancestory(kInfoAncestory, 2);
return true;
case Id::kTimecode:
case Id::kPrevSize:
case Id::kSimpleBlock:
case Id::kBlockGroup:
*ancestory = Ancestory(kBlockMoreAncestory, 2);
return true;
case Id::kBlock:
case Id::kBlockVirtual:
case Id::kBlockAdditions:
case Id::kBlockDuration:
case Id::kReferenceBlock:
case Id::kDiscardPadding:
case Id::kSlices:
*ancestory = Ancestory(kBlockMoreAncestory, 3);
return true;
case Id::kBlockMore:
*ancestory = Ancestory(kBlockMoreAncestory, 4);
return true;
case Id::kBlockAddId:
case Id::kBlockAdditional:
*ancestory = Ancestory(kBlockMoreAncestory, 5);
return true;
case Id::kTimeSlice:
*ancestory = Ancestory(kTimeSliceAncestory, 4);
return true;
case Id::kLaceNumber:
*ancestory = Ancestory(kTimeSliceAncestory, 5);
return true;
case Id::kTrackEntry:
*ancestory = Ancestory(kVideoAncestory, 2);
return true;
case Id::kTrackNumber:
case Id::kTrackUid:
case Id::kTrackType:
case Id::kFlagEnabled:
case Id::kFlagDefault:
case Id::kFlagForced:
case Id::kFlagLacing:
case Id::kDefaultDuration:
case Id::kName:
case Id::kLanguage:
case Id::kCodecId:
case Id::kCodecPrivate:
case Id::kCodecName:
case Id::kCodecDelay:
case Id::kSeekPreRoll:
case Id::kVideo:
case Id::kAudio:
case Id::kContentEncodings:
*ancestory = Ancestory(kVideoAncestory, 3);
return true;
case Id::kFlagInterlaced:
case Id::kStereoMode:
case Id::kAlphaMode:
case Id::kPixelWidth:
case Id::kPixelHeight:
case Id::kPixelCropBottom:
case Id::kPixelCropTop:
case Id::kPixelCropLeft:
case Id::kPixelCropRight:
case Id::kDisplayWidth:
case Id::kDisplayHeight:
case Id::kDisplayUnit:
case Id::kAspectRatioType:
case Id::kFrameRate:
*ancestory = Ancestory(kVideoAncestory, 4);
return true;
case Id::kSamplingFrequency:
case Id::kOutputSamplingFrequency:
case Id::kChannels:
case Id::kBitDepth:
*ancestory = Ancestory(kAudioAncestory, 4);
return true;
case Id::kContentEncoding:
*ancestory = Ancestory(kContentEncAesSettingsAncestory, 4);
return true;
case Id::kContentEncodingOrder:
case Id::kContentEncodingScope:
case Id::kContentEncodingType:
case Id::kContentEncryption:
*ancestory = Ancestory(kContentEncAesSettingsAncestory, 5);
return true;
case Id::kContentEncAlgo:
case Id::kContentEncKeyId:
case Id::kContentEncAesSettings:
*ancestory = Ancestory(kContentEncAesSettingsAncestory, 6);
return true;
case Id::kAesSettingsCipherMode:
*ancestory = Ancestory(kContentEncAesSettingsAncestory, 7);
return true;
case Id::kCuePoint:
*ancestory = Ancestory(kCueTrackPositionsAncestory, 2);
return true;
case Id::kCueTime:
case Id::kCueTrackPositions:
*ancestory = Ancestory(kCueTrackPositionsAncestory, 3);
return true;
case Id::kCueTrack:
case Id::kCueClusterPosition:
case Id::kCueRelativePosition:
case Id::kCueDuration:
case Id::kCueBlockNumber:
*ancestory = Ancestory(kCueTrackPositionsAncestory, 4);
return true;
case Id::kEditionEntry:
*ancestory = Ancestory(kChapterDisplayAncestory, 2);
return true;
case Id::kChapterAtom:
*ancestory = Ancestory(kChapterDisplayAncestory, 3);
return true;
case Id::kChapterUid:
case Id::kChapterStringUid:
case Id::kChapterTimeStart:
case Id::kChapterTimeEnd:
case Id::kChapterDisplay:
*ancestory = Ancestory(kChapterDisplayAncestory, 4);
return true;
case Id::kChapString:
case Id::kChapLanguage:
case Id::kChapCountry:
*ancestory = Ancestory(kChapterDisplayAncestory, 5);
return true;
case Id::kTag:
*ancestory = Ancestory(kTargetsAncestory, 2);
return true;
case Id::kTargets:
case Id::kSimpleTag:
*ancestory = Ancestory(kTargetsAncestory, 3);
return true;
case Id::kTargetTypeValue:
case Id::kTargetType:
case Id::kTagTrackUid:
*ancestory = Ancestory(kTargetsAncestory, 4);
return true;
case Id::kTagName:
case Id::kTagLanguage:
case Id::kTagDefault:
case Id::kTagString:
case Id::kTagBinary:
*ancestory = Ancestory(kSimpleTagAncestory, 4);
return true;
case Id::kEbml:
case Id::kSegment:
*ancestory = {};
return true;
default:
*ancestory = {};
return false;
}
}
}