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

📄 macroblock.c

📁 包含了从MPEG4的视频解码到H.264的视频编码部分的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
void interpret_mb_mode_P(struct img_par *img)
{
  int i;
  const int ICBPTAB[6] = {0,16,32,15,31,47};
  Macroblock *currMB = &img->mb_data[img->map_mb_nr];//GB current_mb_nr];
  int         mbmode = currMB->mb_type;

#define ZERO_P8x8     (mbmode==5)
#define MODE_IS_P8x8  (mbmode==4 || mbmode==5)
#define MODE_IS_I4x4  (mbmode==6)
#define I16OFFSET     (mbmode-7)

  if(mbmode <4)
  {
    currMB->mb_type = mbmode;
    for (i=0;i<4;i++)
    {
      currMB->b8mode[i]   = mbmode;
      currMB->b8pdir[i]   = 0;
    }
  }
  else if(MODE_IS_P8x8)
  {
    currMB->mb_type = P8x8;
    img->allrefzero = ZERO_P8x8;
  }
  else if(MODE_IS_I4x4)
  {
    currMB->mb_type = I4MB;
    for (i=0;i<4;i++)
    {
      currMB->b8mode[i] = IBLOCK;
      currMB->b8pdir[i] = -1;
    }
  }
  else
  {
    currMB->mb_type = I16MB;
    for (i=0;i<4;i++) {currMB->b8mode[i]=0; currMB->b8pdir[i]=-1; }
    currMB->cbp= ICBPTAB[(I16OFFSET)>>2];
    currMB->i16mode = (I16OFFSET) & 0x03;
  }
}

/*!
 ************************************************************************
 * \brief
 *    Interpret the mb mode for I-Frames
 ************************************************************************
 */
void interpret_mb_mode_I(struct img_par *img)
{
  int i;
  const int ICBPTAB[6] = {0,16,32,15,31,47};
  Macroblock *currMB   = &img->mb_data[img->map_mb_nr];//GB current_mb_nr];
  int         mbmode   = currMB->mb_type;

  if (mbmode==0)
  {
    currMB->mb_type = I4MB;
    for (i=0;i<4;i++) {currMB->b8mode[i]=IBLOCK; currMB->b8pdir[i]=-1; }
  }
  else
  {
    currMB->mb_type = I16MB;
    for (i=0;i<4;i++) {currMB->b8mode[i]=0; currMB->b8pdir[i]=-1; }
    currMB->cbp= ICBPTAB[(mbmode-1)>>2];
    currMB->i16mode = (mbmode-1) & 0x03;
  }
}

/*!
 ************************************************************************
 * \brief
 *    Interpret the mb mode for B-Frames
 ************************************************************************
 */
void interpret_mb_mode_B(struct img_par *img)
{
  static const int offset2pdir16x16[12]   = {0, 0, 1, 2, 0,0,0,0,0,0,0,0};
  static const int offset2pdir16x8[22][2] = {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,1},{0,0},{0,1},{0,0},{1,0},
                                             {0,0},{0,2},{0,0},{1,2},{0,0},{2,0},{0,0},{2,1},{0,0},{2,2},{0,0}};
  static const int offset2pdir8x16[22][2] = {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{1,1},{0,0},{0,1},{0,0},
                                             {1,0},{0,0},{0,2},{0,0},{1,2},{0,0},{2,0},{0,0},{2,1},{0,0},{2,2}};

  const int ICBPTAB[6] = {0,16,32,15,31,47};
  Macroblock *currMB = &img->mb_data[img->map_mb_nr];//GB current_mb_nr];

  int i, mbmode;
  int mbtype  = currMB->mb_type;
  int *b8mode = currMB->b8mode;
  int *b8pdir = currMB->b8pdir;

  //--- set mbtype, b8type, and b8pdir ---
  if (mbtype==0)       // direct
  {
      mbmode=0;       for(i=0;i<4;i++) {b8mode[i]=0;          b8pdir[i]=2; }
  }
  else if (mbtype==23) // intra4x4
  {
    mbmode=I4MB;    for(i=0;i<4;i++) {b8mode[i]=IBLOCK;     b8pdir[i]=-1; }
  }
  else if (mbtype>23) // intra16x16
  {
    mbmode=I16MB;   for(i=0;i<4;i++) {b8mode[i]=0;          b8pdir[i]=-1; }
    currMB->cbp     = ICBPTAB[(mbtype-24)>>2];
    currMB->i16mode = (mbtype-24) & 0x03;
  }
  else if (mbtype==22) // 8x8(+split)
  {
    mbmode=P8x8;       // b8mode and pdir is transmitted in additional codewords
  }
  else if (mbtype<4)   // 16x16
  {
    mbmode=1;       for(i=0;i<4;i++) {b8mode[i]=1;          b8pdir[i]=offset2pdir16x16[mbtype]; }
  }
  else if (mbtype%2==0) // 16x8
  {
    mbmode=2;       for(i=0;i<4;i++) {b8mode[i]=2;          b8pdir[i]=offset2pdir16x8 [mbtype][i/2]; }
  }
  else
  {
    mbmode=3;       for(i=0;i<4;i++) {b8mode[i]=3;          b8pdir[i]=offset2pdir8x16 [mbtype][i%2]; }
  }
  currMB->mb_type = mbmode;
}
/*!
 ************************************************************************
 * \brief
 *    Interpret the mb mode for SI-Frames
 ************************************************************************
 */
