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

📄 block.cpp

📁 AVS是中国自己推出的视频图像音频编解码标准。包中是AVS 源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*************************************************************************
 AVS1-P2视频解码器源码
 版权所有:联合信源数字音视频技术(北京)有限公司, (c) 2005-2006 

 AVS1-P2 Video Decoder Source Code
 (c) Copyright, NSCC All Rights Reserved, 2005-2006
 *************************************************************************
 Distributed under the terms of the GNU General Public License as
 published by the Free Software Foundation; either version 2 of the
 License, or (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*************************************************************************/
/*************************************************************************
  文件名称:	block.cpp
  描    述: 包含IDCT变换,亮度插值算法和色度插值和其他的一些以块为单位的
            操作:8x8块重构,拷贝一个8x8块,求两个块的平均值等
*************************************************************************/
/*************************************************************************
  Revision History
  data          Modification                                    Author
  2005-2-8      Created                                          jthou
 *************************************************************************/
#include "block.h"
#include "global.h"

/************************************************************************/
/*  函数功能:IDCT                                                      */
/************************************************************************/
void inv_transform_B8(AVS_SHORT* psBlock  // block to be inverse transformed.
   )
{
  AVS_SHORT  xx, yy;
  AVS_SHORT  tmp[8];
  AVS_SHORT  t;
  AVS_SHORT  b[8];
  
  for(yy=0; yy<8; yy++)
  {    
    // Horizontal inverse transform
    // Reorder
    
    tmp[0]=psBlock[yy*8+0];
    tmp[1]=psBlock[yy*8+4];
    tmp[2]=psBlock[yy*8+2];
    tmp[3]=psBlock[yy*8+6];
    tmp[4]=psBlock[yy*8+1];
    tmp[5]=psBlock[yy*8+3];
    tmp[6]=psBlock[yy*8+5];
    tmp[7]=psBlock[yy*8+7];
    // Downleft Butterfly
    b[0] = ((tmp[4] - tmp[7])<<1) + tmp[4];
    b[1] = ((tmp[5] + tmp[6])<<1) + tmp[5];
    b[2] = ((tmp[5] - tmp[6])<<1) - tmp[6];
    b[3] = ((tmp[4] + tmp[7])<<1) + tmp[7];
    
    b[4] = ((b[0] + b[1] + b[3])<<1) + b[1];
    b[5] = ((b[0] - b[1] + b[2])<<1) + b[0];
    b[6] = ((-b[1] - b[2] + b[3])<<1) + b[3];
    b[7] = ((b[0] - b[2] - b[3])<<1) - b[2];
    
    // Upleft Butterfly
    t=((tmp[2]*10)+(tmp[3]<<2));
    tmp[3]=((tmp[2]<<2)-(tmp[3]*10));
    tmp[2]=t;
    
    t=(tmp[0]+tmp[1])<<3;
    tmp[1]=(tmp[0]-tmp[1])<<3;
    tmp[0]=t;
    
    b[0]=tmp[0]+tmp[2];
    b[1]=tmp[1]+tmp[3];
    b[2]=tmp[1]-tmp[3];
    b[3]=tmp[0]-tmp[2];	 
    
    // Last Butterfly
    
    psBlock[yy*8+0]=((b[0]+b[4])+(1<<2))>>3;
    psBlock[yy*8+1]=((b[1]+b[5])+(1<<2))>>3;
    psBlock[yy*8+2]=((b[2]+b[6])+(1<<2))>>3;
    psBlock[yy*8+3]=((b[3]+b[7])+(1<<2))>>3;
    psBlock[yy*8+7]=((b[0]-b[4])+(1<<2))>>3;
    psBlock[yy*8+6]=((b[1]-b[5])+(1<<2))>>3;
    psBlock[yy*8+5]=((b[2]-b[6])+(1<<2))>>3;
    psBlock[yy*8+4]=((b[3]-b[7])+(1<<2))>>3;
  }
  // Vertical inverse transform
  for(xx=0; xx<8; xx++)
  {     
    // Reorder
    tmp[0]=psBlock[0*8+xx];
    tmp[1]=psBlock[4*8+xx];
    tmp[2]=psBlock[2*8+xx];
    tmp[3]=psBlock[6*8+xx];
    tmp[4]=psBlock[1*8+xx];
    tmp[5]=psBlock[3*8+xx];
    tmp[6]=psBlock[5*8+xx];
    tmp[7]=psBlock[7*8+xx];
    
    // Downleft Butterfly
    b[0] = ((tmp[4] - tmp[7])<<1) + tmp[4];
    b[1] = ((tmp[5] + tmp[6])<<1) + tmp[5];
    b[2] = ((tmp[5] - tmp[6])<<1) - tmp[6];
    b[3] = ((tmp[4] + tmp[7])<<1) + tmp[7];
    
    b[4] = ((b[0] + b[1] + b[3])<<1) + b[1];
    b[5] = ((b[0] - b[1] + b[2])<<1) + b[0];
    b[6] = ((-b[1] - b[2] + b[3])<<1) + b[3];
    b[7] = ((b[0] - b[2] - b[3])<<1) - b[2];
    
    // Upleft Butterfly
    t=((tmp[2]*10)+(tmp[3]<<2));
    tmp[3]=((tmp[2]<<2)-(tmp[3]*10));
    tmp[2]=t;
    
    t=(tmp[0]+tmp[1])<<3;
    tmp[1]=(tmp[0]-tmp[1])<<3;
    tmp[0]=t;
    
    b[0]=tmp[0]+tmp[2];
    b[1]=tmp[1]+tmp[3];
    b[2]=tmp[1]-tmp[3];
    b[3]=tmp[0]-tmp[2];
    
    // Last Butterfly
    psBlock[0*8+xx]=(Clip3(-32768,32703,b[0]+b[4])+64)>>7;
    psBlock[1*8+xx]=(Clip3(-32768,32703,b[1]+b[5])+64)>>7;
    psBlock[2*8+xx]=(Clip3(-32768,32703,b[2]+b[6])+64)>>7;
    psBlock[3*8+xx]=(Clip3(-32768,32703,b[3]+b[7])+64)>>7;
    psBlock[7*8+xx]=(Clip3(-32768,32703,b[0]-b[4])+64)>>7;
    psBlock[6*8+xx]=(Clip3(-32768,32703,b[1]-b[5])+64)>>7;
    psBlock[5*8+xx]=(Clip3(-32768,32703,b[2]-b[6])+64)>>7;
    psBlock[4*8+xx]=(Clip3(-32768,32703,b[3]-b[7])+64)>>7;
  }
}

/************************************************************************/
/*  函数功能:8x8亮度块插值预测                                         */
/************************************************************************/

void GetBlock(MOTIONVECTOR* pMv, AVS_INT iImgX, AVS_INT iImgY, AVS_INT iImgWidth, AVS_INT iImgHeight, const AVS_BYTE* pbRefY, AVS_BYTE* pPred)
{
  int i, j;
  int imgX = iImgX;
  int imgY = iImgY;

  int dx = (imgX*4 + pMv->x)&3;
  int dy = (imgY*4 + pMv->y)&3;

  int refX = (imgX*4 + pMv->x - dx)/4;
  int refY = (imgY*4 + pMv->y - dy)/4;

  if(dy ==0 && dx == 0)  //D
  {
    for(i=0; i<8; i++)
    {
      for(j=0; j<8; j++)
      {
        pPred[i*8+j] = *(pbRefY + max(0,min(iImgHeight-1,refY+i))*iImgWidth + max(0,min(iImgWidth-1,refX+j)));
      }
    }
  }
  else if(dx==2 && dy==0) //b
  {
    for(i=0; i<8; i++)
    {
      for(j=0; j<8; j++)
      {
        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)));
        pPred[i*8+j] = Clip((bpie+4)>>3);
      }
    }
  }
  else if(dy==2 && dx==0) //h
  {
    for(i=0; i<8; i++)
      for(j=0; j<8; j++)
      {
        int hpie = 
          -    *(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  ))*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)))
          -    *(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j)));
        pPred[i*8+j] = Clip((hpie+4)>>3);
      }
  }
  else if(dy==2 && dx==2) //j
  {
    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 jpie = -aapie + 5*bpie + 5*spie - ddpie;
        pPred[i*8+j] = Clip((jpie + 32)>>6);
      }
    }
  }
  else if(dy==0 && dx==1) //a
  {
    for(i=0; i<8; i++)
    {
      for(j=0; j<8; j++)
      {
        int eepie = 
          -    *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j-2))) 
          + 5* *(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  )))
          -    *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)));
        int Dpie = *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j))) * 8;
        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 Epie = *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))) * 8;
        pPred[i*8+j] = Clip((eepie + 7*Dpie + 7*bpie + Epie + 64)>>7);
      }
    }
  }
  else if(dy==0 && dx==3) //c
  {
    for(i=0; i<8; i++)
    {
      for(j=0; j<8; j++)
      {
        int Dpie = *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j))) * 8;
        int Epie = *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))) * 8;
        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 ccpie = 
          -    *(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))) 
          + 5* *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))
          -    *(pbRefY + max(0,min(iImgHeight-1, refY+i))*iImgWidth + max(0, min(iImgWidth-1, refX+j+3)));
        pPred[i*8+j] = Clip((Dpie + 7*bpie + 7*Epie + ccpie + 64)>>7);
      }
    }
  }
  else if(dy==1 && dx==0) //d
  {
    for(i=0; i<8; i++)
    {
      for(j=0; j<8; j++)
      {
        int ffpie = 

⌨️ 快捷键说明

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