📄 picencoder.cpp
字号:
// JVT-W040 just to make sure
if ( ! bInterPredFirst )
rpcSliceHeader->setDirectSpatialMvPredFlag ( true );
for( UInt uiList = 0; uiList < uiMaxLists; uiList++ )
{
ListIdx eListIdx = ListIdx( uiList );
// generate RPLR commands for inter-view prediciton pictures
RplrBuffer * pcRplrBufferInterView = new RplrBuffer;
RplrBuffer * pRplr = &rpcSliceHeader->getRplrBuffer( eListIdx );
UInt idx = 0;
Bool bInterViewRPLRStart = true;
for (idx=0; idx< pcSPSMVC->getNumRefsForListX (uiCurrViewId, eListIdx, bAnchor); idx++)
{
if(bInterViewRPLRStart)
pcRplrBufferInterView->set( idx, Rplr(RPLR_VIEW_NEG, 0));
else
pcRplrBufferInterView->set( idx, Rplr(RPLR_VIEW_POS, 0));
bInterViewRPLRStart = false;
}
pcRplrBufferInterView->set( idx, Rplr(RPLR_END));
// update the RPLR commands for all
UInt uiIndex = 0;
UInt uiIndexInterView =0;
if (bInterPredFirst)
{
while( RPLR_END != ( uiCommand = pRplr->get( uiIndex ).getCommand( uiIdentifier ) ) )
uiIndex++;
while( RPLR_END != ( uiCommand = pcRplrBufferInterView->get( uiIndexInterView).getCommand( uiIdentifier ) ) )
{
pRplr->set( uiIndex+uiIndexInterView, pcRplrBufferInterView->get( uiIndexInterView)) ;
uiIndexInterView++;
}
pRplr->set( uiIndex+uiIndexInterView, Rplr(RPLR_END));
if( uiIndex+uiIndexInterView > 0) pRplr->setRefPicListReorderingFlag (true);
}
else
{
while( RPLR_END != ( uiCommand = pcRplrBufferInterView->get( uiIndexInterView).getCommand( uiIdentifier ) ) )
uiIndexInterView++;
while( RPLR_END != ( uiCommand = pRplr->get( uiIndex ).getCommand( uiIdentifier ) ) )
{
pcRplrBufferInterView->set( uiIndex+uiIndexInterView, pRplr->get( uiIndex ));
uiIndex++;
}
pcRplrBufferInterView->set( uiIndex+uiIndexInterView, Rplr(RPLR_END));
uiIndexInterView = 0;
while( RPLR_END != ( uiCommand = pcRplrBufferInterView->get( uiIndexInterView).getCommand( uiIdentifier ) ) )
{
pRplr->set( uiIndexInterView, pcRplrBufferInterView->get( uiIndexInterView) );
uiIndexInterView++;
}
pRplr->set(uiIndexInterView, Rplr(RPLR_END));
if( uiIndexInterView >0) pRplr->setRefPicListReorderingFlag ( true ) ;
}
delete pcRplrBufferInterView;
}
return Err::m_nOK;
}
ErrVal
PicEncoder::xInitSliceHeader( SliceHeader*& rpcSliceHeader,
FrameSpec& rcFrameSpec,
Double& rdLambda,
Bool fakeHeader)
{
ROF( m_bInitParameterSets );
//===== create new slice header =====
if ( getAVCFlag() )
rpcSliceHeader = new SliceHeader( *m_pcSPSBase, *m_pcPPSBase );
else
rpcSliceHeader = new SliceHeader( *m_pcSPS, *m_pcPPS );
ROF( rpcSliceHeader );
//===== determine parameters =====
Double dQp = m_pcCodingParameter->getBasisQp() + m_pcCodingParameter->getDeltaQpLayer( rcFrameSpec.getTemporalLayer() );
Int iQp = min( 51, max( 0, (Int)dQp ) );
rdLambda = 0.85 * pow( 2.0, min( 52.0, dQp ) / 3.0 - 4.0 );
//===== set NAL unit header =====
rpcSliceHeader->setNalRefIdc ( rcFrameSpec.getNalRefIdc () );
rpcSliceHeader->setNalUnitType ( rcFrameSpec.getNalUnitType () );
rpcSliceHeader->setLayerId ( 0 );
rpcSliceHeader->setTemporalLevel ( rcFrameSpec.getTemporalLayer() );
rpcSliceHeader->setQualityLevel ( 0 );
rpcSliceHeader->setKeyPictureFlag ( rcFrameSpec.getTemporalLayer() == 0 );
rpcSliceHeader->setSimplePriorityId ( 0 );
rpcSliceHeader->setDiscardableFlag ( false );
rpcSliceHeader->setReservedZeroBit ( false ); //JVT-S036 //rpcSliceHeader->setExtensionFlag ( false );
rpcSliceHeader->setViewId(this->getViewId());
rpcSliceHeader->setAVCFlag( getAVCFlag()!=0); //JVT-W035
//===== set general parameters =====
rpcSliceHeader->setFirstMbInSlice ( 0 );
rpcSliceHeader->setLastMbInSlice ( m_uiMbNumber - 1 );
rpcSliceHeader->setSliceType ( rcFrameSpec.getSliceType () );
rpcSliceHeader->setFrameNum ( rcFrameSpec.getFrameNum () );
rpcSliceHeader->setNumMbsInSlice ( m_uiMbNumber );
rpcSliceHeader->setIdrPicId ( m_uiIdrPicId );
rpcSliceHeader->setDirectSpatialMvPredFlag ( true ); //JVT-W040
rpcSliceHeader->setBaseLayerId ( MSYS_UINT_MAX );
rpcSliceHeader->setBaseQualityLevel ( 3 );
rpcSliceHeader->setAdaptivePredictionFlag ( false );
rpcSliceHeader->setNoOutputOfPriorPicsFlag ( true );
rpcSliceHeader->setCabacInitIdc ( 0 );
rpcSliceHeader->setSliceHeaderQp ( iQp );
rpcSliceHeader->setFragmentedFlag ( false );
rpcSliceHeader->setFragmentOrder ( 0 );
rpcSliceHeader->setLastFragmentFlag ( true );
rpcSliceHeader->setBaseLayerUsesConstrainedIntraPred ( false );
rpcSliceHeader->setFgsComponentSep ( false );
#if JMVM_ONLY // JVT-U052
if(!rpcSliceHeader->getAVCFlag()) //JVT-W035
{
rpcSliceHeader->setIcEnable ( m_pcSliceEncoder->getIcEnable() );
rpcSliceHeader->setMotionSkip ( m_pcSliceEncoder->getMotionSkipFlag());
}
#endif //JMVM_ONLY // JVT-U052
//===== set deblocking filter parameters =====
if( rpcSliceHeader->getPPS().getDeblockingFilterParametersPresentFlag() )
{
rpcSliceHeader->getDeblockingFilterParameter().setDisableDeblockingFilterIdc( m_pcCodingParameter->getLoopFilterParams().getFilterIdc () );
rpcSliceHeader->getDeblockingFilterParameter().setSliceAlphaC0Offset ( 2*m_pcCodingParameter->getLoopFilterParams().getAlphaOffset () );
rpcSliceHeader->getDeblockingFilterParameter().setSliceBetaOffset ( 2*m_pcCodingParameter->getLoopFilterParams().getBetaOffset () );
}
//
rpcSliceHeader->setIDRFlag( (rcFrameSpec.getNalUnitType () == NAL_UNIT_CODED_SLICE_IDR ) ? true : false ); // JVT-W035
rpcSliceHeader->setSimplePriorityId( rpcSliceHeader->getViewId()== 0 ? rpcSliceHeader->getTemporalLevel() : ( m_uiMaxTL+rpcSliceHeader->getViewId()%2 +1) ); // JVT-W035
//===== set prediction and update list sizes =====
//===== reference picture list ===== (init with default data, later updated)
if( !rcFrameSpec.isIdrNalUnit())
{
//--- prediction ---
UInt auiNumViewRef [2];
if( rcFrameSpec.getSliceType()==I_SLICE) rcFrameSpec.setNumRefIdxActive(LIST_0, 0);
if( rcFrameSpec.getSliceType()!=B_SLICE) rcFrameSpec.setNumRefIdxActive(LIST_1, 0);
auiNumViewRef [LIST_0] = ( TimeForVFrameP(rcFrameSpec.getContFrameNumber()) ? m_uiAnchorNumFwdViewRef : rcFrameSpec.getNumRefIdxActive(LIST_0) + m_uiNonAncNumFwdViewRef );
auiNumViewRef [LIST_1] = ( TimeForVFrameP(rcFrameSpec.getContFrameNumber()) ? m_uiAnchorNumBwdViewRef : rcFrameSpec.getNumRefIdxActive(LIST_1) + m_uiNonAncNumBwdViewRef );
SliceType eSliceType =( auiNumViewRef [LIST_1] > 0 ? B_SLICE : auiNumViewRef [LIST_0] > 0 ? P_SLICE : I_SLICE);
rpcSliceHeader->setSliceType( eSliceType );
rpcSliceHeader->setNumRefIdxActive( LIST_0, auiNumViewRef[LIST_0] );
rpcSliceHeader->setNumRefIdxActive( LIST_1, auiNumViewRef[LIST_1] );
UInt uiMaxLists = ( eSliceType == B_SLICE ? 2 : eSliceType == P_SLICE ? 1 : 0 );
for( UInt uiList = 0; uiList < uiMaxLists; uiList++ )
{
ListIdx eListIdx = ListIdx( uiList );
if( rpcSliceHeader->getPPS().getNumRefIdxActive( eListIdx ) != rpcSliceHeader->getNumRefIdxActive( eListIdx))
{
rpcSliceHeader->setNumRefIdxActiveOverrideFlag( true );
}
}
//===== set MMCO commands =====
if(rcFrameSpec.isIdrNalUnit())
{
rpcSliceHeader->setAdaptiveRefPicBufferingFlag(false);
rpcSliceHeader->getRplrBuffer( LIST_0 ).setRefPicListReorderingFlag(false);
rpcSliceHeader->getRplrBuffer( LIST_1 ).setRefPicListReorderingFlag(false);
}
else
{
if( rcFrameSpec.getMmcoBuf() )
{
rpcSliceHeader->setAdaptiveRefPicBufferingFlag( rcFrameSpec.getAdaptiveRefPicBufferingFlag());
rpcSliceHeader->getMmcoBuffer().copy( *rcFrameSpec.getMmcoBuf() );
}
//===== set RPRL commands =====
if( rcFrameSpec.getRplrBuf( LIST_0 ) )
{
rpcSliceHeader->getRplrBuffer( LIST_0 ).setRefPicListReorderingFlag( rcFrameSpec.getRplrBuf( LIST_0 )->getRefPicListReorderingFlag() );
rpcSliceHeader->getRplrBuffer( LIST_0 ).copy( *(StatBuf<Rplr,32>*)rcFrameSpec.getRplrBuf( LIST_0 ) );
}
if( rcFrameSpec.getRplrBuf( LIST_1 ) )
{
rpcSliceHeader->getRplrBuffer( LIST_1 ).setRefPicListReorderingFlag( rcFrameSpec.getRplrBuf( LIST_1 )->getRefPicListReorderingFlag() );
rpcSliceHeader->getRplrBuffer( LIST_1 ).copy( *(StatBuf<Rplr,32>*)rcFrameSpec.getRplrBuf( LIST_1 ) );
}
}
}
//===== set picture order count =====
RNOK( m_pcPocCalculator->setPoc( *rpcSliceHeader, rcFrameSpec.getContFrameNumber() ) );
#if 0
//===== initialize prediction weights =====
RNOK( xInitPredWeights( *rpcSliceHeader ) );
#endif
//===== flexible macroblock ordering =====
rpcSliceHeader->setSliceGroupChangeCycle( 1 );
rpcSliceHeader->FMOInit();
/*
//===== update parameters =====
if( rpcSliceHeader->getNalRefIdc() && !fakeHeader) // !fakeHeader not good solution from MERL
{
m_uiFrameNum = ( m_uiFrameNum + 1 ) % ( 1 << rpcSliceHeader->getSPS().getLog2MaxFrameNum() );
}
*/
// if( rpcSliceHeader->isIdrNalUnit()
// {
// m_uiIdrPicId = ( m_uiIdrPicId + 1 ) % 3;
// }
// only support one IDR currently
return Err::m_nOK;
}
// rplr and mmco: }}
ErrVal
PicEncoder::xInitPredWeights( SliceHeader& rcSliceHeader )
{
if( rcSliceHeader.isInterP() )
{
RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).init( 64 ) );
if( rcSliceHeader.getPPS().getWeightedPredFlag() )
{
rcSliceHeader.setLumaLog2WeightDenom ( 6 );
rcSliceHeader.setChromaLog2WeightDenom( 6 );
RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).initDefaults( rcSliceHeader.getLumaLog2WeightDenom(), rcSliceHeader.getChromaLog2WeightDenom() ) );
RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).createRandomParameters() );
}
}
else if( rcSliceHeader.isInterB() )
{
RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).init( 64 ) );
RNOK( rcSliceHeader.getPredWeightTable( LIST_1 ).init( 64 ) );
if( rcSliceHeader.getPPS().getWeightedBiPredIdc() == 1 )
{
rcSliceHeader.setLumaLog2WeightDenom ( 6 );
rcSliceHeader.setChromaLog2WeightDenom( 6 );
RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).initDefaults( rcSliceHeader.getLumaLog2WeightDenom(), rcSliceHeader.getChromaLog2WeightDenom() ) );
RNOK( rcSliceHeader.getPredWeightTable( LIST_1 ).initDefaults( rcSliceHeader.getLumaLog2WeightDenom(), rcSliceHeader.getChromaLog2WeightDenom() ) );
RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).createRandomParameters() );
RNOK( rcSliceHeader.getPredWeightTable( LIST_1 ).createRandomParameters() );
}
}
return Err::m_nOK;
}
ErrVal
PicEncoder::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
PicEncoder::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
PicEncoder::xEncodePicture( ExtBinDataAccessorList& rcExtBinDataAccessorList,
RecPicBufUnit& rcRecPicBufUnit,
SliceHeader& rcSliceHeader,
Double dLambda,
UInt& ruiBits )
{
UInt uiBits = 0;
m_pcRecPicBuffer->SetCodeAsVFrameFlag(TimeForVFrameP
(rcSliceHeader.getPoc()));
rcSliceHeader.setSvcMvcFlag(this->getSvcMvcFlag());
rcSliceHeader.setAVCFlag( this->getAVCFlag()!=0); //JVT-W035
rcSliceHeader.setViewId(this->getViewId());
rcSliceHeader.setAnchorPicFlag(TimeForVFrameP(rcSliceHeader.getPoc()));
rcSliceHeader.setReservedZeroBits(0);
rcSliceHeader.setInterViewFalg(this->derivation_Inter_View_Flag(this->getViewId(), rcSliceHeader)); // JVT-W056 Samsung
#if JMVM_ONLY
if(!rcSliceHeader.getAVCFlag())
{
if(rcSliceHeader.getAnchorPicFlag())
rcSliceHeader.setMotionSkip(false);
else
rcSliceHeader.setMotionSkip ( ( m_pcSliceEncoder->getMotionSkipFlag() ) &&
(rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX( getViewId(), LIST_0 ) ||
rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX( getViewId(), LIST_1 ) ) );
}
#endif //JMVM_ONLY
//===== start picture =====
RefFrameList cList0, cList1;
RNOK( xStartPicture( rcRecPicBufUnit, rcSliceHeader, cList0, cList1 ) );
// bug fix for TD March 19
xSetRefPictures(rcSliceHeader, cList0, cList1);
//TMM_WP
if(rcSliceHeader.getSliceType() == P_SLICE)
m_pcSliceEncoder->xSetPredWeights( rcSliceHeader,
rcRecPicBufUnit.getRecFrame(),
cList0,
cList1);
else if(rcSliceHeader.getSliceType() == B_SLICE)
m_pcSliceEncoder->xSetPredWeights( rcSliceHeader,
rcRecPicBufUnit.getRecFrame(),
cList0,
cList1);
//TMM_WP
//===== encoding o
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -