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

📄 recon.c

📁 H.263的压缩算法
💻 C
📖 第 1 页 / 共 3 页
字号:
static void recho (unsigned char *s, int *d, int lx, int lx2,                    int addflag, int c, int xa, int xb, int ya, int yb){  int *dp, *om;  unsigned char *sp;  int i, j;  sp = s;  dp = d;  om = &OM[c][ya][0];  if (!addflag)  {    for (j = ya; j < yb; j++)    {      for (i = xa; i < xb; i++)      {        dp[i] = (((unsigned int) (sp[i] + sp[i + 1] + 1 - rtype)) >> 1) * om[i];      }      sp += lx2;      dp += lx;      om += 8;    }  } else  {    for (j = ya; j < yb; j++)    {      for (i = xa; i < xb; i++)      {        dp[i] += (((unsigned int) (sp[i] + sp[i + 1] + 1 - rtype)) >> 1) * OM[c][j][i];      }      sp += lx2;      dp += lx;      om += 8;    }  }}static void recv (unsigned char *s, unsigned char *d,                   int lx, int lx2, int h){  unsigned char *dp, *sp, *sp2;  int j;  sp = s;  sp2 = s + lx2;  dp = d;  for (j = 0; j < h; j++)  {    dp[0] = (unsigned int) (sp[0] + sp2[0] + 1 - rtype) >> 1;    dp[1] = (unsigned int) (sp[1] + sp2[1] + 1 - rtype) >> 1;    dp[2] = (unsigned int) (sp[2] + sp2[2] + 1 - rtype) >> 1;    dp[3] = (unsigned int) (sp[3] + sp2[3] + 1 - rtype) >> 1;    dp[4] = (unsigned int) (sp[4] + sp2[4] + 1 - rtype) >> 1;    dp[5] = (unsigned int) (sp[5] + sp2[5] + 1 - rtype) >> 1;    dp[6] = (unsigned int) (sp[6] + sp2[6] + 1 - rtype) >> 1;    dp[7] = (unsigned int) (sp[7] + sp2[7] + 1 - rtype) >> 1;    dp[8] = (unsigned int) (sp[8] + sp2[8] + 1 - rtype) >> 1;    dp[9] = (unsigned int) (sp[9] + sp2[9] + 1 - rtype) >> 1;    dp[10] = (unsigned int) (sp[10] + sp2[10] + 1 - rtype) >> 1;    dp[11] = (unsigned int) (sp[11] + sp2[11] + 1 - rtype) >> 1;    dp[12] = (unsigned int) (sp[12] + sp2[12] + 1 - rtype) >> 1;    dp[13] = (unsigned int) (sp[13] + sp2[13] + 1 - rtype) >> 1;    dp[14] = (unsigned int) (sp[14] + sp2[14] + 1 - rtype) >> 1;    dp[15] = (unsigned int) (sp[15] + sp2[15] + 1 - rtype) >> 1;    sp += lx2;    sp2 += lx2;    dp += lx;  }}static void recvc (unsigned char *s, unsigned char *d,                    int lx, int lx2, int h){  unsigned char *dp, *sp, *sp2;  int j;  sp = s;  sp2 = s + lx2;  dp = d;  for (j = 0; j < h; j++)  {    dp[0] = (unsigned int) (sp[0] + sp2[0] + 1 - rtype) >> 1;    dp[1] = (unsigned int) (sp[1] + sp2[1] + 1 - rtype) >> 1;    dp[2] = (unsigned int) (sp[2] + sp2[2] + 1 - rtype) >> 1;    dp[3] = (unsigned int) (sp[3] + sp2[3] + 1 - rtype) >> 1;    dp[4] = (unsigned int) (sp[4] + sp2[4] + 1 - rtype) >> 1;    dp[5] = (unsigned int) (sp[5] + sp2[5] + 1 - rtype) >> 1;    dp[6] = (unsigned int) (sp[6] + sp2[6] + 1 - rtype) >> 1;    dp[7] = (unsigned int) (sp[7] + sp2[7] + 1 - rtype) >> 1;    sp += lx2;    sp2 += lx2;    dp += lx;  }}static void recvo (unsigned char *s, int *d, int lx, int lx2,                    int addflag, int c, int xa, int xb, int ya,                    int yb){  int *dp, *om;  unsigned char *sp, *sp2;  int i, j;  sp = s;  sp2 = s + lx2;  dp = d;  om = &OM[c][ya][0];  if (!addflag)  {    for (j = ya; j < yb; j++)    {      for (i = xa; i < xb; i++)      {        dp[i] = (((unsigned int) (sp[i] + sp2[i] + 1 - rtype)) >> 1) * om[i];      }      sp += lx2;      sp2 += lx2;      dp += lx;      om += 8;    }  } else  {    for (j = ya; j < yb; j++)    {      for (i = xa; i < xb; i++)      {        dp[i] += (((unsigned int) (sp[i] + sp2[i] + 1 - rtype)) >> 1) * om[i];      }      sp += lx2;      sp2 += lx2;      dp += lx;      om += 8;    }  }}static void rec4 (unsigned char *s, unsigned char *d,                   int lx, int lx2, int h){  unsigned char *dp, *sp, *sp2;  int j;  unsigned int s1, s2, s3, s4;  sp = s;  sp2 = s + lx2;  dp = d;  for (j = 0; j < h; j++)  {    s1 = sp[0];    s3 = sp2[0];    dp[0] = (unsigned int) (s1 + (s2 = sp[1]) + s3 + (s4 = sp2[1]) + 2 - rtype) >> 2;    dp[1] = (unsigned int) (s2 + (s1 = sp[2]) + s4 + (s3 = sp2[2]) + 2 - rtype) >> 2;    dp[2] = (unsigned int) (s1 + (s2 = sp[3]) + s3 + (s4 = sp2[3]) + 2 - rtype) >> 2;    dp[3] = (unsigned int) (s2 + (s1 = sp[4]) + s4 + (s3 = sp2[4]) + 2 - rtype) >> 2;    dp[4] = (unsigned int) (s1 + (s2 = sp[5]) + s3 + (s4 = sp2[5]) + 2 - rtype) >> 2;    dp[5] = (unsigned int) (s2 + (s1 = sp[6]) + s4 + (s3 = sp2[6]) + 2 - rtype) >> 2;    dp[6] = (unsigned int) (s1 + (s2 = sp[7]) + s3 + (s4 = sp2[7]) + 2 - rtype) >> 2;    dp[7] = (unsigned int) (s2 + (s1 = sp[8]) + s4 + (s3 = sp2[8]) + 2 - rtype) >> 2;    dp[8] = (unsigned int) (s1 + (s2 = sp[9]) + s3 + (s4 = sp2[9]) + 2 - rtype) >> 2;    dp[9] = (unsigned int) (s2 + (s1 = sp[10]) + s4 + (s3 = sp2[10]) + 2 - rtype) >> 2;    dp[10] = (unsigned int) (s1 + (s2 = sp[11]) + s3 + (s4 = sp2[11]) + 2 - rtype) >> 2;    dp[11] = (unsigned int) (s2 + (s1 = sp[12]) + s4 + (s3 = sp2[12]) + 2 - rtype) >> 2;    dp[12] = (unsigned int) (s1 + (s2 = sp[13]) + s3 + (s4 = sp2[13]) + 2 - rtype) >> 2;    dp[13] = (unsigned int) (s2 + (s1 = sp[14]) + s4 + (s3 = sp2[14]) + 2 - rtype) >> 2;    dp[14] = (unsigned int) (s1 + (s2 = sp[15]) + s3 + (s4 = sp2[15]) + 2 - rtype) >> 2;    dp[15] = (unsigned int) (s2 + sp[16] + s4 + sp2[16] + 2 - rtype) >> 2;    sp += lx2;    sp2 += lx2;    dp += lx;  }}static void rec4c (unsigned char *s, unsigned char *d,                    int lx, int lx2, int h){  unsigned char *dp, *sp, *sp2;  int j;  unsigned int s1, s2, s3, s4;  sp = s;  sp2 = s + lx2;  dp = d;  for (j = 0; j < h; j++)  {    s1 = sp[0];    s3 = sp2[0];    dp[0] = (unsigned int) (s1 + (s2 = sp[1]) + s3 + (s4 = sp2[1]) + 2 - rtype) >> 2;    dp[1] = (unsigned int) (s2 + (s1 = sp[2]) + s4 + (s3 = sp2[2]) + 2 - rtype) >> 2;    dp[2] = (unsigned int) (s1 + (s2 = sp[3]) + s3 + (s4 = sp2[3]) + 2 - rtype) >> 2;    dp[3] = (unsigned int) (s2 + (s1 = sp[4]) + s4 + (s3 = sp2[4]) + 2 - rtype) >> 2;    dp[4] = (unsigned int) (s1 + (s2 = sp[5]) + s3 + (s4 = sp2[5]) + 2 - rtype) >> 2;    dp[5] = (unsigned int) (s2 + (s1 = sp[6]) + s4 + (s3 = sp2[6]) + 2 - rtype) >> 2;    dp[6] = (unsigned int) (s1 + (s2 = sp[7]) + s3 + (s4 = sp2[7]) + 2 - rtype) >> 2;    dp[7] = (unsigned int) (s2 + sp[8] + s4 + sp2[8] + 2 - rtype) >> 2;    sp += lx2;    sp2 += lx2;    dp += lx;  }}static void rec4o (unsigned char *s, int *d, int lx, int lx2,                    int addflag, int c, int xa, int xb, int ya,                    int yb){  int *dp, *om;  unsigned char *sp, *sp2;  int i, j;  sp = s;  sp2 = s + lx2;  dp = d;  om = &OM[c][ya][0];  if (!addflag)  {    for (j = ya; j < yb; j++)    {      for (i = xa; i < xb; i++)      {        dp[i] = (((unsigned int) (sp[i] + sp2[i] + sp[i + 1] + sp2[i + 1] + 2 - rtype)) >> 2) * om[i];      }      sp += lx2;      sp2 += lx2;      dp += lx;      om += 8;    }  } else  {    for (j = ya; j < yb; j++)    {      for (i = xa; i < xb; i++)      {        dp[i] += (((unsigned int) (sp[i] + sp2[i] + sp[i + 1] + sp2[i + 1] + 2 - rtype)) >> 2) * om[i];      }      sp += lx2;      sp2 += lx2;      dp += lx;      om += 8;    }  }}static void recon_comp_obmc (unsigned char *src, unsigned char *dst,                              int lx, int lx2, int comp, int w, int h,                              int x, int y, int newgob){  int j, k;  int xmb, ymb;  int c8, t8, l8, r8;  int ti8, li8, ri8;  int xit, xib, xir, xil;  int yit, yib, yir, yil;  int vect, vecb, vecr, vecl;  int nx[5], ny[5], xint[5], yint[5], xh[5], yh[5];  int p[64], *pd;  unsigned char *d, *s[5];  xmb = (x >> 4) + 1;  ymb = (y >> 4) + 1;  c8 = (modemap[ymb][xmb] == MODE_INTER4V ? 1 : 0);  c8 = (modemap[ymb][xmb] == MODE_INTER4V_Q ? 1 : c8);  t8 = (modemap[ymb - 1][xmb] == MODE_INTER4V ? 1 : 0);  t8 = (modemap[ymb - 1][xmb] == MODE_INTER4V_Q ? 1 : t8);  ti8 = (modemap[ymb - 1][xmb] == MODE_INTRA ? 1 : 0);  ti8 = (modemap[ymb - 1][xmb] == MODE_INTRA_Q ? 1 : ti8);  l8 = (modemap[ymb][xmb - 1] == MODE_INTER4V ? 1 : 0);  l8 = (modemap[ymb][xmb - 1] == MODE_INTER4V_Q ? 1 : l8);  li8 = (modemap[ymb][xmb - 1] == MODE_INTRA ? 1 : 0);  li8 = (modemap[ymb][xmb - 1] == MODE_INTRA_Q ? 1 : li8);  r8 = (modemap[ymb][xmb + 1] == MODE_INTER4V ? 1 : 0);  r8 = (modemap[ymb][xmb + 1] == MODE_INTER4V_Q ? 1 : r8);  ri8 = (modemap[ymb][xmb + 1] == MODE_INTRA ? 1 : 0);  ri8 = (modemap[ymb][xmb + 1] == MODE_INTRA_Q ? 1 : ri8);  if (pb_frame)  {    ti8 = li8 = ri8 = 0;  }  switch (comp + 1)  {    case 1:      vect = (ti8 ? (c8 ? 1 : 0) : (t8 ? 3 : 0));      yit = (ti8 ? ymb : ymb - 1);      xit = xmb;      vecb = (c8 ? 3 : 0);      yib = ymb;      xib = xmb;      vecl = (li8 ? (c8 ? 1 : 0) : (l8 ? 2 : 0));      yil = ymb;      xil = (li8 ? xmb : xmb - 1);      vecr = (c8 ? 2 : 0);      yir = ymb;      xir = xmb;      /* edge handling */      if (ymb == 1 || newgob)      {        yit = ymb;        vect = (c8 ? 1 : 0);      }      if (xmb == 1)      {        xil = xmb;        vecl = (c8 ? 1 : 0);      }      break;    case 2:      vect = (ti8 ? (c8 ? 2 : 0) : (t8 ? 4 : 0));      yit = (ti8 ? ymb : ymb - 1);      xit = xmb;      vecb = (c8 ? 4 : 0);      yib = ymb;      xib = xmb;      vecl = (c8 ? 1 : 0);      yil = ymb;      xil = xmb;      vecr = (ri8 ? (c8 ? 2 : 0) : (r8 ? 1 : 0));      yir = ymb;      xir = (ri8 ? xmb : xmb + 1);      /* edge handling */      if (ymb == 1 || newgob)      {        yit = ymb;        vect = (c8 ? 2 : 0);      }      if (xmb == mb_width)      {        xir = xmb;        vecr = (c8 ? 2 : 0);      }      break;    case 3:      vect = (c8 ? 1 : 0);      yit = ymb;      xit = xmb;      vecb = (c8 ? 3 : 0);      yib = ymb;      xib = xmb;      vecl = (li8 ? (c8 ? 3 : 0) : (l8 ? 4 : 0));      yil = ymb;      xil = (li8 ? xmb : xmb - 1);      vecr = (c8 ? 4 : 0);      yir = ymb;      xir = xmb;      /* edge handling */      if (xmb == 1)      {        xil = xmb;        vecl = (c8 ? 3 : 0);      }      break;    case 4:      vect = (c8 ? 2 : 0);      yit = ymb;      xit = xmb;      vecb = (c8 ? 4 : 0);      yib = ymb;      xib = xmb;      vecl = (c8 ? 3 : 0);      yil = ymb;      xil = xmb;      vecr = (ri8 ? (c8 ? 4 : 0) : (r8 ? 3 : 0));      yir = ymb;      xir = (ri8 ? xmb : xmb + 1);      /* edge handling */      if (xmb == mb_width)      {        xir = xmb;        vecr = (c8 ? 4 : 0);      }      break;    default:      fprintf (stderr, "Illegal block number in recon_comp_obmc (recon.c)\n");      exit (1);      break;  }  nx[0] = MV[0][c8 ? comp + 1 : 0][ymb][xmb];  ny[0] = MV[1][c8 ? comp + 1 : 0][ymb][xmb];  nx[1] = MV[0][vect][yit][xit];  ny[1] = MV[1][vect][yit][xit];  nx[2] = MV[0][vecb][yib][xib];  ny[2] = MV[1][vecb][yib][xib];  nx[3] = MV[0][vecr][yir][xir];  ny[3] = MV[1][vecr][yir][xir];  nx[4] = MV[0][vecl][yil][xil];  ny[4] = MV[1][vecl][yil][xil];  for (k = 0; k < 5; k++)  {    xint[k] = nx[k] >> 1;    xh[k] = nx[k] & 1;    yint[k] = ny[k] >> 1;    yh[k] = ny[k] & 1;    s[k] = src + lx2 * (y + yint[k]) + x + xint[k];  }  d = dst + lx * y + x;  if (!xh[0] && !yh[0])    reco (s[0], &p[0], 8, lx2, 0, 0, 0, 8, 0, 8);  else if (!xh[0] && yh[0])    recvo (s[0], &p[0], 8, lx2, 0, 0, 0, 8, 0, 8);  else if (xh[0] && !yh[0])    recho (s[0], &p[0], 8, lx2, 0, 0, 0, 8, 0, 8);  else                          /* if (xh[] && yh[]) */    rec4o (s[0], &p[0], 8, lx2, 0, 0, 0, 8, 0, 8);  if (!xh[1] && !yh[1])    reco (s[1], &p[0], 8, lx2, 1, 1, 0, 8, 0, 4);  else if (!xh[1] && yh[1])    recvo (s[1], &p[0], 8, lx2, 1, 1, 0, 8, 0, 4);  else if (xh[1] && !yh[1])    recho (s[1], &p[0], 8, lx2, 1, 1, 0, 8, 0, 4);  else                          /* if (xh[] && yh[]) */    rec4o (s[1], &p[0], 8, lx2, 1, 1, 0, 8, 0, 4);  if (!xh[2] && !yh[2])    reco (s[2] + (lx2 << 2), &p[32], 8, lx2, 1, 2, 0, 8, 4, 8);  else if (!xh[2] && yh[2])    recvo (s[2] + (lx2 << 2), &p[32], 8, lx2, 1, 2, 0, 8, 4, 8);  else if (xh[2] && !yh[2])    recho (s[2] + (lx2 << 2), &p[32], 8, lx2, 1, 2, 0, 8, 4, 8);  else                          /* if (xh[] && yh[]) */    rec4o (s[2] + (lx2 << 2), &p[32], 8, lx2, 1, 2, 0, 8, 4, 8);  if (!xh[3] && !yh[3])    reco (s[3], &p[0], 8, lx2, 1, 3, 4, 8, 0, 8);  else if (!xh[3] && yh[3])    recvo (s[3], &p[0], 8, lx2, 1, 3, 4, 8, 0, 8);  else if (xh[3] && !yh[3])    recho (s[3], &p[0], 8, lx2, 1, 3, 4, 8, 0, 8);  else                          /* if (xh[] && yh[]) */    rec4o (s[3], &p[0], 8, lx2, 1, 3, 4, 8, 0, 8);  if (!xh[4] && !yh[4])    reco (s[4], &p[0], 8, lx2, 1, 4, 0, 4, 0, 8);  else if (!xh[4] && yh[4])    recvo (s[4], &p[0], 8, lx2, 1, 4, 0, 4, 0, 8);  else if (xh[4] && !yh[4])    recho (s[4], &p[0], 8, lx2, 1, 4, 0, 4, 0, 8);  else                          /* if (xh[] && yh[]) */    rec4o (s[4], &p[0], 8, lx2, 1, 4, 0, 4, 0, 8);  pd = &p[0];  for (j = 0; j < 8; j++)  {    d[0] = (pd[0] + 4) >> 3;    d[1] = (pd[1] + 4) >> 3;    d[2] = (pd[2] + 4) >> 3;    d[3] = (pd[3] + 4) >> 3;    d[4] = (pd[4] + 4) >> 3;    d[5] = (pd[5] + 4) >> 3;    d[6] = (pd[6] + 4) >> 3;    d[7] = (pd[7] + 4) >> 3;    d += lx;    pd += 8;  }}

⌨️ 快捷键说明

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