Hi,

In the implementation of  VNC tight code , there is the following function.The 
function try to determine whether vnc filters the image being coded,why can it do 
this?Who can explain it for me?

Thanks anyway

Yours Sincerely,
 
Cao

int                     \
vncEncodeTight::DetectStillImage##bpp (int w, int h)        \
{                     \
 bool endianMismatch;               \
 CARD##bpp pix;                 \
 int maxColor[3], shiftBits[3];             \
 int x, y, d, dx, c;                \
 int diffStat[256];                \
 int pixelCount = 0;                \
 int sample, sum, left[3];              \
 unsigned long avgError;               \
                     \
 endianMismatch = (!m_localformat.bigEndian != !m_remoteformat.bigEndian); \
                     \
 maxColor[0] = m_remoteformat.redMax;           \
 maxColor[1] = m_remoteformat.greenMax;           \
 maxColor[2] = m_remoteformat.blueMax;           \
 shiftBits[0] = m_remoteformat.redShift;           \
 shiftBits[1] = m_remoteformat.greenShift;          \
 shiftBits[2] = m_remoteformat.blueShift;          \
                     \
 memset(diffStat, 0, 256*sizeof(int));           \
                     \
 y = 0, x = 0;                 \
 while (y < h && x < w) {              \
  for (d = 0; d < h - y && d < w - x - DETECT_SUBROW_WIDTH; d++) {   \
   pix = ((CARD##bpp *)m_buffer)[(y+d)*w+x+d];        \
   if (endianMismatch) {             \
    pix = Swap##bpp(pix);            \
   }                  \
   for (c = 0; c < 3; c++) {            \
    left[c] = (int)(pix >> shiftBits[c] & maxColor[c]);     \
   }                  \
   for (dx = 1; dx <= DETECT_SUBROW_WIDTH; dx++) {       \
    pix = ((CARD##bpp *)m_buffer)[(y+d)*w+x+d+dx];      \
    if (endianMismatch) {            \
     pix = Swap##bpp(pix);           \
    }                 \
    sum = 0;               \
    for (c = 0; c < 3; c++) {           \
     sample = (int)(pix >> shiftBits[c] & maxColor[c]);    \
     sum += abs(sample - left[c]);         \
     left[c] = sample;            \
    }                 \
    if (sum > 255)              \
     sum = 255;              \
    diffStat[sum]++;             \
    pixelCount++;              \
   }                  \
  }                   \
  if (w > h) {                \
   x += h;                 \
   y = 0;                 \
  } else {                 \
   x = 0;                 \
   y += w;                 \
  }                   \
 }                    \
                     \
 if ((diffStat[0] + diffStat[1]) * 100 / pixelCount >= 90)      \
  return 0;                 \
                     \
 avgError = 0;                 \
 for (c = 1; c < 8; c++) {              \
  avgError += (unsigned long)diffStat[c] * (unsigned long)(c * c);   \
  if (diffStat[c] == 0 || diffStat[c] > diffStat[c-1] * 2)     \
   return 0;                \
 }                    \
 for (; c < 256; c++) {               \
  avgError += (unsigned long)diffStat[c] * (unsigned long)(c * c);   \
 }                    \
 avgError /= (pixelCount - diffStat[0]);           \
                     \
 return (avgError < 200);              \
}
---------------------------------------------------------------------
To unsubscribe, send a message with the line: unsubscribe vnc-list
to [EMAIL PROTECTED]
See also: http://www.uk.research.att.com/vnc/intouch.html
---------------------------------------------------------------------

Reply via email to