in src/main/java/com/netflix/imflibrary/st2067_2/IMFCoreConstraintsChecker.java [419:479]
public static List<ErrorLogger.ErrorObject> checkVirtualTrackResourceList(UUID trackID, List<? extends IMFBaseResourceType>
virtualBaseResourceList){
IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl();
//Section 6.9.3 st2067-3:2016
if(virtualBaseResourceList == null
|| virtualBaseResourceList.size() == 0){
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format("VirtualTrack with ID %s does not have any associated resources this is invalid", trackID.toString()));
return imfErrorLogger.getErrors();
}
Set<Composition.EditRate> editRates = new HashSet<>();
Composition.EditRate baseResourceEditRate = null;
for(IMFBaseResourceType baseResource : virtualBaseResourceList){
long compositionPlaylistResourceIntrinsicDuration = baseResource.getIntrinsicDuration().longValue();
long compositionPlaylistResourceEntryPoint = (baseResource.getEntryPoint() == null) ? 0L : baseResource.getEntryPoint().longValue();
//Check to see if the Resource's source duration value is in the valid range as specified in st2067-3:2013 section 6.11.6
if(baseResource.getSourceDuration() != null){
if(baseResource.getSourceDuration().longValue() < 0
|| baseResource.getSourceDuration().longValue() > (compositionPlaylistResourceIntrinsicDuration - compositionPlaylistResourceEntryPoint)){
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format("VirtualTrack with ID %s has a resource with ID %s, that has an invalid source duration value %d, should be in the range [0,%d]",
trackID.toString(),
baseResource.getId(),
baseResource.getSourceDuration().longValue(),
(compositionPlaylistResourceIntrinsicDuration - compositionPlaylistResourceEntryPoint)));
}
}
//Check to see if the Marker Resource's intrinsic duration value is in the valid range as specified in st2067-3:2013 section 6.13
if (baseResource instanceof IMFMarkerResourceType) {
IMFMarkerResourceType markerResource = IMFMarkerResourceType.class.cast(baseResource);
List<IMFMarkerType> markerList = markerResource.getMarkerList();
for (IMFMarkerType marker : markerList) {
if (marker.getOffset().longValue() >= markerResource.getIntrinsicDuration().longValue()) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR, IMFErrorLogger
.IMFErrors.ErrorLevels.FATAL, String.format("VirtualTrack with ID %s has a " +
"resource with ID %s, that has a marker %s, that has an invalid offset " +
"value %d, should be in the range [0,%d] ",
trackID.toString(),
markerResource.getId(), marker.getLabel().getValue(), marker
.getOffset().longValue(), markerResource.getIntrinsicDuration().longValue()-1));
}
}
}
baseResourceEditRate = baseResource.getEditRate();
if(baseResourceEditRate != null){
editRates.add(baseResourceEditRate);
}
}
//Section 6.2, 6.3.1 and 6.3.2 st2067-2:2016
if(editRates.size() > 1){
StringBuilder editRatesString = new StringBuilder();
Iterator iterator = editRates.iterator();
while(iterator.hasNext()){
editRatesString.append(iterator.next().toString());
editRatesString.append(String.format("%n"));
}
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CORE_CONSTRAINTS_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format("VirtualTrack with ID %s has resources with inconsistent editRates %s", trackID.toString(), editRatesString.toString()));
}
return imfErrorLogger.getErrors();
}