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

📄 loopfilter.cpp

📁 testWindows下的www代理服务器,支持socks4 -WWW proxy in windows, supporting socks4
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  }
}

void DeblockHBs1_Chroma(AVS_BYTE* pStart, AVS_INT Alpha, AVS_INT Beta, AVS_INT C, AVS_INT iStride)
{
  AVS_INT i;
  AVS_BYTE* p = pStart;
  for(i=0; i<4; i++)
  {
    AVS_BYTE p1 = *(p-2*iStride);
    AVS_BYTE p0 = *(p-iStride);
    
    AVS_BYTE q0 = *p;
    AVS_BYTE q1 = *(p+iStride);
    if(abs(p0-q0)<Alpha && abs(p1-p0)<Beta && abs(q1-q0)<Beta)
    {   
      AVS_INT delta = Clip3(-C, C, (((q0-p0)*3+(p1-q1)+4)>>3));
    
      *(p-iStride) = Clip(p0+delta);
      *(p  ) = Clip(q0+delta);
    }
    p++;
  }
}

AVS_INT GetStrengthP(AVS_DWORD dwRefIdxP, AVS_DWORD dwRefIdxQ, MOTIONVECTOR* pMvP, MOTIONVECTOR* pMvQ)
{
  if(dwRefIdxP != dwRefIdxQ ||
    abs(pMvP->x - pMvQ->x) >= 4 ||
    abs(pMvP->y - pMvQ->y) >= 4)
    return 1;
  else
    return 0;
}

AVS_INT GetStrengthB(MOTIONVECTOR* pMvP, MOTIONVECTOR* pMvQ, MOTIONVECTOR* pMvBwP, MOTIONVECTOR* pMvBwQ)
{
  if(abs(pMvP->x - pMvQ->x) >= 4 ||
    abs(pMvP->y - pMvQ->y) >= 4 ||
    abs(pMvBwP->x - pMvBwQ->x) >= 4 ||
    abs(pMvBwP->y - pMvBwQ->y) >= 4)
    return 1;
  else
    return 0;
}
/************************************************************************/
/* 函数功能:滤波亮度BsV00边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsV00_Luma(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)<<4;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;

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

/************************************************************************/
/* 函数功能:滤波亮度BsV10边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsV10_Luma(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)<<4;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;

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

/************************************************************************/
/* 函数功能:滤波亮度BsV01边                                            */
/*         - 位置参见标准文档                                           */
/************************************************************************/
void DeblockMb_BsV01_Luma(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]);
  MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
 
  AVS_INT QPav =  pMbP->dwMbQp;
  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)<<4;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;

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

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

}

/************************************************************************/
/* 函数功能:滤波亮度BsV11边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsV11_Luma(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]);
  MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
    
  AVS_INT QPav = pMbP->dwMbQp;
  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)<<4;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;

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

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

}

/************************************************************************/
/* 函数功能:滤波亮度BsH00边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsH00_Luma(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)<<4;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;

  AVS_BYTE* p = pImgData + imgY*iStride + imgX;
  AVS_INT C = CLIP_TABLE[IndexA];

  if(Bs == 2)
    DeblockHBs2_Luma(p, Alpha, Beta, iStride);
  else if(Bs == 1)
    DeblockHBs1_Luma(p, C, Alpha, Beta, iStride);
}

/************************************************************************/
/* 函数功能:滤波亮度BsH01边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsH01_Luma(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)<<4;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;

  AVS_BYTE* p = pImgData + imgY*iStride + (imgX+8);
  AVS_INT C = CLIP_TABLE[IndexA];

  if(Bs == 2)
    DeblockHBs2_Luma(p, Alpha, Beta, iStride);
  else if(Bs == 1)
    DeblockHBs1_Luma(p, C, Alpha, Beta, iStride);
}

/************************************************************************/
/* 函数功能:滤波亮度BsH00边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsH10_Luma(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]);
  MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
    
  AVS_INT QPav = pMbP->dwMbQp;
  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)<<4;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;

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

  AVS_INT C = CLIP_TABLE[IndexA];

  if(Bs == 2)
    DeblockHBs2_Luma(p, Alpha, Beta, iStride);
  else if(Bs == 1)
    DeblockHBs1_Luma(p, C, Alpha, Beta, iStride);
}

/************************************************************************/
/* 函数功能:滤波亮度BsH11边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsH11_Luma(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]);
  MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
  
  AVS_INT QPav = pMbP->dwMbQp;
  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)<<4;
  AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;

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

  AVS_INT C = CLIP_TABLE[IndexA];

  if(Bs == 2)
    DeblockHBs2_Luma(p, Alpha, Beta, iStride);
  else if(Bs == 1)
    DeblockHBs1_Luma(p, C, Alpha, Beta, iStride);
}


/************************************************************************/
/* 函数功能:滤波色度BsV00边                                            */
/*         - 位置参见标准文档                                           */
/*         - 调用时先判断该边是否在边界处                               */
/************************************************************************/
void DeblockMb_BsV00_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;

⌨️ 快捷键说明

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