Changeset 1391 in SHVCSoftware for branches/SHM-dev


Ignore:
Timestamp:
4 Aug 2015, 03:15:00 (9 years ago)
Author:
seregin
Message:

port rev 4529

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

Legend:

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

    r1381 r1391  
    504504{
    505505  const T              minValIncl;
    506   const T              maxValIncl; // Use 0 for unlimited
     506  const T              maxValIncl;
    507507  const std::size_t    minNumValuesIncl;
    508508  const std::size_t    maxNumValuesIncl; // Use 0 for unlimited
     
    516516  SMultiValueInput<T> &operator=(const std::vector<T> &userValues) { values=userValues; return *this; }
    517517  SMultiValueInput<T> &operator=(const SMultiValueInput<T> &userValues) { values=userValues.values; return *this; }
     518
     519  T readValue(const Char *&pStr, Bool &bSuccess);
     520
     521  istream& readValues(std::istream &in);
    518522};
    519523
    520 static inline istream& operator >> (istream &in, SMultiValueInput<UInt> &values)
    521 {
    522   values.values.clear();
     524template <class T>
     525static inline istream& operator >> (std::istream &in, SMultiValueInput<T> &values)
     526{
     527  return values.readValues(in);
     528}
     529
     530template<>
     531UInt SMultiValueInput<UInt>::readValue(const Char *&pStr, Bool &bSuccess)
     532{
     533  Char *eptr;
     534  UInt val=strtoul(pStr, &eptr, 0);
     535  pStr=eptr;
     536  bSuccess=!(*eptr!=0 && !isspace(*eptr) && *eptr!=',') && !(val<minValIncl || val>maxValIncl);
     537  return val;
     538}
     539
     540template<>
     541Int SMultiValueInput<Int>::readValue(const Char *&pStr, Bool &bSuccess)
     542{
     543  Char *eptr;
     544  Int val=strtol(pStr, &eptr, 0);
     545  pStr=eptr;
     546  bSuccess=!(*eptr!=0 && !isspace(*eptr) && *eptr!=',') && !(val<minValIncl || val>maxValIncl);
     547  return val;
     548}
     549
     550template<>
     551Double SMultiValueInput<Double>::readValue(const Char *&pStr, Bool &bSuccess)
     552{
     553  Char *eptr;
     554  Double val=strtod(pStr, &eptr);
     555  pStr=eptr;
     556  bSuccess=!(*eptr!=0 && !isspace(*eptr) && *eptr!=',') && !(val<minValIncl || val>maxValIncl);
     557  return val;
     558}
     559
     560template<>
     561Bool SMultiValueInput<Bool>::readValue(const Char *&pStr, Bool &bSuccess)
     562{
     563  Char *eptr;
     564  Int val=strtol(pStr, &eptr, 0);
     565  pStr=eptr;
     566  bSuccess=!(*eptr!=0 && !isspace(*eptr) && *eptr!=',') && !(val<Int(minValIncl) || val>Int(maxValIncl));
     567  return val!=0;
     568}
     569
     570template <class T>
     571istream& SMultiValueInput<T>::readValues(std::istream &in)
     572{
     573  values.clear();
    523574  string str;
    524575  while (!in.eof())
     
    534585    while (*pStr != 0)
    535586    {
    536       Char *eptr;
    537       UInt val=strtoul(pStr, &eptr, 0);
    538       if (*eptr!=0 && !isspace(*eptr) && *eptr!=',')
     587      Bool bSuccess=true;
     588      T val=readValue(pStr, bSuccess);
     589      if (!bSuccess)
    539590      {
    540591        in.setstate(ios::failbit);
    541592        break;
    542593      }
    543       if (val<values.minValIncl || val>values.maxValIncl)
     594
     595      if (maxNumValuesIncl != 0 && values.size() >= maxNumValuesIncl)
    544596      {
    545597        in.setstate(ios::failbit);
    546598        break;
    547599      }
    548 
    549       if (values.maxNumValuesIncl != 0 && values.values.size() >= values.maxNumValuesIncl)
    550       {
    551         in.setstate(ios::failbit);
    552         break;
    553       }
    554       values.values.push_back(val);
     600      values.push_back(val);
    555601      // soak up any whitespace and up to 1 comma.
    556       pStr=eptr;
    557602      for(;isspace(*pStr);pStr++);
    558603      if (*pStr == ',')
     
    563608    }
    564609  }
    565   if (values.values.size() < values.minNumValuesIncl)
    566   {
    567     in.setstate(ios::failbit);
    568   }
    569   return in;
    570 }
    571 
    572 static inline istream& operator >> (istream &in, SMultiValueInput<Int> &values)
    573 {
    574   values.values.clear();
    575   string str;
    576   while (!in.eof())
    577   {
    578     string tmp; in >> tmp; str+=" " + tmp;
    579   }
    580   if (!str.empty())
    581   {
    582     const Char *pStr=str.c_str();
    583     // soak up any whitespace
    584     for(;isspace(*pStr);pStr++);
    585 
    586     while (*pStr != 0)
    587     {
    588       Char *eptr;
    589       Int val=strtol(pStr, &eptr, 0);
    590       if (*eptr!=0 && !isspace(*eptr) && *eptr!=',')
    591       {
    592         in.setstate(ios::failbit);
    593         break;
    594       }
    595       if (val<values.minValIncl || val>values.maxValIncl)
    596       {
    597         in.setstate(ios::failbit);
    598         break;
    599       }
    600 
    601       if (values.maxNumValuesIncl != 0 && values.values.size() >= values.maxNumValuesIncl)
    602       {
    603         in.setstate(ios::failbit);
    604         break;
    605       }
    606       values.values.push_back(val);
    607       // soak up any whitespace and up to 1 comma.
    608       pStr=eptr;
    609       for(;isspace(*pStr);pStr++);
    610       if (*pStr == ',')
    611       {
    612         pStr++;
    613       }
    614       for(;isspace(*pStr);pStr++);
    615     }
    616   }
    617   if (values.values.size() < values.minNumValuesIncl)
    618   {
    619     in.setstate(ios::failbit);
    620   }
    621   return in;
    622 }
    623 
    624 static inline istream& operator >> (istream &in, SMultiValueInput<Bool> &values)
    625 {
    626   values.values.clear();
    627   string str;
    628   while (!in.eof())
    629   {
    630     string tmp; in >> tmp; str+=" " + tmp;
    631   }
    632   if (!str.empty())
    633   {
    634     const Char *pStr=str.c_str();
    635     // soak up any whitespace
    636     for(;isspace(*pStr);pStr++);
    637 
    638     while (*pStr != 0)
    639     {
    640       Char *eptr;
    641       Int val=strtol(pStr, &eptr, 0);
    642       if (*eptr!=0 && !isspace(*eptr) && *eptr!=',')
    643       {
    644         in.setstate(ios::failbit);
    645         break;
    646       }
    647       if (val<Int(values.minValIncl) || val>Int(values.maxValIncl))
    648       {
    649         in.setstate(ios::failbit);
    650         break;
    651       }
    652 
    653       if (values.maxNumValuesIncl != 0 && values.values.size() >= values.maxNumValuesIncl)
    654       {
    655         in.setstate(ios::failbit);
    656         break;
    657       }
    658       values.values.push_back(val!=0);
    659       // soak up any whitespace and up to 1 comma.
    660       pStr=eptr;
    661       for(;isspace(*pStr);pStr++);
    662       if (*pStr == ',')
    663       {
    664         pStr++;
    665       }
    666       for(;isspace(*pStr);pStr++);
    667     }
    668   }
    669   if (values.values.size() < values.minNumValuesIncl)
     610  if (values.size() < minNumValuesIncl)
    670611  {
    671612    in.setstate(ios::failbit);
     
    1051992  SMultiValueInput<Int>  cfg_codedPivotValue                 (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, 1<<16);
    1052993  SMultiValueInput<Int>  cfg_targetPivotValue                (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, 1<<16);
     994
     995  SMultiValueInput<Double> cfg_adIntraLambdaModifier         (0, std::numeric_limits<Double>::max(), 0, MAX_TLAYER); ///< Lambda modifier for Intra pictures, one for each temporal layer. If size>temporalLayer, then use [temporalLayer], else if size>0, use [size()-1], else use m_adLambdaModifier.
     996
    1053997
    1054998  const UInt defaultInputKneeCodes[3]  = { 600, 800, 900 };
     
    13591303  ("LambdaModifier6,-LM6",                            m_adLambdaModifier[ 6 ],                  ( Double )1.0, "Lambda modifier for temporal layer 6")
    13601304#endif
     1305  ("LambdaModifierI,-LMI",                            cfg_adIntraLambdaModifier,    cfg_adIntraLambdaModifier, "Lambda modifiers for Intra pictures, comma separated, up to one the number of temporal layer. If entry for temporalLayer exists, then use it, else if some are specified, use the last, else use the standard LambdaModifiers.")
     1306  ("IQPFactor,-IQF",                                  m_dIntraQpFactor,                                  -1.0, "Intra QP Factor for Lambda Computation. If negative, use the default equation: 0.57*(1.0 - Clip3( 0.0, 0.5, 0.05*(Double)(isField ? (GopSize-1)/2 : GopSize-1) ))")
    13611307
    13621308  /* Quantization parameters */
     
    18311777
    18321778
     1779  m_adIntraLambdaModifier = cfg_adIntraLambdaModifier.values;
    18331780  if(m_isField)
    18341781  {
  • branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.h

    r1381 r1391  
    8888  Char*     m_pchReconFile;                                   ///< output reconstruction file
    8989#endif
     90  // Lambda modifiers
    9091  Double    m_adLambdaModifier[ MAX_TLAYER ];                 ///< Lambda modifier array for each temporal layer
     92  std::vector<Double> m_adIntraLambdaModifier;                ///< Lambda modifier for Intra pictures, one for each temporal layer. If size>temporalLayer, then use [temporalLayer], else if size>0, use [size()-1], else use m_adLambdaModifier.
     93  Double    m_dIntraQpFactor;                                 ///< Intra Q Factor. If negative, use a default equation: 0.57*(1.0 - Clip3( 0.0, 0.5, 0.05*(Double)(isField ? (GopSize-1)/2 : GopSize-1) ))
     94
    9195  // source specification
    9296#if !SVC_EXTENSION
  • branches/SHM-dev/source/App/TAppEncoder/TAppEncTop.cpp

    r1381 r1391  
    537537    m_cTEncTop.setLambdaModifier                                  ( uiLoop, m_adLambdaModifier[ uiLoop ] );
    538538  }
     539  m_cTEncTop.setIntraLambdaModifier                               ( m_adIntraLambdaModifier );
     540  m_cTEncTop.setIntraQpFactor                                     ( m_dIntraQpFactor );
     541
    539542  m_cTEncTop.setQP                                                ( m_iQP );
    540543
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncCfg.h

    r1369 r1391  
    108108  Int       m_framesToBeEncoded;
    109109  Double    m_adLambdaModifier[ MAX_TLAYER ];
     110  std::vector<Double> m_adIntraLambdaModifier;
     111  Double    m_dIntraQpFactor;                                 ///< Intra Q Factor. If negative, use a default equation: 0.57*(1.0 - Clip3( 0.0, 0.5, 0.05*(Double)(isField ? (GopSize-1)/2 : GopSize-1) ))
    110112
    111113  Bool      m_printMSEBasedSequencePSNR;
     
    597599  Int       getSourceHeight                 ()      { return  m_iSourceHeight; }
    598600  Int       getFramesToBeEncoded            ()      { return  m_framesToBeEncoded; }
    599   Void setLambdaModifier                    ( UInt uiIndex, Double dValue ) { m_adLambdaModifier[ uiIndex ] = dValue; }
    600   Double getLambdaModifier                  ( UInt uiIndex ) const { return m_adLambdaModifier[ uiIndex ]; }
     601 
     602  //====== Lambda Modifiers ========
     603  Void      setLambdaModifier               ( UInt uiIndex, Double dValue ) { m_adLambdaModifier[ uiIndex ] = dValue; }
     604  Double    getLambdaModifier               ( UInt uiIndex )          const { return m_adLambdaModifier[ uiIndex ]; }
     605  Void      setIntraLambdaModifier          ( const std::vector<Double> &dValue )               { m_adIntraLambdaModifier = dValue;       }
     606  const std::vector<Double>& getIntraLambdaModifier()                        const { return m_adIntraLambdaModifier;         }
     607  Void      setIntraQpFactor                ( Double dValue )               { m_dIntraQpFactor = dValue;              }
     608  Double    getIntraQpFactor                ()                        const { return m_dIntraQpFactor;                }
    601609
    602610  //==== Coding Structure ========
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncSlice.cpp

    r1390 r1391  
    236236 */
    237237
    238 Void TEncSlice::initEncSlice( TComPic* pcPic, Int pocLast, Int pocCurr, Int iGOPid, TComSlice*& rpcSlice, Bool isField )
     238Void TEncSlice::initEncSlice( TComPic* pcPic, const Int pocLast, const Int pocCurr, const Int iGOPid, TComSlice*& rpcSlice, const Bool isField )
    239239{
    240240  Double dQP;
     
    377377    Int    SHIFT_QP = 12;
    378378
    379     Double dLambda_scale = 1.0 - Clip3( 0.0, 0.5, 0.05*(Double)(isField ? NumberBFrames/2 : NumberBFrames) );
    380 
    381379#if FULL_NBIT
    382380#if SVC_EXTENSION
     
    396394    if ( eSliceType==I_SLICE )
    397395    {
    398       dQPFactor=0.57*dLambda_scale;
    399     }
     396      if (m_pcCfg->getIntraQpFactor()>=0.0 && m_pcCfg->getGOPEntry(iGOPid).m_sliceType != I_SLICE)
     397      {
     398        dQPFactor=m_pcCfg->getIntraQpFactor();
     399      }
     400      else
     401      {
     402        Double dLambda_scale = 1.0 - Clip3( 0.0, 0.5, 0.05*(Double)(isField ? NumberBFrames/2 : NumberBFrames) );
     403       
     404        dQPFactor=0.57*dLambda_scale;
     405      }
     406    }
     407   
    400408    dLambda = dQPFactor*pow( 2.0, qp_temp/3.0 );
    401409
     
    431439  iQP     = m_piRdPicQp    [0];
    432440
    433   if( rpcSlice->getSliceType( ) != I_SLICE )
    434   {
    435     dLambda *= m_pcCfg->getLambdaModifier( m_pcCfg->getGOPEntry(iGOPid).m_temporalId );
    436   }
     441  const Int temporalId=m_pcCfg->getGOPEntry(iGOPid).m_temporalId;
     442  const std::vector<Double> &intraLambdaModifiers=m_pcCfg->getIntraLambdaModifier();
     443
     444  Double lambdaModifier;
     445  if( rpcSlice->getSliceType( ) != I_SLICE || intraLambdaModifiers.empty())
     446  {
     447    lambdaModifier = m_pcCfg->getLambdaModifier( temporalId );
     448  }
     449  else
     450  {
     451    lambdaModifier = intraLambdaModifiers[ (temporalId < intraLambdaModifiers.size()) ? temporalId : (intraLambdaModifiers.size()-1) ];
     452  }
     453
     454  dLambda *= lambdaModifier;
    437455
    438456#if JCTVC_M0259_LAMBDAREFINEMENT
     
    524542  rpcSlice->setDepth            ( depth );
    525543
    526   pcPic->setTLayer( m_pcCfg->getGOPEntry(iGOPid).m_temporalId );
     544  pcPic->setTLayer( temporalId );
    527545  if(eSliceType==I_SLICE)
    528546  {
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncSlice.h

    r1389 r1391  
    120120
    121121  /// preparation of slice encoding (reference marking, QP and lambda)
    122   Void    initEncSlice        ( TComPic*  pcPic, Int pocLast, Int pocCurr,
    123                                 Int iGOPid,   TComSlice*& rpcSlice, Bool isField );
     122  Void    initEncSlice        ( TComPic*  pcPic, const Int pocLast, const Int pocCurr,
     123                                const Int iGOPid,   TComSlice*& rpcSlice, const Bool isField );
    124124  Void    resetQP             ( TComPic* pic, Int sliceQP, Double lambda );
    125125  // compress and encode slice
Note: See TracChangeset for help on using the changeset viewer.