in src/main/java/com/netflix/imflibrary/st2067_2/Application5Composition.java [149:394]
public static void validatePictureEssenceDescriptor(CompositionImageEssenceDescriptorModel imageEssenceDescriptorModel,
ApplicationCompositionFactory.ApplicationCompositionType applicationCompositionType,
IMFErrorLogger
imfErrorLogger)
{
UUID imageEssenceDescriptorID = imageEssenceDescriptorModel.getImageEssencedescriptorID();
ColorModel colorModel = imageEssenceDescriptorModel.getColorModel();
if( !colorModel.equals(ColorModel.RGB)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall be an RGBA descriptor per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
return;
}
Integer storedWidth = imageEssenceDescriptorModel.getStoredWidth();
Integer storedHeight = imageEssenceDescriptorModel.getStoredHeight();
if ((storedWidth <= 0) || (storedHeight <= 0)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid storedWidth(%d) or storedHeight(%d) as per %s",
imageEssenceDescriptorID.toString(), storedWidth, storedHeight, applicationCompositionType.toString()));
}
Integer sampleWidth = imageEssenceDescriptorModel.getSampleWidth();
Integer sampleHeight = imageEssenceDescriptorModel.getSampleHeight();
if ((sampleWidth != null && !sampleWidth.equals(storedWidth)) ||
(sampleHeight != null && !sampleHeight.equals(storedHeight))) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid sampleWidth(%d) or sampleHeight(%d) as per %s",
imageEssenceDescriptorID.toString(), sampleWidth != null ? sampleWidth : 0, sampleHeight != null ? sampleHeight : 0,
applicationCompositionType.toString()));
}
Integer displayWidth = imageEssenceDescriptorModel.getDisplayWidth();
Integer displayHeight = imageEssenceDescriptorModel.getDisplayHeight();
if ((displayWidth <= 0) || (displayHeight <= 0)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid displayWidth(%d) or displayHeight(%d) item as per %s",
imageEssenceDescriptorID.toString(), displayWidth, displayHeight, applicationCompositionType.toString()));
}
Integer displayXOffset = imageEssenceDescriptorModel.getDisplayXOffset();
Integer displayYOffset = imageEssenceDescriptorModel.getDisplayYOffset();
if ((displayXOffset == null) || (displayYOffset == null)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has no displayXOffset or displayYOffset item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
Fraction imageAspectRatio = imageEssenceDescriptorModel.getImageAspectRatio();
if( imageAspectRatio == null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall have an Aspect Ratio item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
} //TODO: Test if imageAspectRatio == roundToIntegralTiesToAway(DisplayWidth*pixelAspectRatio) / DisplayHeight
ColorPrimaries colorPrimaries = imageEssenceDescriptorModel.getColorPrimaries();
if(!colorPrimaries.equals(ColorPrimaries.ACES)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid ColorPrimaries as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
TransferCharacteristic transferCharacteristic = imageEssenceDescriptorModel.getTransferCharacteristic();
if(!transferCharacteristic.equals(TransferCharacteristic.Linear)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid TransferCharacteristic as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
Colorimetry color = imageEssenceDescriptorModel.getColor();
if(!color.equals(Colorimetry.Color_App5_AP0)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid ColorPrimaries(%s) as per %s",
imageEssenceDescriptorID.toString(), colorPrimaries.name(), applicationCompositionType.toString()));
}
UL essenceContainerFormatUL = imageEssenceDescriptorModel.getEssenceContainerFormatUL();
UL MXFGCFrameWrappedACESPictures = UL.fromULAsURNStringToUL("urn:smpte:ul:060e2b34.0401010d.0d010301.02190100"); // MXF-GC Frame-wrapped ACES Pictures per 2065-5
if(essenceContainerFormatUL == null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s does not contain a ContainerFormat as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
} else {
if (!essenceContainerFormatUL.equals(MXFGCFrameWrappedACESPictures)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid ContainerFormat(%s) as per %s",
imageEssenceDescriptorID.toString(), essenceContainerFormatUL.toString(), applicationCompositionType.toString()));
}
}
Integer offset = imageEssenceDescriptorModel.getSampledXOffset();
if((offset != null) && (offset != 0)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid SampledXOffset (%d) as per %s",
imageEssenceDescriptorID.toString(), offset, applicationCompositionType.toString()));
}
offset = imageEssenceDescriptorModel.getSampledYOffset();
if((offset != null) && (offset != 0)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has an invalid SampledYOffset (%d) item as per %s",
imageEssenceDescriptorID.toString(), offset, applicationCompositionType.toString()));
}
//FrameLayout
FrameLayoutType frameLayoutType = imageEssenceDescriptorModel.getFrameLayoutType();
if (!frameLayoutType.equals(FrameLayoutType.FullFrame)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid FrameLayout(%s) as per %s",
imageEssenceDescriptorID.toString(), frameLayoutType.name(), applicationCompositionType.toString()));
}
//SampleRate
Fraction sampleRate = imageEssenceDescriptorModel.getSampleRate();
if (sampleRate.equals(new Fraction(0))) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has no SampleRate per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
//The following items shall not be present per 2065-5 Table 10
if(imageEssenceDescriptorModel.getStoredOffset() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain a StoredF2Offset item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getDisplayF2Offset() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain a DisplayF2Offset item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getActiveFormatDescriptor() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain an Active Format Descriptor item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getAlphaTransparency() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain an Alpha Transparency as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getImageAlignmentOffset() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain an Image Alignment Offset item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getStoredOffset() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain a StoredF2Offset item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getImageStartOffset() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain an Image Start Offset item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getImageEndOffset() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain an Image End Offset item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getFieldDominance() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain a Field Dominance item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getCodingEquations() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain a Coding Equations item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getComponentMaxRef() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain a Component Max Ref item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getComponentMinRef() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain a Component Min Ref item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getAlphaMaxRef() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain an Alpha Max Ref item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getAlphaMinRef() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain an Alpha Min Ref item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getPalette() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain a Palette item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
if(imageEssenceDescriptorModel.getPaletteLayout() != null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s shall not contain a Palette Layout item as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
}
}