Changeset 903 in SHVCSoftware


Ignore:
Timestamp:
10 Oct 2014, 18:22:03 (10 years ago)
Author:
nokia
Message:

Integration of JCTVC-P0297 (poc_lsb_aligned_flag)

Location:
branches/SHM-dev/source
Files:
11 edited

Legend:

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

    r897 r903  
    7777  TComVPS* vps = m_acTEncTop[0].getVPS();
    7878
     79#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     80  vps->setVpsPocLsbAlignedFlag(false);
     81#endif
    7982  vps->setMaxTLayers                       ( m_maxTempLayer );
    8083  if (m_maxTempLayer == 1)
  • branches/SHM-dev/source/Lib/TLibCommon/TComSlice.cpp

    r894 r903  
    129129, m_pocMsbVal                     ( 0 )
    130130, m_pocMsbValRequiredFlag         ( false )
     131#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     132, m_pocMsbValNeeded               ( false )
     133#endif
    131134, m_pocMsbValPresentFlag          ( false )
    132135#endif
     
    220223#if POC_RESET_IDC_DECODER || POC_RESET_IDC_ENCODER
    221224  m_picOrderCntLsb = 0;
     225#endif
     226#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     227  m_pocMsbValNeeded  = false;
     228  m_pocResetDeltaPoc = 0;
    222229#endif
    223230}
     
    19321939  Int nrOfPositivePictures = 0;
    19331940  TComReferencePictureSet* pcRPS = this->getLocalRPS();
     1941#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1942  Bool pocsAdjusted = false;
     1943#endif
    19341944
    19351945  // loop through all pictures in the Reference Picture Set
     
    19441954      rpcPic = *(iterPic++);
    19451955
     1956#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1957      // poc adjustement by poc reset needs to be taken into account here
     1958      Int deltaPOC = pReferencePictureSet->getDeltaPOC(i) - rpcPic->getPicSym()->getSlice(0)->getPocResetDeltaPoc();
     1959      if (rpcPic->getPicSym()->getSlice(0)->getPocResetDeltaPoc() != 0)
     1960      {
     1961        pocsAdjusted = true;
     1962      }
     1963
     1964      if (rpcPic->getPicSym()->getSlice(0)->getPOC() == this->getPOC() + deltaPOC && rpcPic->getSlice(0)->isReferenced())
     1965#else
    19461966      if(rpcPic->getPicSym()->getSlice(0)->getPOC() == this->getPOC() + pReferencePictureSet->getDeltaPOC(i) && rpcPic->getSlice(0)->isReferenced())
     1967#endif
    19471968      {
    19481969        // This picture exists as a reference picture
    19491970        // and should be added to the explicit Reference Picture Set
     1971#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1972        pcRPS->setDeltaPOC(k, deltaPOC);
     1973#else
    19501974        pcRPS->setDeltaPOC(k, pReferencePictureSet->getDeltaPOC(i));
     1975#endif
    19511976        pcRPS->setUsed(k, pReferencePictureSet->getUsed(i) && (!isRAP));
    19521977#if ALLOW_RECOVERY_POINT_AS_RAP
     1978#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1979        pcRPS->setUsed(k, pcRPS->getUsed(k) && !(bUseRecoveryPoint && this->getPOC() > pocRandomAccess && this->getPOC() + deltaPOC < pocRandomAccess) );
     1980#else
    19531981        pcRPS->setUsed(k, pcRPS->getUsed(k) && !(bUseRecoveryPoint && this->getPOC() > pocRandomAccess && this->getPOC() + pReferencePictureSet->getDeltaPOC(i) < pocRandomAccess) );
     1982#endif
    19541983#endif
    19551984        if(pcRPS->getDeltaPOC(k) < 0)
     
    19942023#if EFFICIENT_FIELD_IRAP
    19952024    || useNewRPS
     2025#endif
     2026#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2027    || pocsAdjusted  // inter RPS prediction does not work if POCs have been adjusted
    19962028#endif
    19972029    )
     
    24632495#if P0307_VPS_NON_VUI_EXTENSION
    24642496, m_vpsNonVuiExtLength (0)
     2497#endif
     2498#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2499, m_vpsPocLsbAlignedFlag(false)
    24652500#endif
    24662501{
  • branches/SHM-dev/source/Lib/TLibCommon/TComSlice.h

    r898 r903  
    697697  Bool       m_pocLsbNotPresentFlag[MAX_VPS_LAYER_ID_PLUS1];
    698698#endif
     699#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     700  Bool       m_vpsPocLsbAlignedFlag;
     701#endif
    699702#if O0223_PICTURE_TYPES_ALIGN_FLAG
    700703  Bool       m_crossLayerPictureTypeAlignFlag;
     
    11351138  UInt   getPocLsbNotPresentFlag(Int i)                                         { return m_pocLsbNotPresentFlag[i]; }
    11361139  Void   setPocLsbNotPresentFlag(Int i, Bool x)                                 { m_pocLsbNotPresentFlag[i] = x;    }
     1140#endif
     1141#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1142  Bool   getVpsPocLsbAlignedFlag()                                              { return m_vpsPocLsbAlignedFlag; }
     1143  Void   setVpsPocLsbAlignedFlag(Bool x)                                        { m_vpsPocLsbAlignedFlag = x; }
    11371144#endif
    11381145#if O0223_PICTURE_TYPES_ALIGN_FLAG
     
    23172324  Bool        m_fullPocResetFlag;
    23182325  Int         m_pocLsbVal;
     2326#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2327  Bool        m_pocMsbValNeeded;
     2328  Int         m_pocResetDeltaPoc;
     2329#endif
    23192330  Int         m_pocMsbVal;
    23202331  Bool        m_pocMsbValRequiredFlag;
     
    27022713  Int       getPocLsbVal         ()                              { return m_pocLsbVal;       }
    27032714  Void      setPocLsbVal       (Int b)                           { m_pocLsbVal = b;          }
     2715#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2716  Void      setPocMsbNeeded      (Bool x)                        { m_pocMsbValNeeded = x; }
     2717  Bool      getPocMsbNeeded      ()                              { return m_pocMsbValNeeded; }
     2718  Int       getPocResetDeltaPoc  ()                              { return m_pocResetDeltaPoc; }
     2719  Void      setPocResetDeltaPoc  (Int x)                         { m_pocResetDeltaPoc = x; }
     2720#endif
    27042721  Int       getPocMsbVal         ()                              { return m_pocMsbVal;       }
    27052722  Void      setPocMsbVal       (Int b)                           { m_pocMsbVal = b;          }
  • branches/SHM-dev/source/Lib/TLibCommon/TypeDef.h

    r900 r903  
    156156#define POC_RESET_RPS                    1      ///< JCTVC-O0117 Modification to the decoding process for rps
    157157#endif
     158
     159#define P0297_VPS_POC_LSB_ALIGNED_FLAG   1      ///< JCTVC-P0297: vps_poc_lsb_aligned_flag for cross-layer POC anchor picture derivation
    158160
    159161#define VPS_EXTN_MASK_AND_DIM_INFO       1      ///< Include avc_base_layer_flag, splitting_flag, scalability mask and dimension related info
  • branches/SHM-dev/source/Lib/TLibDecoder/TDecCAVLC.cpp

    r902 r903  
    20332033  READ_FLAG(uiCode, "max_one_active_ref_layer_flag" );
    20342034  vps->setMaxOneActiveRefLayerFlag(uiCode);
     2035#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2036  READ_FLAG(uiCode, "vps_poc_lsb_aligned_flag");
     2037  vps->setVpsPocLsbAlignedFlag(uiCode);
     2038#endif
    20352039#if O0062_POC_LSB_NOT_PRESENT_FLAG
    20362040  for(i = 1; i< vps->getMaxLayers(); i++)
     
    22282232  }
    22292233
    2230   // vps_poc_lsb_aligned_flag
    2231   // When not present, vps_poc_lsb_aligned_flag is inferred to be equal to 0.
     2234#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2235  vps->setVpsPocLsbAlignedFlag(false);
     2236#endif
    22322237
    22332238#if O0062_POC_LSB_NOT_PRESENT_FLAG
     
    38923897
    38933898  // Derive the value of PocMsbValRequiredFlag
    3894   rpcSlice->setPocMsbValRequiredFlag( rpcSlice->getCraPicFlag() || rpcSlice->getBlaPicFlag()
    3895     /* || related to vps_poc_lsb_aligned_flag */
    3896     );
    3897 
    3898   if( !rpcSlice->getPocMsbValRequiredFlag() /* vps_poc_lsb_aligned_flag */ )
    3899   {
    3900     READ_FLAG( uiCode,    "poc_msb_val_present_flag"); rpcSlice->setPocMsbValPresentFlag( uiCode ? true : false );
     3899#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3900  rpcSlice->setPocMsbValRequiredFlag( (rpcSlice->getCraPicFlag() || rpcSlice->getBlaPicFlag())
     3901                                      && (!rpcSlice->getVPS()->getVpsPocLsbAlignedFlag() ||
     3902                                         (rpcSlice->getVPS()->getVpsPocLsbAlignedFlag() && rpcSlice->getVPS()->getNumDirectRefLayers(rpcSlice->getLayerId()) == 0))
     3903                                    );
     3904#else
     3905  rpcSlice->setPocMsbValRequiredFlag( rpcSlice->getCraPicFlag() || rpcSlice->getBlaPicFlag() );
     3906#endif
     3907
     3908#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3909  if (!rpcSlice->getPocMsbValRequiredFlag() && rpcSlice->getVPS()->getVpsPocLsbAlignedFlag())
     3910#else
     3911  if (!rpcSlice->getPocMsbValRequiredFlag() /* vps_poc_lsb_aligned_flag */)
     3912#endif
     3913  {
     3914#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3915    READ_FLAG(uiCode, "poc_msb_cycle_val_present_flag"); rpcSlice->setPocMsbValPresentFlag(uiCode ? true : false);
     3916#else
     3917    READ_FLAG(uiCode, "poc_msb_val_present_flag"); rpcSlice->setPocMsbValPresentFlag(uiCode ? true : false);
     3918#endif
    39013919  }
    39023920  else
     
    39253943  if( rpcSlice->getPocMsbValPresentFlag() )
    39263944  {
     3945#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3946    READ_UVLC( uiCode,    "poc_msb_cycle_val");             rpcSlice->setPocMsbVal( uiCode );
     3947#else
    39273948    READ_UVLC( uiCode,    "poc_msb_val");             rpcSlice->setPocMsbVal( uiCode );
     3949#endif
    39283950
    39293951#if !POC_RESET_IDC_DECODER
  • branches/SHM-dev/source/Lib/TLibDecoder/TDecTop.cpp

    r901 r903  
    120120  resetPocRestrictionCheckParameters();
    121121#endif
     122#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     123  m_pocResettingFlag        = false;
     124  m_pocDecrementedInDPBFlag = false;
     125#endif
    122126}
    123127
     
    11761180  }
    11771181#endif
     1182
    11781183#if POC_RESET_IDC_DECODER
    11791184  if( m_parseIdc != -1 ) // Second pass for a POC resetting picture
     
    12011206#endif
    12021207      markAllPicsAsNoCurrAu();
    1203     }
     1208#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1209      for (UInt i = 0; i < MAX_LAYERS; i++)
     1210      {
     1211        m_ppcTDecTop[i]->m_pocDecrementedInDPBFlag = false;
     1212      }
     1213#endif
     1214    }
     1215
     1216
     1217#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1218    m_pocResettingFlag = false;
     1219
     1220    if (m_apcSlicePilot->getPocResetIdc() != 0)
     1221    {
     1222      if (m_apcSlicePilot->getVPS()->getVpsPocLsbAlignedFlag())
     1223      {
     1224        m_pocResettingFlag = true;
     1225      }
     1226      else if (m_pocDecrementedInDPBFlag)
     1227      {
     1228        m_pocResettingFlag = false;
     1229      }
     1230      else
     1231      {
     1232        m_pocResettingFlag = true;
     1233      }
     1234    }
     1235#endif
    12041236
    12051237    if( m_apcSlicePilot->getPocResetIdc() && m_apcSlicePilot->getSliceIdx() == 0 )
     
    12491281#if ALIGNED_BUMPING
    12501282#if POC_RESET_IDC_DECODER
     1283
     1284#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1285  UInt affectedLayerList[MAX_NUM_LAYER_IDS];
     1286  Int  numAffectedLayers;
     1287
     1288  affectedLayerList[0] = m_apcSlicePilot->getLayerId();
     1289  numAffectedLayers = 1;
     1290
     1291  if (m_apcSlicePilot->getVPS()->getVpsPocLsbAlignedFlag())
     1292  {
     1293    for (UInt j = 0; j < m_apcSlicePilot->getVPS()->getNumPredictedLayers(m_apcSlicePilot->getLayerId()); j++)
     1294    {
     1295      affectedLayerList[j + 1] = m_apcSlicePilot->getVPS()->getPredictedLayerId(m_apcSlicePilot->getLayerId(), j);
     1296    }
     1297    numAffectedLayers = m_apcSlicePilot->getVPS()->getNumPredictedLayers(m_apcSlicePilot->getLayerId()) + 1;
     1298  }
     1299#endif
     1300
    12511301  //if(  (bNewPOC || m_layerId != m_uiPrevLayerId) && ( m_parseIdc != 1) )
    1252   if( m_parseIdc == 1 )
     1302#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1303  if (m_parseIdc == 1 && m_pocResettingFlag)
     1304#else
     1305  if (m_parseIdc == 1)
     1306#endif
    12531307  {
    12541308    // Invoke output of pictures if the current picture is a POC reset picture
     
    13011355    Int deltaPocVal  =  pocMsbDelta + pocLsbDelta;
    13021356
     1357#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1358    for (UInt layerIdx = 0; layerIdx < numAffectedLayers; layerIdx++)
     1359    {
     1360      if (!m_ppcTDecTop[affectedLayerList[layerIdx]]->m_pocDecrementedInDPBFlag)
     1361      {
     1362        m_ppcTDecTop[affectedLayerList[layerIdx]]->m_pocDecrementedInDPBFlag = true;
     1363        TComList<TComPic*>::iterator  iterPic = m_ppcTDecTop[affectedLayerList[layerIdx]]->getListPic()->begin();
     1364        while (iterPic != m_ppcTDecTop[affectedLayerList[layerIdx]]->getListPic()->end())
     1365#else
    13031366    //Reset all POC for DPB -> basically do it for each slice in the picutre
    13041367    TComList<TComPic*>::iterator  iterPic = m_cListPic.begin(); 
     
    13061369    // Iterate through all picture in DPB
    13071370    while( iterPic != m_cListPic.end() )
     1371#endif
    13081372    {
    13091373      TComPic *dpbPic = *iterPic;
    13101374      // Check if the picture pointed to by iterPic is either used for reference or
    13111375      // needed for output, are in the same layer, and not the current picture.
    1312       if( /*  ( ( dpbPic->getSlice(0)->isReferenced() ) || ( dpbPic->getOutputMark() ) )
     1376#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1377      assert(dpbPic->getLayerId() == affectedLayerList[layerIdx]);
     1378      if ( (dpbPic->getReconMark()) && (dpbPic->getPicSym()->getSlice(0)->getPicOutputFlag()) )
     1379#else
     1380      if ( /*  ( ( dpbPic->getSlice(0)->isReferenced() ) || ( dpbPic->getOutputMark() ) )
    13131381          &&*/ ( dpbPic->getLayerId() == m_apcSlicePilot->getLayerId() )
    13141382            && ( dpbPic->getReconMark() ) && ( dpbPic->getPicSym()->getSlice(0)->getPicOutputFlag() ))
     1383#endif
    13151384      {
    13161385        for(Int i = dpbPic->getNumAllocatedSlice()-1; i >= 0; i--)
     
    13391408      iterPic++;
    13401409    }
     1410#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1411        // Update the value of pocCRA
     1412        m_ppcTDecTop[affectedLayerList[layerIdx]]->m_pocCRA -= deltaPocVal;
     1413      }
     1414    }
     1415#else
    13411416    // Update the value of pocCRA
    13421417    m_pocCRA -= deltaPocVal;
     1418#endif
    13431419
    13441420    // Update value of POCLastDisplay
     
    13481424  Int slicePicOrderCntLsb = m_apcSlicePilot->getPicOrderCntLsb();
    13491425
    1350   if( m_parseIdc == 1 || m_parseIdc == 2 ) // TODO This should be replaced by pocResettingFlag.
     1426#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1427  if (m_pocResettingFlag && (m_parseIdc == 1 || m_parseIdc == 2))
     1428#else
     1429  if (m_parseIdc == 1 || m_parseIdc == 2) // TODO This should be replaced by pocResettingFlag.
     1430#endif
    13511431  {
    13521432    // Set poc for current slice
     
    13941474        && !m_apcSlicePilot->getDiscardableFlag() )
    13951475    {
     1476#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1477      for (UInt i = 0; i < numAffectedLayers; i++)
     1478      {
     1479        m_ppcTDecTop[affectedLayerList[i]]->setPrevPicOrderCnt(m_apcSlicePilot->getPOC());
     1480      }
     1481#else
    13961482      this->setPrevPicOrderCnt( m_apcSlicePilot->getPOC() );
     1483#endif
    13971484    }
    13981485    else if ( m_apcSlicePilot->getPocResetIdc() == 3 )
    13991486    {
     1487#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1488      if (!m_firstPicInLayerDecodedFlag || (m_firstPicInLayerDecodedFlag && m_pocResettingFlag))
     1489      {
     1490        for (UInt i = 0; i < numAffectedLayers; i++)
     1491        {
     1492          m_ppcTDecTop[affectedLayerList[i]]->setPrevPicOrderCnt( m_apcSlicePilot->getFullPocResetFlag()
     1493                                                                  ? 0 : m_apcSlicePilot->getPocLsbVal() );
     1494        }
     1495      }
     1496#else
    14001497      this->setPrevPicOrderCnt( m_apcSlicePilot->getFullPocResetFlag()
    14011498                                            ? 0 : m_apcSlicePilot->getPocLsbVal() );
     1499#endif
    14021500    }
    14031501#else
     
    23122410  //  Decode a picture
    23132411  m_cGopDecoder.decompressSlice(nalu.m_Bitstream, pcPic);
     2412
     2413#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2414  setFirstPicInLayerDecodedFlag(true);
     2415#endif
    23142416
    23152417  m_bFirstSliceInPicture = false;
  • branches/SHM-dev/source/Lib/TLibDecoder/TDecTop.h

    r856 r903  
    127127  UInt                    m_numLayer;
    128128  TDecTop**               m_ppcTDecTop;
     129#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     130  Bool                    m_pocResettingFlag;
     131  Bool                    m_pocDecrementedInDPBFlag;
     132#endif
    129133#if AVC_BASE
    130134  fstream*                m_pBLReconFile;
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncCavlc.cpp

    r902 r903  
    14891489
    14901490  WRITE_FLAG(vps->getMaxOneActiveRefLayerFlag(), "max_one_active_ref_layer_flag");
     1491#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     1492  WRITE_FLAG(vps->getVpsPocLsbAlignedFlag(), "vps_poc_lsb_aligned_flag");
     1493#endif
    14911494#if O0062_POC_LSB_NOT_PRESENT_FLAG
    14921495  for(i = 1; i< vps->getMaxLayers(); i++)
     
    27012704  {
    27022705    // Derive the value of PocMsbValRequiredFlag
    2703     slice->setPocMsbValRequiredFlag( slice->getCraPicFlag() || slice->getBlaPicFlag()
    2704                                           /* || related to vps_poc_lsb_aligned_flag */
    2705                                           );
     2706#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2707    slice->setPocMsbValRequiredFlag( (slice->getCraPicFlag() || slice->getBlaPicFlag())
     2708                                  && (!slice->getVPS()->getVpsPocLsbAlignedFlag() ||
     2709                                      (slice->getVPS()->getVpsPocLsbAlignedFlag() && slice->getVPS()->getNumDirectRefLayers(slice->getLayerId()) == 0))
     2710                                   );
     2711#else
     2712    slice->setPocMsbValRequiredFlag( slice->getCraPicFlag() || slice->getBlaPicFlag() );
     2713#endif
    27062714
    27072715    // Determine value of SH extension length.
     
    27212729
    27222730
    2723     if( !slice->getPocMsbValRequiredFlag() /* &&  vps_poc_lsb_aligned_flag */ )
     2731#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2732    if (!slice->getPocMsbValRequiredFlag() && slice->getVPS()->getVpsPocLsbAlignedFlag())
     2733#else
     2734    if (!slice->getPocMsbValRequiredFlag() /* &&  vps_poc_lsb_aligned_flag */)
     2735#endif
    27242736    {
    27252737      shExtnLengthInBit++;
     
    27372749    }
    27382750
    2739     if( slice->getPocMsbValPresentFlag() )
     2751#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2752    if (slice->getPocMsbNeeded())
     2753    {
     2754      slice->setPocMsbValPresentFlag(true);
     2755    }
     2756#endif
     2757
     2758    if (slice->getPocMsbValPresentFlag())
    27402759    {
    27412760      UInt lengthVal = 1;
     
    27712790    }
    27722791
    2773     if( !slice->getPocMsbValRequiredFlag() /* &&  vps_poc_lsb_aligned_flag */ )
    2774     {
     2792#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2793    if (!slice->getPocMsbValRequiredFlag() && slice->getVPS()->getVpsPocLsbAlignedFlag())
     2794#else
     2795    if (!slice->getPocMsbValRequiredFlag() /* &&  vps_poc_lsb_aligned_flag */)
     2796#endif
     2797    {
     2798#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2799      WRITE_FLAG( slice->getPocMsbValPresentFlag(),                           "poc_msb_cycle_val_present_flag" );
     2800#else
    27752801      WRITE_FLAG( slice->getPocMsbValPresentFlag(),                           "poc_msb_val_present_flag" );
    2776     }
    2777     if( slice->getPocMsbValPresentFlag() )
    2778     {
    2779       assert( slice->getPocMsbVal() % maxPocLsb == 0 );
    2780       WRITE_UVLC( slice->getPocMsbVal() / maxPocLsb,                                      "poc_msb_val" );
     2802#endif
     2803    }
     2804    if (slice->getPocMsbValPresentFlag())
     2805    {
     2806      assert(slice->getPocMsbVal() % maxPocLsb == 0);
     2807#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     2808      WRITE_UVLC(slice->getPocMsbVal() / maxPocLsb, "poc_msb_cycle_val");
     2809#else
     2810      WRITE_UVLC(slice->getPocMsbVal() / maxPocLsb, "poc_msb_val");
     2811#endif
    27812812    }
    27822813    for (Int i = 0; i < shExtnAdditionalBits; i++)
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncGOP.cpp

    r899 r903  
    909909    determinePocResetIdc(pocCurr, pcSlice);
    910910
     911#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     912    Bool pocResettingFlag = false;
     913
     914    if (pcSlice->getPocResetIdc() != 0)
     915    {
     916      if (pcSlice->getVPS()->getVpsPocLsbAlignedFlag())
     917      {
     918        pocResettingFlag = true;
     919      }
     920      else if (m_pcEncTop->getPocDecrementedInDPBFlag())
     921      {
     922        pocResettingFlag = false;
     923      }
     924      else
     925      {
     926        pocResettingFlag = true;
     927      }
     928    }
     929#endif
     930
    911931    // If reset, do the following steps:
     932#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     933    if( pocResettingFlag )
     934#else
    912935    if( pcSlice->getPocResetIdc() )
     936#endif
    913937    {
    914938      updatePocValuesOfPics(pocCurr, pcSlice);
     
    33973421      pcPicYuvRecOut->setReconstructed(true);
    33983422#endif
    3399 
     3423#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3424      m_pcEncTop->setFirstPicInLayerDecodedFlag(true);
     3425#endif
    34003426      pcPic->setReconMark   ( true );
    34013427      m_bFirst = false;
     
    34563482  // If BL picture in the AU is IDR, and another picture is not IDR, set the poc_reset_idc to 2
    34573483  // If BL picture is IRAP, and another picture is non-IRAP, then the poc_reset_idc is equal to 1 or 2.
     3484#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3485  slice->setPocMsbNeeded(false);
     3486#endif
    34583487  if( slice->getSliceIdx() == 0 ) // First slice - compute, copy for other slices
    34593488  {
     
    35153544        {
    35163545          slice->setPocResetIdc( 2 ); // Full reset needed
     3546#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3547          if (slice->getVPS()->getVpsPocLsbAlignedFlag() && slice->getVPS()->getNumDirectRefLayers(slice->getLayerId()) == 0)
     3548          {
     3549            slice->setPocMsbNeeded(true);  // Force msb writing
     3550          }
     3551#endif
    35173552        }
    35183553        else
     
    35313566        Int periodId = rand() % 64;
    35323567        m_lastPocPeriodId = (periodId == m_lastPocPeriodId) ? (periodId + 1) % 64 : periodId ;
     3568
     3569#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3570        for (UInt i = 0; i < MAX_LAYERS; i++)
     3571        {
     3572          m_ppcTEncTop[i]->setPocDecrementedInDPBFlag(false);
     3573        }
     3574#endif
    35333575      }
    35343576      else
     
    35473589Void TEncGOP::updatePocValuesOfPics(Int const pocCurr, TComSlice *const slice)
    35483590{
     3591#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3592  UInt affectedLayerList[MAX_NUM_LAYER_IDS];
     3593  Int  numAffectedLayers;
     3594
     3595  affectedLayerList[0] = m_layerId;
     3596  numAffectedLayers = 1;
     3597
     3598  if (m_pcEncTop->getVPS()->getVpsPocLsbAlignedFlag())
     3599  {
     3600    for (UInt j = 0; j < m_pcEncTop->getVPS()->getNumPredictedLayers(m_layerId); j++)
     3601    {
     3602      affectedLayerList[j + 1] = m_pcEncTop->getVPS()->getPredictedLayerId(m_layerId, j);
     3603    }
     3604    numAffectedLayers = m_pcEncTop->getVPS()->getNumPredictedLayers(m_layerId) + 1;
     3605  }
     3606#endif
    35493607
    35503608  Int pocAdjustValue = pocCurr - m_pcEncTop->getPocAdjustmentValue();
     
    35543612
    35553613  maxPocLsb   = 1 << slice->getSPS()->getBitsForPOC();
     3614
     3615#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3616  Int adjustedPocValue = pocCurr;
     3617
     3618  if (m_pcEncTop->getFirstPicInLayerDecodedFlag())
     3619  {
     3620#endif
     3621
    35563622  pocLsbVal   = (slice->getPocResetIdc() == 3)
    35573623                ? slice->getPocLsbVal()
     
    35623628                : 0;
    35633629  deltaPocVal = pocMsbDelta  + pocLsbDelta;
    3564  
     3630
     3631#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3632  Int origDeltaPocVal = deltaPocVal;  // original value needed when updating POC adjustment value
     3633
     3634  if (slice->getPocMsbNeeded())  // IDR picture in base layer, non-IDR picture in other layers, poc_lsb_aligned_flag = 1
     3635  {
     3636    if (slice->getLayerId() == 0)
     3637    {
     3638      int highestPoc = INT_MIN;
     3639      // Find greatest POC in DPB for layer 0
     3640      for (TComList<TComPic*>::iterator iterPic = m_pcEncTop->getListPic()->begin(); iterPic != m_pcEncTop->getListPic()->end(); ++iterPic)
     3641      {
     3642        TComPic *dpbPic = *iterPic;
     3643        if (dpbPic->getReconMark() && dpbPic->getLayerId() == 0 && dpbPic->getPOC() > highestPoc)
     3644        {
     3645          highestPoc = dpbPic->getPOC();
     3646        }
     3647      }
     3648      deltaPocVal = (highestPoc - (highestPoc & (maxPocLsb - 1))) + 1*maxPocLsb;
     3649      m_pcEncTop->setCurrPocMsb(deltaPocVal);
     3650    }
     3651    else
     3652    {
     3653      deltaPocVal = m_ppcTEncTop[0]->getCurrPocMsb();  // copy from base layer
     3654    }
     3655    slice->setPocMsbVal(deltaPocVal);
     3656  }
     3657#endif
     3658
     3659#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3660  for (UInt layerIdx = 0; layerIdx < numAffectedLayers; layerIdx++)
     3661  {
     3662    if (!m_ppcTEncTop[affectedLayerList[layerIdx]]->getPocDecrementedInDPBFlag())
     3663    {
     3664      m_ppcTEncTop[affectedLayerList[layerIdx]]->setPocDecrementedInDPBFlag(true);
     3665
     3666      // Decrement value of associatedIrapPoc of the TEncGop object
     3667      m_ppcTEncTop[affectedLayerList[layerIdx]]->getGOPEncoder()->m_associatedIRAPPOC -= deltaPocVal;
     3668
     3669      // Decrememnt the value of m_pocCRA
     3670      m_ppcTEncTop[affectedLayerList[layerIdx]]->getGOPEncoder()->m_pocCRA -= deltaPocVal;
     3671
     3672      TComList<TComPic*>::iterator  iterPic = m_ppcTEncTop[affectedLayerList[layerIdx]]->getListPic()->begin();
     3673      while (iterPic != m_ppcTEncTop[affectedLayerList[layerIdx]]->getListPic()->end())
     3674#else
    35653675  // Decrement value of associatedIrapPoc of the TEncGop object
    35663676  this->m_associatedIRAPPOC -= deltaPocVal;
     
    35723682  TComList<TComPic*>::iterator  iterPic = getListPic()->begin(); 
    35733683  while( iterPic != getListPic()->end() )
     3684#endif
    35743685  {
    35753686    TComPic *dpbPic = *iterPic;
     
    35963707        // Update value of associatedIrapPoc of each slice
    35973708        dpbPicSlice->setAssociatedIRAPPOC( dpbPicSlice->getAssociatedIRAPPOC() - deltaPocVal );
     3709
     3710#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3711        if (slice->getPocMsbNeeded())
     3712        {
     3713          // this delta value is needed when computing delta POCs in reference picture set initialization
     3714          dpbPicSlice->setPocResetDeltaPoc(dpbPicSlice->getPocResetDeltaPoc() + (deltaPocVal - pocLsbVal));
     3715        }
     3716#endif
    35983717      }
    35993718    }
    36003719    iterPic++;
    36013720  }
    3602  
     3721#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3722    }
     3723  }
     3724#endif
     3725
    36033726  // Actual POC value before reset
     3727#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3728  adjustedPocValue = pocCurr - m_pcEncTop->getPocAdjustmentValue();
     3729#else
    36043730  Int adjustedPocValue = pocCurr - m_pcEncTop->getPocAdjustmentValue();
     3731#endif
    36053732
    36063733  // Set MSB value before reset
    36073734  Int tempLsbVal = adjustedPocValue & (maxPocLsb - 1);
    3608   slice->setPocMsbVal( adjustedPocValue - tempLsbVal);
     3735#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3736  if (!slice->getPocMsbNeeded())  // set poc msb normally if special msb handling is not needed
     3737  {
     3738#endif
     3739    slice->setPocMsbVal(adjustedPocValue - tempLsbVal);
     3740#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3741  }
     3742#endif
    36093743
    36103744  // Set LSB value before reset - this is needed in the case of resetIdc = 2
     
    36123746
    36133747  // Cumulative delta
     3748#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3749  deltaPocVal = origDeltaPocVal;  // restore deltaPoc for correct adjustment value update
     3750#endif
    36143751  m_pcEncTop->setPocAdjustmentValue( m_pcEncTop->getPocAdjustmentValue() + deltaPocVal );
     3752
     3753#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     3754  }
     3755#endif
    36153756
    36163757  // New LSB value, after reset
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncTop.cpp

    r901 r903  
    9898  m_noOutputOfPriorPicsFlags   = false;
    9999#endif
     100#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     101  m_pocDecrementedInDPBFlag    = false;
     102#endif
    100103#endif //SVC_EXTENSION
    101104}
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncTop.h

    r849 r903  
    168168  int                     m_numAddLayerSets;
    169169#endif
     170#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     171  Bool                    m_pocDecrementedInDPBFlag;
     172  Int                     m_currPocMsb;
     173#endif
    170174#endif //SVC_EXTENSION
    171175protected:
     
    306310  Int  getNumAddLayerSets()                  { return m_numAddLayerSets; }
    307311#endif
     312#if P0297_VPS_POC_LSB_ALIGNED_FLAG
     313  Void setPocDecrementedInDPBFlag(Bool x)    { m_pocDecrementedInDPBFlag = x; }
     314  Bool getPocDecrementedInDPBFlag()          { return m_pocDecrementedInDPBFlag; }
     315  Void setCurrPocMsb(Int poc)                { m_currPocMsb = poc; }
     316  Int  getCurrPocMsb()                       { return m_currPocMsb; }
     317#endif
    308318#else //SVC_EXTENSION
    309319  Void encode( Bool bEos, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut,
Note: See TracChangeset for help on using the changeset viewer.