You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
335 lines
8.8 KiB
335 lines
8.8 KiB
// Copyright (c) 2016 The WebM project authors. All Rights Reserved.
|
|
//
|
|
// Use of this source code is governed by a BSD-style license
|
|
// that can be found in the LICENSE file in the root of the source
|
|
// tree. An additional intellectual property rights grant can be found
|
|
// in the file PATENTS. All contributing project authors may
|
|
// be found in the AUTHORS file in the root of the source tree.
|
|
#include "src/ancestory.h"
|
|
|
|
#include "webm/id.h"
|
|
|
|
namespace webm {
|
|
|
|
bool Ancestory::ById(Id id, Ancestory* ancestory) {
|
|
// These lists of IDs were generated and must match the switch statement and
|
|
// have static storage duration. They were generated as follows:
|
|
//
|
|
// 1. List all the master elements:
|
|
// kEbml
|
|
// kSegment
|
|
// kSeekHead
|
|
// kSeek
|
|
// kInfo
|
|
// kCluster
|
|
// kBlockGroup
|
|
// kBlockAdditions
|
|
// kBlockMore
|
|
// kSlices
|
|
// kTimeSlice
|
|
// etc.
|
|
//
|
|
// 2. Now prefix each entry with its full ancestory:
|
|
// kEbml
|
|
// kSegment
|
|
// kSegment, kSeekHead
|
|
// kSegment, kSeekHead, kSeek
|
|
// kSegment, kInfo
|
|
// kSegment, kCluster
|
|
// kSegment, kCluster, kBlockGroup
|
|
// kSegment, kCluster, kBlockGroup, kBlockAdditions
|
|
// kSegment, kCluster, kBlockGroup, kBlockAdditions, kBlockMore
|
|
// kSegment, kCluster, kBlockGroup, kSlices
|
|
// kSegment, kCluster, kBlockGroup, kSlices, kTimeSlice
|
|
// etc.
|
|
//
|
|
// 3. Now remove entries that are just subsets of others:
|
|
// kEbml
|
|
// kSegment, kSeekHead, kSeek
|
|
// kSegment, kInfo
|
|
// kSegment, kCluster, kBlockGroup, kBlockAdditions, kBlockMore
|
|
// kSegment, kCluster, kBlockGroup, kSlices, kTimeSlice
|
|
// etc.
|
|
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:
|
|
// This is an unknown element or a global element (i.e. Void); its
|
|
// ancestory cannot be deduced.
|
|
*ancestory = {};
|
|
return false;
|
|
}
|
|
}
|
|
|
|
} // namespace webm
|