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

📄 b_frame.c

📁 本源码是H.26L标准的Visual C++源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        if (intrapred(img,ioff,joff,i4,j4)==SEARCH_SYNC)  // make 4x4 prediction block mpr from given prediction img->mb_mode
        return SEARCH_SYNC;                   // bit error
      }

      // //////////////////////////////////
      // Forward MC using img->fw_MV
      // //////////////////////////////////
      else if(img->imod==B_Forward)
      {
        vec1_x = i4*4*mv_mul + img->fw_mv[i4+BLOCK_SIZE][j4][0];
        vec1_y = j4*4*mv_mul + img->fw_mv[i4+BLOCK_SIZE][j4][1];

        get_block(ref_frame_fw,vec1_x,vec1_y,img,tmp_block);

        for(ii=0;ii<BLOCK_SIZE;ii++)
          for(jj=0;jj<BLOCK_SIZE;jj++)
            img->mpr[ii+ioff][jj+joff] = tmp_block[ii][jj];
      }

      // //////////////////////////////////
      // Backward MC using img->bw_MV
      // //////////////////////////////////
      else if(img->imod==B_Backward)
      {
        vec1_x = i4*4*mv_mul + img->bw_mv[i4+BLOCK_SIZE][j4][0];
        vec1_y = j4*4*mv_mul + img->bw_mv[i4+BLOCK_SIZE][j4][1];

        get_block(ref_frame_bw,vec1_x,vec1_y,img,tmp_blockbw);

        for(ii=0;ii<BLOCK_SIZE;ii++)
          for(jj=0;jj<BLOCK_SIZE;jj++)
            img->mpr[ii+ioff][jj+joff] = tmp_blockbw[ii][jj];
      }

      // //////////////////////////////////
      // Bidirect MC using img->fw_MV, bw_MV
      // //////////////////////////////////
      else if(img->imod==B_Bidirect)
      {
        vec2_x=i4*4*mv_mul;
        vec1_x=vec2_x+img->fw_mv[i4+BLOCK_SIZE][j4][0];
        vec1_xx=vec2_x+img->bw_mv[i4+BLOCK_SIZE][j4][0];
        vec2_y=j4*4*mv_mul;
        vec1_y=vec2_y+img->fw_mv[i4+BLOCK_SIZE][j4][1];
        vec1_yy=vec2_y+img->bw_mv[i4+BLOCK_SIZE][j4][1];

        get_block(ref_frame_fw,vec1_x,vec1_y,img,tmp_block);
        get_block(ref_frame_bw,vec1_xx,vec1_yy,img,tmp_blockbw);

        for(ii=0;ii<BLOCK_SIZE;ii++)
          for(jj=0;jj<BLOCK_SIZE;jj++)
            img->mpr[ii+ioff][jj+joff] = (tmp_block[ii][jj]+tmp_blockbw[ii][jj]+1)/2;
      }

      // //////////////////////////////////
      // Direct MC using img->mv
      // //////////////////////////////////
      else if(img->imod==B_Direct)
      {
        // next P is intra mode
        if(refFrArr[j4][i4]==-1)
        {
          for(hv=0; hv<2; hv++)
          {
            img->dfMV[i4+BLOCK_SIZE][j4][hv]=img->dbMV[i4+BLOCK_SIZE][j4][hv]=0;
          }
          ref_frame = 1;
        }
        // next P is skip or inter mode
        else
        {
#ifdef _ADAPT_LAST_GROUP_
          refP_tr = last_P_no[refFrArr[j4][i4]];
#else
          refP_tr = nextP_tr-((refFrArr[j4][i4]+1)*P_interval);
#endif
          TRb = img->tr-refP_tr;
          TRp = nextP_tr-refP_tr;

          img->dfMV[i4+BLOCK_SIZE][j4][0]=TRb*img->mv[i4+BLOCK_SIZE][j4][0]/TRp;
          img->dfMV[i4+BLOCK_SIZE][j4][1]=TRb*img->mv[i4+BLOCK_SIZE][j4][1]/TRp;
          img->dbMV[i4+BLOCK_SIZE][j4][0]=(TRb-TRp)*img->mv[i4+BLOCK_SIZE][j4][0]/TRp;
          img->dbMV[i4+BLOCK_SIZE][j4][1]=(TRb-TRp)*img->mv[i4+BLOCK_SIZE][j4][1]/TRp;
          ref_frame=1 + refFrArr[j4][i4];
        }

        vec2_x=i4*4*mv_mul;
        vec1_x=vec2_x+img->dfMV[i4+BLOCK_SIZE][j4][0];
        vec1_xx=vec2_x+img->dbMV[i4+BLOCK_SIZE][j4][0];
        vec2_y=j4*4*mv_mul;
        vec1_y=vec2_y+img->dfMV[i4+BLOCK_SIZE][j4][1];
        vec1_yy=vec2_y+img->dbMV[i4+BLOCK_SIZE][j4][1];

        get_block(ref_frame,vec1_x,vec1_y,img,tmp_block);
        get_block(ref_frame_bw,vec1_xx,vec1_yy,img,tmp_blockbw);

        for(ii=0;ii<BLOCK_SIZE;ii++)
          for(jj=0;jj<BLOCK_SIZE;jj++)
            img->mpr[ii+ioff][jj+joff] = (tmp_block[ii][jj]+tmp_blockbw[ii][jj]+1)/2;
      }

      itrans(img,ioff,joff,i,j);      // use DCT transform and make 4x4 block m7 from prediction block mpr

      for(ii=0;ii<BLOCK_SIZE;ii++)
      {
        for(jj=0;jj<BLOCK_SIZE;jj++)
        {
          imgY[j4*BLOCK_SIZE+jj][i4*BLOCK_SIZE+ii]=img->m7[ii][jj]; // contruct picture from 4x4 blocks
        }
      }
    }
  }




