📄 swdec_vlc.c
字号:
/* sign, rlc & last */
sign = escape_code & (0x1000>>tab->len);
rlc = tab->lrl;
last = rlc>>15;
if ( (escape_type==1)) {
/* inter mb and type 1 escape */
run = ((rlc & 0x7E00)>>9);
if ( last==1 )
{
if (run == 0)
tmp = 3;
else if (run == 1)
tmp = 2;
else
tmp = 1;
}
else
{
tmp = lmaxInterTable[run];
}
level = (i32)((rlc & 0x1FF) + tmp);
if ( sign ) level = -level;
run = (rlc&0x7E00)>>9;
} else {
/* inter mb and escape type 2 */
level = (rlc & 0x01FF);
if ( last==1 ) /* last == 1 */
{
if (level == 1)
tmp = 40;
else if (level == 2)
tmp = 1;
else
tmp = 0;
}
else /* Last == 0 */
{
tmp= rmaxInterTable[level-1];
}
level = (rlc & 0x1FF);
if ( sign ) level = -level;
run = ((rlc&0x7E00)>>9) + tmp + 1;
if (run > 63) return(HANTRO_NOK);
}
BUFFER_FLUSH(buffer, tab->len+1);
}
/* Type 3 Escape: After escape_code 11*/
else
{
BUFFER_GET(buffer, escape_code, 21);
last = (escape_code & 0x100000) >> 20;
run = (escape_code & 0xFC000) >> 14;
level= (escape_code & 0x0FFE) >> 1;
sign = (escape_code & 0x1000);
/*Check Marker Bits*/
if ( !(escape_code & 0x01) || !(escape_code & 0x2000))
return(HANTRO_NOK);
if (level == 0) return(HANTRO_NOK);
if(sign) level = level - 2048;
}
}
}
#endif
/* no escape code */
else
{
/* sign */
sign = inputBuffer & (0x1000>>tab->len);
rlc = tab->lrl;
level = rlc&0x1FF;
if ( sign ) level = -level;
run = (rlc>>9)&0x3F;
last = rlc>>15;
}
CodeCount += run + 1;
if (CodeCount > 64)
{
return(HANTRO_NOK);
}
/* Saving the word to buffer */
tmp = zigZagScan[CodeCount-1];
pOut[tmp] = level;
DEQUANTIZE(pOut[tmp],QP);
if ( ((tmp>>3)+1) >
pDecContainer->StrmStorage.numIdctRows )
{
pDecContainer->StrmStorage.numIdctRows =
(tmp>>3) + 1;
}
} while(!last);
tmp = SwDec_FlushBits(pDecContainer,32-buffer.bits);
return(tmp);
}
#ifndef MP4DEC_H263_ONLY
/*------------------------------------------------------------------------------
5.3 Function name: SwDec_DecodeRvlcBlock
Purpose: Decode rvlc block
Input:
pointer to decContainer_t
pointer to output data block
macro block number
quantization parameter
scanning direction
Output:
HANTRO_OK/HANTRO_NOK/END_OF_STREAM
------------------------------------------------------------------------------*/
u32 SwDec_DecodeRvlcBlock(decContainer_t *pDecContainer,i32 *pOut,u32 mbNum,
u32 QP, u32 scanDir)
{
u32 last;
u32 run;
i32 level;
u32 inputBuffer;
u32 rlc;
u32 CodeCount;
u32 tmp;
u32 tmpMask;
u32 index;
u32 length;
tmpBuffer_t buffer;
ASSERT(pDecContainer);
ASSERT(pOut);
ASSERT(mbNum < pDecContainer->VopDesc.totalMbInVop);
ASSERT(QP);
ASSERT(QP < 32);
ASSERT(scanDir < 3);
ASSERT(!(MB_IS_INTER(mbNum) &&
(pDecContainer->MbDesc[mbNum].flags & USE_INTRA_DC_VLC_MASK)));
ASSERT(!(MB_IS_INTER(mbNum) && scanDir));
if (pDecContainer->MbDesc[mbNum].flags & USE_INTRA_DC_VLC_MASK)
CodeCount = 1;
else
CodeCount = 0;
/* read 32 bits into buffer */
BUFFER_INIT(buffer);
do {
BUFFER_SHOW(buffer, inputBuffer, 16);
/* first 5 code words handled by rvlcShort -tables */
if (MB_IS_INTRA(mbNum))
{
rlc = rvlcShortIntra[inputBuffer>>11];
}
else
{
rlc = rvlcShortInter[inputBuffer>>11];
}
if (rlc == ERROR) return(HANTRO_NOK);
if (rlc != EMPTY)
{
/*lint --e(504) -e514 */
BUFFER_FLUSH(buffer,4+(inputBuffer<0xC000));
/* lint +e514 */
if (rlc != ESCAPE)
{
last = (rlc & 0x8000)>>15;
run = (rlc & 0x7E00)>>9;
level = (i16)(rlc>>16);
}
else
{
BUFFER_GET(buffer,tmp,25);
last = ((tmp & 0x1000000) >> 24);
run = ((tmp & 0xFC0000) >> 18);
/* marker */
if (!((tmp & 0x20000) >> 17)) return(HANTRO_NOK);
level = ((tmp & 0x1FFC0) >> 6);
if (!level) return(HANTRO_NOK);
/* marker */
if (!((tmp & 0x20) >> 5)) return(HANTRO_NOK);
/* four 0's of escape */
if((tmp & 0x1E) >> 1) return(HANTRO_NOK);
/* sign */
if (tmp & 0x1)
level = -level;
}
}
/* table search */
else
{
/* first bit is 0 (msb) */
if (inputBuffer<0x8000)
{
index = 0;
tmpMask = 0x4000;
/* scan next (2nd) zero */
while (inputBuffer & tmpMask)
{
index += 2;
tmpMask >>= 1;
}
if (!tmpMask) return(HANTRO_NOK);
/* scan next (3rd) zero, calculate rvlc length,
* save the last bit of rvlc code and the sign bit */
tmpMask >>= 1;
length = (index>>1) + 5;
while (inputBuffer & tmpMask)
{
tmpMask >>= 1;
length++;
}
/*if (!tmpMask) return(HANTRO_NOK);*/
if (length > 16) return(HANTRO_NOK);
/* last bit before sign */
tmp = inputBuffer & (tmpMask>>1) ? 1 : 0;
/* calculate index to table */
index += ((length-6) * 22) + tmp;
if (index >= 234) return(HANTRO_NOK);
if ( MB_IS_INTRA(mbNum) )
{
rlc = (u32)rvlcTable1Intra[index];
}
else
{
rlc = (u32)rvlcTable1Inter[index];
}
/*if (rlc == EMPTY) return(HANTRO_NOK);*/
BUFFER_FLUSH(buffer, length);
level = rlc & 0x1FF;
last = (rlc >> 15)&0x1;
run = (rlc >> 9)&0x3F;
/* sign */
if (inputBuffer & (tmpMask>>2))
{
level = -level;
}
}
/* 1st bit is 1 (msb) */
else
{
/* scan next high bit (starting from bit number 3) */
tmpMask = 0x1000;
length = 6;
while (tmpMask && !(inputBuffer & tmpMask))
{
length++;
tmpMask >>= 1;
}
if (length > 15) return(HANTRO_NOK);
tmp = inputBuffer & (tmpMask>>1) ? 1 : 0;
index = (length-6)*2 + tmp;
if ( MB_IS_INTRA(mbNum) )
{
rlc = rvlcTable2Intra[index];
}
else
{
rlc = rvlcTable2Inter[index];
}
BUFFER_FLUSH(buffer, length);
level = rlc & 0x1FF;
last = (rlc >> 15)&0x1;
run = (rlc >> 9)&0x3F;
/* sign */
if (inputBuffer & (tmpMask>>2))
{
level = -level;
}
}
}
CodeCount += run + 1;
if ( CodeCount>64 )
{
return(HANTRO_NOK);
}
if (MB_IS_INTER(mbNum))
{
tmp = zigZagScan[CodeCount-1];
pOut[tmp] = level;
DEQUANTIZE(pOut[tmp],QP);
}
else
{
/* quantize all but first row and column */
if (scanDir == 0)
tmp = zigZagScan[CodeCount-1];
else if (scanDir == 1)
tmp = horScan[CodeCount-1];
else
tmp = verScan[CodeCount-1];
pOut[tmp] = level;
if ((tmp > 8) && (tmp & 0x7))
{
DEQUANTIZE(pOut[tmp], QP);
}
}
if ( ((tmp>>3)+1) >
pDecContainer->StrmStorage.numIdctRows )
{
pDecContainer->StrmStorage.numIdctRows =
(tmp>>3) + 1;
}
} while(!last);
tmp = SwDec_FlushBits(pDecContainer,32-buffer.bits);
return(tmp);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -