diff --git a/README.md b/README.md index ac507473..0805cbdd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,25 @@ + +# IMPORTANT NOTE +This is an experimental fork of Photon implementing extensions to validate IMF App#5 ACES packages. +These extensions are experimental, work-in-progress and not intended for production. + +You can find the Original Photon software [here](https://github.com/netflix/photon). + +# How to use +The IMPAnalyzer now supports the following option: +``` +java -cp ./build/libs/*: com.netflix.imflibrary.app.IMPAnalyzer +``` +``` +options: +-a, --application APPSTRING IMF Application to test against, supported values for APPSTRING are app2or2E, app5 or all (default: app2or2E) +``` + +Limitation: +The option "-a" is currently supported for the `````` argument only. + +Please note, by default Photon tests against the App #2/#2E specification. + # Photon Photon is a Java implementation of the Interoperable Master Format (IMF) standard. IMF is a SMPTE standard whose core constraints are defined in the specification st2067-2:2013. Photon offers tools for parsing, interpreting and validating constituent files that make an Interoperable Master Package (IMP). These include AssetMap (st429-9:2014), PackingList (st429-8:2007), Composition Playlist (st2067-3:2013), and the essence containing IMF track file (st2067-5:2013) which follows the Material eXchange Format (MXF) format (st377-1:2011). Specifically, Photon parses and completely reads an MXF file containing a single audio or video essence as defined by the IMF Essence Component specification (st2067-5:2013) and serializes the metadata into the IMF Composition Playlist structure. diff --git a/build.gradle b/build.gradle index 9e320fc8..bea39fc6 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,9 @@ buildscript { repositories { jcenter() } + dependencies { + classpath "io.spring.gradle:dependency-management-plugin:1.0.3.RELEASE" + } } plugins { @@ -11,6 +14,8 @@ plugins { id 'findbugs' } +apply plugin: "io.spring.dependency-management" + group = 'com.netflix.photon' sourceCompatibility = 1.8 @@ -55,6 +60,12 @@ javadoc { exclude "**/org/w3/_2000/_09/xmldsig_/**" } +dependencyManagement { + imports { + mavenBom 'com.amazonaws:aws-java-sdk-bom:1.11.228' + } +} + dependencies { compile 'com.google.code.findbugs:jsr305:3.0.1' compile "org.slf4j:slf4j-api:1.7+" @@ -62,7 +73,7 @@ dependencies { /** * Following includes the RegXMLLib dependency from Maven Central. */ - compile "com.sandflow:regxmllib:1.1.1" + compile "com.sandflow:regxmllib:1.1.2" /** * Following should be enabled and the above should be disabled * when necessary to verify changes to the RegXMLLib library that are @@ -71,6 +82,8 @@ dependencies { /*compile "com.sandflow:regxmllib:${revRegXMLSNAPSHOT}"*/ testCompile "org.mockito:mockito-all:1.9+" testCompile "org.testng:testng:6.+" + compile 'com.amazonaws:aws-java-sdk-s3' + testCompile group: 'junit', name: 'junit', version: '4.11' } test { @@ -99,4 +112,4 @@ task wrapper(type: Wrapper) { //Following line will enable including compile time dependencies as a part of the //compile and build process. -//assemble.dependsOn getDependencies \ No newline at end of file +//assemble.dependsOn getDependencies diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index feaab225..0a89414d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Nov 24 11:41:36 PST 2015 +#Thu Aug 23 08:40:04 EEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-all.zip diff --git a/src/main/java/com/netflix/imflibrary/Colorimetry.java b/src/main/java/com/netflix/imflibrary/Colorimetry.java index e6c7b977..1be3992b 100644 --- a/src/main/java/com/netflix/imflibrary/Colorimetry.java +++ b/src/main/java/com/netflix/imflibrary/Colorimetry.java @@ -21,6 +21,7 @@ public enum Colorimetry { Color5(ColorPrimaries.ITU2020, TransferCharacteristic.ITU2020, CodingEquation.ITU2020NCL), Color6(ColorPrimaries.P3D65, TransferCharacteristic.SMPTEST2084, CodingEquation.None), Color7(ColorPrimaries.ITU2020, TransferCharacteristic.SMPTEST2084, CodingEquation.ITU2020NCL), + Color_App5_AP0(ColorPrimaries.ACES, TransferCharacteristic.Linear, CodingEquation.None), Unknown(ColorPrimaries.Unknown, TransferCharacteristic.Unknown, CodingEquation.Unknown); @@ -85,6 +86,7 @@ public static enum TransferCharacteristic { IEC6196624xvYCC(UL.fromULAsURNStringToUL("urn:smpte:ul:06.0E.2B.34.04.01.01.0D.04.01.01.01.01.08.00.00")), ITU2020(UL.fromULAsURNStringToUL("urn:smpte:ul:06.0E.2B.34.04.01.01.0E.04.01.01.01.01.09.00.00")), SMPTEST2084(UL.fromULAsURNStringToUL("urn:smpte:ul:06.0E.2B.34.04.01.01.0D.04.01.01.01.01.0A.00.00")), + Linear(UL.fromULAsURNStringToUL("urn:smpte:ul:06.0e.2b.34.04.01.01.06.04.01.01.01.01.06.00.00")), Unknown(null); private final UL transferCharacteristicUL; @@ -112,6 +114,7 @@ public static enum ColorPrimaries { ITU709(UL.fromULAsURNStringToUL("urn:smpte:ul:06.0E.2B.34.04.01.01.06.04.01.01.01.03.03.00.00")), ITU2020(UL.fromULAsURNStringToUL("urn:smpte:ul:06.0E.2B.34.04.01.01.0D.04.01.01.01.03.04.00.00")), P3D65(UL.fromULAsURNStringToUL("urn:smpte:ul:06.0E.2B.34.04.01.01.0D.04.01.01.01.03.06.00.00")), + ACES(UL.fromULAsURNStringToUL("urn:smpte:ul:06.0e.2b.34.04.01.01.0d.04.01.01.01.03.07.00.00")), Unknown(null); private final UL colorPrimariesUL; diff --git a/src/main/java/com/netflix/imflibrary/IMPDelivery.java b/src/main/java/com/netflix/imflibrary/IMPDelivery.java index 8c7495f5..48834bff 100644 --- a/src/main/java/com/netflix/imflibrary/IMPDelivery.java +++ b/src/main/java/com/netflix/imflibrary/IMPDelivery.java @@ -22,6 +22,7 @@ import com.netflix.imflibrary.st0429_9.AssetMap; import com.netflix.imflibrary.st0429_9.BasicMapProfileV2FileSet; import com.netflix.imflibrary.st0429_9.BasicMapProfileV2MappedFileSet; +import com.netflix.imflibrary.utils.FileLocator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; @@ -29,7 +30,6 @@ import javax.annotation.concurrent.Immutable; import javax.xml.bind.JAXBException; import javax.xml.parsers.ParserConfigurationException; -import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -64,7 +64,7 @@ public IMPDelivery(BasicMapProfileV2FileSet basicMapProfileV2FileSet) throws IOE for (AssetMap.Asset packingListAsset : packingListAssets) { URI absolutePackingListURI = basicMapProfileV2FileSet.getAbsoluteAssetMapURI().resolve(packingListAsset.getPath()); - PackingList packingList = new PackingList(new File(absolutePackingListURI)); + PackingList packingList = new PackingList(FileLocator.fromLocation(absolutePackingListURI)); List referencedAssets = new ArrayList<>(); for (PackingList.Asset referencedAsset : packingList.getAssets()) @@ -117,9 +117,9 @@ public String toString() public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, URISyntaxException, JAXBException { - File rootFile = new File(args[0]); + FileLocator rootFileLocator = FileLocator.fromLocation(args[0]); - BasicMapProfileV2MappedFileSet basicMapProfileV2MappedFileSet = new BasicMapProfileV2MappedFileSet(rootFile); + BasicMapProfileV2MappedFileSet basicMapProfileV2MappedFileSet = new BasicMapProfileV2MappedFileSet(rootFileLocator); BasicMapProfileV2FileSet basicMapProfileV2FileSet = new BasicMapProfileV2FileSet(basicMapProfileV2MappedFileSet); IMPDelivery impDelivery = new IMPDelivery(basicMapProfileV2FileSet); diff --git a/src/main/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilder.java b/src/main/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilder.java index 99c04247..00bcc75d 100644 --- a/src/main/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilder.java +++ b/src/main/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilder.java @@ -22,6 +22,9 @@ import com.netflix.imflibrary.IMFErrorLoggerImpl; import com.netflix.imflibrary.st0377.HeaderPartition; import com.netflix.imflibrary.utils.ErrorLogger; +import com.netflix.imflibrary.utils.FileLocator; +import com.netflix.imflibrary.utils.RegXMLLibHelper; +import com.netflix.imflibrary.utils.ResourceByteRangeProvider; import com.netflix.imflibrary.writerTools.CompositionPlaylistBuilder_2013; import com.sandflow.smpte.klv.Triplet; import com.netflix.imflibrary.KLVPacket; @@ -40,10 +43,7 @@ import org.smpte_ra.schemas.st2067_2_2013.SequenceType; import org.smpte_ra.schemas.st2067_2_2013.UserTextType; import com.netflix.imflibrary.st0377.header.InterchangeObject; -import com.netflix.imflibrary.utils.FileByteRangeProvider; -import com.netflix.imflibrary.utils.ResourceByteRangeProvider; import com.netflix.imflibrary.writerTools.IMFCPLObjectFieldsFactory; -import com.netflix.imflibrary.utils.RegXMLLibHelper; import com.netflix.imflibrary.writerTools.utils.IMFUUIDGenerator; import com.netflix.imflibrary.writerTools.utils.IMFUtils; import org.slf4j.Logger; @@ -83,7 +83,7 @@ final class IMFTrackFileCPLBuilder { private final RegXMLLibHelper regXMLLibHelper; private final File workingDirectory; private final org.smpte_ra.schemas.st2067_2_2013.CompositionPlaylistType cplRoot; - private final File mxfFile; + private final FileLocator mxfFile; private final String fileName; @@ -91,11 +91,11 @@ final class IMFTrackFileCPLBuilder { * A constructor for the IMFTrackFileCPLBuilder class. This class creates an IMF CPL representation of an IMF Essence * @param workingDirectory - A location on a file system used for processing the essence. * This would also be the location where the CPL representation of the IMFEssence would be written into. - * @param essenceFile - File representing an IMF Essence + * @param essenceFileLocator - FileLocator representing an IMF Essence * @throws IOException - any I/O related error will be exposed through an IOException */ - public IMFTrackFileCPLBuilder(File workingDirectory, File essenceFile) throws IOException { - ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(essenceFile); + public IMFTrackFileCPLBuilder(File workingDirectory, FileLocator essenceFileLocator) throws IOException { + ResourceByteRangeProvider resourceByteRangeProvider = essenceFileLocator.getResourceByteRangeProvider(); this.imfTrackFileReader = new IMFTrackFileReader(workingDirectory, resourceByteRangeProvider); IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl(); KLVPacket.Header primerPackHeader = this.imfTrackFileReader.getPrimerPackHeader(imfErrorLogger); @@ -103,7 +103,7 @@ public IMFTrackFileCPLBuilder(File workingDirectory, File essenceFile) throws IO this.workingDirectory = workingDirectory; /*Peek into the CompositionPlayListType and recursively construct its constituent fields*/ this.cplRoot = IMFCPLObjectFieldsFactory.constructCompositionPlaylistType_2013(); - this.mxfFile = essenceFile; + this.mxfFile = essenceFileLocator; this.fileName = this.mxfFile.getName(); } @@ -419,7 +419,7 @@ private static String usage() return sb.toString(); } - public static void main(String[] args){ + public static void main(String[] args) throws IOException{ if (args.length != 2) { @@ -427,22 +427,22 @@ public static void main(String[] args){ throw new IllegalArgumentException("Invalid parameters"); } - File inputFile = new File(args[0]); - if(!inputFile.exists()){ - logger.error(String.format("File %s does not exist", inputFile.getAbsolutePath())); + FileLocator inputFileLocator = FileLocator.fromLocation(args[0]); + if(!inputFileLocator.exists()){ + logger.error(String.format("File %s does not exist", inputFileLocator.getAbsolutePath())); System.exit(-1); } File workingDirectory = new File(args[1]); - logger.info(String.format("File Name is %s", inputFile.getName())); - ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(inputFile); + logger.info(String.format("File Name is %s", inputFileLocator.getName())); + ResourceByteRangeProvider resourceByteRangeProvider = inputFileLocator.getResourceByteRangeProvider(); IMFTrackFileReader imfTrackFileReader = new IMFTrackFileReader(workingDirectory, resourceByteRangeProvider); StringBuilder sb = new StringBuilder(); IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl(); try { - IMFTrackFileCPLBuilder imfTrackFileCPLBuilder = new IMFTrackFileCPLBuilder(workingDirectory, inputFile); + IMFTrackFileCPLBuilder imfTrackFileCPLBuilder = new IMFTrackFileCPLBuilder(workingDirectory, inputFileLocator); sb.append(imfTrackFileReader.getRandomIndexPack(imfErrorLogger)); logger.info(String.format("%s", sb.toString())); diff --git a/src/main/java/com/netflix/imflibrary/app/IMFTrackFileReader.java b/src/main/java/com/netflix/imflibrary/app/IMFTrackFileReader.java index 426abf7b..06cbdd22 100644 --- a/src/main/java/com/netflix/imflibrary/app/IMFTrackFileReader.java +++ b/src/main/java/com/netflix/imflibrary/app/IMFTrackFileReader.java @@ -26,19 +26,8 @@ import com.netflix.imflibrary.st0377.PartitionPack; import com.netflix.imflibrary.st0377.RandomIndexPack; import com.netflix.imflibrary.st0377.StructuralMetadataID; -import com.netflix.imflibrary.st0377.header.EssenceContainerData; -import com.netflix.imflibrary.st0377.header.FileDescriptor; -import com.netflix.imflibrary.st0377.header.GenericPackage; -import com.netflix.imflibrary.st0377.header.InterchangeObject; -import com.netflix.imflibrary.st0377.header.Preface; -import com.netflix.imflibrary.st0377.header.SourcePackage; -import com.netflix.imflibrary.utils.ByteArrayDataProvider; -import com.netflix.imflibrary.utils.ByteProvider; -import com.netflix.imflibrary.utils.ErrorLogger; -import com.netflix.imflibrary.utils.FileByteRangeProvider; -import com.netflix.imflibrary.utils.FileDataProvider; -import com.netflix.imflibrary.utils.ResourceByteRangeProvider; -import com.netflix.imflibrary.utils.Utilities; +import com.netflix.imflibrary.st0377.header.*; +import com.netflix.imflibrary.utils.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -62,7 +51,7 @@ * A simple application to exercise the core logic of Photon for reading and validating IMF Track files. */ @ThreadSafe -final class IMFTrackFileReader +final public class IMFTrackFileReader { private final File workingDirectory; private final ResourceByteRangeProvider resourceByteRangeProvider; @@ -80,12 +69,18 @@ final class IMFTrackFileReader * @param workingDirectory the working directory * @param resourceByteRangeProvider the MXF file represented as a {@link com.netflix.imflibrary.utils.ResourceByteRangeProvider} */ - IMFTrackFileReader(File workingDirectory, ResourceByteRangeProvider resourceByteRangeProvider) + public IMFTrackFileReader(File workingDirectory, ResourceByteRangeProvider resourceByteRangeProvider) { this.workingDirectory = workingDirectory; this.resourceByteRangeProvider = resourceByteRangeProvider; } + public IMFTrackFileReader(String inputFilePath, String workingDirectoryPath) + { + this.workingDirectory = new File(workingDirectoryPath); + this.resourceByteRangeProvider = FileLocator.fromLocation(inputFilePath).getResourceByteRangeProvider(); + } + private IMFConstraints.HeaderPartitionIMF getHeaderPartitionIMF(@Nonnull IMFErrorLogger imfErrorLogger) throws IOException { if (this.headerPartition == null) @@ -592,7 +587,7 @@ BigInteger getEssenceEditRate(@Nonnull IMFErrorLogger imfErrorLogger) throws IOE * @param imfErrorLogger an error logger for recording any errors - cannot be null * @return editRate of the essence as a List of Long Integers */ - List getEssenceEditRateAsList(@Nonnull IMFErrorLogger imfErrorLogger) throws IOException { + public List getEssenceEditRateAsList(@Nonnull IMFErrorLogger imfErrorLogger) throws IOException { if(!(this.getHeaderPartition(imfErrorLogger).getEssenceDescriptors().size() > 0)){ throw new MXFException(String.format("No EssenceDescriptors were found in the MXF essence")); } @@ -605,7 +600,7 @@ List getEssenceEditRateAsList(@Nonnull IMFErrorLogger imfErrorLogger) thro * @param imfErrorLogger an error logger for recording any errors - cannot be null * @return essenceDuration */ - BigInteger getEssenceDuration(@Nonnull IMFErrorLogger imfErrorLogger) throws IOException { + public BigInteger getEssenceDuration(@Nonnull IMFErrorLogger imfErrorLogger) throws IOException { return this.getHeaderPartition(imfErrorLogger).getEssenceDuration(); } @@ -613,7 +608,7 @@ BigInteger getEssenceDuration(@Nonnull IMFErrorLogger imfErrorLogger) throws IOE * A method to return the TrackFileId which is a UUID identifying the track file * @return UUID identifying the Track File */ - UUID getTrackFileId(){ + public UUID getTrackFileId(){ Preface preface = this.headerPartition.getHeaderPartitionOP1A().getHeaderPartition().getPreface(); GenericPackage genericPackage = preface.getContentStorage().getEssenceContainerDataList().get(0).getLinkedPackage(); @@ -680,20 +675,20 @@ public static void main(String[] args) throws IOException throw new IllegalArgumentException("Invalid parameters"); } - File inputFile = new File(args[0]); - if(!inputFile.exists()){ - logger.error(String.format("File %s does not exist", inputFile.getAbsolutePath())); + FileLocator inputFileLocator = FileLocator.fromLocation(args[0]); + if(!inputFileLocator.exists()){ + logger.error(String.format("File %s does not exist", inputFileLocator.getAbsolutePath())); System.exit(-1); } File workingDirectory = new File(args[1]); - ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(inputFile); + ResourceByteRangeProvider resourceByteRangeProvider = inputFileLocator.getResourceByteRangeProvider(); IMFTrackFileReader imfTrackFileReader = null; IMFTrackFileCPLBuilder imfTrackFileCPLBuilder = null; IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl(); try { - imfTrackFileReader = new IMFTrackFileReader(workingDirectory, resourceByteRangeProvider); - imfTrackFileCPLBuilder = new IMFTrackFileCPLBuilder(workingDirectory, inputFile); + imfTrackFileReader = new IMFTrackFileReader(args[0], args[1]); + imfTrackFileCPLBuilder = new IMFTrackFileCPLBuilder(workingDirectory, inputFileLocator); } catch (IMFException | MXFException e){ if(e instanceof IMFException){ @@ -714,6 +709,14 @@ else if(e instanceof MXFException){ && imfTrackFileCPLBuilder != null && supportedEssenceComponentTypes.contains(imfTrackFileReader.getEssenceType(imfErrorLogger))) { try { + HeaderPartition headerPartition = imfTrackFileReader.headerPartition.getHeaderPartitionOP1A().getHeaderPartition(); + List subDescriptors = headerPartition.getSubDescriptors(); + for (InterchangeObject.InterchangeObjectBO subDescriptor : subDescriptors) { + if (subDescriptor instanceof PHDRMetaDataTrackSubDescriptor.PHDRMetaDataTrackSubDescriptorBO) { + logger.info("Found a PHDRMetaDataTrackSubDescriptor with instanceID: " + UUIDHelper.fromUUID(UUID.nameUUIDFromBytes(subDescriptor.getInstanceUID().getUID()))); + } + } + for (InterchangeObject.InterchangeObjectBO essenceDescriptor : imfTrackFileReader.getEssenceDescriptors(imfErrorLogger)) { /* create dom */ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); diff --git a/src/main/java/com/netflix/imflibrary/app/IMPAnalyzer.java b/src/main/java/com/netflix/imflibrary/app/IMPAnalyzer.java index e0a80072..10650888 100755 --- a/src/main/java/com/netflix/imflibrary/app/IMPAnalyzer.java +++ b/src/main/java/com/netflix/imflibrary/app/IMPAnalyzer.java @@ -18,13 +18,10 @@ import com.netflix.imflibrary.st2067_100.OutputProfileList; import com.netflix.imflibrary.st2067_2.ApplicationComposition; import com.netflix.imflibrary.st2067_2.ApplicationCompositionFactory; +import com.netflix.imflibrary.st2067_2.ApplicationCompositionFactory.ApplicationCompositionType; import com.netflix.imflibrary.st2067_2.Composition; import com.netflix.imflibrary.st2067_2.IMFEssenceComponentVirtualTrack; -import com.netflix.imflibrary.utils.ByteArrayDataProvider; -import com.netflix.imflibrary.utils.ByteProvider; -import com.netflix.imflibrary.utils.ErrorLogger; -import com.netflix.imflibrary.utils.FileByteRangeProvider; -import com.netflix.imflibrary.utils.ResourceByteRangeProvider; +import com.netflix.imflibrary.utils.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +32,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -54,6 +52,7 @@ public class IMPAnalyzer { private static final String CONFORMANCE_LOGGER_PREFIX = "Virtual Track Conformance"; private static final Logger logger = LoggerFactory.getLogger(IMPAnalyzer.class); + private static ApplicationSet expectedAppType; private static Map getTrackFileIdToHeaderPartitionPayLoadMap(List headerPartitionPayloadRecords) throws @@ -233,25 +232,24 @@ private static List conformVirtualTrack(ResourceByteRan return imfErrorLogger.getErrors(); } - public static Map> analyzePackage(File rootFile) throws IOException { + public static Map> analyzePackage(FileLocator rootFileLocator) throws IOException { Map> errorMap = new HashMap<>(); IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl(); List headerPartitionPayloadRecords = new ArrayList<>(); try { - BasicMapProfileV2MappedFileSet mapProfileV2MappedFileSet = new BasicMapProfileV2MappedFileSet(rootFile); + BasicMapProfileV2MappedFileSet mapProfileV2MappedFileSet = new BasicMapProfileV2MappedFileSet(rootFileLocator); imfErrorLogger.addAllErrors(mapProfileV2MappedFileSet.getErrors()); IMFErrorLogger assetMapErrorLogger = new IMFErrorLoggerImpl(); try { - AssetMap assetMap = new AssetMap(new File(mapProfileV2MappedFileSet.getAbsoluteAssetMapURI())); + AssetMap assetMap = new AssetMap(FileLocator.fromLocation(mapProfileV2MappedFileSet.getAbsoluteAssetMapURI())); assetMapErrorLogger.addAllErrors(assetMap.getErrors()); - for (AssetMap.Asset packingListAsset : assetMap.getPackingListAssets()) { IMFErrorLogger packingListErrorLogger = new IMFErrorLoggerImpl(); try { - PackingList packingList = new PackingList(new File(rootFile, packingListAsset.getPath().toString())); + PackingList packingList = new PackingList(FileLocator.fromLocation(rootFileLocator, packingListAsset.getPath().toString())); packingListErrorLogger.addAllErrors(packingList.getErrors()); for (PackingList.Asset asset : packingList.getAssets()) { @@ -262,7 +260,8 @@ public static Map> analyzePackage(File roo IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format("Failed to get path for Asset with ID = %s", asset.getUUID().toString())); continue; } - File assetFile = new File(rootFile, assetMap.getPath(asset.getUUID()).toString()); + FileLocator assetFile = FileLocator.fromLocation(rootFileLocator, assetMap.getPath(asset.getUUID()).toString()); + if(!assetFile.exists()) { packingListErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_PKL_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("Cannot find asset with path %s ID = %s", assetFile.getAbsolutePath(), asset.getUUID().toString @@ -270,7 +269,7 @@ public static Map> analyzePackage(File roo continue; } - ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile); + ResourceByteRangeProvider resourceByteRangeProvider = assetFile.getResourceByteRangeProvider(); IMFErrorLogger trackFileErrorLogger = new IMFErrorLoggerImpl(); @@ -299,9 +298,9 @@ public static Map> analyzePackage(File roo } } - List applicationCompositionList = analyzeApplicationCompositions( rootFile, assetMap, packingList, headerPartitionPayloadRecords, packingListErrorLogger, errorMap); + List applicationCompositionList = analyzeApplicationCompositions( rootFileLocator, assetMap, packingList, headerPartitionPayloadRecords, packingListErrorLogger, errorMap); - analyzeOutputProfileLists( rootFile, assetMap, packingList, applicationCompositionList, packingListErrorLogger, errorMap); + analyzeOutputProfileLists( rootFileLocator, assetMap, packingList, applicationCompositionList, packingListErrorLogger, errorMap); } catch (IMFException e) { packingListErrorLogger.addAllErrors(e.getErrors()); @@ -318,7 +317,7 @@ public static Map> analyzePackage(File roo } } catch (IMFException e) { imfErrorLogger.addAllErrors(e.getErrors()); - errorMap.put(rootFile.getName(), imfErrorLogger.getErrors()); + errorMap.put(rootFileLocator.getName(), imfErrorLogger.getErrors()); } @@ -347,7 +346,7 @@ public static List validateEssencePartition(ResourceByt return trackFileErrorLogger.getErrors(); } - public static List analyzeOutputProfileLists(File rootFile, + public static List analyzeOutputProfileLists(FileLocator rootFileLocator, AssetMap assetMap, PackingList packingList, List applicationCompositionList, @@ -364,7 +363,7 @@ public static List analyzeOutputProfileLists(File rootFile, IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format("Failed to get path for Asset with ID = %s", asset.getUUID().toString())); continue; } - File assetFile = new File(rootFile, assetMap.getPath(asset.getUUID()).toString()); + FileLocator assetFile = FileLocator.fromLocation(rootFileLocator, assetMap.getPath(asset.getUUID()).toString()); if(!assetFile.exists()) { packingListErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_PKL_ERROR, @@ -372,7 +371,7 @@ public static List analyzeOutputProfileLists(File rootFile, continue; } - ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile); + ResourceByteRangeProvider resourceByteRangeProvider = assetFile.getResourceByteRangeProvider(); if (OutputProfileList.isOutputProfileList(resourceByteRangeProvider)) { IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl(); try { @@ -405,7 +404,7 @@ public static List analyzeOutputProfileLists(File rootFile, } - public static List analyzeApplicationCompositions( File rootFile, + public static List analyzeApplicationCompositions( FileLocator rootFileLocator, AssetMap assetMap, PackingList packingList, List headerPartitionPayloadRecords, @@ -416,6 +415,8 @@ public static List analyzeApplicationCompositions( File getTrackFileIdToHeaderPartitionPayLoadMap(headerPartitionPayloadRecords); List applicationCompositionList = new ArrayList<>(); + //If called as static method: Assume testing versus App#2/2E specification + if (expectedAppType == null) expectedAppType = ApplicationSet.APPLICATION_2_SET; for (PackingList.Asset asset : packingList.getAssets()) { if (asset.getType().equals(PackingList.Asset.TEXT_XML_TYPE)) { @@ -425,7 +426,7 @@ public static List analyzeApplicationCompositions( File IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format("Failed to get path for Asset with ID = %s", asset.getUUID().toString())); continue; } - File assetFile = new File(rootFile, assetMap.getPath(asset.getUUID()).toString()); + FileLocator assetFile = FileLocator.fromLocation(rootFileLocator, assetMap.getPath(asset.getUUID()).toString()); if(!assetFile.exists()) { packingListErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_PKL_ERROR, @@ -433,7 +434,7 @@ public static List analyzeApplicationCompositions( File continue; } - ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile); + ResourceByteRangeProvider resourceByteRangeProvider = assetFile.getResourceByteRangeProvider(); if (ApplicationComposition.isCompositionPlaylist(resourceByteRangeProvider)) { IMFErrorLogger compositionErrorLogger = new IMFErrorLoggerImpl(); IMFErrorLogger compositionConformanceErrorLogger = new IMFErrorLoggerImpl(); @@ -446,6 +447,13 @@ public static List analyzeApplicationCompositions( File continue; } + ApplicationCompositionType applicationCompositionType = applicationComposition.getApplicationCompositionType(); + if (!expectedAppType.getApplicationSet().contains(applicationCompositionType)) { + compositionErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("CPL Application is %s vs. expected type one of %s", applicationComposition.getApplicationCompositionType().toString(), expectedAppType.getApplicationSet().toString())); + } + applicationCompositionList.add(applicationComposition); Set trackFileIDsSet = trackFileIDToHeaderPartitionPayLoadMap .keySet(); @@ -494,13 +502,13 @@ public static List analyzeApplicationCompositions( File } - public static List analyzeFile(File inputFile) throws IOException { + public static List analyzeFile(FileLocator inputFileLocator) throws IOException { IMFErrorLogger errorLogger = new IMFErrorLoggerImpl(); - ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(inputFile); + ResourceByteRangeProvider resourceByteRangeProvider = inputFileLocator.getResourceByteRangeProvider(); - if(inputFile.getName().lastIndexOf('.') > 0) { - String extension = inputFile.getName().substring(inputFile.getName().lastIndexOf('.')+1); + if(inputFileLocator.getName().lastIndexOf('.') > 0) { + String extension = inputFileLocator.getName().substring(inputFileLocator.getName().lastIndexOf('.')+1); if(extension.equalsIgnoreCase("mxf")) { errorLogger.addAllErrors(validateEssencePartition(resourceByteRangeProvider)); return errorLogger.getErrors(); @@ -545,6 +553,8 @@ private static String usage() { sb.append(String.format("%s %n", IMPAnalyzer.class.getName())); sb.append(String.format("%s %n", IMPAnalyzer.class.getName())); sb.append(String.format("%s %n", IMPAnalyzer.class.getName())); + sb.append(String.format("options: %n")); + sb.append(String.format("-a, --application APPSTRING IMF Application to test against, supported values for APPSTRING are app2or2E, app5 or all (default: app2or2E)%n")); return sb.toString(); } @@ -575,27 +585,82 @@ private static void logErrors(String file, List errors) } + private static final Set application2Set = Collections.unmodifiableSet(new HashSet() {{ + add(com.netflix.imflibrary.st2067_2.ApplicationCompositionFactory.ApplicationCompositionType.APPLICATION_2_COMPOSITION_TYPE); + add(com.netflix.imflibrary.st2067_2.ApplicationCompositionFactory.ApplicationCompositionType.APPLICATION_2E_COMPOSITION_TYPE); + }}); + + private static final Set application5Set = Collections.unmodifiableSet(new HashSet() {{ + add(com.netflix.imflibrary.st2067_2.ApplicationCompositionFactory.ApplicationCompositionType.APPLICATION_5_COMPOSITION_TYPE); + }}); + + private static final Set applicationAllSet = Collections.unmodifiableSet(new HashSet() {{ + addAll(application2Set); + addAll(application5Set); + }}); + + public enum ApplicationSet { + APPLICATION_2_SET(application2Set), + APPLICATION_5_SET(application5Set), + APPLICATION_ALL_SET(applicationAllSet); + + private Set appplicationSet; + + ApplicationSet(Set applicationSet) { + this.appplicationSet = applicationSet; + } + + public Set getApplicationSet() { + return appplicationSet; + } + } + public static void main(String args[]) throws IOException { - if (args.length != 1) + if ((args.length != 1) && (args.length != 3)) { logger.error(usage()); System.exit(-1); } - String inputFileName = args[0]; - File inputFile = new File(inputFileName); - if(!inputFile.exists()){ - logger.error(String.format("File %s does not exist", inputFile.getAbsolutePath())); + FileLocator inputFileLocator = FileLocator.fromLocation(args[0]); + if(!inputFileLocator.exists()){ + logger.error(String.format("File %s does not exist", inputFileLocator.getAbsolutePath())); System.exit(-1); } - if(inputFile.isDirectory()) { + if(inputFileLocator.isDirectory()) { + expectedAppType = ApplicationSet.APPLICATION_2_SET; + for (int argIdx = 1; argIdx < args.length; ++argIdx) { + String curArg = args[argIdx]; + String nextArg = argIdx < args.length - 1 ? args[argIdx + 1] : ""; + if (curArg.equalsIgnoreCase("--application") || curArg.equalsIgnoreCase("-a")) { + if (nextArg.length() == 0 || nextArg.charAt(0) == '-') { + logger.error(usage()); + System.exit(-1); + } + if (nextArg.equalsIgnoreCase("app5")) { + expectedAppType = ApplicationSet.APPLICATION_5_SET; + } else if (nextArg.equalsIgnoreCase("all")) { + expectedAppType = ApplicationSet.APPLICATION_ALL_SET; + } else if (!nextArg.equalsIgnoreCase("app2or2E")) { + logger.error(usage()); + System.exit(-1); + } + argIdx++; + } else { + logger.error(usage()); + System.exit(-1); + } + } + } + + if(inputFileLocator.isDirectory()) { logger.info("==========================================================================" ); - logger.info(String.format("Analyzing IMF package %s", inputFile.getName())); + logger.info(String.format("Analyzing IMF package %s", inputFileLocator.getName())); logger.info("=========================================================================="); - Map> errorMap = analyzePackage(inputFile); + Map> errorMap = analyzePackage(inputFileLocator); for(Map.Entry> entry: errorMap.entrySet()) { if(!entry.getKey().contains(CONFORMANCE_LOGGER_PREFIX)) { logErrors(entry.getKey(), entry.getValue()); @@ -617,10 +682,10 @@ public static void main(String args[]) throws IOException else { logger.info("==========================================================================\n" ); - logger.info(String.format("Analyzing file %s", inputFile.getName())); + logger.info(String.format("Analyzing file %s", inputFileLocator.getName())); logger.info("==========================================================================\n"); - Listerrors = analyzeFile(inputFile); - logErrors(inputFile.getName(), errors); + Listerrors = analyzeFile(inputFileLocator); + logErrors(inputFileLocator.getName(), errors); } } } diff --git a/src/main/java/com/netflix/imflibrary/app/IMPFixer.java b/src/main/java/com/netflix/imflibrary/app/IMPFixer.java index 458e1c62..ebdbd5c7 100755 --- a/src/main/java/com/netflix/imflibrary/app/IMPFixer.java +++ b/src/main/java/com/netflix/imflibrary/app/IMPFixer.java @@ -177,19 +177,19 @@ private static PayloadRecord getHeaderPartitionPayloadRecord(ResourceByteRangePr } - public static List analyzePackageAndWrite(File rootFile, File targetFile, String versionCPLSchema, Boolean copyTrackfile, Boolean generateHash) throws + public static List analyzePackageAndWrite(FileLocator rootFileLocator, File targetFile, String versionCPLSchema, Boolean copyTrackfile, Boolean generateHash) throws IOException, ParserConfigurationException, SAXException, JAXBException, URISyntaxException, NoSuchAlgorithmException { IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl(); List headerPartitionPayloadRecords = new ArrayList<>(); - BasicMapProfileV2MappedFileSet mapProfileV2MappedFileSet = new BasicMapProfileV2MappedFileSet(rootFile); - AssetMap assetMap = new AssetMap(new File(mapProfileV2MappedFileSet.getAbsoluteAssetMapURI())); + BasicMapProfileV2MappedFileSet mapProfileV2MappedFileSet = new BasicMapProfileV2MappedFileSet(rootFileLocator); + AssetMap assetMap = new AssetMap(new S3FileLocator(mapProfileV2MappedFileSet.getAbsoluteAssetMapURI())); for (AssetMap.Asset packingListAsset : assetMap.getPackingListAssets()) { - PackingList packingList = new PackingList(new File(rootFile, packingListAsset.getPath().toString())); + PackingList packingList = new PackingList(FileLocator.fromLocation(rootFileLocator, packingListAsset.getPath().toString())); Map imfTrackFileMetadataMap = new HashMap<>(); for (PackingList.Asset asset : packingList.getAssets()) { - File assetFile = new File(rootFile, assetMap.getPath(asset.getUUID()).toString()); - ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile); + FileLocator assetFile = FileLocator.fromLocation(rootFileLocator,assetMap.getPath(asset.getUUID()).toString()); + ResourceByteRangeProvider resourceByteRangeProvider = assetFile.getResourceByteRangeProvider(); if (asset.getType().equals(PackingList.Asset.APPLICATION_MXF_TYPE)) { PayloadRecord headerPartitionPayloadRecord = getHeaderPartitionPayloadRecord(resourceByteRangeProvider, new IMFErrorLoggerImpl()); @@ -208,7 +208,7 @@ public static List analyzePackageAndWrite(File rootFile ); if(copyTrackfile) { File outputFile = new File(targetFile.toString() + File.separator + assetFile.getName()); - Files.copy(assetFile.toPath(), outputFile.toPath(), REPLACE_EXISTING); + FileLocator.copy(assetFile, outputFile.toPath()); } } } @@ -218,8 +218,8 @@ public static List analyzePackageAndWrite(File rootFile for (PackingList.Asset asset : packingList.getAssets()) { - File assetFile = new File(rootFile, assetMap.getPath(asset.getUUID()).toString()); - ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile); + FileLocator assetFile = FileLocator.fromLocation(rootFileLocator, assetMap.getPath(asset.getUUID()).toString()); + ResourceByteRangeProvider resourceByteRangeProvider = assetFile.getResourceByteRangeProvider(); if (asset.getType().equals(PackingList.Asset.TEXT_XML_TYPE) && ApplicationComposition.isCompositionPlaylist(resourceByteRangeProvider)) { ApplicationComposition applicationComposition = ApplicationCompositionFactory.getApplicationComposition(resourceByteRangeProvider, new IMFErrorLoggerImpl()); if(applicationComposition == null){ @@ -313,9 +313,9 @@ public static void main(String args[]) throws } String inputFileName = args[0]; - File inputFile = new File(inputFileName); - if (!inputFile.exists()) { - logger.error(String.format("File %s does not exist", inputFile.getAbsolutePath())); + FileLocator inputFileLocator = FileLocator.fromLocation(inputFileName); + if (!inputFileLocator.exists()) { + logger.error(String.format("File %s does not exist", inputFileLocator.getAbsolutePath())); System.exit(-1); } @@ -354,12 +354,12 @@ else if(curArg.equalsIgnoreCase("--no-hash") || curArg.equalsIgnoreCase("-nh")) } } - if (!inputFile.exists() || !inputFile.isDirectory()) { + if (!inputFileLocator.exists() || !inputFileLocator.isDirectory()) { logger.error(String.format("Invalid input package path")); } else { - List errors = analyzePackageAndWrite(inputFile, outputFile, versionCPLSchema, copyTrackFile, generateHash); + List errors = analyzePackageAndWrite(inputFileLocator, outputFile, versionCPLSchema, copyTrackFile, generateHash); if (errors.size() > 0) { logger.info(String.format("IMPWriter encountered errors:")); for (ErrorLogger.ErrorObject errorObject : errors) { diff --git a/src/main/java/com/netflix/imflibrary/st0377/HeaderPartition.java b/src/main/java/com/netflix/imflibrary/st0377/HeaderPartition.java index bc5d27aa..a06cdb29 100644 --- a/src/main/java/com/netflix/imflibrary/st0377/HeaderPartition.java +++ b/src/main/java/com/netflix/imflibrary/st0377/HeaderPartition.java @@ -34,6 +34,8 @@ import com.netflix.imflibrary.st0377.header.GenericTrack; import com.netflix.imflibrary.st0377.header.InterchangeObject; import com.netflix.imflibrary.st0377.header.JPEG2000PictureSubDescriptor; +import com.netflix.imflibrary.st0377.header.ACESPictureSubDescriptor; +import com.netflix.imflibrary.st0377.header.TargetFrameSubDescriptor; import com.netflix.imflibrary.st0377.header.MaterialPackage; import com.netflix.imflibrary.st0377.header.PHDRMetaDataTrackSubDescriptor; import com.netflix.imflibrary.st0377.header.Preface; @@ -388,6 +390,14 @@ public HeaderPartition(ByteProvider byteProvider, long byteOffset, long maxParti if(dependentInterchangeObject instanceof JPEG2000PictureSubDescriptor){ jpeg2000PictureSubDescriptor = (JPEG2000PictureSubDescriptor) dependentInterchangeObject; } + ACESPictureSubDescriptor acesPictureSubDescriptor = null; + if(dependentInterchangeObject instanceof ACESPictureSubDescriptor){ + acesPictureSubDescriptor = (ACESPictureSubDescriptor) dependentInterchangeObject; + } + TargetFrameSubDescriptor targetFrameSubDescriptor = null; + if(dependentInterchangeObject instanceof TargetFrameSubDescriptor){ + targetFrameSubDescriptor = (TargetFrameSubDescriptor) dependentInterchangeObject; + } /*Add similar casting code for other sub descriptors when relevant*/ } RGBAPictureEssenceDescriptor rgbaPictureEssenceDescriptor = new RGBAPictureEssenceDescriptor((RGBAPictureEssenceDescriptor.RGBAPictureEssenceDescriptorBO) interchangeObjectBO); diff --git a/src/main/java/com/netflix/imflibrary/st0377/header/ACESPictureSubDescriptor.java b/src/main/java/com/netflix/imflibrary/st0377/header/ACESPictureSubDescriptor.java new file mode 100644 index 00000000..b72c1ec7 --- /dev/null +++ b/src/main/java/com/netflix/imflibrary/st0377/header/ACESPictureSubDescriptor.java @@ -0,0 +1,128 @@ +/* + * + * Copyright 2015 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.netflix.imflibrary.st0377.header; + +import com.netflix.imflibrary.IMFErrorLogger; +import com.netflix.imflibrary.KLVPacket; +import com.netflix.imflibrary.MXFUID; +import com.netflix.imflibrary.annotations.MXFProperty; +import com.netflix.imflibrary.st0377.CompoundDataTypes; +import com.netflix.imflibrary.utils.ByteProvider; + +import javax.annotation.concurrent.Immutable; +import java.io.IOException; +import java.util.Map; + +/** + * Object model corresponding to ACESPictureSubDescriptor as defined in st429-4:2006 + */ +@Immutable +public final class ACESPictureSubDescriptor extends SubDescriptor { + private static final String ERROR_DESCRIPTION_PREFIX = "MXF Header Partition: " + ACESPictureSubDescriptor.class.getSimpleName() + " : "; + private final ACESPictureSubDescriptorBO subDescriptorBO; + + /** + * Constructor for a ACESPictureSubDescriptor object + * @param subDescriptorBO the parsed ACESPictureSubDescriptor object + */ + public ACESPictureSubDescriptor(ACESPictureSubDescriptorBO subDescriptorBO){ + this.subDescriptorBO = subDescriptorBO; + } + + /** + * A method that returns a string representation of a ACESPictureSubDescriptor object + * + * @return string representing the object + */ + public String toString() + { + return this.subDescriptorBO.toString(); + } + + /** + * Object corresponding to a parsed ACESPictureSubDescriptor as defined in st2067-50 + */ + @Immutable + public static final class ACESPictureSubDescriptorBO extends SubDescriptorBO{ + @MXFProperty(size=0, charset="UTF-16") private final String aces_authoring_information = null; + @MXFProperty(size=12) private final byte[] aces_mastering_display_primaries = null; + @MXFProperty(size=4) private final byte[] aces_mastering_white = null; + @MXFProperty(size=4) private final Integer aces_max_luminance = null; + @MXFProperty(size=4) private final Integer aces_min_luminance = null; + + /** + * Instantiates a new ACESPictureSubDescriptor ByteObject. + * + * @param header the header + * @param byteProvider the mxf byte provider + * @param localTagToUIDMap the local tag to uID map + * @param imfErrorLogger the imf error logger + * @throws IOException - any I/O related error will be exposed through an IOException + */ + public ACESPictureSubDescriptorBO(KLVPacket.Header header, ByteProvider byteProvider, Map localTagToUIDMap, IMFErrorLogger imfErrorLogger) + throws IOException + { + super(header); + long numBytesToRead = this.header.getVSize(); + + StructuralMetadata.populate(this, byteProvider, numBytesToRead, localTagToUIDMap); + + if (this.instance_uid == null) + { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_ESSENCE_METADATA_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + ACESPictureSubDescriptor.ERROR_DESCRIPTION_PREFIX + "instance_uid is null"); + } + } + + /** + * A method that returns a string representation of a ACESPictureSubDescriptorB0 object + * + * @return string representing the object + */ + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append("================== ACESPictureSubDescriptor ======================\n"); + sb.append(this.header.toString()); + sb.append(String.format("instance_uid = 0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%n", + this.instance_uid[0], this.instance_uid[1], this.instance_uid[2], this.instance_uid[3], + this.instance_uid[4], this.instance_uid[5], this.instance_uid[6], this.instance_uid[7], + this.instance_uid[8], this.instance_uid[9], this.instance_uid[10], this.instance_uid[11], + this.instance_uid[12], this.instance_uid[13], this.instance_uid[14], this.instance_uid[15])); + sb.append(String.format("aces_authoring_information = %s", this.aces_authoring_information)); + String aces_mastering_display_primariesString = ""; + if (aces_mastering_display_primaries != null) { + for(byte b: aces_mastering_display_primaries){ + aces_mastering_display_primariesString = aces_mastering_display_primariesString.concat(String.format("%02x", b)); + } + } + sb.append(String.format("aces_mastering_display_primaries = %s", aces_mastering_display_primariesString)); + String aces_mastering_whiteString = ""; + if (aces_mastering_white != null) { + for(byte b: aces_mastering_white){ + aces_mastering_whiteString = aces_mastering_whiteString.concat(String.format("%02x", b)); + } + } + sb.append(String.format("aces_mastering_whiteString = %s", aces_mastering_whiteString)); + sb.append(String.format("aces_max_luminance = %d", this.aces_max_luminance)); + sb.append(String.format("aces_min_luminance = %d", this.aces_min_luminance)); + return sb.toString(); + } + } +} diff --git a/src/main/java/com/netflix/imflibrary/st0377/header/GenericPictureEssenceDescriptor.java b/src/main/java/com/netflix/imflibrary/st0377/header/GenericPictureEssenceDescriptor.java index d641caac..32ecf7f4 100644 --- a/src/main/java/com/netflix/imflibrary/st0377/header/GenericPictureEssenceDescriptor.java +++ b/src/main/java/com/netflix/imflibrary/st0377/header/GenericPictureEssenceDescriptor.java @@ -53,6 +53,55 @@ public abstract class GenericPictureEssenceDescriptor extends FileDescriptor { public static final String horizontalSubSamplingUL = "urn:smpte:ul:060e2b34.01010101.04010501.05000000"; public static final String verticalSubSamplingUL = "urn:smpte:ul:060e2b34.01010102.04010501.10000000"; public static final String containerFormatUL = "urn:smpte:ul:060e2b34.01010102.06010104.01020000"; + public static final String pictureEssenceCodingUL = "urn:smpte:ul:060e2b34.01010102.04010601.00000000"; + //begin items constrained in 2065-5 or 2067-50 + //Generic Picture Essence Descriptor constraints + public static final String signalStandardUL = "urn:smpte:ul:060e2b34.01010105.04050113.00000000"; + public static final String sampledXOffsetUL = "urn:smpte:ul:060e2b34.01010101.04010501.09000000"; + public static final String sampledYOffsetUL = "urn:smpte:ul:060e2b34.01010101.04010501.0a000000"; + public static final String displayWidthUL = "urn:smpte:ul:060e2b34.01010101.04010501.0c000000"; + public static final String displayHeightUL = "urn:smpte:ul:060e2b34.01010101.04010501.0b000000"; + public static final String displayXOffsetUL = "urn:smpte:ul:060e2b34.01010101.04010501.0d000000"; + public static final String displayYOffsetUL = "urn:smpte:ul:060e2b34.01010101.04010501.0e000000"; + public static final String displayF2OffsetUL = "urn:smpte:ul:060e2b34.01010105.04010302.07000000"; + public static final String imageAspectRatioUL = "urn:smpte:ul:060e2b34.01010101.04010101.01000000"; + public static final String activeFormatDescriptorUL = "urn:smpte:ul:060e2b34.01010105.04010302.09000000"; + public static final String videoLineMapUL = "urn:smpte:ul:060e2b34.01010102.04010302.05000000"; + public static final String alphaTransparencyUL = "urn:smpte:ul:060e2b34.01010102.05200102.00000000"; + public static final String imageAlignmentOffsetUL = "urn:smpte:ul:060e2b34.01010102.04180101.00000000"; //The symbol is named ImageAlignmentFactor in ST0377-1:2011 + public static final String imageStartOffsetUL = "urn:smpte:ul:060e2b34.01010102.04180102.00000000"; + public static final String imageEndOffsetUL = "urn:smpte:ul:060e2b34.01010102.04180103.00000000"; + public static final String fieldDominanceUL = "urn:smpte:ul:060e2b34.01010102.04010301.06000000"; + //RGBA Picture Essence Descriptor constraints + public static final String alphaMinRefUL = "urn:smpte:ul:060e2b34.01010105.04010503.0e000000"; + public static final String alphaMaxRefUL = "urn:smpte:ul:060e2b34.01010105.04010503.0d000000"; + public static final String scanningDirectionUL = "urn:smpte:ul:060e2b34.01010105.04010404.01000000"; + public static final String pixelLayoutUL = "urn:smpte:ul:060e2b34.01010102.04010503.06000000"; + public static final String paletteUL = "urn:smpte:ul:060e2b34.01010102.04010503.08000000"; + public static final String paletteLayoutUL = "urn:smpte:ul:060e2b34.01010102.04010503.09000000"; + //end items constrained in 2065-5 or 2067-50 + //begin items defined in 2067-50 + public static final String acesPictureSubDescriptorUL = "urn:smpte:ul:060e2b34.027f0101.0d010101.01017900"; + public static final String acesAuthoringInformationUL = "urn:smpte:ul:060e2b34.0101010e.0401060a.01000000"; + public static final String acesMasteringDisplayPrimariesUL = "urn:smpte:ul:060e2b34.0101010e.0401060a.02000000"; + public static final String acesMasteringDisplayWhitePointChromaticityUL = "urn:smpte:ul:060e2b34.0101010e.0401060a.03000000"; + public static final String acesMasteringDisplayDisplayMaximumLuminanceUL = "urn:smpte:ul:060e2b34.0101010e.0401060a.04000000"; + public static final String acesMasteringDisplayDisplayMinimumLuminanceUL = "urn:smpte:ul:060e2b34.0101010e.0401060a.05000000"; + public static final String targetFrameSubDescriptorUL = "urn:smpte:ul:060e2b34.027f0101.0d010101.01017a00"; + public static final String targetFrameAncillaryResourceIDUL = "urn:smpte:ul:060e2b34.0101010e.04010609.01000000"; + public static final String mediaTypeUL = "urn:smpte:ul:060e2b34.0101010e.04010609.02000000"; + public static final String targetFrameIndexUL = "urn:smpte:ul:060e2b34.0101010e.04010609.03000000"; + public static final String targetFrameTransferCharacteristicUL = "urn:smpte:ul:060e2b34.0101010e.04010609.04000000"; + public static final String targetFrameColorPrimariesUL = "urn:smpte:ul:060e2b34.0101010e.04010609.05000000"; + public static final String targetFrameComponentMaxRefUL = "urn:smpte:ul:060e2b34.0101010e.04010609.06000000"; + public static final String targetFrameComponentMinRefUL = "urn:smpte:ul:060e2b34.0101010e.04010609.07000000"; + public static final String targetFrameEssenceStreamIDUL = "urn:smpte:ul:060e2b34.0101010e.04010609.08000000"; + public static final String acesPictureSubDescriptorInstanceIDUL = "urn:smpte:ul:060e2b34.0101010e.04010609.09000000"; + public static final String targetFrameViewingEnvironmentUL = "urn:smpte:ul:060e2b34.0101010e.04010609.0a000000"; + public static final String instanceID = "urn:smpte:ul:060e2b34.01010101.01011502.00000000"; + //end items defined in 2067-50 + + public static abstract class GenericPictureEssenceDescriptorBO extends FileDescriptorBO { @@ -111,6 +160,7 @@ public static enum RGBAComponentType { Luma(0x59), ChromaU(0x55), ChromaV(0x56), + Alpha(0x41), Unknown(-1); private final Integer code; diff --git a/src/main/java/com/netflix/imflibrary/st0377/header/StructuralMetadata.java b/src/main/java/com/netflix/imflibrary/st0377/header/StructuralMetadata.java index 0cacecaa..6ab6de9b 100644 --- a/src/main/java/com/netflix/imflibrary/st0377/header/StructuralMetadata.java +++ b/src/main/java/com/netflix/imflibrary/st0377/header/StructuralMetadata.java @@ -495,6 +495,83 @@ private StructuralMetadata() MXFUID mxfUL = new MXFUID(byteArray); map.put(mxfUL, "mime_media_type"); } + // ACESPictureSubDescriptor + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x0a, 0x01, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "aces_authoring_information"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x0a, 0x02, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "aces_mastering_display_primaries"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x0a, 0x03, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "aces_mastering_white"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x0a, 0x04, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "aces_max_luminance"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x0a, 0x05, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "aces_min_luminance"); + } + //TargetFrameSubDescriptor + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x09, 0x01, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "ancillary_resource_uid"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x09, 0x02, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "media_type"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x09, 0x03, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "target_frame_index"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x09, 0x04, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "target_frame_transfer_characteristic"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x09, 0x05, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "color_primaries"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x09, 0x06, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "max_ref"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x09, 0x07, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "min_ref"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x09, 0x08, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "essence_stream_id"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x09, 0x09, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "aces_picture_subdescriptor_uid"); + } + { + byte[] byteArray = {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, 0x04, 0x01, 0x06, 0x09, 0x0a, 0x00, 0x00, 0x00}; + MXFUID mxfUL = new MXFUID(byteArray); + map.put(mxfUL, "viewing_environment"); + } ItemULToItemName = Collections.unmodifiableMap(map); } @@ -628,6 +705,10 @@ else if (isStructuralMetadata(key) && (key[13] == 0x01)) return GroupOfSoundFieldGroupLabelSubDescriptor.GroupOfSoundFieldGroupLabelSubDescriptorBO.class; case 0x5A : return JPEG2000PictureSubDescriptor.JPEG2000PictureSubDescriptorBO.class; + case 0x79 : + return ACESPictureSubDescriptor.ACESPictureSubDescriptorBO.class; + case 0x7a : + return TargetFrameSubDescriptor.TargetFrameSubDescriptorBO.class; default : return Object.class; } diff --git a/src/main/java/com/netflix/imflibrary/st0377/header/TargetFrameSubDescriptor.java b/src/main/java/com/netflix/imflibrary/st0377/header/TargetFrameSubDescriptor.java new file mode 100644 index 00000000..dc82efe2 --- /dev/null +++ b/src/main/java/com/netflix/imflibrary/st0377/header/TargetFrameSubDescriptor.java @@ -0,0 +1,126 @@ +/* + * + * Copyright 2015 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.netflix.imflibrary.st0377.header; + +import com.netflix.imflibrary.IMFErrorLogger; +import com.netflix.imflibrary.KLVPacket; +import com.netflix.imflibrary.MXFUID; +import com.netflix.imflibrary.annotations.MXFProperty; +import com.netflix.imflibrary.st0377.CompoundDataTypes; +import com.netflix.imflibrary.utils.ByteProvider; + +import javax.annotation.concurrent.Immutable; +import java.io.IOException; +import java.util.Map; + +/** + * Object model corresponding to TargetFrameSubDescriptor as defined in st429-4:2006 + */ +@Immutable +public final class TargetFrameSubDescriptor extends SubDescriptor { + private static final String ERROR_DESCRIPTION_PREFIX = "MXF Header Partition: " + TargetFrameSubDescriptor.class.getSimpleName() + " : "; + private final TargetFrameSubDescriptorBO subDescriptorBO; + + /** + * Constructor for a TargetFrameSubDescriptor object + * @param subDescriptorBO the parsed TargetFrameSubDescriptor object + */ + public TargetFrameSubDescriptor(TargetFrameSubDescriptorBO subDescriptorBO){ + this.subDescriptorBO = subDescriptorBO; + } + + /** + * A method that returns a string representation of a TargetFrameSubDescriptor object + * + * @return string representing the object + */ + public String toString() + { + return this.subDescriptorBO.toString(); + } + + /** + * Object corresponding to a parsed TargetFrameSubDescriptor as defined in st429-4-2006 + */ + @Immutable + public static final class TargetFrameSubDescriptorBO extends SubDescriptorBO{ + @MXFProperty(size=16) private final UL ancillary_resource_uid = null; + @MXFProperty(size=0, charset="UTF-16") private final String media_type = null; + @MXFProperty(size=8) private final Long target_frame_index = null; + @MXFProperty(size=16) private final UL target_frame_transfer_characteristic = null; + @MXFProperty(size=16) private final UL color_primaries = null; + @MXFProperty(size=4) private final Integer max_ref = null; + @MXFProperty(size=4) private final Integer min_ref = null; + @MXFProperty(size=4) private final Integer essence_stream_id = null; + @MXFProperty(size=16) private final UL aces_picture_subdescriptor_uid = null; + @MXFProperty(size=16) private final UL viewing_environment = null; + + /** + * Instantiates a new TargetFrameSubDescriptor ByteObject. + * + * @param header the header + * @param byteProvider the mxf byte provider + * @param localTagToUIDMap the local tag to uID map + * @param imfErrorLogger the imf error logger + * @throws IOException - any I/O related error will be exposed through an IOException + */ + public TargetFrameSubDescriptorBO(KLVPacket.Header header, ByteProvider byteProvider, Map localTagToUIDMap, IMFErrorLogger imfErrorLogger) + throws IOException + { + super(header); + long numBytesToRead = this.header.getVSize(); + + StructuralMetadata.populate(this, byteProvider, numBytesToRead, localTagToUIDMap); + + if (this.instance_uid == null) + { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_ESSENCE_METADATA_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + TargetFrameSubDescriptor.ERROR_DESCRIPTION_PREFIX + "instance_uid is null"); + } + } + + /** + * A method that returns a string representation of a TargetFrameSubDescriptorBO object + * + * @return string representing the object + */ + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append("================== TargetFrameSubDescriptor ======================\n"); + sb.append(this.header.toString()); + sb.append(String.format("instance_uid = 0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%n", + this.instance_uid[0], this.instance_uid[1], this.instance_uid[2], this.instance_uid[3], + this.instance_uid[4], this.instance_uid[5], this.instance_uid[6], this.instance_uid[7], + this.instance_uid[8], this.instance_uid[9], this.instance_uid[10], this.instance_uid[11], + this.instance_uid[12], this.instance_uid[13], this.instance_uid[14], this.instance_uid[15])); + if (this.ancillary_resource_uid != null) sb.append(String.format("ancillary_resource_uid = %s%n", this.ancillary_resource_uid.toString())); + sb.append(String.format("media_type = %s%n", this.media_type)); + sb.append(String.format("target_frame_index = %d%n", this.target_frame_index)); + if (this.target_frame_transfer_characteristic != null) sb.append(String.format("target_frame_transfer_characteristic = %s%n", this.target_frame_transfer_characteristic.toString())); + if (this.color_primaries != null) sb.append(String.format("color_primaries = %s%n", this.color_primaries.toString())); + sb.append(String.format("max_ref = %d%n", this.max_ref)); + sb.append(String.format("min_ref = %d%n", this.min_ref)); + sb.append(String.format("essence_stream_id = %d%n", this.essence_stream_id)); + if (this.aces_picture_subdescriptor_uid != null) sb.append(String.format("aces_picture_subdescriptor_uid = %s%n", this.aces_picture_subdescriptor_uid.toString())); + if (this.viewing_environment != null) sb.append(String.format("viewing_environment = %s%n", this.viewing_environment.toString())); + return sb.toString(); + } + } +} diff --git a/src/main/java/com/netflix/imflibrary/st0429_8/PackingList.java b/src/main/java/com/netflix/imflibrary/st0429_8/PackingList.java index 1759453a..bbd15ad4 100644 --- a/src/main/java/com/netflix/imflibrary/st0429_8/PackingList.java +++ b/src/main/java/com/netflix/imflibrary/st0429_8/PackingList.java @@ -23,10 +23,7 @@ import com.netflix.imflibrary.RESTfulInterfaces.IMPValidator; import com.netflix.imflibrary.RESTfulInterfaces.PayloadRecord; import com.netflix.imflibrary.exceptions.IMFException; -import com.netflix.imflibrary.utils.ErrorLogger; -import com.netflix.imflibrary.utils.FileByteRangeProvider; -import com.netflix.imflibrary.utils.ResourceByteRangeProvider; -import com.netflix.imflibrary.utils.UUIDHelper; +import com.netflix.imflibrary.utils.*; import com.netflix.imflibrary.writerTools.utils.ValidationEventHandlerImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -99,11 +96,11 @@ private String getPKLContext(){ /** * Constructor for a {@link com.netflix.imflibrary.st0429_8.PackingList PackingList} object that corresponds to a PackingList XML document - * @param packingListXMLFile the input XML file + * @param packingListXMLFileLocator the input XML file locator * @throws IOException - any I/O related error is exposed through an IOException */ - public PackingList(File packingListXMLFile) throws IOException { - this(new FileByteRangeProvider(packingListXMLFile)); + public PackingList(FileLocator packingListXMLFileLocator) throws IOException { + this(packingListXMLFileLocator.getResourceByteRangeProvider()); } /** diff --git a/src/main/java/com/netflix/imflibrary/st0429_9/AssetMap.java b/src/main/java/com/netflix/imflibrary/st0429_9/AssetMap.java index 110e8560..d6c3a250 100644 --- a/src/main/java/com/netflix/imflibrary/st0429_9/AssetMap.java +++ b/src/main/java/com/netflix/imflibrary/st0429_9/AssetMap.java @@ -23,11 +23,7 @@ import com.netflix.imflibrary.RESTfulInterfaces.IMPValidator; import com.netflix.imflibrary.RESTfulInterfaces.PayloadRecord; import com.netflix.imflibrary.exceptions.IMFException; -import com.netflix.imflibrary.utils.ErrorLogger; -import com.netflix.imflibrary.utils.FileByteRangeProvider; -import com.netflix.imflibrary.utils.ResourceByteRangeProvider; -import com.netflix.imflibrary.utils.UUIDHelper; -import com.netflix.imflibrary.utils.Utilities; +import com.netflix.imflibrary.utils.*; import com.netflix.imflibrary.writerTools.utils.ValidationEventHandlerImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -101,12 +97,12 @@ private String getAssetMapContext(){ } /** * Constructor for an {@link com.netflix.imflibrary.st0429_9.AssetMap AssetMap} object from an XML file that contains an AssetMap document - * @param assetMapXmlFile the input XML file + * @param assetMapXmlFileLocator the input XML file locator * @throws IOException - any I/O related error is exposed through an IOException */ - public AssetMap(File assetMapXmlFile) throws IOException + public AssetMap(FileLocator assetMapXmlFileLocator) throws IOException { - this(getFileAsResourceByteRangeProvider(assetMapXmlFile)); + this(getFileAsResourceByteRangeProvider(assetMapXmlFileLocator)); } /** @@ -315,9 +311,9 @@ private static String getAssetMapNamespaceURI(ResourceByteRangeProvider resource return assetMapNamespaceURI; } - private static ResourceByteRangeProvider getFileAsResourceByteRangeProvider(File file) + private static ResourceByteRangeProvider getFileAsResourceByteRangeProvider(FileLocator fileLocator) { - return new FileByteRangeProvider(file); + return fileLocator.getResourceByteRangeProvider(); } static List checkConformance(AssetMapType assetMapType) diff --git a/src/main/java/com/netflix/imflibrary/st0429_9/BasicMapProfileV2FileSet.java b/src/main/java/com/netflix/imflibrary/st0429_9/BasicMapProfileV2FileSet.java index 19ae6aaf..5cc8185e 100644 --- a/src/main/java/com/netflix/imflibrary/st0429_9/BasicMapProfileV2FileSet.java +++ b/src/main/java/com/netflix/imflibrary/st0429_9/BasicMapProfileV2FileSet.java @@ -21,6 +21,7 @@ import com.netflix.imflibrary.IMFErrorLogger; import com.netflix.imflibrary.IMFErrorLoggerImpl; import com.netflix.imflibrary.exceptions.IMFException; +import com.netflix.imflibrary.utils.FileLocator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; @@ -47,10 +48,10 @@ public final class BasicMapProfileV2FileSet * Constructor for a {@link BasicMapProfileV2FileSet BasicMapProfilev2FileSet} from a {@link BasicMapProfileV2MappedFileSet MappedFileSet} object. Construction * succeeds if the constraints specified in Section A.1 in Annex A of st0429-9:2014 are satisfied * @param basicMapProfileV2MappedFileSet the Mapped File Set object corresponding to this object - * @throws IOException - forwarded from {@link BasicMapProfileV2MappedFileSet#BasicMapProfileV2MappedFileSet(java.io.File) MappedFileSet} constructor - * @throws SAXException - forwarded from {@link BasicMapProfileV2MappedFileSet#BasicMapProfileV2MappedFileSet(java.io.File) MappedFileSet} constructor - * @throws JAXBException - forwarded from {@link BasicMapProfileV2MappedFileSet#BasicMapProfileV2MappedFileSet(java.io.File) MappedFileSet} constructor - * @throws URISyntaxException - forwarded from {@link BasicMapProfileV2MappedFileSet#BasicMapProfileV2MappedFileSet(java.io.File) MappedFileSet} constructor + * @throws IOException - forwarded from {@link BasicMapProfileV2MappedFileSet#BasicMapProfileV2MappedFileSet(FileLocator) MappedFileSet} constructor + * @throws SAXException - forwarded from {@link BasicMapProfileV2MappedFileSet#BasicMapProfileV2MappedFileSet(FileLocator) MappedFileSet} constructor + * @throws JAXBException - forwarded from {@link BasicMapProfileV2MappedFileSet#BasicMapProfileV2MappedFileSet(FileLocator) MappedFileSet} constructor + * @throws URISyntaxException - forwarded from {@link BasicMapProfileV2MappedFileSet#BasicMapProfileV2MappedFileSet(FileLocator) MappedFileSet} constructor */ public BasicMapProfileV2FileSet(BasicMapProfileV2MappedFileSet basicMapProfileV2MappedFileSet) throws IOException, SAXException, JAXBException, URISyntaxException { @@ -95,9 +96,8 @@ public URI getAbsoluteAssetMapURI() public static void main(String[] args) throws IOException, SAXException, JAXBException, URISyntaxException { - File rootFile = new File(args[0]); - - BasicMapProfileV2FileSet basicMapProfileV2FileSet = new BasicMapProfileV2FileSet(new BasicMapProfileV2MappedFileSet(rootFile)); + FileLocator rootFileLocator = FileLocator.fromLocation(args[0]); + BasicMapProfileV2FileSet basicMapProfileV2FileSet = new BasicMapProfileV2FileSet(new BasicMapProfileV2MappedFileSet(rootFileLocator)); logger.warn(basicMapProfileV2FileSet.getAssetMap().toString()); } diff --git a/src/main/java/com/netflix/imflibrary/st0429_9/BasicMapProfileV2MappedFileSet.java b/src/main/java/com/netflix/imflibrary/st0429_9/BasicMapProfileV2MappedFileSet.java index ec357583..a013ca8f 100644 --- a/src/main/java/com/netflix/imflibrary/st0429_9/BasicMapProfileV2MappedFileSet.java +++ b/src/main/java/com/netflix/imflibrary/st0429_9/BasicMapProfileV2MappedFileSet.java @@ -22,6 +22,7 @@ import com.netflix.imflibrary.IMFErrorLoggerImpl; import com.netflix.imflibrary.exceptions.IMFException; import com.netflix.imflibrary.utils.ErrorLogger; +import com.netflix.imflibrary.utils.FileLocator; import org.xml.sax.SAXException; import javax.annotation.Nonnull; @@ -49,16 +50,16 @@ public final class BasicMapProfileV2MappedFileSet private final IMFErrorLogger imfErrorLogger; /** * Constructor for a MappedFileSet object from a file representing the root of a directory tree - * @param rootFile the directory which serves as the tree root of the Mapped File Set - * @throws IOException - forwarded from {@link AssetMap#AssetMap(java.io.File) AssetMap} constructor + * @param rootFileLocator the directory which serves as the tree root of the Mapped File Set + * @throws IOException - forwarded from {@link AssetMap#AssetMap(FileLocator) AssetMap} constructor */ - public BasicMapProfileV2MappedFileSet(File rootFile) throws IOException + public BasicMapProfileV2MappedFileSet(FileLocator rootFileLocator) throws IOException { imfErrorLogger = new IMFErrorLoggerImpl(); - if (!rootFile.isDirectory()) + if (!rootFileLocator.isDirectory()) { String message = String.format("Root file %s corresponding to the mapped file set is not a " + - "directory", rootFile.getAbsolutePath()); + "directory", rootFileLocator.getAbsolutePath()); imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_AM_ERROR, IMFErrorLogger.IMFErrors .ErrorLevels.FATAL, message); @@ -74,12 +75,12 @@ public boolean accept(File rootFile, String name) } }; - File[] files = rootFile.listFiles(filenameFilter); + FileLocator[] files = rootFileLocator.listFiles(filenameFilter); if ((files == null) || (files.length != 1)) { String message = String.format("Found %d files with name %s in mapped file set rooted at %s, " + "exactly 1 is allowed", (files == null) ? 0 : files.length, BasicMapProfileV2MappedFileSet - .ASSETMAP_FILE_NAME, rootFile.getAbsolutePath()); + .ASSETMAP_FILE_NAME, rootFileLocator.getAbsolutePath()); imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_AM_ERROR, IMFErrorLogger.IMFErrors .ErrorLevels.FATAL, message); diff --git a/src/main/java/com/netflix/imflibrary/st2067_2/AbstractApplicationComposition.java b/src/main/java/com/netflix/imflibrary/st2067_2/AbstractApplicationComposition.java index 54251b1f..8b782808 100644 --- a/src/main/java/com/netflix/imflibrary/st2067_2/AbstractApplicationComposition.java +++ b/src/main/java/com/netflix/imflibrary/st2067_2/AbstractApplicationComposition.java @@ -1013,7 +1013,6 @@ private List conformEssenceDescriptors(Map e.getValue().equals(imageEssencedescriptorDOMNode)).map(e -> e.getKey()).findFirst() .get(); diff --git a/src/main/java/com/netflix/imflibrary/st2067_2/Application5Composition.java b/src/main/java/com/netflix/imflibrary/st2067_2/Application5Composition.java new file mode 100644 index 00000000..610a0695 --- /dev/null +++ b/src/main/java/com/netflix/imflibrary/st2067_2/Application5Composition.java @@ -0,0 +1,335 @@ +package com.netflix.imflibrary.st2067_2; + +import com.netflix.imflibrary.Colorimetry; +import com.netflix.imflibrary.IMFErrorLogger; +import com.netflix.imflibrary.IMFErrorLoggerImpl; +import com.netflix.imflibrary.st0377.header.InterchangeObject; +import com.netflix.imflibrary.st0377.header.UL; +import com.netflix.imflibrary.st0377.header.GenericPictureEssenceDescriptor.RGBAComponentType; +import com.netflix.imflibrary.utils.DOMNodeObjectModel; +import com.netflix.imflibrary.utils.Fraction; +import com.netflix.imflibrary.st2067_2.ApplicationCompositionFactory.*; + + +import javax.annotation.Nonnull; + +import org.w3c.dom.Node; + +import java.util.*; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; + +import static com.netflix.imflibrary.st0377.header.GenericPictureEssenceDescriptor.*; +import static com.netflix.imflibrary.st0377.header.GenericPictureEssenceDescriptor.RGBAComponentType.Null; +import static com.netflix.imflibrary.Colorimetry.*; + +/** + * A class that models Composition with Application 5 constraints from 2067-50 specification + */ +public class Application5Composition extends AbstractApplicationComposition { + public static final Integer MAX_RGB_IMAGE_FRAME_WIDTH = Integer.MAX_VALUE; //TODO: 2067-50 specifies 2^32-1, would require using Long instead of Integer + public static final Integer MAX_RGB_IMAGE_FRAME_HEIGHT = Integer.MAX_VALUE; //TODO: 2067-50 specifies 2^32-1, would require using Long instead of Integer + public static final Map>colorToBitDepthMap = Collections.unmodifiableMap(new HashMap>() {{ + put(Colorimetry.Unknown, new HashSet(){{ }}); + put(Colorimetry.Color_App5_AP0, new HashSet(){{ add(16); }}); + }}); + public static final SetbitDepthsSupported = Collections.unmodifiableSet(new HashSet() {{ + add(16); }}); + + private static final Set ignoreSet = Collections.unmodifiableSet(new HashSet() {{ + /* add("SignalStandard"); //TODO SignalStandard shall not be present + add("ActiveFormatDescriptor"); //TODO ActiveFormatDescriptor shall not be present + add("VideoLineMap"); //TODO Shall be present and equal to {00h, 00h} per 2065-5 + add("AlphaTransparency"); //TODO AlphaTransparency shall not be present + add("PixelLayout"); //TODO PixelLayout shall be present per 2065-5 */ + }}); + + public Application5Composition(@Nonnull IMFCompositionPlaylistType imfCompositionPlaylistType) { + super(imfCompositionPlaylistType, ignoreSet); + + try { + List essenceDescriptorsList = this.getEssenceDescriptors("RGBADescriptor").stream() + .distinct() + .collect(Collectors.toList()); +/* for(DOMNodeObjectModel domNodeObjectModel : essenceDescriptorsList){ + System.out.println(" ED : " + domNodeObjectModel.toString()); + } +*/ + } + catch (Exception e) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("Exception in validating EssenceDescriptors in APPLICATION_5_COMPOSITION_TYPE: %s ", e.getMessage())); + } + + try + { + CompositionImageEssenceDescriptorModel imageEssenceDescriptorModel = getCompositionImageEssenceDescriptorModel(); + + if (imageEssenceDescriptorModel != null) + { + + imfErrorLogger.addAllErrors(imageEssenceDescriptorModel.getErrors()); + Application5Composition.validatePictureEssenceDescriptor(imageEssenceDescriptorModel, ApplicationCompositionType.APPLICATION_5_COMPOSITION_TYPE, + imfErrorLogger); + } + } + catch (Exception e) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("Exception in validating EssenceDescriptors in APPLICATION_5_COMPOSITION_TYPE: %s ", e.getMessage())); + } + } + + public static void validatePictureEssenceDescriptor(CompositionImageEssenceDescriptorModel imageEssenceDescriptorModel, + ApplicationCompositionFactory.ApplicationCompositionType applicationCompositionType, + IMFErrorLogger + imfErrorLogger) + { + UUID imageEssenceDescriptorID = imageEssenceDescriptorModel.getImageEssencedescriptorID(); + ColorModel colorModel = imageEssenceDescriptorModel.getColorModel(); + if( !colorModel.equals(ColorModel.RGB)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall be an RGBA descriptor per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + return; + } + + Integer storedWidth = imageEssenceDescriptorModel.getStoredWidth(); + Integer storedHeight = imageEssenceDescriptorModel.getStoredHeight(); + if ((storedWidth <= 0) || (storedHeight <= 0)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has invalid storedWidth(%d) or storedHeight(%d) as per %s", + imageEssenceDescriptorID.toString(), storedWidth, storedHeight, applicationCompositionType.toString())); + } + + Integer sampleWidth = imageEssenceDescriptorModel.getSampleWidth(); + Integer sampleHeight = imageEssenceDescriptorModel.getSampleHeight(); + if ((sampleWidth != null && !sampleWidth.equals(storedWidth)) || + (sampleHeight != null && !sampleHeight.equals(storedHeight))) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has invalid sampleWidth(%d) or sampleHeight(%d) as per %s", + imageEssenceDescriptorID.toString(), sampleWidth != null ? sampleWidth : 0, sampleHeight != null ? sampleHeight : 0, + applicationCompositionType.toString())); + } + + Integer displayWidth = imageEssenceDescriptorModel.getDisplayWidth(); + Integer displayHeight = imageEssenceDescriptorModel.getDisplayHeight(); + if ((displayWidth <= 0) || (displayHeight <= 0)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has invalid displayWidth(%d) or displayHeight(%d) item as per %s", + imageEssenceDescriptorID.toString(), displayWidth, displayHeight, applicationCompositionType.toString())); + } + + Integer displayXOffset = imageEssenceDescriptorModel.getDisplayXOffset(); + Integer displayYOffset = imageEssenceDescriptorModel.getDisplayYOffset(); + if ((displayXOffset == null) || (displayYOffset == null)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has no displayXOffset or displayYOffset item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + Fraction imageAspectRatio = imageEssenceDescriptorModel.getImageAspectRatio(); + if( imageAspectRatio == null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall have an Aspect Ratio item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } //TODO: Test if imageAspectRatio == roundToIntegralTiesToAway(DisplayWidth*pixelAspectRatio) / DisplayHeight + + ColorPrimaries colorPrimaries = imageEssenceDescriptorModel.getColorPrimaries(); + if(!colorPrimaries.equals(ColorPrimaries.ACES)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has invalid ColorPrimaries as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + TransferCharacteristic transferCharacteristic = imageEssenceDescriptorModel.getTransferCharacteristic(); + if(!transferCharacteristic.equals(TransferCharacteristic.Linear)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has invalid TransferCharacteristic as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + Colorimetry color = imageEssenceDescriptorModel.getColor(); + if(!color.equals(Colorimetry.Color_App5_AP0)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has invalid ColorPrimaries(%s) as per %s", + imageEssenceDescriptorID.toString(), colorPrimaries.name(), applicationCompositionType.toString())); + } + + UL essenceContainerFormatUL = imageEssenceDescriptorModel.getEssenceContainerFormatUL(); + UL MXFGCFrameWrappedACESPictures = UL.fromULAsURNStringToUL("urn:smpte:ul:060e2b34.0401010d.0d010301.02190100"); // MXF-GC Frame-wrapped ACES Pictures per 2065-5 + if(essenceContainerFormatUL == null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s does not contain a ContainerFormat as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } else { + if (!essenceContainerFormatUL.equals(MXFGCFrameWrappedACESPictures)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has invalid ContainerFormat(%s) as per %s", + imageEssenceDescriptorID.toString(), essenceContainerFormatUL.toString(), applicationCompositionType.toString())); + } + } + Integer offset = imageEssenceDescriptorModel.getSampledXOffset(); + if((offset != null) && (offset != 0)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has invalid SampledXOffset (%d) as per %s", + imageEssenceDescriptorID.toString(), offset, applicationCompositionType.toString())); + } + + offset = imageEssenceDescriptorModel.getSampledYOffset(); + if((offset != null) && (offset != 0)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has an invalid SampledYOffset (%d) item as per %s", + imageEssenceDescriptorID.toString(), offset, applicationCompositionType.toString())); + } + + //FrameLayout + FrameLayoutType frameLayoutType = imageEssenceDescriptorModel.getFrameLayoutType(); + if (!frameLayoutType.equals(FrameLayoutType.FullFrame)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has invalid FrameLayout(%s) as per %s", + imageEssenceDescriptorID.toString(), frameLayoutType.name(), applicationCompositionType.toString())); + } + + //SampleRate + Fraction sampleRate = imageEssenceDescriptorModel.getSampleRate(); + if (sampleRate.equals(new Fraction(0))) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has no SampleRate per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + //The following items shall not be present per 2065-5 Table 10 + if(imageEssenceDescriptorModel.getStoredOffset() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain a StoredF2Offset item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getDisplayF2Offset() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain a DisplayF2Offset item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getActiveFormatDescriptor() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain an Active Format Descriptor item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getAlphaTransparency() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain an Alpha Transparency as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getImageAlignmentOffset() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain an Image Alignment Offset item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + if(imageEssenceDescriptorModel.getStoredOffset() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain a StoredF2Offset item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getImageStartOffset() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain an Image Start Offset item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getImageEndOffset() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain an Image End Offset item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getFieldDominance() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain a Field Dominance item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getCodingEquations() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain a Coding Equations item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getComponentMaxRef() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain a Component Max Ref item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getComponentMinRef() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain a Component Min Ref item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getAlphaMaxRef() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain an Alpha Max Ref item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getAlphaMinRef() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain an Alpha Min Ref item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getPalette() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain a Palette item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + + if(imageEssenceDescriptorModel.getPaletteLayout() != null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall not contain a Palette Layout item as per %s", + imageEssenceDescriptorID.toString(), applicationCompositionType.toString())); + } + } + + public ApplicationCompositionType getApplicationCompositionType() { + return ApplicationCompositionType.APPLICATION_5_COMPOSITION_TYPE; + } + +} diff --git a/src/main/java/com/netflix/imflibrary/st2067_2/ApplicationCompositionFactory.java b/src/main/java/com/netflix/imflibrary/st2067_2/ApplicationCompositionFactory.java index 51fac313..badacb03 100755 --- a/src/main/java/com/netflix/imflibrary/st2067_2/ApplicationCompositionFactory.java +++ b/src/main/java/com/netflix/imflibrary/st2067_2/ApplicationCompositionFactory.java @@ -46,9 +46,14 @@ public class ApplicationCompositionFactory { add("http://www.smpte-ra.org/schemas/2067-21/2016"); }}); + private static final Set namespacesApplication5Composition = Collections.unmodifiableSet(new HashSet() {{ + add("http://www.smpte-ra.org/ns/2067-50/2017"); + }}); + public enum ApplicationCompositionType { APPLICATION_2_COMPOSITION_TYPE(Application2Composition.class, namespacesApplication2Composition), APPLICATION_2E_COMPOSITION_TYPE(Application2ExtendedComposition.class, namespacesApplication2EComposition), + APPLICATION_5_COMPOSITION_TYPE(Application5Composition.class, namespacesApplication5Composition), APPLICATION_UNSUPPORTED_COMPOSITION_TYPE(ApplicationUnsupportedComposition.class, Collections.unmodifiableSet(new HashSet<>())); private Set nameSpaceSet; private Class clazz; @@ -121,7 +126,7 @@ public static ApplicationComposition getApplicationComposition(ResourceByteRange return null; } } - + e.printStackTrace(); imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.INTERNAL_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format(String.format("No matching constructor for class %s", clazz != null ? clazz.getSimpleName(): "ApplicationComposition"))); return null; diff --git a/src/main/java/com/netflix/imflibrary/st2067_2/CompositionImageEssenceDescriptorModel.java b/src/main/java/com/netflix/imflibrary/st2067_2/CompositionImageEssenceDescriptorModel.java index ff2abda9..1e5ee647 100644 --- a/src/main/java/com/netflix/imflibrary/st2067_2/CompositionImageEssenceDescriptorModel.java +++ b/src/main/java/com/netflix/imflibrary/st2067_2/CompositionImageEssenceDescriptorModel.java @@ -4,6 +4,7 @@ import com.netflix.imflibrary.IMFErrorLogger; import com.netflix.imflibrary.IMFErrorLoggerImpl; import com.netflix.imflibrary.st0377.header.UL; +import com.netflix.imflibrary.st0377.header.GenericPictureEssenceDescriptor.RGBAComponentType; import com.netflix.imflibrary.utils.DOMNodeObjectModel; import com.netflix.imflibrary.utils.ErrorLogger; import com.netflix.imflibrary.utils.Fraction; @@ -11,9 +12,13 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; + +import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import static com.netflix.imflibrary.st0377.header.GenericPictureEssenceDescriptor.*; @@ -45,6 +50,31 @@ public final class CompositionImageEssenceDescriptorModel { private final TransferCharacteristic transferCharacteristic; private final ColorPrimaries colorPrimaries; private final UL essenceContainerFormatUL; + // items constrained in 2065-5 + private final Integer signalStandard; + private final Integer sampledXOffset; + private final Integer sampledYOffset; + private final Integer displayWidth; + private final Integer displayHeight; + private final Integer displayXOffset; + private final Integer displayYOffset; + private final Integer displayF2Offset; + private final Fraction imageAspectRatio; + private final Integer activeFormatDescriptor; + private final Integer alphaTransparency; + private final Integer imageAlignmentOffset; + private final Integer imageStartOffset; + private final Integer imageEndOffset; + private final Integer fieldDominance; + private final UL codingEquations; + private final Integer componentMinRef; + private final Integer componentMaxRef; + private final Integer alphaMinRef; + private final Integer alphaMaxRef; + private final Integer scanningDirection; + private final String palette; + private final String paletteLayout; + public CompositionImageEssenceDescriptorModel(@Nonnull UUID imageEssencedescriptorID, @Nonnull DOMNodeObjectModel imageEssencedescriptorDOMNode, @Nonnull RegXMLLibDictionary regXMLLibDictionary) { @@ -91,17 +121,66 @@ public CompositionImageEssenceDescriptorModel(@Nonnull UUID imageEssencedescript this.codingEquation = CodingEquation.None; } + this.essenceContainerFormatUL = imageEssencedescriptorDOMNode.getFieldAsUL(regXMLLibDictionary.getSymbolNameFromURN(containerFormatUL)); + + // begin Items constrained in ST2065-5 + this.signalStandard = getFieldAsInteger(signalStandardUL); + this.sampledXOffset = getFieldAsInteger(sampledXOffsetUL); + this.sampledYOffset = getFieldAsInteger(sampledYOffsetUL); + Integer displayWidth = getFieldAsInteger(displayWidthUL); + this.displayWidth = displayWidth != null ? displayWidth : -1; + Integer displayHeight = getFieldAsInteger(displayHeightUL); + this.displayHeight = displayHeight != null ? displayHeight : -1; + this.displayXOffset = getFieldAsInteger(displayXOffsetUL); + this.displayYOffset = getFieldAsInteger(displayYOffsetUL); + this.displayF2Offset = getFieldAsInteger(displayF2OffsetUL); + this.imageAspectRatio = getFieldAsFraction(imageAspectRatioUL); + this.activeFormatDescriptor = getFieldAsInteger(activeFormatDescriptorUL); + this.alphaTransparency = getFieldAsInteger(alphaTransparencyUL); + this.imageAlignmentOffset = getFieldAsInteger(imageAlignmentOffsetUL); + this.imageStartOffset = getFieldAsInteger(imageStartOffsetUL); + this.imageEndOffset = getFieldAsInteger(imageEndOffsetUL); + this.fieldDominance = getFieldAsInteger(fieldDominanceUL); + this.codingEquations = imageEssencedescriptorDOMNode.getFieldAsUL(regXMLLibDictionary.getSymbolNameFromURN(codingEquationsUL)); + this.componentMinRef = getFieldAsInteger(componentMinRefUL); + this.componentMaxRef = getFieldAsInteger(componentMaxRefUL); + this.alphaMinRef = getFieldAsInteger(alphaMinRefUL); + this.alphaMaxRef = getFieldAsInteger(alphaMaxRefUL); + this.scanningDirection = getFieldAsInteger(scanningDirectionUL); + + this.palette = getFieldAsString(paletteUL); + this.paletteLayout = getFieldAsString(paletteLayoutUL); + // end Items constrained in ST2065-5 + + UL MXFGCFrameWrappedACESPictures = UL.fromULAsURNStringToUL("urn:smpte:ul:060e2b34.0401010d.0d010301.02190100"); // MXF-GC Frame-wrapped ACES Pictures per 2065-5 if(!this.colorModel.equals(ColorModel.Unknown)) { - this.pixelBitDepth = parsePixelBitDepth(this.colorModel); - this.quantization = parseQuantization(this.colorModel, this.pixelBitDepth); + if ((this.essenceContainerFormatUL != null) && getEssenceContainerFormatUL().equals(MXFGCFrameWrappedACESPictures) ) { // App #5 + if(colorModel.equals(ColorModel.RGB)) { + this.pixelBitDepth = null; + this.quantization = Quantization.Unknown; + this.color = Colorimetry.valueOf(this.colorPrimaries, this.transferCharacteristic); + this.sampling = Sampling.Unknown; + parseApp5SubDescriptors(); + parseApp5PixelLayout(); + parseApp5VideoLineMap(); + } else { + this.pixelBitDepth = null; + this.quantization = Quantization.Unknown; + this.color = Colorimetry.Unknown; + this.sampling = Sampling.Unknown; + } + } else { // App #2/#2E + this.pixelBitDepth = parsePixelBitDepth(this.colorModel); + this.quantization = parseQuantization(this.colorModel, this.pixelBitDepth); - Colorimetry color = Colorimetry.valueOf(this.colorPrimaries, this.transferCharacteristic); - if((colorModel.equals(ColorModel.YUV) && !color.getCodingEquation().equals(this.codingEquation))) { - color = Colorimetry.Unknown; - } - this.color = color; + Colorimetry color = Colorimetry.valueOf(this.colorPrimaries, this.transferCharacteristic); + if((colorModel.equals(ColorModel.YUV) && !color.getCodingEquation().equals(this.codingEquation))) { + color = Colorimetry.Unknown; + } + this.color = color; - this.sampling = parseSampling(this.colorModel); + this.sampling = parseSampling(this.colorModel); + } } else { this.pixelBitDepth = null; @@ -110,7 +189,6 @@ public CompositionImageEssenceDescriptorModel(@Nonnull UUID imageEssencedescript this.sampling = Sampling.Unknown; } - this.essenceContainerFormatUL = imageEssencedescriptorDOMNode.getFieldAsUL(regXMLLibDictionary.getSymbolNameFromURN(containerFormatUL)); } @@ -203,7 +281,97 @@ public TransferCharacteristic getTransferCharacteristic() { return imageEssencedescriptorDOMNode.getFieldAsFraction(regXMLLibDictionary.getSymbolNameFromURN(urn)); } + public @Nullable Integer getSignalStandard() { + return signalStandard; + } + + public @Nullable Integer getSampledXOffset() { + return sampledXOffset; + } + + public @Nullable Integer getSampledYOffset() { + return sampledYOffset; + } + + public @Nonnull Integer getDisplayWidth() { + return displayWidth; + } + + public @Nonnull Integer getDisplayHeight() { + return displayHeight; + } + + public @Nullable Integer getDisplayXOffset() { + return displayXOffset; + } + + public @Nullable Integer getDisplayYOffset() { + return displayYOffset; + } + + public @Nullable Integer getDisplayF2Offset() { + return displayF2Offset; + } + + public @Nullable Fraction getImageAspectRatio() { + return imageAspectRatio; + } + + public @Nullable Integer getActiveFormatDescriptor() { + return activeFormatDescriptor; + } + + public @Nullable Integer getAlphaTransparency() { + return alphaTransparency; + } + + public @Nullable Integer getImageAlignmentOffset() { + return imageAlignmentOffset; + } + + public @Nullable Integer getImageStartOffset() { + return imageStartOffset; + } + + public @Nullable Integer getImageEndOffset() { + return imageEndOffset; + } + + public @Nullable Integer getFieldDominance() { + return fieldDominance; + } + + public @Nullable UL getCodingEquations() { + return codingEquations; + } + + public @Nullable Integer getComponentMinRef() { + return componentMinRef; + } + + public @Nullable Integer getComponentMaxRef() { + return componentMaxRef; + } + + public @Nullable Integer getAlphaMinRef() { + return alphaMinRef; + } + + public @Nullable Integer getAlphaMaxRef() { + return alphaMaxRef; + } + public @Nullable Integer getScanningDirection() { + return scanningDirection; + } + + public @Nullable String getPalette() { + return palette; + } + + public @Nullable String getPaletteLayout() { + return paletteLayout; + } private @Nonnull Integer parsePixelBitDepth(@Nonnull ColorModel colorModel) { Integer refPixelBitDepth = null; @@ -369,4 +537,222 @@ else if(colorModel.equals(ColorModel.YUV)) { } return sampling; } + + private void parseApp5SubDescriptors() { + DOMNodeObjectModel subDescriptors = imageEssencedescriptorDOMNode.getDOMNode(regXMLLibDictionary.getSymbolNameFromURN(subdescriptorsUL)); + if (subDescriptors != null) { + List acesPictureSubDescriptors = subDescriptors.getDOMNodes(regXMLLibDictionary.getSymbolNameFromURN(acesPictureSubDescriptorUL)); + List targetFrameSubDescriptors = subDescriptors.getDOMNodes(regXMLLibDictionary.getSymbolNameFromURN(targetFrameSubDescriptorUL)); + if (!acesPictureSubDescriptors.isEmpty()) { + for (DOMNodeObjectModel domNodeObjectModel : acesPictureSubDescriptors) { + String authoring_information = domNodeObjectModel.getFieldAsString(regXMLLibDictionary.getSymbolNameFromURN(acesAuthoringInformationUL)); + if ((authoring_information == null) || authoring_information.isEmpty()) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.WARNING, + String.format("ACES Picture SubDescriptor (ID %s): Optional item ACES Authoring Information is not present or empty", domNodeObjectModel.getFieldsAsUUID(regXMLLibDictionary.getSymbolNameFromURN(instanceID)).toString())); + } + DOMNodeObjectModel primaries = domNodeObjectModel.getDOMNode(regXMLLibDictionary.getSymbolNameFromURN(acesMasteringDisplayPrimariesUL)); + DOMNodeObjectModel whitePoint = domNodeObjectModel.getDOMNode(regXMLLibDictionary.getSymbolNameFromURN(acesMasteringDisplayWhitePointChromaticityUL)); + Integer maxLum = domNodeObjectModel.getFieldAsInteger(regXMLLibDictionary.getSymbolNameFromURN(acesMasteringDisplayDisplayMaximumLuminanceUL)); + Integer minLum = domNodeObjectModel.getFieldAsInteger(regXMLLibDictionary.getSymbolNameFromURN(acesMasteringDisplayDisplayMinimumLuminanceUL)); + if (!(((primaries == null) && (whitePoint == null) && (maxLum == null) && (minLum == null)) + || ((primaries != null) && (whitePoint != null) && (maxLum != null) && (minLum != null)))) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("ACES Picture SubDescriptor (ID %s) shall have either all or none of the following elements: Mastering Display Primaries, White Point, Maximum Luminance, Minimum Luminance", domNodeObjectModel.getFieldsAsUUID(regXMLLibDictionary.getSymbolNameFromURN(instanceID)).toString())); + } + } + } else { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.WARNING, + String.format("INFO (can be ignored): No ACESPictureSubDescriptor found")); + } + if (!targetFrameSubDescriptors.isEmpty()) { + for (DOMNodeObjectModel domNodeObjectModel : targetFrameSubDescriptors) { + String missing_items = ""; + Set targetFrameAncillaryResourceID = domNodeObjectModel.getFieldsAsUUID(regXMLLibDictionary.getSymbolNameFromURN(targetFrameAncillaryResourceIDUL)); + // Check for missing required items + if (targetFrameAncillaryResourceID.isEmpty()) { + missing_items += "TargetFrameAncillaryResourceID, "; + } else { + //TODO Check it targetFrameAncillaryResourceID belongs to an existing GSP + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.WARNING, + String.format("INFO: Target FrameSubDescriptor (ID %s) references an Ancillary Resource (ID %s), but Ancillary Resources cannot be checked yet", + domNodeObjectModel.getFieldsAsUUID(regXMLLibDictionary.getSymbolNameFromURN(instanceID)).toString(), targetFrameAncillaryResourceID.toString())); + } + String media_type = domNodeObjectModel.getFieldAsString(regXMLLibDictionary.getSymbolNameFromURN(mediaTypeUL)); + if (media_type == null) { + missing_items += "MediaType, "; + } + Long index = domNodeObjectModel.getFieldAsLong(regXMLLibDictionary.getSymbolNameFromURN(targetFrameIndexUL)); + if (index == null) { + missing_items += "TargetFrameIndex, "; + } + UL transfer = domNodeObjectModel.getFieldAsUL(regXMLLibDictionary.getSymbolNameFromURN(targetFrameTransferCharacteristicUL)); + if (transfer == null) { + missing_items += "TargetFrameTransferCharacteristic, "; + } + UL color = domNodeObjectModel.getFieldAsUL(regXMLLibDictionary.getSymbolNameFromURN(targetFrameColorPrimariesUL)); + if (color == null) { + missing_items += "TargetFrameColorPrimaries, "; + } + Integer max_ref = domNodeObjectModel.getFieldAsInteger(regXMLLibDictionary.getSymbolNameFromURN(targetFrameComponentMaxRefUL)); + if (max_ref == null) { + missing_items += "TargetFrameComponentMaxRef, "; + } + Integer min_ref = domNodeObjectModel.getFieldAsInteger(regXMLLibDictionary.getSymbolNameFromURN(targetFrameComponentMinRefUL)); + if (min_ref == null) { + missing_items += "TargetFrameComponentMinRef, "; + } + Integer stream_id = domNodeObjectModel.getFieldAsInteger(regXMLLibDictionary.getSymbolNameFromURN(targetFrameEssenceStreamIDUL)); + if (stream_id == null) { + missing_items += "TargetFrameEssenceStreamID"; + } + if (!missing_items.isEmpty()) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("Target FrameSubDescriptor (ID %s): is missing required item(s): %s", domNodeObjectModel.getFieldsAsUUID(regXMLLibDictionary.getSymbolNameFromURN(instanceID)).toString(), missing_items)); + } + + // Check if acesPictureSubDescriptorInstanceID references an existing ACESPictureSubDescriptor Instance ID + Set acesPictureSubDescriptorInstanceID = domNodeObjectModel.getFieldsAsUUID(regXMLLibDictionary.getSymbolNameFromURN(acesPictureSubDescriptorInstanceIDUL)); + if (!acesPictureSubDescriptorInstanceID.isEmpty()) { + if (acesPictureSubDescriptors.isEmpty()) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("Target FrameSubDescriptor (ID %s) references an ACESPictureSubDescriptorInstanceID (%s) but no ACESPictureSubDescriptor is present", + domNodeObjectModel.getFieldsAsUUID(regXMLLibDictionary.getSymbolNameFromURN(instanceID)).toString(), acesPictureSubDescriptorInstanceID.toString())); + } else { + if (acesPictureSubDescriptors.stream().noneMatch(e -> e.getFieldsAsUUID(regXMLLibDictionary.getSymbolNameFromURN(instanceID)).equals(acesPictureSubDescriptorInstanceID))) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("Target FrameSubDescriptor (ID %s) references an ACESPictureSubDescriptor but no ACESPictureSubDescriptor with Instance ID (%s) is present", + domNodeObjectModel.getFieldsAsUUID(regXMLLibDictionary.getSymbolNameFromURN(instanceID)).toString(), acesPictureSubDescriptorInstanceID.toString())); + } + } + + } + + if ((max_ref != null) && (min_ref != null)) { + if (max_ref <= min_ref) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("Target FrameSubDescriptor (ID %s): TargetFrameComponentMaxRef (%d) is less than or equal to TargetFrameComponentMaxRef (%d)", domNodeObjectModel.getFieldsAsUUID(regXMLLibDictionary.getSymbolNameFromURN(instanceID)).toString(), max_ref, min_ref)); + } + } + } + } else { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.WARNING, + String.format("INFO (can be ignored): No TargetFrameSubDescriptor found")); + } + } else { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.WARNING, + String.format("INFO (can be ignored): No ACESPictureSubDescriptor and no TargetFrameSubDescriptor found")); + } + return; + } + + private void parseApp5VideoLineMap() { + DOMNodeObjectModel videoLineMap = imageEssencedescriptorDOMNode.getDOMNode(regXMLLibDictionary.getSymbolNameFromURN(videoLineMapUL)); + if (videoLineMap == null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall have a Video Line Map item", + imageEssencedescriptorID.toString())); + } + } + + + + private void parseApp5PixelLayout() { + DOMNodeObjectModel pixelLayout = imageEssencedescriptorDOMNode.getDOMNode(regXMLLibDictionary.getSymbolNameFromURN(pixelLayoutUL)); + if (pixelLayout == null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s shall have a Pixel Layout item", + imageEssencedescriptorID.toString())); + } else { + List rgbaComponents = pixelLayout.getDOMNodes(regXMLLibDictionary.getSymbolNameFromURN(rgbaComponentUL)); + if (rgbaComponents.size() == 0) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s is missing RGBAComponent in Pixel Layout", + imageEssencedescriptorID.toString())); + } else { + Map componentMap = new LinkedHashMap<>(); + List componentList = new ArrayList<>(); + for (DOMNodeObjectModel domNodeObjectModel : rgbaComponents) { + String code = domNodeObjectModel.getFieldAsString(regXMLLibDictionary.getTypeFieldNameFromURN(rgbaComponentUL, codeUL)); + if (code == null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has a Pixel Layout item with an RGBAComponent with missing Code", + imageEssencedescriptorID.toString())); + } else { + RGBAComponentType codeValue = RGBAComponentType.valueOf(regXMLLibDictionary.getEnumerationValueFromName(rgbaComponentKindUL, code)); + Integer pixelBitDepth = domNodeObjectModel.getFieldAsInteger(regXMLLibDictionary.getTypeFieldNameFromURN(rgbaComponentUL, componentSizeUL)); + if (pixelBitDepth == null) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has a Pixel Layout item with an RGBAComponent %s with missing Depth", + imageEssencedescriptorID.toString(), code)); + } else { + if ((codeValue.equals(Null) && pixelBitDepth != 0) || + (!codeValue.equals(Null) && (!pixelBitDepth.equals(253)))) { // In App#5, all components are of type HALF FLOAT + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has a Pixel Layout item %s with invalid Depth value %d (expected depth value: 253)", + imageEssencedescriptorID.toString(), code, pixelBitDepth)); + } + } + if (componentMap.containsKey(codeValue)) { + Integer count = componentMap.get(codeValue); + componentMap.put(codeValue, count + 1); + } else { + componentMap.put(codeValue, 1); + componentList.add(codeValue); + } + + } + } + boolean error = true; + if (componentList.size() >= 4) { // ABGR or BGR per 2067-50 plus Null + if (componentList.get(0).toString().equals("Alpha")) { // ABGR per 2067-50 + if (componentList.get(1).toString().equals("Blue") || componentList.get(2).toString().equals("Green") || componentList.get(3).toString().equals("Red") ) + error = false; + } else if (componentList.get(0).toString().equals("Blue")) { // BGR per 2067-50 + if (componentList.get(1).toString().equals("Green") || componentList.get(2).toString().equals("Red")) + error = false; + } + } + if (error) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has incorrect PixelLayout %s", + imageEssencedescriptorID.toString(), componentList.toString())); + } + componentMap.entrySet().stream().forEach( + e -> { + if (e.getKey().equals(RGBAComponentType.Null)) { + if (!(e.getValue().equals(5) || e.getValue().equals(4))) { // ABGR or BGR per 2067-50 + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s and ColorModel %s has invalid number of RGBAComponent %s in J2CLayout", + imageEssencedescriptorID.toString(), colorModel.name(), e.getKey())); + } + } else if (!e.getValue().equals(1)) { + imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR, + IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, + String.format("EssenceDescriptor with ID %s has more than one RGBAComponent %s in Pixel Layout", + imageEssencedescriptorID.toString(), e.getKey())); + } + + } + ); + } + } + } } diff --git a/src/main/java/com/netflix/imflibrary/st2067_2/IMFCoreConstraintsChecker.java b/src/main/java/com/netflix/imflibrary/st2067_2/IMFCoreConstraintsChecker.java index a010742a..77c2ca76 100644 --- a/src/main/java/com/netflix/imflibrary/st2067_2/IMFCoreConstraintsChecker.java +++ b/src/main/java/com/netflix/imflibrary/st2067_2/IMFCoreConstraintsChecker.java @@ -49,6 +49,11 @@ final class IMFCoreConstraintsChecker { add("XTOsiz"); add("YTOsiz"); add("Csiz"); + //App #5 ACES + // add("TargetFrameAncillaryResourceID"); +// add("ACESPictureSubDescriptorInstanceID"); + add("ACESPictureSubDescriptor"); + add("TargetFrameSubDescriptor"); }}; //To prevent instantiation diff --git a/src/main/java/com/netflix/imflibrary/utils/DOMNodeObjectModel.java b/src/main/java/com/netflix/imflibrary/utils/DOMNodeObjectModel.java index 3cd8a3da..398177d1 100644 --- a/src/main/java/com/netflix/imflibrary/utils/DOMNodeObjectModel.java +++ b/src/main/java/com/netflix/imflibrary/utils/DOMNodeObjectModel.java @@ -50,7 +50,7 @@ public class DOMNodeObjectModel { @Nonnull private final String localNamespaceURI; /*List of child ElementDOMNodes*/ - private final Map childrenDOMNodes = new HashMap<>(); + private final Map childrenDOMNodes = new LinkedHashMap<>(); /*Store for the Key-Value pairs corresponding of the Text Nodes of this ElementDOMNode*/ private final Map> fields = new HashMap<>(); private final Map> fieldsLocalNameMap = new HashMap<>(); diff --git a/src/main/java/com/netflix/imflibrary/utils/FileLocator.java b/src/main/java/com/netflix/imflibrary/utils/FileLocator.java new file mode 100644 index 00000000..32407467 --- /dev/null +++ b/src/main/java/com/netflix/imflibrary/utils/FileLocator.java @@ -0,0 +1,134 @@ +/* + * + * Copyright 2015 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.netflix.imflibrary.utils; + +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + +/** + * This interface is the supertype for classes representing an file locator across different storage facilities. + */ +public interface FileLocator +{ + + public static FileLocator fromLocation(String location) { + if (location.startsWith("s3://")) { + return new S3FileLocator(location); + } + + return new LocalFileLocator(location); + } + + public static FileLocator fromLocation(FileLocator directoryLocator, String fileName) throws IOException { + String directoryPath = directoryLocator.getAbsolutePath(); + if (directoryPath.charAt(directoryPath.length() - 1) != '/') { + directoryPath += '/'; + } + + return FileLocator.fromLocation(directoryPath + fileName); + } + + public static FileLocator fromLocation(URI location) { + if (location.toString().startsWith("s3://")) { + return new S3FileLocator(location); + } + + return new LocalFileLocator(location); + } + + /** + * Copies all bytes from a file denoted by a file locator to a target file + */ + public static Path copy(FileLocator fileLocator, Path outputFilePath) throws IOException { + InputStream inputStream = fileLocator.getInputStream(); + + Files.copy( + inputStream, + outputFilePath, + StandardCopyOption.REPLACE_EXISTING); + + inputStream.close(); + + return outputFilePath; + } + + /** + * Tests whether the file locator represents a directory. + */ + public boolean isDirectory() throws IOException; + + /** + * Return the absolute pathname string denoting the same file or + * directory as this abstract pathname + */ + public String getAbsolutePath() throws IOException; + + /** + * Returns an array of abstract pathnames denoting the files in the + * directory denoted by this abstract pathname. + */ + public FileLocator[] listFiles(FilenameFilter filenameFilter) throws IOException; + + /** + * Constructs a file: URI that represents this abstract pathname. + */ + public URI toURI() throws IOException; + + /** + * Tests whether the file or directory denoted by this abstract pathname + * exists. + */ + public boolean exists() throws IOException; + + /** + * Returns the name of the file or directory denoted by this abstract + * pathname. This is just the last name in the pathname's name + * sequence. If the pathname's name sequence is empty, then the empty + * string is returned. + */ + public String getName() throws IOException; + + /** + * Converts this abstract pathname into a pathname string. The resulting + * string uses the {@link #separator default name-separator character} to + * separate the names in the name sequence. + */ + public String getPath() throws IOException; + + /** + * Returns the length of the file denoted by this abstract pathname. + * The return value is unspecified if this pathname denotes a directory. + */ + public long length() throws IOException; + + /** + * + */ + public InputStream getInputStream() throws IOException; + + /** + * + */ + public ResourceByteRangeProvider getResourceByteRangeProvider(); +} diff --git a/src/main/java/com/netflix/imflibrary/utils/LocalFileLocator.java b/src/main/java/com/netflix/imflibrary/utils/LocalFileLocator.java new file mode 100644 index 00000000..f3a2ba34 --- /dev/null +++ b/src/main/java/com/netflix/imflibrary/utils/LocalFileLocator.java @@ -0,0 +1,79 @@ +package com.netflix.imflibrary.utils; + +import java.io.*; +import java.net.URI; +import java.util.ArrayList; + +public class LocalFileLocator implements FileLocator { + + private File file; + + public LocalFileLocator(String location) { + this.file = new File(location); + } + + public LocalFileLocator(URI location) { + this.file = new File(location); + } + + public LocalFileLocator(File file) { + this.file = file; + } + + /** + * Tests whether the file denoted by this abstract pathname is a + * directory. + * + * @return true if and only if the file denoted by this + * abstract pathname exists and is a directory; + * false otherwise + */ + public boolean isDirectory() throws IOException { + return this.file.isDirectory(); + } + + public String getAbsolutePath() throws IOException { + return this.file.getAbsolutePath(); + } + + public LocalFileLocator[] listFiles(FilenameFilter filenameFilter) throws IOException { + File[] files = this.file.listFiles(filenameFilter); + if (files == null) { + return null; + } + ArrayList fileLocators = new ArrayList(); + for (File file : files) { + fileLocators.add(new LocalFileLocator(file)); + } + + return fileLocators.toArray(new LocalFileLocator[0]); + } + + public URI toURI() throws IOException { + return this.file.toURI(); + } + + public boolean exists() throws IOException { + return this.file.exists(); + } + + public String getName() throws IOException { + return this.file.getName(); + } + + public String getPath() throws IOException { + return this.file.getPath(); + } + + public InputStream getInputStream() throws IOException { + return new FileInputStream(this.file); + } + + public long length() { + return this.file.length(); + } + + public ResourceByteRangeProvider getResourceByteRangeProvider() { + return new FileByteRangeProvider(this.file); + } +} diff --git a/src/main/java/com/netflix/imflibrary/utils/RegXMLLibHelper.java b/src/main/java/com/netflix/imflibrary/utils/RegXMLLibHelper.java index aef63327..33f9db80 100644 --- a/src/main/java/com/netflix/imflibrary/utils/RegXMLLibHelper.java +++ b/src/main/java/com/netflix/imflibrary/utils/RegXMLLibHelper.java @@ -187,7 +187,7 @@ public MemoryTriplet getTripletFromKLVHeader(KLVPacket.Header header, ByteProvid throw new MXFException(String.format("Essence Descriptors that are larger than %d bytes are not supported", Integer.MAX_VALUE)); } byte[] value = byteProvider.getBytes((int) header.getVSize()); - return new MemoryTriplet(key, value); + return new MemoryTriplet(AUID.fromURN(key.toString()), value); } diff --git a/src/main/java/com/netflix/imflibrary/utils/S3ByteRangeProvider.java b/src/main/java/com/netflix/imflibrary/utils/S3ByteRangeProvider.java new file mode 100644 index 00000000..c2d0f0cd --- /dev/null +++ b/src/main/java/com/netflix/imflibrary/utils/S3ByteRangeProvider.java @@ -0,0 +1,120 @@ +package com.netflix.imflibrary.utils; +import com.amazonaws.AmazonServiceException; +import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3URI; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.S3ClientOptions; +import com.amazonaws.services.s3.model.*; +import com.amazonaws.util.IOUtils; + +import java.io.*; + + +public class S3ByteRangeProvider implements ResourceByteRangeProvider { + private static final AmazonS3 s3Client = new AmazonS3Client(DefaultAWSCredentialsProviderChain.getInstance()); + + private static final int EOF = -1; + private static final int BUFFER_SIZE = 1024; + + private AmazonS3URI s3Uri; + private long fileSize; + + /** + * Constructor for a S3ByteRangeProvider + */ + public S3ByteRangeProvider(FileLocator fileLocator) + { + try { + String awsEndpoint = System.getenv("AWS_S3_ENDPOINT"); + if (awsEndpoint != null && awsEndpoint.length() > 0) { + s3Client.setEndpoint(awsEndpoint); + s3Client.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).build()); + } + + this.s3Uri = new AmazonS3URI(fileLocator.toURI()); + ObjectMetadata metadata = s3Client.getObjectMetadata(this.s3Uri.getBucket(), this.s3Uri.getKey()); + + this.fileSize = metadata.getContentLength(); + } catch (IOException ex) { + throw new Error(ex); + } + } + + /** + * A method that returns the size in bytes of the underlying resource, in this case a File + * @return the size in bytes of the underlying resource, in this case a File + */ + public long getResourceSize() + { + return this.fileSize; + } + + /** + * A method to obtain bytes in the inclusive range [start, endOfFile] as a file + * + * @param rangeStart zero indexed inclusive start offset; ranges from 0 through (resourceSize -1) both included + * @param workingDirectory the working directory where the output file is placed + * @return file containing desired byte range from rangeStart through end of file + * @throws IOException - any I/O related error will be exposed through an IOException + */ + public File getByteRange(long rangeStart, File workingDirectory) throws IOException + { + return this.getByteRange(rangeStart, this.fileSize - 1, workingDirectory); + } + + /** + * A method to obtain bytes in the inclusive range [start, end] as a file + * + * @param rangeStart zero indexed inclusive start offset; range from [0, (resourceSize -1)] inclusive + * @param rangeEnd zero indexed inclusive end offset; range from [0, (resourceSize -1)] inclusive + * @param workingDirectory the working directory where the output file is placed + * @return file containing desired byte range + * @throws IOException - any I/O related error will be exposed through an IOException + */ + public File getByteRange(long rangeStart, long rangeEnd, File workingDirectory) throws IOException + { + try (InputStream input = this.getByteRangeAsStream(rangeStart, rangeEnd)) { + File rangeFile = new File(workingDirectory, "range"); + try (FileOutputStream fos = new FileOutputStream(rangeFile)) { + IOUtils.copy(input, fos); + } + return rangeFile; + } + } + + /** + * This method provides a way to obtain a byte range from the resource in-memory. A limitation of this method is + * that the total size of the byte range request is capped at 0x7fffffff (the maximum value possible for type int + * in java) + * + * @param rangeStart zero indexed inclusive start offset; ranges from 0 through (resourceSize -1) both included + * @param rangeEnd zero indexed inclusive end offset; ranges from 0 through (resourceSize -1) both included + * @return byte[] containing desired byte range + * @throws IOException - any I/O related error will be exposed through an IOException + */ + public byte[] getByteRangeAsBytes(long rangeStart, long rangeEnd) throws IOException + { + //validation of range request guarantees that 0 <= rangeStart <= rangeEnd <= (resourceSize - 1) + ResourceByteRangeProvider.Utilities.validateRangeRequest(this.fileSize, rangeStart, rangeEnd); + if((rangeEnd - rangeStart + 1) > Integer.MAX_VALUE){ + throw new IOException(String.format("Number of bytes requested = %d is greater than %d", (rangeEnd - rangeStart + 1), Integer.MAX_VALUE)); + } + + try (InputStream input = this.getByteRangeAsStream(rangeStart, rangeEnd)) { + return IOUtils.toByteArray(input); + } + } + + public InputStream getByteRangeAsStream(long rangeStart, long rangeEnd) throws IOException { + //validation of range request guarantees that 0 <= rangeStart <= rangeEnd <= (resourceSize - 1) + ResourceByteRangeProvider.Utilities.validateRangeRequest(this.fileSize, rangeStart, rangeEnd); + + GetObjectRequest request = new GetObjectRequest(this.s3Uri.getBucket(), this.s3Uri.getKey()); + request.setRange(rangeStart, rangeEnd); + + S3Object obj = s3Client.getObject(request); + + return obj.getObjectContent(); + } +} \ No newline at end of file diff --git a/src/main/java/com/netflix/imflibrary/utils/S3FileLocator.java b/src/main/java/com/netflix/imflibrary/utils/S3FileLocator.java new file mode 100644 index 00000000..e7096463 --- /dev/null +++ b/src/main/java/com/netflix/imflibrary/utils/S3FileLocator.java @@ -0,0 +1,139 @@ +package com.netflix.imflibrary.utils; + +import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.AmazonS3URI; +import com.amazonaws.services.s3.S3ClientOptions; +import com.amazonaws.services.s3.model.*; + +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; + +public class S3FileLocator implements FileLocator { + private static final AmazonS3 s3Client = new AmazonS3Client(DefaultAWSCredentialsProviderChain.getInstance()); + + private String bucket; + private String key; + private AmazonS3URI s3URI; + private long length = 0; + + public S3FileLocator(String url) { + this.s3URI = new AmazonS3URI(url, true); + this.bucket = this.s3URI.getBucket(); + this.key = this.s3URI.getKey(); + this.setAWSEndpoint(); + } + + public S3FileLocator(URI url) { + this.s3URI = new AmazonS3URI(url); + this.bucket = this.s3URI.getBucket(); + this.key = this.s3URI.getKey(); + this.setAWSEndpoint(); + } + + public S3FileLocator(String bucket, String key) { + this.bucket = bucket; + this.key = key; + this.s3URI = new AmazonS3URI("s3://" + this.bucket + "/" + this.key, true); + this.setAWSEndpoint(); + } + + private void setAWSEndpoint() { + String awsEndpoint = System.getenv("AWS_S3_ENDPOINT"); + if (awsEndpoint != null && awsEndpoint.length() > 0) { + s3Client.setEndpoint(awsEndpoint); + s3Client.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).build()); + } + } + + public static void main(String args[]) throws IOException { + S3FileLocator fileLocator = new S3FileLocator("s3://oz-zl-api-staging-dev/mao/deliverables/chloes-bag-imf-package-mao-base/"); + + System.out.println(fileLocator.isDirectory()); + + for (S3FileLocator fl : fileLocator.listFiles(null)) { + System.out.println(fl.toURI()); + } + } + + public URI toURI() { + return this.s3URI.getURI(); + } + + public String getAbsolutePath() { + return "s3://" + this.bucket + "/" + this.key; + } + + public String getPath() { + return this.getAbsolutePath(); + } + + public long length() { + if (this.length != 0) { + return this.length; + } + + ObjectMetadata metadata = s3Client.getObjectMetadata(this.bucket, this.key); + this.length = metadata.getContentLength(); + return this.length; + } + + public InputStream getInputStream() throws IOException { + S3Object s3Object = s3Client.getObject(this.bucket, this.key); + return s3Object.getObjectContent(); + } + + public ResourceByteRangeProvider getResourceByteRangeProvider() { + return new S3ByteRangeProvider(this); + } + + public String getName() { + String[] parts = this.key.split("/"); + return parts[parts.length - 1]; + } + + public boolean exists() { + return true; + } + + /** + * Tests whether the file denoted by this abstract pathname is a + * directory. + * + * @return true if and only if the file denoted by this + * abstract pathname exists and is a directory; + * false otherwise + */ + @Override + public boolean isDirectory() { + return this.key.charAt(this.key.length() - 1) == '/'; + } + + /** + * Returns the top level keys in a s3 folder + * @return + */ + public S3FileLocator[] listFiles(FilenameFilter filenameFilter) { + ListObjectsV2Request req = new ListObjectsV2Request().withBucketName(this.bucket) + .withPrefix(this.key) + .withDelimiter("/"); + + ListObjectsV2Result result = s3Client.listObjectsV2(req); + ArrayList fileLocators = new ArrayList(); + for (S3ObjectSummary objectSummary : result.getObjectSummaries()) { + S3FileLocator fl = new S3FileLocator(objectSummary.getBucketName(), objectSummary.getKey()); + if (filenameFilter == null || filenameFilter.accept(null, fl.getName())) { + fileLocators.add(fl); + } + } + + return fileLocators.toArray(new S3FileLocator[0]); + } + + +} diff --git a/src/main/java/com/netflix/imflibrary/writerTools/IMPBuilder.java b/src/main/java/com/netflix/imflibrary/writerTools/IMPBuilder.java index 441bd09f..a05e8267 100755 --- a/src/main/java/com/netflix/imflibrary/writerTools/IMPBuilder.java +++ b/src/main/java/com/netflix/imflibrary/writerTools/IMPBuilder.java @@ -14,14 +14,7 @@ import com.netflix.imflibrary.st2067_2.IMFEssenceComponentVirtualTrack; import com.netflix.imflibrary.st2067_2.IMFEssenceDescriptorBaseType; import com.netflix.imflibrary.st2067_2.IMFTrackFileResourceType; -import com.netflix.imflibrary.utils.ByteArrayByteRangeProvider; -import com.netflix.imflibrary.utils.ByteArrayDataProvider; -import com.netflix.imflibrary.utils.ByteProvider; -import com.netflix.imflibrary.utils.ErrorLogger; -import com.netflix.imflibrary.utils.RegXMLLibHelper; -import com.netflix.imflibrary.utils.ResourceByteRangeProvider; -import com.netflix.imflibrary.utils.UUIDHelper; -import com.netflix.imflibrary.utils.Utilities; +import com.netflix.imflibrary.utils.*; import com.netflix.imflibrary.writerTools.utils.IMFUUIDGenerator; import com.netflix.imflibrary.writerTools.utils.IMFUtils; import com.sandflow.smpte.klv.Triplet; @@ -191,7 +184,7 @@ public static List buildIMP_2013(@Nonnull String annota } numErrors = (imfErrorLogger.getNumberOfErrors() > 0) ? imfErrorLogger.getNumberOfErrors()-1 : 0; - File cplFile = new File(workingDirectory + File.separator + compositionPlaylistBuilder_2013.getCPLFileName()); + FileLocator cplFile = FileLocator.fromLocation(workingDirectory + File.separator + compositionPlaylistBuilder_2013.getCPLFileName()); if(!cplFile.exists()){ throw new IMFAuthoringException(String.format("CompositionPlaylist file does not exist in the working directory %s, cannot generate the rest of the documents", workingDirectory.getAbsolutePath())); } @@ -430,7 +423,7 @@ public static List buildIMP_2016(@Nonnull String annota } numErrors = (imfErrorLogger.getNumberOfErrors() > 0) ? imfErrorLogger.getNumberOfErrors()-1 : 0; - File cplFile = new File(workingDirectory + File.separator + compositionPlaylistBuilder_2016.getCPLFileName()); + FileLocator cplFile = FileLocator.fromLocation(workingDirectory + File.separator + compositionPlaylistBuilder_2016.getCPLFileName()); if(!cplFile.exists()){ throw new IMFAuthoringException(String.format("CompositionPlaylist file does not exist in the working directory %s, cannot generate the rest of the documents", workingDirectory.getAbsolutePath())); } diff --git a/src/main/java/com/netflix/imflibrary/writerTools/utils/IMFUtils.java b/src/main/java/com/netflix/imflibrary/writerTools/utils/IMFUtils.java index 0e2bbff0..70e41294 100644 --- a/src/main/java/com/netflix/imflibrary/writerTools/utils/IMFUtils.java +++ b/src/main/java/com/netflix/imflibrary/writerTools/utils/IMFUtils.java @@ -20,6 +20,7 @@ import com.netflix.imflibrary.IMFErrorLoggerImpl; import com.netflix.imflibrary.exceptions.IMFException; +import com.netflix.imflibrary.utils.FileLocator; import com.netflix.imflibrary.utils.ResourceByteRangeProvider; import org.smpte_ra.schemas.st2067_2_2013.BaseResourceType; import org.smpte_ra.schemas.st2067_2_2013.CompositionPlaylistType; @@ -30,11 +31,7 @@ import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; +import java.io.*; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; @@ -92,14 +89,14 @@ public static String generateTimecodeStartAddress(){ /** * A method that generates a SHA-1 hash of the file and Base64 encode the result. * - * @param file - the file whose SHA-1 hash is to be generated + * @param fileLocator - the file locator whose SHA-1 hash is to be generated * @return a byte[] representing the generated base64 encoded hash of the file * @throws IOException - any I/O related error will be exposed through an IOException */ - public static byte[] generateSHA1HashAndBase64Encode(File file) throws IOException { + public static byte[] generateSHA1HashAndBase64Encode(FileLocator fileLocator) throws IOException { try { MessageDigest messageDigest = MessageDigest.getInstance("SHA1"); - FileInputStream fileInputStream = new FileInputStream(file); + InputStream fileInputStream = fileLocator.getInputStream(); byte[] bytes = new byte[1024]; int bytesRead = 0; while((bytesRead = fileInputStream.read(bytes)) != -1){ diff --git a/src/main/resources/reference-registers/Elements.xml b/src/main/resources/reference-registers/Elements.xml index 2c77aea9..ce57d247 100755 --- a/src/main/resources/reference-registers/Elements.xml +++ b/src/main/resources/reference-registers/Elements.xml @@ -1,46 +1,18 @@ - + + + + + + + - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + + @@ -58,6 +30,7 @@ NODE ELEMENTS Register of individual Metadata Elements + SMPTE ST 335 false @@ -13790,6 +13763,299 @@ UnknownContext urn:smpte:ul:060e2b34.01040101.01040100.00000000 + + Elements + http://www.smpte-ra.org/reg/335/2012 + VC5Parameters +
    urn:smpte:ul:060e2b34.0101010e.04010608.00000000
