?? h264avcencoder.cpp
字號:
}
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 ) )
{
// JVT-S054 (REPLACE) ->
/*
UInt bIroiSliceDivisionType = 0; //may be changed
UInt bNumSliceMinus1 = 1;
pcScalableSEI->setIroiSliceDivisionType( uiNumScalableLayer, bIroiSliceDivisionType );
if( bIroiSliceDivisionType == 0 )
{
UInt bGridSliceWidthInMbsMinus1 = 0; //should be changed
UInt bGridSliceHeightInMbsMinus1 = 0; //should be changed
pcScalableSEI->setGridSliceWidthInMbsMinus1( uiNumScalableLayer, bGridSliceWidthInMbsMinus1 );
pcScalableSEI->setGridSliceHeightInMbsMinus1( uiNumScalableLayer, bGridSliceHeightInMbsMinus1 );
}
else if( bIroiSliceDivisionType == 1 )
{
bNumSliceMinus1 = 1; //should be changed
pcScalableSEI->setNumSliceMinus1( uiNumScalableLayer, bNumSliceMinus1);
for ( j = 0; j <= bNumSliceMinus1; j++ )
{
UInt bFirstMbInSlice = 1;//should be changed
UInt bSliceWidthInMbsMinus1 = 1;//should be changed
UInt bSliceHeightInMbsMinus1 = 1;//should be changed
pcScalableSEI->setFirstMbInSlice( uiNumScalableLayer, j, bFirstMbInSlice );
pcScalableSEI->setSliceWidthInMbsMinus1( uiNumScalableLayer, j, bSliceWidthInMbsMinus1 );
pcScalableSEI->setSliceHeightInMbsMinus1( uiNumScalableLayer, j, bSliceHeightInMbsMinus1 );
}
}
else if( bIroiSliceDivisionType == 2 )
{
pcScalableSEI->setNumSliceMinus1( uiNumScalableLayer, bNumSliceMinus1 );
UInt uiFrameHeightInMb = pcScalableSEI->getFrmHeightInMbsMinus1( uiNumScalableLayer ) + 1;
UInt uiFrameWidthInMb = pcScalableSEI->getFrmWidthInMbsMinus1(uiNumScalableLayer ) + 1;
UInt uiPicSizeInMbs = uiFrameHeightInMb * uiFrameWidthInMb;
for ( j = 0; j < uiPicSizeInMbs; j++)
{
UInt bSliceId = 1; //should be changed
pcScalableSEI->setSliceId( uiNumScalableLayer, j, bSliceId );
}
}
*/
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))
{
{
UInt uiDelta;
if( uiCurrFGSLevel ) // FGS layer, Q != 0
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiCurrLayer, uiCurrTempLevel, uiCurrFGSLevel-1 );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta );//JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers(uiNumScalableLayer, 1 );
if( uiCurrTempLevel- uiMinTempLevel ) // T != 0
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiCurrLayer, uiCurrTempLevel-1, uiCurrFGSLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta );//JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers(uiNumScalableLayer, 2 );
}
}
else if( ( uiCurrTempLevel- uiMinTempLevel ) ) // Q = 0, T != 0
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiCurrLayer, uiCurrTempLevel-1, uiCurrFGSLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta ); //JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 1 );
if( uiCurrLayer ) // D != 0, T != 0, Q = 0
{
UInt uiBaseLayerId = rcLayer.getBaseLayerId();
LayerParameters& rcBaseLayer = m_pcCodingParameter->getLayerParameters ( uiBaseLayerId );
UInt uiBaseFGSLayers = (UInt)( rcBaseLayer.getNumFGSLayers() );
UInt uiBaseQualityLevel = rcLayer.getBaseQualityLevel();
uiBaseQualityLevel = min( uiBaseQualityLevel, uiBaseFGSLayers );
if( uiBaseLayerId == 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( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel ) )
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta );//JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
}
}
else
{
if( MSYS_UINT_MAX != getScalableLayerId( uiBaseLayerId, uiBaseTempLevel, uiBaseQualityLevel ) )
{ //this should always be true
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiBaseTempLevel, uiBaseQualityLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta ); //JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
}
}
}
else //non-AVC mode
{
if( MSYS_UINT_MAX != getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel ) )
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta ); //JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
}
}
}
}
else if ( uiCurrLayer ) // D != 0,T = 0, Q = 0
{
UInt uiBaseLayerId = rcLayer.getBaseLayerId();
LayerParameters& rcBaseLayer = m_pcCodingParameter->getLayerParameters ( uiBaseLayerId );
UInt uiBaseFGSLayers = (UInt)( rcBaseLayer.getNumFGSLayers() );
UInt uiBaseQualityLevel = rcLayer.getBaseQualityLevel();
uiBaseQualityLevel = min( uiBaseQualityLevel, uiBaseFGSLayers );
if( uiBaseLayerId == 0 && m_pcCodingParameter->getBaseLayerMode() == 1 ) //AVC-COMPATIBLE
{
Int iBaseTempLevel = max( 0, (Int)( rcBaseLayer.getDecompositionStages() - rcBaseLayer.getNotCodedMCTFStages() ) - 1 );
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, (UInt)iBaseTempLevel, (UInt)uiBaseQualityLevel );
}
else
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta ); //JVT-S036
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 1 );
}
else // base layer, no dependency layers
{
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 0 );
}
}
// BUG_FIX liuhui}
}
else
{//JVT-S036
UInt uiLayerDependencyInfoSrcLayerIdDelta = 0; //may be changed
pcScalableSEI->setLayerDependencyInfoSrcLayerIdDelta( uiNumScalableLayer, uiLayerDependencyInfoSrcLayerIdDelta);
}
if(pcScalableSEI->getInitParameterSetsInfoPresentFlag(uiNumScalableLayer))
{
UInt uiNumInitSPSMinus1 = 0; //should be changed
UInt uiNumInitPPSMinus1 = 0; //should be changed
pcScalableSEI->setNumInitSeqParameterSetMinus1(uiNumScalableLayer, uiNumInitSPSMinus1);
pcScalableSEI->setNumInitPicParameterSetMinus1(uiNumScalableLayer, uiNumInitPPSMinus1);
for( j = 0; j <= pcScalableSEI->getNumInitSPSMinus1(uiNumScalableLayer); j++)
{
UInt uiDelta = 0; //should be changed
pcScalableSEI->setInitSeqParameterSetIdDelta( uiNumScalableLayer, j, uiDelta );
}
for( j = 0; j <= pcScalableSEI->getNumInitPPSMinus1(uiNumScalableLayer); j++)
{
UInt uiDelta = 0; //should be changed
pcScalableSEI->setInitPicParameterSetIdDelta( uiNumScalableLayer, j, uiDelta );
}
}
else
{//JVT-S036
UInt bInitParameterSetsInfoSrcLayerIdDelta = 0; //may be changed
pcScalableSEI->setInitParameterSetsInfoSrcLayerIdDelta( uiNumScalableLayer, bInitParameterSetsInfoSrcLayerIdDelta );
}
uiNumScalableLayer++;
}
uiTotalScalableLayer++;
}
}
}
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcScalableSEI );
RNOK( m_pcNalUnitEncoder ->initNalUnit ( pcExtBinDataAccessor ) );
RNOK( m_pcNalUnitEncoder ->write ( cSEIMessageList ) );
RNOK( m_pcNalUnitEncoder ->closeNalUnit ( uiBits ) );
RNOK( m_apcMCTFEncoder[0] ->addParameterSetBits ( uiBits+4*8 ) );
return Err::m_nOK;
}
//JVT-T054{
ErrVal
H264AVCEncoder::xWriteScalableSEICGSSNR( ExtBinDataAccessor* pcExtBinDataAccessor )
{
//===== create message =====
SEI::ScalableSei* pcScalableSEI;
RNOK(SEI::ScalableSei::create(pcScalableSEI) );
//===== set message =====
UInt j; //JVT-S036
UInt uiInputLayers = m_pcCodingParameter->getNumberOfLayers ();
UInt uiLayerNum = 0; //total scalable layer numbers
for ( UInt i = 0; i < uiInputLayers; i++ ) //calculate total scalable layer numbers
{
Bool bH264AVCCompatible = ( i == 0 && m_pcCodingParameter->getBaseLayerMode() > 0 );
Bool bSubSeq = ( i == 0 && m_pcCodingParameter->getBaseLayerMode() > 1 );
LayerParameters& rcLayer = m_pcCodingParameter->getLayerParameters ( i );
UInt uiTotalTempLevel = rcLayer.getDecompositionStages () - rcLayer.getNotCodedMCTFStages();
UInt uiMinTempLevel = ( !bH264AVCCompatible ||bSubSeq ) ? 0: max( 0, (Int)uiTotalTempLevel - 1 );
UInt uiActTempLevel = uiTotalTempLevel - uiMinTempLevel + 1;
//UInt uiTotalFGSLevel = (UInt)rcLayer.getNumFGSLayers () + 1; //mwi. variable not used.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -