📄 sliceencoder.cpp
字号:
}
// JVT-W043 {
if ( bRateControlEnable && !pcJSVMParams->m_uiLayerId )
{
pcGenericRC->m_iNumberofHeaderBits += pcGenericRC->m_iRCHeaderBits;
pcGenericRC->m_iNumberofBasicUnitHeaderBits += pcGenericRC->m_iRCHeaderBits;
pcGenericRC->m_iNumberofTextureBits += pcGenericRC->m_iRCTextureBits;
pcGenericRC->m_iNumberofBasicUnitTextureBits += pcGenericRC->m_iRCTextureBits;
pcGenericRC->m_pcJSVMParams->NumberofCodedMacroBlocks++;
}
// JVT-W043 }
//JVT-X046 {
uiCodedMBNumber++;
if (m_uiSliceMode==1) //fixed slice size in number of MBs
{
if (uiCodedMBNumber >= m_uiSliceArgument)// this slice is done
{
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
true, true ) );
rcControlData.m_uiCurrentFirstMB = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
rcSliceHeader.setNumMbsInSlice(uiCodedMBNumber);
if (rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress)==-1)
rcControlData.m_bSliceGroupAllCoded = true;
break;
}
else
{
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
(uiMbAddress == uiLastMbAddress),
true ) );
}
}
else if(m_uiSliceMode==2) //fixed slice size in number of bytes
{
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
(uiMbAddress == uiLastMbAddress),
true ) );
if ((rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress)==-1) && (!m_pcMbCoder->bSliceCodedDone))
rcControlData.m_bSliceGroupAllCoded = true;
if (m_pcMbCoder->bSliceCodedDone==true)
{
rcControlData.m_uiCurrentFirstMB = uiMbAddress;
rcSliceHeader.setNumMbsInSlice(uiCodedMBNumber-1);
//set SliceId equal to zero because this MBData belong to the next slice
MbData* tempMbData;
tempMbData=pcMbDataCtrl->xGetMbData(rcControlData.m_uiCurrentFirstMB);
tempMbData->setSliceId( 0 );
break;
}
}
else
{
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
(uiMbAddress == uiLastMbAddress),
true ) );
}
//JVT-X046 }
uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
//JVT-X046 {
if (uiMbAddress==-1)
{
rcControlData.m_bSliceGroupAllCoded=true;
break;
}
//JVT-X046 }
}
if( ePicType!=FRAME )
{
if( pcFrame ) RNOK( pcFrame ->removeFieldBuffer( ePicType ) );
if( pcRecSubband ) RNOK( pcRecSubband ->removeFieldBuffer( ePicType ) );
if( pcPredSignal ) RNOK( pcPredSignal ->removeFieldBuffer( ePicType ) );
if( pcBaseLayerFrame ) RNOK( pcBaseLayerFrame ->removeFieldBuffer( ePicType ) );
if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->removeFieldBuffer( ePicType ) );
}
ruiBits += m_pcMbCoder->getBitCount() - uiBits;
return Err::m_nOK;
}
ErrVal SliceEncoder::encodeIntraPicture( UInt& ruiBits,
ControlData& rcControlData,
Frame* pcFrame,
Frame* pcRecSubband,
Frame* pcBaseLayer,
Frame* pcPredSignal,
UInt uiMbInRow,
Double dLambda,
PicType ePicType )
{
ROF( m_bInitDone );
SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader ( ePicType );
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
MbDataCtrl* pcBaseLayerCtrl = rcControlData.getBaseLayerCtrl ();
//====== initialization ======
RNOK( pcMbDataCtrl ->initSlice ( rcSliceHeader, ENCODE_PROCESS, false, NULL ) );
if( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initSlice ( rcSliceHeader, PRE_PROCESS, false, NULL ) );
}
RNOK( m_pcControlMng ->initSliceForCoding( rcSliceHeader ) );
//====== initialization ======
UInt uiMbAddress = rcSliceHeader.getFirstMbInSlice ();
UInt uiLastMbAddress = rcSliceHeader.getLastMbInSlice ();
UInt uiBits = m_pcMbCoder ->getBitCount ();
if(uiMbAddress == -1) return Err::m_nOK;
if( ePicType!=FRAME )
{
if( pcFrame ) RNOK( pcFrame ->addFieldBuffer( ePicType ) );
if( pcRecSubband ) RNOK( pcRecSubband->addFieldBuffer( ePicType ) );
if( pcBaseLayer ) RNOK( pcBaseLayer ->addFieldBuffer( ePicType ) );
if( pcPredSignal ) RNOK( pcPredSignal->addFieldBuffer( ePicType ) );
}
//JVT-X046 {
UInt uiCodedMBNumber = 0;
m_pcMbCoder->bSliceCodedDone = false;
//JVT-X046 }
//===== loop over macroblocks =====
for( ; uiMbAddress <= uiLastMbAddress; ) //--ICU/ETRI FMO Implementation
{
// JVT-W043 {
if ( bRateControlEnable && !pcJSVMParams->m_uiLayerId )
{
pcGenericRC->m_pcJSVMParams->current_mb_nr = uiMbAddress;
if( pcGenericRC->m_pcJSVMParams->basicunit == pcGenericRC->m_pcJSVMParams->FrameSizeInMbs ) {
// qp remains unchanged
}
// basic unit layer rate control
else if ( pcGenericRC->m_pcJSVMParams->RCUpdateMode == RC_MODE_1 ) {
if( pcGenericRC->m_pcJSVMParams->NumberofCodedMacroBlocks > 0
&& (pcGenericRC->m_pcJSVMParams->NumberofCodedMacroBlocks % pcGenericRC->m_pcJSVMParams->BasicUnit) == 0 ) {
// frame coding
if( pcGenericRC->m_pcJSVMParams->frame_mbs_only_flag ) {
pcQuadraticRC->updateRCModel();
if ( pcJSVMParams->m_uiIntraPeriod != 1 )
pcGenericRC->m_pcJSVMParams->qp = pcQuadraticRC->updateQPRC2(pcGenericRC->m_iTopFieldFlag);
else
pcGenericRC->m_pcJSVMParams->qp = pcQuadraticRC->updateQPRC1(pcGenericRC->m_iTopFieldFlag);
}
}
}
}
// JVT-W043 }
ETRACE_NEWMB( uiMbAddress );
MbDataAccess* pcMbDataAccess = NULL;
MbDataAccess* pcMbDataAccessBase = NULL;
UInt uiMbY, uiMbX;
Double dCost = 0;
rcSliceHeader.getMbPositionFromAddress ( uiMbY, uiMbX, uiMbAddress );
RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
if( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
RNOK( m_pcControlMng ->initMbForCoding ( *pcMbDataAccess, uiMbY, uiMbX, false, false ) );
pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
pcMbDataAccess->getMbData().setFieldFlag(ePicType!=FRAME);
// JVT-W043 {
if ( bRateControlEnable && !pcJSVMParams->m_uiLayerId )
{
pcMbDataAccess->getMbData().setQp( pcGenericRC->m_pcJSVMParams->qp );
}
// JVT-W043 }
if( ! rcSliceHeader.getNoInterLayerPredFlag() )
{
m_pcMbEncoder->setBaseModeAllowedFlag( m_apabBaseModeFlagAllowedArrays[0][uiMbAddress] );
}
RNOK( m_pcMbEncoder ->encodeIntra ( *pcMbDataAccess,
pcMbDataAccessBase,
pcFrame ->getPic( ePicType ),
pcFrame ->getPic( ePicType ),
pcRecSubband ->getPic( ePicType ),
pcBaseLayer ? pcBaseLayer ->getPic( ePicType ) : NULL,
pcPredSignal ->getPic( ePicType ),
dLambda,
dCost) );
//JVT-X046 {
uiCodedMBNumber++;
if (m_uiSliceMode==1) //fixed slice size in number of MBs
{
if (uiCodedMBNumber >= m_uiSliceArgument)//reach the fixed MB number
{
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
true, true ) );
rcControlData.m_uiCurrentFirstMB = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
rcControlData.getSliceHeader(ePicType)->setNumMbsInSlice(uiCodedMBNumber);
if (rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress)==-1)
rcControlData.m_bSliceGroupAllCoded = true;
break;
}
else
{
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
( uiMbAddress == uiLastMbAddress ), true ) );
}
}
else if(m_uiSliceMode==2) //fixed slice size in number of MBs
{
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
( uiMbAddress == uiLastMbAddress ), true ) );
if ((rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress)==-1) && (!m_pcMbCoder->bSliceCodedDone))
rcControlData.m_bSliceGroupAllCoded = true;
if (m_pcMbCoder->bSliceCodedDone==true)// this slice is done
{
rcControlData.m_uiCurrentFirstMB = uiMbAddress;
rcControlData.getSliceHeader(ePicType)->setNumMbsInSlice(uiCodedMBNumber-1);
MbData* tempMbData;//set SliceId equal to zero because this MBData belong to the next slice
tempMbData = pcMbDataCtrl->xGetMbData(rcControlData.m_uiCurrentFirstMB);
tempMbData->setSliceId( 0 );
break;
}
}
else
{
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
( uiMbAddress == uiLastMbAddress ), true ) );
}
//JVT-X046 }
// JVT-W043 {
if ( bRateControlEnable && !pcJSVMParams->m_uiLayerId )
{
pcGenericRC->m_iNumberofHeaderBits += pcGenericRC->m_iRCHeaderBits;
pcGenericRC->m_iNumberofBasicUnitHeaderBits += pcGenericRC->m_iRCHeaderBits;
pcGenericRC->m_iNumberofTextureBits += pcGenericRC->m_iRCTextureBits;
pcGenericRC->m_iNumberofBasicUnitTextureBits += pcGenericRC->m_iRCTextureBits;
pcGenericRC->m_pcJSVMParams->NumberofCodedMacroBlocks++;
}
// JVT-W043 }
uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
//JVT-X046 {
if (uiMbAddress==-1)
{
rcControlData.m_bSliceGroupAllCoded = true;
break;
}
//JVT-X046 }
}
if( ePicType!=FRAME )
{
if( pcFrame ) RNOK( pcFrame ->removeFieldBuffer( ePicType ) );
if( pcRecSubband ) RNOK( pcRecSubband->removeFieldBuffer( ePicType ) );
if( pcBaseLayer ) RNOK( pcBaseLayer ->removeFieldBuffer( ePicType ) );
if( pcPredSignal ) RNOK( pcPredSignal->removeFieldBuffer( ePicType ) );
}
ruiBits += m_pcMbCoder->getBitCount() - uiBits;
return Err::m_nOK;
}
// TMM_INTERLACE{
ErrVal SliceEncoder::encodeIntraPictureMbAff( UInt& ruiBits,
ControlData& rcControlData,
Frame* pcOrgFrame,
Frame* pcFrame,
Frame* pcRecSubband,
Frame* pcBaseLayer,
Frame* pcPredSignal,
UInt uiMbInRow,
Double dLambda )
{
ROF( m_bInitDone );
SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader ( FRAME );
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
MbDataCtrl* pcBaseLayerCtrl = rcControlData.getBaseLayerCtrl ();
MbDataCtrl* pcBaseLayerCtrlField = rcControlData.getBaseLayerCtrlField ();
//====== initialization ======
RNOK( pcMbDataCtrl ->initSlice ( rcSliceHeader, ENCODE_PROCESS, false, NULL ) );
if( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initSlice ( rcSliceHeader, PRE_PROCESS, false, NULL ) );
}
if( pcBaseLayerCtrlField )
{
RNOK( pcBaseLayerCtrlField ->initSlice ( rcSliceHeader, PRE_PROCESS, false, NULL ) );
}
RNOK( m_pcControlMng ->initSliceForCoding( rcSliceHeader ) );
UInt uiBits = m_pcMbCoder ->getBitCount();
Frame* apcOrgFrame [4] = { NULL, NULL, NULL, NULL };
Frame* apcFrame [4] = { NULL, NULL, NULL, NULL };
Frame* apcRecSubband[4] = { NULL, NULL, NULL, NULL };
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -