Changeset 805 in SHVCSoftware for branches/SHM-6-dev/source/App


Ignore:
Timestamp:
17 Jun 2014, 16:58:15 (11 years ago)
Author:
nokia
Message:

Fix layer set array sizes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/SHM-6-dev/source/App/TAppEncoder/TAppEncTop.cpp

    r804 r805  
    11191119#endif
    11201120#if Q0078_ADD_LAYER_SETS
     1121  vps->setVpsNumLayerSetsMinus1(vps->getNumLayerSets() - 1);
    11211122  vps->setNumAddLayerSets(m_numAddLayerSets);
     1123  vps->setNumLayerSets(vps->getNumLayerSets() + vps->getNumAddLayerSets());
    11221124  if (m_numAddLayerSets > 0)
    11231125  {
     
    12471249  }
    12481250#endif
    1249   // Target output layer
    1250   vps->setNumOutputLayerSets(vps->getNumLayerSets());
    1251   vps->setNumProfileTierLevel(vps->getNumLayerSets());
    1252 #if P0295_DEFAULT_OUT_LAYER_IDC
    1253   vps->setDefaultTargetOutputLayerIdc(1);
    1254 #else
    1255 #if O0109_DEFAULT_ONE_OUT_LAYER_IDC
    1256   vps->setDefaultOneTargetOutputLayerIdc(1);
    1257 #else
    1258   vps->setDefaultOneTargetOutputLayerFlag(true);
    1259 #endif
    1260 #endif
    1261   for(i = 1; i < vps->getNumLayerSets(); i++)
    1262   {
    1263     vps->setProfileLevelTierIdx(i, i);
    1264     vps->setOutputLayerSetIdx(i, i);
    1265   } 
    1266 #endif
    1267  #if VPS_DPB_SIZE_TABLE
    1268   // The Layer ID List variables can be derived here. 
    1269 #if DERIVE_LAYER_ID_LIST_VARIABLES
    1270   vps->deriveLayerIdListVariables();
    1271 #endif
    1272 #if RESOLUTION_BASED_DPB
    1273   vps->assignSubDpbIndices();
    1274 #else
    1275   vps->deriveNumberOfSubDpbs();
    1276 #endif
    1277 
    1278   // derive OutputLayerFlag[i][j]
    1279   if( vps->getDefaultTargetOutputLayerIdc() == 1 )
    1280   {
    1281     // default_output_layer_idc equal to 1 specifies that only the layer with the highest value of nuh_layer_id such that nuh_layer_id equal to nuhLayerIdA and
    1282     // AuxId[ nuhLayerIdA ] equal to 0 in each of the output layer sets with index in the range of 1 to vps_num_layer_sets_minus1, inclusive, is an output layer of its output layer set.
    1283 
    1284     // Include the highest layer as output layer for each layer set
    1285     for(Int lsIdx = 1; lsIdx < vps->getNumLayerSets(); lsIdx++)
    1286     {
    1287       for( UInt layer = 0; layer < vps->getNumLayersInIdList(lsIdx); layer++ )
    1288       {
    1289         if( vps->getLayerIdIncludedFlag(lsIdx, layer) )     
    1290         {       
    1291           vps->setOutputLayerFlag( lsIdx, layer, layer == vps->getNumLayersInIdList(lsIdx) - 1 );
    1292         }
    1293       }
    1294     }
    1295   }
    1296   else
    1297   {
    1298     // cases when default_output_layer_idc is not equal to 1
    1299     assert(!"default_output_layer_idc not equal to 1 is not yet supported");
    1300   }
    1301 
    1302   // Initialize dpb_size_table() for all ouput layer sets in the VPS extension
    1303   for(i = 1; i < vps->getNumOutputLayerSets(); i++)
    1304   {
    1305 #if CHANGE_NUMSUBDPB_IDX
    1306     Int layerSetIdxForOutputLayerSet = vps->getOutputLayerSetIdx( i );
    1307 #endif
    1308     Int layerSetId = vps->getOutputLayerSetIdx(i);
    1309 
    1310     for(Int j = 0; j < vps->getMaxTLayers(); j++)
    1311     {
    1312 
    1313       Int maxNumReorderPics = -1;
    1314 #if CHANGE_NUMSUBDPB_IDX
    1315 #if RESOLUTION_BASED_DPB
    1316       for(Int k = 0; k < vps->getNumLayersInIdList(layerSetIdxForOutputLayerSet); k++)
    1317 #else
    1318       for(Int k = 0; k < vps->getNumSubDpbs(layerSetIdxForOutputLayerSet); k++)
    1319 #endif
    1320 #else
    1321       for(Int k = 0; k < vps->getNumSubDpbs(i); k++)
    1322 #endif
    1323       {
    1324         Int layerId = vps->getLayerSetLayerIdList(layerSetId, k); // k-th layer in the output layer set
    1325 #if RESOLUTION_BASED_DPB
    1326         vps->setMaxVpsLayerDecPicBuffMinus1( i, k, j, m_acTEncTop[layerId].getMaxDecPicBuffering(j) - 1 );
    1327         // Add sub-DPB sizes of layers belonging to a sub-DPB. If a different sub-DPB size is calculated
    1328         // at the encoder, modify below
    1329         Int oldValue = vps->getMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j );
    1330         oldValue += vps->getMaxVpsLayerDecPicBuffMinus1( i, k, j ) + 1;
    1331         vps->setMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j, oldValue );
    1332 #else
    1333         vps->setMaxVpsDecPicBufferingMinus1( i, k, j,  m_acTEncTop[layerId].getMaxDecPicBuffering(j) - 1 );
    1334 #endif
    1335         maxNumReorderPics       = std::max( maxNumReorderPics, m_acTEncTop[layerId].getNumReorderPics(j));
    1336       }
    1337 #if RESOLUTION_BASED_DPB
    1338       for(Int k = 0; k < vps->getNumSubDpbs(i); k++)
    1339       {
    1340         // Decrement m_maxVpsDecPicBufferingMinus1
    1341         Int oldValue = vps->getMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j );
    1342         vps->setMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j, oldValue - 1 );
    1343       }
    1344 #endif
    1345       vps->setMaxVpsNumReorderPics(i, j, maxNumReorderPics);
    1346       vps->determineSubDpbInfoFlags();
    1347     }
    1348   }
    1349 #endif
    13501251#if VPS_EXTN_DIRECT_REF_LAYERS
    13511252  // Direct reference layers
     
    13541255  Bool isDefaultDirectDependencyTypeSet = false;
    13551256#endif
    1356   for(UInt layerCtr = 1;layerCtr <= vps->getMaxLayers() - 1; layerCtr++)
    1357   {
    1358     vps->setNumDirectRefLayers( layerCtr, m_acTEncTop[layerCtr].getNumDirectRefLayers() );
    1359     maxDirectRefLayers = max<UInt>( maxDirectRefLayers, vps->getNumDirectRefLayers( layerCtr ) );
    1360 
    1361     for(i = 0; i < vps->getNumDirectRefLayers(layerCtr); i++)
    1362     {
    1363       vps->setRefLayerId( layerCtr, i, m_acTEncTop[layerCtr].getRefLayerId(i) );
     1257  for (UInt layerCtr = 1; layerCtr <= vps->getMaxLayers() - 1; layerCtr++)
     1258  {
     1259    vps->setNumDirectRefLayers(layerCtr, m_acTEncTop[layerCtr].getNumDirectRefLayers());
     1260    maxDirectRefLayers = max<UInt>(maxDirectRefLayers, vps->getNumDirectRefLayers(layerCtr));
     1261
     1262    for (i = 0; i < vps->getNumDirectRefLayers(layerCtr); i++)
     1263    {
     1264      vps->setRefLayerId(layerCtr, i, m_acTEncTop[layerCtr].getRefLayerId(i));
    13641265    }
    13651266    // Set direct dependency flag
    13661267    // Initialize flag to 0
    1367     for(Int refLayerCtr = 0; refLayerCtr < layerCtr; refLayerCtr++)
    1368     {
    1369       vps->setDirectDependencyFlag( layerCtr, refLayerCtr, false );
    1370     }
    1371     for(i = 0; i < vps->getNumDirectRefLayers(layerCtr); i++)
    1372     {
    1373       vps->setDirectDependencyFlag( layerCtr, vps->getLayerIdInVps(m_acTEncTop[layerCtr].getRefLayerId(i)), true);
     1268    for (Int refLayerCtr = 0; refLayerCtr < layerCtr; refLayerCtr++)
     1269    {
     1270      vps->setDirectDependencyFlag(layerCtr, refLayerCtr, false);
     1271    }
     1272    for (i = 0; i < vps->getNumDirectRefLayers(layerCtr); i++)
     1273    {
     1274      vps->setDirectDependencyFlag(layerCtr, vps->getLayerIdInVps(m_acTEncTop[layerCtr].getRefLayerId(i)), true);
    13741275    }
    13751276    // prediction indications
    13761277    vps->setDirectDepTypeLen(2); // sample and motion types are encoded
    1377     for(Int refLayerCtr = 0; refLayerCtr < layerCtr; refLayerCtr++)
    1378     {
    1379       if (vps->getDirectDependencyFlag( layerCtr, refLayerCtr))
     1278    for (Int refLayerCtr = 0; refLayerCtr < layerCtr; refLayerCtr++)
     1279    {
     1280      if (vps->getDirectDependencyFlag(layerCtr, refLayerCtr))
    13801281      {
    13811282        assert(m_acTEncTop[layerCtr].getSamplePredEnabledFlag(refLayerCtr) || m_acTEncTop[layerCtr].getMotionPredEnabledFlag(refLayerCtr));
    1382         vps->setDirectDependencyType( layerCtr, refLayerCtr, ((m_acTEncTop[layerCtr].getSamplePredEnabledFlag(refLayerCtr) ? 1 : 0) |
    1383                                                               (m_acTEncTop[layerCtr].getMotionPredEnabledFlag(refLayerCtr) ? 2 : 0)) - 1);
     1283        vps->setDirectDependencyType(layerCtr, refLayerCtr, ((m_acTEncTop[layerCtr].getSamplePredEnabledFlag(refLayerCtr) ? 1 : 0) |
     1284          (m_acTEncTop[layerCtr].getMotionPredEnabledFlag(refLayerCtr) ? 2 : 0)) - 1);
    13841285#if O0096_DEFAULT_DEPENDENCY_TYPE
    13851286        if (!isDefaultDirectDependencyTypeSet)
     
    13971298      else
    13981299      {
    1399         vps->setDirectDependencyType( layerCtr, refLayerCtr, 0 );
     1300        vps->setDirectDependencyType(layerCtr, refLayerCtr, 0);
    14001301      }
    14011302    }
     
    14051306  vps->setNumRefLayers();
    14061307
    1407   if(vps->getMaxLayers() > MAX_REF_LAYERS)
    1408   {
    1409     for(UInt layerCtr = 1; layerCtr <= vps->getMaxLayers() - 1; layerCtr++)
    1410     {
    1411       assert( vps->getNumRefLayers(vps->getLayerIdInNuh(layerCtr)) <= MAX_REF_LAYERS);
     1308  if (vps->getMaxLayers() > MAX_REF_LAYERS)
     1309  {
     1310    for (UInt layerCtr = 1; layerCtr <= vps->getMaxLayers() - 1; layerCtr++)
     1311    {
     1312      assert(vps->getNumRefLayers(vps->getLayerIdInNuh(layerCtr)) <= MAX_REF_LAYERS);
    14121313    }
    14131314  }
     
    14161317  vps->setPredictedLayerIds();
    14171318  vps->setTreePartitionLayerIdList();
    1418 #endif
     1319  vps->setLayerIdIncludedFlagsForAddLayerSets();
     1320#endif
     1321#endif
     1322  // Target output layer
     1323  vps->setNumOutputLayerSets(vps->getNumLayerSets());
     1324  vps->setNumProfileTierLevel(vps->getNumLayerSets());
     1325#if P0295_DEFAULT_OUT_LAYER_IDC
     1326  vps->setDefaultTargetOutputLayerIdc(1);
     1327#else
     1328#if O0109_DEFAULT_ONE_OUT_LAYER_IDC
     1329  vps->setDefaultOneTargetOutputLayerIdc(1);
     1330#else
     1331  vps->setDefaultOneTargetOutputLayerFlag(true);
     1332#endif
     1333#endif
     1334  for(i = 1; i < vps->getNumLayerSets(); i++)
     1335  {
     1336    vps->setProfileLevelTierIdx(i, i);
     1337    vps->setOutputLayerSetIdx(i, i);
     1338  } 
     1339#endif
     1340 #if VPS_DPB_SIZE_TABLE
     1341  // The Layer ID List variables can be derived here. 
     1342#if DERIVE_LAYER_ID_LIST_VARIABLES
     1343  vps->deriveLayerIdListVariables();
     1344#endif
     1345#if RESOLUTION_BASED_DPB
     1346  vps->assignSubDpbIndices();
     1347#else
     1348  vps->deriveNumberOfSubDpbs();
     1349#endif
     1350
     1351  // derive OutputLayerFlag[i][j]
     1352  if( vps->getDefaultTargetOutputLayerIdc() == 1 )
     1353  {
     1354    // default_output_layer_idc equal to 1 specifies that only the layer with the highest value of nuh_layer_id such that nuh_layer_id equal to nuhLayerIdA and
     1355    // AuxId[ nuhLayerIdA ] equal to 0 in each of the output layer sets with index in the range of 1 to vps_num_layer_sets_minus1, inclusive, is an output layer of its output layer set.
     1356
     1357    // Include the highest layer as output layer for each layer set
     1358    for(Int lsIdx = 1; lsIdx < vps->getNumLayerSets(); lsIdx++)
     1359    {
     1360      for( UInt layer = 0; layer < vps->getNumLayersInIdList(lsIdx); layer++ )
     1361      {
     1362#if !Q0078_ADD_LAYER_SETS  // the following condition is incorrect and is not needed anyway
     1363        if( vps->getLayerIdIncludedFlag(lsIdx, layer) )     
     1364#endif
     1365        {       
     1366          vps->setOutputLayerFlag( lsIdx, layer, layer == vps->getNumLayersInIdList(lsIdx) - 1 );
     1367        }
     1368      }
     1369    }
     1370  }
     1371  else
     1372  {
     1373    // cases when default_output_layer_idc is not equal to 1
     1374    assert(!"default_output_layer_idc not equal to 1 is not yet supported");
     1375  }
     1376
     1377  // Initialize dpb_size_table() for all ouput layer sets in the VPS extension
     1378  for(i = 1; i < vps->getNumOutputLayerSets(); i++)
     1379  {
     1380#if CHANGE_NUMSUBDPB_IDX
     1381    Int layerSetIdxForOutputLayerSet = vps->getOutputLayerSetIdx( i );
     1382#endif
     1383    Int layerSetId = vps->getOutputLayerSetIdx(i);
     1384
     1385    for(Int j = 0; j < vps->getMaxTLayers(); j++)
     1386    {
     1387
     1388      Int maxNumReorderPics = -1;
     1389#if CHANGE_NUMSUBDPB_IDX
     1390#if RESOLUTION_BASED_DPB
     1391      for(Int k = 0; k < vps->getNumLayersInIdList(layerSetIdxForOutputLayerSet); k++)
     1392#else
     1393      for(Int k = 0; k < vps->getNumSubDpbs(layerSetIdxForOutputLayerSet); k++)
     1394#endif
     1395#else
     1396      for(Int k = 0; k < vps->getNumSubDpbs(i); k++)
     1397#endif
     1398      {
     1399        Int layerId = vps->getLayerSetLayerIdList(layerSetId, k); // k-th layer in the output layer set
     1400#if RESOLUTION_BASED_DPB
     1401        vps->setMaxVpsLayerDecPicBuffMinus1( i, k, j, m_acTEncTop[layerId].getMaxDecPicBuffering(j) - 1 );
     1402        // Add sub-DPB sizes of layers belonging to a sub-DPB. If a different sub-DPB size is calculated
     1403        // at the encoder, modify below
     1404        Int oldValue = vps->getMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j );
     1405        oldValue += vps->getMaxVpsLayerDecPicBuffMinus1( i, k, j ) + 1;
     1406        vps->setMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j, oldValue );
     1407#else
     1408        vps->setMaxVpsDecPicBufferingMinus1( i, k, j,  m_acTEncTop[layerId].getMaxDecPicBuffering(j) - 1 );
     1409#endif
     1410        maxNumReorderPics       = std::max( maxNumReorderPics, m_acTEncTop[layerId].getNumReorderPics(j));
     1411      }
     1412#if RESOLUTION_BASED_DPB
     1413      for(Int k = 0; k < vps->getNumSubDpbs(i); k++)
     1414      {
     1415        // Decrement m_maxVpsDecPicBufferingMinus1
     1416        Int oldValue = vps->getMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j );
     1417        vps->setMaxVpsDecPicBufferingMinus1( i, vps->getSubDpbAssigned( layerSetIdxForOutputLayerSet, k ), j, oldValue - 1 );
     1418      }
     1419#endif
     1420      vps->setMaxVpsNumReorderPics(i, j, maxNumReorderPics);
     1421      vps->determineSubDpbInfoFlags();
     1422    }
     1423  }
    14191424#endif
    14201425    vps->setMaxOneActiveRefLayerFlag(maxDirectRefLayers > 1 ? false : true);
     
    15051510  {
    15061511    vps->setVpsVuiBspHrdPresentFlag(true);
     1512#if Q0078_ADD_LAYER_SETS
     1513    vps->setVpsNumBspHrdParametersMinus1(vps->getVpsNumLayerSetsMinus1() - 1);
     1514#else
    15071515    vps->setVpsNumBspHrdParametersMinus1(vps->getNumLayerSets() - 2);
     1516#endif
    15081517    vps->createBspHrdParamBuffer(vps->getVpsNumBspHrdParametersMinus1() + 1);
    15091518    for ( i = 0; i <= vps->getVpsNumBspHrdParametersMinus1(); i++ )
     
    15381547      vps->setBspHrdParameters( i, pcCfgLayer->getFrameRate(), numDU, pcCfgLayer->getTargetBitrate(), ( pcCfgLayer->getIntraPeriod() > 0 ) );
    15391548    }
     1549#if Q0078_ADD_LAYER_SETS
     1550    for (UInt h = 1; h <= vps->getVpsNumLayerSetsMinus1(); h++)
     1551#else
    15401552    for(UInt h = 1; h <= (vps->getNumLayerSets()-1); h++)
     1553#endif
    15411554    {
    15421555      vps->setNumBitstreamPartitions(h, 1);
Note: See TracChangeset for help on using the changeset viewer.