⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_base_bitstream.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -