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

📄 b_frame.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 4 页
字号:

                for (j=0;j<4;j++)
                {
                  j2=j*8;
                  for (i=0;i<4;i++)
                  {
                    i2=i*8;
                    fw_pred=UMVPelY_18 (mref[img->fw_multframe_no], jj4+j2, ii4+i2);  // refbuf
                    bw_pred=UMVPelY_18 (mref_P, jjj4+j2, iii4+i2);  // refbuf
                    img->mpr[i+block_x][j+block_y]=(int)((fw_pred+bw_pred)/2.0+0.5);
                  }
                }
              }
              else
              {
                ii4=(img->pix_x+block_x)*4+tmp_fwMV[0][pic_block_y][pic_block_x+4];
                jj4=(img->pix_y+block_y)*4+tmp_fwMV[1][pic_block_y][pic_block_x+4];
                iii4=(img->pix_x+block_x)*4+tmp_bwMV[0][pic_block_y][pic_block_x+4];
                jjj4=(img->pix_y+block_y)*4+tmp_bwMV[1][pic_block_y][pic_block_x+4];

                for (j=0;j<4;j++)
                {
                  j2=j*4;
                  for (i=0;i<4;i++)
                  {
                    i2=i*4;
                    fw_pred=UMVPelY_14 (mref[img->fw_multframe_no], jj4+j2, ii4+i2);  // refbuf
                    bw_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2);  // refbuf
                    img->mpr[i+block_x][j+block_y]=(int)((fw_pred+bw_pred)/2.0+0.5);
                  }
                }
              }

              for (j=0; j < BLOCK_SIZE; j++)
              {
                for (i=0; i < BLOCK_SIZE; i++)
                {
                  img->m7[i][j]=
                    imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-img->mpr[i+block_x][j+block_y];
                }
              }
              nonzero=dct_luma(block_x,block_y,&coeff_cost);
              if (nonzero)
              {
                currMB->cbp_blk |= 1 << cbp_blk_mask ;            // one bit for every 4x4 block
                currMB->cbp     |= cbp_mask;
              }
            } // block_x
          } // block_y

          if (coeff_cost > 3)
          {
            sum_cnt_nonz += coeff_cost;
          }
          else //discard
          {
            currMB->cbp     &= (63-cbp_mask);
            currMB->cbp_blk &= ~(51 << (mb_y + (mb_x>>2) )) ;
            for (i=mb_x; i < mb_x+BLOCK_SIZE*2; i++)
            {
              for (j=mb_y; j < mb_y+BLOCK_SIZE*2; j++)
              {
                imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
              }
            }
          }
        } // mb_x
      } // mb_y

      if (sum_cnt_nonz <= 5 )
      {
        currMB->cbp     &= 0xfffff0 ;
        currMB->cbp_blk &= 0xff0000 ;
        for (i=0; i < MB_BLOCK_SIZE; i++)
        {
          for (j=0; j < MB_BLOCK_SIZE; j++)
          {
            imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
          }
        }
      }
      break;

    case B_Direct :
      currMB->cbp=0;
      currMB->cbp_blk=0;
      sum_cnt_nonz=0;
      for (mb_y=0; mb_y < MB_BLOCK_SIZE; mb_y += BLOCK_SIZE*2)
      {
        for (mb_x=0; mb_x < MB_BLOCK_SIZE; mb_x += BLOCK_SIZE*2)
        {
          cbp_mask=(int)pow(2,(mb_x/8+mb_y/4));
          coeff_cost=0;
          for (block_y=mb_y; block_y < mb_y+BLOCK_SIZE*2; block_y += BLOCK_SIZE)
          {
            pic_pix_y=img->pix_y+block_y;
            pic_block_y=pic_pix_y/BLOCK_SIZE;
            for (block_x=mb_x; block_x < mb_x+BLOCK_SIZE*2; block_x += BLOCK_SIZE)
            {
              cbp_blk_mask = (block_x>>2)+ block_y ;
              pic_pix_x=img->pix_x+block_x;
              pic_block_x=pic_pix_x/BLOCK_SIZE;

              img->ipredmode[pic_block_x+1][pic_block_y+1]=0;

              if(input->mv_res)
              {
                ii4 =(img->pix_x+block_x)*8+dfMV[0][pic_block_y][pic_block_x+4];
                jj4 =(img->pix_y+block_y)*8+dfMV[1][pic_block_y][pic_block_x+4];
                iii4=(img->pix_x+block_x)*8+dbMV[0][pic_block_y][pic_block_x+4];
                jjj4=(img->pix_y+block_y)*8+dbMV[1][pic_block_y][pic_block_x+4];

                // next P is intra mode
                if(refFrArr[pic_block_y][pic_block_x]==-1)
                  ref_inx=(img->number-1)%img->buf_cycle;
                // next P is skip or inter mode
                else
                  ref_inx=(img->number-refFrArr[pic_block_y][pic_block_x]-1)%img->buf_cycle;

                for (j=0;j<4;j++)
                {
                  j2=j*8;
                  for (i=0;i<4;i++)
                  {
                    i2=i*8;
                    df_pred=UMVPelY_18 (mref[ref_inx], jj4+j2, ii4+i2);
                    db_pred=UMVPelY_18 (mref_P, jjj4+j2, iii4+i2);

                    img->mpr[i+block_x][j+block_y]=(int)((df_pred+db_pred)/2.0+0.5);
                  }
                }
              }
              else
              {
                ii4 =(img->pix_x+block_x)*4+dfMV[0][pic_block_y][pic_block_x+4];
                jj4 =(img->pix_y+block_y)*4+dfMV[1][pic_block_y][pic_block_x+4];
                iii4=(img->pix_x+block_x)*4+dbMV[0][pic_block_y][pic_block_x+4];
                jjj4=(img->pix_y+block_y)*4+dbMV[1][pic_block_y][pic_block_x+4];

                // next P is intra mode
                if(refFrArr[pic_block_y][pic_block_x]==-1)
                  ref_inx=(img->number-1)%img->buf_cycle;
                // next P is skip or inter mode
                else
                  ref_inx=(img->number-refFrArr[pic_block_y][pic_block_x]-1)%img->buf_cycle;

                for (j=0;j<4;j++)
                {
                  j2=j*4;
                  for (i=0;i<4;i++)
                  {
                    i2=i*4;
                    df_pred=UMVPelY_14 (mref[ref_inx], jj4+j2, ii4+i2);
                    db_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2);

                    img->mpr[i+block_x][j+block_y]=(int)((df_pred+db_pred)/2.0+0.5);
                  }
                }
              }
              // LG : direct residual coding
              for (j=0; j < BLOCK_SIZE; j++)
              {
                for (i=0; i < BLOCK_SIZE; i++)
                {
                  img->m7[i][j]=
                    imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-img->mpr[i+block_x][j+block_y];
                }
              }
              nonzero=dct_luma(block_x,block_y,&coeff_cost);
              if (nonzero)
              {
                currMB->cbp_blk |= 1 << cbp_blk_mask ;            // one bit for every 4x4 block
                currMB->cbp     |= cbp_mask;
              }
            } // block_x
          } // block_y

          // LG : direct residual coding
          if (coeff_cost > 3)
          {
            sum_cnt_nonz += coeff_cost;
          }
          else //discard
          {
            currMB->cbp     &= (63-cbp_mask);
            currMB->cbp_blk &= ~(51 << (mb_y + (mb_x>>2) )) ;
            for (i=mb_x; i < mb_x+BLOCK_SIZE*2; i++)
            {
              for (j=mb_y; j < mb_y+BLOCK_SIZE*2; j++)
              {
                imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
              }
            }
          }
        } // mb_x
      } // mb_y

      // LG : direct residual coding
      if (sum_cnt_nonz <= 5 )
      {
        currMB->cbp     &= 0xfffff0 ;
        currMB->cbp_blk &= 0xff0000 ;
        for (i=0; i < MB_BLOCK_SIZE; i++)
        {
          for (j=0; j < MB_BLOCK_SIZE; j++)
          {
            imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
          }
        }
      }
      break;

    default:
      break;
  } // switch()
}

