Changeset 1360 in 3DVCSoftware for branches/HTM-15.2-dev/source/Lib/TLibEncoder


Ignore:
Timestamp:
28 Oct 2015, 17:46:00 (9 years ago)
Author:
tech
Message:

Update to HM-16.7.

Location:
branches/HTM-15.2-dev/source/Lib/TLibEncoder
Files:
28 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/AnnexBwrite.h

    r1313 r1360  
    6060    UInt size = 0; /* size of annexB unit in bytes */
    6161
    62     static const Char start_code_prefix[] = {0,0,0,1};
     62    static const UChar start_code_prefix[] = {0,0,0,1};
    6363    if (it == au.begin() || nalu.m_nalUnitType == NAL_UNIT_VPS || nalu.m_nalUnitType == NAL_UNIT_SPS || nalu.m_nalUnitType == NAL_UNIT_PPS)
    6464    {
     
    7171       *    7.4.1.2.3.
    7272       */
    73       out.write(start_code_prefix, 4);
     73      out.write(reinterpret_cast<const TChar*>(start_code_prefix), 4);
    7474      size += 4;
    7575    }
    7676    else
    7777    {
    78       out.write(start_code_prefix+1, 3);
     78      out.write(reinterpret_cast<const TChar*>(start_code_prefix+1), 3);
    7979      size += 3;
    8080    }
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/NALwrite.cpp

    r1313 r1360  
    4545//! \{
    4646
    47 static const Char emulation_prevention_three_byte[] = {3};
     47static const UChar emulation_prevention_three_byte[] = {3};
    4848
    4949Void writeNalUnitHeader(ostream& out, OutputNALUnit& nalu)       // nal_unit_header()
     
    6060  bsNALUHeader.write(nalu.m_temporalId+1, 3); // nuh_temporal_id_plus1
    6161
    62   out.write(bsNALUHeader.getByteStream(), bsNALUHeader.getByteStreamLength());
     62  out.write(reinterpret_cast<const TChar*>(bsNALUHeader.getByteStream()), bsNALUHeader.getByteStreamLength());
    6363}
    6464/**
     
    124124    outputBuffer[outputAmount++]=emulation_prevention_three_byte[0];
    125125  }
    126   out.write((Char*)&(*outputBuffer.begin()), outputAmount);
     126  out.write(reinterpret_cast<const TChar*>(&(*outputBuffer.begin())), outputAmount);
    127127}
    128128
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/SEIEncoder.cpp

    r1356 r1360  
    294294  assert (pcPic!=NULL);
    295295
    296   if(m_pcCfg->getDecodedPictureHashSEIEnabled() == 1)
    297   {
    298     decodedPictureHashSEI->method = SEIDecodedPictureHash::MD5;
     296  decodedPictureHashSEI->method = m_pcCfg->getDecodedPictureHashSEIType();
     297  switch (m_pcCfg->getDecodedPictureHashSEIType())
     298  {
     299    case HASHTYPE_MD5:
     300  {
    299301    UInt numChar=calcMD5(*pcPic->getPicYuvRec(), decodedPictureHashSEI->m_pictureHash, bitDepths);
    300302    rHashString = hashToString(decodedPictureHashSEI->m_pictureHash, numChar);
    301303  }
    302   else if(m_pcCfg->getDecodedPictureHashSEIEnabled() == 2)
    303   {
    304     decodedPictureHashSEI->method = SEIDecodedPictureHash::CRC;
     304      break;
     305    case HASHTYPE_CRC:
     306  {
    305307    UInt numChar=calcCRC(*pcPic->getPicYuvRec(), decodedPictureHashSEI->m_pictureHash, bitDepths);
    306308    rHashString = hashToString(decodedPictureHashSEI->m_pictureHash, numChar);
    307309  }
    308   else if(m_pcCfg->getDecodedPictureHashSEIEnabled() == 3)
    309   {
    310     decodedPictureHashSEI->method = SEIDecodedPictureHash::CHECKSUM;
     310      break;
     311    case HASHTYPE_CHECKSUM:
     312    default:
     313  {
    311314    UInt numChar=calcChecksum(*pcPic->getPicYuvRec(), decodedPictureHashSEI->m_pictureHash, bitDepths);
    312315    rHashString = hashToString(decodedPictureHashSEI->m_pictureHash, numChar);
     316  }
     317      break;
    313318  }
    314319}
     
    397402  }
    398403}
    399 
    400 Void SEIEncoder::initSEIChromaSamplingFilterHint(SEIChromaSamplingFilterHint *seiChromaSamplingFilterHint, Int iHorFilterIndex, Int iVerFilterIndex)
    401 {
    402   assert (m_isInitialized);
    403   assert (seiChromaSamplingFilterHint!=NULL);
    404 
    405   seiChromaSamplingFilterHint->m_verChromaFilterIdc = iVerFilterIndex;
    406   seiChromaSamplingFilterHint->m_horChromaFilterIdc = iHorFilterIndex;
    407   seiChromaSamplingFilterHint->m_verFilteringProcessFlag = 1;
    408   seiChromaSamplingFilterHint->m_targetFormatIdc = 3;
    409   seiChromaSamplingFilterHint->m_perfectReconstructionFlag = false;
    410   if(seiChromaSamplingFilterHint->m_verChromaFilterIdc == 1)
    411   {
    412     seiChromaSamplingFilterHint->m_numVerticalFilters = 1;
    413     seiChromaSamplingFilterHint->m_verTapLengthMinus1 = (Int*)malloc(seiChromaSamplingFilterHint->m_numVerticalFilters * sizeof(Int));
    414     seiChromaSamplingFilterHint->m_verFilterCoeff =    (Int**)malloc(seiChromaSamplingFilterHint->m_numVerticalFilters * sizeof(Int*));
    415     for(Int i = 0; i < seiChromaSamplingFilterHint->m_numVerticalFilters; i ++)
    416     {
    417       seiChromaSamplingFilterHint->m_verTapLengthMinus1[i] = 0;
    418       seiChromaSamplingFilterHint->m_verFilterCoeff[i] = (Int*)malloc(seiChromaSamplingFilterHint->m_verTapLengthMinus1[i] * sizeof(Int));
    419       for(Int j = 0; j < seiChromaSamplingFilterHint->m_verTapLengthMinus1[i]; j ++)
    420       {
    421         seiChromaSamplingFilterHint->m_verFilterCoeff[i][j] = 0;
    422       }
    423     }
     404template <typename T>
     405static Void readTokenValue(T            &returnedValue, /// value returned
     406                           Bool         &failed,        /// used and updated
     407                           std::istream &is,            /// stream to read token from
     408                           const TChar  *pToken)        /// token string
     409{
     410  returnedValue=T();
     411  if (failed)
     412  {
     413    return;
     414  }
     415
     416  Int c;
     417  // Ignore any whitespace
     418  while ((c=is.get())!=EOF && isspace(c));
     419  // test for comment mark
     420  while (c=='#')
     421  {
     422    // Ignore to the end of the line
     423    while ((c=is.get())!=EOF && (c!=10 && c!=13));
     424    // Ignore any white space at the start of the next line
     425    while ((c=is.get())!=EOF && isspace(c));
     426  }
     427  // test first character of token
     428  failed=(c!=pToken[0]);
     429  // test remaining characters of token
     430  Int pos;
     431  for(pos=1;!failed && pToken[pos]!=0 && is.get()==pToken[pos]; pos++);
     432  failed|=(pToken[pos]!=0);
     433  // Ignore any whitespace before the ':'
     434  while (!failed && (c=is.get())!=EOF && isspace(c));
     435  failed|=(c!=':');
     436  // Now read the value associated with the token:
     437  if (!failed)
     438  {
     439    is >> returnedValue;
     440    failed=!is.good();
     441    if (!failed)
     442    {
     443      c=is.get();
     444      failed=(c!=EOF && !isspace(c));
     445    }
     446  }
     447  if (failed)
     448  {
     449    std::cerr << "Unable to read token '" << pToken << "'\n";
     450  }
     451}
     452
     453template <typename T>
     454static Void readTokenValueAndValidate(T            &returnedValue, /// value returned
     455                                      Bool         &failed,        /// used and updated
     456                                      std::istream &is,            /// stream to read token from
     457                                      const TChar  *pToken,        /// token string
     458                                      const T      &minInclusive,  /// minimum value allowed, inclusive
     459                                      const T      &maxInclusive)  /// maximum value allowed, inclusive
     460{
     461  readTokenValue(returnedValue, failed, is, pToken);
     462  if (!failed)
     463  {
     464    if (returnedValue<minInclusive || returnedValue>maxInclusive)
     465    {
     466      failed=true;
     467      std::cerr << "Value for token " << pToken << " must be in the range " << minInclusive << " to " << maxInclusive << " (inclusive); value read: " << returnedValue << std::endl;
     468    }
     469  }
     470}
     471
     472// Bool version does not have maximum and minimum values.
     473static Void readTokenValueAndValidate(Bool         &returnedValue, /// value returned
     474                                      Bool         &failed,        /// used and updated
     475                                      std::istream &is,            /// stream to read token from
     476                                      const TChar  *pToken)        /// token string
     477{
     478  readTokenValue(returnedValue, failed, is, pToken);
     479}
     480
     481Bool SEIEncoder::initSEIColourRemappingInfo(SEIColourRemappingInfo* seiColourRemappingInfo, Int currPOC) // returns true on success, false on failure.
     482{
     483  assert (m_isInitialized);
     484  assert (seiColourRemappingInfo!=NULL);
     485
     486  // reading external Colour Remapping Information SEI message parameters from file
     487  if( !m_pcCfg->getColourRemapInfoSEIFileRoot().empty())
     488  {
     489    Bool failed=false;
     490
     491    // building the CRI file name with poc num in prefix "_poc.txt"
     492    std::string colourRemapSEIFileWithPoc(m_pcCfg->getColourRemapInfoSEIFileRoot());
     493    {
     494      std::stringstream suffix;
     495      suffix << "_" << currPOC << ".txt";
     496      colourRemapSEIFileWithPoc+=suffix.str();
     497    }
     498
     499    std::ifstream fic(colourRemapSEIFileWithPoc.c_str());
     500    if (!fic.good() || !fic.is_open())
     501    {
     502      std::cerr <<  "No Colour Remapping Information SEI parameters file " << colourRemapSEIFileWithPoc << " for POC " << currPOC << std::endl;
     503      return false;
     504    }
     505
     506    // TODO: identify and remove duplication with decoder parsing through abstraction.
     507
     508    readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapId,         failed, fic, "colour_remap_id",        UInt(0), UInt(0x7fffffff) );
     509    readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapCancelFlag, failed, fic, "colour_remap_cancel_flag" );
     510    if( !seiColourRemappingInfo->m_colourRemapCancelFlag )
     511    {
     512      readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapPersistenceFlag,            failed, fic, "colour_remap_persistence_flag" );
     513      readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapVideoSignalInfoPresentFlag, failed, fic, "colour_remap_video_signal_info_present_flag");
     514      if( seiColourRemappingInfo->m_colourRemapVideoSignalInfoPresentFlag )
     515      {
     516        readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapFullRangeFlag,      failed, fic, "colour_remap_full_range_flag" );
     517        readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapPrimaries,          failed, fic, "colour_remap_primaries",           Int(0), Int(255) );
     518        readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapTransferFunction,   failed, fic, "colour_remap_transfer_function",   Int(0), Int(255) );
     519        readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapMatrixCoefficients, failed, fic, "colour_remap_matrix_coefficients", Int(0), Int(255) );
     520      }
     521      readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapInputBitDepth, failed, fic, "colour_remap_input_bit_depth",            Int(8), Int(16) );
     522      readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapBitDepth,      failed, fic, "colour_remap_bit_depth",                  Int(8), Int(16) );
     523
     524      const Int maximumInputValue    = (1 << (((seiColourRemappingInfo->m_colourRemapInputBitDepth + 7) >> 3) << 3)) - 1;
     525      const Int maximumRemappedValue = (1 << (((seiColourRemappingInfo->m_colourRemapBitDepth      + 7) >> 3) << 3)) - 1;
     526
     527      for( Int c=0 ; c<3 ; c++ )
     528      {
     529        readTokenValueAndValidate(seiColourRemappingInfo->m_preLutNumValMinus1[c],         failed, fic, "pre_lut_num_val_minus1[c]",        Int(0), Int(32) );
     530        if( seiColourRemappingInfo->m_preLutNumValMinus1[c]>0 )
     531        {
     532          seiColourRemappingInfo->m_preLut[c].resize(seiColourRemappingInfo->m_preLutNumValMinus1[c]+1);
     533          for( Int i=0 ; i<=seiColourRemappingInfo->m_preLutNumValMinus1[c] ; i++ )
     534          {
     535            readTokenValueAndValidate(seiColourRemappingInfo->m_preLut[c][i].codedValue,   failed, fic, "pre_lut_coded_value[c][i]",  Int(0), maximumInputValue    );
     536            readTokenValueAndValidate(seiColourRemappingInfo->m_preLut[c][i].targetValue,  failed, fic, "pre_lut_target_value[c][i]", Int(0), maximumRemappedValue );
     537          }
     538        }
     539      }
     540      readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapMatrixPresentFlag, failed, fic, "colour_remap_matrix_present_flag" );
     541      if( seiColourRemappingInfo->m_colourRemapMatrixPresentFlag )
     542      {
     543        readTokenValueAndValidate(seiColourRemappingInfo->m_log2MatrixDenom, failed, fic, "log2_matrix_denom", Int(0), Int(15) );
     544        for( Int c=0 ; c<3 ; c++ )
     545        {
     546          for( Int i=0 ; i<3 ; i++ )
     547          {
     548            readTokenValueAndValidate(seiColourRemappingInfo->m_colourRemapCoeffs[c][i], failed, fic, "colour_remap_coeffs[c][i]", -32768, 32767 );
     549          }
     550        }
     551      }
     552      for( Int c=0 ; c<3 ; c++ )
     553      {
     554        readTokenValueAndValidate(seiColourRemappingInfo->m_postLutNumValMinus1[c], failed, fic, "post_lut_num_val_minus1[c]", Int(0), Int(32) );
     555        if( seiColourRemappingInfo->m_postLutNumValMinus1[c]>0 )
     556        {
     557          seiColourRemappingInfo->m_postLut[c].resize(seiColourRemappingInfo->m_postLutNumValMinus1[c]+1);
     558          for( Int i=0 ; i<=seiColourRemappingInfo->m_postLutNumValMinus1[c] ; i++ )
     559          {
     560            readTokenValueAndValidate(seiColourRemappingInfo->m_postLut[c][i].codedValue,  failed, fic, "post_lut_coded_value[c][i]",  Int(0), maximumRemappedValue );
     561            readTokenValueAndValidate(seiColourRemappingInfo->m_postLut[c][i].targetValue, failed, fic, "post_lut_target_value[c][i]", Int(0), maximumRemappedValue );
     562          }
     563        }
     564      }
     565    }
     566
     567    if( failed )
     568    {
     569      std::cerr << "Error while reading Colour Remapping Information SEI parameters file '" << colourRemapSEIFileWithPoc << "'" << std::endl;
     570      exit(EXIT_FAILURE);
     571    }
     572  }
     573  return true;
     574}
     575
     576
     577Void SEIEncoder::initSEIChromaResamplingFilterHint(SEIChromaResamplingFilterHint *seiChromaResamplingFilterHint, Int iHorFilterIndex, Int iVerFilterIndex)
     578{
     579  assert (m_isInitialized);
     580  assert (seiChromaResamplingFilterHint!=NULL);
     581
     582  seiChromaResamplingFilterHint->m_verChromaFilterIdc = iVerFilterIndex;
     583  seiChromaResamplingFilterHint->m_horChromaFilterIdc = iHorFilterIndex;
     584  seiChromaResamplingFilterHint->m_verFilteringFieldProcessingFlag = 1;
     585  seiChromaResamplingFilterHint->m_targetFormatIdc = 3;
     586  seiChromaResamplingFilterHint->m_perfectReconstructionFlag = false;
     587
     588  // this creates some example filter values, if explicit filter definition is selected
     589  if (seiChromaResamplingFilterHint->m_verChromaFilterIdc == 1)
     590    {
     591    const Int numVerticalFilters = 3;
     592    const Int verTapLengthMinus1[] = {5,3,3};
     593
     594    seiChromaResamplingFilterHint->m_verFilterCoeff.resize(numVerticalFilters);
     595    for(Int i = 0; i < numVerticalFilters; i ++)
     596      {
     597      seiChromaResamplingFilterHint->m_verFilterCoeff[i].resize(verTapLengthMinus1[i]+1);
     598    }
     599    // Note: C++11 -> seiChromaResamplingFilterHint->m_verFilterCoeff[0] = {-3,13,31,23,3,-3};
     600    seiChromaResamplingFilterHint->m_verFilterCoeff[0][0] = -3;
     601    seiChromaResamplingFilterHint->m_verFilterCoeff[0][1] = 13;
     602    seiChromaResamplingFilterHint->m_verFilterCoeff[0][2] = 31;
     603    seiChromaResamplingFilterHint->m_verFilterCoeff[0][3] = 23;
     604    seiChromaResamplingFilterHint->m_verFilterCoeff[0][4] = 3;
     605    seiChromaResamplingFilterHint->m_verFilterCoeff[0][5] = -3;
     606
     607    seiChromaResamplingFilterHint->m_verFilterCoeff[1][0] = -1;
     608    seiChromaResamplingFilterHint->m_verFilterCoeff[1][1] = 25;
     609    seiChromaResamplingFilterHint->m_verFilterCoeff[1][2] = 247;
     610    seiChromaResamplingFilterHint->m_verFilterCoeff[1][3] = -15;
     611
     612    seiChromaResamplingFilterHint->m_verFilterCoeff[2][0] = -20;
     613    seiChromaResamplingFilterHint->m_verFilterCoeff[2][1] = 186;
     614    seiChromaResamplingFilterHint->m_verFilterCoeff[2][2] = 100;
     615    seiChromaResamplingFilterHint->m_verFilterCoeff[2][3] = -10;
    424616  }
    425617  else
    426618  {
    427     seiChromaSamplingFilterHint->m_numVerticalFilters = 0;
    428     seiChromaSamplingFilterHint->m_verTapLengthMinus1 = NULL;
    429     seiChromaSamplingFilterHint->m_verFilterCoeff = NULL;
    430   }
    431   if(seiChromaSamplingFilterHint->m_horChromaFilterIdc == 1)
    432   {
    433     seiChromaSamplingFilterHint->m_numHorizontalFilters = 1;
    434     seiChromaSamplingFilterHint->m_horTapLengthMinus1 = (Int*)malloc(seiChromaSamplingFilterHint->m_numHorizontalFilters * sizeof(Int));
    435     seiChromaSamplingFilterHint->m_horFilterCoeff = (Int**)malloc(seiChromaSamplingFilterHint->m_numHorizontalFilters * sizeof(Int*));
    436     for(Int i = 0; i < seiChromaSamplingFilterHint->m_numHorizontalFilters; i ++)
    437     {
    438       seiChromaSamplingFilterHint->m_horTapLengthMinus1[i] = 0;
    439       seiChromaSamplingFilterHint->m_horFilterCoeff[i] = (Int*)malloc(seiChromaSamplingFilterHint->m_horTapLengthMinus1[i] * sizeof(Int));
    440       for(Int j = 0; j < seiChromaSamplingFilterHint->m_horTapLengthMinus1[i]; j ++)
    441       {
    442         seiChromaSamplingFilterHint->m_horFilterCoeff[i][j] = 0;
    443       }
    444     }
     619    seiChromaResamplingFilterHint->m_verFilterCoeff.resize(0);
     620  }
     621
     622  if (seiChromaResamplingFilterHint->m_horChromaFilterIdc == 1)
     623    {
     624    Int const numHorizontalFilters = 1;
     625    const Int horTapLengthMinus1[] = {3};
     626
     627    seiChromaResamplingFilterHint->m_horFilterCoeff.resize(numHorizontalFilters);
     628    for(Int i = 0; i < numHorizontalFilters; i ++)
     629      {
     630      seiChromaResamplingFilterHint->m_horFilterCoeff[i].resize(horTapLengthMinus1[i]+1);
     631    }
     632    seiChromaResamplingFilterHint->m_horFilterCoeff[0][0] = 1;
     633    seiChromaResamplingFilterHint->m_horFilterCoeff[0][1] = 6;
     634    seiChromaResamplingFilterHint->m_horFilterCoeff[0][2] = 1;
    445635  }
    446636  else
    447637  {
    448     seiChromaSamplingFilterHint->m_numHorizontalFilters = 0;
    449     seiChromaSamplingFilterHint->m_horTapLengthMinus1 = NULL;
    450     seiChromaSamplingFilterHint->m_horFilterCoeff = NULL;
     638    seiChromaResamplingFilterHint->m_horFilterCoeff.resize(0);
    451639  }
    452640}
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/SEIEncoder.h

    r1356 r1360  
    7979  Void initSEITempMotionConstrainedTileSets (SEITempMotionConstrainedTileSets *sei, const TComPPS *pps);
    8080  Void initSEIKneeFunctionInfo(SEIKneeFunctionInfo *sei);
    81   Void initSEIChromaSamplingFilterHint(SEIChromaSamplingFilterHint *sei, Int iHorFilterIndex, Int iVerFilterIndex);
     81  Void initSEIChromaResamplingFilterHint(SEIChromaResamplingFilterHint *sei, Int iHorFilterIndex, Int iVerFilterIndex);
    8282  Void initSEITimeCode(SEITimeCode *sei);
     83  Bool initSEIColourRemappingInfo(SEIColourRemappingInfo *sei, Int currPOC); // returns true on success, false on failure.
    8384
    8485  // trailing SEIs
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/SEIwrite.cpp

    r1356 r1360  
    106106    xWriteSEIScalableNesting(bs, *static_cast<const SEIScalableNesting*>(&sei), sps);
    107107    break;
    108   case SEI::CHROMA_SAMPLING_FILTER_HINT:
    109     xWriteSEIChromaSamplingFilterHint(*static_cast<const SEIChromaSamplingFilterHint*>(&sei)/*, sps*/);
     108  case SEI::CHROMA_RESAMPLING_FILTER_HINT:
     109    xWriteSEIChromaResamplingFilterHint(*static_cast<const SEIChromaResamplingFilterHint*>(&sei));
    110110    break;
    111111  case SEI::TEMP_MOTION_CONSTRAINED_TILE_SETS:
     
    117117  case SEI::KNEE_FUNCTION_INFO:
    118118    xWriteSEIKneeFunctionInfo(*static_cast<const SEIKneeFunctionInfo*>(&sei));
     119    break;
     120  case SEI::COLOUR_REMAPPING_INFO:
     121    xWriteSEIColourRemappingInfo(*static_cast<const SEIColourRemappingInfo*>(&sei));
    119122    break;
    120123  case SEI::MASTERING_DISPLAY_COLOUR_VOLUME:
     
    189192
    190193  default:
    191     assert(!"Unhandled SEI message");
     194    assert(!"Trying to write unhandled SEI message");
    192195    break;
    193196  }
     
    277280Void SEIWriter::xWriteSEIDecodedPictureHash(const SEIDecodedPictureHash& sei)
    278281{
    279   const Char *traceString="\0";
     282  const TChar *traceString="\0";
    280283  switch (sei.method)
    281284  {
    282     case SEIDecodedPictureHash::MD5: traceString="picture_md5"; break;
    283     case SEIDecodedPictureHash::CRC: traceString="picture_crc"; break;
    284     case SEIDecodedPictureHash::CHECKSUM: traceString="picture_checksum"; break;
     285    case HASHTYPE_MD5: traceString="picture_md5"; break;
     286    case HASHTYPE_CRC: traceString="picture_crc"; break;
     287    case HASHTYPE_CHECKSUM: traceString="picture_checksum"; break;
    285288    default: assert(false); break;
    286289  }
     
    726729}
    727730
    728 Void SEIWriter::xWriteSEIChromaSamplingFilterHint(const SEIChromaSamplingFilterHint &sei/*, TComSPS* sps*/)
     731Void SEIWriter::xWriteSEIChromaResamplingFilterHint(const SEIChromaResamplingFilterHint &sei)
    729732{
    730733  WRITE_CODE(sei.m_verChromaFilterIdc, 8, "ver_chroma_filter_idc");
    731734  WRITE_CODE(sei.m_horChromaFilterIdc, 8, "hor_chroma_filter_idc");
    732   WRITE_FLAG(sei.m_verFilteringProcessFlag, "ver_filtering_process_flag");
     735  WRITE_FLAG(sei.m_verFilteringFieldProcessingFlag, "ver_filtering_field_processing_flag");
    733736  if(sei.m_verChromaFilterIdc == 1 || sei.m_horChromaFilterIdc == 1)
    734737  {
    735     writeUserDefinedCoefficients(sei);
    736   }
    737 }
    738 
    739 // write hardcoded chroma filter coefficients in the SEI messages
    740 Void SEIWriter::writeUserDefinedCoefficients(const SEIChromaSamplingFilterHint &sei)
    741 {
    742   Int const iNumVerticalFilters = 3;
    743   Int verticalTapLength_minus1[iNumVerticalFilters] = {5,3,3};
    744   Int* userVerticalCoefficients[iNumVerticalFilters];
    745   for(Int i = 0; i < iNumVerticalFilters; i ++)
    746   {
    747     userVerticalCoefficients[i] = (Int*)malloc( (verticalTapLength_minus1[i]+1) * sizeof(Int));
    748   }
    749   userVerticalCoefficients[0][0] = -3;
    750   userVerticalCoefficients[0][1] = 13;
    751   userVerticalCoefficients[0][2] = 31;
    752   userVerticalCoefficients[0][3] = 23;
    753   userVerticalCoefficients[0][4] = 3;
    754   userVerticalCoefficients[0][5] = -3;
    755 
    756   userVerticalCoefficients[1][0] = -1;
    757   userVerticalCoefficients[1][1] = 25;
    758   userVerticalCoefficients[1][2] = 247;
    759   userVerticalCoefficients[1][3] = -15;
    760 
    761   userVerticalCoefficients[2][0] = -20;
    762   userVerticalCoefficients[2][1] = 186;
    763   userVerticalCoefficients[2][2] = 100;
    764   userVerticalCoefficients[2][3] = -10;
    765 
    766   Int const iNumHorizontalFilters = 1;
    767   Int horizontalTapLength_minus1[iNumHorizontalFilters] = {3};
    768   Int* userHorizontalCoefficients[iNumHorizontalFilters];
    769   for(Int i = 0; i < iNumHorizontalFilters; i ++)
    770   {
    771     userHorizontalCoefficients[i] = (Int*)malloc( (horizontalTapLength_minus1[i]+1) * sizeof(Int));
    772   }
    773   userHorizontalCoefficients[0][0] = 1;
    774   userHorizontalCoefficients[0][1] = 6;
    775   userHorizontalCoefficients[0][2] = 1;
    776 
    777   WRITE_UVLC(3, "target_format_idc");
    778   if(sei.m_verChromaFilterIdc == 1)
    779   {
    780     WRITE_UVLC(iNumVerticalFilters, "num_vertical_filters");
    781     if(iNumVerticalFilters > 0)
    782     {
    783       for(Int i = 0; i < iNumVerticalFilters; i ++)
    784       {
    785         WRITE_UVLC(verticalTapLength_minus1[i], "ver_tap_length_minus_1");
    786         for(Int j = 0; j < verticalTapLength_minus1[i]; j ++)
    787         {
    788           WRITE_SVLC(userVerticalCoefficients[i][j], "ver_filter_coeff");
    789         }
    790       }
    791     }
    792   }
    793   if(sei.m_horChromaFilterIdc == 1)
    794   {
    795     WRITE_UVLC(iNumHorizontalFilters, "num_horizontal_filters");
    796     if(iNumHorizontalFilters > 0)
    797     {
    798       for(Int i = 0; i < iNumHorizontalFilters; i ++)
    799       {
    800         WRITE_UVLC(horizontalTapLength_minus1[i], "hor_tap_length_minus_1");
    801         for(Int j = 0; j < horizontalTapLength_minus1[i]; j ++)
    802         {
    803           WRITE_SVLC(userHorizontalCoefficients[i][j], "hor_filter_coeff");
    804         }
    805       }
    806     }
    807   }
    808 }
    809 
     738    WRITE_UVLC(sei.m_targetFormatIdc, "target_format_idc");
     739    if(sei.m_verChromaFilterIdc == 1)
     740    {
     741      const Int numVerticalFilter = (Int)sei.m_verFilterCoeff.size();
     742      WRITE_UVLC(numVerticalFilter, "num_vertical_filters");
     743      if(numVerticalFilter > 0)
     744      {
     745        for(Int i = 0; i < numVerticalFilter; i ++)
     746        {
     747          const Int verTapLengthMinus1 = (Int) sei.m_verFilterCoeff[i].size() - 1;
     748          WRITE_UVLC(verTapLengthMinus1, "ver_tap_length_minus_1");
     749          for(Int j = 0; j < (verTapLengthMinus1 + 1); j ++)
     750          {
     751            WRITE_SVLC(sei.m_verFilterCoeff[i][j], "ver_filter_coeff");
     752          }
     753        }
     754      }
     755    }
     756    if(sei.m_horChromaFilterIdc == 1)
     757    {
     758      const Int numHorizontalFilter = (Int) sei.m_horFilterCoeff.size();
     759      WRITE_UVLC(numHorizontalFilter, "num_horizontal_filters");
     760      if(numHorizontalFilter > 0)
     761      {
     762        for(Int i = 0; i < numHorizontalFilter; i ++)
     763        {
     764          const Int horTapLengthMinus1 = (Int) sei.m_horFilterCoeff[i].size() - 1;
     765          WRITE_UVLC(horTapLengthMinus1, "hor_tap_length_minus_1");
     766          for(Int j = 0; j < (horTapLengthMinus1 + 1); j ++)
     767          {
     768            WRITE_SVLC(sei.m_horFilterCoeff[i][j], "hor_filter_coeff");
     769          }
     770        }
     771      }
     772    }
     773  }
     774}
    810775#if NH_MV
    811776#if !NH_MV_SEI
     
    849814}
    850815
     816Void SEIWriter::xWriteSEIColourRemappingInfo(const SEIColourRemappingInfo& sei)
     817{
     818  WRITE_UVLC( sei.m_colourRemapId,                             "colour_remap_id" );
     819  WRITE_FLAG( sei.m_colourRemapCancelFlag,                     "colour_remap_cancel_flag" );
     820  if( !sei.m_colourRemapCancelFlag )
     821  {
     822    WRITE_FLAG( sei.m_colourRemapPersistenceFlag,              "colour_remap_persistence_flag" );
     823    WRITE_FLAG( sei.m_colourRemapVideoSignalInfoPresentFlag,   "colour_remap_video_signal_info_present_flag" );
     824    if ( sei.m_colourRemapVideoSignalInfoPresentFlag )
     825    {
     826      WRITE_FLAG( sei.m_colourRemapFullRangeFlag,              "colour_remap_full_range_flag" );
     827      WRITE_CODE( sei.m_colourRemapPrimaries,               8, "colour_remap_primaries" );
     828      WRITE_CODE( sei.m_colourRemapTransferFunction,        8, "colour_remap_transfer_function" );
     829      WRITE_CODE( sei.m_colourRemapMatrixCoefficients,      8, "colour_remap_matrix_coefficients" );
     830    }
     831    WRITE_CODE( sei.m_colourRemapInputBitDepth,             8, "colour_remap_input_bit_depth" );
     832    WRITE_CODE( sei.m_colourRemapBitDepth,                  8, "colour_remap_bit_depth" );
     833    for( Int c=0 ; c<3 ; c++ )
     834    {
     835      WRITE_CODE( sei.m_preLutNumValMinus1[c],              8, "pre_lut_num_val_minus1[c]" );
     836      if( sei.m_preLutNumValMinus1[c]>0 )
     837      {
     838        for( Int i=0 ; i<=sei.m_preLutNumValMinus1[c] ; i++ )
     839        {
     840          WRITE_CODE( sei.m_preLut[c][i].codedValue,  (( sei.m_colourRemapInputBitDepth + 7 ) >> 3 ) << 3, "pre_lut_coded_value[c][i]" );
     841          WRITE_CODE( sei.m_preLut[c][i].targetValue, (( sei.m_colourRemapBitDepth      + 7 ) >> 3 ) << 3, "pre_lut_target_value[c][i]" );
     842        }
     843      }
     844    }
     845    WRITE_FLAG( sei.m_colourRemapMatrixPresentFlag,            "colour_remap_matrix_present_flag" );
     846    if( sei.m_colourRemapMatrixPresentFlag )
     847    {
     848      WRITE_CODE( sei.m_log2MatrixDenom,                    4, "log2_matrix_denom" );
     849      for( Int c=0 ; c<3 ; c++ )
     850      {
     851        for( Int i=0 ; i<3 ; i++ )
     852        {
     853          WRITE_SVLC( sei.m_colourRemapCoeffs[c][i],           "colour_remap_coeffs[c][i]" );
     854        }
     855      }
     856    }
     857
     858    for( Int c=0 ; c<3 ; c++ )
     859    {
     860      WRITE_CODE( sei.m_postLutNumValMinus1[c],             8, "m_postLutNumValMinus1[c]" );
     861      if( sei.m_postLutNumValMinus1[c]>0 )
     862      {
     863        for( Int i=0 ; i<=sei.m_postLutNumValMinus1[c] ; i++ )
     864        {
     865          WRITE_CODE( sei.m_postLut[c][i].codedValue, (( sei.m_colourRemapBitDepth + 7 ) >> 3 ) << 3, "post_lut_coded_value[c][i]" );
     866          WRITE_CODE( sei.m_postLut[c][i].targetValue, (( sei.m_colourRemapBitDepth + 7 ) >> 3 ) << 3, "post_lut_target_value[c][i]" );
     867        }
     868      }
     869    }
     870  }
     871}
    851872
    852873Void SEIWriter::xWriteSEIMasteringDisplayColourVolume(const SEIMasteringDisplayColourVolume& sei)
     
    863884  WRITE_CODE( sei.values.whitePoint[0],    16,  "white_point_x" );
    864885  WRITE_CODE( sei.values.whitePoint[1],    16,  "white_point_y" );
    865 
     886   
    866887  WRITE_CODE( sei.values.maxLuminance,     32,  "max_display_mastering_luminance" );
    867888  WRITE_CODE( sei.values.minLuminance,     32,  "min_display_mastering_luminance" );
     
    881902}
    882903
     904
    883905#if NH_MV_LAYERS_NOT_PRESENT_SEI
    884906Void SEIWriter::xWriteSEILayersNotPresent(const SEILayersNotPresent& sei)
     
    892914#endif
    893915
    894 
    895 
     916#if NH_MV
    896917Void SEIWriter::xWriteSEIInterLayerConstrainedTileSets( const SEIInterLayerConstrainedTileSets& sei)
    897918{
     
    927948  }
    928949};
     950#endif
    929951
    930952#if NH_MV_SEI_TBD
     
    10671089  }
    10681090};
     1091
    10691092
    10701093Void SEIWriter::xWriteSEITemporalMvPredictionConstraints( const SEITemporalMvPredictionConstraints& sei)
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/SEIwrite.h

    r1356 r1360  
    5353
    5454protected:
    55   Void xWriteSEIpayloadData(TComBitIf& bs, const SEI& sei, const TComSPS *sps);
    5655  Void xWriteSEIuserDataUnregistered(const SEIuserDataUnregistered &sei);
    5756  Void xWriteSEIActiveParameterSets(const SEIActiveParameterSets& sei);
     
    6059  Void xWriteSEIBufferingPeriod(const SEIBufferingPeriod& sei, const TComSPS *sps);
    6160  Void xWriteSEIPictureTiming(const SEIPictureTiming& sei, const TComSPS *sps);
    62   TComSPS *m_pSPS;
    6361  Void xWriteSEIRecoveryPoint(const SEIRecoveryPoint& sei);
    6462  Void xWriteSEIFramePacking(const SEIFramePacking& sei);
     
    7876  Void xWriteSEITempMotionConstrainedTileSets(const SEITempMotionConstrainedTileSets& sei);
    7977  Void xWriteSEITimeCode(const SEITimeCode& sei);
    80   Void xWriteSEIChromaSamplingFilterHint(const SEIChromaSamplingFilterHint& sei/*, TComSPS *sps*/);
    81   Void writeUserDefinedCoefficients(const SEIChromaSamplingFilterHint& sei);
     78  Void xWriteSEIChromaResamplingFilterHint(const SEIChromaResamplingFilterHint& sei);
    8279  Void xWriteSEIKneeFunctionInfo(const SEIKneeFunctionInfo &sei);
     80  Void xWriteSEIColourRemappingInfo(const SEIColourRemappingInfo& sei);
    8381  Void xWriteSEIMasteringDisplayColourVolume( const SEIMasteringDisplayColourVolume& sei);
    8482
     
    110108  Void xWriteSEIAlternativeDepthInfo          ( const SEIAlternativeDepthInfo& sei);
    111109#endif
     110  Void xWriteSEIpayloadData(TComBitIf& bs, const SEI& sei, const TComSPS *sps);
    112111  Void xWriteByteAlign();
    113112};
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/SyntaxElementWriter.cpp

    r1356 r1360  
    4444#if ENC_DEC_TRACE
    4545
    46 Void  SyntaxElementWriter::xWriteCodeTr (UInt value, UInt  length, const Char *pSymbolName)
     46Void  SyntaxElementWriter::xWriteCodeTr (UInt value, UInt  length, const TChar *pSymbolName)
    4747{
    4848  xWriteCode (value,length);
     
    7070}
    7171
    72 Void  SyntaxElementWriter::xWriteUvlcTr (UInt value, const Char *pSymbolName)
     72Void  SyntaxElementWriter::xWriteUvlcTr (UInt value, const TChar *pSymbolName)
    7373{
    7474  xWriteUvlc (value);
     
    8989}
    9090
    91 Void  SyntaxElementWriter::xWriteSvlcTr (Int value, const Char *pSymbolName)
     91Void  SyntaxElementWriter::xWriteSvlcTr (Int value, const TChar *pSymbolName)
    9292{
    9393  xWriteSvlc(value);
     
    108108}
    109109
    110 Void  SyntaxElementWriter::xWriteFlagTr(UInt value, const Char *pSymbolName)
     110Void  SyntaxElementWriter::xWriteFlagTr(UInt value, const TChar *pSymbolName)
    111111{
    112112  xWriteFlag(value);
     
    127127}
    128128
     129#if H_MV_ENC_DEC_TRAC
    129130Void  SyntaxElementWriter::xWriteStringTr( UChar* value, UInt length, const Char *pSymbolName)
    130131{
     
    136137  }
    137138}
    138 
     139#endif
    139140#endif
    140141
     
    176177}
    177178
     179#if H_MV_ENC_DEC_TRAC
    178180Void  SyntaxElementWriter::xWriteString( UChar* sCode, UInt uiLength)
    179181{
     
    185187  m_pcBitIf->write( 0, 8 ); //zero-termination byte
    186188}
    187 
     189#endif
    188190Void SyntaxElementWriter::xWriteRbspTrailingBits()
    189191{
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/SyntaxElementWriter.h

    r1356 r1360  
    5656#define WRITE_SVLC( value,         name)    xWriteSvlcTr ( value,         name )
    5757#define WRITE_FLAG( value,         name)    xWriteFlagTr ( value,         name )
     58#if NH_MV
    5859#define WRITE_STRING( value, length, name)   xWriteStringTr( value, length, name )
     60#endif
    5961
    6062#else
     
    6466#define WRITE_SVLC( value,         name)     xWriteSvlc ( value )
    6567#define WRITE_FLAG( value,         name)     xWriteFlag ( value )
     68#if NH_MV
    6669#define WRITE_STRING( value, length, name)   xWriteString( value, length )
    67 
     70#endif
    6871#endif
    6972
     
    8487  Void  xWriteSvlc            ( Int  iCode   );
    8588  Void  xWriteFlag            ( UInt uiCode );
     89#if NH_MV
    8690  Void  xWriteString          ( UChar* sCode, UInt uiLength);
     91#endif
    8792#if ENC_DEC_TRACE
    88   Void  xWriteCodeTr          ( UInt value, UInt  length, const Char *pSymbolName);
    89   Void  xWriteUvlcTr          ( UInt value,               const Char *pSymbolName);
    90   Void  xWriteSvlcTr          ( Int  value,               const Char *pSymbolName);
    91   Void  xWriteFlagTr          ( UInt value,               const Char *pSymbolName);
     93  Void  xWriteCodeTr          ( UInt value, UInt  length, const TChar *pSymbolName);
     94  Void  xWriteUvlcTr          ( UInt value,               const TChar *pSymbolName);
     95  Void  xWriteSvlcTr          ( Int  value,               const TChar *pSymbolName);
     96  Void  xWriteFlagTr          ( UInt value,               const TChar *pSymbolName);
     97#if NH_MV
    9298  Void  xWriteStringTr        ( UChar* value, UInt length, const Char *pSymbolName);
     99#endif
    93100#endif
    94101  Void xWriteRbspTrailingBits();
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncAnalyze.h

    r1313 r1360  
    137137
    138138
    139   Void    printOut ( Char cDelim, const ChromaFormat chFmt, const Bool printMSEBasedSNR, const Bool printSequenceMSE, const BitDepths &bitDepths )
     139  Void    printOut ( TChar cDelim, const ChromaFormat chFmt, const Bool printMSEBasedSNR, const Bool printSequenceMSE, const BitDepths &bitDepths )
    140140  {
    141141    Double dFps     =   m_dFrmRate; //--CFG_KDY
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncBinCoderCABAC.cpp

    r1321 r1360  
    246246  if (g_debugCounter >= debugCabacBinTargetLine)
    247247  {
    248     Char breakPointThis;
     248    UChar breakPointThis;
    249249    breakPointThis = 7;
    250250  }
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncBinCoderCABACCounter.cpp

    r1321 r1360  
    9797  if (g_debugCounter >= debugEncoderSearchBinTargetLine)
    9898  {
    99     Char breakPointThis;
     99    UChar breakPointThis;
    100100    breakPointThis = 7;
    101101  }
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncCavlc.cpp

    r1321 r1360  
    6969  fprintf( g_hTrace, "=========== Slice ===========\n");
    7070}
    71 #endif
    72 #endif
     71
     72Void  xTraceAccessUnitDelimiter ()
     73{
     74  fprintf( g_hTrace, "=========== Access Unit Delimiter ===========\n");
     75}
     76
     77#endif
     78#endif
     79
     80Void AUDWriter::codeAUD(TComBitIf& bs, const Int pictureType)
     81{
     82#if ENC_DEC_TRACE
     83  xTraceAccessUnitDelimiter();
     84#endif
     85
     86  assert (pictureType < 3);
     87  setBitstream(&bs);
     88  WRITE_CODE(pictureType, 3, "pic_type");
     89  xWriteRbspTrailingBits();
     90}
     91
    7392// ====================================================================================================================
    7493// Constructor / destructor / create / destroy
     
    266285  {
    267286#if ENC_DEC_TRACE || RExt__DECODER_DEBUG_BIT_STATISTICS
    268     static const char *syntaxStrings[]={ "pps_range_extension_flag",
     287    static const TChar *syntaxStrings[]={ "pps_range_extension_flag",
    269288                                         "pps_multilayer_extension_flag",
    270289                                         "pps_extension_6bits[0]",
     
    748767    WRITE_UVLC( pcSPS->getSpsMaxLatencyIncreasePlus1(i),   "sps_max_latency_increase_plus1[i]" );
    749768#else
    750     WRITE_UVLC( pcSPS->getMaxLatencyIncrease(i),           "sps_max_latency_increase_plus1[i]" );
     769    WRITE_UVLC( pcSPS->getMaxLatencyIncreasePlus1(i),      "sps_max_latency_increase_plus1[i]" );
    751770#endif
    752771    if (!subLayerOrderingInfoPresentFlag)
     
    858877  {
    859878#if ENC_DEC_TRACE || RExt__DECODER_DEBUG_BIT_STATISTICS
    860     static const char *syntaxStrings[]={ "sps_range_extension_flag",
     879    static const TChar *syntaxStrings[]={ "sps_range_extension_flag",
    861880      "sps_multilayer_extension_flag",
    862881      "sps_extension_6bits[0]",
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncCavlc.h

    r1321 r1360  
    5858// ====================================================================================================================
    5959
     60class AUDWriter : public SyntaxElementWriter
     61{
     62public:
     63  AUDWriter() {};
     64  virtual ~AUDWriter() {};
     65
     66  Void  codeAUD(TComBitIf& bs, const Int pictureType);
     67};
     68
    6069/// CAVLC encoder class
    6170class TEncCavlc : public SyntaxElementWriter, public TEncEntropyIf
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncCfg.h

    r1356 r1360  
    6565  Bool m_refPic;
    6666  Int m_numRefPicsActive;
    67   Char m_sliceType;
     67  SChar m_sliceType;
    6868  Int m_numRefPics;
    6969  Int m_referencePics[MAX_NUM_REF_PICS];
     
    137137  Int       m_framesToBeEncoded;
    138138  Double    m_adLambdaModifier[ MAX_TLAYER ];
     139  std::vector<Double> m_adIntraLambdaModifier;
     140  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) ))
    139141
    140142  Bool      m_printMSEBasedSequencePSNR;
     
    174176  Int       m_aiPad[2];
    175177
     178  Bool      m_AccessUnitDelimiter;               ///< add Access Unit Delimiter NAL units
    176179
    177180  Int       m_iMaxRefPicNum;                     ///< this is used to mimic the sliding mechanism used by the decoder
     
    206209  //====== Motion search ========
    207210  Bool      m_bDisableIntraPUsInInterSlices;
    208   Int       m_iFastSearch;                      //  0:Full search  1:Diamond  2:PMVFAST
     211  MESearchMethod m_motionEstimationSearchMethod;
    209212  Int       m_iSearchRange;                     //  0:Full frame
    210213  Int       m_bipredSearchRange;
    211214  Bool      m_bClipForBiPredMeEnabled;
    212215  Bool      m_bFastMEAssumingSmootherMVEnabled;
     216  Int       m_minSearchWindow;
     217  Bool      m_bRestrictMESampling;
    213218
    214219#if NH_MV
     
    243248#endif
    244249  UInt      m_rdPenalty;
    245   Bool      m_bUseFastEnc;
     250  FastInterSearchMode m_fastInterSearchMode;
    246251  Bool      m_bUseEarlyCU;
    247252  Bool      m_useFastDecisionForMerge;
     
    289294  std::vector<Int> m_tileRowHeight;
    290295
    291   Int       m_iWaveFrontSynchro;
    292 
    293   Int       m_decodedPictureHashSEIEnabled;              ///< Checksum(3)/CRC(2)/MD5(1)/disable(0) acting on decoded picture hash SEI message
    294   Int       m_bufferingPeriodSEIEnabled;
    295   Int       m_pictureTimingSEIEnabled;
    296   Int       m_recoveryPointSEIEnabled;
     296  Bool      m_entropyCodingSyncEnabledFlag;
     297
     298  HashType  m_decodedPictureHashSEIType;
     299  Bool      m_bufferingPeriodSEIEnabled;
     300  Bool      m_pictureTimingSEIEnabled;
     301  Bool      m_recoveryPointSEIEnabled;
    297302  Bool      m_toneMappingInfoSEIEnabled;
    298303  Int       m_toneMapId;
     
    322327  Int*      m_codedPivotValue;
    323328  Int*      m_targetPivotValue;
    324   Int       m_framePackingSEIEnabled;
     329  Bool      m_framePackingSEIEnabled;
    325330  Int       m_framePackingSEIType;
    326331  Int       m_framePackingSEIId;
    327332  Int       m_framePackingSEIQuincunx;
    328333  Int       m_framePackingSEIInterpretation;
    329   Int       m_segmentedRectFramePackingSEIEnabled;
     334  Bool      m_segmentedRectFramePackingSEIEnabled;
    330335  Bool      m_segmentedRectFramePackingSEICancel;
    331336  Int       m_segmentedRectFramePackingSEIType;
    332337  Bool      m_segmentedRectFramePackingSEIPersistence;
    333338  Int       m_displayOrientationSEIAngle;
    334   Int       m_temporalLevel0IndexSEIEnabled;
    335   Int       m_gradualDecodingRefreshInfoEnabled;
     339  Bool      m_temporalLevel0IndexSEIEnabled;
     340  Bool      m_gradualDecodingRefreshInfoEnabled;
    336341  Int       m_noDisplaySEITLayer;
    337   Int       m_decodingUnitInfoSEIEnabled;
    338   Int       m_SOPDescriptionSEIEnabled;
    339   Int       m_scalableNestingSEIEnabled;
     342  Bool      m_decodingUnitInfoSEIEnabled;
     343  Bool      m_SOPDescriptionSEIEnabled;
     344  Bool      m_scalableNestingSEIEnabled;
    340345  Bool      m_tmctsSEIEnabled;
    341346  Bool      m_timeCodeSEIEnabled;
     
    353358  Int*      m_kneeSEIInputKneePoint;
    354359  Int*      m_kneeSEIOutputKneePoint;
     360  std::string m_colourRemapSEIFileRoot;          ///< SEI Colour Remapping File (initialized from external file)
    355361  TComSEIMasteringDisplay m_masteringDisplay;
    356362#if NH_MV_SEI
     
    360366  Bool      m_useWeightedPred;       //< Use of Weighting Prediction (P_SLICE)
    361367  Bool      m_useWeightedBiPred;    //< Use of Bi-directional Weighting Prediction (B_SLICE)
     368  WeightedPredictionMethod m_weightedPredictionMethod;
    362369  UInt      m_log2ParallelMergeLevelMinus2;       ///< Parallel merge estimation region
    363370  UInt      m_maxNumMergeCand;                    ///< Maximum number of merge candidates
    364371  ScalingListMode m_useScalingListId;            ///< Using quantization matrix i.e. 0=off, 1=default, 2=file.
    365   Char*     m_scalingListFile;          ///< quantization matrix file name
     372  std::string m_scalingListFileName;              ///< quantization matrix file name
    366373  Int       m_TMVPModeId;
    367374  Bool      m_signHideFlag;
     
    373380  Int       m_RCInitialQP;
    374381  Bool      m_RCForceIntraQP;
     382#if U0132_TARGET_BITS_SATURATION
     383  Bool      m_RCCpbSaturationEnabled;                   
     384  UInt      m_RCCpbSize;
     385  Double    m_RCInitialCpbFullness;
     386#endif
    375387
    376388#if KWU_RC_MADPRED_E0227
     
    398410  Bool      m_vuiParametersPresentFlag;                       ///< enable generation of VUI parameters
    399411  Bool      m_aspectRatioInfoPresentFlag;                     ///< Signals whether aspect_ratio_idc is present
    400   Bool      m_chromaSamplingFilterHintEnabled;                ///< Signals whether chroma sampling filter hint data is present
    401   Int       m_chromaSamplingHorFilterIdc;                     ///< Specifies the Index of filter to use
    402   Int       m_chromaSamplingVerFilterIdc;                     ///< Specifies the Index of filter to use
     412  Bool      m_chromaResamplingFilterHintEnabled;              ///< Signals whether chroma sampling filter hint data is present
     413  Int       m_chromaResamplingHorFilterIdc;                   ///< Specifies the Index of filter to use
     414  Int       m_chromaResamplingVerFilterIdc;                   ///< Specifies the Index of filter to use
    403415  Int       m_aspectRatioIdc;                                 ///< aspect_ratio_idc
    404416  Int       m_sarWidth;                                       ///< horizontal size of the sample aspect ratio
     
    606618  //====== Motion search ========
    607619  Void      setDisableIntraPUsInInterSlices ( Bool  b )      { m_bDisableIntraPUsInInterSlices = b; }
    608   Void      setFastSearch                   ( Int   i )      { m_iFastSearch = i; }
     620  Void      setMotionEstimationSearchMethod ( MESearchMethod e ) { m_motionEstimationSearchMethod = e; }
    609621  Void      setSearchRange                  ( Int   i )      { m_iSearchRange = i; }
    610622  Void      setBipredSearchRange            ( Int   i )      { m_bipredSearchRange = i; }
    611623  Void      setClipForBiPredMeEnabled       ( Bool  b )      { m_bClipForBiPredMeEnabled = b; }
    612624  Void      setFastMEAssumingSmootherMVEnabled ( Bool b )    { m_bFastMEAssumingSmootherMVEnabled = b; }
     625  Void      setMinSearchWindow              ( Int   i )      { m_minSearchWindow = i; }
     626  Void      setRestrictMESampling           ( Bool  b )      { m_bRestrictMESampling = b; }
     627
    613628#if NH_MV
    614629  Void      setUseDisparitySearchRangeRestriction ( Bool   b )      { m_bUseDisparitySearchRangeRestriction = b; }
     
    649664  Int       getSourceHeight                 ()      { return  m_iSourceHeight; }
    650665  Int       getFramesToBeEncoded            ()      { return  m_framesToBeEncoded; }
     666 
     667  //====== Lambda Modifiers ========
    651668  Void setLambdaModifier                    ( UInt uiIndex, Double dValue ) { m_adLambdaModifier[ uiIndex ] = dValue; }
    652669  Double getLambdaModifier                  ( UInt uiIndex ) const { return m_adLambdaModifier[ uiIndex ]; }
     670  Void      setIntraLambdaModifier          ( const std::vector<Double> &dValue )               { m_adIntraLambdaModifier = dValue;       }
     671  const std::vector<Double>& getIntraLambdaModifier()                        const { return m_adIntraLambdaModifier;         }
     672  Void      setIntraQpFactor                ( Double dValue )               { m_dIntraQpFactor = dValue;              }
     673  Double    getIntraQpFactor                ()                        const { return m_dIntraQpFactor;                }
    653674
    654675  //==== Coding Structure ========
     
    662683  Int       getPad                          ( Int i )      { assert (i < 2 );                      return  m_aiPad[i]; }
    663684
     685  Bool      getAccessUnitDelimiter() const  { return m_AccessUnitDelimiter; }
     686  Void      setAccessUnitDelimiter(Bool val){ m_AccessUnitDelimiter = val; }
     687
    664688  //======== Transform =============
    665689  UInt      getQuadtreeTULog2MaxSize        ()      const { return m_uiQuadtreeTULog2MaxSize; }
     
    677701  //==== Motion search ========
    678702  Bool      getDisableIntraPUsInInterSlices () const { return m_bDisableIntraPUsInInterSlices; }
    679   Int       getFastSearch                   () const { return m_iFastSearch; }
     703  MESearchMethod getMotionEstimationSearchMethod ( ) const { return m_motionEstimationSearchMethod; }
    680704  Int       getSearchRange                  () const { return m_iSearchRange; }
    681705  Bool      getClipForBiPredMeEnabled       () const { return m_bClipForBiPredMeEnabled; }
    682706  Bool      getFastMEAssumingSmootherMVEnabled ( ) const { return m_bFastMEAssumingSmootherMVEnabled; }
     707  Int       getMinSearchWindow                 () const { return m_minSearchWindow; }
     708  Bool      getRestrictMESampling              () const { return m_bRestrictMESampling; }
     709
    683710#if NH_MV
    684711  Bool      getUseDisparitySearchRangeRestriction ()      { return  m_bUseDisparitySearchRangeRestriction; }
     
    701728  Void      setUseSelectiveRDOQ             ( Bool b )      { m_useSelectiveRDOQ = b; }
    702729#endif
    703   Void      setRDpenalty                 ( UInt  b )     { m_rdPenalty  = b; }
    704   Void      setUseFastEnc                   ( Bool  b )     { m_bUseFastEnc = b; }
     730  Void      setRDpenalty                    ( UInt  u )     { m_rdPenalty  = u; }
     731  Void      setFastInterSearchMode          ( FastInterSearchMode m ) { m_fastInterSearchMode = m; }
    705732  Void      setUseEarlyCU                   ( Bool  b )     { m_bUseEarlyCU = b; }
    706733  Void      setUseFastDecisionForMerge      ( Bool  b )     { m_useFastDecisionForMerge = b; }
     
    729756#endif
    730757  Int       getRDpenalty                    ()      { return m_rdPenalty;  }
    731   Bool      getUseFastEnc                   ()      { return m_bUseFastEnc; }
     758  FastInterSearchMode getFastInterSearchMode() const{ return m_fastInterSearchMode; }
    732759  Bool      getUseEarlyCU                   ()      { return m_bUseEarlyCU; }
    733760  Bool      getUseFastDecisionForMerge      ()      { return m_useFastDecisionForMerge; }
     
    812839  UInt  getRowHeight                   ( UInt rowIdx )               { return m_tileRowHeight[rowIdx]; }
    813840  Void  xCheckGSParameters();
    814   Void  setWaveFrontSynchro(Int iWaveFrontSynchro)                   { m_iWaveFrontSynchro = iWaveFrontSynchro; }
    815   Int   getWaveFrontsynchro()                                        { return m_iWaveFrontSynchro; }
    816   Void  setDecodedPictureHashSEIEnabled(Int b)                       { m_decodedPictureHashSEIEnabled = b; }
    817   Int   getDecodedPictureHashSEIEnabled()                            { return m_decodedPictureHashSEIEnabled; }
    818   Void  setBufferingPeriodSEIEnabled(Int b)                          { m_bufferingPeriodSEIEnabled = b; }
    819   Int   getBufferingPeriodSEIEnabled()                               { return m_bufferingPeriodSEIEnabled; }
    820   Void  setPictureTimingSEIEnabled(Int b)                            { m_pictureTimingSEIEnabled = b; }
    821   Int   getPictureTimingSEIEnabled()                                 { return m_pictureTimingSEIEnabled; }
    822   Void  setRecoveryPointSEIEnabled(Int b)                            { m_recoveryPointSEIEnabled = b; }
    823   Int   getRecoveryPointSEIEnabled()                                 { return m_recoveryPointSEIEnabled; }
     841  Void  setEntropyCodingSyncEnabledFlag(Bool b)                      { m_entropyCodingSyncEnabledFlag = b; }
     842  Bool  getEntropyCodingSyncEnabledFlag() const                      { return m_entropyCodingSyncEnabledFlag; }
     843  Void  setDecodedPictureHashSEIType(HashType m)                     { m_decodedPictureHashSEIType = m; }
     844  HashType getDecodedPictureHashSEIType() const                      { return m_decodedPictureHashSEIType; }
     845  Void  setBufferingPeriodSEIEnabled(Bool b)                         { m_bufferingPeriodSEIEnabled = b; }
     846  Bool  getBufferingPeriodSEIEnabled() const                         { return m_bufferingPeriodSEIEnabled; }
     847  Void  setPictureTimingSEIEnabled(Bool b)                           { m_pictureTimingSEIEnabled = b; }
     848  Bool  getPictureTimingSEIEnabled() const                           { return m_pictureTimingSEIEnabled; }
     849  Void  setRecoveryPointSEIEnabled(Bool b)                           { m_recoveryPointSEIEnabled = b; }
     850  Bool  getRecoveryPointSEIEnabled() const                           { return m_recoveryPointSEIEnabled; }
    824851  Void  setToneMappingInfoSEIEnabled(Bool b)                         { m_toneMappingInfoSEIEnabled = b;  }
    825852  Bool  getToneMappingInfoSEIEnabled()                               { return m_toneMappingInfoSEIEnabled;  }
     
    876903  Void  setTMISEIExtendedWhiteLevelLumaCodeValue(Int b)              { m_extendedWhiteLevelLumaCodeValue =b;  }
    877904  Int   getTMISEIExtendedWhiteLevelLumaCodeValue()                   { return m_extendedWhiteLevelLumaCodeValue;  }
    878   Void  setFramePackingArrangementSEIEnabled(Int b)                  { m_framePackingSEIEnabled = b; }
    879   Int   getFramePackingArrangementSEIEnabled()                       { return m_framePackingSEIEnabled; }
     905  Void  setFramePackingArrangementSEIEnabled(Bool b)                 { m_framePackingSEIEnabled = b; }
     906  Bool  getFramePackingArrangementSEIEnabled() const                 { return m_framePackingSEIEnabled; }
    880907  Void  setFramePackingArrangementSEIType(Int b)                     { m_framePackingSEIType = b; }
    881908  Int   getFramePackingArrangementSEIType()                          { return m_framePackingSEIType; }
     
    886913  Void  setFramePackingArrangementSEIInterpretation(Int b)           { m_framePackingSEIInterpretation = b; }
    887914  Int   getFramePackingArrangementSEIInterpretation()                { return m_framePackingSEIInterpretation; }
    888   Void  setSegmentedRectFramePackingArrangementSEIEnabled(Int b)     { m_segmentedRectFramePackingSEIEnabled = b; }
    889   Int   getSegmentedRectFramePackingArrangementSEIEnabled()          { return m_segmentedRectFramePackingSEIEnabled; }
     915  Void  setSegmentedRectFramePackingArrangementSEIEnabled(Bool b)    { m_segmentedRectFramePackingSEIEnabled = b; }
     916  Bool  getSegmentedRectFramePackingArrangementSEIEnabled() const    { return m_segmentedRectFramePackingSEIEnabled; }
    890917  Void  setSegmentedRectFramePackingArrangementSEICancel(Int b)      { m_segmentedRectFramePackingSEICancel = b; }
    891918  Int   getSegmentedRectFramePackingArrangementSEICancel()           { return m_segmentedRectFramePackingSEICancel; }
     
    896923  Void  setDisplayOrientationSEIAngle(Int b)                         { m_displayOrientationSEIAngle = b; }
    897924  Int   getDisplayOrientationSEIAngle()                              { return m_displayOrientationSEIAngle; }
    898   Void  setTemporalLevel0IndexSEIEnabled(Int b)                      { m_temporalLevel0IndexSEIEnabled = b; }
    899   Int   getTemporalLevel0IndexSEIEnabled()                           { return m_temporalLevel0IndexSEIEnabled; }
    900   Void  setGradualDecodingRefreshInfoEnabled(Int b)                  { m_gradualDecodingRefreshInfoEnabled = b;    }
    901   Int   getGradualDecodingRefreshInfoEnabled()                       { return m_gradualDecodingRefreshInfoEnabled; }
     925  Void  setTemporalLevel0IndexSEIEnabled(Bool b)                     { m_temporalLevel0IndexSEIEnabled = b; }
     926  Bool  getTemporalLevel0IndexSEIEnabled() const                     { return m_temporalLevel0IndexSEIEnabled; }
     927  Void  setGradualDecodingRefreshInfoEnabled(Bool b)                 { m_gradualDecodingRefreshInfoEnabled = b;    }
     928  Bool  getGradualDecodingRefreshInfoEnabled() const                 { return m_gradualDecodingRefreshInfoEnabled; }
    902929  Void  setNoDisplaySEITLayer(Int b)                                 { m_noDisplaySEITLayer = b;    }
    903930  Int   getNoDisplaySEITLayer()                                      { return m_noDisplaySEITLayer; }
    904   Void  setDecodingUnitInfoSEIEnabled(Int b)                         { m_decodingUnitInfoSEIEnabled = b;    }
    905   Int   getDecodingUnitInfoSEIEnabled()                              { return m_decodingUnitInfoSEIEnabled; }
    906   Void  setSOPDescriptionSEIEnabled(Int b)                           { m_SOPDescriptionSEIEnabled = b; }
    907   Int   getSOPDescriptionSEIEnabled()                                { return m_SOPDescriptionSEIEnabled; }
    908   Void  setScalableNestingSEIEnabled(Int b)                          { m_scalableNestingSEIEnabled = b; }
    909   Int   getScalableNestingSEIEnabled()                               { return m_scalableNestingSEIEnabled; }
     931  Void  setDecodingUnitInfoSEIEnabled(Bool b)                        { m_decodingUnitInfoSEIEnabled = b;    }
     932  Bool  getDecodingUnitInfoSEIEnabled() const                        { return m_decodingUnitInfoSEIEnabled; }
     933  Void  setSOPDescriptionSEIEnabled(Bool b)                          { m_SOPDescriptionSEIEnabled = b; }
     934  Bool  getSOPDescriptionSEIEnabled() const                          { return m_SOPDescriptionSEIEnabled; }
     935  Void  setScalableNestingSEIEnabled(Bool b)                         { m_scalableNestingSEIEnabled = b; }
     936  Bool  getScalableNestingSEIEnabled() const                         { return m_scalableNestingSEIEnabled; }
    910937  Void  setTMCTSSEIEnabled(Bool b)                                   { m_tmctsSEIEnabled = b; }
    911938  Bool  getTMCTSSEIEnabled()                                         { return m_tmctsSEIEnabled; }
     
    939966  Void  setKneeSEIOutputKneePoint(Int *p)                            { m_kneeSEIOutputKneePoint = p; }
    940967  Int*  getKneeSEIOutputKneePoint()                                  { return m_kneeSEIOutputKneePoint; }
     968  Void  setColourRemapInfoSEIFileRoot( const std::string &s )        { m_colourRemapSEIFileRoot = s; }
     969  const std::string &getColourRemapInfoSEIFileRoot() const           { return m_colourRemapSEIFileRoot; }
     970
    941971  Void  setMasteringDisplaySEI(const TComSEIMasteringDisplay &src)   { m_masteringDisplay = src; }
    942972  const TComSEIMasteringDisplay &getMasteringDisplaySEI() const      { return m_masteringDisplay; }
     
    9841014  Void         setUseScalingListId    ( ScalingListMode u )          { m_useScalingListId       = u;   }
    9851015  ScalingListMode getUseScalingListId    ()                          { return m_useScalingListId;      }
    986   Void         setScalingListFile     ( Char*  pch )                 { m_scalingListFile     = pch; }
    987   Char*        getScalingListFile     ()                             { return m_scalingListFile;    }
     1016  Void         setScalingListFileName       ( const std::string &s ) { m_scalingListFileName = s;      }
     1017  const std::string& getScalingListFileName () const                 { return m_scalingListFileName;   }
    9881018  Void         setTMVPModeId ( Int  u )                              { m_TMVPModeId = u;    }
    9891019  Int          getTMVPModeId ()                                      { return m_TMVPModeId; }
     1020  WeightedPredictionMethod getWeightedPredictionMethod() const       { return m_weightedPredictionMethod; }
     1021  Void         setWeightedPredictionMethod( WeightedPredictionMethod m ) { m_weightedPredictionMethod = m; }
    9901022  Void         setSignHideFlag( Bool signHideFlag )                  { m_signHideFlag = signHideFlag; }
    9911023  Bool         getSignHideFlag()                                     { return m_signHideFlag; }
     
    10041036  Bool         getForceIntraQP        ()                             { return m_RCForceIntraQP;        }
    10051037  Void         setForceIntraQP        ( Bool b )                     { m_RCForceIntraQP = b;           }
     1038
     1039#if U0132_TARGET_BITS_SATURATION
     1040  Bool         getCpbSaturationEnabled()                             { return m_RCCpbSaturationEnabled;}
     1041  Void         setCpbSaturationEnabled( Bool b )                     { m_RCCpbSaturationEnabled = b;   }
     1042  UInt         getCpbSize             ()                             { return m_RCCpbSize;}
     1043  Void         setCpbSize             ( UInt ui )                    { m_RCCpbSize = ui;   }
     1044  Double       getInitialCpbFullness  ()                             { return m_RCInitialCpbFullness;  }
     1045  Void         setInitialCpbFullness  (Double f)                     { m_RCInitialCpbFullness = f;     }
     1046#endif
    10061047
    10071048#if KWU_RC_MADPRED_E0227
     
    11321173  Bool         getLowerBitRateConstraintFlag() const                 { return m_lowerBitRateConstraintFlag; }
    11331174  Void         setLowerBitRateConstraintFlag(Bool b)                 { m_lowerBitRateConstraintFlag=b; }
    1134   Bool      getChromaSamplingFilterHintEnabled()                     { return m_chromaSamplingFilterHintEnabled;}
    1135   Void      setChromaSamplingFilterHintEnabled(Bool i)               { m_chromaSamplingFilterHintEnabled = i;}
    1136   Int       getChromaSamplingHorFilterIdc()                          { return m_chromaSamplingHorFilterIdc;}
    1137   Void      setChromaSamplingHorFilterIdc(Int i)                     { m_chromaSamplingHorFilterIdc = i;}
    1138   Int       getChromaSamplingVerFilterIdc()                          { return m_chromaSamplingVerFilterIdc;}
    1139   Void      setChromaSamplingVerFilterIdc(Int i)                     { m_chromaSamplingVerFilterIdc = i;}
     1175  Bool         getChromaResamplingFilterHintEnabled()                { return m_chromaResamplingFilterHintEnabled;}
     1176  Void         setChromaResamplingFilterHintEnabled(Bool i)          { m_chromaResamplingFilterHintEnabled = i;}
     1177  Int          getChromaResamplingHorFilterIdc()                     { return m_chromaResamplingHorFilterIdc;}
     1178  Void         setChromaResamplingHorFilterIdc(Int i)                { m_chromaResamplingHorFilterIdc = i;}
     1179  Int          getChromaResamplingVerFilterIdc()                     { return m_chromaResamplingVerFilterIdc;}
     1180  Void         setChromaResamplingVerFilterIdc(Int i)                { m_chromaResamplingVerFilterIdc = i;}
    11401181
    11411182  Void      setSummaryOutFilename(const std::string &s)              { m_summaryOutFilename = s; }
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncCu.cpp

    r1321 r1360  
    22162216          *earlyDetectionSkipMode = true;
    22172217        }
    2218         else if(m_pcEncCfg->getFastSearch() != SELECTIVE)
     2218        else if(m_pcEncCfg->getMotionEstimationSearchMethod() != MESEARCH_SELECTIVE)
    22192219        {
    22202220          Int absoulte_MV=0;
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncGOP.cpp

    r1356 r1360  
    219219}
    220220
     221Void TEncGOP::xWriteAccessUnitDelimiter (AccessUnit &accessUnit, TComSlice *slice)
     222{
     223  AUDWriter audWriter;
     224  OutputNALUnit nalu(NAL_UNIT_ACCESS_UNIT_DELIMITER);
     225
     226  Int picType = slice->isIntra() ? 0 : (slice->isInterP() ? 1 : 2);
     227
     228  audWriter.codeAUD(nalu.m_Bitstream, picType);
     229  accessUnit.push_front(new NALUnitEBSP(nalu));
     230}
     231
    221232// write SEI list into one NAL unit and add it to the Access unit at auPos
    222233Void TEncGOP::xWriteSEI (NalUnitType naluType, SEIMessages& seiMessages, AccessUnit &accessUnit, AccessUnit::iterator &auPos, Int temporalId, const TComSPS *sps)
     
    485496  }
    486497
     498  if(m_pcCfg->getChromaResamplingFilterHintEnabled())
     499  {
     500    SEIChromaResamplingFilterHint *seiChromaResamplingFilterHint = new SEIChromaResamplingFilterHint;
     501    m_seiEncoder.initSEIChromaResamplingFilterHint(seiChromaResamplingFilterHint, m_pcCfg->getChromaResamplingHorFilterIdc(), m_pcCfg->getChromaResamplingVerFilterIdc());
     502    seiMessages.push_back(seiChromaResamplingFilterHint);
     503  }
     504
     505
    487506#if NH_MV
    488507#if !NH_MV_SEI
     
    545564  }
    546565
    547   if(slice->getSPS()->getVuiParametersPresentFlag() && m_pcCfg->getChromaSamplingFilterHintEnabled() && ( slice->getSliceType() == I_SLICE ))
    548   {
    549     SEIChromaSamplingFilterHint *seiChromaSamplingFilterHint = new SEIChromaSamplingFilterHint;
    550     m_seiEncoder.initSEIChromaSamplingFilterHint(seiChromaSamplingFilterHint, m_pcCfg->getChromaSamplingHorFilterIdc(), m_pcCfg->getChromaSamplingVerFilterIdc());
    551     seiMessages.push_back(seiChromaSamplingFilterHint);
    552   }
    553 
    554566  if( m_pcEncTop->getNoDisplaySEITLayer() && ( slice->getTLayer() >= m_pcEncTop->getNoDisplaySEITLayer() ) )
    555567  {
     
    557569    seiNoDisplay->m_noDisplay = true;
    558570    seiMessages.push_back(seiNoDisplay);
     571  }
     572
     573  // insert one Colour Remapping Info SEI for the picture (if the file exists)
     574  if (!m_pcCfg->getColourRemapInfoSEIFileRoot().empty())
     575  {
     576    SEIColourRemappingInfo *seiColourRemappingInfo = new SEIColourRemappingInfo();
     577    const Bool success = m_seiEncoder.initSEIColourRemappingInfo(seiColourRemappingInfo, slice->getPOC() );
     578
     579    if(success)
     580    {
     581      seiMessages.push_back(seiColourRemappingInfo);
     582    }
     583    else
     584    {
     585      delete seiColourRemappingInfo;
     586    }
    559587  }
    560588}
     
    577605Void TEncGOP::xCreatePictureTimingSEI  (Int IRAPGOPid, SEIMessages& seiMessages, SEIMessages& nestedSeiMessages, SEIMessages& duInfoSeiMessages, TComSlice *slice, Bool isField, std::deque<DUData> &duData)
    578606{
    579   Int picSptDpbOutputDuDelay = 0;
    580607#if !NH_MV
    581608  SEIPictureTiming *pictureTimingSEI = new SEIPictureTiming();
     
    590617    (  hrd->getNalHrdParametersPresentFlag() || hrd->getVclHrdParametersPresentFlag() ) )
    591618  {
    592 #if NH_MV
    593     // Preliminary fix to avoid memory leak.
     619    Int picSptDpbOutputDuDelay = 0;
    594620    SEIPictureTiming *pictureTimingSEI = new SEIPictureTiming();
    595 #endif
    596621
    597622    // DU parameters
     
    712737      }
    713738    }
     739
     740    if( !m_pcCfg->getPictureTimingSEIEnabled() && pictureTimingSEI )
     741    {
     742      delete pictureTimingSEI;
     743    }
    714744  }
    715745}
     
    745775
    746776  // The last DU may have a trailing SEI
    747   if (m_pcCfg->getDecodedPictureHashSEIEnabled())
     777  if (m_pcCfg->getDecodedPictureHashSEIType()!=HASHTYPE_NONE)
    748778  {
    749779    duData.back().accumBitsDU += ( 20 << 3 ); // probably around 20 bytes - should be further adjusted, e.g. by type
     
    867897      if (cabacZeroWordPaddingEnabled)
    868898      {
    869         std::vector<Char> zeroBytesPadding(numberOfAdditionalCabacZeroBytes, Char(0));
     899        std::vector<UChar> zeroBytesPadding(numberOfAdditionalCabacZeroBytes, UChar(0));
    870900        for(std::size_t i=0; i<numberOfAdditionalCabacZeroWords; i++)
    871901        {
    872902          zeroBytesPadding[i*3+2]=3;  // 00 00 03
    873903        }
    874         nalUnitData.write(&(zeroBytesPadding[0]), numberOfAdditionalCabacZeroBytes);
     904        nalUnitData.write(reinterpret_cast<const TChar*>(&(zeroBytesPadding[0])), numberOfAdditionalCabacZeroBytes);
    875905        printf("Adding %d bytes of padding\n", UInt(numberOfAdditionalCabacZeroWords*3));
    876906      }
     
    10581088  {
    10591089    return 1;
     1090  }
     1091}
     1092
     1093
     1094static Void
     1095printHash(const HashType hashType, const std::string &digestStr)
     1096{
     1097  const TChar *decodedPictureHashModeName;
     1098  switch (hashType)
     1099  {
     1100    case HASHTYPE_MD5:
     1101      decodedPictureHashModeName = "MD5";
     1102      break;
     1103    case HASHTYPE_CRC:
     1104      decodedPictureHashModeName = "CRC";
     1105      break;
     1106    case HASHTYPE_CHECKSUM:
     1107      decodedPictureHashModeName = "Checksum";
     1108      break;
     1109    default:
     1110      decodedPictureHashModeName = NULL;
     1111      break;
     1112  }
     1113  if (decodedPictureHashModeName != NULL)
     1114  {
     1115    if (digestStr.empty())
     1116    {
     1117      printf(" [%s:%s]", decodedPictureHashModeName, "?");
     1118    }
     1119    else
     1120    {
     1121      printf(" [%s:%s]", decodedPictureHashModeName, digestStr.c_str());
     1122    }
    10601123  }
    10611124}
     
    16061669#endif
    16071670
    1608     /////////////////////////////////////////////////////////////////////////////////////////////////// Compress a slice
    1609     //  Slice compression
    1610     if (m_pcCfg->getUseASR())
     1671    if (m_pcCfg->getUseASR() && pcSlice->getSliceType()!=I_SLICE)
    16111672    {
    16121673      m_pcSliceEncoder->setSearchRange(pcSlice);
     
    16541715      }
    16551716      m_pcRateCtrl->initRCPic( frameLevel );
     1717      estimatedBits = m_pcRateCtrl->getRCPic()->getTargetBits();
    16561718
    16571719#if KWU_RC_MADPRED_E0227
     
    16621724#endif
    16631725
    1664       estimatedBits = m_pcRateCtrl->getRCPic()->getTargetBits();
     1726#if U0132_TARGET_BITS_SATURATION
     1727      if (m_pcRateCtrl->getCpbSaturationEnabled() && frameLevel != 0)
     1728      {
     1729        Int estimatedCpbFullness = m_pcRateCtrl->getCpbState() + m_pcRateCtrl->getBufferingRate();
     1730
     1731        // prevent overflow
     1732        if (estimatedCpbFullness - estimatedBits > (Int)(m_pcRateCtrl->getCpbSize()*0.9f))
     1733        {
     1734          estimatedBits = estimatedCpbFullness - (Int)(m_pcRateCtrl->getCpbSize()*0.9f);
     1735        }
     1736
     1737        estimatedCpbFullness -= m_pcRateCtrl->getBufferingRate();
     1738        // prevent underflow
     1739        if (estimatedCpbFullness - estimatedBits < (Int)(m_pcRateCtrl->getCpbSize()*0.1f))
     1740        {
     1741          estimatedBits = max(200, estimatedCpbFullness - (Int)(m_pcRateCtrl->getCpbSize()*0.1f));
     1742        }
     1743
     1744        m_pcRateCtrl->getRCPic()->setTargetBits(estimatedBits);
     1745      }
     1746#endif
    16651747
    16661748      Int sliceQP = m_pcCfg->getInitialQP();
     
    16831765          Int bits = m_pcRateCtrl->getRCSeq()->getLeftAverageBits();
    16841766          bits = m_pcRateCtrl->getRCPic()->getRefineBitsForIntra( bits );
     1767
     1768#if U0132_TARGET_BITS_SATURATION
     1769          if (m_pcRateCtrl->getCpbSaturationEnabled() )
     1770          {
     1771            Int estimatedCpbFullness = m_pcRateCtrl->getCpbState() + m_pcRateCtrl->getBufferingRate();
     1772
     1773            // prevent overflow
     1774            if (estimatedCpbFullness - bits > (Int)(m_pcRateCtrl->getCpbSize()*0.9f))
     1775            {
     1776              bits = estimatedCpbFullness - (Int)(m_pcRateCtrl->getCpbSize()*0.9f);
     1777            }
     1778
     1779            estimatedCpbFullness -= m_pcRateCtrl->getBufferingRate();
     1780            // prevent underflow
     1781            if (estimatedCpbFullness - bits < (Int)(m_pcRateCtrl->getCpbSize()*0.1f))
     1782            {
     1783              bits = estimatedCpbFullness - (Int)(m_pcRateCtrl->getCpbSize()*0.1f);
     1784            }
     1785          }
     1786#endif
     1787
    16851788          if ( bits < 200 )
    16861789          {
     
    18351938      m_bSeqFirst = false;
    18361939    }
     1940    if (m_pcCfg->getAccessUnitDelimiter())
     1941    {
     1942      xWriteAccessUnitDelimiter(accessUnit, pcSlice);
     1943    }
    18371944
    18381945    // reset presence of BP SEI indication
     
    20022109
    20032110    std::string digestStr;
    2004     if (m_pcCfg->getDecodedPictureHashSEIEnabled())
     2111    if (m_pcCfg->getDecodedPictureHashSEIType()!=HASHTYPE_NONE)
    20052112    {
    20062113      SEIDecodedPictureHash *decodedPictureHashSei = new SEIDecodedPictureHash();
     
    20142121    xCalculateAddPSNRs( isField, isTff, iGOPid, pcPic, accessUnit, rcListPic, dEncTime, snr_conversion, printFrameMSE );
    20152122
    2016     if (!digestStr.empty())
    2017     {
    2018       if(m_pcCfg->getDecodedPictureHashSEIEnabled() == 1)
    2019       {
    2020         printf(" [MD5:%s]", digestStr.c_str());
    2021       }
    2022       else if(m_pcCfg->getDecodedPictureHashSEIEnabled() == 2)
    2023       {
    2024         printf(" [CRC:%s]", digestStr.c_str());
    2025       }
    2026       else if(m_pcCfg->getDecodedPictureHashSEIEnabled() == 3)
    2027       {
    2028         printf(" [Checksum:%s]", digestStr.c_str());
    2029       }
    2030     }
     2123    printHash(m_pcCfg->getDecodedPictureHashSEIType(), digestStr);
    20312124
    20322125    if ( m_pcCfg->getUseRateCtrl() )
     
    20512144        m_pcRateCtrl->getRCGOP()->updateAfterPicture( estimatedBits );
    20522145      }
     2146#if U0132_TARGET_BITS_SATURATION
     2147      if (m_pcRateCtrl->getCpbSaturationEnabled())
     2148      {
     2149        m_pcRateCtrl->updateCpbState(actualTotalBits);
     2150        printf(" [CPB %6d bits]", m_pcRateCtrl->getCpbState());
     2151      }
     2152#endif
    20532153    }
    20542154
     
    23522452  if (conversion!=IPCOLOURSPACE_UNCHANGED)
    23532453  {
    2354     cscd.create(pcPicD->getWidth(COMPONENT_Y), pcPicD->getHeight(COMPONENT_Y), pcPicD->getChromaFormat(), pcPicD->getWidth(COMPONENT_Y), pcPicD->getHeight(COMPONENT_Y), 0, false);
     2454    cscd.createWithoutCUInfo(pcPicD->getWidth(COMPONENT_Y), pcPicD->getHeight(COMPONENT_Y), pcPicD->getChromaFormat() );
    23552455    TVideoIOYuv::ColourSpaceConvert(*pcPicD, cscd, conversion, false);
    23562456  }
     
    24522552  }
    24532553
    2454   Char c = (pcSlice->isIntra() ? 'I' : pcSlice->isInterP() ? 'P' : 'B');
     2554  TChar c = (pcSlice->isIntra() ? 'I' : pcSlice->isInterP() ? 'P' : 'B');
    24552555  if (!pcSlice->isReferenced())
    24562556  {
     
    25062606  printf(" [ET %5.0f ]", dEncTime );
    25072607
     2608  // printf(" [WP %d]", pcSlice->getUseWeightedPrediction());
     2609
    25082610  for (Int iRefList = 0; iRefList < 2; iRefList++)
    25092611  {
     
    25552657    {
    25562658      TComPicYuv &reconField=*(apcPicRecFields[fieldNum]);
    2557       cscd[fieldNum].create(reconField.getWidth(COMPONENT_Y), reconField.getHeight(COMPONENT_Y), reconField.getChromaFormat(), reconField.getWidth(COMPONENT_Y), reconField.getHeight(COMPONENT_Y), 0, false);
     2659      cscd[fieldNum].createWithoutCUInfo(reconField.getWidth(COMPONENT_Y), reconField.getHeight(COMPONENT_Y), reconField.getChromaFormat() );
    25582660      TVideoIOYuv::ColourSpaceConvert(reconField, cscd[fieldNum], conversion, false);
    25592661      apcPicRecFields[fieldNum]=cscd+fieldNum;
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncGOP.h

    r1313 r1360  
    220220  Double xCalculateRVM();
    221221
     222  Void xWriteAccessUnitDelimiter (AccessUnit &accessUnit, TComSlice *slice);
     223
    222224  Void xCreateIRAPLeadingSEIMessages (SEIMessages& seiMessages, const TComSPS *sps, const TComPPS *pps);
    223225  Void xCreatePerPictureSEIMessages (Int picInGOP, SEIMessages& seiMessages, SEIMessages& nestedSeiMessages, TComSlice *slice);
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncPreanalyzer.cpp

    r1313 r1360  
    8787        UInt64 uiSum[4] = {0, 0, 0, 0};
    8888        UInt64 uiSumSq[4] = {0, 0, 0, 0};
    89         UInt uiNumPixInAQPart = 0;
    9089        UInt by = 0;
    9190        for ( ; by < uiCurrAQPartHeight>>1; by++ )
    9291        {
    9392          UInt bx = 0;
    94           for ( ; bx < uiCurrAQPartWidth>>1; bx++, uiNumPixInAQPart++ )
     93          for ( ; bx < uiCurrAQPartWidth>>1; bx++ )
    9594          {
    9695            uiSum  [0] += pBlkY[bx];
    9796            uiSumSq[0] += pBlkY[bx] * pBlkY[bx];
    9897          }
    99           for ( ; bx < uiCurrAQPartWidth; bx++, uiNumPixInAQPart++ )
     98          for ( ; bx < uiCurrAQPartWidth; bx++ )
    10099          {
    101100            uiSum  [1] += pBlkY[bx];
     
    107106        {
    108107          UInt bx = 0;
    109           for ( ; bx < uiCurrAQPartWidth>>1; bx++, uiNumPixInAQPart++ )
     108          for ( ; bx < uiCurrAQPartWidth>>1; bx++ )
    110109          {
    111110            uiSum  [2] += pBlkY[bx];
    112111            uiSumSq[2] += pBlkY[bx] * pBlkY[bx];
    113112          }
    114           for ( ; bx < uiCurrAQPartWidth; bx++, uiNumPixInAQPart++ )
     113          for ( ; bx < uiCurrAQPartWidth; bx++ )
    115114          {
    116115            uiSum  [3] += pBlkY[bx];
     
    120119        }
    121120
     121        assert ((uiCurrAQPartWidth&1)==0);
     122        assert ((uiCurrAQPartHeight&1)==0);
     123        const UInt pixelWidthOfQuadrants  = uiCurrAQPartWidth >>1;
     124        const UInt pixelHeightOfQuadrants = uiCurrAQPartHeight>>1;
     125        const UInt numPixInAQPart         = pixelWidthOfQuadrants * pixelHeightOfQuadrants;
     126
    122127        Double dMinVar = DBL_MAX;
     128        if (numPixInAQPart!=0)
     129        {
    123130        for ( Int i=0; i<4; i++)
    124131        {
    125           const Double dAverage = Double(uiSum[i]) / uiNumPixInAQPart;
    126           const Double dVariance = Double(uiSumSq[i]) / uiNumPixInAQPart - dAverage * dAverage;
     132            const Double dAverage = Double(uiSum[i]) / numPixInAQPart;
     133            const Double dVariance = Double(uiSumSq[i]) / numPixInAQPart - dAverage * dAverage;
    127134          dMinVar = min(dMinVar, dVariance);
     135        }
     136        }
     137        else
     138        {
     139          dMinVar = 0.0;
    128140        }
    129141        const Double dActivity = 1.0 + dMinVar;
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncRateCtrl.cpp

    r1313 r1360  
    16391639    m_encRCSeq->initLCUPara();
    16401640  }
     1641#if U0132_TARGET_BITS_SATURATION
     1642  m_CpbSaturationEnabled = false;
     1643  m_cpbSize              = targetBitrate;
     1644  m_cpbState             = (UInt)(m_cpbSize*0.5f);
     1645  m_bufferingRate        = (Int)(targetBitrate / frameRate);
     1646#endif
    16411647
    16421648#if KWU_RC_MADPRED_E0227
     
    16641670}
    16651671
     1672#if U0132_TARGET_BITS_SATURATION
     1673Int  TEncRateCtrl::updateCpbState(Int actualBits)
     1674{
     1675  Int cpbState = 1;
     1676
     1677  m_cpbState -= actualBits;
     1678  if (m_cpbState < 0)
     1679  {
     1680    cpbState = -1;
     1681  }
     1682
     1683  m_cpbState += m_bufferingRate;
     1684  if (m_cpbState > m_cpbSize)
     1685  {
     1686    cpbState = 0;
     1687  }
     1688
     1689  return cpbState;
     1690}
     1691
     1692Void TEncRateCtrl::initHrdParam(const TComHRD* pcHrd, Int iFrameRate, Double fInitialCpbFullness)
     1693{
     1694  m_CpbSaturationEnabled = true;
     1695  m_cpbSize = (pcHrd->getCpbSizeValueMinus1(0, 0, 0) + 1) << (4 + pcHrd->getCpbSizeScale());
     1696  m_cpbState = (UInt)(m_cpbSize*fInitialCpbFullness);
     1697  m_bufferingRate = (UInt)(((pcHrd->getBitRateValueMinus1(0, 0, 0) + 1) << (6 + pcHrd->getBitRateScale())) / iFrameRate);
     1698  printf("\nHRD - [Initial CPB state %6d] [CPB Size %6d] [Buffering Rate %6d]\n", m_cpbState, m_cpbSize, m_bufferingRate);
     1699}
     1700#endif
     1701
    16661702Void TEncRateCtrl::destroyRCGOP()
    16671703{
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncRateCtrl.h

    r1313 r1360  
    285285  TRCLCU& getLCU( Int LCUIdx )                            { return m_LCUs[LCUIdx]; }
    286286  Int  getPicActualHeaderBits()                           { return m_picActualHeaderBits; }
     287#if U0132_TARGET_BITS_SATURATION
     288  Void setBitLeft(Int bits)                               { m_bitsLeft = bits; }
     289#endif
    287290  Void setTargetBits( Int bits )                          { m_targetBits = bits; m_bitsLeft = bits;}
    288291  Void setTotalIntraCost(Double cost)                     { m_totalCostIntra = cost; }
     
    369372  Void setLayerID(Int layerid)     { m_LayerID = layerid; }
    370373#endif
     374#if U0132_TARGET_BITS_SATURATION
     375  Bool       getCpbSaturationEnabled()  { return m_CpbSaturationEnabled;  }
     376  UInt       getCpbState()              { return m_cpbState;       }
     377  UInt       getCpbSize()               { return m_cpbSize;        }
     378  UInt       getBufferingRate()         { return m_bufferingRate;  }
     379  Int        updateCpbState(Int actualBits);
     380  Void       initHrdParam(const TComHRD* pcHrd, Int iFrameRate, Double fInitialCpbFullness);
     381#endif
     382
    371383private:
    372384  TEncRCSeq* m_encRCSeq;
     
    375387  list<TEncRCPic*> m_listRCPictures;
    376388  Int        m_RCQP;
     389#if U0132_TARGET_BITS_SATURATION
     390  Bool       m_CpbSaturationEnabled;    // Enable target bits saturation to avoid CPB overflow and underflow
     391  Int        m_cpbState;                // CPB State
     392  UInt       m_cpbSize;                 // CPB size
     393  UInt       m_bufferingRate;           // Buffering rate
     394#endif
     395
    377396#if KWU_RC_MADPRED_E0227
    378397  Int m_LayerID;
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.cpp

    r1321 r1360  
    908908      m_signLineBuf1 = NULL;
    909909    }
    910     m_signLineBuf1 = new Char[m_lineBufWidth+1];
     910    m_signLineBuf1 = new SChar[m_lineBufWidth+1];
    911911
    912912    if (m_signLineBuf2)
     
    915915      m_signLineBuf2 = NULL;
    916916    }
    917     m_signLineBuf2 = new Char[m_lineBufWidth+1];
     917    m_signLineBuf2 = new SChar[m_lineBufWidth+1];
    918918  }
    919919
    920920  Int x,y, startX, startY, endX, endY, edgeType, firstLineStartX, firstLineEndX;
    921   Char signLeft, signRight, signDown;
     921  SChar signLeft, signRight, signDown;
    922922  Int64 *diff, *count;
    923923  Pel *srcLine, *orgLine;
     
    949949        for (y=0; y<endY; y++)
    950950        {
    951           signLeft = (Char)sgn(srcLine[startX] - srcLine[startX-1]);
     951          signLeft = (SChar)sgn(srcLine[startX] - srcLine[startX-1]);
    952952          for (x=startX; x<endX; x++)
    953953          {
    954             signRight =  (Char)sgn(srcLine[x] - srcLine[x+1]);
     954            signRight =  (SChar)sgn(srcLine[x] - srcLine[x+1]);
    955955            edgeType  =  signRight + signLeft;
    956956            signLeft  = -signRight;
     
    971971            for(y=0; y<skipLinesB[typeIdx]; y++)
    972972            {
    973               signLeft = (Char)sgn(srcLine[startX] - srcLine[startX-1]);
     973              signLeft = (SChar)sgn(srcLine[startX] - srcLine[startX-1]);
    974974              for (x=startX; x<endX; x++)
    975975              {
    976                 signRight =  (Char)sgn(srcLine[x] - srcLine[x+1]);
     976                signRight =  (SChar)sgn(srcLine[x] - srcLine[x+1]);
    977977                edgeType  =  signRight + signLeft;
    978978                signLeft  = -signRight;
     
    992992        diff +=2;
    993993        count+=2;
    994         Char *signUpLine = m_signLineBuf1;
     994        SChar *signUpLine = m_signLineBuf1;
    995995
    996996        startX = (!isCalculatePreDeblockSamples) ? 0
     
    10111011        for (x=startX; x<endX; x++)
    10121012        {
    1013           signUpLine[x] = (Char)sgn(srcLine[x] - srcLineAbove[x]);
     1013          signUpLine[x] = (SChar)sgn(srcLine[x] - srcLineAbove[x]);
    10141014        }
    10151015
     
    10211021          for (x=startX; x<endX; x++)
    10221022          {
    1023             signDown  = (Char)sgn(srcLine[x] - srcLineBelow[x]);
     1023            signDown  = (SChar)sgn(srcLine[x] - srcLineBelow[x]);
    10241024            edgeType  = signDown + signUpLine[x];
    10251025            signUpLine[x]= -signDown;
     
    10611061        diff +=2;
    10621062        count+=2;
    1063         Char *signUpLine, *signDownLine, *signTmpLine;
     1063        SChar *signUpLine, *signDownLine, *signTmpLine;
    10641064
    10651065        signUpLine  = m_signLineBuf1;
     
    10791079        for (x=startX; x<endX+1; x++)
    10801080        {
    1081           signUpLine[x] = (Char)sgn(srcLineBelow[x] - srcLine[x-1]);
     1081          signUpLine[x] = (SChar)sgn(srcLineBelow[x] - srcLine[x-1]);
    10821082        }
    10831083
     
    11031103          for (x=startX; x<endX; x++)
    11041104          {
    1105             signDown = (Char)sgn(srcLine[x] - srcLineBelow[x+1]);
     1105            signDown = (SChar)sgn(srcLine[x] - srcLineBelow[x+1]);
    11061106            edgeType = signDown + signUpLine[x];
    11071107            diff [edgeType] += (orgLine[x] - srcLine[x]);
     
    11101110            signDownLine[x+1] = -signDown;
    11111111          }
    1112           signDownLine[startX] = (Char)sgn(srcLineBelow[startX] - srcLine[startX-1]);
     1112          signDownLine[startX] = (SChar)sgn(srcLineBelow[startX] - srcLine[startX-1]);
    11131113
    11141114          signTmpLine  = signUpLine;
     
    11481148        diff +=2;
    11491149        count+=2;
    1150         Char *signUpLine = m_signLineBuf1+1;
     1150        SChar *signUpLine = m_signLineBuf1+1;
    11511151
    11521152        startX = (!isCalculatePreDeblockSamples) ? (isLeftAvail  ? 0 : 1)
     
    11621162        for (x=startX-1; x<endX; x++)
    11631163        {
    1164           signUpLine[x] = (Char)sgn(srcLineBelow[x] - srcLine[x+1]);
     1164          signUpLine[x] = (SChar)sgn(srcLineBelow[x] - srcLine[x+1]);
    11651165        }
    11661166
     
    11911191          for(x=startX; x<endX; x++)
    11921192          {
    1193             signDown = (Char)sgn(srcLine[x] - srcLineBelow[x-1]);
     1193            signDown = (SChar)sgn(srcLine[x] - srcLineBelow[x-1]);
    11941194            edgeType = signDown + signUpLine[x];
    11951195
     
    11991199            signUpLine[x-1] = -signDown;
    12001200          }
    1201           signUpLine[endX-1] = (Char)sgn(srcLineBelow[endX-1] - srcLine[endX]);
     1201          signUpLine[endX-1] = (SChar)sgn(srcLineBelow[endX-1] - srcLine[endX]);
    12021202          srcLine  += srcStride;
    12031203          orgLine  += orgStride;
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncSearch.cpp

    r1321 r1360  
    7474};
    7575
    76 static const UInt s_auiDFilter[9] =
    77 {
    78   0, 1, 0,
    79   2, 3, 2,
    80   0, 1, 0
    81 };
    82 
    8376static Void offsetSubTUCBFs(TComTU &rTu, const ComponentID compID)
    8477{
     
    120113, m_iSearchRange (0)
    121114, m_bipredSearchRange (0)
    122 , m_iFastSearch (0)
    123115, m_pppcRDSbacCoder (NULL)
    124116, m_pcRDGoOnSbacCoder (NULL)
    125117, m_pTempPel (NULL)
    126 , m_puiDFilter (NULL)
    127118, m_isInitialized (false)
    128119{
     
    130121  {
    131122    m_ppcQTTempCoeff[ch]                           = NULL;
    132     m_pcQTTempCoeff[ch]                            = NULL;
    133123#if ADAPTIVE_QP_SELECTION
    134124    m_ppcQTTempArlCoeff[ch]                        = NULL;
    135     m_pcQTTempArlCoeff[ch]                         = NULL;
    136125#endif
    137126    m_puhQTTempCbf[ch]                             = NULL;
     
    181170      }
    182171      delete[] m_ppcQTTempCoeff[ch];
    183       delete[] m_pcQTTempCoeff[ch];
    184172      delete[] m_puhQTTempCbf[ch];
    185173#if ADAPTIVE_QP_SELECTION
    186174      delete[] m_ppcQTTempArlCoeff[ch];
    187       delete[] m_pcQTTempArlCoeff[ch];
    188175#endif
    189176    }
     
    229216                      Int           iSearchRange,
    230217                      Int           bipredSearchRange,
    231                       Int           iFastSearch,
     218                      MESearchMethod motionEstimationSearchMethod,
    232219                      const UInt    maxCUWidth,
    233220                      const UInt    maxCUHeight,
     
    244231  m_iSearchRange         = iSearchRange;
    245232  m_bipredSearchRange    = bipredSearchRange;
    246   m_iFastSearch          = iFastSearch;
     233  m_motionEstimationSearchMethod = motionEstimationSearchMethod;
    247234  m_pcEntropyCoder       = pcEntropyCoder;
    248235  m_pcRdCost             = pcRdCost;
     
    258245    }
    259246  }
    260 
    261   m_puiDFilter = s_auiDFilter + 4;
    262247
    263248  // initialize motion cost
     
    289274    const UInt csy=::getComponentScaleY(ComponentID(ch), cform);
    290275    m_ppcQTTempCoeff[ch] = new TCoeff* [uiNumLayersToAllocate];
    291     m_pcQTTempCoeff[ch]   = new TCoeff [(maxCUWidth*maxCUHeight)>>(csx+csy)   ];
    292276#if ADAPTIVE_QP_SELECTION
    293277    m_ppcQTTempArlCoeff[ch]  = new TCoeff*[uiNumLayersToAllocate];
    294     m_pcQTTempArlCoeff[ch]   = new TCoeff [(maxCUWidth*maxCUHeight)>>(csx+csy)   ];
    295278#endif
    296279    m_puhQTTempCbf[ch] = new UChar  [uiNumPartitions];
     
    304287    }
    305288
    306     m_phQTTempCrossComponentPredictionAlpha[ch]    = new Char  [uiNumPartitions];
     289    m_phQTTempCrossComponentPredictionAlpha[ch]    = new SChar  [uiNumPartitions];
    307290    m_pSharedPredTransformSkip[ch]                 = new Pel   [MAX_CU_SIZE*MAX_CU_SIZE];
    308291    m_pcQTTempTUCoeff[ch]                          = new TCoeff[MAX_CU_SIZE*MAX_CU_SIZE];
     
    323306}
    324307
    325 #define TZ_SEARCH_CONFIGURATION                                                                                 \
    326 const Int  iRaster                  = 5;  /* TZ soll von aussen ?ergeben werden */                            \
    327 const Bool bTestOtherPredictedMV    = 0;                                                                      \
    328 const Bool bTestZeroVector          = 1;                                                                      \
    329 const Bool bTestZeroVectorStart     = 0;                                                                      \
    330 const Bool bTestZeroVectorStop      = 0;                                                                      \
    331 const Bool bFirstSearchDiamond      = 1;  /* 1 = xTZ8PointDiamondSearch   0 = xTZ8PointSquareSearch */        \
    332 const Bool bFirstSearchStop         = m_pcEncCfg->getFastMEAssumingSmootherMVEnabled();                       \
    333 const UInt uiFirstSearchRounds      = 3;  /* first search stop X rounds after best match (must be >=1) */     \
    334 const Bool bEnableRasterSearch      = 1;                                                                      \
    335 const Bool bAlwaysRasterSearch      = 0;  /* ===== 1: BETTER but factor 2 slower ===== */                     \
    336 const Bool bRasterRefinementEnable  = 0;  /* enable either raster refinement or star refinement */            \
    337 const Bool bRasterRefinementDiamond = 0;  /* 1 = xTZ8PointDiamondSearch   0 = xTZ8PointSquareSearch */        \
    338 const Bool bStarRefinementEnable    = 1;  /* enable either star refinement or raster refinement */            \
    339 const Bool bStarRefinementDiamond   = 1;  /* 1 = xTZ8PointDiamondSearch   0 = xTZ8PointSquareSearch */        \
    340 const Bool bStarRefinementStop      = 0;                                                                      \
    341 const UInt uiStarRefinementRounds   = 2;  /* star refinement stop X rounds after best match (must be >=1) */  \
    342 
    343 
    344 #define SEL_SEARCH_CONFIGURATION                                                                                 \
    345   const Bool bTestOtherPredictedMV    = 1;                                                                       \
    346   const Bool bTestZeroVector          = 1;                                                                       \
    347   const Bool bEnableRasterSearch      = 1;                                                                       \
    348   const Bool bAlwaysRasterSearch      = 0;  /* ===== 1: BETTER but factor 15x slower ===== */                    \
    349   const Bool bStarRefinementEnable    = 1;  /* enable either star refinement or raster refinement */             \
    350   const Bool bStarRefinementDiamond   = 1;  /* 1 = xTZ8PointDiamondSearch   0 = xTZ8PointSquareSearch */         \
    351   const Bool bStarRefinementStop      = 0;                                                                       \
    352   const UInt uiStarRefinementRounds   = 2;  /* star refinement stop X rounds after best match (must be >=1) */   \
    353   const UInt uiSearchRange            = m_iSearchRange;                                                          \
    354   const Int  uiSearchRangeInitial     = m_iSearchRange >> 2;                                                     \
    355   const Int  uiSearchStep             = 4;                                                                       \
    356   const Int  iMVDistThresh            = 8;                                                                       \
    357 
    358 
    359 
    360 __inline Void TEncSearch::xTZSearchHelp( TComPattern* pcPatternKey, IntTZSearchStruct& rcStruct, const Int iSearchX, const Int iSearchY, const UChar ucPointNr, const UInt uiDistance )
     308
     309
     310
     311__inline Void TEncSearch::xTZSearchHelp( const TComPattern* const pcPatternKey, IntTZSearchStruct& rcStruct, const Int iSearchX, const Int iSearchY, const UChar ucPointNr, const UInt uiDistance )
    361312{
    362313  Distortion  uiSad = 0;
    363314
    364   Pel*  piRefSrch;
    365 
    366   piRefSrch = rcStruct.piRefY + iSearchY * rcStruct.iYStride + iSearchX;
     315  const Pel* const  piRefSrch = rcStruct.piRefY + iSearchY * rcStruct.iYStride + iSearchX;
     316
    367317#if NH_3D_IC
    368318  m_cDistParam.bUseIC = pcPatternKey->getICFlag();
     
    374324  m_pcRdCost->setDistParam( pcPatternKey, piRefSrch, rcStruct.iYStride,  m_cDistParam );
    375325
    376   if(m_pcEncCfg->getFastSearch() != SELECTIVE)
    377   {
    378     // fast encoder decision: use subsampled SAD when rows > 8 for integer ME
    379     if ( m_pcEncCfg->getUseFastEnc() )
    380     {
    381       if ( m_cDistParam.iRows > 8 )
    382       {
    383         m_cDistParam.iSubShift = 1;
    384       }
    385     }
    386   }
    387 
    388326  setDistParamComp(COMPONENT_Y);
    389327
    390328  // distortion
    391329  m_cDistParam.bitDepth = pcPatternKey->getBitDepthY();
    392   if(m_pcEncCfg->getFastSearch() == SELECTIVE)
     330  m_cDistParam.m_maximumDistortionForEarlyExit = rcStruct.uiBestSad;
     331
     332  if((m_pcEncCfg->getRestrictMESampling() == false) && m_pcEncCfg->getMotionEstimationSearchMethod() == MESEARCH_SELECTIVE)
    393333  {
    394334    Int isubShift = 0;
    395335    // motion cost
    396     Distortion uiBitCost = m_pcRdCost->getCost( iSearchX, iSearchY );
    397 
     336    Distortion uiBitCost = m_pcRdCost->getCostOfVectorWithPredictor( iSearchX, iSearchY );
     337
     338    // Skip search if bit cost is already larger than best SAD
     339    if (uiBitCost < rcStruct.uiBestSad)
     340    {
    398341    if ( m_cDistParam.iRows > 32 )
    399342    {
     
    443386          rcStruct.uiBestRound    = 0;
    444387          rcStruct.ucPointNr      = ucPointNr;
     388            m_cDistParam.m_maximumDistortionForEarlyExit = uiSad;
     389          }
    445390        }
    446391      }
     
    449394  else
    450395  {
     396    // fast encoder decision: use subsampled SAD when rows > 8 for integer ME
     397    if ( m_pcEncCfg->getFastInterSearchMode()==FASTINTERSEARCH_MODE1 || m_pcEncCfg->getFastInterSearchMode()==FASTINTERSEARCH_MODE3 )
     398    {
     399      if ( m_cDistParam.iRows > 8 )
     400      {
     401        m_cDistParam.iSubShift = 1;
     402      }
     403    }
     404
    451405    uiSad = m_cDistParam.DistFunc( &m_cDistParam );
    452406
     407    // only add motion cost if uiSad is smaller than best. Otherwise pointless
     408    // to add motion cost.
     409    if( uiSad < rcStruct.uiBestSad )
     410    {
    453411    // motion cost
    454     uiSad += m_pcRdCost->getCost( iSearchX, iSearchY );
     412      uiSad += m_pcRdCost->getCostOfVectorWithPredictor( iSearchX, iSearchY );
    455413
    456414    if( uiSad < rcStruct.uiBestSad )
     
    462420      rcStruct.uiBestRound    = 0;
    463421      rcStruct.ucPointNr      = ucPointNr;
     422        m_cDistParam.m_maximumDistortionForEarlyExit = uiSad;
     423      }
    464424    }
    465425  }
     
    469429
    470430
    471 __inline Void TEncSearch::xTZ2PointSearch( TComPattern* pcPatternKey, IntTZSearchStruct& rcStruct, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB )
     431__inline Void TEncSearch::xTZ2PointSearch( const TComPattern* const pcPatternKey, IntTZSearchStruct& rcStruct, const TComMv* const pcMvSrchRngLT, const TComMv* const pcMvSrchRngRB )
    472432{
    473433  Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();
     
    602562
    603563
    604 __inline Void TEncSearch::xTZ8PointSquareSearch( TComPattern* pcPatternKey, IntTZSearchStruct& rcStruct, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist )
     564__inline Void TEncSearch::xTZ8PointSquareSearch( const TComPattern* const pcPatternKey, IntTZSearchStruct& rcStruct, const TComMv* const pcMvSrchRngLT, const TComMv* const pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist )
    605565{
    606   Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();
    607   Int   iSrchRngHorRight  = pcMvSrchRngRB->getHor();
    608   Int   iSrchRngVerTop    = pcMvSrchRngLT->getVer();
    609   Int   iSrchRngVerBottom = pcMvSrchRngRB->getVer();
     566  const Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();
     567  const Int   iSrchRngHorRight  = pcMvSrchRngRB->getHor();
     568  const Int   iSrchRngVerTop    = pcMvSrchRngLT->getVer();
     569  const Int   iSrchRngVerBottom = pcMvSrchRngRB->getVer();
    610570
    611571  // 8 point search,                   //   1 2 3
     
    660620
    661621
    662 __inline Void TEncSearch::xTZ8PointDiamondSearch( TComPattern* pcPatternKey, IntTZSearchStruct& rcStruct, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist )
     622__inline Void TEncSearch::xTZ8PointDiamondSearch( const TComPattern*const  pcPatternKey,
     623                                                  IntTZSearchStruct& rcStruct,
     624                                                  const TComMv*const  pcMvSrchRngLT,
     625                                                  const TComMv*const  pcMvSrchRngRB,
     626                                                  const Int iStartX,
     627                                                  const Int iStartY,
     628                                                  const Int iDist,
     629                                                  const Bool bCheckCornersAtDist1 )
    663630{
    664   Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();
    665   Int   iSrchRngHorRight  = pcMvSrchRngRB->getHor();
    666   Int   iSrchRngVerTop    = pcMvSrchRngLT->getVer();
    667   Int   iSrchRngVerBottom = pcMvSrchRngRB->getVer();
     631  const Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();
     632  const Int   iSrchRngHorRight  = pcMvSrchRngRB->getHor();
     633  const Int   iSrchRngVerTop    = pcMvSrchRngLT->getVer();
     634  const Int   iSrchRngVerBottom = pcMvSrchRngRB->getVer();
    668635
    669636  // 8 point search,                   //   1 2 3
     
    677644  rcStruct.uiBestRound += 1;
    678645
    679   if ( iDist == 1 ) // iDist == 1
     646  if ( iDist == 1 )
    680647  {
    681648    if ( iTop >= iSrchRngVerTop ) // check top
    682649    {
     650      if (bCheckCornersAtDist1)
     651      {
     652        if ( iLeft >= iSrchRngHorLeft) // check top-left
     653        {
     654          xTZSearchHelp( pcPatternKey, rcStruct, iLeft, iTop, 1, iDist );
     655        }
     656        xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iTop, 2, iDist );
     657        if ( iRight <= iSrchRngHorRight ) // check middle right
     658        {
     659          xTZSearchHelp( pcPatternKey, rcStruct, iRight, iTop, 3, iDist );
     660        }
     661      }
     662      else
     663      {
    683664      xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iTop, 2, iDist );
    684665    }
     666    }
    685667    if ( iLeft >= iSrchRngHorLeft ) // check middle left
    686668    {
     
    693675    if ( iBottom <= iSrchRngVerBottom ) // check bottom
    694676    {
     677      if (bCheckCornersAtDist1)
     678      {
     679        if ( iLeft >= iSrchRngHorLeft) // check top-left
     680        {
     681          xTZSearchHelp( pcPatternKey, rcStruct, iLeft, iBottom, 6, iDist );
     682        }
     683        xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iBottom, 7, iDist );
     684        if ( iRight <= iSrchRngHorRight ) // check middle right
     685        {
     686          xTZSearchHelp( pcPatternKey, rcStruct, iRight, iBottom, 8, iDist );
     687        }
     688      }
     689      else
     690      {
    695691      xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iBottom, 7, iDist );
    696692    }
    697693  }
    698   else // if (iDist != 1)
     694  }
     695  else
    699696  {
    700697    if ( iDist <= 8 )
     
    770767        for ( Int index = 1; index < 4; index++ )
    771768        {
    772           Int iPosYT = iTop    + ((iDist>>2) * index);
    773           Int iPosYB = iBottom - ((iDist>>2) * index);
    774           Int iPosXL = iStartX - ((iDist>>2) * index);
    775           Int iPosXR = iStartX + ((iDist>>2) * index);
     769          const Int iPosYT = iTop    + ((iDist>>2) * index);
     770          const Int iPosYB = iBottom - ((iDist>>2) * index);
     771          const Int iPosXL = iStartX - ((iDist>>2) * index);
     772          const Int iPosXR = iStartX + ((iDist>>2) * index);
    776773          xTZSearchHelp( pcPatternKey, rcStruct, iPosXL, iPosYT, 0, iDist );
    777774          xTZSearchHelp( pcPatternKey, rcStruct, iPosXR, iPosYT, 0, iDist );
     
    800797        for ( Int index = 1; index < 4; index++ )
    801798        {
    802           Int iPosYT = iTop    + ((iDist>>2) * index);
    803           Int iPosYB = iBottom - ((iDist>>2) * index);
    804           Int iPosXL = iStartX - ((iDist>>2) * index);
    805           Int iPosXR = iStartX + ((iDist>>2) * index);
     799          const Int iPosYT = iTop    + ((iDist>>2) * index);
     800          const Int iPosYB = iBottom - ((iDist>>2) * index);
     801          const Int iPosXL = iStartX - ((iDist>>2) * index);
     802          const Int iPosXR = iStartX + ((iDist>>2) * index);
    806803
    807804          if ( iPosYT >= iSrchRngVerTop ) // check top
     
    833830}
    834831
    835 
    836 
    837 
    838 
    839 //<--
    840 
    841832Distortion TEncSearch::xPatternRefinement( TComPattern* pcPatternKey,
    842833                                           TComMv baseRefMv,
     
    886877    m_cDistParam.bitDepth = pcPatternKey->getBitDepthY();
    887878    uiDist = m_cDistParam.DistFunc( &m_cDistParam );
    888     uiDist += m_pcRdCost->getCost( cMvTest.getHor(), cMvTest.getVer() );
     879    uiDist += m_pcRdCost->getCostOfVectorWithPredictor( cMvTest.getHor(), cMvTest.getVer() );
    889880
    890881    if ( uiDist < uiDistBest )
     
    892883      uiDistBest  = uiDist;
    893884      uiDirecBest = i;
     885      m_cDistParam.m_maximumDistortionForEarlyExit = uiDist;
    894886    }
    895887  }
     
    24102402}
    24112403
    2412 Char
     2404SChar
    24132405TEncSearch::xCalcCrossComponentPredictionAlpha(       TComTU &rTu,
    24142406                                                const ComponentID compID,
     
    24272419  const Int diffBitDepth = pCU->getSlice()->getSPS()->getDifferentialLumaChromaBitDepth();
    24282420
    2429   Char alpha = 0;
     2421  SChar alpha = 0;
    24302422  Int SSxy  = 0;
    24312423  Int SSxx  = 0;
     
    24472439  {
    24482440    Double dAlpha = SSxy / Double( SSxx );
    2449     alpha = Char(Clip3<Int>(-16, 16, (Int)(dAlpha * 16)));
    2450 
    2451     static const Char alphaQuant[17] = {0, 1, 1, 2, 2, 2, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8};
     2441    alpha = SChar(Clip3<Int>(-16, 16, (Int)(dAlpha * 16)));
     2442
     2443    static const SChar alphaQuant[17] = {0, 1, 1, 2, 2, 2, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8};
    24522444
    24532445    alpha = (alpha < 0) ? -alphaQuant[Int(-alpha)] : alphaQuant[Int(alpha)];
     
    25402532        Double     singleCostTmp             = 0;
    25412533        UInt       singleCbfCTmp             = 0;
    2542         Char       bestCrossCPredictionAlpha = 0;
     2534        SChar      bestCrossCPredictionAlpha = 0;
    25432535        Int        bestTransformSkipMode     = 0;
    25442536
     
    36893681              ::memcpy( m_puhQTTempCbf[compID], pcCU->getCbf( compID )+uiPartOffset, uiQPartNum * sizeof( UChar ) );
    36903682              ::memcpy( m_puhQTTempTransformSkipFlag[compID], pcCU->getTransformSkip( compID )+uiPartOffset, uiQPartNum * sizeof( UChar ) );
    3691               ::memcpy( m_phQTTempCrossComponentPredictionAlpha[compID], pcCU->getCrossComponentPredictionAlpha(compID)+uiPartOffset, uiQPartNum * sizeof( Char ) );
     3683              ::memcpy( m_phQTTempCrossComponentPredictionAlpha[compID], pcCU->getCrossComponentPredictionAlpha(compID)+uiPartOffset, uiQPartNum * sizeof( SChar ) );
    36923684            }
    36933685          }
     
    37023694          ::memcpy( pcCU->getCbf( compID )+uiPartOffset, m_puhQTTempCbf[compID], uiQPartNum * sizeof( UChar ) );
    37033695          ::memcpy( pcCU->getTransformSkip( compID )+uiPartOffset, m_puhQTTempTransformSkipFlag[compID], uiQPartNum * sizeof( UChar ) );
    3704           ::memcpy( pcCU->getCrossComponentPredictionAlpha(compID)+uiPartOffset, m_phQTTempCrossComponentPredictionAlpha[compID], uiQPartNum * sizeof( Char ) );
     3696          ::memcpy( pcCU->getCrossComponentPredictionAlpha(compID)+uiPartOffset, m_phQTTempCrossComponentPredictionAlpha[compID], uiQPartNum * sizeof( SChar ) );
    37053697        }
    37063698      }
     
    38123804{
    38133805  UInt        uiDepth      = pcCU->getDepth(0);
    3814   const UInt  uiDistortion = 0;
     3806  const Distortion  uiDistortion = 0;
    38153807  UInt        uiBits;
    38163808
     
    43254317            /*correct the bit-rate part of the current ref*/
    43264318            m_pcRdCost->setPredictor  ( cMvPred[iRefList][iRefIdxTemp] );
    4327             uiBitsTemp += m_pcRdCost->getBits( cMvTemp[1][iRefIdxTemp].getHor(), cMvTemp[1][iRefIdxTemp].getVer() );
     4319            uiBitsTemp += m_pcRdCost->getBitsOfVectorWithPredictor( cMvTemp[1][iRefIdxTemp].getHor(), cMvTemp[1][iRefIdxTemp].getVer() );
    43284320            /*calculate the correct cost*/
    43294321            uiCostTemp += m_pcRdCost->getCost( uiBitsTemp );
     
    43744366    }
    43754367
    4376     //  Bi-directional prediction
     4368    //  Bi-predictive Motion estimation
    43774369    if ( (pcCU->getSlice()->isInterB()) && (pcCU->isBipredRestriction(iPartIdx) == false) )
    43784370    {
     
    44294421
    44304422      // fast encoder setting: only one iteration
    4431       if ( m_pcEncCfg->getUseFastEnc() || pcCU->getSlice()->getMvdL1ZeroFlag())
     4423      if ( m_pcEncCfg->getFastInterSearchMode()==FASTINTERSEARCH_MODE1 || m_pcEncCfg->getFastInterSearchMode()==FASTINTERSEARCH_MODE2 || pcCU->getSlice()->getMvdL1ZeroFlag() )
    44324424      {
    44334425        iNumIter = 1;
     
    44384430        Int         iRefList    = iIter % 2;
    44394431
    4440         if ( m_pcEncCfg->getUseFastEnc() )
     4432        if ( m_pcEncCfg->getFastInterSearchMode()==FASTINTERSEARCH_MODE1 || m_pcEncCfg->getFastInterSearchMode()==FASTINTERSEARCH_MODE2 )
    44414433        {
    44424434          if( uiCost[0] <= uiCost[1] )
     
    46294621      TComMvField cMEMvField[2];
    46304622
    4631       m_pcRdCost->getMotionCost( true, 0, pcCU->getCUTransquantBypass(uiPartAddr) );
     4623      m_pcRdCost->selectMotionLambda( true, 0, pcCU->getCUTransquantBypass(uiPartAddr) );
    46324624
    46334625#if AMP_MRG
     
    46524644      // save ME result.
    46534645      uiMEInterDir = pcCU->getInterDir( uiPartAddr );
    4654       pcCU->getMvField( pcCU, uiPartAddr, REF_PIC_LIST_0, cMEMvField[0] );
    4655       pcCU->getMvField( pcCU, uiPartAddr, REF_PIC_LIST_1, cMEMvField[1] );
     4646      TComDataCU::getMvField( pcCU, uiPartAddr, REF_PIC_LIST_0, cMEMvField[0] );
     4647      TComDataCU::getMvField( pcCU, uiPartAddr, REF_PIC_LIST_1, cMEMvField[1] );
    46564648
    46574649      // find Merge result
     
    50405032  }
    50415033
    5042   m_pcRdCost->getMotionCost( true, 0, pcCU->getCUTransquantBypass(0) );
     5034  m_pcRdCost->selectMotionLambda( true, 0, pcCU->getCUTransquantBypass(0) );
    50435035  m_pcRdCost->setCostScale ( 0    );
    50445036
     
    50465038
    50475039  m_pcRdCost->setPredictor( rcMvPred );
    5048   Int iOrgMvBits  = m_pcRdCost->getBits(cMv.getHor(), cMv.getVer());
     5040  Int iOrgMvBits  = m_pcRdCost->getBitsOfVectorWithPredictor(cMv.getHor(), cMv.getVer());
    50495041  iOrgMvBits += m_auiMVPIdxCost[riMVPIdx][AMVP_MAX_NUM_CANDS];
    50505042  Int iBestMvBits = iOrgMvBits;
     
    50595051    m_pcRdCost->setPredictor( pcAMVPInfo->m_acMvCand[iMVPIdx] );
    50605052
    5061     Int iMvBits = m_pcRdCost->getBits(cMv.getHor(), cMv.getVer());
     5053    Int iMvBits = m_pcRdCost->getBitsOfVectorWithPredictor(cMv.getHor(), cMv.getVer());
    50625054    iMvBits += m_auiMVPIdxCost[iMVPIdx][AMVP_MAX_NUM_CANDS];
    50635055
     
    51345126
    51355127  uiCost = m_pcRdCost->getDistPart( pcCU->getSlice()->getSPS()->getBitDepth(CHANNEL_TYPE_LUMA), pcTemplateCand->getAddr(COMPONENT_Y, uiPartAddr), pcTemplateCand->getStride(COMPONENT_Y), pcOrgYuv->getAddr(COMPONENT_Y, uiPartAddr), pcOrgYuv->getStride(COMPONENT_Y), iSizeX, iSizeY, COMPONENT_Y, DF_SAD );
    5136   uiCost = (UInt) m_pcRdCost->calcRdCost( m_auiMVPIdxCost[iMVPIdx][iMVPNum], uiCost, false, DF_SAD );
     5128  uiCost = (UInt) m_pcRdCost->calcRdCost( m_auiMVPIdxCost[iMVPIdx][iMVPNum], uiCost, DF_SAD );
    51375129  return uiCost;
    51385130}
     
    51765168#endif
    51775169
    5178   if ( bBi )
     5170  if ( bBi ) // Bipredictive ME
    51795171  {
    51805172    TComYuv*  pcYuvOther = &m_acYuvPred[1-(Int)eRefPicList];
     
    51875179    fWeight = 0.5;
    51885180  }
     5181  m_cDistParam.bIsBiPred = bBi;
    51895182
    51905183  //  Search key pattern initialization
     
    52125205  }
    52135206
    5214   m_pcRdCost->getMotionCost( true, 0, pcCU->getCUTransquantBypass(uiPartAddr) );
     5207  m_pcRdCost->selectMotionLambda( true, 0, pcCU->getCUTransquantBypass(uiPartAddr) );
    52155208
    52165209  m_pcRdCost->setPredictor  ( *pcMvPred );
     
    52315224  setWpScalingDistParam( pcCU, iRefIdxPred, eRefPicList );
    52325225  //  Do integer search
    5233   if ( !m_iFastSearch || bBi )
     5226  if ( (m_motionEstimationSearchMethod==MESEARCH_FULL) || bBi )
    52345227  {
    52355228    xPatternSearch      ( pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost );
     
    52505243  }
    52515244
    5252   m_pcRdCost->getMotionCost( true, 0, pcCU->getCUTransquantBypass(uiPartAddr) );
     5245  m_pcRdCost->selectMotionLambda( true, 0, pcCU->getCUTransquantBypass(uiPartAddr) );
    52535246#if NH_3D_INTEGER_MV_DEPTH
    52545247  if( ! pcCU->getSlice()->getIsDepth() )
     
    52685261#endif
    52695262
    5270   UInt uiMvBits = m_pcRdCost->getBits( rcMv.getHor(), rcMv.getVer() );
     5263  UInt uiMvBits = m_pcRdCost->getBitsOfVectorWithPredictor( rcMv.getHor(), rcMv.getVer() );
    52715264#if NH_3D_INTEGER_MV_DEPTH
    52725265  if( pcCU->getSlice()->getIsDepth() )
     
    52855278
    52865279
    5287 Void TEncSearch::xSetSearchRange ( TComDataCU* pcCU, TComMv& cMvPred, Int iSrchRng, TComMv& rcMvSrchRngLT, TComMv& rcMvSrchRngRB )
     5280Void TEncSearch::xSetSearchRange ( const TComDataCU* const pcCU, const TComMv& cMvPred, const Int iSrchRng,
     5281                                   TComMv& rcMvSrchRngLT, TComMv& rcMvSrchRngRB )
    52885282{
    52895283  Int  iMvShift = 2;
     
    53175311  pcCU->clipMv        ( rcMvSrchRngRB );
    53185312
     5313#if ME_ENABLE_ROUNDING_OF_MVS
     5314  rcMvSrchRngLT.divideByPowerOf2(iMvShift);
     5315  rcMvSrchRngRB.divideByPowerOf2(iMvShift);
     5316#else
    53195317  rcMvSrchRngLT >>= iMvShift;
    53205318  rcMvSrchRngRB >>= iMvShift;
     5319#endif
    53215320}
    53225321
    53235322
    5324 
    5325 
    5326 Void TEncSearch::xPatternSearch( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, TComMv& rcMv, Distortion& ruiSAD )
     5323Void TEncSearch::xPatternSearch( const TComPattern* const pcPatternKey,
     5324                                 const Pel*               piRefY,
     5325                                 const Int                iRefStride,
     5326                                 const TComMv* const      pcMvSrchRngLT,
     5327                                 const TComMv* const      pcMvSrchRngRB,
     5328                                 TComMv&      rcMv,
     5329                                 Distortion&  ruiSAD )
    53275330{
    53285331  Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();
     
    53365339  Int         iBestY = 0;
    53375340
    5338   Pel*  piRefSrch;
    5339 
    53405341  //-- jclee for using the SAD function pointer
    53415342  m_pcRdCost->setDistParam( pcPatternKey, piRefY, iRefStride,  m_cDistParam );
    53425343
    53435344  // fast encoder decision: use subsampled SAD for integer ME
    5344   if ( m_pcEncCfg->getUseFastEnc() )
     5345  if ( m_pcEncCfg->getFastInterSearchMode()==FASTINTERSEARCH_MODE1 || m_pcEncCfg->getFastInterSearchMode()==FASTINTERSEARCH_MODE3 )
    53455346  {
    53465347    if ( m_cDistParam.iRows > 8 )
     
    53565357    {
    53575358      //  find min. distortion position
    5358       piRefSrch = piRefY + x;
    5359       m_cDistParam.pCur = piRefSrch;
     5359      m_cDistParam.pCur = piRefY + x;
    53605360
    53615361      setDistParamComp(COMPONENT_Y);
     
    53735373
    53745374      // motion cost
    5375       uiSad += m_pcRdCost->getCost( x, y );
     5375      uiSad += m_pcRdCost->getCostOfVectorWithPredictor( x, y );
    53765376
    53775377      if ( uiSad < uiSadBest )
     
    53805380        iBestX    = x;
    53815381        iBestY    = y;
     5382        m_cDistParam.m_maximumDistortionForEarlyExit = uiSad;
    53825383      }
    53835384    }
     
    53875388  rcMv.set( iBestX, iBestY );
    53885389
    5389   ruiSAD = uiSadBest - m_pcRdCost->getCost( iBestX, iBestY );
     5390  ruiSAD = uiSadBest - m_pcRdCost->getCostOfVectorWithPredictor( iBestX, iBestY );
    53905391  return;
    53915392}
     
    53935394
    53945395
    5395 Void TEncSearch::xPatternSearchFast( TComDataCU*   pcCU,
    5396                                      TComPattern* pcPatternKey,
    5397                                      Pel*          piRefY,
    5398                                      Int           iRefStride,
    5399                                      TComMv*       pcMvSrchRngLT,
    5400                                      TComMv*       pcMvSrchRngRB,
     5396Void TEncSearch::xPatternSearchFast( const TComDataCU* const  pcCU,
     5397                                     const TComPattern* const pcPatternKey,
     5398                                     const Pel* const         piRefY,
     5399                                     const Int                iRefStride,
     5400                                     const TComMv* const      pcMvSrchRngLT,
     5401                                     const TComMv* const      pcMvSrchRngRB,
    54015402                                     TComMv       &rcMv,
    54025403                                     Distortion   &ruiSAD,
    5403                                      const TComMv* pIntegerMv2Nx2NPred )
     5404                                     const TComMv* const      pIntegerMv2Nx2NPred )
    54045405{
    54055406  assert (MD_LEFT < NUM_MV_PREDICTORS);
     
    54105411  pcCU->getMvPredAboveRight ( m_acMvPredictors[MD_ABOVE_RIGHT] );
    54115412
    5412   switch ( m_iFastSearch )
    5413   {
    5414     case 1:
    5415       xTZSearch( pcCU, pcPatternKey, piRefY, iRefStride, pcMvSrchRngLT, pcMvSrchRngRB, rcMv, ruiSAD, pIntegerMv2Nx2NPred );
     5413  switch ( m_motionEstimationSearchMethod )
     5414  {
     5415    case MESEARCH_DIAMOND:
     5416      xTZSearch( pcCU, pcPatternKey, piRefY, iRefStride, pcMvSrchRngLT, pcMvSrchRngRB, rcMv, ruiSAD, pIntegerMv2Nx2NPred, false );
    54165417      break;
    54175418
    5418     case 2:
     5419    case MESEARCH_SELECTIVE:
    54195420      xTZSearchSelective( pcCU, pcPatternKey, piRefY, iRefStride, pcMvSrchRngLT, pcMvSrchRngRB, rcMv, ruiSAD, pIntegerMv2Nx2NPred );
    54205421      break;
     5422
     5423    case MESEARCH_DIAMOND_ENHANCED:
     5424      xTZSearch( pcCU, pcPatternKey, piRefY, iRefStride, pcMvSrchRngLT, pcMvSrchRngRB, rcMv, ruiSAD, pIntegerMv2Nx2NPred, true );
     5425      break;
     5426
     5427    case MESEARCH_FULL: // shouldn't get here.
    54215428    default:
    54225429      break;
     
    54275434
    54285435
    5429 Void TEncSearch::xTZSearch( TComDataCU* pcCU,
    5430                             TComPattern* pcPatternKey,
    5431                             Pel*         piRefY,
    5432                             Int          iRefStride,
    5433                             TComMv*      pcMvSrchRngLT,
    5434                             TComMv*      pcMvSrchRngRB,
     5436Void TEncSearch::xTZSearch( const TComDataCU* const pcCU,
     5437                            const TComPattern* const pcPatternKey,
     5438                            const Pel* const         piRefY,
     5439                            const Int                iRefStride,
     5440                            const TComMv* const      pcMvSrchRngLT,
     5441                            const TComMv* const      pcMvSrchRngRB,
    54355442                            TComMv      &rcMv,
    54365443                            Distortion  &ruiSAD,
    5437                             const TComMv* pIntegerMv2Nx2NPred )
     5444                            const TComMv* const      pIntegerMv2Nx2NPred,
     5445                            const Bool               bExtendedSettings)
    54385446{
    5439   Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();
    5440   Int   iSrchRngHorRight  = pcMvSrchRngRB->getHor();
    5441   Int   iSrchRngVerTop    = pcMvSrchRngLT->getVer();
    5442   Int   iSrchRngVerBottom = pcMvSrchRngRB->getVer();
    5443 
    5444   TZ_SEARCH_CONFIGURATION
     5447  const Bool bUseAdaptiveRaster                      = bExtendedSettings;
     5448  const Int  iRaster                                 = 5;
     5449  const Bool bTestOtherPredictedMV                   = bExtendedSettings;
     5450  const Bool bTestZeroVector                         = true;
     5451  const Bool bTestZeroVectorStart                    = bExtendedSettings;
     5452  const Bool bTestZeroVectorStop                     = false;
     5453  const Bool bFirstSearchDiamond                     = true;  // 1 = xTZ8PointDiamondSearch   0 = xTZ8PointSquareSearch
     5454  const Bool bFirstCornersForDiamondDist1            = bExtendedSettings;
     5455  const Bool bFirstSearchStop                        = m_pcEncCfg->getFastMEAssumingSmootherMVEnabled();
     5456  const UInt uiFirstSearchRounds                     = 3;     // first search stop X rounds after best match (must be >=1)
     5457  const Bool bEnableRasterSearch                     = true;
     5458  const Bool bAlwaysRasterSearch                     = bExtendedSettings;  // true: BETTER but factor 2 slower
     5459  const Bool bRasterRefinementEnable                 = false; // enable either raster refinement or star refinement
     5460  const Bool bRasterRefinementDiamond                = false; // 1 = xTZ8PointDiamondSearch   0 = xTZ8PointSquareSearch
     5461  const Bool bRasterRefinementCornersForDiamondDist1 = bExtendedSettings;
     5462  const Bool bStarRefinementEnable                   = true;  // enable either star refinement or raster refinement
     5463  const Bool bStarRefinementDiamond                  = true;  // 1 = xTZ8PointDiamondSearch   0 = xTZ8PointSquareSearch
     5464  const Bool bStarRefinementCornersForDiamondDist1   = bExtendedSettings;
     5465  const Bool bStarRefinementStop                     = false;
     5466  const UInt uiStarRefinementRounds                  = 2;  // star refinement stop X rounds after best match (must be >=1)
     5467  const Bool bNewZeroNeighbourhoodTest               = bExtendedSettings;
    54455468
    54465469  UInt uiSearchRange = m_iSearchRange;
     
    54495472  if( ! pcCU->getSlice()->getIsDepth() )
    54505473#endif
     5474#if ME_ENABLE_ROUNDING_OF_MVS
     5475  rcMv.divideByPowerOf2(2);
     5476#else
    54515477  rcMv >>= 2;
     5478#endif
     5479
    54525480  // init TZSearchStruct
    54535481  IntTZSearchStruct cStruct;
     
    54705498      {     
    54715499#endif
    5472         cMv >>= 2;
     5500#if ME_ENABLE_ROUNDING_OF_MVS
     5501      cMv.divideByPowerOf2(2);
     5502#else
     5503      cMv >>= 2;
     5504#endif
     5505
    54735506#if NH_3D_INTEGER_MV_DEPTH
    54745507      }
    54755508#endif
    5476 
     5509      if (cMv != rcMv && (cMv.getHor() != cStruct.iBestX && cMv.getVer() != cStruct.iBestY))
     5510      {
     5511        // only test cMV if not obviously previously tested.
    54775512      xTZSearchHelp( pcPatternKey, cStruct, cMv.getHor(), cMv.getVer(), 0, 0 );
    54785513    }
     5514  }
    54795515  }
    54805516
     
    54825518  if ( bTestZeroVector )
    54835519  {
     5520    if ((rcMv.getHor() != 0 || rcMv.getVer() != 0) &&
     5521        (0 != cStruct.iBestX || 0 != cStruct.iBestY))
     5522    {
     5523      // only test 0-vector if not obviously previously tested.
    54845524    xTZSearchHelp( pcPatternKey, cStruct, 0, 0, 0, 0 );
    54855525  }
     5526  }
     5527
     5528  Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();
     5529  Int   iSrchRngHorRight  = pcMvSrchRngRB->getHor();
     5530  Int   iSrchRngVerTop    = pcMvSrchRngLT->getVer();
     5531  Int   iSrchRngVerBottom = pcMvSrchRngRB->getVer();
    54865532
    54875533  if (pIntegerMv2Nx2NPred != 0)
     
    54905536    integerMv2Nx2NPred <<= 2;
    54915537    pcCU->clipMv( integerMv2Nx2NPred );
     5538#if ME_ENABLE_ROUNDING_OF_MVS
     5539    integerMv2Nx2NPred.divideByPowerOf2(2);
     5540#else
    54925541    integerMv2Nx2NPred >>= 2;
     5542#endif
     5543    if ((rcMv != integerMv2Nx2NPred) &&
     5544        (integerMv2Nx2NPred.getHor() != cStruct.iBestX || integerMv2Nx2NPred.getVer() != cStruct.iBestY))
     5545    {
     5546      // only test integerMv2Nx2NPred if not obviously previously tested.
    54935547    xTZSearchHelp(pcPatternKey, cStruct, integerMv2Nx2NPred.getHor(), integerMv2Nx2NPred.getVer(), 0, 0);
     5548    }
    54945549
    54955550    // reset search range
     
    55115566  Int  iStartY = cStruct.iBestY;
    55125567
    5513   // first search
     5568  const Bool bBestCandidateZero = (cStruct.iBestX == 0) && (cStruct.iBestY == 0);
     5569
     5570  // first search around best position up to now.
     5571  // The following works as a "subsampled/log" window search around the best candidate
    55145572  for ( iDist = 1; iDist <= (Int)uiSearchRange; iDist*=2 )
    55155573  {
    55165574    if ( bFirstSearchDiamond == 1 )
    55175575    {
    5518       xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, iDist );
     5576      xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, iDist, bFirstCornersForDiamondDist1 );
    55195577    }
    55205578    else
     
    55295587  }
    55305588
     5589  if (!bNewZeroNeighbourhoodTest)
     5590  {
    55315591  // test whether zero Mv is a better start point than Median predictor
    55325592  if ( bTestZeroVectorStart && ((cStruct.iBestX != 0) || (cStruct.iBestY != 0)) )
     
    55385598      for ( iDist = 1; iDist <= (Int)uiSearchRange; iDist*=2 )
    55395599      {
    5540         xTZ8PointDiamondSearch( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, 0, 0, iDist );
     5600          xTZ8PointDiamondSearch( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, 0, 0, iDist, false );
    55415601        if ( bTestZeroVectorStop && (cStruct.uiBestRound > 0) ) // stop criterion
     5602        {
     5603          break;
     5604        }
     5605      }
     5606    }
     5607  }
     5608  }
     5609  else
     5610  {
     5611    // Test also zero neighbourhood but with half the range
     5612    // It was reported that the original (above) search scheme using bTestZeroVectorStart did not
     5613    // make sense since one would have already checked the zero candidate earlier
     5614    // and thus the conditions for that test would have not been satisfied
     5615    if (bTestZeroVectorStart == true && bBestCandidateZero != true)
     5616    {
     5617      for ( iDist = 1; iDist <= ((Int)uiSearchRange >> 1); iDist*=2 )
     5618      {
     5619        xTZ8PointDiamondSearch( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, 0, 0, iDist, false );
     5620        if ( bTestZeroVectorStop && (cStruct.uiBestRound > 2) ) // stop criterion
    55425621        {
    55435622          break;
     
    55555634
    55565635  // raster search if distance is too big
     5636  if (bUseAdaptiveRaster)
     5637  {
     5638    int iWindowSize = iRaster;
     5639    Int   iSrchRngRasterLeft   = iSrchRngHorLeft;
     5640    Int   iSrchRngRasterRight  = iSrchRngHorRight;
     5641    Int   iSrchRngRasterTop    = iSrchRngVerTop;
     5642    Int   iSrchRngRasterBottom = iSrchRngVerBottom;
     5643
     5644    if (!(bEnableRasterSearch && ( ((Int)(cStruct.uiBestDistance) > iRaster))))
     5645    {
     5646      iWindowSize ++;
     5647      iSrchRngRasterLeft /= 2;
     5648      iSrchRngRasterRight /= 2;
     5649      iSrchRngRasterTop /= 2;
     5650      iSrchRngRasterBottom /= 2;
     5651    }
     5652    cStruct.uiBestDistance = iWindowSize;
     5653    for ( iStartY = iSrchRngRasterTop; iStartY <= iSrchRngRasterBottom; iStartY += iWindowSize )
     5654    {
     5655      for ( iStartX = iSrchRngRasterLeft; iStartX <= iSrchRngRasterRight; iStartX += iWindowSize )
     5656      {
     5657        xTZSearchHelp( pcPatternKey, cStruct, iStartX, iStartY, 0, iWindowSize );
     5658      }
     5659    }
     5660  }
     5661  else
     5662  {
    55575663  if ( bEnableRasterSearch && ( ((Int)(cStruct.uiBestDistance) > iRaster) || bAlwaysRasterSearch ) )
    55585664  {
     
    55655671      }
    55665672    }
     5673  }
    55675674  }
    55685675
     
    55795686        if ( bRasterRefinementDiamond == 1 )
    55805687        {
    5581           xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, iDist );
     5688          xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, iDist, bRasterRefinementCornersForDiamondDist1 );
    55825689        }
    55835690        else
     
    55995706  }
    56005707
    5601   // start refinement
     5708  // star refinement
    56025709  if ( bStarRefinementEnable && cStruct.uiBestDistance > 0 )
    56035710  {
     
    56125719        if ( bStarRefinementDiamond == 1 )
    56135720        {
    5614           xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, iDist );
     5721          xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, iDist, bStarRefinementCornersForDiamondDist1 );
    56155722        }
    56165723        else
     
    56385745  // write out best match
    56395746  rcMv.set( cStruct.iBestX, cStruct.iBestY );
    5640   ruiSAD = cStruct.uiBestSad - m_pcRdCost->getCost( cStruct.iBestX, cStruct.iBestY );
     5747  ruiSAD = cStruct.uiBestSad - m_pcRdCost->getCostOfVectorWithPredictor( cStruct.iBestX, cStruct.iBestY );
    56415748}
    56425749
    56435750
    5644 Void TEncSearch::xTZSearchSelective( TComDataCU*   pcCU,
    5645                                      TComPattern*  pcPatternKey,
    5646                                      Pel*          piRefY,
    5647                                      Int           iRefStride,
    5648                                      TComMv*       pcMvSrchRngLT,
    5649                                      TComMv*       pcMvSrchRngRB,
     5751Void TEncSearch::xTZSearchSelective( const TComDataCU* const   pcCU,
     5752                                     const TComPattern* const  pcPatternKey,
     5753                                     const Pel* const          piRefY,
     5754                                     const Int                 iRefStride,
     5755                                     const TComMv* const       pcMvSrchRngLT,
     5756                                     const TComMv* const       pcMvSrchRngRB,
    56505757                                     TComMv       &rcMv,
    56515758                                     Distortion   &ruiSAD,
    5652                                      const TComMv* pIntegerMv2Nx2NPred )
     5759                                     const TComMv* const       pIntegerMv2Nx2NPred )
    56535760{
    5654   SEL_SEARCH_CONFIGURATION
     5761  const Bool bTestOtherPredictedMV    = true;
     5762  const Bool bTestZeroVector          = true;
     5763  const Bool bEnableRasterSearch      = true;
     5764  const Bool bAlwaysRasterSearch      = false;  // 1: BETTER but factor 15x slower
     5765  const Bool bStarRefinementEnable    = true;   // enable either star refinement or raster refinement
     5766  const Bool bStarRefinementDiamond   = true;   // 1 = xTZ8PointDiamondSearch   0 = xTZ8PointSquareSearch
     5767  const Bool bStarRefinementStop      = false;
     5768  const UInt uiStarRefinementRounds   = 2;  // star refinement stop X rounds after best match (must be >=1)
     5769  const UInt uiSearchRange            = m_iSearchRange;
     5770  const Int  uiSearchRangeInitial     = m_iSearchRange >> 2;
     5771  const Int  uiSearchStep             = 4;
     5772  const Int  iMVDistThresh            = 8;
    56555773
    56565774  Int   iSrchRngHorLeft         = pcMvSrchRngLT->getHor();
     
    56695787
    56705788  pcCU->clipMv( rcMv );
     5789#if ME_ENABLE_ROUNDING_OF_MVS
     5790  rcMv.divideByPowerOf2(2);
     5791#else
    56715792  rcMv >>= 2;
     5793#endif
    56725794  // init TZSearchStruct
    56735795  IntTZSearchStruct cStruct;
     
    56895811      TComMv cMv = m_acMvPredictors[index];
    56905812      pcCU->clipMv( cMv );
     5813#if ME_ENABLE_ROUNDING_OF_MVS
     5814      cMv.divideByPowerOf2(2);
     5815#else
    56915816      cMv >>= 2;
     5817#endif
    56925818      xTZSearchHelp( pcPatternKey, cStruct, cMv.getHor(), cMv.getVer(), 0, 0 );
    56935819    }
     
    57055831    integerMv2Nx2NPred <<= 2;
    57065832    pcCU->clipMv( integerMv2Nx2NPred );
     5833#if ME_ENABLE_ROUNDING_OF_MVS
     5834    integerMv2Nx2NPred.divideByPowerOf2(2);
     5835#else
    57075836    integerMv2Nx2NPred >>= 2;
     5837#endif
    57085838    xTZSearchHelp(pcPatternKey, cStruct, integerMv2Nx2NPred.getHor(), integerMv2Nx2NPred.getVer(), 0, 0);
    57095839
     
    57345864    {
    57355865      xTZSearchHelp( pcPatternKey, cStruct, iStartX, iStartY, 0, 0 );
    5736       xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, 1 );
    5737       xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, 2 );
     5866      xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, 1, false );
     5867      xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, 2, false );
    57385868    }
    57395869  }
     
    57665896        if ( bStarRefinementDiamond == 1 )
    57675897        {
    5768           xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, iDist );
     5898          xTZ8PointDiamondSearch ( pcPatternKey, cStruct, pcMvSrchRngLT, pcMvSrchRngRB, iStartX, iStartY, iDist, false );
    57695899        }
    57705900        else
     
    57925922  // write out best match
    57935923  rcMv.set( cStruct.iBestX, cStruct.iBestY );
    5794   ruiSAD = cStruct.uiBestSad - m_pcRdCost->getCost( cStruct.iBestX, cStruct.iBestY );
     5924  ruiSAD = cStruct.uiBestSad - m_pcRdCost->getCostOfVectorWithPredictor( cStruct.iBestX, cStruct.iBestY );
    57955925
    57965926}
     
    60276157      const ComponentID component = ComponentID(comp);
    60286158      ::memset( pcCU->getCbf( component ) , 0, uiQPartNum * sizeof(UChar) );
    6029       ::memset( pcCU->getCrossComponentPredictionAlpha(component), 0, ( uiQPartNum * sizeof(Char) ) );
     6159      ::memset( pcCU->getCrossComponentPredictionAlpha(component), 0, ( uiQPartNum * sizeof(SChar) ) );
    60306160    }
    60316161    static const UInt useTS[MAX_NUM_COMPONENT]={0,0,0};
     
    63156445  //  Stores the best explicit RDPCM mode for a TU encoded without split
    63166446  UInt       bestExplicitRdpcmModeUnSplit[MAX_NUM_COMPONENT][2/*0 = top (or whole TU for non-4:2:2) sub-TU, 1 = bottom sub-TU*/] = {{3,3}, {3,3}, {3,3}};
    6317   Char       bestCrossCPredictionAlpha   [MAX_NUM_COMPONENT][2/*0 = top (or whole TU for non-4:2:2) sub-TU, 1 = bottom sub-TU*/] = {{0,0},{0,0},{0,0}};
     6447  SChar      bestCrossCPredictionAlpha   [MAX_NUM_COMPONENT][2/*0 = top (or whole TU for non-4:2:2) sub-TU, 1 = bottom sub-TU*/] = {{0,0},{0,0},{0,0}};
    63186448
    63196449  m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ uiDepth ][ CI_QT_TRAFO_ROOT ] );
     
    63866516                                                         && (pcCU->getCbf(subTUAbsPartIdx, COMPONENT_Y, uiTrMode) != 0);
    63876517
    6388           Char preCalcAlpha = 0;
     6518          SChar preCalcAlpha = 0;
    63896519          const Pel *pLumaResi = m_pcQTTempTComYuv[uiQTTempAccessLayer].getAddrPix( COMPONENT_Y, rTu.getRect( COMPONENT_Y ).x0, rTu.getRect( COMPONENT_Y ).y0 );
    63906520
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncSearch.h

    r1321 r1360  
    6868private:
    6969  TCoeff**        m_ppcQTTempCoeff[MAX_NUM_COMPONENT /* 0->Y, 1->Cb, 2->Cr*/];
    70   TCoeff*         m_pcQTTempCoeff[MAX_NUM_COMPONENT];
    7170#if ADAPTIVE_QP_SELECTION
    7271  TCoeff**        m_ppcQTTempArlCoeff[MAX_NUM_COMPONENT];
    73   TCoeff*         m_pcQTTempArlCoeff[MAX_NUM_COMPONENT];
    7472#endif
    7573  UChar*          m_puhQTTempTrIdx;
     
    7977  TComYuv         m_tmpYuvPred; // To be used in xGetInterPredictionError() to avoid constant memory allocation/deallocation
    8078
    81   Char*           m_phQTTempCrossComponentPredictionAlpha[MAX_NUM_COMPONENT];
     79  SChar*          m_phQTTempCrossComponentPredictionAlpha[MAX_NUM_COMPONENT];
    8280  Pel*            m_pSharedPredTransformSkip[MAX_NUM_COMPONENT];
    8381  TCoeff*         m_pcQTTempTUCoeff[MAX_NUM_COMPONENT];
     
    10098  Int             m_iSearchRange;
    10199  Int             m_bipredSearchRange; // Search range for bi-prediction
    102   Int             m_iFastSearch;
     100  MESearchMethod  m_motionEstimationSearchMethod;
    103101#if NH_MV
    104102  Bool            m_vertRestriction;
    105103#endif
    106104  Int             m_aaiAdaptSR[MAX_NUM_REF_LIST_ADAPT_SR][MAX_IDX_ADAPT_SR];
    107   TComMv          m_cSrchRngLT;
    108   TComMv          m_cSrchRngRB;
    109105  TComMv          m_acMvPredictors[NUM_MV_PREDICTORS]; // Left, Above, AboveRight. enum MVP_DIR first NUM_MV_PREDICTORS entries are suitable for accessing.
    110106
     
    116112  // Misc.
    117113  Pel*            m_pTempPel;
    118   const UInt*     m_puiDFilter;
    119114
    120115#if NH_3D_VSO // M17
     
    136131            Int           iSearchRange,
    137132            Int           bipredSearchRange,
    138             Int           iFastSearch,
     133            MESearchMethod motionEstimationSearchMethod,
    139134            const UInt    maxCUWidth,
    140135            const UInt    maxCUHeight,
     
    157152  typedef struct
    158153  {
    159     Pel*        piRefY;
     154    const Pel*  piRefY;
    160155    Int         iYStride;
    161156    Int         iBestX;
     
    168163
    169164  // sub-functions for ME
    170   __inline Void xTZSearchHelp         ( TComPattern* pcPatternKey, IntTZSearchStruct& rcStruct, const Int iSearchX, const Int iSearchY, const UChar ucPointNr, const UInt uiDistance );
    171   __inline Void xTZ2PointSearch       ( TComPattern* pcPatternKey, IntTZSearchStruct& rcStrukt, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB );
    172   __inline Void xTZ8PointSquareSearch ( TComPattern* pcPatternKey, IntTZSearchStruct& rcStrukt, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist );
    173   __inline Void xTZ8PointDiamondSearch( TComPattern* pcPatternKey, IntTZSearchStruct& rcStrukt, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist );
     165  __inline Void xTZSearchHelp         ( const TComPattern* const pcPatternKey, IntTZSearchStruct& rcStruct, const Int iSearchX, const Int iSearchY, const UChar ucPointNr, const UInt uiDistance );
     166  __inline Void xTZ2PointSearch       ( const TComPattern* const pcPatternKey, IntTZSearchStruct& rcStruct, const TComMv* const pcMvSrchRngLT, const TComMv* const pcMvSrchRngRB );
     167  __inline Void xTZ8PointSquareSearch ( const TComPattern* const pcPatternKey, IntTZSearchStruct& rcStruct, const TComMv* const pcMvSrchRngLT, const TComMv* const pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist );
     168  __inline Void xTZ8PointDiamondSearch( const TComPattern* const pcPatternKey, IntTZSearchStruct& rcStruct, const TComMv* const pcMvSrchRngLT, const TComMv* const pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist, const Bool bCheckCornersAtDist1 );
    174169
    175170  Void xGetInterPredictionError( TComDataCU* pcCU, TComYuv* pcYuvOrg, Int iPartIdx, Distortion& ruiSAD, Bool Hadamard );
     
    322317                                               const Int     strideBest );
    323318
    324   Char xCalcCrossComponentPredictionAlpha    (       TComTU &rTu,
     319  SChar xCalcCrossComponentPredictionAlpha   (       TComTU &rTu,
    325320                                               const ComponentID compID,
    326321                                               const Pel*        piResiL,
     
    446441                                    Bool         bBi = false  );
    447442
    448   Void xTZSearch                  ( TComDataCU*  pcCU,
    449                                     TComPattern* pcPatternKey,
    450                                     Pel*         piRefY,
    451                                     Int          iRefStride,
    452                                     TComMv*      pcMvSrchRngLT,
    453                                     TComMv*      pcMvSrchRngRB,
     443  Void xTZSearch                  ( const TComDataCU* const  pcCU,
     444                                    const TComPattern* const pcPatternKey,
     445                                    const Pel* const         piRefY,
     446                                    const Int                iRefStride,
     447                                    const TComMv* const      pcMvSrchRngLT,
     448                                    const TComMv* const      pcMvSrchRngRB,
    454449                                    TComMv&      rcMv,
    455450                                    Distortion&  ruiSAD,
    456                                     const TComMv *pIntegerMv2Nx2NPred
     451                                    const TComMv* const      pIntegerMv2Nx2NPred,
     452                                    const Bool               bExtendedSettings
    457453                                    );
    458454
    459   Void xTZSearchSelective         ( TComDataCU*  pcCU,
    460                                     TComPattern* pcPatternKey,
    461                                     Pel*         piRefY,
    462                                     Int          iRefStride,
    463                                     TComMv*      pcMvSrchRngLT,
    464                                     TComMv*      pcMvSrchRngRB,
     455  Void xTZSearchSelective         ( const TComDataCU* const  pcCU,
     456                                    const TComPattern* const pcPatternKey,
     457                                    const Pel* const         piRefY,
     458                                    const Int                iRefStride,
     459                                    const TComMv* const      pcMvSrchRngLT,
     460                                    const TComMv* const      pcMvSrchRngRB,
    465461                                    TComMv&      rcMv,
    466462                                    Distortion&  ruiSAD,
    467                                     const TComMv *pIntegerMv2Nx2NPred
     463                                    const TComMv* const      pIntegerMv2Nx2NPred
    468464                                    );
    469465
    470   Void xSetSearchRange            ( TComDataCU* pcCU,
    471                                     TComMv&      cMvPred,
    472                                     Int          iSrchRng,
     466  Void xSetSearchRange            ( const TComDataCU* const pcCU,
     467                                    const TComMv&      cMvPred,
     468                                    const Int          iSrchRng,
    473469                                    TComMv&      rcMvSrchRngLT,
    474470                                    TComMv&      rcMvSrchRngRB );
    475471
    476   Void xPatternSearchFast         ( TComDataCU*  pcCU,
    477                                     TComPattern* pcPatternKey,
    478                                     Pel*         piRefY,
    479                                     Int          iRefStride,
    480                                     TComMv*      pcMvSrchRngLT,
    481                                     TComMv*      pcMvSrchRngRB,
     472  Void xPatternSearchFast         ( const TComDataCU* const  pcCU,
     473                                    const TComPattern* const pcPatternKey,
     474                                    const Pel* const         piRefY,
     475                                    const Int                iRefStride,
     476                                    const TComMv* const      pcMvSrchRngLT,
     477                                    const TComMv* const      pcMvSrchRngRB,
    482478                                    TComMv&      rcMv,
    483479                                    Distortion&  ruiSAD,
    484                                     const TComMv* pIntegerMv2Nx2NPred
     480                                    const TComMv* const      pIntegerMv2Nx2NPred
    485481                                  );
    486482
    487   Void xPatternSearch             ( TComPattern* pcPatternKey,
    488                                     Pel*         piRefY,
    489                                     Int          iRefStride,
    490                                     TComMv*      pcMvSrchRngLT,
    491                                     TComMv*      pcMvSrchRngRB,
     483  Void xPatternSearch             ( const TComPattern* const pcPatternKey,
     484                                    const Pel*               piRefY,
     485                                    const Int                iRefStride,
     486                                    const TComMv* const      pcMvSrchRngLT,
     487                                    const TComMv* const      pcMvSrchRngRB,
    492488                                    TComMv&      rcMv,
    493489                                    Distortion&  ruiSAD );
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncSlice.cpp

    r1313 r1360  
    203203Void TEncSlice::initEncSlice( TComPic* pcPic, Int pocLast, Int pocCurr, Int iGOPid, TComSlice*& rpcSlice, TComVPS* pVPS, Int layerId, bool isField )
    204204#else
    205 Void TEncSlice::initEncSlice( TComPic* pcPic, Int pocLast, Int pocCurr, Int iGOPid, TComSlice*& rpcSlice, Bool isField )
     205Void TEncSlice::initEncSlice( TComPic* pcPic, const Int pocLast, const Int pocCurr, const Int iGOPid, TComSlice*& rpcSlice, const Bool isField )
    206206#endif
    207207{
     
    397397#endif
    398398    {
    399       dQPFactor=0.57*dLambda_scale;
     399      if (m_pcCfg->getIntraQpFactor()>=0.0 && m_pcCfg->getGOPEntry(iGOPid).m_sliceType != I_SLICE)
     400      {
     401        dQPFactor=m_pcCfg->getIntraQpFactor();
     402      }
     403      else
     404      {
     405        Double dLambda_scale = 1.0 - Clip3( 0.0, 0.5, 0.05*(Double)(isField ? NumberBFrames/2 : NumberBFrames) );
     406       
     407        dQPFactor=0.57*dLambda_scale;
     408      }
    400409    }
    401410    dLambda = dQPFactor*pow( 2.0, qp_temp/3.0 );
     
    428437  iQP     = m_piRdPicQp    [0];
    429438
    430   if( rpcSlice->getSliceType( ) != I_SLICE )
    431   {
     439
    432440#if NH_MV
    433     dLambda *= m_pcCfg->getLambdaModifier( m_pcCfg->getGOPEntry((eSliceTypeBaseView == I_SLICE) ? MAX_GOP : iGOPid).m_temporalId );
    434 #else
    435     dLambda *= m_pcCfg->getLambdaModifier( m_pcCfg->getGOPEntry(iGOPid).m_temporalId );
    436 #endif
    437   }
    438 
     441  const Int temporalId=m_pcCfg->getGOPEntry((eSliceTypeBaseView == I_SLICE) ? MAX_GOP : iGOPid).m_temporalId;
     442#else
     443  const Int temporalId=m_pcCfg->getGOPEntry(iGOPid).m_temporalId;
     444#endif
     445  const std::vector<Double> &intraLambdaModifiers=m_pcCfg->getIntraLambdaModifier();
     446
     447  Double lambdaModifier;
     448  if( rpcSlice->getSliceType( ) != I_SLICE || intraLambdaModifiers.empty())
     449  {
     450    lambdaModifier = m_pcCfg->getLambdaModifier( temporalId );
     451  }
     452  else
     453  {
     454    lambdaModifier = intraLambdaModifiers[ (temporalId < intraLambdaModifiers.size()) ? temporalId : (intraLambdaModifiers.size()-1) ];
     455  }
     456
     457  dLambda *= lambdaModifier;
    439458  setUpLambda(rpcSlice, dLambda, iQP);
    440459
     
    547566  rpcSlice->setDepth            ( depth );
    548567
    549 #if NH_MV
    550   pcPic->setTLayer( m_pcCfg->getGOPEntry( (eSliceTypeBaseView == I_SLICE) ? MAX_GOP : iGOPid ).m_temporalId );
    551 #else
    552   pcPic->setTLayer( m_pcCfg->getGOPEntry(iGOPid).m_temporalId );
    553 #endif
     568  pcPic->setTLayer( temporalId );
    554569  if(eSliceType==I_SLICE)
    555570  {
     
    589604// ====================================================================================================================
    590605
     606//! set adaptive search range based on poc difference
    591607Void TEncSlice::setSearchRange( TComSlice* pcSlice )
    592608{
     
    598614  Int iNumPredDir = pcSlice->isInterP() ? 1 : 2;
    599615
    600   for (Int iDir = 0; iDir <= iNumPredDir; iDir++)
    601   {
    602     //RefPicList e = (RefPicList)iDir;
     616  for (Int iDir = 0; iDir < iNumPredDir; iDir++)
     617  {
    603618    RefPicList  e = ( iDir ? REF_PIC_LIST_1 : REF_PIC_LIST_0 );
    604619    for (Int iRefIdx = 0; iRefIdx < pcSlice->getNumRefIdx(e); iRefIdx++)
    605620    {
    606621      iRefPOC = pcSlice->getRefPic(e, iRefIdx)->getPOC();
    607       Int iNewSR = Clip3(8, iMaxSR, (iMaxSR*ADAPT_SR_SCALE*abs(iCurrPOC - iRefPOC)+iOffset)/iGOPSize);
    608       m_pcPredSearch->setAdaptiveSearchRange(iDir, iRefIdx, iNewSR);
     622      Int newSearchRange = Clip3(m_pcCfg->getMinSearchWindow(), iMaxSR, (iMaxSR*ADAPT_SR_SCALE*abs(iCurrPOC - iRefPOC)+iOffset)/iGOPSize);
     623      m_pcPredSearch->setAdaptiveSearchRange(iDir, iRefIdx, newSearchRange);
    609624    }
    610625  }
     
    696711
    697712    // compute RD cost and choose the best
    698     Double dPicRdCost = m_pcRdCost->calcRdCost64( m_uiPicTotalBits, uiPicDist, true, DF_SSE_FRAME); // NOTE: Is the 'true' parameter really necessary?
     713#if NH_3D
     714    Double dPicRdCost = m_pcRdCost->calcRdCost( (Double)m_uiPicTotalBits, uiPicDist, DF_SSE_FRAME);
     715#else
     716    Double dPicRdCost = m_pcRdCost->calcRdCost( (Double)m_uiPicTotalBits, (Double)uiPicDist, DF_SSE_FRAME);
     717#endif
    699718#if H_3D
    700719    // Above calculation need to be fixed for VSO, including frameLambda value.
     
    805824    }
    806825
    807     xEstimateWPParamSlice( pcSlice );
     826    xEstimateWPParamSlice( pcSlice, m_pcCfg->getWeightedPredictionMethod() );
    808827    pcSlice->initWpScaling(pcSlice->getSPS());
    809828
     
    849868    {
    850869      // This will only occur if dependent slice-segments (m_entropyCodingSyncContextState=true) are being used.
    851       if( pCurrentTile->getTileWidthInCtus() >= 2 || !m_pcCfg->getWaveFrontsynchro() )
     870      if( pCurrentTile->getTileWidthInCtus() >= 2 || !m_pcCfg->getEntropyCodingSyncEnabledFlag() )
    852871      {
    853872        m_pppcRDSbacCoder[0][CI_CURR_BEST]->loadContexts( &m_lastSliceSegmentEndContextState );
     
    892911      m_pppcRDSbacCoder[0][CI_CURR_BEST]->resetEntropy(pcSlice);
    893912    }
    894     else if ( ctuXPosInCtus == tileXPosInCtus && m_pcCfg->getWaveFrontsynchro())
     913    else if ( ctuXPosInCtus == tileXPosInCtus && m_pcCfg->getEntropyCodingSyncEnabledFlag())
    895914    {
    896915      // reset and then update contexts to the state at the end of the top-right CTU (if within current slice and tile).
     
    10311050
    10321051    // Store probabilities of second CTU in line into buffer - used only if wavefront-parallel-processing is enabled.
    1033     if ( ctuXPosInCtus == tileXPosInCtus+1 && m_pcCfg->getWaveFrontsynchro())
     1052    if ( ctuXPosInCtus == tileXPosInCtus+1 && m_pcCfg->getEntropyCodingSyncEnabledFlag())
    10341053    {
    10351054      m_entropyCodingSyncContextState.loadContexts(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncSlice.h

    r1313 r1360  
    120120                                Int iGOPid, TComSlice*& rpcSlice, TComVPS* pVPS, Int layerId, bool isField  );
    121121#else
    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#endif
    125125  Void    resetQP             ( TComPic* pic, Int sliceQP, Double lambda );
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/TEncTop.cpp

    r1321 r1360  
    4444#endif
    4545#if NH_MV
    46 #include "../../App/TAppEncoder/TAppEncTop.h"
     46//#include "../../App/TAppEncoder/TAppEncTop.h"
    4747#endif
    4848
     
    216216  xInitVPS();
    217217
     218#if U0132_TARGET_BITS_SATURATION
     219  if (m_RCCpbSaturationEnabled)
     220  {
     221    m_cRateCtrl.initHrdParam(m_cSPS.getVuiParameters()->getHrdParameters(), m_iFrameRate, m_RCInitialCpbFullness);
     222  }
     223#endif
    218224  m_cRdCost.setCostMode(m_costMode);
    219225
     
    264270
    265271  // initialize encoder search class
    266   m_cSearch.init( this, &m_cTrQuant, m_iSearchRange, m_bipredSearchRange, m_iFastSearch, m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth, &m_cEntropyCoder, &m_cRdCost, getRDSbacCoder(), getRDGoOnSbacCoder() );
     272  m_cSearch.init( this, &m_cTrQuant, m_iSearchRange, m_bipredSearchRange, m_motionEstimationSearchMethod, m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth, &m_cEntropyCoder, &m_cRdCost, getRDSbacCoder(), getRDGoOnSbacCoder() );
    267273
    268274  m_iMaxRefPicNum = 0;
     
    299305  {
    300306    m_cSPS.getScalingList().setDefaultScalingList ();
    301     if(m_cSPS.getScalingList().xParseScalingList(getScalingListFile()))
     307    if(m_cSPS.getScalingList().xParseScalingList(getScalingListFileName()))
    302308    {
    303309      Bool bParsedScalingList=false; // Use of boolean so that assertion outputs useful string
     
    842848    m_cSPS.setUsedByCurrPicLtSPSFlag(k, 0);
    843849  }
     850
     851#if U0132_TARGET_BITS_SATURATION
     852  if( getPictureTimingSEIEnabled() || getDecodingUnitInfoSEIEnabled() || getCpbSaturationEnabled() )
     853#else
    844854  if( getPictureTimingSEIEnabled() || getDecodingUnitInfoSEIEnabled() )
     855#endif
    845856  {
    846857    xInitHrdParameters();
     
    866877  m_cSPS.setSpsRangeExtensionsFlag( m_cSPS.getSpsRangeExtension().settingsDifferFromDefaults() );
    867878#endif
    868 
    869 }
    870 
     879}
     880#if U0132_TARGET_BITS_SATURATION
     881// calculate scale value of bitrate and initial delay
     882Int calcScale(Int x)
     883{
     884  UInt iMask = 0xffffffff;
     885  Int ScaleValue = 32;
     886
     887  while ((x&iMask) != 0)
     888  {
     889    ScaleValue--;
     890    iMask = (iMask >> 1);
     891}
     892
     893  return ScaleValue;
     894}
     895#endif
    871896Void TEncTop::xInitHrdParameters()
    872897{
     
    874899  Int  bitRate         = getTargetBitrate();
    875900  Bool isRandomAccess  = getIntraPeriod() > 0;
    876 
     901# if U0132_TARGET_BITS_SATURATION
     902  Int cpbSize          = getCpbSize();
     903
     904  if( !getVuiParametersPresentFlag() && !getCpbSaturationEnabled() )
     905#else
    877906  if( !getVuiParametersPresentFlag() )
     907#endif
    878908  {
    879909    return;
     
    925955  }
    926956
     957#if U0132_TARGET_BITS_SATURATION
     958  if (calcScale(bitRate) <= 6)
     959  {
     960    hrd->setBitRateScale(0);
     961  }
     962  else
     963  {
     964    hrd->setBitRateScale(calcScale(bitRate) - 6);
     965  }
     966
     967  if (calcScale(cpbSize) <= 4)
     968  {
     969    hrd->setCpbSizeScale(0);
     970  }
     971  else
     972  {
     973    hrd->setCpbSizeScale(calcScale(cpbSize) - 4);
     974  }
     975#else
    927976  hrd->setBitRateScale( 4 );                                       // in units of 2^( 6 + 4 ) = 1,024 bps
    928977  hrd->setCpbSizeScale( 6 );                                       // in units of 2^( 4 + 6 ) = 1,024 bit
     978#endif
     979
    929980  hrd->setDuCpbSizeScale( 6 );                                     // in units of 2^( 4 + 6 ) = 1,024 bit
    930981
     
    9581009    bitrateValue = bitRate / (1 << (6 + hrd->getBitRateScale()) );      // bitRate is in bits, so it needs to be scaled down
    9591010    // CpbSize[ i ] = ( cpb_size_value_minus1[ i ] + 1 ) * 2^( 4 + cpb_size_scale )
     1011#if U0132_TARGET_BITS_SATURATION
     1012    cpbSizeValue = cpbSize / (1 << (4 + hrd->getCpbSizeScale()) );      // using bitRate results in 1 second CPB size
     1013#else
    9601014    cpbSizeValue = bitRate / (1 << (4 + hrd->getCpbSizeScale()) );      // using bitRate results in 1 second CPB size
     1015#endif
     1016
    9611017
    9621018    // DU CPB size could be smaller (i.e. bitrateValue / number of DUs), but we don't know
     
    10661122  m_cPPS.setQpOffset(COMPONENT_Cr, m_chromaCrQpOffset );
    10671123
    1068   m_cPPS.setEntropyCodingSyncEnabledFlag( m_iWaveFrontSynchro > 0 );
     1124  m_cPPS.setEntropyCodingSyncEnabledFlag( m_entropyCodingSyncEnabledFlag );
    10691125  m_cPPS.setTilesEnabledFlag( (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0) );
    10701126  m_cPPS.setUseWP( m_useWeightedPred );
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/WeightPredAnalysis.cpp

    r1313 r1360  
    4141#include "../TLibCommon/TComPicYuv.h"
    4242#include "WeightPredAnalysis.h"
    43 
    44 #define ABS(a)    ((a) < 0 ? - (a) : (a))
    45 #define DTHRESH (0.99)
     43#include <limits>
     44
     45static const Double WEIGHT_PRED_SAD_RELATIVE_TO_NON_WEIGHT_PRED_SAD=0.99; // NOTE: U0040 used 0.95
     46
     47//! calculate SAD values for both WP version and non-WP version.
     48static
     49Int64 xCalcSADvalueWP(const Int   bitDepth,
     50                      const Pel  *pOrgPel,
     51                      const Pel  *pRefPel,
     52                      const Int   width,
     53                      const Int   height,
     54                      const Int   orgStride,
     55                      const Int   refStride,
     56                      const Int   log2Denom,
     57                      const Int   weight,
     58                      const Int   offset,
     59                      const Bool  useHighPrecision);
     60
     61//! calculate SAD values for both WP version and non-WP version.
     62static
     63Int64 xCalcSADvalueWPOptionalClip(const Int   bitDepth,
     64                                  const Pel  *pOrgPel,
     65                                  const Pel  *pRefPel,
     66                                  const Int   width,
     67                                  const Int   height,
     68                                  const Int   orgStride,
     69                                  const Int   refStride,
     70                                  const Int   log2Denom,
     71                                  const Int   weight,
     72                                  const Int   offset,
     73                                  const Bool  useHighPrecision,
     74                                  const Bool  clipped);
     75
     76// -----------------------------------------------------------------------------
     77// Helper functions
     78
     79
     80//! calculate Histogram for array of pixels
     81static
     82Void xCalcHistogram(const Pel  *pPel,
     83                    std::vector<Int> &histogram,
     84                    const Int   width,
     85                    const Int   height,
     86                    const Int   stride,
     87                    const Int   maxPel)
     88{
     89  histogram.clear();
     90  histogram.resize(maxPel);
     91  for( Int y = 0; y < height; y++ )
     92  {
     93    for( Int x = 0; x < width; x++ )
     94    {
     95      const Pel v=pPel[x];
     96      histogram[v<0?0:(v>=maxPel)?maxPel-1:v]++;
     97    }
     98    pPel += stride;
     99  }
     100}
     101
     102static
     103Distortion xCalcHistDistortion (const std::vector<Int> &histogram0,
     104                                const std::vector<Int> &histogram1)
     105{
     106  Distortion distortion = 0;
     107  assert(histogram0.size()==histogram1.size());
     108  const Int numElements=Int(histogram0.size());
     109
     110  // Scan histograms to compute histogram distortion
     111  for (Int i = 0; i <= numElements; i++)
     112  {
     113    distortion += (Distortion)(abs(histogram0[i] - histogram1[i]));
     114  }
     115
     116  return distortion;
     117}
     118
     119static
     120void xScaleHistogram(const std::vector<Int> &histogramInput,
     121                           std::vector<Int> &histogramOutput, // cannot be the same as the input
     122                     const Int               bitDepth,
     123                     const Int               log2Denom,
     124                     const Int               weight,
     125                     const Int               offset,
     126                     const Bool              bHighPrecision)
     127{
     128  assert(&histogramInput != &histogramOutput);
     129  const Int numElements=Int(histogramInput.size());
     130  histogramOutput.clear();
     131  histogramOutput.resize(numElements);
     132
     133  const Int64 iRealLog2Denom = bHighPrecision ? 0 : (bitDepth - 8);
     134  const Int64 iRealOffset    = ((Int64)offset)<<iRealLog2Denom;
     135
     136  const Int divOffset = log2Denom == 0 ? 0 : 1 << (log2Denom - 1);
     137  // Scan histogram and apply illumination parameters appropriately
     138  // Then compute updated histogram.
     139  // Note that this technique only works with single list weights/offsets.
     140
     141  for (Int i = 0; i < numElements; i++)
     142  {
     143    const Int j = Clip3(0, numElements - 1, (Int)(((weight * i + divOffset) >> log2Denom) + iRealOffset));
     144    histogramOutput[j] += histogramInput[i];
     145  }
     146}
     147
     148static
     149Distortion xSearchHistogram(const std::vector<Int> &histogramSource,
     150                            const std::vector<Int> &histogramRef,
     151                                  std::vector<Int> &outputHistogram,
     152                            const Int               bitDepth,
     153                            const Int               log2Denom,
     154                                  Int              &weightToUpdate,
     155                                  Int              &offsetToUpdate,
     156                            const Bool              bHighPrecision,
     157                            const ComponentID       compID)
     158{
     159  const Int initialWeight   = weightToUpdate;
     160  const Int initialOffset   = offsetToUpdate;
     161  const Int weightRange     = 10;
     162  const Int offsetRange     = 10;
     163  const Int maxOffset       = 1 << ((bHighPrecision == true) ? (bitDepth - 1) : 7);
     164  const Int range           = bHighPrecision ? (1<<bitDepth) / 2 : 128;
     165  const Int defaultWeight   = (1<<log2Denom);
     166  const Int minSearchWeight = std::max<Int>(initialWeight - weightRange, defaultWeight - range);
     167  const Int maxSearchWeight = std::min<Int>(initialWeight + weightRange+1, defaultWeight + range);
     168
     169  Distortion minDistortion   = std::numeric_limits<Distortion>::max();
     170  Int        bestWeight      = initialWeight;
     171  Int        bestOffset      = initialOffset;
     172
     173  for (Int searchWeight = minSearchWeight; searchWeight < maxSearchWeight; searchWeight++)
     174  {
     175    if (compID == COMPONENT_Y)
     176    {
     177      for (Int searchOffset = std::max<Int>(initialOffset - offsetRange, -maxOffset);
     178               searchOffset <= initialOffset + offsetRange && searchOffset<=(maxOffset-1);
     179               searchOffset++)
     180      {
     181        xScaleHistogram(histogramRef, outputHistogram, bitDepth, log2Denom, searchWeight, searchOffset, bHighPrecision);
     182        const Distortion distortion = xCalcHistDistortion(histogramSource, outputHistogram);
     183
     184        if (distortion < minDistortion)
     185        {
     186          minDistortion = distortion;
     187          bestWeight    = searchWeight;
     188          bestOffset    = searchOffset;
     189        }
     190      }
     191    }
     192    else
     193    {
     194      const Int pred        = ( maxOffset - ( ( maxOffset*searchWeight)>>(log2Denom) ) );
     195
     196      for (Int searchOffset = initialOffset - offsetRange; searchOffset <= initialOffset + offsetRange; searchOffset++)
     197      {
     198        const Int deltaOffset   = Clip3( -4*maxOffset, 4*maxOffset-1, (searchOffset - pred) ); // signed 10bit (if !bHighPrecision)
     199        const Int clippedOffset = Clip3( -1*maxOffset, 1*maxOffset-1, (deltaOffset  + pred) ); // signed 8bit  (if !bHighPrecision)
     200        xScaleHistogram(histogramRef, outputHistogram, bitDepth, log2Denom, searchWeight, clippedOffset, bHighPrecision);
     201        const Distortion distortion = xCalcHistDistortion(histogramSource, outputHistogram);
     202
     203        if (distortion < minDistortion)
     204        {
     205          minDistortion = distortion;
     206          bestWeight    = searchWeight;
     207          bestOffset    = clippedOffset;
     208        }
     209      }
     210    }
     211  }
     212
     213  weightToUpdate = bestWeight;
     214  offsetToUpdate = bestOffset;
     215
     216  // regenerate best histogram
     217  xScaleHistogram(histogramRef, outputHistogram, bitDepth, log2Denom, bestWeight, bestOffset, bHighPrecision);
     218
     219  return minDistortion;
     220}
     221
     222
     223// -----------------------------------------------------------------------------
     224// Member functions
    46225
    47226WeightPredAnalysis::WeightPredAnalysis()
     
    49228  for ( UInt lst =0 ; lst<NUM_REF_PIC_LIST_01 ; lst++ )
    50229  {
    51     for ( Int iRefIdx=0 ; iRefIdx<MAX_NUM_REF ; iRefIdx++ )
     230    for ( Int refIdx=0 ; refIdx<MAX_NUM_REF ; refIdx++ )
    52231    {
    53232      for ( Int comp=0 ; comp<MAX_NUM_COMPONENT ;comp++ )
    54233      {
    55         WPScalingParam  *pwp   = &(m_wp[lst][iRefIdx][comp]);
     234        WPScalingParam  *pwp   = &(m_wp[lst][refIdx][comp]);
    56235        pwp->bPresentFlag      = false;
    57236        pwp->uiLog2WeightDenom = 0;
     
    78257    // calculate DC/AC value for channel
    79258
    80     const Int iStride = pPic->getStride(compID);
    81     const Int iWidth  = pPic->getWidth(compID);
    82     const Int iHeight = pPic->getHeight(compID);
    83 
    84     const Int iSample = iWidth*iHeight;
    85 
    86     Int64 iOrgDC = 0;
     259    const Int stride = pPic->getStride(compID);
     260    const Int width  = pPic->getWidth(compID);
     261    const Int height = pPic->getHeight(compID);
     262
     263    const Int sample = width*height;
     264
     265    Int64 orgDC = 0;
    87266    {
    88267      const Pel *pPel = pPic->getAddr(compID);
    89268
    90       for(Int y = 0; y < iHeight; y++, pPel+=iStride )
    91       {
    92         for(Int x = 0; x < iWidth; x++ )
    93         {
    94           iOrgDC += (Int)( pPel[x] );
    95         }
    96       }
    97     }
    98 
    99     const Int64 iOrgNormDC = ((iOrgDC+(iSample>>1)) / iSample);
    100 
    101     Int64 iOrgAC = 0;
     269      for(Int y = 0; y < height; y++, pPel+=stride )
     270      {
     271        for(Int x = 0; x < width; x++ )
     272        {
     273          orgDC += (Int)( pPel[x] );
     274        }
     275      }
     276    }
     277
     278    const Int64 orgNormDC = ((orgDC+(sample>>1)) / sample);
     279
     280    Int64 orgAC = 0;
    102281    {
    103282      const Pel *pPel = pPic->getAddr(compID);
    104283
    105       for(Int y = 0; y < iHeight; y++, pPel += iStride )
    106       {
    107         for(Int x = 0; x < iWidth; x++ )
    108         {
    109           iOrgAC += abs( (Int)pPel[x] - (Int)iOrgNormDC );
     284      for(Int y = 0; y < height; y++, pPel += stride )
     285      {
     286        for(Int x = 0; x < width; x++ )
     287        {
     288          orgAC += abs( (Int)pPel[x] - (Int)orgNormDC );
    110289        }
    111290      }
     
    113292
    114293    const Int fixedBitShift = (slice->getSPS()->getSpsRangeExtension().getHighPrecisionOffsetsEnabledFlag())?RExt__PREDICTION_WEIGHTING_ANALYSIS_DC_PRECISION:0;
    115     weightACDCParam[compID].iDC = (((iOrgDC<<fixedBitShift)+(iSample>>1)) / iSample);
    116     weightACDCParam[compID].iAC = iOrgAC;
     294    weightACDCParam[compID].iDC = (((orgDC<<fixedBitShift)+(sample>>1)) / sample);
     295    weightACDCParam[compID].iAC = orgAC;
    117296  }
    118297
     
    126305  const TComPicYuv *pPic = slice->getPic()->getPicYuvOrg();
    127306
    128   Int iPresentCnt = 0;
     307  Int presentCnt = 0;
    129308  for ( UInt lst=0 ; lst<NUM_REF_PIC_LIST_01 ; lst++ )
    130309  {
    131     for ( Int iRefIdx=0 ; iRefIdx<MAX_NUM_REF ; iRefIdx++ )
     310    for ( Int refIdx=0 ; refIdx<MAX_NUM_REF ; refIdx++ )
    132311    {
    133312      for(Int componentIndex = 0; componentIndex < pPic->getNumberValidComponents(); componentIndex++)
    134313      {
    135         WPScalingParam  *pwp = &(m_wp[lst][iRefIdx][componentIndex]);
    136         iPresentCnt += (Int)pwp->bPresentFlag;
    137       }
    138     }
    139   }
    140 
    141   if(iPresentCnt==0)
     314        WPScalingParam  *pwp = &(m_wp[lst][refIdx][componentIndex]);
     315        presentCnt += (Int)pwp->bPresentFlag;
     316      }
     317    }
     318  }
     319
     320  if(presentCnt==0)
    142321  {
    143322    slice->setTestWeightPred(false);
     
    146325    for ( UInt lst=0 ; lst<NUM_REF_PIC_LIST_01 ; lst++ )
    147326    {
    148       for ( Int iRefIdx=0 ; iRefIdx<MAX_NUM_REF ; iRefIdx++ )
     327      for ( Int refIdx=0 ; refIdx<MAX_NUM_REF ; refIdx++ )
    149328      {
    150329        for(Int componentIndex = 0; componentIndex < pPic->getNumberValidComponents(); componentIndex++)
    151330        {
    152           WPScalingParam  *pwp = &(m_wp[lst][iRefIdx][componentIndex]);
     331          WPScalingParam  *pwp = &(m_wp[lst][refIdx][componentIndex]);
    153332
    154333          pwp->bPresentFlag      = false;
     
    163342  else
    164343  {
    165     slice->setTestWeightPred(slice->getPPS()->getUseWP());
     344    slice->setTestWeightPred  (slice->getPPS()->getUseWP());
    166345    slice->setTestWeightBiPred(slice->getPPS()->getWPBiPred());
    167346  }
     
    170349
    171350//! estimate wp tables for explicit wp
    172 Void WeightPredAnalysis::xEstimateWPParamSlice(TComSlice *const slice)
     351Void WeightPredAnalysis::xEstimateWPParamSlice(TComSlice *const slice, const WeightedPredictionMethod method)
    173352{
    174353  Int  iDenom         = 6;
     
    191370  // selecting whether WP is used, or not (fast search)
    192371  // NOTE: This is not operating on a slice, but the entire picture.
    193   xSelectWP(slice, iDenom);
     372  switch (method)
     373  {
     374    case WP_PER_PICTURE_WITH_SIMPLE_DC_COMBINED_COMPONENT:
     375      xSelectWP(slice, iDenom);
     376      break;
     377    case WP_PER_PICTURE_WITH_SIMPLE_DC_PER_COMPONENT:
     378      xSelectWPHistExtClip(slice, iDenom, false, false, false);
     379      break;
     380    case WP_PER_PICTURE_WITH_HISTOGRAM_AND_PER_COMPONENT:
     381      xSelectWPHistExtClip(slice, iDenom, false, false, true);
     382      break;
     383    case WP_PER_PICTURE_WITH_HISTOGRAM_AND_PER_COMPONENT_AND_CLIPPING:
     384      xSelectWPHistExtClip(slice, iDenom, false, true, true);
     385      break;
     386    case WP_PER_PICTURE_WITH_HISTOGRAM_AND_PER_COMPONENT_AND_CLIPPING_AND_EXTENSION:
     387      xSelectWPHistExtClip(slice, iDenom, true, true, true);
     388      break;
     389    default:
     390      assert(0);
     391      exit(1);
     392  }
    194393
    195394  slice->setWpScaling( m_wp );
     
    251450        // Weighting factor limitation
    252451        const Int defaultWeight = (1<<log2Denom);
    253         const Int deltaWeight   = (defaultWeight - weight);
     452        const Int deltaWeight   = (weight - defaultWeight);
    254453
    255454        if(deltaWeight >= range || deltaWeight < -range)
     
    269468
    270469
     470/** select whether weighted pred enables or not.
     471 * \param TComSlice *slice
     472 * \param log2Denom
     473 * \returns Bool
     474 */
     475Bool WeightPredAnalysis::xSelectWPHistExtClip(TComSlice *const slice, const Int log2Denom, const Bool bDoEnhancement, const Bool bClipInitialSADWP, const Bool bUseHistogram)
     476{
     477  const TComPicYuv *const pPic             = slice->getPic()->getPicYuvOrg();
     478  const Int               defaultWeight    = 1<<log2Denom;
     479  const Int               numPredDir       = slice->isInterP() ? 1 : 2;
     480  const Bool              useHighPrecision = slice->getSPS()->getSpsRangeExtension().getHighPrecisionOffsetsEnabledFlag();
     481
     482  assert (numPredDir <= Int(NUM_REF_PIC_LIST_01));
     483
     484  for ( Int refList = 0; refList < numPredDir; refList++ )
     485  {
     486    const RefPicList eRefPicList = ( refList ? REF_PIC_LIST_1 : REF_PIC_LIST_0 );
     487
     488    for ( Int refIdxTemp = 0; refIdxTemp < slice->getNumRefIdx(eRefPicList); refIdxTemp++ )
     489    {
     490      Bool  useChromaWeight = false;
     491
     492      for(Int comp=0; comp<pPic->getNumberValidComponents(); comp++)
     493      {
     494        const ComponentID  compID     = ComponentID(comp);
     495        const Pel         *pOrg       = pPic->getAddr(compID);
     496        const Pel         *pRef       = slice->getRefPic(eRefPicList, refIdxTemp)->getPicYuvRec()->getAddr(compID);
     497        const Int          orgStride  = pPic->getStride(compID);
     498        const Int          refStride  = slice->getRefPic(eRefPicList, refIdxTemp)->getPicYuvRec()->getStride(compID);
     499        const Int          width      = pPic->getWidth(compID);
     500        const Int          height     = pPic->getHeight(compID);
     501        const Int          bitDepth   = slice->getSPS()->getBitDepth(toChannelType(compID));
     502              WPScalingParam &wp      = m_wp[refList][refIdxTemp][compID];
     503              Int          weight     = wp.iWeight;
     504              Int          offset     = wp.iOffset;
     505              Int          weightDef  = defaultWeight;
     506              Int          offsetDef  = 0;
     507
     508        // calculate SAD costs with/without wp for luma
     509        const Int64 SADnoWP = xCalcSADvalueWPOptionalClip(bitDepth, pOrg, pRef, width, height, orgStride, refStride, log2Denom, defaultWeight, 0, useHighPrecision, bClipInitialSADWP);
     510        if (SADnoWP > 0)
     511        {
     512          const Int64 SADWP   = xCalcSADvalueWPOptionalClip(bitDepth, pOrg, pRef, width, height, orgStride, refStride, log2Denom, weight,   offset, useHighPrecision, bClipInitialSADWP);
     513          const Double dRatioSAD = (Double)SADWP / (Double)SADnoWP;
     514          Double dRatioSr0SAD = std::numeric_limits<Double>::max();
     515          Double dRatioSrSAD  = std::numeric_limits<Double>::max();
     516
     517          if (bUseHistogram)
     518          {
     519            std::vector<Int> histogramOrg;// = pPic->getHistogram(compID);
     520            std::vector<Int> histogramRef;// = slice->getRefPic(eRefPicList, refIdxTemp)->getPicYuvRec()->getHistogram(compID);
     521            std::vector<Int> searchedHistogram;
     522
     523            // Compute histograms
     524            xCalcHistogram(pOrg, histogramOrg, width, height, orgStride, 1 << bitDepth);
     525            xCalcHistogram(pRef, histogramRef, width, height, refStride, 1 << bitDepth);
     526
     527            // Do a histogram search around DC WP parameters; resulting distortion and 'searchedHistogram' is discarded
     528            xSearchHistogram(histogramOrg, histogramRef, searchedHistogram, bitDepth, log2Denom, weight, offset, useHighPrecision, compID);
     529            // calculate updated WP SAD
     530            const Int64 SADSrWP = xCalcSADvalueWP(bitDepth, pOrg, pRef, width, height, orgStride, refStride, log2Denom, weight, offset, useHighPrecision);
     531            dRatioSrSAD  = (Double)SADSrWP  / (Double)SADnoWP;
     532
     533            if (bDoEnhancement)
     534            {
     535              // Do the same around the default ones; resulting distortion and 'searchedHistogram' is discarded
     536              xSearchHistogram(histogramOrg, histogramRef, searchedHistogram, bitDepth, log2Denom, weightDef, offsetDef, useHighPrecision, compID);
     537              // calculate updated WP SAD
     538              const Int64 SADSr0WP = xCalcSADvalueWP(bitDepth, pOrg, pRef, width, height, orgStride, refStride, log2Denom, weightDef, offsetDef, useHighPrecision);
     539              dRatioSr0SAD = (Double)SADSr0WP / (Double)SADnoWP;
     540            }
     541          }
     542
     543          if(min(dRatioSr0SAD, min(dRatioSAD, dRatioSrSAD)) >= WEIGHT_PRED_SAD_RELATIVE_TO_NON_WEIGHT_PRED_SAD)
     544          {
     545            wp.bPresentFlag      = false;
     546            wp.iOffset           = 0;
     547            wp.iWeight           = defaultWeight;
     548            wp.uiLog2WeightDenom = log2Denom;
     549          }
     550          else
     551          {
     552            if (compID != COMPONENT_Y)
     553            {
     554              useChromaWeight = true;
     555            }
     556
     557            if (dRatioSr0SAD < dRatioSrSAD && dRatioSr0SAD < dRatioSAD)
     558            {
     559              wp.bPresentFlag      = true;
     560              wp.iOffset           = offsetDef;
     561              wp.iWeight           = weightDef;
     562              wp.uiLog2WeightDenom = log2Denom;
     563            }
     564            else if (dRatioSrSAD < dRatioSAD)
     565            {
     566              wp.bPresentFlag      = true;
     567              wp.iOffset           = offset;
     568              wp.iWeight           = weight;
     569              wp.uiLog2WeightDenom = log2Denom;
     570            }
     571          }
     572        }
     573        else // (SADnoWP <= 0)
     574        {
     575          wp.bPresentFlag      = false;
     576          wp.iOffset           = 0;
     577          wp.iWeight           = defaultWeight;
     578          wp.uiLog2WeightDenom = log2Denom;
     579        }
     580      }
     581
     582      for(Int comp=1; comp<pPic->getNumberValidComponents(); comp++)
     583      {
     584        m_wp[refList][refIdxTemp][comp].bPresentFlag = useChromaWeight;
     585      }
     586    }
     587  }
     588
     589  return true;
     590}
     591
    271592//! select whether weighted pred enables or not.
    272593Bool WeightPredAnalysis::xSelectWP(TComSlice *const slice, const Int log2Denom)
    273594{
    274595        TComPicYuv *const pPic                                = slice->getPic()->getPicYuvOrg();
    275   const Int               iDefaultWeight                      = ((Int)1<<log2Denom);
    276   const Int               iNumPredDir                         = slice->isInterP() ? 1 : 2;
     596  const Int               defaultWeight                       = 1<<log2Denom;
     597  const Int               numPredDir                          = slice->isInterP() ? 1 : 2;
    277598  const Bool              useHighPrecisionPredictionWeighting = slice->getSPS()->getSpsRangeExtension().getHighPrecisionOffsetsEnabledFlag();
    278599
    279   assert (iNumPredDir <= Int(NUM_REF_PIC_LIST_01));
    280 
    281   for ( Int iRefList = 0; iRefList < iNumPredDir; iRefList++ )
    282   {
    283     const RefPicList eRefPicList = ( iRefList ? REF_PIC_LIST_1 : REF_PIC_LIST_0 );
    284 
    285     for ( Int iRefIdxTemp = 0; iRefIdxTemp < slice->getNumRefIdx(eRefPicList); iRefIdxTemp++ )
    286     {
    287       Int64 iSADWP = 0, iSADnoWP = 0;
     600  assert (numPredDir <= Int(NUM_REF_PIC_LIST_01));
     601
     602  for ( Int refList = 0; refList < numPredDir; refList++ )
     603  {
     604    const RefPicList eRefPicList = ( refList ? REF_PIC_LIST_1 : REF_PIC_LIST_0 );
     605
     606    for ( Int refIdxTemp = 0; refIdxTemp < slice->getNumRefIdx(eRefPicList); refIdxTemp++ )
     607    {
     608      Int64 SADWP = 0, SADnoWP = 0;
    288609
    289610      for(Int comp=0; comp<pPic->getNumberValidComponents(); comp++)
     
    291612        const ComponentID  compID     = ComponentID(comp);
    292613              Pel         *pOrg       = pPic->getAddr(compID);
    293               Pel         *pRef       = slice->getRefPic(eRefPicList, iRefIdxTemp)->getPicYuvRec()->getAddr(compID);
    294         const Int          iOrgStride = pPic->getStride(compID);
    295         const Int          iRefStride = slice->getRefPic(eRefPicList, iRefIdxTemp)->getPicYuvRec()->getStride(compID);
    296         const Int          iWidth     = pPic->getWidth(compID);
    297         const Int          iHeight    = pPic->getHeight(compID);
     614              Pel         *pRef       = slice->getRefPic(eRefPicList, refIdxTemp)->getPicYuvRec()->getAddr(compID);
     615        const Int          orgStride = pPic->getStride(compID);
     616        const Int          refStride = slice->getRefPic(eRefPicList, refIdxTemp)->getPicYuvRec()->getStride(compID);
     617        const Int          width     = pPic->getWidth(compID);
     618        const Int          height    = pPic->getHeight(compID);
    298619        const Int          bitDepth   = slice->getSPS()->getBitDepth(toChannelType(compID));
    299620
    300621        // calculate SAD costs with/without wp for luma
    301         iSADWP   += xCalcSADvalueWP(bitDepth, pOrg, pRef, iWidth, iHeight, iOrgStride, iRefStride, log2Denom, m_wp[iRefList][iRefIdxTemp][compID].iWeight, m_wp[iRefList][iRefIdxTemp][compID].iOffset, useHighPrecisionPredictionWeighting);
    302         iSADnoWP += xCalcSADvalueWP(bitDepth, pOrg, pRef, iWidth, iHeight, iOrgStride, iRefStride, log2Denom, iDefaultWeight, 0, useHighPrecisionPredictionWeighting);
    303       }
    304 
    305       const Double dRatio = ((Double)iSADWP / (Double)iSADnoWP);
    306       if(dRatio >= (Double)DTHRESH)
     622        SADWP   += xCalcSADvalueWP(bitDepth, pOrg, pRef, width, height, orgStride, refStride, log2Denom, m_wp[refList][refIdxTemp][compID].iWeight, m_wp[refList][refIdxTemp][compID].iOffset, useHighPrecisionPredictionWeighting);
     623        SADnoWP += xCalcSADvalueWP(bitDepth, pOrg, pRef, width, height, orgStride, refStride, log2Denom, defaultWeight, 0, useHighPrecisionPredictionWeighting);
     624      }
     625
     626      const Double dRatio = SADnoWP > 0 ? (((Double)SADWP / (Double)SADnoWP)) : std::numeric_limits<Double>::max();
     627      if(dRatio >= WEIGHT_PRED_SAD_RELATIVE_TO_NON_WEIGHT_PRED_SAD)
    307628      {
    308629        for(Int comp=0; comp<pPic->getNumberValidComponents(); comp++)
    309630        {
    310           m_wp[iRefList][iRefIdxTemp][comp].bPresentFlag      = false;
    311           m_wp[iRefList][iRefIdxTemp][comp].iOffset           = 0;
    312           m_wp[iRefList][iRefIdxTemp][comp].iWeight           = iDefaultWeight;
    313           m_wp[iRefList][iRefIdxTemp][comp].uiLog2WeightDenom = log2Denom;
     631          WPScalingParam &wp=m_wp[refList][refIdxTemp][comp];
     632          wp.bPresentFlag      = false;
     633          wp.iOffset           = 0;
     634          wp.iWeight           = defaultWeight;
     635          wp.uiLog2WeightDenom = log2Denom;
    314636        }
    315637      }
     
    320642}
    321643
    322 
    323 //! calculate SAD values for both WP version and non-WP version.
    324 Int64 WeightPredAnalysis::xCalcSADvalueWP(const Int   bitDepth,
    325                                           const Pel  *pOrgPel,
    326                                           const Pel  *pRefPel,
    327                                           const Int   iWidth,
    328                                           const Int   iHeight,
    329                                           const Int   iOrgStride,
    330                                           const Int   iRefStride,
    331                                           const Int   iLog2Denom,
    332                                           const Int   iWeight,
    333                                           const Int   iOffset,
    334                                           const Bool  useHighPrecisionPredictionWeighting)
    335 {
    336   const Int64 iSize          = iWidth*iHeight;
    337   const Int64 iRealLog2Denom = useHighPrecisionPredictionWeighting ? iLog2Denom : (iLog2Denom + (bitDepth - 8));
    338 
    339   Int64 iSAD = 0;
    340   for( Int y = 0; y < iHeight; y++ )
    341   {
    342     for( Int x = 0; x < iWidth; x++ )
    343     {
    344       iSAD += ABS(( ((Int64)pOrgPel[x]<<(Int64)iLog2Denom) - ( (Int64)pRefPel[x] * (Int64)iWeight + ((Int64)iOffset<<iRealLog2Denom) ) ) );
    345     }
    346     pOrgPel += iOrgStride;
    347     pRefPel += iRefStride;
    348   }
    349 
    350   return (iSAD/iSize);
    351 }
     644// Alternatively, a SSE-based measure could be used instead.
     645// The respective function has been removed as it currently redundant.
     646static
     647Int64 xCalcSADvalueWP(const Int   bitDepth,
     648                      const Pel  *pOrgPel,
     649                      const Pel  *pRefPel,
     650                      const Int   width,
     651                      const Int   height,
     652                      const Int   orgStride,
     653                      const Int   refStride,
     654                      const Int   log2Denom,
     655                      const Int   weight,
     656                      const Int   offset,
     657                      const Bool  useHighPrecision)
     658{
     659  //const Int64 iSize          = iWidth*iHeight;
     660  const Int64 realLog2Denom = useHighPrecision ? log2Denom : (log2Denom + (bitDepth - 8));
     661  const Int64 realOffset    = ((Int64)offset)<<realLog2Denom;
     662
     663  Int64 SAD = 0;
     664  for( Int y = 0; y < height; y++ )
     665  {
     666    for( Int x = 0; x < width; x++ )
     667    {
     668      SAD += abs(( ((Int64)pOrgPel[x] << (Int64) log2Denom) - ( (Int64) pRefPel[x] * (Int64) weight + (realOffset) ) ) );
     669    }
     670    pOrgPel += orgStride;
     671    pRefPel += refStride;
     672  }
     673
     674  //return (iSAD/iSize);
     675  return SAD;
     676}
     677
     678static
     679Int64 xCalcSADvalueWPOptionalClip(const Int   bitDepth,
     680                                  const Pel  *pOrgPel,
     681                                  const Pel  *pRefPel,
     682                                  const Int   width,
     683                                  const Int   height,
     684                                  const Int   orgStride,
     685                                  const Int   refStride,
     686                                  const Int   log2Denom,
     687                                  const Int   weight,
     688                                  const Int   offset,
     689                                  const Bool  useHighPrecision,
     690                                  const Bool  clipped)
     691{
     692  Int64 SAD = 0;
     693  if (clipped)
     694  {
     695    const Int64 realLog2Denom = useHighPrecision ? 0 : (bitDepth - 8);
     696    const Int64 realOffset    = (Int64)offset<<realLog2Denom;
     697    const Int64 roundOffset = (log2Denom == 0) ? 0 : 1 << (log2Denom - 1);
     698    const Int64 minValue = 0;
     699    const Int64 maxValue = (1 << bitDepth) - 1;
     700
     701    for( Int y = 0; y < height; y++ )
     702    {
     703      for( Int x = 0; x < width; x++ )
     704      {
     705        Int64 scaledValue = Clip3(minValue, maxValue,  ((((Int64) pRefPel[x] * (Int64) weight + roundOffset) ) >>  (Int64) log2Denom) + realOffset);
     706        SAD += abs((Int64)pOrgPel[x] -  scaledValue);
     707      }
     708      pOrgPel += orgStride;
     709      pRefPel += refStride;
     710    }
     711  }
     712  else
     713  {
     714    //const Int64 iSize          = iWidth*iHeight;
     715    const Int64 realLog2Denom = useHighPrecision ? log2Denom : (log2Denom + (bitDepth - 8));
     716    const Int64 realOffset    = ((Int64)offset)<<realLog2Denom;
     717
     718    for( Int y = 0; y < height; y++ )
     719    {
     720      for( Int x = 0; x < width; x++ )
     721      {
     722        SAD += abs(( ((Int64)pOrgPel[x] << (Int64) log2Denom) - ( (Int64) pRefPel[x] * (Int64) weight + (realOffset) ) ) );
     723      }
     724      pOrgPel += orgStride;
     725      pRefPel += refStride;
     726    }
     727  }
     728  return SAD;
     729}
  • branches/HTM-15.2-dev/source/Lib/TLibEncoder/WeightPredAnalysis.h

    r1313 r1360  
    5252
    5353  Bool  xSelectWP            (TComSlice *const slice, const Int log2Denom);
     54  Bool  xSelectWPHistExtClip (TComSlice *const slice, const Int log2Denom, const Bool bDoEnhancement, const Bool bClipInitialSADWP, const Bool bUseHistogram);
    5455  Bool  xUpdatingWPParameters(TComSlice *const slice, const Int log2Denom);
    55 
    56   Int64 xCalcSADvalueWP      (const Int   bitDepth,
    57                               const Pel  *pOrgPel,
    58                               const Pel  *pRefPel,
    59                               const Int   iWidth,
    60                               const Int   iHeight,
    61                               const Int   iOrgStride,
    62                               const Int   iRefStride,
    63                               const Int   iLog2Denom,
    64                               const Int   iWeight,
    65                               const Int   iOffset,
    66                               const Bool  useHighPrecisionPredictionWeighting);
    6756
    6857public:
     
    7261  // WP analysis :
    7362  Void  xCalcACDCParamSlice  (TComSlice *const slice);
    74   Void  xEstimateWPParamSlice(TComSlice *const slice);
     63  Void  xEstimateWPParamSlice(TComSlice *const slice, const WeightedPredictionMethod method);
    7564  Void  xCheckWPEnable       (TComSlice *const slice);
    7665};
Note: See TracChangeset for help on using the changeset viewer.