下面分析slicetypeDecide的方法的调用:
1.创建PreLookaheadGroup,主要的功能是
PreLookaheadGroup pre(*this);
下面是获取输入列表中,bframes+2个帧到list链表中:
int j;
for (j = 0; j < m_param->bframes + 2; j++)
{
if (!curFrame) break;
list[j] = curFrame;
curFrame = curFrame->m_next;
}
下面的这段代码的功能是:
frames数组中,第一个位置保持上一个非B帧,后续保存当前输入queue中,maxsearch个帧的低分辨率图像。
如果m_lowresInit为false的话,并把这些低分辨率的图像设置到了preLookahead中:
curFrame = m_inputQueue.first();
frames[0] = m_lastNonB;
for (j = 0; j < maxSearch; j++)
{
if (!curFrame) break;
frames[j + 1] = &curFrame->m_lowres;
if (!curFrame->m_lowresInit)
pre.m_preframes[pre.m_jobTotal++] = curFrame;
curFrame = curFrame->m_next;
}
maxSearch = j;
下面进行的PreLookaheadGroup中task的执行:
if (pre.m_jobTotal)
{
if (m_pool)
pre.tryBondPeers(*m_pool, pre.m_jobTotal);
pre.processTasks(-1);
pre.waitForExit();
}
processTasks其中的关键调用如下:
preFrame->m_lowres.init(preFrame->m_fencPic, preFrame->m_poc);
if (m_lookahead.m_bAdaptiveQuant)
tld.calcAdaptiveQuantFrame(preFrame, m_lookahead.m_param);