void interpret_mb_mode_SI(struct img_par *img)
{
  int i;
  const int ICBPTAB[6] = {0,16,32,15,31,47};
  Macroblock *currMB   = &img->mb_data[img->map_mb_nr];//GB current_mb_nr];
  int         mbmode   = currMB->mb_type;

  if (mbmode==0)
  {
    currMB->mb_type = SI4MB;
    for (i=0;i<4;i++) {currMB->b8mode[i]=IBLOCK; currMB->b8pdir[i]=-1; }
    img->siblock[img->mb_x][img->mb_y]=1;
  }
  else if (mbmode==1)
  {
    currMB->mb_type = I4MB;
    for (i=0;i<4;i++) {currMB->b8mode[i]=IBLOCK; currMB->b8pdir[i]=-1; }
  }
  else
  {
    currMB->mb_type = I16MB;
    for (i=0;i<4;i++) {currMB->b8mode[i]=0; currMB->b8pdir[i]=-1; }
    currMB->cbp= ICBPTAB[(mbmode-1)>>2];
    currMB->i16mode = (mbmode-2) & 0x03;
  }
}
/*!
 ************************************************************************
 * \brief
 *    init macroblock I and P frames
 ************************************************************************
 */
void init_macroblock(struct img_par *img)
{
  int i,j;
  int predframe_no;
  Macroblock *currMB = &img->mb_data[img->map_mb_nr];//GB current_mb_nr];
  int img_block_y;
  int j2 = img->block_y/2 - 2*(img->current_mb_nr%2);

  if (img->mb_frame_field_flag)
  {
    if (img->current_mb_nr%2==0)
    {
      img_block_y   = img->block_y/2;

      img->mv_frm[img->block_x+4][img->block_y][2]=img->number;
      img->mv_top[img->block_x+4][img_block_y][2]=img->number*2;
    }
    else
    {
      img_block_y   = (img->block_y-4)/2;

      img->mv_frm[img->block_x+4][img->block_y][2]=img->number;
      img->mv_bot[img->block_x+4][img_block_y][2]=img->number*2;
    }
  }
  else
    img->mv[img->block_x+4][img->block_y][2]=img->number;

  for (i=0;i<BLOCK_SIZE;i++)
  {                           // reset vectors and pred. modes
    for(j=0;j<BLOCK_SIZE;j++)
    {
      if (img->mb_frame_field_flag)
      {
        if (img->current_mb_nr%2==0)
        {
          img_block_y   = img->block_y/2;

          img->mv_frm[img->block_x+i+4][img->block_y+j][0] = 0;
          img->mv_frm[img->block_x+i+4][img->block_y+j][1] = 0;

          img->mv_top[img->block_x+i+4][img_block_y+j][0] = 0;
          img->mv_top[img->block_x+i+4][img_block_y+j][1] = 0;
        }
        else
        {
          img_block_y   = (img->block_y-4)/2;

          img->mv_frm[img->block_x+i+4][img->block_y+j][0] = 0;
          img->mv_frm[img->block_x+i+4][img->block_y+j][1] = 0;

          img->mv_bot[img->block_x+i+4][img_block_y+j][0] = 0;
          img->mv_bot[img->block_x+i+4][img_block_y+j][1] = 0;
        }
      }
      else
      {
        img->mv[img->block_x+i+4][img->block_y+j][0] = 0;
        img->mv[img->block_x+i+4][img->block_y+j][1] = 0;
      }

      img->ipredmode[img->block_x+i+1][img->block_y+j+1] = DC_PRED;
      if (img->current_mb_nr%2==0)
        img->ipredmode_top[img->block_x+i+1][j2+j+1] = DC_PRED;
      else
        img->ipredmode_bot[img->block_x+i+1][j2+j+1] = DC_PRED;
    }
  }

  predframe_no = 0;
  if (img->structure != FRAME)  // Initialize for field mode (use for copy)
    if (img->number>1)          // use the top field for the bottom field of the first picture
      predframe_no = 1;         // g.b.1;

 
  // Set the reference frame information for motion vector prediction
  if (IS_INTRA (currMB))
  {
    if (img->structure != FRAME)
    {
        for (j=0; j<4; j++)
        for (i=0; i<4; i++)
        {
            refFrArr[img->block_y+j][img->block_x+i] = -1;
        }
    }
    else
    {
        if (img->mb_frame_field_flag)
        {
          if (img->current_mb_nr%2==0)
          {
            img_block_y   = img->block_y/2;
            for (j=0; j<4; j++)
              for (i=0; i<4; i++)
              {
                refFrArr_top[img_block_y+j][img->block_x+i] = -1;
                refFrArr_frm[img->block_y+j][img->block_x+i] = -1;
              }
          }
          else
          {
            img_block_y   = (img->block_y-4)/2;
            for (j=0; j<4; j++)
              for (i=0; i<4; i++)
              {
                refFrArr_bot[img_block_y+j][img->block_x+i] = -1;
                refFrArr_frm[img->block_y+j][img->block_x+i] = -1;
              }
          }
        }
        else
        {
          for (j=0; j<4; j++)
            for (i=0; i<4; i++)
            {
              refFrArr[img->block_y+j][img->block_x+i] = -1;
            }
        }
    }
  }
  else if (!IS_P8x8 (currMB))
  {
    if (img->structure != FRAME)
    {
        for (j=0; j<4; j++)
          for (i=0; i<4; i++)
          {
            refFrArr[img->block_y+j][img->block_x+i] = 0;
          }
    }
    else
    {
        if (img->mb_frame_field_flag)
        {
          if (img->current_mb_nr%2==0)
          {
              img_block_y   = img->block_y/2;
              for (j=0; j<4; j++)
                for (i=0; i<4; i++)
                {
                  refFrArr_top[img_block_y+j][img->block_x+i] = 0;
                  refFrArr_frm[img->block_y+j][img->block_x+i] = 0;
                }
          }
          else
          {
              img_block_y   = (img->block_y-4)/2;
              for (j=0; j<4; j++)
                for (i=0; i<4; i++)
                {
                  refFrArr_bot[img_block_y+j][img->block_x+i] = 0;
                  refFrArr_frm[img->block_y+j][img->block_x+i] = 0;
                }
          }
        }
        else
        {
          for (j=0; j<4; j++)
            for (i=0; i<4; i++)
            {
              refFrArr[img->block_y+j][img->block_x+i] = 0;
            }
        }
    }
  }
  else
  {
        if (img->mb_frame_field_flag)
        {
          if (img->current_mb_nr%2==0)
          {
              img_block_y   = img->block_y/2;
              for (j=0; j<4; j++)
                for (i=0; i<4; i++)
                {
                  if(img->structure != FRAME) 
                    refFrArr[img->block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : (img->number>1)?1:0);
                  else
                  {
                    refFrArr_top[img_block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : 0);
                    refFrArr_frm[img->block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : 0);
                  }
                }
          }
          else
          {
              img_block_y   = (img->block_y-4)/2;
              for (j=0; j<4; j++)
                for (i=0; i<4; i++)
                {
                  if(img->structure != FRAME) 
                    refFrArr[img->block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : (img->number>1)?1:0);
                  else
                  {
                    refFrArr_bot[img_block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : 0);
                    refFrArr_frm[img->block_y+j][img->block_x+i] = (currMB->b8mode[2*(j/2)+(i/2)]==IBLOCK ? -1 : 0);
                  }
                }
          }
        }
        else

⌨️ 快捷键说明

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