//++ 以下是對當前宏塊進行編碼(這里的編碼主要目的是為了計算按當前組合方式編碼
//++ 生成碼流的大小,因此編碼前要保存當前編碼狀態,編碼完成后必須恢復現場)
//=====?? S T O R E?? C O D I N G?? S T A T E?? =====
//---------------------------------------------------
store_coding_state (cs_cm); //++ 保存當前編碼狀態
經常會看到store_coding_state所以有的時候很不明白到底為什么要保存當前編碼狀態。
今天看到firstime老大的注釋,我也些許明白了點。因為在編碼前要保存當前編碼狀態,這樣編碼完成后才能恢復現場。
看下代碼吧
* /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 ===重要的數據內容數組的一些變量
//only one partition for IDR img對于IDR圖像只有一個分區
for (i = 0; i <(img->currentPicture->idr_flag? 1:cs->no_part); i++)//如果是IDR則只執行一次,其他的執行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 ===儲存算術編碼的上下文
??? memcpy (mc_dest, mc_src, sizeof(MotionInfoContexts));
??? memcpy (tc_dest, tc_src, sizeof(TextureInfoContexts));
}
else
{
??? //=== important variables of data partition array ===在數據塊重要的變量
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 ===語法元素的成員和位數
cs->currSEnr = currMB->currSEnr;
memcpy (cs->bitcounter, currMB->bitcounter, MAX_BITCOUNTER_MB*sizeof(int));
//=== elements of current macroblock ===儲存元素和現在的宏塊
memcpy (cs->mvd, currMB->mvd, 2*2*BLOCK_MULTIPLE*BLOCK_MULTIPLE*sizeof(int));
cs->cbp_bits = currMB->cbp_bits;