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

📄 global.cpp

📁 AVS是中国自己推出的视频图像音频编解码标准。包中是AVS 源代码
💻 CPP
字号:
/*************************************************************************
 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
*************************************************************************/
/*************************************************************************
  文件名称:	global.cpp
  描    述: 全局变量和全局函数(主要在初始化时用到)
*************************************************************************/
/*************************************************************************
  Revision History
  data          Modification                                    Author
  2005-2-8      Created                                          jthou
 *************************************************************************/

#include "define.h"
#include "global.h"
#include "stream.h"
#include "vlc.h"
//global variables-------------------------------
AVS_BYTE ClipTable[CLIPSIZE*2+256];
AVS_INT  TabNoBuf[1025];
AVS_INT  TabNoBuf2[1025];
/************************************************************************/
/* 函数功能:做一个Clip表,替代Clip宏                                   */
/************************************************************************/
void MakeClipTable()
{
  AVS_BYTE* p = ClipTable;
  AVS_INT i;
  memset(p, 0, CLIPSIZE);
  p = ClipTable+CLIPSIZE;
  for(i=0; i<256; i++)
    *(p++) = i;
  memset(p, 255, CLIPSIZE);
}

/************************************************************************/
/* 函数功能:做一个查TabNo的表                                          */
/*         - 用在VLD过程中,查表号,替代判断和求绝对值操作              */
/************************************************************************/
void MakeTabNoBuf()
{
  int i;
  TabNoBuf[512] = 0;
  for(i=1; i<=2; i++)
  {
    TabNoBuf[512+i] = TabNoBuf[512-i] = i;
  }
  for(i=3; i<=4; i++)
  {
    TabNoBuf[512+i] = TabNoBuf[512-i] = 3;
  }
  for(i=5; i<=7; i++)
  {
    TabNoBuf[512+i] = TabNoBuf[512-i] = 4;
  }
  for(i=8; i<=10; i++)
  {
    TabNoBuf[512+i] = TabNoBuf[512-i] = 5;
  }
  for(i=11; i<=512; i++)
  {
    TabNoBuf[512+i] = TabNoBuf[512-i] = 6;
  }
  // table2
  TabNoBuf2[512] = 0;
  for(i=1; i<=3; i++)
  {
    TabNoBuf2[512+i] = TabNoBuf2[512-i] = i;
  }
  for(i=4; i<=6; i++)
  {
    TabNoBuf2[512+i] = TabNoBuf2[512-i] = 4;
  }
  for(i=7; i<=9; i++)
  {
    TabNoBuf2[512+i] = TabNoBuf2[512-i] = 5;
  }
  for(i=10; i<512; i++)
  {
    TabNoBuf2[512+i] = TabNoBuf2[512-i] = 6;
  }
}


/************************************************************************/
/* 函数功能:寻找下一个图像起始码或者结束码                             */
/*         - 目的是保证当前数据为一整帧的数据                           */
/************************************************************************/
AVS_BOOL FindNextPicOrEndStartCode(const AVS_BYTE* pbData, AVS_DWORD dwDataLen, AVS_DWORD* dwLeft)
{
  const AVS_BYTE* pbCurrent = pbData+4;
  AVS_DWORD Left = dwDataLen-4;
  
  while (Left>4 && 
    ((*(AVS_DWORD *)pbCurrent) != 0xB3010000) && 
    ((*(AVS_DWORD *)pbCurrent) != 0xB6010000) &&
    ((*(AVS_DWORD *)pbCurrent) != 0xB1010000)
    ) 
  {
    pbCurrent ++;
    Left --;
  }

  if(Left > 4)
  {
    *dwLeft = Left;
    return TRUE;
  }
  return FALSE;
}

/************************************************************************/
/* 函数功能:寻找下一个Slice头                                          */
/************************************************************************/
AVS_BOOL FindSliceStartCode(const AVS_BYTE** pbData, AVS_DWORD* dwLeft)
{
  const AVS_BYTE* pbCurrent = *pbData;
  AVS_DWORD Left = *dwLeft;
  
  while (Left>4 && 
    !IS_SLICE_START_CODE(DWORD_SWAP(*(AVS_DWORD *)pbCurrent))) 
  {
    pbCurrent ++;
    Left --;
  }

  if(Left > 4)
  {
    *pbData = pbCurrent;
    *dwLeft = Left;
    return TRUE;
  }
  return FALSE;
}

/************************************************************************/
/* 函数功能:判断是否是Slice头                                          */
/************************************************************************/
AVS_BOOL  IsSliceHeader(const AVS_BYTE* pbData, AVS_DWORD dwBitOffset)
{
  
  AVS_DWORD dwByteOffset = dwBitOffset/8;
  if(dwBitOffset%8 > 0)
    dwByteOffset += 1;
  return IS_SLICE_START_CODE(DWORD_SWAP(*(AVS_DWORD*)(pbData+dwByteOffset)));

}

/************************************************************************/
/* 函数功能:给参考图像池分配内存                                       */
/************************************************************************/
AVS_HRESULT GetMem(VIDEODATA** refFrame, AVS_INT refNum)
{
  AVS_INT iYlen = AVS_MAX_HORIZONTAL*AVS_MAX_VERTICAL;
  AVS_INT iUVlen = iYlen/4;
  
  AVS_INT i;
   
  for(i=0; i<refNum; i++)
  {
    refFrame[i] = new (VIDEODATA);
  }

  for(i=0; i<refNum; i++)
  {
    refFrame[i]->y = new AVS_BYTE [iYlen];
    refFrame[i]->u = new AVS_BYTE [iUVlen];
    refFrame[i]->v = new AVS_BYTE [iUVlen];
  }

  return AVS_NOERROR;
}

/************************************************************************/
/* 函数功能:释放参考图像内存                                           */
/************************************************************************/
void ReleaseMem(VIDEODATA* refFrame[], AVS_INT refNum)
{
  for(AVS_INT i=0; i<refNum; i++)
  {
    free(refFrame[i]->y);
    free(refFrame[i]->u);
    free(refFrame[i]->v);
    free(refFrame[i]);
  }
}

⌨️ 快捷键说明

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