gopencoder.cpp
来自「SVC最新更新代码」· C++ 代码 · 共 1,714 行 · 第 1/5 页
CPP
1,714 行
apcRefFrameList1[ TOP_FIELD ] = ( NULL == pcRefFrameList1 ) ? NULL : &acRefFrameList1[0];
apcRefFrameList1[ BOT_FIELD ] = ( NULL == pcRefFrameList1 ) ? NULL : &acRefFrameList1[1];
apcRefFrameList0[ FRAME ] = pcRefFrameList0;
apcRefFrameList1[ FRAME ] = pcRefFrameList1;
if( m_pcBaseLayerFrame )
{
m_pcBaseLayerFrame->addFrameFieldBuffer();
apcBLFrame[0] = m_pcBaseLayerFrame->getPic( TOP_FIELD );
apcBLFrame[1] = m_pcBaseLayerFrame->getPic( BOT_FIELD );
}
}
else
{
RNOK( pcMCFrame->addFieldBuffer( ePicType ) );
apcRefFrameList0[ ePicType ] = pcRefFrameList0;
apcRefFrameList1[ ePicType ] = pcRefFrameList1;
}
//===== loop over macroblocks =====
const UInt uiMbNumber = rcSH.getMbInPic(); //TMM
for( UInt uiMbAddress = 0 ; uiMbAddress < uiMbNumber; uiMbAddress++ ) //TMM
{
MbDataAccess* pcMbDataAccess = NULL;
MbDataAccess* pcMbDataAccessBase = 0;
UInt uiMbY, uiMbX;
rcSH.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
if ( pcBaseMbDataCtrl )
{
RNOK( pcBaseMbDataCtrl ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX, bMbAff ) );
RNOK( m_pcYuvHalfPelBufferCtrl->initMb( uiMbY, uiMbX, bMbAff ) );
RNOK( m_pcMotionEstimation ->initMb( uiMbY, uiMbX, *pcMbDataAccess ) );
const PicType eMbPicType = pcMbDataAccess->getMbPicType();
pcMbDataAccess->setMbDataAccessBase(pcMbDataAccessBase);
pcMbEncoder->setBaseLayerRec( apcBLFrame[ eMbPicType - 1 ] );
RNOK( pcMbEncoder->compensatePrediction( *pcMbDataAccess,
pcMCFrame->getPic( eMbPicType ),
*apcRefFrameList0 [ eMbPicType ],
*apcRefFrameList1 [ eMbPicType ],
bCalcMv, bFaultTolerant) );
}
return Err::m_nOK;
}
ErrVal
LayerEncoder::xZeroIntraMacroblocks( Frame* pcFrame,
ControlData& rcCtrlData,
PicType ePicType )
{
MbDataCtrl* pcMbDataCtrl = rcCtrlData.getMbDataCtrl ();
SliceHeader* pcSliceHeader = rcCtrlData.getSliceHeader (ePicType);
RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, false, NULL ) );
YuvMbBuffer cZeroMbBuffer;
cZeroMbBuffer.setAllSamplesToZero();
const Bool bMbAff = pcSliceHeader->isMbaffFrame();
if( ePicType!=FRAME )
{
RNOK( pcFrame->addFieldBuffer ( ePicType ) );
}
else if( bMbAff )
{
RNOK( pcFrame->addFrameFieldBuffer() );
}
//===== loop over macroblocks =====
const UInt uiMbNumber = pcSliceHeader->getMbInPic(); //TMM
for( UInt uiMbAddress = 0 ; uiMbAddress < uiMbNumber; uiMbAddress++ ) //TMM
{
MbDataAccess* pcMbDataAccess = NULL;
UInt uiMbY, uiMbX;
pcSliceHeader->getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcYuvFullPelBufferCtrl->initMb ( uiMbY, uiMbX, bMbAff ) );
if( pcMbDataAccess->getMbData().isIntra() )
{
const PicType eMbPicType = pcMbDataAccess->getMbPicType();
pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer()->loadBuffer( &cZeroMbBuffer );
}
}
if( ePicType!=FRAME )
{
RNOK( pcFrame->removeFieldBuffer ( ePicType ) );
}
else if( bMbAff )
{
RNOK( pcFrame->removeFrameFieldBuffer() );
}
return Err::m_nOK;
}
ErrVal
LayerEncoder::xClipIntraMacroblocks( Frame* pcFrame,
ControlData& rcCtrlData,
Bool bClipAll,
PicType ePicType )
{
MbDataCtrl* pcMbDataCtrl = rcCtrlData.getMbDataCtrl ();
SliceHeader* pcSliceHeader = rcCtrlData.getSliceHeader( ePicType );
ROF( pcSliceHeader );
YuvPicBuffer* pcPicBuffer;
YuvMbBuffer cMbBuffer;
RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, false, NULL ) );
const Bool bMbAff = pcSliceHeader->isMbaffFrame();
if( ePicType!=FRAME )
{
RNOK( pcFrame->addFieldBuffer ( ePicType ) );
}
else if( bMbAff )
{
RNOK( pcFrame->addFrameFieldBuffer() );
}
//===== loop over macroblocks =====
const UInt uiMbNumber = pcSliceHeader->getMbInPic();//TMM
for( UInt uiMbAddress = 0 ; uiMbAddress < uiMbNumber; uiMbAddress++ )//TMM
{
MbDataAccess* pcMbDataAccess = 0;
UInt uiMbY, uiMbX;
pcSliceHeader->getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcYuvFullPelBufferCtrl->initMb ( uiMbY, uiMbX, bMbAff ) );
if( bClipAll || pcMbDataAccess->getMbData().isIntra() )
{
const PicType eMbPicType = pcMbDataAccess->getMbPicType();
pcPicBuffer = pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer();
cMbBuffer .loadBuffer( pcPicBuffer );
cMbBuffer .clip ();
pcPicBuffer->loadBuffer( &cMbBuffer );
}
}
if( ePicType!=FRAME )
{
RNOK( pcFrame->removeFieldBuffer ( ePicType ) );
}
else if( bMbAff )
{
RNOK( pcFrame->removeFrameFieldBuffer() );
}
return Err::m_nOK;
}
ErrVal
LayerEncoder::xInitExtBinDataAccessor( ExtBinDataAccessor& rcExtBinDataAccessor )
{
ROF( m_pucWriteBuffer );
m_cBinData.reset ();
m_cBinData.set ( m_pucWriteBuffer, m_uiWriteBufferSize );
m_cBinData.setMemAccessor ( rcExtBinDataAccessor );
return Err::m_nOK;
}
ErrVal
LayerEncoder::xAppendNewExtBinDataAccessor( ExtBinDataAccessorList& rcExtBinDataAccessorList,
ExtBinDataAccessor* pcExtBinDataAccessor )
{
ROF( pcExtBinDataAccessor );
ROF( pcExtBinDataAccessor->data() );
UInt uiNewSize = pcExtBinDataAccessor->size();
UChar* pucNewBuffer = new UChar [ uiNewSize ];
ROF( pucNewBuffer );
::memcpy( pucNewBuffer, pcExtBinDataAccessor->data(), uiNewSize * sizeof( UChar ) );
ExtBinDataAccessor* pcNewExtBinDataAccessor = new ExtBinDataAccessor;
ROF( pcNewExtBinDataAccessor );
m_cBinData .reset ();
m_cBinData .set ( pucNewBuffer, uiNewSize );
m_cBinData .setMemAccessor ( *pcNewExtBinDataAccessor );
rcExtBinDataAccessorList.push_back ( pcNewExtBinDataAccessor );
m_cBinData .reset ();
m_cBinData .setMemAccessor ( *pcExtBinDataAccessor );
return Err::m_nOK;
}
ErrVal
LayerEncoder::xAddBaseLayerResidual( ControlData& rcControlData,
Frame* pcFrame,
Bool bSubtract,
PicType ePicType )
{
ROFRS( rcControlData.getBaseLayerSbb(), Err::m_nOK );
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
SliceHeader* pcSliceHeader = rcControlData.getSliceHeader( ePicType );
Frame* pcBLResidual = rcControlData.getBaseLayerSbb();
YuvMbBuffer cBLResBuffer;
YuvMbBuffer cMbBuffer;
RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, false, NULL ) );
const Bool bMbAff = pcSliceHeader->isMbaffFrame();
if( ePicType!=FRAME )
{
RNOK( pcBLResidual->addFieldBuffer ( ePicType ) );
RNOK( pcFrame ->addFieldBuffer ( ePicType ) );
}
else if( bMbAff )
{
RNOK( pcBLResidual->addFrameFieldBuffer() );
RNOK( pcFrame ->addFrameFieldBuffer() );
}
//===== loop over macroblocks =====
const UInt uiMbNumber = pcSliceHeader->getMbInPic(); //TMM
for( UInt uiMbAddress = 0 ; uiMbAddress < uiMbNumber; uiMbAddress++ ) //TMM
{
MbDataAccess* pcMbDataAccess = NULL;
UInt uiMbY, uiMbX;
pcSliceHeader->getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcYuvFullPelBufferCtrl->initMb ( uiMbY, uiMbX, bMbAff ) );
if( ! pcMbDataAccess->getMbData().isIntra() && pcMbDataAccess->getMbData().getResidualPredFlag() )
{
const PicType eMbPicType = pcMbDataAccess->getMbPicType();
cMbBuffer .loadBuffer( pcFrame ->getPic( eMbPicType )->getFullPelYuvBuffer() );
cBLResBuffer.loadBuffer( pcBLResidual->getPic( eMbPicType )->getFullPelYuvBuffer() );
if( bSubtract ) cMbBuffer.subtract( cBLResBuffer );
else cMbBuffer.add ( cBLResBuffer );
RNOK( pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer()->loadBuffer( &cMbBuffer ) );
}
}
if( ePicType!=FRAME )
{
RNOK( pcBLResidual->removeFieldBuffer ( ePicType ) );
RNOK( pcFrame ->removeFieldBuffer ( ePicType ) );
}
else if( bMbAff )
{
RNOK( pcBLResidual->removeFrameFieldBuffer() );
RNOK( pcFrame ->removeFrameFieldBuffer() );
}
return Err::m_nOK;
}
ErrVal
LayerEncoder::xEncodeLowPassSignal( ExtBinDataAccessorList& rcOutExtBinDataAccessorList,
ControlData& rcControlData,
Frame* pcOrgFrame,
Frame* pcFrame,
Frame* pcResidual,
Frame* pcPredSignal,
UInt& ruiBits,
PicOutputDataList& rcPicOutputDataList,
UInt uiFrameIdInGOP,
PicType ePicType )
{
UInt uiBits = 0;
UInt uiBitsSEI = 0;
Frame* pcBaseLayerFrame = rcControlData.getBaseLayerRec ();
SliceHeader* pcSliceHeader = rcControlData.getSliceHeader ( ePicType );
ROF( pcSliceHeader );
ExtBinDataAccessorList cTmpExtBinDataAccessorList;
ExtBinDataAccessorList acExtBinDataAccessorList[16];
PicOutputDataList acPicOutputDataList [16];
//----- subsequence SEI -----
if( m_bWriteSubSequenceSei && m_bH264AVCCompatible )
{
RNOK( xWriteSEI( rcOutExtBinDataAccessorList, *pcSliceHeader, uiBitsSEI ) );
}
FMO* pcFMO = pcSliceHeader->getFMO();
for( UInt iSliceGroupID = 0; !pcFMO->SliceGroupCompletelyCoded( iSliceGroupID ); iSliceGroupID++ )
{
//JVT-X046 {
rcControlData.m_bSliceGroupAllCoded = false;
rcControlData.m_uiCurrentFirstMB = pcFMO->getFirstMacroblockInSlice( iSliceGroupID );
while( !rcControlData.m_bSliceGroupAllCoded )
{
if (!m_uiSliceMode)
{
rcControlData.m_bSliceGroupAllCoded = true;
}
//JVT-X046 }
pcSliceHeader->setFirstMbInSlice( rcControlData.m_uiCurrentFirstMB );
pcSliceHeader->setLastMbInSlice ( pcFMO->getLastMBInSliceGroup( iSliceGroupID ) );
// JVT-S054 (2) (ADD)
pcSliceHeader->setNumMbsInSlice ( pcFMO->getNumMbsInSlice( pcSliceHeader->getFirstMbInSlice(), pcSliceHeader->getLastMbInSlice() ) );
//prefix unit{{
if( m_uiPreAndSuffixUnitEnable )
{
// TMM {
if ( rcControlData.getSliceHeader( ePicType )->getNalUnitType() == NAL_UNIT_CODED_SLICE|| rcControlData.getSliceHeader( ePicType )->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR )
{
RNOK( xWritePrefixUnit( acExtBinDataAccessorList[0], *rcControlData.getSliceHeader( ePicType ), uiBits ) );
}
// TMM }
}
//prefix unit}}
//----- init NAL UNIT -----
RNOK( xInitExtBinDataAccessor ( m_cExtBinDataAccessor ) );
RNOK( m_pcNalUnitEncoder->initNalUnit( &m_cExtBinDataAccessor ) );
//---- write Slice Header -----
ETRACE_NEWSLICE;
xAssignSimplePriorityId( pcSliceHeader );
if( pcSliceHeader->get
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?