⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpxstream.cc

📁 swf文件查看工具,能够看flash文件的格式
💻 CC
📖 第 1 页 / 共 5 页
字号:
    cs = newCS;    haveCS = gTrue;  }  return gTrue; err:  error(getPos(), "Error in JPX color spec");  return gFalse;}GBool JPXStream::readCodestream(Guint len) {  JPXTile *tile;  JPXTileComp *tileComp;  int segType;  GBool haveSIZ, haveCOD, haveQCD, haveSOT;  Guint precinctSize, style;  Guint segLen, capabilities, comp, i, j, r;  //----- main header  haveSIZ = haveCOD = haveQCD = haveSOT = gFalse;  do {    if (!readMarkerHdr(&segType, &segLen)) {      error(getPos(), "Error in JPX codestream");      return gFalse;    }    switch (segType) {    case 0x4f:			// SOC - start of codestream      // marker only      cover(19);      break;    case 0x51:			// SIZ - image and tile size      cover(20);      if (!readUWord(&capabilities) ||	  !readULong(&img.xSize) ||	  !readULong(&img.ySize) ||	  !readULong(&img.xOffset) ||	  !readULong(&img.yOffset) ||	  !readULong(&img.xTileSize) ||	  !readULong(&img.yTileSize) ||	  !readULong(&img.xTileOffset) ||	  !readULong(&img.yTileOffset) ||	  !readUWord(&img.nComps)) {	error(getPos(), "Error in JPX SIZ marker segment");	return gFalse;      }      if (haveImgHdr && img.nComps != nComps) {	error(getPos(), "Different number of components in JPX SIZ marker segment");	return gFalse;      }      img.nXTiles = (img.xSize - img.xTileOffset + img.xTileSize - 1)	            / img.xTileSize;      img.nYTiles = (img.ySize - img.yTileOffset + img.yTileSize - 1)	            / img.yTileSize;      // check for overflow before allocating memory      if (img.nXTiles <= 0 || img.nYTiles <= 0 ||	  img.nXTiles >= INT_MAX / img.nYTiles) {	error(getPos(), "Bad tile count in JPX SIZ marker segment");	return gFalse;      }      img.tiles = (JPXTile *)gmallocn(img.nXTiles * img.nYTiles,				      sizeof(JPXTile));      for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {	img.tiles[i].tileComps = (JPXTileComp *)gmallocn(img.nComps,							 sizeof(JPXTileComp));	for (comp = 0; comp < img.nComps; ++comp) {	  img.tiles[i].tileComps[comp].quantSteps = NULL;	  img.tiles[i].tileComps[comp].data = NULL;	  img.tiles[i].tileComps[comp].buf = NULL;	  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      cover(21);      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) {	  cover(91);	  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      cover(22);      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      cover(23);      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      cover(24);      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      cover(25);#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      cover(26);#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      cover(27);#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;	}      }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -