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

📄 getpic.c.bak

📁 h263解码程序.。。。。。。。。。。。
💻 BAK
📖 第 1 页 / 共 5 页
字号:
        {          true_B_direct_mode_MV[0][k][ypos + 1][xpos + 1] = 0;          true_B_direct_mode_MV[1][k][ypos + 1][xpos + 1] = 0;        }      }      mvdbx = 0;      mvdby = 0;        }    /* Store mode and prediction type */    modemap[ypos + 1][xpos + 1] = Mode;        /* store defaults for advanced intra coding mode */    if (advanced_intra_coding)    {      for (i = 0; i < blk_cnt; i++)        store_qcoeff[MBA * blk_cnt * 64 + i * 64] = 1024;    }    if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)    {      if (!pb_frame)      {        MV[0][0][ypos + 1][xpos + 1] = MV[1][0][ypos + 1][xpos + 1] = 0;      }    }reconstruct_mb:    /* pixel coordinates of top left corner of current macroblock */    /* one delayed because of OBMC */    if (xpos > 0)    {      bx = 16 * (xpos - 1);      by = 16 * ypos;    }     else    {      bx = coded_picture_width - 16;      by = 16 * (ypos - 1);    }    if (MBA > 0 && !dont_reconstruct_next_mb)    {      Mode = modemap[by / 16 + 1][bx / 16 + 1];      /* forward motion compensation for B-frame */      if (pb_frame)      {        if (pCOD)        {          /* if the macroblock is not coded then it is bidir predicted */          pMODB = PBMODE_BIDIR_PRED;          reconstruct (bx, by, 0, pmvdbx, pmvdby, PBMODE_BIDIR_PRED, pnewgob);        }         else        {          if (!(pb_frame == IM_PB_FRAMES && (pMODB == PBMODE_CBPB_BCKW_PRED || pMODB == PBMODE_BCKW_PRED)))            reconstruct (bx, by, 0, pmvdbx, pmvdby, pMODB, pnewgob);        }      }          /* motion compensation for P-frame */      if (Mode == MODE_INTER || Mode == MODE_INTER_Q ||          Mode == MODE_INTER4V || Mode == MODE_INTER4V_Q)      {        reconstruct (bx, by, 1, 0, 0, pMODB, pnewgob);      }      /* copy or add block data into P-picture */      for (comp = 0; comp < blk_cnt; comp++)      {        /* inverse DCT */        if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)        {          if (refidct)            idctref (ld->block[comp]);          else            idct (ld->block[comp]);          addblock (comp, bx, by, 0);        }         else if ((pCBP & (1 << (blk_cnt - 1 - comp))))        {          /* No need to to do this for blocks with no coeffs */          if (refidct)            idctref (ld->block[comp]);          else            idct (ld->block[comp]);          addblock (comp, bx, by, 1);        }      }      if (pb_frame)      {        if (pMODB == PBMODE_CBPB_BCKW_PRED || pMODB == PBMODE_BCKW_PRED)        {          reconstruct (bx, by, 0, 0, 0, pMODB, pnewgob);        }        /* add block data into B-picture */        for (comp = 6; comp < blk_cnt + 6; comp++)        {          if (!pCOD || adv_pred_mode)          {            if (pb_frame == IM_PB_FRAMES)            {              if (pMODB == PBMODE_CBPB_BIDIR_PRED || pMODB == PBMODE_BIDIR_PRED || pCOD)              {                reconblock_b (comp - 6, bx, by, Mode, 0, 0);              }            }             else            {              reconblock_b (comp - 6, bx, by, Mode, pmvdbx, pmvdby);            }          }          if ((pCBPB & (1 << (blk_cnt - 1 - comp % 6))))          {            if (refidct)              idctref (ld->block[comp]);            else              idct (ld->block[comp]);            addblock (comp, bx, by, 1);          }        }      }    }    /* end if (MBA > 0) */    if (!COD)    {      Mode = modemap[ypos + 1][xpos + 1];          /* decode blocks */      for (comp = 0; comp < blk_cnt; comp++)      {        clearblock (comp);        if ((Mode == MODE_INTRA || Mode == MODE_INTRA_Q) && !(advanced_intra_coding))        {          /* Intra (except in advanced intra coding mode) */          bp = ld->block[comp];          if (syntax_arith_coding)          {            //20070702          }           else          {            bp[0] = getbits (8);            if (trace)            {              fprintf (trace_file, "DC[%d]: (", comp);              printbits ((int) bp[0], 8, 8);              fprintf (trace_file, "): %d\n", (int) bp[0]);            }          }          if (bp[0] == 128)            if (!quiet)              fprintf (stderr, "Illegal DC-coeff: 1000000\n");          if (bp[0] == 255)   /* Spec. in H.26P, not in TMN4 */            bp[0] = 128;          bp[0] *= 8;         /* Iquant */          if ((CBP & (1 << (blk_cnt - 1 - comp))))          {            if (!syntax_arith_coding)              getblock (comp, 0, 0, Mode);            //20070702          }        }         else        {          /* Inter (or Intra in advanced intra coding mode) */          if ((CBP & (1 << (blk_cnt - 1 - comp))))          {            if (!syntax_arith_coding)              getblock (comp, 1, INTRA_AC_DC, Mode);            //20070702          }        }        if ((advanced_intra_coding) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q))        {          Intra_AC_DC_Decode (store_qcoeff, INTRA_AC_DC, MBA, xpos, ypos, comp, newgob);          memcpy ((void *) (store_qcoeff + MBA * blk_cnt * 64 + comp * 64),                  (void *) ld->block[comp], sizeof (short) * 64);        }        if (fault)          goto resync;      }      /* Decode B blocks */      if (pb_frame)      {        for (comp = 6; comp < blk_cnt + 6; comp++)        {          clearblock (comp);          if ((CBPB & (1 << (blk_cnt - 1 - comp % 6))))          {            if (!syntax_arith_coding)              getblock (comp, 1, 0, MODE_INTER);            //20070702          }           if (fault)            goto resync;                }      }    }  conceal_gob:    /* decode the last MB if data is missing */    if (decode_last_mb)    {      conceal_missing_gobs(start_mb_row_missing, number_of_mb_rows_missing);      /* all macroblocks in the picture are done, return        * if the first gob in the next frame is also missing,        * we will also lose the secon gob of that next frame.       * This can be dealt with, but we will live with that for now. */      if ( (number_of_mb_rows_missing + start_mb_row_missing) * mb_width >= MBAmax) return;      ypos = gob;      decode_last_mb = 0;      dont_reconstruct_next_mb = 1;      goto finish_gob;    }    else    {      /* advance to next macroblock */      MBA++;      pCBP = CBP;      pCBPB = CBPB;      pCOD = COD;      pMODB = MODB;      quant_map[ypos + 1][xpos + 1] = quant;            pmvdbx = mvdbx;      pmvdby = mvdby;      fflush (stdout);      pnewgob = newgob;            if (MBA >= MBAmax && !last_done)      {        COD = 1;        xpos = 0;        ypos++;        last_done = 1;        goto reconstruct_mb;         }    }  }}/* set block to zero */static void clearblock (int comp){  int *bp;  int i;  bp = (int *) ld->block[comp];  for (i = 0; i < 8; i++)  {    bp[0] = bp[1] = bp[2] = bp[3] = 0;    bp += 4;  }}/* move/add 8x8-Block from block[comp] to refframe or bframe */static void addblock (int comp, int bx, int by, int addflag){  int cc, i, iincr, P = 1;  unsigned char *rfp;  short *bp;  unsigned char *curr[3];  if (enhancement_layer_num > 1)  {    curr[0] = current_enhancement_frame[enhancement_layer_num-2][0];    curr[1] = current_enhancement_frame[enhancement_layer_num-2][1];    curr[2] = current_enhancement_frame[enhancement_layer_num-2][2];  }  else  {    curr[0] = current_frame[0];    curr[1] = current_frame[1];    curr[2] = current_frame[2];  }  bp = ld->block[comp];  if (comp >= 6)  {    /* This is a component for B-frame forward prediction */    P = 0;    addflag = 1;    comp -= 6;  }  cc = (comp < 4) ? 0 : (comp & 1) + 1; /* color component index */  if (cc == 0)  {    /* luminance */    /* frame DCT coding */    if (P)      rfp = curr[0]        + coded_picture_width * (by + ((comp & 2) << 2)) + bx + ((comp & 1) << 3);    else        rfp = bframe[0]        + coded_picture_width * (by + ((comp & 2) << 2)) + bx + ((comp & 1) << 3);    iincr = coded_picture_width;  }   else  {    /* chrominance */    /* scale coordinates */    bx >>= 1;    by >>= 1;    /* frame DCT coding */    if (P)      rfp = curr[cc] + chrom_width * by + bx;    else      rfp = bframe[cc] + chrom_width * by + bx;    iincr = chrom_width;  }  if (addflag)  {    for (i = 0; i < 8; i++)    {      rfp[0] = clp[bp[0] + rfp[0]];      rfp[1] = clp[bp[1] + rfp[1]];      rfp[2] = clp[bp[2] + rfp[2]];      rfp[3] = clp[bp[3] + rfp[3]];      rfp[4] = clp[bp[4] + rfp[4]];      rfp[5] = clp[bp[5] + rfp[5]];      rfp[6] = clp[bp[6] + rfp[6]];      rfp[7] = clp[bp[7] + rfp[7]];      bp += 8;      rfp += iincr;    }  } else  {    for (i = 0; i < 8; i++)    {      rfp[0] = clp[bp[0]];      rfp[1] = clp[bp[1]];      rfp[2] = clp[bp[2]];      rfp[3] = clp[bp[3]];      rfp[4] = clp[bp[4]];      rfp[5] = clp[bp[5]];      rfp[6] = clp[bp[6]];      rfp[7] = clp[bp[7]];      bp += 8;      rfp += iincr;    }  }  /* printf("%s", (cc ? "Chrominance\n" : "Luminance\n"));  for (i=0; i<8;   * ++i) { printf("%d %d %d %d %d %d %d %d\n", rfp[0], rfp[1], rfp[2],   * rfp[3],  rfp[4], rfp[5], rfp[6], rfp[7]); rfp+= iincr; }   * printf("\n");  */}/* bidirectionally reconstruct 8x8-Block from block[comp] to bframe */static void reconblock_b (int comp, int bx, int by, int mode, int bdx, int bdy){  int cc, i, j, k, ii;  unsigned char *bfr, *ffr;  int BMVx, BMVy;  int xa, xb, ya, yb, x, y, xvec, yvec, mvx, mvy;  int xint, xhalf, yint, yhalf, pel;  x = bx / 16 + 1;  y = by / 16 + 1;  if (mode == MODE_INTER4V || mode == MODE_INTER4V_Q)  {    if (comp < 4)    {      /* luma */      mvx = MV[0][comp + 1][y][x];      mvy = MV[1][comp + 1][y][x];      BMVx = (bdx == 0 ? (trb - trd) * mvx / trd : trb * mvx / trd + bdx - mvx);      BMVy = (bdy == 0 ? (trb - trd) * mvy / trd : trb * mvy / trd + bdy - mvy);    } else    {      /* chroma */      xvec = yvec = 0;      for (k = 1; k <= 4; k++)      {        mvx = MV[0][k][y][x];        mvy = MV[1][k][y][x];        xvec += (bdx == 0 ? (trb - trd) * mvx / trd : trb * mvx / trd + bdx - mvx);        yvec += (bdy == 0 ? (trb - trd) * mvy / trd : trb * mvy / trd + bdy - mvy);      }      /* chroma rounding (table 16/H.263) */      BMVx = sign (xvec) * (roundtab[abs (xvec) % 16] + (abs (xvec) / 16) * 2);      BMVy = sign (yvec) * (roundtab[abs (yvec) % 16] + (abs (yvec) / 16) * 2);    }  } else  {    if (comp < 4)    {      /* luma */      mvx = MV[0][0][y][x];      mvy = MV[1][0][y][x];      BMVx = (bdx == 0 ? (trb - trd) * mvx / trd : trb * mvx / trd + bdx - mvx);      BMVy = (bdy == 0 ? (trb - trd) * mvy / trd : trb * mvy / trd + bdy - mvy);    } else    {      /* chroma */      mvx = MV[0][0][y][x];      mvy = MV[1][0][y][x];      xvec = (bdx == 0 ? (trb - trd) * mvx / trd : trb * mvx / trd + bdx - mvx);      yvec = (bdy == 0 ? (trb - trd) * mvy / trd : trb * mvy / trd + bdy - mvy);      xvec *= 4;      yvec *= 4;      /* chroma rounding (table 16/H.263) */      BMVx = sign (xvec) * (roundtab[abs (xvec) % 16] + (abs (xvec) / 16) * 2);      BMVy = sign (yvec) * (roundtab[abs (yvec) % 16] + (abs (yvec) / 16) * 2);    }  }  cc = (comp < 4) ? 0 : (comp & 1) + 1; /* color component index */  if (cc == 0)  {    /* luminance */    find_bidir_limits (BMVx, &xa, &xb, comp & 1);    find_bidir_limits (BMVy, &ya, &yb, (comp & 2) >> 1);    bfr = bframe[0] +      coded_picture_width * (by + ((comp & 2) << 2)) + bx + ((comp & 1) << 3);    ffr = current_frame[0] +      coded_picture_width * (by + ((comp & 2) << 2)) + bx + ((comp & 1) << 3);    ii = coded_picture_width;  } else  {    /* chrominance */    /* scale coordinates and vectors */    bx >>= 1;    by >>= 1;    find_bidir_chroma_limits (BMVx, &xa, &xb);    find_bidir_chroma_limits (BMVy, &ya, &yb);    bfr = bframe[cc] + chrom_width * (by + ((comp & 2) << 2)) + bx + (comp & 8);    ffr = current_frame[cc] + chrom_width * (by + ((comp & 2) << 2)) + bx + (comp & 8);    ii = chrom_width;  }  xint = BMVx >> 1;  xhalf = BMVx - 2 * xint;  yint = BMVy >> 1;  yhalf = BMVy - 2 * yint;  ffr += xint + (yint + ya) * ii;

⌨️ 快捷键说明

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