首先解碼器中有一個全局變量seq_parameter_set_rbsp_t SeqParSet[MAXSPS];
//++ MAXSPS=32,它是一個指向序列參數集的數組。
還有一個全局變量seq_parameter_set_rbsp_t *active_sps;主要為后續解碼所用。
解碼器先將碼流中的數據讀入臨時指針sps,之后存入全局變量數組SeqParSet,最后需要使用這些參數時,將SeqParSet中的數據讀入active_sps,同理pps。
整個過程如下:
case NALU_TYPE_SPS:
//NALU_TYPE_SPS=7,對應C=0,第一個解碼
ProcessSPS(nalu);
void ProcessSPS (NALU_t *nalu)
{
…………
seq_parameter_set_rbsp_t *sps = AllocSPS(); //++ 返回值為指向序列參數集的指針
…………
dummy = InterpretSPS (dp, sps); //在此函數里將碼流中的句法元素讀入sps
…………
MakeSPSavailable (sps->seq_parameter_set_id, sps);
}
void MakeSPSavailable (int id, seq_parameter_set_rbsp_t *sps)
{
assert (sps->Valid == TRUE);
memcpy (&SeqParSet[id], sps, sizeof (seq_parameter_set_rbsp_t));
//hainei_10_3_15_將讀入的sps存入全局變量數組SeqParSet,以備后用
}
UseParameterSet (currSlice->pic_parameter_set_id);
{
…………
sps =
&SeqParSet[PicParSet[PicParsetId].seq_parameter_set_id];
…………
activate_sps(sps);
…………
}//此函數在解碼IDR內有調用。