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

📄 umc_base_bitstream.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    else
    {
        lpContext->pStateIdx = static_cast<Ipp32s> (preCtxState - 64);
        lpContext->valMPS = 1;
    }
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
    if(cabac_bits==NULL) cabac_bits=vm_file_open(__CABAC_FILE__,"w+t");
    if(cabac_bits)
        fprintf(cabac_bits,"ctx_ini %d %d %d\n",ctxIdx,lpContext->pStateIdx,lpContext->valMPS);
#endif
#endif

} //void InitializeContext(CABAC_CONTEXT *lpContext, Ipp32s m, Ipp32s n, Ipp32s SliceQPy)

void CBaseBitstream::SaveContext_CABAC()
{
    memcpy( &context_array_copy[0], &context_array[0], 460*sizeof(CABAC_CONTEXT));
    m_lcodIRange_copy = m_lcodIRange;
    m_lcodIOffset_copy = m_lcodIOffset;
    m_nRegister_copy = m_nRegister;
    m_nReadyBits_copy = m_nReadyBits;
    m_nOutstandingBits_copy = m_nOutstandingBits;
    m_nSymCnt_copy = m_nSymCnt;
}

void CBaseBitstream::RestoreContext_CABAC()
{
    memcpy( &context_array[0], &context_array_copy[0], 460*sizeof(CABAC_CONTEXT));
    m_lcodIRange = m_lcodIRange_copy;
    m_lcodIOffset = m_lcodIOffset_copy;
    m_nRegister = m_nRegister_copy;
    m_nReadyBits = m_nReadyBits_copy;
    m_nOutstandingBits = m_nOutstandingBits_copy;
    m_nSymCnt = m_nSymCnt_copy;
}

void CBaseBitstream::CopyContext_CABAC( CBaseBitstream& bstrm )
{
    memcpy( &context_array[0], &bstrm.context_array[0], 460*sizeof(CABAC_CONTEXT));
    m_lcodIRange = bstrm.m_lcodIRange;
    m_lcodIOffset = bstrm.m_lcodIOffset;
    m_nRegister = bstrm.m_nRegister;
    m_nReadyBits = bstrm.m_nReadyBits;
    m_nOutstandingBits = bstrm.m_nOutstandingBits;
    m_nSymCnt = bstrm.m_nSymCnt;
}


