/** * A stateless method that validates an IMFEssenceComponent's header partition and verifies MXF * OP1A and IMF compliance. This could be utilized to perform preliminary validation of IMF * essences * * @param essencesHeaderPartitionPayloads - a list of IMF Essence Component header partition * payloads * @return a list of errors encountered while performing compliance checks on the IMF Essence * Component Header partition * @throws IOException - any I/O related error is exposed through an IOException */ public static List<ErrorLogger.ErrorObject> validateIMFTrackFileHeaderMetadata( List<PayloadRecord> essencesHeaderPartitionPayloads) throws IOException { IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl(); List<PayloadRecord> essencesHeaderPartition = Collections.unmodifiableList(essencesHeaderPartitionPayloads); for (PayloadRecord payloadRecord : essencesHeaderPartition) { if (payloadRecord.getPayloadAssetType() != PayloadRecord.PayloadAssetType.EssencePartition) { imfErrorLogger.addError( IMFErrorLogger.IMFErrors.ErrorCodes.IMP_VALIDATOR_PAYLOAD_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format( "Payload asset type is %s, expected asset type %s", payloadRecord.getPayloadAssetType(), PayloadRecord.PayloadAssetType.EssencePartition.toString())); continue; } HeaderPartition headerPartition = null; try { headerPartition = new HeaderPartition( new ByteArrayDataProvider(payloadRecord.getPayload()), 0L, (long) payloadRecord.getPayload().length, imfErrorLogger); MXFOperationalPattern1A.HeaderPartitionOP1A headerPartitionOP1A = MXFOperationalPattern1A.checkOperationalPattern1ACompliance( headerPartition, imfErrorLogger); IMFConstraints.checkIMFCompliance(headerPartitionOP1A, imfErrorLogger); } catch (IMFException | MXFException e) { if (headerPartition != null) { Preface preface = headerPartition.getPreface(); GenericPackage genericPackage = preface.getContentStorage().getEssenceContainerDataList().get(0).getLinkedPackage(); SourcePackage filePackage = (SourcePackage) genericPackage; UUID packageUUID = filePackage.getPackageMaterialNumberasUUID(); imfErrorLogger.addError( new ErrorLogger.ErrorObject( IMFErrorLogger.IMFErrors.ErrorCodes.IMF_ESSENCE_COMPONENT_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format( "IMFTrackFile with ID %s has fatal errors", packageUUID.toString()))); } if (e instanceof IMFException) { IMFException imfException = (IMFException) e; imfErrorLogger.addAllErrors(imfException.getErrors()); } else if (e instanceof MXFException) { MXFException mxfException = (MXFException) e; imfErrorLogger.addAllErrors(mxfException.getErrors()); } } } return imfErrorLogger.getErrors(); }
private static List<ErrorLogger.ErrorObject> checkVirtualTrackAndEssencesHeaderPartitionPayloadRecords( List<VirtualTrack> virtualTracks, List<PayloadRecord> essencesHeaderPartition) throws IOException { IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl(); Set<UUID> trackFileIDsSet = new HashSet<>(); for (PayloadRecord payloadRecord : essencesHeaderPartition) { if (payloadRecord.getPayloadAssetType() != PayloadRecord.PayloadAssetType.EssencePartition) { throw new IMFException( String.format( "Payload asset type is %s, expected asset type %s", payloadRecord.getPayloadAssetType(), PayloadRecord.PayloadAssetType.EssencePartition.toString()), imfErrorLogger); } HeaderPartition headerPartition = new HeaderPartition( new ByteArrayDataProvider(payloadRecord.getPayload()), 0L, (long) payloadRecord.getPayload().length, imfErrorLogger); try { /** * Add the Top Level Package UUID to the set of TrackFileIDs, this is required to validate * that the essences header partition that were passed in are in fact from the constituent * resources of the VirtualTack */ MXFOperationalPattern1A.HeaderPartitionOP1A headerPartitionOP1A = MXFOperationalPattern1A.checkOperationalPattern1ACompliance( headerPartition, imfErrorLogger); IMFConstraints.HeaderPartitionIMF headerPartitionIMF = IMFConstraints.checkIMFCompliance(headerPartitionOP1A, imfErrorLogger); Preface preface = headerPartitionIMF.getHeaderPartitionOP1A().getHeaderPartition().getPreface(); GenericPackage genericPackage = preface.getContentStorage().getEssenceContainerDataList().get(0).getLinkedPackage(); SourcePackage filePackage = (SourcePackage) genericPackage; UUID packageUUID = filePackage.getPackageMaterialNumberasUUID(); trackFileIDsSet.add(packageUUID); } catch (IMFException | MXFException e) { Preface preface = headerPartition.getPreface(); GenericPackage genericPackage = preface.getContentStorage().getEssenceContainerDataList().get(0).getLinkedPackage(); SourcePackage filePackage = (SourcePackage) genericPackage; UUID packageUUID = filePackage.getPackageMaterialNumberasUUID(); imfErrorLogger.addError( new ErrorLogger.ErrorObject( IMFErrorLogger.IMFErrors.ErrorCodes.IMF_ESSENCE_COMPONENT_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format("IMFTrackFile with ID %s has fatal errors", packageUUID.toString()))); if (e instanceof IMFException) { IMFException imfException = (IMFException) e; imfErrorLogger.addAllErrors(imfException.getErrors()); } else if (e instanceof MXFException) { MXFException mxfException = (MXFException) e; imfErrorLogger.addAllErrors(mxfException.getErrors()); } } } Set<UUID> virtualTrackResourceIDsSet = new HashSet<>(); for (Composition.VirtualTrack virtualTrack : virtualTracks) { if (virtualTrack instanceof IMFEssenceComponentVirtualTrack) { virtualTrackResourceIDsSet.addAll( IMFEssenceComponentVirtualTrack.class.cast(virtualTrack).getTrackResourceIds()); } else { imfErrorLogger.addError( IMFErrorLogger.IMFErrors.ErrorCodes.IMF_ESSENCE_COMPONENT_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format( "VirtualTrack with TrackId %s is not an Essence Component Virtual Track", virtualTrack.getTrackID().toString())); } } /** * Following check ensures that the Header Partitions corresponding to all the Resources of the * VirtualTracks were passed in. */ Set<UUID> unreferencedResourceIDsSet = new HashSet<>(); for (UUID uuid : virtualTrackResourceIDsSet) { if (!trackFileIDsSet.contains(uuid)) { unreferencedResourceIDsSet.add(uuid); } } if (unreferencedResourceIDsSet.size() > 0) { imfErrorLogger.addError( new ErrorLogger.ErrorObject( IMFErrorLogger.IMFErrors.ErrorCodes.IMP_VALIDATOR_PAYLOAD_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format( "It seems that no EssenceHeaderPartition data was passed in for " + "VirtualTrack Resource Ids %s, please verify that the correct Header Partition payloads for the " + "Virtual Track were passed in", Utilities.serializeObjectCollectionToString(unreferencedResourceIDsSet)))); } /** * Following check ensures that the Header Partitions corresponding to only the Resource that * are a part of the VirtualTracks were passed in. */ Set<UUID> unreferencedTrackFileIDsSet = new HashSet<>(); for (UUID uuid : trackFileIDsSet) { if (!virtualTrackResourceIDsSet.contains(uuid)) { unreferencedTrackFileIDsSet.add(uuid); } } if (unreferencedTrackFileIDsSet.size() > 0) { imfErrorLogger.addError( new ErrorLogger.ErrorObject( IMFErrorLogger.IMFErrors.ErrorCodes.IMP_VALIDATOR_PAYLOAD_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format( "It seems that EssenceHeaderPartition data was passed in for " + "Resource Ids %s which are not part of this virtual track, please verify that only the Header " + "Partition payloads for the Virtual Track were passed in", Utilities.serializeObjectCollectionToString(unreferencedTrackFileIDsSet)))); } return imfErrorLogger.getErrors(); }