in src/main/java/com/netflix/imflibrary/st2067_2/Application2Composition.java [177:304]
public static void validateImageCharacteristics(CompositionImageEssenceDescriptorModel imageEssenceDescriptorModel,
ApplicationCompositionFactory.ApplicationCompositionType applicationCompositionType,
IMFErrorLogger imfErrorLogger)
{
UUID imageEssenceDescriptorID = imageEssenceDescriptorModel.getImageEssencedescriptorID();
ColorModel colorModel = imageEssenceDescriptorModel.getColorModel();
if( !colorModel.equals(ColorModel.RGB) && !colorModel.equals(ColorModel.YUV)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has Invalid color components as per %s",
imageEssenceDescriptorID.toString(), applicationCompositionType.toString()));
return;
}
//storedWidth
Integer storedWidth = imageEssenceDescriptorModel.getStoredWidth();
if (storedWidth > MAX_IMAGE_FRAME_WIDTH) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid StoredWidth(%d) as per %s",
imageEssenceDescriptorID.toString(), storedWidth, applicationCompositionType.toString()));
}
//storedHeight
Integer storedHeight = imageEssenceDescriptorModel.getStoredHeight();
if (storedHeight > MAX_IMAGE_FRAME_HEIGHT) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid storedHeight(%d) as per %s",
imageEssenceDescriptorID.toString(), storedHeight, applicationCompositionType.toString()));
}
//PixelBitDepth
Integer pixelBitDepth = imageEssenceDescriptorModel.getPixelBitDepth();
if( !(pixelBitDepth.equals(8) || pixelBitDepth.equals(10))) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s invalid PixelBitDepth(%d) as per %s",
imageEssenceDescriptorID.toString(), pixelBitDepth, applicationCompositionType.toString()));
}
Integer componentDepth = imageEssenceDescriptorModel.getComponentDepth();
if (colorModel.equals(ColorModel.YUV) && !pixelBitDepth.equals(componentDepth)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has a PixelBitDepth(%d) not matching Component Depth (%d) as per %s",
imageEssenceDescriptorID.toString(), pixelBitDepth, componentDepth, applicationCompositionType.toString()));
}
//FrameLayout
FrameLayoutType frameLayoutType = imageEssenceDescriptorModel.getFrameLayoutType();
if (!frameLayoutType.equals(FrameLayoutType.FullFrame) && !frameLayoutType.equals(FrameLayoutType.SeparateFields)) {
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()));
}
else {
//SampleRate
Fraction sampleRate = imageEssenceDescriptorModel.getSampleRate();
Set<Fraction> frameRateSupported = frameLayoutType.equals(FrameLayoutType.FullFrame) ? progressiveSampleRateSupported : interlaceSampleRateSupported;
if (!frameRateSupported.contains(sampleRate)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has Invalid SampleRate(%s) for frame structure %s as per %s",
imageEssenceDescriptorID.toString(), sampleRate.toString(), frameLayoutType.name(), applicationCompositionType.toString()));
}
}
//Sampling
Sampling sampling = imageEssenceDescriptorModel.getSampling();
if(frameLayoutType.equals(FrameLayoutType.SeparateFields) && !sampling.equals(Sampling.Sampling422) ) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid combination of FrameLayOut(%s) for Sampling(%s) as per %s",
imageEssenceDescriptorID.toString(), frameLayoutType.name(), sampling.name(), applicationCompositionType.toString()));
}
//Quantization
Quantization quantization = imageEssenceDescriptorModel.getQuantization();
Colorimetry color = imageEssenceDescriptorModel.getColor();
if((sampling.equals(Sampling.Sampling422) &&
!(quantization.equals(Quantization.QE1) && colorModel.equals(ColorModel.YUV))) ||
(quantization.equals(Quantization.QE2) &&
!(colorModel.equals(ColorModel.RGB) && color.equals(Colorimetry.Color3)))) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("EssenceDescriptor with ID %s has invalid combination of quantization(%s)-Sampling(%s)-colorModel(%s)-color(%s) as per %s",
imageEssenceDescriptorID.toString(), quantization.name(), sampling.name(), colorModel.name(), color.name(), applicationCompositionType.toString()));
}
//Coding
UL pictureEssenceCoding = imageEssenceDescriptorModel.getPictureEssenceCodingUL();
if(pictureEssenceCoding.equalsWithMask(JPEG2000PICTURECODINGSCHEME, 0b1111111011111100)) {
boolean validProfile = false;
if (pictureEssenceCoding.getByte(14) == 0x01) {
switch (pictureEssenceCoding.getByte(15)) {
case 0x11: /* JPEG2000BroadcastContributionSingleTileProfileLevel1 */
case 0x12: /* JPEG2000BroadcastContributionSingleTileProfileLevel2 */
case 0x13: /* JPEG2000BroadcastContributionSingleTileProfileLevel3 */
case 0x14: /* JPEG2000BroadcastContributionSingleTileProfileLevel4 */
case 0x15: /* JPEG2000BroadcastContributionSingleTileProfileLevel5 */
case 0x16: /* JPEG2000BroadcastContributionMultiTileReversibleProfileLevel6 */
case 0x17: /* JPEG2000BroadcastContributionMultiTileReversibleProfileLevel7 */
validProfile = true;
break;
default:
}
}
if (! validProfile) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
String.format("Invalid JPEG 2000 profile: %s", pictureEssenceCoding.toString()
));
}
} else {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
IMFErrorLogger.IMFErrors.ErrorLevels.FATAL,
String.format("Image codec must be JPEG 2000. Found %s instead.", pictureEssenceCoding.toString()
));
}
}