+ NODE + VC-5 Parameters + VC-5 Parameters + SMPTE ST 2073-10 + false +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + VC5AlphaSampling +
    urn:smpte:ul:060e2b34.0101010e.04010608.01000000
+ LEAF + VC-5 Alpha Sampling + VC-5 AlphaSampling codec state parameter defined in SMPTE ST 2073-4 + SMPTE ST 2073-10 + false + UnknownContext + urn:smpte:ul:060e2b34.01040101.01010200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + VC5BayerComponentPattern +
    urn:smpte:ul:060e2b34.0101010e.04010608.02000000
+ LEAF + VC-5 Bayer Component Pattern + Bayer component order and bit depth of each component (See SMPTE ST 377-1) + SMPTE ST 2073-10 + false + UnknownContext + urn:smpte:ul:060e2b34.01040101.04020100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + VC5BayerComponentBlackLevel +
    urn:smpte:ul:060e2b34.0101010e.04010608.03000000
+ LEAF + VC-5 Bayer Component Black Level + Value of each Bayer component that corresponds to black + SMPTE ST 2073-10 + false + UnknownContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + VC5BayerComponentWhiteLevel +
    urn:smpte:ul:060e2b34.0101010e.04010608.04000000
+ LEAF + VC-5 Bayer Component White Level + Value of each Bayer component that corresponds to the white clipping point + SMPTE ST 2073-10 + false + UnknownContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetFrameParameters +
    urn:smpte:ul:060e2b34.0101010e.04010609.00000000
