?? h264avcencoder.cpp
字號:
uiLayerNum += uiActTempLevel;
pcScalableSEI->setROINum ( i, rcLayer.getNumROI() );
pcScalableSEI->setROIID ( i, rcLayer.getROIID() );
pcScalableSEI->setSGID ( i, rcLayer.getSGID() );
pcScalableSEI->setSLID ( i, rcLayer.getSLID() );
}
UInt uiTotalScalableLayer = 0;
//===== get framerate information ===
Double *dFramerate = dGetFramerate();
UInt uiNumLayersMinus1 = uiLayerNum - 1;
pcScalableSEI->setNumLayersMinus1 ( uiNumLayersMinus1 );
UInt uiNumScalableLayer = 0;
for ( UInt uiCurrLayer = 0; uiCurrLayer < uiInputLayers; uiCurrLayer++)
{
LayerParameters& rcLayer = m_pcCodingParameter->getLayerParameters ( uiCurrLayer );
UInt uiTotalTempLevel = rcLayer.getDecompositionStages () - rcLayer.getNotCodedMCTFStages() + 1;
//UInt uiTotalFGSLevel = (UInt)rcLayer.getNumFGSLayers () + 1;//mwi. variable not used.
Bool bH264AVCCompatible = ( uiCurrLayer == 0 && m_pcCodingParameter->getBaseLayerMode() > 0 );
Bool bSubSeq = ( uiCurrLayer == 0 && m_pcCodingParameter->getBaseLayerMode() > 1 );
UInt uiMinTempLevel = ( !bH264AVCCompatible ||bSubSeq ) ? 0: max(0, (Int)uiTotalTempLevel - 2);
for ( UInt uiCurrTempLevel = 0; uiCurrTempLevel < uiTotalTempLevel; uiCurrTempLevel++ )
{
//for ( UInt uiCurrFGSLevel = 0; uiCurrFGSLevel < uiTotalFGSLevel; uiCurrFGSLevel++ )
{
if( uiCurrTempLevel >= uiMinTempLevel )
{
//Bool bSubPicLayerFlag = false;
Bool bSubRegionLayerFlag = false;
Bool bProfileLevelInfoPresentFlag = false;
Bool bInitParameterSetsInfoPresentFlag = false; //may be changed //JVT-S036
if( uiNumScalableLayer == 0 )
{//JVT-S036
bSubRegionLayerFlag = true;
bProfileLevelInfoPresentFlag = true;
bInitParameterSetsInfoPresentFlag = true;
}
Bool bBitrateInfoPresentFlag = true;
Bool bFrmRateInfoPresentFlag = true;//rcLayer.getInputFrameRate () > 0;
Bool bFrmSizeInfoPresentFlag = true;
// BUG_FIX liuhui{
Bool bLayerDependencyInfoPresentFlag = true; //may be changed
// BUG_FIX liuhui}
Bool bExactInterayerPredFlag = true; //JVT-S036 may be changed
// JVT-S054 (REMOVE)
pcScalableSEI->setLayerId(uiNumScalableLayer, uiNumScalableLayer);
//JVT-S036 start
UInt uiTempLevel = uiCurrTempLevel; //BUG_FIX_FT_01_2006
UInt uiDependencyID = rcLayer.getLayerCGSSNR();//uiCurrLayer;
UInt uiQualityLevel = rcLayer.getQualityLevelCGSSNR();//uiCurrFGSLevel;
// BUG_FIX liuhui{
m_aaauiScalableLayerId[uiDependencyID][uiCurrTempLevel][uiQualityLevel] = uiNumScalableLayer;
// BUG_FIX liuhui}
UInt uiSimplePriorityId = 0;
Bool bDiscardableFlag = false;
//if( uiCurrFGSLevel > rcLayer.getNumFGSLayers() )
// bDiscardableFlag = true;
if(rcLayer.isDiscardable())
bDiscardableFlag = true;
pcScalableSEI->setSimplePriorityId(uiNumScalableLayer, uiSimplePriorityId);
pcScalableSEI->setDiscardableFlag(uiNumScalableLayer, bDiscardableFlag);
pcScalableSEI->setTemporalLevel(uiNumScalableLayer, uiTempLevel);
pcScalableSEI->setDependencyId(uiNumScalableLayer, uiDependencyID);
pcScalableSEI->setQualityLevel(uiNumScalableLayer, uiQualityLevel);
//JVT-S036 end
pcScalableSEI->setSubRegionLayerFlag(uiNumScalableLayer, bSubRegionLayerFlag);
// JVT-S054 (REPLACE)
pcScalableSEI->setIroiSliceDivisionInfoPresentFlag(uiNumScalableLayer, rcLayer.m_bSliceDivisionFlag);
pcScalableSEI->setProfileLevelInfoPresentFlag(uiNumScalableLayer, bProfileLevelInfoPresentFlag);
pcScalableSEI->setBitrateInfoPresentFlag(uiNumScalableLayer, bBitrateInfoPresentFlag);
pcScalableSEI->setFrmRateInfoPresentFlag(uiNumScalableLayer, bFrmRateInfoPresentFlag);
pcScalableSEI->setFrmSizeInfoPresentFlag(uiNumScalableLayer, bFrmSizeInfoPresentFlag);
pcScalableSEI->setLayerDependencyInfoPresentFlag(uiNumScalableLayer, bLayerDependencyInfoPresentFlag);
pcScalableSEI->setInitParameterSetsInfoPresentFlag(uiNumScalableLayer, bInitParameterSetsInfoPresentFlag);
pcScalableSEI->setExactInterlayerPredFlag(uiNumScalableLayer, bExactInterayerPredFlag);//JVT-S036
if(pcScalableSEI->getProfileLevelInfoPresentFlag(uiNumScalableLayer))
{
UInt uilayerProfileIdc = 0; //may be changed
Bool bLayerConstraintSet0Flag = false; //may be changed
Bool bH264AVCCompatibleTmp = m_pcCodingParameter->getBaseLayerMode() > 0 && uiCurrLayer == 0;
Bool bLayerConstraintSet1Flag = ( bH264AVCCompatibleTmp ? 1 : 0 ); //may be changed
Bool bLayerConstraintSet2Flag = false; //may be changed
Bool bLayerConstraintSet3Flag = false; //may be changed
UInt uiLayerLevelIdc = 0; //may be changed
pcScalableSEI->setLayerProfileIdc(uiNumScalableLayer, uilayerProfileIdc);
pcScalableSEI->setLayerConstraintSet0Flag(uiNumScalableLayer, bLayerConstraintSet0Flag);
pcScalableSEI->setLayerConstraintSet1Flag(uiNumScalableLayer, bLayerConstraintSet1Flag);
pcScalableSEI->setLayerConstraintSet2Flag(uiNumScalableLayer, bLayerConstraintSet2Flag);
pcScalableSEI->setLayerConstraintSet3Flag(uiNumScalableLayer, bLayerConstraintSet3Flag);
pcScalableSEI->setLayerLevelIdc(uiNumScalableLayer, uiLayerLevelIdc);
}
else
{//JVT-S036
UInt bProfileLevelInfoSrcLayerIdDelta = 0; //may be changed
pcScalableSEI->setProfileLevelInfoSrcLayerIdDelta(uiNumScalableLayer, bProfileLevelInfoSrcLayerIdDelta);
}
if(pcScalableSEI->getBitrateInfoPresentFlag(uiNumScalableLayer))
{
// BUG_FIX liuhui{
UInt uiAvgBitrate = (UInt)( m_aaadSingleLayerBitrate[uiCurrLayer][uiCurrTempLevel][0]+0.5 );
// BUG_FIX liuhui}
//JVT-S036 start
UInt uiMaxBitrateLayer = 0; //should be changed
UInt uiMaxBitrateDecodedPicture = 0; //should be changed
UInt uiMaxBitrateCalcWindow = 0; //should be changed
pcScalableSEI->setAvgBitrate(uiNumScalableLayer, uiAvgBitrate);
pcScalableSEI->setMaxBitrateLayer(uiNumScalableLayer, uiMaxBitrateLayer);
pcScalableSEI->setMaxBitrateDecodedPicture(uiNumScalableLayer, uiMaxBitrateDecodedPicture);
pcScalableSEI->setMaxBitrateCalcWindow(uiNumScalableLayer, uiMaxBitrateCalcWindow);
//JVT-S036 end
}
if(pcScalableSEI->getFrmRateInfoPresentFlag(uiNumScalableLayer))
{
UInt uiConstantFrmRateIdc = 0;
UInt uiAvgFrmRate = (UInt)( 256*dFramerate[uiTotalScalableLayer] + 0.5 );
pcScalableSEI->setConstantFrmRateIdc(uiNumScalableLayer, uiConstantFrmRateIdc);
pcScalableSEI->setAvgFrmRate(uiNumScalableLayer, uiAvgFrmRate);
}
else
{//JVT-S036
UInt bFrmRateInfoSrcLayerIdDelta = 0; //may be changed
pcScalableSEI->setFrmRateInfoSrcLayerIdDelta(uiNumScalableLayer, bFrmRateInfoSrcLayerIdDelta);
}
if(pcScalableSEI->getFrmSizeInfoPresentFlag(uiNumScalableLayer))
{
UInt uiFrmWidthInMbsMinus1 = rcLayer.getFrameWidth()/16 - 1;
UInt uiFrmHeightInMbsMinus1 = rcLayer.getFrameHeight()/16 - 1;
pcScalableSEI->setFrmWidthInMbsMinus1(uiNumScalableLayer, uiFrmWidthInMbsMinus1);
pcScalableSEI->setFrmHeightInMbsMinus1(uiNumScalableLayer, uiFrmHeightInMbsMinus1);
}
else
{//JVT-S036
UInt bFrmSizeInfoSrcLayerIdDelta = 0; //may be changed
pcScalableSEI->setFrmSizeInfoSrcLayerIdDelta(uiNumScalableLayer, bFrmSizeInfoSrcLayerIdDelta);
}
if(pcScalableSEI->getSubRegionLayerFlag(uiNumScalableLayer))
{
UInt uiBaseRegionLayerId = 0;
Bool bDynamicRectFlag = false;
pcScalableSEI->setBaseRegionLayerId(uiNumScalableLayer, uiBaseRegionLayerId);
pcScalableSEI->setDynamicRectFlag(uiNumScalableLayer, bDynamicRectFlag);
if(pcScalableSEI->getDynamicRectFlag(uiNumScalableLayer))
{
UInt uiHorizontalOffset = 0;
UInt uiVerticalOffset = 0;
UInt uiRegionWidth = 0;
UInt uiRegionHeight = 0;
pcScalableSEI->setHorizontalOffset(uiNumScalableLayer, uiHorizontalOffset);
pcScalableSEI->setVerticalOffset(uiNumScalableLayer, uiVerticalOffset);
pcScalableSEI->setRegionWidth(uiNumScalableLayer, uiRegionWidth);
pcScalableSEI->setRegionHeight(uiNumScalableLayer, uiRegionHeight);
}
}
else
{//JVT-S036
UInt bSubRegionInfoSrcLayerIdDelta = 0; //may be changed
pcScalableSEI->setSubRegionInfoSrcLayerIdDelta(uiNumScalableLayer, bSubRegionInfoSrcLayerIdDelta);
}
//JVT-S036 start
if( pcScalableSEI->getSubPicLayerFlag( uiNumScalableLayer ) )
{
UInt RoiId = 1;//should be changed
pcScalableSEI->setRoiId( uiNumScalableLayer, RoiId );
}
if( pcScalableSEI->getIroiSliceDivisionInfoPresentFlag( uiNumScalableLayer ) )
{
pcScalableSEI->setIroiSliceDivisionType( uiNumScalableLayer, rcLayer.m_uiSliceDivisionType );
if (rcLayer.m_uiSliceDivisionType == 0)
{
pcScalableSEI->setGridSliceWidthInMbsMinus1( uiNumScalableLayer, rcLayer.m_puiGridSliceWidthInMbsMinus1[0] );
pcScalableSEI->setGridSliceHeightInMbsMinus1( uiNumScalableLayer, rcLayer.m_puiGridSliceHeightInMbsMinus1[0] );
}
else if (rcLayer.m_uiSliceDivisionType == 1)
{
pcScalableSEI->setNumSliceMinus1( uiNumScalableLayer, rcLayer.m_uiNumSliceMinus1 );
for ( j = 0; j <= rcLayer.m_uiNumSliceMinus1; j++ )
{
pcScalableSEI->setFirstMbInSlice( uiNumScalableLayer, j, rcLayer.m_puiFirstMbInSlice[j] );
pcScalableSEI->setSliceWidthInMbsMinus1( uiNumScalableLayer, j, rcLayer.m_puiGridSliceWidthInMbsMinus1[j] );
pcScalableSEI->setSliceHeightInMbsMinus1( uiNumScalableLayer, j, rcLayer.m_puiGridSliceHeightInMbsMinus1[j] );
}
}
else if (rcLayer.m_uiSliceDivisionType == 2)
{
pcScalableSEI->setNumSliceMinus1( uiNumScalableLayer, rcLayer.m_uiNumSliceMinus1 );
UInt uiFrameHeightInMb = pcScalableSEI->getFrmHeightInMbsMinus1( uiNumScalableLayer ) + 1;
UInt uiFrameWidthInMb = pcScalableSEI->getFrmWidthInMbsMinus1(uiNumScalableLayer ) + 1;
UInt uiPicSizeInMbs = uiFrameHeightInMb * uiFrameWidthInMb;
for ( j = 0; j < uiPicSizeInMbs; j++)
{
pcScalableSEI->setSliceId( uiNumScalableLayer, j, rcLayer.m_puiSliceId[j] );
}
}
// JVT-S054 (REPLACE) <-
}
//JVT-S036 end
if(pcScalableSEI->getLayerDependencyInfoPresentFlag(uiNumScalableLayer))
{
// BUG_FIX liuhui{
{
UInt uiDelta;
if( rcLayer.getQualityLevelCGSSNR() ) // FGS layer, Q != 0
{
if( rcLayer.getLayerCGSSNR() == 0 && m_pcCodingParameter->getBaseLayerMode() == 1 ) // AVC-COMPATIBLE
{
LayerParameters& rcBaseLayer = m_pcCodingParameter->getLayerParameters ( 0 );
UInt uiBaseTempLevel = max( 0, rcBaseLayer.getDecompositionStages() - rcBaseLayer.getNotCodedMCTFStages() - 1 );
if( uiCurrTempLevel-uiMinTempLevel >= uiBaseTempLevel )
{
uiDelta = uiNumScalableLayer - getScalableLayerId( rcLayer.getLayerCGSSNR(), uiCurrTempLevel, rcLayer.getQualityLevelCGSSNR()-1 );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta );//JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers(uiNumScalableLayer, 1 );
}
else
{
uiDelta = uiNumScalableLayer - getScalableLayerId( rcLayer.getLayerCGSSNR(), uiBaseTempLevel, rcLayer.getQualityLevelCGSSNR()-1 );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta );//JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers(uiNumScalableLayer, 1 );
}
}
else
{
uiDelta = uiNumScalableLayer - getScalableLayerId( rcLayer.getLayerCGSSNR(), uiCurrTempLevel, rcLayer.getQualityLevelCGSSNR()-1 );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta );//JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers(uiNumScalableLayer, 1 );
}
if( uiCurrTempLevel- uiMinTempLevel ) // T != 0
{
uiDelta = uiNumScalableLayer - getScalableLayerId( rcLayer.getLayerCGSSNR(), uiCurrTempLevel-1, rcLayer.getQualityLevelCGSSNR() );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta );//JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers(uiNumScalableLayer, 2 );
}
}
else if( ( uiCurrTempLevel- uiMinTempLevel ) ) // Q = 0, T != 0
{
uiDelta = uiNumScalableLayer - getScalableLayerId( rcLayer.getLayerCGSSNR(), uiCurrTempLevel-1, rcLayer.getQualityLevelCGSSNR() );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta ); //JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 1 );
if( rcLayer.getLayerCGSSNR() ) // D != 0, T != 0, Q = 0
{
UInt uiBaseLayerId = rcLayer.getBaseLayerId();
UInt uiBaseLayerCGSSNR = rcLayer.getBaseLayerCGSSNR();
LayerParameters& rcBaseLayer = m_pcCodingParameter->getLayerParameters ( uiBaseLayerId );
//UInt uiBaseFGSLayers = (UInt)( rcBaseLayer.getNumFGSLayers() );
UInt uiBaseQualityLevel = rcLayer.getBaseQualityLevelCGSSNR();
//uiBaseQualityLevel = min( uiBaseQualityLevel, uiBaseFGSLayers );
if( uiBaseLayerCGSSNR == 0 && m_pcCodingParameter->getBaseLayerMode() == 1 ) // AVC-COMPATIBLE
{
UInt uiBaseTempLevel = max( 0, rcBaseLayer.getDecompositionStages() - rcBaseLayer.getNotCodedMCTFStages() - 1 );
if( uiCurrTempLevel-uiMinTempLevel >= uiBaseTempLevel )
{
if( MSYS_UINT_MAX != getScalableLayerId( uiBaseLayerCGSSNR, uiCurrTempLevel, uiBaseQualityLevel ) )
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerCGSSNR, uiCurrTempLevel, uiBaseQualityLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta );//JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
}
}
else
{
if( MSYS_UINT_MAX != getScalableLayerId( uiBaseLayerCGSSNR, uiBaseTempLevel, uiBaseQualityLevel ) )
{ //this should always be true
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerCGSSNR, uiBaseTempLevel, uiBaseQualityLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta ); //JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
}
}
}
else //non-AVC mo
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -