📄 vlc.cpp
字号:
}
//make decoder table for 2DVLC_CHROMA code
if(AVS_2DVLC_CHROMA_dec[0][0][1]<0) // Don't need to set this every time. rewrite later.
{
memset(AVS_2DVLC_CHROMA_dec,-1,sizeof(AVS_2DVLC_CHROMA_dec));
for(i=0;i<5;i++)
{
for(run=0;run<26;run++)
for(level=0;level<27;level++)
{
ipos=AVS_2DVLC_CHROMA[i][run][level];
assert(ipos<64);
if(ipos>=0)
{
if(i==0)
{
AVS_2DVLC_CHROMA_dec[i][ipos][0]=level+1;
AVS_2DVLC_CHROMA_dec[i][ipos][1]=run;
AVS_2DVLC_CHROMA_dec[i][ipos+1][0]=-(level+1);
AVS_2DVLC_CHROMA_dec[i][ipos+1][1]=run;
}
else
{
AVS_2DVLC_CHROMA_dec[i][ipos][0]=level;
AVS_2DVLC_CHROMA_dec[i][ipos][1]=run;
if(level)
{
AVS_2DVLC_CHROMA_dec[i][ipos+1][0]=-(level);
AVS_2DVLC_CHROMA_dec[i][ipos+1][1]=run;
}
}
}
}
}
assert(AVS_2DVLC_CHROMA_dec[0][0][1]>=0); //otherwise, tables are bad.
}
}
void ReadLumaCoeff(const AVS_BYTE* pbCurrent,AVS_DWORD dwDataLen, AVS_DWORD* pdwBitOffset, MBINFO* pCurrMb, AVS_DWORD dwPictureStructure, AVS_SHORT* pResidual)
{
static const AVS_INT incVlc_intra[7] = { 0,1,2,4,7,10,3000};
static const AVS_INT incVlc_inter[7] = { 0,1,2,3,6, 9,3000};
AVS_INT i;
AVS_INT ii, jj;
AVS_DWORD tabNo = 0;
AVS_INT symbol2D;
AVS_INT vlc_numcoef = 0;
AVS_INT run = 0, level = 0;
AVS_INT buffer_level[65];
AVS_INT buffer_run[65];
AVS_INT* TABNO = TabNoBuf+512;
AVS_INT* TABNO2 = TabNoBuf2+512;
AVS_INT qp, shift;
qp = pCurrMb->dwMbQp;
AVS_INT QPI, sum;
AVS_INT ipos = -1;
AVS_INT Golomb_se_type=SE_LUM_AC_INTER;
AVS_INT leadingZeroBits;
AVS_INT grad;
AVS_INT val, val2;
memset(buffer_run, 0, 65*sizeof(AVS_INT));
memset(buffer_level, 0, 65*sizeof(AVS_INT));
if(pCurrMb->dwMbType == I_8x8)
{
for(i=0; i<65; i++)
{
leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
grad = VLC_Golomb_Order[0][tabNo][0];
val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
symbol2D = (1<<(leadingZeroBits+grad)) - (1<<grad) + val;
if(symbol2D == EOB_Pos_intra[tabNo])
{
vlc_numcoef = i;
break;
}
else if(symbol2D < CODE2D_ESCAPE_SYMBOL)
{
level = AVS_2DVLC_INTRA_dec[tabNo][symbol2D][0];
run = AVS_2DVLC_INTRA_dec[tabNo][symbol2D][1];
}
else
{
run = (symbol2D - CODE2D_ESCAPE_SYMBOL)>>1;
leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
grad = 1;
val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
val2 = (1<<(leadingZeroBits+grad)) - (1<<grad) + val;
level = val2 + ((run>MaxRun[0][tabNo])?1:RefAbsLevel[tabNo][run]);
if(symbol2D & 1)
level=-level;
}
buffer_level[i] = level;
buffer_run[i] = run;
if(abs(level) > incVlc_intra[tabNo])
{
tabNo = TABNO[level];
}
}
for(i=(vlc_numcoef-1); i>=0; i--)
{
ipos += (buffer_run[i]+1);
ii = SCAN[dwPictureStructure][ipos][0];
jj = SCAN[dwPictureStructure][ipos][1];
shift = IQ_SHIFT[qp];
QPI = IQ_TAB[qp];
val = buffer_level[i];
sum = (val*QPI+(1<<(shift-2)) )>>(shift-1);
*(pResidual+jj*8+ii) = sum;
}
}
else
{
tabNo = 0;
for(i=0; i<65; i++)
{
leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
grad = VLC_Golomb_Order[1][tabNo][0];
val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
symbol2D = (1<<(leadingZeroBits+grad)) - (1<<grad) + val;
if(symbol2D == EOB_Pos_inter[tabNo])
{
vlc_numcoef = i;
break;
}
else if(symbol2D < CODE2D_ESCAPE_SYMBOL)
{
level = AVS_2DVLC_INTER_dec[tabNo][symbol2D][0];
run = AVS_2DVLC_INTER_dec[tabNo][symbol2D][1];
}
else
{
run = (symbol2D-CODE2D_ESCAPE_SYMBOL)>>1;
leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
grad = 0;
val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
val2 = (1<<(leadingZeroBits+grad)) - (1<<grad) + val;
level = val2 + ((run>MaxRun[1][tabNo])?1:RefAbsLevel[tabNo+7][run]);
if(symbol2D & 1) //jlzheng 7.20
level=-level;
}
buffer_level[i] = level;
buffer_run[i] = run;
if(abs(level) > incVlc_inter[tabNo]) //qwang 11.29
{
tabNo = TABNO2[level];
}
}
//将解码的level,run写到LumaCoeff[][];
for(i=(vlc_numcoef-1); i>=0; i--)
{
ipos += (buffer_run[i]+1);
ii = SCAN[dwPictureStructure][ipos][0];
jj = SCAN[dwPictureStructure][ipos][1];
shift = IQ_SHIFT[qp];
QPI = IQ_TAB[qp];
val = buffer_level[i];
sum = (val*QPI+(1<<(shift-2)) )>>(shift-1);
*(pResidual+jj*8+ii) = sum;
}
}
}
void ReadChromaCoeff(const AVS_BYTE* pbCurrent,AVS_DWORD dwDataLen, AVS_DWORD* pdwBitOffset, MBINFO* pCurrMb, AVS_DWORD dwPictureStructure, AVS_SHORT* pResidual)
{
AVS_INT tabNo = 0;
AVS_INT symbol2D = 0;
AVS_INT vlc_numcoef = 0;
AVS_INT run, level;
AVS_INT buffer_level[65];
AVS_INT buffer_run[65];
static const AVS_INT EOB_Pos_chroma[2][5] = {
{-1, 4, 8, 6, 4},
{-1, 0, 2, 0, 0}
};
static const AVS_INT incVlc_chroma[5] = {0,1,2,4,3000};
AVS_INT leadingZeroBits;
AVS_INT grad;
AVS_INT val, val2;
AVS_INT qp_chroma = QP_SCALE_CR[pCurrMb->dwMbQp]; // using old style qp.
AVS_INT temp;
AVS_INT ii, jj;
AVS_INT shift, QPI;
AVS_INT ipos = -1;
for(AVS_INT i=0; i<65; i++)
{
leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
grad = VLC_Golomb_Order[2][tabNo][0];
val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
symbol2D = (1<<(leadingZeroBits+grad)) - (1<<grad) + val;
if(symbol2D == EOB_Pos_chroma[1][tabNo])
{
vlc_numcoef = i;
break;
}
if(symbol2D < CODE2D_ESCAPE_SYMBOL)
{
level = AVS_2DVLC_CHROMA_dec[tabNo][symbol2D][0];
run = AVS_2DVLC_CHROMA_dec[tabNo][symbol2D][1];
}
else
{
run = (symbol2D-CODE2D_ESCAPE_SYMBOL)>>1;
leadingZeroBits = PassLeadingZeroBits(pbCurrent, pdwBitOffset);
grad = 0;
val = read_bits(pbCurrent, pdwBitOffset, leadingZeroBits+grad);
val2 = (1<<(leadingZeroBits+grad)) - (1<<grad) + val;
level = val2 + ((run>MaxRun[2][tabNo])?1:RefAbsLevel[tabNo+14][run]);
if(symbol2D & 1)
level=-level;
}
buffer_level[i] = level;
buffer_run[i] = run;
if(abs(level) > incVlc_chroma[tabNo]) //qwang 11.29
{
if(abs(level) <= 2)
tabNo = abs(level);
else if(abs(level) <= 4)
tabNo = 3;
else
tabNo = 4;
}
}
for(i=(vlc_numcoef-1); i>=0; i--)
{
ipos += (buffer_run[i]+1);
ii = SCAN[dwPictureStructure][ipos][0];
jj = SCAN[dwPictureStructure][ipos][1];
shift = IQ_SHIFT[qp_chroma];
QPI = IQ_TAB[qp_chroma];
val = buffer_level[i];
temp = (val*QPI+(1<<(shift-2)) )>>(shift-1);
*(pResidual+jj*8+ii) = temp;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -