H264AVCEncoder::process( ExtBinDataAccessorList& rcExtBinDataAccessorList,
PicBuffer* apcOriginalPicBuffer [MAX_LAYERS], //每层的原始帧
PicBuffer* apcReconstructPicBuffer [MAX_LAYERS], //每层的重建帧
PicBufferList* apcPicBufferOutputList, //输出图像List
PicBufferList* apcPicBufferUnusedList ) //未使用图像List
这个H264AVCEncoder是H264AVCEncoderTest的CreaterH264AVCEncoder的SVC编码器H264AVCEncoder
//每一层的原始帧apcOriginalPicBufferèH264AVCEncoder::PicBufferList m_acOrgPicBufferList[MAX_LAYERS]
//每一层的重建帧apcReconstructPicBuffer èH264AVCEncoder::PicBufferList m_acRecPicBufferList[MAX_LAYERS]
关联Org和Rec图像List!!!!!!!!!!!!!!!!!!!!!!
//当读到了一个GOP数量的帧时,进行编码------------------并不是读完所有帧才编码
xProcessGOP( apcPicBufferOutputList, apcPicBufferUnusedList )
//对每一层 这里都是每一层!!!!!!!!!!!!!!!!!!!!!!!!!!! //设置D_id和Q_id
//从m_cAccessUnitDataList弄出一个AU,读取对应层的原始帧 m_apcLayerEncoder[uiLayer]->initGOP( m_cAccessUnitDataList.getAccessUnitData( MSYS_UINT_MAX ), m_acOrgPicBufferList[uiLayer] ) 注意 这是LayerEncoder
xInitGOP ( rcPicBufferInputList ) ---------------------------initGOP----------START-------------------
xSetScalingFactors () //对每个时间层 xSetScalingFactors( uiLevel ) //设定每帧的ScalingFactor
xClearELPics () //让所有EL的参考层不可用 m_papcELFrame[uiIndex]->setUnvalid()
//如果已经编码了GOP,则从前面的GOP中拷贝出重建的最后一帧 xEncodePicture( bPicCoded, 0, 0, rcAccessUnitData, rcPicBufferInputList ) m_pcAnchorFrameReconstructed à m_papcFrame[ uiFrameIdInGOP ] m_apcBaseFrame[1]à m_apcBaseFrame[0]
---------------------------initGOP----------END-----------------------------
//一个GOP中最多允许的65个AU,对每一个AU //对每一层 m_apcLayerEncoder[uiLayer]->process( uiAUIndex, m_cAccessUnitDataList.getAccessUnitData( uiAUIndex ), //没找到对应号就新建 m_acOrgPicBufferList [uiLayer], m_acRecPicBufferList [uiLayer], apcPicBufferUnusedList[uiLayer], m_pcParameterSetMng ) ); 后面分析 GOP中一个AU的一层 //如果是第一个GOP,还要设置Profile和LevelIdc及ConstraintXFlag
//对每一层 把重建队列m_acRecPicBufferList[ uiLayer ]里的帧给输出队列apcPicBufferOutputList[ uiLayer ] (go()里) m_acOrgPicBufferList[ uiLayer ]和m_acRecPicBufferList[ uiLayer ]都给apcPicBufferUnusedList[ uiLayer ] (go()里) 清空原始和重建队列 |
//把编码得到的NalUnit写到传入参数rcExtBinDataAccessorList中
m_cAccessUnitDataList.emptyNALULists( rcExtBinDataAccessorList );