ErrVal
LayerEncoder::xEncodeLayerRepresentation(ExtBinDataAccessorList& rcOutExtBinDataAccessorList, // rcAccessUnitData.getNalUnitList()
ControlData& rcControlData, // m_pacControlData[ uiFrameIdInGOP ];
Frame* pcOrgFrame, // m_apcFrameTemp[ 2 ]
Frame* pcFrame, // m_papcFrame[ uiFrameIdInGOP ]
Frame* pcResidualLF, // m_pcResidualLF
Frame* pcResidualILPred, // m_pcResidualILPred
Frame* pcPredSignal, // m_apcFrameTemp[ 3 ];
UInt& ruiBits, // 计算编码比特数
PicOutputDataList& rcPicOutputDataList, // 输出图像list ,仅仅输出屏幕用
UInt uiFrameIdInGOP, // GOP内第几帧
PicType ePicType ) // FRAME
参数:
ExtBinDataAccessorList cTmpExtBinDataAccessorList; // 给closeAndAppendNalUnits 函数用的临时NALUNIT list
ExtBinDataAccessorList acExtBinDataAccessorList[16]; // 每个MGSVector 的NalUnit的list
PicOutputDataList acPicOutputDataList [16];
//对每个SliceGroup
//对每个Slice
设置每个Slice的起止宏块
//当发nal_unit_type=1/5的NAL单元时,必然会先发一个nal_unit_type=14的prefix NAL unit xWritePrefixUnit( acExtBinDataAccessorList[0], *pcSliceHeader, uiBits ) xInitExtBinDataAccessor (m_cExtBinDataAccessor ) //与LayerEncoder 中的BinData m_cBinData关联起来 m_pcNalUnitEncoder->initNalUnit( &m_cExtBinDataAccessor ) //m_cExtBinDataAccessor 是操纵LayerEncoder的比特流用的 现在与NalUnit关联了 m_pcBitWriteBuffer->initPacket( (UInt*)(m_pucTempBuffer), m_uiPacketLength-1 ) //初始化packet 对齐比特 //BitWriteBuffer 的m_pulStreamPacket 与NalUnitEncoder 的m_pucTempBuffer 联系起来了
m_pcNalUnitEncoder->writePrefix( rcSH ) rcSH.writePrefix( *m_pcHeaderSymbolWriteIf ) ); //写到了m_pcHeaderSymbolWriteIf变量中 m_pcNalUnitEncoder->closeNalUnit( uiBit ) ); //与NalUnitEncoder 脱离关系 数据仍在 m_cExtBinDataAccessor 中 xWriteTrailingBits() //写1000…补齐 m_pcBitWriteBuffer->flushBuffer() //把拖尾等最后的数据写入并计算bit convertRBSPToPayload( uiBits, uiHeaderBytes, m_pucBuffer, m_pucTempBuffer, m_uiPacketLength ) ); //加上0x03 xAppendNewExtBinDataAccessor( rcOutExtBinDataAccessorList, &m_cExtBinDataAccessor ) ); //把NalUnit数据存入List中
//初始化Slice数据的NalUnit xInitExtBinDataAccessor ( m_cExtBinDataAccessor ) //与LayerEncoder 中的BinData m_cBinData关联起来 m_pcNalUnitEncoder->initNalUnit( &m_cExtBinDataAccessor ) //同前面的PrefixNalUnit
m_pcNalUnitEncoder->write( *pcSliceHeader ) // 写SliceHeader
m_pcSliceEncoder->encodeSliceSVC( rcControlData, *pcOrgFrame, *pcFrame, pcResidualLF, pcResidualILPred, pcPredSignal, ePicType,m_uiNumMaxIter, m_uiIterSearchRange, m_bBiPred8x8Disable, m_bMCBlks8x8Disable,m_uiMaxDeltaQp, uiBits ) 后面分析
m_pcNalUnitEncoder->closeAndAppendNalUnits( auiBits, cTmpExtBinDataAccessorList, &m_cExtBinDataAccessor, m_cBinData, m_pcH264AVCEncoder, m_uiQualityLevelCGSSNR,m_uiLayerCGSSNR ) xWriteTrailingBits() //拖尾0 m_pcBitWriteBuffer->flushBuffer() //刷新比特流 convertRBSPToPayload( uiBytes, uiHeaderBytes, pucPayload, pucRBSP, uiPayloadBufferSize ) //如果有MGSVector,需要递归调用pcCurrentWriteBuffer去写比特流 m_pcBitWriteBuffer->uninit()
把临时的NALUNIT的list cTmpExtBinDataAccessorList分别存入不同的MGSVector的NALUNIT list acExtBinDataAccessorList[iMGSIdx]中 |
//所有SliceGroup编码完毕后
每个MGSVector的list连接起来到输出list =rcAccessUnitData.getNalUnitList() = 中
EL层 SCoeff |
TCoeff |
m_pcSliceEncoder->updatePictureResTransform( rcControlData, m_uiFrameWidthInMb ) 根据当前宏块和BL宏块的关系(CBP、MbMode等)更新QP和TransformSize等 |
m_pcSliceEncoder->updatePictureAVCRewrite( rcControlData, m_uiFrameWidthInMb ) 从BaseLayer继承MbMode/IntraPredMode,修改TransformSize和Qp等 |
ErrVal
SliceEncoder::encodeSliceSVC( ControlData& rcControlData, // control data
Frame& rcOrgFrame, // original frame
Frame& rcFrame, // reconstructed frame
Frame* pcResidualFrameLF, // reconstructed residual for loop filter Frame* pcResidualFrameILPred,// reconstructed residual for inter-layer prediction
Frame* pcPredFrame, // prediction signal
PicType ePicType, // picture type
UInt uiNumMaxIter, // maximum number of iteration for bi-predictive search
UInt uiIterSearchRange, // search range for iterative search
Bool bBiPred8x8Disable, // if bi-prediction for blocks smaller than 8x8 is allowed
Bool bMCBlks8x8Disable, // if blocks smaller than 8x8 are disabled
UInt uiMaxDeltaQp, // maximum delta QP
UInt& ruiBits // size of coded data
)
参数
pcBaseIntraRecFrame |
rcControlData.getBaseLayerRec() |
LayerEncoder的 m_pcBaseLayerFrame |
pcBaseResidualFrame |
rcControlData.getBaseLayerSbb() |
LayerEncoder的 m_pcBaseLayerResidual |
rcOrgPic |
rcOrgFrame.getPic( ePicType ) |
原始帧 |
rcPic |