Changeset 1200 in 3DVCSoftware for branches/HTM-14.1-update-dev0/source/App


Ignore:
Timestamp:
4 May 2015, 18:38:08 (9 years ago)
Author:
tech
Message:

Update to HM-16.5.
Starting point for further re-activation of 3D-tools.

Includes:

active:

  • MV-HEVC
  • 3D-HLS (apart from DLT)
  • VSO

inactive:

  • remaining 3D-HEVC tools.
Location:
branches/HTM-14.1-update-dev0/source/App
Files:
27 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-14.1-update-dev0/source/App/TAppDecoder/TAppDecCfg.cpp

    r1179 r1200  
    22 * License, included below. This software may be subject to other third party
    33 * and contributor rights, including patent rights, and no such rights are
    4  * granted under this license. 
    5  *
    6 * Copyright (c) 2010-2015, ITU/ISO/IEC
     4 * granted under this license.
     5 *
     6 * Copyright (c) 2010-2015, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    4141#include "TAppDecCfg.h"
    4242#include "TAppCommon/program_options_lite.h"
    43 
    44 #if H_MV
    45 #include <cassert>
    46 #endif
     43#include "TLibCommon/TComChromaFormat.h"
    4744#ifdef WIN32
    4845#define strdup _strdup
     46#endif
     47#if NH_MV
     48#include <cassert>
    4949#endif
    5050
     
    6868  string cfg_ReconFile;
    6969  string cfg_TargetDecLayerIdSetFile;
    70 #if H_3D
     70#if NH_3D
    7171  string cfg_ScaleOffsetFile;
    7272#endif
     73  string outputColourSpaceConvert;
     74  Int warnUnknowParameter = 0;
    7375
    7476  po::Options opts;
    7577  opts.addOptions()
    76   ("help", do_help, false, "this help text")
    77   ("BitstreamFile,b", cfg_BitstreamFile, string(""), "bitstream input file name")
    78   ("ReconFile,o",     cfg_ReconFile,     string(""), "reconstructed YUV output file name\n"
    79                                                      "YUV writing is skipped if omitted")
    80 #if H_3D
    81   ("ScaleOffsetFile,p", cfg_ScaleOffsetFile, string(""), "file with coded scales and offsets")
    82 #endif
    83   ("SkipFrames,s", m_iSkipFrame, 0, "number of frames to skip before random access")
    84   ("OutputBitDepth,d", m_outputBitDepthY, 0, "bit depth of YUV output luma component (default: use 0 for native depth)")
    85   ("OutputBitDepthC,d", m_outputBitDepthC, 0, "bit depth of YUV output chroma component (default: use 0 for native depth)")
    86 #if H_MV
    87   ("TargetOptLayerSetIdx,x", m_targetOptLayerSetIdx, -1, "Target output layer set index. (default: -1, determine automatically to be equal to highest layer set index") // Should actually equal to 0 as default. However, this would cause only the base layer to be decoded. 
    88 #endif
    89   ("MaxTemporalLayer,t", m_iMaxTemporalLayer, -1, "Maximum Temporal Layer to be decoded. -1 to decode all layers")
    90   ("SEIDecodedPictureHash", m_decodedPictureHashSEIEnabled, 1, "Control handling of decoded picture hash SEI messages\n"
    91                                               "\t1: check hash in SEI messages if available in the bitstream\n"
    92                                               "\t0: ignore SEI message")
    93   ("SEIpictureDigest", m_decodedPictureHashSEIEnabled, 1, "deprecated alias for SEIDecodedPictureHash")
    94   ("TarDecLayerIdSetFile,l", cfg_TargetDecLayerIdSetFile, string(""), "targetDecLayerIdSet file name. The file should include white space separated LayerId values to be decoded. Omitting the option or a value of -1 in the file decodes all layers.")
    95   ("RespectDefDispWindow,w", m_respectDefDispWindow, 0, "Only output content inside the default display window\n")
    96 #if H_MV
    97   ("OutputVpsInfo,v", m_outputVpsInfo, false, "Output information about the layer dependencies and layer sets")
    98 #endif
     78
     79
     80  ("help",                      do_help,                               false,      "this help text")
     81  ("BitstreamFile,b",           cfg_BitstreamFile,                     string(""), "bitstream input file name")
     82  ("ReconFile,o",               cfg_ReconFile,                         string(""), "reconstructed YUV output file name\n"
     83                                                                                   "YUV writing is skipped if omitted")
     84#if NH_3D
     85  ("ScaleOffsetFile,p",         cfg_ScaleOffsetFile,                   string(""), "file with coded scales and offsets")
     86  ("Depth420OutputFlag",        m_depth420OutputFlag,                  true      , "Output depth layers in 4:2:0 ")
     87#endif
     88  ("WarnUnknowParameter,w",     warnUnknowParameter,                                  0, "warn for unknown configuration parameters instead of failing")
     89  ("SkipFrames,s",              m_iSkipFrame,                          0,          "number of frames to skip before random access")
     90  ("OutputBitDepth,d",          m_outputBitDepth[CHANNEL_TYPE_LUMA],   0,          "bit depth of YUV output luma component (default: use 0 for native depth)")
     91  ("OutputBitDepthC,d",         m_outputBitDepth[CHANNEL_TYPE_CHROMA], 0,          "bit depth of YUV output chroma component (default: use 0 for native depth)")
     92  ("OutputColourSpaceConvert",  outputColourSpaceConvert,              string(""), "Colour space conversion to apply to input 444 video. Permitted values are (empty string=UNCHANGED) " + getListOfColourSpaceConverts(false))
     93#if NH_MV
     94  ("TargetOptLayerSetIdx,x",    m_targetOptLayerSetIdx,                -1,         "Target output layer set index. (default: -1, determine automatically to be equal to highest layer set index") // Should actually equal to 0 as default. However, this would cause only the base layer to be decoded. 
     95#endif
     96  ("MaxTemporalLayer,t",        m_iMaxTemporalLayer,                   -1,         "Maximum Temporal Layer to be decoded. -1 to decode all layers")
     97  ("SEIDecodedPictureHash",     m_decodedPictureHashSEIEnabled,        1,          "Control handling of decoded picture hash SEI messages\n"
     98                                                                                   "\t1: check hash in SEI messages if available in the bitstream\n"
     99                                                                                   "\t0: ignore SEI message")
     100  ("SEINoDisplay",              m_decodedNoDisplaySEIEnabled,          true,       "Control handling of decoded no display SEI messages")
     101  ("TarDecLayerIdSetFile,l",    cfg_TargetDecLayerIdSetFile,           string(""), "targetDecLayerIdSet file name. The file should include white space separated LayerId values to be decoded. Omitting the option or a value of -1 in the file decodes all layers.")
     102  ("RespectDefDispWindow,w",    m_respectDefDispWindow,                0,          "Only output content inside the default display window\n")
     103#if NH_MV
     104  ("OutputVpsInfo,v",           m_outputVpsInfo,                       false,       "Output information about the layer dependencies and layer sets")
     105#endif
     106#if O0043_BEST_EFFORT_DECODING
     107  ("ForceDecodeBitDepth",       m_forceDecodeBitDepth,                 0U,         "Force the decoder to operate at a particular bit-depth (best effort decoding)")
     108#endif
     109  ("OutputDecodedSEIMessagesFilename",  m_outputDecodedSEIMessagesFilename,    string(""), "When non empty, output decoded SEI messages to the indicated file. If file is '-', then output to stdout\n")
     110  ("ClipOutputVideoToRec709Range",      m_bClipOutputVideoToRec709Range,  false, "If true then clip output video to the Rec. 709 Range on saving")
    99111  ;
     112
    100113  po::setDefaults(opts);
    101   const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
     114  po::ErrorReporter err;
     115  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv, err);
    102116
    103117  for (list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
     
    109123  {
    110124    po::doHelp(cout, opts);
     125    return false;
     126  }
     127
     128  if (err.is_errored)
     129  {
     130    if (!warnUnknowParameter)
     131    {
     132      /* errors have already been reported to stderr */
     133      return false;
     134    }
     135  }
     136
     137  m_outputColourSpaceConvert = stringToInputColourSpaceConvert(outputColourSpaceConvert, false);
     138  if (m_outputColourSpaceConvert>=NUMBER_INPUT_COLOUR_SPACE_CONVERSIONS)
     139  {
     140    fprintf(stderr, "Bad output colour space conversion string\n");
    111141    return false;
    112142  }
     
    116146  m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str());
    117147
    118 #if H_3D
     148#if NH_3D
    119149  m_pchScaleOffsetFile = cfg_ScaleOffsetFile.empty() ? NULL : strdup(cfg_ScaleOffsetFile.c_str());
    120150#endif
     151
    121152  if (!m_pchBitstreamFile)
    122153  {
    123     fprintf(stderr, "No input file specifed, aborting\n");
     154    fprintf(stderr, "No input file specified, aborting\n");
    124155    return false;
    125156  }
     
    127158  if ( !cfg_TargetDecLayerIdSetFile.empty() )
    128159  {
    129 #if H_MV
     160#if NH_MV
    130161    m_targetDecLayerIdSetFileEmpty = false;     
    131162#endif
     
    152183        if ( layerIdParsed < 0 || layerIdParsed >= MAX_NUM_LAYER_IDS )
    153184        {
    154           fprintf(stderr, "Warning! Parsed LayerId %d is not withing allowed range [0,%d]. Ignoring this value.\n", layerIdParsed, MAX_NUM_LAYER_IDS-1 );
     185          fprintf(stderr, "Warning! Parsed LayerId %d is not within allowed range [0,%d]. Ignoring this value.\n", layerIdParsed, MAX_NUM_LAYER_IDS-1 );
    155186        }
    156187        else
     
    172203    }
    173204  }
    174 #if H_MV
    175   m_targetDecLayerIdSet.push_back( 0 );         // Only base layer at startup
    176 #endif
    177 
     205
     206#if NH_MV
     207  //m_targetDecLayerIdSet.push_back( 0 );         // Only base layer at startup
     208#endif
    178209  return true;
    179210}
    180211
    181 #if H_MV
     212#if NH_MV
    182213Void TAppDecCfg::xAppendToFileNameEnd( Char* pchInputFileName, const Char* pchStringToAppend, Char*& rpchOutputFileName)
    183214{
  • branches/HTM-14.1-update-dev0/source/App/TAppDecoder/TAppDecCfg.h

    r1179 r1200  
    22 * License, included below. This software may be subject to other third party
    33 * and contributor rights, including patent rights, and no such rights are
    4  * granted under this license. 
     4 * granted under this license.
    55 *
    6 * Copyright (c) 2010-2015, ITU/ISO/IEC
     6 * Copyright (c) 2010-2015, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    4545#include "TLibCommon/CommonDef.h"
    4646#include <vector>
     47
    4748//! \ingroup TAppDecoder
    4849//! \{
     
    5657{
    5758protected:
    58   Char*         m_pchBitstreamFile;                   ///< input bitstream file name
    59 #if H_MV
    60   Int           m_targetOptLayerSetIdx;               ///< target output layer set index
    61   Int           m_maxLayerId;                         ///< maximum nuh_layer_id decoded
    62   std::vector<Char*> m_pchReconFiles;                 ///< array of output reconstruction file name create from output reconstruction file name
     59  Char*         m_pchBitstreamFile;                     ///< input bitstream file name
     60#if NH_MV
     61  Int           m_targetOptLayerSetIdx;                 ///< target output layer set index
     62  Int           m_maxLayerId;                           ///< maximum nuh_layer_id decoded
     63  std::vector<Char*> m_pchReconFiles;                   ///< array of output reconstruction file name create from output reconstruction file name
    6364#endif
    64   Char*         m_pchReconFile;                       ///< output reconstruction file name
    65 #if H_3D
    66   Char*         m_pchScaleOffsetFile;                 ///< output coded scale and offset parameters
     65  Char*         m_pchReconFile;                         ///< output reconstruction file name
     66#if NH_3D
     67  Char*         m_pchScaleOffsetFile;                   ///< output coded scale and offset parameters
     68  Bool          m_depth420OutputFlag;                   ///< output depth layers in 4:2:0
    6769#endif
    68   Int           m_iSkipFrame;                         ///< counter for frames prior to the random access point to skip
    69   Int           m_outputBitDepthY;                    ///< bit depth used for writing output (luma)
    70   Int           m_outputBitDepthC;                    ///< bit depth used for writing output (chroma)t
     70  Int           m_iSkipFrame;                           ///< counter for frames prior to the random access point to skip
     71  Int           m_outputBitDepth[MAX_NUM_CHANNEL_TYPE]; ///< bit depth used for writing output
     72  InputColourSpaceConversion m_outputColourSpaceConvert;
    7173
    7274  Int           m_iMaxTemporalLayer;                  ///< maximum temporal layer to be decoded
    7375  Int           m_decodedPictureHashSEIEnabled;       ///< Checksum(3)/CRC(2)/MD5(1)/disable(0) acting on decoded picture hash SEI message
     76  Bool          m_decodedNoDisplaySEIEnabled;         ///< Enable(true)/disable(false) writing only pictures that get displayed based on the no display SEI message
     77  std::vector<Int> m_targetDecLayerIdSet;             ///< set of LayerIds to be included in the sub-bitstream extraction process.
     78#if NH_MV
     79  Bool          m_targetDecLayerIdSetFileEmpty;       ///< indication if target layers are given by file
     80#endif
    7481
    75   std::vector<Int> m_targetDecLayerIdSet;             ///< set of LayerIds to be included in the sub-bitstream extraction process.
    76 #if H_MV
    77   Bool          m_targetDecLayerIdSetFileEmpty;      ///< indication if target layers are given by file
     82  Int           m_respectDefDispWindow;               ///< Only output content inside the default display window
     83#if O0043_BEST_EFFORT_DECODING
     84  UInt          m_forceDecodeBitDepth;                ///< if non-zero, force the bit depth at the decoder (best effort decoding)
    7885#endif
    79   Int           m_respectDefDispWindow;               ///< Only output content inside the default display window
    80 
    81 #if H_MV
     86  std::string   m_outputDecodedSEIMessagesFilename;   ///< filename to output decoded SEI messages to. If '-', then use stdout. If empty, do not output details.
     87  Bool          m_bClipOutputVideoToRec709Range;      ///< If true, clip the output video to the Rec 709 range on saving.
     88#if NH_MV
    8289  Bool          m_outputVpsInfo;                     ///< Output VPS information
    8390  Void xAppendToFileNameEnd( Char* pchInputFileName, const Char* pchStringToAppend, Char*& rpchOutputFileName); ///< create filenames
    8491#endif
     92
    8593public:
    8694  TAppDecCfg()
     
    8896  , m_pchReconFile(NULL)
    8997  , m_iSkipFrame(0)
    90   , m_outputBitDepthY(0)
    91   , m_outputBitDepthC(0)
     98  , m_outputColourSpaceConvert(IPCOLOURSPACE_UNCHANGED)
    9299  , m_iMaxTemporalLayer(-1)
    93100  , m_decodedPictureHashSEIEnabled(0)
    94 #if H_MV
     101  , m_decodedNoDisplaySEIEnabled(false)
     102#if NH_MV
    95103  , m_targetDecLayerIdSetFileEmpty(true)
    96104#endif
    97105  , m_respectDefDispWindow(0)
    98   {}
     106#if O0043_BEST_EFFORT_DECODING
     107  , m_forceDecodeBitDepth(0)
     108#endif
     109  {
     110    for (UInt channelTypeIndex = 0; channelTypeIndex < MAX_NUM_CHANNEL_TYPE; channelTypeIndex++)
     111    {
     112      m_outputBitDepth[channelTypeIndex] = 0;
     113    }
     114  }
     115
    99116  virtual ~TAppDecCfg() {}
    100  
     117
    101118  Bool  parseCfg        ( Int argc, Char* argv[] );   ///< initialize option class from configuration
    102119};
  • branches/HTM-14.1-update-dev0/source/App/TAppDecoder/TAppDecTop.cpp

    r1196 r1200  
    22 * License, included below. This software may be subject to other third party
    33 * and contributor rights, including patent rights, and no such rights are
    4  * granted under this license. 
     4 * granted under this license.
    55 *
    6 * Copyright (c) 2010-2015, ITU/ISO/IEC
     6 * Copyright (c) 2010-2015, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    4545#include "TLibDecoder/AnnexBread.h"
    4646#include "TLibDecoder/NALread.h"
     47#if RExt__DECODER_DEBUG_BIT_STATISTICS
     48#include "TLibCommon/TComCodingStatistics.h"
     49#endif
    4750
    4851//! \ingroup TAppDecoder
     
    5457
    5558TAppDecTop::TAppDecTop()
    56 #if !H_MV
     59#if !NH_MV
    5760: m_iPOCLastDisplay(-MAX_INT)
    5861#else
     
    6063#endif
    6164{
    62 #if H_MV
     65#if NH_MV
    6366  for (Int i = 0; i < MAX_NUM_LAYER_IDS; i++)
    6467  {
     
    6770  }
    6871#endif
    69 #if H_3D
     72#if NH_3D
    7073    m_pScaleOffsetFile  = 0;
    7174#endif
    7275
    73 #if H_MV
     76#if NH_MV
    7477    m_markedForOutput = false;
    7578#endif
     
    8386Void TAppDecTop::destroy()
    8487{
     88#if NH_MV
     89  // destroy internal classes
     90  xDestroyDecLib();
     91#endif
     92
    8593  if (m_pchBitstreamFile)
    8694  {
     
    8896    m_pchBitstreamFile = NULL;
    8997  }
    90 #if H_MV
     98#if NH_MV
    9199  for (Int decIdx = 0; decIdx < m_numDecoders; decIdx++)
    92100  {
     
    103111    m_pchReconFile = NULL;
    104112  }
    105 #if H_3D
     113#if NH_3D
    106114  if (m_pchScaleOffsetFile)
    107115  {
     
    127135{
    128136  Int                 poc;
    129 #if H_MV
     137#if NH_MV
    130138  poc = -1;
    131139#endif
     
    138146    exit(EXIT_FAILURE);
    139147  }
    140 
    141 #if H_3D
     148#if NH_3D
    142149  if( m_pchScaleOffsetFile )
    143150  {
     
    146153  }
    147154#endif
     155
    148156  InputByteStream bytestream(bitstreamFile);
     157
     158  if (!m_outputDecodedSEIMessagesFilename.empty() && m_outputDecodedSEIMessagesFilename!="-")
     159  {
     160    m_seiMessageFileStream.open(m_outputDecodedSEIMessagesFilename.c_str(), std::ios::out);
     161    if (!m_seiMessageFileStream.is_open() || !m_seiMessageFileStream.good())
     162    {
     163      fprintf(stderr, "\nUnable to open file `%s' for writing decoded SEI messages\n", m_outputDecodedSEIMessagesFilename.c_str());
     164      exit(EXIT_FAILURE);
     165    }
     166  }
    149167
    150168  // create & initialize internal classes
    151169  xCreateDecLib();
    152170  xInitDecLib  ();
    153 #if !H_MV
     171#if !NH_MV
    154172  m_iPOCLastDisplay += m_iSkipFrame;      // set the last displayed POC correctly for skip forward.
    155173
     
    169187  Bool firstSlice        = true;
    170188#endif
    171   Bool loopFiltered      = false;
     189  Bool loopFiltered = false;
    172190
    173191  while (!!bitstreamFile)
     
    177195     * requires the TDecTop::decode() method to be called again with the same
    178196     * nal unit. */
     197#if RExt__DECODER_DEBUG_BIT_STATISTICS
     198    TComCodingStatistics::TComCodingStatisticsData backupStats(TComCodingStatistics::GetStatistics());
     199    streampos location = bitstreamFile.tellg() - streampos(bytestream.GetNumBufferedBytes());
     200#else
    179201    streampos location = bitstreamFile.tellg();
    180 #if H_MV
     202#endif
     203#if NH_MV
    181204#if ENC_DEC_TRACE
    182205    Int64 symCount = g_nSymbolCounter;
     
    184207#endif
    185208    AnnexBStats stats = AnnexBStats();
    186     vector<uint8_t> nalUnit;
     209
    187210    InputNALUnit nalu;
    188     byteStreamNALUnit(bytestream, nalUnit, stats);
     211    byteStreamNALUnit(bytestream, nalu.getBitstream().getFifo(), stats);
    189212
    190213    // call actual decoding function
    191214    Bool bNewPicture = false;
    192 #if H_MV
     215#if NH_MV
    193216    Bool newSliceDiffPoc   = false;
    194217    Bool newSliceDiffLayer = false;
     
    196219    Bool allLayersDecoded  = false;     
    197220#endif
    198     if (nalUnit.empty())
     221    if (nalu.getBitstream().getFifo().empty())
    199222    {
    200223      /* this can happen if the following occur:
     
    207230    else
    208231    {
    209       read(nalu, nalUnit);
    210 #if H_MV     
     232      read(nalu);
     233#if NH_MV     
    211234      if( (m_iMaxTemporalLayer >= 0 && nalu.m_temporalId > m_iMaxTemporalLayer)
    212235          || !isNaluWithinTargetDecLayerIdSet(&nalu)
    213           || nalu.m_layerId > MAX_NUM_LAYER_IDS-1
    214           || (nalu.m_nalUnitType == NAL_UNIT_VPS && nalu.m_layerId > 0)           
    215           || (nalu.m_nalUnitType == NAL_UNIT_EOB && nalu.m_layerId > 0)   
    216           || (nalu.m_nalUnitType == NAL_UNIT_EOS && nalu.m_layerId > 0)   
     236          || nalu.m_nuhLayerId > MAX_NUM_LAYER_IDS-1
     237          || (nalu.m_nalUnitType == NAL_UNIT_VPS && nalu.m_nuhLayerId > 0)           
     238          || (nalu.m_nalUnitType == NAL_UNIT_EOB && nalu.m_nuhLayerId > 0)             
    217239         )
    218240      {
     
    225247      else
    226248      {
    227         Int decIdx     = xGetDecoderIdx( nalu.m_layerId , true );     
    228         newSliceDiffLayer = nalu.isSlice() && ( nalu.m_layerId != layerIdCurrPic ) && !firstSlice;
     249        Int decIdx     = xGetDecoderIdx( nalu.m_nuhLayerId , true );     
     250        newSliceDiffLayer = nalu.isSlice() && ( nalu.m_nuhLayerId != layerIdCurrPic ) && !firstSlice;
    229251        newSliceDiffPoc   = m_tDecTop[decIdx]->decode(nalu, m_iSkipFrame, m_pocLastDisplay[decIdx], newSliceDiffLayer, sliceSkippedFlag );
    230252        // decode function only returns true when all of the following conditions are true
     
    233255        // - nalu.isSlice() == true     
    234256
    235         if ( nalu.m_nalUnitType == NAL_UNIT_VPS )
    236         {
    237           m_vps = m_tDecTop[decIdx]->getPrefetchedVPS();
     257        bNewPicture       = ( newSliceDiffLayer || newSliceDiffPoc ) && !sliceSkippedFlag;
     258        if ( nalu.isSlice() && firstSlice && !sliceSkippedFlag )       
     259        {
     260          layerIdCurrPic = nalu.m_nuhLayerId;
     261          pocCurrPic     = m_tDecTop[decIdx]->getCurrPoc();
     262          decIdxCurrPic  = decIdx;
     263          firstSlice     = false;
     264
     265          /// Use VPS activated by the first slice to determine OLS
     266          m_vps = m_tDecTop[decIdx]->getActiveVPS( );
    238267          if ( m_targetDecLayerIdSetFileEmpty )
    239           {
    240             TComVPS* vps = m_vps;
     268          {           
    241269            if ( m_targetOptLayerSetIdx == -1 )
    242270            {
    243               // Not normative! Corresponds to specification by "External Means". (Should be set equal to 0, when no external means available. )
    244               m_targetOptLayerSetIdx = vps->getVpsNumLayerSetsMinus1();
     271              m_targetOptLayerSetIdx = m_tDecTop[decIdx]->getTargetOlsIdx();
    245272            }
    246 
    247             for (Int dI = 0; dI < m_numDecoders; dI++ )
     273            else
    248274            {
    249               m_tDecTop[decIdx]->setTargetOptLayerSetIdx( m_targetOptLayerSetIdx );
    250 #if H_3D
    251               m_tDecTop[decIdx]->setProfileIdc( );
    252 #endif
     275              assert( m_tDecTop[decIdx]->getTargetOlsIdx() == m_targetOptLayerSetIdx );
    253276            }
    254277
    255             if ( m_targetOptLayerSetIdx < 0 || m_targetOptLayerSetIdx >= vps->getNumOutputLayerSets() )
     278            if ( m_targetOptLayerSetIdx < 0 || m_targetOptLayerSetIdx >= m_vps->getNumOutputLayerSets() )
    256279            {
    257               fprintf(stderr, "\ntarget output layer set index must be in the range of 0 to %d, inclusive \n", vps->getNumOutputLayerSets() - 1 );           
     280              fprintf(stderr, "\ntarget output layer set index must be in the range of 0 to %d, inclusive \n", m_vps->getNumOutputLayerSets() - 1 );           
    258281              exit(EXIT_FAILURE);
    259282            }
    260             m_targetDecLayerIdSet = vps->getTargetDecLayerIdList( m_targetOptLayerSetIdx );
     283            m_targetDecLayerIdSet = m_vps->getTargetDecLayerIdList( m_targetOptLayerSetIdx );
    261284          }
     285
    262286          if (m_outputVpsInfo )
    263287          {
     
    267291            m_vps->printPTL();
    268292          }
    269         }
    270 #if H_3D
    271         if (nalu.m_nalUnitType == NAL_UNIT_VPS )
    272         {                 
    273           m_cCamParsCollector.init( m_pScaleOffsetFile, m_tDecTop[decIdx]->getPrefetchedVPS() );
    274         }       
    275 #endif
    276         bNewPicture       = ( newSliceDiffLayer || newSliceDiffPoc ) && !sliceSkippedFlag;
    277         if ( nalu.isSlice() && firstSlice && !sliceSkippedFlag )       
    278         {
    279           layerIdCurrPic = nalu.m_layerId;
    280           pocCurrPic     = m_tDecTop[decIdx]->getCurrPoc();
    281           decIdxCurrPic  = decIdx;
    282           firstSlice     = false;
    283         }
    284 
    285         if ( bNewPicture || !bitstreamFile )
     293        }       
     294
     295        if ( bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS )
    286296        {
    287297          layerIdLastPic    = layerIdCurrPic;
    288           layerIdCurrPic    = nalu.m_layerId;
     298          layerIdCurrPic    = nalu.m_nuhLayerId;
    289299          pocLastPic        = pocCurrPic;
    290300          pocCurrPic        = m_tDecTop[decIdx]->getCurrPoc();
    291301          decIdxLastPic     = decIdxCurrPic;
    292302          decIdxCurrPic     = decIdx;
    293           allLayersDecoded = ( pocCurrPic != pocLastPic );
     303          allLayersDecoded = ( pocCurrPic != pocLastPic ) && ( nalu.m_nalUnitType != NAL_UNIT_EOS );
    294304        }
    295305#else
     
    309319           * [1] except for the first NAL unit in the file
    310320           *     (but bNewPicture doesn't happen then) */
     321#if RExt__DECODER_DEBUG_BIT_STATISTICS
     322          bitstreamFile.seekg(location);
     323          bytestream.reset();
     324          TComCodingStatistics::SetStatistics(backupStats);
     325#else
    311326          bitstreamFile.seekg(location-streamoff(3));
    312327          bytestream.reset();
     328#endif
    313329#if H_MV_ENC_DEC_TRAC
    314330#if ENC_DEC_TRACE
     
    327343      }
    328344    }
    329     if (bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS )
     345
     346    if ( (bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS) &&
     347#if NH_MV     
     348      !m_tDecTop[decIdxLastPic]->getFirstSliceInSequence () )
     349#else
     350      !m_cTDecTop.getFirstSliceInSequence () )
     351#endif
     352
    330353    {
    331354      if (!loopFiltered || bitstreamFile)
    332355      {
    333 #if H_MV
     356#if NH_MV
    334357        assert( decIdxLastPic != -1 );
    335358        m_tDecTop[decIdxLastPic]->endPicDecoding(poc, pcListPic, m_targetDecLayerIdSet );
     
    340363      }
    341364      loopFiltered = (nalu.m_nalUnitType == NAL_UNIT_EOS);
    342     }
    343 #if !FIX_WRITING_OUTPUT
    344 #if SETTING_NO_OUT_PIC_PRIOR
    345     if (bNewPicture && m_cTDecTop.getIsNoOutputPriorPics())
    346     {
    347       m_cTDecTop.checkNoOutputPriorPics( pcListPic );
    348     }
    349 #endif
    350 #endif
    351 #if H_3D
     365      if (nalu.m_nalUnitType == NAL_UNIT_EOS)
     366      {
     367#if NH_MV     
     368        m_tDecTop[decIdxLastPic]->setFirstSliceInSequence(true);
     369#else
     370        m_cTDecTop.setFirstSliceInSequence(true);
     371#endif
     372      }
     373    }
     374    else if ( (bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS ) &&
     375#if NH_MV     
     376              m_tDecTop[decIdxLastPic]->getFirstSliceInSequence () )
     377#else
     378              m_cTDecTop.getFirstSliceInSequence () )
     379#endif
     380    {
     381#if NH_MV     
     382      m_tDecTop[decIdxLastPic]->setFirstSliceInPicture (true);
     383#else
     384      m_cTDecTop.setFirstSliceInPicture (true);
     385#endif
     386    }
     387
     388#if NH_3D
    352389    if ( allLayersDecoded || !bitstreamFile )
    353390    {
     
    363400    if( pcListPic )
    364401    {
    365 #if H_MV
     402#if NH_MV
    366403      if ( m_pchReconFiles[decIdxLastPic] && !m_reconOpen[decIdxLastPic] )
    367404#else
    368       if ( m_pchReconFile && !openedReconFile  )
    369 #endif
    370       {
    371         if (!m_outputBitDepthY) { m_outputBitDepthY = g_bitDepthY; }
    372         if (!m_outputBitDepthC) { m_outputBitDepthC = g_bitDepthC; }
    373 
    374 #if H_MV
    375         m_tVideoIOYuvReconFile[decIdxLastPic]->open( m_pchReconFiles[decIdxLastPic], true, m_outputBitDepthY, m_outputBitDepthC, g_bitDepthY, g_bitDepthC ); // write mode
     405      if ( m_pchReconFile && !openedReconFile )
     406#endif
     407      {
     408        const BitDepths &bitDepths=pcListPic->front()->getPicSym()->getSPS().getBitDepths(); // use bit depths of first reconstructed picture.
     409        for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
     410        {
     411          if (m_outputBitDepth[channelType] == 0)
     412          {
     413            m_outputBitDepth[channelType] = bitDepths.recon[channelType];
     414          }
     415        }
     416#if NH_MV
     417        m_tVideoIOYuvReconFile[decIdxLastPic]->open( m_pchReconFiles[decIdxLastPic], true, m_outputBitDepth, m_outputBitDepth, bitDepths.recon ); // write mode
    376418        m_reconOpen[decIdxLastPic] = true;
    377419      }
    378 #if FIX_WRITING_OUTPUT
    379420      // write reconstruction to file
    380421      if( bNewPicture )
     
    388429        xWriteOutput( pcListPic, decIdxLastPic, nalu.m_temporalId );
    389430      }
    390 #if SETTING_NO_OUT_PIC_PRIOR
    391431      if ( (bNewPicture || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_CRA) && m_tDecTop[decIdxLastPic]->getNoOutputPriorPicsFlag() )
    392432      {
     
    394434        m_tDecTop[decIdxLastPic]->setNoOutputPriorPicsFlag (false);
    395435      }
    396 #endif
    397 #endif
     436
    398437      if ( bNewPicture && newSliceDiffPoc &&
    399438#else
    400         m_cTVideoIOYuvReconFile.open( m_pchReconFile, true, m_outputBitDepthY, m_outputBitDepthC, g_bitDepthY, g_bitDepthC ); // write mode
    401         openedReconFile  = true;
    402       }
    403 #if FIX_WRITING_OUTPUT
     439        m_cTVideoIOYuvReconFile.open( m_pchReconFile, true, m_outputBitDepth, m_outputBitDepth, bitDepths.recon ); // write mode
     440        openedReconFile = true;
     441      }
    404442      // write reconstruction to file
    405443      if( bNewPicture )
     
    407445        xWriteOutput( pcListPic, nalu.m_temporalId );
    408446      }
    409 #if SETTING_NO_OUT_PIC_PRIOR
    410447      if ( (bNewPicture || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_CRA) && m_cTDecTop.getNoOutputPriorPicsFlag() )
    411448      {
     
    413450        m_cTDecTop.setNoOutputPriorPicsFlag (false);
    414451      }
    415 #endif
    416 #endif
    417       if ( bNewPicture &&
     452
     453      if ( bNewPicture &&
    418454#endif
    419455           (   nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL
     
    423459            || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_LP ) )
    424460      {
    425 #if H_MV
     461#if NH_MV
    426462        xFlushOutput( pcListPic, decIdxLastPic );
    427463#else
     
    431467      if (nalu.m_nalUnitType == NAL_UNIT_EOS)
    432468      {
    433 #if H_MV
    434 #if FIX_OUTPUT_EOS
    435         xWriteOutput( pcListPic, decIdxLastPic, nalu.m_temporalId );
    436 #else
    437         xFlushOutput( pcListPic, decIdxLastPic );
    438 #endif
    439 #else
    440 #if FIX_OUTPUT_EOS
     469#if NH_MV
     470        xWriteOutput( pcListPic, decIdxCurrPic, nalu.m_temporalId );
     471#else
    441472        xWriteOutput( pcListPic, nalu.m_temporalId );
    442 #else
    443         xFlushOutput( pcListPic );
    444 #endif
    445 
    446 #endif
    447       }
    448       // write reconstruction to file -- for additional bumping as defined in C.5.2.3
    449 #if H_MV
     473#endif
     474#if NH_MV
     475        m_tDecTop[decIdxCurrPic]->setFirstSliceInPicture (false);
     476#else
     477        m_cTDecTop.setFirstSliceInPicture (false);
     478#endif
     479      }
     480      // write reconstruction to file -- for additional bumping as defined in C.5.2.3
     481#if NH_MV
    450482      // Above comment seems to be wrong
    451483#endif
    452 #if FIX_WRITING_OUTPUT
    453484      if(!bNewPicture && nalu.m_nalUnitType >= NAL_UNIT_CODED_SLICE_TRAIL_N && nalu.m_nalUnitType <= NAL_UNIT_RESERVED_VCL31)
    454 #else
    455       if(bNewPicture)
    456 #endif
    457       {
    458 #if H_MV       
     485      {
     486#if NH_MV       
    459487        // Bumping after reference picture set has been applied (here after first vcl nalu.
    460488#if ENC_DEC_TRACE
     
    471499    }
    472500  }
    473 #if H_MV
    474 #if H_3D
     501#if NH_MV
     502#if NH_3D
    475503  if( m_cCamParsCollector.isInitialized() )
    476504  {
     
    486514  // delete buffers
    487515  m_cTDecTop.deletePicBuffer();
    488 #endif
    489      
    490516  // destroy internal classes
    491517  xDestroyDecLib();
     518#endif
    492519}
    493520
     
    498525Void TAppDecTop::xCreateDecLib()
    499526{
    500 #if H_MV
     527#if NH_MV
    501528  // initialize global variables
    502529  initROM(); 
     
    512539Void TAppDecTop::xDestroyDecLib()
    513540{
    514 #if H_MV
     541#if NH_MV
    515542  // destroy ROM
    516543  destroyROM();
     
    538565    m_cTVideoIOYuvReconFile. close();
    539566  }
    540  
     567
    541568  // destroy decoder class
    542569  m_cTDecTop.destroy();
    543570#endif
    544 #if H_3D
     571#if NH_3D
    545572  m_cCamParsCollector.uninit();
    546573  if( m_pScaleOffsetFile )
     
    553580Void TAppDecTop::xInitDecLib()
    554581{
    555 #if !H_MV
     582
     583#if NH_3D
     584  m_cCamParsCollector.setCodeScaleOffsetFile( m_pScaleOffsetFile );
     585#endif
     586#if !NH_MV
    556587  // initialize decoder class
    557588  m_cTDecTop.init();
    558589  m_cTDecTop.setDecodedPictureHashSEIEnabled(m_decodedPictureHashSEIEnabled);
     590#if O0043_BEST_EFFORT_DECODING
     591  m_cTDecTop.setForceDecodeBitDepth(m_forceDecodeBitDepth);
     592#endif
     593  if (!m_outputDecodedSEIMessagesFilename.empty())
     594  {
     595    std::ostream &os=m_seiMessageFileStream.is_open() ? m_seiMessageFileStream : std::cout;
     596    m_cTDecTop.setDecodedSEIMessageOutputStream(&os);
     597  }
    559598#endif
    560599}
    561600
    562601/** \param pcListPic list of pictures to be written to file
    563     \todo            DYN_REF_FREE should be revised
     602    \param tId       temporal sub-layer ID
    564603 */
    565 #if H_MV
     604#if NH_MV
    566605Void TAppDecTop::xWriteOutput( TComList<TComPic*>* pcListPic, Int decIdx, Int tId )
    567606#else
     
    569608#endif
    570609{
    571 
    572610  if (pcListPic->empty())
    573611  {
     
    578616  Int numPicsNotYetDisplayed = 0;
    579617  Int dpbFullness = 0;
    580 #if H_MV
    581   TComSPS* activeSPS = m_tDecTop[ decIdx ]->getActiveSPS();
    582 #else
    583   TComSPS* activeSPS = m_cTDecTop.getActiveSPS();
    584 #endif
     618  const TComSPS* activeSPS = &(pcListPic->front()->getPicSym()->getSPS());
     619
    585620  UInt numReorderPicsHighestTid;
    586621  UInt maxDecPicBufferingHighestTid;
     
    597632    maxDecPicBufferingHighestTid = activeSPS->getMaxDecPicBuffering(m_iMaxTemporalLayer);
    598633  }
    599  
     634
    600635  while (iterPic != pcListPic->end())
    601636  {
    602637    TComPic* pcPic = *(iterPic);
    603 #if H_MV
     638#if NH_MV
    604639    if(pcPic->getOutputMark() && pcPic->getPOC() > m_pocLastDisplay[decIdx])
    605640#else
     
    607642#endif
    608643    {
    609       numPicsNotYetDisplayed++;
     644       numPicsNotYetDisplayed++;
    610645      dpbFullness++;
    611646    }
     
    616651    iterPic++;
    617652  }
    618   iterPic   = pcListPic->begin();
     653
     654  iterPic = pcListPic->begin();
     655
    619656  if (numPicsNotYetDisplayed>2)
    620657  {
    621658    iterPic++;
    622659  }
    623  
     660
    624661  TComPic* pcPic = *(iterPic);
    625662  if (numPicsNotYetDisplayed>2 && pcPic->isField()) //Field Decoding
     
    633670      iterPic++;
    634671      TComPic* pcPicBottom = *(iterPic);
    635      
    636 #if H_MV
    637       if ( pcPicTop->getOutputMark() && (numPicsNotYetDisplayed >  pcPicTop->getNumReorderPics(tId) && !(pcPicTop->getPOC()%2) && pcPicBottom->getPOC() == pcPicTop->getPOC()+1)
    638           && pcPicBottom->getOutputMark() && (numPicsNotYetDisplayed >  pcPicBottom->getNumReorderPics(tId) && (pcPicTop->getPOC() == m_pocLastDisplay[decIdx]+1 || m_pocLastDisplay[decIdx]<0)))
     672
     673#if NH_MV
     674      if ( pcPicTop->getOutputMark() && pcPicBottom->getOutputMark() &&
     675        (numPicsNotYetDisplayed >  numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid) &&
     676        (!(pcPicTop->getPOC()%2) && pcPicBottom->getPOC() == pcPicTop->getPOC()+1) &&
     677        (pcPicTop->getPOC() == m_pocLastDisplay[decIdx]+1 || m_pocLastDisplay[decIdx] < 0))
    639678#else
    640679      if ( pcPicTop->getOutputMark() && pcPicBottom->getOutputMark() &&
     
    646685        // write to file
    647686        numPicsNotYetDisplayed = numPicsNotYetDisplayed-2;
    648 #if H_MV
     687#if NH_MV
    649688      if ( m_pchReconFiles[decIdx] )
    650689#else
     
    653692        {
    654693          const Window &conf = pcPicTop->getConformanceWindow();
    655           const Window &defDisp = m_respectDefDispWindow ? pcPicTop->getDefDisplayWindow() : Window();
    656 
     694          const Window  defDisp = m_respectDefDispWindow ? pcPicTop->getDefDisplayWindow() : Window();
    657695          const Bool isTff = pcPicTop->isTopField();
    658 #if H_MV
     696
     697          Bool display = true;
     698          if( m_decodedNoDisplaySEIEnabled )
     699          {
     700            SEIMessages noDisplay = getSeisByType(pcPic->getSEIs(), SEI::NO_DISPLAY );
     701            const SEINoDisplay *nd = ( noDisplay.size() > 0 ) ? (SEINoDisplay*) *(noDisplay.begin()) : NULL;
     702            if( (nd != NULL) && nd->m_noDisplay )
     703            {
     704              display = false;
     705            }
     706          }
     707
     708          if (display)
     709          {
     710#if NH_MV
    659711        assert( conf   .getScaledFlag() );
    660712        assert( defDisp.getScaledFlag() );
     
    667719        m_tVideoIOYuvReconFile[decIdx]->write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),
    668720#else
    669           m_cTVideoIOYuvReconFile.write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),
    670 #endif
    671                                         conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
    672                                         conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
    673                                         conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
    674                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), isTff );
    675         }
    676        
     721        m_cTVideoIOYuvReconFile.write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),
     722#endif
     723                                           m_outputColourSpaceConvert,
     724                                           conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
     725                                           conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
     726                                           conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
     727#if NH_3D
     728                                           conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), m_depth420OutputFlag && pcPicTop->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT, isTff );
     729#else
     730                                           conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), NUM_CHROMA_FORMAT, isTff );
     731#endif
     732          }
     733        }
     734
    677735        // update POC of display order
    678 #if H_MV
     736#if NH_MV
    679737        m_pocLastDisplay[decIdx] = pcPic->getPOC();
    680738#else
    681739        m_iPOCLastDisplay = pcPicBottom->getPOC();
    682740#endif
    683        
     741
    684742        // erase non-referenced picture in the reference picture list after display
    685743        if ( !pcPicTop->getSlice(0)->isReferenced() && pcPicTop->getReconMark() == true )
    686744        {
    687 #if !DYN_REF_FREE
    688745          pcPicTop->setReconMark(false);
    689          
     746
    690747          // mark it should be extended later
    691748          pcPicTop->getPicYuvRec()->setBorderExtension( false );
    692          
    693 #else
    694           pcPicTop->destroy();
    695           pcListPic->erase( iterPic );
    696           iterPic = pcListPic->begin(); // to the beginning, non-efficient way, have to be revised!
    697           continue;
    698 #endif
    699749        }
    700750        if ( !pcPicBottom->getSlice(0)->isReferenced() && pcPicBottom->getReconMark() == true )
    701751        {
    702 #if !DYN_REF_FREE
    703752          pcPicBottom->setReconMark(false);
    704          
     753
    705754          // mark it should be extended later
    706755          pcPicBottom->getPicYuvRec()->setBorderExtension( false );
    707          
    708 #else
    709           pcPicBottom->destroy();
    710           pcListPic->erase( iterPic );
    711           iterPic = pcListPic->begin(); // to the beginning, non-efficient way, have to be revised!
    712           continue;
    713 #endif
    714756        }
    715757        pcPicTop->setOutputMark(false);
     
    721763  {
    722764    iterPic = pcListPic->begin();
     765
    723766    while (iterPic != pcListPic->end())
    724767    {
    725768      pcPic = *(iterPic);
    726769
    727 #if H_MV
     770#if NH_MV
    728771      if(pcPic->getOutputMark() && pcPic->getPOC() > m_pocLastDisplay[decIdx] &&
    729772        (numPicsNotYetDisplayed >  numReorderPicsHighestTid || dpbFullness > maxDecPicBufferingHighestTid))
     
    734777      {
    735778        // write to file
    736         numPicsNotYetDisplayed--;
     779         numPicsNotYetDisplayed--;
    737780        if(pcPic->getSlice(0)->isReferenced() == false)
    738781        {
    739782          dpbFullness--;
    740783        }
    741 #if H_MV
     784#if NH_MV
    742785      if ( m_pchReconFiles[decIdx] )
    743786#else
     
    745788#endif
    746789        {
    747           const Window &conf = pcPic->getConformanceWindow();
    748           const Window &defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window();
    749 #if H_MV
     790          const Window &conf    = pcPic->getConformanceWindow();
     791          const Window defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window();
     792#if NH_MV
    750793        assert( conf   .getScaledFlag() );
    751794        assert( defDisp.getScaledFlag() );
     
    760803          m_cTVideoIOYuvReconFile.write( pcPic->getPicYuvRec(),
    761804#endif
    762                                         conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
    763                                         conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
    764                                         conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
    765                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset() );
    766         }
    767        
     805                                         m_outputColourSpaceConvert,
     806                                         conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
     807                                         conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
     808                                         conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
     809                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(),
     810#if NH_3D
     811                                          m_depth420OutputFlag && pcPic->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT,
     812#else
     813                                          NUM_CHROMA_FORMAT,
     814#endif
     815           m_bClipOutputVideoToRec709Range   );
     816        }
     817
    768818        // update POC of display order
    769 #if H_MV
     819#if NH_MV
    770820        m_pocLastDisplay[decIdx] = pcPic->getPOC();
    771821#else
    772822        m_iPOCLastDisplay = pcPic->getPOC();
    773823#endif
    774        
     824
    775825        // erase non-referenced picture in the reference picture list after display
    776826        if ( !pcPic->getSlice(0)->isReferenced() && pcPic->getReconMark() == true )
    777827        {
    778 #if !DYN_REF_FREE
    779828          pcPic->setReconMark(false);
    780          
     829
    781830          // mark it should be extended later
    782831          pcPic->getPicYuvRec()->setBorderExtension( false );
    783          
    784 #else
    785           pcPic->destroy();
    786           pcListPic->erase( iterPic );
    787           iterPic = pcListPic->begin(); // to the beginning, non-efficient way, have to be revised!
    788           continue;
    789 #endif
    790832        }
    791833        pcPic->setOutputMark(false);
    792 #if H_MV
     834#if NH_MV
    793835        pcPic->setPicOutputFlag(false);
    794836#endif
    795837      }
    796      
     838
    797839      iterPic++;
    798840    }
    799841  }
    800842}
     843
    801844/** \param pcListPic list of pictures to be written to file
    802     \todo            DYN_REF_FREE should be revised
    803845 */
    804 #if H_MV
     846#if NH_MV
    805847Void TAppDecTop::xFlushOutput( TComList<TComPic*>* pcListPic, Int decIdx )
    806848#else
     
    813855  }
    814856  TComList<TComPic*>::iterator iterPic   = pcListPic->begin();
    815  
     857
    816858  iterPic   = pcListPic->begin();
    817859  TComPic* pcPic = *(iterPic);
    818  
     860
    819861  if (pcPic->isField()) //Field Decoding
    820862  {
     
    827869      iterPic++;
    828870      pcPicBottom = *(iterPic);
    829      
     871
    830872      if ( pcPicTop->getOutputMark() && pcPicBottom->getOutputMark() && !(pcPicTop->getPOC()%2) && (pcPicBottom->getPOC() == pcPicTop->getPOC()+1) )
    831873      {
    832874        // write to file
    833 #if H_MV
     875#if NH_MV
    834876      if ( m_pchReconFiles[decIdx] )
    835877#else
     
    838880        {
    839881          const Window &conf = pcPicTop->getConformanceWindow();
    840           const Window &defDisp = m_respectDefDispWindow ? pcPicTop->getDefDisplayWindow() : Window();
     882          const Window  defDisp = m_respectDefDispWindow ? pcPicTop->getDefDisplayWindow() : Window();
    841883          const Bool isTff = pcPicTop->isTopField();
    842 #if H_MV
     884#if NH_MV
    843885        assert( conf   .getScaledFlag() );
    844886        assert( defDisp.getScaledFlag() );
     
    853895          m_cTVideoIOYuvReconFile.write( pcPicTop->getPicYuvRec(), pcPicBottom->getPicYuvRec(),
    854896#endif
    855                                         conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
    856                                         conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
    857                                         conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
    858                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), isTff );
    859         }
    860        
     897                                         m_outputColourSpaceConvert,
     898                                         conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
     899                                         conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
     900                                         conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
     901#if NH_3D
     902                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), m_depth420OutputFlag && pcPicTop->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT, isTff );
     903#else
     904                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(), NUM_CHROMA_FORMAT, isTff );
     905#endif
     906        }
     907
    861908        // update POC of display order
    862 #if H_MV
     909#if NH_MV
    863910      m_pocLastDisplay[decIdx] = pcPic->getPOC();
    864911#else
    865       m_iPOCLastDisplay = pcPicBottom->getPOC();
     912        m_iPOCLastDisplay = pcPicBottom->getPOC();
    866913#endif       
    867914        // erase non-referenced picture in the reference picture list after display
    868915        if ( !pcPicTop->getSlice(0)->isReferenced() && pcPicTop->getReconMark() == true )
    869916        {
    870 #if !DYN_REF_FREE
    871917          pcPicTop->setReconMark(false);
    872          
     918
    873919          // mark it should be extended later
    874920          pcPicTop->getPicYuvRec()->setBorderExtension( false );
    875          
    876 #else
    877           pcPicTop->destroy();
    878           pcListPic->erase( iterPic );
    879           iterPic = pcListPic->begin(); // to the beginning, non-efficient way, have to be revised!
    880           continue;
    881 #endif
    882921        }
    883922        if ( !pcPicBottom->getSlice(0)->isReferenced() && pcPicBottom->getReconMark() == true )
    884923        {
    885 #if !DYN_REF_FREE
    886924          pcPicBottom->setReconMark(false);
    887          
     925
    888926          // mark it should be extended later
    889927          pcPicBottom->getPicYuvRec()->setBorderExtension( false );
    890          
    891 #else
    892           pcPicBottom->destroy();
    893           pcListPic->erase( iterPic );
    894           iterPic = pcListPic->begin(); // to the beginning, non-efficient way, have to be revised!
    895           continue;
    896 #endif
    897928        }
    898929        pcPicTop->setOutputMark(false);
    899930        pcPicBottom->setOutputMark(false);
    900        
    901 #if !DYN_REF_FREE
     931
    902932        if(pcPicTop)
    903933        {
     
    906936          pcPicTop = NULL;
    907937        }
    908 #endif
    909938      }
    910939    }
     
    921950    {
    922951      pcPic = *(iterPic);
    923      
     952
    924953      if ( pcPic->getOutputMark() )
    925954      {
    926955        // write to file
    927 #if H_MV
     956#if NH_MV
    928957      if ( m_pchReconFiles[decIdx] )
    929958#else
     
    931960#endif
    932961        {
    933           const Window &conf = pcPic->getConformanceWindow();
    934           const Window &defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window();
    935 #if H_MV
     962          const Window &conf    = pcPic->getConformanceWindow();
     963          const Window  defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window();
     964#if NH_MV
    936965        assert( conf   .getScaledFlag() );
    937966        assert( defDisp.getScaledFlag() );
     
    946975          m_cTVideoIOYuvReconFile.write( pcPic->getPicYuvRec(),
    947976#endif
    948                                         conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
    949                                         conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
    950                                         conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
    951                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset() );
    952         }
    953        
     977                                         m_outputColourSpaceConvert,
     978                                         conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
     979                                         conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
     980                                         conf.getWindowTopOffset() + defDisp.getWindowTopOffset(),
     981                                         conf.getWindowBottomOffset() + defDisp.getWindowBottomOffset(),
     982#if NH_3D
     983                                         m_depth420OutputFlag && pcPic->getIsDepth() ? CHROMA_420 : NUM_CHROMA_FORMAT
     984#else
     985                                         NUM_CHROMA_FORMAT
     986#endif
     987                                         , m_bClipOutputVideoToRec709Range);
     988        }
     989
    954990        // update POC of display order
    955 #if H_MV
     991#if NH_MV
    956992      m_pocLastDisplay[decIdx] = pcPic->getPOC();
    957993#else
    958994        m_iPOCLastDisplay = pcPic->getPOC();
    959995#endif
    960        
     996
    961997        // erase non-referenced picture in the reference picture list after display
    962998        if ( !pcPic->getSlice(0)->isReferenced() && pcPic->getReconMark() == true )
    963999        {
    964 #if !DYN_REF_FREE
    9651000          pcPic->setReconMark(false);
    966          
     1001
    9671002          // mark it should be extended later
    9681003          pcPic->getPicYuvRec()->setBorderExtension( false );
    969          
    970 #else
    971           pcPic->destroy();
    972           pcListPic->erase( iterPic );
    973           iterPic = pcListPic->begin(); // to the beginning, non-efficient way, have to be revised!
    974           continue;
    975 #endif
    9761004        }
    9771005        pcPic->setOutputMark(false);
    978 #if H_MV
     1006#if NH_MV
    9791007        pcPic->setPicOutputFlag(false);
    9801008#endif
    9811009      }
    982 #if !H_MV
    983 #if !DYN_REF_FREE
    984       if(pcPic)
     1010#if !NH_MV
     1011      if(pcPic != NULL)
    9851012      {
    9861013        pcPic->destroy();
     
    9881015        pcPic = NULL;
    9891016      }
    990 #endif   
    9911017#endif
    9921018      iterPic++;
    9931019    }
    9941020  }
    995 #if H_MV
     1021#if NH_MV
    9961022  m_pocLastDisplay[decIdx] = -MAX_INT;
    9971023#else
     
    10111037  for (std::vector<Int>::iterator it = m_targetDecLayerIdSet.begin(); it != m_targetDecLayerIdSet.end(); it++)
    10121038  {
    1013 #if H_MV
    1014     if ( nalu->m_layerId == (*it) )
    1015 #else
    1016     if ( nalu->m_reservedZero6Bits == (*it) )
     1039#if NH_MV
     1040    if ( nalu->m_nuhLayerId == (*it) )
     1041#else
     1042    if ( nalu->m_nuhLayerId == (*it) )
    10171043#endif
    10181044    {
     
    10231049}
    10241050
    1025 #if H_MV
     1051#if NH_MV
    10261052Int TAppDecTop::xGetDecoderIdx( Int layerId, Bool createFlag /*= false */ )
    10271053{
     
    10521078    m_tDecTop[ decIdx ]->setIvPicLists( &m_ivPicLists );
    10531079    m_tDecTop[ decIdx ]->setLayerInitilizedFlags( m_layerInitilizedFlags );
    1054     m_tDecTop[ decIdx ]->setTargetOptLayerSetIdx( m_targetOptLayerSetIdx );   
    1055 #if H_3D
    1056     m_tDecTop[ decIdx ]->setProfileIdc           ( );   
    1057 #endif
    1058 
    1059 #if H_3D
     1080    m_tDecTop[ decIdx ]->setTargetOlsIdx( m_targetOptLayerSetIdx );   
     1081#if O0043_BEST_EFFORT_DECODING
     1082    m_cTDecTop[ decIdx ]->setForceDecodeBitDepth(m_forceDecodeBitDepth);
     1083#endif
     1084    if (!m_outputDecodedSEIMessagesFilename.empty())
     1085    {
     1086      std::ostream &os=m_seiMessageFileStream.is_open() ? m_seiMessageFileStream : std::cout;
     1087      m_tDecTop[ decIdx ]->setDecodedSEIMessageOutputStream(&os);
     1088    }
     1089#if NH_3D
    10601090   m_tDecTop[ decIdx ]->setCamParsCollector( &m_cCamParsCollector );
    10611091#endif
  • branches/HTM-14.1-update-dev0/source/App/TAppDecoder/TAppDecTop.h

    r1179 r1200  
    22 * License, included below. This software may be subject to other third party
    33 * and contributor rights, including patent rights, and no such rights are
    4  * granted under this license. 
     4 * granted under this license.
    55 *
    6 * Copyright (c) 2010-2015, ITU/ISO/IEC
     6 * Copyright (c) 2010-2015, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    6161private:
    6262  // class interface
    63 #if H_MV
     63#if NH_MV
    6464  TDecTop*                        m_tDecTop             [ MAX_NUM_LAYERS ];    ///< decoder classes
    6565  TVideoIOYuv*                    m_tVideoIOYuvReconFile[ MAX_NUM_LAYERS ];    ///< reconstruction YUV class
     
    6868  TComPicLists                    m_ivPicLists;                                ///< picture buffers of decoder instances
    6969  Bool                            m_layerInitilizedFlags[ MAX_NUM_LAYER_IDS ]; ///< for layerwise startup
    70   TComVPS*                        m_vps;                                ///< active VPS
     70  const TComVPS*                  m_vps;                                ///< active VPS
    7171#else
    7272  TDecTop                         m_cTDecTop;                     ///< decoder class
    7373  TVideoIOYuv                     m_cTVideoIOYuvReconFile;        ///< reconstruction YUV class
    7474#endif
    75     // for output control
    76 #if H_MV
     75  // for output control
     76#if NH_MV
    7777  Int                             m_pocLastDisplay      [ MAX_NUM_LAYERS ]; ///< last POC in display order
    7878  Bool                            m_reconOpen           [ MAX_NUM_LAYERS ]; ///< reconstruction file opened
     
    8181  Int                             m_iPOCLastDisplay;              ///< last POC in display order
    8282#endif
     83  std::ofstream                   m_seiMessageFileStream;         ///< Used for outputing SEI messages.
    8384
    84 #if H_3D
     85#if NH_3D
    8586  FILE*                           m_pScaleOffsetFile;
    8687  CamParsCollector                m_cCamParsCollector;
     
    8990  TAppDecTop();
    9091  virtual ~TAppDecTop() {}
    91  
     92
    9293  Void  create            (); ///< create internal members
    9394  Void  destroy           (); ///< destroy internal members
    9495  Void  decode            (); ///< main decoding function
     96#if NH_MV
     97  UInt  getNumberOfChecksumErrorsDetected( ) const
     98  {
     99    UInt numOfChecksumErrors = 0;
     100    for (Int i = 0; i < m_numDecoders; i++ )
     101    {
     102      numOfChecksumErrors += getNumberOfChecksumErrorsDetected( i );
     103    }
     104    return numOfChecksumErrors;
     105  }
     106
     107  UInt  getNumberOfChecksumErrorsDetected( Int decIdx ) const { return m_tDecTop[decIdx]->getNumberOfChecksumErrorsDetected(); }
     108
     109#else
     110  UInt  getNumberOfChecksumErrorsDetected() const { return m_cTDecTop.getNumberOfChecksumErrorsDetected(); }
     111#endif
    95112
    96113protected:
     
    99116  Void  xInitDecLib       (); ///< initialize decoder class
    100117
    101 #if H_MV
     118#if NH_MV
    102119  Void  xWriteOutput      ( TComList<TComPic*>* pcListPic, Int layerId, Int tId ); ///< write YUV to file
    103120
  • branches/HTM-14.1-update-dev0/source/App/TAppDecoder/decmain.cpp

    r1179 r1200  
    22 * License, included below. This software may be subject to other third party
    33 * and contributor rights, including patent rights, and no such rights are
    4  * granted under this license. 
     4 * granted under this license.
    55 *
    6 * Copyright (c) 2010-2015, ITU/ISO/IEC
     6 * Copyright (c) 2010-2015, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    4444//! \{
    4545
    46 bool g_md5_mismatch = false; ///< top level flag that indicates if there has been a decoding mismatch
    47 
    4846// ====================================================================================================================
    4947// Main function
     
    5250int main(int argc, char* argv[])
    5351{
     52  Int returnCode = EXIT_SUCCESS;
    5453  TAppDecTop  cTAppDecTop;
    5554
    5655  // print information
    5756  fprintf( stdout, "\n" );
    58 #if H_MV
     57#if NH_MV
    5958  fprintf( stdout, "3D-HTM Software: Decoder Version [%s] based on HM Version [%s]", NV_VERSION, HM_VERSION ); 
    6059#else
    61   fprintf( stdout, "HM software: Decoder Version [%s]", NV_VERSION );
     60  fprintf( stdout, "HM software: Decoder Version [%s] (including RExt)", NV_VERSION );
    6261#endif
    6362  fprintf( stdout, NVM_ONOS );
     
    7372  {
    7473    cTAppDecTop.destroy();
    75     return 1;
     74    returnCode = EXIT_FAILURE;
     75    return returnCode;
    7676  }
    7777
    7878  // starting time
    79   double dResult;
    80   long lBefore = clock();
     79  Double dResult;
     80  clock_t lBefore = clock();
    8181
    8282  // call decoding function
    8383  cTAppDecTop.decode();
    8484
    85   if (g_md5_mismatch)
     85  if (cTAppDecTop.getNumberOfChecksumErrorsDetected() != 0)
    8686  {
    8787    printf("\n\n***ERROR*** A decoding mismatch occured: signalled md5sum does not match\n");
     88    returnCode = EXIT_FAILURE;
    8889  }
    8990
    9091  // ending time
    91   dResult = (double)(clock()-lBefore) / CLOCKS_PER_SEC;
     92  dResult = (Double)(clock()-lBefore) / CLOCKS_PER_SEC;
    9293  printf("\n Total Time: %12.3f sec.\n", dResult);
    9394
     
    9596  cTAppDecTop.destroy();
    9697
    97   return g_md5_mismatch ? EXIT_FAILURE : EXIT_SUCCESS;
     98  return returnCode;
    9899}
    99100
  • branches/HTM-14.1-update-dev0/source/App/TAppEncoder/TAppEncCfg.cpp

    r1196 r1200  
    22 * License, included below. This software may be subject to other third party
    33 * and contributor rights, including patent rights, and no such rights are
    4  * granted under this license. 
     4 * granted under this license.
    55 *
    6 * Copyright (c) 2010-2015, ITU/ISO/IEC
     6 * Copyright (c) 2010-2015, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    3636*/
    3737
     38#include <stdio.h>
    3839#include <stdlib.h>
    3940#include <cassert>
    4041#include <cstring>
    4142#include <string>
     43#include <limits>
    4244#include "TLibCommon/TComRom.h"
    4345#include "TAppEncCfg.h"
    44 
    45 static istream& operator>>(istream &, Level::Name &);
    46 static istream& operator>>(istream &, Level::Tier &);
    47 static istream& operator>>(istream &, Profile::Name &);
    48 
    4946#include "TAppCommon/program_options_lite.h"
    5047#include "TLibEncoder/TEncRateCtrl.h"
     
    5350#endif
    5451
     52#define MACRO_TO_STRING_HELPER(val) #val
     53#define MACRO_TO_STRING(val) MACRO_TO_STRING_HELPER(val)
     54
    5555using namespace std;
    5656namespace po = df::program_options_lite;
     57
     58
     59
     60enum ExtendedProfileName // this is used for determining profile strings, where multiple profiles map to a single profile idc with various constraint flag combinations
     61{
     62  NONE = 0,
     63  MAIN = 1,
     64  MAIN10 = 2,
     65  MAINSTILLPICTURE = 3,
     66  MAINREXT = 4,
     67  HIGHTHROUGHPUTREXT = 5, // Placeholder profile for development
     68  // The following are RExt profiles, which would map to the MAINREXT profile idc.
     69  // The enumeration indicates the bit-depth constraint in the bottom 2 digits
     70  //                           the chroma format in the next digit
     71    //                           the intra constraint in the next digit
     72//                           If it is a RExt still picture, there is a '1' for the top digit.
     73#if NH_MV
     74  MULTIVIEWMAIN = 6,
     75#if NH_3D
     76  MAIN3D = 8,
     77#endif
     78#endif
     79  MONOCHROME_8      = 1008,
     80  MONOCHROME_12     = 1012,
     81  MONOCHROME_16     = 1016,
     82  MAIN_12           = 1112,
     83  MAIN_422_10       = 1210,
     84  MAIN_422_12       = 1212,
     85  MAIN_444          = 1308,
     86  MAIN_444_10       = 1310,
     87  MAIN_444_12       = 1312,
     88  MAIN_444_16       = 1316, // non-standard profile definition, used for development purposes
     89  MAIN_INTRA        = 2108,
     90  MAIN_10_INTRA     = 2110,
     91  MAIN_12_INTRA     = 2112,
     92  MAIN_422_10_INTRA = 2210,
     93  MAIN_422_12_INTRA = 2212,
     94  MAIN_444_INTRA    = 2308,
     95  MAIN_444_10_INTRA = 2310,
     96  MAIN_444_12_INTRA = 2312,
     97  MAIN_444_16_INTRA = 2316,
     98  MAIN_444_STILL_PICTURE = 11308,
     99  MAIN_444_16_STILL_PICTURE = 12316
     100};
     101
    57102
    58103//! \ingroup TAppEncoder
     
    64109
    65110TAppEncCfg::TAppEncCfg()
    66 #if H_MV
     111#if NH_MV
    67112: m_pchBitstreamFile()
    68113#else
     
    71116, m_pchReconFile()
    72117#endif
     118, m_inputColourSpaceConvert(IPCOLOURSPACE_UNCHANGED)
     119, m_snrInternalColourSpace(false)
     120, m_outputInternalColourSpace(false)
    73121, m_pchdQPFile()
    74122, m_scalingListFile()
    75123{
    76 #if !H_MV
     124#if !NH_MV
    77125  m_aidQP = NULL;
    78126#endif
     
    88136TAppEncCfg::~TAppEncCfg()
    89137{
    90 #if H_MV
     138#if NH_MV
    91139  for( Int layer = 0; layer < m_aidQP.size(); layer++ )
    92140  {
     
    123171    m_targetPivotValue = NULL;
    124172  }
    125 #if !H_MV
     173#if !NH_MV
    126174  free(m_pchInputFile);
    127175#endif
    128176  free(m_pchBitstreamFile);
    129 #if H_MV
     177#if NH_MV
    130178  for(Int i = 0; i< m_pchReconFileList.size(); i++ )
    131179  {
     
    138186  free(m_pchdQPFile);
    139187  free(m_scalingListFile);
    140 #if H_MV
     188#if NH_MV
    141189  for( Int i = 0; i < m_GOPListMvc.size(); i++ )
    142190  {
     
    148196  }
    149197#endif
    150 #if H_3D
    151 #if H_3D_VSO
     198#if NH_3D
     199#if NH_3D_VSO
    152200  if (  m_pchVSOConfig != NULL)
     201  {
    153202    free (  m_pchVSOConfig );
     203  }
    154204#endif
    155205  if ( m_pchCameraParameterFile != NULL )
     206  {
    156207    free ( m_pchCameraParameterFile );
     208  }
    157209
    158210  if ( m_pchBaseViewCameraNumbers != NULL )
     211  {
    159212    free ( m_pchBaseViewCameraNumbers );
     213  }
    160214#endif
    161215}
     
    185239  }
    186240  in>>entry.m_interRPSPrediction;
    187 #if AUTO_INTER_RPS
    188241  if (entry.m_interRPSPrediction==1)
    189242  {
     
    199252    in>>entry.m_deltaRPS;
    200253  }
    201 #else
    202   if (entry.m_interRPSPrediction)
    203   {
    204     in>>entry.m_deltaRPS;
    205     in>>entry.m_numRefIdc;
    206     for ( Int i = 0; i < entry.m_numRefIdc; i++ )
    207     {
    208       in>>entry.m_refIdc[i];
    209     }
    210   }
    211 #endif
    212 #if H_MV
     254#if NH_MV
    213255  in>>entry.m_numActiveRefLayerPics;
    214256  for( Int i = 0; i < entry.m_numActiveRefLayerPics; i++ )
     
    225267  }
    226268#endif
    227 #if H_3D
     269#if NH_3D
    228270  in>>entry.m_interCompPredFlag;
    229271#endif
     272
    230273  return in;
    231274}
    232275
    233 static const struct MapStrToProfile {
     276Bool confirmPara(Bool bflag, const Char* message);
     277
     278static inline ChromaFormat numberToChromaFormat(const Int val)
     279{
     280  switch (val)
     281  {
     282    case 400: return CHROMA_400; break;
     283    case 420: return CHROMA_420; break;
     284    case 422: return CHROMA_422; break;
     285    case 444: return CHROMA_444; break;
     286    default:  return NUM_CHROMA_FORMAT;
     287  }
     288}
     289
     290static const struct MapStrToProfile
     291{
    234292  const Char* str;
    235293  Profile::Name value;
    236 } strToProfile[] = {
    237   {"none", Profile::NONE},
    238   {"main", Profile::MAIN},
    239   {"main10", Profile::MAIN10},
    240   {"main-still-picture", Profile::MAINSTILLPICTURE},
    241 #if H_MV
    242   {"multiview-main", Profile::MULTIVIEWMAIN},
    243 #if H_3D
    244   {"3d-main"       , Profile::MAIN3D},
    245 #endif
    246 
    247 #endif
     294}
     295strToProfile[] =
     296{
     297  {"none",                 Profile::NONE               },
     298  {"main",                 Profile::MAIN               },
     299  {"main10",               Profile::MAIN10             },
     300  {"main-still-picture",   Profile::MAINSTILLPICTURE   },
     301  {"main-RExt",            Profile::MAINREXT           },
     302  {"high-throughput-RExt", Profile::HIGHTHROUGHPUTREXT }
     303#if NH_MV
     304  ,{"multiview-main"     , Profile::MULTIVIEWMAIN      },
     305#if NH_3D
     306   {"3d-main"            , Profile::MAIN3D             }
     307#endif
     308#endif
     309
    248310};
    249311
    250 static const struct MapStrToTier {
     312static const struct MapStrToExtendedProfile
     313{
     314  const Char* str;
     315  ExtendedProfileName value;
     316}
     317strToExtendedProfile[] =
     318{
     319    {"none",               NONE             },
     320    {"main",               MAIN             },
     321    {"main10",             MAIN10           },
     322    {"main_still_picture",        MAINSTILLPICTURE },
     323    {"main-still-picture",        MAINSTILLPICTURE },
     324    {"main_RExt",                 MAINREXT         },
     325    {"main-RExt",                 MAINREXT         },
     326    {"main_rext",                 MAINREXT         },
     327    {"main-rext",                 MAINREXT         },
     328    {"high_throughput_RExt",      HIGHTHROUGHPUTREXT },
     329    {"high-throughput-RExt",      HIGHTHROUGHPUTREXT },
     330    {"high_throughput_rext",      HIGHTHROUGHPUTREXT },
     331    {"high-throughput-rext",      HIGHTHROUGHPUTREXT },
     332#if NH_MV
     333    {"multiview-main"     , MULTIVIEWMAIN   },
     334#if NH_3D
     335    {"3d-main"            , MAIN3D          },
     336#endif
     337#endif
     338    {"monochrome",         MONOCHROME_8     },
     339    {"monochrome12",       MONOCHROME_12    },
     340    {"monochrome16",       MONOCHROME_16    },
     341    {"main12",             MAIN_12          },
     342    {"main_422_10",        MAIN_422_10      },
     343    {"main_422_12",        MAIN_422_12      },
     344    {"main_444",           MAIN_444         },
     345    {"main_444_10",        MAIN_444_10      },
     346    {"main_444_12",        MAIN_444_12      },
     347    {"main_444_16",        MAIN_444_16      },
     348    {"main_intra",         MAIN_INTRA       },
     349    {"main_10_intra",      MAIN_10_INTRA    },
     350    {"main_12_intra",      MAIN_12_INTRA    },
     351    {"main_422_10_intra",  MAIN_422_10_INTRA},
     352    {"main_422_12_intra",  MAIN_422_12_INTRA},
     353    {"main_444_intra",     MAIN_444_INTRA   },
     354    {"main_444_still_picture",    MAIN_444_STILL_PICTURE },
     355    {"main_444_10_intra",  MAIN_444_10_INTRA},
     356    {"main_444_12_intra",  MAIN_444_12_INTRA},
     357    {"main_444_16_intra",         MAIN_444_16_INTRA},
     358    {"main_444_16_still_picture", MAIN_444_16_STILL_PICTURE }
     359};
     360
     361static const ExtendedProfileName validRExtProfileNames[2/* intraConstraintFlag*/][4/* bit depth constraint 8=0, 10=1, 12=2, 16=3*/][4/*chroma format*/]=
     362{
     363    {
     364        { MONOCHROME_8,  NONE,          NONE,              MAIN_444          }, // 8-bit  inter for 400, 420, 422 and 444
     365        { NONE,          NONE,          MAIN_422_10,       MAIN_444_10       }, // 10-bit inter for 400, 420, 422 and 444
     366        { MONOCHROME_12, MAIN_12,       MAIN_422_12,       MAIN_444_12       }, // 12-bit inter for 400, 420, 422 and 444
     367        { MONOCHROME_16, NONE,          NONE,              MAIN_444_16       }  // 16-bit inter for 400, 420, 422 and 444 (the latter is non standard used for development)
     368    },
     369    {
     370        { NONE,          MAIN_INTRA,    NONE,              MAIN_444_INTRA    }, // 8-bit  intra for 400, 420, 422 and 444
     371        { NONE,          MAIN_10_INTRA, MAIN_422_10_INTRA, MAIN_444_10_INTRA }, // 10-bit intra for 400, 420, 422 and 444
     372        { NONE,          MAIN_12_INTRA, MAIN_422_12_INTRA, MAIN_444_12_INTRA }, // 12-bit intra for 400, 420, 422 and 444
     373        { NONE,          NONE,          NONE,              MAIN_444_16_INTRA }  // 16-bit intra for 400, 420, 422 and 444
     374    }
     375};
     376
     377static const struct MapStrToTier
     378{
    251379  const Char* str;
    252380  Level::Tier value;
    253 } strToTier[] = {
     381}
     382strToTier[] =
     383{
    254384  {"main", Level::MAIN},
    255385  {"high", Level::HIGH},
    256386};
    257387
    258 static const struct MapStrToLevel {
     388static const struct MapStrToLevel
     389{
    259390  const Char* str;
    260391  Level::Name value;
    261 } strToLevel[] = {
     392}
     393strToLevel[] =
     394{
    262395  {"none",Level::NONE},
    263396  {"1",   Level::LEVEL1},
     
    274407  {"6.1", Level::LEVEL6_1},
    275408  {"6.2", Level::LEVEL6_2},
     409  {"8.5", Level::LEVEL8_5},
    276410};
    277411
     412static const struct MapStrToCostMode
     413{
     414  const Char* str;
     415  CostMode    value;
     416}
     417strToCostMode[] =
     418{
     419  {"lossy",                     COST_STANDARD_LOSSY},
     420  {"sequence_level_lossless",   COST_SEQUENCE_LEVEL_LOSSLESS},
     421  {"lossless",                  COST_LOSSLESS_CODING},
     422  {"mixed_lossless_lossy",      COST_MIXED_LOSSLESS_LOSSY_CODING}
     423};
     424
     425static const struct MapStrToScalingListMode
     426{
     427  const Char* str;
     428  ScalingListMode value;
     429}
     430strToScalingListMode[] =
     431{
     432  {"0",       SCALING_LIST_OFF},
     433  {"1",       SCALING_LIST_DEFAULT},
     434  {"2",       SCALING_LIST_FILE_READ},
     435  {"off",     SCALING_LIST_OFF},
     436  {"default", SCALING_LIST_DEFAULT},
     437  {"file",    SCALING_LIST_FILE_READ}
     438};
     439
    278440template<typename T, typename P>
    279 static istream& readStrToEnum(P map[], unsigned long mapLen, istream &in, T &val)
     441static std::string enumToString(P map[], UInt mapLen, const T val)
     442{
     443  for (UInt i = 0; i < mapLen; i++)
     444  {
     445    if (val == map[i].value)
     446    {
     447      return map[i].str;
     448    }
     449  }
     450  return std::string();
     451}
     452
     453template<typename T, typename P>
     454static istream& readStrToEnum(P map[], UInt mapLen, istream &in, T &val)
    280455{
    281456  string str;
    282457  in >> str;
    283458
    284   for (Int i = 0; i < mapLen; i++)
     459  for (UInt i = 0; i < mapLen; i++)
    285460  {
    286461    if (str == map[i].str)
     
    296471}
    297472
    298 static istream& operator>>(istream &in, Profile::Name &profile)
     473//inline to prevent compiler warnings for "unused static function"
     474
     475static inline istream& operator >> (istream &in, ExtendedProfileName &profile)
    299476{
    300   return readStrToEnum(strToProfile, sizeof(strToProfile)/sizeof(*strToProfile), in, profile);
     477  return readStrToEnum(strToExtendedProfile, sizeof(strToExtendedProfile)/sizeof(*strToExtendedProfile), in, profile);
    301478}
    302479
    303 static istream& operator>>(istream &in, Level::Tier &tier)
     480namespace Level
    304481{
    305   return readStrToEnum(strToTier, sizeof(strToTier)/sizeof(*strToTier), in, tier);
     482  static inline istream& operator >> (istream &in, Tier &tier)
     483  {
     484    return readStrToEnum(strToTier, sizeof(strToTier)/sizeof(*strToTier), in, tier);
     485  }
     486
     487  static inline istream& operator >> (istream &in, Name &level)
     488  {
     489    return readStrToEnum(strToLevel, sizeof(strToLevel)/sizeof(*strToLevel), in, level);
     490  }
    306491}
    307492
    308 static istream& operator>>(istream &in, Level::Name &level)
     493static inline istream& operator >> (istream &in, CostMode &mode)
    309494{
    310   return readStrToEnum(strToLevel, sizeof(strToLevel)/sizeof(*strToLevel), in, level);
     495  return readStrToEnum(strToCostMode, sizeof(strToCostMode)/sizeof(*strToCostMode), in, mode);
    311496}
    312497
     498static inline istream& operator >> (istream &in, ScalingListMode &mode)
     499{
     500  return readStrToEnum(strToScalingListMode, sizeof(strToScalingListMode)/sizeof(*strToScalingListMode), in, mode);
     501}
     502
     503template <class T>
     504struct SMultiValueInput
     505{
     506  const T              minValIncl;
     507  const T              maxValIncl; // Use 0 for unlimited
     508  const std::size_t    minNumValuesIncl;
     509  const std::size_t    maxNumValuesIncl; // Use 0 for unlimited
     510        std::vector<T> values;
     511  SMultiValueInput() : minValIncl(0), maxValIncl(0), minNumValuesIncl(0), maxNumValuesIncl(0), values() { }
     512  SMultiValueInput(std::vector<T> &defaults) : minValIncl(0), maxValIncl(0), minNumValuesIncl(0), maxNumValuesIncl(0), values(defaults) { }
     513  SMultiValueInput(const T &minValue, const T &maxValue, std::size_t minNumberValues=0, std::size_t maxNumberValues=0)
     514    : minValIncl(minValue), maxValIncl(maxValue), minNumValuesIncl(minNumberValues), maxNumValuesIncl(maxNumberValues), values()  { }
     515  SMultiValueInput(const T &minValue, const T &maxValue, std::size_t minNumberValues, std::size_t maxNumberValues, const T* defValues, const UInt numDefValues)
     516    : minValIncl(minValue), maxValIncl(maxValue), minNumValuesIncl(minNumberValues), maxNumValuesIncl(maxNumberValues), values(defValues, defValues+numDefValues)  { }
     517  SMultiValueInput<T> &operator=(const std::vector<T> &userValues) { values=userValues; return *this; }
     518  SMultiValueInput<T> &operator=(const SMultiValueInput<T> &userValues) { values=userValues.values; return *this; }
     519};
     520
     521static inline istream& operator >> (istream &in, SMultiValueInput<UInt> &values)
     522{
     523  values.values.clear();
     524  string str;
     525  while (!in.eof())
     526  {
     527    string tmp; in >> tmp; str+=" " + tmp;
     528  }
     529  if (!str.empty())
     530  {
     531    const Char *pStr=str.c_str();
     532    // soak up any whitespace
     533    for(;isspace(*pStr);pStr++);
     534
     535    while (*pStr != 0)
     536    {
     537      Char *eptr;
     538      UInt val=strtoul(pStr, &eptr, 0);
     539      if (*eptr!=0 && !isspace(*eptr) && *eptr!=',')
     540      {
     541        in.setstate(ios::failbit);
     542        break;
     543      }
     544      if (val<values.minValIncl || val>values.maxValIncl)
     545      {
     546        in.setstate(ios::failbit);
     547        break;
     548      }
     549
     550      if (values.maxNumValuesIncl != 0 && values.values.size() >= values.maxNumValuesIncl)
     551      {
     552        in.setstate(ios::failbit);
     553        break;
     554      }
     555      values.values.push_back(val);
     556      // soak up any whitespace and up to 1 comma.
     557      pStr=eptr;
     558      for(;isspace(*pStr);pStr++);
     559      if (*pStr == ',')
     560      {
     561        pStr++;
     562      }
     563      for(;isspace(*pStr);pStr++);
     564    }
     565  }
     566  if (values.values.size() < values.minNumValuesIncl)
     567  {
     568    in.setstate(ios::failbit);
     569  }
     570  return in;
     571}
     572
     573static inline istream& operator >> (istream &in, SMultiValueInput<Int> &values)
     574{
     575  values.values.clear();
     576  string str;
     577  while (!in.eof())
     578  {
     579    string tmp; in >> tmp; str+=" " + tmp;
     580  }
     581  if (!str.empty())
     582  {
     583    const Char *pStr=str.c_str();
     584    // soak up any whitespace
     585    for(;isspace(*pStr);pStr++);
     586
     587    while (*pStr != 0)
     588    {
     589      Char *eptr;
     590      Int val=strtol(pStr, &eptr, 0);
     591      if (*eptr!=0 && !isspace(*eptr) && *eptr!=',')
     592      {
     593        in.setstate(ios::failbit);
     594        break;
     595      }
     596      if (val<values.minValIncl || val>values.maxValIncl)
     597      {
     598        in.setstate(ios::failbit);
     599        break;
     600      }
     601
     602      if (values.maxNumValuesIncl != 0 && values.values.size() >= values.maxNumValuesIncl)
     603      {
     604        in.setstate(ios::failbit);
     605        break;
     606      }
     607      values.values.push_back(val);
     608      // soak up any whitespace and up to 1 comma.
     609      pStr=eptr;
     610      for(;isspace(*pStr);pStr++);
     611      if (*pStr == ',')
     612      {
     613        pStr++;
     614      }
     615      for(;isspace(*pStr);pStr++);
     616    }
     617  }
     618  if (values.values.size() < values.minNumValuesIncl)
     619  {
     620    in.setstate(ios::failbit);
     621  }
     622  return in;
     623}
     624
     625static inline istream& operator >> (istream &in, SMultiValueInput<Bool> &values)
     626{
     627  values.values.clear();
     628  string str;
     629  while (!in.eof())
     630  {
     631    string tmp; in >> tmp; str+=" " + tmp;
     632  }
     633  if (!str.empty())
     634  {
     635    const Char *pStr=str.c_str();
     636    // soak up any whitespace
     637    for(;isspace(*pStr);pStr++);
     638
     639    while (*pStr != 0)
     640    {
     641      Char *eptr;
     642      Int val=strtol(pStr, &eptr, 0);
     643      if (*eptr!=0 && !isspace(*eptr) && *eptr!=',')
     644      {
     645        in.setstate(ios::failbit);
     646        break;
     647      }
     648      if (val<Int(values.minValIncl) || val>Int(values.maxValIncl))
     649      {
     650        in.setstate(ios::failbit);
     651        break;
     652      }
     653
     654      if (values.maxNumValuesIncl != 0 && values.values.size() >= values.maxNumValuesIncl)
     655      {
     656        in.setstate(ios::failbit);
     657        break;
     658      }
     659      values.values.push_back(val!=0);
     660      // soak up any whitespace and up to 1 comma.
     661      pStr=eptr;
     662      for(;isspace(*pStr);pStr++);
     663      if (*pStr == ',')
     664      {
     665        pStr++;
     666      }
     667      for(;isspace(*pStr);pStr++);
     668    }
     669  }
     670  if (values.values.size() < values.minNumValuesIncl)
     671  {
     672    in.setstate(ios::failbit);
     673  }
     674  return in;
     675}
     676
     677static Void
     678automaticallySelectRExtProfile(const Bool bUsingGeneralRExtTools,
     679                               const Bool bUsingChromaQPAdjustment,
     680                               const Bool bUsingExtendedPrecision,
     681                               const Bool bIntraConstraintFlag,
     682                               UInt &bitDepthConstraint,
     683                               ChromaFormat &chromaFormatConstraint,
     684                               const Int  maxBitDepth,
     685                               const ChromaFormat chromaFormat)
     686{
     687  // Try to choose profile, according to table in Q1013.
     688  UInt trialBitDepthConstraint=maxBitDepth;
     689  if (trialBitDepthConstraint<8)
     690  {
     691    trialBitDepthConstraint=8;
     692  }
     693  else if (trialBitDepthConstraint==9 || trialBitDepthConstraint==11)
     694  {
     695    trialBitDepthConstraint++;
     696  }
     697  else if (trialBitDepthConstraint>12)
     698  {
     699    trialBitDepthConstraint=16;
     700  }
     701
     702  // both format and bit depth constraints are unspecified
     703  if (bUsingExtendedPrecision || trialBitDepthConstraint==16)
     704  {
     705    bitDepthConstraint = 16;
     706    chromaFormatConstraint = (!bIntraConstraintFlag && chromaFormat==CHROMA_400) ? CHROMA_400 : CHROMA_444;
     707  }
     708  else if (bUsingGeneralRExtTools)
     709  {
     710    if (chromaFormat == CHROMA_400 && !bIntraConstraintFlag)
     711    {
     712      bitDepthConstraint = 16;
     713      chromaFormatConstraint = CHROMA_400;
     714    }
     715    else
     716    {
     717      bitDepthConstraint = trialBitDepthConstraint;
     718      chromaFormatConstraint = CHROMA_444;
     719    }
     720  }
     721  else if (chromaFormat == CHROMA_400)
     722  {
     723    if (bIntraConstraintFlag)
     724    {
     725      chromaFormatConstraint = CHROMA_420; // there is no intra 4:0:0 profile.
     726      bitDepthConstraint     = trialBitDepthConstraint;
     727    }
     728    else
     729    {
     730      chromaFormatConstraint = CHROMA_400;
     731      bitDepthConstraint     = trialBitDepthConstraint == 8 ? 8 : 12;
     732    }
     733  }
     734  else
     735  {
     736    bitDepthConstraint = trialBitDepthConstraint;
     737    chromaFormatConstraint = chromaFormat;
     738    if (bUsingChromaQPAdjustment && chromaFormat == CHROMA_420)
     739    {
     740      chromaFormatConstraint = CHROMA_422; // 4:2:0 cannot use the chroma qp tool.
     741    }
     742    if (chromaFormatConstraint == CHROMA_422 && bitDepthConstraint == 8)
     743    {
     744      bitDepthConstraint = 10; // there is no 8-bit 4:2:2 profile.
     745    }
     746    if (chromaFormatConstraint == CHROMA_420 && !bIntraConstraintFlag)
     747    {
     748      bitDepthConstraint = 12; // there is no 8 or 10-bit 4:2:0 inter RExt profile.
     749    }
     750  }
     751}
    313752// ====================================================================================================================
    314753// Public member functions
     
    322761{
    323762  Bool do_help = false;
    324  
    325 #if !H_MV
     763
     764#if !NH_MV
    326765  string cfg_InputFile;
    327766#endif
    328767  string cfg_BitstreamFile;
    329 #if !H_MV
     768#if !NH_MV
    330769  string cfg_ReconFile;
    331770#endif
    332 #if H_MV
     771#if NH_MV
    333772  vector<Int>   cfg_dimensionLength;
    334773  string        cfg_profiles;
    335774  string        cfg_levels;
    336775  string        cfg_tiers;
    337 #if H_3D
     776#if NH_3D
    338777  cfg_dimensionLength.push_back( 2  );  // depth
    339778  cfg_dimensionLength.push_back( 32 );  // texture
     
    343782#endif
    344783  string cfg_dQPFile;
    345   string cfgColumnWidth;
    346   string cfgRowHeight;
    347784  string cfg_ScalingListFile;
    348   string cfg_startOfCodedInterval;
    349   string cfg_codedPivotValue;
    350   string cfg_targetPivotValue;
     785
     786  Int tmpChromaFormat;
     787  Int tmpInputChromaFormat;
     788  Int tmpConstraintChromaFormat;
     789  string inputColourSpaceConvert;
     790#if NH_MV
     791  std::vector<ExtendedProfileName> extendedProfiles;
     792#else
     793  ExtendedProfileName extendedProfile;
     794#endif
     795  Int saoOffsetBitShift[MAX_NUM_CHANNEL_TYPE];
     796
     797  // Multi-value input fields:                                // minval, maxval (incl), min_entries, max_entries (incl) [, default values, number of default values]
     798  SMultiValueInput<UInt> cfg_ColumnWidth                     (0, std::numeric_limits<UInt>::max(), 0, std::numeric_limits<UInt>::max());
     799  SMultiValueInput<UInt> cfg_RowHeight                       (0, std::numeric_limits<UInt>::max(), 0, std::numeric_limits<UInt>::max());
     800  SMultiValueInput<Int>  cfg_startOfCodedInterval            (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, 1<<16);
     801  SMultiValueInput<Int>  cfg_codedPivotValue                 (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, 1<<16);
     802  SMultiValueInput<Int>  cfg_targetPivotValue                (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, 1<<16);
     803
     804  const UInt defaultInputKneeCodes[3]  = { 600, 800, 900 };
     805  const UInt defaultOutputKneeCodes[3] = { 100, 250, 450 };
     806  SMultiValueInput<UInt> cfg_kneeSEIInputKneePointValue      (1,  999, 0, 999, defaultInputKneeCodes,  sizeof(defaultInputKneeCodes )/sizeof(UInt));
     807  SMultiValueInput<UInt> cfg_kneeSEIOutputKneePointValue     (0, 1000, 0, 999, defaultOutputKneeCodes, sizeof(defaultOutputKneeCodes)/sizeof(UInt));
     808  const Int defaultPrimaryCodes[6]     = { 0,50000, 0,0, 50000,0 };
     809  const Int defaultWhitePointCode[2]   = { 16667, 16667 };
     810  SMultiValueInput<Int>  cfg_DisplayPrimariesCode            (0, 50000, 3, 3, defaultPrimaryCodes,   sizeof(defaultPrimaryCodes  )/sizeof(Int));
     811  SMultiValueInput<Int>  cfg_DisplayWhitePointCode           (0, 50000, 2, 2, defaultWhitePointCode, sizeof(defaultWhitePointCode)/sizeof(Int));
     812
     813  SMultiValueInput<Bool> cfg_timeCodeSeiTimeStampFlag        (0,  1, 0, MAX_TIMECODE_SEI_SETS);
     814  SMultiValueInput<Bool> cfg_timeCodeSeiNumUnitFieldBasedFlag(0,  1, 0, MAX_TIMECODE_SEI_SETS);
     815  SMultiValueInput<Int>  cfg_timeCodeSeiCountingType         (0,  6, 0, MAX_TIMECODE_SEI_SETS);
     816  SMultiValueInput<Bool> cfg_timeCodeSeiFullTimeStampFlag    (0,  1, 0, MAX_TIMECODE_SEI_SETS);
     817  SMultiValueInput<Bool> cfg_timeCodeSeiDiscontinuityFlag    (0,  1, 0, MAX_TIMECODE_SEI_SETS);
     818  SMultiValueInput<Bool> cfg_timeCodeSeiCntDroppedFlag       (0,  1, 0, MAX_TIMECODE_SEI_SETS);
     819  SMultiValueInput<Int>  cfg_timeCodeSeiNumberOfFrames       (0,511, 0, MAX_TIMECODE_SEI_SETS);
     820  SMultiValueInput<Int>  cfg_timeCodeSeiSecondsValue         (0, 59, 0, MAX_TIMECODE_SEI_SETS);
     821  SMultiValueInput<Int>  cfg_timeCodeSeiMinutesValue         (0, 59, 0, MAX_TIMECODE_SEI_SETS);
     822  SMultiValueInput<Int>  cfg_timeCodeSeiHoursValue           (0, 23, 0, MAX_TIMECODE_SEI_SETS);
     823  SMultiValueInput<Bool> cfg_timeCodeSeiSecondsFlag          (0,  1, 0, MAX_TIMECODE_SEI_SETS);
     824  SMultiValueInput<Bool> cfg_timeCodeSeiMinutesFlag          (0,  1, 0, MAX_TIMECODE_SEI_SETS);
     825  SMultiValueInput<Bool> cfg_timeCodeSeiHoursFlag            (0,  1, 0, MAX_TIMECODE_SEI_SETS);
     826  SMultiValueInput<Int>  cfg_timeCodeSeiTimeOffsetLength     (0, 31, 0, MAX_TIMECODE_SEI_SETS);
     827  SMultiValueInput<Int>  cfg_timeCodeSeiTimeOffsetValue      (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, MAX_TIMECODE_SEI_SETS);
     828  Int warnUnknowParameter = 0;
     829
    351830  po::Options opts;
    352831  opts.addOptions()
    353   ("help", do_help, false, "this help text")
    354   ("c", po::parseConfigFile, "configuration file name")
    355  
     832  ("help",                                            do_help,                                          false, "this help text")
     833  ("c",    po::parseConfigFile, "configuration file name")
     834  ("WarnUnknowParameter,w",                           warnUnknowParameter,                                  0, "warn for unknown configuration parameters instead of failing")
     835
    356836  // File, I/O and source parameters
    357 #if H_MV
     837#if NH_MV
    358838  ("InputFile_%d,i_%d",       m_pchInputFileList,       (char *) 0 , MAX_NUM_LAYER_IDS , "original Yuv input file name %d")
    359839#else
    360   ("InputFile,i",           cfg_InputFile,     string(""), "Original YUV input file name")
    361 #endif
    362   ("BitstreamFile,b",       cfg_BitstreamFile, string(""), "Bitstream output file name")
    363 #if H_MV
     840  ("InputFile,i",                                     cfg_InputFile,                               string(""), "Original YUV input file name")
     841#endif
     842  ("BitstreamFile,b",                                 cfg_BitstreamFile,                          string(""), "Bitstream output file name")
     843#if NH_MV
    364844  ("ReconFile_%d,o_%d",       m_pchReconFileList,       (char *) 0 , MAX_NUM_LAYER_IDS , "reconstructed Yuv output file name %d")
    365845#else
    366   ("ReconFile,o",           cfg_ReconFile,     string(""), "Reconstructed YUV output file name")
    367 #endif
    368 #if H_MV
     846  ("ReconFile,o",                                     cfg_ReconFile,                               string(""), "Reconstructed YUV output file name")
     847#endif
     848#if NH_MV
    369849  ("NumberOfLayers",        m_numberOfLayers     , 1,                     "Number of layers")
    370 #if !H_3D
     850#if !NH_3D
    371851  ("ScalabilityMask",       m_scalabilityMask    , 2                    , "Scalability Mask: 2: Multiview, 8: Auxiliary, 10: Multiview + Auxiliary")   
    372852#else
     
    377857  ("ViewId",                m_viewId             , std::vector<Int>(1,0), "View Id per View Order Index")
    378858  ("AuxId",                 m_auxId              , std::vector<Int>(1,0), "AuxId per layer")
    379 #if H_3D
     859#if NH_3D
    380860  ("DepthFlag",             m_depthFlag          , std::vector<Int>(1,0), "Depth Flag")
    381 #if H_3D_DIM
    382   ("DLT",                   m_useDLT,           true,  "Depth lookup table")
    383 #endif
    384 #if H_3D
    385 #endif
    386861#endif
    387862  ("TargetEncLayerIdList",  m_targetEncLayerIdList, std::vector<Int>(0,0), "LayerIds in Nuh to be encoded") 
    388   ("LayerIdInNuh",          m_layerIdInNuh       , std::vector<Int>(1,0), "LayerId in Nuh") 
    389   ("SplittingFlag",         m_splittingFlag      , false                , "Splitting Flag")   
     863  ("LayerIdInNuh",          m_layerIdInNuh        , std::vector<Int>(1,0), "LayerId in Nuh") 
     864  ("SplittingFlag",         m_splittingFlag       , false                , "Splitting Flag")   
    390865
    391866  // Layer Sets + Output Layer Sets + Profile Tier Level
     
    406881  ("DependencyTypes_%d",    m_dependencyTypes    , std::vector<Int>(0,0), MAX_NUM_LAYERS, "Dependency types of direct reference layers, 0: Sample 1: Motion 2: Sample+Motion")
    407882#endif
    408   ("SourceWidth,-wdt",      m_iSourceWidth,        0, "Source picture width")
    409   ("SourceHeight,-hgt",     m_iSourceHeight,       0, "Source picture height")
    410   ("InputBitDepth",         m_inputBitDepthY,    8, "Bit-depth of input file")
    411   ("OutputBitDepth",        m_outputBitDepthY,   0, "Bit-depth of output file (default:InternalBitDepth)")
    412   ("InternalBitDepth",      m_internalBitDepthY, 0, "Bit-depth the codec operates at. (default:InputBitDepth)"
    413                                                        "If different to InputBitDepth, source data will be converted")
    414   ("InputBitDepthC",        m_inputBitDepthC,    0, "As per InputBitDepth but for chroma component. (default:InputBitDepth)")
    415   ("OutputBitDepthC",       m_outputBitDepthC,   0, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
    416   ("InternalBitDepthC",     m_internalBitDepthC, 0, "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth)")
    417   ("ConformanceMode",       m_conformanceWindowMode,  0, "Deprecated alias of ConformanceWindowMode")
    418   ("ConformanceWindowMode", m_conformanceWindowMode,  0, "Window conformance mode (0: no window, 1:automatic padding, 2:padding, 3:conformance")
    419   ("HorizontalPadding,-pdx",m_aiPad[0],            0, "Horizontal source padding for conformance window mode 2")
    420   ("VerticalPadding,-pdy",  m_aiPad[1],            0, "Vertical source padding for conformance window mode 2")
    421   ("ConfLeft",              m_confWinLeft,            0, "Deprecated alias of ConfWinLeft")
    422   ("ConfRight",             m_confWinRight,           0, "Deprecated alias of ConfWinRight")
    423   ("ConfTop",               m_confWinTop,             0, "Deprecated alias of ConfWinTop")
    424   ("ConfBottom",            m_confWinBottom,          0, "Deprecated alias of ConfWinBottom")
    425   ("ConfWinLeft",           m_confWinLeft,            0, "Left offset for window conformance mode 3")
    426   ("ConfWinRight",          m_confWinRight,           0, "Right offset for window conformance mode 3")
    427   ("ConfWinTop",            m_confWinTop,             0, "Top offset for window conformance mode 3")
    428   ("ConfWinBottom",         m_confWinBottom,          0, "Bottom offset for window conformance mode 3")
    429   ("FrameRate,-fr",         m_iFrameRate,          0, "Frame rate")
    430   ("FrameSkip,-fs",         m_FrameSkip,          0u, "Number of frames to skip at start of input YUV")
    431   ("FramesToBeEncoded,f",   m_framesToBeEncoded,   0, "Number of frames to be encoded (default=all)")
     883  ("SourceWidth,-wdt",                                m_iSourceWidth,                                       0, "Source picture width")
     884  ("SourceHeight,-hgt",                               m_iSourceHeight,                                      0, "Source picture height")
     885  ("InputBitDepth",                                   m_inputBitDepth[CHANNEL_TYPE_LUMA],                   8, "Bit-depth of input file")
     886  ("OutputBitDepth",                                  m_outputBitDepth[CHANNEL_TYPE_LUMA],                  0, "Bit-depth of output file (default:InternalBitDepth)")
     887  ("MSBExtendedBitDepth",                             m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA],             0, "bit depth of luma component after addition of MSBs of value 0 (used for synthesising High Dynamic Range source material). (default:InputBitDepth)")
     888  ("InternalBitDepth",                                m_internalBitDepth[CHANNEL_TYPE_LUMA],                0, "Bit-depth the codec operates at. (default:MSBExtendedBitDepth). If different to MSBExtendedBitDepth, source data will be converted")
     889  ("InputBitDepthC",                                  m_inputBitDepth[CHANNEL_TYPE_CHROMA],                 0, "As per InputBitDepth but for chroma component. (default:InputBitDepth)")
     890  ("OutputBitDepthC",                                 m_outputBitDepth[CHANNEL_TYPE_CHROMA],                0, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
     891  ("MSBExtendedBitDepthC",                            m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA],           0, "As per MSBExtendedBitDepth but for chroma component. (default:MSBExtendedBitDepth)")
     892  ("InternalBitDepthC",                               m_internalBitDepth[CHANNEL_TYPE_CHROMA],              0, "As per InternalBitDepth but for chroma component. (default:InternalBitDepth)")
     893  ("ExtendedPrecision",                               m_extendedPrecisionProcessingFlag,                false, "Increased internal accuracies to support high bit depths (not valid in V1 profiles)")
     894  ("HighPrecisionPredictionWeighting",                m_highPrecisionOffsetsEnabledFlag,                false, "Use high precision option for weighted prediction (not valid in V1 profiles)")
     895  ("InputColourSpaceConvert",                         inputColourSpaceConvert,                     string(""), "Colour space conversion to apply to input video. Permitted values are (empty string=UNCHANGED) " + getListOfColourSpaceConverts(true))
     896  ("SNRInternalColourSpace",                          m_snrInternalColourSpace,                         false, "If true, then no colour space conversion is applied prior to SNR, otherwise inverse of input is applied.")
     897  ("OutputInternalColourSpace",                       m_outputInternalColourSpace,                      false, "If true, then no colour space conversion is applied for reconstructed video, otherwise inverse of input is applied.")
     898  ("InputChromaFormat",                               tmpInputChromaFormat,                               420, "InputChromaFormatIDC")
     899  ("MSEBasedSequencePSNR",                            m_printMSEBasedSequencePSNR,                      false, "0 (default) emit sequence PSNR only as a linear average of the frame PSNRs, 1 = also emit a sequence PSNR based on an average of the frame MSEs")
     900  ("PrintFrameMSE",                                   m_printFrameMSE,                                  false, "0 (default) emit only bit count and PSNRs for each frame, 1 = also emit MSE values")
     901  ("PrintSequenceMSE",                                m_printSequenceMSE,                               false, "0 (default) emit only bit rate and PSNRs for the whole sequence, 1 = also emit MSE values")
     902  ("CabacZeroWordPaddingEnabled",                     m_cabacZeroWordPaddingEnabled,                     true, "0 do not add conforming cabac-zero-words to bit streams, 1 (default) = add cabac-zero-words as required")
     903  ("ChromaFormatIDC,-cf",                             tmpChromaFormat,                                      0, "ChromaFormatIDC (400|420|422|444 or set 0 (default) for same as InputChromaFormat)")
     904  ("ConformanceMode",                                 m_conformanceWindowMode,                              0, "Deprecated alias of ConformanceWindowMode")
     905  ("ConformanceWindowMode",                           m_conformanceWindowMode,                              0, "Window conformance mode (0: no window, 1:automatic padding, 2:padding, 3:conformance")
     906  ("HorizontalPadding,-pdx",                          m_aiPad[0],                                           0, "Horizontal source padding for conformance window mode 2")
     907  ("VerticalPadding,-pdy",                            m_aiPad[1],                                           0, "Vertical source padding for conformance window mode 2")
     908  ("ConfLeft",                                        m_confWinLeft,                                        0, "Deprecated alias of ConfWinLeft")
     909  ("ConfRight",                                       m_confWinRight,                                       0, "Deprecated alias of ConfWinRight")
     910  ("ConfTop",                                         m_confWinTop,                                         0, "Deprecated alias of ConfWinTop")
     911  ("ConfBottom",                                      m_confWinBottom,                                      0, "Deprecated alias of ConfWinBottom")
     912  ("ConfWinLeft",                                     m_confWinLeft,                                        0, "Left offset for window conformance mode 3")
     913  ("ConfWinRight",                                    m_confWinRight,                                       0, "Right offset for window conformance mode 3")
     914  ("ConfWinTop",                                      m_confWinTop,                                         0, "Top offset for window conformance mode 3")
     915  ("ConfWinBottom",                                   m_confWinBottom,                                      0, "Bottom offset for window conformance mode 3")
     916  ("FrameRate,-fr",                                   m_iFrameRate,                                         0, "Frame rate")
     917  ("FrameSkip,-fs",                                   m_FrameSkip,                                         0u, "Number of frames to skip at start of input YUV")
     918  ("FramesToBeEncoded,f",                             m_framesToBeEncoded,                                  0, "Number of frames to be encoded (default=all)")
     919  ("ClipInputVideoToRec709Range",                     m_bClipInputVideoToRec709Range,                   false, "If true then clip input video to the Rec. 709 Range on loading when InternalBitDepth is less than MSBExtendedBitDepth")
     920  ("ClipOutputVideoToRec709Range",                    m_bClipOutputVideoToRec709Range,                  false, "If true then clip output video to the Rec. 709 Range on saving when OutputBitDepth is less than InternalBitDepth")
     921  ("SummaryOutFilename",                              m_summaryOutFilename,                          string(), "Filename to use for producing summary output file. If empty, do not produce a file.")
     922  ("SummaryPicFilenameBase",                          m_summaryPicFilenameBase,                      string(), "Base filename to use for producing summary picture output files. The actual filenames used will have I.txt, P.txt and B.txt appended. If empty, do not produce a file.")
     923  ("SummaryVerboseness",                              m_summaryVerboseness,                                0u, "Specifies the level of the verboseness of the text output")
    432924
    433925  //Field coding parameters
    434   ("FieldCoding", m_isField, false, "Signals if it's a field based coding")
    435   ("TopFieldFirst, Tff", m_isTopFieldFirst, false, "In case of field based coding, signals whether if it's a top field first or not")
    436  
     926  ("FieldCoding",                                     m_isField,                                        false, "Signals if it's a field based coding")
     927  ("TopFieldFirst, Tff",                              m_isTopFieldFirst,                                false, "In case of field based coding, signals whether if it's a top field first or not")
     928  ("EfficientFieldIRAPEnabled",                       m_bEfficientFieldIRAPEnabled,                      true, "Enable to code fields in a specific, potentially more efficient, order.")
     929  ("HarmonizeGopFirstFieldCoupleEnabled",             m_bHarmonizeGopFirstFieldCoupleEnabled,            true, "Enables harmonization of Gop first field couple")
     930
    437931  // Profile and level
    438 #if H_MV
    439   ("Profile", cfg_profiles,   string(""),          "Profile in VpsProfileTierLevel (Indication only)")
    440   ("Level",   cfg_levels ,    string(""),          "Level indication in VpsProfileTierLevel (Indication only)")
    441   ("Tier",    cfg_tiers  ,    string(""),          "Tier indication in VpsProfileTierLevel (Indication only)")
    442   ("InblFlag",m_inblFlag ,    std::vector<Bool>(0), "InblFlags in VpsProfileTierLevel (Indication only)" )
     932#if NH_MV
     933  ("Profile" ,                                        cfg_profiles,                                string(""), "Profile in VpsProfileTierLevel (Indication only)")
     934  ("Level"   ,                                        cfg_levels ,                                 string(""), "Level indication in VpsProfileTierLevel (Indication only)")
     935  ("Tier"    ,                                        cfg_tiers  ,                                 string(""), "Tier indication in VpsProfileTierLevel (Indication only)")
     936  ("InblFlag",                                        m_inblFlag ,                       std::vector<Bool>(0), "InblFlags in VpsProfileTierLevel (Indication only)" )
    443937#else
    444   ("Profile", m_profile,   Profile::NONE, "Profile to be used when encoding (Incomplete)")
    445   ("Level",   m_level,     Level::NONE,   "Level limit to be used, eg 5.1 (Incomplete)")
    446   ("Tier",    m_levelTier, Level::MAIN,   "Tier to use for interpretation of --Level")
    447 #endif
    448   ("ProgressiveSource", m_progressiveSourceFlag, false, "Indicate that source is progressive")
    449   ("InterlacedSource",  m_interlacedSourceFlag,  false, "Indicate that source is interlaced")
    450   ("NonPackedSource",   m_nonPackedConstraintFlag, false, "Indicate that source does not contain frame packing")
    451   ("FrameOnly",         m_frameOnlyConstraintFlag, false, "Indicate that the bitstream contains only frames")
    452  
     938  ("Profile",                                         extendedProfile,                                   NONE, "Profile name to use for encoding. Use main (for main), main10 (for main10), main-still-picture, main-RExt (for Range Extensions profile), any of the RExt specific profile names, or none")
     939  ("Level",                                           m_level,                                    Level::NONE, "Level limit to be used, eg 5.1, or none")
     940  ("Tier",                                            m_levelTier,                                Level::MAIN, "Tier to use for interpretation of --Level (main or high only)")
     941#endif
     942  ("MaxBitDepthConstraint",                           m_bitDepthConstraint,                                0u, "Bit depth to use for profile-constraint for RExt profiles. 0=automatically choose based upon other parameters")
     943  ("MaxChromaFormatConstraint",                       tmpConstraintChromaFormat,                            0, "Chroma-format to use for the profile-constraint for RExt profiles. 0=automatically choose based upon other parameters")
     944  ("IntraConstraintFlag",                             m_intraConstraintFlag,                            false, "Value of general_intra_constraint_flag to use for RExt profiles (not used if an explicit RExt sub-profile is specified)")
     945  ("OnePictureOnlyConstraintFlag",                    m_onePictureOnlyConstraintFlag,                   false, "Value of general_one_picture_only_constraint_flag to use for RExt profiles (not used if an explicit RExt sub-profile is specified)")
     946  ("LowerBitRateConstraintFlag",                      m_lowerBitRateConstraintFlag,                      true, "Value of general_lower_bit_rate_constraint_flag to use for RExt profiles")
     947
     948  ("ProgressiveSource",                               m_progressiveSourceFlag,                          false, "Indicate that source is progressive")
     949  ("InterlacedSource",                                m_interlacedSourceFlag,                           false, "Indicate that source is interlaced")
     950  ("NonPackedSource",                                 m_nonPackedConstraintFlag,                        false, "Indicate that source does not contain frame packing")
     951  ("FrameOnly",                                       m_frameOnlyConstraintFlag,                        false, "Indicate that the bitstream contains only frames")
     952
    453953  // Unit definition parameters
    454   ("MaxCUWidth",              m_uiMaxCUWidth,             64u)
    455   ("MaxCUHeight",             m_uiMaxCUHeight,            64u)
     954  ("MaxCUWidth",                                      m_uiMaxCUWidth,                                     64u)
     955  ("MaxCUHeight",                                     m_uiMaxCUHeight,                                    64u)
    456956  // todo: remove defaults from MaxCUSize
    457   ("MaxCUSize,s",             m_uiMaxCUWidth,             64u, "Maximum CU size")
    458   ("MaxCUSize,s",             m_uiMaxCUHeight,            64u, "Maximum CU size")
    459   ("MaxPartitionDepth,h",     m_uiMaxCUDepth,              4u, "CU depth")
    460  
    461   ("QuadtreeTULog2MaxSize",   m_uiQuadtreeTULog2MaxSize,   6u, "Maximum TU size in logarithm base 2")
    462   ("QuadtreeTULog2MinSize",   m_uiQuadtreeTULog2MinSize,   2u, "Minimum TU size in logarithm base 2")
    463  
    464   ("QuadtreeTUMaxDepthIntra", m_uiQuadtreeTUMaxDepthIntra, 1u, "Depth of TU tree for intra CUs")
    465   ("QuadtreeTUMaxDepthInter", m_uiQuadtreeTUMaxDepthInter, 2u, "Depth of TU tree for inter CUs")
    466 #if H_MV 
     957  ("MaxCUSize,s",                                     m_uiMaxCUWidth,                                     64u, "Maximum CU size")
     958  ("MaxCUSize,s",                                     m_uiMaxCUHeight,                                    64u, "Maximum CU size")
     959  ("MaxPartitionDepth,h",                             m_uiMaxCUDepth,                                      4u, "CU depth")
     960
     961  ("QuadtreeTULog2MaxSize",                           m_uiQuadtreeTULog2MaxSize,                           6u, "Maximum TU size in logarithm base 2")
     962  ("QuadtreeTULog2MinSize",                           m_uiQuadtreeTULog2MinSize,                           2u, "Minimum TU size in logarithm base 2")
     963
     964  ("QuadtreeTUMaxDepthIntra",                         m_uiQuadtreeTUMaxDepthIntra,                        1u, "Depth of TU tree for intra CUs")
     965  ("QuadtreeTUMaxDepthInter",                         m_uiQuadtreeTUMaxDepthInter,                        2u, "Depth of TU tree for inter CUs")
     966#if NH_MV 
    467967  // Coding structure parameters
    468   ("IntraPeriod,-ip",         m_iIntraPeriod,std::vector<Int>(1,-1), "Intra period in frames, (-1: only first frame), per layer")
     968  ("IntraPeriod,-ip",                                 m_iIntraPeriod,std::vector<Int>(1,-1)                  , "Intra period in frames, (-1: only first frame), per layer")
    469969#else
    470970  // Coding structure paramters
    471 ("IntraPeriod,-ip",         m_iIntraPeriod,              -1, "Intra period in frames, (-1: only first frame)")
    472 #endif
    473 #if ALLOW_RECOVERY_POINT_AS_RAP
    474   ("DecodingRefreshType,-dr", m_iDecodingRefreshType,       0, "Intra refresh type (0:none 1:CRA 2:IDR 3:RecPointSEI)")
    475 #else
    476   ("DecodingRefreshType,-dr", m_iDecodingRefreshType,       0, "Intra refresh type (0:none 1:CRA 2:IDR)")
    477 #endif
    478   ("GOPSize,g",               m_iGOPSize,                   1, "GOP size of temporal structure")
    479   // motion options
    480   ("FastSearch",              m_iFastSearch,                1, "0:Full search  1:Diamond  2:PMVFAST")
    481   ("SearchRange,-sr",         m_iSearchRange,              96, "Motion search range")
    482 #if H_MV
     971  ("IntraPeriod,-ip",                                 m_iIntraPeriod,                                      -1, "Intra period in frames, (-1: only first frame)")
     972#endif
     973  ("DecodingRefreshType,-dr",                         m_iDecodingRefreshType,                               0, "Intra refresh type (0:none 1:CRA 2:IDR 3:RecPointSEI)")
     974  ("GOPSize,g",                                       m_iGOPSize,                                           1, "GOP size of temporal structure")
     975
     976  // motion search options
     977  ("DisableIntraInInter",                             m_bDisableIntraPUsInInterSlices,                  false, "Flag to disable intra PUs in inter slices")
     978  ("FastSearch",                                      m_iFastSearch,                                        1, "0:Full search  1:Diamond  2:PMVFAST")
     979  ("SearchRange,-sr",                                 m_iSearchRange,                                      96, "Motion search range")
     980#if NH_MV
    483981  ("DispSearchRangeRestriction",  m_bUseDisparitySearchRangeRestriction, false, "restrict disparity search range")
    484982  ("VerticalDispSearchRange",     m_iVerticalDisparitySearchRange, 56, "vertical disparity search range")
    485983#endif
    486   ("BipredSearchRange",       m_bipredSearchRange,          4, "Motion search range for bipred refinement")
    487   ("HadamardME",              m_bUseHADME,               true, "Hadamard ME for fractional-pel")
    488   ("ASR",                     m_bUseASR,                false, "Adaptive motion search range")
     984  ("BipredSearchRange",                               m_bipredSearchRange,                                  4, "Motion search range for bipred refinement")
     985  ("ClipForBiPredMEEnabled",                          m_bClipForBiPredMeEnabled,                        false, "Enables clipping in the Bi-Pred ME. It is disabled to reduce encoder run-time")
     986  ("FastMEAssumingSmootherMVEnabled",                 m_bFastMEAssumingSmootherMVEnabled,                true, "Enables fast ME assuming a smoother MV.")
     987
     988  ("HadamardME",                                      m_bUseHADME,                                       true, "Hadamard ME for fractional-pel")
     989  ("ASR",                                             m_bUseASR,                                        false, "Adaptive motion search range")
    489990
    490991  // Mode decision parameters
    491   ("LambdaModifier0,-LM0", m_adLambdaModifier[ 0 ], ( Double )1.0, "Lambda modifier for temporal layer 0")
    492   ("LambdaModifier1,-LM1", m_adLambdaModifier[ 1 ], ( Double )1.0, "Lambda modifier for temporal layer 1")
    493   ("LambdaModifier2,-LM2", m_adLambdaModifier[ 2 ], ( Double )1.0, "Lambda modifier for temporal layer 2")
    494   ("LambdaModifier3,-LM3", m_adLambdaModifier[ 3 ], ( Double )1.0, "Lambda modifier for temporal layer 3")
    495   ("LambdaModifier4,-LM4", m_adLambdaModifier[ 4 ], ( Double )1.0, "Lambda modifier for temporal layer 4")
    496   ("LambdaModifier5,-LM5", m_adLambdaModifier[ 5 ], ( Double )1.0, "Lambda modifier for temporal layer 5")
    497   ("LambdaModifier6,-LM6", m_adLambdaModifier[ 6 ], ( Double )1.0, "Lambda modifier for temporal layer 6")
     992  ("LambdaModifier0,-LM0",                            m_adLambdaModifier[ 0 ],                  ( Double )1.0, "Lambda modifier for temporal layer 0")
     993  ("LambdaModifier1,-LM1",                            m_adLambdaModifier[ 1 ],                  ( Double )1.0, "Lambda modifier for temporal layer 1")
     994  ("LambdaModifier2,-LM2",                            m_adLambdaModifier[ 2 ],                  ( Double )1.0, "Lambda modifier for temporal layer 2")
     995  ("LambdaModifier3,-LM3",                            m_adLambdaModifier[ 3 ],                  ( Double )1.0, "Lambda modifier for temporal layer 3")
     996  ("LambdaModifier4,-LM4",                            m_adLambdaModifier[ 4 ],                  ( Double )1.0, "Lambda modifier for temporal layer 4")
     997  ("LambdaModifier5,-LM5",                            m_adLambdaModifier[ 5 ],                  ( Double )1.0, "Lambda modifier for temporal layer 5")
     998  ("LambdaModifier6,-LM6",                            m_adLambdaModifier[ 6 ],                  ( Double )1.0, "Lambda modifier for temporal layer 6")
    498999
    4991000  /* Quantization parameters */
    500 #if H_MV
     1001#if NH_MV
    5011002  ("QP,q",          m_fQP, std::vector<double>(1,30.0), "Qp values for each layer, if value is float, QP is switched once during encoding")
    5021003#else
    503   ("QP,q",          m_fQP,             30.0, "Qp value, if value is float, QP is switched once during encoding")
    504 #endif
    505   ("DeltaQpRD,-dqr",m_uiDeltaQpRD,       0u, "max dQp offset for slice")
    506   ("MaxDeltaQP,d",  m_iMaxDeltaQP,        0, "max dQp offset for block")
    507   ("MaxCuDQPDepth,-dqd",  m_iMaxCuDQPDepth,        0, "max depth for a minimum CuDQP")
    508 
    509   ("CbQpOffset,-cbqpofs",  m_cbQpOffset,        0, "Chroma Cb QP Offset")
    510   ("CrQpOffset,-crqpofs",  m_crQpOffset,        0, "Chroma Cr QP Offset")
     1004  ("QP,q",                                            m_fQP,                                             30.0, "Qp value, if value is float, QP is switched once during encoding")
     1005#endif
     1006  ("DeltaQpRD,-dqr",                                  m_uiDeltaQpRD,                                       0u, "max dQp offset for slice")
     1007  ("MaxDeltaQP,d",                                    m_iMaxDeltaQP,                                        0, "max dQp offset for block")
     1008  ("MaxCuDQPDepth,-dqd",                              m_iMaxCuDQPDepth,                                     0, "max depth for a minimum CuDQP")
     1009  ("MaxCUChromaQpAdjustmentDepth",                    m_diffCuChromaQpOffsetDepth,                         -1, "Maximum depth for CU chroma Qp adjustment - set less than 0 to disable")
     1010
     1011  ("CbQpOffset,-cbqpofs",                             m_cbQpOffset,                                         0, "Chroma Cb QP Offset")
     1012  ("CrQpOffset,-crqpofs",                             m_crQpOffset,                                         0, "Chroma Cr QP Offset")
    5111013
    5121014#if ADAPTIVE_QP_SELECTION
    513   ("AdaptiveQpSelection,-aqps",   m_bUseAdaptQpSelect,           false, "AdaptiveQpSelection")
    514 #endif
    515 
    516   ("AdaptiveQP,-aq",                m_bUseAdaptiveQP,           false, "QP adaptation based on a psycho-visual model")
    517   ("MaxQPAdaptationRange,-aqr",     m_iQPAdaptationRange,           6, "QP adaptation range")
    518   ("dQPFile,m",                     cfg_dQPFile,           string(""), "dQP file name")
    519   ("RDOQ",                          m_useRDOQ,                  true )
    520   ("RDOQTS",                        m_useRDOQTS,                true )
    521   ("RDpenalty",                     m_rdPenalty,                0,  "RD-penalty for 32x32 TU for intra in non-intra slices. 0:disbaled  1:RD-penalty  2:maximum RD-penalty")
    522  
     1015  ("AdaptiveQpSelection,-aqps",                       m_bUseAdaptQpSelect,                              false, "AdaptiveQpSelection")
     1016#endif
     1017
     1018  ("AdaptiveQP,-aq",                                  m_bUseAdaptiveQP,                                 false, "QP adaptation based on a psycho-visual model")
     1019  ("MaxQPAdaptationRange,-aqr",                       m_iQPAdaptationRange,                                 6, "QP adaptation range")
     1020  ("dQPFile,m",                                       cfg_dQPFile,                                 string(""), "dQP file name")
     1021  ("RDOQ",                                            m_useRDOQ,                                         true)
     1022  ("RDOQTS",                                          m_useRDOQTS,                                       true)
     1023#if T0196_SELECTIVE_RDOQ
     1024  ("SelectiveRDOQ",                                   m_useSelectiveRDOQ,                               false, "Enable selective RDOQ")
     1025#endif
     1026  ("RDpenalty",                                       m_rdPenalty,                                          0,  "RD-penalty for 32x32 TU for intra in non-intra slices. 0:disabled  1:RD-penalty  2:maximum RD-penalty")
     1027
    5231028  // Deblocking filter parameters
    524 #if H_MV
    525   ("LoopFilterDisable",              m_bLoopFilterDisable,             std::vector<Bool>(1,false), "Disable Loop Filter per Layer" )
     1029#if NH_MV
     1030  ("LoopFilterDisable",                               m_bLoopFilterDisable,                             std::vector<Bool>(1,false), "Disable Loop Filter per Layer" )
    5261031#else
    527   ("LoopFilterDisable",              m_bLoopFilterDisable,             false )
    528 #endif
    529   ("LoopFilterOffsetInPPS",          m_loopFilterOffsetInPPS,          false )
    530   ("LoopFilterBetaOffset_div2",      m_loopFilterBetaOffsetDiv2,           0 )
    531   ("LoopFilterTcOffset_div2",        m_loopFilterTcOffsetDiv2,             0 )
    532   ("DeblockingFilterControlPresent", m_DeblockingFilterControlPresent, false )
    533   ("DeblockingFilterMetric",         m_DeblockingFilterMetric,         false )
    534 
    535 #if H_3D_IC
    536   ("IlluCompEnable",           m_abUseIC, true, "Enable illumination compensation")
    537   ("IlluCompLowLatencyEnc",    m_bUseLowLatencyICEnc, false, "Enable low-latency illumination compensation encoding")
    538 #endif
     1032  ("LoopFilterDisable",                               m_bLoopFilterDisable,                             false)
     1033#endif
     1034  ("LoopFilterOffsetInPPS",                           m_loopFilterOffsetInPPS,                           true)
     1035  ("LoopFilterBetaOffset_div2",                       m_loopFilterBetaOffsetDiv2,                           0)
     1036  ("LoopFilterTcOffset_div2",                         m_loopFilterTcOffsetDiv2,                             0)
     1037  ("DeblockingFilterMetric",                          m_DeblockingFilterMetric,                         false)
     1038
    5391039  // Coding tools
    540   ("AMP",                      m_enableAMP,                 true,  "Enable asymmetric motion partitions")
    541   ("TransformSkip",            m_useTransformSkip,          false, "Intra transform skipping")
    542   ("TransformSkipFast",        m_useTransformSkipFast,      false, "Fast intra transform skipping")
    543 #if H_MV
     1040  ("AMP",                                             m_enableAMP,                                       true, "Enable asymmetric motion partitions")
     1041  ("CrossComponentPrediction",                        m_crossComponentPredictionEnabledFlag,            false, "Enable the use of cross-component prediction (not valid in V1 profiles)")
     1042  ("ReconBasedCrossCPredictionEstimate",              m_reconBasedCrossCPredictionEstimate,             false, "When determining the alpha value for cross-component prediction, use the decoded residual rather than the pre-transform encoder-side residual")
     1043  ("SaoLumaOffsetBitShift",                           saoOffsetBitShift[CHANNEL_TYPE_LUMA],                 0, "Specify the luma SAO bit-shift. If negative, automatically calculate a suitable value based upon bit depth and initial QP")
     1044  ("SaoChromaOffsetBitShift",                         saoOffsetBitShift[CHANNEL_TYPE_CHROMA],               0, "Specify the chroma SAO bit-shift. If negative, automatically calculate a suitable value based upon bit depth and initial QP")
     1045  ("TransformSkip",                                   m_useTransformSkip,                               false, "Intra transform skipping")
     1046  ("TransformSkipFast",                               m_useTransformSkipFast,                           false, "Fast intra transform skipping")
     1047  ("TransformSkipLog2MaxSize",                        m_log2MaxTransformSkipBlockSize,                     2U, "Specify transform-skip maximum size. Minimum 2. (not valid in V1 profiles)")
     1048  ("ImplicitResidualDPCM",                            m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT],        false, "Enable implicitly signalled residual DPCM for intra (also known as sample-adaptive intra predict) (not valid in V1 profiles)")
     1049  ("ExplicitResidualDPCM",                            m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT],        false, "Enable explicitly signalled residual DPCM for inter (not valid in V1 profiles)")
     1050  ("ResidualRotation",                                m_transformSkipRotationEnabledFlag,               false, "Enable rotation of transform-skipped and transquant-bypassed TUs through 180 degrees prior to entropy coding (not valid in V1 profiles)")
     1051  ("SingleSignificanceMapContext",                    m_transformSkipContextEnabledFlag,                false, "Enable, for transform-skipped and transquant-bypassed TUs, the selection of a single significance map context variable for all coefficients (not valid in V1 profiles)")
     1052  ("GolombRiceParameterAdaptation",                   m_persistentRiceAdaptationEnabledFlag,            false, "Enable the adaptation of the Golomb-Rice parameter over the course of each slice")
     1053  ("AlignCABACBeforeBypass",                          m_cabacBypassAlignmentEnabledFlag,                false, "Align the CABAC engine to a defined fraction of a bit prior to coding bypass data. Must be 1 in high bit rate profile, 0 otherwise" )
     1054#if NH_MV
    5441055  ("SAO",                      m_bUseSAO, std::vector<Bool>(1,true), "Enable Sample Adaptive Offset per Layer")
    5451056#else
    546   ("SAO",                      m_bUseSAO,                   true,  "Enable Sample Adaptive Offset")
    547 #endif
    548   ("MaxNumOffsetsPerPic",      m_maxNumOffsetsPerPic,       2048,  "Max number of SAO offset per picture (Default: 2048)")   
    549   ("SAOLcuBoundary",           m_saoLcuBoundary,            false, "0: right/bottom LCU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas")
    550   ("SliceMode",                m_sliceMode,                0,     "0: Disable all Recon slice limits, 1: Enforce max # of LCUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice")
    551   ("SliceArgument",            m_sliceArgument,            0,     "Depending on SliceMode being:"
    552                                                                    "\t1: max number of CTUs per slice"
    553                                                                    "\t2: max number of bytes per slice"
    554                                                                    "\t3: max number of tiles per slice")
    555   ("SliceSegmentMode",         m_sliceSegmentMode,       0,     "0: Disable all slice segment limits, 1: Enforce max # of LCUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice")
    556   ("SliceSegmentArgument",     m_sliceSegmentArgument,   0,     "Depending on SliceSegmentMode being:"
    557                                                                    "\t1: max number of CTUs per slice segment"
    558                                                                    "\t2: max number of bytes per slice segment"
    559                                                                    "\t3: max number of tiles per slice segment")
    560   ("LFCrossSliceBoundaryFlag", m_bLFCrossSliceBoundaryFlag, true)
    561 
    562   ("ConstrainedIntraPred",     m_bUseConstrainedIntraPred,  false, "Constrained Intra Prediction")
    563 
    564   ("PCMEnabledFlag",           m_usePCM,                    false)
    565   ("PCMLog2MaxSize",           m_pcmLog2MaxSize,            5u)
    566   ("PCMLog2MinSize",           m_uiPCMLog2MinSize,          3u)
    567   ("PCMInputBitDepthFlag",     m_bPCMInputBitDepthFlag,     true)
    568   ("PCMFilterDisableFlag",     m_bPCMFilterDisableFlag,    false)
    569 
    570   ("WeightedPredP,-wpP",          m_useWeightedPred,               false,      "Use weighted prediction in P slices")
    571   ("WeightedPredB,-wpB",          m_useWeightedBiPred,             false,      "Use weighted (bidirectional) prediction in B slices")
    572   ("Log2ParallelMergeLevel",      m_log2ParallelMergeLevel,     2u,          "Parallel merge estimation region")
    573 
    574   //deprecated copies of renamed tile parameters
    575   ("UniformSpacingIdc",           m_tileUniformSpacingFlag,        false,      "deprecated alias of TileUniformSpacing")
    576   ("ColumnWidthArray",            cfgColumnWidth,                  string(""), "deprecated alias of TileColumnWidthArray")
    577   ("RowHeightArray",              cfgRowHeight,                    string(""), "deprecated alias of TileRowHeightArray")
    578 
    579   ("TileUniformSpacing",          m_tileUniformSpacingFlag,        false,      "Indicates that tile columns and rows are distributed uniformly")
    580   ("NumTileColumnsMinus1",        m_numTileColumnsMinus1,          0,          "Number of tile columns in a picture minus 1")
    581   ("NumTileRowsMinus1",           m_numTileRowsMinus1,             0,          "Number of rows in a picture minus 1")
    582   ("TileColumnWidthArray",        cfgColumnWidth,                  string(""), "Array containing tile column width values in units of LCU")
    583   ("TileRowHeightArray",          cfgRowHeight,                    string(""), "Array containing tile row height values in units of LCU")
    584   ("LFCrossTileBoundaryFlag",      m_bLFCrossTileBoundaryFlag,             true,          "1: cross-tile-boundary loop filtering. 0:non-cross-tile-boundary loop filtering")
    585   ("WaveFrontSynchro",            m_iWaveFrontSynchro,             0,          "0: no synchro; 1 synchro with TR; 2 TRR etc")
    586   ("ScalingList",                 m_useScalingListId,              0,          "0: no scaling list, 1: default scaling lists, 2: scaling lists specified in ScalingListFile")
    587   ("ScalingListFile",             cfg_ScalingListFile,             string(""), "Scaling list file name")
    588   ("SignHideFlag,-SBH",                m_signHideFlag, 1)
    589   ("MaxNumMergeCand",             m_maxNumMergeCand,             5u,         "Maximum number of merge candidates")
    590 
     1057  ("SAO",                                             m_bUseSAO,                                         true, "Enable Sample Adaptive Offset")
     1058#endif
     1059  ("TestSAODisableAtPictureLevel",                    m_bTestSAODisableAtPictureLevel,                  false, "Enables the testing of disabling SAO at the picture level after having analysed all blocks")
     1060  ("SaoEncodingRate",                                 m_saoEncodingRate,                                 0.75, "When >0 SAO early picture termination is enabled for luma and chroma")
     1061  ("SaoEncodingRateChroma",                           m_saoEncodingRateChroma,                            0.5, "The SAO early picture termination rate to use for chroma (when m_SaoEncodingRate is >0). If <=0, use results for luma")
     1062  ("MaxNumOffsetsPerPic",                             m_maxNumOffsetsPerPic,                             2048, "Max number of SAO offset per picture (Default: 2048)")
     1063  ("SAOLcuBoundary",                                  m_saoCtuBoundary,                                 false, "0: right/bottom CTU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas")
     1064  ("SliceMode",                                       m_sliceMode,                                          0, "0: Disable all Recon slice limits, 1: Enforce max # of CTUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice")
     1065  ("SliceArgument",                                   m_sliceArgument,                                      0, "Depending on SliceMode being:"
     1066                                                                                                               "\t1: max number of CTUs per slice"
     1067                                                                                                               "\t2: max number of bytes per slice"
     1068                                                                                                               "\t3: max number of tiles per slice")
     1069  ("SliceSegmentMode",                                m_sliceSegmentMode,                                   0, "0: Disable all slice segment limits, 1: Enforce max # of CTUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice")
     1070  ("SliceSegmentArgument",                            m_sliceSegmentArgument,                               0, "Depending on SliceSegmentMode being:"
     1071                                                                                                               "\t1: max number of CTUs per slice segment"
     1072                                                                                                               "\t2: max number of bytes per slice segment"
     1073                                                                                                               "\t3: max number of tiles per slice segment")
     1074  ("LFCrossSliceBoundaryFlag",                        m_bLFCrossSliceBoundaryFlag,                       true)
     1075
     1076  ("ConstrainedIntraPred",                            m_bUseConstrainedIntraPred,                       false, "Constrained Intra Prediction")
     1077  ("FastUDIUseMPMEnabled",                            m_bFastUDIUseMPMEnabled,                           true, "If enabled, adapt intra direction search, accounting for MPM")
     1078  ("FastMEForGenBLowDelayEnabled",                    m_bFastMEForGenBLowDelayEnabled,                   true, "If enabled use a fast ME for generalised B Low Delay slices")
     1079  ("UseBLambdaForNonKeyLowDelayPictures",             m_bUseBLambdaForNonKeyLowDelayPictures,            true, "Enables use of B-Lambda for non-key low-delay pictures")
     1080  ("PCMEnabledFlag",                                  m_usePCM,                                         false)
     1081  ("PCMLog2MaxSize",                                  m_pcmLog2MaxSize,                                    5u)
     1082  ("PCMLog2MinSize",                                  m_uiPCMLog2MinSize,                                  3u)
     1083
     1084  ("PCMInputBitDepthFlag",                            m_bPCMInputBitDepthFlag,                           true)
     1085  ("PCMFilterDisableFlag",                            m_bPCMFilterDisableFlag,                          false)
     1086  ("IntraReferenceSmoothing",                         m_enableIntraReferenceSmoothing,                   true, "0: Disable use of intra reference smoothing. 1: Enable use of intra reference smoothing (not valid in V1 profiles)")
     1087  ("WeightedPredP,-wpP",                              m_useWeightedPred,                                false, "Use weighted prediction in P slices")
     1088  ("WeightedPredB,-wpB",                              m_useWeightedBiPred,                              false, "Use weighted (bidirectional) prediction in B slices")
     1089  ("Log2ParallelMergeLevel",                          m_log2ParallelMergeLevel,                            2u, "Parallel merge estimation region")
     1090    //deprecated copies of renamed tile parameters
     1091  ("UniformSpacingIdc",                               m_tileUniformSpacingFlag,                         false,      "deprecated alias of TileUniformSpacing")
     1092  ("ColumnWidthArray",                                cfg_ColumnWidth,                        cfg_ColumnWidth, "deprecated alias of TileColumnWidthArray")
     1093  ("RowHeightArray",                                  cfg_RowHeight,                            cfg_RowHeight, "deprecated alias of TileRowHeightArray")
     1094
     1095  ("TileUniformSpacing",                              m_tileUniformSpacingFlag,                         false,      "Indicates that tile columns and rows are distributed uniformly")
     1096  ("NumTileColumnsMinus1",                            m_numTileColumnsMinus1,                               0,          "Number of tile columns in a picture minus 1")
     1097  ("NumTileRowsMinus1",                               m_numTileRowsMinus1,                                  0,          "Number of rows in a picture minus 1")
     1098  ("TileColumnWidthArray",                            cfg_ColumnWidth,                        cfg_ColumnWidth, "Array containing tile column width values in units of CTU")
     1099  ("TileRowHeightArray",                              cfg_RowHeight,                            cfg_RowHeight, "Array containing tile row height values in units of CTU")
     1100  ("LFCrossTileBoundaryFlag",                         m_bLFCrossTileBoundaryFlag,                        true, "1: cross-tile-boundary loop filtering. 0:non-cross-tile-boundary loop filtering")
     1101  ("WaveFrontSynchro",                                m_iWaveFrontSynchro,                                  0, "0: no synchro; 1 synchro with top-right-right")
     1102  ("ScalingList",                                     m_useScalingListId,                    SCALING_LIST_OFF, "0/off: no scaling list, 1/default: default scaling lists, 2/file: scaling lists specified in ScalingListFile")
     1103  ("ScalingListFile",                                 cfg_ScalingListFile,                         string(""), "Scaling list file name. Use an empty string to produce help.")
     1104  ("SignHideFlag,-SBH",                               m_signHideFlag,                                    true)
     1105  ("MaxNumMergeCand",                                 m_maxNumMergeCand,                                   5u, "Maximum number of merge candidates")
    5911106  /* Misc. */
    592   ("SEIDecodedPictureHash",       m_decodedPictureHashSEIEnabled, 0, "Control generation of decode picture hash SEI messages\n"
    593                                                                     "\t3: checksum\n"
    594                                                                     "\t2: CRC\n"
    595                                                                     "\t1: use MD5\n"
    596                                                                     "\t0: disable")
    597   ("SEIpictureDigest",            m_decodedPictureHashSEIEnabled, 0, "deprecated alias for SEIDecodedPictureHash")
    598   ("TMVPMode", m_TMVPModeId, 1, "TMVP mode 0: TMVP disable for all slices. 1: TMVP enable for all slices (default) 2: TMVP enable for certain slices only")
    599   ("FEN", m_bUseFastEnc, false, "fast encoder setting")
    600   ("ECU", m_bUseEarlyCU, false, "Early CU setting")
    601   ("FDM", m_useFastDecisionForMerge, true, "Fast decision for Merge RD Cost")
    602   ("CFM", m_bUseCbfFastMode, false, "Cbf fast mode setting")
    603   ("ESD", m_useEarlySkipDetection, false, "Early SKIP detection setting")
    604   ( "RateControl",         m_RCEnableRateControl,   false, "Rate control: enable rate control" )
    605   ( "TargetBitrate",       m_RCTargetBitrate,           0, "Rate control: target bitrate" )
    606   ( "KeepHierarchicalBit", m_RCKeepHierarchicalBit,     0, "Rate control: 0: equal bit allocation; 1: fixed ratio bit allocation; 2: adaptive ratio bit allocation" )
    607   ( "LCULevelRateControl", m_RCLCULevelRC,           true, "Rate control: true: LCU level RC; false: picture level RC" )
    608   ( "RCLCUSeparateModel",  m_RCUseLCUSeparateModel,  true, "Rate control: use LCU level separate R-lambda model" )
    609   ( "InitialQP",           m_RCInitialQP,               0, "Rate control: initial QP" )
    610   ( "RCForceIntraQP",      m_RCForceIntraQP,        false, "Rate control: force intra QP to be equal to initial QP" )
     1107  ("SEIDecodedPictureHash",                           m_decodedPictureHashSEIEnabled,                       0, "Control generation of decode picture hash SEI messages\n"
     1108                                                                                                               "\t3: checksum\n"
     1109                                                                                                               "\t2: CRC\n"
     1110                                                                                                               "\t1: use MD5\n"
     1111                                                                                                               "\t0: disable")
     1112  ("TMVPMode",                                        m_TMVPModeId,                                         1, "TMVP mode 0: TMVP disable for all slices. 1: TMVP enable for all slices (default) 2: TMVP enable for certain slices only")
     1113  ("FEN",                                             m_bUseFastEnc,                                    false, "fast encoder setting")
     1114  ("ECU",                                             m_bUseEarlyCU,                                    false, "Early CU setting")
     1115  ("FDM",                                             m_useFastDecisionForMerge,                         true, "Fast decision for Merge RD Cost")
     1116  ("CFM",                                             m_bUseCbfFastMode,                                false, "Cbf fast mode setting")
     1117  ("ESD",                                             m_useEarlySkipDetection,                          false, "Early SKIP detection setting")
     1118  ( "RateControl",                                    m_RCEnableRateControl,                            false, "Rate control: enable rate control" )
     1119  ( "TargetBitrate",                                  m_RCTargetBitrate,                                    0, "Rate control: target bit-rate" )
     1120  ( "KeepHierarchicalBit",                            m_RCKeepHierarchicalBit,                              0, "Rate control: 0: equal bit allocation; 1: fixed ratio bit allocation; 2: adaptive ratio bit allocation" )
     1121  ( "LCULevelRateControl",                            m_RCLCULevelRC,                                    true, "Rate control: true: CTU level RC; false: picture level RC" )
     1122  ( "RCLCUSeparateModel",                             m_RCUseLCUSeparateModel,                           true, "Rate control: use CTU level separate R-lambda model" )
     1123  ( "InitialQP",                                      m_RCInitialQP,                                        0, "Rate control: initial QP" )
     1124  ( "RCForceIntraQP",                                 m_RCForceIntraQP,                                 false, "Rate control: force intra QP to be equal to initial QP" )
    6111125
    6121126#if KWU_RC_VIEWRC_E0227
     
    6171131  ("DepthMADPred, -dm", m_depthMADPred, (UInt)0, "Depth based MAD prediction on/off")
    6181132#endif
    619 #if H_MV
     1133#if NH_MV
    6201134// A lot of this stuff could should actually be derived by the encoder.
    6211135  // VPS VUI
     
    6261140  ("BitRatePresentVpsFlag"       , m_bitRatePresentVpsFlag       , false                                           , "BitRatePresentVpsFlag       ")
    6271141  ("PicRatePresentVpsFlag"       , m_picRatePresentVpsFlag       , false                                           , "PicRatePresentVpsFlag       ")
    628   ("BitRatePresentFlag"          , m_bitRatePresentFlag          , std::vector< Bool >(1,0)  ,MAX_VPS_OP_SETS_PLUS1, "BitRatePresentFlag per sub layer for the N-th layer set")
    629   ("PicRatePresentFlag"          , m_picRatePresentFlag          , std::vector< Bool >(1,0)  ,MAX_VPS_OP_SETS_PLUS1, "PicRatePresentFlag per sub layer for the N-th layer set")
     1142  ("BitRatePresentFlag"          , m_bitRatePresentFlag          , BoolAry1d(1,0)  ,MAX_VPS_OP_SETS_PLUS1, "BitRatePresentFlag per sub layer for the N-th layer set")
     1143  ("PicRatePresentFlag"          , m_picRatePresentFlag          , BoolAry1d(1,0)  ,MAX_VPS_OP_SETS_PLUS1, "PicRatePresentFlag per sub layer for the N-th layer set")
    6301144  ("AvgBitRate"                  , m_avgBitRate                  , std::vector< Int  >(1,0)  ,MAX_VPS_OP_SETS_PLUS1, "AvgBitRate         per sub layer for the N-th layer set")
    6311145  ("MaxBitRate"                  , m_maxBitRate                  , std::vector< Int  >(1,0)  ,MAX_VPS_OP_SETS_PLUS1, "MaxBitRate         per sub layer for the N-th layer set")
     
    6331147  ("AvgPicRate"                  , m_avgPicRate                  , std::vector< Int  >(1,0)  ,MAX_VPS_OP_SETS_PLUS1, "AvgPicRate         per sub layer for the N-th layer set")
    6341148  ("TilesNotInUseFlag"            , m_tilesNotInUseFlag            , true                                          , "TilesNotInUseFlag            ")
    635   ("TilesInUseFlag"               , m_tilesInUseFlag               , std::vector< Bool >(1,false)                   , "TilesInUseFlag               ")
    636   ("LoopFilterNotAcrossTilesFlag" , m_loopFilterNotAcrossTilesFlag , std::vector< Bool >(1,false)                  , "LoopFilterNotAcrossTilesFlag ")
     1149  ("TilesInUseFlag"               , m_tilesInUseFlag               , BoolAry1d(1,false)                   , "TilesInUseFlag               ")
     1150  ("LoopFilterNotAcrossTilesFlag" , m_loopFilterNotAcrossTilesFlag , BoolAry1d(1,false)                  , "LoopFilterNotAcrossTilesFlag ")
    6371151  ("WppNotInUseFlag"              , m_wppNotInUseFlag              , true                                          , "WppNotInUseFlag              ")
    638   ("WppInUseFlag"                 , m_wppInUseFlag                 , std::vector< Bool >(1,0)                      , "WppInUseFlag                 ")
    639   ("TileBoundariesAlignedFlag"   , m_tileBoundariesAlignedFlag   , std::vector< Bool >(1,0)  ,MAX_NUM_LAYERS       , "TileBoundariesAlignedFlag    per direct reference for the N-th layer")
     1152  ("WppInUseFlag"                 , m_wppInUseFlag                 , BoolAry1d(1,0)                      , "WppInUseFlag                 ")
     1153  ("TileBoundariesAlignedFlag"   , m_tileBoundariesAlignedFlag   , BoolAry1d(1,0)  ,MAX_NUM_LAYERS       , "TileBoundariesAlignedFlag    per direct reference for the N-th layer")
    6401154  ("IlpRestrictedRefLayersFlag"  , m_ilpRestrictedRefLayersFlag  , false                                           , "IlpRestrictedRefLayersFlag")
    6411155  ("MinSpatialSegmentOffsetPlus1", m_minSpatialSegmentOffsetPlus1, std::vector< Int  >(1,0)  ,MAX_NUM_LAYERS       , "MinSpatialSegmentOffsetPlus1 per direct reference for the N-th layer")
    642   ("CtuBasedOffsetEnabledFlag"   , m_ctuBasedOffsetEnabledFlag   , std::vector< Bool >(1,0)  ,MAX_NUM_LAYERS       , "CtuBasedOffsetEnabledFlag    per direct reference for the N-th layer")
     1156  ("CtuBasedOffsetEnabledFlag"   , m_ctuBasedOffsetEnabledFlag   , BoolAry1d(1,0)  ,MAX_NUM_LAYERS       , "CtuBasedOffsetEnabledFlag    per direct reference for the N-th layer")
    6431157  ("MinHorizontalCtuOffsetPlus1" , m_minHorizontalCtuOffsetPlus1 , std::vector< Int  >(1,0)  ,MAX_NUM_LAYERS       , "MinHorizontalCtuOffsetPlus1  per direct reference for the N-th layer")
    6441158  ("SingleLayerForNonIrapFlag", m_singleLayerForNonIrapFlag, false                                          , "SingleLayerForNonIrapFlag")
     
    6461160#endif
    6471161
    648   ("TransquantBypassEnableFlag", m_TransquantBypassEnableFlag, false, "transquant_bypass_enable_flag indicator in PPS")
    649   ("CUTransquantBypassFlagForce", m_CUTransquantBypassFlagForce, false, "Force transquant bypass mode, when transquant_bypass_enable_flag is enabled")
    650   ("RecalculateQPAccordingToLambda", m_recalculateQPAccordingToLambda, false, "Recalculate QP values according to lambda values. Do not suggest to be enabled in all intra case")
    651   ("StrongIntraSmoothing,-sis",      m_useStrongIntraSmoothing,           true, "Enable strong intra smoothing for 32x32 blocks")
    652   ("SEIActiveParameterSets",         m_activeParameterSetsSEIEnabled,          0, "Enable generation of active parameter sets SEI messages")
    653   ("VuiParametersPresent,-vui",      m_vuiParametersPresentFlag,           false, "Enable generation of vui_parameters()")
    654   ("AspectRatioInfoPresent",         m_aspectRatioInfoPresentFlag,         false, "Signals whether aspect_ratio_idc is present")
    655   ("AspectRatioIdc",                 m_aspectRatioIdc,                         0, "aspect_ratio_idc")
    656   ("SarWidth",                       m_sarWidth,                               0, "horizontal size of the sample aspect ratio")
    657   ("SarHeight",                      m_sarHeight,                              0, "vertical size of the sample aspect ratio")
    658   ("OverscanInfoPresent",            m_overscanInfoPresentFlag,            false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
    659   ("OverscanAppropriate",            m_overscanAppropriateFlag,            false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
    660   ("VideoSignalTypePresent",         m_videoSignalTypePresentFlag,         false, "Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present")
    661   ("VideoFormat",                    m_videoFormat,                            5, "Indicates representation of pictures")
    662   ("VideoFullRange",                 m_videoFullRangeFlag,                 false, "Indicates the black level and range of luma and chroma signals")
    663   ("ColourDescriptionPresent",       m_colourDescriptionPresentFlag,       false, "Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present")
    664   ("ColourPrimaries",                m_colourPrimaries,                        2, "Indicates chromaticity coordinates of the source primaries")
    665   ("TransferCharacteristics",        m_transferCharacteristics,                2, "Indicates the opto-electronic transfer characteristics of the source")
    666   ("MatrixCoefficients",             m_matrixCoefficients,                     2, "Describes the matrix coefficients used in deriving luma and chroma from RGB primaries")
    667   ("ChromaLocInfoPresent",           m_chromaLocInfoPresentFlag,           false, "Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present")
    668   ("ChromaSampleLocTypeTopField",    m_chromaSampleLocTypeTopField,            0, "Specifies the location of chroma samples for top field")
    669   ("ChromaSampleLocTypeBottomField", m_chromaSampleLocTypeBottomField,         0, "Specifies the location of chroma samples for bottom field")
    670   ("NeutralChromaIndication",        m_neutralChromaIndicationFlag,        false, "Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1)")
    671   ("DefaultDisplayWindowFlag",       m_defaultDisplayWindowFlag,           false, "Indicates the presence of the Default Window parameters")
    672   ("DefDispWinLeftOffset",           m_defDispWinLeftOffset,                   0, "Specifies the left offset of the default display window from the conformance window")
    673   ("DefDispWinRightOffset",          m_defDispWinRightOffset,                  0, "Specifies the right offset of the default display window from the conformance window")
    674   ("DefDispWinTopOffset",            m_defDispWinTopOffset,                    0, "Specifies the top offset of the default display window from the conformance window")
    675   ("DefDispWinBottomOffset",         m_defDispWinBottomOffset,                 0, "Specifies the bottom offset of the default display window from the conformance window")
    676   ("FrameFieldInfoPresentFlag",      m_frameFieldInfoPresentFlag,               false, "Indicates that pic_struct and field coding related values are present in picture timing SEI messages")
    677   ("PocProportionalToTimingFlag",   m_pocProportionalToTimingFlag,         false, "Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS")
    678   ("NumTicksPocDiffOneMinus1",      m_numTicksPocDiffOneMinus1,                0, "Number of ticks minus 1 that for a POC difference of one")
    679   ("BitstreamRestriction",           m_bitstreamRestrictionFlag,           false, "Signals whether bitstream restriction parameters are present")
    680   ("TilesFixedStructure",            m_tilesFixedStructureFlag,            false, "Indicates that each active picture parameter set has the same values of the syntax elements related to tiles")
    681   ("MotionVectorsOverPicBoundaries", m_motionVectorsOverPicBoundariesFlag, false, "Indicates that no samples outside the picture boundaries are used for inter prediction")
    682   ("MaxBytesPerPicDenom",            m_maxBytesPerPicDenom,                    2, "Indicates a number of bytes not exceeded by the sum of the sizes of the VCL NAL units associated with any coded picture")
    683   ("MaxBitsPerMinCuDenom",           m_maxBitsPerMinCuDenom,                   1, "Indicates an upper bound for the number of bits of coding_unit() data")
    684   ("Log2MaxMvLengthHorizontal",      m_log2MaxMvLengthHorizontal,             15, "Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units")
    685   ("Log2MaxMvLengthVertical",        m_log2MaxMvLengthVertical,               15, "Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units")
    686   ("SEIRecoveryPoint",               m_recoveryPointSEIEnabled,                0, "Control generation of recovery point SEI messages")
    687   ("SEIBufferingPeriod",             m_bufferingPeriodSEIEnabled,              0, "Control generation of buffering period SEI messages")
    688   ("SEIPictureTiming",               m_pictureTimingSEIEnabled,                0, "Control generation of picture timing SEI messages")
    689   ("SEIToneMappingInfo",                       m_toneMappingInfoSEIEnabled,    false, "Control generation of Tone Mapping SEI messages")
    690   ("SEIToneMapId",                             m_toneMapId,                        0, "Specifies Id of Tone Mapping SEI message for a given session")
    691   ("SEIToneMapCancelFlag",                     m_toneMapCancelFlag,            false, "Indicates that Tone Mapping SEI message cancels the persistance or follows")
    692   ("SEIToneMapPersistenceFlag",                m_toneMapPersistenceFlag,        true, "Specifies the persistence of the Tone Mapping SEI message")
    693   ("SEIToneMapCodedDataBitDepth",              m_toneMapCodedDataBitDepth,         8, "Specifies Coded Data BitDepth of Tone Mapping SEI messages")
    694   ("SEIToneMapTargetBitDepth",                 m_toneMapTargetBitDepth,            8, "Specifies Output BitDepth of Tome mapping function")
    695   ("SEIToneMapModelId",                        m_toneMapModelId,                   0, "Specifies Model utilized for mapping coded data into target_bit_depth range\n"
    696                                                                                       "\t0:  linear mapping with clipping\n"
    697                                                                                       "\t1:  sigmoidal mapping\n"
    698                                                                                       "\t2:  user-defined table mapping\n"
    699                                                                                       "\t3:  piece-wise linear mapping\n"
    700                                                                                       "\t4:  luminance dynamic range information ")
    701   ("SEIToneMapMinValue",                              m_toneMapMinValue,                          0, "Specifies the minimum value in mode 0")
    702   ("SEIToneMapMaxValue",                              m_toneMapMaxValue,                       1023, "Specifies the maxmum value in mode 0")
    703   ("SEIToneMapSigmoidMidpoint",                       m_sigmoidMidpoint,                        512, "Specifies the centre point in mode 1")
    704   ("SEIToneMapSigmoidWidth",                          m_sigmoidWidth,                           960, "Specifies the distance between 5% and 95% values of the target_bit_depth in mode 1")
    705   ("SEIToneMapStartOfCodedInterval",                  cfg_startOfCodedInterval,          string(""), "Array of user-defined mapping table")
    706   ("SEIToneMapNumPivots",                             m_numPivots,                                0, "Specifies the number of pivot points in mode 3")
    707   ("SEIToneMapCodedPivotValue",                       cfg_codedPivotValue,               string(""), "Array of pivot point")
    708   ("SEIToneMapTargetPivotValue",                      cfg_targetPivotValue,              string(""), "Array of pivot point")
    709   ("SEIToneMapCameraIsoSpeedIdc",                     m_cameraIsoSpeedIdc,                        0, "Indicates the camera ISO speed for daylight illumination")
    710   ("SEIToneMapCameraIsoSpeedValue",                   m_cameraIsoSpeedValue,                    400, "Specifies the camera ISO speed for daylight illumination of Extended_ISO")
    711   ("SEIToneMapExposureIndexIdc",                      m_exposureIndexIdc,                         0, "Indicates the exposure index setting of the camera")
    712   ("SEIToneMapExposureIndexValue",                    m_exposureIndexValue,                     400, "Specifies the exposure index setting of the cameran of Extended_ISO")
    713   ("SEIToneMapExposureCompensationValueSignFlag",     m_exposureCompensationValueSignFlag,        0, "Specifies the sign of ExposureCompensationValue")
    714   ("SEIToneMapExposureCompensationValueNumerator",    m_exposureCompensationValueNumerator,       0, "Specifies the numerator of ExposureCompensationValue")
    715   ("SEIToneMapExposureCompensationValueDenomIdc",     m_exposureCompensationValueDenomIdc,        2, "Specifies the denominator of ExposureCompensationValue")
    716   ("SEIToneMapRefScreenLuminanceWhite",               m_refScreenLuminanceWhite,                350, "Specifies reference screen brightness setting in units of candela per square metre")
    717   ("SEIToneMapExtendedRangeWhiteLevel",               m_extendedRangeWhiteLevel,                800, "Indicates the luminance dynamic range")
    718   ("SEIToneMapNominalBlackLevelLumaCodeValue",        m_nominalBlackLevelLumaCodeValue,          16, "Specifies luma sample value of the nominal black level assigned decoded pictures")
    719   ("SEIToneMapNominalWhiteLevelLumaCodeValue",        m_nominalWhiteLevelLumaCodeValue,         235, "Specifies luma sample value of the nominal white level assigned decoded pictures")
    720   ("SEIToneMapExtendedWhiteLevelLumaCodeValue",       m_extendedWhiteLevelLumaCodeValue,        300, "Specifies luma sample value of the extended dynamic range assigned decoded pictures")
    721   ("SEIFramePacking",                m_framePackingSEIEnabled,                 0, "Control generation of frame packing SEI messages")
    722   ("SEIFramePackingType",            m_framePackingSEIType,                    0, "Define frame packing arrangement\n"
    723                                                                                   "\t0: checkerboard - pixels alternatively represent either frames\n"
    724                                                                                   "\t1: column alternation - frames are interlaced by column\n"
    725                                                                                   "\t2: row alternation - frames are interlaced by row\n"
    726                                                                                   "\t3: side by side - frames are displayed horizontally\n"
    727                                                                                   "\t4: top bottom - frames are displayed vertically\n"
    728                                                                                   "\t5: frame alternation - one frame is alternated with the other")
    729   ("SEIFramePackingId",              m_framePackingSEIId,                      0, "Id of frame packing SEI message for a given session")
    730   ("SEIFramePackingQuincunx",        m_framePackingSEIQuincunx,                0, "Indicate the presence of a Quincunx type video frame")
    731   ("SEIFramePackingInterpretation",  m_framePackingSEIInterpretation,          0, "Indicate the interpretation of the frame pair\n"
    732                                                                                   "\t0: unspecified\n"
    733                                                                                   "\t1: stereo pair, frame0 represents left view\n"
    734                                                                                   "\t2: stereo pair, frame0 represents right view")
    735   ("SEIDisplayOrientation",          m_displayOrientationSEIAngle,             0, "Control generation of display orientation SEI messages\n"
    736                                                               "\tN: 0 < N < (2^16 - 1) enable display orientation SEI message with anticlockwise_rotation = N and display_orientation_repetition_period = 1\n"
    737                                                               "\t0: disable")
    738   ("SEITemporalLevel0Index",         m_temporalLevel0IndexSEIEnabled,          0, "Control generation of temporal level 0 index SEI messages")
    739   ("SEIGradualDecodingRefreshInfo",  m_gradualDecodingRefreshInfoEnabled,      0, "Control generation of gradual decoding refresh information SEI message")
    740   ("SEIDecodingUnitInfo",             m_decodingUnitInfoSEIEnabled,                       0, "Control generation of decoding unit information SEI message.")
    741   ("SEISOPDescription",              m_SOPDescriptionSEIEnabled,              0, "Control generation of SOP description SEI messages")
    742   ("SEIScalableNesting",             m_scalableNestingSEIEnabled,              0, "Control generation of scalable nesting SEI messages")
    743 #if H_MV
    744   ("SubBitstreamPropSEIEnabled",              m_subBistreamPropSEIEnabled,    false                     ,"Enable signaling of sub-bitstream property SEI message")
    745   ("SEISubBitstreamNumAdditionalSubStreams",  m_sbPropNumAdditionalSubStreams,0, "Number of substreams for which additional information is signalled")
    746   ("SEISubBitstreamSubBitstreamMode",         m_sbPropSubBitstreamMode,       std::vector< Int  >(1,0)  ,"Specifies mode of generation of the i-th sub-bitstream (0 or 1)")
    747   ("SEISubBitstreamOutputLayerSetIdxToVps",   m_sbPropOutputLayerSetIdxToVps, std::vector< Int  >(1,0)  ,"Specifies output layer set index of the i-th sub-bitstream ")
    748   ("SEISubBitstreamHighestSublayerId",        m_sbPropHighestSublayerId,      std::vector< Int  >(1,0)  ,"Specifies highest TemporalId of the i-th sub-bitstream")
    749   ("SEISubBitstreamAvgBitRate",               m_sbPropAvgBitRate,             std::vector< Int  >(1,0)  ,"Specifies average bit rate of the i-th sub-bitstream")
    750   ("SEISubBitstreamMaxBitRate",               m_sbPropMaxBitRate,             std::vector< Int  >(1,0)  ,"Specifies maximum bit rate of the i-th sub-bitstream")
    751 
    752   ("OutputVpsInfo",                           m_outputVpsInfo,                false                     ,"Output information about the layer dependencies and layer sets")
    753 #endif
    754 #if H_3D
    755   ("CameraParameterFile,cpf", m_pchCameraParameterFile,    (Char *) 0, "Camera Parameter File Name")
    756   ("BaseViewCameraNumbers" ,  m_pchBaseViewCameraNumbers,  (Char *) 0, "Numbers of base views")
    757   ("CodedCamParsPrecision",   m_iCodedCamParPrecision,  STD_CAM_PARAMETERS_PRECISION, "precision for coding of camera parameters (in units of 2^(-x) luma samples)" )
    758 /* View Synthesis Optimization */
    759 
    760 #if H_3D_VSO
    761   ("VSOConfig",                       m_pchVSOConfig            , (Char *) 0    , "VSO configuration")
    762   ("VSO",                             m_bUseVSO                 , false         , "Use VSO" )   
    763   ("VSOMode",                         m_uiVSOMode               , (UInt)   4    , "VSO Mode")
    764   ("LambdaScaleVSO",                  m_dLambdaScaleVSO         , (Double) 1    , "Lambda Scaling for VSO")
    765   ("VSOLSTable",                      m_bVSOLSTable             , true          , "Depth QP dependent video/depth rate allocation by Lagrange multiplier" )     
    766   ("ForceLambdaScaleVSO",             m_bForceLambdaScaleVSO    , false         , "Force using Lambda Scale VSO also in non-VSO-Mode")
    767   ("AllowNegDist",                    m_bAllowNegDist           , true          , "Allow negative Distortion in VSO")
    768  
    769   ("UseEstimatedVSD",                 m_bUseEstimatedVSD        , true          , "Model based VSD estimation instead of rendering based for some encoder decisions" )     
    770   ("VSOEarlySkip",                    m_bVSOEarlySkip           , true          , "Early skip of VSO computation if synthesis error assumed to be zero" )     
    771  
    772   ("WVSO",                            m_bUseWVSO                , true          , "Use depth fidelity term for VSO" )
    773   ("VSOWeight",                       m_iVSOWeight              , 10            , "Synthesized View Distortion Change weight" )
    774   ("VSDWeight",                       m_iVSDWeight              , 1             , "View Synthesis Distortion estimate weight" )
    775   ("DWeight",                         m_iDWeight                , 1             , "Depth Distortion weight" )
    776 
     1162  ("TransquantBypassEnableFlag",                      m_TransquantBypassEnableFlag,                     false, "transquant_bypass_enable_flag indicator in PPS")
     1163  ("CUTransquantBypassFlagForce",                     m_CUTransquantBypassFlagForce,                    false, "Force transquant bypass mode, when transquant_bypass_enable_flag is enabled")
     1164  ("CostMode",                                        m_costMode,                         COST_STANDARD_LOSSY, "Use alternative cost functions: choose between 'lossy', 'sequence_level_lossless', 'lossless' (which forces QP to " MACRO_TO_STRING(LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP) ") and 'mixed_lossless_lossy' (which used QP'=" MACRO_TO_STRING(LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP_PRIME) " for pre-estimates of transquant-bypass blocks).")
     1165  ("RecalculateQPAccordingToLambda",                  m_recalculateQPAccordingToLambda,                 false, "Recalculate QP values according to lambda values. Do not suggest to be enabled in all intra case")
     1166  ("StrongIntraSmoothing,-sis",                       m_useStrongIntraSmoothing,                         true, "Enable strong intra smoothing for 32x32 blocks")
     1167  ("SEIActiveParameterSets",                          m_activeParameterSetsSEIEnabled,                      0, "Enable generation of active parameter sets SEI messages")
     1168  ("VuiParametersPresent,-vui",                       m_vuiParametersPresentFlag,                       false, "Enable generation of vui_parameters()")
     1169  ("AspectRatioInfoPresent",                          m_aspectRatioInfoPresentFlag,                     false, "Signals whether aspect_ratio_idc is present")
     1170  ("AspectRatioIdc",                                  m_aspectRatioIdc,                                     0, "aspect_ratio_idc")
     1171  ("SarWidth",                                        m_sarWidth,                                           0, "horizontal size of the sample aspect ratio")
     1172  ("SarHeight",                                       m_sarHeight,                                          0, "vertical size of the sample aspect ratio")
     1173  ("OverscanInfoPresent",                             m_overscanInfoPresentFlag,                        false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
     1174  ("OverscanAppropriate",                             m_overscanAppropriateFlag,                        false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
     1175  ("VideoSignalTypePresent",                          m_videoSignalTypePresentFlag,                     false, "Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present")
     1176  ("VideoFormat",                                     m_videoFormat,                                        5, "Indicates representation of pictures")
     1177  ("VideoFullRange",                                  m_videoFullRangeFlag,                             false, "Indicates the black level and range of luma and chroma signals")
     1178  ("ColourDescriptionPresent",                        m_colourDescriptionPresentFlag,                   false, "Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present")
     1179  ("ColourPrimaries",                                 m_colourPrimaries,                                    2, "Indicates chromaticity coordinates of the source primaries")
     1180  ("TransferCharacteristics",                         m_transferCharacteristics,                            2, "Indicates the opto-electronic transfer characteristics of the source")
     1181  ("MatrixCoefficients",                              m_matrixCoefficients,                                 2, "Describes the matrix coefficients used in deriving luma and chroma from RGB primaries")
     1182  ("ChromaLocInfoPresent",                            m_chromaLocInfoPresentFlag,                       false, "Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present")
     1183  ("ChromaSampleLocTypeTopField",                     m_chromaSampleLocTypeTopField,                        0, "Specifies the location of chroma samples for top field")
     1184  ("ChromaSampleLocTypeBottomField",                  m_chromaSampleLocTypeBottomField,                     0, "Specifies the location of chroma samples for bottom field")
     1185  ("NeutralChromaIndication",                         m_neutralChromaIndicationFlag,                    false, "Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1)")
     1186  ("DefaultDisplayWindowFlag",                        m_defaultDisplayWindowFlag,                       false, "Indicates the presence of the Default Window parameters")
     1187  ("DefDispWinLeftOffset",                            m_defDispWinLeftOffset,                               0, "Specifies the left offset of the default display window from the conformance window")
     1188  ("DefDispWinRightOffset",                           m_defDispWinRightOffset,                              0, "Specifies the right offset of the default display window from the conformance window")
     1189  ("DefDispWinTopOffset",                             m_defDispWinTopOffset,                                0, "Specifies the top offset of the default display window from the conformance window")
     1190  ("DefDispWinBottomOffset",                          m_defDispWinBottomOffset,                             0, "Specifies the bottom offset of the default display window from the conformance window")
     1191  ("FrameFieldInfoPresentFlag",                       m_frameFieldInfoPresentFlag,                      false, "Indicates that pic_struct and field coding related values are present in picture timing SEI messages")
     1192  ("PocProportionalToTimingFlag",                     m_pocProportionalToTimingFlag,                    false, "Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS")
     1193  ("NumTicksPocDiffOneMinus1",                        m_numTicksPocDiffOneMinus1,                           0, "Number of ticks minus 1 that for a POC difference of one")
     1194  ("BitstreamRestriction",                            m_bitstreamRestrictionFlag,                       false, "Signals whether bitstream restriction parameters are present")
     1195  ("TilesFixedStructure",                             m_tilesFixedStructureFlag,                        false, "Indicates that each active picture parameter set has the same values of the syntax elements related to tiles")
     1196  ("MotionVectorsOverPicBoundaries",                  m_motionVectorsOverPicBoundariesFlag,             false, "Indicates that no samples outside the picture boundaries are used for inter prediction")
     1197  ("MaxBytesPerPicDenom",                             m_maxBytesPerPicDenom,                                2, "Indicates a number of bytes not exceeded by the sum of the sizes of the VCL NAL units associated with any coded picture")
     1198  ("MaxBitsPerMinCuDenom",                            m_maxBitsPerMinCuDenom,                               1, "Indicates an upper bound for the number of bits of coding_unit() data")
     1199  ("Log2MaxMvLengthHorizontal",                       m_log2MaxMvLengthHorizontal,                         15, "Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units")
     1200  ("Log2MaxMvLengthVertical",                         m_log2MaxMvLengthVertical,                           15, "Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units")
     1201  ("SEIRecoveryPoint",                                m_recoveryPointSEIEnabled,                            0, "Control generation of recovery point SEI messages")
     1202  ("SEIBufferingPeriod",                              m_bufferingPeriodSEIEnabled,                          0, "Control generation of buffering period SEI messages")
     1203  ("SEIPictureTiming",                                m_pictureTimingSEIEnabled,                            0, "Control generation of picture timing SEI messages")
     1204  ("SEIToneMappingInfo",                              m_toneMappingInfoSEIEnabled,                      false, "Control generation of Tone Mapping SEI messages")
     1205  ("SEIToneMapId",                                    m_toneMapId,                                          0, "Specifies Id of Tone Mapping SEI message for a given session")
     1206  ("SEIToneMapCancelFlag",                            m_toneMapCancelFlag,                              false, "Indicates that Tone Mapping SEI message cancels the persistence or follows")
     1207  ("SEIToneMapPersistenceFlag",                       m_toneMapPersistenceFlag,                          true, "Specifies the persistence of the Tone Mapping SEI message")
     1208  ("SEIToneMapCodedDataBitDepth",                     m_toneMapCodedDataBitDepth,                           8, "Specifies Coded Data BitDepth of Tone Mapping SEI messages")
     1209  ("SEIToneMapTargetBitDepth",                        m_toneMapTargetBitDepth,                              8, "Specifies Output BitDepth of Tone mapping function")
     1210  ("SEIToneMapModelId",                               m_toneMapModelId,                                     0, "Specifies Model utilized for mapping coded data into target_bit_depth range\n"
     1211                                                                                                               "\t0:  linear mapping with clipping\n"
     1212                                                                                                               "\t1:  sigmoidal mapping\n"
     1213                                                                                                               "\t2:  user-defined table mapping\n"
     1214                                                                                                               "\t3:  piece-wise linear mapping\n"
     1215                                                                                                               "\t4:  luminance dynamic range information ")
     1216  ("SEIToneMapMinValue",                              m_toneMapMinValue,                                    0, "Specifies the minimum value in mode 0")
     1217  ("SEIToneMapMaxValue",                              m_toneMapMaxValue,                                 1023, "Specifies the maximum value in mode 0")
     1218  ("SEIToneMapSigmoidMidpoint",                       m_sigmoidMidpoint,                                  512, "Specifies the centre point in mode 1")
     1219  ("SEIToneMapSigmoidWidth",                          m_sigmoidWidth,                                     960, "Specifies the distance between 5% and 95% values of the target_bit_depth in mode 1")
     1220  ("SEIToneMapStartOfCodedInterval",                  cfg_startOfCodedInterval,      cfg_startOfCodedInterval, "Array of user-defined mapping table")
     1221  ("SEIToneMapNumPivots",                             m_numPivots,                                          0, "Specifies the number of pivot points in mode 3")
     1222  ("SEIToneMapCodedPivotValue",                       cfg_codedPivotValue,                cfg_codedPivotValue, "Array of pivot point")
     1223  ("SEIToneMapTargetPivotValue",                      cfg_targetPivotValue,              cfg_targetPivotValue, "Array of pivot point")
     1224  ("SEIToneMapCameraIsoSpeedIdc",                     m_cameraIsoSpeedIdc,                                  0, "Indicates the camera ISO speed for daylight illumination")
     1225  ("SEIToneMapCameraIsoSpeedValue",                   m_cameraIsoSpeedValue,                              400, "Specifies the camera ISO speed for daylight illumination of Extended_ISO")
     1226  ("SEIToneMapExposureIndexIdc",                      m_exposureIndexIdc,                                   0, "Indicates the exposure index setting of the camera")
     1227  ("SEIToneMapExposureIndexValue",                    m_exposureIndexValue,                               400, "Specifies the exposure index setting of the camera of Extended_ISO")
     1228  ("SEIToneMapExposureCompensationValueSignFlag",     m_exposureCompensationValueSignFlag,               false, "Specifies the sign of ExposureCompensationValue")
     1229  ("SEIToneMapExposureCompensationValueNumerator",    m_exposureCompensationValueNumerator,                 0, "Specifies the numerator of ExposureCompensationValue")
     1230  ("SEIToneMapExposureCompensationValueDenomIdc",     m_exposureCompensationValueDenomIdc,                  2, "Specifies the denominator of ExposureCompensationValue")
     1231  ("SEIToneMapRefScreenLuminanceWhite",               m_refScreenLuminanceWhite,                          350, "Specifies reference screen brightness setting in units of candela per square metre")
     1232  ("SEIToneMapExtendedRangeWhiteLevel",               m_extendedRangeWhiteLevel,                          800, "Indicates the luminance dynamic range")
     1233  ("SEIToneMapNominalBlackLevelLumaCodeValue",        m_nominalBlackLevelLumaCodeValue,                    16, "Specifies luma sample value of the nominal black level assigned decoded pictures")
     1234  ("SEIToneMapNominalWhiteLevelLumaCodeValue",        m_nominalWhiteLevelLumaCodeValue,                   235, "Specifies luma sample value of the nominal white level assigned decoded pictures")
     1235  ("SEIToneMapExtendedWhiteLevelLumaCodeValue",       m_extendedWhiteLevelLumaCodeValue,                  300, "Specifies luma sample value of the extended dynamic range assigned decoded pictures")
     1236  ("SEIChromaSamplingFilterHint",                     m_chromaSamplingFilterSEIenabled,                 false, "Control generation of the chroma sampling filter hint SEI message")
     1237  ("SEIChromaSamplingHorizontalFilterType",           m_chromaSamplingHorFilterIdc,                         2, "Defines the Index of the chroma sampling horizontal filter\n"
     1238                                                                                                               "\t0: unspecified  - Chroma filter is unknown or is determined by the application"
     1239                                                                                                               "\t1: User-defined - Filter coefficients are specified in the chroma sampling filter hint SEI message"
     1240                                                                                                               "\t2: Standards-defined - ITU-T Rec. T.800 | ISO/IEC15444-1, 5/3 filter")
     1241  ("SEIChromaSamplingVerticalFilterType",             m_chromaSamplingVerFilterIdc,                         2, "Defines the Index of the chroma sampling vertical filter\n"
     1242                                                                                                               "\t0: unspecified  - Chroma filter is unknown or is determined by the application"
     1243                                                                                                               "\t1: User-defined - Filter coefficients are specified in the chroma sampling filter hint SEI message"
     1244                                                                                                               "\t2: Standards-defined - ITU-T Rec. T.800 | ISO/IEC15444-1, 5/3 filter")
     1245  ("SEIFramePacking",                                 m_framePackingSEIEnabled,                             0, "Control generation of frame packing SEI messages")
     1246  ("SEIFramePackingType",                             m_framePackingSEIType,                                0, "Define frame packing arrangement\n"
     1247                                                                                                               "\t3: side by side - frames are displayed horizontally\n"
     1248                                                                                                               "\t4: top bottom - frames are displayed vertically\n"
     1249                                                                                                               "\t5: frame alternation - one frame is alternated with the other")
     1250  ("SEIFramePackingId",                               m_framePackingSEIId,                                  0, "Id of frame packing SEI message for a given session")
     1251  ("SEIFramePackingQuincunx",                         m_framePackingSEIQuincunx,                            0, "Indicate the presence of a Quincunx type video frame")
     1252  ("SEIFramePackingInterpretation",                   m_framePackingSEIInterpretation,                      0, "Indicate the interpretation of the frame pair\n"
     1253                                                                                                               "\t0: unspecified\n"
     1254                                                                                                               "\t1: stereo pair, frame0 represents left view\n"
     1255                                                                                                               "\t2: stereo pair, frame0 represents right view")
     1256  ("SEISegmentedRectFramePacking",                    m_segmentedRectFramePackingSEIEnabled,                0, "Controls generation of segmented rectangular frame packing SEI messages")
     1257  ("SEISegmentedRectFramePackingCancel",              m_segmentedRectFramePackingSEICancel,             false, "If equal to 1, cancels the persistence of any previous SRFPA SEI message")
     1258  ("SEISegmentedRectFramePackingType",                m_segmentedRectFramePackingSEIType,                   0, "Specifies the arrangement of the frames in the reconstructed picture")
     1259  ("SEISegmentedRectFramePackingPersistence",         m_segmentedRectFramePackingSEIPersistence,        false, "If equal to 0, the SEI applies to the current frame only")
     1260  ("SEIDisplayOrientation",                           m_displayOrientationSEIAngle,                         0, "Control generation of display orientation SEI messages\n"
     1261                                                                                                               "\tN: 0 < N < (2^16 - 1) enable display orientation SEI message with anticlockwise_rotation = N and display_orientation_repetition_period = 1\n"
     1262                                                                                                               "\t0: disable")
     1263  ("SEITemporalLevel0Index",                          m_temporalLevel0IndexSEIEnabled,                      0, "Control generation of temporal level 0 index SEI messages")
     1264  ("SEIGradualDecodingRefreshInfo",                   m_gradualDecodingRefreshInfoEnabled,                  0, "Control generation of gradual decoding refresh information SEI message")
     1265  ("SEINoDisplay",                                    m_noDisplaySEITLayer,                                 0, "Control generation of no display SEI message\n"
     1266                                                                                                               "\tN: 0 < N enable no display SEI message for temporal layer N or higher\n"
     1267                                                                                                               "\t0: disable")
     1268  ("SEIDecodingUnitInfo",                             m_decodingUnitInfoSEIEnabled,                         0, "Control generation of decoding unit information SEI message.")
     1269  ("SEISOPDescription",                               m_SOPDescriptionSEIEnabled,                           0, "Control generation of SOP description SEI messages")
     1270  ("SEIScalableNesting",                              m_scalableNestingSEIEnabled,                          0, "Control generation of scalable nesting SEI messages")
     1271  ("SEITempMotionConstrainedTileSets",                m_tmctsSEIEnabled,                                false, "Control generation of temporal motion constrained tile sets SEI message")
     1272  ("SEITimeCodeEnabled",                              m_timeCodeSEIEnabled,                             false, "Control generation of time code information SEI message")
     1273  ("SEITimeCodeNumClockTs",                           m_timeCodeSEINumTs,                                   0, "Number of clock time sets [0..3]")
     1274  ("SEITimeCodeTimeStampFlag",                        cfg_timeCodeSeiTimeStampFlag,          cfg_timeCodeSeiTimeStampFlag,         "Time stamp flag associated to each time set")
     1275  ("SEITimeCodeFieldBasedFlag",                       cfg_timeCodeSeiNumUnitFieldBasedFlag,  cfg_timeCodeSeiNumUnitFieldBasedFlag, "Field based flag associated to each time set")
     1276  ("SEITimeCodeCountingType",                         cfg_timeCodeSeiCountingType,           cfg_timeCodeSeiCountingType,          "Counting type associated to each time set")
     1277  ("SEITimeCodeFullTsFlag",                           cfg_timeCodeSeiFullTimeStampFlag,      cfg_timeCodeSeiFullTimeStampFlag,     "Full time stamp flag associated to each time set")
     1278  ("SEITimeCodeDiscontinuityFlag",                    cfg_timeCodeSeiDiscontinuityFlag,      cfg_timeCodeSeiDiscontinuityFlag,     "Discontinuity flag associated to each time set")
     1279  ("SEITimeCodeCntDroppedFlag",                       cfg_timeCodeSeiCntDroppedFlag,         cfg_timeCodeSeiCntDroppedFlag,        "Counter dropped flag associated to each time set")
     1280  ("SEITimeCodeNumFrames",                            cfg_timeCodeSeiNumberOfFrames,         cfg_timeCodeSeiNumberOfFrames,        "Number of frames associated to each time set")
     1281  ("SEITimeCodeSecondsValue",                         cfg_timeCodeSeiSecondsValue,           cfg_timeCodeSeiSecondsValue,          "Seconds value for each time set")
     1282  ("SEITimeCodeMinutesValue",                         cfg_timeCodeSeiMinutesValue,           cfg_timeCodeSeiMinutesValue,          "Minutes value for each time set")
     1283  ("SEITimeCodeHoursValue",                           cfg_timeCodeSeiHoursValue,             cfg_timeCodeSeiHoursValue,            "Hours value for each time set")
     1284  ("SEITimeCodeSecondsFlag",                          cfg_timeCodeSeiSecondsFlag,            cfg_timeCodeSeiSecondsFlag,           "Flag to signal seconds value presence in each time set")
     1285  ("SEITimeCodeMinutesFlag",                          cfg_timeCodeSeiMinutesFlag,            cfg_timeCodeSeiMinutesFlag,           "Flag to signal minutes value presence in each time set")
     1286  ("SEITimeCodeHoursFlag",                            cfg_timeCodeSeiHoursFlag,              cfg_timeCodeSeiHoursFlag,             "Flag to signal hours value presence in each time set")
     1287  ("SEITimeCodeOffsetLength",                         cfg_timeCodeSeiTimeOffsetLength,       cfg_timeCodeSeiTimeOffsetLength,      "Time offset length associated to each time set")
     1288  ("SEITimeCodeTimeOffset",                           cfg_timeCodeSeiTimeOffsetValue,        cfg_timeCodeSeiTimeOffsetValue,       "Time offset associated to each time set")
     1289  ("SEIKneeFunctionInfo",                             m_kneeSEIEnabled,                                 false, "Control generation of Knee function SEI messages")
     1290  ("SEIKneeFunctionId",                               m_kneeSEIId,                                          0, "Specifies Id of Knee function SEI message for a given session")
     1291  ("SEIKneeFunctionCancelFlag",                       m_kneeSEICancelFlag,                              false, "Indicates that Knee function SEI message cancels the persistence or follows")
     1292  ("SEIKneeFunctionPersistenceFlag",                  m_kneeSEIPersistenceFlag,                          true, "Specifies the persistence of the Knee function SEI message")
     1293  ("SEIKneeFunctionInputDrange",                      m_kneeSEIInputDrange,                              1000, "Specifies the peak luminance level for the input picture of Knee function SEI messages")
     1294  ("SEIKneeFunctionInputDispLuminance",               m_kneeSEIInputDispLuminance,                        100, "Specifies the expected display brightness for the input picture of Knee function SEI messages")
     1295  ("SEIKneeFunctionOutputDrange",                     m_kneeSEIOutputDrange,                             4000, "Specifies the peak luminance level for the output picture of Knee function SEI messages")
     1296  ("SEIKneeFunctionOutputDispLuminance",              m_kneeSEIOutputDispLuminance,                       800, "Specifies the expected display brightness for the output picture of Knee function SEI messages")
     1297  ("SEIKneeFunctionNumKneePointsMinus1",              m_kneeSEINumKneePointsMinus1,                         2, "Specifies the number of knee points - 1")
     1298  ("SEIKneeFunctionInputKneePointValue",              cfg_kneeSEIInputKneePointValue,   cfg_kneeSEIInputKneePointValue, "Array of input knee point")
     1299  ("SEIKneeFunctionOutputKneePointValue",             cfg_kneeSEIOutputKneePointValue, cfg_kneeSEIOutputKneePointValue, "Array of output knee point")
     1300  ("SEIMasteringDisplayColourVolume",                 m_masteringDisplay.colourVolumeSEIEnabled,         false, "Control generation of mastering display colour volume SEI messages")
     1301  ("SEIMasteringDisplayMaxLuminance",                 m_masteringDisplay.maxLuminance,                  10000u, "Specifies the mastering display maximum luminance value in units of 1/10000 candela per square metre (32-bit code value)")
     1302  ("SEIMasteringDisplayMinLuminance",                 m_masteringDisplay.minLuminance,                      0u, "Specifies the mastering display minimum luminance value in units of 1/10000 candela per square metre (32-bit code value)")
     1303  ("SEIMasteringDisplayPrimaries",                    cfg_DisplayPrimariesCode,       cfg_DisplayPrimariesCode, "Mastering display primaries for all three colour planes in CIE xy coordinates in increments of 1/50000 (results in the ranges 0 to 50000 inclusive)")
     1304  ("SEIMasteringDisplayWhitePoint",                   cfg_DisplayWhitePointCode,     cfg_DisplayWhitePointCode, "Mastering display white point CIE xy coordinates in normalised increments of 1/50000 (e.g. 0.333 = 16667)")
     1305#if NH_MV
     1306  ("SubBitstreamPropSEIEnabled",                      m_subBistreamPropSEIEnabled,    false                     ,"Enable signaling of sub-bitstream property SEI message")
     1307  ("SEISubBitstreamNumAdditionalSubStreams",          m_sbPropNumAdditionalSubStreams,0                         ,"Number of substreams for which additional information is signalled")
     1308  ("SEISubBitstreamSubBitstreamMode",                 m_sbPropSubBitstreamMode,       std::vector< Int  >(1,0)  ,"Specifies mode of generation of the i-th sub-bitstream (0 or 1)")
     1309  ("SEISubBitstreamOutputLayerSetIdxToVps",           m_sbPropOutputLayerSetIdxToVps, std::vector< Int  >(1,0)  ,"Specifies output layer set index of the i-th sub-bitstream ")
     1310  ("SEISubBitstreamHighestSublayerId",                m_sbPropHighestSublayerId,      std::vector< Int  >(1,0)  ,"Specifies highest TemporalId of the i-th sub-bitstream")
     1311  ("SEISubBitstreamAvgBitRate",                       m_sbPropAvgBitRate,             std::vector< Int  >(1,0)  ,"Specifies average bit rate of the i-th sub-bitstream")
     1312  ("SEISubBitstreamMaxBitRate",                       m_sbPropMaxBitRate,             std::vector< Int  >(1,0)  ,"Specifies maximum bit rate of the i-th sub-bitstream")
     1313
     1314  ("OutputVpsInfo",                                   m_outputVpsInfo,                false                     ,"Output information about the layer dependencies and layer sets")
     1315#endif
     1316#if NH_3D
     1317/* Camera parameters */ 
     1318  ("Depth420OutputFlag",                              m_depth420OutputFlag,           true                     , "Output depth layers in 4:2:0 ")
     1319  ("CameraParameterFile,cpf",                         m_pchCameraParameterFile,    (Char *) 0,                    "Camera Parameter File Name")
     1320  ("BaseViewCameraNumbers",                           m_pchBaseViewCameraNumbers,  (Char *) 0,                    "Numbers of base views")
     1321  ("CodedCamParsPrecision",                           m_iCodedCamParPrecision,      STD_CAM_PARAMETERS_PRECISION, "precision for coding of camera parameters (in units of 2^(-x) luma samples)" )
     1322
     1323#if NH_3D_VSO
     1324  /* View Synthesis Optimization */
     1325  ("VSOConfig",                                       m_pchVSOConfig            , (Char *) 0                    ,"VSO configuration")
     1326  ("VSO",                                             m_bUseVSO                 , false                         ,"Use VSO" )   
     1327  ("VSOMode",                                         m_uiVSOMode               , (UInt)   4                    ,"VSO Mode")
     1328  ("LambdaScaleVSO",                                  m_dLambdaScaleVSO         , (Double) 1                    ,"Lambda Scaling for VSO")
     1329  ("VSOLSTable",                                      m_bVSOLSTable             , true                          ,"Depth QP dependent video/depth rate allocation by Lagrange multiplier" )     
     1330  ("ForceLambdaScaleVSO",                             m_bForceLambdaScaleVSO    , false                         ,"Force using Lambda Scale VSO also in non-VSO-Mode")
     1331  ("AllowNegDist",                                    m_bAllowNegDist           , true                          ,"Allow negative Distortion in VSO")
     1332                                                                                                             
     1333  ("UseEstimatedVSD",                                 m_bUseEstimatedVSD        , true                          ,"Model based VSD estimation instead of rendering based for some encoder decisions" )     
     1334  ("VSOEarlySkip",                                    m_bVSOEarlySkip           , true                          ,"Early skip of VSO computation if synthesis error assumed to be zero" )     
     1335                                                                                                               
     1336  ("WVSO",                                            m_bUseWVSO                , true                          ,"Use depth fidelity term for VSO" )
     1337  ("VSOWeight",                                       m_iVSOWeight              , 10                            ,"Synthesized View Distortion Change weight" )
     1338  ("VSDWeight",                                       m_iVSDWeight              , 1                             ,"View Synthesis Distortion estimate weight" )
     1339  ("DWeight",                                         m_iDWeight                , 1                             ,"Depth Distortion weight" )
    7771340#endif //HHI_VSO
    778   ("QTL",                             m_bUseQTL                 , true          , "Use depth quad tree limitation (encoder only)" )
    779 
    780   ("IvMvPredFlag"          , m_ivMvPredFlag          , std::vector< Bool >(2,true)                    , "Inter-view motion prediction"              )
    781   ("IvMvScalingFlag"       , m_ivMvScalingFlag       , std::vector< Bool >(2,true)                    , "Inter-view motion vector scaling"          )
    782   ("Log2SubPbSizeMinus3"   , m_log2SubPbSizeMinus3   , 0                                              , "Log2 minus 3 of sub Pb size"               )
    783   ("IvResPredFlag"         , m_ivResPredFlag         , true                                           , "Inter-view residual prediction"            )
    784   ("DepthRefinementFlag"   , m_depthRefinementFlag   , true                                           , "Depth to refine disparity"                 )
    785   ("ViewSynthesisPredFlag" , m_viewSynthesisPredFlag , true                                           , "View synthesis prediction"                 )
    786   ("DepthBasedBlkPartFlag" , m_depthBasedBlkPartFlag , true                                           , "Depth base block partitioning"             )
    787   ("MpiFlag"               , m_mpiFlag               , true                                           , "Motion inheritance from texture to depth"  )
    788   ("Log2MpiSubPbSizeMinus3", m_log2MpiSubPbSizeMinus3, 0                                              , "Log2 minus 3 of sub Pb size for MPI"       )
    789   ("IntraContourFlag"      , m_intraContourFlag      , true                                           , "Intra contour mode"                        )
    790   ("IntraWedgeFlag"        , m_intraWedgeFlag        , true                                           , "Intra wedge mode and segmental depth DCs"  )
    791   ("IntraSdcFlag"          , m_intraSdcFlag          , true                                           , "Intra depth DCs"                           )
    792   ("QtPredFlag"            , m_qtPredFlag            , true                                           , "Quad tree prediction from texture to depth")
    793   ("InterSdcFlag"          , m_interSdcFlag          , true                                           , "Inter depth DCs"                           )
    794   ("DepthIntraSkip"        , m_depthIntraSkipFlag    , true                                           , "Depth intra skip mode"                     )
     1341/* 3D- HEVC Tools */                                                           
     1342  ("QTL"                   ,                          m_bUseQTL                 , true                          , "Use depth quad tree limitation (encoder only)" )
     1343  ("IvMvPredFlag"          ,                          m_ivMvPredFlag            , BoolAry1d(2,true)             , "Inter-view motion prediction"              )
     1344  ("IvMvScalingFlag"       ,                          m_ivMvScalingFlag         , BoolAry1d(2,true)             , "Inter-view motion vector scaling"          )
     1345  ("Log2SubPbSizeMinus3"   ,                          m_log2SubPbSizeMinus3     , 0                             , "Log2 minus 3 of sub Pb size"               )
     1346  ("IvResPredFlag"         ,                          m_ivResPredFlag           , true                          , "Inter-view residual prediction"            )
     1347  ("DepthRefinementFlag"   ,                          m_depthRefinementFlag     , true                          , "Depth to refine disparity"                 )
     1348  ("ViewSynthesisPredFlag" ,                          m_viewSynthesisPredFlag   , true                          , "View synthesis prediction"                 )
     1349  ("DepthBasedBlkPartFlag" ,                          m_depthBasedBlkPartFlag   , true                          , "Depth base block partitioning"             )
     1350  ("MpiFlag"               ,                          m_mpiFlag                 , true                          , "Motion inheritance from texture to depth"  )
     1351  ("Log2MpiSubPbSizeMinus3",                          m_log2MpiSubPbSizeMinus3  , 0                             , "Log2 minus 3 of sub Pb size for MPI"       )
     1352  ("IntraContourFlag"      ,                          m_intraContourFlag        , true                          , "Intra contour mode"                        )
     1353  ("IntraWedgeFlag"        ,                          m_intraWedgeFlag          , true                          , "Intra wedge mode and segmental depth DCs"  )
     1354  ("IntraSdcFlag"          ,                          m_intraSdcFlag            , true                          , "Intra depth DCs"                           )
     1355  ("QtPredFlag"            ,                          m_qtPredFlag              , true                          , "Quad tree prediction from texture to depth")
     1356  ("InterSdcFlag"          ,                          m_interSdcFlag            , true                          , "Inter depth DCs"                           )
     1357  ("DepthIntraSkip"        ,                          m_depthIntraSkipFlag      , true                          , "Depth intra skip mode"                     )
     1358  ("DLT"                   ,                          m_useDLT                  , true                          , "Depth lookup table"                        )
     1359  ("IlluCompEnable"        ,                          m_abUseIC                 , true                          , "Enable illumination compensation"          )
     1360  ("IlluCompLowLatencyEnc" ,                          m_bUseLowLatencyICEnc     , false                         , "Enable low-latency illumination compensation encoding")
    7951361#endif //H_3D
     1362   
    7961363  ;
    7971364
    798 #if H_MV
     1365#if NH_MV   
    7991366  // parse coding structure
    8001367  for( Int k = 0; k < MAX_NUM_LAYERS; k++ )
     
    8271394
    8281395
    829       for( Int i = 1; i < MAX_GOP + 1; i++ )
    830       {
     1396  for(Int i=1; i<MAX_GOP+1; i++)
     1397  {
    8311398        std::ostringstream cOSS2;
    8321399        cOSS2<<"Frame"<<i<<"_l"<<k;
     
    8401407  }
    8411408#else
    842   for(Int i=1; i<MAX_GOP+1; i++) {
     1409  for(Int i=1; i<MAX_GOP+1; i++)
     1410  {
    8431411    std::ostringstream cOSS;
    8441412    cOSS<<"Frame"<<i;
     
    8471415#endif
    8481416  po::setDefaults(opts);
    849   const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
     1417  po::ErrorReporter err;
     1418  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv, err);
     1419
     1420  for (list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
     1421  {
     1422    fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
     1423  }
     1424
     1425  if (argc == 1 || do_help)
     1426  {
     1427    /* argc == 1: no options have been specified */
     1428    po::doHelp(cout, opts);
     1429    return false;
     1430  }
     1431
     1432  if (err.is_errored)
     1433  {
     1434    if (!warnUnknowParameter)
     1435    {
     1436      /* error report has already been printed on stderr */
     1437      return false;
     1438    }
     1439  }
     1440
     1441  /*
     1442   * Set any derived parameters
     1443   */
     1444  /* convert std::string to c string for compatability */
     1445#if !NH_MV
     1446  m_pchInputFile = cfg_InputFile.empty() ? NULL : strdup(cfg_InputFile.c_str());
     1447#endif
     1448  m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
     1449#if !NH_MV
     1450  m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str());
     1451#endif
     1452  m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str());
    8501453
    8511454  if(m_isField)
     
    8581461    m_framesToBeEncoded *= 2;
    8591462  }
    860  
    861   for (list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
    862   {
    863     fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
    864   }
    865  
    866   if (argc == 1 || do_help)
    867   {
    868     /* argc == 1: no options have been specified */
    869     po::doHelp(cout, opts);
    870     return false;
    871   }
    872  
    873   /*
    874    * Set any derived parameters
    875    */
    876   /* convert std::string to c string for compatability */
    877 #if !H_MV
    878   m_pchInputFile = cfg_InputFile.empty() ? NULL : strdup(cfg_InputFile.c_str());
    879 #endif
    880   m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
    881 #if !H_MV
    882   m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str());
    883 #endif
    884   m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str());
    885  
    886   Char* pColumnWidth = cfgColumnWidth.empty() ? NULL: strdup(cfgColumnWidth.c_str());
    887   Char* pRowHeight = cfgRowHeight.empty() ? NULL : strdup(cfgRowHeight.c_str());
    8881463
    8891464  if( !m_tileUniformSpacingFlag && m_numTileColumnsMinus1 > 0 )
    8901465  {
    891     char *str;
    892     int  i=0;
    893     m_tileColumnWidth.resize( m_numTileColumnsMinus1 );
    894     str = strtok(pColumnWidth, " ,-");
    895     while(str!=NULL)
    896     {
    897       if( i >= m_numTileColumnsMinus1 )
    898       {
    899         printf( "The number of columns whose width are defined is larger than the allowed number of columns.\n" );
    900         exit( EXIT_FAILURE );
    901       }
    902       m_tileColumnWidth[i] = atoi( str );
    903       str = strtok(NULL, " ,-");
    904       i++;
    905     }
    906     if( i < m_numTileColumnsMinus1 )
     1466    if (cfg_ColumnWidth.values.size() > m_numTileColumnsMinus1)
     1467    {
     1468      printf( "The number of columns whose width are defined is larger than the allowed number of columns.\n" );
     1469      exit( EXIT_FAILURE );
     1470    }
     1471    else if (cfg_ColumnWidth.values.size() < m_numTileColumnsMinus1)
    9071472    {
    9081473      printf( "The width of some columns is not defined.\n" );
    9091474      exit( EXIT_FAILURE );
    9101475    }
     1476    else
     1477    {
     1478      m_tileColumnWidth.resize(m_numTileColumnsMinus1);
     1479      for(UInt i=0; i<cfg_ColumnWidth.values.size(); i++)
     1480      {
     1481        m_tileColumnWidth[i]=cfg_ColumnWidth.values[i];
     1482      }
     1483    }
    9111484  }
    9121485  else
     
    9171490  if( !m_tileUniformSpacingFlag && m_numTileRowsMinus1 > 0 )
    9181491  {
    919     char *str;
    920     int  i=0;
    921     m_tileRowHeight.resize(m_numTileRowsMinus1);
    922     str = strtok(pRowHeight, " ,-");
    923     while(str!=NULL)
    924     {
    925       if( i>=m_numTileRowsMinus1 )
    926       {
    927         printf( "The number of rows whose height are defined is larger than the allowed number of rows.\n" );
    928         exit( EXIT_FAILURE );
    929       }
    930       m_tileRowHeight[i] = atoi( str );
    931       str = strtok(NULL, " ,-");
    932       i++;
    933     }
    934     if( i < m_numTileRowsMinus1 )
     1492    if (cfg_RowHeight.values.size() > m_numTileRowsMinus1)
     1493    {
     1494      printf( "The number of rows whose height are defined is larger than the allowed number of rows.\n" );
     1495      exit( EXIT_FAILURE );
     1496    }
     1497    else if (cfg_RowHeight.values.size() < m_numTileRowsMinus1)
    9351498    {
    9361499      printf( "The height of some rows is not defined.\n" );
    9371500      exit( EXIT_FAILURE );
    938    }
     1501    }
     1502    else
     1503    {
     1504      m_tileRowHeight.resize(m_numTileRowsMinus1);
     1505      for(UInt i=0; i<cfg_RowHeight.values.size(); i++)
     1506      {
     1507        m_tileRowHeight[i]=cfg_RowHeight.values[i];
     1508      }
     1509    }
    9391510  }
    9401511  else
     
    9421513    m_tileRowHeight.clear();
    9431514  }
    944 #if H_MV
    945   free ( pColumnWidth );
    946   free ( pRowHeight   );
    947 #endif
     1515
    9481516  m_scalingListFile = cfg_ScalingListFile.empty() ? NULL : strdup(cfg_ScalingListFile.c_str());
    949  
     1517
    9501518  /* rules for input, output and internal bitdepths as per help text */
    951   if (!m_internalBitDepthY) { m_internalBitDepthY = m_inputBitDepthY; }
    952   if (!m_internalBitDepthC) { m_internalBitDepthC = m_internalBitDepthY; }
    953   if (!m_inputBitDepthC) { m_inputBitDepthC = m_inputBitDepthY; }
    954   if (!m_outputBitDepthY) { m_outputBitDepthY = m_internalBitDepthY; }
    955   if (!m_outputBitDepthC) { m_outputBitDepthC = m_internalBitDepthC; }
    956 
    957   // TODO:ChromaFmt assumes 4:2:0 below
     1519  if (m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ] == 0)
     1520  {
     1521    m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ] = m_inputBitDepth      [CHANNEL_TYPE_LUMA  ];
     1522  }
     1523  if (m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] == 0)
     1524  {
     1525    m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] = m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ];
     1526  }
     1527  if (m_internalBitDepth   [CHANNEL_TYPE_LUMA  ] == 0)
     1528  {
     1529    m_internalBitDepth   [CHANNEL_TYPE_LUMA  ] = m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ];
     1530  }
     1531  if (m_internalBitDepth   [CHANNEL_TYPE_CHROMA] == 0)
     1532  {
     1533    m_internalBitDepth   [CHANNEL_TYPE_CHROMA] = m_internalBitDepth   [CHANNEL_TYPE_LUMA  ];
     1534  }
     1535  if (m_inputBitDepth      [CHANNEL_TYPE_CHROMA] == 0)
     1536  {
     1537    m_inputBitDepth      [CHANNEL_TYPE_CHROMA] = m_inputBitDepth      [CHANNEL_TYPE_LUMA  ];
     1538  }
     1539  if (m_outputBitDepth     [CHANNEL_TYPE_LUMA  ] == 0)
     1540  {
     1541    m_outputBitDepth     [CHANNEL_TYPE_LUMA  ] = m_internalBitDepth   [CHANNEL_TYPE_LUMA  ];
     1542  }
     1543  if (m_outputBitDepth     [CHANNEL_TYPE_CHROMA] == 0)
     1544  {
     1545    m_outputBitDepth     [CHANNEL_TYPE_CHROMA] = m_internalBitDepth   [CHANNEL_TYPE_CHROMA];
     1546  }
     1547
     1548  m_InputChromaFormatIDC = numberToChromaFormat(tmpInputChromaFormat);
     1549  m_chromaFormatIDC      = ((tmpChromaFormat == 0) ? (m_InputChromaFormatIDC) : (numberToChromaFormat(tmpChromaFormat)));
     1550
     1551#if NH_MV
     1552  // parse PTL
     1553  Bool anyEmpty = false;
     1554  if( cfg_profiles.empty() )
     1555  {
     1556#if NH_3D
     1557    cfg_profiles = string("main main 3d-main");
     1558#else
     1559    cfg_profiles = string("main main multiview-main");   
     1560#endif
     1561    fprintf(stderr, "\nWarning: No profiles given, using defaults: %s", cfg_profiles.c_str() );
     1562    anyEmpty = true;
     1563  }
     1564
     1565  if( cfg_levels.empty() )
     1566  {
     1567    cfg_levels = string("5.1 5.1 5.1");
     1568    fprintf(stderr, "\nWarning: No levels given, using defaults: %s", cfg_levels.c_str() );
     1569    anyEmpty = true;
     1570  }
     1571
     1572  if( cfg_tiers.empty() )
     1573  {
     1574    cfg_tiers = string("main main main");
     1575    fprintf(stderr, "\nWarning: No tiers given, using defaults: %s", cfg_tiers.c_str());
     1576    anyEmpty = true;
     1577  }
     1578
     1579  if( m_inblFlag.empty() )
     1580  {
     1581    fprintf(stderr, "\nWarning: No inblFlags given, using defaults:");
     1582    for( Int i = 0; i < 3; i++)
     1583    {
     1584      m_inblFlag.push_back( false );
     1585      fprintf(stderr," %d", (Int) m_inblFlag[i]);
     1586    }
     1587    anyEmpty = true;
     1588  }   
     1589
     1590  if ( anyEmpty )
     1591  {
     1592    fprintf( stderr, "\n" );
     1593  }
     1594
     1595  xReadStrToEnum( cfg_profiles, extendedProfiles  );
     1596  xReadStrToEnum( cfg_levels,   m_level     );
     1597  xReadStrToEnum( cfg_tiers ,   m_levelTier );
     1598
     1599
     1600#if NH_MV
     1601  m_profiles.resize( extendedProfiles.size());
     1602
     1603  for (Int i = 0; i < m_profiles.size(); i++)
     1604  {
     1605    Profile::Name& m_profile             = m_profiles      [i]; 
     1606    ExtendedProfileName& extendedProfile = extendedProfiles[i]; 
     1607#endif
     1608#endif
     1609
     1610  if (extendedProfile >= 1000 && extendedProfile <= 12316)
     1611    {
     1612      m_profile = Profile::MAINREXT;
     1613      if (m_bitDepthConstraint != 0 || tmpConstraintChromaFormat != 0)
     1614      {
     1615        fprintf(stderr, "Error: The bit depth and chroma format constraints are not used when an explicit RExt profile is specified\n");
     1616        exit(EXIT_FAILURE);
     1617      }
     1618      m_bitDepthConstraint     = (extendedProfile%100);
     1619    m_intraConstraintFlag          = ((extendedProfile%10000)>=2000);
     1620    m_onePictureOnlyConstraintFlag = (extendedProfile >= 10000);
     1621      switch ((extendedProfile/100)%10)
     1622      {
     1623      case 0:  tmpConstraintChromaFormat=400; break;
     1624      case 1:  tmpConstraintChromaFormat=420; break;
     1625      case 2:  tmpConstraintChromaFormat=422; break;
     1626      default: tmpConstraintChromaFormat=444; break;
     1627      }
     1628    }
     1629    else
     1630    {
     1631      m_profile = Profile::Name(extendedProfile);
     1632    }
     1633
     1634    if (m_profile == Profile::HIGHTHROUGHPUTREXT )
     1635    {
     1636      if (m_bitDepthConstraint == 0)
     1637      {
     1638        m_bitDepthConstraint = 16;
     1639      }
     1640      m_chromaFormatConstraint = (tmpConstraintChromaFormat == 0) ? CHROMA_444 : numberToChromaFormat(tmpConstraintChromaFormat);
     1641    }
     1642    else if (m_profile == Profile::MAINREXT)
     1643    {
     1644      if (m_bitDepthConstraint == 0 && tmpConstraintChromaFormat == 0)
     1645      {
     1646        // produce a valid combination, if possible.
     1647      const Bool bUsingGeneralRExtTools  = m_transformSkipRotationEnabledFlag        ||
     1648                                           m_transformSkipContextEnabledFlag         ||
     1649                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT] ||
     1650                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT] ||
     1651          !m_enableIntraReferenceSmoothing         ||
     1652                                           m_persistentRiceAdaptationEnabledFlag     ||
     1653                                           m_log2MaxTransformSkipBlockSize!=2;
     1654      const Bool bUsingChromaQPAdjustment= m_diffCuChromaQpOffsetDepth >= 0;
     1655      const Bool bUsingExtendedPrecision = m_extendedPrecisionProcessingFlag;
     1656      if (m_onePictureOnlyConstraintFlag)
     1657      {
     1658        m_chromaFormatConstraint = CHROMA_444;
     1659        if (m_intraConstraintFlag != true)
     1660        {
     1661          fprintf(stderr, "Error: Intra constraint flag must be true when one_picture_only_constraint_flag is true\n");
     1662          exit(EXIT_FAILURE);
     1663        }
     1664        const Int maxBitDepth = m_chromaFormatIDC==CHROMA_400 ? m_internalBitDepth[CHANNEL_TYPE_LUMA] : std::max(m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA]);
     1665        m_bitDepthConstraint = maxBitDepth>8 ? 16:8;
     1666      }
     1667      else
     1668      {
     1669        m_chromaFormatConstraint = NUM_CHROMA_FORMAT;
     1670        automaticallySelectRExtProfile(bUsingGeneralRExtTools,
     1671          bUsingChromaQPAdjustment,
     1672          bUsingExtendedPrecision,
     1673          m_intraConstraintFlag,
     1674          m_bitDepthConstraint,
     1675          m_chromaFormatConstraint,
     1676          m_chromaFormatIDC==CHROMA_400 ? m_internalBitDepth[CHANNEL_TYPE_LUMA] : std::max(m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA]),
     1677          m_chromaFormatIDC);
     1678      }
     1679    }
     1680      else if (m_bitDepthConstraint == 0 || tmpConstraintChromaFormat == 0)
     1681      {
     1682        fprintf(stderr, "Error: The bit depth and chroma format constraints must either both be specified or both be configured automatically\n");
     1683        exit(EXIT_FAILURE);
     1684      }
     1685      else
     1686      {
     1687        m_chromaFormatConstraint = numberToChromaFormat(tmpConstraintChromaFormat);
     1688      }
     1689    }
     1690    else
     1691    {
     1692      m_chromaFormatConstraint = (tmpConstraintChromaFormat == 0) ? m_chromaFormatIDC : numberToChromaFormat(tmpConstraintChromaFormat);
     1693      m_bitDepthConstraint = (m_profile == Profile::MAIN10?10:8);
     1694    }
     1695#if NH_MV
     1696  }
     1697
     1698  if ( m_numberOfLayers != 0 && ( m_profiles[0] != Profile::MAIN || m_profiles[1] != Profile::MAIN )  )
     1699  {
     1700    fprintf(stderr, "Error: The base layer must conform to the Main profile for Multilayer coding.\n");
     1701    exit(EXIT_FAILURE);
     1702  }
     1703#endif
     1704
     1705
     1706  m_inputColourSpaceConvert = stringToInputColourSpaceConvert(inputColourSpaceConvert, true);
     1707
    9581708  switch (m_conformanceWindowMode)
    9591709  {
     
    9841734        }
    9851735      }
    986       if (m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0)
     1736      if (m_aiPad[0] % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0)
    9871737      {
    9881738        fprintf(stderr, "Error: picture width is not an integer multiple of the specified chroma subsampling\n");
    9891739        exit(EXIT_FAILURE);
    9901740      }
    991       if (m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0)
     1741      if (m_aiPad[1] % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0)
    9921742      {
    9931743        fprintf(stderr, "Error: picture height is not an integer multiple of the specified chroma subsampling\n");
     
    10201770    }
    10211771  }
    1022  
     1772
    10231773  // allocate slice-based dQP values
    1024 #if H_MV
     1774#if NH_MV
     1775  for (Int i = m_layerIdInNuh.size(); i < m_numberOfLayers; i++ )
     1776  {
     1777    m_layerIdInNuh.push_back( i == 0 ? 0 : m_layerIdInNuh[ i - 1 ] + 1 );
     1778  }
     1779  xResizeVector( m_layerIdInNuh );
     1780
    10251781  xResizeVector( m_viewOrderIndex    );
    10261782
     
    10411797  xResizeVector( m_auxId );
    10421798
    1043 #if H_3D
     1799#if NH_3D
    10441800  xResizeVector( m_depthFlag );
    10451801#endif
     
    10621818      {
    10631819        m_aidQP[layer][i] = 1;
     1820      }
     1821    }
     1822
     1823    for(UInt ch=0; ch<MAX_NUM_CHANNEL_TYPE; ch++)
     1824    {
     1825      if (saoOffsetBitShift[ch]<0)
     1826      {
     1827        if (m_internalBitDepth[ch]>10)
     1828        {
     1829          m_log2SaoOffsetScale[layer][ch]=UInt(Clip3<Int>(0, m_internalBitDepth[ch]-10, Int(m_internalBitDepth[ch]-10 + 0.165*m_iQP[layer] - 3.22 + 0.5) ) );
     1830        }
     1831        else
     1832        {
     1833          m_log2SaoOffsetScale[layer][ch]=0;
     1834        }
     1835      }
     1836      else
     1837      {
     1838        m_log2SaoOffsetScale[layer][ch]=UInt(saoOffsetBitShift[ch]);
    10641839      }
    10651840    }
     
    10801855  m_aidQP = new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ];
    10811856  ::memset( m_aidQP, 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );
    1082  
     1857
    10831858  // handling of floating-point QP values
    10841859  // if QP is not integer, sequence is split into two sections having QP and QP+1
     
    10871862  {
    10881863    Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP - m_iQP)*m_framesToBeEncoded + 0.5 );
    1089    
     1864
    10901865    iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
    10911866    for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
     
    10941869    }
    10951870  }
    1096 #endif
    1097  
     1871
     1872  for(UInt ch=0; ch<MAX_NUM_CHANNEL_TYPE; ch++)
     1873  {
     1874    if (saoOffsetBitShift[ch]<0)
     1875    {
     1876      if (m_internalBitDepth[ch]>10)
     1877      {
     1878        m_log2SaoOffsetScale[ch]=UInt(Clip3<Int>(0, m_internalBitDepth[ch]-10, Int(m_internalBitDepth[ch]-10 + 0.165*m_iQP - 3.22 + 0.5) ) );
     1879      }
     1880      else
     1881      {
     1882        m_log2SaoOffsetScale[ch]=0;
     1883      }
     1884    }
     1885    else
     1886    {
     1887      m_log2SaoOffsetScale[ch]=UInt(saoOffsetBitShift[ch]);
     1888    }
     1889  }
     1890
     1891#endif
     1892
    10981893  // reading external dQP description from file
    10991894  if ( m_pchdQPFile )
     
    11021897    if ( fpt )
    11031898    {
    1104 #if H_MV
     1899#if NH_MV
    11051900      for( Int layer = 0; layer < m_numberOfLayers; layer++ )
    11061901      {
     
    11101905      while ( iPOC < m_framesToBeEncoded )
    11111906      {
    1112         if ( fscanf(fpt, "%d", &iValue ) == EOF ) break;
    1113 #if H_MV
     1907        if ( fscanf(fpt, "%d", &iValue ) == EOF )
     1908        {
     1909          break;
     1910        }
     1911#if NH_MV
    11141912        m_aidQP[layer][ iPOC ] = iValue;
    11151913        iPOC++;
     
    11231921    }
    11241922  }
    1125   m_iWaveFrontSubstreams = m_iWaveFrontSynchro ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1;
    1126 
     1923
     1924  if( m_masteringDisplay.colourVolumeSEIEnabled )
     1925  {
     1926    for(UInt idx=0; idx<6; idx++)
     1927    {
     1928      m_masteringDisplay.primaries[idx/2][idx%2] = UShort((cfg_DisplayPrimariesCode.values.size() > idx) ? cfg_DisplayPrimariesCode.values[idx] : 0);
     1929    }
     1930    for(UInt idx=0; idx<2; idx++)
     1931    {
     1932      m_masteringDisplay.whitePoint[idx] = UShort((cfg_DisplayWhitePointCode.values.size() > idx) ? cfg_DisplayWhitePointCode.values[idx] : 0);
     1933    }
     1934  }
     1935   
    11271936  if( m_toneMappingInfoSEIEnabled && !m_toneMapCancelFlag )
    11281937  {
    1129     Char* pcStartOfCodedInterval = cfg_startOfCodedInterval.empty() ? NULL: strdup(cfg_startOfCodedInterval.c_str());
    1130     Char* pcCodedPivotValue = cfg_codedPivotValue.empty() ? NULL: strdup(cfg_codedPivotValue.c_str());
    1131     Char* pcTargetPivotValue = cfg_targetPivotValue.empty() ? NULL: strdup(cfg_targetPivotValue.c_str());
    1132     if( m_toneMapModelId == 2 && pcStartOfCodedInterval )
    1133     {
    1134       char *startOfCodedInterval;
    1135       UInt num = 1u<< m_toneMapTargetBitDepth;
     1938    if( m_toneMapModelId == 2 && !cfg_startOfCodedInterval.values.empty() )
     1939    {
     1940      const UInt num = 1u<< m_toneMapTargetBitDepth;
    11361941      m_startOfCodedInterval = new Int[num];
    1137       ::memset( m_startOfCodedInterval, 0, sizeof(Int)*num );
    1138       startOfCodedInterval = strtok(pcStartOfCodedInterval, " .");
    1139       int i = 0;
    1140       while( startOfCodedInterval && ( i < num ) )
    1141       {
    1142         m_startOfCodedInterval[i] = atoi( startOfCodedInterval );
    1143         startOfCodedInterval = strtok(NULL, " .");
    1144         i++;
    1145       }
    1146     }
     1942      for(UInt i=0; i<num; i++)
     1943      {
     1944        m_startOfCodedInterval[i] = cfg_startOfCodedInterval.values.size() > i ? cfg_startOfCodedInterval.values[i] : 0;
     1945      }
     1946    }
    11471947    else
    11481948    {
     
    11511951    if( ( m_toneMapModelId == 3 ) && ( m_numPivots > 0 ) )
    11521952    {
    1153       if( pcCodedPivotValue && pcTargetPivotValue )
    1154       {
    1155         char *codedPivotValue;
    1156         char *targetPivotValue;
    1157         m_codedPivotValue = new Int[m_numPivots];
     1953      if( !cfg_codedPivotValue.values.empty() && !cfg_targetPivotValue.values.empty() )
     1954      {
     1955        m_codedPivotValue  = new Int[m_numPivots];
    11581956        m_targetPivotValue = new Int[m_numPivots];
    1159         ::memset( m_codedPivotValue, 0, sizeof(Int)*( m_numPivots ) );
    1160         ::memset( m_targetPivotValue, 0, sizeof(Int)*( m_numPivots ) );
    1161         codedPivotValue = strtok(pcCodedPivotValue, " .");
    1162         int i=0;
    1163         while(codedPivotValue&&i<m_numPivots)
     1957        for(UInt i=0; i<m_numPivots; i++)
    11641958        {
    1165           m_codedPivotValue[i] = atoi( codedPivotValue );
    1166           codedPivotValue = strtok(NULL, " .");
    1167           i++;
    1168         }
    1169         i=0;
    1170         targetPivotValue = strtok(pcTargetPivotValue, " .");
    1171         while(targetPivotValue&&i<m_numPivots)
    1172         {
    1173           m_targetPivotValue[i]= atoi( targetPivotValue );
    1174           targetPivotValue = strtok(NULL, " .");
    1175           i++;
     1959          m_codedPivotValue[i]  = cfg_codedPivotValue.values.size()  > i ? cfg_codedPivotValue.values [i] : 0;
     1960          m_targetPivotValue[i] = cfg_targetPivotValue.values.size() > i ? cfg_targetPivotValue.values[i] : 0;
    11761961        }
    11771962      }
     
    11841969  }
    11851970
    1186 #if H_MV
    1187   // parse PTL
    1188   Bool anyEmpty = false;
    1189   if( cfg_profiles.empty() )
    1190   {
    1191 #if H_3D
    1192     cfg_profiles = string("main main 3d-main");
    1193 #else
    1194     cfg_profiles = string("main main multiview-main");   
    1195 #endif
    1196     fprintf(stderr, "\nWarning: No profiles given, using defaults: %s", cfg_profiles.c_str() );
    1197     anyEmpty = true;
    1198   }
    1199 
    1200   if( cfg_levels.empty() )
    1201   {
    1202     cfg_levels = string("none none none");
    1203     fprintf(stderr, "\nWarning: No levels given, using defaults: %s", cfg_levels.c_str() );
    1204     anyEmpty = true;
    1205   }
    1206 
    1207   if( cfg_tiers.empty() )
    1208   {
    1209     cfg_tiers = string("main main main");
    1210     fprintf(stderr, "\nWarning: No tiers given, using defaults: %s", cfg_tiers.c_str());
    1211     anyEmpty = true;
    1212   }
    1213 
    1214   if( m_inblFlag.empty() )
    1215   {
    1216     fprintf(stderr, "\nWarning: No inblFlags given, using defaults:");
    1217     for( Int i = 0; i < 3; i++)
    1218     {
    1219       m_inblFlag.push_back( false );
    1220       fprintf(stderr," %d", (Int) m_inblFlag[i]);
    1221     }
    1222     anyEmpty = true;
    1223   }   
    1224 
    1225   if ( anyEmpty )
    1226   {
    1227     fprintf( stderr, "\n" );
    1228   }
    1229 
    1230   xReadStrToEnum( cfg_profiles, m_profile   );
    1231   xReadStrToEnum( cfg_levels,   m_level     );
    1232   xReadStrToEnum( cfg_tiers ,   m_levelTier );
    1233 #endif
    1234 #if H_3D
    1235   // set global varibles
    1236   xSetGlobal();
    1237 #if H_3D_VSO
    1238 // Table base optimization
     1971  if( m_kneeSEIEnabled && !m_kneeSEICancelFlag )
     1972  {
     1973    assert ( m_kneeSEINumKneePointsMinus1 >= 0 && m_kneeSEINumKneePointsMinus1 < 999 );
     1974    m_kneeSEIInputKneePoint  = new Int[m_kneeSEINumKneePointsMinus1+1];
     1975    m_kneeSEIOutputKneePoint = new Int[m_kneeSEINumKneePointsMinus1+1];
     1976    for(Int i=0; i<(m_kneeSEINumKneePointsMinus1+1); i++)
     1977    {
     1978      m_kneeSEIInputKneePoint[i]  = cfg_kneeSEIInputKneePointValue.values.size()  > i ? cfg_kneeSEIInputKneePointValue.values[i]  : 1;
     1979      m_kneeSEIOutputKneePoint[i] = cfg_kneeSEIOutputKneePointValue.values.size() > i ? cfg_kneeSEIOutputKneePointValue.values[i] : 0;
     1980    }
     1981  }
     1982
     1983  if(m_timeCodeSEIEnabled)
     1984  {
     1985    for(Int i = 0; i < m_timeCodeSEINumTs && i < MAX_TIMECODE_SEI_SETS; i++)
     1986    {
     1987      m_timeSetArray[i].clockTimeStampFlag    = cfg_timeCodeSeiTimeStampFlag        .values.size()>i ? cfg_timeCodeSeiTimeStampFlag        .values [i] : false;
     1988      m_timeSetArray[i].numUnitFieldBasedFlag = cfg_timeCodeSeiNumUnitFieldBasedFlag.values.size()>i ? cfg_timeCodeSeiNumUnitFieldBasedFlag.values [i] : 0;
     1989      m_timeSetArray[i].countingType          = cfg_timeCodeSeiCountingType         .values.size()>i ? cfg_timeCodeSeiCountingType         .values [i] : 0;
     1990      m_timeSetArray[i].fullTimeStampFlag     = cfg_timeCodeSeiFullTimeStampFlag    .values.size()>i ? cfg_timeCodeSeiFullTimeStampFlag    .values [i] : 0;
     1991      m_timeSetArray[i].discontinuityFlag     = cfg_timeCodeSeiDiscontinuityFlag    .values.size()>i ? cfg_timeCodeSeiDiscontinuityFlag    .values [i] : 0;
     1992      m_timeSetArray[i].cntDroppedFlag        = cfg_timeCodeSeiCntDroppedFlag       .values.size()>i ? cfg_timeCodeSeiCntDroppedFlag       .values [i] : 0;
     1993      m_timeSetArray[i].numberOfFrames        = cfg_timeCodeSeiNumberOfFrames       .values.size()>i ? cfg_timeCodeSeiNumberOfFrames       .values [i] : 0;
     1994      m_timeSetArray[i].secondsValue          = cfg_timeCodeSeiSecondsValue         .values.size()>i ? cfg_timeCodeSeiSecondsValue         .values [i] : 0;
     1995      m_timeSetArray[i].minutesValue          = cfg_timeCodeSeiMinutesValue         .values.size()>i ? cfg_timeCodeSeiMinutesValue         .values [i] : 0;
     1996      m_timeSetArray[i].hoursValue            = cfg_timeCodeSeiHoursValue           .values.size()>i ? cfg_timeCodeSeiHoursValue           .values [i] : 0;
     1997      m_timeSetArray[i].secondsFlag           = cfg_timeCodeSeiSecondsFlag          .values.size()>i ? cfg_timeCodeSeiSecondsFlag          .values [i] : 0;
     1998      m_timeSetArray[i].minutesFlag           = cfg_timeCodeSeiMinutesFlag          .values.size()>i ? cfg_timeCodeSeiMinutesFlag          .values [i] : 0;
     1999      m_timeSetArray[i].hoursFlag             = cfg_timeCodeSeiHoursFlag            .values.size()>i ? cfg_timeCodeSeiHoursFlag            .values [i] : 0;
     2000      m_timeSetArray[i].timeOffsetLength      = cfg_timeCodeSeiTimeOffsetLength     .values.size()>i ? cfg_timeCodeSeiTimeOffsetLength     .values [i] : 0;
     2001      m_timeSetArray[i].timeOffsetValue       = cfg_timeCodeSeiTimeOffsetValue      .values.size()>i ? cfg_timeCodeSeiTimeOffsetValue      .values [i] : 0;
     2002    }
     2003  }
     2004
     2005#if NH_3D
     2006#if NH_3D_VSO
     2007  // Table base optimization
    12392008  // Q&D
    12402009  Double adLambdaScaleTable[] =
    12412010  {  0.031250, 0.031639, 0.032029, 0.032418, 0.032808, 0.033197, 0.033586, 0.033976, 0.034365, 0.034755,
    1242      0.035144, 0.035533, 0.035923, 0.036312, 0.036702, 0.037091, 0.037480, 0.037870, 0.038259, 0.038648,
    1243      0.039038, 0.039427, 0.039817, 0.040206, 0.040595, 0.040985, 0.041374, 0.041764, 0.042153, 0.042542,
    1244      0.042932, 0.043321, 0.043711, 0.044100, 0.044194, 0.053033, 0.061872, 0.070711, 0.079550, 0.088388,
    1245      0.117851, 0.147314, 0.176777, 0.235702, 0.294628, 0.353553, 0.471405, 0.589256, 0.707107, 0.707100,
    1246      0.753550, 0.800000 
     2011  0.035144, 0.035533, 0.035923, 0.036312, 0.036702, 0.037091, 0.037480, 0.037870, 0.038259, 0.038648,
     2012  0.039038, 0.039427, 0.039817, 0.040206, 0.040595, 0.040985, 0.041374, 0.041764, 0.042153, 0.042542,
     2013  0.042932, 0.043321, 0.043711, 0.044100, 0.044194, 0.053033, 0.061872, 0.070711, 0.079550, 0.088388,
     2014  0.117851, 0.147314, 0.176777, 0.235702, 0.294628, 0.353553, 0.471405, 0.589256, 0.707107, 0.707100,
     2015  0.753550, 0.800000 
    12472016  };
    12482017  if ( m_bUseVSO && m_bVSOLSTable )
     
    12612030    m_dLambdaScaleVSO *= adLambdaScaleTable[m_iQP[firstDepthLayer]];
    12622031  }
    1263 #endif
    1264 #if H_3D_VSO
    1265 if ( m_bUseVSO && m_uiVSOMode == 4)
    1266 {
    1267   m_cRenModStrParser.setString( m_iNumberOfViews, m_pchVSOConfig );
     2032  if ( m_bUseVSO && m_uiVSOMode == 4)
     2033  {
     2034    m_cRenModStrParser.setString( m_iNumberOfViews, m_pchVSOConfig );
     2035    m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ),
     2036      m_internalBitDepth[ CHANNEL_TYPE_LUMA],
     2037      (UInt)m_iCodedCamParPrecision,
     2038      m_FrameSkip,
     2039      (UInt)m_framesToBeEncoded,
     2040      m_pchCameraParameterFile,
     2041      m_pchBaseViewCameraNumbers,
     2042      NULL,
     2043      m_cRenModStrParser.getSynthViews(),
     2044      LOG2_DISP_PREC_LUT );
     2045  }
     2046  else if ( m_bUseVSO && m_uiVSOMode != 4 )
     2047  {
     2048    m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ),
     2049      m_internalBitDepth[ CHANNEL_TYPE_LUMA],
     2050      (UInt)m_iCodedCamParPrecision,
     2051      m_FrameSkip,
     2052      (UInt)m_framesToBeEncoded,
     2053      m_pchCameraParameterFile,
     2054      m_pchBaseViewCameraNumbers,
     2055      m_pchVSOConfig,
     2056      NULL,
     2057      LOG2_DISP_PREC_LUT );
     2058  }
     2059  else
     2060  {
     2061    m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ),
     2062      m_internalBitDepth[ CHANNEL_TYPE_LUMA],
     2063      (UInt) m_iCodedCamParPrecision,
     2064      m_FrameSkip,
     2065      (UInt) m_framesToBeEncoded,
     2066      m_pchCameraParameterFile,
     2067      m_pchBaseViewCameraNumbers,
     2068      NULL,
     2069      NULL,
     2070      LOG2_DISP_PREC_LUT );
     2071  }
     2072#else
    12682073  m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ),
    1269                                       g_bitDepthY,
    1270                                 (UInt)m_iCodedCamParPrecision,
    1271                                       m_FrameSkip,
    1272                                 (UInt)m_framesToBeEncoded,
    1273                                       m_pchCameraParameterFile,
    1274                                       m_pchBaseViewCameraNumbers,
    1275                                       NULL,
    1276                                       m_cRenModStrParser.getSynthViews(),
    1277                                       LOG2_DISP_PREC_LUT );
    1278 }
    1279 else if ( m_bUseVSO && m_uiVSOMode != 4 )
    1280 {
    1281   m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ),
    1282                                       g_bitDepthY,
    1283                                 (UInt)m_iCodedCamParPrecision,
    1284                                       m_FrameSkip,
    1285                                 (UInt)m_framesToBeEncoded,
    1286                                       m_pchCameraParameterFile,
    1287                                       m_pchBaseViewCameraNumbers,
    1288                                       m_pchVSOConfig,
    1289                                       NULL,
    1290                                       LOG2_DISP_PREC_LUT );
    1291 }
    1292 else
    1293 {
    1294   m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ),
    1295     g_bitDepthY,
     2074    m_internalBitDepth[ CHANNEL_TYPE_LUMA],
    12962075    (UInt) m_iCodedCamParPrecision,
    12972076    m_FrameSkip,
     
    13022081    NULL,
    13032082    LOG2_DISP_PREC_LUT );
    1304 }
    1305 #else
    1306   m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ),
    1307     g_bitDepthY,
    1308     (UInt) m_iCodedCamParPrecision,
    1309     m_FrameSkip,
    1310     (UInt) m_framesToBeEncoded,
    1311     m_pchCameraParameterFile,
    1312     m_pchBaseViewCameraNumbers,
    1313     NULL,
    1314     NULL,
    1315     LOG2_DISP_PREC_LUT );
    13162083#endif
    13172084  m_cCameraData.check( false, true );
    13182085#endif
     2086
    13192087  // check validity of input parameters
    13202088  xCheckParameter();
    13212089
    1322 #if !H_3D
    1323   // set global varibles
    1324   xSetGlobal();
    1325 #endif
    1326  
     2090  // compute actual CU depth with respect to config depth and max transform size
     2091  UInt uiAddCUDepth  = 0;
     2092  while( (m_uiMaxCUWidth>>m_uiMaxCUDepth) > ( 1 << ( m_uiQuadtreeTULog2MinSize + uiAddCUDepth )  ) )
     2093  {
     2094    uiAddCUDepth++;
     2095  }
     2096
     2097  m_uiMaxTotalCUDepth = m_uiMaxCUDepth + uiAddCUDepth + getMaxCUDepthOffset(m_chromaFormatIDC, m_uiQuadtreeTULog2MinSize); // if minimum TU larger than 4x4, allow for additional part indices for 4:2:2 SubTUs.
     2098  uiAddCUDepth++;
     2099  m_uiLog2DiffMaxMinCodingBlockSize = m_uiMaxCUDepth - 1;
     2100
    13272101  // print-out parameters
    13282102  xPrintParameter();
    1329  
     2103
    13302104  return true;
    13312105}
     2106
     2107
    13322108// ====================================================================================================================
    13332109// Private member functions
    13342110// ====================================================================================================================
    1335 
    1336 Bool confirmPara(Bool bflag, const Char* message);
    13372111
    13382112Void TAppEncCfg::xCheckParameter()
     
    13482122
    13492123
    1350 #if !H_MV
     2124#if !NH_MV
    13512125  if( m_profile==Profile::NONE )
    13522126  {
     
    13652139  Bool check_failed = false; /* abort if there is a fatal configuration problem */
    13662140#define xConfirmPara(a,b) check_failed |= confirmPara(a,b)
     2141
     2142  const UInt maxBitDepth=(m_chromaFormatIDC==CHROMA_400) ? m_internalBitDepth[CHANNEL_TYPE_LUMA] : std::max(m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA]);
     2143  xConfirmPara(m_bitDepthConstraint<maxBitDepth, "The internalBitDepth must not be greater than the bitDepthConstraint value");
     2144  xConfirmPara(m_chromaFormatConstraint<m_chromaFormatIDC, "The chroma format used must not be greater than the chromaFormatConstraint value");
     2145#if NH_MV
     2146  Profile::Name & m_profile = m_profiles[0];
     2147#endif
     2148
     2149  if (m_profile==Profile::MAINREXT || m_profile==Profile::HIGHTHROUGHPUTREXT)
     2150  {
     2151    xConfirmPara(m_lowerBitRateConstraintFlag==false && m_intraConstraintFlag==false, "The lowerBitRateConstraint flag cannot be false when intraConstraintFlag is false");
     2152    xConfirmPara(m_cabacBypassAlignmentEnabledFlag && m_profile!=Profile::HIGHTHROUGHPUTREXT, "AlignCABACBeforeBypass must not be enabled unless the high throughput profile is being used.");
     2153    if (m_profile == Profile::MAINREXT)
     2154    {
     2155      const UInt intraIdx = m_intraConstraintFlag ? 1:0;
     2156      const UInt bitDepthIdx = (m_bitDepthConstraint == 8 ? 0 : (m_bitDepthConstraint ==10 ? 1 : (m_bitDepthConstraint == 12 ? 2 : (m_bitDepthConstraint == 16 ? 3 : 4 ))));
     2157      const UInt chromaFormatIdx = UInt(m_chromaFormatConstraint);
     2158      const Bool bValidProfile = (bitDepthIdx > 3 || chromaFormatIdx>3) ? false : (validRExtProfileNames[intraIdx][bitDepthIdx][chromaFormatIdx] != NONE);
     2159      xConfirmPara(!bValidProfile, "Invalid intra constraint flag, bit depth constraint flag and chroma format constraint flag combination for a RExt profile");
     2160      const Bool bUsingGeneralRExtTools  = m_transformSkipRotationEnabledFlag        ||
     2161                                           m_transformSkipContextEnabledFlag         ||
     2162                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT] ||
     2163                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT] ||
     2164                                           !m_enableIntraReferenceSmoothing         ||
     2165                                           m_persistentRiceAdaptationEnabledFlag     ||
     2166                                           m_log2MaxTransformSkipBlockSize!=2;
     2167      const Bool bUsingChromaQPTool      = m_diffCuChromaQpOffsetDepth >= 0;
     2168      const Bool bUsingExtendedPrecision = m_extendedPrecisionProcessingFlag;
     2169
     2170      xConfirmPara((m_chromaFormatConstraint==CHROMA_420 || m_chromaFormatConstraint==CHROMA_400) && bUsingChromaQPTool, "CU Chroma QP adjustment cannot be used for 4:0:0 or 4:2:0 RExt profiles");
     2171      xConfirmPara(m_bitDepthConstraint != 16 && bUsingExtendedPrecision, "Extended precision can only be used in 16-bit RExt profiles");
     2172      if (!(m_chromaFormatConstraint == CHROMA_400 && m_bitDepthConstraint == 16) && m_chromaFormatConstraint!=CHROMA_444)
     2173      {
     2174        xConfirmPara(bUsingGeneralRExtTools, "Combination of tools and profiles are not possible in the specified RExt profile.");
     2175      }
     2176      xConfirmPara( m_onePictureOnlyConstraintFlag && m_chromaFormatConstraint!=CHROMA_444, "chroma format constraint must be 4:4:4 when one-picture-only constraint flag is 1");
     2177      xConfirmPara( m_onePictureOnlyConstraintFlag && m_bitDepthConstraint != 8 && m_bitDepthConstraint != 16, "bit depth constraint must be 8 or 16 when one-picture-only constraint flag is 1");
     2178      xConfirmPara( m_onePictureOnlyConstraintFlag && m_framesToBeEncoded > 1, "Number of frames to be encoded must be 1 when one-picture-only constraint flag is 1.");
     2179
     2180      if (!m_intraConstraintFlag && m_bitDepthConstraint==16 && m_chromaFormatConstraint==CHROMA_444)
     2181      {
     2182        fprintf(stderr, "********************************************************************************************************\n");
     2183        fprintf(stderr, "** WARNING: The RExt constraint flags describe a non standard combination (used for development only) **\n");
     2184        fprintf(stderr, "********************************************************************************************************\n");
     2185      }
     2186    }
     2187    else
     2188    {
     2189      xConfirmPara( m_chromaFormatConstraint != CHROMA_444, "chroma format constraint must be 4:4:4 in the High Throughput 4:4:4 16-bit Intra profile.");
     2190      xConfirmPara( m_bitDepthConstraint     != 16,         "bit depth constraint must be 4:4:4 in the High Throughput 4:4:4 16-bit Intra profile.");
     2191      xConfirmPara( m_intraConstraintFlag    != 1,          "intra constraint flag must be 1 in the High Throughput 4:4:4 16-bit Intra profile.");
     2192    }
     2193  }
     2194  else
     2195  {
     2196    xConfirmPara(m_bitDepthConstraint!=((m_profile==Profile::MAIN10)?10:8), "BitDepthConstraint must be 8 for MAIN profile and 10 for MAIN10 profile.");
     2197    xConfirmPara(m_chromaFormatConstraint!=CHROMA_420, "ChromaFormatConstraint must be 420 for non main-RExt profiles.");
     2198    xConfirmPara(m_intraConstraintFlag==true, "IntraConstraintFlag must be false for non main_RExt profiles.");
     2199    xConfirmPara(m_lowerBitRateConstraintFlag==false, "LowerBitrateConstraintFlag must be true for non main-RExt profiles.");
     2200    xConfirmPara(m_profile == Profile::MAINSTILLPICTURE && m_framesToBeEncoded > 1, "Number of frames to be encoded must be 1 when main still picture profile is used.");
     2201
     2202    xConfirmPara(m_crossComponentPredictionEnabledFlag==true, "CrossComponentPrediction must not be used for non main-RExt profiles.");
     2203    xConfirmPara(m_log2MaxTransformSkipBlockSize!=2, "Transform Skip Log2 Max Size must be 2 for V1 profiles.");
     2204    xConfirmPara(m_transformSkipRotationEnabledFlag==true, "UseResidualRotation must not be enabled for non main-RExt profiles.");
     2205    xConfirmPara(m_transformSkipContextEnabledFlag==true, "UseSingleSignificanceMapContext must not be enabled for non main-RExt profiles.");
     2206    xConfirmPara(m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT]==true, "ImplicitResidualDPCM must not be enabled for non main-RExt profiles.");
     2207    xConfirmPara(m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT]==true, "ExplicitResidualDPCM must not be enabled for non main-RExt profiles.");
     2208    xConfirmPara(m_persistentRiceAdaptationEnabledFlag==true, "GolombRiceParameterAdaption must not be enabled for non main-RExt profiles.");
     2209    xConfirmPara(m_extendedPrecisionProcessingFlag==true, "UseExtendedPrecision must not be enabled for non main-RExt profiles.");
     2210    xConfirmPara(m_highPrecisionOffsetsEnabledFlag==true, "UseHighPrecisionPredictionWeighting must not be enabled for non main-RExt profiles.");
     2211    xConfirmPara(m_enableIntraReferenceSmoothing==false, "EnableIntraReferenceSmoothing must be enabled for non main-RExt profiles.");
     2212    xConfirmPara(m_cabacBypassAlignmentEnabledFlag, "AlignCABACBeforeBypass cannot be enabled for non main-RExt profiles.");
     2213  }
     2214
    13672215  // check range of parameters
    1368   xConfirmPara( m_inputBitDepthY < 8,                                                     "InputBitDepth must be at least 8" );
    1369   xConfirmPara( m_inputBitDepthC < 8,                                                     "InputBitDepthC must be at least 8" );
     2216  xConfirmPara( m_inputBitDepth[CHANNEL_TYPE_LUMA  ] < 8,                                   "InputBitDepth must be at least 8" );
     2217  xConfirmPara( m_inputBitDepth[CHANNEL_TYPE_CHROMA] < 8,                                   "InputBitDepthC must be at least 8" );
     2218
     2219#if !RExt__HIGH_BIT_DEPTH_SUPPORT
     2220  if (m_extendedPrecisionProcessingFlag)
     2221  {
     2222    for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
     2223    {
     2224      xConfirmPara((m_internalBitDepth[channelType] > 8) , "Model is not configured to support high enough internal accuracies - enable RExt__HIGH_BIT_DEPTH_SUPPORT to use increased precision internal data types etc...");
     2225    }
     2226  }
     2227  else
     2228  {
     2229    for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
     2230    {
     2231      xConfirmPara((m_internalBitDepth[channelType] > 12) , "Model is not configured to support high enough internal accuracies - enable RExt__HIGH_BIT_DEPTH_SUPPORT to use increased precision internal data types etc...");
     2232    }
     2233  }
     2234#endif
     2235
     2236  xConfirmPara( (m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ] < m_inputBitDepth[CHANNEL_TYPE_LUMA  ]), "MSB-extended bit depth for luma channel (--MSBExtendedBitDepth) must be greater than or equal to input bit depth for luma channel (--InputBitDepth)" );
     2237  xConfirmPara( (m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] < m_inputBitDepth[CHANNEL_TYPE_CHROMA]), "MSB-extended bit depth for chroma channel (--MSBExtendedBitDepthC) must be greater than or equal to input bit depth for chroma channel (--InputBitDepthC)" );
     2238
     2239#if NH_MV
     2240  for (Int i = 0; i < m_numberOfLayers; i++)
     2241  {
     2242    xConfirmPara( m_log2SaoOffsetScale[i][CHANNEL_TYPE_LUMA]   > (m_internalBitDepth[CHANNEL_TYPE_LUMA  ]<10?0:(m_internalBitDepth[CHANNEL_TYPE_LUMA  ]-10)), "SaoLumaOffsetBitShift must be in the range of 0 to InternalBitDepth-10, inclusive");
     2243    xConfirmPara( m_log2SaoOffsetScale[i][CHANNEL_TYPE_CHROMA] > (m_internalBitDepth[CHANNEL_TYPE_CHROMA]<10?0:(m_internalBitDepth[CHANNEL_TYPE_CHROMA]-10)), "SaoChromaOffsetBitShift must be in the range of 0 to InternalBitDepthC-10, inclusive");
     2244  }
     2245#else
     2246  xConfirmPara( m_log2SaoOffsetScale[CHANNEL_TYPE_LUMA]   > (m_internalBitDepth[CHANNEL_TYPE_LUMA  ]<10?0:(m_internalBitDepth[CHANNEL_TYPE_LUMA  ]-10)), "SaoLumaOffsetBitShift must be in the range of 0 to InternalBitDepth-10, inclusive");
     2247  xConfirmPara( m_log2SaoOffsetScale[CHANNEL_TYPE_CHROMA] > (m_internalBitDepth[CHANNEL_TYPE_CHROMA]<10?0:(m_internalBitDepth[CHANNEL_TYPE_CHROMA]-10)), "SaoChromaOffsetBitShift must be in the range of 0 to InternalBitDepthC-10, inclusive");
     2248#endif
     2249
     2250  xConfirmPara( m_chromaFormatIDC >= NUM_CHROMA_FORMAT,                                     "ChromaFormatIDC must be either 400, 420, 422 or 444" );
     2251  std::string sTempIPCSC="InputColourSpaceConvert must be empty, "+getListOfColourSpaceConverts(true);
     2252  xConfirmPara( m_inputColourSpaceConvert >= NUMBER_INPUT_COLOUR_SPACE_CONVERSIONS,         sTempIPCSC.c_str() );
     2253  xConfirmPara( m_InputChromaFormatIDC >= NUM_CHROMA_FORMAT,                                "InputChromaFormatIDC must be either 400, 420, 422 or 444" );
    13702254  xConfirmPara( m_iFrameRate <= 0,                                                          "Frame rate must be more than 1" );
    13712255  xConfirmPara( m_framesToBeEncoded <= 0,                                                   "Total Number Of Frames encoded must be more than 0" );
    1372 #if H_MV
     2256#if NH_MV
    13732257  xConfirmPara( m_numberOfLayers > MAX_NUM_LAYER_IDS ,                                      "NumberOfLayers must be less than or equal to MAX_NUM_LAYER_IDS");
    13742258
     
    13762260  xConfirmPara( m_layerIdInNuh[0] != 0      , "LayerIdInNuh must be 0 for the first layer. ");
    13772261  xConfirmPara( (m_layerIdInNuh.size()!=1) && (m_layerIdInNuh.size() < m_numberOfLayers) , "LayerIdInNuh must be given for all layers. ");
    1378  
    1379 #if H_3D
     2262
     2263#if NH_3D
    13802264  xConfirmPara( m_scalabilityMask != 2 && m_scalabilityMask != 3, "Scalability Mask must be equal to 2 or 3. ");
    13812265#else
     
    13832267#endif
    13842268
    1385 #if H_3D
     2269#if NH_3D
    13862270  if ( m_scalabilityMask & ( 1 << DEPTH_ID ) )
    13872271  {
     
    14042288  dimBitOffset[ 0 ] = 0;
    14052289  for (Int j = 1; j <= ((Int) m_dimIds.size() - m_splittingFlag ? 1 : 0); j++ )
    1406  {
     2290  {
    14072291    dimBitOffset[ j ] = dimBitOffset[ j - 1 ] + m_dimensionIdLen[ j - 1];
    14082292  }
     
    14122296    dimBitOffset[ (Int) m_dimIds.size() ] = 6;
    14132297  }
    1414  
     2298
    14152299  for( Int j = 0; j < m_dimIds.size(); j++ )
    14162300  {   
     
    14182302    xConfirmPara( (m_dimIds[j][0] != 0)                 , "DimensionId of layer 0 must be 0. " );
    14192303    xConfirmPara( m_dimensionIdLen[j] < 1 || m_dimensionIdLen[j] > 8, "DimensionIdLen must be greater than 0 and less than 9 in all dimensions. " );
    1420      
    1421 
    1422    for( Int i = 1; i < m_numberOfLayers; i++ )
    1423    {     
     2304
     2305
     2306    for( Int i = 1; i < m_numberOfLayers; i++ )
     2307    {     
    14242308      xConfirmPara(  ( m_dimIds[j][i] < 0 ) || ( m_dimIds[j][i] > ( ( 1 << m_dimensionIdLen[j] ) - 1 ) )   , "DimensionId shall be in the range of 0 to 2^DimensionIdLen - 1. " );
    14252309      if ( m_splittingFlag )
     
    14282312        xConfirmPara( ( ( layerIdInNuh & ( (1 << dimBitOffset[ j + 1 ] ) - 1) ) >> dimBitOffset[ j ] )  != m_dimIds[j][ i ]  , "When Splitting Flag is equal to 1 dimension ids shall match values derived from layer ids. ");
    14292313      }
    1430    }
    1431  }
    1432 
    1433  for( Int i = 0; i < m_numberOfLayers; i++ )
    1434  {
    1435    for( Int j = 0; j < i; j++ )
    1436    {     
    1437      Int numDiff  = 0;
    1438      Int lastDiff = -1;
    1439      for( Int dim = 0; dim < m_dimIds.size(); dim++ )
    1440      {
    1441        if ( m_dimIds[dim][i] != m_dimIds[dim][j] )
    1442        {
    1443          numDiff ++;
    1444          lastDiff = dim;
    1445        }
    1446      }
    1447 
    1448      Bool allEqual = ( numDiff == 0 );
    1449 
    1450      if ( allEqual )
    1451      {
    1452        printf( "\nError: Positions of Layers %d and %d are identical in scalability space\n", i, j);
    1453      }
    1454 
    1455      xConfirmPara( allEqual , "Each layer shall have a different position in scalability space." );
     2314    }
     2315  }
     2316
     2317  for( Int i = 0; i < m_numberOfLayers; i++ )
     2318  {
     2319    for( Int j = 0; j < i; j++ )
     2320    {     
     2321      Int numDiff  = 0;
     2322      Int lastDiff = -1;
     2323      for( Int dim = 0; dim < m_dimIds.size(); dim++ )
     2324      {
     2325        if ( m_dimIds[dim][i] != m_dimIds[dim][j] )
     2326        {
     2327          numDiff ++;
     2328          lastDiff = dim;
     2329        }
     2330      }
     2331
     2332      Bool allEqual = ( numDiff == 0 );
     2333
     2334      if ( allEqual )
     2335      {
     2336        printf( "\nError: Positions of Layers %d and %d are identical in scalability space\n", i, j);
     2337      }
     2338
     2339      xConfirmPara( allEqual , "Each layer shall have a different position in scalability space." );
    14562340
    14572341#if !H_3D_FCO
    1458      if ( numDiff  == 1 )
    1459      {
    1460        Bool inc = m_dimIds[ lastDiff ][ i ] > m_dimIds[ lastDiff ][ j ];
    1461        Bool shallBeButIsNotIncreasing = ( !inc  ) ;
    1462        if ( shallBeButIsNotIncreasing )
    1463        {       
    1464          printf( "\nError: Positions of Layers %d and %d is not increasing in dimension %d \n", i, j, lastDiff);       
    1465        }
    1466        xConfirmPara( shallBeButIsNotIncreasing,  "DimensionIds shall be increasing within one dimension. " );
    1467      }
    1468 #endif
    1469    }
    1470  }
    1471 
    1472  /// ViewId
    1473  xConfirmPara( m_viewId.size() != m_iNumberOfViews, "The number of ViewIds must be equal to the number of views." );
     2342      if ( numDiff  == 1 )
     2343      {
     2344        Bool inc = m_dimIds[ lastDiff ][ i ] > m_dimIds[ lastDiff ][ j ];
     2345        Bool shallBeButIsNotIncreasing = ( !inc  ) ;
     2346        if ( shallBeButIsNotIncreasing )
     2347        {       
     2348          printf( "\nError: Positions of Layers %d and %d is not increasing in dimension %d \n", i, j, lastDiff);       
     2349        }
     2350        xConfirmPara( shallBeButIsNotIncreasing,  "DimensionIds shall be increasing within one dimension. " );
     2351      }
     2352#endif
     2353    }
     2354  }
     2355
     2356  /// ViewId
     2357  xConfirmPara( m_viewId.size() != m_iNumberOfViews, "The number of ViewIds must be equal to the number of views." );
    14742358
    14752359  /// Layer sets
     
    15322416
    15332417  // PTL
    1534     xConfirmPara( ( m_profile.size() != m_inblFlag.size() || m_profile.size() != m_level.size()  ||  m_profile.size() != m_levelTier.size() ), "The number of Profiles, Levels, Tiers and InblFlags must be equal." );
    1535 
    1536     if ( m_numberOfLayers > 1)
    1537     {
    1538       xConfirmPara( m_profile.size() <= 1, "The number of profiles, tiers, levels, and inblFlags must be greater than 1.");
    1539       xConfirmPara( m_inblFlag[0], "VpsProfileTierLevel[0] must have inblFlag equal to 0");
    1540       if (m_profile.size() > 1 )
    1541       {
    1542         xConfirmPara( m_profile[0]  != m_profile[1], "The profile in VpsProfileTierLevel[1] must be equal to the profile in VpsProfileTierLevel[0].");
    1543         xConfirmPara( m_inblFlag[0] != m_inblFlag[1], "inblFlag in VpsProfileTierLevel[1] must be equal to the inblFlag in VpsProfileTierLevel[0].");
    1544       }
    1545     }
    1546 
    1547     // Layer Dependencies 
     2418  xConfirmPara( ( m_profiles.size() != m_inblFlag.size() || m_profiles.size() != m_level.size()  ||  m_profiles.size() != m_levelTier.size() ), "The number of Profiles, Levels, Tiers and InblFlags must be equal." );
     2419
     2420  if ( m_numberOfLayers > 1)
     2421  {
     2422    xConfirmPara( m_profiles.size() <= 1, "The number of profiles, tiers, levels, and inblFlags must be greater than 1.");
     2423    xConfirmPara( m_inblFlag[0], "VpsProfileTierLevel[0] must have inblFlag equal to 0");
     2424    if (m_profiles.size() > 1 )
     2425    {
     2426      xConfirmPara( m_profiles[0]  != m_profiles[1], "The profile in VpsProfileTierLevel[1] must be equal to the profile in VpsProfileTierLevel[0].");
     2427      xConfirmPara( m_inblFlag[0] != m_inblFlag[1], "inblFlag in VpsProfileTierLevel[1] must be equal to the inblFlag in VpsProfileTierLevel[0].");
     2428    }
     2429  }
     2430
     2431  // Layer Dependencies 
    15482432  for (Int i = 0; i < m_numberOfLayers; i++ )
    15492433  {
     
    15572441  } 
    15582442#endif
     2443
    15592444  xConfirmPara( m_iGOPSize < 1 ,                                                            "GOP Size must be greater or equal to 1" );
    15602445  xConfirmPara( m_iGOPSize > 1 &&  m_iGOPSize % 2,                                          "GOP Size must be a multiple of 2, if GOP Size is greater than 1" );
    1561 #if H_MV
     2446#if NH_MV
    15622447  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
    15632448  {
     
    15672452  xConfirmPara( (m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, "Intra period must be more than GOP size, or -1 , not 0" );
    15682453#endif
    1569 #if ALLOW_RECOVERY_POINT_AS_RAP
    15702454  xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 3,                   "Decoding Refresh Type must be comprised between 0 and 3 included" );
    15712455  if(m_iDecodingRefreshType == 3)
     
    15732457    xConfirmPara( !m_recoveryPointSEIEnabled,                                               "When using RecoveryPointSEI messages as RA points, recoveryPointSEI must be enabled" );
    15742458  }
     2459
     2460  if (m_isField)
     2461  {
     2462    if (!m_pictureTimingSEIEnabled)
     2463    {
     2464      fprintf(stderr, "****************************************************************************\n");
     2465      fprintf(stderr, "** WARNING: Picture Timing SEI should be enabled for field coding!        **\n");
     2466      fprintf(stderr, "****************************************************************************\n");
     2467    }
     2468  }
     2469
     2470  if(m_crossComponentPredictionEnabledFlag && (m_chromaFormatIDC != CHROMA_444))
     2471  {
     2472    fprintf(stderr, "****************************************************************************\n");
     2473    fprintf(stderr, "** WARNING: Cross-component prediction is specified for 4:4:4 format only **\n");
     2474    fprintf(stderr, "****************************************************************************\n");
     2475
     2476    m_crossComponentPredictionEnabledFlag = false;
     2477  }
     2478
     2479  if ( m_CUTransquantBypassFlagForce && m_bUseHADME )
     2480  {
     2481    fprintf(stderr, "****************************************************************************\n");
     2482    fprintf(stderr, "** WARNING: --HadamardME has been disabled due to the enabling of         **\n");
     2483    fprintf(stderr, "**          --CUTransquantBypassFlagForce                                 **\n");
     2484    fprintf(stderr, "****************************************************************************\n");
     2485
     2486    m_bUseHADME = false; // this has been disabled so that the lambda is calculated slightly differently for lossless modes (as a result of JCTVC-R0104).
     2487  }
     2488
     2489  xConfirmPara (m_log2MaxTransformSkipBlockSize < 2, "Transform Skip Log2 Max Size must be at least 2 (4x4)");
     2490
     2491  if (m_log2MaxTransformSkipBlockSize!=2 && m_useTransformSkipFast)
     2492  {
     2493    fprintf(stderr, "***************************************************************************\n");
     2494    fprintf(stderr, "** WARNING: Transform skip fast is enabled (which only tests NxN splits),**\n");
     2495    fprintf(stderr, "**          but transform skip log2 max size is not 2 (4x4)              **\n");
     2496    fprintf(stderr, "**          It may be better to disable transform skip fast mode         **\n");
     2497    fprintf(stderr, "***************************************************************************\n");
     2498  }
     2499#if NH_MV
     2500  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
     2501  {
     2502    xConfirmPara( m_iQP[layer] <  -6 * (m_internalBitDepth[CHANNEL_TYPE_LUMA] - 8) || m_iQP[layer] > 51,      "QP exceeds supported range (-QpBDOffsety to 51)" );
     2503    xConfirmPara( m_DeblockingFilterMetric && (m_bLoopFilterDisable[layer] || m_loopFilterOffsetInPPS), "If DeblockingFilterMetric is true then both LoopFilterDisable and LoopFilterOffsetInPPS must be 0");
     2504  }
    15752505#else
    1576   xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 2,                   "Decoding Refresh Type must be equal to 0, 1 or 2" );
    1577 #endif
    1578 #if H_MV
    1579   for( Int layer = 0; layer < m_numberOfLayers; layer++ )
    1580   {
    1581     xConfirmPara( m_iQP[layer] <  -6 * (m_internalBitDepthY - 8) || m_iQP[layer] > 51,      "QP exceeds supported range (-QpBDOffsety to 51)" );
    1582   }
    1583 #else
    1584   xConfirmPara( m_iQP <  -6 * (m_internalBitDepthY - 8) || m_iQP > 51,                    "QP exceeds supported range (-QpBDOffsety to 51)" );
    1585 #endif
    1586   xConfirmPara( m_loopFilterBetaOffsetDiv2 < -6 || m_loopFilterBetaOffsetDiv2 > 6,          "Loop Filter Beta Offset div. 2 exceeds supported range (-6 to 6)");
    1587   xConfirmPara( m_loopFilterTcOffsetDiv2 < -6 || m_loopFilterTcOffsetDiv2 > 6,              "Loop Filter Tc Offset div. 2 exceeds supported range (-6 to 6)");
     2506  xConfirmPara( m_iQP <  -6 * (m_internalBitDepth[CHANNEL_TYPE_LUMA] - 8) || m_iQP > 51,    "QP exceeds supported range (-QpBDOffsety to 51)" );
     2507  xConfirmPara( m_DeblockingFilterMetric && (m_bLoopFilterDisable || m_loopFilterOffsetInPPS), "If DeblockingFilterMetric is true then both LoopFilterDisable and LoopFilterOffsetInPPS must be 0");
     2508#endif
     2509 
     2510  xConfirmPara( m_loopFilterBetaOffsetDiv2 < -6 || m_loopFilterBetaOffsetDiv2 > 6,        "Loop Filter Beta Offset div. 2 exceeds supported range (-6 to 6)");
     2511  xConfirmPara( m_loopFilterTcOffsetDiv2 < -6 || m_loopFilterTcOffsetDiv2 > 6,            "Loop Filter Tc Offset div. 2 exceeds supported range (-6 to 6)");
    15882512  xConfirmPara( m_iFastSearch < 0 || m_iFastSearch > 2,                                     "Fast Search Mode is not supported value (0:Full search  1:Diamond  2:PMVFAST)" );
    15892513  xConfirmPara( m_iSearchRange < 0 ,                                                        "Search Range must be more than 0" );
    15902514  xConfirmPara( m_bipredSearchRange < 0 ,                                                   "Search Range must be more than 0" );
    1591 #if H_MV
     2515#if NH_MV
    15922516  xConfirmPara( m_iVerticalDisparitySearchRange <= 0 ,                                      "Vertical Disparity Search Range must be more than 0" );
    15932517#endif
     
    16032527  if (m_iDecodingRefreshType == 2)
    16042528  {
    1605 #if H_MV
     2529#if NH_MV
    16062530    for (Int i = 0; i < m_numberOfLayers; i++ )
    16072531    {
     
    16182542  xConfirmPara( (m_iSourceWidth  % (m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame width must be a multiple of the minimum CU size");
    16192543  xConfirmPara( (m_iSourceHeight % (m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame height must be a multiple of the minimum CU size");
    1620  
     2544
    16212545  xConfirmPara( m_uiQuadtreeTULog2MinSize < 2,                                        "QuadtreeTULog2MinSize must be 2 or greater.");
    16222546  xConfirmPara( m_uiQuadtreeTULog2MaxSize > 5,                                        "QuadtreeTULog2MaxSize must be 5 or smaller.");
    1623   xConfirmPara( (1<<m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth,                                        "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
    1624  
    16252547  xConfirmPara( m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize,                "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize.");
    1626   xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUWidth >>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
    1627   xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUHeight>>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
    1628   xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUWidth  >> m_uiMaxCUDepth ), "Minimum CU width must be greater than minimum transform size." );
    1629   xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUHeight >> m_uiMaxCUDepth ), "Minimum CU height must be greater than minimum transform size." );
     2548  xConfirmPara( (1<<m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth,                      "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
     2549  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) >= ( m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than or equal to minimum CU size" );
     2550  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) >= ( m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than or equal to minimum CU size" );
    16302551  xConfirmPara( m_uiQuadtreeTUMaxDepthInter < 1,                                                         "QuadtreeTUMaxDepthInter must be greater than or equal to 1" );
    16312552  xConfirmPara( m_uiMaxCUWidth < ( 1 << (m_uiQuadtreeTULog2MinSize + m_uiQuadtreeTUMaxDepthInter - 1) ), "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1" );
    16322553  xConfirmPara( m_uiQuadtreeTUMaxDepthIntra < 1,                                                         "QuadtreeTUMaxDepthIntra must be greater than or equal to 1" );
    16332554  xConfirmPara( m_uiMaxCUWidth < ( 1 << (m_uiQuadtreeTULog2MinSize + m_uiQuadtreeTUMaxDepthIntra - 1) ), "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1" );
    1634  
     2555
    16352556  xConfirmPara(  m_maxNumMergeCand < 1,  "MaxNumMergeCand must be 1 or greater.");
    16362557  xConfirmPara(  m_maxNumMergeCand > 5,  "MaxNumMergeCand must be 5 or smaller.");
    1637 
    1638 #if H_3D_ARP
    1639 #endif
    1640 #if H_3D_SPIVMP
     2558#if NH_3D
    16412559  xConfirmPara( m_log2SubPbSizeMinus3 < 0,                                        "Log2SubPbSizeMinus3 must be equal to 0 or greater.");
    16422560  xConfirmPara( m_log2SubPbSizeMinus3 > 3,                                        "Log2SubPbSizeMinus3 must be equal to 3 or smaller.");
     
    16482566#endif
    16492567#if ADAPTIVE_QP_SELECTION
    1650 #if H_MV
     2568#if NH_MV
    16512569  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
    16522570  {
     
    16612579  if( m_usePCM)
    16622580  {
     2581    for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
     2582    {
     2583      xConfirmPara(((m_MSBExtendedBitDepth[channelType] > m_internalBitDepth[channelType]) && m_bPCMInputBitDepthFlag), "PCM bit depth cannot be greater than internal bit depth (PCMInputBitDepthFlag cannot be used when InputBitDepth or MSBExtendedBitDepth > InternalBitDepth)");
     2584    }
    16632585    xConfirmPara(  m_uiPCMLog2MinSize < 3,                                      "PCMLog2MinSize must be 3 or greater.");
    16642586    xConfirmPara(  m_uiPCMLog2MinSize > 5,                                      "PCMLog2MinSize must be 5 or smaller.");
     
    16772599    xConfirmPara( m_sliceSegmentArgument < 1 ,         "SliceSegmentArgument should be larger than or equal to 1" );
    16782600  }
    1679  
     2601
    16802602  Bool tileFlag = (m_numTileColumnsMinus1 > 0 || m_numTileRowsMinus1 > 0 );
    1681   xConfirmPara( tileFlag && m_iWaveFrontSynchro,            "Tile and Wavefront can not be applied together");
    1682 
    1683   //TODO:ChromaFmt assumes 4:2:0 below
    1684   xConfirmPara( m_iSourceWidth  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Picture width must be an integer multiple of the specified chroma subsampling");
    1685   xConfirmPara( m_iSourceHeight % TComSPS::getWinUnitY(CHROMA_420) != 0, "Picture height must be an integer multiple of the specified chroma subsampling");
    1686 
    1687   xConfirmPara( m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling");
    1688   xConfirmPara( m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling");
    1689 
    1690   xConfirmPara( m_confWinLeft   % TComSPS::getWinUnitX(CHROMA_420) != 0, "Left conformance window offset must be an integer multiple of the specified chroma subsampling");
    1691   xConfirmPara( m_confWinRight  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Right conformance window offset must be an integer multiple of the specified chroma subsampling");
    1692   xConfirmPara( m_confWinTop    % TComSPS::getWinUnitY(CHROMA_420) != 0, "Top conformance window offset must be an integer multiple of the specified chroma subsampling");
    1693   xConfirmPara( m_confWinBottom % TComSPS::getWinUnitY(CHROMA_420) != 0, "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling");
     2603  if (m_profile!=Profile::HIGHTHROUGHPUTREXT)
     2604  {
     2605    xConfirmPara( tileFlag && m_iWaveFrontSynchro,            "Tile and Wavefront can not be applied together, except in the High Throughput Intra 4:4:4 16 profile");
     2606  }
     2607
     2608  xConfirmPara( m_iSourceWidth  % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Picture width must be an integer multiple of the specified chroma subsampling");
     2609  xConfirmPara( m_iSourceHeight % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Picture height must be an integer multiple of the specified chroma subsampling");
     2610
     2611  xConfirmPara( m_aiPad[0] % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling");
     2612  xConfirmPara( m_aiPad[1] % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling");
     2613
     2614  xConfirmPara( m_confWinLeft   % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Left conformance window offset must be an integer multiple of the specified chroma subsampling");
     2615  xConfirmPara( m_confWinRight  % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Right conformance window offset must be an integer multiple of the specified chroma subsampling");
     2616  xConfirmPara( m_confWinTop    % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Top conformance window offset must be an integer multiple of the specified chroma subsampling");
     2617  xConfirmPara( m_confWinBottom % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling");
    16942618
    16952619  xConfirmPara( m_defaultDisplayWindowFlag && !m_vuiParametersPresentFlag, "VUI needs to be enabled for default display window");
     
    16972621  if (m_defaultDisplayWindowFlag)
    16982622  {
    1699     xConfirmPara( m_defDispWinLeftOffset   % TComSPS::getWinUnitX(CHROMA_420) != 0, "Left default display window offset must be an integer multiple of the specified chroma subsampling");
    1700     xConfirmPara( m_defDispWinRightOffset  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Right default display window offset must be an integer multiple of the specified chroma subsampling");
    1701     xConfirmPara( m_defDispWinTopOffset    % TComSPS::getWinUnitY(CHROMA_420) != 0, "Top default display window offset must be an integer multiple of the specified chroma subsampling");
    1702     xConfirmPara( m_defDispWinBottomOffset % TComSPS::getWinUnitY(CHROMA_420) != 0, "Bottom default display window offset must be an integer multiple of the specified chroma subsampling");
    1703   }
    1704 
    1705 #if H_3D
     2623    xConfirmPara( m_defDispWinLeftOffset   % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Left default display window offset must be an integer multiple of the specified chroma subsampling");
     2624    xConfirmPara( m_defDispWinRightOffset  % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Right default display window offset must be an integer multiple of the specified chroma subsampling");
     2625    xConfirmPara( m_defDispWinTopOffset    % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Top default display window offset must be an integer multiple of the specified chroma subsampling");
     2626    xConfirmPara( m_defDispWinBottomOffset % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Bottom default display window offset must be an integer multiple of the specified chroma subsampling");
     2627  }
     2628
     2629#if NH_3D
    17062630  xConfirmPara( m_pchCameraParameterFile    == 0                ,   "CameraParameterFile must be given");
    17072631  xConfirmPara( m_pchBaseViewCameraNumbers  == 0                ,   "BaseViewCameraNumbers must be given" );
    17082632  xConfirmPara( m_iNumberOfViews != m_cCameraData.getBaseViewNumbers().size() ,   "Number of Views in BaseViewCameraNumbers must be equal to NumberOfViews" );
    17092633  xConfirmPara    ( m_iCodedCamParPrecision < 0 || m_iCodedCamParPrecision > 5,       "CodedCamParsPrecision must be in range of 0..5" );
    1710 #if H_3D_VSO
     2634#if NH_3D_VSO
    17112635    if( m_bUseVSO )
    17122636    {
     
    17222646    ui >>= 1;
    17232647    if( (ui & 1) == 1)
     2648    {
    17242649      xConfirmPara( ui != 1 , "Width should be 2^n");
     2650    }
    17252651  }
    17262652  ui = m_uiMaxCUHeight;
     
    17292655    ui >>= 1;
    17302656    if( (ui & 1) == 1)
     2657    {
    17312658      xConfirmPara( ui != 1 , "Height should be 2^n");
    1732   }
    1733 
    1734 #if H_MV
     2659    }
     2660  }
     2661
     2662#if NH_MV
    17352663  // validate that POC of same frame is identical across multiple layers
    17362664  Bool bErrorMvePoc = false;
     
    18802808      Int*      m_numReorderPics     = m_numReorderPicsMvc    [layer]; // It is not a member, but this name helps avoiding code duplication !!!
    18812809#endif
     2810
    18822811  /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure
    18832812   * This permits the ability to omit a GOP structure specification */
    1884 #if H_MV
    1885   if (m_iIntraPeriod[layer] == 1 && m_GOPList[0].m_POC == -1) {
     2813#if NH_MV
     2814  if (m_iIntraPeriod[layer] == 1 && m_GOPList[0].m_POC == -1)
    18862815#else
    1887   if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1) {
    1888 #endif
     2816  if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1)
     2817#endif
     2818  {
    18892819    m_GOPList[0] = GOPEntry();
    18902820    m_GOPList[0].m_QPFactor = 1;
     
    18942824    m_GOPList[0].m_numRefPicsActive = 4;
    18952825  }
    1896  
     2826  else
     2827  {
     2828    xConfirmPara( m_intraConstraintFlag, "IntraConstraintFlag cannot be 1 for inter sequences");
     2829  }
     2830
    18972831  Bool verifiedGOP=false;
    18982832  Bool errorGOP=false;
     
    19062840  }
    19072841  Bool isOK[MAX_GOP];
    1908   for(Int i=0; i<MAX_GOP; i++) 
     2842  for(Int i=0; i<MAX_GOP; i++)
    19092843  {
    19102844    isOK[i]=false;
    19112845  }
    19122846  Int numOK=0;
    1913 #if H_MV
     2847#if NH_MV
    19142848  xConfirmPara( m_iIntraPeriod[layer] >=0&&(m_iIntraPeriod[layer]%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" );
    19152849#else
    1916 xConfirmPara( m_iIntraPeriod >=0&&(m_iIntraPeriod%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" );
     2850  xConfirmPara( m_iIntraPeriod >=0&&(m_iIntraPeriod%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" );
    19172851#endif
    19182852
     
    19242858    }
    19252859  }
    1926  
    1927 #if H_MV
    1928   if ( (m_iIntraPeriod[layer] != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable[layer]) )
     2860
     2861#if NH_MV
     2862  if ( (m_iIntraPeriod[layer] != 1) && !m_loopFilterOffsetInPPS && (!m_bLoopFilterDisable[layer]) )
    19292863#else
    1930   if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable) )
     2864  if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && (!m_bLoopFilterDisable) )
    19312865#endif
    19322866  {
     
    19372871    }
    19382872  }
     2873
    19392874  m_extraRPSs=0;
    19402875  //start looping through frames in coding order until we can verify that the GOP structure is correct.
    1941   while(!verifiedGOP&&!errorGOP) 
     2876  while(!verifiedGOP&&!errorGOP)
    19422877  {
    19432878    Int curGOP = (checkGOP-1)%m_iGOPSize;
    1944     Int curPOC = ((checkGOP-1)/m_iGOPSize)*m_iGOPSize + m_GOPList[curGOP].m_POC;   
    1945     if(m_GOPList[curGOP].m_POC<0) 
    1946     {
    1947 #if H_MV
     2879    Int curPOC = ((checkGOP-1)/m_iGOPSize)*m_iGOPSize + m_GOPList[curGOP].m_POC;
     2880    if(m_GOPList[curGOP].m_POC<0)
     2881    {
     2882#if NH_MV
    19482883      printf("\nError: found fewer Reference Picture Sets than GOPSize for layer %d\n", layer );
    19492884#else
     
    19522887      errorGOP=true;
    19532888    }
    1954     else 
     2889    else
    19552890    {
    19562891      //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
    19572892      Bool beforeI = false;
    1958       for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
     2893      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
    19592894      {
    19602895        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
     
    19632898          beforeI=true;
    19642899        }
    1965         else 
     2900        else
    19662901        {
    19672902          Bool found=false;
    1968           for(Int j=0; j<numRefs; j++) 
     2903          for(Int j=0; j<numRefs; j++)
    19692904          {
    1970             if(refList[j]==absPOC) 
     2905            if(refList[j]==absPOC)
    19712906            {
    19722907              found=true;
     
    19862921          if(!found)
    19872922          {
    1988 #if H_MV
     2923#if NH_MV
    19892924            printf("\nError: ref pic %d is not available for GOP frame %d of layer %d\n", m_GOPList[curGOP].m_referencePics[i], curGOP+1, layer);
    19902925#else
     
    19982933      {
    19992934        //all ref frames were present
    2000         if(!isOK[curGOP]) 
     2935        if(!isOK[curGOP])
    20012936        {
    20022937          numOK++;
     
    20082943        }
    20092944      }
    2010       else 
     2945      else
    20112946      {
    20122947        //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)