/*!
 ************************************************************************
 * \brief
 *    Performs DCT, quantization, run/level pre-coding and IDCT
 *    for the chrominance of a B-frame macroblock;
 *    current cbp and cr_cbp are affected
 ************************************************************************
 */
void ChromaCoding_B(int *cr_cbp)
{
  int i, j;
  int uv, ii,jj,ii0,jj0,ii1,jj1,if1,jf1,if0,jf0,f1,f2,f3,f4;
  int pic_block_y, pic_block_x, ref_inx, fw_pred, bw_pred;
  Macroblock *currMB = &img->mb_data[img->current_mb_nr];

  if(input->mv_res)
  {
    f1=16;
    f2=15;
  }
  else
  {
    f1=8;
    f2=7;
  }

  f3=f1*f1;
  f4=f3/2;

  *cr_cbp=0;
  for (uv=0; uv < 2; uv++)
  {
    if (img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
    {
      intrapred_chroma(img->pix_c_x,img->pix_c_y,uv);
    }
    else if(img->imod == B_Forward)
    {
      for (j=0; j < MB_BLOCK_SIZE/2; j++)
      {
        pic_block_y=(img->pix_c_y+j)/2;
        for (i=0; i < MB_BLOCK_SIZE/2; i++)
        {
          pic_block_x=(img->pix_c_x+i)/2;
          ii=(img->pix_c_x+i)*f1+tmp_fwMV[0][pic_block_y][pic_block_x+4];
          jj=(img->pix_c_y+j)*f1+tmp_fwMV[1][pic_block_y][pic_block_x+4];

          ii0= max (0, min (img->width_cr-1, ii/f1));
          jj0= max (0, min (img->height_cr-1, jj/f1));
          ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
          jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));

          if1=(ii & f2);
          jf1=(jj & f2);
          if0=f1-if1;
          jf0=f1-jf1;
          img->mpr[i][j]=(if0*jf0*mcef[img->fw_multframe_no][uv][jj0][ii0]+
                  if1*jf0*mcef[img->fw_multframe_no][uv][jj0][ii1]+
                  if0*jf1*mcef[img->fw_multframe_no][uv][jj1][ii0]+
                  if1*jf1*mcef[img->fw_multframe_no][uv][jj1][ii1]+f4)/f3;

          img->m7[i][j]=imgUV_org[uv][img->pix_c_y+j][img->pix_c_x+i]-img->mpr[i][j];
        }
      }
    }
    else if(img->imod == B_Backward)
    {
      for (j=0; j < MB_BLOCK_SIZE/2; j++)
      {
        pic_block_y=(img->pix_c_y+j)/2;
        for (i=0; i < MB_BLOCK_SIZE/2; i++)
        {
          pic_block_x=(img->pix_c_x+i)/2;

          ii=(img->pix_c_x+i)*f1+tmp_bwMV[0][pic_block_y][pic_block_x+4];
          jj=(img->pix_c_y+j)*f1+tmp_bwMV[1][pic_block_y][pic_block_x+4];

          ii0= max (0, min (img->width_cr-1, ii/f1));
          jj0= max (0, min (img->height_cr-1, jj/f1));
          ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
          jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));

          if1=(ii & f2);
          jf1=(jj & f2);
          if0=f1-if1;
          jf0=f1-jf1;
          img->mpr[i][j]=(if0*jf0*mcef_P[uv][jj0][ii0]+if1*jf0*mcef_P[uv][jj0][ii1]+
                    if0*jf1*mcef_P[uv][jj1][ii0]+if1*jf1*mcef_P[uv][jj1][ii1]+f4)/f3;

          img->m7[i][j]=imgUV_org[uv][img->pix_c_y+j][img->pix_c_x+i]-img->mpr[i][j];
        }
      }
    }
    else if(img->imod == B_Bidirect)
    {
      for (j=0; j < MB_BLOCK_SIZE/2; j++)
      {
        pic_block_y=(img->pix_c_y+j)/2;
        for (i=0; i < MB_BLOCK_SIZE/2; i++)
        {
          pic_block_x=(img->pix_c_x+i)/2;

          ii=(img->pix_c_x+i)*f1+tmp_fwMV[0][pic_block_y][pic_block_x+4];
          jj=(img->pix_c_y+j)*f1+tmp_fwMV[1][pic_block_y][pic_block_x+4];

          ii0= max (0, min (img->width_cr-1, ii/f1));
          jj0= max (0, min (img->height_cr-1, jj/f1));
          ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
          jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));

          if1=(ii & f2);
          jf1=(jj & f2);
          if0=f1-if1;
          jf0=f1-jf1;
          fw_pred=(if0*jf0*mcef[img->fw_multframe_no][uv][jj0][ii0]+
               if1*jf0*mcef[img->fw_multframe_no][uv][jj0][ii1]+
               if0*jf1*mcef[img->fw_multframe_no][uv][jj1][ii0]+
               if1*jf1*mcef[img->fw_multframe_no][uv][jj1][ii1]+f4)/f3;

          ii=(img->pix_c_x+i)*f1+tmp_bwMV[0][pic_block_y][pic_block_x+4];
          jj=(img->pix_c_y+j)*f1+tmp_bwMV[1][pic_block_y][pic_block_x+4];

          ii0= max (0, min (img->width_cr-1, ii/f1));
          jj0= max (0, min (img->height_cr-1, jj/f1));
          ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
          jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));

          if1=(ii & f2);
          jf1=(jj & f2);
          if0=f1-if1;
          jf0=f1-jf1;
          bw_pred=(if0*jf0*mcef_P[uv][jj0][ii0]+if1*jf0*mcef_P[uv][jj0][ii1]+
               if0*jf1*mcef_P[uv][jj1][ii0]+if1*jf1*mcef_P[uv][jj1][ii1]+f4)/f3;

          img->mpr[i][j]=(int)((fw_pred+bw_pred)/2.0+0.5);
          img->m7[i][j]=imgUV_org[uv][img->pix_c_y+j][img->pix_c_x+i]-img->mpr[i][j];
        }
      }
    }
    else // img->imod == B_Direct
    {
      for (j=0; j < MB_BLOCK_SIZE/2; j++)
      {
        pic_block_y=(img->pix_c_y+j)/2;
        for (i=0; i < MB_BLOCK_SIZE/2; i++)
        {
          pic_block_x=(img->pix_c_x+i)/2;

          ii=(img->pix_c_x+i)*f1+dfMV[0][pic_block_y][pic_block_x+4];
          jj=(img->pix_c_y+j)*f1+dfMV[1][pic_block_y][pic_block_x+4];

          ii0= max (0, min (img->width_cr-1, ii/f1));
          jj0= max (0, min (img->height_cr-1, jj/f1));
          ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
          jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));

          if1=(ii & f2);
          jf1=(jj & f2);
          if0=f1-if1;
          jf0=f1-jf1;

          // next P is intra mode
          if(refFrArr[pic_block_y][pic_block_x]==-1)
            ref_inx=(img->number-1)%img->buf_cycle;
          // next P is skip or inter mode
          else
            ref_inx=(img->number-refFrArr[pic_block_y][pic_block_x]-1)%img->buf_cycle;

          fw_pred=(if0*jf0*mcef[ref_inx][uv][jj0][ii0]+
               if1*jf0*mcef[ref_inx][uv][jj0][ii1]+
               if0*jf1*mcef[ref_inx][uv][jj1][ii0]+
               if1*jf1*mcef[ref_inx][uv][jj1][ii1]+f4)/f3;

          ii=(img->pix_c_x+i)*f1+dbMV[0][pic_block_y][pic_block_x+4];

⌨️ 快捷键说明

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