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

📄 block.cpp

📁 AVS是中国自己推出的视频图像音频编解码标准。包中是AVS 源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        int jpie = -aapie + 5*bpie + 5*spie - ddpie;
        pPred[i*8+j] = Clip((jpie+Hpiepie+64)>>7);
      }
    }
  }
  else if(dy==3 && dx==2) //q
  {
    for(i=0; i<8; i++)
    {
      for(j=0; j<8; j++)
      {
        int aapie = 
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j  ))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
        int bpie =  
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i  ))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i  ))*iImgWidth + max(0, min(iImgWidth-1, refX+j  ))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i  ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i  ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));       
        int spie = 
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j  ))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
        int ddpie = 
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j  ))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
        int xxpie = 
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j  ))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
        int jpie = -aapie + 5*bpie + 5*spie - ddpie;
        int jxxpie = -bpie + 5*spie + 5*ddpie - xxpie;     
        int qpie = bpie*8 + 7*jpie + 7*spie*8 + jxxpie;
        pPred[i*8+j] = Clip((qpie + 512)>>10);
      }
    }
  }
  else if(dx==3 && dy==3) //r
  {
    for(i=0; i<8; i++)
    {
      for(j=0; j<8; j++)
      {
        int Ipiepie = *(pbRefY + max(0,min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))) * 64;  
        int aapie = 
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j  ))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
        int bpie =  
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i  ))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i  ))*iImgWidth + max(0, min(iImgWidth-1, refX+j  ))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i  ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i  ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
        int spie = 
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j  ))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
        int ddpie = 
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j  ))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
        int xxpie = 
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j  ))))
              + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))))
              -    (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2))));
        int jpie = -aapie + 5*bpie + 5*spie - ddpie;
        pPred[i*8+j] = Clip((jpie+Ipiepie+64)>>7);
      }
    }
  } 
}

/************************************************************************/
/*  函数功能:16x16色度块插值预测                                       */
/************************************************************************/
void GetChromaBlock16x16(const AVS_BYTE* pbRefUV, AVS_INT iUVx, AVS_INT iUVy, AVS_INT iUVWidth, AVS_INT iUVHeight, MOTIONVECTOR* pMv, AVS_BYTE* pPred)
{
  AVS_INT dx = (iUVx*8 + pMv->x)&7;
  AVS_INT dy = (iUVy*8 + pMv->y)&7;

  AVS_INT refX = (iUVx*8 + pMv->x - dx)/8;
  AVS_INT refY = (iUVy*8 + pMv->y - dy)/8;

  AVS_INT DX = 8-dx;
  AVS_INT DY = 8-dy;
    
  AVS_INT DXDY = DX*DY;
  AVS_INT dxDY = dx*DY;
  AVS_INT DXdy = DX*dy;
  AVS_INT dxdy = dx*dy;

  AVS_INT i,j;

  for(i=0; i<8; i++)
  {
    for(j=0; j<8; j++)
    {
      pPred[i*8+j] = Clip((DXDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))]
        + dxDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] 
        + DXdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))]
        + dxdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + 32)>>6);
    }
 }
}

/************************************************************************/
/*  函数功能:16x8色度块预测                                            */
/************************************************************************/
void GetChromaBlock16x8(const AVS_BYTE* pbRefUV, AVS_INT iUVx, AVS_INT iUVy, AVS_INT iUVWidth, AVS_INT iUVHeight, MOTIONVECTOR* pMv, AVS_BYTE* pPred)
{
  AVS_INT dx = (iUVx*8 + pMv->x)&7;
  AVS_INT dy = (iUVy*8 + pMv->y)&7;

  AVS_INT refX = (iUVx*8 + pMv->x - dx)/8;
  AVS_INT refY = (iUVy*8 + pMv->y - dy)/8;
 
  AVS_INT DX = 8-dx;
  AVS_INT DY = 8-dy;
  
  AVS_INT DXDY = DX*DY;
  AVS_INT dxDY = dx*DY;
  AVS_INT DXdy = DX*dy;
  AVS_INT dxdy = dx*dy;

  AVS_INT i,j;

  for(i=0; i<4; i++)
  {
    for(j=0; j<8; j++)
    {
      pPred[i*8+j] = Clip((DXDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))]
        + dxDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] 
        + DXdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))]
        + dxdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + 32)>>6);
    }
 }
}