+ NODE + Target Frame Parameters + Information about Target Frames + false +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetFrameAncillaryResourceID +
    urn:smpte:ul:060e2b34.0101010e.04010609.01000000
+ LEAF + Target Frame Ancillary ResourceID + UUID value that identifies the ancillary resource + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01030300.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + MediaType +
    urn:smpte:ul:060e2b34.0101010e.04010609.02000000
+ LEAF + Media Type + Specifies the Media Type as defined by IETF + MXF + RFC 2045 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetFrameIndex +
    urn:smpte:ul:060e2b34.0101010e.04010609.03000000
+ LEAF + Target Frame Index + Specifies the offset of the corresponding frame in the image essence + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010400.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetFrameTransferCharacteristic +
    urn:smpte:ul:060e2b34.0101010e.04010609.04000000
+ LEAF + Target Frame Transfer Characteristic + Specifies the non-linear relationship between linear scene light levels and amplitude-compressed video signal levels + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.02020102.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetFrameColorPrimaries +
    urn:smpte:ul:060e2b34.0101010e.04010609.05000000
+ LEAF + Target Frame Color Primaries + The set of color primaries used + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.02020105.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetFrameComponentMaxRef +
    urn:smpte:ul:060e2b34.0101010e.04010609.06000000
+ LEAF + Target Frame Component Max Ref + Maximum value for RGB components, e.g. 60160 or 65535 (16 bits) + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetFrameComponentMinRef +
    urn:smpte:ul:060e2b34.0101010e.04010609.07000000
