www.pudn.com > AVS.rar > global.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; iy = 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; iy); 
    free(refFrame[i]->u); 
    free(refFrame[i]->v); 
    free(refFrame[i]); 
  } 
}