store_coding_state (cs_cm)的作用
//++ 以下是對當(dāng)前宏塊進(jìn)行編碼(這里的編碼主要目的是為了計算按當(dāng)前組合方式編碼
//++ 生成碼流的大小,因此編碼前要保存當(dāng)前編碼狀態(tài),編碼完成后必須恢復(fù)現(xiàn)場)
//=====?? S T O R E?? C O D I N G?? S T A T E?? =====
//---------------------------------------------------
store_coding_state (cs_cm); //++ 保存當(dāng)前編碼狀態(tài)
經(jīng)常會看到store_coding_state所以有的時候很不明白到底為什么要保存當(dāng)前編碼狀態(tài)。
今天看到firstime老大的注釋,我也些許明白了點。因為在編碼前要保存當(dāng)前編碼狀態(tài),這樣編碼完成后才能恢復(fù)現(xiàn)場。
看下代碼吧
* /brief
*??? store coding state (for rd-optimized mode decision)
void
store_coding_state (CSptr cs)
{
int i;
EncodingEnvironment *ee_src, *ee_dest;
Bitstream??????????? *bs_src, *bs_dest;
MotionInfoContexts?? *mc_src = img->currentSlice->mot_ctx;
TextureInfoContexts *tc_src = img->currentSlice->tex_ctx;
MotionInfoContexts?? *mc_dest = cs->mot_ctx;
TextureInfoContexts *tc_dest = cs->tex_ctx;
Macroblock?????????? *currMB = &(img->mb_data [img->current_mb_nr]);
if (!input->rdopt) return;//如果不是RDO,則返回
if (cs->symbol_mode==CABAC)
{
//=== important variables of data partition array ===重要的數(shù)據(jù)內(nèi)容數(shù)組的一些變量
//only one partition for IDR img對于IDR圖像只有一個分區(qū)
for (i = 0; i <(img->currentPicture->idr_flag? 1:cs->no_part); i++)//如果是IDR則只執(zhí)行一次,其他的執(zhí)行no_part次
{
??? ee_src = &(img->currentSlice->partArr[i].ee_cabac);
??? bs_src =?? img->currentSlice->partArr[i].bitstream;
??? ee_dest = &(cs->encenv?? [i]);
??? bs_dest = &(cs->bitstream[i]);
??? memcpy (ee_dest, ee_src, sizeof(EncodingEnvironment));
??? memcpy (bs_dest, bs_src, sizeof(Bitstream));
}
//=== contexts for binary arithmetic coding ===儲存算術(shù)編碼的上下文
??? memcpy (mc_dest, mc_src, sizeof(MotionInfoContexts));
??? memcpy (tc_dest, tc_src, sizeof(TextureInfoContexts));
}
else
{
??? //=== important variables of data partition array ===在數(shù)據(jù)塊重要的變量
for (i = 0; i <(img->currentPicture->idr_flag? 1:cs->no_part); i++)
{???
??? bs_src =?? img->currentSlice->partArr[i].bitstream;??
??? bs_dest = &(cs->bitstream[i]);
????? memcpy (bs_dest, bs_src, sizeof(Bitstream));
??? }
}
//=== syntax element number and bitcounters ===語法元素的成員和位數(shù)
cs->currSEnr = currMB->currSEnr;
memcpy (cs->bitcounter, currMB->bitcounter, MAX_BITCOUNTER_MB*sizeof(int));
//=== elements of current macroblock ===儲存元素和現(xiàn)在的宏塊
memcpy (cs->mvd, currMB->mvd, 2*2*BLOCK_MULTIPLE*BLOCK_MULTIPLE*sizeof(int));
cs->cbp_bits = currMB->cbp_bits;
總結(jié)
以上是生活随笔為你收集整理的store_coding_state (cs_cm)的作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [C#] Direct2D 学习笔记 (
- 下一篇: 帧间、帧内像素块预测