📄 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; 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 + -