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

📄 macroblock.cpp

📁 AVS是中国自己推出的视频图像音频编解码标准。包中是AVS 源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  AVS_DWORD imgHeight = pStrmInfo->SeqInfo.dwHeight;
  
  if(dwRefNum == 4)
    imgHeight >>= 1;
  AVS_INT uvWidth = imgWidth>>1;
  
  AVS_DWORD dwImgType = pStrmInfo->ImgInfo.dwImageType;

  AVS_DWORD iImgWidth = imgWidth;
  AVS_DWORD iUVWidth = uvWidth; 
  AVS_BYTE* pbTopLeftY = pCurrFrame->y;
  AVS_BYTE* pbTopLeftU = pCurrFrame->u;
  AVS_BYTE* pbTopLeftV = pCurrFrame->v;
  AVS_BYTE  Pred[4][8][8];
  AVS_BYTE* pPred = &(Pred[0][0][0]);
  memset(pPred, 0, 4*64*sizeof(AVS_BYTE));
  
  AVS_INT i, j;

  dwCurrDistanceIndex = pCurrFrame->dwDistanceIndex;
  
  InitOneMacroBlock(pMbInfo, dwMbIndex, dwRefNum);
  
  if(pMbInfo[dwMbIndex].dwMbType == I_8x8)  //帧内预测模式
  {
    //亮度预测,变换,重构
    for(block=0; block<4; block++)
    {      
      AVS_INT imgX = MbX*16+(block%2)*8;
      AVS_INT imgY = MbY*16+(block/2)*8;
      pMbInfo[dwMbIndex].predDir[block] = -1;

      IntraPredLuma(pMbInfo, pbTopLeftY, dwMbIndex, imgWidth, imgHeight, block, pPred+block*64, imgX, imgY);
      if(pMbInfo[dwMbIndex].dwCbp & (1<<block))
      {
        inv_transform_B8(pLumaResidual+block*64);
      }

      ReconB8((pbTopLeftY+imgY*iImgWidth+imgX), iImgWidth, pPred+block*64, pLumaResidual+block*64);

      if(dwImgType!=B_IMG)
      {
          pBwRefInfo[dwMbIndex].mvRef[block].x = pBwRefInfo[dwMbIndex].mvRef[block].y = 0;
          pBwRefInfo[dwMbIndex].iBlockDistanceRef[block] = -1;
          pBwRefInfo[dwMbIndex].iDistanceIndexRef[block] = dwCurrDistanceIndex;
      }
    }
    
 
    //色度预测,变换,重构
    AVS_INT uvX = MbX*8;
    AVS_INT uvY = MbY*8;
    
    IntraPredChroma(pMbInfo, pbTopLeftU, dwMbIndex, MbWidth, MbHeight, pPred, uvX, uvY);
    IntraPredChroma(pMbInfo, pbTopLeftV, dwMbIndex, MbWidth, MbHeight, pPred+64, uvX, uvY);
    if(pMbInfo[dwMbIndex].dwCbp & 0x10)
    {
      inv_transform_B8(pChromaResidual);
      ReconB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred, pChromaResidual);
    }
    else
    {
      CopyB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred);
    }
    
    if(pMbInfo[dwMbIndex].dwCbp & 0x20)
    {
      inv_transform_B8(pChromaResidual+64);
      ReconB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64, pChromaResidual+64);
    }
    else
    {
      CopyB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64);
    }
        
    if(dwImgType!=B_IMG)
    {
        pBwRefInfo[dwMbIndex].dwMbType = I_8x8;
    }
  }
  else
  {
    if(pMbInfo[dwMbIndex].dwMbType == P_Skip  ||
       pMbInfo[dwMbIndex].dwMbType == P_16x16 ||
       pMbInfo[dwMbIndex].dwMbType == P_16x8  ||
       pMbInfo[dwMbIndex].dwMbType == P_8x16  ||
       pMbInfo[dwMbIndex].dwMbType == P_8x8 )
    {
      InterPredLumaP(pMbInfo, dwMbIndex, ppRefFrame, MbWidth, MbHeight, dwCurrDistanceIndex, pBwRefInfo, pPred);

      for(block=0; block<4; block++)
      {       
        AVS_INT imgX = MbX*16+(block%2)*8;
        AVS_INT imgY = MbY*16+(block/2)*8;
        if(pMbInfo[dwMbIndex].dwCbp & (1<<block))
        {
           inv_transform_B8(pLumaResidual+block*64);
           ReconB8(pbTopLeftY+imgY*iImgWidth+imgX, iImgWidth, pPred+block*64, pLumaResidual+block*64);
        }
        else
        {
          CopyB8(pbTopLeftY+imgY*iImgWidth+imgX,iImgWidth, pPred+block*64);
        } 
      }


      InterPredChormaP(pMbInfo, dwMbIndex, ppRefFrame, MbWidth, MbHeight, pPred);

      AVS_INT uvX = MbX*8;
      AVS_INT uvY = MbY*8;

      if(pMbInfo[dwMbIndex].dwCbp & 0x10)
      {
        inv_transform_B8(pChromaResidual);
        ReconB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred, pChromaResidual);
      }
      else
      {
        CopyB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred);
      }
      
      if(pMbInfo[dwMbIndex].dwCbp & 0x20)
      {
        inv_transform_B8(pChromaResidual+64);
        ReconB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64,pChromaResidual+64);
      }
      else
      {
        CopyB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64);
      }      
    } 
    else    // B Frame
    {

      InterPredLumaB(pMbInfo, dwMbIndex, ppRefFrame, dwRefNum, MbWidth, MbHeight, dwCurrDistanceIndex, pStrmInfo->ImgInfo.bPictureStructure, pBwRefInfo, pPred);

      for(block=0; block<4; block++)
      {
        AVS_INT imgX = MbX*16+(block%2)*8;
        AVS_INT imgY = MbY*16+(block/2)*8;
       
        if(pMbInfo[dwMbIndex].dwCbp & (1<<block))
        {
          inv_transform_B8(pLumaResidual+block*64);
          ReconB8(pbTopLeftY+imgY*iImgWidth+imgX, iImgWidth, pPred+block*64, pLumaResidual+block*64);
        }
        else
        {
          CopyB8(pbTopLeftY+imgY*iImgWidth+imgX,iImgWidth, pPred+block*64);
        }        
      }      

      InterPredChormaB(pMbInfo, dwMbIndex, ppRefFrame, dwRefNum, MbWidth, MbHeight, pBwRefInfo, pPred);
      AVS_INT uvX = MbX*8;
      AVS_INT uvY = MbY*8;

      if(pMbInfo[dwMbIndex].dwCbp & 0x10)
      {
        inv_transform_B8(pChromaResidual);
        ReconB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred, pChromaResidual);
      }
      else
      {
        CopyB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred);
      }
      
      if(pMbInfo[dwMbIndex].dwCbp & 0x20)
      {
        inv_transform_B8(pChromaResidual+64);
        ReconB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64, pChromaResidual+64);
      }
      else
      {
        CopyB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64);
      }
    }
  }


  return AVS_NOERROR;
}

void InitOneMacroBlock(MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwRefNum)
{
  AVS_INT block, i;
  AVS_INT tmp;
  switch(pMbInfo[dwMbIndex].dwMbType) {
  case I_8x8:
  	break;
  // P MB-----------------------------------
  case P_Skip:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
      pMbInfo[dwMbIndex].dwMbReferenceIndex[block] = pMbInfo[dwMbIndex].dwMbReferenceIndex[0];
    }
    break;
  case P_16x16:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
      pMbInfo[dwMbIndex].dwMbReferenceIndex[block] = pMbInfo[dwMbIndex].dwMbReferenceIndex[0];
    }
    break;
  case P_16x8:
    for(block=0; block<4; block++)
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
    pMbInfo[dwMbIndex].dwMbReferenceIndex[3] = pMbInfo[dwMbIndex].dwMbReferenceIndex[1];
    pMbInfo[dwMbIndex].dwMbReferenceIndex[1] = pMbInfo[dwMbIndex].dwMbReferenceIndex[0];
    pMbInfo[dwMbIndex].dwMbReferenceIndex[2] = pMbInfo[dwMbIndex].dwMbReferenceIndex[3];    
    break;
  case P_8x16:
    for(block=0; block<4; block++)
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
    pMbInfo[dwMbIndex].dwMbReferenceIndex[2] = pMbInfo[dwMbIndex].dwMbReferenceIndex[0];
    pMbInfo[dwMbIndex].dwMbReferenceIndex[3] = pMbInfo[dwMbIndex].dwMbReferenceIndex[1];
    break;
  case P_8x8:
    for(block=0; block<4; block++)
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
    break;
  // B MB----------------------------------------------
  case B_Fwd_16x16:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
    }
    break;
  case B_Fwd_Fwd_16x8:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
    }
    break;
  case B_Fwd_Fwd_8x16:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
    }
    break;
  case B_Skip:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM;
    }
    break;
  case B_Direct_16x16:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM;
    }
    break;
  case B_Sym_16x16:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM;
    }
    break;
  case B_Sym_Sym_16x8:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM;
    }
    break;
  case B_Sym_Sym_8x16:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM;
    }
    break;
  case B_Bck_16x16:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD;
    }
    break;
  case B_Bck_Bck_16x8:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD;
    }
    break;
  case B_Bck_Bck_8x16:
    for(block=0; block<4; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD;
    }
    break;
  case B_Fwd_Bck_16x8:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
      pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRBWD;
    }
    break;
  case B_Fwd_Bck_8x16:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRFWD;
      pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRBWD;
    }
    break;
  case B_Bck_Fwd_16x8:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD;
      pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRFWD;
    }
    break;
  case B_Bck_Fwd_8x16:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRBWD;
      pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRFWD;
    }
    break;
  case B_Fwd_Sym_16x8:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
      pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRSYM;
    }
    break;
  case B_Fwd_Sym_8x16:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRFWD;
      pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRSYM;
    }
    break;
  case B_Bck_Sym_16x8:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD;
      pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRSYM;
    }
    break;
  case B_Bck_Sym_8x16:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRBWD;
      pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRSYM;
    }
    break;
  case B_Sym_Fwd_16x8:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM;
      pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRFWD;
    }
    break;
  case B_Sym_Fwd_8x16:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRSYM;
      pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRFWD;
   }
    break;
  case B_Sym_Bck_16x8:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM;
      pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRBWD;
    }
    break;
  case B_Sym_Bck_8x16:
    for(block=0; block<2; block++)
    {
      pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRSYM;
      pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRBWD;
    }
    break;
  case B_8x8:
    for(block=0; block<4; block++)
    {
      switch(pMbInfo[dwMbIndex].dwMbPartType[block]) {
      case SB_Direct_8x8:
        pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM;
     	break;
      case SB_Fwd_8x8:
        pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD;
      	break;
      case SB_Bck_8x8:
        pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD;
        break;
      case SB_Sym_8x8:
        pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM;
        break;
      }
    }
    break;

  default:
    break;
  }
}


   
    
    
 
 
    

⌨️ 快捷键说明

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