+ LEAF + Target Frame Component Min Ref + Minimum value for RGB components, e.g. 0 or 4096 (16 bits) + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetFrameEssenceStreamID +
    urn:smpte:ul:060e2b34.0101010e.04010609.08000000
+ LEAF + Target Frame Essence StreamID + Essence (or its container) stream ID + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ACESPictureSubDescriptorInstanceID +
    urn:smpte:ul:060e2b34.0101010e.04010609.09000000
+ LEAF + ACES Picture SubDescriptor Instance ID + Specifies the Instance ID of an ACES Picture Essence SubDescriptor + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01030300.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetFrameViewingEnvironment +
    urn:smpte:ul:060e2b34.0101010e.04010609.0a000000
+ LEAF + Target Frame Viewing Environment + Specifies a Viewing Environment for a Target Frame + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.02020108.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ACESCodingParameters +
    urn:smpte:ul:060e2b34.0101010e.0401060a.00000000
+ NODE + ACES Coding Parameters + Information about ACES picture coding + false +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ACESAuthoringInformation +
    urn:smpte:ul:060e2b34.0101010e.0401060a.01000000
+ LEAF + ACES Authoring Information + Human readable information on the system used to author the ACES image essence contained in the track file + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ACESMasteringDisplayPrimaries +
    urn:smpte:ul:060e2b34.0101010e.0401060a.02000000
