Changeset 884 in 3DVCSoftware for trunk/source/App/TAppEncoder


Ignore:
Timestamp:
29 Mar 2014, 18:55:16 (11 years ago)
Author:
tech
Message:

Merged HTM-10.1-dev0@883. (MV-HEVC 7 HLS)

Location:
trunk/source/App/TAppEncoder
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/App/TAppEncoder/TAppEncCfg.cpp

    r872 r884  
    388388  ("VpsNumLayerSets",       m_vpsNumLayerSets    , 1                    , "Number of layer sets")   
    389389  ("LayerIdsInSet_%d",      m_layerIdsInSets     , std::vector<Int>(1,0), MAX_VPS_OP_SETS_PLUS1 ,"LayerIds of Layer set") 
    390 #if H_MV_HLS_7_OUTPUT_LAYERS_5_10_22_27
    391390  ("DefaultTargetOutputLayerIdc"     , m_defaultTargetOutputLayerIdc     , 0, "Specifies output layers of layer sets, 0: output all layers, 1: output highest layer, 2: specified by LayerIdsInDefOutputLayerSet")
    392 #else
    393   ("DefaultOneTargetOutputLayerFlag"  , m_defaultOneTargetOutputLayerIdc  , 0, "Output highest layer of layer sets by default")
    394 #endif
    395391  ("OutputLayerSetIdx",     m_outputLayerSetIdx  , std::vector<Int>(0,0), "Indices of layer sets used as additional output layer sets") 
    396392
    397 #if H_MV_HLS_7_OUTPUT_LAYERS_5_10_22_27
    398393  ("LayerIdsInAddOutputLayerSet_%d", m_layerIdsInAddOutputLayerSet      , std::vector<Int>(0,0), MAX_VPS_ADD_OUTPUT_LAYER_SETS, "Indices in VPS of output layers in additional output layer set") 
    399394  ("LayerIdsInDefOutputLayerSet_%d", m_layerIdsInDefOutputLayerSet      , std::vector<Int>(0,0), MAX_VPS_OP_SETS_PLUS1, "Indices in VPS of output layers in layer set") 
    400 #else
    401   ("LayerIdsInAddOutputLayerSet_%d", m_layerIdsInAddOutputLayerSet      , std::vector<Int>(1,0), MAX_VPS_ADD_OUTPUT_LAYER_SETS, "LayerIds of additional output layers") 
    402 #endif
    403395  ("ProfileLevelTierIdx",   m_profileLevelTierIdx, std::vector<Int>(1,0), "Indices to profile level tier")
    404396 
     
    521513#if H_3D_SPIVMP
    522514  ("SubPULog2Size", m_iSubPULog2Size, (Int)3, "Sub-PU size index: 2^n")
    523 #endif
    524 #if QC_SPIVMP_MPI_G0119
    525515  ("SubPUMPILog2Size", m_iSubPUMPILog2Size, (Int)3, "Sub-PU MPI size index: 2^n")
    526516#endif
     
    613603#if H_MV
    614604
    615   // DBP Size
    616 #if !H_MV_HLS_7_FIX_SET_DPB_SIZE
    617   ("SubLayerFlagInfoPresentFlag",  m_subLayerFlagInfoPresentFlag , false                                           , "SubLayerFlagInfoPresentFlag")
    618 #endif
    619605  // VPS VUI
    620606  ("VpsVuiPresentFlag"           , m_vpsVuiPresentFlag           , false                                           , "VpsVuiPresentFlag           ")
    621607  ("CrossLayerPicTypeAlignedFlag", m_crossLayerPicTypeAlignedFlag, false                                           , "CrossLayerPicTypeAlignedFlag")  // Could actually be derived by the encoder
    622608  ("CrossLayerIrapAlignedFlag"   , m_crossLayerIrapAlignedFlag   , false                                           , "CrossLayerIrapAlignedFlag   ")  // Could actually be derived by the encoder
    623 #if H_MV_HLS_7_MISC_P0068_21
    624609  ("AllLayersIdrAlignedFlag"     , m_allLayersIdrAlignedFlag     , false                                           , "CrossLayerIrapAlignedFlag   ")  // Could actually be derived by the encoder
    625 #endif
    626610  ("BitRatePresentVpsFlag"       , m_bitRatePresentVpsFlag       , false                                           , "BitRatePresentVpsFlag       ")
    627611  ("PicRatePresentVpsFlag"       , m_picRatePresentVpsFlag       , false                                           , "PicRatePresentVpsFlag       ")
     
    737721  ("SEISOPDescription",              m_SOPDescriptionSEIEnabled,              0, "Control generation of SOP description SEI messages")
    738722  ("SEIScalableNesting",             m_scalableNestingSEIEnabled,              0, "Control generation of scalable nesting SEI messages")
    739 #if H_MV_HLS_7_SEI_P0204_26
    740723  ("SubBitstreamPropSEIEnabled",              m_subBistreamPropSEIEnabled,    false                     ,"Enable signaling of sub-bitstream property SEI message")
    741724  ("SEISubBitstreamNumAdditionalSubStreams",  m_sbPropNumAdditionalSubStreams,0, "Number of substreams for which additional information is signalled")
     
    745728  ("SEISubBitstreamAvgBitRate",               m_sbPropAvgBitRate,             std::vector< Int  >(1,0)  ,"Specifies average bit rate of the i-th sub-bitstream")
    746729  ("SEISubBitstreamMaxBitRate",               m_sbPropMaxBitRate,             std::vector< Int  >(1,0)  ,"Specifies maximum bit rate of the i-th sub-bitstream")
    747 #endif
    748730#if H_3D
    749731  ("CameraParameterFile,cpf", m_pchCameraParameterFile,    (Char *) 0, "Camera Parameter File Name")
     
    14321414  }
    14331415
    1434 #if H_MV_HLS_7_OUTPUT_LAYERS_5_10_22_27
    14351416  xConfirmPara( m_defaultTargetOutputLayerIdc < 0 || m_defaultTargetOutputLayerIdc > 2, "Default target output layer idc must greater than or equal to 0 and less than or equal to 2." ); 
    14361417
     
    14631444    }
    14641445  }
    1465 #else
    1466   xConfirmPara( m_defaultOneTargetOutputLayerIdc < 0 || m_defaultOneTargetOutputLayerIdc > 1, "Default one target output layer idc must be equal to 0 or equal to 1" );
    1467 #endif
     1446
    14681447  xConfirmPara( m_profileLevelTierIdx.size() < m_vpsNumLayerSets + m_outputLayerSetIdx.size(), "The number of Profile Level Tier indices must be equal to the number of layer set plus the number of output layer set indices" );
    14691448
     
    15521531#endif
    15531532#if H_3D_SPIVMP
    1554 #if SEC_SPIVMP_MCP_SIZE_G0077
    15551533  xConfirmPara( m_iSubPULog2Size < 3,                                        "SubPULog2Size must be 3 or greater.");
    1556 #else
    1557   xConfirmPara( m_iSubPULog2Size < 2,                                        "SubPULog2Size must be 2 or greater.");
    1558 #endif
    15591534  xConfirmPara( m_iSubPULog2Size > 6,                                        "SubPULog2Size must be 6 or smaller.");
    15601535  xConfirmPara( (1<<m_iSubPULog2Size) > m_uiMaxCUWidth,                      "SubPULog2Size must be log2(maxCUSize) or smaller.");
    1561 #endif
    1562 #if QC_SPIVMP_MPI_G0119
     1536 
    15631537  xConfirmPara( m_iSubPUMPILog2Size < 3,                                        "SubPUMPILog2Size must be 3 or greater.");
    15641538  xConfirmPara( m_iSubPUMPILog2Size > 6,                                        "SubPUMPILog2Size must be 6 or smaller.");
     
    22522226  }
    22532227  }
    2254 #endif
    2255 #if H_MV_HLS_7_SEI_P0204_26
    22562228  // Check input parameters for Sub-bitstream property SEI message
    22572229  if( m_subBistreamPropSEIEnabled )
     
    24992471#if H_3D_SPIVMP
    25002472  printf(" SubPULog2Size:%d  " , m_iSubPULog2Size  );
    2501 #endif
    2502 #endif
    2503 #if QC_SPIVMP_MPI_G0119
    25042473  printf(" SubPUMPILog2Size:%d  " , m_iSubPUMPILog2Size  );
     2474#endif
    25052475#endif
    25062476#if H_3D_ARP
  • trunk/source/App/TAppEncoder/TAppEncCfg.h

    r872 r884  
    8989  Int                    m_vpsNumLayerSets;                   ///< Number of layer sets
    9090  std::vector< std::vector<Int> > m_layerIdsInSets;           ///< LayerIds in vps of layer set
    91 #if H_MV_HLS_7_OUTPUT_LAYERS_5_10_22_27
    9291  Int                    m_defaultTargetOutputLayerIdc;       ///< Specifies output layers of layer sets, 0: output all layers, 1: output highest layers, 2: specified by LayerIdsInDefOuputLayerSet
    93 #else
    94   Int                    m_defaultOneTargetOutputLayerIdc;    ///< Output highest layer of layer sets by default when equal to 1
    95 #endif
    9692  std::vector<Int>       m_outputLayerSetIdx;                 ///< Indices of layer sets used as additional output layer sets 
    9793  std::vector< std::vector<Int> > m_layerIdsInAddOutputLayerSet; ///< LayerIds in vps of additional output layers
    98 #if H_MV_HLS_7_OUTPUT_LAYERS_5_10_22_27
    9994  std::vector< std::vector<Int> > m_layerIdsInDefOutputLayerSet; ///< Indices in vps of output layers in layer sets
    100 #endif
    10195  std::vector<Int>       m_profileLevelTierIdx;               ///< Indices of of profile level tier
    10296 
     
    10498  std::vector< std::vector<Int> > m_directRefLayers;          ///< LayerIds of direct reference layers
    10599  std::vector< std::vector<Int> > m_dependencyTypes;          ///< Dependency types of direct reference layers
    106 
    107   // DBP Size
    108 #if !H_MV_HLS_7_FIX_SET_DPB_SIZE
    109   Bool m_subLayerFlagInfoPresentFlag;
    110 #endif
    111100
    112101  // VPS VUI
     
    114103  Bool m_crossLayerPicTypeAlignedFlag;
    115104  Bool m_crossLayerIrapAlignedFlag;
    116 #if H_MV_HLS_7_MISC_P0068_21
    117105  Bool m_allLayersIdrAlignedFlag;
    118 #endif
    119106  Bool m_bitRatePresentVpsFlag;
    120107  Bool m_picRatePresentVpsFlag;
     
    141128#if H_3D_SPIVMP
    142129  Int                    m_iSubPULog2Size;                   
    143 #endif
    144 #endif
    145 #if QC_SPIVMP_MPI_G0119
    146130  Int                    m_iSubPUMPILog2Size;                   
     131#endif
    147132#endif
    148133#if H_3D_ARP                                                  /// < flag and number of weighting factors in ARP
     
    440425  Int       m_log2MaxMvLengthHorizontal;                      ///< Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units
    441426  Int       m_log2MaxMvLengthVertical;                        ///< Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units
    442 #if H_MV_HLS_7_SEI_P0204_26
     427#if H_MV
    443428  Bool              m_subBistreamPropSEIEnabled;
    444429  Int               m_sbPropNumAdditionalSubStreams;
  • trunk/source/App/TAppEncoder/TAppEncTop.cpp

    r872 r884  
    127127  xSetRepFormat            ( vps );
    128128  xSetLayerSets            ( vps );
    129 #if H_MV_HLS_7_FIX_SET_DPB_SIZE
    130129  xSetDpbSize              ( vps );
    131 #endif
    132130  xSetVPSVUI               ( vps );
    133131#if H_3D
     
    187185#if H_3D_SPIVMP
    188186    m_cTEncTop.setSubPULog2Size                 (( isDepth || 0==layerIdInVps ) ? 0 : m_iSubPULog2Size   );
    189 #endif
    190 #if QC_SPIVMP_MPI_G0119
    191187    m_cTEncTop.setSubPUMPILog2Size              ( !isDepth ? 0 : m_iSubPUMPILog2Size   );
    192188#endif
     
    429425  m_cTEncTop.setSOPDescriptionSEIEnabled( m_SOPDescriptionSEIEnabled );
    430426  m_cTEncTop.setScalableNestingSEIEnabled( m_scalableNestingSEIEnabled );
    431 #if H_MV_HLS_7_SEI_P0204_26
     427#if H_MV
    432428  m_cTEncTop.setSubBitstreamPropSEIEnabled( m_subBistreamPropSEIEnabled );
    433429  if( m_subBistreamPropSEIEnabled )
     
    826822#endif
    827823
    828 #if MTK_DDD_G0063
     824#if H_3D_DDD
    829825          m_acTEncTopList[ layer ]->getSliceEncoder()->setDDDPar( m_cCameraData.getCodedScale()[0][ m_acTEncTopList[layer]->getViewIndex() ],
    830826              m_cCameraData.getCodedOffset()[0][ m_acTEncTopList[layer]->getViewIndex() ],
     
    15061502}
    15071503
    1508 #if H_MV_HLS_7_FIX_SET_DPB_SIZE
    15091504Void TAppEncTop::xSetDpbSize                ( TComVPS& vps )
    15101505{
     
    15201515    Bool subLayerFlagInfoPresentFlag = false;
    15211516
    1522 #if H_MV_HLS_7_HRD_P0156_7
    15231517    for( Int j = 0; j  <=  vps.getMaxSubLayersInLayerSetMinus1( i ); j++ )
    1524 #else
    1525     for( Int j = 0; j  <=  vps.getMaxTLayers() - 1 ; j++ )
    1526 #endif
    15271518    {   
    15281519      Bool subLayerDpbInfoPresentFlag = false;
    1529 #if H_MV_HLS_7_OUTPUT_LAYERS_5_10_22_27
    15301520      assert( vps.getNumSubDpbs( vps.getLayerSetIdxForOutputLayerSet( i ) ) == targetDecLayerIdList.size() );
    15311521      for( Int k = 0; k < vps.getNumSubDpbs( vps.getLayerSetIdxForOutputLayerSet( i )); k++ )   
    1532 #else
    1533       assert( vps.getNumSubDpbs( vps.getOutputLayerSetIdxMinus1( i ) + 1 ) == targetDecLayerIdList.size() );
    1534       for( Int k = 0; k < vps.getNumSubDpbs( vps.getOutputLayerSetIdxMinus1( i ) + 1 ); k++ )   
    1535 #endif
    15361522      {
    15371523        Int layerIdInVps = vps.getLayerIdInVps( targetDecLayerIdList[k] );           
     
    15761562  } 
    15771563}
    1578 #else
    1579 Void TAppEncTop::xSetDpbSize                ( TComVPS& vps )
    1580 {
    1581   // These settings need to be verified
    1582 
    1583   TComDpbSize* dpbSize = vps.getDpbSize();
    1584 
    1585   assert ( dpbSize != 0 );
    1586 
    1587   for( Int i = 1; i < vps.getNumOutputLayerSets(); i++ )
    1588   { 
    1589     std::vector<Int> targetDecLayerIdList = vps.getTargetDecLayerIdList( i );
    1590     dpbSize->setSubLayerFlagInfoPresentFlag( i, m_subLayerFlagInfoPresentFlag );
    1591     if ( dpbSize->getSubLayerFlagInfoPresentFlag( i ) )
    1592     {
    1593       for( Int j = 0; j  <=  vps.getMaxTLayers() - 1 ; j++ )
    1594       {   
    1595         Int maxNumReorderPics  = MIN_INT;
    1596         Int maxDecPicBuffering = MIN_INT;
    1597         Int maxLatencyIncrease = MIN_INT;
    1598 
    1599         Int prevMaxNumReorderPics  = MIN_INT;
    1600         Int prevMaxDecPicBuffering = MIN_INT;
    1601         Int prevMaxLatencyIncrease = MIN_INT;
    1602 
    1603         assert( vps.getNumSubDpbs( vps.getOutputLayerSetIdxMinus1( i ) + 1 ) == targetDecLayerIdList.size() );
    1604         for( Int k = 0; k < vps.getNumSubDpbs( vps.getOutputLayerSetIdxMinus1( i ) + 1 ); k++ )   
    1605         {
    1606           Int layerIdInVps = vps.getLayerIdInVps( targetDecLayerIdList[k] );           
    1607           dpbSize->setMaxVpsDecPicBufferingMinus1( i, k, j, m_maxDecPicBufferingMvc[ layerIdInVps ][ j ] - 1 );
    1608         }       
    1609 
    1610         for ( Int idx = 0; idx < targetDecLayerIdList.size(); idx++ )
    1611         {
    1612           Int layerIdInVps = vps.getLayerIdInVps( targetDecLayerIdList[ idx ] );
    1613           maxNumReorderPics = std::max( maxNumReorderPics, m_numReorderPicsMvc[ layerIdInVps ][ j ] );
    1614         }
    1615         assert( maxNumReorderPics != MIN_INT );
    1616         dpbSize->setMaxVpsNumReorderPics( i, j, maxNumReorderPics );
    1617 
    1618         // To Be Done !
    1619         // dpbSize->setMaxVpsLatencyIncreasePlus1( i, j, uiCode );
    1620 
    1621         if( j > 0 ) 
    1622         {
    1623           dpbSize->setSubLayerDpbInfoPresentFlag( i, j, prevMaxDecPicBuffering == maxDecPicBuffering && prevMaxLatencyIncrease == maxLatencyIncrease && prevMaxNumReorderPics == maxNumReorderPics );
    1624         }       
    1625 
    1626         prevMaxNumReorderPics   = maxNumReorderPics;
    1627         prevMaxDecPicBuffering  = maxDecPicBuffering;
    1628         prevMaxLatencyIncrease  = maxLatencyIncrease;
    1629       } 
    1630     } 
    1631   } 
    1632 }
    1633 #endif
     1564
    16341565
    16351566Void TAppEncTop::xSetLayerSets( TComVPS& vps )
     
    16371568  // Layer sets
    16381569  vps.setVpsNumLayerSetsMinus1   ( m_vpsNumLayerSets - 1 );
    1639 #if !H_MV_HLS_7_OUTPUT_LAYERS_5_10_22_27
    1640   vps.setVpsNumberLayerSetsMinus1( vps.getVpsNumLayerSetsMinus1() );
    1641 #endif
    16421570   
    16431571  for (Int lsIdx = 0; lsIdx < m_vpsNumLayerSets; lsIdx++ )
     
    16561584  Int numAddOuputLayerSets = (Int) m_outputLayerSetIdx.size();
    16571585  // Additional output layer sets + profileLevelTierIdx
    1658 #if H_MV_HLS_7_OUTPUT_LAYERS_5_10_22_27
    16591586  vps.setDefaultTargetOutputLayerIdc      ( m_defaultTargetOutputLayerIdc );   
    16601587  vps.setNumAddOutputLayerSets            ( numAddOuputLayerSets          );
    16611588  vps.initTargetLayerIdLists();
    1662 #else
    1663   vps.setDefaultOneTargetOutputLayerIdc   ( m_defaultOneTargetOutputLayerIdc );
    1664   vps.setMoreOutputLayerSetsThanDefaultFlag( numAddOuputLayerSets       != 0 );   
    1665   vps.setNumAddOutputLayerSetsMinus1       ( numAddOuputLayerSets - 1        );
    1666 #endif
    1667 
    1668 #if H_MV_HLS_7_OUTPUT_LAYERS_5_10_22_27
     1589
    16691590  for (Int olsIdx = 0; olsIdx < m_vpsNumLayerSets + numAddOuputLayerSets; olsIdx++)
    16701591  {
     
    17161637    vps.setAltOutputLayerFlag( olsIdx , false);     
    17171638  }
    1718 #else
    1719   for (Int lsIdx = 0; lsIdx < m_vpsNumLayerSets; lsIdx++)
    1720   {
    1721     if ( lsIdx > 0 )
    1722     {
    1723       vps.setProfileLevelTierIdx( lsIdx, m_profileLevelTierIdx[ lsIdx ] );
    1724     } 
    1725 
    1726     vps.setOutputLayerSetIdxMinus1( lsIdx, lsIdx - 1 );
    1727 
    1728     for (Int i = 0; i < m_layerIdsInSets[ lsIdx ].size(); i++ )
    1729     {
    1730       vps.setOutputLayerFlag( lsIdx, i, vps.inferOutputLayerFlag( lsIdx, i ));       
    1731     }
    1732   }
    1733 
    1734   for (Int addOutLs = 0; addOutLs < numAddOuputLayerSets; addOutLs++ )
    1735   {
    1736     vps.setProfileLevelTierIdx( m_vpsNumLayerSets + addOutLs, m_profileLevelTierIdx[ addOutLs ] );
    1737 
    1738     Int refLayerSetIdx = m_outputLayerSetIdx[ addOutLs ];     
    1739     vps.setOutputLayerSetIdxMinus1( m_vpsNumLayerSets + addOutLs, refLayerSetIdx - 1 );
    1740 
    1741     for (Int i = 0; i < m_layerIdsInSets[ refLayerSetIdx].size(); i++ )
    1742     {
    1743       Bool outputLayerFlag = false;
    1744       for (Int j = 0; j < m_layerIdsInAddOutputLayerSet[ addOutLs ].size(); j++ )
    1745       {
    1746         if (  m_layerIdsInAddOutputLayerSet[addOutLs][ j ] == m_layerIdsInSets[ refLayerSetIdx][ i ] )
    1747         {
    1748           outputLayerFlag = true;
    1749           break;
    1750         }
    1751       }
    1752       vps.setOutputLayerFlag( m_vpsNumLayerSets + addOutLs, i, outputLayerFlag );       
    1753     }
    1754   }
    1755   vps.deriveTargetLayerIdLists();
    1756 #endif
     1639
    17571640}
    17581641
     
    17611644  vps.setVpsVuiPresentFlag( m_vpsVuiPresentFlag );
    17621645
    1763 #if H_MV_HLS_7_FIX_INFER_CROSS_LAYER_IRAP_ALIGNED_FLAG
    17641646  TComVPSVUI* pcVPSVUI = vps.getVPSVUI(  );
    17651647  assert( pcVPSVUI );
    1766 #endif
    17671648
    17681649  if ( m_vpsVuiPresentFlag )
    17691650  {
    1770 #if !H_MV_HLS_7_FIX_INFER_CROSS_LAYER_IRAP_ALIGNED_FLAG
    1771     TComVPSVUI* pcVPSVUI = vps.getVPSVUI(  );
    1772 
    1773     assert( pcVPSVUI );
    1774 #endif
    1775 
    17761651    // All this stuff could actually be derived by the encoder,
    17771652    // however preliminary setting it from input parameters
     
    17791654    pcVPSVUI->setCrossLayerPicTypeAlignedFlag( m_crossLayerPicTypeAlignedFlag );
    17801655    pcVPSVUI->setCrossLayerIrapAlignedFlag   ( m_crossLayerIrapAlignedFlag    );
    1781 #if H_MV_HLS_7_MISC_P0068_21
    17821656    pcVPSVUI->setAllLayersIdrAlignedFlag     ( m_allLayersIdrAlignedFlag      );
    1783 #endif
    17841657    pcVPSVUI->setBitRatePresentVpsFlag( m_bitRatePresentVpsFlag );
    17851658    pcVPSVUI->setPicRatePresentVpsFlag( m_picRatePresentVpsFlag );
     
    17871660    if( pcVPSVUI->getBitRatePresentVpsFlag( )  ||  pcVPSVUI->getPicRatePresentVpsFlag( ) )
    17881661    {
    1789 #if H_MV_HLS_7_OUTPUT_LAYERS_5_10_22_27
    17901662      for( Int i = 0; i  <=  vps.getVpsNumLayerSetsMinus1(); i++ )
    1791 #else
    1792       for( Int i = 0; i  <=  vps.getVpsNumberLayerSetsMinus1(); i++ )
    1793 #endif
    17941663      {
    17951664        for( Int j = 0; j  <=  vps.getMaxTLayers(); j++ )
     
    19091778    pcVPSVUI->setVpsVuiBspHrdPresentFlag( false ); // TBD
    19101779  }
    1911 #if H_MV_HLS_7_FIX_INFER_CROSS_LAYER_IRAP_ALIGNED_FLAG
    19121780  else
    19131781  {
    19141782    pcVPSVUI->setCrossLayerIrapAlignedFlag   ( false   );
    19151783  }
    1916 #endif
    19171784}
    19181785#endif
     
    19701837#endif
    19711838  } 
    1972 #if QC_SPIVMP_MPI_G0119
     1839#if H_3D_SPIVMP
    19731840  vps.setSubPUMPILog2Size( m_iSubPUMPILog2Size );
    19741841#endif
Note: See TracChangeset for help on using the changeset viewer.