public static List isCPLMergeable()

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();
    }