+ LEAF + ACES Mastering Display Primaries + Display Primaries metadata as specified in ST 2086 + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020a00.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ACESMasteringDisplayWhitePointChromaticity +
    urn:smpte:ul:060e2b34.0101010e.0401060a.03000000
+ LEAF + ACES Mastering Display White Point Chromaticity + Chromaticity of White Point metadata as specified in ST 2086 + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010c00.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ACESMasteringDisplayMaximumLuminance +
    urn:smpte:ul:060e2b34.0101010e.0401060a.04000000
+ LEAF + ACES Mastering Display Maximum Luminance + Maximum Display Mastering Luminance metadata as specified in ST 2086 + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ACESMasteringDisplayMinimumLuminance +
    urn:smpte:ul:060e2b34.0101010e.0401060a.05000000
+ LEAF + ACES Mastering Display Minimum Luminance + Minimum Display Mastering Luminance metadata as specified in ST 2086 + MXF + SMPTE ST 2067-50 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
Elements http://www.smpte-ra.org/reg/335/2012 @@ -14742,6 +15008,46 @@ urn:smpte:ul:060e2b34.01040101.01010300.00000000 4 bytes + + Elements + http://www.smpte-ra.org/reg/335/2012 + AACChannelConfiguration +
    urn:smpte:ul:060e2b34.0101010e.04020403.01030000
+ LEAF + AAC Channel Configuration + Low order 4 bits of Channel Configuration. Upper 4 bits are zeros + SMPTE ST 381-4 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + AACSamplingFrequency +
    urn:smpte:ul:060e2b34.0101010e.04020403.01040000
+ LEAF + AAC Sampling Frequency + Low order 4 bits of Sampling Frequency Index. Upper 4 bits are zeros + SMPTE ST 381-4 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + MPEGAudioChannelAssignment +
    urn:smpte:ul:060e2b34.0101010e.04020403.01050000
+ LEAF + MPEG Audio Channel Assignment + UL enumerating the channel assignment in use + SMPTE ST 381-2 + false + UnknownContext + urn:smpte:ul:060e2b34.01040101.01030100.00000000 + 16 bytes +
Elements http://www.smpte-ra.org/reg/335/2012 @@ -20045,6 +20351,1026 @@ Information about editing user notes false + + Elements + http://www.smpte-ra.org/reg/335/2012 + ColorTransformInformation +
    urn:smpte:ul:060e2b34.0101010e.05310000.00000000
+ NODE + Color Transform Information + Color Transform Information + SMPTE ST 2094-2 + false +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTEssenceItems +
    urn:smpte:ul:060e2b34.0101010e.05310100.00000000
+ NODE + DMCVT Essence Items + DMCVT Essence Items + SMPTE ST 2094-2 + false +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ApplicationIdentifier +
    urn:smpte:ul:060e2b34.0101010e.05310101.00000000
+ LEAF + Application Identifier + Identifying an application and its defining document in the SMPTE ST 2094 suite + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ApplicationVersionNumber +
    urn:smpte:ul:060e2b34.0101010e.05310102.00000000
+ LEAF + Application Version Number + The Application Version of the identified SMPTE ST 2094 application + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + BackwardsVersion +
    urn:smpte:ul:060e2b34.0101010e.05310103.00000000
+ LEAF + Backwards Version + The lowest Application Version for which this metadata set is valid + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TimeIntervalStart +
    urn:smpte:ul:060e2b34.0101010e.05310104.00000000
+ LEAF + Time Interval Start + Start point of the portion of image essence for which the metadata set is specified, as an index + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TimeIntervalDuration +
    urn:smpte:ul:060e2b34.0101010e.05310105.00000000
+ LEAF + Time Interval Duration + Duration of the portion of image essence for which the metadata set is specified, as a count of index positions + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + UpperLeftCorner +
    urn:smpte:ul:060e2b34.0101010e.05310106.00000000
+ LEAF + Upper Left Corner + Coordinate of the top-left pixel of the Processing Window + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04011200.00000000 + 12 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + LowerRightCorner +
    urn:smpte:ul:060e2b34.0101010e.05310107.00000000
+ LEAF + Lower Right Corner + Coordinate of the bottom-right pixel of the Processing Window + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04011200.00000000 + 12 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + WindowNumber +
    urn:smpte:ul:060e2b34.0101010e.05310108.00000000
+ LEAF + Window Number + Identifier of the Processing Window + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetedSystemDisplayPrimaries +
    urn:smpte:ul:060e2b34.0101010e.05310109.00000000
+ LEAF + Targeted System Display Primaries + xy chromaticity coordinates of the three primaries of the targeted system display + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 + 56 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetedSystemDisplayWhitePointChromaticity +
    urn:smpte:ul:060e2b34.0101010e.0531010a.00000000
+ LEAF + Targeted System Display White Point Chromaticity + xy chromaticity coordinate of the targeted system display's white point + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 + 24 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetedSystemDisplayMaximumLuminance +
    urn:smpte:ul:060e2b34.0101010e.0531010b.00000000
+ LEAF + Targeted System Display Maximum Luminance + Maximum luminance of the targeted system's display + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetedSystemDisplayMinimumLuminance +
    urn:smpte:ul:060e2b34.0101010e.0531010c.00000000
+ LEAF + Targeted System Display Minimum Luminance + Minimum luminance of the targeted system's display + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + MinimumPqencodedMaxrgb +
    urn:smpte:ul:060e2b34.0101010e.0531010d.00000000
+ LEAF + Minimum PQ-encoded maxRGB + The lowest PQ-encoded maxRGB value of the reduced pixel set + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + AveragePqencodedMaxrgb +
    urn:smpte:ul:060e2b34.0101010e.0531010e.00000000
+ LEAF + Average PQ-encoded maxRGB + The average of the PQ-encoded maxRGB values of the reduced pixel set + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + MaximumPqencodedMaxrgb +
    urn:smpte:ul:060e2b34.0101010e.0531010f.00000000
+ LEAF + Maximum PQ-encoded maxRGB + The highest PQ-encoded maxRGB value of the reduced pixel set + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + MinimumPqencodedMaxrgbOffset +
    urn:smpte:ul:060e2b34.0101010e.05310110.00000000
+ LEAF + Minimum PQ-encoded maxRGB Offset + Offset to be added to Minimum PQ-encoded maxRGB + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + AveragePqencodedMaxrgbOffset +
    urn:smpte:ul:060e2b34.0101010e.05310111.00000000
+ LEAF + Average PQ-encoded maxRGB Offset + Offset to be added to Average PQ-encoded maxRGB + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + MaximumPqencodedMaxrgbOffset +
    urn:smpte:ul:060e2b34.0101010e.05310112.00000000
+ LEAF + Maximum PQ-encoded maxRGB Offset + Offset to be added to Maximum PQ-encoded maxRGB + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ToneMappingOffset +
    urn:smpte:ul:060e2b34.0101010e.05310113.00000000
+ LEAF + Tone Mapping Offset + Tone Mapping Offset + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ToneMappingGain +
    urn:smpte:ul:060e2b34.0101010e.05310114.00000000
+ LEAF + Tone Mapping Gain + Tone Mapping Gain + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ToneMappingGamma +
    urn:smpte:ul:060e2b34.0101010e.05310115.00000000
+ LEAF + Tone Mapping Gamma + Tone Mapping Gamma + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ChromaCompensationWeight +
    urn:smpte:ul:060e2b34.0101010e.05310116.00000000
+ LEAF + Chroma Compensation Weight + Amount of chroma adjustment + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + SaturationGain +
    urn:smpte:ul:060e2b34.0101010e.05310117.00000000
+ LEAF + Saturation Gain + Amount of saturation adjustment + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ToneDetailFactor +
    urn:smpte:ul:060e2b34.0101010e.05310118.00000000
+ LEAF + Tone Detail Factor + Contribution of the detail management function + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + LuminanceLowerBound +
    urn:smpte:ul:060e2b34.0101010e.05310119.00000000
+ LEAF + Luminance Lower Bound + Encoding of a lower bound of luminance + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + LuminanceUpperBound +
    urn:smpte:ul:060e2b34.0101010e.0531011a.00000000
+ LEAF + Luminance Upper Bound + Encoding of an upper bound of luminance + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + LuminanceRangeSelector +
    urn:smpte:ul:060e2b34.0101010e.0531011b.00000000
+ LEAF + Luminance Range Selector + True indicates inner luminance range + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01040100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ChromaticityDiskCenter +
    urn:smpte:ul:060e2b34.0101010e.0531011c.00000000
+ LEAF + Chromaticity Disk Center + Center of the Chromaticity Disk + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 + 24 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ChromaticityDiskRadius +
    urn:smpte:ul:060e2b34.0101010e.0531011d.00000000
+ LEAF + Chromaticity Disk Radius + Radius of the Chromaticity Disk + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ChromaticityAreaSelector +
    urn:smpte:ul:060e2b34.0101010e.0531011e.00000000
+ LEAF + Chromaticity Area Selector + True indicates the area of the Chromaticity Disk + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01040100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + SaturationGainFunction +
    urn:smpte:ul:060e2b34.0101010e.0531011f.00000000
+ LEAF + Saturation Gain Function + Sampled function, mapping a luminance based input value to a saturation scaling factor + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ToneMappingInputSignalWeights +
    urn:smpte:ul:060e2b34.0101010e.05310120.00000000
+ LEAF + Tone Mapping Input Signal Weights + Weights of R, G, B, and Y components + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 + 40 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ToneMappingInputSignalBlackLevelOffset +
    urn:smpte:ul:060e2b34.0101010e.05310121.00000000
+ LEAF + Tone Mapping Input Signal Black Level Offset + Used to calculate the gain of the signal as a first step in the Tone Mapping process + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ToneMappingInputSignalWhiteLevelOffset +
    urn:smpte:ul:060e2b34.0101010e.05310122.00000000
+ LEAF + Tone Mapping Input Signal White Level Offset + Used to calculate the gain of the signal as a second step in the Tone Mapping process + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ShadowGainControl +
    urn:smpte:ul:060e2b34.0101010e.05310123.00000000
+ LEAF + Shadow Gain Control + Control for the steepness of the curve in its shadow (darker) region + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + HighlightGainControl +
    urn:smpte:ul:060e2b34.0101010e.05310124.00000000
+ LEAF + Highlight Gain Control + Control for the steepness of the curve in its highlight (brighter) region + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + MidToneWidthAdjustmentFactor +
    urn:smpte:ul:060e2b34.0101010e.05310125.00000000
+ LEAF + Mid-Tone Width Adjustment Factor + Control for the width of the mid-tone region of the curve + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ToneMappingOutputFineTuningFunction +
    urn:smpte:ul:060e2b34.0101010e.05310126.00000000
+ LEAF + Tone Mapping Output Fine Tuning Function + Sampled function, for tone mapping + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetedSystemDisplaySignalFormat +
    urn:smpte:ul:060e2b34.0101010e.05310127.00000000
+ LEAF + Targeted System Display Signal Format + Enumerator of the signal format of the targeted system display + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + MetadataColorCodingWorkspace +
    urn:smpte:ul:060e2b34.0101010e.05310128.00000000
+ LEAF + Metadata Color Coding Workspace + Enumerator of the color components and quantization range + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + PreMatrixToneMapping1 +
    urn:smpte:ul:060e2b34.0101010e.05310129.00000000
+ LEAF + Pre-Matrix Tone Mapping 1 + Sampled function for first input color component, in units of 1/16 383 + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04011200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + PreMatrixToneMapping2 +
    urn:smpte:ul:060e2b34.0101010e.0531012a.00000000
+ LEAF + Pre-Matrix Tone Mapping 2 + Sampled function for second input color component, in units of 1/16 383 + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04011200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + PreMatrixToneMapping3 +
    urn:smpte:ul:060e2b34.0101010e.0531012b.00000000
