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;
}