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

📄 utils.c

📁 机器人仿真软件
💻 C
📖 第 1 页 / 共 2 页
字号:
           if (m == M_EOF) {              if (in->func && (m = in->func(in->data)) == 0)                  continue;           }           in->marker = m;           if (le <= 16)              bi = bi << 16, le += 16;           break;       }       bi = bi << 8 | b;       le += 8;    }    in->bits = bi;              /* tmp... 2 return values needed */    return le;}static int dec_readmarker(in)struct in *in;{    int m;    in->left = fillbits(in, in->left, in->bits);    if ((m = in->marker) == 0)       return 0;    in->left = 0;    in->marker = 0;    return m;}#define LEBI_DCL       int le, bi#define LEBI_GET(in)       (le = in->left, bi = in->bits)#define LEBI_PUT(in)       (in->left = le, in->bits = bi)#define GETBITS(in, n) (                                   \  (le < (n) ? le = fillbits(in, le, bi), bi = in->bits : 0),       \  (le -= (n)),                                                 \  bi >> le & ((1 << (n)) - 1)                                   \)#define UNGETBITS(in, n) (       \  le += (n)                     \)static int dec_rec2(in, hu, runp, c, i)struct in *in;struct dec_hufftbl *hu;int *runp;int c, i;{    LEBI_DCL;    LEBI_GET(in);    if (i) {       UNGETBITS(in, i & 127);       *runp = i >> 8 & 15;       i >>= 16;    } else {       for (i = DECBITS;            (c = ((c << 1) | GETBITS(in, 1))) >= (hu->maxcode[i]); i++);       if (i >= 16) {           in->marker = M_BADHUFF;           return 0;       }       i = hu->vals[hu->valptr[i] + c - hu->maxcode[i - 1] * 2];       *runp = i >> 4;       i &= 15;    }    if (i == 0) {              /* sigh, 0xf0 is 11 bit */       LEBI_PUT(in);       return 0;    }    /* receive part */    c = GETBITS(in, i);    if (c < (1 << (i - 1)))       c += (-1 << i) + 1;    LEBI_PUT(in);    return c;}#define DEC_REC(in, hu, r, i)        (       \  r = GETBITS(in, DECBITS),              \  i = hu->llvals[r],                     \  i & 128 ?                            \    (                                   \      UNGETBITS(in, i & 127),              \      r = i >> 8 & 15,                     \      i >> 16                            \    )                                   \  :                                   \    (                                   \      LEBI_PUT(in),                     \      i = dec_rec2(in, hu, &r, r, i),       \      LEBI_GET(in),                     \      i                                   \    )                                   \)static void decode_mcus(in, dct, n, sc, maxp)struct in *in;int *dct;int n;struct scan *sc;int *maxp;{    struct dec_hufftbl *hu;    int i, r, t;    LEBI_DCL;    memset(dct, 0, n * 64 * sizeof(*dct));    LEBI_GET(in);    while (n-- > 0) {       hu = sc->hudc.dhuff;       *dct++ = (sc->dc += DEC_REC(in, hu, r, t));       hu = sc->huac.dhuff;       i = 63;       while (i > 0) {           t = DEC_REC(in, hu, r, t);           if (t == 0 && r == 0) {              dct += i;              break;           }           dct += r;           *dct++ = t;           i -= r + 1;       }       *maxp++ = 64 - i;       if (n == sc->next)           sc++;    }    LEBI_PUT(in);}static void dec_makehuff(hu, hufflen, huffvals)struct dec_hufftbl *hu;int *hufflen;unsigned char *huffvals;{    int code, k, i, j, d, x, c, v;    for (i = 0; i < (1 << DECBITS); i++)       hu->llvals[i] = 0;/* * llvals layout: * * value v already known, run r, backup u bits: *  vvvvvvvvvvvvvvvv 0000 rrrr 1 uuuuuuu * value unknown, size b bits, run r, backup u bits: *  000000000000bbbb 0000 rrrr 0 uuuuuuu * value and size unknown: *  0000000000000000 0000 0000 0 0000000 */    code = 0;    k = 0;    for (i = 0; i < 16; i++, code <<= 1) {       /* sizes */       hu->valptr[i] = k;       for (j = 0; j < hufflen[i]; j++) {           hu->vals[k] = *huffvals++;           if (i < DECBITS) {              c = code << (DECBITS - 1 - i);              v = hu->vals[k] & 0x0f;       /* size */              for (d = 1 << (DECBITS - 1 - i); --d >= 0;) {                  if (v + i < DECBITS) {       /* both fit in table */                     x = d >> (DECBITS - 1 - v - i);                     if (v && x < (1 << (v - 1)))                         x += (-1 << v) + 1;                     x = x << 16 | (hu->vals[k] & 0xf0) << 4 |                         (DECBITS - (i + 1 + v)) | 128;                  } else                     x = v << 16 | (hu->vals[k] & 0xf0) << 4 |                         (DECBITS - (i + 1));                  hu->llvals[c | d] = x;              }           }           code++;           k++;       }       hu->maxcode[i] = code;    }    hu->maxcode[16] = 0x20000;       /* always terminate decode */}/****************************************************************//**************             idct                  ***************//****************************************************************/#define ONE ((PREC)IFIX(1.))#define S2  ((PREC)IFIX(0.382683432))#define C2  ((PREC)IFIX(0.923879532))#define C4  ((PREC)IFIX(0.707106781))#define S22 ((PREC)IFIX(2 * 0.382683432))#define C22 ((PREC)IFIX(2 * 0.923879532))#define IC4 ((PREC)IFIX(1 / 0.707106781))#define C3IC1 ((PREC)IFIX(0.847759065))       /* c3/c1 */#define C5IC1 ((PREC)IFIX(0.566454497))       /* c5/c1 */#define C7IC1 ((PREC)IFIX(0.198912367))       /* c7/c1 */#define XPP(a,b) (t = a + b, b = a - b, a = t)#define XMP(a,b) (t = a - b, b = a + b, a = t)#define XPM(a,b) (t = a + b, b = b - a, a = t)#define ROT(a,b,s,c) (       t = IMULT(a + b, s),       \                     a = IMULT(a, c - s) + t,       \                     b = IMULT(b, c + s) - t)#define IDCT              \(                     \  XPP(t0, t1),              \  XMP(t2, t3),              \  t2 = IMULT(t2, IC4) - t3,       \  XPP(t0, t3),              \  XPP(t1, t2),              \  XMP(t4, t7),              \  XPP(t5, t6),              \  XMP(t5, t7),              \  t5 = IMULT(t5, IC4),       \  ROT(t4, t6, S22, C22),\  t6 -= t7,              \  t5 -= t6,              \  t4 -= t5,              \  XPP(t0, t7),              \  XPP(t1, t6),              \  XPP(t2, t5),              \  XPP(t3, t4)              \)static unsigned char zig2[64] = {    0, 2, 3, 9, 10, 20, 21, 35,    14, 16, 25, 31, 39, 46, 50, 57,    5, 7, 12, 18, 23, 33, 37, 48,    27, 29, 41, 44, 52, 55, 59, 62,    15, 26, 30, 40, 45, 51, 56, 58,    1, 4, 8, 11, 19, 22, 34, 36,    28, 42, 43, 53, 54, 60, 61, 63,    6, 13, 17, 24, 32, 38, 47, 49};void idct(in, out, quant, off, max)int *in;int *out;PREC *quant;PREC off;int max;{    PREC t0, t1, t2, t3, t4, t5, t6, t7, t;    PREC tmp[64], *tmpp;    int i, j;    unsigned char *zig2p;    t0 = off;    if (max == 1) {       t0 += in[0] * quant[0];       for (i = 0; i < 64; i++)           out[i] = ITOINT(t0);       return;    }    zig2p = zig2;    tmpp = tmp;    for (i = 0; i < 8; i++) {       j = *zig2p++;       t0 += in[j] * quant[j];       j = *zig2p++;       t5 = in[j] * quant[j];       j = *zig2p++;       t2 = in[j] * quant[j];       j = *zig2p++;       t7 = in[j] * quant[j];       j = *zig2p++;       t1 = in[j] * quant[j];       j = *zig2p++;       t4 = in[j] * quant[j];       j = *zig2p++;       t3 = in[j] * quant[j];       j = *zig2p++;       t6 = in[j] * quant[j];       IDCT;       tmpp[0 * 8] = t0;       tmpp[1 * 8] = t1;       tmpp[2 * 8] = t2;       tmpp[3 * 8] = t3;       tmpp[4 * 8] = t4;       tmpp[5 * 8] = t5;       tmpp[6 * 8] = t6;       tmpp[7 * 8] = t7;       tmpp++;       t0 = 0;    }    for (i = 0; i < 8; i++) {       t0 = tmp[8 * i + 0];       t1 = tmp[8 * i + 1];       t2 = tmp[8 * i + 2];       t3 = tmp[8 * i + 3];       t4 = tmp[8 * i + 4];       t5 = tmp[8 * i + 5];       t6 = tmp[8 * i + 6];       t7 = tmp[8 * i + 7];       IDCT;       out[8 * i + 0] = ITOINT(t0);       out[8 * i + 1] = ITOINT(t1);       out[8 * i + 2] = ITOINT(t2);       out[8 * i + 3] = ITOINT(t3);       out[8 * i + 4] = ITOINT(t4);       out[8 * i + 5] = ITOINT(t5);       out[8 * i + 6] = ITOINT(t6);       out[8 * i + 7] = ITOINT(t7);    }}static unsigned char zig[64] = {    0, 1, 5, 6, 14, 15, 27, 28,    2, 4, 7, 13, 16, 26, 29, 42,    3, 8, 12, 17, 25, 30, 41, 43,    9, 11, 18, 24, 31, 40, 44, 53,    10, 19, 23, 32, 39, 45, 52, 54,    20, 22, 33, 38, 46, 51, 55, 60,    21, 34, 37, 47, 50, 56, 59, 61,    35, 36, 48, 49, 57, 58, 62, 63};static PREC aaidct[8] = {    IFIX(0.3535533906), IFIX(0.4903926402),    IFIX(0.4619397663), IFIX(0.4157348062),    IFIX(0.3535533906), IFIX(0.2777851165),    IFIX(0.1913417162), IFIX(0.0975451610)};static void idctqtab(qin, qout)unsigned char *qin;PREC *qout;{    int i, j;    for (i = 0; i < 8; i++)       for (j = 0; j < 8; j++)           qout[zig[i * 8 + j]] = qin[zig[i * 8 + j]] *              IMULT(aaidct[i], aaidct[j]);}static void scaleidctqtab(q, sc)PREC *q;PREC sc;{    int i;    for (i = 0; i < 64; i++)       q[i] = IMULT(q[i], sc);}/****************************************************************//**************          color decoder            ***************//****************************************************************/#define ROUND/* * YCbCr Color transformation: * * y:0..255   Cb:-128..127   Cr:-128..127 * *      R = Y                + 1.40200 * Cr *      G = Y - 0.34414 * Cb - 0.71414 * Cr *      B = Y + 1.77200 * Cb * * => *      Cr *= 1.40200; *      Cb *= 1.77200; *      Cg = 0.19421 * Cb + .50937 * Cr; *      R = Y + Cr; *      G = Y - Cg; *      B = Y + Cb; * * => *      Cg = (50 * Cb + 130 * Cr + 128) >> 8; */static void initcol(q)PREC q[][64];{    scaleidctqtab(q[1], IFIX(1.77200));    scaleidctqtab(q[2], IFIX(1.40200));}/* This is optimized for the stupid sun SUNWspro compiler. */#define STORECLAMP(a,x)                            \(                                          \  (a) = (x),                                   \  (unsigned int)(x) >= 256 ?                      \    ((a) = (x) < 0 ? 0 : 255)                     \  :                                          \    0                                          \)#define CLAMP(x) ((unsigned int)(x) >= 256 ? ((x) < 0 ? 0 : 255) : (x))#ifdef ROUND#define CBCRCG(yin, xin)                     \(                                          \  cb = outc[0 +yin*8+xin],                     \  cr = outc[64+yin*8+xin],                     \  cg = (50 * cb + 130 * cr + 128) >> 8              \)#else#define CBCRCG(yin, xin)                     \(                                          \  cb = outc[0 +yin*8+xin],                     \  cr = outc[64+yin*8+xin],                     \  cg = (3 * cb + 8 * cr) >> 4                     \)#endif// BGR instead RGB #define PIC(yin, xin, p, xout)                     \(                                          \  y = outy[(yin) * 8 + xin],                     \  STORECLAMP(p[(xout) * 3 + 2], y + cr),       \  STORECLAMP(p[(xout) * 3 + 1], y - cg),       \  STORECLAMP(p[(xout) * 3 + 0], y + cb)              \)#define PIC221111(xin)                                          \(                                                        \  CBCRCG(0, xin),                                          \  PIC(xin / 4 * 8 + 0, (xin & 3) * 2 + 0, pic0, xin * 2 + 0),       \  PIC(xin / 4 * 8 + 0, (xin & 3) * 2 + 1, pic0, xin * 2 + 1),       \  PIC(xin / 4 * 8 + 1, (xin & 3) * 2 + 0, pic1, xin * 2 + 0),       \  PIC(xin / 4 * 8 + 1, (xin & 3) * 2 + 1, pic1, xin * 2 + 1)       \)#define UV(yin, xin)                     \(                                          \  u = outc[0 +yin*8+xin],                     \  v = outc[64+yin*8+xin]                     \)#define PIC1(yin, xin, p, xout)                     \(                                          \  y = outy[(yin) * 8 + xin],                     \  STORECLAMP(p[(xout) * 2 + 0], y),       \  STORECLAMP(p[(xout) * 2 + 1], u + 128)       \)#define PIC2(yin, xin, p, xout)                     \(                                          \  y = outy[(yin) * 8 + xin],                     \  STORECLAMP(p[(xout) * 2 + 0], y),       \  STORECLAMP(p[(xout) * 2 + 1], v + 128)       \)#define PICYUYV(xin)                                          \(                                                        \  UV(0, xin),                                          \  PIC1(xin / 4 * 8 + 0, (xin & 3) * 2 + 0, pic0, xin * 2 + 0),       \  PIC2(xin / 4 * 8 + 0, (xin & 3) * 2 + 1, pic0, xin * 2 + 1),       \  UV(1, xin),                                          \  PIC1(xin / 4 * 8 + 1, (xin & 3) * 2 + 0, pic1, xin * 2 + 0),       \  PIC2(xin / 4 * 8 + 1, (xin & 3) * 2 + 1, pic1, xin * 2 + 1)       \)static void yuyvtopict(out, pic, width)int *out;unsigned char *pic;int width;{    int i, j, k;    unsigned char *pic0, *pic1;    int *outy, *outc;    int u, v, y;    pic0 = pic;    pic1 = pic + width;    outy = out;    outc = out + 64 * 4;    for (i = 2; i > 0; i--) {       for (j = 4; j > 0; j--) {           for (k = 0; k < 8; k++) {              PICYUYV(k);           }           outc += 8;           outy += 16;           pic0 += 2 * width;           pic1 += 2 * width;       }       outy += 64 * 2 - 16 * 4;    }}static void col221111(out, pic, width)int *out;unsigned char *pic;int width;{    int i, j, k;    unsigned char *pic0, *pic1;    int *outy, *outc;    int cr, cg, cb, y;    pic0 = pic;    pic1 = pic + width;    outy = out;    outc = out + 64 * 4;    for (i = 2; i > 0; i--) {       for (j = 4; j > 0; j--) {           for (k = 0; k < 8; k++) {              PIC221111(k);           }           outc += 8;           outy += 16;           pic0 += 2 * width;           pic1 += 2 * width;       }       outy += 64 * 2 - 16 * 4;    }}

⌨️ 快捷键说明

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