视频编码SVC --- JSVM代码阅读笔记(四)

本文详细介绍了SVC视频编码中LayerEncoder的xEncodeLayerRepresentation和SliceEncoder的encodeSliceSVC函数,包括参数解析、编码过程及宏块编码的关键步骤,如熵编码初始化、运动估计、残差处理和率失真优化,揭示了SVC编码的内部工作机制。
摘要由CSDN通过智能技术生成

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 NalUnitlist

  PicOutputDataList       acPicOutputDataList     [16];

 

//对每个SliceGroup

  //对每个Slice

设置每个Slice的起止宏块

 

//当发nal_unit_type=1/5NAL单元时,必然会先发一个nal_unit_type=14prefix 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()

 

把临时的NALUNITlist cTmpExtBinDataAccessorList分别存入不同的MGSVectorNALUNIT list

acExtBinDataAccessorList[iMGSIdx]

 

//所有SliceGroup编码完毕后

每个MGSVectorlist连接起来到输出list  =rcAccessUnitData.getNalUnitList() =

 

EL SCoeff

TCoeff

m_pcSliceEncoder->updatePictureResTransform( rcControlData, m_uiFrameWidthInMb )

根据当前宏块和BL宏块的关系(CBPMbMode等)更新QPTransformSize

m_pcSliceEncoder->updatePictureAVCRewrite( rcControlData, m_uiFrameWidthInMb )

BaseLayer继承MbMode/IntraPredMode,修改TransformSizeQp

 


 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值