#if POS
  imgY[img->block_y*BLOCK_SIZE][img->block_x*BLOCK_SIZE]= color;
#endif

  /**********************************
   *    chroma                      *
   *********************************/
  for(uv=0;uv<2;uv++)
  {
    if (img->imod==INTRA_MB_OLD || img->imod==INTRA_MB_NEW)// intra mode
    {
      js0=0;
      js1=0;
      js2=0;
      js3=0;
      for(i=0;i<4;i++)
      {
        if(mb_available_up)
        {
          js0=js0+imgUV[uv][img->pix_c_y-1][img->pix_c_x+i];
          js1=js1+imgUV[uv][img->pix_c_y-1][img->pix_c_x+i+4];
        }
        if(mb_available_left)
        {
          js2=js2+imgUV[uv][img->pix_c_y+i][img->pix_c_x-1];
          js3=js3+imgUV[uv][img->pix_c_y+i+4][img->pix_c_x-1];
        }
      }
      if(mb_available_up && mb_available_left)
      {
        js[0][0]=(js0+js2+4)/8;
        js[1][0]=(js1+2)/4;
        js[0][1]=(js3+2)/4;
        js[1][1]=(js1+js3+4)/8;
      }
      if(mb_available_up && !mb_available_left)
      {
        js[0][0]=(js0+2)/4;
        js[1][0]=(js1+2)/4;
        js[0][1]=(js0+2)/4;
        js[1][1]=(js1+2)/4;
      }
      if(mb_available_left && !mb_available_up)
      {
        js[0][0]=(js2+2)/4;
        js[1][0]=(js2+2)/4;
        js[0][1]=(js3+2)/4;
        js[1][1]=(js3+2)/4;
      }
      if(!mb_available_up && !mb_available_left)
      {
        js[0][0]=128;
        js[1][0]=128;
        js[0][1]=128;
        js[1][1]=128;
      }
    }

    for (j=4;j<6;j++)
    {
      joff=(j-4)*4;
      j4=img->pix_c_y+joff;
      for(i=0;i<2;i++)
      {
        ioff=i*4;
        i4=img->pix_c_x+ioff;
        // make pred
        if(img->imod==INTRA_MB_OLD|| img->imod==INTRA_MB_NEW)// intra
        {
          for(ii=0;ii<4;ii++)
            for(jj=0;jj<4;jj++)
            {
              img->mpr[ii+ioff][jj+joff]=js[i][j-4];
            }
        }
        // //////////////////////////////////
        // Forward Reconstruction
        // //////////////////////////////////
        else if(img->imod==B_Forward)
        {
          for(jj=0;jj<4;jj++)
          {
            jf=(j4+jj)/2;
            for(ii=0;ii<4;ii++)
            {
              if1=(i4+ii)/2;
              i1=(img->pix_c_x+ii+ioff)*f1+img->fw_mv[if1+4][jf][0];
              j1=(img->pix_c_y+jj+joff)*f1+img->fw_mv[if1+4][jf][1];

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

              if1=(i1 & f2);
              jf1=(j1 & f2);
              if0=f1-if1;
              jf0=f1-jf1;
              img->mpr[ii+ioff][jj+joff]=(if0*jf0*mcef[ref_frame_fw][uv][jj0][ii0]+
                                          if1*jf0*mcef[ref_frame_fw][uv][jj0][ii1]+
                                          if0*jf1*mcef[ref_frame_fw][uv][jj1][ii0]+
                                          if1*jf1*mcef[ref_frame_fw][uv][jj1][ii1]+f4)/f3;
            }
          }
        }
        // //////////////////////////////////
        // Backward Reconstruction
        // //////////////////////////////////
        else if(img->imod==B_Backward)
        {
          for(jj=0;jj<4;jj++)
          {
            jf=(j4+jj)/2;
            for(ii=0;ii<4;ii++)
            {
              if1=(i4+ii)/2;
              i1=(img->pix_c_x+ii+ioff)*f1+img->bw_mv[if1+4][jf][0];
              j1=(img->pix_c_y+jj+joff)*f1+img->bw_mv[if1+4][jf][1];

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

              if1=(i1 & f2);
              jf1=(j1 & f2);
              if0=f1-if1;
              jf0=f1-jf1;

              img->mpr[ii+ioff][jj+joff]=(if0*jf0*mcef[ref_frame_bw][uv][jj0][ii0]+
                                          if1*jf0*mcef[ref_frame_bw][uv][jj0][ii1]+
                                          if0*jf1*mcef[ref_frame_bw][uv][jj1][ii0]+
                                          if1*jf1*mcef[ref_frame_bw][uv][jj1][ii1]+f4)/f3;
            }
          }
        }
        // //////////////////////////////////
        // Bidirect Reconstruction
        // //////////////////////////////////
        else if(img->imod==B_Bidirect)
        {
          for(jj=0;jj<4;jj++)
          {
            jf=(j4+jj)/2;
            for(ii=0;ii<4;ii++)
            {
              ifx=(i4+ii)/2;
              i1=(img->pix_c_x+ii+ioff)*f1+img->fw_mv[ifx+4][jf][0];
              j1=(img->pix_c_y+jj+joff)*f1+img->fw_mv[ifx+4][jf][1];

              ii0=max (0, min (i1/f1, img->width_cr-1));
              jj0=max (0, min (j1/f1, img->height_cr-1));
              ii1=max (0, min ((i1+f2)/f1, img->width_cr-1));
              jj1=max (0, min ((j1+f2)/f1, img->height_cr-1));
              if1=(i1 & f2);
              jf1=(j1 & f2);
              if0=f1-if1;
              jf0=f1-jf1;

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

              i1=(img->pix_c_x+ii+ioff)*f1+img->bw_mv[ifx+4][jf][0];
              j1=(img->pix_c_y+jj+joff)*f1+img->bw_mv[ifx+4][jf][1];

              ii0=max (0, min (i1/f1, img->width_cr-1));
              jj0=max (0, min (j1/f1, img->height_cr-1));
              ii1=max (0, min ((i1+f2)/f1, img->width_cr-1));
              jj1=max (0, min ((j1+f2)/f1, img->height_cr-1));
              if1=(i1 & f2);
              jf1=(j1 & f2);
              if0=f1-if1;
              jf0=f1-jf1;
              bw_pred=(if0*jf0*mcef[ref_frame_bw][uv][jj0][ii0]+
                       if1*jf0*mcef[ref_frame_bw][uv][jj0][ii1]+
                       if0*jf1*mcef[ref_frame_bw][uv][jj1][ii0]+
                       if1*jf1*mcef[ref_frame_bw][uv][jj1][ii1]+f4)/f3;

              img->mpr[ii+ioff][jj+joff]=(int)((fw_pred+bw_pred)/2.+.5);
            }
          }
        }
        // //////////////////////////////////
        // Direct Reconstruction
        // //////////////////////////////////
        else if(img->imod==B_Direct)
        {
          for(jj=0;jj<4;jj++)
          {
            jf=(j4+jj)/2;
            for(ii=0;ii<4;ii++)
            {
              ifx=(i4+ii)/2;

              i1=(img->pix_c_x+ii+ioff)*f1+img->dfMV[ifx+4][jf][0];
              j1=(img->pix_c_y+jj+joff)*f1+img->dfMV[ifx+4][jf][1];

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

              if1=(i1 & f2);
              jf1=(j1 & f2);
              if0=f1-if1;
              jf0=f1-jf1;

              if(refFrArr[jf][ifx]==-1)
                ref_frame=1;
              else
                ref_frame=1 + refFrArr[jf][ifx];

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


              i1=(img->pix_c_x+ii+ioff)*f1+img->dbMV[ifx+4][jf][0];
              j1=(img->pix_c_y+jj+joff)*f1+img->dbMV[ifx+4][jf][1];

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

              if1=(i1 & f2);
              jf1=(j1 & f2);
              if0=f1-if1;
              jf0=f1-jf1;

              bw_pred=(if0*jf0*mcef[ref_frame_bw][uv][jj0][ii0]+
                       if1*jf0*mcef[ref_frame_bw][uv][jj0][ii1]+
                       if0*jf1*mcef[ref_frame_bw][uv][jj1][ii0]+
                       if1*jf1*mcef[ref_frame_bw][uv][jj1][ii1]+f4)/f3;
              // LG : direct residual coding
              img->mpr[ii+ioff][jj+joff]=(int)((fw_pred+bw_pred)/2.+.5);
            }
          }
        }

        itrans(img,ioff,joff,2*uv+i,j);
        for(ii=0;ii<4;ii++)
          for(jj=0;jj<4;jj++)
          {
            imgUV[uv][j4+jj][i4+ii]=img->m7[ii][jj];
          }
      } // for(i=0;i<2;i++)
    } // for (j=4;j<6;j++)
  } // for(uv=0;uv<2;uv++)


#if POS
  imgUV[0][img->pix_c_y][img->pix_c_x]= color;
  imgUV[1][img->pix_c_y][img->pix_c_x]= color;
#endif

  return DECODING_OK;
}

⌨️ 快捷键说明

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