+ LEAF + Pre-Matrix Tone Mapping 3 + Sampled function for third input color component, in units of 1/16 383 + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04011200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ColorRemappingMatrix +
    urn:smpte:ul:060e2b34.0101010e.0531012c.00000000
+ LEAF + Color Remapping Matrix + A 3x3 matrix between tone mapping stages + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 + 80 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + PostMatrixToneMapping1 +
    urn:smpte:ul:060e2b34.0101010e.0531012d.00000000
+ LEAF + Post-Matrix Tone Mapping 1 + Sampled function for first post matrix color component, in units of 1/16 383 + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04011200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + PostMatrixToneMapping2 +
    urn:smpte:ul:060e2b34.0101010e.0531012e.00000000
+ LEAF + Post-Matrix Tone Mapping 2 + Sampled function for second post matrix color component, in units of 1/16 383 + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04011200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + PostMatrixToneMapping3 +
    urn:smpte:ul:060e2b34.0101010e.0531012f.00000000
+ LEAF + Post-Matrix Tone Mapping 3 + Sampled function for third post matrix color component, in units of 1/16 383 + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04011200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + CenterOfEllipse +
    urn:smpte:ul:060e2b34.0101010e.05310130.00000000
+ LEAF + Center Of Ellipse + Center position of the ellipses + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04011200.00000000 + 12 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + RotationAngle +
    urn:smpte:ul:060e2b34.0101010e.05310131.00000000
+ LEAF + Rotation Angle + Clockwise rotation angle with respect to the positive direction of the x-axis of the ellipses + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + SemiMajorAxisInternalEllipse +
    urn:smpte:ul:060e2b34.0101010e.05310132.00000000
+ LEAF + Semi-Major Axis Internal Ellipse + Semi-major axis value of the internal ellipse + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + SemiMajorAxisExternalEllipse +
    urn:smpte:ul:060e2b34.0101010e.05310133.00000000
+ LEAF + Semi-Major Axis External Ellipse + Semi-major axis value of the external ellipse + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + SemiMinorAxisExternalEllipse +
    urn:smpte:ul:060e2b34.0101010e.05310134.00000000
+ LEAF + Semi-Minor Axis External Ellipse + Semi-minor axis value of the external ellipse + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + OverlapProcessOption +
    urn:smpte:ul:060e2b34.0101010e.05310135.00000000
+ LEAF + Overlap Process Option + Enumerator that indicates one of the two methods of combining rendered pixels + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + TargetedSystemDisplayActualPeakLuminance +
    urn:smpte:ul:060e2b34.0101010e.05310136.00000000
+ LEAF + Targeted System Display Actual Peak Luminance + Two-input sampled function representing the normalized actual peak luminance of the targeted system display, in units of 1/15. The four most significant bits in each UInt8 are zero. + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + RowsInTargetedSystemDisplayActualPeakLuminance +
    urn:smpte:ul:060e2b34.0101010e.05310137.00000000
+ LEAF + Rows In Targeted System Display Actual Peak Luminance + Number of rows (M) in the Targeted System Display Actual Peak Luminance array + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + MasteringDisplayActualPeakLuminance +
    urn:smpte:ul:060e2b34.0101010e.05310138.00000000
+ LEAF + Mastering Display Actual Peak Luminance + Two-input sampled function representing the normalized actual peak luminance of the mastering display, in units of 1/15. The four most significant bits in each UInt8 are zero. + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + RowsInMasteringDisplayActualPeakLuminance +
    urn:smpte:ul:060e2b34.0101010e.05310139.00000000
+ LEAF + Rows In Mastering Display Actual Peak Luminance + Number of rows (M) in the Mastering Display Actual Peak Luminance array + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + MaxSCL +
    urn:smpte:ul:060e2b34.0101010e.0531013a.00000000
+ LEAF + Maximum Scene Color Component Levels + Maximum of each component of linearized RGB values + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 + 32 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + AverageMaxRGB +
    urn:smpte:ul:060e2b34.0101010e.0531013b.00000000
+ LEAF + Average MaxRGB + Average of linearized maxRGB values + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DistributionMaxRGBPercentages +
    urn:smpte:ul:060e2b34.0101010e.0531013c.00000000
+ LEAF + Distribution MaxRGB Percentages + First vector of DistributionMaxRGB with Integer percentage values + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DistributionMaxRGBPercentiles +
    urn:smpte:ul:060e2b34.0101010e.0531013d.00000000
+ LEAF + Distribution MaxRGB Percentiles + Second vector of DistributionMaxRGB with Linearized maxRGB value at given percentile + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + FractionBrightPixels +
    urn:smpte:ul:060e2b34.0101010e.0531013e.00000000
+ LEAF + Fraction Bright Pixels + Fraction of pixels that contains the brightest pixel + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + KneePoint +
    urn:smpte:ul:060e2b34.0101010e.0531013f.00000000
+ LEAF + Knee Point + Separation point (K_S,K_F) between the linear part and the curved part of the tone mapping function, ordered K_S,K_F + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 + 24 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + BezierCurveAnchors +
    urn:smpte:ul:060e2b34.0101010e.05310140.00000000
+ LEAF + Bezier Curve Anchors + Intermediate anchor parameters, ordered P1 to PN-1 + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + ColorSaturationWeight +
    urn:smpte:ul:060e2b34.0101010e.05310141.00000000
+ LEAF + Color Saturation Weight + Adjusts the color saturation gain + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTSubDescriptorItems +
    urn:smpte:ul:060e2b34.0101010e.05310200.00000000
+ NODE + DMCVT SubDescriptor Items + DMCVT SubDescriptor Items + SMPTE ST 2094-2 + false +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTApplicationIdentifier +
    urn:smpte:ul:060e2b34.0101010e.05310201.00000000
+ LEAF + DMCVT Application Identifier + Identifying an application and its defining document in the SMPTE ST 2094 suite + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTApplicationVersionNumber +
    urn:smpte:ul:060e2b34.0101010e.05310202.00000000
+ LEAF + DMCVT Application Version Number + The Application Version of the identified SMPTE ST 2094 application + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTBackwardsVersion +
    urn:smpte:ul:060e2b34.0101010e.05310203.00000000
+ LEAF + DMCVT Backwards Version + The lowest Application Version for which this metadata set is valid + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTTargetedSystemDisplayPrimaries +
    urn:smpte:ul:060e2b34.0101010e.05310209.00000000
+ LEAF + DMCVT Targeted System Display Primaries + xy chromaticity coordinates of the three primaries of the targeted system display + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 + 56 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTTargetedSystemDisplayWhitePointChromaticity +
    urn:smpte:ul:060e2b34.0101010e.0531020a.00000000
+ LEAF + DMCVT Targeted System Display White Point Chromaticity + xy chromaticity coordinate of the targeted system display's white point + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04020200.00000000 + 24 bytes +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTTargetedSystemDisplayMaximumLuminance +
    urn:smpte:ul:060e2b34.0101010e.0531020b.00000000
+ LEAF + DMCVT Targeted System Display Maximum Luminance + Maximum luminance of the targeted system's display + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTTargetedSystemDisplayMinimumLuminance +
    urn:smpte:ul:060e2b34.0101010e.0531020c.00000000
+ LEAF + DMCVT Targeted System Display Minimum Luminance + Minimum luminance of the targeted system's display + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.03010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTTargetedSystemDisplaySignalFormat +
    urn:smpte:ul:060e2b34.0101010e.05310227.00000000
+ LEAF + DMCVT Targeted System Display Signal Format + Enumerator of the signal format of the targeted system display + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTTargetedSystemDisplayActualPeakLuminance +
    urn:smpte:ul:060e2b34.0101010e.05310236.00000000
+ LEAF + DMCVT Targeted System Display Actual Peak Luminance + Two-input sampled function representing the normalized actual peak luminance of the targeted system display, in units of 1/15. The four most significant bits in each UInt8 are zero. + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.04010100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012 + DMCVTRowsInTargetedSystemDisplayActualPeakLuminance +
    urn:smpte:ul:060e2b34.0101010e.05310237.00000000
+ LEAF + DMCVT Rows In Targeted System Display Actual Peak Luminance + Number of rows (M) in the DMCVT Targeted System Display Actual Peak Luminance array + SMPTE ST 2094-2 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010100.00000000 +
Elements http://www.smpte-ra.org/reg/335/2012 @@ -28413,6 +29739,17 @@ Application Specifications Version 1 false + + Elements + http://www.smpte-ra.org/reg/335/2012/13/1/amwa/as07 + AS_07 +
    urn:smpte:ul:060e2b34.01010101.0d010701.07000000
+ NODE + AS_07 + AS-07 Archiving and Preservation Format + AMWA + false +
Elements http://www.smpte-ra.org/reg/335/2012/13/1/amwa/as10 @@ -43716,6 +45053,576 @@ UnknownContext urn:smpte:ul:060e2b34.01040101.01100200.00000000 + + Elements + http://www.loc.gov/avconservation + LOC_Elements +
    urn:smpte:ul:060e2b34.0101010e.0d0e0000.00000000
+ NODE + LOC_Elements + Metadata registered by the Library of Congress for public use + DMS_AS_07 + false +
+ + Elements + http://www.loc.gov/avconservation + LOC_ApplicationSpecifications_Elements +
    urn:smpte:ul:060e2b34.01010101.0d0e0100.00000000
+ NODE + LOC_ApplicationSpecifications_Elements + Library of Congress Application Specifications Elements + DMS_AS_07 + false +
+ + Elements + http://www.loc.gov/avconservation + LOC_ApplicationSpecifications_Elements_V1 +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.00000000
+ NODE + LOC_ApplicationSpecifications_Elements_V1 + Library of Congress Application Specifications Elements V1 + DMS_AS_07 + false +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Elements +
    urn:smpte:ul:060e2b34.0101010e.0d0e0101.07000000
+ NODE + AS_07_Elements + AS-07 Archiving and Preservation Format Elements + DMS_AS_07 + false +
+ + Elements + http://www.loc.gov/avconservation + AS_07_DMS_Elements +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010000
+ NODE + AS_07_DMS_Elements + AS-07 Archiving and Preservation Format Descriptive Metadata Elements + DMS_AS_07 + false +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_ShimName +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010101
+ LEAF + AS_07_Core_DMS_ShimName + Controlled vocabulary string value indicating the AS-07 Shim Name, e.g., Derived-from-video-serial-interface + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_Identifiers +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010102
+ LEAF + AS_07_Core_DMS_Identifiers + Unordered list of strong references to all AS_07_DMS_Identifier sets. At least one AS_07_DMS_Identifier Objects set is required with the IdentifierRole = Main. Other AS_07_DMSIdentifierObjects sets are optional. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.0d0e0101.07010301 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_ResponsibleOrganizationName +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010103
+ LEAF + AS_07_Core_DMS_ResponsibleOrganizationName + The main name for the entity responsible for the creation, maintenance, preservation of this digital item + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_ResponsibleOrganizationCode +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010105
+ LEAF + AS_07_Core_DMS_ResponsibleOrganizationCode + A familiar abbreviation of entity name. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_NatureOfOrganization +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010106
+ LEAF + AS_07_Core_DMS_NatureOfOrganization + The nature of an organization (e.g., limited company, government department, etc.) + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_WorkingTitle +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010107
+ LEAF + AS_07_Core_DMS_WorkingTitle + Free text: Best known or working title of the production or production component + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_SecondaryTitle +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010108
+ LEAF + AS_07_Core_DMS_SecondaryTitle + Free text Secondary title of the production or production component + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_PictureFormat +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010109
+ LEAF + AS_07_Core_DMS_PictureFormat + The signal standard (frame resolution and aspect ratio) of the encoded file. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_IntendedAFD +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010a
+ LEAF + AS_07_Core_DMS_IntendedAFD + String value indicating the intended display format for the program, per SMPTE 2016-1 table 1 a3 a2 a1 a0 with optional informative appended text e.g. 1001 Pillarbox, 0100 Letterbox, 1000 FullHD + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_Captions +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010b
+ LEAF + AS_07_Core_DMS_Captions + Y/N value to indicate if captions are present in the encoded file + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_AudioTrackPrimaryLanguage +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010c
+ LEAF + AS_07_Core_DMS_AudioTrackPrimaryLanguage + The primary language in audio track by codes as defined by RFC5646. Use only when language is known. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_AudioTrackSecondaryLanguage +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010d
+ LEAF + AS_07_Core_DMS_AudioTrackSecondaryLanguage + The secondary language in audio track by codes as defined by RFC5646. If multiple secondary language are present the RFC tags in white space separated list. Use only when secondary languages are present and language is known + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_AudioTrackLayout +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010e
+ LEAF + AS_07_Core_DMS_AudioTrackLayout + Appropriate values in AS-07 Appendix E + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01030100.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_AudioTrackLayoutComment +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010f
+ LEAF + AS_07_Core_DMS_AudioTrackLayoutComment + Free text comment to augment AS_07_Core_DMS_AudioTrackLayout. This is for track tagging information and is not to be used for descriptive essays. Robust descriptive data can be held in Supplemental Metadata in GSPs. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_Devices +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010110
+ LEAF + AS_07_Core_DMS_Devices + strong references to all AS_07_Core_DMS_Device objects used in this file + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.0d0e0101.07010201 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_DeviceType +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010202
+ LEAF + AS_07_Core_DMS_DeviceType + the kind of device used to capture or create the content (as either a commonly known name or as a locally defined name; e.g., Radio-camera) + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_DeviceManufacturer +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010203
+ LEAF + AS_07_Core_DMS_DeviceManufacturer + The manufacturer or maker of the device + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_DeviceModel +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010204
+ LEAF + AS_07_Core_DMS_DeviceModel + Identifies the device model used in capturing or generating the essence. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100600.00000000 + 32 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_DeviceSerialNumber +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010205
+ LEAF + AS_07_Core_DMS_DeviceSerialNumber + Alphanumeric serial number identifying the individual device + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100600.00000000 + 32 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Core_DMS_DeviceUsageDescription +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010206
+ LEAF + AS_07_Core_DMS_DeviceUsageDescription + Free text description of the function or use of the device in the production of a specific content item + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_DMS_IdentifierValue +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010302
+ LEAF + AS_07_DMS_IdentifierValue + Identifier Value + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_DMS_IdentifierRole +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010303
+ LEAF + AS_07_DMS_IdentifierRole + Controlled vocabulary string value identifying the role of identifier + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.0d0e0101.07010400 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_DMS_IdentifierType +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010304
+ LEAF + AS_07_DMS_IdentifierType + Controlled vocabulary string value identifying the type of identifier + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.0d0e0101.07010500 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_DMS_IdentifierComment +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010305
+ LEAF + AS_07_DMS_IdentifierComment + Free text comment pertaining to the additional identifier + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_GSP_DMS_Identifiers +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010401
+ LEAF + AS_07_GSP_DMS_Identifiers + Unordered list of strong references to all AS_07_DMS_Identifier sets. At least one AS_07_DMS_Identifier Objects set is required with the IdentifierRole = Main. Other AS_07_DMSIdentifierObjects sets are optional. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.0d0e0101.07010301 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_GSP_DMS_MIMEMediaType +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010402
+ LEAF + AS_07_GSP_DMS_MIMEMediaType + Text string that defines the data type of the text. A value shall be selected from the values listed at the following web site. http://www.iana.org/assignments/media-types/text/ + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_GSP_DMS_DataDescription +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010403
+ LEAF + AS_07_GSP_DMS_DataDescription + Controlled vocabulary string identifying the role of the data within the AS-07 file + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.0d0e0101.07010600 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_GSP_DMS_Note +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010404
+ LEAF + AS_07_GSP_DMS_Note + Free text note pertaining to the GSP data payload. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_GSP_Elements +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07020000
+ NODE + AS_07_GSP_Elements + AS-07 Archiving and Preservation Format Generic Stream Partition Elements + DMS_AS_07 + false +
+ + Elements + http://www.loc.gov/avconservation + AS_07_GSP_TD_DMS_PrimaryRFC5646LanguageCode +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07020301
+ LEAF + AS_07_GSP_TD_DMS_PrimaryRFC5646LanguageCode + Identifies the primary language in Timed Text by codes defined by RFC5646 + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_GSP_TD_DMS_SecondaryRFC5646LanguageCode +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07020302
+ LEAF + AS_07_GSP_TD_DMS_SecondaryRFC5646LanguageCode + Identifies the secondary language in Timed Text by codes defined by RFC5646. If multiple secondary languages are present, the RFC tags in white space separated list. Use only when secondary languages are present and language is known. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Segmentation_Elements +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07030000
+ NODE + AS_07_Segmentation_Elements + AS-07 Archiving and Preservation Format SegmentationElements + DMS_AS_07 + false +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Segmentation_DMS_PartNumber +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07030101
+ LEAF + AS_07_Segmentation_DMS_PartNumber + Identifier for the part number. Combined with AS_07_Segmentation_DMS_PartTotal, these metadata items represent part numbers of the form 1 of 3, 2 of 3, 3 of 3 with AS_07_Segmentation_DMS_PartNumber being the first integer. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_Segmentation_DMS_PartTotal +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07030102
+ LEAF + AS_07_Segmentation_DMS_PartTotal + The total number of parts in the program. Combined with AS_07_Segmentation_DMS_PartNumber, these metadata items represent part numbers of the form 1 of 3, 2 of 3, 3 of 3 with AS_07_Segmentation_DMS_PartTotal being the second integer. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_DateTimeSymbol +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07040101
+ LEAF + AS_07_DateTimeSymbol + Symbol that specifies the timecode, values listed in the SMPTE Labels Register as defined by SMPTE ST 400 + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_DateTimeEssenceTrackID +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07040102
+ LEAF + AS_07_DateTimeEssenceTrackID + Link to (value of) the Track ID of the audio track where the timecode data is stored in a Top Level Source Package + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_DateTimeChannelID +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07040103
+ LEAF + AS_07_DateTimeChannelID + The numerical channel identifier within the essence, if applicable. + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01010300.00000000 +
+ + Elements + http://www.loc.gov/avconservation + AS_07_DateTimeDescription +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07040104
+ LEAF + AS_07_DateTimeDescription + Additional optional text description of the timecode origin or role or details + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01100200.00000000 +
+ + Elements + http://www.loc.gov/avconservation + MICCarriage +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07040300
+ LEAF + MICCarriage + Informs decoder where to find MIC value. Absent Value indicates use of Encrypted Triplets + DMS_AS_07 + false + DefinedContext + urn:smpte:ul:060e2b34.01040101.01030100.00000000 +
+ + Elements + http://www.smpte-ra.org/reg/335/2012/13/15 + ISDCF +
    urn:smpte:ul:060e2b34.0101010e.0d0f0000.00000000
+ NODE + Inter-Society Digital Cinema Forum + Metadata registered by Inter-Society Digital Cinema Forum for public use + false +
Elements http://www.smpte-ra.org/reg/335/2012/14 diff --git a/src/main/resources/reference-registers/Groups.xml b/src/main/resources/reference-registers/Groups.xml index 9f6dbae7..ce3e89cb 100755 --- a/src/main/resources/reference-registers/Groups.xml +++ b/src/main/resources/reference-registers/Groups.xml @@ -1,46 +1,18 @@ - + + + + + + + - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + + @@ -50,7 +22,7 @@ - reg + Groups http://www.smpte-ra.org/reg/395/2014 GROUPS @@ -58,6 +30,7 @@ NODE GROUPS Register of Packs and Sets of Metadata Elements + SMPTE ST 395 false @@ -667,6 +640,443 @@ Process metadata groups false + + Groups + http://www.smpte-ra.org/reg/395/2014 + ColorTransformSets +
    urn:smpte:ul:060e2b34.027f0101.05310000.00000000
+ NODE + Color Transform Sets + Color Transform Sets + SMPTE ST 2094-2 + false +
+ + Groups + http://www.smpte-ra.org/reg/395/2014 + DMCVTGenericSets +
    urn:smpte:ul:060e2b34.027f0101.05310100.00000000
+ NODE + DMCVT Generic Sets + DMCVT Generic Sets + SMPTE ST 2094-2 + false +
+ + Groups + http://www.smpte-ra.org/reg/395/2014 + DMCVTGenericSet1 +
    urn:smpte:ul:060e2b34.027f0101.05310101.00000000
+ LEAF + DMCVT Generic Set 1 + Identifies a DMCVT Generic Set 1 + SMPTE ST 2094-2 + false + false + 53 + + +
    urn:smpte:ul:060e2b34.0101010e.05310101.00000000
+ 3601 + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310102.00000000
+ 3602 + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310103.00000000
+ 3603 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310104.00000000
+ 3604 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310105.00000000
+ 3605 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310106.00000000
+ 3606 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310107.00000000
+ 3607 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310108.00000000
+ 3608 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310109.00000000
+ 3609 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531010a.00000000
+ 360a + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531010b.00000000
+ 360b + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531010c.00000000
+ 360c + true +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014 + DMCVTApplicationSets +
    urn:smpte:ul:060e2b34.027f0101.05310200.00000000
+ NODE + DMCVT Application Sets + DMCVT Application Sets + SMPTE ST 2094-2 + false +
+ + Groups + http://www.smpte-ra.org/reg/395/2014 + DMCVTApp1Set +
    urn:smpte:ul:060e2b34.027f0101.05310201.00000000
+ LEAF + DMCVT App1 Set + Identifies a DMCVT Application 1 Set + SMPTE ST 2094-2 + false + urn:smpte:ul:060e2b34.027f0101.05310101.00000000 + true + 53 + + +
    urn:smpte:ul:060e2b34.0101010e.0531010d.00000000
+ 360d + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531010e.00000000
+ 360e + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531010f.00000000
+ 360f + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310110.00000000
+ 3610 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310111.00000000
+ 3611 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310112.00000000
+ 3612 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310113.00000000
+ 3613 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310114.00000000
+ 3614 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310115.00000000
+ 3615 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310116.00000000
+ 3616 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310117.00000000
+ 3617 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310118.00000000
+ 3618 + true +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014 + DMCVTApp2Set +
    urn:smpte:ul:060e2b34.027f0101.05310202.00000000
+ LEAF + DMCVT App2 Set + Identifies a DMCVT Application 2 Set + SMPTE ST 2094-2 + false + urn:smpte:ul:060e2b34.027f0101.05310101.00000000 + true + 53 + + +
    urn:smpte:ul:060e2b34.0101010e.05310119.00000000
+ 3619 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531011a.00000000
+ 361a + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531011b.00000000
+ 361b + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531011c.00000000
+ 361c + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531011d.00000000
+ 361d + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531011e.00000000
+ 361e + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531011f.00000000
+ 361f + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310120.00000000
+ 3620 + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310121.00000000
+ 3621 + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310122.00000000
+ 3622 + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310123.00000000
+ 3623 + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310124.00000000
+ 3624 + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310125.00000000
+ 3625 + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310126.00000000
+ 3626 + false +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014 + DMCVTApp3Set +
    urn:smpte:ul:060e2b34.027f0101.05310203.00000000
+ LEAF + DMCVT App3 Set + Identifies a DMCVT Application 3 Set + SMPTE ST 2094-2 + false + urn:smpte:ul:060e2b34.027f0101.05310101.00000000 + true + 53 + + +
    urn:smpte:ul:060e2b34.0101010e.05310127.00000000
+ 3627 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310128.00000000
+ 3628 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310129.00000000
+ 3629 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531012a.00000000
+ 362a + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531012b.00000000
+ 362b + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531012c.00000000
+ 362c + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531012d.00000000
+ 362d + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531012e.00000000
+ 362e + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531012f.00000000
+ 362f + true +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014 + DMCVTApp4Set +
    urn:smpte:ul:060e2b34.027f0101.05310204.00000000
+ LEAF + DMCVT App4 Set + Identifies a DMCVT Application 4 Set + SMPTE ST 2094-2 + false + urn:smpte:ul:060e2b34.027f0101.05310101.00000000 + true + 53 + + +
    urn:smpte:ul:060e2b34.0101010e.05310130.00000000
+ 3630 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310131.00000000
+ 3631 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310132.00000000
+ 3632 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310133.00000000
+ 3633 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310134.00000000
+ 3634 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310135.00000000
+ 3635 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310136.00000000
+ 3636 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310137.00000000
+ 3637 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310138.00000000
+ 3638 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310139.00000000
+ 3639 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531013a.00000000
+ 363a + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531013b.00000000
+ 363b + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531013c.00000000
+ 363c + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531013d.00000000
+ 363d + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531013e.00000000
+ 363e + false +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531013f.00000000
+ 363f + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310140.00000000
+ 3640 + true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310141.00000000
+ 3641 + true +
+
+
Groups http://www.smpte-ra.org/reg/395/2014 @@ -1528,7 +1938,7 @@ false urn:smpte:ul:060e2b34.027f0101.0d010101.01010300 true - 06 53 + 06 53 13 Groups @@ -2525,7 +2935,8 @@ Essence Descriptor Essence Descriptor AAF - AAF Object Specification SMPTE 377M + Item name in ST 377-1 is Generic Descriptor. Section B.2. + AAF Object Specification SMPTE ST 377-1 false urn:smpte:ul:060e2b34.027f0101.0d010101.01010100 false @@ -2539,7 +2950,7 @@
    urn:smpte:ul:060e2b34.01010109.06010104.06100000
- 2f02 + false true
@@ -4754,51 +5165,52 @@ AAF Object Specification SMPTE 422M false urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + true 06 53
    urn:smpte:ul:060e2b34.0101010a.04010603.01000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.02000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.03000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.04000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.05000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.06000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.07000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.08000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.09000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.0a000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.0b000000
- true + false
    urn:smpte:ul:060e2b34.0101010a.04010603.0c000000
@@ -4823,9 +5235,10 @@ VBI Data Descriptor VBI Data Descriptor MXF - SMPTE 436M + SMPTE ST 436-1 false urn:smpte:ul:060e2b34.027f0101.0d010101.01014300 + true 06 53
@@ -4837,9 +5250,10 @@ ANC Data Descriptor ANC Data Descriptor MXF - SMPTE 436M + SMPTE ST 436-1 false urn:smpte:ul:060e2b34.027f0101.0d010101.01014300 + true 06 53 @@ -4864,16 +5278,20 @@ LEAF MPEG Audio Descriptor MPEG Audio Descriptor - AAF[1.2:] - AAF Object Specification + SMPTE ST 381-2 false urn:smpte:ul:060e2b34.027f0101.0d010101.01014200 + true 06 53
    urn:smpte:ul:060e2b34.0101010a.04020403.01020000
true
+ +
    urn:smpte:ul:060e2b34.0101010e.04020403.01050000
+ true +
@@ -4940,9 +5358,10 @@ Package Marker Package Marker MXF + SMPTE ST 377-1 false urn:smpte:ul:060e2b34.027f0101.0d010101.01010100 - 06 53 + 06 53 13 Groups @@ -4953,9 +5372,10 @@ Application Plug-In Object Application Plug-In Object MXF + SMPTE ST 377-1 false urn:smpte:ul:060e2b34.027f0101.0d010101.01016600 - 06 53 + 06 53 13
    urn:smpte:ul:060e2b34.0101010c.05200701.0d000000
@@ -4981,9 +5401,10 @@ Application Referenced Object Application Referenced Object MXF + SMPTE ST 377-1 false urn:smpte:ul:060e2b34.027f0101.0d010101.01016600 - 06 53 + 06 53 13
    urn:smpte:ul:060e2b34.0101010c.05200701.0b000000
@@ -5081,7 +5502,7 @@
    urn:smpte:ul:060e2b34.0101010c.06010104.010b0000
