encmain.cpp中开始编码的部分中有小循环遍历当前GOP内所有帧进行编码,从 keepLoop = encApp->encode();进入EncApp::encode()函数
bool EncApp::encode()这个是实际编码的函数,如果处理完整个GOP就将重建帧写入文件中,
const InputColourSpaceConversion snrCSC = ( !m_snrInternalColourSpace ) ? m_inputColourSpaceConvert : IPCOLOURSPACE_UNCHANGED;
bool keepDoing = false;
// call encoding function for one frame调用一帧的编码函数
if( m_isField )
{
keepDoing = m_cEncLib.encode( snrCSC, m_recBufList, m_numEncoded, m_isTopFieldFirst );
}
else
{
keepDoing = m_cEncLib.encode( snrCSC, m_recBufList, m_numEncoded );
}
//传输各个参数进编码器类下的编码函数encode()中,最后返回一个false值,赋给keepdoing, CSC:Colour Space Conversion 色彩空间转换,
m_isField:启用场编码
m_iFrameRcvd:接收帧的数目
m_framesToBeEncoded:编码帧数
从 keepDoing = m_cEncLib.encode( snrCSC, m_recBufList, m_numEncoded );进入EncLib::encode
#if JVET_O0756_CALCULATE_HDRMETRICS
m_metricTime = m_cEncLib.getMetricTime();
#endif
// output when the entire GOP was proccessed
if( !keepDoing )
{
// write bistream to file if necessary
if( m_numEncoded > 0 )
{
xWriteOutput( m_numEncoded, m_recBufList );
}
// temporally skip frames
if( m_temporalSubsampleRatio > 1 )
{
#if EXTENSION_360_VIDEO
m_cVideoIOYuvInputFile.skipFrames(m_temporalSubsampleRatio - 1, m_inputFileWidth, m_inputFileHeight,
m_inputChromaFormatIDC);
#else
const int sourceHeight = m_isField ? m_iSourceHeightOrg : m_sourceHeight;
m_cVideoIOYuvInputFile.skipFrames(m_temporalSubsampleRatio - 1, m_sourceWidth - m_sourcePadding[0],
sourceHeight - m_sourcePadding[1], m_inputChromaFormatIDC);
#endif
}
}
return keepDoing;