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

📄 stream.cc

📁 swf文件查看工具,能够看flash文件的格式
💻 CC
📖 第 1 页 / 共 5 页
字号:
      return gFalse;    }  } else {    amp = 0;  }  data[0] = *prevDC += amp;  for (i = 1; i < 64; ++i) {    data[i] = 0;  }  i = 1;  while (i < 64) {    run = 0;    while ((c = readHuffSym(acHuffTable)) == 0xf0 && run < 0x30) {      run += 0x10;    }    if (c == 9999) {      return gFalse;    }    if (c == 0x00) {      break;    } else {      run += (c >> 4) & 0x0f;      size = c & 0x0f;      amp = readAmp(size);      if (amp == 9999) {	return gFalse;      }      i += run;      if (i < 64) {	j = dctZigZag[i++];	data[j] = amp;      }    }  }  return gTrue;}// Read one data unit from a sequential JPEG stream.GBool DCTStream::readProgressiveDataUnit(DCTHuffTable *dcHuffTable,					 DCTHuffTable *acHuffTable,					 int *prevDC, int data[64]) {  int run, size, amp, bit, c;  int i, j, k;  // get the DC coefficient  i = scanInfo.firstCoeff;  if (i == 0) {    if (scanInfo.ah == 0) {      if ((size = readHuffSym(dcHuffTable)) == 9999) {	return gFalse;      }      if (size > 0) {	if ((amp = readAmp(size)) == 9999) {	  return gFalse;	}      } else {	amp = 0;      }      data[0] += (*prevDC += amp) << scanInfo.al;    } else {      if ((bit = readBit()) == 9999) {	return gFalse;      }      data[0] += bit << scanInfo.al;    }    ++i;  }  if (scanInfo.lastCoeff == 0) {    return gTrue;  }  // check for an EOB run  if (eobRun > 0) {    while (i <= scanInfo.lastCoeff) {      j = dctZigZag[i++];      if (data[j] != 0) {	if ((bit = readBit()) == EOF) {	  return gFalse;	}	if (bit) {	  data[j] += 1 << scanInfo.al;	}      }    }    --eobRun;    return gTrue;  }  // read the AC coefficients  while (i <= scanInfo.lastCoeff) {    if ((c = readHuffSym(acHuffTable)) == 9999) {      return gFalse;    }    // ZRL    if (c == 0xf0) {      k = 0;      while (k < 16) {	j = dctZigZag[i++];	if (data[j] == 0) {	  ++k;	} else {	  if ((bit = readBit()) == EOF) {	    return gFalse;	  }	  if (bit) {	    data[j] += 1 << scanInfo.al;	  }	}      }    // EOB run    } else if ((c & 0x0f) == 0x00) {      j = c >> 4;      eobRun = 0;      for (k = 0; k < j; ++k) {	if ((bit = readBit()) == EOF) {	  return gFalse;	}	eobRun = (eobRun << 1) | bit;      }      eobRun += 1 << j;      while (i <= scanInfo.lastCoeff) {	j = dctZigZag[i++];	if (data[j] != 0) {	  if ((bit = readBit()) == EOF) {	    return gFalse;	  }	  if (bit) {	    data[j] += 1 << scanInfo.al;	  }	}      }      --eobRun;      break;    // zero run and one AC coefficient    } else {      run = (c >> 4) & 0x0f;      size = c & 0x0f;      if ((amp = readAmp(size)) == 9999) {	return gFalse;      }      k = 0;      do {	j = dctZigZag[i++];	while (data[j] != 0) {	  if ((bit = readBit()) == EOF) {	    return gFalse;	  }	  if (bit) {	    data[j] += 1 << scanInfo.al;	  }	  j = dctZigZag[i++];	}	++k;      } while (k <= run);      data[j] = amp << scanInfo.al;    }  }  return gTrue;}// Decode a progressive JPEG image.void DCTStream::decodeImage() {  int dataIn[64];  Guchar dataOut[64];  Gushort *quantTable;  int pY, pCb, pCr, pR, pG, pB;  int x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i;  int h, v, horiz, vert, hSub, vSub;  int *p0, *p1, *p2;  for (y1 = 0; y1 < bufHeight; y1 += mcuHeight) {    for (x1 = 0; x1 < bufWidth; x1 += mcuWidth) {      for (cc = 0; cc < numComps; ++cc) {	quantTable = quantTables[compInfo[cc].quantTable];	h = compInfo[cc].hSample;	v = compInfo[cc].vSample;	horiz = mcuWidth / h;	vert = mcuHeight / v;	hSub = horiz / 8;	vSub = vert / 8;	for (y2 = 0; y2 < mcuHeight; y2 += vert) {	  for (x2 = 0; x2 < mcuWidth; x2 += horiz) {	    // pull out the coded data unit	    p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];	    for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {	      dataIn[i]   = p1[0];	      dataIn[i+1] = p1[1];	      dataIn[i+2] = p1[2];	      dataIn[i+3] = p1[3];	      dataIn[i+4] = p1[4];	      dataIn[i+5] = p1[5];	      dataIn[i+6] = p1[6];	      dataIn[i+7] = p1[7];	      p1 += bufWidth * vSub;	    }	    // transform	    transformDataUnit(quantTable, dataIn, dataOut);	    // store back into frameBuf, doing replication for	    // subsampled components	    p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];	    if (hSub == 1 && vSub == 1) {	      for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {		p1[0] = dataOut[i] & 0xff;		p1[1] = dataOut[i+1] & 0xff;		p1[2] = dataOut[i+2] & 0xff;		p1[3] = dataOut[i+3] & 0xff;		p1[4] = dataOut[i+4] & 0xff;		p1[5] = dataOut[i+5] & 0xff;		p1[6] = dataOut[i+6] & 0xff;		p1[7] = dataOut[i+7] & 0xff;		p1 += bufWidth;	      }	    } else if (hSub == 2 && vSub == 2) {	      p2 = p1 + bufWidth;	      for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) {		p1[0] = p1[1] = p2[0] = p2[1] = dataOut[i] & 0xff;		p1[2] = p1[3] = p2[2] = p2[3] = dataOut[i+1] & 0xff;		p1[4] = p1[5] = p2[4] = p2[5] = dataOut[i+2] & 0xff;		p1[6] = p1[7] = p2[6] = p2[7] = dataOut[i+3] & 0xff;		p1[8] = p1[9] = p2[8] = p2[9] = dataOut[i+4] & 0xff;		p1[10] = p1[11] = p2[10] = p2[11] = dataOut[i+5] & 0xff;		p1[12] = p1[13] = p2[12] = p2[13] = dataOut[i+6] & 0xff;		p1[14] = p1[15] = p2[14] = p2[15] = dataOut[i+7] & 0xff;		p1 += bufWidth * 2;		p2 += bufWidth * 2;	      }	    } else {	      i = 0;	      for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) {		for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) {		  p2 = p1 + x4;		  for (y5 = 0; y5 < vSub; ++y5) {		    for (x5 = 0; x5 < hSub; ++x5) {		      p2[x5] = dataOut[i] & 0xff;		    }		    p2 += bufWidth;		  }		  ++i;		}		p1 += bufWidth * vSub;	      }	    }	  }	}      }      // color space conversion      if (colorXform) {	// convert YCbCr to RGB	if (numComps == 3) {	  for (y2 = 0; y2 < mcuHeight; ++y2) {	    p0 = &frameBuf[0][(y1+y2) * bufWidth + x1];	    p1 = &frameBuf[1][(y1+y2) * bufWidth + x1];	    p2 = &frameBuf[2][(y1+y2) * bufWidth + x1];	    for (x2 = 0; x2 < mcuWidth; ++x2) {	      pY = *p0;	      pCb = *p1 - 128;	      pCr = *p2 - 128;	      pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;	      *p0++ = dctClip[dctClipOffset + pR];	      pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr +		    32768) >> 16;	      *p1++ = dctClip[dctClipOffset + pG];	      pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;	      *p2++ = dctClip[dctClipOffset + pB];	    }	  }	// convert YCbCrK to CMYK (K is passed through unchanged)	} else if (numComps == 4) {	  for (y2 = 0; y2 < mcuHeight; ++y2) {	    p0 = &frameBuf[0][(y1+y2) * bufWidth + x1];	    p1 = &frameBuf[1][(y1+y2) * bufWidth + x1];	    p2 = &frameBuf[2][(y1+y2) * bufWidth + x1];	    for (x2 = 0; x2 < mcuWidth; ++x2) {	      pY = *p0;	      pCb = *p1 - 128;	      pCr = *p2 - 128;	      pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;	      *p0++ = 255 - dctClip[dctClipOffset + pR];	      pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr +		    32768) >> 16;	      *p1++ = 255 - dctClip[dctClipOffset + pG];	      pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;	      *p2++ = 255 - dctClip[dctClipOffset + pB];	    }	  }	}      }    }  }}// Transform one data unit -- this performs the dequantization and// IDCT steps.  This IDCT algorithm is taken from://   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,//   "Practical Fast 1-D DCT Algorithms with 11 Multiplications",//   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,//   988-991.// The stage numbers mentioned in the comments refer to Figure 1 in this// paper.void DCTStream::transformDataUnit(Gushort *quantTable,				  int dataIn[64], Guchar dataOut[64]) {  int v0, v1, v2, v3, v4, v5, v6, v7, t;  int *p;  int i;  // dequant  for (i = 0; i < 64; ++i) {    dataIn[i] *= quantTable[i];  }  // inverse DCT on rows  for (i = 0; i < 64; i += 8) {    p = dataIn + i;    // check for all-zero AC coefficients    if (p[1] == 0 && p[2] == 0 && p[3] == 0 &&	p[4] == 0 && p[5] == 0 && p[6] == 0 && p[7] == 0) {      t = (dctSqrt2 * p[0] + 512) >> 10;      p[0] = t;      p[1] = t;      p[2] = t;      p[3] = t;      p[4] = t;      p[5] = t;      p[6] = t;      p[7] = t;      continue;    }    // stage 4    v0 = (dctSqrt2 * p[0] + 128) >> 8;    v1 = (dctSqrt2 * p[4] + 128) >> 8;    v2 = p[2];    v3 = p[6];    v4 = (dctSqrt1d2 * (p[1] - p[7]) + 128) >> 8;    v7 = (dctSqrt1d2 * (p[1] + p[7]) + 128) >> 8;    v5 = p[3] << 4;    v6 = p[5] << 4;    // stage 3    t = (v0 - v1+ 1) >> 1;    v0 = (v0 + v1 + 1) >> 1;    v1 = t;    t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;    v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;    v3 = t;    t = (v4 - v6 + 1) >> 1;    v4 = (v4 + v6 + 1) >> 1;    v6 = t;    t = (v7 + v5 + 1) >> 1;    v5 = (v7 - v5 + 1) >> 1;    v7 = t;    // stage 2    t = (v0 - v3 + 1) >> 1;    v0 = (v0 + v3 + 1) >> 1;    v3 = t;    t = (v1 - v2 + 1) >> 1;    v1 = (v1 + v2 + 1) >> 1;    v2 = t;    t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;    v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;    v7 = t;    t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;    v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;    v6 = t;    // stage 1    p[0] = v0 + v7;    p[7] = v0 - v7;    p[1] = v1 + v6;    p[6] = v1 - v6;    p[2] = v2 + v5;    p[5] = v2 - v5;    p[3] = v3 + v4;    p[4] = v3 - v4;  }  // inverse DCT on columns  for (i = 0; i < 8; ++i) {    p = dataIn + i;    // check for all-zero AC coefficients    if (p[1*8] == 0 && p[2*8] == 0 && p[3*8] == 0 &&	p[4*8] == 0 && p[5*8] == 0 && p[6*8] == 0 && p[7*8] == 0) {      t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14;      p[0*8] = t;      p[1*8] = t;      p[2*8] = t;      p[3*8] = t;      p[4*8] = t;      p[5*8] = t;      p[6*8] = t;      p[7*8] = t;      continue;    }    // stage 4    v0 = (dctSqrt2 * p[0*8] + 2048) >> 12;    v1 = (dctSqrt2 * p[4*8] + 2048) >> 12;    v2 = p[2*8];    v3 = p[6*8];    v4 = (dctSqrt1d2 * (p[1*8] - p[7*8]) + 2048) >> 12;    v7 = (dctSqrt1d2 * (p[1*8] + p[7*8]) + 2048) >> 12;    v5 = p[3*8];    v6 = p[5*8];    // stage 3    t = (v0 - v1 + 1) >> 1;    v0 = (v0 + v1 + 1) >> 1;    v1 = t;    t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;    v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;    v3 = t;    t = (v4 - v6 + 1) >> 1;    v4 = (v4 + v6 + 1) >> 1;    v6 = t;    t = (v7 + v5 + 1) >> 1;    v5 = (v7 - v5 + 1) >> 1;    v7 = t;    // stage 2    t = (v0 - v3 + 1) >> 1;    v0 = (v0 + v3 + 1) >> 1;    v3 = t;    t = (v1 - v2 + 1) >> 1;    v1 = (v1 + v2 + 1) >> 1;    v2 = t;    t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;    v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;    v7 = t;    t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;    v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;    v6 = t;    // stage 1    p[0*8] = v0 + v7;    p[7*8] = v0 - v7;    p[1*8] = v1 + v6;    p[6*8] = v1 - v6;    p[2*8] = v2 + v5;    p[5*8] = v2 - v5;    p[3*8] = v3 + v4;    p[4*8] = v3 - v4;  }  // convert to 8-bit integers  for (i = 0; i < 64; ++i) {    dataOut[i] = dctClip[dctClipOffset + 128 + ((dataIn[i] + 8) >> 4)];  }}int DCTStream::readHuffSym(DCTHuffTable *table) {  Gushort code;  int bit;  int codeBits;  code = 0;  codeBits = 0;  do {    // add a bit to the code    if ((bit = readBit()) == EOF)      return 9999;    code = (code << 1) + bit;    ++codeBits;    // look up code    if (code - table->firstCode[codeBits] < table->numCodes[codeBits]) {      code -= table->firstCode[codeBits];      return table->sym[table->firstSym[codeBits] + code];    }  } while (codeBits < 16);  error(getPos(), "Bad Huffman code in DCT stream");  return 9999;}int DCTStream::readAmp(int size) {  int amp, bit;  int bits;  amp = 0;  for (bits = 0; bits < size; ++bits) {    if ((bit = readBit()) == EOF)      return 9999;    amp = (amp << 1) + bit;  }  if (amp < (1 << (size - 1)))    amp -= (1 << size) - 1;  return amp;}int DCTStream::readBit() {  int bit;  int c, c2;  if (inputBits == 0) {    if ((c = str->getChar()) == EOF)      return EOF;    if (c == 0xff) {      do {	c2 = str->getChar();      } while (c2 == 0xff);      if (c2 != 0x00) {	error(getPos(), "Bad DCT data: missing 00 after ff");	return EOF;      }    }    inputBuf = c;    inputBits = 8;  }  bit = (inputBuf >> (inputBits - 1)) & 1;  --inputBits;  return bit;}GBool DCTStream::readHeader() {  GBool doScan;  int n;  int c = 0;  int i;  // read headers  doScan = gFalse;  while (!doScan) {    c = readMarker();    switch (c) {    case 0xc0:			// SOF0 (sequential)    case 0xc1:			// SOF1 (extended sequential)      if (!readBaselineSOF()) {	return gFalse;      }      break;    case 0xc2:			// SOF2 (progressive)      if (!readProgressiveSOF()) {	return gFalse;      }      break;    case 0xc4:			// DHT      if (!readHuffmanTables()) {	return gFalse;      }      break;    case 0xd8:			// SOI      break;    case 0xd9:			// EOI      return gFalse;    case 0xda:			// SOS      if (!readScanInfo()) {	return gFalse;      }      doScan = gTrue;      break;    case 0xdb:			// DQT      if (!readQuantTables()) {	return gFalse;      }      break;    case 0xdd:			// DRI      if (!readRestartInterval()) {	return gFalse;      }      break;    case 0xe0:			// APP0      if (!readJFIFMarker()) {	return gFalse;      }      break;    case 0xee:			// APP14      if (!readAdobeMarker()) {	return gFalse;      }      break;    case EOF:      error(ge

⌨️ 快捷键说明

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