void CBaseBitstream::InitializeContextVariablesIntra_CABAC(Ipp32s SliceQPy)
{
    Ipp32s l;

    // See subclause 9.3.1.1 of H.264 standard

    SliceQPy = Clip3(0, 51, SliceQPy);

    // Initialize context(s) for mb_type (SI & I slices)
    for (l = 0;l <= 10;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_0_10[l - 0].m,
                          M_and_N_for_ctxIdx_0_10[l - 0].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                        );
    };

    // Initialize context(s) for mb_qp_delta &
    // intra_chroma_pred_mode & prev_intra4x4_pred_mode_flag &
    // rem_intra4x4_pred_mode
    for (l = 60;l <= 69;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_60_69[l - 60].m,
                          M_and_N_for_ctxIdx_60_69[l - 60].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                        );
    };

    // Initialize context(s) for mb_field_decoding_flag &
    // coded_block_pattern(luma) & coded_block_pattern(chroma) &
    // coded_block_flag (SI & I slices)
    for (l = 70;l <= 104;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_70_104_intra[l - 70].m,
                          M_and_N_for_ctxIdx_70_104_intra[l - 70].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initalize context(s) for significant_coeff_flag[] (frame coded)
    for (l = 105;l <= 165;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_105_165_intra[l - 105].m,
                          M_and_N_for_ctxIdx_105_165_intra[l - 105].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initalize context(s) for last_significant_coeff_flag[] (frame coded)
    for (l = 166;l <= 226;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_166_226_intra[l - 166].m,
                          M_and_N_for_ctxIdx_166_226_intra[l - 166].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initalize context(s) for coeff_abs_level_minus1[]
    for (l = 227;l <= 275;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_227_275_intra[l - 227].m,
                          M_and_N_for_ctxIdx_227_275_intra[l - 227].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // ctxIdx equal to 276 is associated the end_of_slice_flag
    // Initial values associated with ctxIdx equal to 276
    // are specified to be pStateIdx = 63 and valMPS = 0
    context_array[276].pStateIdx = 63;
    context_array[276].valMPS = 0;

    // Initalize context(s) for significant_coeff_flag[] (field coded)
    for (l = 277;l <= 337;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_277_337_intra[l - 277].m,
                          M_and_N_for_ctxIdx_277_337_intra[l - 277].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initalize context(s) for last_significant_coeff_flag[] (field coded)
    for (l = 338;l <= 398;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_338_398_intra[l - 338].m,
                          M_and_N_for_ctxIdx_338_398_intra[l - 338].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    for (l = 399;l <= 401;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_399_401_intra[l - 399].m,
                          M_and_N_for_ctxIdx_399_401_intra[l - 399].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };
    for (l = 402;l <= 459;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_402_459_intra[l - 402].m,
                          M_and_N_for_ctxIdx_402_459_intra[l - 402].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };
    ResetBitStream_CABAC();
} //void H264Bitstream::InitializeContextVariablesIntra_CABAC(Ipp32s SliceQPy)

void CBaseBitstream::InitializeContextVariablesInter_CABAC(Ipp32s SliceQPy,
                                                           Ipp32s cabac_init_idc)
{
    Ipp32s l;

    // See subclause 9.3.1.1 of H.264 standard

    SliceQPy = Clip3(0, 51, SliceQPy);
    // Initialize context(s) for mb_skip_flag & mb_type (P & SP slices)
    // & sub_mb_pred (P & SP slices)
    for (l = 11;l <= 23;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_11_23[l - 11][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_11_23[l - 11][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initialize context(s) for mb_skip_flag & mb_type (B slices)
    // & sub_mb_pred (B slices)
    for (l = 24;l <= 39;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_24_39[l - 24][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_24_39[l - 24][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initialize context(s) for mvd_10 & mvd_11
    for (l = 40;l <= 53;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_40_53[l - 40][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_40_53[l - 40][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initialize context(s) for ref_idx_10 & ref_idx_11
    for (l = 54;l <= 59;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_54_59[l - 54][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_54_59[l - 54][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initialize context(s) for mb_qp_delta &
    // intra_chroma_pred_mode & prev_intra4x4_pred_mode_flag &
    // rem_intra4x4_pred_mode
    for (l = 60;l <= 69;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_60_69[l - 60].m,
                          M_and_N_for_ctxIdx_60_69[l - 60].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initalize context(s) for mb_field_decoding_flag &
    // coded_block_pattern(luma) & coded_block_pattern(chroma) &
    // coded_block_flag (P, SP & B slices)
    for (l = 70;l <= 104;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_70_104_inter[l - 70][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_70_104_inter[l - 70][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initalize context(s) for significant_coeff_flag[] (frame coded)
    for (l = 105;l <= 165;l += 1)
    {
        InitializeContext(    &(context_array[l]),
                          M_and_N_for_ctxIdx_105_165_inter[l - 105][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_105_165_inter[l - 105][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    }

    // Initalize context(s) for last_significant_coeff_flag[] (frame coded)
    for (l = 166;l <= 226;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_166_226_inter[l - 166][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_166_226_inter[l - 166][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initalize context(s) for coeff_abs_level_minus1[]
    for (l = 227;l <= 275;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_227_275_inter[l - 227][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_227_275_inter[l - 227][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initalize context(s) for significant_coeff_flag[] (field coded)
    for (l = 277;l <= 337;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_277_337_inter[l - 277][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_277_337_inter[l - 277][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    // Initalize context(s) for last_significant_coeff_flag[] (field coded)
    for (l = 338;l <= 398;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_338_398_inter[l - 338][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_338_398_inter[l - 338][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };

    for (l = 399;l <= 401;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_399_401_inter[l - 399][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_399_401_inter[l - 399][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };
    for (l = 402;l <= 459;l += 1)
    {
        InitializeContext(&(context_array[l]),
                          M_and_N_for_ctxIdx_402_459_inter[l - 402][cabac_init_idc].m,
                          M_and_N_for_ctxIdx_402_459_inter[l - 402][cabac_init_idc].n,
                          SliceQPy
#ifdef STORE_CABAC_BITS
#ifdef CABAC_CONTEXTS_COMP
                         ,l
#endif
#endif
                         );
    };
    ResetBitStream_CABAC();
} //void H264Bitstream::InitializeContextVariablesInter_CABAC(Ipp32s SliceQPy, Ipp32s cabac_init_idc)

void CBaseBitstream::ResetBitStream_CABAC(void)
{
    m_lcodIRange=ENC_HALF_RANGE-2;
    m_lcodIOffset = 0;
    m_nRegister = 0;
    m_nReadyBits = 33;
//    m_nReadyBits = 9;
    m_nOutstandingBits = 0;
    m_nSymCnt = 0;
    ByteAlignWithOnes();

}; //void CBaseBitstream::ResetBitStream_CABAC(void)

void CBaseBitstream::WriteBit_CABAC(bool code)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -