📄 jpxstream.cc
字号:
img.tiles[i].tileComps[comp].resLevels = NULL; } } for (comp = 0; comp < img.nComps; ++comp) { if (!readUByte(&img.tiles[0].tileComps[comp].prec) || !readUByte(&img.tiles[0].tileComps[comp].hSep) || !readUByte(&img.tiles[0].tileComps[comp].vSep)) { error(getPos(), "Error in JPX SIZ marker segment"); return gFalse; } img.tiles[0].tileComps[comp].sgned = (img.tiles[0].tileComps[comp].prec & 0x80) ? gTrue : gFalse; img.tiles[0].tileComps[comp].prec = (img.tiles[0].tileComps[comp].prec & 0x7f) + 1; for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { img.tiles[i].tileComps[comp] = img.tiles[0].tileComps[comp]; } } haveSIZ = gTrue; break; case 0x52: // COD - coding style default if (!readUByte(&img.tiles[0].tileComps[0].style) || !readUByte(&img.tiles[0].progOrder) || !readUWord(&img.tiles[0].nLayers) || !readUByte(&img.tiles[0].multiComp) || !readUByte(&img.tiles[0].tileComps[0].nDecompLevels) || !readUByte(&img.tiles[0].tileComps[0].codeBlockW) || !readUByte(&img.tiles[0].tileComps[0].codeBlockH) || !readUByte(&img.tiles[0].tileComps[0].codeBlockStyle) || !readUByte(&img.tiles[0].tileComps[0].transform)) { error(getPos(), "Error in JPX COD marker segment"); return gFalse; } img.tiles[0].tileComps[0].codeBlockW += 2; img.tiles[0].tileComps[0].codeBlockH += 2; for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { if (i != 0) { img.tiles[i].progOrder = img.tiles[0].progOrder; img.tiles[i].nLayers = img.tiles[0].nLayers; img.tiles[i].multiComp = img.tiles[0].multiComp; } for (comp = 0; comp < img.nComps; ++comp) { if (!(i == 0 && comp == 0)) { img.tiles[i].tileComps[comp].style = img.tiles[0].tileComps[0].style; img.tiles[i].tileComps[comp].nDecompLevels = img.tiles[0].tileComps[0].nDecompLevels; img.tiles[i].tileComps[comp].codeBlockW = img.tiles[0].tileComps[0].codeBlockW; img.tiles[i].tileComps[comp].codeBlockH = img.tiles[0].tileComps[0].codeBlockH; img.tiles[i].tileComps[comp].codeBlockStyle = img.tiles[0].tileComps[0].codeBlockStyle; img.tiles[i].tileComps[comp].transform = img.tiles[0].tileComps[0].transform; } img.tiles[i].tileComps[comp].resLevels = (JPXResLevel *)gmallocn( (img.tiles[i].tileComps[comp].nDecompLevels + 1), sizeof(JPXResLevel)); for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL; } } } for (r = 0; r <= img.tiles[0].tileComps[0].nDecompLevels; ++r) { if (img.tiles[0].tileComps[0].style & 0x01) { if (!readUByte(&precinctSize)) { error(getPos(), "Error in JPX COD marker segment"); return gFalse; } img.tiles[0].tileComps[0].resLevels[r].precinctWidth = precinctSize & 0x0f; img.tiles[0].tileComps[0].resLevels[r].precinctHeight = (precinctSize >> 4) & 0x0f; } else { img.tiles[0].tileComps[0].resLevels[r].precinctWidth = 15; img.tiles[0].tileComps[0].resLevels[r].precinctHeight = 15; } } for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { for (comp = 0; comp < img.nComps; ++comp) { if (!(i == 0 && comp == 0)) { for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { img.tiles[i].tileComps[comp].resLevels[r].precinctWidth = img.tiles[0].tileComps[0].resLevels[r].precinctWidth; img.tiles[i].tileComps[comp].resLevels[r].precinctHeight = img.tiles[0].tileComps[0].resLevels[r].precinctHeight; } } } } haveCOD = gTrue; break; case 0x53: // COC - coding style component if (!haveCOD) { error(getPos(), "JPX COC marker segment before COD segment"); return gFalse; } if ((img.nComps > 256 && !readUWord(&comp)) || (img.nComps <= 256 && !readUByte(&comp)) || comp >= img.nComps || !readUByte(&style) || !readUByte(&img.tiles[0].tileComps[comp].nDecompLevels) || !readUByte(&img.tiles[0].tileComps[comp].codeBlockW) || !readUByte(&img.tiles[0].tileComps[comp].codeBlockH) || !readUByte(&img.tiles[0].tileComps[comp].codeBlockStyle) || !readUByte(&img.tiles[0].tileComps[comp].transform)) { error(getPos(), "Error in JPX COC marker segment"); return gFalse; } img.tiles[0].tileComps[comp].style = (img.tiles[0].tileComps[comp].style & ~1) | (style & 1); img.tiles[0].tileComps[comp].codeBlockW += 2; img.tiles[0].tileComps[comp].codeBlockH += 2; for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { if (i != 0) { img.tiles[i].tileComps[comp].style = img.tiles[0].tileComps[comp].style; img.tiles[i].tileComps[comp].nDecompLevels = img.tiles[0].tileComps[comp].nDecompLevels; img.tiles[i].tileComps[comp].codeBlockW = img.tiles[0].tileComps[comp].codeBlockW; img.tiles[i].tileComps[comp].codeBlockH = img.tiles[0].tileComps[comp].codeBlockH; img.tiles[i].tileComps[comp].codeBlockStyle = img.tiles[0].tileComps[comp].codeBlockStyle; img.tiles[i].tileComps[comp].transform = img.tiles[0].tileComps[comp].transform; } img.tiles[i].tileComps[comp].resLevels = (JPXResLevel *)greallocn( img.tiles[i].tileComps[comp].resLevels, (img.tiles[i].tileComps[comp].nDecompLevels + 1), sizeof(JPXResLevel)); for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL; } } for (r = 0; r <= img.tiles[0].tileComps[comp].nDecompLevels; ++r) { if (img.tiles[0].tileComps[comp].style & 0x01) { if (!readUByte(&precinctSize)) { error(getPos(), "Error in JPX COD marker segment"); return gFalse; } img.tiles[0].tileComps[comp].resLevels[r].precinctWidth = precinctSize & 0x0f; img.tiles[0].tileComps[comp].resLevels[r].precinctHeight = (precinctSize >> 4) & 0x0f; } else { img.tiles[0].tileComps[comp].resLevels[r].precinctWidth = 15; img.tiles[0].tileComps[comp].resLevels[r].precinctHeight = 15; } } for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { img.tiles[i].tileComps[comp].resLevels[r].precinctWidth = img.tiles[0].tileComps[comp].resLevels[r].precinctWidth; img.tiles[i].tileComps[comp].resLevels[r].precinctHeight = img.tiles[0].tileComps[comp].resLevels[r].precinctHeight; } } break; case 0x5c: // QCD - quantization default if (!readUByte(&img.tiles[0].tileComps[0].quantStyle)) { error(getPos(), "Error in JPX QCD marker segment"); return gFalse; } if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x00) { img.tiles[0].tileComps[0].nQuantSteps = segLen - 3; img.tiles[0].tileComps[0].quantSteps = (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, img.tiles[0].tileComps[0].nQuantSteps, sizeof(Guint)); for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) { if (!readUByte(&img.tiles[0].tileComps[0].quantSteps[i])) { error(getPos(), "Error in JPX QCD marker segment"); return gFalse; } } } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x01) { img.tiles[0].tileComps[0].nQuantSteps = 1; img.tiles[0].tileComps[0].quantSteps = (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, img.tiles[0].tileComps[0].nQuantSteps, sizeof(Guint)); if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[0])) { error(getPos(), "Error in JPX QCD marker segment"); return gFalse; } } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x02) { img.tiles[0].tileComps[0].nQuantSteps = (segLen - 3) / 2; img.tiles[0].tileComps[0].quantSteps = (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, img.tiles[0].tileComps[0].nQuantSteps, sizeof(Guint)); for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) { if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[i])) { error(getPos(), "Error in JPX QCD marker segment"); return gFalse; } } } else { error(getPos(), "Error in JPX QCD marker segment"); return gFalse; } for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { for (comp = 0; comp < img.nComps; ++comp) { if (!(i == 0 && comp == 0)) { img.tiles[i].tileComps[comp].quantStyle = img.tiles[0].tileComps[0].quantStyle; img.tiles[i].tileComps[comp].nQuantSteps = img.tiles[0].tileComps[0].nQuantSteps; img.tiles[i].tileComps[comp].quantSteps = (Guint *)greallocn(img.tiles[i].tileComps[comp].quantSteps, img.tiles[0].tileComps[0].nQuantSteps, sizeof(Guint)); for (j = 0; j < img.tiles[0].tileComps[0].nQuantSteps; ++j) { img.tiles[i].tileComps[comp].quantSteps[j] = img.tiles[0].tileComps[0].quantSteps[j]; } } } } haveQCD = gTrue; break; case 0x5d: // QCC - quantization component if (!haveQCD) { error(getPos(), "JPX QCC marker segment before QCD segment"); return gFalse; } if ((img.nComps > 256 && !readUWord(&comp)) || (img.nComps <= 256 && !readUByte(&comp)) || comp >= img.nComps || !readUByte(&img.tiles[0].tileComps[comp].quantStyle)) { error(getPos(), "Error in JPX QCC marker segment"); return gFalse; } if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x00) { img.tiles[0].tileComps[comp].nQuantSteps = segLen - (img.nComps > 256 ? 5 : 4); img.tiles[0].tileComps[comp].quantSteps = (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, img.tiles[0].tileComps[comp].nQuantSteps, sizeof(Guint)); for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) { if (!readUByte(&img.tiles[0].tileComps[comp].quantSteps[i])) { error(getPos(), "Error in JPX QCC marker segment"); return gFalse; } } } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x01) { img.tiles[0].tileComps[comp].nQuantSteps = 1; img.tiles[0].tileComps[comp].quantSteps = (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, img.tiles[0].tileComps[comp].nQuantSteps, sizeof(Guint)); if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[0])) { error(getPos(), "Error in JPX QCC marker segment"); return gFalse; } } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x02) { img.tiles[0].tileComps[comp].nQuantSteps = (segLen - (img.nComps > 256 ? 5 : 4)) / 2; img.tiles[0].tileComps[comp].quantSteps = (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, img.tiles[0].tileComps[comp].nQuantSteps, sizeof(Guint)); for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) { if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[i])) { error(getPos(), "Error in JPX QCD marker segment"); return gFalse; } } } else { error(getPos(), "Error in JPX QCC marker segment"); return gFalse; } for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { img.tiles[i].tileComps[comp].quantStyle = img.tiles[0].tileComps[comp].quantStyle; img.tiles[i].tileComps[comp].nQuantSteps = img.tiles[0].tileComps[comp].nQuantSteps; img.tiles[i].tileComps[comp].quantSteps = (Guint *)greallocn(img.tiles[i].tileComps[comp].quantSteps, img.tiles[0].tileComps[comp].nQuantSteps, sizeof(Guint)); for (j = 0; j < img.tiles[0].tileComps[comp].nQuantSteps; ++j) { img.tiles[i].tileComps[comp].quantSteps[j] = img.tiles[0].tileComps[comp].quantSteps[j]; } } break; case 0x5e: // RGN - region of interest#if 1 //~ ROI is unimplemented fprintf(stderr, "RGN\n"); for (i = 0; i < segLen - 2; ++i) { if (str->getChar() == EOF) { error(getPos(), "Error in JPX PPM marker segment"); return gFalse; } }#else if ((img.nComps > 256 && !readUWord(&comp)) || (img.nComps <= 256 && !readUByte(&comp)) || comp >= img.nComps || !readUByte(&compInfo[comp].defROI.style) || !readUByte(&compInfo[comp].defROI.shift)) { error(getPos(), "Error in JPX RGN marker segment"); return gFalse; }#endif break; case 0x5f: // POC - progression order change#if 1 //~ progression order changes are unimplemented fprintf(stderr, "POC\n"); for (i = 0; i < segLen - 2; ++i) { if (str->getChar() == EOF) { error(getPos(), "Error in JPX PPM marker segment"); return gFalse; } }#else nProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7); progs = (JPXProgOrder *)gmallocn(nProgs, sizeof(JPXProgOrder)); for (i = 0; i < nProgs; ++i) { if (!readUByte(&progs[i].startRes) || !(img.nComps > 256 && readUWord(&progs[i].startComp)) || !(img.nComps <= 256 && readUByte(&progs[i].startComp)) || !readUWord(&progs[i].endLayer) || !readUByte(&progs[i].endRes) || !(img.nComps > 256 && readUWord(&progs[i].endComp)) || !(img.nComps <= 256 && readUByte(&progs[i].endComp)) || !readUByte(&progs[i].progOrder)) { error(getPos(), "Error in JPX POC marker segment"); return gFalse; } }#endif break; case 0x60: // PPM - packed packet headers, main header#if 1 //~ packed packet headers are unimplemented fprintf(stderr, "PPM\n"); for (i = 0; i < segLen - 2; ++i) { if (str->getChar() == EOF) { error(getPos(), "Error in JPX PPM marker segment"); return gFalse; } }#endif break; case 0x55: // TLM - tile-part lengths // skipped for (i = 0; i < segLen - 2; ++i) { if (str->getChar() == EOF) { error(getPos(), "Error in JPX TLM marker segment"); return gFalse; } } break; case 0x57: // PLM - packet length, main header // skipped for (i = 0; i < segLen - 2; ++i) { if (str->getChar() == EOF) { error(getPos(), "Error in JPX PLM marker segment"); return gFalse; } } break; case 0x63: // CRG - component registration // skipped for (i = 0; i < segLen - 2; ++i) { if (str->getChar() == EOF) { error(getPos(), "Error in JPX CRG marker segment"); return gFalse; } } break; case 0x64: // COM - comment // skipped for (i = 0; i < segLen - 2; ++i) { if (str->getChar() == EOF) { error(getPos(), "Error in JPX COM marker segment"); return gFalse; } } break; case 0x90: // SOT - start of tile haveSOT = gTrue; break; default: error(getPos(), "Unknown marker segment %02x in JPX stream", segType); for (i = 0; i < segLen - 2; ++i) { if (str->getChar() == EOF) { break; } } break; } } while (!haveSOT); if (!haveSIZ) { error(getPos(), "Missing SIZ marker segment in JPX stream"); return gFalse; } if (!haveCOD) { error(getPos(), "Missing COD marker segment in JPX stream"); return gFalse; } if (!haveQCD) { error(getPos(), "Missing QCD marker segment in JPX stream"); return gFalse; } //----- read the tile-parts while (1) { if (!readTilePart()) { return gFalse;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -