?? h264avcencoder.cpp
字號:
m_pcControlMng = NULL;
m_pcCodingParameter = NULL;
m_pcFrameMng = NULL;
m_bInitDone = false;
m_bVeryFirstCall = true;
m_bScalableSeiMessage = true;
m_bTraceEnable = false;
for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
{
m_apcMCTFEncoder [uiLayer] = NULL;
m_acOrgPicBufferList[uiLayer] .clear();
m_acRecPicBufferList[uiLayer] .clear();
}
m_cAccessUnitList.clear();
return Err::m_nOK;
}
//{{Quality level estimation and modified truncation- JVTO044 and m12007
//France Telecom R&D-(nathalie.cammas@francetelecom.com)
ErrVal H264AVCEncoder::writeQualityLevelInfosSEI(ExtBinDataAccessor* pcExtBinDataAccessor, UInt* uiaQualityLevel, UInt *uiaDelta, UInt uiNumLevels, UInt uiLayer )
{
//===== create message =====
SEI::QualityLevelSEI* pcQualityLevelSEI;
RNOK( SEI::QualityLevelSEI::create( pcQualityLevelSEI ) );
//===== set message =====
pcQualityLevelSEI->setNumLevel(uiNumLevels);
pcQualityLevelSEI->setDependencyId(uiLayer);
UInt ui;
for(ui= 0; ui < uiNumLevels; ui++)
{
pcQualityLevelSEI->setQualityLevel(ui,uiaQualityLevel[ui]);
pcQualityLevelSEI->setDeltaBytesRateOfLevel(ui,uiaDelta[ui]);
}
//===== write message =====
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcQualityLevelSEI );
RNOK( m_pcNalUnitEncoder ->initNalUnit ( pcExtBinDataAccessor ) );
RNOK( m_pcNalUnitEncoder ->write ( cSEIMessageList ) );
RNOK( m_pcNalUnitEncoder ->closeNalUnit ( uiBits ) );
return Err::m_nOK;
}
//}}Quality level estimation and modified truncation- JVTO044 and m12007
//SEI {
ErrVal H264AVCEncoder::writeNestingSEIMessage( ExtBinDataAccessor* pcExtBinDataAccessor, Double* dSeqBits)
{
SEI::ScalableNestingSei* pcScalableNestingSei;
RNOK( SEI::ScalableNestingSei::create(pcScalableNestingSei) );
//===== set message =====
//may be changed here
Bool bAllPicturesInAuFlag = false;
pcScalableNestingSei->setAllPicturesInAuFlag( bAllPicturesInAuFlag );
if( bAllPicturesInAuFlag == 0 )
{
UInt uiNumPicturesMinus1;
// assign value, may be changed here
uiNumPicturesMinus1 = 1;
UInt *uiPicId = new UInt[uiNumPicturesMinus1+1];
uiPicId[0] = 0;
uiPicId[1] = 1;
pcScalableNestingSei->setNumPicturesMinus1( uiNumPicturesMinus1 );
for( UInt uiIndex = 0; uiIndex <= uiNumPicturesMinus1; uiIndex++ )
{
pcScalableNestingSei->setPicId( uiIndex, uiPicId[uiIndex] );
}
pcScalableNestingSei->setTemporalId( 0 );
delete uiPicId;
}
//deal with the following SEI message in nesting SEI message
//may be changed here, here take snap_shot_sei as an example
SEI::FullframeSnapshotSei *pcSnapShotSEI;
RNOK( SEI::FullframeSnapshotSei::create( pcSnapShotSEI ) );
pcSnapShotSEI->setSnapShotId(0);
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcScalableNestingSei );
cSEIMessageList.push_back ( pcSnapShotSEI );
RNOK ( m_pcNalUnitEncoder->initNalUnit ( pcExtBinDataAccessor ) );
RNOK ( m_pcNalUnitEncoder->writeNesting ( cSEIMessageList ) );
RNOK ( m_pcNalUnitEncoder->closeNalUnit ( uiBits ) );
dSeqBits[0] += uiBits+4*8;
// RNOK( m_apcMCTFEncoder[0]->addParameterSetBits ( uiBits+4*8 ) );
RNOK( pcSnapShotSEI->destroy() );
RNOK( pcScalableNestingSei->destroy() );
return Err::m_nOK;
}
ErrVal H264AVCEncoder::writeActiveViewInfoSEIMessage( ExtBinDataAccessor* pcExtBinDataAccessor, Double* dSeqBits )
{
SEI::ActiveViewInfoSei* pcActiveViewInfoSei;
RNOK( SEI::ActiveViewInfoSei::create(pcActiveViewInfoSei) );
//===== set message =====
//may be changed here
Bool bOpPresentFlag = false;
pcActiveViewInfoSei->setOpPresentFlag( bOpPresentFlag );
if( bOpPresentFlag )
{
UInt uiOperationPointId = 0;
pcActiveViewInfoSei->setOperationPointId(uiOperationPointId);
}
else
{
UInt uiNumActiveViewsMinus1;
// assign value, may be changed here
uiNumActiveViewsMinus1 = m_pcCodingParameter->getSpsMVC()->getNumViewMinus1();
UInt *uiViewCodingOrder = m_pcCodingParameter->getSpsMVC()->getViewCodingOrder();
UInt *uiViewId = new UInt[uiNumActiveViewsMinus1+1];
UInt uiIndex;
for( uiIndex = 0; uiIndex <= uiNumActiveViewsMinus1; uiIndex++ )
{
uiViewId[uiIndex] = uiViewCodingOrder[uiIndex];
}
pcActiveViewInfoSei->setNumActiveViewsMinus1( uiNumActiveViewsMinus1 );
for( uiIndex = 0; uiIndex <= uiNumActiveViewsMinus1; uiIndex++ )
{
pcActiveViewInfoSei->setViewId( uiIndex, uiViewId[uiIndex] );
}
delete uiViewId;
}
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcActiveViewInfoSei );
RNOK ( m_pcNalUnitEncoder->initNalUnit ( pcExtBinDataAccessor ) );
RNOK ( m_pcNalUnitEncoder->write ( cSEIMessageList ) );
RNOK ( m_pcNalUnitEncoder->closeNalUnit ( uiBits ) );
dSeqBits[0] += uiBits+4*8;
return Err::m_nOK;
}
ErrVal H264AVCEncoder::writeMultiviewSceneInfoSEIMessage( ExtBinDataAccessor* pcExtBinDataAccessor, Double* dSeqBits ) // SEI JVT-W060
{
SEI::MultiviewSceneInfoSei* pcMultiviewSceneInfoSei;
RNOK( SEI::MultiviewSceneInfoSei::create(pcMultiviewSceneInfoSei) );
//===== set message =====
pcMultiviewSceneInfoSei->setMaxDisparity(m_pcCodingParameter->getMaxDisparity());
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcMultiviewSceneInfoSei );
RNOK ( m_pcNalUnitEncoder->initNalUnit ( pcExtBinDataAccessor ) );
RNOK ( m_pcNalUnitEncoder->write ( cSEIMessageList ) );
RNOK ( m_pcNalUnitEncoder->closeNalUnit ( uiBits ) );
dSeqBits[0] += uiBits+4*8;
return Err::m_nOK;
}
ErrVal H264AVCEncoder::writeMultiviewAcquisitionInfoSEIMessage( ExtBinDataAccessor* pcExtBinDataAccessor, Double* dSeqBits ) // SEI JVT-W060, JVT-Z038
{
SEI::MultiviewAcquisitionInfoSei* pcMultiviewAcquisitionInfoSei;
RNOK( SEI::MultiviewAcquisitionInfoSei::create(pcMultiviewAcquisitionInfoSei) );
UInt uiIndex;
int i,j;
Bool IntParaFlag=false;
Bool ExtParaFlag=false;
UInt NumViewsMinus1 = m_pcCodingParameter->getNumViewMinus1();
pcMultiviewAcquisitionInfoSei->initialize_memory(NumViewsMinus1+1);
//===== set message =====
pcMultiviewAcquisitionInfoSei->setIntrinsicParamFlag(IntParaFlag=m_pcCodingParameter->getIntrinsicParamFlag());
if (IntParaFlag)
{
pcMultiviewAcquisitionInfoSei->setIntrinsicParamsEqual(m_pcCodingParameter->getIntrinsicParamsEqual());
pcMultiviewAcquisitionInfoSei->setPrecFocalLength(m_pcCodingParameter->getPrecFocalLength());
pcMultiviewAcquisitionInfoSei->setPrecPrincipalPoint(m_pcCodingParameter->getPrecPrincipalPoint());
pcMultiviewAcquisitionInfoSei->setPrecRadialDistortion(m_pcCodingParameter->getPrecRadialDistortion());
for (uiIndex=0; uiIndex<= NumViewsMinus1; uiIndex++)
{
pcMultiviewAcquisitionInfoSei->setSignFocalLengthX(uiIndex,m_pcCodingParameter->getSignFocalLengthX(uiIndex));
pcMultiviewAcquisitionInfoSei->setSignFocalLengthY(uiIndex,m_pcCodingParameter->getSignFocalLengthY(uiIndex));
pcMultiviewAcquisitionInfoSei->setSignPrincipalPointX(uiIndex,m_pcCodingParameter->getSignPrincipalPointX(uiIndex));
pcMultiviewAcquisitionInfoSei->setSignPrincipalPointY(uiIndex,m_pcCodingParameter->getSignPrincipalPointY(uiIndex));
pcMultiviewAcquisitionInfoSei->setSignRadialDistortion(uiIndex,m_pcCodingParameter->getSignRadialDistortion(uiIndex));
pcMultiviewAcquisitionInfoSei->setExponentFocalLengthX(uiIndex,m_pcCodingParameter->getExponentFocalLengthX(uiIndex));
pcMultiviewAcquisitionInfoSei->setExponentFocalLengthY(uiIndex,m_pcCodingParameter->getExponentFocalLengthY(uiIndex));
pcMultiviewAcquisitionInfoSei->setExponentPrincipalPointX(uiIndex,m_pcCodingParameter->getExponentPrincipalPointX(uiIndex));
pcMultiviewAcquisitionInfoSei->setExponentPrincipalPointY(uiIndex,m_pcCodingParameter->getExponentPrincipalPointY(uiIndex));
pcMultiviewAcquisitionInfoSei->setExponentRadialDistortion(uiIndex,m_pcCodingParameter->getExponentRadialDistortion(uiIndex));
pcMultiviewAcquisitionInfoSei->setMantissaFocalLengthX(uiIndex,m_pcCodingParameter->getMantissaFocalLengthX(uiIndex));
pcMultiviewAcquisitionInfoSei->setMantissaFocalLengthY(uiIndex,m_pcCodingParameter->getMantissaFocalLengthY(uiIndex));
pcMultiviewAcquisitionInfoSei->setMantissaPrincipalPointX(uiIndex,m_pcCodingParameter->getMantissaPrincipalPointX(uiIndex));
pcMultiviewAcquisitionInfoSei->setMantissaPrincipalPointY(uiIndex,m_pcCodingParameter->getMantissaPrincipalPointY(uiIndex));
pcMultiviewAcquisitionInfoSei->setMantissaRadialDistortion(uiIndex,m_pcCodingParameter->getMantissaRadialDistortion(uiIndex));
}
}
pcMultiviewAcquisitionInfoSei->setExtrinsicParamFlag(ExtParaFlag=m_pcCodingParameter->getExtrinsicParamFlag());
if (ExtParaFlag)
{
pcMultiviewAcquisitionInfoSei->setPrecRotationParam(m_pcCodingParameter->getPrecRotationParam());
pcMultiviewAcquisitionInfoSei->setPrecTranslationParam(m_pcCodingParameter->getPrecTranslationParam());
for (uiIndex=0; uiIndex<= NumViewsMinus1; uiIndex++)
{
for (i=0; i<3; i++)
{
pcMultiviewAcquisitionInfoSei->setSignTranslationParam(uiIndex,i,m_pcCodingParameter->getSignTranslationParam(uiIndex,i));
pcMultiviewAcquisitionInfoSei->setExponentTranslationParam(uiIndex,i,m_pcCodingParameter->getExponentTranslationParam(uiIndex,i));
pcMultiviewAcquisitionInfoSei->setMantissaTranslationParam(uiIndex,i,m_pcCodingParameter->getMantissaTranslationParam(uiIndex,i));
for (j=0; j<3; j++) {
pcMultiviewAcquisitionInfoSei->setSignRotationParam(uiIndex,i,j,m_pcCodingParameter->getSignRotationParam(uiIndex,i,j));
pcMultiviewAcquisitionInfoSei->setExponentRotationParam(uiIndex,i,j,m_pcCodingParameter->getExponentRotationParam(uiIndex,i,j));
pcMultiviewAcquisitionInfoSei->setMantissaRotationParam(uiIndex,i,j,m_pcCodingParameter->getMantissaRotationParam(uiIndex,i,j));
}
}
}
}
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcMultiviewAcquisitionInfoSei );
RNOK ( m_pcNalUnitEncoder->initNalUnit ( pcExtBinDataAccessor ) );
RNOK ( m_pcNalUnitEncoder->write ( cSEIMessageList ) );
RNOK ( m_pcNalUnitEncoder->closeNalUnit ( uiBits ) );
dSeqBits[0] += uiBits+4*8;
m_pcCodingParameter->release_memory();
return Err::m_nOK;
}
ErrVal H264AVCEncoder::writeViewScalInfoSEIMessage(ExtBinDataAccessor *pcExtBinDataAccessor,
Double* dBitRate,
Double* dFrameRate,
Double dMaxRate)
{
SEI::ViewScalabilityInfoSei* pcViewScalInfoSei;
RNOK( SEI::ViewScalabilityInfoSei::create(pcViewScalInfoSei) );
//==set message==
UInt i, j;
// UInt uiNumViews = m_pcCodingParameter->getSpsMVC()->getNumViewMinus1() + 1 ;
UInt uiNumOperationPointsMinus1 = 0;
UInt uiCurrViewId = m_pcCodingParameter->getCurentViewId();
pcViewScalInfoSei->setNumOperationPointsMinus1( uiNumOperationPointsMinus1 );
for( i = 0; i <= uiNumOperationPointsMinus1; i++ )
{
UInt uiOperationPointId, uiPriorityId, uiTemporalId, uiNumActiveViewsMinus1;
uiOperationPointId = i;
uiTemporalId = m_pcCodingParameter->getDecompositionStages();
uiPriorityId = uiCurrViewId == 0 ? uiTemporalId : ( uiTemporalId+uiCurrViewId%2+1 );
uiNumActiveViewsMinus1 = 0;
pcViewScalInfoSei->setOperationPointId( i, uiOperationPointId );
pcViewScalInfoSei->setPriorityId( i, uiPriorityId );
pcViewScalInfoSei->setTemporalId( i, uiTemporalId );
pcViewScalInfoSei->setNumActiveViewsMinus1( i, uiNumActiveViewsMinus1 );
for( j = 0; j <= uiNumActiveViewsMinus1; j++)
{
UInt uiViewId = uiCurrViewId;
pcViewScalInfoSei->setViewId( i, j, uiViewId );
}
Bool bProfileLevelInfoPresentFlag, bBitRateInfoPresentFlag, bFrmRateInfoPresentFlag;
Bool bOpDependencyInfoPresentFlag, bInitParameterSetsInfoPresentFlag;
bProfileLevelInfoPresentFlag = false;
bBitRateInfoPresentFlag = true;
bFrmRateInfoPresentFlag = true;//may be changed
bOpDependencyInfoPresentFlag = false;
bInitParameterSetsInfoPresentFlag = false;
pcViewScalInfoSei->setProfileLevelInfoPresentFlag( i, bProfileLevelInfoPresentFlag );
pcViewScalInfoSei->setBitRateInfoPresentFlag( i, bBitRateInfoPresentFlag );
pcViewScalInfoSei->setFrmRateInfoPresentFlag( i, bFrmRateInfoPresentFlag );
pcViewScalInfoSei->setOpDependencyInfoPresentFlag( i, bOpDependencyInfoPresentFlag );
pcViewScalInfoSei->setInitParameterSetsInfoPresentFlag( i, bInitParameterSetsInfoPresentFlag );
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -