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

📄 loopfilter.cpp

📁 testWindows下的www代理服务器,支持socks4 -WWW proxy in windows, supporting socks4
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<3;

  AVS_BYTE* p = pImgData + imgY*iStride + imgX;

  AVS_INT C = CLIP_TABLE[IndexA];
 
  if(Bs == 2)
    DeblockVBs2_Chroma(p, Alpha, Beta, iStride);
  else if(Bs == 1)
    DeblockVBs1_Chroma(p, Alpha, Beta, C, iStride);
}

/************************************************************************/
/* 函数功能:滤波色度BsV10边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsV10_Chroma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
  MBINFO* pMbP = &(pMbInfo[dwMbIndex-1]);
  MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);

  AVS_INT QPav = (pMbP->dwMbQp + pMbQ->dwMbQp + 1)/2;
  AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
  AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
  AVS_INT Alpha = ALPHA_TABLE[IndexA];
  AVS_INT Beta = BETA_TABLE[IndexB];
  
  AVS_INT imgX = (dwMbIndex%dwMbWidth)<<3;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<3;

  AVS_BYTE* p = pImgData + (imgY+4)*iStride + imgX;

  AVS_INT C = CLIP_TABLE[IndexA];
 
  if(Bs == 2)
    DeblockVBs2_Chroma(p, Alpha, Beta, iStride);
  else if(Bs == 1)
    DeblockVBs1_Chroma(p, Alpha, Beta, C, iStride);
}

/************************************************************************/
/* 函数功能:滤波色度BsH00边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsH00_Chroma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
  MBINFO* pMbP = &(pMbInfo[dwMbIndex-dwMbWidth]);
  MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
    
  AVS_INT QPav = (pMbP->dwMbQp + pMbQ->dwMbQp + 1)/2;
  AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
  AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
  AVS_INT Alpha = ALPHA_TABLE[IndexA];
  AVS_INT Beta = BETA_TABLE[IndexB];
  
  AVS_INT imgX = (dwMbIndex%dwMbWidth)<<3;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<3;

  AVS_BYTE* p = pImgData + imgY*iStride + imgX;
  AVS_INT C = CLIP_TABLE[IndexA];
  if(Bs == 2)
    DeblockHBs2_Chroma(p, Alpha, Beta,iStride);
  else if(Bs == 1)
    DeblockHBs1_Chroma(p, Alpha, Beta, C, iStride);
}

/************************************************************************/
/* 函数功能:滤波色度BsH01边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsH01_Chroma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
  
  MBINFO* pMbP = &(pMbInfo[dwMbIndex-dwMbWidth]);
  MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
  
 
  AVS_INT QPav = (pMbInfo[dwMbIndex-dwMbWidth].dwMbQp + pMbInfo[dwMbIndex].dwMbQp + 1)/2;
  AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
  AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
  AVS_INT Alpha = ALPHA_TABLE[IndexA];
  AVS_INT Beta = BETA_TABLE[IndexB];
  
  AVS_INT imgX = (dwMbIndex%dwMbWidth)<<3;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<3;

  AVS_BYTE* p = pImgData + imgY*iStride + (imgX+4);

  AVS_INT C = CLIP_TABLE[IndexA];
  if(Bs == 2)
    DeblockHBs2_Chroma(p, Alpha, Beta, iStride);
  else if(Bs == 1)
    DeblockHBs1_Chroma(p, Alpha, Beta, C, iStride);
}

AVS_INT GetBsH00(MBINFO* pMbP, MBINFO* pMbQ, AVS_INT iImgType)
{
  AVS_INT Bs;
  
  if(pMbP->dwMbType == I_8x8 || pMbQ->dwMbType == I_8x8)
    Bs = 2;
  else 
  {
    if(iImgType == P_IMG )
      Bs = GetStrengthP(pMbP->dwMbReferenceIndex[2], pMbQ->dwMbReferenceIndex[0], &(pMbP->mv[2]), &(pMbQ->mv[0]));
    else   // B frame
      Bs = GetStrengthB(&(pMbP->mv[2]), &(pMbQ->mv[0]), &(pMbP->mvBw[2]), &(pMbQ->mvBw[0]));
  }
  return Bs;
}

AVS_INT GetBsH01(MBINFO* pMbP, MBINFO* pMbQ, AVS_INT iImgType)
{
  int Bs = 0;
  if(pMbP->dwMbType == I_8x8 || pMbQ->dwMbType == I_8x8)
    Bs = 2;
  else 
  {
    if(iImgType == P_IMG )
      Bs = GetStrengthP(pMbP->dwMbReferenceIndex[3], pMbQ->dwMbReferenceIndex[1], &(pMbP->mv[3]), &(pMbQ->mv[1]));
    else   // B frame
      Bs = GetStrengthB(&(pMbP->mv[3]), &(pMbQ->mv[1]), &(pMbP->mvBw[3]), &(pMbQ->mvBw[1]));
  }
  return Bs;
}

AVS_INT GetBsH10(MBINFO* pMbP, MBINFO* pMbQ, AVS_INT iImgType)
{
  AVS_INT Bs;
  if(pMbP->dwMbType == I_8x8)
    Bs = 2;
  else 
  {
    if(iImgType == P_IMG )
      Bs = GetStrengthP(pMbP->dwMbReferenceIndex[0], pMbQ->dwMbReferenceIndex[2], &(pMbP->mv[0]), &(pMbQ->mv[2]));
    else   // B frame
      Bs = GetStrengthB(&(pMbP->mv[0]), &(pMbQ->mv[2]), &(pMbP->mvBw[0]), &(pMbQ->mvBw[2]));
  }
  return Bs;
}

AVS_INT GetBsH11(MBINFO* pMbP, MBINFO* pMbQ, AVS_INT iImgType)
{
  AVS_INT Bs;
  if(pMbP->dwMbType == I_8x8)
    Bs = 2;
  else 
  {
    if(iImgType == P_IMG )
      Bs = GetStrengthP(pMbP->dwMbReferenceIndex[1], pMbQ->dwMbReferenceIndex[3], &(pMbP->mv[1]), &(pMbQ->mv[3]));
    else   // B frame
      Bs = GetStrengthB(&(pMbP->mv[1]), &(pMbQ->mv[3]), &(pMbP->mvBw[1]), &(pMbQ->mvBw[3]));
  }
  return Bs;

}

AVS_INT GetBsV00(MBINFO* pMbP, MBINFO* pMbQ, AVS_INT iImgType)
{
  AVS_INT Bs;

  if(pMbP->dwMbType == I_8x8 || pMbQ->dwMbType == I_8x8)
    Bs = 2;
  else 
  {
    if(iImgType == P_IMG )
      Bs = GetStrengthP(pMbP->dwMbReferenceIndex[1], pMbQ->dwMbReferenceIndex[0], &(pMbP->mv[1]), &(pMbQ->mv[0]));
    else   // B frame
      Bs = GetStrengthB(&(pMbP->mv[1]), &(pMbQ->mv[0]), &(pMbP->mvBw[1]), &(pMbQ->mvBw[0]));
  }
  return Bs;
}

AVS_INT GetBsV01(MBINFO* pMbP, MBINFO* pMbQ, AVS_INT iImgType)
{
  AVS_INT Bs;
  if(pMbP->dwMbType == I_8x8)
    Bs = 2;
  else 
  {
    if(iImgType == P_IMG )
      Bs = GetStrengthP(pMbP->dwMbReferenceIndex[0], pMbQ->dwMbReferenceIndex[1], &(pMbP->mv[0]), &(pMbQ->mv[1]));
    else   // B frame
      Bs = GetStrengthB(&(pMbP->mv[0]), &(pMbP->mv[1]), &(pMbQ->mvBw[0]), &(pMbQ->mvBw[1]));
  }
  return Bs;
}

AVS_INT GetBsV10(MBINFO* pMbP, MBINFO* pMbQ, AVS_INT iImgType)
{
  AVS_INT Bs;

  if(pMbP->dwMbType == I_8x8 || pMbQ->dwMbType == I_8x8)
    Bs = 2;
  else 
  {
    if(iImgType == P_IMG )
      Bs = GetStrengthP(pMbP->dwMbReferenceIndex[3], pMbQ->dwMbReferenceIndex[2], &(pMbP->mv[3]), &(pMbQ->mv[2]));
    else   // B frame
      Bs = GetStrengthB(&(pMbP->mv[1]), &(pMbQ->mv[2]), &(pMbP->mvBw[1]), &(pMbQ->mvBw[2]));
  }
  return Bs;
}

AVS_INT GetBsV11(MBINFO* pMbP, MBINFO* pMbQ, AVS_INT iImgType)
{
  AVS_INT Bs;
  if(pMbP->dwMbType == I_8x8)
    Bs = 2;
  else 
  {
    if(iImgType == P_IMG )
      Bs = GetStrengthP(pMbP->dwMbReferenceIndex[2], pMbQ->dwMbReferenceIndex[3], &(pMbP->mv[2]), &(pMbQ->mv[3]));
    else   // B frame
      Bs = GetStrengthB(&(pMbP->mv[2]), &(pMbQ->mv[3]), &(pMbP->mvBw[2]), &(pMbQ->mvBw[3]));
  }
  return Bs;
}

void DeblockOneMacroBlock(MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, STREAMINFO* pStrmInfo, VIDEODATA* pCurrVD)
{
  AVS_BOOL bUpMbAvailable = FALSE;
  AVS_BOOL bLeftMbAvailable = FALSE;
  AVS_INT iLumaStride = pStrmInfo->SeqInfo.dwWidth;
  AVS_INT iChromaStride = pStrmInfo->SeqInfo.dwWidth/2;
  AVS_DWORD dwImgType = pStrmInfo->ImgInfo.dwImageType;
  AVS_INT iAlphaOffset = pStrmInfo->ImgInfo.iAlphaCOffset;
  AVS_INT iBetaOffset = pStrmInfo->ImgInfo.iBetaOffset;

  if(dwMbIndex/dwMbWidth != 0)
    bUpMbAvailable = TRUE;
  if(dwMbIndex%dwMbWidth != 0)
    bLeftMbAvailable = TRUE;

  if(bLeftMbAvailable)
  {
    AVS_INT Bs00 = GetBsV00(&(pMbInfo[dwMbIndex-1]), &(pMbInfo[dwMbIndex]), dwImgType);
    AVS_INT Bs01 = GetBsV01(&(pMbInfo[dwMbIndex]), &(pMbInfo[dwMbIndex]), dwImgType);
    AVS_INT Bs10 = GetBsV10(&(pMbInfo[dwMbIndex-1]), &(pMbInfo[dwMbIndex]), dwImgType);
    AVS_INT Bs11 = GetBsV11(&(pMbInfo[dwMbIndex]), &(pMbInfo[dwMbIndex]), dwImgType);

    DeblockMb_BsV00_Luma(Bs00, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);
    DeblockMb_BsV01_Luma(Bs01, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);
    DeblockMb_BsV10_Luma(Bs10, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);
    DeblockMb_BsV11_Luma(Bs11, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);

    DeblockMb_BsV00_Chroma(Bs00, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->u, iChromaStride);
    DeblockMb_BsV10_Chroma(Bs01, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->u, iChromaStride);

    DeblockMb_BsV00_Chroma(Bs10, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->v, iChromaStride);
    DeblockMb_BsV10_Chroma(Bs11, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->v, iChromaStride);
  }
  else
  {
    AVS_INT Bs01 = GetBsV01(&(pMbInfo[dwMbIndex]), &(pMbInfo[dwMbIndex]), dwImgType);
    AVS_INT Bs11 = GetBsV11(&(pMbInfo[dwMbIndex]), &(pMbInfo[dwMbIndex]), dwImgType);

    DeblockMb_BsV01_Luma(Bs01, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);
    DeblockMb_BsV11_Luma(Bs11, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);    
  }
  if(bUpMbAvailable)
  {
    AVS_INT Bs00 = GetBsH00(&(pMbInfo[dwMbIndex-dwMbWidth]), &(pMbInfo[dwMbIndex]), dwImgType);
    AVS_INT Bs01 = GetBsH01(&(pMbInfo[dwMbIndex-dwMbWidth]), &(pMbInfo[dwMbIndex]), dwImgType);
    AVS_INT Bs10 = GetBsH10(&(pMbInfo[dwMbIndex]), &(pMbInfo[dwMbIndex]), dwImgType);
    AVS_INT Bs11 = GetBsH11(&(pMbInfo[dwMbIndex]), &(pMbInfo[dwMbIndex]), dwImgType);
    DeblockMb_BsH00_Luma(Bs00, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);
    DeblockMb_BsH01_Luma(Bs01, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);
    DeblockMb_BsH10_Luma(Bs10, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);
    DeblockMb_BsH11_Luma(Bs11, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);

    DeblockMb_BsH00_Chroma(Bs00, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->u, iChromaStride);
    DeblockMb_BsH01_Chroma(Bs01, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->u, iChromaStride);

    DeblockMb_BsH00_Chroma(Bs00, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->v, iChromaStride);
    DeblockMb_BsH01_Chroma(Bs01, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->v, iChromaStride);

  }
  else
  {
    AVS_INT Bs10 = GetBsH10(&(pMbInfo[dwMbIndex]), &(pMbInfo[dwMbIndex]), dwImgType);
    AVS_INT Bs11 = GetBsH11(&(pMbInfo[dwMbIndex]), &(pMbInfo[dwMbIndex]), dwImgType);

    DeblockMb_BsH10_Luma(Bs10, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);
    DeblockMb_BsH11_Luma(Bs11, pMbInfo, dwMbIndex, dwMbWidth, dwImgType, iAlphaOffset, iBetaOffset, pCurrVD->y, iLumaStride);    
  }


}

⌨️ 快捷键说明

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