public static J2KHeaderParameters fromDOMNode()

in src/main/java/com/netflix/imflibrary/J2KHeaderParameters.java [130:258]


    public static J2KHeaderParameters fromDOMNode(DOMNodeObjectModel imageEssencedescriptorDOMNode) {
        J2KHeaderParameters p = new J2KHeaderParameters();

        DOMNodeObjectModel sdNode = imageEssencedescriptorDOMNode.getDOMNode("SubDescriptors");
        if (sdNode == null) {
            return null;
        }

        DOMNodeObjectModel j2kNode = sdNode.getDOMNode("JPEG2000SubDescriptor");
        if (j2kNode == null) {
            return null;
        }

        p.rsiz = j2kNode.getFieldAsInteger("Rsiz");
        if (p.rsiz == null) return null;

        p.xsiz = j2kNode.getFieldAsLong("Xsiz");
        if (p.xsiz == null) return null;

        p.ysiz = j2kNode.getFieldAsLong("Ysiz");
        if (p.ysiz == null) return null;

        p.xosiz = j2kNode.getFieldAsLong("XOsiz");
        if (p.xosiz == null) return null;

        p.yosiz = j2kNode.getFieldAsLong("YOsiz");
        if (p.yosiz == null) return null;

        p.xtsiz = j2kNode.getFieldAsLong("XTsiz");
        if (p.xtsiz == null) return null;

        p.ytsiz = j2kNode.getFieldAsLong("YTsiz");
        if (p.ytsiz == null) return null;

        p.xtosiz = j2kNode.getFieldAsLong("XTOsiz");
        if (p.xtosiz == null) return null;

        p.ytosiz = j2kNode.getFieldAsLong("YTOsiz");
        if (p.ytosiz == null) return null;

        // CSiz
        DOMNodeObjectModel csiziNode = j2kNode.getDOMNode("PictureComponentSizing");
        if (csiziNode == null) return null;

        List<DOMNodeObjectModel> csizi = csiziNode.getDOMNodes("J2KComponentSizing");
        p.csiz = new CSiz[csizi.size()];
        for (int i = 0; i < p.csiz.length; i++) {
            p.csiz[i] = new CSiz();

            Short ssiz = csizi.get(i).getFieldAsShort("Ssiz");
            if (ssiz == null) return null;
            p.csiz[i].ssiz = ssiz;

            Short xrsiz = csizi.get(i).getFieldAsShort("XRSiz");
            if (xrsiz == null) return null;
            p.csiz[i].xrsiz = xrsiz;

            Short yrsiz = csizi.get(i).getFieldAsShort("YRSiz");
            if (yrsiz == null) return null;
            p.csiz[i].yrsiz = yrsiz;
        }

        Integer csiz = j2kNode.getFieldAsInteger("Csiz");
        if (csiz != p.csiz.length) return null;

        // CAP
        DOMNodeObjectModel capNode = j2kNode.getDOMNode("J2KExtendedCapabilities");
        if (capNode != null) {
            Integer pcap = capNode.getFieldAsInteger("Pcap");
            if (pcap != null) {
                p.cap = new CAP();
                p.cap.pcap = pcap;

                DOMNodeObjectModel ccapiNode = capNode.getDOMNode("Ccapi");
                if (ccapiNode != null) {
                    List<Integer> values = ccapiNode.getFieldsAsInteger("UInt16");

                    p.cap.ccap = new int[values.size()];
                    for (int i = 0; i < p.cap.ccap.length; i++) {
                        if (values.get(i) == null) return null;
                        p.cap.ccap[i] = values.get(i);
                    }
                }

                int ccapLength = Long.bitCount(p.cap.pcap);
                if (ccapLength > 0 && (p.cap.ccap == null || p.cap.ccap.length != ccapLength))
                    return null;
                if (ccapLength == 0 && (p.cap.ccap != null && p.cap.ccap.length != 0))
                    return null;
            } else {
                return null;
            }
        }

        // COD
        String codString = j2kNode.getFieldAsString("CodingStyleDefault");
        if (codString != null && codString.length() >= 20 && (codString.length() % 2 == 0)) {
            p.cod = new COD();
            p.cod.scod = (short) Integer.parseInt(codString.substring(0, 2), 16);
            p.cod.progressionOrder = (short) Integer.parseInt(codString.substring(2, 4), 16);
            p.cod.numLayers = Integer.parseInt(codString.substring(4, 8), 16);
            p.cod.multiComponentTransform = (short) Integer.parseInt(codString.substring(8, 10), 16);
            p.cod.numDecompLevels = (short) Integer.parseInt(codString.substring(10, 12), 16);
            p.cod.xcb = (short) (Integer.parseInt(codString.substring(12, 14), 16) + 2);
            p.cod.ycb = (short) (Integer.parseInt(codString.substring(14, 16), 16) + 2);
            p.cod.cbStyle = (short) Integer.parseInt(codString.substring(16, 18), 16);
            p.cod.transformation = (short) Integer.parseInt(codString.substring(18, 20), 16);

            p.cod.precinctSizes = new short[(codString.length() - 20) / 2];
            for (int i = 0; i < p.cod.precinctSizes.length; i++) {
                p.cod.precinctSizes[i] = (short) Integer.parseInt(codString.substring(20 + 2 * i, 22 + 2 * i), 16);
            }
        }

        // QCD
        String qcdString = j2kNode.getFieldAsString("QuantizationDefault");
        if (qcdString != null && qcdString.length() >= 2 && (qcdString.length() % 2 == 0)) {
            p.qcd = new QCD();
            p.qcd.sqcd = (short) Integer.parseInt(qcdString.substring(0, 2), 16);

            int spqcdSize = (p.qcd.sqcd & 0b11111) == 0 ? 1 : 2;
            p.qcd.spqcd = new int[(qcdString.length() - 2) / (2 * spqcdSize)];
            for (int i = 0; i < p.qcd.spqcd.length; i++) {
                p.qcd.spqcd[i] = Integer.parseInt(qcdString.substring(2 + 2 * spqcdSize * i, 4 + 2 * spqcdSize * i), 16);
            }
        }

        return p;
    }