功能:令图像列表(m_cListPic)以实际播放的顺序(POC)排列
TComSlice::sortPicList(m_cListPic);
// 令图像列表以实际播放的顺序(POC)排列
Void TComSlice::sortPicList (TComList<TComPic*>& rcListPic)
{
TComPic* pcPicExtract;
TComPic* pcPicInsert;
TComList<TComPic*>::iterator iterPicExtract;
TComList<TComPic*>::iterator iterPicExtract_1;
TComList<TComPic*>::iterator iterPicInsert;
for (Int i = 1; i < (Int)(rcListPic.size()); i++)
{
iterPicExtract = rcListPic.begin(); // 令提取器的迭代器为图像列表的第一个
for (Int j = 0; j < i; j++)
{
iterPicExtract++; // 令提取器的迭代器(iterPicExtract)到达第i-1个值,即从0开始
}
pcPicExtract = *(iterPicExtract); // 提取第i-1个图像指针
pcPicExtract->setCurrSliceIdx(0); // 设置该图像的当前 slice id 为 0
iterPicInsert = rcListPic.begin(); // 令插入器的迭代器为图像列表的第一个
while (iterPicInsert != iterPicExtract) // 令提取器之前的图像的当前 slice id 为 0
{
pcPicInsert = *(iterPicInsert);
pcPicInsert->setCurrSliceIdx(0);
if (pcPicInsert->getPOC() >= pcPicExtract->getPOC()) // POC就是实际播放时的顺序
{
break;
}
iterPicInsert++;
}
// 上面的方式即是令i以及i之前的图像的当前 slice id 设为 0
// 同时 将实际播放顺序(POC)较大者放到当前图像之前
// 并保证不超过当前图像(iterPicInsert = iterPicExtract)
// 令 iterPicExtract_1 为 iterPicExtract(迭代器) + 1
iterPicExtract_1 = iterPicExtract;
iterPicExtract_1++;
// swap iterPicExtract and iterPicInsert, iterPicExtract = curr. / iterPicInsert = insertion position
rcListPic.insert (iterPicInsert, iterPicExtract, iterPicExtract_1);
rcListPic.erase (iterPicExtract);
/* eg: POC = 0,1,3,2,5
iter POC = 0,1,3(insert pos),2(extract pos),5
insert POC = 0,1,2(insert),3(insert pos),2(extract pos),5
erase POC = 0,1,2,3,5
...
*/
}
}