Ticket #454: num_ref_idx_default_active.patch

File num_ref_idx_default_active.patch, 6.4 KB (added by rickard, 12 years ago)
  • source/Lib/TLibCommon/TComSlice.cpp

     
    14571457, m_uiMinCuDQPSize              (0)
    14581458, m_iChromaQpOffset             (0)
    14591459, m_iChromaQpOffset2nd          (0)
     1460, m_uiNumRefIdxL0DefaultActive  (1)
     1461, m_uiNumRefIdxL1DefaultActive  (1)
    14601462#if !RPS_IN_SPS
    14611463, m_bLongTermRefsPresent        (false)
    14621464#endif
  • source/Lib/TLibCommon/TComSlice.h

     
    624624  Int        m_iChromaQpOffset;
    625625  Int        m_iChromaQpOffset2nd;
    626626
     627  UInt        m_uiNumRefIdxL0DefaultActive;
     628  UInt        m_uiNumRefIdxL1DefaultActive;
     629
    627630#if !RPS_IN_SPS
    628631  Bool        m_bLongTermRefsPresent;
    629632#endif
     
    724727  Void      setChromaQpOffset2nd( Int i ) { m_iChromaQpOffset2nd = i; }
    725728  Int       getChromaQpOffset2nd() { return m_iChromaQpOffset2nd;}
    726729
     730  Void      setNumRefIdxL0DefaultActive(UInt ui)    { m_uiNumRefIdxL0DefaultActive=ui;     }
     731  UInt      getNumRefIdxL0DefaultActive()           { return m_uiNumRefIdxL0DefaultActive; }
     732  Void      setNumRefIdxL1DefaultActive(UInt ui)    { m_uiNumRefIdxL1DefaultActive=ui;     }
     733  UInt      getNumRefIdxL1DefaultActive()           { return m_uiNumRefIdxL1DefaultActive; }
     734
    727735  Bool getUseWP                     ()          { return m_bUseWeightPred;  }
    728736  UInt getWPBiPredIdc               ()          { return m_uiBiPredIdc;     }
    729737
  • source/Lib/TLibDecoder/TDecCAVLC.cpp

     
    11851185  }
    11861186#endif
    11871187 
    1188   // num_ref_idx_l0_default_active_minus1
    1189   // num_ref_idx_l1_default_active_minus1
     1188  READ_CODE(3,uiCode, "num_ref_idx_l0_default_active_minus1");     pcPPS->setNumRefIdxL0DefaultActive(uiCode+1);
     1189  READ_CODE(3,uiCode, "num_ref_idx_l1_default_active_minus1");     pcPPS->setNumRefIdxL1DefaultActive(uiCode+1);
     1190
    11901191  READ_SVLC(iCode, "pic_init_qp_minus26" );                        pcPPS->setPicInitQPMinus26(iCode);
    11911192  READ_FLAG( uiCode, "constrained_intra_pred_flag" );              pcPPS->setConstrainedIntraPred( uiCode ? true : false );
    11921193  READ_FLAG( uiCode, "enable_temporal_mvp_flag" );                 pcPPS->setEnableTMVPFlag( uiCode ? true : false );
     
    18091810      }
    18101811      else
    18111812      {
    1812         rpcSlice->setNumRefIdx(REF_PIC_LIST_0, 0);
    1813         rpcSlice->setNumRefIdx(REF_PIC_LIST_1, 0);
     1813        rpcSlice->setNumRefIdx(REF_PIC_LIST_0, rpcSlice->getPPS()->getNumRefIdxL0DefaultActive());
     1814        if (rpcSlice->isInterB())
     1815        {
     1816          rpcSlice->setNumRefIdx(REF_PIC_LIST_1, rpcSlice->getPPS()->getNumRefIdxL1DefaultActive());
     1817        }
     1818        else
     1819        {
     1820          rpcSlice->setNumRefIdx(REF_PIC_LIST_1,0);
     1821        }
    18141822      }
    18151823    }
    18161824    // }
  • source/Lib/TLibEncoder/TEncCavlc.cpp

     
    299299    WRITE_FLAG( pcPPS->getTLayerSwitchingFlag( i ) ? 1 : 0 , "temporal_layer_switching_point_flag" );
    300300  }
    301301#endif
    302   //   num_ref_idx_l0_default_active_minus1
    303   //   num_ref_idx_l1_default_active_minus1
     302  WRITE_CODE( pcPPS->getNumRefIdxL0DefaultActive()-1, 3, "num_ref_idx_l0_default_active_minus1");
     303  WRITE_CODE( pcPPS->getNumRefIdxL1DefaultActive()-1, 3, "num_ref_idx_l1_default_active_minus1");
     304
    304305  WRITE_SVLC( pcPPS->getPicInitQPMinus26(),                  "pic_init_qp_minus26");
    305306  WRITE_FLAG( pcPPS->getConstrainedIntraPred() ? 1 : 0,      "constrained_intra_pred_flag" );
    306307  WRITE_FLAG( pcPPS->getEnableTMVPFlag() ? 1 : 0,            "enable_temporal_mvp_flag" );
     
    745746      WRITE_UVLC( pcSlice->getAPS()->getAPSID(), "aps_id");
    746747    }
    747748
    748     // we always set num_ref_idx_active_override_flag equal to one. this might be done in a more intelligent way
     749    //check if numrefidxes match the defaults. If not, override
     750    Bool bOverride = (pcSlice->getNumRefIdx( REF_PIC_LIST_0 )!=pcSlice->getPPS()->getNumRefIdxL0DefaultActive()||(pcSlice->isInterB()&&pcSlice->getNumRefIdx( REF_PIC_LIST_1 )!=pcSlice->getPPS()->getNumRefIdxL1DefaultActive()));
    749751    if (!pcSlice->isIntra())
    750752    {
    751       WRITE_FLAG( 1 ,                                             "num_ref_idx_active_override_flag");
    752       WRITE_CODE( pcSlice->getNumRefIdx( REF_PIC_LIST_0 ) - 1, 3, "num_ref_idx_l0_active_minus1" );
     753      if (bOverride)
     754      {
     755        WRITE_FLAG( 1 ,                                             "num_ref_idx_active_override_flag");
     756        WRITE_CODE( pcSlice->getNumRefIdx( REF_PIC_LIST_0 ) - 1, 3, "num_ref_idx_l0_active_minus1" );
     757      }
     758      else
     759      {
     760        WRITE_FLAG( 0 ,                                             "num_ref_idx_active_override_flag");
     761      }
    753762    }
    754763    else
    755764    {
     
    757766    }
    758767    if (pcSlice->isInterB())
    759768    {
    760       WRITE_CODE( pcSlice->getNumRefIdx( REF_PIC_LIST_1 ) - 1, 3, "num_ref_idx_l1_active_minus1" );
     769      if(bOverride)
     770      {
     771        WRITE_CODE( pcSlice->getNumRefIdx( REF_PIC_LIST_1 ) - 1, 3, "num_ref_idx_l1_active_minus1" );
     772      }
    761773    }
    762774    else
    763775    {
  • source/Lib/TLibEncoder/TEncTop.cpp

     
    722722#if CABAC_INIT_FLAG
    723723  m_cPPS.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
    724724#endif
     725
     726  Int histogram[8];
     727  for(Int i=0; i<8; i++)
     728  {
     729    histogram[i]=0;
     730  }
     731  for( Int i = 0; i < getGOPSize(); i++)
     732  {
     733    if(getGOPEntry(i).m_numRefPicsActive<8)
     734      histogram[getGOPEntry(i).m_numRefPicsActive]++;
     735  }
     736  Int maxHist=-1;
     737  Int bestPos=0;
     738  for(Int i=0; i<8; i++)
     739  {
     740    if(histogram[i]>maxHist)
     741    {
     742      maxHist=histogram[i];
     743      bestPos=i;
     744    }
     745  }
     746  m_cPPS.setNumRefIdxL0DefaultActive(bestPos);
     747  m_cPPS.setNumRefIdxL1DefaultActive(bestPos);
    725748}
    726749
    727750//Function for initializing m_RPSList, a list of TComReferencePictureSet, based on the GOPEntry objects read from the config file.