- false + true
@@ -5107,9 +5528,10 @@ MPEG-4 Visual Sub-Descriptor MPEG-4 Visual Sub-Descriptor MXF - SMPTE 382-2 + SMPTE ST 381-2 false urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + true 06 53
@@ -5134,9 +5556,10 @@ MCA Label Sub-Descriptor MCA Label Sub-Descriptor AAF[2.0:] - SMPTE 377-4 + SMPTE ST 377-4 false urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + false 06 53 @@ -5206,9 +5629,10 @@ Audio Channel Label Sub-Descriptor Audio Channel Label Sub-Descriptor AAF[2.0:] - SMPTE 377-4 + SMPTE ST 377-4 false urn:smpte:ul:060e2b34.027f0101.0d010101.01016a00 + true 06 53 @@ -5226,9 +5650,10 @@ Soundfield Group Label Sub-Descriptor Soundfield Group Label Sub-Descriptor AAF[2.0:] - SMPTE 377-4 + SMPTE ST 377-4 false urn:smpte:ul:060e2b34.027f0101.0d010101.01016a00 + true 06 53 @@ -5246,9 +5671,10 @@ Group Of Soundfield Groups Label Sub-Descriptor Group Of Soundfield Groups Label Sub-Descriptor AAF[2.0:] - SMPTE 377-4 + SMPTE ST 377-4 false urn:smpte:ul:060e2b34.027f0101.0d010101.01016a00 + true 06 53 @@ -5263,6 +5689,7 @@ SMPTE ST 381-3 false urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + true 06 53 @@ -5444,31 +5871,253 @@ 06 53 -
    urn:smpte:ul:060e2b34.0101010e.04010607.01000000
+
    urn:smpte:ul:060e2b34.0101010e.04010607.01000000
+ false +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010607.02000000
+ false +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010607.03000000
+ false +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010607.04000000
+ false +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010607.05000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010607.06000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010607.07000000
+ true +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014/13/1/aaf + DMCVTTargetSubDescriptor +
    urn:smpte:ul:060e2b34.027f0101.0d010101.01017500
+ LEAF + DMCVT Target SubDescriptor + Identifies a DMCVT Target SubDescriptor + SMPTE ST 2094-2 + false + urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + true + 53 + + +
    urn:smpte:ul:060e2b34.0101010e.05310201.00000000
+ false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310202.00000000
+ false +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310203.00000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310209.00000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531020a.00000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531020b.00000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0531020c.00000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310227.00000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310236.00000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.05310237.00000000
+ true +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014/13/1/aaf + VC5BayerPictureEssenceSubDescriptor +
    urn:smpte:ul:060e2b34.027f0101.0d010101.01017600
+ LEAF + VC-5 Bayer Picture Essence Sub-Descriptor + Key Value for VC-5 Bayer Picture Essence Sub-Descriptor + SMPTE ST 2073-10 + false + urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + 53 + + +
    urn:smpte:ul:060e2b34.0101010e.04010608.02000000
+ false +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010608.03000000
+ true + false + 0 +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010608.04000000
+ true + false + 4095 +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014/13/1/aaf + VC5CDCIPictureEssenceSubDescriptor +
    urn:smpte:ul:060e2b34.027f0101.0d010101.01017700
+ LEAF + VC-5 CDCI Picture Essence Sub-Descriptor + Key Value for the VC-5 CDCI Picture Essence Sub-Descriptor + SMPTE ST 2073-10 + false + urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + 53 + + +
    urn:smpte:ul:060e2b34.0101010e.04010608.01000000
+ false +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014/13/1/aaf + AACSubDescriptor +
    urn:smpte:ul:060e2b34.027f0101.0d010101.01017800
+ LEAF + AAC SubDescriptor + Advanced Audio Coding SubDescriptor + MXF + SMPTE ST 381-4 + false + urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + 06 53 + + +
    urn:smpte:ul:060e2b34.0101010e.04020403.01040000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.04020403.01030000
+ true +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014/13/1/aaf + ACESPictureSubDescriptor +
    urn:smpte:ul:060e2b34.027f0101.0d010101.01017900
+ LEAF + ACES Picture SubDescriptor + ACES Picture SubDescriptor + SMPTE ST 2067-50 + false + urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + true + 53 + + +
    urn:smpte:ul:060e2b34.0101010e.0401060a.01000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0401060a.02000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0401060a.03000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0401060a.04000000
+ true +
+ +
    urn:smpte:ul:060e2b34.0101010e.0401060a.05000000
+ true +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014/13/1/aaf + TargetFrameSubDescriptor +
    urn:smpte:ul:060e2b34.027f0101.0d010101.01017a00
+ LEAF + Target Frame SubDescriptor + Target Frame SubDescriptor + SMPTE ST 2067-50 + false + urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + true + 53 + + +
    urn:smpte:ul:060e2b34.0101010e.04010609.01000000
+ false +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010609.02000000
+ false +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010609.03000000
+ false +
+ +
    urn:smpte:ul:060e2b34.0101010e.04010609.04000000
false
-
    urn:smpte:ul:060e2b34.0101010e.04010607.02000000
+
    urn:smpte:ul:060e2b34.0101010e.04010609.05000000
false
-
    urn:smpte:ul:060e2b34.0101010e.04010607.03000000
+
    urn:smpte:ul:060e2b34.0101010e.04010609.06000000
false
-
    urn:smpte:ul:060e2b34.0101010e.04010607.04000000
+
    urn:smpte:ul:060e2b34.0101010e.04010609.07000000
false
-
    urn:smpte:ul:060e2b34.0101010e.04010607.05000000
- true +
    urn:smpte:ul:060e2b34.0101010e.04010609.08000000
+ false
-
    urn:smpte:ul:060e2b34.0101010e.04010607.06000000
+
    urn:smpte:ul:060e2b34.0101010e.04010609.09000000
true
-
    urn:smpte:ul:060e2b34.0101010e.04010607.07000000
+
    urn:smpte:ul:060e2b34.0101010e.04010609.0a000000
true
@@ -6733,7 +7382,7 @@
    urn:smpte:ul:060e2b34.0101010c.05200701.0c000000
- false + true
@@ -8402,6 +9051,10 @@
    urn:smpte:ul:060e2b34.01010109.02090302.01000000
false + +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07040300
+ true +
@@ -8702,6 +9355,17 @@ false 06 53 + + Groups + http://www.smpte-ra.org/reg/395/2014/13/1/amwa/as07 + AS_07 +
    urn:smpte:ul:060e2b34.027f0101.0d010701.07000000
+ NODE + AS_07 + AS-07 Archiving and Preservation Format + AMWA + false +
Groups http://www.smpte-ra.org/reg/395/2014/13/1/amwa/as10 @@ -14897,6 +15561,390 @@ + + Groups + http://www.loc.gov/avconservation + LOC_Groups +
    urn:smpte:ul:060e2b34.027f010e.0d0e0000.00000000
+ NODE + LOC_Groups + Metadata registered by the Library of Congress for public use + DMS_AS_07 + false +
+ + Groups + http://www.loc.gov/avconservation + LOC_ApplicationSpecifications_Groups +
    urn:smpte:ul:060e2b34.027f010e.0d0e0100.00000000
+ NODE + LOC_ApplicationSpecifications_Groups + Library of Congress Application Specifications Groups + DMS_AS_07 + false +
+ + Groups + http://www.loc.gov/avconservation + LOC_ApplicationSpecifications_Groups_V1 +
    urn:smpte:ul:060e2b34.027f010e.0d0e0101.00000000
+ NODE + LOC_ApplicationSpecifications_Groups_V1 + Library of Congress Application Specifications Groups V1 + DMS_AS_07 + false +
+ + Groups + http://www.loc.gov/avconservation + AS_07_Groups +
    urn:smpte:ul:060e2b34.027f010e.0d0e0101.07000000
+ NODE + AS_07_Groups + AS-07 Archiving and Preservation Format Groups + DMS_AS_07 + false +
+ + Groups + http://www.loc.gov/avconservation + AS_07_DMS_Groups +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07010000
+ NODE + AS_07_DMS_Groups + AS-07 Archiving and Preservation Format Descriptive Metadata Groups + DMS_AS_07 + false +
+ + Groups + http://www.loc.gov/avconservation + AS_07_Core_DMS_Framework +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07010100
+ LEAF + AS_07_Core_DMS_Framework + AS-07 Descriptive Metadata + DMS_AS_07 + false + urn:smpte:ul:060e2b34.027f0101.0d010401.00000000 + true + 53 + + +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010101
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010102
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010103
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010105
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010106
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010107
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010108
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010109
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010a
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010b
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010c
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010d
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010e
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.0701010f
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010110
+ true +
+
+
+ + Groups + http://www.loc.gov/avconservation + AS_07_DMS_Device +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07010200
+ LEAF + AS_07_DMS_Device + Description of a device used to capture or create the content + DMS_AS_07 + false + urn:smpte:ul:060e2b34.027f0101.0d010400.00000000 + true + 53 + + +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010202
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010203
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010204
+ 32 + true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010205
+ 32 + true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010206
+ true +
+
+
+ + Groups + http://www.loc.gov/avconservation + AS_07_DMS_Identifier +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07010300
+ LEAF + AS_07_DMS_Identifier + Description of a file or part identifier in an AS-07 file + DMS_AS_07 + false + urn:smpte:ul:060e2b34.027f0101.0d010400.00000000 + true + 53 + + +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010302
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010303
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010304
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010305
+ true +
+
+
+ + Groups + http://www.loc.gov/avconservation + AS_07_GSP_DMS_Object +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07010400
+ LEAF + AS_07_GSP_DMS_Object + Additional GSP descriptive information for AS-07 + DMS_AS_07 + false + urn:smpte:ul:060e2b34.027f0101.0d010401.04020100 + true + 53 + + +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010401
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010402
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010403
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07010404
+ true +
+
+
+ + Groups + http://www.loc.gov/avconservation + AS_07_GSP_Groups +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07020000
+ NODE + AS_07_GSP_Groups + AS-07 Archiving and Preservation Format Generic Stream Partition Groups + DMS_AS_07 + false +
+ + Groups + http://www.loc.gov/avconservation + AS_07_GSP_DMS_Framework +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07020100
+ LEAF + AS_07_GSP_DMS_Framework + Abstract GSP Object Group + DMS_AS_07 + false + urn:smpte:ul:060e2b34.027f0101.0d010401.04010100 + true + 53 +
+ + Groups + http://www.loc.gov/avconservation + AS_07_GSP_BD_DMS_Framework +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07020200
+ LEAF + AS_07_GSP_BD_DMS_Framework + Binary Data GSP Object Group + DMS_AS_07 + false + urn:smpte:ul:060e2b34.027f0101.0d0e0101.07020100 + true + 53 +
+ + Groups + http://www.loc.gov/avconservation + AS_07_GSP_TD_DMS_Framework +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07020300
+ LEAF + AS_07_GSP_TD_DMS_Framework + Text Data GSP Object Group + DMS_AS_07 + false + urn:smpte:ul:060e2b34.027f0101.0d0e0101.07020100 + true + 53 + + +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07020301
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07020302
+ true +
+
+
+ + Groups + http://www.loc.gov/avconservation + AS_07_Segmentation_Groups +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07030000
+ NODE + AS_07_Segmentation_Groups + AS-07 Archiving and Preservation Format SegmentationGroups + DMS_AS_07 + false +
+ + Groups + http://www.loc.gov/avconservation + AS_07_Segmentation_DMS_Framework +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07030100
+ LEAF + AS_07_Segmentation_DMS_Framework + Metadata for AS-07 files that segment essence data + DMS_AS_07 + false + urn:smpte:ul:060e2b34.027f0101.0d010701.01010100 + true + 53 + + +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07030101
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07030102
+ false +
+
+
+ + Groups + http://www.loc.gov/avconservation + AS_07_Timecode_Groups +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07040000
+ NODE + AS_07_Timecode_Groups + AS-07 Archiving and Preservation Format Timecode Groups + DMS_AS_07 + false +
+ + Groups + http://www.loc.gov/avconservation + AS_07_TimecodeLabelSubdescriptor +
    urn:smpte:ul:060e2b34.027f0101.0d0e0101.07040100
+ LEAF + AS_07_TimecodeLabelSubdescriptor + Timecode Label for AS-07 files + DMS_AS_07 + false + urn:smpte:ul:060e2b34.027f0101.0d010101.01015900 + true + 53 + + +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07040101
+ false +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07040102
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07040103
+ true +
+ +
    urn:smpte:ul:060e2b34.01010101.0d0e0101.07040104
+ true +
+
+
+ + Groups + http://www.smpte-ra.org/reg/395/2014/13/15 + ISDCF +
    urn:smpte:ul:060e2b34.027f0101.0d0f0000.00000000
+ NODE + Inter-Society Digital Cinema Forum + Metadata registered by Inter-Society Digital Cinema Forum for public use + false +
Groups http://www.smpte-ra.org/reg/395/2014/14 diff --git a/src/main/resources/reference-registers/Labels.xml b/src/main/resources/reference-registers/Labels.xml index 1d1da37d..5fbb0098 100755 --- a/src/main/resources/reference-registers/Labels.xml +++ b/src/main/resources/reference-registers/Labels.xml @@ -1,46 +1,18 @@ - + + + + + + + - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + + @@ -2590,6 +2562,28 @@ ITU-R BT.2100 false + + Labels + http://www.smpte-ra.org/reg/400/2012 + TransferCharacteristic_Gamma_2_6 +
    urn:smpte:ul:060e2b34.0401010d.04010101.010c0000
+ LEAF + Gamma 2.6 Transfer Characteristic + Opto electric transfer function using a power function with an exponent of 1/2.6 and a scaling factor of 1.0 + SMPTE ST 2067-50 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + TransferCharacteristic_sRGB +
    urn:smpte:ul:060e2b34.0401010d.04010101.010d0000
+ LEAF + sRGB Transfer Characteristic + Opto electric transfer function using a power function as defined in IEC 61966-2-1 + IEC 61966-2-1 + false +
Labels http://www.smpte-ra.org/reg/400/2012 @@ -2746,6 +2740,28 @@ SMPTE ST 2067-21 false + + Labels + http://www.smpte-ra.org/reg/400/2012 + ColorPrimaries_ACES +
    urn:smpte:ul:060e2b34.0401010d.04010101.03070000
+ LEAF + ACES Color Primaries + Identifies ACES SMPTE ST 2065-1 color primaries and white point + SMPTE ST 2065-1 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + ColorPrimaries_CinemaMezzanine +
    urn:smpte:ul:060e2b34.0401010d.04010101.03080000
+ LEAF + Cinema Mezzanine Color Primaries + Identifies XYZ tristimulus values as specified in ISO 11664-3 + SMPTE ST 2067-40 + false +
Labels http://www.smpte-ra.org/reg/400/2012 @@ -8915,6 +8931,192 @@ SMPTE ST 2042-4 false + + Labels + http://www.smpte-ra.org/reg/400/2012 + ACESPictureCodingSchemes +
    urn:smpte:ul:060e2b34.0401010d.04010202.03040000
+ NODE + ACES Picture Coding Schemes + Identifies ACES SMPTE ST 2065-4 Picture Coding Schemes + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + ACESUncompressedMonoscopicWithoutAlpha +
    urn:smpte:ul:060e2b34.0401010d.04010202.03040100
+ LEAF + ACES Uncompressed Monoscopic Without Alpha + Identifier for ACES SMPTE ST 2065-4 monoscopic uncompressed picture coding without alpha channel + SMPTE ST 2065-5 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + ACESUncompressedMonoscopicWithAlpha +
    urn:smpte:ul:060e2b34.0401010d.04010202.03040200
+ LEAF + ACES Uncompressed Monoscopic With Alpha + Identifier for ACES SMPTE ST 2065-4 monoscopic uncompressed picture coding with alpha channel + SMPTE ST 2065-5 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + VC5PictureCodingScheme +
    urn:smpte:ul:060e2b34.0401010d.04010202.03050000
+ NODE + VC-5 Picture Coding Scheme + Picture essence coding label for a VC-5 bitstream + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + VC5Part3PictureCodingScheme +
    urn:smpte:ul:060e2b34.0401010d.04010202.03050300
+ NODE + VC-5 Part 3 Picture Coding Scheme + Picture essence coding label for a VC-5 Part 3 bitstream + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + VC5Part3RGBAPicture +
    urn:smpte:ul:060e2b34.0401010d.04010202.03050301
+ LEAF + VC-5 Part 3 RGB(A) Picture + Picture essence coding label for a VC-5 Part 3 bitstream with image format RGB(A) + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + VC5Part3YCCAPicture +
    urn:smpte:ul:060e2b34.0401010d.04010202.03050302
+ LEAF + VC-5 Part 3 YCC(A) Picture + Picture essence coding label for a VC-5 Part 3 bitstream with image format YCC(A) + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + VC5Part3BayerPicture +
    urn:smpte:ul:060e2b34.0401010d.04010202.03050303
+ LEAF + VC-5 Part 3 Bayer Picture + Picture essence coding label for a VC-5 Part 3 bitstream with Bayer image format + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + VC5Part4PictureCodingScheme +
    urn:smpte:ul:060e2b34.0401010d.04010202.03050400
+ NODE + VC-5 Part 4 Picture Coding Scheme + Picture Essence Coding Label for a VC-5 Part 4 bitstream + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + VC5Part4YCCAPicture +
    urn:smpte:ul:060e2b34.0401010d.04010202.03050402
+ LEAF + VC-5 Part 4 YCC(A) Picture + Picture essence coding label for a VC-5 Part 4 bitstream with subsampled color difference components + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + ProResPictureCodingScheme +
    urn:smpte:ul:060e2b34.0401010d.04010202.03060000
+ NODE + ProRes Picture Coding Scheme + Identifies ProRes Picture coding scheme + SMPTE RDD 44 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + ProResPictureCoding422Proxy +
    urn:smpte:ul:060e2b34.0401010d.04010202.03060100
+ LEAF + ProRes Picture Coding 422 Proxy + Identifies ProRes Picture coding for the 422 Proxy profile + SMPTE RDD 44 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + ProResPictureCoding422LT +
    urn:smpte:ul:060e2b34.0401010d.04010202.03060200
+ LEAF + ProRes Picture Coding 422 LT + Identifies ProRes Picture coding for the 422 LT profile + SMPTE RDD 44 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + ProResPictureCoding422 +
    urn:smpte:ul:060e2b34.0401010d.04010202.03060300
+ LEAF + ProRes Picture Coding 422 + Identifies ProRes Picture coding for the 422 profile + SMPTE RDD 44 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + ProResPictureCoding422HQ +
    urn:smpte:ul:060e2b34.0401010d.04010202.03060400
+ LEAF + ProRes Picture Coding 422 HQ + Identifies ProRes Picture coding for the 422 HQ profile + SMPTE RDD 44 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + ProResPictureCoding4444 +
    urn:smpte:ul:060e2b34.0401010d.04010202.03060500
+ LEAF + ProRes Picture Coding 4444 + Identifies ProRes Picture coding for the 4444 profile + SMPTE RDD 44 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + ProResPictureCoding4444XQ +
    urn:smpte:ul:060e2b34.0401010d.04010202.03060600
+ LEAF + ProRes Picture Coding 4444 XQ + Identifies ProRes Picture coding for the 4444 XQ profile + SMPTE RDD 44 + false +
Labels http://www.smpte-ra.org/reg/400/2012 @@ -9605,6 +9807,188 @@ ISO/IEC 13818-7 false + + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_Compressed_Audio_Coding +
    urn:smpte:ul:060e2b34.0401010d.04020202.04000000
+ NODE + MPEG Audio Compression + Identifies MPEG Audio compression + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_1_Audio_Coding +
    urn:smpte:ul:060e2b34.0401010d.04020202.04010000
+ NODE + MPEG-1 Audio Coding + Identifies compressed audio compliant to MPEG-1 audio coding + ISO/IEC 11172-3 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_1_Layer_I +
    urn:smpte:ul:060e2b34.0401010d.04020202.04010100
+ LEAF + MPEG-1 Layer I + Identifies compressed audio compliant to MPEG-1 Layer I + ISO/IEC 11172-3 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_1_Layer_II +
    urn:smpte:ul:060e2b34.0401010d.04020202.04010200
+ LEAF + MPEG-1 Layer II + Identifies compressed audio compliant to MPEG-1 Layer II + ISO/IEC 11172-3 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_1_Layer_III +
    urn:smpte:ul:060e2b34.0401010d.04020202.04010300
+ LEAF + MPEG-1 Layer III + Identifies compressed audio compliant to MPEG-1 Layer III + ISO/IEC 11172-3 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_2_Audio_Coding +
    urn:smpte:ul:060e2b34.0401010d.04020202.04020000
+ NODE + MPEG-2 Audio Coding + Identifies compressed audio compliant to MPEG-2 Audio Coding + ISO/IEC 13818-3 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_2_Layer_I +
    urn:smpte:ul:060e2b34.0401010d.04020202.04020100
+ LEAF + MPEG-2 Layer I + Identifies compressed audio compliant to MPEG-2 Layer I + ISO/IEC 13818-3 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_2_Layer_II +
    urn:smpte:ul:060e2b34.0401010d.04020202.04020200
+ LEAF + MPEG-2 Layer II + Identifies compressed audio compliant to MPEG-2 Layer II + ISO/IEC 13818-3 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_2_Layer_III +
    urn:smpte:ul:060e2b34.0401010d.04020202.04020300
+ LEAF + MPEG-2 Layer III + Identifies compressed audio compliant to MPEG-2 Layer III + ISO/IEC 13818-3 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_2_Advanced_Audio_Coding +
    urn:smpte:ul:060e2b34.0401010d.04020202.04030000
+ NODE + MPEG-2 Advanced Audio Coding + Identifies compressed audio compliant to MPEG-2 Advanced Audio Coding + Refer to ISO/IEC 13818-7 + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_2_LC_AAC +
    urn:smpte:ul:060e2b34.0401010d.04020202.04030100
+ LEAF + Low Complexity profile MPEG-2 AAC + Identifies compressed audio compliant to MPEG-2 AAC Low Complexity profile + Refer to ISO/IEC 13818-7, §7 "Profiles and Profile Interoperability" + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_2_AAC_SBR +
    urn:smpte:ul:060e2b34.0401010d.04020202.04030200
+ LEAF + Low Complexity profile MPEG-2 AAC+SBR + Identifies compressed audio compliant to MPEG-2 AAC Low Complexity + SBR + Refer to ISO/IEC 13818-7, §7 "Profiles and Profile Interoperability" + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_4_Advanced_Audio_Coding +
    urn:smpte:ul:060e2b34.0401010d.04020202.04040000
+ NODE + MPEG-4 Advanced Audio Coding + Identifies compressed audio compliant to MPEG-4 Advanced Audio Coding + Refer to ISO/IEC 14496-3 + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_4_AAC_Profile +
    urn:smpte:ul:060e2b34.0401010d.04020202.04040100
+ LEAF + MPEG-4 AAC Profile + Identifies compressed audio compliant to MPEG-4 AAC LC Profile + Refer to ISO/IEC 14496-3, §1.5.2 "Audio profiles and levels" + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_4_High_Efficiency_AAC_Profile +
    urn:smpte:ul:060e2b34.0401010d.04020202.04040200
+ LEAF + MPEG-4 High Efficiency AAC Profile + Identifies compressed audio compliant to MPEG-4 High Efficiency AAC Profile + Refer to ISO/IEC 14496-3, §1.5.2 "Audio profiles and levels" + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + MPEG_4_High_Efficiency_AAC_v2_Profile +
    urn:smpte:ul:060e2b34.0401010d.04020202.04040300
+ LEAF + MPEG-4 High Efficiency AAC v2 Profile + Identifies compressed audio compliant to MPEG-4 High Efficiency AAC v2 Profile + Refer to ISO/IEC 14496-3, §1.5.2 "Audio profiles and levels" + SMPTE ST 381-4 + false +
Labels http://www.smpte-ra.org/reg/400/2012 @@ -10843,6 +11227,61 @@ SMPTE ST 12-1 false + + Labels + http://www.smpte-ra.org/reg/400/2012 + DMCVTDataCoding +
    urn:smpte:ul:060e2b34.0401010d.04040102.02000000
+ NODE + DMCVT Data Coding + Identifies DMCVT Data Coding + SMPTE ST 2094-2 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + DMCVTApplication1 +
    urn:smpte:ul:060e2b34.0401010d.04040102.02010000
+ LEAF + DMCVT Application 1 + Identifies DMCVT Application 1 + SMPTE ST 2094-2 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + DMCVTApplication2 +
    urn:smpte:ul:060e2b34.0401010d.04040102.02020000
+ LEAF + DMCVT Application 2 + Identifies DMCVT Application 2 + SMPTE ST 2094-2 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + DMCVTApplication3 +
    urn:smpte:ul:060e2b34.0401010d.04040102.02030000
+ LEAF + DMCVT Application 3 + Identifies DMCVT Application 3 + SMPTE ST 2094-2 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + DMCVTApplication4 +
    urn:smpte:ul:060e2b34.0401010d.04040102.02040000
+ LEAF + DMCVT Application 4 + Identifies DMCVT Application 4 + SMPTE ST 2094-2 + false +
Labels http://www.smpte-ra.org/reg/400/2012 @@ -10863,6 +11302,49 @@ SMPTE Label identifiers for general data parameters (neither essence nor metadata) false + + Labels + http://www.smpte-ra.org/reg/400/2012 + ViewingEnvironment +
    urn:smpte:ul:060e2b34.0401010d.04100101.01000000
+ NODE + Viewing Environment + Viewing Environment Labels + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + TheatricalViewingEnvironment +
    urn:smpte:ul:060e2b34.0401010d.04100101.01010000
+ LEAF + Theatrical Viewing Environment + Theatrical Viewing Environment as defined in SMPTE RP 431-2 + SMPTE RP 431-2 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + HDTVReferenceViewingEnvironment +
    urn:smpte:ul:060e2b34.0401010d.04100101.01020000
+ LEAF + HDTV Reference Viewing Environment + Reference Viewing Environment for Evaluation of HDTV Images, as defined in SMPTE ST 2080-3 + SMPTE ST 2080-3 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012 + HDRReferenceViewingEnvironment +
    urn:smpte:ul:060e2b34.0401010d.04100101.01030000
+ LEAF + HDR Reference Viewing Environment + Reference Viewing Environment for Evaluation of HDR Images, as defined in ITU-R BT.2100-1 + ITU-R BT.2100-1 + false +
Labels http://www.smpte-ra.org/reg/400/2012 @@ -30703,6 +31185,17 @@ SMPTE ST 423 false + + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCClipWrappedEncryptedData +
    urn:smpte:ul:060e2b34.0401010d.0d010301.020b0200
+ LEAF + MXF-GC Clip-wrapped Encrypted Data + Identifier for a MXF-GC, Clip-wrapped generic container encrypted according to SMPTE ST 429-6 + SMPTE ST 429-6 + false +
Labels http://www.smpte-ra.org/reg/400/2012/13/1/aaf @@ -34489,6 +34982,258 @@ SMPTE ST 2042-4 false + + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_ADIF +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02160000
+ NODE + MXF-GC AAC ADIF + Identifies container for MPEG-2/4 ADIF + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_ADIF_Frame_Wrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02160100
+ LEAF + MXF-GC AAC ADIF Frame Wrapped + Identifies container for Frame Wrapped MPEG-2/4 ADIF + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_ADIF_Clip_Wrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02160200
+ LEAF + MXF-GC AAC ADIF Clip Wrapped + Identifies container for Clip Wrapped MPEG-2/4 ADIF + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_ADIF_Custom_Wrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02160300
+ LEAF + MXF-GC AAC ADIF Custom Wrapped + Identifies container for Custom Wrapped MPEG-2/4 ADIF + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_ADTS +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02170000
+ NODE + MXF-GC AAC ADTS + Identifies container for MPEG-2/4 ADTS + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_ADTS_Frame_Wrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02170100
+ LEAF + MXF-GC AAC ADTS Frame Wrapped + Identifies container for Frame Wrapped MPEG-2/4 ADTS + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_ADTS_Clip_Wrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02170200
+ LEAF + MXF-GC AAC ADTS Clip Wrapped + Identifies container for Clip Wrapped MPEG-2/4 ADTS + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_ADTS_Custom_Wrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02170300
+ LEAF + MXF-GC AAC ADTS Custom Wrapped + Identifies container for Custom Wrapped MPEG-2/4 ADTS + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_LATM_LOAS +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02180000
+ NODE + MXF-GC AAC LATM-LOAS + Identifies container for MPEG-4 LATM/LOAS + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_LATM_LOAS_Frame_Wrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02180100
+ LEAF + MXF-GC AAC LATM-LOAS Frame Wrapped + Identifies container for Frame Wrapped MPEG-4 LATM/LOAS + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_LATM_LOAS_Clip_Wrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02180200
+ LEAF + MXF-GC AAC LATM-LOAS Clip Wrapped + Identifies container for Clip Wrapped MPEG-4 LATM/LOAS + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXF_GC_AAC_LATM_LOAS_Custom_Wrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02180300
+ LEAF + MXF-GC AAC LATM-LOAS Custom Wrapped + Identifies container for Custom Wrapped MPEG-4 LATM/LOAS + SMPTE ST 381-4 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCACESPictures +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02190000
+ NODE + MXF-GC ACES Pictures + Identifiers for MXF-GC mappings of ACES SMPTE ST 2065-4 Pictures + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCFrameWrappedACESPictures +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02190100
+ LEAF + MXF-GC Frame-wrapped ACES Pictures + Identifier for MXF-GC, Frame-wrapped ACES SMPTE ST 2065-4 images + SMPTE ST 2065-5 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCClipWrappedACESPictures +
    urn:smpte:ul:060e2b34.0401010d.0d010301.02190200
