in src/main/java/com/netflix/imflibrary/RESTfulInterfaces/IMPValidator.java [441:532]
public static List<ErrorLogger.ErrorObject> isCPLMergeable(PayloadRecord referenceCPLPayloadRecord, List<PayloadRecord> cplPayloads) throws IOException {
IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl();
List<PayloadRecord> cplPayloadRecords = Collections.unmodifiableList(cplPayloads);
List<ApplicationComposition> applicationCompositions = new ArrayList<>();
try
{
ApplicationComposition applicationComposition = ApplicationCompositionFactory.getApplicationComposition(new ByteArrayByteRangeProvider(referenceCPLPayloadRecord.getPayload()),
imfErrorLogger);
if(applicationComposition == null) {
return imfErrorLogger.getErrors();
}
applicationCompositions.add(applicationComposition);
}
catch(IMFException e)
{
imfErrorLogger.addAllErrors(e.getErrors());
}
for (PayloadRecord cpl : cplPayloadRecords) {
try
{
ApplicationComposition applicationComposition = ApplicationCompositionFactory.getApplicationComposition(new ByteArrayByteRangeProvider(cpl.getPayload()),
imfErrorLogger);
if(applicationComposition != null) {
applicationCompositions.add(applicationComposition);
}
}
catch(IMFException e)
{
imfErrorLogger.addAllErrors(e.getErrors());
}
}
if(imfErrorLogger.hasFatalErrors()) {
return imfErrorLogger.getErrors();
}
VirtualTrack referenceVideoVirtualTrack = applicationCompositions.get(0).getVideoVirtualTrack();
UUID referenceCPLUUID = applicationCompositions.get(0).getUUID();
for (int i = 1; i < applicationCompositions.size(); i++) {
if (!referenceVideoVirtualTrack.equivalent(applicationCompositions.get(i).getVideoVirtualTrack())) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("CPL Id %s can't be merged with Reference CPL Id %s, since the video virtual tracks do not seem to represent the same timeline.", applicationCompositions.get(i).getUUID(), referenceCPLUUID));
}
}
/**
* Perform AudioTrack mergeability checks
* 1) Identify AudioTracks that are the same language
* 2) Compare language tracks to see if they represent the same timeline
*/
Boolean bAudioVirtualTrackMapFail = false;
List<Map<Set<DOMNodeObjectModel>, ? extends VirtualTrack>> audioVirtualTracksMapList = new ArrayList<>();
for (ApplicationComposition applicationComposition : applicationCompositions) {
try {
audioVirtualTracksMapList.add(applicationComposition.getAudioVirtualTracksMap());
}
catch(IMFException e)
{
bAudioVirtualTrackMapFail = false;
imfErrorLogger.addAllErrors(e.getErrors());
}
}
if(!bAudioVirtualTrackMapFail) {
Map<Set<DOMNodeObjectModel>, ? extends VirtualTrack> referenceAudioVirtualTracksMap = audioVirtualTracksMapList.get(0);
for (int i = 1; i < audioVirtualTracksMapList.size(); i++) {
if (!compareAudioVirtualTrackMaps(Collections.unmodifiableMap(referenceAudioVirtualTracksMap), Collections.unmodifiableMap(audioVirtualTracksMapList.get(i)), imfErrorLogger)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("CPL Id %s can't be merged with Reference CPL Id %s, since 2 same language audio tracks do not seem to represent the same timeline.", applicationCompositions.get(i).getUUID(), referenceCPLUUID));
}
}
}
/**
* Perform MarkerTrack mergeability checks
*/
Composition.VirtualTrack referenceMarkerVirtualTrack = applicationCompositions.get(0).getMarkerVirtualTrack();
if (referenceMarkerVirtualTrack != null) {
UUID referenceMarkerCPLUUID = applicationCompositions.get(0).getUUID();
for (int i = 1; i < applicationCompositions.size(); i++) {
if (!referenceMarkerVirtualTrack.equivalent(applicationCompositions.get(i).getMarkerVirtualTrack())) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("CPL Id %s can't be merged with Reference CPL Id %s, since the marker virtual tracks do not seem to represent the same timeline.", applicationCompositions.get(i).getUUID(), referenceMarkerCPLUUID));
}
}
}
return imfErrorLogger.getErrors();
}