📄 umc_base_bitstream.cpp
字号:
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 + -