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

📄 loopfilter.cpp

📁 testWindows下的www代理服务器,支持socks4 -WWW proxy in windows, supporting socks4
💻 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
*************************************************************************/
/*************************************************************************
  文件名称:	loopfilter.cpp
  描    述: 环路滤波相关的一些函数
*************************************************************************/
/*************************************************************************
  Revision History
  data          Modification                                    Author
  2005-4-6      Created                                          jthou
 *************************************************************************/

#include "loopfilter.h"

//  BsH00    BsH01
//---------------------
//|        |          |
//|BsV00   |BsV01     |
//|        |          |
//| BsH10  | BsH11    |
//---------------------
//|        |          |
//|BsV10   |BsV11     |
//|        |          |
//|        |          |
//---------------------
void DeblockVBs2_Luma(AVS_BYTE* pStart, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
  AVS_INT i;
  AVS_BYTE* p = pStart;
  for(i=0; i<8; i++)
  {
    AVS_BYTE p2 = *(p-3);
    AVS_BYTE p1 = *(p-2);
    AVS_BYTE p0 = *(p-1);
    
    AVS_BYTE q0 = *p;
    AVS_BYTE q1 = *(p+1);
    AVS_BYTE q2 = *(p+2);
    if(abs(p0-q0)<Alpha && abs(p1-p0)<Beta && abs(q1-q0)<Beta)
    {
      AVS_INT ap = abs(p2-p0);
      AVS_INT aq = abs(q2-q0);
      
      if(ap<Beta && abs(p0-q0)<((Alpha>>2)+2))
      {
        *(p-1) = (p1 + 2*p0 + q0 + 2) >> 2;
        *(p-2) = (2*p1 + p0 + q0 + 2) >> 2;
      }
      else
      {
        *(p-1) = (2*p1 + p0 + q0 + 2) >> 2;
      }
      if(aq<Beta && abs(p0-q0)<((Alpha>>2)+2))
      {
        *(p  ) = (q1 + 2*q0 + p0 + 2) >> 2;
        *(p+1) = (2*q1 + q0 + p0 + 2) >> 2;
      }
      else
      {
        *(p  ) = (2*q1 + q0 + p0 + 2) >> 2;
      }
    }
    
    p += iStride;
  } 
}


void DeblockVBs1_Luma(AVS_BYTE* pStart,AVS_INT C, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
  AVS_INT i;
  AVS_BYTE* p = pStart;
  
  for(i=0; i<8; i++)
  {
    AVS_BYTE p2 = *(p-3);
    AVS_BYTE p1 = *(p-2);
    AVS_BYTE p0 = *(p-1);
    
    AVS_BYTE q0 = *p;
    AVS_BYTE q1 = *(p+1);
    AVS_BYTE q2 = *(p+2);

    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-1) = Clip(p0+delta);
      *(p  ) = Clip(q0+delta);
      
      AVS_INT ap = abs(p2-p0);
      AVS_INT aq = abs(q2-q0);
      
      if(ap<Beta)
        *(p-2) = Clip(p1+Clip3(-C, C, (((*(p-1)-p1)*3 + (p2-*(p))+4)>>3)));
      if(aq<Beta)
        *(p+1) = Clip(q1-Clip3(-C, C, (((q1-*(p))*3 + (*(p-1)-q2)+4)>>3)));
    }
    
    p += iStride;
  }  
}

void DeblockHBs2_Luma(AVS_BYTE* pStart, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
  AVS_INT i;
  AVS_BYTE* p = pStart;
  for(i=0; i<8; i++)
  {
    AVS_BYTE p2 = *(p-3*iStride);
    AVS_BYTE p1 = *(p-2*iStride);
    AVS_BYTE p0 = *(p-iStride);
    
    AVS_BYTE q0 = *p;
    AVS_BYTE q1 = *(p+iStride);
    AVS_BYTE q2 = *(p+2*iStride);
    if(abs(p0-q0)<Alpha && abs(p1-p0)<Beta && abs(q1-q0)<Beta)
    {
      AVS_INT ap = abs(p2-p0);
      AVS_INT aq = abs(q2-q0);
      
      if(ap<Beta && abs(p0-q0)<((Alpha>>2)+2))
      {
        *(p-iStride) = (p1 + 2*p0 + q0 + 2) >> 2;
        *(p-2*iStride) = (2*p1 + p0 + q0 + 2) >> 2;
      }
      else
      {
        *(p-iStride) = (2*p1 + p0 + q0 + 2) >> 2;
      }
      if(aq<Beta && abs(p0-q0)<((Alpha>>2)+2))
      {
        *(p  ) = (q1 + 2*q0 + p0 + 2) >> 2;
        *(p+iStride) = (2*q1 + q0 + p0 + 2) >> 2;
      }
      else
      {
        *(p  ) = (2*q1 + q0 + p0 + 2) >> 2;
      }
    }
    p++;
  }
}

void DeblockHBs1_Luma(AVS_BYTE* pStart,AVS_INT C, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
  AVS_INT i;
  AVS_BYTE* p = pStart;
  for(i=0; i<8; i++)
  {
    AVS_BYTE p2 = *(p-3*iStride);
    AVS_BYTE p1 = *(p-2*iStride);
    AVS_BYTE p0 = *(p-iStride);
    
    AVS_BYTE q0 = *p;
    AVS_BYTE q1 = *(p+iStride);
    AVS_BYTE q2 = *(p+2*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);
      
      AVS_INT ap = abs(p2-p0);
      AVS_INT aq = abs(q2-q0);
      
      if(ap<Beta)
        *(p-2*iStride) = Clip(p1+Clip3(-C, C, (((*(p-iStride)-p1)*3 + (p2-*(p))+4)>>3)));
      if(aq<Beta)
        *(p+iStride) = Clip(q1-Clip3(-C, C, (((q1-*(p))*3 + (*(p-iStride)-q2)+4)>>3)));
    }
    p++;
  }
}

void DeblockVBs2_Chroma(AVS_BYTE* pStart, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
  AVS_INT i;
  AVS_BYTE* p = pStart;
  
  for(i=0; i<4; i++)
  {
    AVS_BYTE p2 = *(p-3);
    AVS_BYTE p1 = *(p-2);
    AVS_BYTE p0 = *(p-1);
    
    AVS_BYTE q0 = *p;
    AVS_BYTE q1 = *(p+1);
    AVS_BYTE q2 = *(p+2);
    if(abs(p0-q0)<Alpha && abs(p1-p0)<Beta && abs(q1-q0)<Beta)
    {
      AVS_INT ap = abs(p2-p0);
      AVS_INT aq = abs(q2-q0);
      
      if(ap<Beta && abs(p0-q0)<((Alpha>>2)+2))
      {
        *(p-1) = (p1 + 2*p0 + q0 + 2) >> 2;
      }
      else
      {
        *(p-1) = (2*p1 + p0 + q0 + 2) >> 2;
      }
      if(aq<Beta && abs(p0-q0)<((Alpha>>2)+2))
      {
        *(p  ) = (q1 + 2*q0 + p0 + 2) >> 2;
      }
      else
      {
        *(p  ) = (2*q1 + q0 + p0 + 2) >> 2;
      }
    }
    
    p += iStride;
  }
}

void DeblockVBs1_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 p2 = *(p-3);
    AVS_BYTE p1 = *(p-2);
    AVS_BYTE p0 = *(p-1);
    
    AVS_BYTE q0 = *p;
    AVS_BYTE q1 = *(p+1);
    AVS_BYTE q2 = *(p+2);

    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-1) = Clip(p0+delta);
      *(p  ) = Clip(q0+delta);
    }    
    
    p += iStride;
  }
}

void DeblockHBs2_Chroma(AVS_BYTE* pStart, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
  AVS_INT i;
  AVS_BYTE* p = pStart;
  for(i=0; i<4; i++)
  {
    AVS_BYTE p2 = *(p-3*iStride);
    AVS_BYTE p1 = *(p-2*iStride);
    AVS_BYTE p0 = *(p-iStride);
    
    AVS_BYTE q0 = *p;
    AVS_BYTE q1 = *(p+iStride);
    AVS_BYTE q2 = *(p+2*iStride);
    if(abs(p0-q0)<Alpha && abs(p1-p0)<Beta && abs(q1-q0)<Beta)
    {
      AVS_INT ap = abs(p2-p0);
      AVS_INT aq = abs(q2-q0);
      
      if(ap<Beta && abs(p0-q0)<((Alpha>>2)+2))
        *(p-iStride) = (p1 + 2*p0 + q0 + 2) >> 2;
      else
        *(p-iStride) = (2*p1 + p0 + q0 + 2) >> 2;
 
      if(aq<Beta && abs(p0-q0)<((Alpha>>2)+2))
        *(p  ) = (q1 + 2*q0 + p0 + 2) >> 2;
      else
        *(p  ) = (2*q1 + q0 + p0 + 2) >> 2;
    }      
    p ++;

⌨️ 快捷键说明

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