Changeset 1369 in SHVCSoftware


Ignore:
Timestamp:
22 Jul 2015, 04:53:13 (9 years ago)
Author:
seregin
Message:

port rev 4487

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

Legend:

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

    r1366 r1369  
    13281328#endif
    13291329  ("MaxCUChromaQpAdjustmentDepth",                    m_diffCuChromaQpOffsetDepth,                         -1, "Maximum depth for CU chroma Qp adjustment - set less than 0 to disable")
     1330  ("FastDeltaQP",                                     m_bFastDeltaQP,                                   false, "Fast Delta QP Algorithm")
    13301331
    13311332  ("CbQpOffset,-cbqpofs",                             m_cbQpOffset,                                         0, "Chroma Cb QP Offset")
  • branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.h

    r1366 r1369  
    205205#endif
    206206  Int       m_diffCuChromaQpOffsetDepth;                      ///< If negative, then do not apply chroma qp offsets.
     207  Bool      m_bFastDeltaQP;                                   ///< Fast Delta QP (false:default)
    207208
    208209  Int       m_cbQpOffset;                                     ///< Chroma Cb QP Offset (0:default)
  • branches/SHM-dev/source/App/TAppEncoder/TAppEncTop.cpp

    r1366 r1369  
    433433    //====== Tool list ========   
    434434    m_acTEncTop[layer].setDeltaQpRD                                        ( m_uiDeltaQpRD  );
     435    m_acTEncTop[layer].setFastDeltaQp                                      ( m_bFastDeltaQP  );
    435436    m_acTEncTop[layer].setUseASR                                           ( m_bUseASR      );
    436437    m_acTEncTop[layer].setUseHADME                                         ( m_bUseHADME    );   
     
    883884  //====== Tool list ========
    884885  m_cTEncTop.setDeltaQpRD                                         ( m_uiDeltaQpRD  );
     886  m_cTEncTop.setFastDeltaQp                                       ( m_bFastDeltaQP  );
    885887  m_cTEncTop.setUseASR                                            ( m_bUseASR      );
    886888  m_cTEncTop.setUseHADME                                          ( m_bUseHADME    );
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncCfg.h

    r1356 r1369  
    224224  Int*      m_aidQP;
    225225  UInt      m_uiDeltaQpRD;
     226  Bool      m_bFastDeltaQP;
    226227
    227228  Bool      m_bUseConstrainedIntraPred;
     
    663664  Void      setdQPs                         ( Int*  p )     { m_aidQP       = p; }
    664665  Void      setDeltaQpRD                    ( UInt  u )     {m_uiDeltaQpRD  = u; }
     666  Void      setFastDeltaQp                  ( Bool  b )     {m_bFastDeltaQP = b; }
    665667  Bool      getUseASR                       ()      { return m_bUseASR;     }
    666668  Bool      getUseHADME                     ()      { return m_bUseHADME;   }
     
    711713  Void setIntraSmoothingDisabledFlag               (Bool bValue) { m_intraSmoothingDisabledFlag=bValue; }
    712714
    713   Int*      getdQPs                         ()      { return m_aidQP;       }
    714   UInt      getDeltaQpRD                    ()      { return m_uiDeltaQpRD; }
     715  Int*      getdQPs                         ()       { return m_aidQP;       }
     716  UInt      getDeltaQpRD                    () const { return m_uiDeltaQpRD; }
     717  Bool      getFastDeltaQp                  () const { return m_bFastDeltaQP; }
    715718
    716719  //====== Slice ========
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncCu.cpp

    r1346 r1369  
    100100  m_stillToCodeChromaQpOffsetFlag  = false;
    101101  m_cuChromaQpOffsetIdxPlus1       = 0;
     102  m_bFastDeltaQP                   = false;
    102103
    103104  // initialize partition order.
     
    365366*/
    366367#if AMP_ENC_SPEEDUP
    367 Void TEncCu::xCompressCU( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU, UInt uiDepth DEBUG_STRING_FN_DECLARE(sDebug_), PartSize eParentPartSize )
    368 #else
    369 Void TEncCu::xCompressCU( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU, UInt uiDepth )
     368Void TEncCu::xCompressCU( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU, const UInt uiDepth DEBUG_STRING_FN_DECLARE(sDebug_), PartSize eParentPartSize )
     369#else
     370Void TEncCu::xCompressCU( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU, const UInt uiDepth )
    370371#endif
    371372{
     
    374375  const TComPPS &pps=*(rpcTempCU->getSlice()->getPPS());
    375376  const TComSPS &sps=*(rpcTempCU->getSlice()->getSPS());
     377 
     378  // These are only used if getFastDeltaQp() is true
     379  const UInt fastDeltaQPCuMaxSize    = Clip3(sps.getMaxCUHeight()>>sps.getLog2DiffMaxMinCodingBlockSize(), sps.getMaxCUHeight(), 32u);
    376380
    377381  // get Original YUV data from picture
    378382  m_ppcOrigYuv[uiDepth]->copyFromPicYuv( pcPic->getPicYuvOrg(), rpcBestCU->getCtuRsAddr(), rpcBestCU->getZorderIdxInCtu() );
    379 
    380     // variable for Early CU determination
    381   Bool    bSubBranch = true;
    382383
    383384  // variable for Cbf fast mode PU decision
     
    385386  Bool    earlyDetectionSkipMode = false;
    386387
    387   Bool bBoundary = false;
    388   UInt uiLPelX   = rpcBestCU->getCUPelX();
    389   UInt uiRPelX   = uiLPelX + rpcBestCU->getWidth(0)  - 1;
    390   UInt uiTPelY   = rpcBestCU->getCUPelY();
    391   UInt uiBPelY   = uiTPelY + rpcBestCU->getHeight(0) - 1;
     388  const UInt uiLPelX   = rpcBestCU->getCUPelX();
     389  const UInt uiRPelX   = uiLPelX + rpcBestCU->getWidth(0)  - 1;
     390  const UInt uiTPelY   = rpcBestCU->getCUPelY();
     391  const UInt uiBPelY   = uiTPelY + rpcBestCU->getHeight(0) - 1;
     392  const UInt uiWidth   = rpcBestCU->getWidth(0);
    392393
    393394  Int iBaseQP = xComputeQP( rpcBestCU, uiDepth );
     
    436437
    437438  TComSlice * pcSlice = rpcTempCU->getPic()->getSlice(rpcTempCU->getPic()->getCurrSliceIdx());
    438   // We need to split, so don't try these modes.
    439439#if SVC_EXTENSION
    440   if ( ( uiRPelX < rpcBestCU->getSlice()->getPicWidthInLumaSamples() ) &&
    441        ( uiBPelY < rpcBestCU->getSlice()->getPicHeightInLumaSamples() ) )
    442 #else
    443   if ( ( uiRPelX < sps.getPicWidthInLumaSamples() ) &&
    444        ( uiBPelY < sps.getPicHeightInLumaSamples() ) )
    445 #endif
     440  const Bool bBoundary = !( uiRPelX < rpcBestCU->getSlice()->getPicWidthInLumaSamples() && uiBPelY < rpcBestCU->getSlice()->getPicHeightInLumaSamples() );
     441#else
     442  const Bool bBoundary = !( uiRPelX < sps.getPicWidthInLumaSamples() && uiBPelY < sps.getPicHeightInLumaSamples() );
     443#endif
     444
     445  if ( !bBoundary )
    446446  {
    447447#if HIGHER_LAYER_IRAP_SKIP_FLAG
     
    774774    }
    775775
    776     m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[uiDepth][CI_NEXT_BEST]);
    777     m_pcEntropyCoder->resetBits();
    778     m_pcEntropyCoder->encodeSplitFlag( rpcBestCU, 0, uiDepth, true );
    779     rpcBestCU->getTotalBits() += m_pcEntropyCoder->getNumberOfWrittenBits(); // split bits
    780     rpcBestCU->getTotalBins() += ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
    781     rpcBestCU->getTotalCost()  = m_pcRdCost->calcRdCost( rpcBestCU->getTotalBits(), rpcBestCU->getTotalDistortion() );
    782     m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[uiDepth][CI_NEXT_BEST]);
    783 
    784     // Early CU determination
    785     if( m_pcEncCfg->getUseEarlyCU() && rpcBestCU->isSkipped(0) )
    786     {
    787       bSubBranch = false;
    788     }
    789     else
    790     {
    791       bSubBranch = true;
    792     }
     776    if( rpcBestCU->getTotalCost()!=MAX_DOUBLE )
     777    {
     778      m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[uiDepth][CI_NEXT_BEST]);
     779      m_pcEntropyCoder->resetBits();
     780      m_pcEntropyCoder->encodeSplitFlag( rpcBestCU, 0, uiDepth, true );
     781      rpcBestCU->getTotalBits() += m_pcEntropyCoder->getNumberOfWrittenBits(); // split bits
     782      rpcBestCU->getTotalBins() += ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
     783      rpcBestCU->getTotalCost()  = m_pcRdCost->calcRdCost( rpcBestCU->getTotalBits(), rpcBestCU->getTotalDistortion() );
     784      m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[uiDepth][CI_NEXT_BEST]);
     785    }
     786
    793787#if HIGHER_LAYER_IRAP_SKIP_FLAG
    794788    }
    795789#endif
    796790  }
    797   else
    798   {
    799     bBoundary = true;
    800   }
    801 
    802   // copy orginal YUV samples to PCM buffer
    803   if( rpcBestCU->isLosslessCoded(0) && (rpcBestCU->getIPCMFlag(0) == false))
     791
     792  // copy original YUV samples to PCM buffer
     793  if( rpcBestCU->getTotalCost()!=MAX_DOUBLE && rpcBestCU->isLosslessCoded(0) && (rpcBestCU->getIPCMFlag(0) == false))
    804794  {
    805795    xFillPCMBuffer(rpcBestCU, m_ppcOrigYuv[uiDepth]);
     
    840830  }
    841831
    842   for (Int iQP=iMinQP; iQP<=iMaxQP; iQP++)
    843   {
    844     const Bool bIsLosslessMode = false; // False at this level. Next level down may set it to true.
    845 
    846     rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    847 
     832  const Bool bSubBranch = bBoundary || !( m_pcEncCfg->getUseEarlyCU() && rpcBestCU->getTotalCost()!=MAX_DOUBLE && rpcBestCU->isSkipped(0) );
     833
     834  if( bSubBranch && uiDepth < sps.getLog2DiffMaxMinCodingBlockSize() && (!getFastDeltaQp() || uiWidth > fastDeltaQPCuMaxSize || bBoundary))
     835  {
    848836    // further split
    849     if( bSubBranch && uiDepth < sps.getLog2DiffMaxMinCodingBlockSize() )
    850     {
     837    for (Int iQP=iMinQP; iQP<=iMaxQP; iQP++)
     838    {
     839      const Bool bIsLosslessMode = false; // False at this level. Next level down may set it to true.
     840
     841      rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
     842
    851843      UChar       uhNextDepth         = uiDepth+1;
    852844      TComDataCU* pcSubBestPartCU     = m_ppcBestCU[uhNextDepth];
     
    876868#if AMP_ENC_SPEEDUP
    877869          DEBUG_STRING_NEW(sChild)
    878           if ( !rpcBestCU->isInter(0) )
     870          if ( !(rpcBestCU->getTotalCost()!=MAX_DOUBLE && rpcBestCU->isInter(0)) )
    879871          {
    880872            xCompressCU( pcSubBestPartCU, pcSubTempPartCU, uhNextDepth DEBUG_STRING_PASS_INTO(sChild), NUMBER_OF_PART_SIZES );
     
    951943      // This can be achieved by forcing the decision to be that of the rpcTempCU.
    952944      // The exception is each slice / slice-segment must have at least one CTU.
    953       const Bool isEndOfSlice        =    pcSlice->getSliceMode()==FIXED_NUMBER_OF_BYTES
    954                                        && ((pcSlice->getSliceBits()+rpcBestCU->getTotalBits())>pcSlice->getSliceArgument()<<3)
    955                                        && rpcBestCU->getCtuRsAddr() != pcPic->getPicSym()->getCtuTsToRsAddrMap(pcSlice->getSliceCurStartCtuTsAddr())
    956                                        && rpcBestCU->getCtuRsAddr() != pcPic->getPicSym()->getCtuTsToRsAddrMap(pcSlice->getSliceSegmentCurStartCtuTsAddr());
    957       const Bool isEndOfSliceSegment =    pcSlice->getSliceSegmentMode()==FIXED_NUMBER_OF_BYTES
    958                                        && ((pcSlice->getSliceSegmentBits()+rpcBestCU->getTotalBits()) > pcSlice->getSliceSegmentArgument()<<3)
    959                                        && rpcBestCU->getCtuRsAddr() != pcPic->getPicSym()->getCtuTsToRsAddrMap(pcSlice->getSliceSegmentCurStartCtuTsAddr());
    960                                            // Do not need to check slice condition for slice-segment since a slice-segment is a subset of a slice.
    961       if(isEndOfSlice||isEndOfSliceSegment)
    962       {
    963         rpcBestCU->getTotalCost()=MAX_DOUBLE;
     945      if (rpcBestCU->getTotalCost()!=MAX_DOUBLE)
     946      {
     947        const Bool isEndOfSlice        =    pcSlice->getSliceMode()==FIXED_NUMBER_OF_BYTES
     948                                         && ((pcSlice->getSliceBits()+rpcBestCU->getTotalBits())>pcSlice->getSliceArgument()<<3)
     949                                         && rpcBestCU->getCtuRsAddr() != pcPic->getPicSym()->getCtuTsToRsAddrMap(pcSlice->getSliceCurStartCtuTsAddr())
     950                                         && rpcBestCU->getCtuRsAddr() != pcPic->getPicSym()->getCtuTsToRsAddrMap(pcSlice->getSliceSegmentCurStartCtuTsAddr());
     951        const Bool isEndOfSliceSegment =    pcSlice->getSliceSegmentMode()==FIXED_NUMBER_OF_BYTES
     952                                         && ((pcSlice->getSliceSegmentBits()+rpcBestCU->getTotalBits()) > pcSlice->getSliceSegmentArgument()<<3)
     953                                         && rpcBestCU->getCtuRsAddr() != pcPic->getPicSym()->getCtuTsToRsAddrMap(pcSlice->getSliceSegmentCurStartCtuTsAddr());
     954                                             // Do not need to check slice condition for slice-segment since a slice-segment is a subset of a slice.
     955        if(isEndOfSlice||isEndOfSliceSegment)
     956        {
     957          rpcBestCU->getTotalCost()=MAX_DOUBLE;
     958        }
    964959      }
    965960
    966961      xCheckBestMode( rpcBestCU, rpcTempCU, uiDepth DEBUG_STRING_PASS_INTO(sDebug) DEBUG_STRING_PASS_INTO(sTempDebug) DEBUG_STRING_PASS_INTO(false) ); // RD compare current larger prediction
    967                                                                                        // with sub partitioned prediction.
     962                                                                                                                                                       // with sub partitioned prediction.
    968963    }
    969964  }
     
    12991294{
    13001295  assert( rpcTempCU->getSlice()->getSliceType() != I_SLICE );
     1296  if(getFastDeltaQp())
     1297  {
     1298    return;   // never check merge in fast deltaqp mode
     1299  }
    13011300  TComMvField  cMvFieldNeighbours[2 * MRG_MAX_NUM_CANDS]; // double length for mv of both lists
    13021301  UChar uhInterDirNeighbours[MRG_MAX_NUM_CANDS];
     
    14471446  DEBUG_STRING_NEW(sTest)
    14481447
     1448  if(getFastDeltaQp())
     1449  {
     1450    const TComSPS &sps=*(rpcTempCU->getSlice()->getSPS());
     1451    const UInt fastDeltaQPCuMaxSize = Clip3(sps.getMaxCUHeight()>>(sps.getLog2DiffMaxMinCodingBlockSize()), sps.getMaxCUHeight(), 32u);
     1452    if(ePartSize != SIZE_2Nx2N || rpcTempCU->getWidth( 0 ) > fastDeltaQPCuMaxSize)
     1453    {
     1454      return; // only check necessary 2Nx2N Inter in fast deltaqp mode
     1455    }
     1456  }
     1457
    14491458  // prior to this, rpcTempCU will have just been reset using rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    14501459  UChar uhDepth = rpcTempCU->getDepth( 0 );
     
    15011510  DEBUG_STRING_NEW(sTest)
    15021511
     1512  if(getFastDeltaQp())
     1513  {
     1514    const TComSPS &sps=*(rpcTempCU->getSlice()->getSPS());
     1515    const UInt fastDeltaQPCuMaxSize = Clip3(sps.getMaxCUHeight()>>(sps.getLog2DiffMaxMinCodingBlockSize()), sps.getMaxCUHeight(), 32u);
     1516    if(rpcTempCU->getWidth( 0 ) > fastDeltaQPCuMaxSize)
     1517    {
     1518      return; // only check necessary 2Nx2N Intra in fast deltaqp mode
     1519    }
     1520  }
     1521
    15031522  UInt uiDepth = rpcTempCU->getDepth( 0 );
    15041523
     
    15631582Void TEncCu::xCheckIntraPCM( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU )
    15641583{
     1584  if(getFastDeltaQp())
     1585  {
     1586    const TComSPS &sps=*(rpcTempCU->getSlice()->getSPS());
     1587    const UInt fastDeltaQPCuMaxPCMSize = Clip3((UInt)1<<sps.getPCMLog2MinSize(), (UInt)1<<sps.getPCMLog2MaxSize(), 32u);
     1588    if (rpcTempCU->getWidth( 0 ) > fastDeltaQPCuMaxPCMSize)
     1589    {
     1590      return;   // only check necessary PCM in fast deltaqp mode
     1591    }
     1592  }
     1593 
    15651594  UInt uiDepth = rpcTempCU->getDepth( 0 );
    15661595
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncCu.h

    r1316 r1369  
    8181  //  Data : encoder control
    8282  Bool                    m_bEncodeDQP;
     83  Bool                    m_bFastDeltaQP;
    8384  Bool                    m_stillToCodeChromaQpOffsetFlag; //indicates whether chroma QP offset flag needs to coded at this particular CU granularity.
    8485  Int                     m_cuChromaQpOffsetIdxPlus1; // if 0, then cu_chroma_qp_offset_flag will be 0, otherwise cu_chroma_qp_offset_flag will be 1.
     
    122123  Int   updateCtuDataISlice ( TComDataCU* pCtu, Int width, Int height );
    123124
     125  Void setFastDeltaQp       ( Bool b)                 { m_bFastDeltaQP = b;         }
     126
    124127protected:
    125128  Void  finishCU            ( TComDataCU*  pcCU, UInt uiAbsPartIdx );
    126129#if AMP_ENC_SPEEDUP
    127   Void  xCompressCU         ( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU, UInt uiDepth DEBUG_STRING_FN_DECLARE(sDebug), PartSize eParentPartSize = NUMBER_OF_PART_SIZES );
     130  Void  xCompressCU         ( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU, const UInt uiDepth DEBUG_STRING_FN_DECLARE(sDebug), PartSize eParentPartSize = NUMBER_OF_PART_SIZES );
    128131#else
    129   Void  xCompressCU         ( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU, UInt uiDepth        );
     132  Void  xCompressCU         ( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU, const UInt uiDepth        );
    130133#endif
    131134  Void  xEncodeCU           ( TComDataCU*  pcCU, UInt uiAbsPartIdx,           UInt uiDepth        );
     
    162165  Void setdQPFlag           ( Bool b )                { m_bEncodeDQP = b;           }
    163166
     167  Bool getFastDeltaQp       () const                  { return m_bFastDeltaQP;      }
     168
    164169  Bool getCodeChromaQpAdjFlag() { return m_stillToCodeChromaQpOffsetFlag; }
    165170  Void setCodeChromaQpAdjFlag( Bool b ) { m_stillToCodeChromaQpOffsetFlag = b; }
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncGOP.cpp

    r1367 r1369  
    24922492      {
    24932493        m_pcSliceEncoder->precompressSlice( pcPic );
    2494         m_pcSliceEncoder->compressSlice   ( pcPic, false );
     2494        m_pcSliceEncoder->compressSlice   ( pcPic, false, false );
    24952495
    24962496        const UInt curSliceSegmentEnd = pcSlice->getSliceSegmentCurEndCtuTsAddr();
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncSlice.cpp

    r1336 r1369  
    677677
    678678    // try compress
    679     compressSlice   ( pcPic, true );
     679    compressSlice   ( pcPic, true, m_pcCfg->getFastDeltaQp());
    680680
    681681    UInt64 uiPicDist        = m_uiPicDist; // Distortion, as calculated by compressSlice.
     
    749749/** \param pcPic   picture class
    750750 */
    751 Void TEncSlice::compressSlice( TComPic* pcPic, const Bool bCompressEntireSlice )
     751Void TEncSlice::compressSlice( TComPic* pcPic, const Bool bCompressEntireSlice, const Bool bFastDeltaQP )
    752752{
    753753  // if bCompressEntireSlice is true, then the entire slice (not slice segment) is compressed,
     
    779779  TComBitCounter  tempBitCounter;
    780780  const UInt      frameWidthInCtus = pcPic->getPicSym()->getFrameWidthInCtus();
     781 
     782  m_pcCuEncoder->setFastDeltaQp(bFastDeltaQP);
    781783
    782784  //------------------------------------------------------------------------------
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncSlice.h

    r1318 r1369  
    125125  // compress and encode slice
    126126  Void    precompressSlice    ( TComPic* pcPic                                     );      ///< precompress slice for multi-loop slice-level QP opt.
    127   Void    compressSlice       ( TComPic* pcPic, const Bool bCompressEntireSlice    );      ///< analysis stage of slice
     127  Void    compressSlice       ( TComPic* pcPic, const Bool bCompressEntireSlice, const Bool bFastDeltaQP );      ///< analysis stage of slice
    128128  Void    calCostSliceI       ( TComPic* pcPic );
    129129  Void    encodeSlice         ( TComPic* pcPic, TComOutputBitstream* pcSubstreams, UInt &numBinsCoded );
Note: See TracChangeset for help on using the changeset viewer.