+ LEAF + MXF-GC Clip-wrapped ACES Pictures + Identifier for MXF-GC, Clip-wrapped ACES SMPTE ST 2065-4 images + SMPTE ST 2065-5 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCDMCVTData +
    urn:smpte:ul:060e2b34.0401010d.0d010301.021a0000
+ NODE + MXF-GC DMCVT Data + Identifies MXF-GC DMCVT Data + SMPTE ST 2094-2 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCFrameWrappedDMCVTData +
    urn:smpte:ul:060e2b34.0401010d.0d010301.021a0100
+ LEAF + MXF-GC Frame-Wrapped DMCVT Data + Identifies MXF-GC Frame-Wrapped DMCVT Data + SMPTE ST 2094-2 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCVC5EssenceContainerLabel +
    urn:smpte:ul:060e2b34.0401010d.0d010301.021b0000
+ NODE + MXF-GC VC-5 Essence Container Label (SMPTE ST 2073-10) + Image Wrapping Type VC-5 Essence Container Label defined in SMPTE ST 2073-10 + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCVC5FrameWrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.021b0100
+ LEAF + MXF-GC VC-5 Essence Container Label (Frame-Wrapped) + Indicates a VC-5 frame-wrapped VC-5 bitstream defined in SMPTE ST 2073-10 + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCVC5ClipWrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.021b0200
+ LEAF + MXF-GC VC-5 Essence Container Label (Clip-Wrapped) + Indicates a VC-5 clip-wrapped VC-5 bitstream defined in SMPTE ST 2073-10 + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCVC5CustomWrapped +
    urn:smpte:ul:060e2b34.0401010d.0d010301.021b0300
+ LEAF + MXF-GC VC-5 Essence Container Label (Custom-Wrapped) + Indicates a VC-5 custom-wrapped VC-5 bitstream defined in SMPTE ST 2073-10 + SMPTE ST 2073-10 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCEssenceContainerProResPicture +
    urn:smpte:ul:060e2b34.0401010d.0d010301.021c0000
+ NODE + MXF-GC Essence Container ProRes Picture + Identifier for MXF-GC Essence Container ProRes Picture + SMPTE RDD 44 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/aaf + MXFGCFrameWrappedEssenceContainerProResPicture +
    urn:smpte:ul:060e2b34.0401010d.0d010301.021c0100
+ LEAF + MXF-GC Frame-Wrapped Essence Container ProRes Picture + Identifier for MXF-GC Frame-Wrapped Essence Container ProRes Picture + SMPTE RDD 44 + false +
Labels http://www.smpte-ra.org/reg/400/2012/13/1/aaf @@ -34837,6 +35582,50 @@ Application Specifications Version 1 false + + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/amwa/as07 + AS_07 +
    urn:smpte:ul:060e2b34.04010101.0d010701.07000000
+ NODE + AS_07 + AS-07 Archiving and Preservation Format + AMWA + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/amwa/as07 + AS_07_Core_DMS +
    urn:smpte:ul:060e2b34.04010101.0d010701.07010000
+ LEAF + AS_07_Core_DMS + Required Core Metadata for AS-07 Archiving and Preservation Format + DMS_AS_07 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/amwa/as07 + AS_07_GSP_DMS +
    urn:smpte:ul:060e2b34.04010101.0d010701.07020000
+ LEAF + AS_07_GSP_DMS + Required Metadata Scheme for data stored in Generic Stream Partitions in AS-07 files + DMS_AS_07 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/amwa/as07 + AS_07_Segmentation_DMS +
    urn:smpte:ul:060e2b34.04010101.0d010701.07030000
+ LEAF + AS_07_Segmentation_DMS + Required Metadata Scheme for AS-07 files that segment essence data + DMS_AS_07 + false +
Labels http://www.smpte-ra.org/reg/400/2012/13/1/amwa/as10 @@ -35255,6 +36044,17 @@ AMWA Rules-based Specification component false + + Labels + http://www.smpte-ra.org/reg/400/2012/13/1/amwa/rules + Blocks_FF_X9 +
    urn:smpte:ul:060e2b34.04010101.0d010801.05090000
+ LEAF + Blocks File Format X9 + Blocks File Format X9 + AMWA Rules-based Specification component + false +
Labels http://www.smpte-ra.org/reg/400/2012/13/1/aaf @@ -35622,6 +36422,382 @@ Metadata registered by Ad-ID, LLC for public use false + + Labels + http://www.loc.gov/avconservation + LOC_Labels +
    urn:smpte:ul:060e2b34.0401010e.0d0e0000.00000000
+ NODE + LOC_Labels + Metadata registered by the Library of Congress for public use + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + LOC_ApplicationSpecifications_Labels +
    urn:smpte:ul:060e2b34.0401010e.0d0e0100.00000000
+ NODE + LOC_ApplicationSpecifications_Labels + Library of Congress Application Specifications Labels + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + LOC_ApplicationSpecifications_Labels_V1 +
    urn:smpte:ul:060e2b34.0401010e.0d0e0101.00000000
+ NODE + LOC_ApplicationSpecifications_Labels_V1 + Library of Congress Application Specifications Labels V1 + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_Labels +
    urn:smpte:ul:060e2b34.0401010e.0d0e0101.07000000
+ NODE + AS_07_Labels + AS-07 Archiving and Preservation Format Labels + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLabels +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020000
+ NODE + AS_07_AudioLabels + AS-07 Archiving and Preservation Format Audio Labels + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayouts +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020400
+ NODE + AS_07_AudioLayouts + AS-07 Archiving and Preservation Format Audio Layouts + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayoutSilence +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020401
+ LEAF + AS_07_AudioLayoutSilence + No content on audio channels, Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayoutUnknown +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020402
+ LEAF + AS_07_AudioLayoutUnknown + Unknown, undefined Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout1TrackUndef +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020403
+ LEAF + AS_07_AudioLayout1TrackUndef + One track detected, content undefined (see AS-07 B.3 table 1). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout2TrackUndef +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020404
+ LEAF + AS_07_AudioLayout2TrackUndef + Two tracks detected, content undefined (see AS-07 B.3 table 2). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout3TrackUndef +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020405
+ LEAF + AS_07_AudioLayout3TrackUndef + Three tracks detected, content undefined (see AS-07 B.3 table 3). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout4TrackUndef +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020406
+ LEAF + AS_07_AudioLayout4TrackUndef + Four tracks detected, content undefined (see AS-07 B.3 table 4). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout1TrackAudio +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020407
+ LEAF + AS_07_AudioLayout1TrackAudio + One track (one audio) (see AS-07 B.3 table 5). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout2TracksAudio +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020408
+ LEAF + AS_07_AudioLayout2TracksAudio + Two tracks (two audio) (see AS-07 B.3 table 6). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout1TrackAudio1TrackTimecode +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020409
+ LEAF + AS_07_AudioLayout1TrackAudio1TrackTimecode + Two tracks (one audio, one timecode) (see AS-07 B.3 table 7). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout3TracksAudio +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.0702040a
+ LEAF + AS_07_AudioLayout3TracksAudio + Three tracks (three audio) (see AS-07 B.3 table 8). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout2TrackAudio1TrackTimecode +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.0702040b
+ LEAF + AS_07_AudioLayout2TrackAudio1TrackTimecode + Three tracks (two audio, one timecode) (see AS-07 B.3 table 9). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout4TrackAudio +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.0702040c
+ LEAF + AS_07_AudioLayout4TrackAudio + Four tracks (four audio) (see AS-07 B.3 table 10). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayout3TrackAudio1TrackTimecode +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.0702040d
+ LEAF + AS_07_AudioLayout3TrackAudio1TrackTimecode + Four tracks (three audio, one timecode) (see AS-07 B.3 table 11). Likely to be encountered in analog tape source media + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayoutEBU48_2a +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020410
+ LEAF + AS_07_AudioLayoutEBU48_2a + EBU R 48: 2a (For 4 ch. only) Reference EBU standard, pattern from AS-11 + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayoutEBU123_4b +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020411
+ LEAF + AS_07_AudioLayoutEBU123_4b + EBU R 123: 4b (For 4 ch. only) Reference EBU standard, pattern from AS-11 + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayoutEBU123_4c +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020412
+ LEAF + AS_07_AudioLayoutEBU123_4c + EBU R 123: 4c (For 4 ch. only) Reference EBU standard, pattern from AS-11 + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayoutEBU123_16c +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020413
+ LEAF + AS_07_AudioLayoutEBU123_16c + EBU R 123: 16c (For 16 ch. only) Reference EBU standard, pattern from AS-11 + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayoutEBU123_16d +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020414
+ LEAF + AS_07_AudioLayoutEBU123_16d + EBU R 123: 16d (For 16 ch. only) Reference EBU standard, pattern from AS-11 + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayoutEBU123_16f +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020415
+ LEAF + AS_07_AudioLayoutEBU123_16f + EBU R 123: 16f (For 16 ch. only) Reference EBU standard, pattern from AS-11 + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_AudioLayoutST377_4MCA +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07020420
+ LEAF + AS_07_AudioLayoutST377_4MCA + SMPTE ST 377-4 Multichannel Audio (MCA). AS-07 encoders must also embed the descriptors and subdescriptors specified in SMPTE ST 377-1 and ST 377-4 + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_Modal_Labels +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07040000
+ NODE + AS_07_Modal_Labels + AS-07 Archiving and Preservation Format Modal Labels + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + AS_07_MICCarriage_Labels +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07040100
+ NODE + AS_07_MICCarriage_Labels + AS-07 Archiving and Preservation Format MIC Carriage Modes + DMS_AS_07 + false +
+ + Labels + http://www.loc.gov/avconservation + MICCarriage_SystemItem +
    urn:smpte:ul:060e2b34.04010101.0d0e0101.07040101
+ LEAF + MICCarriage_SystemItem + Indicates AS-07 usage for placement of MIC values in GC SystemItem + DMS_AS_07 + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/15 + ISDCF +
    urn:smpte:ul:060e2b34.0401010d.0d0f0000.00000000
+ NODE + Inter-Society Digital Cinema Forum + Metadata registered by Inter-Society Digital Cinema Forum for public use + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/15 + Interpretive +
    urn:smpte:ul:060e2b34.0401010d.0d0f0300.00000000
+ NODE + Interpretive + Identifiers for Interpretive Data + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/15 + InterpretiveSoundEssence +
    urn:smpte:ul:060e2b34.0401010d.0d0f0302.00000000
+ NODE + Sound Essence + + Identifiers for Sound Essence Interpretive Data + + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/15 + AudioChannel +
    urn:smpte:ul:060e2b34.0401010d.0d0f0302.01000000
+ NODE + Audio Channel + + Identifiers for Audio Channel interpretive data + + false +
+ + Labels + http://www.smpte-ra.org/reg/400/2012/13/15 + AudioChannelSLVS +
    urn:smpte:ul:060e2b34.0401010d.0d0f0302.01010000
+ LEAF + Sign Language Video Stream + + Identifies an Audio Channel that contains a Sign Language Video Stream + + ISDCF Doc13 (http://isdcf.com/papers/ISDCF-Doc13-Sign-Language-Video-Encoding-for-Digital-Cinema.pdf) + false +
Labels http://www.smpte-ra.org/reg/400/2012/14 diff --git a/src/main/resources/reference-registers/Types.xml b/src/main/resources/reference-registers/Types.xml index 5c98a39c..69b121db 100755 --- a/src/main/resources/reference-registers/Types.xml +++ b/src/main/resources/reference-registers/Types.xml @@ -1,46 +1,18 @@ - + + + + + + + - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + + @@ -59,6 +31,7 @@ TYPES Register of Basic Data Types and Composed Types AAF + SMPTE ST 2003 false @@ -2891,8 +2864,9 @@ TransferCharacteristicType
    urn:smpte:ul:060e2b34.01040101.02020102.00000000
LEAF - TransferCharacteristicType + Transfer Characteristic Type AAF + SMPTE ST 377-1 false UnknownContext Enumeration @@ -2952,6 +2926,14 @@ urn:smpte:ul:060e2b34.0401010d.04010101.010b0000 false + + urn:smpte:ul:060e2b34.0401010d.04010101.010c0000 + false + + + urn:smpte:ul:060e2b34.0401010d.04010101.010d0000 + false +
@@ -3066,6 +3048,14 @@ AAF[1.3:] false + + urn:smpte:ul:060e2b34.0401010d.04010101.03070000 + false + + + urn:smpte:ul:060e2b34.0401010d.04010101.03080000 + false + @@ -3145,6 +3135,34 @@ + + Types + http://www.smpte-ra.org/reg/2003/2012 + ViewingEnvironmentType +
    urn:smpte:ul:060e2b34.01040101.02020108.00000000
+ LEAF + Viewing Environment Type + AAF + SMPTE ST 2067-50 + false + UnknownContext + Enumeration + urn:smpte:ul:060e2b34.01040101.01030100.00000000 + + + urn:smpte:ul:060e2b34.0401010d.04100101.01010000 + false + + + urn:smpte:ul:060e2b34.0401010d.04100101.01020000 + false + + + urn:smpte:ul:060e2b34.0401010d.04100101.01030000 + false + + +
Types http://www.smpte-ra.org/reg/2003/2012 @@ -6151,6 +6169,17 @@ Application Specifications Version 1 false + + Types + http://www.smpte-ra.org/reg/2003/2012/13/1/amwa/as07 + AS_07 +
    urn:smpte:ul:060e2b34.01040101.0d010701.07000000
+ NODE + AS_07 + AS-07 Archiving and Preservation Format + AMWA + false +
Types http://www.smpte-ra.org/reg/2003/2012/13/1/amwa/as11 @@ -9868,6 +9897,291 @@ Metadata registered by Ad-ID, LLC for public use false + + Types + http://www.loc.gov/avconservation + LOC_Types +
    urn:smpte:ul:060e2b34.0104010e.0d0e0000.00000000
+ NODE + LOC_Types + Metadata registered by the Library of Congress for public use + DMS_AS_07 + false +
+ + Types + http://www.loc.gov/avconservation + LOC_ApplicationSpecifications_Types +
    urn:smpte:ul:060e2b34.0104010e.0d0e0100.00000000
+ NODE + LOC_ApplicationSpecifications_Types + Library of Congress Application Specifications Types + DMS_AS_07 + false +
+ + Types + http://www.loc.gov/avconservation + LOC_ApplicationSpecifications_Types_V1 +
    urn:smpte:ul:060e2b34.0104010e.0d0e0101.00000000
+ NODE + LOC_ApplicationSpecifications_Types_V1 + Library of Congress Application Specifications TypesV1 + DMS_AS_07 + false +
+ + Types + http://www.loc.gov/avconservation + AS_07_Types +
    urn:smpte:ul:060e2b34.0104010e.0d0e0101.07000000
+ NODE + AS_07_Types + AS-07 Archiving and Preservation Format Types + DMS_AS_07 + false +
+ + Types + http://www.loc.gov/avconservation + AS_07_DMS_Types +
    urn:smpte:ul:060e2b34.01040101.0d0e0101.07010000
+ NODE + AS_07_DMS_Types + AS-07 Archiving and Preservation Format Descriptive Metadata Types + DMS_AS_07 + false +
+ + Types + http://www.loc.gov/avconservation + StrongReferenceAS_07_DMS_Device +
    urn:smpte:ul:060e2b34.01040101.0d0e0101.07010200
+ LEAF + StrongReferenceAS_07_DMS_Device + StrongReference to AS_07_DMS_Device Set + DMS_AS_07 + false + DefinedContext + StrongReference + urn:smpte:ul:060e2b34.027f0101.0d0e0101.07010200 +
+ + Types + http://www.loc.gov/avconservation + StrongReferenceSetAS_07_DMS_Device +
    urn:smpte:ul:060e2b34.01040101.0d0e0101.07010201
+ LEAF + StrongReferenceSetAS_07_DMS_Device + Set of StrongReferences to AS_07_DMS_Device sets + DMS_AS_07 + false + DefinedContext + Set + 0 + urn:smpte:ul:060e2b34.01040101.0d0e0101.07010200 + isIdentified +
+ + Types + http://www.loc.gov/avconservation + StrongReferenceAS_07_DMS_Identifier +
    urn:smpte:ul:060e2b34.01040101.0d0e0101.07010300
+ LEAF + StrongReferenceAS_07_DMS_Identifier + StrongReference to AS_07_DMS_Identifier Set + DMS_AS_07 + false + DefinedContext + StrongReference + urn:smpte:ul:060e2b34.027f0101.0d0e0101.07010300 +
+ + Types + http://www.loc.gov/avconservation + StrongReferenceSetAS_07_DMS_Identifier +
    urn:smpte:ul:060e2b34.01040101.0d0e0101.07010301
+ LEAF + StrongReferenceSetAS_07_DMS_Identifier + Set of StrongReferences to AS_07_DMS_Identifier sets + DMS_AS_07 + false + DefinedContext + Set + 0 + urn:smpte:ul:060e2b34.01040101.0d0e0101.07010300 + isIdentified +
+ + Types + http://www.loc.gov/avconservation + AS_07_DMS_IdentifierRoleCode +
    urn:smpte:ul:060e2b34.01040101.0d0e0101.07010400
+ LEAF + AS_07_DMS_IdentifierRoleCode + Controlled vocabulary string value identifying the role of identifier + DMS_AS_07 + false + DefinedContext + Enumeration + urn:smpte:ul:060e2b34.01040101.01100600.00000000 + + + Main + Main + Main + DMS_AS_07 + false + + + Additional + Additional + Additional + DMS_AS_07 + false + + + GSP + GSP + GSP + DMS_AS_07 + false + + +
+ + Types + http://www.loc.gov/avconservation + AS_07_DMS_IdentifierTypeCode +
    urn:smpte:ul:060e2b34.01040101.0d0e0101.07010500
+ LEAF + AS_07_DMS_IdentifierTypeCode + Controlled vocabulary string value identifying the type of identifier + DMS_AS_07 + false + DefinedContext + Enumeration + urn:smpte:ul:060e2b34.01040101.01100600.00000000 + + + UUID + UUID + UUID + DMS_AS_07 + false + + + UMID + UMID + UMID + DMS_AS_07 + false + + + UL + UL + UL + DMS_AS_07 + false + + + Other + Other + Other + DMS_AS_07 + false + + +
+ + Types + http://www.loc.gov/avconservation + AS_07_DMS_DataDescriptionCode +
    urn:smpte:ul:060e2b34.01040101.0d0e0101.07010600
+ LEAF + AS_07_DMS_DataDescriptionCode + Controlled vocabulary string value identifying the role of identifier + DMS_AS_07 + false + DefinedContext + Enumeration + urn:smpte:ul:060e2b34.01040101.01100600.00000000 + + + Caption + Caption + Caption + DMS_AS_07 + false + + + TimedText + TimedText + TimedText + DMS_AS_07 + false + + + Graphic + Graphic + Graphic + DMS_AS_07 + false + + + RelatedDocument + RelatedDocument + RelatedDocument + DMS_AS_07 + false + + + SupplementaryMetadata + SupplementaryMetadata + SupplementaryMetadata + DMS_AS_07 + false + + + AssociatedMaterial + AssociatedMaterial + AssociatedMaterial + DMS_AS_07 + false + + + Trailer + Trailer + Trailer + DMS_AS_07 + false + + + QC + QC + QC + DMS_AS_07 + false + + + Other + Other + Other + DMS_AS_07 + false + + +
+ + Types + http://www.smpte-ra.org/reg/2003/2012/13/15 + ISDCF +
    urn:smpte:ul:060e2b34.01040101.0d0f0000.00000000
+ NODE + Inter-Society Digital Cinema Forum + Metadata registered by Inter-Society Digital Cinema Forum for public use + false +
Types http://www.smpte-ra.org/reg/2003/2012/14 diff --git a/src/test/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilderFunctionalTests.java b/src/test/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilderFunctionalTests.java index ec6b4e1f..5722d6b2 100644 --- a/src/test/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilderFunctionalTests.java +++ b/src/test/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilderFunctionalTests.java @@ -19,6 +19,7 @@ import com.netflix.imflibrary.IMFErrorLogger; import com.netflix.imflibrary.IMFErrorLoggerImpl; import com.netflix.imflibrary.KLVPacket; +import com.netflix.imflibrary.utils.FileLocator; import org.smpte_ra.schemas.st2067_2_2013.CompositionPlaylistType; import com.netflix.imflibrary.st0377.HeaderPartition; import com.netflix.imflibrary.st0377.header.InterchangeObject; @@ -64,7 +65,10 @@ public void RegXMLLibTest() throws IOException, ParserConfigurationException, Tr /*AudioEssence*/ File inputFile = TestHelper.findResourceByPath("TearsOfSteel_4k_Test_Master_Audio_002.mxf"); File workingDirectory = Files.createTempDirectory(null).toFile(); - IMFTrackFileCPLBuilder imfTrackFileCPLBuilder = new IMFTrackFileCPLBuilder(workingDirectory, inputFile); + IMFTrackFileCPLBuilder imfTrackFileCPLBuilder = new IMFTrackFileCPLBuilder( + workingDirectory, + FileLocator.fromLocation(inputFile.toURI()) + ); IMFTrackFileReader imfTrackFileReader = new IMFTrackFileReader(workingDirectory, new FileByteRangeProvider(inputFile)); IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl(); List essenceDescriptors = imfTrackFileReader.getEssenceDescriptors(imfErrorLogger); diff --git a/src/test/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilderTests.java b/src/test/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilderTests.java index 151a54f9..73ddb37b 100644 --- a/src/test/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilderTests.java +++ b/src/test/java/com/netflix/imflibrary/app/IMFTrackFileCPLBuilderTests.java @@ -18,6 +18,7 @@ import com.netflix.imflibrary.IMFErrorLogger; import com.netflix.imflibrary.IMFErrorLoggerImpl; +import com.netflix.imflibrary.utils.FileLocator; import org.testng.Assert; import org.testng.annotations.Test; @@ -34,7 +35,10 @@ public void IMFTrackFileCPLBuilderTest() throws IOException { File inputFile = TestHelper.findResourceByPath("TearsOfSteel_4k_Test_Master_Audio_002.mxf"); File workingDirectory = Files.createTempDirectory(null).toFile(); - IMFTrackFileCPLBuilder imfTrackFileCPLBuilder = new IMFTrackFileCPLBuilder(workingDirectory, inputFile); + IMFTrackFileCPLBuilder imfTrackFileCPLBuilder = new IMFTrackFileCPLBuilder( + workingDirectory, + FileLocator.fromLocation(inputFile.toURI()) + ); IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl(); Assert.assertTrue(imfTrackFileCPLBuilder.getCompositionPlaylist(imfErrorLogger).length() > 0); } diff --git a/src/test/java/com/netflix/imflibrary/app/IMPAnalyzerTest.java b/src/test/java/com/netflix/imflibrary/app/IMPAnalyzerTest.java index 495b1728..4cf0a26f 100644 --- a/src/test/java/com/netflix/imflibrary/app/IMPAnalyzerTest.java +++ b/src/test/java/com/netflix/imflibrary/app/IMPAnalyzerTest.java @@ -1,6 +1,7 @@ package com.netflix.imflibrary.app; import com.netflix.imflibrary.utils.ErrorLogger; +import com.netflix.imflibrary.utils.FileLocator; import org.testng.Assert; import org.testng.annotations.Test; import testUtils.TestHelper; @@ -19,7 +20,9 @@ public class IMPAnalyzerTest public void IMPAnalyzerTest() throws IOException { File inputFile = TestHelper.findResourceByPath("TestIMP/MERIDIAN_Netflix_Photon_161006/"); - Map> errorMap = analyzePackage(inputFile); + Map> errorMap = analyzePackage( + FileLocator.fromLocation(inputFile.toURI()) + ); Assert.assertEquals(errorMap.size(), 7); errorMap.entrySet().stream().forEach( e -> { diff --git a/src/test/java/com/netflix/imflibrary/st0429_8/PackingListTest.java b/src/test/java/com/netflix/imflibrary/st0429_8/PackingListTest.java index d2b35d50..d17a9350 100644 --- a/src/test/java/com/netflix/imflibrary/st0429_8/PackingListTest.java +++ b/src/test/java/com/netflix/imflibrary/st0429_8/PackingListTest.java @@ -1,6 +1,7 @@ package com.netflix.imflibrary.st0429_8; import com.netflix.imflibrary.IMFErrorLoggerImpl; +import com.netflix.imflibrary.utils.FileLocator; import org.testng.Assert; import org.testng.annotations.Test; import testUtils.TestHelper; @@ -15,7 +16,7 @@ public class PackingListTest public void testPackingList() throws Exception { File inputFile = TestHelper.findResourceByPath("test_mapped_file_set/PKL_51edd4be-4506-494d-a58e-516553055c33.xml"); - PackingList packingList = new PackingList(inputFile); + PackingList packingList = new PackingList(FileLocator.fromLocation(inputFile.toURI())); Assert.assertEquals(packingList.getUUID(), UUID.fromString("51edd4be-4506-494d-a58e-516553055c33")); Assert.assertEquals(packingList.getAssets().size(), 3); Assert.assertTrue(packingList.toString().length() > 0); @@ -32,7 +33,7 @@ public void testPackingList() throws Exception public void testPackingList2016() throws Exception { File inputFile = TestHelper.findResourceByPath("PKL_2067_2_2016.xml"); - PackingList packingList = new PackingList(inputFile); + PackingList packingList = new PackingList(FileLocator.fromLocation(inputFile.toURI())); Assert.assertEquals(packingList.getUUID(), UUID.fromString("7281a71b-0dcb-4ed7-93a4-97b7929e2a7c")); Assert.assertEquals(packingList.getAssets().size(), 2); Assert.assertTrue(packingList.toString().length() > 0); diff --git a/src/test/java/com/netflix/imflibrary/st2067_2/IMPDeliveryTest.java b/src/test/java/com/netflix/imflibrary/st2067_2/IMPDeliveryTest.java index 0dc38244..fb465450 100644 --- a/src/test/java/com/netflix/imflibrary/st2067_2/IMPDeliveryTest.java +++ b/src/test/java/com/netflix/imflibrary/st2067_2/IMPDeliveryTest.java @@ -4,6 +4,7 @@ import com.netflix.imflibrary.InteroperableMasterPackage; import com.netflix.imflibrary.st0429_9.BasicMapProfileV2FileSet; import com.netflix.imflibrary.st0429_9.BasicMapProfileV2MappedFileSet; +import com.netflix.imflibrary.utils.FileLocator; import org.testng.Assert; import org.testng.annotations.Test; import testUtils.TestHelper; @@ -17,7 +18,9 @@ public class IMPDeliveryTest public void testIMPDelivery() throws Exception { File inputFile = TestHelper.findResourceByPath("test_mapped_file_set"); - BasicMapProfileV2MappedFileSet basicMapProfileV2MappedFileSet = new BasicMapProfileV2MappedFileSet(inputFile); + BasicMapProfileV2MappedFileSet basicMapProfileV2MappedFileSet = new BasicMapProfileV2MappedFileSet( + FileLocator.fromLocation(inputFile.toURI()) + ); BasicMapProfileV2FileSet basicMapProfileV2FileSet = new BasicMapProfileV2FileSet(basicMapProfileV2MappedFileSet); IMPDelivery impDelivery = new IMPDelivery(basicMapProfileV2FileSet); Assert.assertTrue(impDelivery.toString().length() > 0);