In Multiview Main profile, there is the following conformance restiction.
"– When NumLayersInIdList[ OlsIdxToLsIdx[ olsIdx ] ] is equal to 2, output_layer_flag[ olsIdx ][ j ] derived according to any active VPS shall be equal to 1 for j in the range of 0 to 1, inclusive, for subBitstream."
In HTM encoding with the current cfg files, the restriction fails:
Solving this issue, we should remove the following two lines in cfg/MV-HEVC/baseCfg_2view.cfg
OutputLayerSetIdx : 1 # Indices of layer sets used to derive additional output layer sets
LayerIdsInAddOutputLayerSet_0 : 1 # Indices in VPS of output layers in additional output layer set 0
And we should replace the following lines in cfg/MV-HEVC/baseCfg_3view.cfg
OutputLayerSetIdx : 1 2 # Indices of layer sets used to derive additional output layer sets
LayerIdsInAddOutputLayerSet_0 : 1 # Indices in VPS of output layers in additional output layer set 0
LayerIdsInAddOutputLayerSet_1 : 2 # Indices in VPS of output layers in additional output layer set 1
with
OutputLayerSetIdx : 2 # Indices of layer sets used to derive additional output layer sets
LayerIdsInAddOutputLayerSet_1 : 2 # Indices in VPS of output layers in additional output layer set 1
Note: For 2 view case, I've conducted simulation with cfg change and confirmed the result but for 3 view case, I haven't conducted the simulation.
In addition, we may have the checks in decoder/encoder.
Decoder sides's check code may be as follows:
Void TDecCavlc::parseVPSExtension( TComVPS* pcVPS )
{
...
for( Int i = 1; i < pcVPS->getNumOutputLayerSets( ); i++ )
{
if( pcVPS->getNumLayerSets() > 2 && i >= pcVPS->getNumLayerSets( ) )
{
READ_CODE( pcVPS->getLayerSetIdxForOlsMinus1Len( i ), uiCode, "layer_set_idx_for_ols_minus1[i]" ); pcVPS->setLayerSetIdxForOlsMinus1( i, uiCode );
}
...
if( pcVPS->getNumOutputLayersInOutputLayerSet( i ) == 1 && pcVPS->getNumDirectRefLayers( pcVPS->getOlsHighestOutputLayerId( i ) ) > 0 )
{
READ_FLAG( uiCode, "alt_output_layer_flag[ i ]" ); pcVPS->setAltOutputLayerFlag( i, uiCode == 1 );
}
#if NH_MV_FIX_TICKET_XXX
if (pcVPS->getNumLayersInIdList( pcVPS->olsIdxToLsIdx( i ) ) == 2 && pcVPS->getPTL(pcVPS->getProfileTierLevelIdx(i, 1))->getGeneralPTL()->getProfileIdc() == Profile::MULTIVIEWMAIN)
{
for( Int j = 0; j < pcVPS->getNumLayersInIdList( pcVPS->olsIdxToLsIdx( i ) ); j++ )
{
if (pcVPS->getOutputLayerFlag(i, j) == 0)
{
printf("!!Warning!!, output_layer_flag[] shall be always 1 when two layer is used in OLS in MV-HEVC Main profile\n");
}
assert(pcVPS->getOutputLayerFlag(i, j));
}
}
#endif
}