public static void validateImageCharacteristics()

in src/main/java/com/netflix/imflibrary/st2067_2/Application2ExtendedComposition.java [104:298]


    public static void validateImageCharacteristics(CompositionImageEssenceDescriptorModel imageEssenceDescriptorModel,
                                                    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 (((colorModel.equals(ColorModel.RGB) && storedWidth > MAX_RGB_IMAGE_FRAME_WIDTH) ||
                (colorModel.equals(ColorModel.YUV) && storedWidth > MAX_YUV_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) for ColorModel(%s) as per %s",
                            imageEssenceDescriptorID.toString(), storedWidth, colorModel.name(), applicationCompositionType.toString()));
        }

        //storedHeight
        Integer storedHeight = imageEssenceDescriptorModel.getStoredHeight();
        if (((colorModel.equals(ColorModel.RGB) && storedHeight > MAX_RGB_IMAGE_FRAME_HEIGHT) ||
                        (colorModel.equals(ColorModel.YUV) && storedHeight > MAX_YUV_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) for ColorModel(%s) as per %s",
                            imageEssenceDescriptorID.toString(), storedHeight, colorModel.name(), applicationCompositionType.toString()));
        }

        //PixelBitDepth
        Integer pixelBitDepth = imageEssenceDescriptorModel.getPixelBitDepth();
        Colorimetry color = imageEssenceDescriptorModel.getColor();
        if( !bitDepthsSupported.contains(pixelBitDepth) || !colorToBitDepthMap.get(color).contains(pixelBitDepth)) {
            imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
                    IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
                    String.format("EssenceDescriptor with ID %s invalid PixelBitDepth(%d) for Color(%s) as per %s",
                            imageEssenceDescriptorID.toString(), pixelBitDepth, color.name(), 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();
        Set<Fraction> frameRateSupported = colorModel.equals(ColorModel.RGB) ? rgbaSampleRateSupported : yuvSampleRateSupported;
        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 ColorModel(%s) as per %s",
                            imageEssenceDescriptorID.toString(), sampleRate.toString(), colorModel.name(), applicationCompositionType.toString()));
        }

        //Sampling
        Sampling sampling = imageEssenceDescriptorModel.getSampling();
        if((colorModel.equals(ColorModel.RGB) && !sampling.equals(Sampling.Sampling444)) ||
                (colorModel.equals(ColorModel.YUV) && !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 Sampling(%s) for ColorModel(%s) as per %s",
                            imageEssenceDescriptorID.toString(), sampling.name(), colorModel.name(), applicationCompositionType.toString()));
        }

        //Quantization
        Quantization quantization = imageEssenceDescriptorModel.getQuantization();
        if((colorModel.equals(ColorModel.RGB) && !(quantization.equals(Quantization.QE2) || quantization.equals(Quantization.QE1))) ||
                (colorModel.equals(ColorModel.YUV) && !quantization.equals(Quantization.QE1))) {
            imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
                    IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
                    String.format("EssenceDescriptor with ID %s has Invalid Quantization(%s) for ColorModel(%s) as per %s",
                            imageEssenceDescriptorID.toString(), quantization.name(), colorModel.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:
                }
            } else if (pictureEssenceCoding.getByte(14) == 0x02) {
                switch (pictureEssenceCoding.getByte(15)) {
                    case 0x03: /* J2K_2KIMF_SingleTileLossyProfile_M1S1 */
                    case 0x05: /* J2K_2KIMF_SingleTileLossyProfile_M2S1 */
                    case 0x07: /* J2K_2KIMF_SingleTileLossyProfile_M3S1 */
                    case 0x09: /* J2K_2KIMF_SingleTileLossyProfile_M4S1 */
                    case 0x0a: /* J2K_2KIMF_SingleTileLossyProfile_M4S2 */
                    case 0x0c: /* J2K_2KIMF_SingleTileLossyProfile_M5S1 */
                    case 0x0d: /* J2K_2KIMF_SingleTileLossyProfile_M5S2 */
                    case 0x0e: /* J2K_2KIMF_SingleTileLossyProfile_M5S3 */
                    case 0x10: /* J2K_2KIMF_SingleTileLossyProfile_M6S1 */
                    case 0x11: /* J2K_2KIMF_SingleTileLossyProfile_M6S2 */
                    case 0x12: /* J2K_2KIMF_SingleTileLossyProfile_M6S3 */
                    case 0x13: /* J2K_2KIMF_SingleTileLossyProfile_M6S4 */
                        validProfile = true;
                        break;
                    default:
                }
            } else if (pictureEssenceCoding.getByte(14) == 0x03) {
                switch (pictureEssenceCoding.getByte(15)) {
                    case 0x03: /* J2K_4KIMF_SingleTileLossyProfile_M1S1 */
                    case 0x05: /* J2K_4KIMF_SingleTileLossyProfile_M2S1 */
                    case 0x07: /* J2K_4KIMF_SingleTileLossyProfile_M3S1 */
                    case 0x09: /* J2K_4KIMF_SingleTileLossyProfile_M4S1 */
                    case 0x0a: /* J2K_4KIMF_SingleTileLossyProfile_M4S2 */
                    case 0x0c: /* J2K_4KIMF_SingleTileLossyProfile_M5S1 */
                    case 0x0d: /* J2K_4KIMF_SingleTileLossyProfile_M5S2 */
                    case 0x0e: /* J2K_4KIMF_SingleTileLossyProfile_M5S3 */
                    case 0x10: /* J2K_4KIMF_SingleTileLossyProfile_M6S1 */
                    case 0x11: /* J2K_4KIMF_SingleTileLossyProfile_M6S2 */
                    case 0x12: /* J2K_4KIMF_SingleTileLossyProfile_M6S3 */
                    case 0x13: /* J2K_4KIMF_SingleTileLossyProfile_M6S4 */
                    case 0x15: /* J2K_4KIMF_SingleTileLossyProfile_M7S1 */
                    case 0x16: /* J2K_4KIMF_SingleTileLossyProfile_M7S2 */
                    case 0x17: /* J2K_4KIMF_SingleTileLossyProfile_M7S3 */
                    case 0x18: /* J2K_4KIMF_SingleTileLossyProfile_M7S4 */
                    case 0x19: /* J2K_4KIMF_SingleTileLossyProfile_M7S5 */
                    case 0x1b: /* J2K_4KIMF_SingleTileLossyProfile_M8S1 */
                    case 0x1c: /* J2K_4KIMF_SingleTileLossyProfile_M8S2 */
                    case 0x1d: /* J2K_4KIMF_SingleTileLossyProfile_M8S3 */
                    case 0x1e: /* J2K_4KIMF_SingleTileLossyProfile_M8S4 */
                    case 0x1f: /* J2K_4KIMF_SingleTileLossyProfile_M8S5 */
                    case 0x20: /* J2K_4KIMF_SingleTileLossyProfile_M8S6 */
                        validProfile = true;
                        break;
                    default:
                }
            } else if (pictureEssenceCoding.getByte(14) == 0x05) {
                switch (pictureEssenceCoding.getByte(15)) {
                    case 0x02: /* J2K_2KIMF_SingleMultiTileReversibleProfile_M1S0 */
                    case 0x04: /* J2K_2KIMF_SingleMultiTileReversibleProfile_M2S0 */
                    case 0x06: /* J2K_2KIMF_SingleMultiTileReversibleProfile_M3S0 */
                    case 0x08: /* J2K_2KIMF_SingleMultiTileReversibleProfile_M4S0 */
                    case 0x0b: /* J2K_2KIMF_SingleMultiTileReversibleProfile_M5S0 */
                    case 0x0f: /* J2K_2KIMF_SingleMultiTileReversibleProfile_M6S0 */
                        validProfile = true;
                        break;
                    default:
                }
            } else if (pictureEssenceCoding.getByte(14) == 0x06) {
                switch (pictureEssenceCoding.getByte(15)) {
                    case 0x02: /* J2K_4KIMF_SingleMultiTileReversibleProfile_M1S0 */
                    case 0x04: /* J2K_4KIMF_SingleMultiTileReversibleProfile_M2S0 */
                    case 0x06: /* J2K_4KIMF_SingleMultiTileReversibleProfile_M3S0 */
                    case 0x08: /* J2K_4KIMF_SingleMultiTileReversibleProfile_M4S0 */
                    case 0x0b: /* J2K_4KIMF_SingleMultiTileReversibleProfile_M5S0 */
                    case 0x0f: /* J2K_4KIMF_SingleMultiTileReversibleProfile_M6S0 */
                    case 0x14: /* J2K_4KIMF_SingleMultiTileReversibleProfile_M7S0 */
                    case 0x1a: /* J2K_4KIMF_SingleMultiTileReversibleProfile_M8S0 */
                        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()
            ));

        }

    }