source: 3DVCSoftware/branches/HTM-16.1-dev/source/App/TAppEncoder/TAppEncCfg.cpp @ 1401

Last change on this file since 1401 was 1401, checked in by tech, 8 years ago

Exchange copy right dates.

  • Property svn:eol-style set to native
File size: 205.5 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license.
5 *
6 * Copyright (c) 2010-2016, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TAppEncCfg.cpp
35    \brief    Handle encoder configuration parameters
36*/
37
38#include <stdio.h>
39#include <stdlib.h>
40#include <cassert>
41#include <cstring>
42#include <string>
43#include <limits>
44#include "TLibCommon/TComRom.h"
45#include "TAppEncCfg.h"
46#include "TAppCommon/program_options_lite.h"
47#include "TLibEncoder/TEncRateCtrl.h"
48#ifdef WIN32
49#define strdup _strdup
50#endif
51
52#define MACRO_TO_STRING_HELPER(val) #val
53#define MACRO_TO_STRING(val) MACRO_TO_STRING_HELPER(val)
54
55using namespace std;
56namespace 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
102
103//! \ingroup TAppEncoder
104//! \{
105
106// ====================================================================================================================
107// Constructor / destructor / initialization / destroy
108// ====================================================================================================================
109
110TAppEncCfg::TAppEncCfg()
111: m_inputColourSpaceConvert(IPCOLOURSPACE_UNCHANGED)
112, m_snrInternalColourSpace(false)
113, m_outputInternalColourSpace(false)
114{
115#if !NH_MV
116  m_aidQP = NULL;
117#endif
118  m_startOfCodedInterval = NULL;
119  m_codedPivotValue = NULL;
120  m_targetPivotValue = NULL;
121
122#if KWU_RC_MADPRED_E0227
123  m_depthMADPred = 0;
124#endif
125}
126
127TAppEncCfg::~TAppEncCfg()
128{
129#if NH_MV
130  for( Int layer = 0; layer < m_aidQP.size(); layer++ )
131  {
132    if ( m_aidQP[layer] != NULL )
133    {
134      delete[] m_aidQP[layer];
135      m_aidQP[layer] = NULL;
136    }
137  }
138  for(Int i = 0; i< m_pchInputFileList.size(); i++ )
139  {
140    if ( m_pchInputFileList[i] != NULL )
141      free (m_pchInputFileList[i]);
142  }
143#else
144  if ( m_aidQP )
145  {
146    delete[] m_aidQP;
147  }
148#endif
149  if ( m_startOfCodedInterval )
150  {
151    delete[] m_startOfCodedInterval;
152    m_startOfCodedInterval = NULL;
153  }
154   if ( m_codedPivotValue )
155  {
156    delete[] m_codedPivotValue;
157    m_codedPivotValue = NULL;
158  }
159  if ( m_targetPivotValue )
160  {
161    delete[] m_targetPivotValue;
162    m_targetPivotValue = NULL;
163  }
164#if NH_MV
165  for(Int i = 0; i< m_pchReconFileList.size(); i++ )
166  {
167    if ( m_pchReconFileList[i] != NULL )
168      free (m_pchReconFileList[i]);
169  }
170
171  for( Int i = 0; i < m_GOPListMvc.size(); i++ )
172  {
173    if( m_GOPListMvc[i] )
174    {
175      delete[] m_GOPListMvc[i];
176      m_GOPListMvc[i] = NULL;
177    }
178  }
179
180  if ( m_pchBaseViewCameraNumbers != NULL )
181  {
182    free ( m_pchBaseViewCameraNumbers ); 
183  }
184#endif
185#if NH_3D_VSO
186  if (  m_pchVSOConfig != NULL)
187  {
188    free (  m_pchVSOConfig );
189  }
190#endif
191#if NH_3D_VSO || NH_3D 
192 
193  if ( m_pchCameraParameterFile != NULL )
194  {
195    free ( m_pchCameraParameterFile ); 
196  }
197#endif
198}
199
200Void TAppEncCfg::create()
201{
202}
203
204Void TAppEncCfg::destroy()
205{
206}
207
208
209#if NH_MV
210Void TAppEncCfg::xParseSeiCfg()
211{
212  for (Int i = 0; i < MAX_NUM_SEIS; i++)
213  {
214    if ( m_seiCfgFileNames[i] != NULL )
215    {
216      Int payloadType; 
217      po::Options opts;     
218     
219      opts.addOptions()("PayloadType", payloadType,-1, "Payload Type");
220      po::setDefaults(opts);     
221
222      po::ErrorReporter err;
223      err.output_on_unknow_parameter = false; 
224      po::parseConfigFile( opts, m_seiCfgFileNames[i], err );
225      SEI* sei = SEI::getNewSEIMessage( (SEI::PayloadType) payloadType ); 
226      assert( sei != NULL );
227
228      sei->setupFromCfgFile( m_seiCfgFileNames[i] ); 
229
230      m_seiMessages.push_back( sei );
231    }
232  }
233}
234#endif
235
236std::istringstream &operator>>(std::istringstream &in, GOPEntry &entry)     //input
237{
238  in>>entry.m_sliceType;
239  in>>entry.m_POC;
240  in>>entry.m_QPOffset;
241  in>>entry.m_QPFactor;
242  in>>entry.m_tcOffsetDiv2;
243  in>>entry.m_betaOffsetDiv2;
244  in>>entry.m_temporalId;
245  in>>entry.m_numRefPicsActive;
246  in>>entry.m_numRefPics;
247  for ( Int i = 0; i < entry.m_numRefPics; i++ )
248  {
249    in>>entry.m_referencePics[i];
250  }
251  in>>entry.m_interRPSPrediction;
252  if (entry.m_interRPSPrediction==1)
253  {
254    in>>entry.m_deltaRPS;
255    in>>entry.m_numRefIdc;
256    for ( Int i = 0; i < entry.m_numRefIdc; i++ )
257    {
258      in>>entry.m_refIdc[i];
259    }
260  }
261  else if (entry.m_interRPSPrediction==2)
262  {
263    in>>entry.m_deltaRPS;
264  }
265#if NH_MV
266  in>>entry.m_numActiveRefLayerPics;
267  for( Int i = 0; i < entry.m_numActiveRefLayerPics; i++ )
268  {
269    in>>entry.m_interLayerPredLayerIdc[i];
270  }
271  for( Int i = 0; i < entry.m_numActiveRefLayerPics; i++ )
272  {
273    in>>entry.m_interViewRefPosL[0][i];
274  }
275  for( Int i = 0; i < entry.m_numActiveRefLayerPics; i++ )
276  {
277    in>>entry.m_interViewRefPosL[1][i];
278  }
279#endif
280#if NH_3D
281  in>>entry.m_interCompPredFlag;
282#endif
283
284  return in;
285}
286
287Bool confirmPara(Bool bflag, const TChar* message);
288
289static inline ChromaFormat numberToChromaFormat(const Int val)
290{
291  switch (val)
292  {
293    case 400: return CHROMA_400; break;
294    case 420: return CHROMA_420; break;
295    case 422: return CHROMA_422; break;
296    case 444: return CHROMA_444; break;
297    default:  return NUM_CHROMA_FORMAT;
298  }
299}
300
301static const struct MapStrToProfile
302{
303  const TChar* str;
304  Profile::Name value;
305}
306strToProfile[] =
307{
308  {"none",                 Profile::NONE               },
309  {"main",                 Profile::MAIN               },
310  {"main10",               Profile::MAIN10             },
311  {"main-still-picture",   Profile::MAINSTILLPICTURE   },
312  {"main-RExt",            Profile::MAINREXT           },
313  {"high-throughput-RExt", Profile::HIGHTHROUGHPUTREXT }
314#if NH_MV
315  ,{"multiview-main"     , Profile::MULTIVIEWMAIN      },
316#if NH_3D
317   {"3d-main"            , Profile::MAIN3D             }
318#endif
319#endif
320
321};
322
323static const struct MapStrToExtendedProfile
324{
325  const TChar* str;
326  ExtendedProfileName value;
327}
328strToExtendedProfile[] =
329{
330    {"none",               NONE             },
331    {"main",               MAIN             },
332    {"main10",             MAIN10           },
333    {"main_still_picture",        MAINSTILLPICTURE },
334    {"main-still-picture",        MAINSTILLPICTURE },
335    {"main_RExt",                 MAINREXT         },
336    {"main-RExt",                 MAINREXT         },
337    {"main_rext",                 MAINREXT         },
338    {"main-rext",                 MAINREXT         },
339    {"high_throughput_RExt",      HIGHTHROUGHPUTREXT },
340    {"high-throughput-RExt",      HIGHTHROUGHPUTREXT },
341    {"high_throughput_rext",      HIGHTHROUGHPUTREXT },
342    {"high-throughput-rext",      HIGHTHROUGHPUTREXT },
343#if NH_MV
344    {"multiview-main"     , MULTIVIEWMAIN   },
345#if NH_3D
346    {"3d-main"            , MAIN3D          },
347#endif
348#endif
349    {"monochrome",         MONOCHROME_8     },
350    {"monochrome12",       MONOCHROME_12    },
351    {"monochrome16",       MONOCHROME_16    },
352    {"main12",             MAIN_12          },
353    {"main_422_10",        MAIN_422_10      },
354    {"main_422_12",        MAIN_422_12      },
355    {"main_444",           MAIN_444         },
356    {"main_444_10",        MAIN_444_10      },
357    {"main_444_12",        MAIN_444_12      },
358    {"main_444_16",        MAIN_444_16      },
359    {"main_intra",         MAIN_INTRA       },
360    {"main_10_intra",      MAIN_10_INTRA    },
361    {"main_12_intra",      MAIN_12_INTRA    },
362    {"main_422_10_intra",  MAIN_422_10_INTRA},
363    {"main_422_12_intra",  MAIN_422_12_INTRA},
364    {"main_444_intra",     MAIN_444_INTRA   },
365    {"main_444_still_picture",    MAIN_444_STILL_PICTURE },
366    {"main_444_10_intra",  MAIN_444_10_INTRA},
367    {"main_444_12_intra",  MAIN_444_12_INTRA},
368    {"main_444_16_intra",         MAIN_444_16_INTRA},
369    {"main_444_16_still_picture", MAIN_444_16_STILL_PICTURE }
370};
371
372static const ExtendedProfileName validRExtProfileNames[2/* intraConstraintFlag*/][4/* bit depth constraint 8=0, 10=1, 12=2, 16=3*/][4/*chroma format*/]=
373{
374    {
375        { MONOCHROME_8,  NONE,          NONE,              MAIN_444          }, // 8-bit  inter for 400, 420, 422 and 444
376        { NONE,          NONE,          MAIN_422_10,       MAIN_444_10       }, // 10-bit inter for 400, 420, 422 and 444
377        { MONOCHROME_12, MAIN_12,       MAIN_422_12,       MAIN_444_12       }, // 12-bit inter for 400, 420, 422 and 444
378        { MONOCHROME_16, NONE,          NONE,              MAIN_444_16       }  // 16-bit inter for 400, 420, 422 and 444 (the latter is non standard used for development)
379    },
380    {
381        { NONE,          MAIN_INTRA,    NONE,              MAIN_444_INTRA    }, // 8-bit  intra for 400, 420, 422 and 444
382        { NONE,          MAIN_10_INTRA, MAIN_422_10_INTRA, MAIN_444_10_INTRA }, // 10-bit intra for 400, 420, 422 and 444
383        { NONE,          MAIN_12_INTRA, MAIN_422_12_INTRA, MAIN_444_12_INTRA }, // 12-bit intra for 400, 420, 422 and 444
384        { NONE,          NONE,          NONE,              MAIN_444_16_INTRA }  // 16-bit intra for 400, 420, 422 and 444
385    }
386};
387
388static const struct MapStrToTier
389{
390  const TChar* str;
391  Level::Tier value;
392}
393strToTier[] =
394{
395  {"main", Level::MAIN},
396  {"high", Level::HIGH},
397};
398
399static const struct MapStrToLevel
400{
401  const TChar* str;
402  Level::Name value;
403}
404strToLevel[] =
405{
406  {"none",Level::NONE},
407  {"1",   Level::LEVEL1},
408  {"2",   Level::LEVEL2},
409  {"2.1", Level::LEVEL2_1},
410  {"3",   Level::LEVEL3},
411  {"3.1", Level::LEVEL3_1},
412  {"4",   Level::LEVEL4},
413  {"4.1", Level::LEVEL4_1},
414  {"5",   Level::LEVEL5},
415  {"5.1", Level::LEVEL5_1},
416  {"5.2", Level::LEVEL5_2},
417  {"6",   Level::LEVEL6},
418  {"6.1", Level::LEVEL6_1},
419  {"6.2", Level::LEVEL6_2},
420  {"8.5", Level::LEVEL8_5},
421};
422
423#if U0132_TARGET_BITS_SATURATION
424UInt g_uiMaxCpbSize[2][21] =
425{
426  //         LEVEL1,        LEVEL2,LEVEL2_1,     LEVEL3, LEVEL3_1,      LEVEL4, LEVEL4_1,       LEVEL5,  LEVEL5_1,  LEVEL5_2,    LEVEL6,  LEVEL6_1,  LEVEL6_2
427  { 0, 0, 0, 350000, 0, 0, 1500000, 3000000, 0, 6000000, 10000000, 0, 12000000, 20000000, 0,  25000000,  40000000,  60000000,  60000000, 120000000, 240000000 },
428  { 0, 0, 0,      0, 0, 0,       0,       0, 0,       0,        0, 0, 30000000, 50000000, 0, 100000000, 160000000, 240000000, 240000000, 480000000, 800000000 }
429};
430#endif
431
432static const struct MapStrToCostMode
433{
434  const TChar* str;
435  CostMode    value;
436}
437strToCostMode[] =
438{
439  {"lossy",                     COST_STANDARD_LOSSY},
440  {"sequence_level_lossless",   COST_SEQUENCE_LEVEL_LOSSLESS},
441  {"lossless",                  COST_LOSSLESS_CODING},
442  {"mixed_lossless_lossy",      COST_MIXED_LOSSLESS_LOSSY_CODING}
443};
444
445static const struct MapStrToScalingListMode
446{
447  const TChar* str;
448  ScalingListMode value;
449}
450strToScalingListMode[] =
451{
452  {"0",       SCALING_LIST_OFF},
453  {"1",       SCALING_LIST_DEFAULT},
454  {"2",       SCALING_LIST_FILE_READ},
455  {"off",     SCALING_LIST_OFF},
456  {"default", SCALING_LIST_DEFAULT},
457  {"file",    SCALING_LIST_FILE_READ}
458};
459
460template<typename T, typename P>
461static std::string enumToString(P map[], UInt mapLen, const T val)
462{
463  for (UInt i = 0; i < mapLen; i++)
464  {
465    if (val == map[i].value)
466    {
467      return map[i].str;
468    }
469  }
470  return std::string();
471}
472
473template<typename T, typename P>
474static istream& readStrToEnum(P map[], UInt mapLen, istream &in, T &val)
475{
476  string str;
477  in >> str;
478
479  for (UInt i = 0; i < mapLen; i++)
480  {
481    if (str == map[i].str)
482    {
483      val = map[i].value;
484      goto found;
485    }
486  }
487  /* not found */
488  in.setstate(ios::failbit);
489found:
490  return in;
491}
492
493//inline to prevent compiler warnings for "unused static function"
494
495static inline istream& operator >> (istream &in, ExtendedProfileName &profile)
496{
497  return readStrToEnum(strToExtendedProfile, sizeof(strToExtendedProfile)/sizeof(*strToExtendedProfile), in, profile);
498}
499
500namespace Level
501{
502  static inline istream& operator >> (istream &in, Tier &tier)
503  {
504    return readStrToEnum(strToTier, sizeof(strToTier)/sizeof(*strToTier), in, tier);
505  }
506
507  static inline istream& operator >> (istream &in, Name &level)
508  {
509    return readStrToEnum(strToLevel, sizeof(strToLevel)/sizeof(*strToLevel), in, level);
510  }
511}
512
513static inline istream& operator >> (istream &in, CostMode &mode)
514{
515  return readStrToEnum(strToCostMode, sizeof(strToCostMode)/sizeof(*strToCostMode), in, mode);
516}
517
518static inline istream& operator >> (istream &in, ScalingListMode &mode)
519{
520  return readStrToEnum(strToScalingListMode, sizeof(strToScalingListMode)/sizeof(*strToScalingListMode), in, mode);
521}
522
523template <class T>
524struct SMultiValueInput
525{
526  const T              minValIncl;
527  const T              maxValIncl;
528  const std::size_t    minNumValuesIncl;
529  const std::size_t    maxNumValuesIncl; // Use 0 for unlimited
530        std::vector<T> values;
531  SMultiValueInput() : minValIncl(0), maxValIncl(0), minNumValuesIncl(0), maxNumValuesIncl(0), values() { }
532  SMultiValueInput(std::vector<T> &defaults) : minValIncl(0), maxValIncl(0), minNumValuesIncl(0), maxNumValuesIncl(0), values(defaults) { }
533  SMultiValueInput(const T &minValue, const T &maxValue, std::size_t minNumberValues=0, std::size_t maxNumberValues=0)
534    : minValIncl(minValue), maxValIncl(maxValue), minNumValuesIncl(minNumberValues), maxNumValuesIncl(maxNumberValues), values()  { }
535  SMultiValueInput(const T &minValue, const T &maxValue, std::size_t minNumberValues, std::size_t maxNumberValues, const T* defValues, const UInt numDefValues)
536    : minValIncl(minValue), maxValIncl(maxValue), minNumValuesIncl(minNumberValues), maxNumValuesIncl(maxNumberValues), values(defValues, defValues+numDefValues)  { }
537  SMultiValueInput<T> &operator=(const std::vector<T> &userValues) { values=userValues; return *this; }
538  SMultiValueInput<T> &operator=(const SMultiValueInput<T> &userValues) { values=userValues.values; return *this; }
539
540  T readValue(const TChar *&pStr, Bool &bSuccess);
541
542  istream& readValues(std::istream &in);
543};
544
545template <class T>
546static inline istream& operator >> (std::istream &in, SMultiValueInput<T> &values)
547{
548  return values.readValues(in);
549  }
550
551template<>
552UInt SMultiValueInput<UInt>::readValue(const TChar *&pStr, Bool &bSuccess)
553    {
554  TChar *eptr;
555      UInt val=strtoul(pStr, &eptr, 0);
556  pStr=eptr;
557  bSuccess=!(*eptr!=0 && !isspace(*eptr) && *eptr!=',') && !(val<minValIncl || val>maxValIncl);
558  return val;
559      }
560
561template<>
562Int SMultiValueInput<Int>::readValue(const TChar *&pStr, Bool &bSuccess)
563      {
564  TChar *eptr;
565  Int val=strtol(pStr, &eptr, 0);
566      pStr=eptr;
567  bSuccess=!(*eptr!=0 && !isspace(*eptr) && *eptr!=',') && !(val<minValIncl || val>maxValIncl);
568  return val;
569}
570
571template<>
572Double SMultiValueInput<Double>::readValue(const TChar *&pStr, Bool &bSuccess)
573  {
574  TChar *eptr;
575  Double val=strtod(pStr, &eptr);
576  pStr=eptr;
577  bSuccess=!(*eptr!=0 && !isspace(*eptr) && *eptr!=',') && !(val<minValIncl || val>maxValIncl);
578  return val;
579  }
580
581template<>
582Bool SMultiValueInput<Bool>::readValue(const TChar *&pStr, Bool &bSuccess)
583    {
584  TChar *eptr;
585      Int val=strtol(pStr, &eptr, 0);
586      pStr=eptr;
587  bSuccess=!(*eptr!=0 && !isspace(*eptr) && *eptr!=',') && !(val<Int(minValIncl) || val>Int(maxValIncl));
588  return val!=0;
589}
590
591template <class T>
592istream& SMultiValueInput<T>::readValues(std::istream &in)
593{
594  values.clear();
595  string str;
596  while (!in.eof())
597  {
598    string tmp; in >> tmp; str+=" " + tmp;
599  }
600  if (!str.empty())
601  {
602    const TChar *pStr=str.c_str();
603    // soak up any whitespace
604    for(;isspace(*pStr);pStr++);
605
606    while (*pStr != 0)
607    {
608      Bool bSuccess=true;
609      T val=readValue(pStr, bSuccess);
610      if (!bSuccess)
611      {
612        in.setstate(ios::failbit);
613        break;
614      }
615
616      if (maxNumValuesIncl != 0 && values.size() >= maxNumValuesIncl)
617      {
618        in.setstate(ios::failbit);
619        break;
620      }
621      values.push_back(val);
622      // soak up any whitespace and up to 1 comma.
623      for(;isspace(*pStr);pStr++);
624      if (*pStr == ',')
625      {
626        pStr++;
627      }
628      for(;isspace(*pStr);pStr++);
629    }
630  }
631  if (values.size() < minNumValuesIncl)
632  {
633    in.setstate(ios::failbit);
634  }
635  return in;
636}
637
638static Void
639automaticallySelectRExtProfile(const Bool bUsingGeneralRExtTools,
640                               const Bool bUsingChromaQPAdjustment,
641                               const Bool bUsingExtendedPrecision,
642                               const Bool bIntraConstraintFlag,
643                               UInt &bitDepthConstraint,
644                               ChromaFormat &chromaFormatConstraint,
645                               const Int  maxBitDepth,
646                               const ChromaFormat chromaFormat)
647{
648  // Try to choose profile, according to table in Q1013.
649  UInt trialBitDepthConstraint=maxBitDepth;
650  if (trialBitDepthConstraint<8)
651  {
652    trialBitDepthConstraint=8;
653  }
654  else if (trialBitDepthConstraint==9 || trialBitDepthConstraint==11)
655  {
656    trialBitDepthConstraint++;
657  }
658  else if (trialBitDepthConstraint>12)
659  {
660    trialBitDepthConstraint=16;
661  }
662
663  // both format and bit depth constraints are unspecified
664  if (bUsingExtendedPrecision || trialBitDepthConstraint==16)
665  {
666    bitDepthConstraint = 16;
667    chromaFormatConstraint = (!bIntraConstraintFlag && chromaFormat==CHROMA_400) ? CHROMA_400 : CHROMA_444;
668  }
669  else if (bUsingGeneralRExtTools)
670  {
671    if (chromaFormat == CHROMA_400 && !bIntraConstraintFlag)
672    {
673      bitDepthConstraint = 16;
674      chromaFormatConstraint = CHROMA_400;
675    }
676    else
677    {
678      bitDepthConstraint = trialBitDepthConstraint;
679      chromaFormatConstraint = CHROMA_444;
680    }
681  }
682  else if (chromaFormat == CHROMA_400)
683  {
684    if (bIntraConstraintFlag)
685    {
686      chromaFormatConstraint = CHROMA_420; // there is no intra 4:0:0 profile.
687      bitDepthConstraint     = trialBitDepthConstraint;
688    }
689    else
690    {
691      chromaFormatConstraint = CHROMA_400;
692      bitDepthConstraint     = trialBitDepthConstraint == 8 ? 8 : 12;
693    }
694  }
695  else
696  {
697    bitDepthConstraint = trialBitDepthConstraint;
698    chromaFormatConstraint = chromaFormat;
699    if (bUsingChromaQPAdjustment && chromaFormat == CHROMA_420)
700    {
701      chromaFormatConstraint = CHROMA_422; // 4:2:0 cannot use the chroma qp tool.
702    }
703    if (chromaFormatConstraint == CHROMA_422 && bitDepthConstraint == 8)
704    {
705      bitDepthConstraint = 10; // there is no 8-bit 4:2:2 profile.
706    }
707    if (chromaFormatConstraint == CHROMA_420 && !bIntraConstraintFlag)
708    {
709      bitDepthConstraint = 12; // there is no 8 or 10-bit 4:2:0 inter RExt profile.
710    }
711  }
712}
713// ====================================================================================================================
714// Public member functions
715// ====================================================================================================================
716
717/** \param  argc        number of arguments
718    \param  argv        array of arguments
719    \retval             true when success
720 */
721Bool TAppEncCfg::parseCfg( Int argc, TChar* argv[] )
722{
723  Bool do_help = false;
724
725#if NH_MV
726  vector<Int>   cfg_dimensionLength; 
727  string        cfg_profiles;
728  string        cfg_levels; 
729  string        cfg_tiers; 
730#if NH_3D
731  cfg_dimensionLength.push_back( 2  );  // depth
732  cfg_dimensionLength.push_back( 32 );  // texture
733#else
734  cfg_dimensionLength.push_back( 64 ); 
735#endif
736#endif
737
738  Int tmpChromaFormat;
739  Int tmpInputChromaFormat;
740  Int tmpConstraintChromaFormat;
741  Int tmpWeightedPredictionMethod;
742  Int tmpFastInterSearchMode;
743  Int tmpMotionEstimationSearchMethod;
744  Int tmpSliceMode;
745  Int tmpSliceSegmentMode;
746  Int tmpDecodedPictureHashSEIMappedType;
747  string inputColourSpaceConvert;
748#if NH_MV
749  std::vector<ExtendedProfileName> extendedProfiles;
750#else
751  ExtendedProfileName extendedProfile;
752#endif
753  Int saoOffsetBitShift[MAX_NUM_CHANNEL_TYPE];
754
755  // Multi-value input fields:                                // minval, maxval (incl), min_entries, max_entries (incl) [, default values, number of default values]
756  SMultiValueInput<UInt> cfg_ColumnWidth                     (0, std::numeric_limits<UInt>::max(), 0, std::numeric_limits<UInt>::max());
757  SMultiValueInput<UInt> cfg_RowHeight                       (0, std::numeric_limits<UInt>::max(), 0, std::numeric_limits<UInt>::max());
758  SMultiValueInput<Int>  cfg_startOfCodedInterval            (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, 1<<16);
759  SMultiValueInput<Int>  cfg_codedPivotValue                 (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, 1<<16);
760  SMultiValueInput<Int>  cfg_targetPivotValue                (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, 1<<16);
761
762  SMultiValueInput<Double> cfg_adIntraLambdaModifier         (0, std::numeric_limits<Double>::max(), 0, MAX_TLAYER); ///< Lambda modifier for Intra pictures, one for each temporal layer. If size>temporalLayer, then use [temporalLayer], else if size>0, use [size()-1], else use m_adLambdaModifier.
763
764
765  const UInt defaultInputKneeCodes[3]  = { 600, 800, 900 };
766  const UInt defaultOutputKneeCodes[3] = { 100, 250, 450 };
767  SMultiValueInput<UInt> cfg_kneeSEIInputKneePointValue      (1,  999, 0, 999, defaultInputKneeCodes,  sizeof(defaultInputKneeCodes )/sizeof(UInt));
768  SMultiValueInput<UInt> cfg_kneeSEIOutputKneePointValue     (0, 1000, 0, 999, defaultOutputKneeCodes, sizeof(defaultOutputKneeCodes)/sizeof(UInt));
769  const Int defaultPrimaryCodes[6]     = { 0,50000, 0,0, 50000,0 };
770  const Int defaultWhitePointCode[2]   = { 16667, 16667 };
771  SMultiValueInput<Int>  cfg_DisplayPrimariesCode            (0, 50000, 3, 3, defaultPrimaryCodes,   sizeof(defaultPrimaryCodes  )/sizeof(Int));
772  SMultiValueInput<Int>  cfg_DisplayWhitePointCode           (0, 50000, 2, 2, defaultWhitePointCode, sizeof(defaultWhitePointCode)/sizeof(Int));
773
774  SMultiValueInput<Bool> cfg_timeCodeSeiTimeStampFlag        (0,  1, 0, MAX_TIMECODE_SEI_SETS);
775  SMultiValueInput<Bool> cfg_timeCodeSeiNumUnitFieldBasedFlag(0,  1, 0, MAX_TIMECODE_SEI_SETS);
776  SMultiValueInput<Int>  cfg_timeCodeSeiCountingType         (0,  6, 0, MAX_TIMECODE_SEI_SETS);
777  SMultiValueInput<Bool> cfg_timeCodeSeiFullTimeStampFlag    (0,  1, 0, MAX_TIMECODE_SEI_SETS);
778  SMultiValueInput<Bool> cfg_timeCodeSeiDiscontinuityFlag    (0,  1, 0, MAX_TIMECODE_SEI_SETS);
779  SMultiValueInput<Bool> cfg_timeCodeSeiCntDroppedFlag       (0,  1, 0, MAX_TIMECODE_SEI_SETS);
780  SMultiValueInput<Int>  cfg_timeCodeSeiNumberOfFrames       (0,511, 0, MAX_TIMECODE_SEI_SETS);
781  SMultiValueInput<Int>  cfg_timeCodeSeiSecondsValue         (0, 59, 0, MAX_TIMECODE_SEI_SETS);
782  SMultiValueInput<Int>  cfg_timeCodeSeiMinutesValue         (0, 59, 0, MAX_TIMECODE_SEI_SETS);
783  SMultiValueInput<Int>  cfg_timeCodeSeiHoursValue           (0, 23, 0, MAX_TIMECODE_SEI_SETS);
784  SMultiValueInput<Bool> cfg_timeCodeSeiSecondsFlag          (0,  1, 0, MAX_TIMECODE_SEI_SETS);
785  SMultiValueInput<Bool> cfg_timeCodeSeiMinutesFlag          (0,  1, 0, MAX_TIMECODE_SEI_SETS);
786  SMultiValueInput<Bool> cfg_timeCodeSeiHoursFlag            (0,  1, 0, MAX_TIMECODE_SEI_SETS);
787  SMultiValueInput<Int>  cfg_timeCodeSeiTimeOffsetLength     (0, 31, 0, MAX_TIMECODE_SEI_SETS);
788  SMultiValueInput<Int>  cfg_timeCodeSeiTimeOffsetValue      (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, MAX_TIMECODE_SEI_SETS);
789  Int warnUnknowParameter = 0;
790
791  po::Options opts;
792  opts.addOptions()
793  ("help",                                            do_help,                                          false, "this help text")
794  ("c",    po::parseConfigFile, "configuration file name")
795  ("WarnUnknowParameter,w",                           warnUnknowParameter,                                  0, "warn for unknown configuration parameters instead of failing")
796
797  // File, I/O and source parameters
798#if NH_MV
799  ("InputFile_%d,i_%d",       m_pchInputFileList,       (char *) 0 , MAX_NUM_LAYER_IDS , "original Yuv input file name %d")
800#else
801  ("InputFile,i",                                     m_inputFileName,                             string(""), "Original YUV input file name")
802#endif
803  ("BitstreamFile,b",                                 m_bitstreamFileName,                         string(""), "Bitstream output file name")
804#if NH_MV
805  ("ReconFile_%d,o_%d",       m_pchReconFileList,       (char *) 0 , MAX_NUM_LAYER_IDS , "reconstructed Yuv output file name %d")
806#else
807  ("ReconFile,o",                                     m_reconFileName,                             string(""), "Reconstructed YUV output file name")
808#endif
809#if NH_MV
810  ("NumberOfLayers",                 m_numberOfLayers     , 1,                     "Number of layers")
811#if !NH_3D                           
812  ("ScalabilityMask",                m_scalabilityMask    , 2                    , "Scalability Mask: 2: Multiview, 8: Auxiliary, 10: Multiview + Auxiliary")   
813#else                               
814  ("ScalabilityMask",                m_scalabilityMask    , 3                    , "Scalability Mask, 1: Texture 3: Texture + Depth ")   
815#endif 
816  ("DimensionIdLen",                 m_dimensionIdLen     , cfg_dimensionLength  , "Number of bits used to store dimensions Id")
817  ("ViewOrderIndex",                 m_viewOrderIndex              , IntAry1d(1,0),                                 "View Order Index per layer")
818  ("ViewId",                         m_viewId                      , IntAry1d(1,0),                                 "View Id per View Order Index")
819  ("AuxId",                          m_auxId                       , IntAry1d(1,0),                                 "AuxId per layer")
820#if NH_3D_VSO || NH_3D
821  ("DepthFlag",                      m_depthFlag                   , IntAry1d(1,0),                                 "Depth Flag")
822#endif
823  ("TargetEncLayerIdList",           m_targetEncLayerIdList        , IntAry1d(0,0),                                 "LayerIds in Nuh to be encoded") 
824  ("LayerIdInNuh",                   m_layerIdInNuh                , IntAry1d(1,0),                                 "LayerId in Nuh") 
825  ("SplittingFlag",                  m_splittingFlag               , false,                                         "Splitting Flag")   
826
827  // Layer Sets + Output Layer Sets + Profile Tier Level
828  ("VpsNumLayerSets"               , m_vpsNumLayerSets             , 1                                          ,   "Number of layer sets")   
829  ("LayerIdsInSet_%d"              , m_layerIdxInVpsInSets         , IntAry1d(1,0) , MAX_VPS_OP_SETS_PLUS1      ,   "Layer indices in VPS of layers in layer set") 
830  ("NumAddLayerSets"               , m_numAddLayerSets             , 0 ,                                             "NumAddLayerSets     ")
831  ("HighestLayerIdxPlus1_%d"       , m_highestLayerIdxPlus1        , IntAry1d(0,0) , MAX_VPS_NUM_ADD_LAYER_SETS ,   "HighestLayerIdxPlus1")
832  ("DefaultTargetOutputLayerIdc"   , m_defaultOutputLayerIdc       , 0 ,                                             "Specifies output layers of layer sets, 0: output all layers, 1: output highest layer, 2: specified by LayerIdsInDefOutputLayerSet")
833  ("OutputLayerSetIdx"             , m_outputLayerSetIdx           , IntAry1d(0,0)                              ,   "Indices of layer sets used as additional output layer sets")
834  ("LayerIdsInAddOutputLayerSet_%d", m_layerIdsInAddOutputLayerSet , IntAry1d(0,0) , MAX_VPS_ADD_OUTPUT_LAYER_SETS, "Indices in VPS of output layers in additional output layer set") 
835  ("LayerIdsInDefOutputLayerSet_%d", m_layerIdsInDefOutputLayerSet , IntAry1d(0,0) , MAX_VPS_OP_SETS_PLUS1,         "Indices in VPS of output layers in layer set") 
836  ("AltOutputLayerFlag"            , m_altOutputLayerFlag          , BoolAry1d(1,0),                                "Alt output layer flag")
837 
838  ("ProfileTierLevelIdx_%d"        , m_profileTierLevelIdx         , IntAry1d(0)  , MAX_NUM_LAYERS,                  "Indices to profile level tier for ols")
839  // Layer dependencies
840  ("DirectRefLayers_%d"            , m_directRefLayers             , IntAry1d(0,0), MAX_NUM_LAYERS,                  "LayerIdx in VPS of direct reference layers")
841  ("DependencyTypes_%d"            , m_dependencyTypes             , IntAry1d(0,0), MAX_NUM_LAYERS,                  "Dependency types of direct reference layers, 0: Sample 1: Motion 2: Sample+Motion")
842#endif
843  ("SourceWidth,-wdt",                                m_iSourceWidth,                                       0, "Source picture width")
844  ("SourceHeight,-hgt",                               m_iSourceHeight,                                      0, "Source picture height")
845  ("InputBitDepth",                                   m_inputBitDepth[CHANNEL_TYPE_LUMA],                   8, "Bit-depth of input file")
846  ("OutputBitDepth",                                  m_outputBitDepth[CHANNEL_TYPE_LUMA],                  0, "Bit-depth of output file (default:InternalBitDepth)")
847  ("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)")
848  ("InternalBitDepth",                                m_internalBitDepth[CHANNEL_TYPE_LUMA],                0, "Bit-depth the codec operates at. (default:MSBExtendedBitDepth). If different to MSBExtendedBitDepth, source data will be converted")
849  ("InputBitDepthC",                                  m_inputBitDepth[CHANNEL_TYPE_CHROMA],                 0, "As per InputBitDepth but for chroma component. (default:InputBitDepth)")
850  ("OutputBitDepthC",                                 m_outputBitDepth[CHANNEL_TYPE_CHROMA],                0, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
851  ("MSBExtendedBitDepthC",                            m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA],           0, "As per MSBExtendedBitDepth but for chroma component. (default:MSBExtendedBitDepth)")
852  ("InternalBitDepthC",                               m_internalBitDepth[CHANNEL_TYPE_CHROMA],              0, "As per InternalBitDepth but for chroma component. (default:InternalBitDepth)")
853  ("ExtendedPrecision",                               m_extendedPrecisionProcessingFlag,                false, "Increased internal accuracies to support high bit depths (not valid in V1 profiles)")
854  ("HighPrecisionPredictionWeighting",                m_highPrecisionOffsetsEnabledFlag,                false, "Use high precision option for weighted prediction (not valid in V1 profiles)")
855  ("InputColourSpaceConvert",                         inputColourSpaceConvert,                     string(""), "Colour space conversion to apply to input video. Permitted values are (empty string=UNCHANGED) " + getListOfColourSpaceConverts(true))
856  ("SNRInternalColourSpace",                          m_snrInternalColourSpace,                         false, "If true, then no colour space conversion is applied prior to SNR, otherwise inverse of input is applied.")
857  ("OutputInternalColourSpace",                       m_outputInternalColourSpace,                      false, "If true, then no colour space conversion is applied for reconstructed video, otherwise inverse of input is applied.")
858  ("InputChromaFormat",                               tmpInputChromaFormat,                               420, "InputChromaFormatIDC")
859  ("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")
860  ("PrintFrameMSE",                                   m_printFrameMSE,                                  false, "0 (default) emit only bit count and PSNRs for each frame, 1 = also emit MSE values")
861  ("PrintSequenceMSE",                                m_printSequenceMSE,                               false, "0 (default) emit only bit rate and PSNRs for the whole sequence, 1 = also emit MSE values")
862  ("CabacZeroWordPaddingEnabled",                     m_cabacZeroWordPaddingEnabled,                     true, "0 do not add conforming cabac-zero-words to bit streams, 1 (default) = add cabac-zero-words as required")
863  ("ChromaFormatIDC,-cf",                             tmpChromaFormat,                                      0, "ChromaFormatIDC (400|420|422|444 or set 0 (default) for same as InputChromaFormat)")
864  ("ConformanceMode",                                 m_conformanceWindowMode,                              0, "Deprecated alias of ConformanceWindowMode")
865  ("ConformanceWindowMode",                           m_conformanceWindowMode,                              0, "Window conformance mode (0: no window, 1:automatic padding, 2:padding, 3:conformance")
866  ("HorizontalPadding,-pdx",                          m_aiPad[0],                                           0, "Horizontal source padding for conformance window mode 2")
867  ("VerticalPadding,-pdy",                            m_aiPad[1],                                           0, "Vertical source padding for conformance window mode 2")
868  ("ConfLeft",                                        m_confWinLeft,                                        0, "Deprecated alias of ConfWinLeft")
869  ("ConfRight",                                       m_confWinRight,                                       0, "Deprecated alias of ConfWinRight")
870  ("ConfTop",                                         m_confWinTop,                                         0, "Deprecated alias of ConfWinTop")
871  ("ConfBottom",                                      m_confWinBottom,                                      0, "Deprecated alias of ConfWinBottom")
872  ("ConfWinLeft",                                     m_confWinLeft,                                        0, "Left offset for window conformance mode 3")
873  ("ConfWinRight",                                    m_confWinRight,                                       0, "Right offset for window conformance mode 3")
874  ("ConfWinTop",                                      m_confWinTop,                                         0, "Top offset for window conformance mode 3")
875  ("ConfWinBottom",                                   m_confWinBottom,                                      0, "Bottom offset for window conformance mode 3")
876  ("AccessUnitDelimiter",                             m_AccessUnitDelimiter,                            false, "Enable Access Unit Delimiter NALUs")
877  ("FrameRate,-fr",                                   m_iFrameRate,                                         0, "Frame rate")
878  ("FrameSkip,-fs",                                   m_FrameSkip,                                         0u, "Number of frames to skip at start of input YUV")
879  ("FramesToBeEncoded,f",                             m_framesToBeEncoded,                                  0, "Number of frames to be encoded (default=all)")
880  ("ClipInputVideoToRec709Range",                     m_bClipInputVideoToRec709Range,                   false, "If true then clip input video to the Rec. 709 Range on loading when InternalBitDepth is less than MSBExtendedBitDepth")
881  ("ClipOutputVideoToRec709Range",                    m_bClipOutputVideoToRec709Range,                  false, "If true then clip output video to the Rec. 709 Range on saving when OutputBitDepth is less than InternalBitDepth")
882  ("SummaryOutFilename",                              m_summaryOutFilename,                          string(), "Filename to use for producing summary output file. If empty, do not produce a file.")
883  ("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.")
884  ("SummaryVerboseness",                              m_summaryVerboseness,                                0u, "Specifies the level of the verboseness of the text output")
885
886  //Field coding parameters
887  ("FieldCoding",                                     m_isField,                                        false, "Signals if it's a field based coding")
888  ("TopFieldFirst, Tff",                              m_isTopFieldFirst,                                false, "In case of field based coding, signals whether if it's a top field first or not")
889  ("EfficientFieldIRAPEnabled",                       m_bEfficientFieldIRAPEnabled,                      true, "Enable to code fields in a specific, potentially more efficient, order.")
890  ("HarmonizeGopFirstFieldCoupleEnabled",             m_bHarmonizeGopFirstFieldCoupleEnabled,            true, "Enables harmonization of Gop first field couple")
891
892  // Profile and level
893#if NH_MV
894  ("Profile" ,                                        cfg_profiles,                                string(""), "Profile in VpsProfileTierLevel (Indication only)")
895  ("Level"   ,                                        cfg_levels ,                                 string(""), "Level indication in VpsProfileTierLevel (Indication only)")
896  ("Tier"    ,                                        cfg_tiers  ,                                 string(""), "Tier indication in VpsProfileTierLevel (Indication only)")
897  ("InblFlag",                                        m_inblFlag ,                       std::vector<Bool>(0), "InblFlags in VpsProfileTierLevel (Indication only)" )
898#else
899  ("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")
900  ("Level",                                           m_level,                                    Level::NONE, "Level limit to be used, eg 5.1, or none")
901  ("Tier",                                            m_levelTier,                                Level::MAIN, "Tier to use for interpretation of --Level (main or high only)")
902#endif
903  ("MaxBitDepthConstraint",                           m_bitDepthConstraint,                                0u, "Bit depth to use for profile-constraint for RExt profiles. 0=automatically choose based upon other parameters")
904  ("MaxChromaFormatConstraint",                       tmpConstraintChromaFormat,                            0, "Chroma-format to use for the profile-constraint for RExt profiles. 0=automatically choose based upon other parameters")
905  ("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)")
906  ("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)")
907  ("LowerBitRateConstraintFlag",                      m_lowerBitRateConstraintFlag,                      true, "Value of general_lower_bit_rate_constraint_flag to use for RExt profiles")
908
909  ("ProgressiveSource",                               m_progressiveSourceFlag,                          false, "Indicate that source is progressive")
910  ("InterlacedSource",                                m_interlacedSourceFlag,                           false, "Indicate that source is interlaced")
911  ("NonPackedSource",                                 m_nonPackedConstraintFlag,                        false, "Indicate that source does not contain frame packing")
912  ("FrameOnly",                                       m_frameOnlyConstraintFlag,                        false, "Indicate that the bitstream contains only frames")
913
914  // Unit definition parameters
915  ("MaxCUWidth",                                      m_uiMaxCUWidth,                                     64u)
916  ("MaxCUHeight",                                     m_uiMaxCUHeight,                                    64u)
917  // todo: remove defaults from MaxCUSize
918  ("MaxCUSize,s",                                     m_uiMaxCUWidth,                                     64u, "Maximum CU size")
919  ("MaxCUSize,s",                                     m_uiMaxCUHeight,                                    64u, "Maximum CU size")
920  ("MaxPartitionDepth,h",                             m_uiMaxCUDepth,                                      4u, "CU depth")
921
922  ("QuadtreeTULog2MaxSize",                           m_uiQuadtreeTULog2MaxSize,                           6u, "Maximum TU size in logarithm base 2")
923  ("QuadtreeTULog2MinSize",                           m_uiQuadtreeTULog2MinSize,                           2u, "Minimum TU size in logarithm base 2")
924
925  ("QuadtreeTUMaxDepthIntra",                         m_uiQuadtreeTUMaxDepthIntra,                         1u, "Depth of TU tree for intra CUs")
926  ("QuadtreeTUMaxDepthInter",                         m_uiQuadtreeTUMaxDepthInter,                         2u, "Depth of TU tree for inter CUs")
927#if NH_MV 
928  // Coding structure parameters
929  ("IntraPeriod,-ip",                                 m_iIntraPeriod,std::vector<Int>(1,-1)                  , "Intra period in frames, (-1: only first frame), per layer")
930#else
931  // Coding structure paramters
932  ("IntraPeriod,-ip",                                 m_iIntraPeriod,                                      -1, "Intra period in frames, (-1: only first frame)")
933#endif
934  ("DecodingRefreshType,-dr",                         m_iDecodingRefreshType,                               0, "Intra refresh type (0:none 1:CRA 2:IDR 3:RecPointSEI)")
935  ("GOPSize,g",                                       m_iGOPSize,                                           1, "GOP size of temporal structure")
936
937  // motion search options
938  ("DisableIntraInInter",                             m_bDisableIntraPUsInInterSlices,                  false, "Flag to disable intra PUs in inter slices")
939  ("FastSearch",                                      tmpMotionEstimationSearchMethod,  Int(MESEARCH_DIAMOND), "0:Full search 1:Diamond 2:Selective 3:Enhanced Diamond")
940  ("SearchRange,-sr",                                 m_iSearchRange,                                      96, "Motion search range")
941#if NH_MV
942  ("DispSearchRangeRestriction",  m_bUseDisparitySearchRangeRestriction, false, "restrict disparity search range")
943  ("VerticalDispSearchRange",     m_iVerticalDisparitySearchRange, 56, "vertical disparity search range")
944#endif
945  ("BipredSearchRange",                               m_bipredSearchRange,                                  4, "Motion search range for bipred refinement")
946  ("MinSearchWindow",                                 m_minSearchWindow,                                    8, "Minimum motion search window size for the adaptive window ME")
947  ("RestrictMESampling",                              m_bRestrictMESampling,                            false, "Restrict ME Sampling for selective inter motion search")
948  ("ClipForBiPredMEEnabled",                          m_bClipForBiPredMeEnabled,                        false, "Enables clipping in the Bi-Pred ME. It is disabled to reduce encoder run-time")
949  ("FastMEAssumingSmootherMVEnabled",                 m_bFastMEAssumingSmootherMVEnabled,                true, "Enables fast ME assuming a smoother MV.")
950
951  ("HadamardME",                                      m_bUseHADME,                                       true, "Hadamard ME for fractional-pel")
952  ("ASR",                                             m_bUseASR,                                        false, "Adaptive motion search range")
953
954  // Mode decision parameters
955  ("LambdaModifier0,-LM0",                            m_adLambdaModifier[ 0 ],                  ( Double )1.0, "Lambda modifier for temporal layer 0. If LambdaModifierI is used, this will not affect intra pictures")
956  ("LambdaModifier1,-LM1",                            m_adLambdaModifier[ 1 ],                  ( Double )1.0, "Lambda modifier for temporal layer 1. If LambdaModifierI is used, this will not affect intra pictures")
957  ("LambdaModifier2,-LM2",                            m_adLambdaModifier[ 2 ],                  ( Double )1.0, "Lambda modifier for temporal layer 2. If LambdaModifierI is used, this will not affect intra pictures")
958  ("LambdaModifier3,-LM3",                            m_adLambdaModifier[ 3 ],                  ( Double )1.0, "Lambda modifier for temporal layer 3. If LambdaModifierI is used, this will not affect intra pictures")
959  ("LambdaModifier4,-LM4",                            m_adLambdaModifier[ 4 ],                  ( Double )1.0, "Lambda modifier for temporal layer 4. If LambdaModifierI is used, this will not affect intra pictures")
960  ("LambdaModifier5,-LM5",                            m_adLambdaModifier[ 5 ],                  ( Double )1.0, "Lambda modifier for temporal layer 5. If LambdaModifierI is used, this will not affect intra pictures")
961  ("LambdaModifier6,-LM6",                            m_adLambdaModifier[ 6 ],                  ( Double )1.0, "Lambda modifier for temporal layer 6. If LambdaModifierI is used, this will not affect intra pictures")
962  ("LambdaModifierI,-LMI",                            cfg_adIntraLambdaModifier,    cfg_adIntraLambdaModifier, "Lambda modifiers for Intra pictures, comma separated, up to one the number of temporal layer. If entry for temporalLayer exists, then use it, else if some are specified, use the last, else use the standard LambdaModifiers.")
963  ("IQPFactor,-IQF",                                  m_dIntraQpFactor,                                  -1.0, "Intra QP Factor for Lambda Computation. If negative, use the default equation: 0.57*(1.0 - Clip3( 0.0, 0.5, 0.05*(Double)(isField ? (GopSize-1)/2 : GopSize-1) ))")
964
965  /* Quantization parameters */
966#if NH_MV
967  ("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")
968#else
969  ("QP,q",                                            m_fQP,                                             30.0, "Qp value, if value is float, QP is switched once during encoding")
970#endif
971  ("DeltaQpRD,-dqr",                                  m_uiDeltaQpRD,                                       0u, "max dQp offset for slice")
972  ("MaxDeltaQP,d",                                    m_iMaxDeltaQP,                                        0, "max dQp offset for block")
973  ("MaxCuDQPDepth,-dqd",                              m_iMaxCuDQPDepth,                                     0, "max depth for a minimum CuDQP")
974  ("MaxCUChromaQpAdjustmentDepth",                    m_diffCuChromaQpOffsetDepth,                         -1, "Maximum depth for CU chroma Qp adjustment - set less than 0 to disable")
975  ("FastDeltaQP",                                     m_bFastDeltaQP,                                   false, "Fast Delta QP Algorithm")
976
977  ("CbQpOffset,-cbqpofs",                             m_cbQpOffset,                                         0, "Chroma Cb QP Offset")
978  ("CrQpOffset,-crqpofs",                             m_crQpOffset,                                         0, "Chroma Cr QP Offset")
979
980#if ADAPTIVE_QP_SELECTION
981  ("AdaptiveQpSelection,-aqps",                       m_bUseAdaptQpSelect,                              false, "AdaptiveQpSelection")
982#endif
983
984  ("AdaptiveQP,-aq",                                  m_bUseAdaptiveQP,                                 false, "QP adaptation based on a psycho-visual model")
985  ("MaxQPAdaptationRange,-aqr",                       m_iQPAdaptationRange,                                 6, "QP adaptation range")
986  ("dQPFile,m",                                       m_dQPFileName,                               string(""), "dQP file name")
987  ("RDOQ",                                            m_useRDOQ,                                         true)
988  ("RDOQTS",                                          m_useRDOQTS,                                       true)
989#if T0196_SELECTIVE_RDOQ
990  ("SelectiveRDOQ",                                   m_useSelectiveRDOQ,                               false, "Enable selective RDOQ")
991#endif
992  ("RDpenalty",                                       m_rdPenalty,                                          0,  "RD-penalty for 32x32 TU for intra in non-intra slices. 0:disabled  1:RD-penalty  2:maximum RD-penalty")
993
994  // Deblocking filter parameters
995#if NH_MV
996  ("LoopFilterDisable",                               m_bLoopFilterDisable,                             std::vector<Bool>(1,false), "Disable Loop Filter per Layer" )
997#else
998  ("LoopFilterDisable",                               m_bLoopFilterDisable,                             false)
999#endif
1000  ("LoopFilterOffsetInPPS",                           m_loopFilterOffsetInPPS,                           true)
1001  ("LoopFilterBetaOffset_div2",                       m_loopFilterBetaOffsetDiv2,                           0)
1002  ("LoopFilterTcOffset_div2",                         m_loopFilterTcOffsetDiv2,                             0)
1003  ("DeblockingFilterMetric",                          m_DeblockingFilterMetric,                         false)
1004
1005  // Coding tools
1006  ("AMP",                                             m_enableAMP,                                       true, "Enable asymmetric motion partitions")
1007  ("CrossComponentPrediction",                        m_crossComponentPredictionEnabledFlag,            false, "Enable the use of cross-component prediction (not valid in V1 profiles)")
1008  ("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")
1009  ("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")
1010  ("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")
1011  ("TransformSkip",                                   m_useTransformSkip,                               false, "Intra transform skipping")
1012  ("TransformSkipFast",                               m_useTransformSkipFast,                           false, "Fast intra transform skipping")
1013  ("TransformSkipLog2MaxSize",                        m_log2MaxTransformSkipBlockSize,                     2U, "Specify transform-skip maximum size. Minimum 2. (not valid in V1 profiles)")
1014  ("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)")
1015  ("ExplicitResidualDPCM",                            m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT],        false, "Enable explicitly signalled residual DPCM for inter (not valid in V1 profiles)")
1016  ("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)")
1017  ("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)")
1018  ("GolombRiceParameterAdaptation",                   m_persistentRiceAdaptationEnabledFlag,            false, "Enable the adaptation of the Golomb-Rice parameter over the course of each slice")
1019  ("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" )
1020#if NH_MV
1021  ("SAO",                      m_bUseSAO, std::vector<Bool>(1,true), "Enable Sample Adaptive Offset per Layer")
1022#else
1023  ("SAO",                                             m_bUseSAO,                                         true, "Enable Sample Adaptive Offset")
1024#endif
1025  ("TestSAODisableAtPictureLevel",                    m_bTestSAODisableAtPictureLevel,                  false, "Enables the testing of disabling SAO at the picture level after having analysed all blocks")
1026  ("SaoEncodingRate",                                 m_saoEncodingRate,                                 0.75, "When >0 SAO early picture termination is enabled for luma and chroma")
1027  ("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")
1028  ("MaxNumOffsetsPerPic",                             m_maxNumOffsetsPerPic,                             2048, "Max number of SAO offset per picture (Default: 2048)")
1029  ("SAOLcuBoundary",                                  m_saoCtuBoundary,                                 false, "0: right/bottom CTU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas")
1030  ("SliceMode",                                       tmpSliceMode,                            Int(NO_SLICES), "0: Disable all Recon slice limits, 1: Enforce max # of CTUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice")
1031  ("SliceArgument",                                   m_sliceArgument,                                      0, "Depending on SliceMode being:"
1032                                                                                                               "\t1: max number of CTUs per slice"
1033                                                                                                               "\t2: max number of bytes per slice"
1034                                                                                                               "\t3: max number of tiles per slice")
1035  ("SliceSegmentMode",                                tmpSliceSegmentMode,                     Int(NO_SLICES), "0: Disable all slice segment limits, 1: Enforce max # of CTUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice")
1036  ("SliceSegmentArgument",                            m_sliceSegmentArgument,                               0, "Depending on SliceSegmentMode being:"
1037                                                                                                               "\t1: max number of CTUs per slice segment"
1038                                                                                                               "\t2: max number of bytes per slice segment"
1039                                                                                                               "\t3: max number of tiles per slice segment")
1040  ("LFCrossSliceBoundaryFlag",                        m_bLFCrossSliceBoundaryFlag,                       true)
1041
1042  ("ConstrainedIntraPred",                            m_bUseConstrainedIntraPred,                       false, "Constrained Intra Prediction")
1043  ("FastUDIUseMPMEnabled",                            m_bFastUDIUseMPMEnabled,                           true, "If enabled, adapt intra direction search, accounting for MPM")
1044  ("FastMEForGenBLowDelayEnabled",                    m_bFastMEForGenBLowDelayEnabled,                   true, "If enabled use a fast ME for generalised B Low Delay slices")
1045  ("UseBLambdaForNonKeyLowDelayPictures",             m_bUseBLambdaForNonKeyLowDelayPictures,            true, "Enables use of B-Lambda for non-key low-delay pictures")
1046  ("PCMEnabledFlag",                                  m_usePCM,                                         false)
1047  ("PCMLog2MaxSize",                                  m_pcmLog2MaxSize,                                    5u)
1048  ("PCMLog2MinSize",                                  m_uiPCMLog2MinSize,                                  3u)
1049
1050  ("PCMInputBitDepthFlag",                            m_bPCMInputBitDepthFlag,                           true)
1051  ("PCMFilterDisableFlag",                            m_bPCMFilterDisableFlag,                          false)
1052  ("IntraReferenceSmoothing",                         m_enableIntraReferenceSmoothing,                   true, "0: Disable use of intra reference smoothing (not valid in V1 profiles). 1: Enable use of intra reference smoothing (same as V1)")
1053  ("WeightedPredP,-wpP",                              m_useWeightedPred,                                false, "Use weighted prediction in P slices")
1054  ("WeightedPredB,-wpB",                              m_useWeightedBiPred,                              false, "Use weighted (bidirectional) prediction in B slices")
1055  ("WeightedPredMethod,-wpM",                         tmpWeightedPredictionMethod, Int(WP_PER_PICTURE_WITH_SIMPLE_DC_COMBINED_COMPONENT), "Weighted prediction method")
1056  ("Log2ParallelMergeLevel",                          m_log2ParallelMergeLevel,                            2u, "Parallel merge estimation region")
1057    //deprecated copies of renamed tile parameters
1058  ("UniformSpacingIdc",                               m_tileUniformSpacingFlag,                         false,      "deprecated alias of TileUniformSpacing")
1059  ("ColumnWidthArray",                                cfg_ColumnWidth,                        cfg_ColumnWidth, "deprecated alias of TileColumnWidthArray")
1060  ("RowHeightArray",                                  cfg_RowHeight,                            cfg_RowHeight, "deprecated alias of TileRowHeightArray")
1061
1062  ("TileUniformSpacing",                              m_tileUniformSpacingFlag,                         false,      "Indicates that tile columns and rows are distributed uniformly")
1063  ("NumTileColumnsMinus1",                            m_numTileColumnsMinus1,                               0,          "Number of tile columns in a picture minus 1")
1064  ("NumTileRowsMinus1",                               m_numTileRowsMinus1,                                  0,          "Number of rows in a picture minus 1")
1065  ("TileColumnWidthArray",                            cfg_ColumnWidth,                        cfg_ColumnWidth, "Array containing tile column width values in units of CTU")
1066  ("TileRowHeightArray",                              cfg_RowHeight,                            cfg_RowHeight, "Array containing tile row height values in units of CTU")
1067  ("LFCrossTileBoundaryFlag",                         m_bLFCrossTileBoundaryFlag,                        true, "1: cross-tile-boundary loop filtering. 0:non-cross-tile-boundary loop filtering")
1068  ("WaveFrontSynchro",                                m_entropyCodingSyncEnabledFlag,                   false, "0: entropy coding sync disabled; 1 entropy coding sync enabled")
1069  ("ScalingList",                                     m_useScalingListId,                    SCALING_LIST_OFF, "0/off: no scaling list, 1/default: default scaling lists, 2/file: scaling lists specified in ScalingListFile")
1070  ("ScalingListFile",                                 m_scalingListFileName,                       string(""), "Scaling list file name. Use an empty string to produce help.")
1071  ("SignHideFlag,-SBH",                               m_signHideFlag,                                    true)
1072  ("MaxNumMergeCand",                                 m_maxNumMergeCand,                                   5u, "Maximum number of merge candidates")
1073  /* Misc. */
1074  ("SEIDecodedPictureHash",                           tmpDecodedPictureHashSEIMappedType,                   0, "Control generation of decode picture hash SEI messages\n"
1075                                                                                                               "\t3: checksum\n"
1076                                                                                                               "\t2: CRC\n"
1077                                                                                                               "\t1: use MD5\n"
1078                                                                                                               "\t0: disable")
1079  ("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")
1080  ("FEN",                                             tmpFastInterSearchMode,   Int(FASTINTERSEARCH_DISABLED), "fast encoder setting")
1081  ("ECU",                                             m_bUseEarlyCU,                                    false, "Early CU setting")
1082  ("FDM",                                             m_useFastDecisionForMerge,                         true, "Fast decision for Merge RD Cost")
1083  ("CFM",                                             m_bUseCbfFastMode,                                false, "Cbf fast mode setting")
1084  ("ESD",                                             m_useEarlySkipDetection,                          false, "Early SKIP detection setting")
1085  ( "RateControl",                                    m_RCEnableRateControl,                            false, "Rate control: enable rate control" )
1086  ( "TargetBitrate",                                  m_RCTargetBitrate,                                    0, "Rate control: target bit-rate" )
1087  ( "KeepHierarchicalBit",                            m_RCKeepHierarchicalBit,                              0, "Rate control: 0: equal bit allocation; 1: fixed ratio bit allocation; 2: adaptive ratio bit allocation" )
1088  ( "LCULevelRateControl",                            m_RCLCULevelRC,                                    true, "Rate control: true: CTU level RC; false: picture level RC" )
1089  ( "RCLCUSeparateModel",                             m_RCUseLCUSeparateModel,                           true, "Rate control: use CTU level separate R-lambda model" )
1090  ( "InitialQP",                                      m_RCInitialQP,                                        0, "Rate control: initial QP" )
1091  ( "RCForceIntraQP",                                 m_RCForceIntraQP,                                 false, "Rate control: force intra QP to be equal to initial QP" )
1092
1093#if U0132_TARGET_BITS_SATURATION
1094  ( "RCCpbSaturation",                                m_RCCpbSaturationEnabled,                         false, "Rate control: enable target bits saturation to avoid CPB overflow and underflow" )
1095  ( "RCCpbSize",                                      m_RCCpbSize,                                         0u, "Rate control: CPB size" )
1096  ( "RCInitialCpbFullness",                           m_RCInitialCpbFullness,                             0.9, "Rate control: initial CPB fullness" )
1097#endif
1098
1099#if KWU_RC_VIEWRC_E0227
1100  ("ViewWiseTargetBits, -vtbr" ,  m_viewTargetBits,  std::vector<Int>(1, 32), "View-wise target bit-rate setting")
1101  ("TargetBitAssign, -ta", m_viewWiseRateCtrl, false, "View-wise rate control on/off")
1102#endif
1103#if KWU_RC_MADPRED_E0227
1104  ("DepthMADPred, -dm", m_depthMADPred, (UInt)0, "Depth based MAD prediction on/off")
1105#endif
1106#if NH_MV
1107// A lot of this stuff could should actually be derived by the encoder.
1108  // VPS VUI
1109  ("VpsVuiPresentFlag"            , m_vpsVuiPresentFlag            , false                                , "VpsVuiPresentFlag           ")
1110  ("CrossLayerPicTypeAlignedFlag" , m_crossLayerPicTypeAlignedFlag , false                                , "CrossLayerPicTypeAlignedFlag")  // Could actually be derived by the encoder
1111  ("CrossLayerIrapAlignedFlag"    , m_crossLayerIrapAlignedFlag    , false                                , "CrossLayerIrapAlignedFlag   ")  // Could actually be derived by the encoder
1112  ("AllLayersIdrAlignedFlag"      , m_allLayersIdrAlignedFlag      , false                                , "CrossLayerIrapAlignedFlag   ")  // Could actually be derived by the encoder
1113  ("BitRatePresentVpsFlag"        , m_bitRatePresentVpsFlag        , false                                , "BitRatePresentVpsFlag       ")
1114  ("PicRatePresentVpsFlag"        , m_picRatePresentVpsFlag        , false                                , "PicRatePresentVpsFlag       ")
1115  ("BitRatePresentFlag"           , m_bitRatePresentFlag           , BoolAry1d(1,0), MAX_VPS_OP_SETS_PLUS1, "BitRatePresentFlag per sub layer for the N-th layer set")
1116  ("PicRatePresentFlag"           , m_picRatePresentFlag           , BoolAry1d(1,0), MAX_VPS_OP_SETS_PLUS1, "PicRatePresentFlag per sub layer for the N-th layer set")
1117  ("AvgBitRate"                   , m_avgBitRate                   , IntAry1d (1,0), MAX_VPS_OP_SETS_PLUS1, "AvgBitRate         per sub layer for the N-th layer set")
1118  ("MaxBitRate"                   , m_maxBitRate                   , IntAry1d (1,0), MAX_VPS_OP_SETS_PLUS1, "MaxBitRate         per sub layer for the N-th layer set")
1119  ("ConstantPicRateIdc"           , m_constantPicRateIdc           , IntAry1d (1,0), MAX_VPS_OP_SETS_PLUS1, "ConstantPicRateIdc per sub layer for the N-th layer set")
1120  ("AvgPicRate"                   , m_avgPicRate                   , IntAry1d (1,0), MAX_VPS_OP_SETS_PLUS1, "AvgPicRate         per sub layer for the N-th layer set")
1121  ("TilesNotInUseFlag"            , m_tilesNotInUseFlag            , true                                 , "TilesNotInUseFlag            ")
1122  ("TilesInUseFlag"               , m_tilesInUseFlag               , BoolAry1d(1,false)                   , "TilesInUseFlag               ")
1123  ("LoopFilterNotAcrossTilesFlag" , m_loopFilterNotAcrossTilesFlag , BoolAry1d(1,false)                   , "LoopFilterNotAcrossTilesFlag ")
1124  ("WppNotInUseFlag"              , m_wppNotInUseFlag              , true                                 , "WppNotInUseFlag              ")
1125  ("WppInUseFlag"                 , m_wppInUseFlag                 , BoolAry1d(1,0)                       , "WppInUseFlag                 ")
1126  ("TileBoundariesAlignedFlag"    , m_tileBoundariesAlignedFlag    , BoolAry1d(1,0)  ,MAX_NUM_LAYERS      , "TileBoundariesAlignedFlag    per direct reference for the N-th layer")
1127  ("IlpRestrictedRefLayersFlag"   , m_ilpRestrictedRefLayersFlag   , false                                , "IlpRestrictedRefLayersFlag")
1128  ("MinSpatialSegmentOffsetPlus1" , m_minSpatialSegmentOffsetPlus1 , IntAry1d (1,0), MAX_NUM_LAYERS       , "MinSpatialSegmentOffsetPlus1 per direct reference for the N-th layer")
1129  ("CtuBasedOffsetEnabledFlag"    , m_ctuBasedOffsetEnabledFlag    , BoolAry1d(1,0)  ,MAX_NUM_LAYERS      , "CtuBasedOffsetEnabledFlag    per direct reference for the N-th layer")
1130  ("MinHorizontalCtuOffsetPlus1"  , m_minHorizontalCtuOffsetPlus1  , IntAry1d (1,0), MAX_NUM_LAYERS       , "MinHorizontalCtuOffsetPlus1  per direct reference for the N-th layer")
1131  ("SingleLayerForNonIrapFlag"    , m_singleLayerForNonIrapFlag    , false                                , "SingleLayerForNonIrapFlag")
1132  ("HigherLayerIrapSkipFlag"      , m_higherLayerIrapSkipFlag      , false                                , "HigherLayerIrapSkipFlag  ")
1133#endif
1134
1135  ("TransquantBypassEnableFlag",                      m_TransquantBypassEnableFlag,                     false, "transquant_bypass_enable_flag indicator in PPS")
1136  ("CUTransquantBypassFlagForce",                     m_CUTransquantBypassFlagForce,                    false, "Force transquant bypass mode, when transquant_bypass_enable_flag is enabled")
1137  ("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).")
1138  ("RecalculateQPAccordingToLambda",                  m_recalculateQPAccordingToLambda,                 false, "Recalculate QP values according to lambda values. Do not suggest to be enabled in all intra case")
1139  ("StrongIntraSmoothing,-sis",                       m_useStrongIntraSmoothing,                         true, "Enable strong intra smoothing for 32x32 blocks")
1140  ("SEIActiveParameterSets",                          m_activeParameterSetsSEIEnabled,                      0, "Enable generation of active parameter sets SEI messages")
1141  ("VuiParametersPresent,-vui",                       m_vuiParametersPresentFlag,                       false, "Enable generation of vui_parameters()")
1142  ("AspectRatioInfoPresent",                          m_aspectRatioInfoPresentFlag,                     false, "Signals whether aspect_ratio_idc is present")
1143  ("AspectRatioIdc",                                  m_aspectRatioIdc,                                     0, "aspect_ratio_idc")
1144  ("SarWidth",                                        m_sarWidth,                                           0, "horizontal size of the sample aspect ratio")
1145  ("SarHeight",                                       m_sarHeight,                                          0, "vertical size of the sample aspect ratio")
1146  ("OverscanInfoPresent",                             m_overscanInfoPresentFlag,                        false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
1147  ("OverscanAppropriate",                             m_overscanAppropriateFlag,                        false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
1148  ("VideoSignalTypePresent",                          m_videoSignalTypePresentFlag,                     false, "Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present")
1149  ("VideoFormat",                                     m_videoFormat,                                        5, "Indicates representation of pictures")
1150  ("VideoFullRange",                                  m_videoFullRangeFlag,                             false, "Indicates the black level and range of luma and chroma signals")
1151  ("ColourDescriptionPresent",                        m_colourDescriptionPresentFlag,                   false, "Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present")
1152  ("ColourPrimaries",                                 m_colourPrimaries,                                    2, "Indicates chromaticity coordinates of the source primaries")
1153  ("TransferCharacteristics",                         m_transferCharacteristics,                            2, "Indicates the opto-electronic transfer characteristics of the source")
1154  ("MatrixCoefficients",                              m_matrixCoefficients,                                 2, "Describes the matrix coefficients used in deriving luma and chroma from RGB primaries")
1155  ("ChromaLocInfoPresent",                            m_chromaLocInfoPresentFlag,                       false, "Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present")
1156  ("ChromaSampleLocTypeTopField",                     m_chromaSampleLocTypeTopField,                        0, "Specifies the location of chroma samples for top field")
1157  ("ChromaSampleLocTypeBottomField",                  m_chromaSampleLocTypeBottomField,                     0, "Specifies the location of chroma samples for bottom field")
1158  ("NeutralChromaIndication",                         m_neutralChromaIndicationFlag,                    false, "Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1)")
1159  ("DefaultDisplayWindowFlag",                        m_defaultDisplayWindowFlag,                       false, "Indicates the presence of the Default Window parameters")
1160  ("DefDispWinLeftOffset",                            m_defDispWinLeftOffset,                               0, "Specifies the left offset of the default display window from the conformance window")
1161  ("DefDispWinRightOffset",                           m_defDispWinRightOffset,                              0, "Specifies the right offset of the default display window from the conformance window")
1162  ("DefDispWinTopOffset",                             m_defDispWinTopOffset,                                0, "Specifies the top offset of the default display window from the conformance window")
1163  ("DefDispWinBottomOffset",                          m_defDispWinBottomOffset,                             0, "Specifies the bottom offset of the default display window from the conformance window")
1164  ("FrameFieldInfoPresentFlag",                       m_frameFieldInfoPresentFlag,                      false, "Indicates that pic_struct and field coding related values are present in picture timing SEI messages")
1165  ("PocProportionalToTimingFlag",                     m_pocProportionalToTimingFlag,                    false, "Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS")
1166  ("NumTicksPocDiffOneMinus1",                        m_numTicksPocDiffOneMinus1,                           0, "Number of ticks minus 1 that for a POC difference of one")
1167  ("BitstreamRestriction",                            m_bitstreamRestrictionFlag,                       false, "Signals whether bitstream restriction parameters are present")
1168  ("TilesFixedStructure",                             m_tilesFixedStructureFlag,                        false, "Indicates that each active picture parameter set has the same values of the syntax elements related to tiles")
1169  ("MotionVectorsOverPicBoundaries",                  m_motionVectorsOverPicBoundariesFlag,             false, "Indicates that no samples outside the picture boundaries are used for inter prediction")
1170  ("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")
1171  ("MaxBitsPerMinCuDenom",                            m_maxBitsPerMinCuDenom,                               1, "Indicates an upper bound for the number of bits of coding_unit() data")
1172  ("Log2MaxMvLengthHorizontal",                       m_log2MaxMvLengthHorizontal,                         15, "Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units")
1173  ("Log2MaxMvLengthVertical",                         m_log2MaxMvLengthVertical,                           15, "Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units")
1174  ("SEIColourRemappingInfoFileRoot,-cri",             m_colourRemapSEIFileRoot,                    string(""), "Colour Remapping Information SEI parameters root file name (wo num ext)")
1175  ("SEIRecoveryPoint",                                m_recoveryPointSEIEnabled,                        false, "Control generation of recovery point SEI messages")
1176  ("SEIBufferingPeriod",                              m_bufferingPeriodSEIEnabled,                      false, "Control generation of buffering period SEI messages")
1177  ("SEIPictureTiming",                                m_pictureTimingSEIEnabled,                        false, "Control generation of picture timing SEI messages")
1178  ("SEIToneMappingInfo",                              m_toneMappingInfoSEIEnabled,                      false, "Control generation of Tone Mapping SEI messages")
1179  ("SEIToneMapId",                                    m_toneMapId,                                          0, "Specifies Id of Tone Mapping SEI message for a given session")
1180  ("SEIToneMapCancelFlag",                            m_toneMapCancelFlag,                              false, "Indicates that Tone Mapping SEI message cancels the persistence or follows")
1181  ("SEIToneMapPersistenceFlag",                       m_toneMapPersistenceFlag,                          true, "Specifies the persistence of the Tone Mapping SEI message")
1182  ("SEIToneMapCodedDataBitDepth",                     m_toneMapCodedDataBitDepth,                           8, "Specifies Coded Data BitDepth of Tone Mapping SEI messages")
1183  ("SEIToneMapTargetBitDepth",                        m_toneMapTargetBitDepth,                              8, "Specifies Output BitDepth of Tone mapping function")
1184  ("SEIToneMapModelId",                               m_toneMapModelId,                                     0, "Specifies Model utilized for mapping coded data into target_bit_depth range\n"
1185                                                                                                               "\t0:  linear mapping with clipping\n"
1186                                                                                                               "\t1:  sigmoidal mapping\n"
1187                                                                                                               "\t2:  user-defined table mapping\n"
1188                                                                                                               "\t3:  piece-wise linear mapping\n"
1189                                                                                                               "\t4:  luminance dynamic range information ")
1190  ("SEIToneMapMinValue",                              m_toneMapMinValue,                                    0, "Specifies the minimum value in mode 0")
1191  ("SEIToneMapMaxValue",                              m_toneMapMaxValue,                                 1023, "Specifies the maximum value in mode 0")
1192  ("SEIToneMapSigmoidMidpoint",                       m_sigmoidMidpoint,                                  512, "Specifies the centre point in mode 1")
1193  ("SEIToneMapSigmoidWidth",                          m_sigmoidWidth,                                     960, "Specifies the distance between 5% and 95% values of the target_bit_depth in mode 1")
1194  ("SEIToneMapStartOfCodedInterval",                  cfg_startOfCodedInterval,      cfg_startOfCodedInterval, "Array of user-defined mapping table")
1195  ("SEIToneMapNumPivots",                             m_numPivots,                                          0, "Specifies the number of pivot points in mode 3")
1196  ("SEIToneMapCodedPivotValue",                       cfg_codedPivotValue,                cfg_codedPivotValue, "Array of pivot point")
1197  ("SEIToneMapTargetPivotValue",                      cfg_targetPivotValue,              cfg_targetPivotValue, "Array of pivot point")
1198  ("SEIToneMapCameraIsoSpeedIdc",                     m_cameraIsoSpeedIdc,                                  0, "Indicates the camera ISO speed for daylight illumination")
1199  ("SEIToneMapCameraIsoSpeedValue",                   m_cameraIsoSpeedValue,                              400, "Specifies the camera ISO speed for daylight illumination of Extended_ISO")
1200  ("SEIToneMapExposureIndexIdc",                      m_exposureIndexIdc,                                   0, "Indicates the exposure index setting of the camera")
1201  ("SEIToneMapExposureIndexValue",                    m_exposureIndexValue,                               400, "Specifies the exposure index setting of the camera of Extended_ISO")
1202  ("SEIToneMapExposureCompensationValueSignFlag",     m_exposureCompensationValueSignFlag,               false, "Specifies the sign of ExposureCompensationValue")
1203  ("SEIToneMapExposureCompensationValueNumerator",    m_exposureCompensationValueNumerator,                 0, "Specifies the numerator of ExposureCompensationValue")
1204  ("SEIToneMapExposureCompensationValueDenomIdc",     m_exposureCompensationValueDenomIdc,                  2, "Specifies the denominator of ExposureCompensationValue")
1205  ("SEIToneMapRefScreenLuminanceWhite",               m_refScreenLuminanceWhite,                          350, "Specifies reference screen brightness setting in units of candela per square metre")
1206  ("SEIToneMapExtendedRangeWhiteLevel",               m_extendedRangeWhiteLevel,                          800, "Indicates the luminance dynamic range")
1207  ("SEIToneMapNominalBlackLevelLumaCodeValue",        m_nominalBlackLevelLumaCodeValue,                    16, "Specifies luma sample value of the nominal black level assigned decoded pictures")
1208  ("SEIToneMapNominalWhiteLevelLumaCodeValue",        m_nominalWhiteLevelLumaCodeValue,                   235, "Specifies luma sample value of the nominal white level assigned decoded pictures")
1209  ("SEIToneMapExtendedWhiteLevelLumaCodeValue",       m_extendedWhiteLevelLumaCodeValue,                  300, "Specifies luma sample value of the extended dynamic range assigned decoded pictures")
1210  ("SEIChromaResamplingFilterHint",                   m_chromaResamplingFilterSEIenabled,               false, "Control generation of the chroma sampling filter hint SEI message")
1211  ("SEIChromaResamplingHorizontalFilterType",         m_chromaResamplingHorFilterIdc,                       2, "Defines the Index of the chroma sampling horizontal filter\n"
1212                                                                                                               "\t0: unspecified  - Chroma filter is unknown or is determined by the application"
1213                                                                                                               "\t1: User-defined - Filter coefficients are specified in the chroma sampling filter hint SEI message"
1214                                                                                                               "\t2: Standards-defined - ITU-T Rec. T.800 | ISO/IEC15444-1, 5/3 filter")
1215  ("SEIChromaResamplingVerticalFilterType",           m_chromaResamplingVerFilterIdc,                         2, "Defines the Index of the chroma sampling vertical filter\n"
1216                                                                                                               "\t0: unspecified  - Chroma filter is unknown or is determined by the application"
1217                                                                                                               "\t1: User-defined - Filter coefficients are specified in the chroma sampling filter hint SEI message"
1218                                                                                                               "\t2: Standards-defined - ITU-T Rec. T.800 | ISO/IEC15444-1, 5/3 filter")
1219  ("SEIFramePacking",                                 m_framePackingSEIEnabled,                         false, "Control generation of frame packing SEI messages")
1220  ("SEIFramePackingType",                             m_framePackingSEIType,                                0, "Define frame packing arrangement\n"
1221                                                                                                               "\t3: side by side - frames are displayed horizontally\n"
1222                                                                                                               "\t4: top bottom - frames are displayed vertically\n"
1223                                                                                                               "\t5: frame alternation - one frame is alternated with the other")
1224  ("SEIFramePackingId",                               m_framePackingSEIId,                                  0, "Id of frame packing SEI message for a given session")
1225  ("SEIFramePackingQuincunx",                         m_framePackingSEIQuincunx,                            0, "Indicate the presence of a Quincunx type video frame")
1226  ("SEIFramePackingInterpretation",                   m_framePackingSEIInterpretation,                      0, "Indicate the interpretation of the frame pair\n"
1227                                                                                                               "\t0: unspecified\n"
1228                                                                                                               "\t1: stereo pair, frame0 represents left view\n"
1229                                                                                                               "\t2: stereo pair, frame0 represents right view")
1230  ("SEISegmentedRectFramePacking",                    m_segmentedRectFramePackingSEIEnabled,            false, "Controls generation of segmented rectangular frame packing SEI messages")
1231  ("SEISegmentedRectFramePackingCancel",              m_segmentedRectFramePackingSEICancel,             false, "If equal to 1, cancels the persistence of any previous SRFPA SEI message")
1232  ("SEISegmentedRectFramePackingType",                m_segmentedRectFramePackingSEIType,                   0, "Specifies the arrangement of the frames in the reconstructed picture")
1233  ("SEISegmentedRectFramePackingPersistence",         m_segmentedRectFramePackingSEIPersistence,        false, "If equal to 0, the SEI applies to the current frame only")
1234  ("SEIDisplayOrientation",                           m_displayOrientationSEIAngle,                         0, "Control generation of display orientation SEI messages\n"
1235                                                                                                               "\tN: 0 < N < (2^16 - 1) enable display orientation SEI message with anticlockwise_rotation = N and display_orientation_repetition_period = 1\n"
1236                                                                                                               "\t0: disable")
1237  ("SEITemporalLevel0Index",                          m_temporalLevel0IndexSEIEnabled,                  false, "Control generation of temporal level 0 index SEI messages")
1238  ("SEIGradualDecodingRefreshInfo",                   m_gradualDecodingRefreshInfoEnabled,              false, "Control generation of gradual decoding refresh information SEI message")
1239  ("SEINoDisplay",                                    m_noDisplaySEITLayer,                                 0, "Control generation of no display SEI message\n"
1240                                                                                                               "\tN: 0 < N enable no display SEI message for temporal layer N or higher\n"
1241                                                                                                               "\t0: disable")
1242  ("SEIDecodingUnitInfo",                             m_decodingUnitInfoSEIEnabled,                     false, "Control generation of decoding unit information SEI message.")
1243  ("SEISOPDescription",                               m_SOPDescriptionSEIEnabled,                       false, "Control generation of SOP description SEI messages")
1244  ("SEIScalableNesting",                              m_scalableNestingSEIEnabled,                      false, "Control generation of scalable nesting SEI messages")
1245  ("SEITempMotionConstrainedTileSets",                m_tmctsSEIEnabled,                                false, "Control generation of temporal motion constrained tile sets SEI message")
1246  ("SEITimeCodeEnabled",                              m_timeCodeSEIEnabled,                             false, "Control generation of time code information SEI message")
1247  ("SEITimeCodeNumClockTs",                           m_timeCodeSEINumTs,                                   0, "Number of clock time sets [0..3]")
1248  ("SEITimeCodeTimeStampFlag",                        cfg_timeCodeSeiTimeStampFlag,          cfg_timeCodeSeiTimeStampFlag,         "Time stamp flag associated to each time set")
1249  ("SEITimeCodeFieldBasedFlag",                       cfg_timeCodeSeiNumUnitFieldBasedFlag,  cfg_timeCodeSeiNumUnitFieldBasedFlag, "Field based flag associated to each time set")
1250  ("SEITimeCodeCountingType",                         cfg_timeCodeSeiCountingType,           cfg_timeCodeSeiCountingType,          "Counting type associated to each time set")
1251  ("SEITimeCodeFullTsFlag",                           cfg_timeCodeSeiFullTimeStampFlag,      cfg_timeCodeSeiFullTimeStampFlag,     "Full time stamp flag associated to each time set")
1252  ("SEITimeCodeDiscontinuityFlag",                    cfg_timeCodeSeiDiscontinuityFlag,      cfg_timeCodeSeiDiscontinuityFlag,     "Discontinuity flag associated to each time set")
1253  ("SEITimeCodeCntDroppedFlag",                       cfg_timeCodeSeiCntDroppedFlag,         cfg_timeCodeSeiCntDroppedFlag,        "Counter dropped flag associated to each time set")
1254  ("SEITimeCodeNumFrames",                            cfg_timeCodeSeiNumberOfFrames,         cfg_timeCodeSeiNumberOfFrames,        "Number of frames associated to each time set")
1255  ("SEITimeCodeSecondsValue",                         cfg_timeCodeSeiSecondsValue,           cfg_timeCodeSeiSecondsValue,          "Seconds value for each time set")
1256  ("SEITimeCodeMinutesValue",                         cfg_timeCodeSeiMinutesValue,           cfg_timeCodeSeiMinutesValue,          "Minutes value for each time set")
1257  ("SEITimeCodeHoursValue",                           cfg_timeCodeSeiHoursValue,             cfg_timeCodeSeiHoursValue,            "Hours value for each time set")
1258  ("SEITimeCodeSecondsFlag",                          cfg_timeCodeSeiSecondsFlag,            cfg_timeCodeSeiSecondsFlag,           "Flag to signal seconds value presence in each time set")
1259  ("SEITimeCodeMinutesFlag",                          cfg_timeCodeSeiMinutesFlag,            cfg_timeCodeSeiMinutesFlag,           "Flag to signal minutes value presence in each time set")
1260  ("SEITimeCodeHoursFlag",                            cfg_timeCodeSeiHoursFlag,              cfg_timeCodeSeiHoursFlag,             "Flag to signal hours value presence in each time set")
1261  ("SEITimeCodeOffsetLength",                         cfg_timeCodeSeiTimeOffsetLength,       cfg_timeCodeSeiTimeOffsetLength,      "Time offset length associated to each time set")
1262  ("SEITimeCodeTimeOffset",                           cfg_timeCodeSeiTimeOffsetValue,        cfg_timeCodeSeiTimeOffsetValue,       "Time offset associated to each time set")
1263  ("SEIKneeFunctionInfo",                             m_kneeSEIEnabled,                                 false, "Control generation of Knee function SEI messages")
1264  ("SEIKneeFunctionId",                               m_kneeSEIId,                                          0, "Specifies Id of Knee function SEI message for a given session")
1265  ("SEIKneeFunctionCancelFlag",                       m_kneeSEICancelFlag,                              false, "Indicates that Knee function SEI message cancels the persistence or follows")
1266  ("SEIKneeFunctionPersistenceFlag",                  m_kneeSEIPersistenceFlag,                          true, "Specifies the persistence of the Knee function SEI message")
1267  ("SEIKneeFunctionInputDrange",                      m_kneeSEIInputDrange,                              1000, "Specifies the peak luminance level for the input picture of Knee function SEI messages")
1268  ("SEIKneeFunctionInputDispLuminance",               m_kneeSEIInputDispLuminance,                        100, "Specifies the expected display brightness for the input picture of Knee function SEI messages")
1269  ("SEIKneeFunctionOutputDrange",                     m_kneeSEIOutputDrange,                             4000, "Specifies the peak luminance level for the output picture of Knee function SEI messages")
1270  ("SEIKneeFunctionOutputDispLuminance",              m_kneeSEIOutputDispLuminance,                       800, "Specifies the expected display brightness for the output picture of Knee function SEI messages")
1271  ("SEIKneeFunctionNumKneePointsMinus1",              m_kneeSEINumKneePointsMinus1,                         2, "Specifies the number of knee points - 1")
1272  ("SEIKneeFunctionInputKneePointValue",              cfg_kneeSEIInputKneePointValue,   cfg_kneeSEIInputKneePointValue, "Array of input knee point")
1273  ("SEIKneeFunctionOutputKneePointValue",             cfg_kneeSEIOutputKneePointValue, cfg_kneeSEIOutputKneePointValue, "Array of output knee point")
1274  ("SEIMasteringDisplayColourVolume",                 m_masteringDisplay.colourVolumeSEIEnabled,         false, "Control generation of mastering display colour volume SEI messages")
1275  ("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)")
1276  ("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)")
1277  ("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)")
1278  ("SEIMasteringDisplayWhitePoint",                   cfg_DisplayWhitePointCode,     cfg_DisplayWhitePointCode, "Mastering display white point CIE xy coordinates in normalised increments of 1/50000 (e.g. 0.333 = 16667)")
1279#if NH_MV
1280  ("SeiCfgFileName_%d",                               m_seiCfgFileNames,             (TChar *) 0 ,MAX_NUM_SEIS , "SEI cfg file name %d")
1281  ("OutputVpsInfo",                                   m_outputVpsInfo,                false                     ,"Output information about the layer dependencies and layer sets")
1282
1283/* Camera parameters */   
1284  ("BaseViewCameraNumbers",                           m_pchBaseViewCameraNumbers,   (TChar *) 0                 , "Numbers of base views")
1285#endif
1286#if NH_3D
1287  ("Depth420OutputFlag",                              m_depth420OutputFlag,           true                     , "Output depth layers in 4:2:0 ") 
1288#endif
1289#if NH_3D_VSO  || NH_3D
1290  ("CameraParameterFile,cpf",                         m_pchCameraParameterFile,    (TChar *) 0                 , "Camera Parameter File Name")
1291  ("CodedCamParsPrecision",                           m_iCodedCamParPrecision,      STD_CAM_PARAMETERS_PRECISION, "precision for coding of camera parameters (in units of 2^(-x) luma samples)" )
1292#endif
1293#if NH_3D_VSO 
1294  /* View Synthesis Optimization */
1295  ("VSOConfig",                                       m_pchVSOConfig            , (TChar *) 0                   ,"VSO configuration")
1296  ("VSO",                                             m_bUseVSO                 , false                         ,"Use VSO" )   
1297  ("VSOMode",                                         m_uiVSOMode               , (UInt)   4                    ,"VSO Mode")
1298  ("LambdaScaleVSO",                                  m_dLambdaScaleVSO         , (Double) 1                    ,"Lambda Scaling for VSO")
1299  ("VSOLSTable",                                      m_bVSOLSTable             , true                          ,"Depth QP dependent video/depth rate allocation by Lagrange multiplier" )     
1300  ("ForceLambdaScaleVSO",                             m_bForceLambdaScaleVSO    , false                         ,"Force using Lambda Scale VSO also in non-VSO-Mode")
1301  ("AllowNegDist",                                    m_bAllowNegDist           , true                          ,"Allow negative Distortion in VSO")
1302                                                                                                             
1303  ("UseEstimatedVSD",                                 m_bUseEstimatedVSD        , true                          ,"Model based VSD estimation instead of rendering based for some encoder decisions" )     
1304  ("VSOEarlySkip",                                    m_bVSOEarlySkip           , true                          ,"Early skip of VSO computation if synthesis error assumed to be zero" )     
1305                                                                                                               
1306  ("WVSO",                                            m_bUseWVSO                , true                          ,"Use depth fidelity term for VSO" )
1307  ("VSOWeight",                                       m_iVSOWeight              , 10                            ,"Synthesized View Distortion Change weight" )
1308  ("VSDWeight",                                       m_iVSDWeight              , 1                             ,"View Synthesis Distortion estimate weight" )
1309  ("DWeight",                                         m_iDWeight                , 1                             ,"Depth Distortion weight" )
1310#endif //HHI_VSO
1311/* 3D- HEVC Tools */                                                           
1312#if NH_3D_QTL
1313  ("QTL"                   ,                          m_bUseQTL                 , true                          , "Use depth quad tree limitation (encoder only)" )
1314#endif
1315#if NH_3D
1316
1317  ("IvMvPredFlag"          ,                          m_ivMvPredFlag            , BoolAry1d(2,true)             , "Inter-view motion prediction"              )
1318  ("IvMvScalingFlag"       ,                          m_ivMvScalingFlag         , BoolAry1d(2,true)             , "Inter-view motion vector scaling"          )
1319  ("Log2SubPbSizeMinus3"   ,                          m_log2SubPbSizeMinus3     , 0                             , "Log2 minus 3 of sub Pb size"               )
1320  ("IvResPredFlag"         ,                          m_ivResPredFlag           , true                          , "Inter-view residual prediction"            )
1321  ("DepthRefinementFlag"   ,                          m_depthRefinementFlag     , true                          , "Depth to refine disparity"                 )
1322  ("ViewSynthesisPredFlag" ,                          m_viewSynthesisPredFlag   , true                          , "View synthesis prediction"                 )
1323  ("DepthBasedBlkPartFlag" ,                          m_depthBasedBlkPartFlag   , true                          , "Depth base block partitioning"             )
1324  ("MpiFlag"               ,                          m_mpiFlag                 , true                          , "Motion inheritance from texture to depth"  )
1325  ("Log2MpiSubPbSizeMinus3",                          m_log2MpiSubPbSizeMinus3  , 0                             , "Log2 minus 3 of sub Pb size for MPI"       )
1326  ("IntraContourFlag"      ,                          m_intraContourFlag        , true                          , "Intra contour mode"                        )
1327  ("IntraWedgeFlag"        ,                          m_intraWedgeFlag          , true                          , "Intra wedge mode and segmental depth DCs"  )
1328  ("IntraSdcFlag"          ,                          m_intraSdcFlag            , true                          , "Intra depth DCs"                           )
1329  ("QtPredFlag"            ,                          m_qtPredFlag              , true                          , "Quad tree prediction from texture to depth")
1330  ("InterSdcFlag"          ,                          m_interSdcFlag            , true                          , "Inter depth DCs"                           )
1331  ("DepthIntraSkip"        ,                          m_depthIntraSkipFlag      , true                          , "Depth intra skip mode"                     )
1332  ("DLT"                   ,                          m_useDLT                  , true                          , "Depth lookup table"                        )
1333  ("IlluCompEnable"        ,                          m_abUseIC                 , true                          , "Enable illumination compensation"          )
1334  ("IlluCompLowLatencyEnc" ,                          m_bUseLowLatencyICEnc     , false                         , "Enable low-latency illumination compensation encoding")
1335#endif //NH_3D
1336   
1337  ;
1338
1339#if NH_MV
1340  // parse coding structure
1341  for( Int k = 0; k < MAX_NUM_LAYERS; k++ )
1342  {
1343    m_GOPListMvc.push_back( new GOPEntry[MAX_GOP + 1] );
1344    if( k == 0 )
1345    {
1346      m_GOPListMvc[0][0].m_sliceType = 'I'; 
1347      for( Int i = 1; i < MAX_GOP + 1; i++ ) 
1348      {
1349        std::ostringstream cOSS;
1350        cOSS<<"Frame"<<i;
1351        opts.addOptions()( cOSS.str(), m_GOPListMvc[k][i-1], GOPEntry() );
1352        if ( i != 1 )
1353        {
1354          opts.opt_list.back()->opt->opt_duplicate = true; 
1355        }       
1356      }
1357    }
1358    else
1359    {
1360      std::ostringstream cOSS1;
1361      cOSS1<<"FrameI"<<"_l"<<k;
1362
1363      opts.addOptions()(cOSS1.str(), m_GOPListMvc[k][MAX_GOP], GOPEntry());
1364      if ( k > 1 )
1365      {
1366        opts.opt_list.back()->opt->opt_duplicate = true; 
1367      }       
1368
1369
1370  for(Int i=1; i<MAX_GOP+1; i++)
1371  {
1372        std::ostringstream cOSS2;
1373        cOSS2<<"Frame"<<i<<"_l"<<k;
1374        opts.addOptions()(cOSS2.str(), m_GOPListMvc[k][i-1], GOPEntry());
1375        if ( i != 1 || k > 0 )
1376        {
1377          opts.opt_list.back()->opt->opt_duplicate = true; 
1378        }       
1379      }
1380    }
1381  }
1382#else
1383  for(Int i=1; i<MAX_GOP+1; i++)
1384  {
1385    std::ostringstream cOSS;
1386    cOSS<<"Frame"<<i;
1387    opts.addOptions()(cOSS.str(), m_GOPList[i-1], GOPEntry());
1388  }
1389#endif
1390  po::setDefaults(opts);
1391  po::ErrorReporter err;
1392  const list<const TChar*>& argv_unhandled = po::scanArgv(opts, argc, (const TChar**) argv, err);
1393
1394  for (list<const TChar*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
1395  {
1396    fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
1397  }
1398
1399  if (argc == 1 || do_help)
1400  {
1401    /* argc == 1: no options have been specified */
1402    po::doHelp(cout, opts);
1403    return false;
1404  }
1405
1406  if (err.is_errored)
1407  {
1408    if (!warnUnknowParameter)
1409    {
1410      /* error report has already been printed on stderr */
1411      return false;
1412    }
1413  }
1414
1415  /*
1416   * Set any derived parameters
1417   */
1418  m_adIntraLambdaModifier = cfg_adIntraLambdaModifier.values;
1419  if(m_isField)
1420  {
1421    //Frame height
1422    m_iSourceHeightOrg = m_iSourceHeight;
1423    //Field height
1424    m_iSourceHeight = m_iSourceHeight >> 1;
1425    //number of fields to encode
1426    m_framesToBeEncoded *= 2;
1427  }
1428
1429  if( !m_tileUniformSpacingFlag && m_numTileColumnsMinus1 > 0 )
1430  {
1431    if (cfg_ColumnWidth.values.size() > m_numTileColumnsMinus1)
1432    {
1433      printf( "The number of columns whose width are defined is larger than the allowed number of columns.\n" );
1434      exit( EXIT_FAILURE );
1435    }
1436    else if (cfg_ColumnWidth.values.size() < m_numTileColumnsMinus1)
1437    {
1438      printf( "The width of some columns is not defined.\n" );
1439      exit( EXIT_FAILURE );
1440    }
1441    else
1442    {
1443      m_tileColumnWidth.resize(m_numTileColumnsMinus1);
1444      for(UInt i=0; i<cfg_ColumnWidth.values.size(); i++)
1445      {
1446        m_tileColumnWidth[i]=cfg_ColumnWidth.values[i];
1447      }
1448    }
1449  }
1450  else
1451  {
1452    m_tileColumnWidth.clear();
1453  }
1454
1455  if( !m_tileUniformSpacingFlag && m_numTileRowsMinus1 > 0 )
1456  {
1457    if (cfg_RowHeight.values.size() > m_numTileRowsMinus1)
1458    {
1459      printf( "The number of rows whose height are defined is larger than the allowed number of rows.\n" );
1460      exit( EXIT_FAILURE );
1461    }
1462    else if (cfg_RowHeight.values.size() < m_numTileRowsMinus1)
1463    {
1464      printf( "The height of some rows is not defined.\n" );
1465      exit( EXIT_FAILURE );
1466    }
1467    else
1468    {
1469      m_tileRowHeight.resize(m_numTileRowsMinus1);
1470      for(UInt i=0; i<cfg_RowHeight.values.size(); i++)
1471      {
1472        m_tileRowHeight[i]=cfg_RowHeight.values[i];
1473      }
1474    }
1475  }
1476  else
1477  {
1478    m_tileRowHeight.clear();
1479  }
1480
1481  /* rules for input, output and internal bitdepths as per help text */
1482  if (m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ] == 0)
1483  {
1484    m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ] = m_inputBitDepth      [CHANNEL_TYPE_LUMA  ];
1485  }
1486  if (m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] == 0)
1487  {
1488    m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] = m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ];
1489  }
1490  if (m_internalBitDepth   [CHANNEL_TYPE_LUMA  ] == 0)
1491  {
1492    m_internalBitDepth   [CHANNEL_TYPE_LUMA  ] = m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ];
1493  }
1494  if (m_internalBitDepth   [CHANNEL_TYPE_CHROMA] == 0)
1495  {
1496    m_internalBitDepth   [CHANNEL_TYPE_CHROMA] = m_internalBitDepth   [CHANNEL_TYPE_LUMA  ];
1497  }
1498  if (m_inputBitDepth      [CHANNEL_TYPE_CHROMA] == 0)
1499  {
1500    m_inputBitDepth      [CHANNEL_TYPE_CHROMA] = m_inputBitDepth      [CHANNEL_TYPE_LUMA  ];
1501  }
1502  if (m_outputBitDepth     [CHANNEL_TYPE_LUMA  ] == 0)
1503  {
1504    m_outputBitDepth     [CHANNEL_TYPE_LUMA  ] = m_internalBitDepth   [CHANNEL_TYPE_LUMA  ];
1505  }
1506  if (m_outputBitDepth     [CHANNEL_TYPE_CHROMA] == 0)
1507  {
1508    m_outputBitDepth     [CHANNEL_TYPE_CHROMA] = m_internalBitDepth   [CHANNEL_TYPE_CHROMA];
1509  }
1510
1511  m_InputChromaFormatIDC = numberToChromaFormat(tmpInputChromaFormat);
1512  m_chromaFormatIDC      = ((tmpChromaFormat == 0) ? (m_InputChromaFormatIDC) : (numberToChromaFormat(tmpChromaFormat)));
1513
1514
1515  assert(tmpWeightedPredictionMethod>=0 && tmpWeightedPredictionMethod<=WP_PER_PICTURE_WITH_HISTOGRAM_AND_PER_COMPONENT_AND_CLIPPING_AND_EXTENSION);
1516  if (!(tmpWeightedPredictionMethod>=0 && tmpWeightedPredictionMethod<=WP_PER_PICTURE_WITH_HISTOGRAM_AND_PER_COMPONENT_AND_CLIPPING_AND_EXTENSION))
1517  {
1518    exit(EXIT_FAILURE);
1519  }
1520  m_weightedPredictionMethod = WeightedPredictionMethod(tmpWeightedPredictionMethod);
1521
1522  assert(tmpFastInterSearchMode>=0 && tmpFastInterSearchMode<=FASTINTERSEARCH_MODE3);
1523  if (tmpFastInterSearchMode<0 || tmpFastInterSearchMode>FASTINTERSEARCH_MODE3)
1524  {
1525    exit(EXIT_FAILURE);
1526  }
1527  m_fastInterSearchMode = FastInterSearchMode(tmpFastInterSearchMode);
1528
1529  assert(tmpMotionEstimationSearchMethod>=0 && tmpMotionEstimationSearchMethod<MESEARCH_NUMBER_OF_METHODS);
1530  if (tmpMotionEstimationSearchMethod<0 || tmpMotionEstimationSearchMethod>=MESEARCH_NUMBER_OF_METHODS)
1531  {
1532    exit(EXIT_FAILURE);
1533  }
1534  m_motionEstimationSearchMethod=MESearchMethod(tmpMotionEstimationSearchMethod);
1535
1536#if NH_MV
1537  // parse PTL
1538  Bool anyEmpty = false; 
1539  if( cfg_profiles.empty() )
1540  {
1541#if NH_3D
1542    cfg_profiles = string("main main 3d-main");
1543#else
1544    cfg_profiles = string("main main multiview-main");   
1545#endif
1546    fprintf(stderr, "\nWarning: No profiles given, using defaults: %s", cfg_profiles.c_str() );
1547    anyEmpty = true; 
1548  }
1549
1550  if( cfg_levels.empty() )
1551  {
1552    cfg_levels = string("5.1 5.1 5.1");
1553    fprintf(stderr, "\nWarning: No levels given, using defaults: %s", cfg_levels.c_str() );
1554    anyEmpty = true; 
1555  }
1556
1557  if( cfg_tiers.empty() )
1558  {
1559    cfg_tiers = string("main main main");
1560    fprintf(stderr, "\nWarning: No tiers given, using defaults: %s", cfg_tiers.c_str());
1561    anyEmpty = true; 
1562  }
1563
1564  if( m_inblFlag.empty() )
1565  {
1566    fprintf(stderr, "\nWarning: No inblFlags given, using defaults:");
1567    for( Int i = 0; i < 3; i++)
1568    {
1569      m_inblFlag.push_back( false );
1570      fprintf(stderr," %d", (Int) m_inblFlag[i]);
1571    }
1572    anyEmpty = true; 
1573  }   
1574
1575  if ( anyEmpty )
1576  {
1577    fprintf( stderr, "\n" );
1578  }
1579
1580  xReadStrToEnum( cfg_profiles, extendedProfiles  ); 
1581  xReadStrToEnum( cfg_levels,   m_level     ); 
1582  xReadStrToEnum( cfg_tiers ,   m_levelTier ); 
1583
1584
1585#if NH_MV
1586  m_profiles.resize( extendedProfiles.size()); 
1587
1588  for (Int i = 0; i < m_profiles.size(); i++)
1589  {
1590    Profile::Name& m_profile             = m_profiles      [i]; 
1591    ExtendedProfileName& extendedProfile = extendedProfiles[i]; 
1592#endif
1593#endif
1594
1595  if (extendedProfile >= 1000 && extendedProfile <= 12316)
1596    {
1597      m_profile = Profile::MAINREXT;
1598      if (m_bitDepthConstraint != 0 || tmpConstraintChromaFormat != 0)
1599      {
1600        fprintf(stderr, "Error: The bit depth and chroma format constraints are not used when an explicit RExt profile is specified\n");
1601        exit(EXIT_FAILURE);
1602      }
1603      m_bitDepthConstraint     = (extendedProfile%100);
1604    m_intraConstraintFlag          = ((extendedProfile%10000)>=2000);
1605    m_onePictureOnlyConstraintFlag = (extendedProfile >= 10000);
1606      switch ((extendedProfile/100)%10)
1607      {
1608      case 0:  tmpConstraintChromaFormat=400; break;
1609      case 1:  tmpConstraintChromaFormat=420; break;
1610      case 2:  tmpConstraintChromaFormat=422; break;
1611      default: tmpConstraintChromaFormat=444; break;
1612      }
1613    }
1614    else
1615    {
1616      m_profile = Profile::Name(extendedProfile);
1617    }
1618
1619    if (m_profile == Profile::HIGHTHROUGHPUTREXT )
1620    {
1621      if (m_bitDepthConstraint == 0)
1622      {
1623        m_bitDepthConstraint = 16;
1624      }
1625      m_chromaFormatConstraint = (tmpConstraintChromaFormat == 0) ? CHROMA_444 : numberToChromaFormat(tmpConstraintChromaFormat);
1626    }
1627    else if (m_profile == Profile::MAINREXT)
1628    {
1629      if (m_bitDepthConstraint == 0 && tmpConstraintChromaFormat == 0)
1630      {
1631        // produce a valid combination, if possible.
1632      const Bool bUsingGeneralRExtTools  = m_transformSkipRotationEnabledFlag        ||
1633                                           m_transformSkipContextEnabledFlag         ||
1634                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT] ||
1635                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT] ||
1636          !m_enableIntraReferenceSmoothing         ||
1637                                           m_persistentRiceAdaptationEnabledFlag     ||
1638                                           m_log2MaxTransformSkipBlockSize!=2;
1639      const Bool bUsingChromaQPAdjustment= m_diffCuChromaQpOffsetDepth >= 0;
1640      const Bool bUsingExtendedPrecision = m_extendedPrecisionProcessingFlag;
1641      if (m_onePictureOnlyConstraintFlag)
1642      {
1643        m_chromaFormatConstraint = CHROMA_444;
1644        if (m_intraConstraintFlag != true)
1645        {
1646          fprintf(stderr, "Error: Intra constraint flag must be true when one_picture_only_constraint_flag is true\n");
1647          exit(EXIT_FAILURE);
1648        }
1649        const Int maxBitDepth = m_chromaFormatIDC==CHROMA_400 ? m_internalBitDepth[CHANNEL_TYPE_LUMA] : std::max(m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA]);
1650        m_bitDepthConstraint = maxBitDepth>8 ? 16:8;
1651      }
1652      else
1653      {
1654        m_chromaFormatConstraint = NUM_CHROMA_FORMAT;
1655        automaticallySelectRExtProfile(bUsingGeneralRExtTools,
1656          bUsingChromaQPAdjustment,
1657          bUsingExtendedPrecision,
1658          m_intraConstraintFlag,
1659          m_bitDepthConstraint,
1660          m_chromaFormatConstraint,
1661          m_chromaFormatIDC==CHROMA_400 ? m_internalBitDepth[CHANNEL_TYPE_LUMA] : std::max(m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA]),
1662          m_chromaFormatIDC);
1663      }
1664    }
1665      else if (m_bitDepthConstraint == 0 || tmpConstraintChromaFormat == 0)
1666      {
1667        fprintf(stderr, "Error: The bit depth and chroma format constraints must either both be specified or both be configured automatically\n");
1668        exit(EXIT_FAILURE);
1669      }
1670      else
1671      {
1672        m_chromaFormatConstraint = numberToChromaFormat(tmpConstraintChromaFormat);
1673      }
1674    }
1675    else
1676    {
1677      m_chromaFormatConstraint = (tmpConstraintChromaFormat == 0) ? m_chromaFormatIDC : numberToChromaFormat(tmpConstraintChromaFormat);
1678      m_bitDepthConstraint = (m_profile == Profile::MAIN10?10:8);
1679    }
1680#if NH_MV
1681  }
1682
1683  if ( m_numberOfLayers != 0 && ( m_profiles[0] != Profile::MAIN || m_profiles[1] != Profile::MAIN )  )
1684  {
1685    fprintf(stderr, "Error: The base layer must conform to the Main profile for Multilayer coding.\n");
1686    exit(EXIT_FAILURE);
1687  }
1688#endif
1689
1690
1691  m_inputColourSpaceConvert = stringToInputColourSpaceConvert(inputColourSpaceConvert, true);
1692
1693  switch (m_conformanceWindowMode)
1694  {
1695  case 0:
1696    {
1697      // no conformance or padding
1698      m_confWinLeft = m_confWinRight = m_confWinTop = m_confWinBottom = 0;
1699      m_aiPad[1] = m_aiPad[0] = 0;
1700      break;
1701    }
1702  case 1:
1703    {
1704      // automatic padding to minimum CU size
1705      Int minCuSize = m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1);
1706      if (m_iSourceWidth % minCuSize)
1707      {
1708        m_aiPad[0] = m_confWinRight  = ((m_iSourceWidth / minCuSize) + 1) * minCuSize - m_iSourceWidth;
1709        m_iSourceWidth  += m_confWinRight;
1710      }
1711      if (m_iSourceHeight % minCuSize)
1712      {
1713        m_aiPad[1] = m_confWinBottom = ((m_iSourceHeight / minCuSize) + 1) * minCuSize - m_iSourceHeight;
1714        m_iSourceHeight += m_confWinBottom;
1715        if ( m_isField )
1716        {
1717          m_iSourceHeightOrg += m_confWinBottom << 1;
1718          m_aiPad[1] = m_confWinBottom << 1;
1719        }
1720      }
1721      if (m_aiPad[0] % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0)
1722      {
1723        fprintf(stderr, "Error: picture width is not an integer multiple of the specified chroma subsampling\n");
1724        exit(EXIT_FAILURE);
1725      }
1726      if (m_aiPad[1] % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0)
1727      {
1728        fprintf(stderr, "Error: picture height is not an integer multiple of the specified chroma subsampling\n");
1729        exit(EXIT_FAILURE);
1730      }
1731      break;
1732    }
1733  case 2:
1734    {
1735      //padding
1736      m_iSourceWidth  += m_aiPad[0];
1737      m_iSourceHeight += m_aiPad[1];
1738      m_confWinRight  = m_aiPad[0];
1739      m_confWinBottom = m_aiPad[1];
1740      break;
1741    }
1742  case 3:
1743    {
1744      // conformance
1745      if ((m_confWinLeft == 0) && (m_confWinRight == 0) && (m_confWinTop == 0) && (m_confWinBottom == 0))
1746      {
1747        fprintf(stderr, "Warning: Conformance window enabled, but all conformance window parameters set to zero\n");
1748      }
1749      if ((m_aiPad[1] != 0) || (m_aiPad[0]!=0))
1750      {
1751        fprintf(stderr, "Warning: Conformance window enabled, padding parameters will be ignored\n");
1752      }
1753      m_aiPad[1] = m_aiPad[0] = 0;
1754      break;
1755    }
1756  }
1757
1758  if (tmpSliceMode<0 || tmpSliceMode>=Int(NUMBER_OF_SLICE_CONSTRAINT_MODES))
1759  {
1760    fprintf(stderr, "Error: bad slice mode\n");
1761    exit(EXIT_FAILURE);
1762  }
1763  m_sliceMode = SliceConstraint(tmpSliceMode);
1764  if (tmpSliceSegmentMode<0 || tmpSliceSegmentMode>=Int(NUMBER_OF_SLICE_CONSTRAINT_MODES))
1765  {
1766    fprintf(stderr, "Error: bad slice segment mode\n");
1767    exit(EXIT_FAILURE);
1768  }
1769  m_sliceSegmentMode = SliceConstraint(tmpSliceSegmentMode);
1770
1771  if (tmpDecodedPictureHashSEIMappedType<0 || tmpDecodedPictureHashSEIMappedType>=Int(NUMBER_OF_HASHTYPES))
1772  {
1773    fprintf(stderr, "Error: bad checksum mode\n");
1774    exit(EXIT_FAILURE);
1775  }
1776  // Need to map values to match those of the SEI message:
1777  if (tmpDecodedPictureHashSEIMappedType==0)
1778  {
1779    m_decodedPictureHashSEIType=HASHTYPE_NONE;
1780  }
1781  else
1782  {
1783    m_decodedPictureHashSEIType=HashType(tmpDecodedPictureHashSEIMappedType-1);
1784  }
1785
1786  // allocate slice-based dQP values
1787#if NH_MV
1788  for (Int i = (Int)m_layerIdInNuh.size(); i < m_numberOfLayers; i++ )
1789  {
1790    m_layerIdInNuh.push_back( i == 0 ? 0 : m_layerIdInNuh[ i - 1 ] + 1 ); 
1791  }
1792  xResizeVector( m_layerIdInNuh ); 
1793
1794  xResizeVector( m_viewOrderIndex    ); 
1795
1796  std::vector<Int> uniqueViewOrderIndices; 
1797  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
1798  {   
1799    Bool isIn = false; 
1800    for ( Int i = 0 ; i < uniqueViewOrderIndices.size(); i++ )
1801    {
1802      isIn = isIn || ( m_viewOrderIndex[ layer ] == uniqueViewOrderIndices[ i ] ); 
1803    }
1804    if ( !isIn ) 
1805    {
1806      uniqueViewOrderIndices.push_back( m_viewOrderIndex[ layer ] ); 
1807    } 
1808  }
1809  m_iNumberOfViews = (Int) uniqueViewOrderIndices.size(); 
1810  xResizeVector( m_auxId );
1811
1812#if NH_3D_VSO || NH_3D
1813  xResizeVector( m_depthFlag ); 
1814#endif
1815  xResizeVector( m_fQP ); 
1816
1817  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
1818  {
1819    m_aidQP.push_back( new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ] );
1820    ::memset( m_aidQP[layer], 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );
1821
1822    // handling of floating-point QP values
1823    // if QP is not integer, sequence is split into two sections having QP and QP+1
1824    m_iQP.push_back((Int)( m_fQP[layer] ));
1825    if ( m_iQP[layer] < m_fQP[layer] )
1826    {
1827      Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP[layer] - m_iQP[layer])*m_framesToBeEncoded + 0.5 );
1828
1829      iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
1830      for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
1831      {
1832        m_aidQP[layer][i] = 1;
1833      }
1834    }
1835
1836    for(UInt ch=0; ch<MAX_NUM_CHANNEL_TYPE; ch++)
1837    {
1838      if (saoOffsetBitShift[ch]<0)
1839      {
1840        if (m_internalBitDepth[ch]>10)
1841        {
1842          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) ) );
1843        }
1844        else
1845        {
1846          m_log2SaoOffsetScale[layer][ch]=0;
1847        }
1848      }
1849      else
1850      {
1851        m_log2SaoOffsetScale[layer][ch]=UInt(saoOffsetBitShift[ch]);
1852      }
1853    }
1854  }
1855
1856  xResizeVector( m_bLoopFilterDisable ); 
1857  xResizeVector( m_bUseSAO ); 
1858  xResizeVector( m_iIntraPeriod ); 
1859  xResizeVector( m_tilesInUseFlag ); 
1860  xResizeVector( m_loopFilterNotAcrossTilesFlag ); 
1861  xResizeVector( m_wppInUseFlag ); 
1862
1863  for (Int olsIdx = 0; olsIdx < m_vpsNumLayerSets + m_numAddLayerSets + (Int) m_outputLayerSetIdx.size(); olsIdx++)
1864  {   
1865    m_altOutputLayerFlag.push_back( false );     
1866  }
1867#else
1868  m_aidQP = new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ];
1869  ::memset( m_aidQP, 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );
1870
1871  // handling of floating-point QP values
1872  // if QP is not integer, sequence is split into two sections having QP and QP+1
1873  m_iQP = (Int)( m_fQP );
1874  if ( m_iQP < m_fQP )
1875  {
1876    Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP - m_iQP)*m_framesToBeEncoded + 0.5 );
1877
1878    iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
1879    for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
1880    {
1881      m_aidQP[i] = 1;
1882    }
1883  }
1884
1885  for(UInt ch=0; ch<MAX_NUM_CHANNEL_TYPE; ch++)
1886  {
1887    if (saoOffsetBitShift[ch]<0)
1888    {
1889      if (m_internalBitDepth[ch]>10)
1890      {
1891        m_log2SaoOffsetScale[ch]=UInt(Clip3<Int>(0, m_internalBitDepth[ch]-10, Int(m_internalBitDepth[ch]-10 + 0.165*m_iQP - 3.22 + 0.5) ) );
1892      }
1893      else
1894      {
1895        m_log2SaoOffsetScale[ch]=0;
1896      }
1897    }
1898    else
1899    {
1900      m_log2SaoOffsetScale[ch]=UInt(saoOffsetBitShift[ch]);
1901    }
1902  }
1903
1904#endif
1905
1906  // reading external dQP description from file
1907  if ( !m_dQPFileName.empty() )
1908  {
1909    FILE* fpt=fopen( m_dQPFileName.c_str(), "r" );
1910    if ( fpt )
1911    {
1912#if NH_MV
1913      for( Int layer = 0; layer < m_numberOfLayers; layer++ )
1914      {
1915#endif
1916      Int iValue;
1917      Int iPOC = 0;
1918      while ( iPOC < m_framesToBeEncoded )
1919      {
1920        if ( fscanf(fpt, "%d", &iValue ) == EOF )
1921        {
1922          break;
1923        }
1924#if NH_MV
1925        m_aidQP[layer][ iPOC ] = iValue;
1926        iPOC++;
1927      }
1928#else
1929        m_aidQP[ iPOC ] = iValue;
1930        iPOC++;
1931#endif
1932      }
1933      fclose(fpt);
1934    }
1935  }
1936
1937#if NH_MV
1938  xParseSeiCfg(); 
1939#endif
1940  if( m_masteringDisplay.colourVolumeSEIEnabled )
1941  {
1942    for(UInt idx=0; idx<6; idx++)
1943    {
1944      m_masteringDisplay.primaries[idx/2][idx%2] = UShort((cfg_DisplayPrimariesCode.values.size() > idx) ? cfg_DisplayPrimariesCode.values[idx] : 0);
1945    }
1946    for(UInt idx=0; idx<2; idx++)
1947    {
1948      m_masteringDisplay.whitePoint[idx] = UShort((cfg_DisplayWhitePointCode.values.size() > idx) ? cfg_DisplayWhitePointCode.values[idx] : 0);
1949    }
1950  }
1951   
1952  if( m_toneMappingInfoSEIEnabled && !m_toneMapCancelFlag )
1953  {
1954    if( m_toneMapModelId == 2 && !cfg_startOfCodedInterval.values.empty() )
1955    {
1956      const UInt num = 1u<< m_toneMapTargetBitDepth;
1957      m_startOfCodedInterval = new Int[num];
1958      for(UInt i=0; i<num; i++)
1959      {
1960        m_startOfCodedInterval[i] = cfg_startOfCodedInterval.values.size() > i ? cfg_startOfCodedInterval.values[i] : 0;
1961      }
1962    }
1963    else
1964    {
1965      m_startOfCodedInterval = NULL;
1966    }
1967    if( ( m_toneMapModelId == 3 ) && ( m_numPivots > 0 ) )
1968    {
1969      if( !cfg_codedPivotValue.values.empty() && !cfg_targetPivotValue.values.empty() )
1970      {
1971        m_codedPivotValue  = new Int[m_numPivots];
1972        m_targetPivotValue = new Int[m_numPivots];
1973        for(UInt i=0; i<m_numPivots; i++)
1974        {
1975          m_codedPivotValue[i]  = cfg_codedPivotValue.values.size()  > i ? cfg_codedPivotValue.values [i] : 0;
1976          m_targetPivotValue[i] = cfg_targetPivotValue.values.size() > i ? cfg_targetPivotValue.values[i] : 0;
1977        }
1978      }
1979    }
1980    else
1981    {
1982      m_codedPivotValue = NULL;
1983      m_targetPivotValue = NULL;
1984    }
1985  }
1986
1987  if( m_kneeSEIEnabled && !m_kneeSEICancelFlag )
1988  {
1989    assert ( m_kneeSEINumKneePointsMinus1 >= 0 && m_kneeSEINumKneePointsMinus1 < 999 );
1990    m_kneeSEIInputKneePoint  = new Int[m_kneeSEINumKneePointsMinus1+1];
1991    m_kneeSEIOutputKneePoint = new Int[m_kneeSEINumKneePointsMinus1+1];
1992    for(Int i=0; i<(m_kneeSEINumKneePointsMinus1+1); i++)
1993    {
1994      m_kneeSEIInputKneePoint[i]  = cfg_kneeSEIInputKneePointValue.values.size()  > i ? cfg_kneeSEIInputKneePointValue.values[i]  : 1;
1995      m_kneeSEIOutputKneePoint[i] = cfg_kneeSEIOutputKneePointValue.values.size() > i ? cfg_kneeSEIOutputKneePointValue.values[i] : 0;
1996    }
1997  }
1998
1999  if(m_timeCodeSEIEnabled)
2000  {
2001    for(Int i = 0; i < m_timeCodeSEINumTs && i < MAX_TIMECODE_SEI_SETS; i++)
2002    {
2003      m_timeSetArray[i].clockTimeStampFlag    = cfg_timeCodeSeiTimeStampFlag        .values.size()>i ? cfg_timeCodeSeiTimeStampFlag        .values [i] : false;
2004      m_timeSetArray[i].numUnitFieldBasedFlag = cfg_timeCodeSeiNumUnitFieldBasedFlag.values.size()>i ? cfg_timeCodeSeiNumUnitFieldBasedFlag.values [i] : 0;
2005      m_timeSetArray[i].countingType          = cfg_timeCodeSeiCountingType         .values.size()>i ? cfg_timeCodeSeiCountingType         .values [i] : 0;
2006      m_timeSetArray[i].fullTimeStampFlag     = cfg_timeCodeSeiFullTimeStampFlag    .values.size()>i ? cfg_timeCodeSeiFullTimeStampFlag    .values [i] : 0;
2007      m_timeSetArray[i].discontinuityFlag     = cfg_timeCodeSeiDiscontinuityFlag    .values.size()>i ? cfg_timeCodeSeiDiscontinuityFlag    .values [i] : 0;
2008      m_timeSetArray[i].cntDroppedFlag        = cfg_timeCodeSeiCntDroppedFlag       .values.size()>i ? cfg_timeCodeSeiCntDroppedFlag       .values [i] : 0;
2009      m_timeSetArray[i].numberOfFrames        = cfg_timeCodeSeiNumberOfFrames       .values.size()>i ? cfg_timeCodeSeiNumberOfFrames       .values [i] : 0;
2010      m_timeSetArray[i].secondsValue          = cfg_timeCodeSeiSecondsValue         .values.size()>i ? cfg_timeCodeSeiSecondsValue         .values [i] : 0;
2011      m_timeSetArray[i].minutesValue          = cfg_timeCodeSeiMinutesValue         .values.size()>i ? cfg_timeCodeSeiMinutesValue         .values [i] : 0;
2012      m_timeSetArray[i].hoursValue            = cfg_timeCodeSeiHoursValue           .values.size()>i ? cfg_timeCodeSeiHoursValue           .values [i] : 0;
2013      m_timeSetArray[i].secondsFlag           = cfg_timeCodeSeiSecondsFlag          .values.size()>i ? cfg_timeCodeSeiSecondsFlag          .values [i] : 0;
2014      m_timeSetArray[i].minutesFlag           = cfg_timeCodeSeiMinutesFlag          .values.size()>i ? cfg_timeCodeSeiMinutesFlag          .values [i] : 0;
2015      m_timeSetArray[i].hoursFlag             = cfg_timeCodeSeiHoursFlag            .values.size()>i ? cfg_timeCodeSeiHoursFlag            .values [i] : 0;
2016      m_timeSetArray[i].timeOffsetLength      = cfg_timeCodeSeiTimeOffsetLength     .values.size()>i ? cfg_timeCodeSeiTimeOffsetLength     .values [i] : 0;
2017      m_timeSetArray[i].timeOffsetValue       = cfg_timeCodeSeiTimeOffsetValue      .values.size()>i ? cfg_timeCodeSeiTimeOffsetValue      .values [i] : 0;
2018    }
2019  }
2020
2021
2022#if NH_3D_VSO
2023  // Table base optimization
2024  // Q&D
2025  Double adLambdaScaleTable[] = 
2026  {  0.031250, 0.031639, 0.032029, 0.032418, 0.032808, 0.033197, 0.033586, 0.033976, 0.034365, 0.034755, 
2027  0.035144, 0.035533, 0.035923, 0.036312, 0.036702, 0.037091, 0.037480, 0.037870, 0.038259, 0.038648, 
2028  0.039038, 0.039427, 0.039817, 0.040206, 0.040595, 0.040985, 0.041374, 0.041764, 0.042153, 0.042542, 
2029  0.042932, 0.043321, 0.043711, 0.044100, 0.044194, 0.053033, 0.061872, 0.070711, 0.079550, 0.088388, 
2030  0.117851, 0.147314, 0.176777, 0.235702, 0.294628, 0.353553, 0.471405, 0.589256, 0.707107, 0.707100, 
2031  0.753550, 0.800000 
2032  }; 
2033  if ( m_bUseVSO && m_bVSOLSTable )
2034  {
2035    Int firstDepthLayer = -1; 
2036    for (Int layer = 0; layer < m_numberOfLayers; layer++ )
2037    {
2038      if ( m_depthFlag[ layer ]  || m_auxId[ layer ] == 2 )
2039      {
2040        firstDepthLayer = layer;
2041        break; 
2042      }
2043    }
2044    AOT( firstDepthLayer == -1 );
2045    AOT( (m_iQP[firstDepthLayer] < 0) || (m_iQP[firstDepthLayer] > 51));
2046    m_dLambdaScaleVSO *= adLambdaScaleTable[m_iQP[firstDepthLayer]]; 
2047  }
2048  if ( m_bUseVSO && m_uiVSOMode == 4)
2049  {
2050    m_cRenModStrParser.setString( m_iNumberOfViews, m_pchVSOConfig );
2051    m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
2052      m_internalBitDepth[ CHANNEL_TYPE_LUMA],
2053      (UInt)m_iCodedCamParPrecision,
2054      m_FrameSkip,
2055      (UInt)m_framesToBeEncoded,
2056      m_pchCameraParameterFile,
2057      m_pchBaseViewCameraNumbers,
2058      NULL,
2059      m_cRenModStrParser.getSynthViews(),
2060      LOG2_DISP_PREC_LUT );
2061  }
2062  else if ( m_bUseVSO && m_uiVSOMode != 4 )
2063  {
2064    m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
2065      m_internalBitDepth[ CHANNEL_TYPE_LUMA],
2066      (UInt)m_iCodedCamParPrecision,
2067      m_FrameSkip,
2068      (UInt)m_framesToBeEncoded,
2069      m_pchCameraParameterFile,
2070      m_pchBaseViewCameraNumbers,
2071      m_pchVSOConfig,
2072      NULL,
2073      LOG2_DISP_PREC_LUT );
2074  }
2075  else
2076#endif
2077#if NH_3D || NH_3D_VSO
2078  {
2079    m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
2080      m_internalBitDepth[ CHANNEL_TYPE_LUMA],
2081      (UInt) m_iCodedCamParPrecision,
2082      m_FrameSkip,
2083      (UInt) m_framesToBeEncoded,
2084      m_pchCameraParameterFile,
2085      m_pchBaseViewCameraNumbers,
2086      NULL,
2087      NULL,
2088      LOG2_DISP_PREC_LUT );
2089  }
2090  m_cCameraData.check( false, true );
2091#endif
2092
2093  // check validity of input parameters
2094  xCheckParameter();
2095
2096  // compute actual CU depth with respect to config depth and max transform size
2097  UInt uiAddCUDepth  = 0;
2098  while( (m_uiMaxCUWidth>>m_uiMaxCUDepth) > ( 1 << ( m_uiQuadtreeTULog2MinSize + uiAddCUDepth )  ) )
2099  {
2100    uiAddCUDepth++;
2101  }
2102
2103  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.
2104  m_uiLog2DiffMaxMinCodingBlockSize = m_uiMaxCUDepth - 1;
2105
2106  // print-out parameters
2107  xPrintParameter();
2108
2109  return true;
2110}
2111
2112
2113// ====================================================================================================================
2114// Private member functions
2115// ====================================================================================================================
2116
2117Void TAppEncCfg::xCheckParameter()
2118{
2119  if (m_decodedPictureHashSEIType==HASHTYPE_NONE)
2120  {
2121    fprintf(stderr, "******************************************************************\n");
2122    fprintf(stderr, "** WARNING: --SEIDecodedPictureHash is now disabled by default. **\n");
2123    fprintf(stderr, "**          Automatic verification of decoded pictures by a     **\n");
2124    fprintf(stderr, "**          decoder requires this option to be enabled.         **\n");
2125    fprintf(stderr, "******************************************************************\n");
2126  }
2127
2128
2129#if !NH_MV
2130  if( m_profile==Profile::NONE )
2131  {
2132    fprintf(stderr, "***************************************************************************\n");
2133    fprintf(stderr, "** WARNING: For conforming bitstreams a valid Profile value must be set! **\n");
2134    fprintf(stderr, "***************************************************************************\n");
2135  }
2136  if( m_level==Level::NONE )
2137  {
2138    fprintf(stderr, "***************************************************************************\n");
2139    fprintf(stderr, "** WARNING: For conforming bitstreams a valid Level value must be set!   **\n");
2140    fprintf(stderr, "***************************************************************************\n");
2141  }
2142#endif
2143
2144  Bool check_failed = false; /* abort if there is a fatal configuration problem */
2145#define xConfirmPara(a,b) check_failed |= confirmPara(a,b)
2146
2147  xConfirmPara(m_bitstreamFileName.empty(), "A bitstream file name must be specified (BitstreamFile)");
2148  const UInt maxBitDepth=(m_chromaFormatIDC==CHROMA_400) ? m_internalBitDepth[CHANNEL_TYPE_LUMA] : std::max(m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA]);
2149  xConfirmPara(m_bitDepthConstraint<maxBitDepth, "The internalBitDepth must not be greater than the bitDepthConstraint value");
2150  xConfirmPara(m_chromaFormatConstraint<m_chromaFormatIDC, "The chroma format used must not be greater than the chromaFormatConstraint value");
2151#if NH_MV
2152  Profile::Name & m_profile = m_profiles[0];
2153#endif
2154
2155  if (m_profile==Profile::MAINREXT || m_profile==Profile::HIGHTHROUGHPUTREXT)
2156  {
2157    xConfirmPara(m_lowerBitRateConstraintFlag==false && m_intraConstraintFlag==false, "The lowerBitRateConstraint flag cannot be false when intraConstraintFlag is false");
2158    xConfirmPara(m_cabacBypassAlignmentEnabledFlag && m_profile!=Profile::HIGHTHROUGHPUTREXT, "AlignCABACBeforeBypass must not be enabled unless the high throughput profile is being used.");
2159    if (m_profile == Profile::MAINREXT)
2160    {
2161      const UInt intraIdx = m_intraConstraintFlag ? 1:0;
2162      const UInt bitDepthIdx = (m_bitDepthConstraint == 8 ? 0 : (m_bitDepthConstraint ==10 ? 1 : (m_bitDepthConstraint == 12 ? 2 : (m_bitDepthConstraint == 16 ? 3 : 4 ))));
2163      const UInt chromaFormatIdx = UInt(m_chromaFormatConstraint);
2164      const Bool bValidProfile = (bitDepthIdx > 3 || chromaFormatIdx>3) ? false : (validRExtProfileNames[intraIdx][bitDepthIdx][chromaFormatIdx] != NONE);
2165      xConfirmPara(!bValidProfile, "Invalid intra constraint flag, bit depth constraint flag and chroma format constraint flag combination for a RExt profile");
2166      const Bool bUsingGeneralRExtTools  = m_transformSkipRotationEnabledFlag        ||
2167                                           m_transformSkipContextEnabledFlag         ||
2168                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT] ||
2169                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT] ||
2170                                           !m_enableIntraReferenceSmoothing         ||
2171                                           m_persistentRiceAdaptationEnabledFlag     ||
2172                                           m_log2MaxTransformSkipBlockSize!=2;
2173      const Bool bUsingChromaQPTool      = m_diffCuChromaQpOffsetDepth >= 0;
2174      const Bool bUsingExtendedPrecision = m_extendedPrecisionProcessingFlag;
2175
2176      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");
2177      xConfirmPara(m_bitDepthConstraint != 16 && bUsingExtendedPrecision, "Extended precision can only be used in 16-bit RExt profiles");
2178      if (!(m_chromaFormatConstraint == CHROMA_400 && m_bitDepthConstraint == 16) && m_chromaFormatConstraint!=CHROMA_444)
2179      {
2180        xConfirmPara(bUsingGeneralRExtTools, "Combination of tools and profiles are not possible in the specified RExt profile.");
2181      }
2182      xConfirmPara( m_onePictureOnlyConstraintFlag && m_chromaFormatConstraint!=CHROMA_444, "chroma format constraint must be 4:4:4 when one-picture-only constraint flag is 1");
2183      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");
2184      xConfirmPara( m_onePictureOnlyConstraintFlag && m_framesToBeEncoded > 1, "Number of frames to be encoded must be 1 when one-picture-only constraint flag is 1.");
2185
2186      if (!m_intraConstraintFlag && m_bitDepthConstraint==16 && m_chromaFormatConstraint==CHROMA_444)
2187      {
2188        fprintf(stderr, "********************************************************************************************************\n");
2189        fprintf(stderr, "** WARNING: The RExt constraint flags describe a non standard combination (used for development only) **\n");
2190        fprintf(stderr, "********************************************************************************************************\n");
2191      }
2192    }
2193    else
2194    {
2195      xConfirmPara( m_chromaFormatConstraint != CHROMA_444, "chroma format constraint must be 4:4:4 in the High Throughput 4:4:4 16-bit Intra profile.");
2196      xConfirmPara( m_bitDepthConstraint     != 16,         "bit depth constraint must be 4:4:4 in the High Throughput 4:4:4 16-bit Intra profile.");
2197      xConfirmPara( m_intraConstraintFlag    != 1,          "intra constraint flag must be 1 in the High Throughput 4:4:4 16-bit Intra profile.");
2198    }
2199  }
2200  else
2201  {
2202    xConfirmPara(m_bitDepthConstraint!=((m_profile==Profile::MAIN10)?10:8), "BitDepthConstraint must be 8 for MAIN profile and 10 for MAIN10 profile.");
2203    xConfirmPara(m_chromaFormatConstraint!=CHROMA_420, "ChromaFormatConstraint must be 420 for non main-RExt profiles.");
2204    xConfirmPara(m_intraConstraintFlag==true, "IntraConstraintFlag must be false for non main_RExt profiles.");
2205    xConfirmPara(m_lowerBitRateConstraintFlag==false, "LowerBitrateConstraintFlag must be true for non main-RExt profiles.");
2206    xConfirmPara(m_profile == Profile::MAINSTILLPICTURE && m_framesToBeEncoded > 1, "Number of frames to be encoded must be 1 when main still picture profile is used.");
2207
2208    xConfirmPara(m_crossComponentPredictionEnabledFlag==true, "CrossComponentPrediction must not be used for non main-RExt profiles.");
2209    xConfirmPara(m_log2MaxTransformSkipBlockSize!=2, "Transform Skip Log2 Max Size must be 2 for V1 profiles.");
2210    xConfirmPara(m_transformSkipRotationEnabledFlag==true, "UseResidualRotation must not be enabled for non main-RExt profiles.");
2211    xConfirmPara(m_transformSkipContextEnabledFlag==true, "UseSingleSignificanceMapContext must not be enabled for non main-RExt profiles.");
2212    xConfirmPara(m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT]==true, "ImplicitResidualDPCM must not be enabled for non main-RExt profiles.");
2213    xConfirmPara(m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT]==true, "ExplicitResidualDPCM must not be enabled for non main-RExt profiles.");
2214    xConfirmPara(m_persistentRiceAdaptationEnabledFlag==true, "GolombRiceParameterAdaption must not be enabled for non main-RExt profiles.");
2215    xConfirmPara(m_extendedPrecisionProcessingFlag==true, "UseExtendedPrecision must not be enabled for non main-RExt profiles.");
2216    xConfirmPara(m_highPrecisionOffsetsEnabledFlag==true, "UseHighPrecisionPredictionWeighting must not be enabled for non main-RExt profiles.");
2217    xConfirmPara(m_enableIntraReferenceSmoothing==false, "EnableIntraReferenceSmoothing must be enabled for non main-RExt profiles.");
2218    xConfirmPara(m_cabacBypassAlignmentEnabledFlag, "AlignCABACBeforeBypass cannot be enabled for non main-RExt profiles.");
2219  }
2220
2221  // check range of parameters
2222  xConfirmPara( m_inputBitDepth[CHANNEL_TYPE_LUMA  ] < 8,                                   "InputBitDepth must be at least 8" );
2223  xConfirmPara( m_inputBitDepth[CHANNEL_TYPE_CHROMA] < 8,                                   "InputBitDepthC must be at least 8" );
2224
2225#if !RExt__HIGH_BIT_DEPTH_SUPPORT
2226  if (m_extendedPrecisionProcessingFlag)
2227  {
2228    for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
2229    {
2230      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...");
2231    }
2232  }
2233  else
2234  {
2235    for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
2236    {
2237      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...");
2238    }
2239  }
2240#endif
2241
2242  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)" );
2243  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)" );
2244
2245#if NH_MV
2246  for (Int i = 0; i < m_numberOfLayers; i++)
2247  {
2248    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");
2249    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");
2250  }
2251#else
2252  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");
2253  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");
2254#endif
2255
2256  xConfirmPara( m_chromaFormatIDC >= NUM_CHROMA_FORMAT,                                     "ChromaFormatIDC must be either 400, 420, 422 or 444" );
2257  std::string sTempIPCSC="InputColourSpaceConvert must be empty, "+getListOfColourSpaceConverts(true);
2258  xConfirmPara( m_inputColourSpaceConvert >= NUMBER_INPUT_COLOUR_SPACE_CONVERSIONS,         sTempIPCSC.c_str() );
2259  xConfirmPara( m_InputChromaFormatIDC >= NUM_CHROMA_FORMAT,                                "InputChromaFormatIDC must be either 400, 420, 422 or 444" );
2260  xConfirmPara( m_iFrameRate <= 0,                                                          "Frame rate must be more than 1" );
2261  xConfirmPara( m_framesToBeEncoded <= 0,                                                   "Total Number Of Frames encoded must be more than 0" );
2262#if NH_MV
2263  xConfirmPara( m_numberOfLayers > MAX_NUM_LAYER_IDS ,                                      "NumberOfLayers must be less than or equal to MAX_NUM_LAYER_IDS");
2264
2265
2266  xConfirmPara( m_layerIdInNuh[0] != 0      , "LayerIdInNuh must be 0 for the first layer. ");
2267  xConfirmPara( (m_layerIdInNuh.size()!=1) && (m_layerIdInNuh.size() < m_numberOfLayers) , "LayerIdInNuh must be given for all layers. ");
2268
2269#if NH_3D
2270  xConfirmPara( m_scalabilityMask != 2 && m_scalabilityMask != 3, "Scalability Mask must be equal to 2 or 3. ");
2271#else
2272  xConfirmPara( m_scalabilityMask != 2 && m_scalabilityMask != 8 && m_scalabilityMask != 10, "Scalability Mask must be equal to 2, 8 or 10");
2273#endif
2274
2275#if NH_3D_VSO || NH_3D
2276  if ( m_scalabilityMask & ( 1 << DEPTH_ID ) )
2277  {
2278    m_dimIds.push_back( m_depthFlag ); 
2279  }
2280#endif
2281
2282  m_dimIds.push_back( m_viewOrderIndex );   
2283  for (Int i = 0; i < m_auxId.size(); i++)
2284  {
2285    xConfirmPara( !( ( m_auxId[i] >= 0 && m_auxId[i] <= 2 ) || ( m_auxId[i] >= 128 && m_auxId[i] <= 159 ) ) , "AuxId shall be in the range of 0 to 2, inclusive, or 128 to 159, inclusive");
2286  }
2287  if ( m_scalabilityMask & ( 1 << AUX_ID ) )
2288  {
2289    m_dimIds.push_back ( m_auxId );
2290  }
2291  xConfirmPara(  m_dimensionIdLen.size() < m_dimIds.size(), "DimensionIdLen must be given for all dimensions. "   );
2292  Int dimBitOffset[MAX_NUM_SCALABILITY_TYPES+1]; 
2293
2294  dimBitOffset[ 0 ] = 0; 
2295  for (Int j = 1; j <= (((Int) m_dimIds.size() - m_splittingFlag) ? 1 : 0); j++ )
2296  {
2297    dimBitOffset[ j ] = dimBitOffset[ j - 1 ] + m_dimensionIdLen[ j - 1]; 
2298  }
2299
2300  if ( m_splittingFlag )
2301  {
2302    dimBitOffset[ (Int) m_dimIds.size() ] = 6; 
2303  }
2304
2305  for( Int j = 0; j < m_dimIds.size(); j++ )
2306  {   
2307    xConfirmPara( m_dimIds[j].size() < m_numberOfLayers,  "DimensionId must be given for all layers and all dimensions. ");   
2308    xConfirmPara( (m_dimIds[j][0] != 0)                 , "DimensionId of layer 0 must be 0. " );
2309    xConfirmPara( m_dimensionIdLen[j] < 1 || m_dimensionIdLen[j] > 8, "DimensionIdLen must be greater than 0 and less than 9 in all dimensions. " ); 
2310
2311
2312    for( Int i = 1; i < m_numberOfLayers; i++ )
2313    {     
2314      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. " );
2315      if ( m_splittingFlag )
2316      {
2317        Int layerIdInNuh = (m_layerIdInNuh.size()!=1) ? m_layerIdInNuh[i] :  i; 
2318        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. "); 
2319      }
2320    }
2321  }
2322
2323  for( Int i = 0; i < m_numberOfLayers; i++ )
2324  {
2325    for( Int j = 0; j < i; j++ )
2326    {     
2327      Int numDiff  = 0; 
2328      Int lastDiff = -1; 
2329      for( Int dim = 0; dim < m_dimIds.size(); dim++ )
2330      {
2331        if ( m_dimIds[dim][i] != m_dimIds[dim][j] )
2332        {
2333          numDiff ++; 
2334          lastDiff = dim; 
2335        }
2336      }
2337
2338      Bool allEqual = ( numDiff == 0 ); 
2339
2340      if ( allEqual ) 
2341      {
2342        printf( "\nError: Positions of Layers %d and %d are identical in scalability space\n", i, j);
2343      }
2344
2345      xConfirmPara( allEqual , "Each layer shall have a different position in scalability space." );
2346
2347#if !H_3D_FCO
2348      if ( numDiff  == 1 ) 
2349      {
2350        Bool inc = m_dimIds[ lastDiff ][ i ] > m_dimIds[ lastDiff ][ j ]; 
2351        Bool shallBeButIsNotIncreasing = ( !inc  ) ; 
2352        if ( shallBeButIsNotIncreasing )
2353        {       
2354          printf( "\nError: Positions of Layers %d and %d is not increasing in dimension %d \n", i, j, lastDiff);       
2355        }
2356        xConfirmPara( shallBeButIsNotIncreasing,  "DimensionIds shall be increasing within one dimension. " );
2357      }
2358#endif
2359    }
2360  }
2361
2362  /// ViewId
2363  xConfirmPara( m_viewId.size() != m_iNumberOfViews, "The number of ViewIds must be equal to the number of views." ); 
2364
2365  /// Layer sets
2366  xConfirmPara( m_vpsNumLayerSets < 0 || m_vpsNumLayerSets > 1024, "VpsNumLayerSets must be greater than 0 and less than 1025. ") ; 
2367  for( Int lsIdx = 0; lsIdx < m_vpsNumLayerSets; lsIdx++ )
2368  {
2369    if (lsIdx == 0)
2370    {
2371      xConfirmPara( m_layerIdxInVpsInSets[lsIdx].size() != 1 || m_layerIdxInVpsInSets[lsIdx][0] != 0 , "0-th layer shall only include layer 0. ");
2372    }
2373    for ( Int i = 0; i < m_layerIdxInVpsInSets[lsIdx].size(); i++ )
2374    {
2375      xConfirmPara( m_layerIdxInVpsInSets[lsIdx][i] < 0 || m_layerIdxInVpsInSets[lsIdx][i] >= MAX_NUM_LAYER_IDS, "LayerIdsInSet must be greater than 0 and less than MAX_NUM_LAYER_IDS" ); 
2376    }
2377  }
2378
2379  // Output layer sets
2380  xConfirmPara( m_outputLayerSetIdx.size() > 1024, "The number of output layer set indices must be less than 1025.") ;
2381  for (Int lsIdx = 0; lsIdx < m_outputLayerSetIdx.size(); lsIdx++)
2382  {   
2383    Int refLayerSetIdx = m_outputLayerSetIdx[ lsIdx ]; 
2384    xConfirmPara(  refLayerSetIdx < 0 || refLayerSetIdx >= m_vpsNumLayerSets + m_numAddLayerSets, "Output layer set idx must be greater or equal to 0 and less than the VpsNumLayerSets plus NumAddLayerSets." );
2385  }
2386
2387  xConfirmPara( m_defaultOutputLayerIdc < 0 || m_defaultOutputLayerIdc > 2, "Default target output layer idc must greater than or equal to 0 and less than or equal to 2." ); 
2388
2389  if( m_defaultOutputLayerIdc != 2 )
2390  {
2391    Bool anyDefaultOutputFlag = false;   
2392    for (Int lsIdx = 0; lsIdx < m_vpsNumLayerSets; lsIdx++)
2393    { 
2394      anyDefaultOutputFlag = anyDefaultOutputFlag || ( m_layerIdsInDefOutputLayerSet[lsIdx].size() != 0 );
2395    }   
2396    if ( anyDefaultOutputFlag )
2397    {   
2398      printf( "\nWarning: Ignoring LayerIdsInDefOutputLayerSet parameters, since defaultTargetOuputLayerIdc is not equal 2.\n" );   
2399    }
2400  }
2401  else 
2402  { 
2403    for (Int lsIdx = 0; lsIdx < m_vpsNumLayerSets; lsIdx++)
2404    { 
2405      for (Int i = 0; i < m_layerIdsInDefOutputLayerSet[ lsIdx ].size(); i++)
2406      {
2407        Bool inLayerSetFlag = false; 
2408        for (Int j = 0; j < m_layerIdxInVpsInSets[ lsIdx].size(); j++ )
2409        {
2410          if ( m_layerIdxInVpsInSets[ lsIdx ][ j ] == m_layerIdsInDefOutputLayerSet[ lsIdx ][ i ] )
2411          {
2412            inLayerSetFlag = true; 
2413            break; 
2414          }       
2415        }
2416        xConfirmPara( !inLayerSetFlag, "All output layers of a output layer set must be included in corresponding layer set.");
2417      }
2418    }
2419  }
2420
2421  xConfirmPara( m_altOutputLayerFlag.size() < m_vpsNumLayerSets + m_numAddLayerSets + m_outputLayerSetIdx.size(), "The number of alt output layer flags must be equal to the number of layer set additional output layer sets plus the number of output layer set indices" );
2422
2423  // PTL
2424  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." ); 
2425
2426  if ( m_numberOfLayers > 1)
2427  {
2428    xConfirmPara( m_profiles.size() <= 1, "The number of profiles, tiers, levels, and inblFlags must be greater than 1.");
2429    xConfirmPara( m_inblFlag[0], "VpsProfileTierLevel[0] must have inblFlag equal to 0");
2430    if (m_profiles.size() > 1 )
2431    {
2432      xConfirmPara( m_profiles[0]  != m_profiles[1], "The profile in VpsProfileTierLevel[1] must be equal to the profile in VpsProfileTierLevel[0].");
2433      xConfirmPara( m_inblFlag[0] != m_inblFlag[1], "inblFlag in VpsProfileTierLevel[1] must be equal to the inblFlag in VpsProfileTierLevel[0].");
2434    }
2435  }
2436
2437  // Layer Dependencies 
2438  for (Int i = 0; i < m_numberOfLayers; i++ )
2439  {
2440    xConfirmPara( (i == 0)  && m_directRefLayers[0].size() != 0, "Layer 0 shall not have reference layers." ); 
2441    xConfirmPara( m_directRefLayers[i].size() != m_dependencyTypes[ i ].size(), "Each reference layer shall have a reference type." ); 
2442    for (Int j = 0; j < m_directRefLayers[i].size(); j++)
2443    {
2444      xConfirmPara( m_directRefLayers[i][j] < 0 || m_directRefLayers[i][j] >= i , "Reference layer id shall be greater than or equal to 0 and less than dependent layer id"); 
2445      xConfirmPara( m_dependencyTypes[i][j] < 0 || m_dependencyTypes[i][j] >  6 , "Dependency type shall be greater than or equal to 0 and less than 7");
2446    }       
2447  } 
2448#endif
2449
2450  xConfirmPara( m_iGOPSize < 1 ,                                                            "GOP Size must be greater or equal to 1" );
2451  xConfirmPara( m_iGOPSize > 1 &&  m_iGOPSize % 2,                                          "GOP Size must be a multiple of 2, if GOP Size is greater than 1" );
2452#if NH_MV
2453  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
2454  {
2455    xConfirmPara( (m_iIntraPeriod[layer] > 0 && m_iIntraPeriod[layer] < m_iGOPSize) || m_iIntraPeriod[layer] == 0, "Intra period must be more than GOP size, or -1 , not 0" );
2456  }
2457#else
2458  xConfirmPara( (m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, "Intra period must be more than GOP size, or -1 , not 0" );
2459#endif
2460  xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 3,                   "Decoding Refresh Type must be comprised between 0 and 3 included" );
2461  if(m_iDecodingRefreshType == 3)
2462  {
2463    xConfirmPara( !m_recoveryPointSEIEnabled,                                               "When using RecoveryPointSEI messages as RA points, recoveryPointSEI must be enabled" );
2464  }
2465
2466  if (m_isField)
2467  {
2468    if (!m_pictureTimingSEIEnabled)
2469    {
2470      fprintf(stderr, "****************************************************************************\n");
2471      fprintf(stderr, "** WARNING: Picture Timing SEI should be enabled for field coding!        **\n");
2472      fprintf(stderr, "****************************************************************************\n");
2473    }
2474  }
2475
2476  if(m_crossComponentPredictionEnabledFlag && (m_chromaFormatIDC != CHROMA_444))
2477  {
2478    fprintf(stderr, "****************************************************************************\n");
2479    fprintf(stderr, "** WARNING: Cross-component prediction is specified for 4:4:4 format only **\n");
2480    fprintf(stderr, "****************************************************************************\n");
2481
2482    m_crossComponentPredictionEnabledFlag = false;
2483  }
2484
2485  if ( m_CUTransquantBypassFlagForce && m_bUseHADME )
2486  {
2487    fprintf(stderr, "****************************************************************************\n");
2488    fprintf(stderr, "** WARNING: --HadamardME has been disabled due to the enabling of         **\n");
2489    fprintf(stderr, "**          --CUTransquantBypassFlagForce                                 **\n");
2490    fprintf(stderr, "****************************************************************************\n");
2491
2492    m_bUseHADME = false; // this has been disabled so that the lambda is calculated slightly differently for lossless modes (as a result of JCTVC-R0104).
2493  }
2494
2495  xConfirmPara (m_log2MaxTransformSkipBlockSize < 2, "Transform Skip Log2 Max Size must be at least 2 (4x4)");
2496
2497  if (m_log2MaxTransformSkipBlockSize!=2 && m_useTransformSkipFast)
2498  {
2499    fprintf(stderr, "***************************************************************************\n");
2500    fprintf(stderr, "** WARNING: Transform skip fast is enabled (which only tests NxN splits),**\n");
2501    fprintf(stderr, "**          but transform skip log2 max size is not 2 (4x4)              **\n");
2502    fprintf(stderr, "**          It may be better to disable transform skip fast mode         **\n");
2503    fprintf(stderr, "***************************************************************************\n");
2504  }
2505#if NH_MV
2506  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
2507  {
2508    xConfirmPara( m_iQP[layer] <  -6 * (m_internalBitDepth[CHANNEL_TYPE_LUMA] - 8) || m_iQP[layer] > 51,      "QP exceeds supported range (-QpBDOffsety to 51)" );
2509    xConfirmPara( m_DeblockingFilterMetric && (m_bLoopFilterDisable[layer] || m_loopFilterOffsetInPPS), "If DeblockingFilterMetric is true then both LoopFilterDisable and LoopFilterOffsetInPPS must be 0");
2510  }
2511#else
2512  xConfirmPara( m_iQP <  -6 * (m_internalBitDepth[CHANNEL_TYPE_LUMA] - 8) || m_iQP > 51,    "QP exceeds supported range (-QpBDOffsety to 51)" );
2513  xConfirmPara( m_DeblockingFilterMetric && (m_bLoopFilterDisable || m_loopFilterOffsetInPPS), "If DeblockingFilterMetric is true then both LoopFilterDisable and LoopFilterOffsetInPPS must be 0");
2514#endif
2515 
2516  xConfirmPara( m_loopFilterBetaOffsetDiv2 < -6 || m_loopFilterBetaOffsetDiv2 > 6,        "Loop Filter Beta Offset div. 2 exceeds supported range (-6 to 6)");
2517  xConfirmPara( m_loopFilterTcOffsetDiv2 < -6 || m_loopFilterTcOffsetDiv2 > 6,            "Loop Filter Tc Offset div. 2 exceeds supported range (-6 to 6)");
2518  xConfirmPara( m_iSearchRange < 0 ,                                                        "Search Range must be more than 0" );
2519  xConfirmPara( m_bipredSearchRange < 0 ,                                                   "Bi-prediction refinement search range must be more than 0" );
2520  xConfirmPara( m_minSearchWindow < 0,                                                      "Minimum motion search window size for the adaptive window ME must be greater than or equal to 0" );
2521#if NH_MV
2522  xConfirmPara( m_iVerticalDisparitySearchRange <= 0 ,                                      "Vertical Disparity Search Range must be more than 0" );
2523#endif
2524  xConfirmPara( m_iMaxDeltaQP > 7,                                                          "Absolute Delta QP exceeds supported range (0 to 7)" );
2525  xConfirmPara( m_iMaxCuDQPDepth > m_uiMaxCUDepth - 1,                                          "Absolute depth for a minimum CuDQP exceeds maximum coding unit depth" );
2526
2527  xConfirmPara( m_cbQpOffset < -12,   "Min. Chroma Cb QP Offset is -12" );
2528  xConfirmPara( m_cbQpOffset >  12,   "Max. Chroma Cb QP Offset is  12" );
2529  xConfirmPara( m_crQpOffset < -12,   "Min. Chroma Cr QP Offset is -12" );
2530  xConfirmPara( m_crQpOffset >  12,   "Max. Chroma Cr QP Offset is  12" );
2531
2532  xConfirmPara( m_iQPAdaptationRange <= 0,                                                  "QP Adaptation Range must be more than 0" );
2533  if (m_iDecodingRefreshType == 2)
2534  {
2535#if NH_MV
2536    for (Int i = 0; i < m_numberOfLayers; i++ )
2537    {
2538      xConfirmPara( m_iIntraPeriod[i] > 0 && m_iIntraPeriod[i] <= m_iGOPSize ,                      "Intra period must be larger than GOP size for periodic IDR pictures");
2539    }
2540#else
2541    xConfirmPara( m_iIntraPeriod > 0 && m_iIntraPeriod <= m_iGOPSize ,                      "Intra period must be larger than GOP size for periodic IDR pictures");
2542#endif
2543  }
2544  xConfirmPara( m_uiMaxCUDepth < 1,                                                         "MaxPartitionDepth must be greater than zero");
2545  xConfirmPara( (m_uiMaxCUWidth  >> m_uiMaxCUDepth) < 4,                                    "Minimum partition width size should be larger than or equal to 8");
2546  xConfirmPara( (m_uiMaxCUHeight >> m_uiMaxCUDepth) < 4,                                    "Minimum partition height size should be larger than or equal to 8");
2547  xConfirmPara( m_uiMaxCUWidth < 16,                                                        "Maximum partition width size should be larger than or equal to 16");
2548  xConfirmPara( m_uiMaxCUHeight < 16,                                                       "Maximum partition height size should be larger than or equal to 16");
2549  xConfirmPara( (m_iSourceWidth  % (m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame width must be a multiple of the minimum CU size");
2550  xConfirmPara( (m_iSourceHeight % (m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame height must be a multiple of the minimum CU size");
2551
2552  xConfirmPara( m_uiQuadtreeTULog2MinSize < 2,                                        "QuadtreeTULog2MinSize must be 2 or greater.");
2553  xConfirmPara( m_uiQuadtreeTULog2MaxSize > 5,                                        "QuadtreeTULog2MaxSize must be 5 or smaller.");
2554  xConfirmPara( m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize,                "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize.");
2555  xConfirmPara( (1<<m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth,                      "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
2556  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) >= ( m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than or equal to minimum CU size" );
2557  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) >= ( m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than or equal to minimum CU size" );
2558  xConfirmPara( m_uiQuadtreeTUMaxDepthInter < 1,                                                         "QuadtreeTUMaxDepthInter must be greater than or equal to 1" );
2559  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" );
2560  xConfirmPara( m_uiQuadtreeTUMaxDepthIntra < 1,                                                         "QuadtreeTUMaxDepthIntra must be greater than or equal to 1" );
2561  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" );
2562
2563  xConfirmPara(  m_maxNumMergeCand < 1,  "MaxNumMergeCand must be 1 or greater.");
2564  xConfirmPara(  m_maxNumMergeCand > 5,  "MaxNumMergeCand must be 5 or smaller.");
2565#if NH_3D
2566  xConfirmPara( m_log2SubPbSizeMinus3 < 0,                                        "Log2SubPbSizeMinus3 must be equal to 0 or greater.");
2567  xConfirmPara( m_log2SubPbSizeMinus3 > 3,                                        "Log2SubPbSizeMinus3 must be equal to 3 or smaller.");
2568  xConfirmPara( (1<< ( m_log2SubPbSizeMinus3 + 3) ) > m_uiMaxCUWidth,              "Log2SubPbSizeMinus3 must be  equal to log2(maxCUSize)-3 or smaller.");
2569 
2570  xConfirmPara( m_log2MpiSubPbSizeMinus3 < 0,                                        "Log2MpiSubPbSizeMinus3 must be equal to 0 or greater.");
2571  xConfirmPara( m_log2MpiSubPbSizeMinus3 > 3,                                        "Log2MpiSubPbSizeMinus3 must be equal to 3 or smaller.");
2572  xConfirmPara( (1<< (m_log2MpiSubPbSizeMinus3 + 3)) > m_uiMaxCUWidth,               "Log2MpiSubPbSizeMinus3 must be equal to log2(maxCUSize)-3 or smaller.");
2573#endif
2574#if ADAPTIVE_QP_SELECTION
2575#if NH_MV
2576  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
2577  {
2578    xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP[layer] < 0,                                     "AdaptiveQpSelection must be disabled when QP < 0.");
2579  }
2580#else
2581  xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP < 0,                                              "AdaptiveQpSelection must be disabled when QP < 0.");
2582#endif
2583  xConfirmPara( m_bUseAdaptQpSelect == true && (m_cbQpOffset !=0 || m_crQpOffset != 0 ),               "AdaptiveQpSelection must be disabled when ChromaQpOffset is not equal to 0.");
2584#endif
2585
2586  if( m_usePCM)
2587  {
2588    for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
2589    {
2590      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)");
2591    }
2592    xConfirmPara(  m_uiPCMLog2MinSize < 3,                                      "PCMLog2MinSize must be 3 or greater.");
2593    xConfirmPara(  m_uiPCMLog2MinSize > 5,                                      "PCMLog2MinSize must be 5 or smaller.");
2594    xConfirmPara(  m_pcmLog2MaxSize > 5,                                        "PCMLog2MaxSize must be 5 or smaller.");
2595    xConfirmPara(  m_pcmLog2MaxSize < m_uiPCMLog2MinSize,                       "PCMLog2MaxSize must be equal to or greater than m_uiPCMLog2MinSize.");
2596  }
2597
2598  if (m_sliceMode!=NO_SLICES)
2599  {
2600    xConfirmPara( m_sliceArgument < 1 ,         "SliceArgument should be larger than or equal to 1" );
2601  }
2602  if (m_sliceSegmentMode!=NO_SLICES)
2603  {
2604    xConfirmPara( m_sliceSegmentArgument < 1 ,         "SliceSegmentArgument should be larger than or equal to 1" );
2605  }
2606
2607  Bool tileFlag = (m_numTileColumnsMinus1 > 0 || m_numTileRowsMinus1 > 0 );
2608  if (m_profile!=Profile::HIGHTHROUGHPUTREXT)
2609  {
2610    xConfirmPara( tileFlag && m_entropyCodingSyncEnabledFlag, "Tiles and entropy-coding-sync (Wavefronts) can not be applied together, except in the High Throughput Intra 4:4:4 16 profile");
2611  }
2612
2613  xConfirmPara( m_iSourceWidth  % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Picture width must be an integer multiple of the specified chroma subsampling");
2614  xConfirmPara( m_iSourceHeight % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Picture height must be an integer multiple of the specified chroma subsampling");
2615
2616  xConfirmPara( m_aiPad[0] % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling");
2617  xConfirmPara( m_aiPad[1] % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling");
2618
2619  xConfirmPara( m_confWinLeft   % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Left conformance window offset must be an integer multiple of the specified chroma subsampling");
2620  xConfirmPara( m_confWinRight  % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Right conformance window offset must be an integer multiple of the specified chroma subsampling");
2621  xConfirmPara( m_confWinTop    % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Top conformance window offset must be an integer multiple of the specified chroma subsampling");
2622  xConfirmPara( m_confWinBottom % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling");
2623
2624  xConfirmPara( m_defaultDisplayWindowFlag && !m_vuiParametersPresentFlag, "VUI needs to be enabled for default display window");
2625
2626  if (m_defaultDisplayWindowFlag)
2627  {
2628    xConfirmPara( m_defDispWinLeftOffset   % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Left default display window offset must be an integer multiple of the specified chroma subsampling");
2629    xConfirmPara( m_defDispWinRightOffset  % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Right default display window offset must be an integer multiple of the specified chroma subsampling");
2630    xConfirmPara( m_defDispWinTopOffset    % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Top default display window offset must be an integer multiple of the specified chroma subsampling");
2631    xConfirmPara( m_defDispWinBottomOffset % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Bottom default display window offset must be an integer multiple of the specified chroma subsampling");
2632  }
2633
2634#if NH_3D_VSO || NH_3D
2635  xConfirmPara( m_pchCameraParameterFile    == 0                ,   "CameraParameterFile must be given");
2636  xConfirmPara( m_pchBaseViewCameraNumbers  == 0                ,   "BaseViewCameraNumbers must be given" );
2637  xConfirmPara( m_iNumberOfViews != m_cCameraData.getBaseViewNumbers().size() ,   "Number of Views in BaseViewCameraNumbers must be equal to NumberOfViews" );
2638  xConfirmPara    ( m_iCodedCamParPrecision < 0 || m_iCodedCamParPrecision > 5,       "CodedCamParsPrecision must be in range of 0..5" );
2639#endif
2640#if NH_3D_VSO
2641    if( m_bUseVSO )
2642    {
2643      xConfirmPara(   m_pchVSOConfig            == 0                             ,   "VSO Setup string must be given");
2644      xConfirmPara( m_uiVSOMode > 4 ,                                                "VSO Mode must be less than 5");
2645    }
2646#endif
2647  // max CU width and height should be power of 2
2648  UInt ui = m_uiMaxCUWidth;
2649  while(ui)
2650  {
2651    ui >>= 1;
2652    if( (ui & 1) == 1)
2653    {
2654      xConfirmPara( ui != 1 , "Width should be 2^n");
2655    }
2656  }
2657  ui = m_uiMaxCUHeight;
2658  while(ui)
2659  {
2660    ui >>= 1;
2661    if( (ui & 1) == 1)
2662    {
2663      xConfirmPara( ui != 1 , "Height should be 2^n");
2664    }
2665  }
2666
2667#if NH_MV
2668  // validate that POC of same frame is identical across multiple layers
2669  Bool bErrorMvePoc = false;
2670  if( m_numberOfLayers > 1 )
2671  {
2672    for( Int k = 1; k < m_numberOfLayers; k++ )
2673    {
2674      for( Int i = 0; i < MAX_GOP; i++ )
2675      {
2676        if( m_GOPListMvc[k][i].m_POC != m_GOPListMvc[0][i].m_POC )
2677        {
2678          printf( "\nError: Frame%d_l%d POC %d is not identical to Frame%d POC\n", i, k, m_GOPListMvc[k][i].m_POC, i );
2679          bErrorMvePoc = true;
2680        }
2681      }
2682    }
2683  }
2684  xConfirmPara( bErrorMvePoc,  "Invalid inter-layer POC structure given" );
2685
2686  // validate that baseview has no inter-view refs
2687  Bool bErrorIvpBase = false;
2688  for( Int i = 0; i < MAX_GOP; i++ )
2689  {
2690    if( m_GOPListMvc[0][i].m_numActiveRefLayerPics != 0 )
2691    {
2692      printf( "\nError: Frame%d inter_layer refs not available in layer 0\n", i );
2693      bErrorIvpBase = true;
2694    }
2695  }
2696  xConfirmPara( bErrorIvpBase, "Inter-layer refs not possible in base layer" );
2697
2698  // validate inter-view refs
2699  Bool bErrorIvpEnhV = false;
2700  if( m_numberOfLayers > 1 )
2701  {
2702    for( Int layer = 1; layer < m_numberOfLayers; layer++ )
2703    {
2704      for( Int i = 0; i < MAX_GOP+1; i++ )
2705      {
2706        GOPEntry gopEntry = m_GOPListMvc[layer][i]; 
2707        for( Int j = 0; j < gopEntry.m_numActiveRefLayerPics; j++ )
2708        {
2709          Int ilPredLayerIdc = gopEntry.m_interLayerPredLayerIdc[j];
2710          if( ilPredLayerIdc < 0 || ilPredLayerIdc >= m_directRefLayers[layer].size() )
2711          {
2712            printf( "\nError: inter-layer ref idc %d is not available for Frame%d_l%d\n", gopEntry.m_interLayerPredLayerIdc[j], i, layer );
2713            bErrorIvpEnhV = true;
2714          }
2715          if( gopEntry.m_interViewRefPosL[0][j] < -1 || gopEntry.m_interViewRefPosL[0][j] > gopEntry.m_numRefPicsActive )
2716          {
2717            printf( "\nError: inter-layer ref pos %d on L0 is not available for Frame%d_l%d\n", gopEntry.m_interViewRefPosL[0][j], i, layer );
2718            bErrorIvpEnhV = true;
2719          }
2720          if( gopEntry.m_interViewRefPosL[1][j] < -1  || gopEntry.m_interViewRefPosL[1][j] > gopEntry.m_numRefPicsActive )
2721          {
2722            printf( "\nError: inter-layer ref pos %d on L1 is not available for Frame%d_l%d\n", gopEntry.m_interViewRefPosL[1][j], i, layer );
2723            bErrorIvpEnhV = true;
2724          }
2725        }
2726        if( i == MAX_GOP ) // inter-view refs at I pic position in base view
2727        {
2728          if( gopEntry.m_sliceType != 'B' && gopEntry.m_sliceType != 'P' && gopEntry.m_sliceType != 'I' )
2729          {
2730            printf( "\nError: slice type of FrameI_l%d must be equal to B or P or I\n", layer );
2731            bErrorIvpEnhV = true;
2732          }
2733
2734          if( gopEntry.m_POC != 0 )
2735          {
2736            printf( "\nError: POC %d not possible for FrameI_l%d, must be 0\n", gopEntry.m_POC, layer );
2737            bErrorIvpEnhV = true;
2738          }
2739
2740          if( gopEntry.m_temporalId != 0 )
2741          {
2742            printf( "\nWarning: Temporal id of FrameI_l%d must be 0 (cp. I-frame in base layer)\n", layer );
2743            gopEntry.m_temporalId = 0;
2744          }
2745
2746          if( gopEntry.m_numRefPics != 0 )
2747          {
2748            printf( "\nWarning: temporal references not possible for FrameI_l%d\n", layer );
2749            for( Int j = 0; j < m_GOPListMvc[layer][MAX_GOP].m_numRefPics; j++ )
2750            {
2751              gopEntry.m_referencePics[j] = 0;
2752            }
2753            gopEntry.m_numRefPics = 0;
2754          }
2755
2756          if( gopEntry.m_interRPSPrediction )
2757          {
2758            printf( "\nError: inter RPS prediction not possible for FrameI_l%d, must be 0\n", layer );
2759            bErrorIvpEnhV = true;
2760          }
2761
2762          if( gopEntry.m_sliceType == 'I' && gopEntry.m_numActiveRefLayerPics != 0 )
2763          {
2764            printf( "\nError: inter-layer prediction not possible for FrameI_l%d with slice type I, #IL_ref_pics must be 0\n", layer );
2765            bErrorIvpEnhV = true;
2766          }
2767
2768          if( gopEntry.m_numRefPicsActive > gopEntry.m_numActiveRefLayerPics )
2769          {
2770            gopEntry.m_numRefPicsActive = gopEntry.m_numActiveRefLayerPics;
2771          }
2772
2773          if( gopEntry.m_sliceType == 'P' )
2774          {
2775            if( gopEntry.m_numActiveRefLayerPics < 1 )
2776            {
2777              printf( "\nError: #IL_ref_pics must be at least one for FrameI_l%d with slice type P\n", layer );
2778              bErrorIvpEnhV = true;
2779            }
2780            else
2781            {
2782              for( Int j = 0; j < gopEntry.m_numActiveRefLayerPics; j++ )
2783              {
2784                if( gopEntry.m_interViewRefPosL[1][j] != -1 )
2785                {
2786                  printf( "\nError: inter-layer ref pos %d on L1 not possible for FrameI_l%d with slice type P\n", gopEntry.m_interViewRefPosL[1][j], layer );
2787                  bErrorIvpEnhV = true;
2788                }
2789              }
2790            }
2791          }
2792
2793          if( gopEntry.m_sliceType == 'B' && gopEntry.m_numActiveRefLayerPics < 1 )
2794          {
2795            printf( "\nError: #IL_ref_pics must be at least one for FrameI_l%d with slice type B\n", layer );
2796            bErrorIvpEnhV = true;
2797          }
2798        }
2799      }
2800    }
2801  }
2802  xConfirmPara( bErrorIvpEnhV, "Invalid inter-layer coding structure for enhancement layers given" );
2803
2804  // validate temporal coding structure
2805  if( !bErrorMvePoc && !bErrorIvpBase && !bErrorIvpEnhV )
2806  {
2807    for( Int layer = 0; layer < m_numberOfLayers; layer++ )
2808    {
2809      GOPEntry* m_GOPList            = m_GOPListMvc           [layer]; // It is not a member, but this name helps avoiding code duplication !!!
2810      Int&      m_extraRPSs          = m_extraRPSsMvc         [layer]; // It is not a member, but this name helps avoiding code duplication !!!
2811      Int&      m_maxTempLayer       = m_maxTempLayerMvc      [layer]; // It is not a member, but this name helps avoiding code duplication !!!
2812      Int*      m_maxDecPicBuffering = m_maxDecPicBufferingMvc[layer]; // It is not a member, but this name helps avoiding code duplication !!!
2813      Int*      m_numReorderPics     = m_numReorderPicsMvc    [layer]; // It is not a member, but this name helps avoiding code duplication !!!
2814#endif
2815
2816  /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure
2817   * This permits the ability to omit a GOP structure specification */
2818#if NH_MV
2819  if (m_iIntraPeriod[layer] == 1 && m_GOPList[0].m_POC == -1)
2820#else
2821  if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1)
2822#endif
2823  {
2824    m_GOPList[0] = GOPEntry();
2825    m_GOPList[0].m_QPFactor = 1;
2826    m_GOPList[0].m_betaOffsetDiv2 = 0;
2827    m_GOPList[0].m_tcOffsetDiv2 = 0;
2828    m_GOPList[0].m_POC = 1;
2829    m_GOPList[0].m_numRefPicsActive = 4;
2830  }
2831  else
2832  {
2833    xConfirmPara( m_intraConstraintFlag, "IntraConstraintFlag cannot be 1 for inter sequences");
2834  }
2835
2836  Bool verifiedGOP=false;
2837  Bool errorGOP=false;
2838  Int checkGOP=1;
2839  Int numRefs = m_isField ? 2 : 1;
2840  Int refList[MAX_NUM_REF_PICS+1];
2841  refList[0]=0;
2842  if(m_isField)
2843  {
2844    refList[1] = 1;
2845  }
2846  Bool isOK[MAX_GOP];
2847  for(Int i=0; i<MAX_GOP; i++)
2848  {
2849    isOK[i]=false;
2850  }
2851  Int numOK=0;
2852#if NH_MV
2853  xConfirmPara( m_iIntraPeriod[layer] >=0&&(m_iIntraPeriod[layer]%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" ); 
2854#else
2855  xConfirmPara( m_iIntraPeriod >=0&&(m_iIntraPeriod%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" );
2856#endif
2857
2858  for(Int i=0; i<m_iGOPSize; i++)
2859  {
2860    if(m_GOPList[i].m_POC==m_iGOPSize)
2861    {
2862      xConfirmPara( m_GOPList[i].m_temporalId!=0 , "The last frame in each GOP must have temporal ID = 0 " );
2863    }
2864  }
2865
2866#if NH_MV
2867  if ( (m_iIntraPeriod[layer] != 1) && !m_loopFilterOffsetInPPS && (!m_bLoopFilterDisable[layer]) )
2868#else
2869  if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && (!m_bLoopFilterDisable) )
2870#endif
2871  {
2872    for(Int i=0; i<m_iGOPSize; i++)
2873    {
2874      xConfirmPara( (m_GOPList[i].m_betaOffsetDiv2 + m_loopFilterBetaOffsetDiv2) < -6 || (m_GOPList[i].m_betaOffsetDiv2 + m_loopFilterBetaOffsetDiv2) > 6, "Loop Filter Beta Offset div. 2 for one of the GOP entries exceeds supported range (-6 to 6)" );
2875      xConfirmPara( (m_GOPList[i].m_tcOffsetDiv2 + m_loopFilterTcOffsetDiv2) < -6 || (m_GOPList[i].m_tcOffsetDiv2 + m_loopFilterTcOffsetDiv2) > 6, "Loop Filter Tc Offset div. 2 for one of the GOP entries exceeds supported range (-6 to 6)" );
2876    }
2877  }
2878
2879  m_extraRPSs=0;
2880  //start looping through frames in coding order until we can verify that the GOP structure is correct.
2881  while(!verifiedGOP&&!errorGOP)
2882  {
2883    Int curGOP = (checkGOP-1)%m_iGOPSize;
2884    Int curPOC = ((checkGOP-1)/m_iGOPSize)*m_iGOPSize + m_GOPList[curGOP].m_POC;
2885    if(m_GOPList[curGOP].m_POC<0)
2886    {
2887#if NH_MV
2888      printf("\nError: found fewer Reference Picture Sets than GOPSize for layer %d\n", layer );
2889#else
2890      printf("\nError: found fewer Reference Picture Sets than GOPSize\n");
2891#endif
2892      errorGOP=true;
2893    }
2894    else
2895    {
2896      //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
2897      Bool beforeI = false;
2898      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
2899      {
2900        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
2901        if(absPOC < 0)
2902        {
2903          beforeI=true;
2904        }
2905        else
2906        {
2907          Bool found=false;
2908          for(Int j=0; j<numRefs; j++)
2909          {
2910            if(refList[j]==absPOC)
2911            {
2912              found=true;
2913              for(Int k=0; k<m_iGOPSize; k++)
2914              {
2915                if(absPOC%m_iGOPSize == m_GOPList[k].m_POC%m_iGOPSize)
2916                {
2917                  if(m_GOPList[k].m_temporalId==m_GOPList[curGOP].m_temporalId)
2918                  {
2919                    m_GOPList[k].m_refPic = true;
2920                  }
2921                  m_GOPList[curGOP].m_usedByCurrPic[i]=m_GOPList[k].m_temporalId<=m_GOPList[curGOP].m_temporalId;
2922                }
2923              }
2924            }
2925          }
2926          if(!found)
2927          {
2928#if NH_MV
2929            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);
2930#else
2931            printf("\nError: ref pic %d is not available for GOP frame %d\n",m_GOPList[curGOP].m_referencePics[i],curGOP+1);
2932#endif
2933            errorGOP=true;
2934          }
2935        }
2936      }
2937      if(!beforeI&&!errorGOP)
2938      {
2939        //all ref frames were present
2940        if(!isOK[curGOP])
2941        {
2942          numOK++;
2943          isOK[curGOP]=true;
2944          if(numOK==m_iGOPSize)
2945          {
2946            verifiedGOP=true;
2947          }
2948        }
2949      }
2950      else
2951      {
2952        //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
2953        m_GOPList[m_iGOPSize+m_extraRPSs]=m_GOPList[curGOP];
2954        Int newRefs=0;
2955        for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
2956        {
2957          Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
2958          if(absPOC>=0)
2959          {
2960            m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[newRefs]=m_GOPList[curGOP].m_referencePics[i];
2961            m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[newRefs]=m_GOPList[curGOP].m_usedByCurrPic[i];
2962            newRefs++;
2963          }
2964        }
2965        Int numPrefRefs = m_GOPList[curGOP].m_numRefPicsActive;
2966
2967        for(Int offset = -1; offset>-checkGOP; offset--)
2968        {
2969          //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
2970          Int offGOP = (checkGOP-1+offset)%m_iGOPSize;
2971          Int offPOC = ((checkGOP-1+offset)/m_iGOPSize)*m_iGOPSize + m_GOPList[offGOP].m_POC;
2972          if(offPOC>=0&&m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId)
2973          {
2974            Bool newRef=false;
2975            for(Int i=0; i<numRefs; i++)
2976            {
2977              if(refList[i]==offPOC)
2978              {
2979                newRef=true;
2980              }
2981            }
2982            for(Int i=0; i<newRefs; i++)
2983            {
2984              if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[i]==offPOC-curPOC)
2985              {
2986                newRef=false;
2987              }
2988            }
2989            if(newRef)
2990            {
2991              Int insertPoint=newRefs;
2992              //this picture can be added, find appropriate place in list and insert it.
2993              if(m_GOPList[offGOP].m_temporalId==m_GOPList[curGOP].m_temporalId)
2994              {
2995                m_GOPList[offGOP].m_refPic = true;
2996              }
2997              for(Int j=0; j<newRefs; j++)
2998              {
2999                if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]<offPOC-curPOC||m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]>0)
3000                {
3001                  insertPoint = j;
3002                  break;
3003                }
3004              }
3005              Int prev = offPOC-curPOC;
3006              Int prevUsed = m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId;
3007              for(Int j=insertPoint; j<newRefs+1; j++)
3008              {
3009                Int newPrev = m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j];
3010                Int newUsed = m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j];
3011                m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]=prev;
3012                m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j]=prevUsed;
3013                prevUsed=newUsed;
3014                prev=newPrev;
3015              }
3016              newRefs++;
3017            }
3018          }
3019          if(newRefs>=numPrefRefs)
3020          {
3021            break;
3022          }
3023        }
3024        m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics=newRefs;
3025        m_GOPList[m_iGOPSize+m_extraRPSs].m_POC = curPOC;
3026        if (m_extraRPSs == 0)
3027        {
3028          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 0;
3029          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = 0;
3030        }
3031        else
3032        {
3033          Int rIdx =  m_iGOPSize + m_extraRPSs - 1;
3034          Int refPOC = m_GOPList[rIdx].m_POC;
3035          Int refPics = m_GOPList[rIdx].m_numRefPics;
3036          Int newIdc=0;
3037          for(Int i = 0; i<= refPics; i++)
3038          {
3039            Int deltaPOC = ((i != refPics)? m_GOPList[rIdx].m_referencePics[i] : 0);  // check if the reference abs POC is >= 0
3040            Int absPOCref = refPOC+deltaPOC;
3041            Int refIdc = 0;
3042            for (Int j = 0; j < m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics; j++)
3043            {
3044              if ( (absPOCref - curPOC) == m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j])
3045              {
3046                if (m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j])
3047                {
3048                  refIdc = 1;
3049                }
3050                else
3051                {
3052                  refIdc = 2;
3053                }
3054              }
3055            }
3056            m_GOPList[m_iGOPSize+m_extraRPSs].m_refIdc[newIdc]=refIdc;
3057            newIdc++;
3058          }
3059          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 1;
3060          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = newIdc;
3061          m_GOPList[m_iGOPSize+m_extraRPSs].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize+m_extraRPSs].m_POC;
3062        }
3063        curGOP=m_iGOPSize+m_extraRPSs;
3064        m_extraRPSs++;
3065      }
3066      numRefs=0;
3067      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
3068      {
3069        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
3070        if(absPOC >= 0)
3071        {
3072          refList[numRefs]=absPOC;
3073          numRefs++;
3074        }
3075      }
3076      refList[numRefs]=curPOC;
3077      numRefs++;
3078    }
3079    checkGOP++;
3080  }
3081  xConfirmPara(errorGOP,"Invalid GOP structure given");
3082  m_maxTempLayer = 1;
3083  for(Int i=0; i<m_iGOPSize; i++)
3084  {
3085    if(m_GOPList[i].m_temporalId >= m_maxTempLayer)
3086    {
3087      m_maxTempLayer = m_GOPList[i].m_temporalId+1;
3088    }
3089    xConfirmPara(m_GOPList[i].m_sliceType!='B' && m_GOPList[i].m_sliceType!='P' && m_GOPList[i].m_sliceType!='I', "Slice type must be equal to B or P or I");
3090  }
3091  for(Int i=0; i<MAX_TLAYER; i++)
3092  {
3093    m_numReorderPics[i] = 0;
3094    m_maxDecPicBuffering[i] = 1;
3095  }
3096  for(Int i=0; i<m_iGOPSize; i++)
3097  {
3098    if(m_GOPList[i].m_numRefPics+1 > m_maxDecPicBuffering[m_GOPList[i].m_temporalId])
3099    {
3100      m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics + 1;
3101    }
3102    Int highestDecodingNumberWithLowerPOC = 0;
3103    for(Int j=0; j<m_iGOPSize; j++)
3104    {
3105      if(m_GOPList[j].m_POC <= m_GOPList[i].m_POC)
3106      {
3107        highestDecodingNumberWithLowerPOC = j;
3108      }
3109    }
3110    Int numReorder = 0;
3111    for(Int j=0; j<highestDecodingNumberWithLowerPOC; j++)
3112    {
3113      if(m_GOPList[j].m_temporalId <= m_GOPList[i].m_temporalId &&
3114        m_GOPList[j].m_POC > m_GOPList[i].m_POC)
3115      {
3116        numReorder++;
3117      }
3118    }
3119    if(numReorder > m_numReorderPics[m_GOPList[i].m_temporalId])
3120    {
3121      m_numReorderPics[m_GOPList[i].m_temporalId] = numReorder;
3122    }
3123  }
3124  for(Int i=0; i<MAX_TLAYER-1; i++)
3125  {
3126    // a lower layer can not have higher value of m_numReorderPics than a higher layer
3127    if(m_numReorderPics[i+1] < m_numReorderPics[i])
3128    {
3129      m_numReorderPics[i+1] = m_numReorderPics[i];
3130    }
3131    // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] - 1, inclusive
3132    if(m_numReorderPics[i] > m_maxDecPicBuffering[i] - 1)
3133    {
3134      m_maxDecPicBuffering[i] = m_numReorderPics[i] + 1;
3135    }
3136    // a lower layer can not have higher value of m_uiMaxDecPicBuffering than a higher layer
3137    if(m_maxDecPicBuffering[i+1] < m_maxDecPicBuffering[i])
3138    {
3139      m_maxDecPicBuffering[i+1] = m_maxDecPicBuffering[i];
3140    }
3141  }
3142
3143  // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] -  1, inclusive
3144  if(m_numReorderPics[MAX_TLAYER-1] > m_maxDecPicBuffering[MAX_TLAYER-1] - 1)
3145  {
3146    m_maxDecPicBuffering[MAX_TLAYER-1] = m_numReorderPics[MAX_TLAYER-1] + 1;
3147  }
3148
3149  if(m_vuiParametersPresentFlag && m_bitstreamRestrictionFlag)
3150  {
3151    Int PicSizeInSamplesY =  m_iSourceWidth * m_iSourceHeight;
3152    if(tileFlag)
3153    {
3154      Int maxTileWidth = 0;
3155      Int maxTileHeight = 0;
3156      Int widthInCU = (m_iSourceWidth % m_uiMaxCUWidth) ? m_iSourceWidth/m_uiMaxCUWidth + 1: m_iSourceWidth/m_uiMaxCUWidth;
3157      Int heightInCU = (m_iSourceHeight % m_uiMaxCUHeight) ? m_iSourceHeight/m_uiMaxCUHeight + 1: m_iSourceHeight/m_uiMaxCUHeight;
3158      if(m_tileUniformSpacingFlag)
3159      {
3160        maxTileWidth = m_uiMaxCUWidth*((widthInCU+m_numTileColumnsMinus1)/(m_numTileColumnsMinus1+1));
3161        maxTileHeight = m_uiMaxCUHeight*((heightInCU+m_numTileRowsMinus1)/(m_numTileRowsMinus1+1));
3162        // if only the last tile-row is one treeblock higher than the others
3163        // the maxTileHeight becomes smaller if the last row of treeblocks has lower height than the others
3164        if(!((heightInCU-1)%(m_numTileRowsMinus1+1)))
3165        {
3166          maxTileHeight = maxTileHeight - m_uiMaxCUHeight + (m_iSourceHeight % m_uiMaxCUHeight);
3167        }
3168        // if only the last tile-column is one treeblock wider than the others
3169        // the maxTileWidth becomes smaller if the last column of treeblocks has lower width than the others
3170        if(!((widthInCU-1)%(m_numTileColumnsMinus1+1)))
3171        {
3172          maxTileWidth = maxTileWidth - m_uiMaxCUWidth + (m_iSourceWidth % m_uiMaxCUWidth);
3173        }
3174      }
3175      else // not uniform spacing
3176      {
3177        if(m_numTileColumnsMinus1<1)
3178        {
3179          maxTileWidth = m_iSourceWidth;
3180        }
3181        else
3182        {
3183          Int accColumnWidth = 0;
3184          for(Int col=0; col<(m_numTileColumnsMinus1); col++)
3185          {
3186            maxTileWidth = m_tileColumnWidth[col]>maxTileWidth ? m_tileColumnWidth[col]:maxTileWidth;
3187            accColumnWidth += m_tileColumnWidth[col];
3188          }
3189          maxTileWidth = (widthInCU-accColumnWidth)>maxTileWidth ? m_uiMaxCUWidth*(widthInCU-accColumnWidth):m_uiMaxCUWidth*maxTileWidth;
3190        }
3191        if(m_numTileRowsMinus1<1)
3192        {
3193          maxTileHeight = m_iSourceHeight;
3194        }
3195        else
3196        {
3197          Int accRowHeight = 0;
3198          for(Int row=0; row<(m_numTileRowsMinus1); row++)
3199          {
3200            maxTileHeight = m_tileRowHeight[row]>maxTileHeight ? m_tileRowHeight[row]:maxTileHeight;
3201            accRowHeight += m_tileRowHeight[row];
3202          }
3203          maxTileHeight = (heightInCU-accRowHeight)>maxTileHeight ? m_uiMaxCUHeight*(heightInCU-accRowHeight):m_uiMaxCUHeight*maxTileHeight;
3204        }
3205      }
3206      Int maxSizeInSamplesY = maxTileWidth*maxTileHeight;
3207      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/maxSizeInSamplesY-4;
3208    }
3209    else if(m_entropyCodingSyncEnabledFlag)
3210    {
3211      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/((2*m_iSourceHeight+m_iSourceWidth)*m_uiMaxCUHeight)-4;
3212    }
3213    else if(m_sliceMode == FIXED_NUMBER_OF_CTU)
3214    {
3215      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/(m_sliceArgument*m_uiMaxCUWidth*m_uiMaxCUHeight)-4;
3216    }
3217    else
3218    {
3219      m_minSpatialSegmentationIdc = 0;
3220    }
3221  }
3222
3223  if (m_toneMappingInfoSEIEnabled)
3224  {
3225    xConfirmPara( m_toneMapCodedDataBitDepth < 8 || m_toneMapCodedDataBitDepth > 14 , "SEIToneMapCodedDataBitDepth must be in rage 8 to 14");
3226    xConfirmPara( m_toneMapTargetBitDepth < 1 || (m_toneMapTargetBitDepth > 16 && m_toneMapTargetBitDepth < 255) , "SEIToneMapTargetBitDepth must be in rage 1 to 16 or equal to 255");
3227    xConfirmPara( m_toneMapModelId < 0 || m_toneMapModelId > 4 , "SEIToneMapModelId must be in rage 0 to 4");
3228    xConfirmPara( m_cameraIsoSpeedValue == 0, "SEIToneMapCameraIsoSpeedValue shall not be equal to 0");
3229    xConfirmPara( m_exposureIndexValue  == 0, "SEIToneMapExposureIndexValue shall not be equal to 0");
3230    xConfirmPara( m_extendedRangeWhiteLevel < 100, "SEIToneMapExtendedRangeWhiteLevel should be greater than or equal to 100");
3231    xConfirmPara( m_nominalBlackLevelLumaCodeValue >= m_nominalWhiteLevelLumaCodeValue, "SEIToneMapNominalWhiteLevelLumaCodeValue shall be greater than SEIToneMapNominalBlackLevelLumaCodeValue");
3232    xConfirmPara( m_extendedWhiteLevelLumaCodeValue < m_nominalWhiteLevelLumaCodeValue, "SEIToneMapExtendedWhiteLevelLumaCodeValue shall be greater than or equal to SEIToneMapNominalWhiteLevelLumaCodeValue");
3233  }
3234
3235  if (m_kneeSEIEnabled && !m_kneeSEICancelFlag)
3236  {
3237    xConfirmPara( m_kneeSEINumKneePointsMinus1 < 0 || m_kneeSEINumKneePointsMinus1 > 998, "SEIKneeFunctionNumKneePointsMinus1 must be in the range of 0 to 998");
3238    for ( UInt i=0; i<=m_kneeSEINumKneePointsMinus1; i++ )
3239    {
3240      xConfirmPara( m_kneeSEIInputKneePoint[i] < 1 || m_kneeSEIInputKneePoint[i] > 999, "SEIKneeFunctionInputKneePointValue must be in the range of 1 to 999");
3241      xConfirmPara( m_kneeSEIOutputKneePoint[i] < 0 || m_kneeSEIOutputKneePoint[i] > 1000, "SEIKneeFunctionInputKneePointValue must be in the range of 0 to 1000");
3242      if ( i > 0 )
3243      {
3244        xConfirmPara( m_kneeSEIInputKneePoint[i-1] >= m_kneeSEIInputKneePoint[i],  "The i-th SEIKneeFunctionInputKneePointValue must be greater than the (i-1)-th value");
3245        xConfirmPara( m_kneeSEIOutputKneePoint[i-1] > m_kneeSEIOutputKneePoint[i],  "The i-th SEIKneeFunctionOutputKneePointValue must be greater than or equal to the (i-1)-th value");
3246      }
3247    }
3248  }
3249
3250  if (m_chromaResamplingFilterSEIenabled)
3251  {
3252    xConfirmPara( (m_chromaFormatIDC == CHROMA_400 ), "chromaResamplingFilterSEI is not allowed to be present when ChromaFormatIDC is equal to zero (4:0:0)" );
3253    xConfirmPara(m_vuiParametersPresentFlag && m_chromaLocInfoPresentFlag && (m_chromaSampleLocTypeTopField != m_chromaSampleLocTypeBottomField ), "When chromaResamplingFilterSEI is enabled, ChromaSampleLocTypeTopField has to be equal to ChromaSampleLocTypeBottomField" );
3254  }
3255
3256  if ( m_RCEnableRateControl )
3257  {
3258    if ( m_RCForceIntraQP )
3259    {
3260      if ( m_RCInitialQP == 0 )
3261      {
3262        printf( "\nInitial QP for rate control is not specified. Reset not to use force intra QP!" );
3263        m_RCForceIntraQP = false;
3264      }
3265    }
3266    xConfirmPara( m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n" );
3267#if U0132_TARGET_BITS_SATURATION
3268#if NH_MV
3269    if ((m_RCCpbSaturationEnabled) && (m_level[0]!=Level::NONE) && (m_profile!=Profile::NONE))
3270    {
3271      UInt uiLevelIdx = (m_level[0] / 10) + (UInt)((m_level[0] % 10) / 3);    // (m_level / 30)*3 + ((m_level % 10) / 3);
3272      xConfirmPara(m_RCCpbSize > g_uiMaxCpbSize[m_levelTier[0]][uiLevelIdx], "RCCpbSize should be smaller than or equal to Max CPB size according to tier and level");
3273      xConfirmPara(m_RCInitialCpbFullness > 1, "RCInitialCpbFullness should be smaller than or equal to 1");
3274    }
3275#else
3276    if ((m_RCCpbSaturationEnabled) && (m_level!=Level::NONE) && (m_profile!=Profile::NONE))
3277    {
3278      UInt uiLevelIdx = (m_level / 10) + (UInt)((m_level % 10) / 3);    // (m_level / 30)*3 + ((m_level % 10) / 3);
3279      xConfirmPara(m_RCCpbSize > g_uiMaxCpbSize[m_levelTier][uiLevelIdx], "RCCpbSize should be smaller than or equal to Max CPB size according to tier and level");
3280      xConfirmPara(m_RCInitialCpbFullness > 1, "RCInitialCpbFullness should be smaller than or equal to 1");
3281    }
3282#endif
3283#endif
3284  }
3285#if U0132_TARGET_BITS_SATURATION
3286  else
3287  {
3288    xConfirmPara( m_RCCpbSaturationEnabled != 0, "Target bits saturation cannot be processed without Rate control" );
3289  }
3290#endif
3291
3292#if NH_MV
3293  // VPS VUI
3294  for(Int i = 0; i < MAX_VPS_OP_SETS_PLUS1; i++ )
3295  { 
3296    for (Int j = 0; j < MAX_TLAYER; j++)
3297    {   
3298      if ( j < m_avgBitRate        [i].size() ) xConfirmPara( m_avgBitRate[i][j]         <  0 || m_avgBitRate[i][j]         > 65535, "avg_bit_rate            must be more than or equal to     0 and less than 65536" );
3299      if ( j < m_maxBitRate        [i].size() ) xConfirmPara( m_maxBitRate[i][j]         <  0 || m_maxBitRate[i][j]         > 65535, "max_bit_rate            must be more than or equal to     0 and less than 65536" );
3300      if ( j < m_constantPicRateIdc[i].size() ) xConfirmPara( m_constantPicRateIdc[i][j] <  0 || m_constantPicRateIdc[i][j] >     3, "constant_pic_rate_idc   must be more than or equal to     0 and less than     4" );
3301      if ( j < m_avgPicRate        [i].size() ) xConfirmPara( m_avgPicRate[i][j]         <  0 || m_avgPicRate[i][j]         > 65535, "avg_pic_rate            must be more than or equal to     0 and less than 65536" );
3302    }
3303  }
3304  // todo: replace value of 100 with requirement in spec
3305  for(Int i = 0; i < MAX_NUM_LAYERS; i++ )
3306  { 
3307    for (Int j = 0; j < MAX_NUM_LAYERS; j++)
3308    {   
3309      if ( j < m_minSpatialSegmentOffsetPlus1[i].size() ) xConfirmPara( m_minSpatialSegmentOffsetPlus1[i][j] < 0 || m_minSpatialSegmentOffsetPlus1[i][j] >   100, "min_spatial_segment_offset_plus1 must be more than or equal to     0 and less than   101" );
3310      if ( j < m_minHorizontalCtuOffsetPlus1[i] .size() ) xConfirmPara( m_minHorizontalCtuOffsetPlus1[i][j]  < 0 || m_minHorizontalCtuOffsetPlus1[i][j]  >   100, "min_horizontal_ctu_offset_plus1  must be more than or equal to     0 and less than   101" );
3311    }
3312  }
3313#endif
3314
3315  xConfirmPara(!m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagForce, "CUTransquantBypassFlagForce cannot be 1 when TransquantBypassEnableFlag is 0");
3316
3317  xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2");
3318
3319  if (m_framePackingSEIEnabled)
3320  {
3321    xConfirmPara(m_framePackingSEIType < 3 || m_framePackingSEIType > 5 , "SEIFramePackingType must be in rage 3 to 5");
3322  }
3323#if NH_MV
3324  }
3325  }
3326#endif
3327
3328  if (m_segmentedRectFramePackingSEIEnabled)
3329  {
3330    xConfirmPara(m_framePackingSEIEnabled , "SEISegmentedRectFramePacking must be 0 when SEIFramePacking is 1");
3331  }
3332
3333  if((m_numTileColumnsMinus1 <= 0) && (m_numTileRowsMinus1 <= 0) && m_tmctsSEIEnabled)
3334  {
3335    printf("Warning: SEITempMotionConstrainedTileSets is set to false to disable temporal motion-constrained tile sets SEI message because there are no tiles enabled.\n");
3336    m_tmctsSEIEnabled = false;
3337  }
3338
3339  if(m_timeCodeSEIEnabled)
3340  {
3341    xConfirmPara(m_timeCodeSEINumTs > MAX_TIMECODE_SEI_SETS, "Number of time sets cannot exceed 3");
3342  }
3343
3344#undef xConfirmPara
3345  if (check_failed)
3346  {
3347    exit(EXIT_FAILURE);
3348  }
3349}
3350
3351const TChar *profileToString(const Profile::Name profile)
3352{
3353  static const UInt numberOfProfiles = sizeof(strToProfile)/sizeof(*strToProfile);
3354
3355  for (UInt profileIndex = 0; profileIndex < numberOfProfiles; profileIndex++)
3356  {
3357    if (strToProfile[profileIndex].value == profile)
3358    {
3359      return strToProfile[profileIndex].str;
3360    }
3361  }
3362
3363  //if we get here, we didn't find this profile in the list - so there is an error
3364  std::cerr << "ERROR: Unknown profile \"" << profile << "\" in profileToString" << std::endl;
3365  assert(false);
3366  exit(1);
3367  return "";
3368}
3369
3370Void TAppEncCfg::xPrintParameter()
3371{
3372  printf("\n");
3373#if NH_MV
3374  for( Int layer = 0; layer < m_numberOfLayers; layer++)
3375  {
3376    printf("Input File %i                     : %s\n", layer, m_pchInputFileList[layer]);
3377  }
3378#else
3379  printf("Input          File                    : %s\n", m_inputFileName.c_str()          );
3380#endif
3381  printf("Bitstream      File                    : %s\n", m_bitstreamFileName.c_str()      );
3382#if NH_MV
3383  for( Int layer = 0; layer < m_numberOfLayers; layer++)
3384  {
3385    printf("Reconstruction File %i            : %s\n", layer, m_pchReconFileList[layer]);
3386  }
3387#else
3388  printf("Reconstruction File                    : %s\n", m_reconFileName.c_str()          );
3389#endif
3390#if NH_MV
3391  xPrintParaVector( "NuhLayerId"     , m_layerIdInNuh ); 
3392  if ( m_targetEncLayerIdList.size() > 0)
3393  {
3394    xPrintParaVector( "TargetEncLayerIdList"     , m_targetEncLayerIdList ); 
3395  }
3396  xPrintParaVector( "ViewIdVal"     , m_viewId ); 
3397  xPrintParaVector( "ViewOrderIdx"  , m_viewOrderIndex ); 
3398  xPrintParaVector( "AuxId", m_auxId );
3399#endif
3400#if NH_3D_VSO || NH_3D
3401  xPrintParaVector( "DepthLayerFlag", m_depthFlag ); 
3402  printf("Coded Camera Param. Precision     : %d\n", m_iCodedCamParPrecision); 
3403#endif
3404#if NH_MV 
3405  xPrintParaVector( "QP"               , m_fQP                ); 
3406  xPrintParaVector( "LoopFilterDisable", m_bLoopFilterDisable ); 
3407  xPrintParaVector( "SAO"              , m_bUseSAO            ); 
3408#endif
3409
3410  printf("Real     Format                   : %dx%d %dHz\n", m_iSourceWidth - m_confWinLeft - m_confWinRight, m_iSourceHeight - m_confWinTop - m_confWinBottom, m_iFrameRate );
3411  printf("Internal Format                   : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate );
3412  printf("Sequence PSNR output              : %s\n", (m_printMSEBasedSequencePSNR ? "Linear average, MSE-based" : "Linear average only") );
3413  printf("Sequence MSE output               : %s\n", (m_printSequenceMSE ? "Enabled" : "Disabled") );
3414  printf("Frame MSE output                  : %s\n", (m_printFrameMSE    ? "Enabled" : "Disabled") );
3415  printf("Cabac-zero-word-padding           : %s\n", (m_cabacZeroWordPaddingEnabled? "Enabled" : "Disabled") );
3416  if (m_isField)
3417  {
3418    printf("Frame/Field                       : Field based coding\n");
3419    printf("Field index                       : %u - %d (%d fields)\n", m_FrameSkip, m_FrameSkip+m_framesToBeEncoded-1, m_framesToBeEncoded );
3420    printf("Field Order                       : %s field first\n", m_isTopFieldFirst?"Top":"Bottom");
3421
3422  }
3423  else
3424  {
3425    printf("Frame/Field                       : Frame based coding\n");
3426    printf("Frame index                       : %u - %d (%d frames)\n", m_FrameSkip, m_FrameSkip+m_framesToBeEncoded-1, m_framesToBeEncoded );
3427  }
3428#if NH_MV
3429  printf("Profile                           :");
3430  for (Int i = 0; i < m_profiles.size(); i++)
3431  {
3432    Profile::Name m_profile = m_profiles[i];
3433
3434#endif
3435    if (m_profile == Profile::MAINREXT)
3436    {
3437    ExtendedProfileName validProfileName;
3438    if (m_onePictureOnlyConstraintFlag)
3439    {
3440      validProfileName = m_bitDepthConstraint == 8 ? MAIN_444_STILL_PICTURE : (m_bitDepthConstraint == 16 ? MAIN_444_16_STILL_PICTURE : NONE);
3441    }
3442    else
3443    {
3444      const UInt intraIdx = m_intraConstraintFlag ? 1:0;
3445      const UInt bitDepthIdx = (m_bitDepthConstraint == 8 ? 0 : (m_bitDepthConstraint ==10 ? 1 : (m_bitDepthConstraint == 12 ? 2 : (m_bitDepthConstraint == 16 ? 3 : 4 ))));
3446      const UInt chromaFormatIdx = UInt(m_chromaFormatConstraint);
3447      validProfileName = (bitDepthIdx > 3 || chromaFormatIdx>3) ? NONE : validRExtProfileNames[intraIdx][bitDepthIdx][chromaFormatIdx];
3448    }
3449      std::string rextSubProfile;
3450      if (validProfileName!=NONE)
3451      {
3452        rextSubProfile=enumToString(strToExtendedProfile, sizeof(strToExtendedProfile)/sizeof(*strToExtendedProfile), validProfileName);
3453      }
3454      if (rextSubProfile == "main_444_16")
3455      {
3456        rextSubProfile="main_444_16 [NON STANDARD]";
3457      }
3458#if NH_MV
3459      printf(" %s (%s) ", profileToString(m_profile), (rextSubProfile.empty())?"INVALID REXT PROFILE":rextSubProfile.c_str() );
3460#else
3461      printf("Profile                           : %s (%s)\n", profileToString(m_profile), (rextSubProfile.empty())?"INVALID REXT PROFILE":rextSubProfile.c_str() );
3462#endif
3463    }
3464    else
3465    {
3466#if NH_MV
3467      printf(" %s ", profileToString(m_profile) );
3468#else
3469      printf("Profile                           : %s\n", profileToString(m_profile) );
3470#endif
3471    }
3472#if NH_MV   
3473  }
3474  printf("\n");
3475#endif
3476
3477  printf("CU size / depth / total-depth     : %d / %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth, m_uiMaxTotalCUDepth );
3478  printf("RQT trans. size (min / max)       : %d / %d\n", 1 << m_uiQuadtreeTULog2MinSize, 1 << m_uiQuadtreeTULog2MaxSize );
3479  printf("Max RQT depth inter               : %d\n", m_uiQuadtreeTUMaxDepthInter);
3480  printf("Max RQT depth intra               : %d\n", m_uiQuadtreeTUMaxDepthIntra);
3481  printf("Min PCM size                      : %d\n", 1 << m_uiPCMLog2MinSize);
3482  printf("Motion search range               : %d\n", m_iSearchRange );
3483#if NH_MV
3484  printf("Disp search range restriction     : %d\n", m_bUseDisparitySearchRangeRestriction );
3485  printf("Vertical disp search range        : %d\n", m_iVerticalDisparitySearchRange );
3486#endif
3487#if NH_MV
3488  xPrintParaVector( "Intra period", m_iIntraPeriod );
3489#else
3490  printf("Intra period                      : %d\n", m_iIntraPeriod );
3491#endif
3492  printf("Decoding refresh type             : %d\n", m_iDecodingRefreshType );
3493#if !NH_MV
3494  printf("QP                                : %5.2f\n", m_fQP );
3495#endif
3496  printf("Max dQP signaling depth           : %d\n", m_iMaxCuDQPDepth);
3497
3498  printf("Cb QP Offset                      : %d\n", m_cbQpOffset   );
3499  printf("Cr QP Offset                      : %d\n", m_crQpOffset);
3500  printf("QP adaptation                     : %d (range=%d)\n", m_bUseAdaptiveQP, (m_bUseAdaptiveQP ? m_iQPAdaptationRange : 0) );
3501  printf("GOP size                          : %d\n", m_iGOPSize );
3502  printf("Input bit depth                   : (Y:%d, C:%d)\n", m_inputBitDepth[CHANNEL_TYPE_LUMA], m_inputBitDepth[CHANNEL_TYPE_CHROMA] );
3503  printf("MSB-extended bit depth            : (Y:%d, C:%d)\n", m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA], m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] );
3504  printf("Internal bit depth                : (Y:%d, C:%d)\n", m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA] );
3505  printf("PCM sample bit depth              : (Y:%d, C:%d)\n", m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA] : m_internalBitDepth[CHANNEL_TYPE_LUMA],
3506                                                               m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] : m_internalBitDepth[CHANNEL_TYPE_CHROMA] );
3507  printf("Intra reference smoothing         : %s\n", (m_enableIntraReferenceSmoothing          ? "Enabled" : "Disabled") );
3508  printf("diff_cu_chroma_qp_offset_depth         : %d\n", m_diffCuChromaQpOffsetDepth);
3509  printf("extended_precision_processing_flag     : %s\n", (m_extendedPrecisionProcessingFlag         ? "Enabled" : "Disabled") );
3510  printf("implicit_rdpcm_enabled_flag            : %s\n", (m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT] ? "Enabled" : "Disabled") );
3511  printf("explicit_rdpcm_enabled_flag            : %s\n", (m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT] ? "Enabled" : "Disabled") );
3512  printf("transform_skip_rotation_enabled_flag   : %s\n", (m_transformSkipRotationEnabledFlag        ? "Enabled" : "Disabled") );
3513  printf("transform_skip_context_enabled_flag    : %s\n", (m_transformSkipContextEnabledFlag         ? "Enabled" : "Disabled") );
3514  printf("cross_component_prediction_enabled_flag: %s\n", (m_crossComponentPredictionEnabledFlag     ? (m_reconBasedCrossCPredictionEstimate ? "Enabled (reconstructed-residual-based estimate)" : "Enabled (encoder-side-residual-based estimate)") : "Disabled") );
3515  printf("high_precision_offsets_enabled_flag    : %s\n", (m_highPrecisionOffsetsEnabledFlag         ? "Enabled" : "Disabled") );
3516  printf("persistent_rice_adaptation_enabled_flag: %s\n", (m_persistentRiceAdaptationEnabledFlag     ? "Enabled" : "Disabled") );
3517  printf("cabac_bypass_alignment_enabled_flag    : %s\n", (m_cabacBypassAlignmentEnabledFlag         ? "Enabled" : "Disabled") );
3518#if NH_MV
3519  Bool anySAO = false; 
3520  IntAry1d saoOffBitShiftL;
3521  IntAry1d saoOffBitShiftC;
3522
3523  for (Int i = 0; i < m_numberOfLayers; i++)
3524  {
3525    if ( m_bUseSAO[i] )
3526    {
3527      anySAO = true; 
3528      saoOffBitShiftL.push_back( m_log2SaoOffsetScale[i][CHANNEL_TYPE_LUMA] );
3529      saoOffBitShiftC.push_back( m_log2SaoOffsetScale[i][CHANNEL_TYPE_CHROMA] );
3530    }
3531    else
3532    {
3533      saoOffBitShiftL.push_back( -1 );
3534      saoOffBitShiftC.push_back( -1 );
3535    }
3536  }
3537  if (anySAO)
3538  {
3539    xPrintParaVector( "Sao Luma Offset bit shifts"  , saoOffBitShiftL );
3540    xPrintParaVector( "Sao Chroma Offset bit shifts", saoOffBitShiftC );
3541  }
3542#else
3543  if (m_bUseSAO)
3544  {
3545    printf("log2_sao_offset_scale_luma             : %d\n", m_log2SaoOffsetScale[CHANNEL_TYPE_LUMA]);
3546    printf("log2_sao_offset_scale_chroma           : %d\n", m_log2SaoOffsetScale[CHANNEL_TYPE_CHROMA]);
3547  }
3548#endif
3549
3550  switch (m_costMode)
3551  {
3552    case COST_STANDARD_LOSSY:               printf("Cost function:                    : Lossy coding (default)\n"); break;
3553    case COST_SEQUENCE_LEVEL_LOSSLESS:      printf("Cost function:                    : Sequence_level_lossless coding\n"); break;
3554    case COST_LOSSLESS_CODING:              printf("Cost function:                    : Lossless coding with fixed QP of %d\n", LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP); break;
3555    case COST_MIXED_LOSSLESS_LOSSY_CODING:  printf("Cost function:                    : Mixed_lossless_lossy coding with QP'=%d for lossless evaluation\n", LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP_PRIME); break;
3556    default:                                printf("Cost function:                    : Unknown\n"); break;
3557  }
3558
3559  printf("RateControl                       : %d\n", m_RCEnableRateControl );
3560  printf("WPMethod                               : %d\n", Int(m_weightedPredictionMethod));
3561
3562  if(m_RCEnableRateControl)
3563  {
3564    printf("TargetBitrate                     : %d\n", m_RCTargetBitrate );
3565    printf("KeepHierarchicalBit               : %d\n", m_RCKeepHierarchicalBit );
3566    printf("LCULevelRC                        : %d\n", m_RCLCULevelRC );
3567    printf("UseLCUSeparateModel               : %d\n", m_RCUseLCUSeparateModel );
3568    printf("InitialQP                         : %d\n", m_RCInitialQP );
3569    printf("ForceIntraQP                      : %d\n", m_RCForceIntraQP );
3570
3571#if U0132_TARGET_BITS_SATURATION
3572    printf("CpbSaturation                          : %d\n", m_RCCpbSaturationEnabled );
3573    if (m_RCCpbSaturationEnabled)
3574    {
3575      printf("CpbSize                                : %d\n", m_RCCpbSize);
3576      printf("InitalCpbFullness                      : %.2f\n", m_RCInitialCpbFullness);
3577    }
3578#endif
3579
3580#if KWU_RC_MADPRED_E0227
3581    printf("Depth based MAD prediction   : %d\n", m_depthMADPred);
3582#endif
3583#if KWU_RC_VIEWRC_E0227
3584    printf("View-wise Rate control       : %d\n", m_viewWiseRateCtrl);
3585    if(m_viewWiseRateCtrl)
3586    {
3587
3588      printf("ViewWiseTargetBits           : ");
3589      for (Int i = 0 ; i < m_iNumberOfViews ; i++)
3590        printf("%d ", m_viewTargetBits[i]);
3591      printf("\n");
3592    }
3593    else
3594    {
3595      printf("TargetBitrate                : %d\n", m_RCTargetBitrate );
3596    }
3597#endif
3598
3599  }
3600
3601  printf("Max Num Merge Candidates          : %d\n", m_maxNumMergeCand);
3602#if NH_3D_VSO || NH_3D
3603  printf("BaseViewCameraNumbers             : %s\n", m_pchBaseViewCameraNumbers ); 
3604  printf("Coded Camera Param. Precision     : %d\n", m_iCodedCamParPrecision);
3605#endif
3606#if NH_3D_VSO
3607  printf("Force use of Lambda Scale         : %d\n", m_bForceLambdaScaleVSO );
3608
3609  if ( m_bUseVSO )
3610  {   
3611    printf("VSO Lambda Scale                  : %5.2f\n", m_dLambdaScaleVSO );
3612    printf("VSO Mode                          : %d\n",    m_uiVSOMode       );
3613    printf("VSO Config                        : %s\n",    m_pchVSOConfig    );
3614    printf("VSO Negative Distortion           : %d\n",    m_bAllowNegDist ? 1 : 0);
3615    printf("VSO LS Table                      : %d\n",    m_bVSOLSTable ? 1 : 0);
3616    printf("VSO Estimated VSD                 : %d\n",    m_bUseEstimatedVSD ? 1 : 0);
3617    printf("VSO Early Skip                    : %d\n",    m_bVSOEarlySkip ? 1 : 0);   
3618    if ( m_bUseWVSO )
3619    {
3620      printf("Dist. Weights (VSO/VSD/SAD)       : %d/%d/%d\n ", m_iVSOWeight, m_iVSDWeight, m_iDWeight );   
3621    }   
3622  }
3623#endif //HHI_VSO
3624  printf("\n");
3625#if NH_MV
3626  printf("TOOL CFG General: ");
3627#else
3628  printf("TOOL CFG: ");
3629#endif
3630  printf("IBD:%d ", ((m_internalBitDepth[CHANNEL_TYPE_LUMA] > m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA]) || (m_internalBitDepth[CHANNEL_TYPE_CHROMA] > m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA])));
3631  printf("HAD:%d ", m_bUseHADME           );
3632  printf("RDQ:%d ", m_useRDOQ            );
3633  printf("RDQTS:%d ", m_useRDOQTS        );
3634  printf("RDpenalty:%d ", m_rdPenalty  );
3635  printf("SQP:%d ", m_uiDeltaQpRD         );
3636  printf("ASR:%d ", m_bUseASR             );
3637  printf("MinSearchWindow:%d ", m_minSearchWindow        );
3638  printf("RestrictMESampling:%d ", m_bRestrictMESampling );
3639  printf("FEN:%d ", Int(m_fastInterSearchMode)           );
3640  printf("ECU:%d ", m_bUseEarlyCU         );
3641  printf("FDM:%d ", m_useFastDecisionForMerge );
3642  printf("CFM:%d ", m_bUseCbfFastMode         );
3643  printf("ESD:%d ", m_useEarlySkipDetection  );
3644  printf("RQT:%d ", 1     );
3645  printf("TransformSkip:%d ",     m_useTransformSkip              );
3646  printf("TransformSkipFast:%d ", m_useTransformSkipFast       );
3647  printf("TransformSkipLog2MaxSize:%d ", m_log2MaxTransformSkipBlockSize);
3648  printf("Slice: M=%d ", Int(m_sliceMode));
3649  if (m_sliceMode!=NO_SLICES)
3650  {
3651    printf("A=%d ", m_sliceArgument);
3652  }
3653  printf("SliceSegment: M=%d ",m_sliceSegmentMode);
3654  if (m_sliceSegmentMode!=NO_SLICES)
3655  {
3656    printf("A=%d ", m_sliceSegmentArgument);
3657  }
3658  printf("CIP:%d ", m_bUseConstrainedIntraPred);
3659#if !NH_MV
3660  printf("SAO:%d ", (m_bUseSAO)?(1):(0));
3661#endif
3662  printf("PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0);
3663
3664  if (m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagForce)
3665  {
3666    printf("TransQuantBypassEnabled: =1");
3667  }
3668  else
3669  {
3670    printf("TransQuantBypassEnabled:%d ", (m_TransquantBypassEnableFlag)? 1:0 );
3671  }
3672
3673  printf("WPP:%d ", (Int)m_useWeightedPred);
3674  printf("WPB:%d ", (Int)m_useWeightedBiPred);
3675  printf("PME:%d ", m_log2ParallelMergeLevel);
3676  const Int iWaveFrontSubstreams = m_entropyCodingSyncEnabledFlag ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1;
3677  printf(" WaveFrontSynchro:%d WaveFrontSubstreams:%d", m_entropyCodingSyncEnabledFlag?1:0, iWaveFrontSubstreams);
3678  printf(" ScalingList:%d ", m_useScalingListId );
3679  printf("TMVPMode:%d ", m_TMVPModeId     );
3680#if ADAPTIVE_QP_SELECTION
3681  printf("AQpS:%d", m_bUseAdaptQpSelect   );
3682#endif
3683
3684  printf(" SignBitHidingFlag:%d ", m_signHideFlag);
3685  printf("RecalQP:%d", m_recalculateQPAccordingToLambda ? 1 : 0 );
3686#if NH_3D_VSO
3687  printf(" VSO:%d ", m_bUseVSO   );
3688  printf("WVSO:%d ", m_bUseWVSO ); 
3689#endif
3690#if NH_3D_QTL
3691  printf( "QTL:%d "                  , m_bUseQTL);
3692#endif
3693#if NH_3D
3694  printf( "IlluCompEnable:%d "       , m_abUseIC);
3695  printf( "IlluCompLowLatencyEnc:%d ",  m_bUseLowLatencyICEnc);
3696  printf( "DLT:%d ", m_useDLT );
3697
3698
3699  printf( "IvMvPred:%d %d "            , m_ivMvPredFlag[0] ? 1 : 0, m_ivMvPredFlag[1]  ? 1 : 0);
3700  printf( "IvMvScaling:%d %d "         , m_ivMvScalingFlag[0] ? 1 : 0 , m_ivMvScalingFlag[1]  ? 1 : 0);
3701
3702  printf( "Log2SubPbSizeMinus3:%d "    , m_log2SubPbSizeMinus3            );
3703  printf( "IvResPred:%d "              , m_ivResPredFlag          ? 1 : 0 );
3704  printf( "DepthRefinement:%d "        , m_depthRefinementFlag    ? 1 : 0 );
3705  printf( "ViewSynthesisPred:%d "      , m_viewSynthesisPredFlag  ? 1 : 0 );
3706  printf( "DepthBasedBlkPart:%d "      , m_depthBasedBlkPartFlag  ? 1 : 0 );
3707  printf( "Mpi:%d "                    , m_mpiFlag                ? 1 : 0 );
3708  printf( "Log2MpiSubPbSizeMinus3:%d " , m_log2MpiSubPbSizeMinus3         );
3709  printf( "IntraContour:%d "           , m_intraContourFlag       ? 1 : 0 );
3710  printf( "IntraWedge:%d "             , m_intraWedgeFlag         ? 1 : 0 );
3711  printf( "IntraSdc:%d "               , m_intraSdcFlag           ? 1 : 0 );
3712  printf( "QtPred:%d "                 , m_qtPredFlag             ? 1 : 0 );
3713  printf( "InterSdc:%d "               , m_interSdcFlag           ? 1 : 0 );
3714  printf( "DepthIntraSkip:%d "         , m_depthIntraSkipFlag     ? 1 : 0 );
3715#endif
3716
3717  printf("\n\n");
3718
3719  fflush(stdout);
3720}
3721
3722Bool confirmPara(Bool bflag, const TChar* message)
3723{
3724  if (!bflag)
3725  {
3726    return false;
3727  }
3728
3729  printf("Error: %s\n",message);
3730  return true;
3731}
3732
3733//! \}
Note: See TracBrowser for help on using the repository browser.