sps及pps在解码器内传递过程

首先解码器中有一个全局变量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,
对应C0,第一个解码

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内有调用。

你可能感兴趣的:(PS)