in src/main/java/com/netflix/imflibrary/app/IMPAnalyzer.java [428:521]
public static List<ApplicationComposition> analyzeApplicationCompositions( File rootFile,
AssetMap assetMap,
PackingList packingList,
List<PayloadRecord> headerPartitionPayloadRecords,
IMFErrorLogger packingListErrorLogger,
Map<String, List<ErrorLogger.ErrorObject>> errorMap,
Map<UUID, PayloadRecord> trackFileIDToHeaderPartitionPayLoadMap) throws IOException {
List<ApplicationComposition> applicationCompositionList = new ArrayList<>();
for (PackingList.Asset asset : packingList.getAssets()) {
if (asset.getType().equals(PackingList.Asset.TEXT_XML_TYPE)) {
URI path = assetMap.getPath(asset.getUUID());
if (path == null) {
packingListErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_PKL_ERROR,
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());
if (!assetFile.exists()) {
packingListErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_PKL_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format("Cannot find asset with path %s ID = %s", assetFile.getAbsolutePath(), asset.getUUID().toString()));
continue;
}
ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile);
if (ApplicationComposition.isCompositionPlaylist(resourceByteRangeProvider)) {
IMFErrorLogger compositionErrorLogger = new IMFErrorLoggerImpl();
IMFErrorLogger compositionConformanceErrorLogger = new IMFErrorLoggerImpl();
PayloadRecord cplPayloadRecord = new PayloadRecord(resourceByteRangeProvider.getByteRangeAsBytes(0, resourceByteRangeProvider.getResourceSize() - 1),
PayloadRecord.PayloadAssetType.CompositionPlaylist, 0L, resourceByteRangeProvider.getResourceSize());
try {
ApplicationComposition applicationComposition = ApplicationCompositionFactory.getApplicationComposition(resourceByteRangeProvider, compositionErrorLogger);
if (applicationComposition == null) {
continue;
}
if (!applicationComposition.getUUID().equals(asset.getUUID())) {
// ST 2067-2:2016 7.3.1: The value of the Id element shall be extracted from the asset as specified in Table 19 for the CPL asset
compositionErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("UUID %s in the CPL is not same as UUID %s of the CPL in the AssetMap", applicationComposition.getUUID().toString(), asset.getUUID().toString()));
}
applicationCompositionList.add(applicationComposition);
Set<UUID> trackFileIDsSet = trackFileIDToHeaderPartitionPayLoadMap
.keySet();
// ST 2067-203 MGASADMVirtualTrackParameterSet checks
List<ErrorLogger.ErrorObject> errors = IMFMGASADMConstraintsChecker.checkMGASADMVirtualTrackParameterSet(applicationComposition);
// Report MGASADMVirtualTrackParameterSet as both CPL and Virtual Track errors
compositionConformanceErrorLogger.addAllErrors(errors);
compositionErrorLogger.addAllErrors(errors);
try {
if (!isCompositionComplete(applicationComposition, trackFileIDsSet, compositionConformanceErrorLogger)) {
for (IMFEssenceComponentVirtualTrack virtualTrack : applicationComposition.getEssenceVirtualTracks()) {
Set<UUID> trackFileIds = virtualTrack.getTrackResourceIds();
List<PayloadRecord> trackHeaderPartitionPayloads = new ArrayList<>();
for (UUID trackFileId : trackFileIds) {
if (trackFileIDToHeaderPartitionPayLoadMap.containsKey(trackFileId))
trackHeaderPartitionPayloads.add
(trackFileIDToHeaderPartitionPayLoadMap.get(trackFileId));
}
if (isVirtualTrackComplete(virtualTrack, trackFileIDsSet)) {
compositionConformanceErrorLogger.addAllErrors(IMPValidator.isVirtualTrackInCPLConformed(cplPayloadRecord, virtualTrack, trackHeaderPartitionPayloads));
} else if (trackHeaderPartitionPayloads.size() != 0) {
compositionConformanceErrorLogger.addAllErrors(IMPValidator.conformVirtualTracksInCPL(cplPayloadRecord, trackHeaderPartitionPayloads, false));
}
}
} else {
List<PayloadRecord> cplHeaderPartitionPayloads = applicationComposition.getEssenceVirtualTracks()
.stream()
.map(IMFEssenceComponentVirtualTrack::getTrackResourceIds)
.flatMap(Set::stream)
.map(e -> trackFileIDToHeaderPartitionPayLoadMap.get(e))
.collect(Collectors.toList());
compositionConformanceErrorLogger.addAllErrors(IMPValidator.areAllVirtualTracksInCPLConformed(cplPayloadRecord, cplHeaderPartitionPayloads));
}
} catch (IMFException e) {
compositionConformanceErrorLogger.addAllErrors(e.getErrors());
} finally {
errorMap.put(assetFile.getName() + " " + CONFORMANCE_LOGGER_PREFIX, compositionConformanceErrorLogger.getErrors());
}
} catch (IMFException e) {
compositionErrorLogger.addAllErrors(e.getErrors());
} finally {
errorMap.put(assetFile.getName(), compositionErrorLogger.getErrors());
}
}
}
}
return applicationCompositionList;
}