private void parseApp5PixelLayout()

in src/main/java/com/netflix/imflibrary/st2067_2/CompositionImageEssenceDescriptorModel.java [721:808]


    private void parseApp5PixelLayout() {
        DOMNodeObjectModel pixelLayout = imageEssencedescriptorDOMNode.getDOMNode(regXMLLibDictionary.getSymbolNameFromURN(pixelLayoutUL));
        if (pixelLayout == null) {
            imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
                    IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
                    String.format("EssenceDescriptor with ID %s shall have a Pixel Layout item",
                            imageEssencedescriptorID.toString()));
        } else {
            List<DOMNodeObjectModel> rgbaComponents = pixelLayout.getDOMNodes(regXMLLibDictionary.getSymbolNameFromURN(rgbaComponentUL));
            if (rgbaComponents.size() == 0) {
                imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
                        IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
                        String.format("EssenceDescriptor with ID %s is missing RGBAComponent in Pixel Layout",
                                imageEssencedescriptorID.toString()));
            } else {
                Map<RGBAComponentType, Integer> componentMap = new LinkedHashMap<>();
                List<RGBAComponentType> componentList = new ArrayList<>();
                for (DOMNodeObjectModel domNodeObjectModel : rgbaComponents) {
                    String code = domNodeObjectModel.getFieldAsString(regXMLLibDictionary.getTypeFieldNameFromURN(rgbaComponentUL, codeUL));
                    if (code == null) {
                        imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
                                IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
                                String.format("EssenceDescriptor with ID %s has a Pixel Layout item with an RGBAComponent with missing Code",
                                        imageEssencedescriptorID.toString()));
                    } else {
                        RGBAComponentType codeValue = RGBAComponentType.valueOf(regXMLLibDictionary.getEnumerationValueFromName(rgbaComponentKindUL, code));
                        Integer pixelBitDepth = domNodeObjectModel.getFieldAsInteger(regXMLLibDictionary.getTypeFieldNameFromURN(rgbaComponentUL, componentSizeUL));
                        if (pixelBitDepth == null) {
                            imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
                                    IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
                                    String.format("EssenceDescriptor with ID %s has a Pixel Layout item with an RGBAComponent %s with missing Depth",
                                            imageEssencedescriptorID.toString(), code));
                        } else {
                            if ((codeValue.equals(Null) && pixelBitDepth != 0) ||
                                    (!codeValue.equals(Null) && (!pixelBitDepth.equals(253)))) { // In App#5, all components are of type HALF FLOAT
                                imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
                                        IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
                                        String.format("EssenceDescriptor with ID %s has a Pixel Layout item %s with invalid Depth value %d (expected depth value: 253)",
                                                imageEssencedescriptorID.toString(), code, pixelBitDepth));
                            }
                        }
                        if (componentMap.containsKey(codeValue)) {
                            Integer count = componentMap.get(codeValue);
                            componentMap.put(codeValue, count + 1);
                        } else {
                            componentMap.put(codeValue, 1);
                            componentList.add(codeValue);
                        }

                    }
                }
                boolean error = true;
                if (componentList.size() >= 4) { // ABGR or BGR per 2067-50 plus Null
                    if (componentList.get(0).toString().equals("Alpha")) { // ABGR per 2067-50
                        if (componentList.get(1).toString().equals("Blue") || componentList.get(2).toString().equals("Green") || componentList.get(3).toString().equals("Red") )
                            error = false;
                    } else if (componentList.get(0).toString().equals("Blue")) { // BGR per 2067-50
                        if (componentList.get(1).toString().equals("Green") || componentList.get(2).toString().equals("Red"))
                            error = false;
                    }
                }
                if (error) {
                    imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
                            IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
                            String.format("EssenceDescriptor with ID %s has incorrect PixelLayout %s",
                                    imageEssencedescriptorID.toString(), componentList.toString()));
                }
                componentMap.entrySet().stream().forEach(
                        e -> {
                            if (e.getKey().equals(RGBAComponentType.Null)) {
                                if (!(e.getValue().equals(5) || e.getValue().equals(4))) { // ABGR or BGR per 2067-50
                                    imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
                                            IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
                                            String.format("EssenceDescriptor with ID %s and ColorModel %s has invalid number of RGBAComponent %s in J2CLayout",
                                                    imageEssencedescriptorID.toString(), colorModel.name(), e.getKey()));
                                }
                            } else if (!e.getValue().equals(1)) {
                                imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.APPLICATION_COMPOSITION_ERROR,
                                        IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
                                        String.format("EssenceDescriptor with ID %s has more than one RGBAComponent %s in Pixel Layout",
                                                imageEssencedescriptorID.toString(), e.getKey()));
                            }

                        }
                        );
            }
        }
    }