/************************************************************************/
/*  函数功能:8x16色度块预测                                            */
/************************************************************************/
void GetChromaBlock8x16(const AVS_BYTE* pbRefUV, AVS_INT iUVx, AVS_INT iUVy, AVS_INT iUVWidth, AVS_INT iUVHeight, MOTIONVECTOR* pMv, AVS_BYTE* pPred)
{
  AVS_INT dx = (iUVx*8 + pMv->x)&7;
  AVS_INT dy = (iUVy*8 + pMv->y)&7;

  AVS_INT refX = (iUVx*8 + pMv->x - dx)/8;
  AVS_INT refY = (iUVy*8 + pMv->y - dy)/8;
  
  AVS_INT DX = 8-dx;
  AVS_INT DY = 8-dy;

  AVS_INT DXDY = DX*DY;
  AVS_INT dxDY = dx*DY;
  AVS_INT DXdy = DX*dy;
  AVS_INT dxdy = dx*dy;

  AVS_INT i,j;

  for(i=0; i<8; i++)
  {
    for(j=0; j<4; j++)
    {
      pPred[i*8+j] = Clip((DXDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))]
        + dxDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] 
        + DXdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))]
        + dxdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + 32)>>6);
    }
 }
}

/************************************************************************/
/*  函数功能:8x8色度块预测                                             */
/************************************************************************/
void GetChromaBlock8x8(const AVS_BYTE* pbRefUV, AVS_INT iUVx, AVS_INT iUVy, AVS_INT iUVWidth, AVS_INT iUVHeight, MOTIONVECTOR* pMv, AVS_BYTE* pPred)
{
  AVS_INT dx = (iUVx*8 + pMv->x)&7;
  AVS_INT dy = (iUVy*8 + pMv->y)&7;

  AVS_INT refX = (iUVx*8 + pMv->x - dx)/8;
  AVS_INT refY = (iUVy*8 + pMv->y - dy)/8;
  
  AVS_INT DX = 8-dx;
  AVS_INT DY = 8-dy;

  AVS_INT DXDY = DX*DY;
  AVS_INT dxDY = dx*DY;
  AVS_INT DXdy = DX*dy;
  AVS_INT dxdy = dx*dy;

  AVS_INT i,j;

  for(i=0; i<4; i++)
  {
    for(j=0; j<4; j++)
    {
      pPred[i*8+j] = Clip((DXDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))]
        + dxDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] 
        + DXdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))]
        + dxdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + 32)>>6);
    }
 }
}

/************************************************************************/
/* 函数功能: 重构8x8块                                                 */
/*          -重构图像值等于预测值加上残差系数                          */
/************************************************************************/
void ReconB8(AVS_BYTE* pDst, AVS_INT iImgWidth, AVS_BYTE* pPred, AVS_SHORT* pCoef)
{
  AVS_BYTE* pDst1 = pDst;
  AVS_BYTE* pSrc0 = pPred;
  AVS_SHORT*  pSrc1 = pCoef;
  AVS_INT i,j;

  for(i=0; i<8; i++)
  {
    for(j=0; j<8; j++)
    {
      int val = (*pSrc0++) + (*pSrc1++);
      *(pDst1++) = Clip(val);
    }
    pDst1 += iImgWidth-8;
  }
}

/************************************************************************/
/* 函数功能:拷贝一个8x8块                                              */
/*          -主要用于cbp为0,对应块没有残差值的时候,直接拷贝预测值    */
/*            到重构图像中                                              */
/************************************************************************/
void CopyB8(AVS_BYTE* pDst, AVS_INT iStride, AVS_BYTE* pSrc)
{
  AVS_INT i;
  for(i=0; i<8; i++)
  {
    //memcpy(pDst, pSrc, 8);
    *((AVS_INT*)pDst) = *((AVS_INT*)pSrc);
    *((AVS_INT*)pDst+1) = *((AVS_INT*)pSrc+1);
    pSrc += 8;
    pDst += iStride;
  }
}

/************************************************************************/
/* 函数功能:求平均值                                                   */
/*        - 主要是用与双向预测中求前后向预测值的平均值,也可以用做求   */
/*           其他的平均值                                               */
/*                                                                      */
/*        - C语言代码课支持各种块形状,MMX代码只支持8x32, 8x8, 8x4,    */
/*           4x8, 4x4块形状                                             */
/************************************************************************/
void AverageB8x(AVS_BYTE* pDst, AVS_BYTE* pSrc, AVS_INT iHeight, AVS_INT iWidth)
{
  AVS_INT i, j;
  for(i=0; i<iHeight; i++)
  {
    for(j=0; j<iWidth; j++)
    {
      *(pDst) = (*(pDst) + *(pSrc)+1)/2;
      pDst++;
      pSrc++;
    }
    pSrc += 8-iWidth;
    pDst += 8-iWidth;
  }
}

⌨️ 快捷键说明

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