📄 umc_base_bitstream.cpp
字号:
m_nRegister <<= 1;
m_nRegister |= (Ipp32s)code;
m_nReadyBits --;
if (0 == m_nReadyBits){
*(m_pbs) = (Ipp8u)(m_nRegister>>24);
*(m_pbs+1) = (Ipp8u)(m_nRegister>>16);
*(m_pbs+2) = (Ipp8u)(m_nRegister>>8);
*(m_pbs+3) = (Ipp8u)m_nRegister;
m_pbs += 4;
m_nRegister = 0;
m_nReadyBits = 32;
// m_nReadyBits = 8;
}
return;
}; //void CBaseBitstream::WriteBit_CABAC(bool code)
void CBaseBitstream::WriteOutstandingBit_CABAC(bool code)
{
WriteBit_CABAC(code);
while (m_nOutstandingBits > 0){
m_nOutstandingBits--;
WriteBit_CABAC(!code);
}
}
void CBaseBitstream::WriteOutstandingZeroBit_CABAC()
{
m_nRegister <<= 1;
// m_nRegister |= 0;
m_nReadyBits --;
if (0 == m_nReadyBits){
*(m_pbs) = (Ipp8u)(m_nRegister>>24);
*(m_pbs+1) = (Ipp8u)(m_nRegister>>16);
*(m_pbs+2) = (Ipp8u)(m_nRegister>>8);
*(m_pbs+3) = (Ipp8u)m_nRegister;
m_pbs += 4;
m_nRegister = 0;
m_nReadyBits = 32;
}
if( m_nReadyBits < m_nOutstandingBits ){
m_nRegister <<= m_nReadyBits;
m_nRegister |= (Ipp32u)0xffffffff >> (32-m_nReadyBits);
*(m_pbs) = (Ipp8u)(m_nRegister>>24);
*(m_pbs+1) = (Ipp8u)(m_nRegister>>16);
*(m_pbs+2) = (Ipp8u)(m_nRegister>>8);
*(m_pbs+3) = (Ipp8u)m_nRegister;
m_pbs += 4;
m_nOutstandingBits -= m_nReadyBits;
m_nRegister = 0;
m_nReadyBits = 32;
while( m_nOutstandingBits >= 32 ){
*(m_pbs) = 0xff;
*(m_pbs+1) = 0xff;
*(m_pbs+2) = 0xff;
*(m_pbs+3) = 0xff;
m_pbs += 4;
m_nOutstandingBits -= 32;
}
}
if( m_nOutstandingBits == 0 ) return;
m_nRegister <<= m_nOutstandingBits;
m_nRegister |= (Ipp32u)0xffffffff >> (32-m_nOutstandingBits);
m_nReadyBits -= m_nOutstandingBits;
if( 0 == m_nReadyBits ){
*(m_pbs) = (Ipp8u)(m_nRegister>>24);
*(m_pbs+1) = (Ipp8u)(m_nRegister>>16);
*(m_pbs+2) = (Ipp8u)(m_nRegister>>8);
*(m_pbs+3) = (Ipp8u)m_nRegister;
m_pbs += 4;
m_nRegister = 0;
m_nReadyBits = 32;
}
m_nOutstandingBits = 0;
}
void CBaseBitstream::WriteOutstandingOneBit_CABAC()
{
m_nRegister <<= 1;
m_nRegister |= 1;
m_nReadyBits --;
if (0 == m_nReadyBits){
*(m_pbs) = (Ipp8u)(m_nRegister>>24);
*(m_pbs+1) = (Ipp8u)(m_nRegister>>16);
*(m_pbs+2) = (Ipp8u)(m_nRegister>>8);
*(m_pbs+3) = (Ipp8u)m_nRegister;
m_pbs += 4;
m_nRegister = 0;
m_nReadyBits = 32;
}
if( m_nReadyBits < m_nOutstandingBits ){
m_nRegister <<= m_nReadyBits;
m_nRegister &= (Ipp32u)0xffffffff << m_nReadyBits;
*(m_pbs) = (Ipp8u)(m_nRegister>>24);
*(m_pbs+1) = (Ipp8u)(m_nRegister>>16);
*(m_pbs+2) = (Ipp8u)(m_nRegister>>8);
*(m_pbs+3) = (Ipp8u)m_nRegister;
m_pbs += 4;
m_nOutstandingBits -= m_nReadyBits;
m_nRegister = 0;
m_nReadyBits = 32;
while( m_nOutstandingBits >= 32 ){
*(m_pbs) = 0;
*(m_pbs+1) = 0;
*(m_pbs+2) = 0;
*(m_pbs+3) = 0;
m_pbs += 4;
m_nOutstandingBits -= 32;
}
}
if( m_nOutstandingBits == 0 ) return;
m_nRegister <<= m_nOutstandingBits;
m_nRegister &= (Ipp32u)0xffffffff << m_nOutstandingBits;
m_nReadyBits -= m_nOutstandingBits;
if( 0 == m_nReadyBits ){
*(m_pbs) = (Ipp8u)(m_nRegister>>24);
*(m_pbs+1) = (Ipp8u)(m_nRegister>>16);
*(m_pbs+2) = (Ipp8u)(m_nRegister>>8);
*(m_pbs+3) = (Ipp8u)m_nRegister;
m_pbs += 4;
m_nRegister = 0;
m_nReadyBits = 32;
}
m_nOutstandingBits = 0;
}
void CBaseBitstream::EncodeSingleBin_CABAC(Ipp32s ctxIdx, bool code)
{
Ipp32u &pStateIdx = context_array[ctxIdx].pStateIdx;
bool &valMPS = context_array[ctxIdx].valMPS;
#ifdef STORE_CABAC_BITS
Ipp16u preStateIdx = context_array[ctxIdx].pStateIdx;
bool prevalMPS = context_array[ctxIdx].valMPS;
#endif
#if defined PRINT_CABAC_RANGE
if(print_cabac_range) {
printf("0x%04x\n", m_lcodIRange);
}
#endif // PRINT_CABAC_RANGE
Ipp32u &codIOffset = m_lcodIOffset;
Ipp32u &codIRange = m_lcodIRange;
Ipp32u qCodIRangeIdx;
Ipp32u codIRangeLPS;
qCodIRangeIdx = ((codIRange >> 6) & 0x03);
codIRangeLPS = rangeTabLPS[pStateIdx][qCodIRangeIdx];
codIRange -= codIRangeLPS;
if (code != valMPS )
{
codIOffset += codIRange;
codIRange = codIRangeLPS;
if (0 == pStateIdx)
valMPS = !valMPS;
pStateIdx = transIdxLPS[pStateIdx];
}
else
pStateIdx = transIdxMPS[pStateIdx];
/* renormalisation */
while (codIRange < ENC_QUARTER_RANGE)
{
if (codIOffset >= ENC_HALF_RANGE){
// WriteOutstandingBit_CABAC(1);
WriteOutstandingOneBit_CABAC();
codIOffset -= ENC_HALF_RANGE;
}
else
if (codIOffset < ENC_QUARTER_RANGE){
// WriteOutstandingBit_CABAC(0);
WriteOutstandingZeroBit_CABAC();
}
else
{
m_nOutstandingBits++;
codIOffset -= ENC_QUARTER_RANGE;
}
codIOffset <<= 1;
codIRange <<= 1;
}
m_nSymCnt++;
#ifdef STORE_CABAC_BITS
sym_cnt++;
if(cabac_bits==NULL) cabac_bits=vm_file_open(__CABAC_FILE__,VM_STRING("w+t"));
if(cabac_bits)
// fprintf(cabac_bits,"sb %d %d %d %d %d\n",ctxIdx,
// codIRange,
//codIOffset,
//code,m_nSymCnt);
fprintf(cabac_bits,"sb %d %d %d %d %d %d %d\n",ctxIdx,preStateIdx,prevalMPS,pStateIdx,valMPS,code,sym_cnt);
#endif
}; //void CBaseBitstream::EncodeSingleBin_CABAC(Ipp32s ctxIdx)
void CBaseBitstream::EncodeFinalSingleBin_CABAC(bool code)
{
Ipp32u &codIOffset = m_lcodIOffset;
Ipp32u &codIRange = m_lcodIRange;
codIRange -=2;
if (code)
{
codIOffset += codIRange ;
codIRange = 2;
}
/* renormalisation */
while (codIRange < ENC_QUARTER_RANGE)
{
if (codIOffset >= ENC_HALF_RANGE){
//WriteOutstandingBit_CABAC(1);
WriteOutstandingOneBit_CABAC();
codIOffset -= ENC_HALF_RANGE;
}
else
if (codIOffset < ENC_QUARTER_RANGE){
// WriteOutstandingBit_CABAC(0);
WriteOutstandingZeroBit_CABAC();
}
else
{
m_nOutstandingBits++;
codIOffset -= ENC_QUARTER_RANGE;
}
codIOffset <<= 1;
codIRange <<= 1;
}
m_nSymCnt++;
#ifdef STORE_CABAC_BITS
sym_cnt++;
if(cabac_bits==NULL) cabac_bits=vm_file_open(__CABAC_FILE__,VM_STRING("w+t"));
if(cabac_bits)
//fprintf(cabac_bits,"fsb %d %d %d %d\n",
//codIRange,
//codIOffset,
//code,m_nSymCnt);
fprintf(cabac_bits,"fsb %d %d\n",code,sym_cnt);
#endif
return;
}; //void CBaseBitstream::EncodeSingleBin_CABAC(bool code)
void CBaseBitstream::EncodeBypass_CABAC(bool code)
{
Ipp32u &codIOffset = m_lcodIOffset;
Ipp32u &codIRange = m_lcodIRange;
codIOffset*=2;
if (code)
codIOffset += codIRange;
if (codIOffset >= ENC_FULL_RANGE){
//WriteOutstandingBit_CABAC(1);
WriteOutstandingOneBit_CABAC();
codIOffset -= ENC_FULL_RANGE;
}
else
if (codIOffset < ENC_HALF_RANGE)
{
WriteOutstandingZeroBit_CABAC();
//WriteOutstandingBit_CABAC(0);
}
else
{
m_nOutstandingBits++;
codIOffset -= ENC_HALF_RANGE;
}
m_nSymCnt++;
#ifdef STORE_CABAC_BITS
sym_cnt++;
if(cabac_bits==NULL) cabac_bits=vm_file_open(__CABAC_FILE__,VM_STRING("w+t"));
if(cabac_bits)
fprintf(cabac_bits,"bp %d %d\n",code,sym_cnt);
#endif
return;
}
#define FlushBitStream_CABAC while (m_nReadyBits!=8) WriteBit_CABAC(0)
void CBaseBitstream::TerminateEncode_CABAC()
{
Ipp32u &codIOffset = m_lcodIOffset;
WriteOutstandingBit_CABAC((codIOffset >> (ENC_B_BITS-1)) & 1);
WriteBit_CABAC((codIOffset >> (ENC_B_BITS-2))&1);
WriteBit_CABAC(1);
//FlushBitStream_CABAC;
while( m_nReadyBits & 7 ){
m_nRegister <<= 1;
m_nRegister |= (Ipp32s)0;
m_nReadyBits --;
}
switch( m_nReadyBits>>3 ){
case 0:
*(m_pbs) = (Ipp8u)((Ipp32u)m_nRegister>>24);
*(m_pbs+1) = (Ipp8u)(m_nRegister>>16);
*(m_pbs+2) = (Ipp8u)(m_nRegister>>8);
*(m_pbs+3) = (Ipp8u)(m_nRegister);
m_pbs += 4;
break;
case 1:
*(m_pbs) = (Ipp8u)(m_nRegister>>16);
*(m_pbs+1) = (Ipp8u)(m_nRegister>>8);
*(m_pbs+2) = (Ipp8u)(m_nRegister);
m_pbs += 3;
break;
case 2:
*(m_pbs) = (Ipp8u)(m_nRegister>>8);
*(m_pbs+1) = (Ipp8u)(m_nRegister);
m_pbs += 2;
break;
case 3:
*(m_pbs++) = (Ipp8u)(m_nRegister);
break;
}
m_nRegister = 0;
m_nReadyBits = 32;
//ByteAlignWithZeros();
};
void CBaseBitstream::EncodeUnaryRepresentedSymbol_CABAC(Ipp32s ctxBase,
Ipp32s ctxIdx,
Ipp32s code,
Ipp32s suppremum)
{
if (code==0)
{
EncodeSingleBin_CABAC(ctxBase, 0);
}
else
{
EncodeSingleBin_CABAC(ctxBase, 1);
Ipp32s temp=code;
while ((--temp)>0)
EncodeSingleBin_CABAC(ctxBase+ctxIdx, 1);
if (code<suppremum)
EncodeSingleBin_CABAC(ctxBase+ctxIdx, 0);
}
}
void CBaseBitstream::EncodeExGRepresentedSymbol_CABAC(Ipp32s code, Ipp32s log2ex)
{
for (;;)
{
if (code>= (1<<log2ex))
{
EncodeBypass_CABAC(1);
code -= (1<<log2ex);
log2ex++;
}
else
{
EncodeBypass_CABAC( 0);
while (log2ex--)
EncodeBypass_CABAC((code>>log2ex)&1);
return;
}
}
}
void CBaseBitstream::EncodeExGRepresentedLevels_CABAC(Ipp32s ctxIdx, Ipp32s code)
{
Ipp32s tempval,tempindex;
if (code==0)
{
EncodeSingleBin_CABAC(ctxIdx, 0);
return;
}
else
{
EncodeSingleBin_CABAC(ctxIdx, 1);
tempval=code;
tempindex=1;
while (((--tempval)>0) && (++tempindex <= 13))
EncodeSingleBin_CABAC(ctxIdx, 1);
if (code < 13)
{
EncodeSingleBin_CABAC(ctxIdx, 0); ;
}
else
{
EncodeExGRepresentedSymbol_CABAC(code-13,0);
}
}
}
void CBaseBitstream::EncodeExGRepresentedMVS_CABAC(Ipp32s ctxIdx,
Ipp32s code,
Ipp32s supp)
{
Ipp32s tempval,tempindex;
Ipp32s bin=1;
Ipp32s inc;
if (code==0)
{
EncodeSingleBin_CABAC(ctxIdx, 0);
return;
}
else
{
EncodeSingleBin_CABAC(ctxIdx, 1);
tempval=code;
tempindex=1;
inc=1;
while (((--tempval)>0) && (++tempindex <= 8))
{
EncodeSingleBin_CABAC(ctxIdx+inc, 1);
if ((++bin)==2) inc++;
if (bin==supp) inc++;
}
if (code < 8)
{
EncodeSingleBin_CABAC(ctxIdx+inc, 0); ;
}
else
{
EncodeExGRepresentedSymbol_CABAC(code-8,3);
}
}
}
const Ipp8s Table_9_34[3][63] =
{
{0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5, 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9, 10, 9, 8, 7, 7, 6, 11, 12, 13, 11, 6, 7, 8, 9, 14, 10, 9, 8, 6, 11, 12, 13, 11, 6, 9, 14, 10, 9, 11, 12, 13, 11, 14, 10, 12 },
{0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5, 6, 9, 10, 10, 8, 11, 12, 11, 9, 9, 10, 10, 8, 11, 12, 11, 9, 9, 10, 10, 8, 11, 12, 11, 9, 9, 10, 10, 8, 13, 13, 9, 9, 10, 10, 8, 13, 13, 9, 9, 10, 10, 14, 14, 14, 14, 14 },
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8 }
};
} //namespace UMC_H264_ENCODER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -