source: 3DVCSoftware/branches/HTM-15.2-dev/source/App/TAppEncoder/TAppEncCfg.cpp @ 1370

Last change on this file since 1370 was 1362, checked in by tech, 9 years ago

Align macros

  • Property svn:eol-style set to native
File size: 207.7 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-2015, 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#endif
180
181#if NH_3D
182#if NH_3D_VSO
183  if (  m_pchVSOConfig != NULL)
184  {
185    free (  m_pchVSOConfig );
186  }
187#endif
188  if ( m_pchCameraParameterFile != NULL )
189  {
190    free ( m_pchCameraParameterFile ); 
191  }
192
193  if ( m_pchBaseViewCameraNumbers != NULL )
194  {
195    free ( m_pchBaseViewCameraNumbers ); 
196  }
197#endif
198}
199
200Void TAppEncCfg::create()
201{
202}
203
204Void TAppEncCfg::destroy()
205{
206}
207
208
209#if NH_MV_SEI
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
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_layerIdsInSets              , IntAry1d(1,0) , MAX_VPS_OP_SETS_PLUS1      ,   "LayerIds of 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#if !NH_MV_SEI
1281  ("SubBitstreamPropSEIEnabled",                      m_subBistreamPropSEIEnabled,    false                     ,"Enable signaling of sub-bitstream property SEI message")
1282  ("SEISubBitstreamNumAdditionalSubStreams",          m_sbPropNumAdditionalSubStreams,0                         ,"Number of substreams for which additional information is signalled")
1283  ("SEISubBitstreamSubBitstreamMode",                 m_sbPropSubBitstreamMode,       IntAry1d (1,0)            ,"Specifies mode of generation of the i-th sub-bitstream (0 or 1)")
1284  ("SEISubBitstreamOutputLayerSetIdxToVps",           m_sbPropOutputLayerSetIdxToVps, IntAry1d (1,0)            ,"Specifies output layer set index of the i-th sub-bitstream ")
1285  ("SEISubBitstreamHighestSublayerId",                m_sbPropHighestSublayerId,      IntAry1d (1,0)            ,"Specifies highest TemporalId of the i-th sub-bitstream")
1286  ("SEISubBitstreamAvgBitRate",                       m_sbPropAvgBitRate,             IntAry1d (1,0)            ,"Specifies average bit rate of the i-th sub-bitstream")
1287  ("SEISubBitstreamMaxBitRate",                       m_sbPropMaxBitRate,             IntAry1d (1,0)            ,"Specifies maximum bit rate of the i-th sub-bitstream")
1288#else
1289  ("SeiCfgFileName_%d",                               m_seiCfgFileNames,             (TChar *) 0 ,MAX_NUM_SEIS , "SEI cfg file name %d")
1290#endif
1291  ("OutputVpsInfo",                                   m_outputVpsInfo,                false                     ,"Output information about the layer dependencies and layer sets")
1292#endif
1293#if NH_3D
1294/* Camera parameters */ 
1295  ("Depth420OutputFlag",                              m_depth420OutputFlag,           true                     , "Output depth layers in 4:2:0 ") 
1296  ("CameraParameterFile,cpf",                         m_pchCameraParameterFile,    (TChar *) 0                 , "Camera Parameter File Name")
1297  ("BaseViewCameraNumbers",                           m_pchBaseViewCameraNumbers,  (TChar *) 0                 , "Numbers of base views")
1298  ("CodedCamParsPrecision",                           m_iCodedCamParPrecision,      STD_CAM_PARAMETERS_PRECISION, "precision for coding of camera parameters (in units of 2^(-x) luma samples)" )
1299
1300#if NH_3D_VSO
1301  /* View Synthesis Optimization */
1302  ("VSOConfig",                                       m_pchVSOConfig            , (TChar *) 0                   ,"VSO configuration")
1303  ("VSO",                                             m_bUseVSO                 , false                         ,"Use VSO" )   
1304  ("VSOMode",                                         m_uiVSOMode               , (UInt)   4                    ,"VSO Mode")
1305  ("LambdaScaleVSO",                                  m_dLambdaScaleVSO         , (Double) 1                    ,"Lambda Scaling for VSO")
1306  ("VSOLSTable",                                      m_bVSOLSTable             , true                          ,"Depth QP dependent video/depth rate allocation by Lagrange multiplier" )     
1307  ("ForceLambdaScaleVSO",                             m_bForceLambdaScaleVSO    , false                         ,"Force using Lambda Scale VSO also in non-VSO-Mode")
1308  ("AllowNegDist",                                    m_bAllowNegDist           , true                          ,"Allow negative Distortion in VSO")
1309                                                                                                             
1310  ("UseEstimatedVSD",                                 m_bUseEstimatedVSD        , true                          ,"Model based VSD estimation instead of rendering based for some encoder decisions" )     
1311  ("VSOEarlySkip",                                    m_bVSOEarlySkip           , true                          ,"Early skip of VSO computation if synthesis error assumed to be zero" )     
1312                                                                                                               
1313  ("WVSO",                                            m_bUseWVSO                , true                          ,"Use depth fidelity term for VSO" )
1314  ("VSOWeight",                                       m_iVSOWeight              , 10                            ,"Synthesized View Distortion Change weight" )
1315  ("VSDWeight",                                       m_iVSDWeight              , 1                             ,"View Synthesis Distortion estimate weight" )
1316  ("DWeight",                                         m_iDWeight                , 1                             ,"Depth Distortion weight" )
1317#endif //HHI_VSO
1318/* 3D- HEVC Tools */                                                           
1319  ("QTL"                   ,                          m_bUseQTL                 , true                          , "Use depth quad tree limitation (encoder only)" )
1320  ("IvMvPredFlag"          ,                          m_ivMvPredFlag            , BoolAry1d(2,true)             , "Inter-view motion prediction"              )
1321  ("IvMvScalingFlag"       ,                          m_ivMvScalingFlag         , BoolAry1d(2,true)             , "Inter-view motion vector scaling"          )
1322  ("Log2SubPbSizeMinus3"   ,                          m_log2SubPbSizeMinus3     , 0                             , "Log2 minus 3 of sub Pb size"               )
1323  ("IvResPredFlag"         ,                          m_ivResPredFlag           , true                          , "Inter-view residual prediction"            )
1324  ("DepthRefinementFlag"   ,                          m_depthRefinementFlag     , true                          , "Depth to refine disparity"                 )
1325  ("ViewSynthesisPredFlag" ,                          m_viewSynthesisPredFlag   , true                          , "View synthesis prediction"                 )
1326  ("DepthBasedBlkPartFlag" ,                          m_depthBasedBlkPartFlag   , true                          , "Depth base block partitioning"             )
1327  ("MpiFlag"               ,                          m_mpiFlag                 , true                          , "Motion inheritance from texture to depth"  )
1328  ("Log2MpiSubPbSizeMinus3",                          m_log2MpiSubPbSizeMinus3  , 0                             , "Log2 minus 3 of sub Pb size for MPI"       )
1329  ("IntraContourFlag"      ,                          m_intraContourFlag        , true                          , "Intra contour mode"                        )
1330  ("IntraWedgeFlag"        ,                          m_intraWedgeFlag          , true                          , "Intra wedge mode and segmental depth DCs"  )
1331  ("IntraSdcFlag"          ,                          m_intraSdcFlag            , true                          , "Intra depth DCs"                           )
1332  ("QtPredFlag"            ,                          m_qtPredFlag              , true                          , "Quad tree prediction from texture to depth")
1333  ("InterSdcFlag"          ,                          m_interSdcFlag            , true                          , "Inter depth DCs"                           )
1334  ("DepthIntraSkip"        ,                          m_depthIntraSkipFlag      , true                          , "Depth intra skip mode"                     )
1335  ("DLT"                   ,                          m_useDLT                  , true                          , "Depth lookup table"                        )
1336  ("IlluCompEnable"        ,                          m_abUseIC                 , true                          , "Enable illumination compensation"          )
1337  ("IlluCompLowLatencyEnc" ,                          m_bUseLowLatencyICEnc     , false                         , "Enable low-latency illumination compensation encoding")
1338#endif //NH_3D
1339   
1340  ;
1341
1342#if NH_MV
1343  // parse coding structure
1344  for( Int k = 0; k < MAX_NUM_LAYERS; k++ )
1345  {
1346    m_GOPListMvc.push_back( new GOPEntry[MAX_GOP + 1] );
1347    if( k == 0 )
1348    {
1349      m_GOPListMvc[0][0].m_sliceType = 'I'; 
1350      for( Int i = 1; i < MAX_GOP + 1; i++ ) 
1351      {
1352        std::ostringstream cOSS;
1353        cOSS<<"Frame"<<i;
1354        opts.addOptions()( cOSS.str(), m_GOPListMvc[k][i-1], GOPEntry() );
1355        if ( i != 1 )
1356        {
1357          opts.opt_list.back()->opt->opt_duplicate = true; 
1358        }       
1359      }
1360    }
1361    else
1362    {
1363      std::ostringstream cOSS1;
1364      cOSS1<<"FrameI"<<"_l"<<k;
1365
1366      opts.addOptions()(cOSS1.str(), m_GOPListMvc[k][MAX_GOP], GOPEntry());
1367      if ( k > 1 )
1368      {
1369        opts.opt_list.back()->opt->opt_duplicate = true; 
1370      }       
1371
1372
1373  for(Int i=1; i<MAX_GOP+1; i++)
1374  {
1375        std::ostringstream cOSS2;
1376        cOSS2<<"Frame"<<i<<"_l"<<k;
1377        opts.addOptions()(cOSS2.str(), m_GOPListMvc[k][i-1], GOPEntry());
1378        if ( i != 1 || k > 0 )
1379        {
1380          opts.opt_list.back()->opt->opt_duplicate = true; 
1381        }       
1382      }
1383    }
1384  }
1385#else
1386  for(Int i=1; i<MAX_GOP+1; i++)
1387  {
1388    std::ostringstream cOSS;
1389    cOSS<<"Frame"<<i;
1390    opts.addOptions()(cOSS.str(), m_GOPList[i-1], GOPEntry());
1391  }
1392#endif
1393  po::setDefaults(opts);
1394  po::ErrorReporter err;
1395  const list<const TChar*>& argv_unhandled = po::scanArgv(opts, argc, (const TChar**) argv, err);
1396
1397  for (list<const TChar*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
1398  {
1399    fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
1400  }
1401
1402  if (argc == 1 || do_help)
1403  {
1404    /* argc == 1: no options have been specified */
1405    po::doHelp(cout, opts);
1406    return false;
1407  }
1408
1409  if (err.is_errored)
1410  {
1411    if (!warnUnknowParameter)
1412    {
1413      /* error report has already been printed on stderr */
1414      return false;
1415    }
1416  }
1417
1418  /*
1419   * Set any derived parameters
1420   */
1421  m_adIntraLambdaModifier = cfg_adIntraLambdaModifier.values;
1422  if(m_isField)
1423  {
1424    //Frame height
1425    m_iSourceHeightOrg = m_iSourceHeight;
1426    //Field height
1427    m_iSourceHeight = m_iSourceHeight >> 1;
1428    //number of fields to encode
1429    m_framesToBeEncoded *= 2;
1430  }
1431
1432  if( !m_tileUniformSpacingFlag && m_numTileColumnsMinus1 > 0 )
1433  {
1434    if (cfg_ColumnWidth.values.size() > m_numTileColumnsMinus1)
1435    {
1436      printf( "The number of columns whose width are defined is larger than the allowed number of columns.\n" );
1437      exit( EXIT_FAILURE );
1438    }
1439    else if (cfg_ColumnWidth.values.size() < m_numTileColumnsMinus1)
1440    {
1441      printf( "The width of some columns is not defined.\n" );
1442      exit( EXIT_FAILURE );
1443    }
1444    else
1445    {
1446      m_tileColumnWidth.resize(m_numTileColumnsMinus1);
1447      for(UInt i=0; i<cfg_ColumnWidth.values.size(); i++)
1448      {
1449        m_tileColumnWidth[i]=cfg_ColumnWidth.values[i];
1450      }
1451    }
1452  }
1453  else
1454  {
1455    m_tileColumnWidth.clear();
1456  }
1457
1458  if( !m_tileUniformSpacingFlag && m_numTileRowsMinus1 > 0 )
1459  {
1460    if (cfg_RowHeight.values.size() > m_numTileRowsMinus1)
1461    {
1462      printf( "The number of rows whose height are defined is larger than the allowed number of rows.\n" );
1463      exit( EXIT_FAILURE );
1464    }
1465    else if (cfg_RowHeight.values.size() < m_numTileRowsMinus1)
1466    {
1467      printf( "The height of some rows is not defined.\n" );
1468      exit( EXIT_FAILURE );
1469    }
1470    else
1471    {
1472      m_tileRowHeight.resize(m_numTileRowsMinus1);
1473      for(UInt i=0; i<cfg_RowHeight.values.size(); i++)
1474      {
1475        m_tileRowHeight[i]=cfg_RowHeight.values[i];
1476      }
1477    }
1478  }
1479  else
1480  {
1481    m_tileRowHeight.clear();
1482  }
1483
1484  /* rules for input, output and internal bitdepths as per help text */
1485  if (m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ] == 0)
1486  {
1487    m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ] = m_inputBitDepth      [CHANNEL_TYPE_LUMA  ];
1488  }
1489  if (m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] == 0)
1490  {
1491    m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] = m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ];
1492  }
1493  if (m_internalBitDepth   [CHANNEL_TYPE_LUMA  ] == 0)
1494  {
1495    m_internalBitDepth   [CHANNEL_TYPE_LUMA  ] = m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA  ];
1496  }
1497  if (m_internalBitDepth   [CHANNEL_TYPE_CHROMA] == 0)
1498  {
1499    m_internalBitDepth   [CHANNEL_TYPE_CHROMA] = m_internalBitDepth   [CHANNEL_TYPE_LUMA  ];
1500  }
1501  if (m_inputBitDepth      [CHANNEL_TYPE_CHROMA] == 0)
1502  {
1503    m_inputBitDepth      [CHANNEL_TYPE_CHROMA] = m_inputBitDepth      [CHANNEL_TYPE_LUMA  ];
1504  }
1505  if (m_outputBitDepth     [CHANNEL_TYPE_LUMA  ] == 0)
1506  {
1507    m_outputBitDepth     [CHANNEL_TYPE_LUMA  ] = m_internalBitDepth   [CHANNEL_TYPE_LUMA  ];
1508  }
1509  if (m_outputBitDepth     [CHANNEL_TYPE_CHROMA] == 0)
1510  {
1511    m_outputBitDepth     [CHANNEL_TYPE_CHROMA] = m_internalBitDepth   [CHANNEL_TYPE_CHROMA];
1512  }
1513
1514  m_InputChromaFormatIDC = numberToChromaFormat(tmpInputChromaFormat);
1515  m_chromaFormatIDC      = ((tmpChromaFormat == 0) ? (m_InputChromaFormatIDC) : (numberToChromaFormat(tmpChromaFormat)));
1516
1517
1518  assert(tmpWeightedPredictionMethod>=0 && tmpWeightedPredictionMethod<=WP_PER_PICTURE_WITH_HISTOGRAM_AND_PER_COMPONENT_AND_CLIPPING_AND_EXTENSION);
1519  if (!(tmpWeightedPredictionMethod>=0 && tmpWeightedPredictionMethod<=WP_PER_PICTURE_WITH_HISTOGRAM_AND_PER_COMPONENT_AND_CLIPPING_AND_EXTENSION))
1520  {
1521    exit(EXIT_FAILURE);
1522  }
1523  m_weightedPredictionMethod = WeightedPredictionMethod(tmpWeightedPredictionMethod);
1524
1525  assert(tmpFastInterSearchMode>=0 && tmpFastInterSearchMode<=FASTINTERSEARCH_MODE3);
1526  if (tmpFastInterSearchMode<0 || tmpFastInterSearchMode>FASTINTERSEARCH_MODE3)
1527  {
1528    exit(EXIT_FAILURE);
1529  }
1530  m_fastInterSearchMode = FastInterSearchMode(tmpFastInterSearchMode);
1531
1532  assert(tmpMotionEstimationSearchMethod>=0 && tmpMotionEstimationSearchMethod<MESEARCH_NUMBER_OF_METHODS);
1533  if (tmpMotionEstimationSearchMethod<0 || tmpMotionEstimationSearchMethod>=MESEARCH_NUMBER_OF_METHODS)
1534  {
1535    exit(EXIT_FAILURE);
1536  }
1537  m_motionEstimationSearchMethod=MESearchMethod(tmpMotionEstimationSearchMethod);
1538
1539#if NH_MV
1540  // parse PTL
1541  Bool anyEmpty = false; 
1542  if( cfg_profiles.empty() )
1543  {
1544#if NH_3D
1545    cfg_profiles = string("main main 3d-main");
1546#else
1547    cfg_profiles = string("main main multiview-main");   
1548#endif
1549    fprintf(stderr, "\nWarning: No profiles given, using defaults: %s", cfg_profiles.c_str() );
1550    anyEmpty = true; 
1551  }
1552
1553  if( cfg_levels.empty() )
1554  {
1555    cfg_levels = string("5.1 5.1 5.1");
1556    fprintf(stderr, "\nWarning: No levels given, using defaults: %s", cfg_levels.c_str() );
1557    anyEmpty = true; 
1558  }
1559
1560  if( cfg_tiers.empty() )
1561  {
1562    cfg_tiers = string("main main main");
1563    fprintf(stderr, "\nWarning: No tiers given, using defaults: %s", cfg_tiers.c_str());
1564    anyEmpty = true; 
1565  }
1566
1567  if( m_inblFlag.empty() )
1568  {
1569    fprintf(stderr, "\nWarning: No inblFlags given, using defaults:");
1570    for( Int i = 0; i < 3; i++)
1571    {
1572      m_inblFlag.push_back( false );
1573      fprintf(stderr," %d", (Int) m_inblFlag[i]);
1574    }
1575    anyEmpty = true; 
1576  }   
1577
1578  if ( anyEmpty )
1579  {
1580    fprintf( stderr, "\n" );
1581  }
1582
1583  xReadStrToEnum( cfg_profiles, extendedProfiles  ); 
1584  xReadStrToEnum( cfg_levels,   m_level     ); 
1585  xReadStrToEnum( cfg_tiers ,   m_levelTier ); 
1586
1587
1588#if NH_MV
1589  m_profiles.resize( extendedProfiles.size()); 
1590
1591  for (Int i = 0; i < m_profiles.size(); i++)
1592  {
1593    Profile::Name& m_profile             = m_profiles      [i]; 
1594    ExtendedProfileName& extendedProfile = extendedProfiles[i]; 
1595#endif
1596#endif
1597
1598  if (extendedProfile >= 1000 && extendedProfile <= 12316)
1599    {
1600      m_profile = Profile::MAINREXT;
1601      if (m_bitDepthConstraint != 0 || tmpConstraintChromaFormat != 0)
1602      {
1603        fprintf(stderr, "Error: The bit depth and chroma format constraints are not used when an explicit RExt profile is specified\n");
1604        exit(EXIT_FAILURE);
1605      }
1606      m_bitDepthConstraint     = (extendedProfile%100);
1607    m_intraConstraintFlag          = ((extendedProfile%10000)>=2000);
1608    m_onePictureOnlyConstraintFlag = (extendedProfile >= 10000);
1609      switch ((extendedProfile/100)%10)
1610      {
1611      case 0:  tmpConstraintChromaFormat=400; break;
1612      case 1:  tmpConstraintChromaFormat=420; break;
1613      case 2:  tmpConstraintChromaFormat=422; break;
1614      default: tmpConstraintChromaFormat=444; break;
1615      }
1616    }
1617    else
1618    {
1619      m_profile = Profile::Name(extendedProfile);
1620    }
1621
1622    if (m_profile == Profile::HIGHTHROUGHPUTREXT )
1623    {
1624      if (m_bitDepthConstraint == 0)
1625      {
1626        m_bitDepthConstraint = 16;
1627      }
1628      m_chromaFormatConstraint = (tmpConstraintChromaFormat == 0) ? CHROMA_444 : numberToChromaFormat(tmpConstraintChromaFormat);
1629    }
1630    else if (m_profile == Profile::MAINREXT)
1631    {
1632      if (m_bitDepthConstraint == 0 && tmpConstraintChromaFormat == 0)
1633      {
1634        // produce a valid combination, if possible.
1635      const Bool bUsingGeneralRExtTools  = m_transformSkipRotationEnabledFlag        ||
1636                                           m_transformSkipContextEnabledFlag         ||
1637                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT] ||
1638                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT] ||
1639          !m_enableIntraReferenceSmoothing         ||
1640                                           m_persistentRiceAdaptationEnabledFlag     ||
1641                                           m_log2MaxTransformSkipBlockSize!=2;
1642      const Bool bUsingChromaQPAdjustment= m_diffCuChromaQpOffsetDepth >= 0;
1643      const Bool bUsingExtendedPrecision = m_extendedPrecisionProcessingFlag;
1644      if (m_onePictureOnlyConstraintFlag)
1645      {
1646        m_chromaFormatConstraint = CHROMA_444;
1647        if (m_intraConstraintFlag != true)
1648        {
1649          fprintf(stderr, "Error: Intra constraint flag must be true when one_picture_only_constraint_flag is true\n");
1650          exit(EXIT_FAILURE);
1651        }
1652        const Int maxBitDepth = m_chromaFormatIDC==CHROMA_400 ? m_internalBitDepth[CHANNEL_TYPE_LUMA] : std::max(m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA]);
1653        m_bitDepthConstraint = maxBitDepth>8 ? 16:8;
1654      }
1655      else
1656      {
1657        m_chromaFormatConstraint = NUM_CHROMA_FORMAT;
1658        automaticallySelectRExtProfile(bUsingGeneralRExtTools,
1659          bUsingChromaQPAdjustment,
1660          bUsingExtendedPrecision,
1661          m_intraConstraintFlag,
1662          m_bitDepthConstraint,
1663          m_chromaFormatConstraint,
1664          m_chromaFormatIDC==CHROMA_400 ? m_internalBitDepth[CHANNEL_TYPE_LUMA] : std::max(m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA]),
1665          m_chromaFormatIDC);
1666      }
1667    }
1668      else if (m_bitDepthConstraint == 0 || tmpConstraintChromaFormat == 0)
1669      {
1670        fprintf(stderr, "Error: The bit depth and chroma format constraints must either both be specified or both be configured automatically\n");
1671        exit(EXIT_FAILURE);
1672      }
1673      else
1674      {
1675        m_chromaFormatConstraint = numberToChromaFormat(tmpConstraintChromaFormat);
1676      }
1677    }
1678    else
1679    {
1680      m_chromaFormatConstraint = (tmpConstraintChromaFormat == 0) ? m_chromaFormatIDC : numberToChromaFormat(tmpConstraintChromaFormat);
1681      m_bitDepthConstraint = (m_profile == Profile::MAIN10?10:8);
1682    }
1683#if NH_MV
1684  }
1685
1686  if ( m_numberOfLayers != 0 && ( m_profiles[0] != Profile::MAIN || m_profiles[1] != Profile::MAIN )  )
1687  {
1688    fprintf(stderr, "Error: The base layer must conform to the Main profile for Multilayer coding.\n");
1689    exit(EXIT_FAILURE);
1690  }
1691#endif
1692
1693
1694  m_inputColourSpaceConvert = stringToInputColourSpaceConvert(inputColourSpaceConvert, true);
1695
1696  switch (m_conformanceWindowMode)
1697  {
1698  case 0:
1699    {
1700      // no conformance or padding
1701      m_confWinLeft = m_confWinRight = m_confWinTop = m_confWinBottom = 0;
1702      m_aiPad[1] = m_aiPad[0] = 0;
1703      break;
1704    }
1705  case 1:
1706    {
1707      // automatic padding to minimum CU size
1708      Int minCuSize = m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1);
1709      if (m_iSourceWidth % minCuSize)
1710      {
1711        m_aiPad[0] = m_confWinRight  = ((m_iSourceWidth / minCuSize) + 1) * minCuSize - m_iSourceWidth;
1712        m_iSourceWidth  += m_confWinRight;
1713      }
1714      if (m_iSourceHeight % minCuSize)
1715      {
1716        m_aiPad[1] = m_confWinBottom = ((m_iSourceHeight / minCuSize) + 1) * minCuSize - m_iSourceHeight;
1717        m_iSourceHeight += m_confWinBottom;
1718        if ( m_isField )
1719        {
1720          m_iSourceHeightOrg += m_confWinBottom << 1;
1721          m_aiPad[1] = m_confWinBottom << 1;
1722        }
1723      }
1724      if (m_aiPad[0] % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0)
1725      {
1726        fprintf(stderr, "Error: picture width is not an integer multiple of the specified chroma subsampling\n");
1727        exit(EXIT_FAILURE);
1728      }
1729      if (m_aiPad[1] % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0)
1730      {
1731        fprintf(stderr, "Error: picture height is not an integer multiple of the specified chroma subsampling\n");
1732        exit(EXIT_FAILURE);
1733      }
1734      break;
1735    }
1736  case 2:
1737    {
1738      //padding
1739      m_iSourceWidth  += m_aiPad[0];
1740      m_iSourceHeight += m_aiPad[1];
1741      m_confWinRight  = m_aiPad[0];
1742      m_confWinBottom = m_aiPad[1];
1743      break;
1744    }
1745  case 3:
1746    {
1747      // conformance
1748      if ((m_confWinLeft == 0) && (m_confWinRight == 0) && (m_confWinTop == 0) && (m_confWinBottom == 0))
1749      {
1750        fprintf(stderr, "Warning: Conformance window enabled, but all conformance window parameters set to zero\n");
1751      }
1752      if ((m_aiPad[1] != 0) || (m_aiPad[0]!=0))
1753      {
1754        fprintf(stderr, "Warning: Conformance window enabled, padding parameters will be ignored\n");
1755      }
1756      m_aiPad[1] = m_aiPad[0] = 0;
1757      break;
1758    }
1759  }
1760
1761  if (tmpSliceMode<0 || tmpSliceMode>=Int(NUMBER_OF_SLICE_CONSTRAINT_MODES))
1762  {
1763    fprintf(stderr, "Error: bad slice mode\n");
1764    exit(EXIT_FAILURE);
1765  }
1766  m_sliceMode = SliceConstraint(tmpSliceMode);
1767  if (tmpSliceSegmentMode<0 || tmpSliceSegmentMode>=Int(NUMBER_OF_SLICE_CONSTRAINT_MODES))
1768  {
1769    fprintf(stderr, "Error: bad slice segment mode\n");
1770    exit(EXIT_FAILURE);
1771  }
1772  m_sliceSegmentMode = SliceConstraint(tmpSliceSegmentMode);
1773
1774  if (tmpDecodedPictureHashSEIMappedType<0 || tmpDecodedPictureHashSEIMappedType>=Int(NUMBER_OF_HASHTYPES))
1775  {
1776    fprintf(stderr, "Error: bad checksum mode\n");
1777    exit(EXIT_FAILURE);
1778  }
1779  // Need to map values to match those of the SEI message:
1780  if (tmpDecodedPictureHashSEIMappedType==0)
1781  {
1782    m_decodedPictureHashSEIType=HASHTYPE_NONE;
1783  }
1784  else
1785  {
1786    m_decodedPictureHashSEIType=HashType(tmpDecodedPictureHashSEIMappedType-1);
1787  }
1788
1789  // allocate slice-based dQP values
1790#if NH_MV
1791  for (Int i = (Int)m_layerIdInNuh.size(); i < m_numberOfLayers; i++ )
1792  {
1793    m_layerIdInNuh.push_back( i == 0 ? 0 : m_layerIdInNuh[ i - 1 ] + 1 ); 
1794  }
1795  xResizeVector( m_layerIdInNuh ); 
1796
1797  xResizeVector( m_viewOrderIndex    ); 
1798
1799  std::vector<Int> uniqueViewOrderIndices; 
1800  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
1801  {   
1802    Bool isIn = false; 
1803    for ( Int i = 0 ; i < uniqueViewOrderIndices.size(); i++ )
1804    {
1805      isIn = isIn || ( m_viewOrderIndex[ layer ] == uniqueViewOrderIndices[ i ] ); 
1806    }
1807    if ( !isIn ) 
1808    {
1809      uniqueViewOrderIndices.push_back( m_viewOrderIndex[ layer ] ); 
1810    } 
1811  }
1812  m_iNumberOfViews = (Int) uniqueViewOrderIndices.size(); 
1813  xResizeVector( m_auxId );
1814
1815#if NH_3D
1816  xResizeVector( m_depthFlag ); 
1817#endif
1818  xResizeVector( m_fQP ); 
1819
1820  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
1821  {
1822    m_aidQP.push_back( new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ] );
1823    ::memset( m_aidQP[layer], 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );
1824
1825    // handling of floating-point QP values
1826    // if QP is not integer, sequence is split into two sections having QP and QP+1
1827    m_iQP.push_back((Int)( m_fQP[layer] ));
1828    if ( m_iQP[layer] < m_fQP[layer] )
1829    {
1830      Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP[layer] - m_iQP[layer])*m_framesToBeEncoded + 0.5 );
1831
1832      iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
1833      for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
1834      {
1835        m_aidQP[layer][i] = 1;
1836      }
1837    }
1838
1839    for(UInt ch=0; ch<MAX_NUM_CHANNEL_TYPE; ch++)
1840    {
1841      if (saoOffsetBitShift[ch]<0)
1842      {
1843        if (m_internalBitDepth[ch]>10)
1844        {
1845          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) ) );
1846        }
1847        else
1848        {
1849          m_log2SaoOffsetScale[layer][ch]=0;
1850        }
1851      }
1852      else
1853      {
1854        m_log2SaoOffsetScale[layer][ch]=UInt(saoOffsetBitShift[ch]);
1855      }
1856    }
1857  }
1858
1859  xResizeVector( m_bLoopFilterDisable ); 
1860  xResizeVector( m_bUseSAO ); 
1861  xResizeVector( m_iIntraPeriod ); 
1862  xResizeVector( m_tilesInUseFlag ); 
1863  xResizeVector( m_loopFilterNotAcrossTilesFlag ); 
1864  xResizeVector( m_wppInUseFlag ); 
1865
1866  for (Int olsIdx = 0; olsIdx < m_vpsNumLayerSets + m_numAddLayerSets + (Int) m_outputLayerSetIdx.size(); olsIdx++)
1867  {   
1868    m_altOutputLayerFlag.push_back( false );     
1869  }
1870#else
1871  m_aidQP = new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ];
1872  ::memset( m_aidQP, 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );
1873
1874  // handling of floating-point QP values
1875  // if QP is not integer, sequence is split into two sections having QP and QP+1
1876  m_iQP = (Int)( m_fQP );
1877  if ( m_iQP < m_fQP )
1878  {
1879    Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP - m_iQP)*m_framesToBeEncoded + 0.5 );
1880
1881    iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
1882    for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
1883    {
1884      m_aidQP[i] = 1;
1885    }
1886  }
1887
1888  for(UInt ch=0; ch<MAX_NUM_CHANNEL_TYPE; ch++)
1889  {
1890    if (saoOffsetBitShift[ch]<0)
1891    {
1892      if (m_internalBitDepth[ch]>10)
1893      {
1894        m_log2SaoOffsetScale[ch]=UInt(Clip3<Int>(0, m_internalBitDepth[ch]-10, Int(m_internalBitDepth[ch]-10 + 0.165*m_iQP - 3.22 + 0.5) ) );
1895      }
1896      else
1897      {
1898        m_log2SaoOffsetScale[ch]=0;
1899      }
1900    }
1901    else
1902    {
1903      m_log2SaoOffsetScale[ch]=UInt(saoOffsetBitShift[ch]);
1904    }
1905  }
1906
1907#endif
1908
1909  // reading external dQP description from file
1910  if ( !m_dQPFileName.empty() )
1911  {
1912    FILE* fpt=fopen( m_dQPFileName.c_str(), "r" );
1913    if ( fpt )
1914    {
1915#if NH_MV
1916      for( Int layer = 0; layer < m_numberOfLayers; layer++ )
1917      {
1918#endif
1919      Int iValue;
1920      Int iPOC = 0;
1921      while ( iPOC < m_framesToBeEncoded )
1922      {
1923        if ( fscanf(fpt, "%d", &iValue ) == EOF )
1924        {
1925          break;
1926        }
1927#if NH_MV
1928        m_aidQP[layer][ iPOC ] = iValue;
1929        iPOC++;
1930      }
1931#else
1932        m_aidQP[ iPOC ] = iValue;
1933        iPOC++;
1934#endif
1935      }
1936      fclose(fpt);
1937    }
1938  }
1939
1940#if NH_MV_SEI
1941  xParseSeiCfg(); 
1942#endif
1943  if( m_masteringDisplay.colourVolumeSEIEnabled )
1944  {
1945    for(UInt idx=0; idx<6; idx++)
1946    {
1947      m_masteringDisplay.primaries[idx/2][idx%2] = UShort((cfg_DisplayPrimariesCode.values.size() > idx) ? cfg_DisplayPrimariesCode.values[idx] : 0);
1948    }
1949    for(UInt idx=0; idx<2; idx++)
1950    {
1951      m_masteringDisplay.whitePoint[idx] = UShort((cfg_DisplayWhitePointCode.values.size() > idx) ? cfg_DisplayWhitePointCode.values[idx] : 0);
1952    }
1953  }
1954   
1955  if( m_toneMappingInfoSEIEnabled && !m_toneMapCancelFlag )
1956  {
1957    if( m_toneMapModelId == 2 && !cfg_startOfCodedInterval.values.empty() )
1958    {
1959      const UInt num = 1u<< m_toneMapTargetBitDepth;
1960      m_startOfCodedInterval = new Int[num];
1961      for(UInt i=0; i<num; i++)
1962      {
1963        m_startOfCodedInterval[i] = cfg_startOfCodedInterval.values.size() > i ? cfg_startOfCodedInterval.values[i] : 0;
1964      }
1965    }
1966    else
1967    {
1968      m_startOfCodedInterval = NULL;
1969    }
1970    if( ( m_toneMapModelId == 3 ) && ( m_numPivots > 0 ) )
1971    {
1972      if( !cfg_codedPivotValue.values.empty() && !cfg_targetPivotValue.values.empty() )
1973      {
1974        m_codedPivotValue  = new Int[m_numPivots];
1975        m_targetPivotValue = new Int[m_numPivots];
1976        for(UInt i=0; i<m_numPivots; i++)
1977        {
1978          m_codedPivotValue[i]  = cfg_codedPivotValue.values.size()  > i ? cfg_codedPivotValue.values [i] : 0;
1979          m_targetPivotValue[i] = cfg_targetPivotValue.values.size() > i ? cfg_targetPivotValue.values[i] : 0;
1980        }
1981      }
1982    }
1983    else
1984    {
1985      m_codedPivotValue = NULL;
1986      m_targetPivotValue = NULL;
1987    }
1988  }
1989
1990  if( m_kneeSEIEnabled && !m_kneeSEICancelFlag )
1991  {
1992    assert ( m_kneeSEINumKneePointsMinus1 >= 0 && m_kneeSEINumKneePointsMinus1 < 999 );
1993    m_kneeSEIInputKneePoint  = new Int[m_kneeSEINumKneePointsMinus1+1];
1994    m_kneeSEIOutputKneePoint = new Int[m_kneeSEINumKneePointsMinus1+1];
1995    for(Int i=0; i<(m_kneeSEINumKneePointsMinus1+1); i++)
1996    {
1997      m_kneeSEIInputKneePoint[i]  = cfg_kneeSEIInputKneePointValue.values.size()  > i ? cfg_kneeSEIInputKneePointValue.values[i]  : 1;
1998      m_kneeSEIOutputKneePoint[i] = cfg_kneeSEIOutputKneePointValue.values.size() > i ? cfg_kneeSEIOutputKneePointValue.values[i] : 0;
1999    }
2000  }
2001
2002  if(m_timeCodeSEIEnabled)
2003  {
2004    for(Int i = 0; i < m_timeCodeSEINumTs && i < MAX_TIMECODE_SEI_SETS; i++)
2005    {
2006      m_timeSetArray[i].clockTimeStampFlag    = cfg_timeCodeSeiTimeStampFlag        .values.size()>i ? cfg_timeCodeSeiTimeStampFlag        .values [i] : false;
2007      m_timeSetArray[i].numUnitFieldBasedFlag = cfg_timeCodeSeiNumUnitFieldBasedFlag.values.size()>i ? cfg_timeCodeSeiNumUnitFieldBasedFlag.values [i] : 0;
2008      m_timeSetArray[i].countingType          = cfg_timeCodeSeiCountingType         .values.size()>i ? cfg_timeCodeSeiCountingType         .values [i] : 0;
2009      m_timeSetArray[i].fullTimeStampFlag     = cfg_timeCodeSeiFullTimeStampFlag    .values.size()>i ? cfg_timeCodeSeiFullTimeStampFlag    .values [i] : 0;
2010      m_timeSetArray[i].discontinuityFlag     = cfg_timeCodeSeiDiscontinuityFlag    .values.size()>i ? cfg_timeCodeSeiDiscontinuityFlag    .values [i] : 0;
2011      m_timeSetArray[i].cntDroppedFlag        = cfg_timeCodeSeiCntDroppedFlag       .values.size()>i ? cfg_timeCodeSeiCntDroppedFlag       .values [i] : 0;
2012      m_timeSetArray[i].numberOfFrames        = cfg_timeCodeSeiNumberOfFrames       .values.size()>i ? cfg_timeCodeSeiNumberOfFrames       .values [i] : 0;
2013      m_timeSetArray[i].secondsValue          = cfg_timeCodeSeiSecondsValue         .values.size()>i ? cfg_timeCodeSeiSecondsValue         .values [i] : 0;
2014      m_timeSetArray[i].minutesValue          = cfg_timeCodeSeiMinutesValue         .values.size()>i ? cfg_timeCodeSeiMinutesValue         .values [i] : 0;
2015      m_timeSetArray[i].hoursValue            = cfg_timeCodeSeiHoursValue           .values.size()>i ? cfg_timeCodeSeiHoursValue           .values [i] : 0;
2016      m_timeSetArray[i].secondsFlag           = cfg_timeCodeSeiSecondsFlag          .values.size()>i ? cfg_timeCodeSeiSecondsFlag          .values [i] : 0;
2017      m_timeSetArray[i].minutesFlag           = cfg_timeCodeSeiMinutesFlag          .values.size()>i ? cfg_timeCodeSeiMinutesFlag          .values [i] : 0;
2018      m_timeSetArray[i].hoursFlag             = cfg_timeCodeSeiHoursFlag            .values.size()>i ? cfg_timeCodeSeiHoursFlag            .values [i] : 0;
2019      m_timeSetArray[i].timeOffsetLength      = cfg_timeCodeSeiTimeOffsetLength     .values.size()>i ? cfg_timeCodeSeiTimeOffsetLength     .values [i] : 0;
2020      m_timeSetArray[i].timeOffsetValue       = cfg_timeCodeSeiTimeOffsetValue      .values.size()>i ? cfg_timeCodeSeiTimeOffsetValue      .values [i] : 0;
2021    }
2022  }
2023
2024#if NH_3D
2025#if NH_3D_VSO
2026  // Table base optimization
2027  // Q&D
2028  Double adLambdaScaleTable[] = 
2029  {  0.031250, 0.031639, 0.032029, 0.032418, 0.032808, 0.033197, 0.033586, 0.033976, 0.034365, 0.034755, 
2030  0.035144, 0.035533, 0.035923, 0.036312, 0.036702, 0.037091, 0.037480, 0.037870, 0.038259, 0.038648, 
2031  0.039038, 0.039427, 0.039817, 0.040206, 0.040595, 0.040985, 0.041374, 0.041764, 0.042153, 0.042542, 
2032  0.042932, 0.043321, 0.043711, 0.044100, 0.044194, 0.053033, 0.061872, 0.070711, 0.079550, 0.088388, 
2033  0.117851, 0.147314, 0.176777, 0.235702, 0.294628, 0.353553, 0.471405, 0.589256, 0.707107, 0.707100, 
2034  0.753550, 0.800000 
2035  }; 
2036  if ( m_bUseVSO && m_bVSOLSTable )
2037  {
2038    Int firstDepthLayer = -1; 
2039    for (Int layer = 0; layer < m_numberOfLayers; layer++ )
2040    {
2041      if ( m_depthFlag[ layer ])
2042      {
2043        firstDepthLayer = layer;
2044        break; 
2045      }
2046    }
2047    AOT( firstDepthLayer == -1 );
2048    AOT( (m_iQP[firstDepthLayer] < 0) || (m_iQP[firstDepthLayer] > 51));
2049    m_dLambdaScaleVSO *= adLambdaScaleTable[m_iQP[firstDepthLayer]]; 
2050  }
2051  if ( m_bUseVSO && m_uiVSOMode == 4)
2052  {
2053    m_cRenModStrParser.setString( m_iNumberOfViews, m_pchVSOConfig );
2054    m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
2055      m_internalBitDepth[ CHANNEL_TYPE_LUMA],
2056      (UInt)m_iCodedCamParPrecision,
2057      m_FrameSkip,
2058      (UInt)m_framesToBeEncoded,
2059      m_pchCameraParameterFile,
2060      m_pchBaseViewCameraNumbers,
2061      NULL,
2062      m_cRenModStrParser.getSynthViews(),
2063      LOG2_DISP_PREC_LUT );
2064  }
2065  else if ( m_bUseVSO && m_uiVSOMode != 4 )
2066  {
2067    m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
2068      m_internalBitDepth[ CHANNEL_TYPE_LUMA],
2069      (UInt)m_iCodedCamParPrecision,
2070      m_FrameSkip,
2071      (UInt)m_framesToBeEncoded,
2072      m_pchCameraParameterFile,
2073      m_pchBaseViewCameraNumbers,
2074      m_pchVSOConfig,
2075      NULL,
2076      LOG2_DISP_PREC_LUT );
2077  }
2078  else
2079  {
2080    m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
2081      m_internalBitDepth[ CHANNEL_TYPE_LUMA],
2082      (UInt) m_iCodedCamParPrecision,
2083      m_FrameSkip,
2084      (UInt) m_framesToBeEncoded,
2085      m_pchCameraParameterFile,
2086      m_pchBaseViewCameraNumbers,
2087      NULL,
2088      NULL,
2089      LOG2_DISP_PREC_LUT );
2090  }
2091#else
2092  m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
2093    m_internalBitDepth[ CHANNEL_TYPE_LUMA],
2094    (UInt) m_iCodedCamParPrecision,
2095    m_FrameSkip,
2096    (UInt) m_framesToBeEncoded,
2097    m_pchCameraParameterFile,
2098    m_pchBaseViewCameraNumbers,
2099    NULL,
2100    NULL,
2101    LOG2_DISP_PREC_LUT );
2102#endif
2103  m_cCameraData.check( false, true );
2104#endif
2105
2106  // check validity of input parameters
2107  xCheckParameter();
2108
2109  // compute actual CU depth with respect to config depth and max transform size
2110  UInt uiAddCUDepth  = 0;
2111  while( (m_uiMaxCUWidth>>m_uiMaxCUDepth) > ( 1 << ( m_uiQuadtreeTULog2MinSize + uiAddCUDepth )  ) )
2112  {
2113    uiAddCUDepth++;
2114  }
2115
2116  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.
2117  m_uiLog2DiffMaxMinCodingBlockSize = m_uiMaxCUDepth - 1;
2118
2119  // print-out parameters
2120  xPrintParameter();
2121
2122  return true;
2123}
2124
2125
2126// ====================================================================================================================
2127// Private member functions
2128// ====================================================================================================================
2129
2130Void TAppEncCfg::xCheckParameter()
2131{
2132  if (m_decodedPictureHashSEIType==HASHTYPE_NONE)
2133  {
2134    fprintf(stderr, "******************************************************************\n");
2135    fprintf(stderr, "** WARNING: --SEIDecodedPictureHash is now disabled by default. **\n");
2136    fprintf(stderr, "**          Automatic verification of decoded pictures by a     **\n");
2137    fprintf(stderr, "**          decoder requires this option to be enabled.         **\n");
2138    fprintf(stderr, "******************************************************************\n");
2139  }
2140
2141
2142#if !NH_MV
2143  if( m_profile==Profile::NONE )
2144  {
2145    fprintf(stderr, "***************************************************************************\n");
2146    fprintf(stderr, "** WARNING: For conforming bitstreams a valid Profile value must be set! **\n");
2147    fprintf(stderr, "***************************************************************************\n");
2148  }
2149  if( m_level==Level::NONE )
2150  {
2151    fprintf(stderr, "***************************************************************************\n");
2152    fprintf(stderr, "** WARNING: For conforming bitstreams a valid Level value must be set!   **\n");
2153    fprintf(stderr, "***************************************************************************\n");
2154  }
2155#endif
2156
2157  Bool check_failed = false; /* abort if there is a fatal configuration problem */
2158#define xConfirmPara(a,b) check_failed |= confirmPara(a,b)
2159
2160  xConfirmPara(m_bitstreamFileName.empty(), "A bitstream file name must be specified (BitstreamFile)");
2161  const UInt maxBitDepth=(m_chromaFormatIDC==CHROMA_400) ? m_internalBitDepth[CHANNEL_TYPE_LUMA] : std::max(m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA]);
2162  xConfirmPara(m_bitDepthConstraint<maxBitDepth, "The internalBitDepth must not be greater than the bitDepthConstraint value");
2163  xConfirmPara(m_chromaFormatConstraint<m_chromaFormatIDC, "The chroma format used must not be greater than the chromaFormatConstraint value");
2164#if NH_MV
2165  Profile::Name & m_profile = m_profiles[0];
2166#endif
2167
2168  if (m_profile==Profile::MAINREXT || m_profile==Profile::HIGHTHROUGHPUTREXT)
2169  {
2170    xConfirmPara(m_lowerBitRateConstraintFlag==false && m_intraConstraintFlag==false, "The lowerBitRateConstraint flag cannot be false when intraConstraintFlag is false");
2171    xConfirmPara(m_cabacBypassAlignmentEnabledFlag && m_profile!=Profile::HIGHTHROUGHPUTREXT, "AlignCABACBeforeBypass must not be enabled unless the high throughput profile is being used.");
2172    if (m_profile == Profile::MAINREXT)
2173    {
2174      const UInt intraIdx = m_intraConstraintFlag ? 1:0;
2175      const UInt bitDepthIdx = (m_bitDepthConstraint == 8 ? 0 : (m_bitDepthConstraint ==10 ? 1 : (m_bitDepthConstraint == 12 ? 2 : (m_bitDepthConstraint == 16 ? 3 : 4 ))));
2176      const UInt chromaFormatIdx = UInt(m_chromaFormatConstraint);
2177      const Bool bValidProfile = (bitDepthIdx > 3 || chromaFormatIdx>3) ? false : (validRExtProfileNames[intraIdx][bitDepthIdx][chromaFormatIdx] != NONE);
2178      xConfirmPara(!bValidProfile, "Invalid intra constraint flag, bit depth constraint flag and chroma format constraint flag combination for a RExt profile");
2179      const Bool bUsingGeneralRExtTools  = m_transformSkipRotationEnabledFlag        ||
2180                                           m_transformSkipContextEnabledFlag         ||
2181                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT] ||
2182                                           m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT] ||
2183                                           !m_enableIntraReferenceSmoothing         ||
2184                                           m_persistentRiceAdaptationEnabledFlag     ||
2185                                           m_log2MaxTransformSkipBlockSize!=2;
2186      const Bool bUsingChromaQPTool      = m_diffCuChromaQpOffsetDepth >= 0;
2187      const Bool bUsingExtendedPrecision = m_extendedPrecisionProcessingFlag;
2188
2189      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");
2190      xConfirmPara(m_bitDepthConstraint != 16 && bUsingExtendedPrecision, "Extended precision can only be used in 16-bit RExt profiles");
2191      if (!(m_chromaFormatConstraint == CHROMA_400 && m_bitDepthConstraint == 16) && m_chromaFormatConstraint!=CHROMA_444)
2192      {
2193        xConfirmPara(bUsingGeneralRExtTools, "Combination of tools and profiles are not possible in the specified RExt profile.");
2194      }
2195      xConfirmPara( m_onePictureOnlyConstraintFlag && m_chromaFormatConstraint!=CHROMA_444, "chroma format constraint must be 4:4:4 when one-picture-only constraint flag is 1");
2196      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");
2197      xConfirmPara( m_onePictureOnlyConstraintFlag && m_framesToBeEncoded > 1, "Number of frames to be encoded must be 1 when one-picture-only constraint flag is 1.");
2198
2199      if (!m_intraConstraintFlag && m_bitDepthConstraint==16 && m_chromaFormatConstraint==CHROMA_444)
2200      {
2201        fprintf(stderr, "********************************************************************************************************\n");
2202        fprintf(stderr, "** WARNING: The RExt constraint flags describe a non standard combination (used for development only) **\n");
2203        fprintf(stderr, "********************************************************************************************************\n");
2204      }
2205    }
2206    else
2207    {
2208      xConfirmPara( m_chromaFormatConstraint != CHROMA_444, "chroma format constraint must be 4:4:4 in the High Throughput 4:4:4 16-bit Intra profile.");
2209      xConfirmPara( m_bitDepthConstraint     != 16,         "bit depth constraint must be 4:4:4 in the High Throughput 4:4:4 16-bit Intra profile.");
2210      xConfirmPara( m_intraConstraintFlag    != 1,          "intra constraint flag must be 1 in the High Throughput 4:4:4 16-bit Intra profile.");
2211    }
2212  }
2213  else
2214  {
2215    xConfirmPara(m_bitDepthConstraint!=((m_profile==Profile::MAIN10)?10:8), "BitDepthConstraint must be 8 for MAIN profile and 10 for MAIN10 profile.");
2216    xConfirmPara(m_chromaFormatConstraint!=CHROMA_420, "ChromaFormatConstraint must be 420 for non main-RExt profiles.");
2217    xConfirmPara(m_intraConstraintFlag==true, "IntraConstraintFlag must be false for non main_RExt profiles.");
2218    xConfirmPara(m_lowerBitRateConstraintFlag==false, "LowerBitrateConstraintFlag must be true for non main-RExt profiles.");
2219    xConfirmPara(m_profile == Profile::MAINSTILLPICTURE && m_framesToBeEncoded > 1, "Number of frames to be encoded must be 1 when main still picture profile is used.");
2220
2221    xConfirmPara(m_crossComponentPredictionEnabledFlag==true, "CrossComponentPrediction must not be used for non main-RExt profiles.");
2222    xConfirmPara(m_log2MaxTransformSkipBlockSize!=2, "Transform Skip Log2 Max Size must be 2 for V1 profiles.");
2223    xConfirmPara(m_transformSkipRotationEnabledFlag==true, "UseResidualRotation must not be enabled for non main-RExt profiles.");
2224    xConfirmPara(m_transformSkipContextEnabledFlag==true, "UseSingleSignificanceMapContext must not be enabled for non main-RExt profiles.");
2225    xConfirmPara(m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT]==true, "ImplicitResidualDPCM must not be enabled for non main-RExt profiles.");
2226    xConfirmPara(m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT]==true, "ExplicitResidualDPCM must not be enabled for non main-RExt profiles.");
2227    xConfirmPara(m_persistentRiceAdaptationEnabledFlag==true, "GolombRiceParameterAdaption must not be enabled for non main-RExt profiles.");
2228    xConfirmPara(m_extendedPrecisionProcessingFlag==true, "UseExtendedPrecision must not be enabled for non main-RExt profiles.");
2229    xConfirmPara(m_highPrecisionOffsetsEnabledFlag==true, "UseHighPrecisionPredictionWeighting must not be enabled for non main-RExt profiles.");
2230    xConfirmPara(m_enableIntraReferenceSmoothing==false, "EnableIntraReferenceSmoothing must be enabled for non main-RExt profiles.");
2231    xConfirmPara(m_cabacBypassAlignmentEnabledFlag, "AlignCABACBeforeBypass cannot be enabled for non main-RExt profiles.");
2232  }
2233
2234  // check range of parameters
2235  xConfirmPara( m_inputBitDepth[CHANNEL_TYPE_LUMA  ] < 8,                                   "InputBitDepth must be at least 8" );
2236  xConfirmPara( m_inputBitDepth[CHANNEL_TYPE_CHROMA] < 8,                                   "InputBitDepthC must be at least 8" );
2237
2238#if !RExt__HIGH_BIT_DEPTH_SUPPORT
2239  if (m_extendedPrecisionProcessingFlag)
2240  {
2241    for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
2242    {
2243      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...");
2244    }
2245  }
2246  else
2247  {
2248    for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
2249    {
2250      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...");
2251    }
2252  }
2253#endif
2254
2255  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)" );
2256  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)" );
2257
2258#if NH_MV
2259  for (Int i = 0; i < m_numberOfLayers; i++)
2260  {
2261    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");
2262    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");
2263  }
2264#else
2265  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");
2266  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");
2267#endif
2268
2269  xConfirmPara( m_chromaFormatIDC >= NUM_CHROMA_FORMAT,                                     "ChromaFormatIDC must be either 400, 420, 422 or 444" );
2270  std::string sTempIPCSC="InputColourSpaceConvert must be empty, "+getListOfColourSpaceConverts(true);
2271  xConfirmPara( m_inputColourSpaceConvert >= NUMBER_INPUT_COLOUR_SPACE_CONVERSIONS,         sTempIPCSC.c_str() );
2272  xConfirmPara( m_InputChromaFormatIDC >= NUM_CHROMA_FORMAT,                                "InputChromaFormatIDC must be either 400, 420, 422 or 444" );
2273  xConfirmPara( m_iFrameRate <= 0,                                                          "Frame rate must be more than 1" );
2274  xConfirmPara( m_framesToBeEncoded <= 0,                                                   "Total Number Of Frames encoded must be more than 0" );
2275#if NH_MV
2276  xConfirmPara( m_numberOfLayers > MAX_NUM_LAYER_IDS ,                                      "NumberOfLayers must be less than or equal to MAX_NUM_LAYER_IDS");
2277
2278
2279  xConfirmPara( m_layerIdInNuh[0] != 0      , "LayerIdInNuh must be 0 for the first layer. ");
2280  xConfirmPara( (m_layerIdInNuh.size()!=1) && (m_layerIdInNuh.size() < m_numberOfLayers) , "LayerIdInNuh must be given for all layers. ");
2281
2282#if NH_3D
2283  xConfirmPara( m_scalabilityMask != 2 && m_scalabilityMask != 3, "Scalability Mask must be equal to 2 or 3. ");
2284#else
2285  xConfirmPara( m_scalabilityMask != 2 && m_scalabilityMask != 8 && m_scalabilityMask != 10, "Scalability Mask must be equal to 2, 8 or 10");
2286#endif
2287
2288#if NH_3D
2289  if ( m_scalabilityMask & ( 1 << DEPTH_ID ) )
2290  {
2291    m_dimIds.push_back( m_depthFlag ); 
2292  }
2293#endif
2294
2295  m_dimIds.push_back( m_viewOrderIndex );   
2296  for (Int i = 0; i < m_auxId.size(); i++)
2297  {
2298    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");
2299  }
2300  if ( m_scalabilityMask & ( 1 << AUX_ID ) )
2301  {
2302    m_dimIds.push_back ( m_auxId );
2303  }
2304  xConfirmPara(  m_dimensionIdLen.size() < m_dimIds.size(), "DimensionIdLen must be given for all dimensions. "   );
2305  Int dimBitOffset[MAX_NUM_SCALABILITY_TYPES+1]; 
2306
2307  dimBitOffset[ 0 ] = 0; 
2308  for (Int j = 1; j <= (((Int) m_dimIds.size() - m_splittingFlag) ? 1 : 0); j++ )
2309  {
2310    dimBitOffset[ j ] = dimBitOffset[ j - 1 ] + m_dimensionIdLen[ j - 1]; 
2311  }
2312
2313  if ( m_splittingFlag )
2314  {
2315    dimBitOffset[ (Int) m_dimIds.size() ] = 6; 
2316  }
2317
2318  for( Int j = 0; j < m_dimIds.size(); j++ )
2319  {   
2320    xConfirmPara( m_dimIds[j].size() < m_numberOfLayers,  "DimensionId must be given for all layers and all dimensions. ");   
2321    xConfirmPara( (m_dimIds[j][0] != 0)                 , "DimensionId of layer 0 must be 0. " );
2322    xConfirmPara( m_dimensionIdLen[j] < 1 || m_dimensionIdLen[j] > 8, "DimensionIdLen must be greater than 0 and less than 9 in all dimensions. " ); 
2323
2324
2325    for( Int i = 1; i < m_numberOfLayers; i++ )
2326    {     
2327      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. " );
2328      if ( m_splittingFlag )
2329      {
2330        Int layerIdInNuh = (m_layerIdInNuh.size()!=1) ? m_layerIdInNuh[i] :  i; 
2331        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. "); 
2332      }
2333    }
2334  }
2335
2336  for( Int i = 0; i < m_numberOfLayers; i++ )
2337  {
2338    for( Int j = 0; j < i; j++ )
2339    {     
2340      Int numDiff  = 0; 
2341      Int lastDiff = -1; 
2342      for( Int dim = 0; dim < m_dimIds.size(); dim++ )
2343      {
2344        if ( m_dimIds[dim][i] != m_dimIds[dim][j] )
2345        {
2346          numDiff ++; 
2347          lastDiff = dim; 
2348        }
2349      }
2350
2351      Bool allEqual = ( numDiff == 0 ); 
2352
2353      if ( allEqual ) 
2354      {
2355        printf( "\nError: Positions of Layers %d and %d are identical in scalability space\n", i, j);
2356      }
2357
2358      xConfirmPara( allEqual , "Each layer shall have a different position in scalability space." );
2359
2360#if !H_3D_FCO
2361      if ( numDiff  == 1 ) 
2362      {
2363        Bool inc = m_dimIds[ lastDiff ][ i ] > m_dimIds[ lastDiff ][ j ]; 
2364        Bool shallBeButIsNotIncreasing = ( !inc  ) ; 
2365        if ( shallBeButIsNotIncreasing )
2366        {       
2367          printf( "\nError: Positions of Layers %d and %d is not increasing in dimension %d \n", i, j, lastDiff);       
2368        }
2369        xConfirmPara( shallBeButIsNotIncreasing,  "DimensionIds shall be increasing within one dimension. " );
2370      }
2371#endif
2372    }
2373  }
2374
2375  /// ViewId
2376  xConfirmPara( m_viewId.size() != m_iNumberOfViews, "The number of ViewIds must be equal to the number of views." ); 
2377
2378  /// Layer sets
2379  xConfirmPara( m_vpsNumLayerSets < 0 || m_vpsNumLayerSets > 1024, "VpsNumLayerSets must be greater than 0 and less than 1025. ") ; 
2380  for( Int lsIdx = 0; lsIdx < m_vpsNumLayerSets; lsIdx++ )
2381  {
2382    if (lsIdx == 0)
2383    {
2384      xConfirmPara( m_layerIdsInSets[lsIdx].size() != 1 || m_layerIdsInSets[lsIdx][0] != 0 , "0-th layer shall only include layer 0. ");
2385    }
2386    for ( Int i = 0; i < m_layerIdsInSets[lsIdx].size(); i++ )
2387    {
2388      xConfirmPara( m_layerIdsInSets[lsIdx][i] < 0 || m_layerIdsInSets[lsIdx][i] >= MAX_NUM_LAYER_IDS, "LayerIdsInSet must be greater than 0 and less than MAX_NUM_LAYER_IDS" ); 
2389    }
2390  }
2391
2392  // Output layer sets
2393  xConfirmPara( m_outputLayerSetIdx.size() > 1024, "The number of output layer set indices must be less than 1025.") ;
2394  for (Int lsIdx = 0; lsIdx < m_outputLayerSetIdx.size(); lsIdx++)
2395  {   
2396    Int refLayerSetIdx = m_outputLayerSetIdx[ lsIdx ]; 
2397    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." );
2398  }
2399
2400  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." ); 
2401
2402  if( m_defaultOutputLayerIdc != 2 )
2403  {
2404    Bool anyDefaultOutputFlag = false;   
2405    for (Int lsIdx = 0; lsIdx < m_vpsNumLayerSets; lsIdx++)
2406    { 
2407      anyDefaultOutputFlag = anyDefaultOutputFlag || ( m_layerIdsInDefOutputLayerSet[lsIdx].size() != 0 );
2408    }   
2409    if ( anyDefaultOutputFlag )
2410    {   
2411      printf( "\nWarning: Ignoring LayerIdsInDefOutputLayerSet parameters, since defaultTargetOuputLayerIdc is not equal 2.\n" );   
2412    }
2413  }
2414  else 
2415  { 
2416    for (Int lsIdx = 0; lsIdx < m_vpsNumLayerSets; lsIdx++)
2417    { 
2418      for (Int i = 0; i < m_layerIdsInDefOutputLayerSet[ lsIdx ].size(); i++)
2419      {
2420        Bool inLayerSetFlag = false; 
2421        for (Int j = 0; j < m_layerIdsInSets[ lsIdx].size(); j++ )
2422        {
2423          if ( m_layerIdsInSets[ lsIdx ][ j ] == m_layerIdsInDefOutputLayerSet[ lsIdx ][ i ] )
2424          {
2425            inLayerSetFlag = true; 
2426            break; 
2427          }       
2428        }
2429        xConfirmPara( !inLayerSetFlag, "All output layers of a output layer set must be included in corresponding layer set.");
2430      }
2431    }
2432  }
2433
2434  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" );
2435
2436  // PTL
2437  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." ); 
2438
2439  if ( m_numberOfLayers > 1)
2440  {
2441    xConfirmPara( m_profiles.size() <= 1, "The number of profiles, tiers, levels, and inblFlags must be greater than 1.");
2442    xConfirmPara( m_inblFlag[0], "VpsProfileTierLevel[0] must have inblFlag equal to 0");
2443    if (m_profiles.size() > 1 )
2444    {
2445      xConfirmPara( m_profiles[0]  != m_profiles[1], "The profile in VpsProfileTierLevel[1] must be equal to the profile in VpsProfileTierLevel[0].");
2446      xConfirmPara( m_inblFlag[0] != m_inblFlag[1], "inblFlag in VpsProfileTierLevel[1] must be equal to the inblFlag in VpsProfileTierLevel[0].");
2447    }
2448  }
2449
2450  // Layer Dependencies 
2451  for (Int i = 0; i < m_numberOfLayers; i++ )
2452  {
2453    xConfirmPara( (i == 0)  && m_directRefLayers[0].size() != 0, "Layer 0 shall not have reference layers." ); 
2454    xConfirmPara( m_directRefLayers[i].size() != m_dependencyTypes[ i ].size(), "Each reference layer shall have a reference type." ); 
2455    for (Int j = 0; j < m_directRefLayers[i].size(); j++)
2456    {
2457      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"); 
2458      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");
2459    }       
2460  } 
2461#endif
2462
2463  xConfirmPara( m_iGOPSize < 1 ,                                                            "GOP Size must be greater or equal to 1" );
2464  xConfirmPara( m_iGOPSize > 1 &&  m_iGOPSize % 2,                                          "GOP Size must be a multiple of 2, if GOP Size is greater than 1" );
2465#if NH_MV
2466  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
2467  {
2468    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" );
2469  }
2470#else
2471  xConfirmPara( (m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, "Intra period must be more than GOP size, or -1 , not 0" );
2472#endif
2473  xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 3,                   "Decoding Refresh Type must be comprised between 0 and 3 included" );
2474  if(m_iDecodingRefreshType == 3)
2475  {
2476    xConfirmPara( !m_recoveryPointSEIEnabled,                                               "When using RecoveryPointSEI messages as RA points, recoveryPointSEI must be enabled" );
2477  }
2478
2479  if (m_isField)
2480  {
2481    if (!m_pictureTimingSEIEnabled)
2482    {
2483      fprintf(stderr, "****************************************************************************\n");
2484      fprintf(stderr, "** WARNING: Picture Timing SEI should be enabled for field coding!        **\n");
2485      fprintf(stderr, "****************************************************************************\n");
2486    }
2487  }
2488
2489  if(m_crossComponentPredictionEnabledFlag && (m_chromaFormatIDC != CHROMA_444))
2490  {
2491    fprintf(stderr, "****************************************************************************\n");
2492    fprintf(stderr, "** WARNING: Cross-component prediction is specified for 4:4:4 format only **\n");
2493    fprintf(stderr, "****************************************************************************\n");
2494
2495    m_crossComponentPredictionEnabledFlag = false;
2496  }
2497
2498  if ( m_CUTransquantBypassFlagForce && m_bUseHADME )
2499  {
2500    fprintf(stderr, "****************************************************************************\n");
2501    fprintf(stderr, "** WARNING: --HadamardME has been disabled due to the enabling of         **\n");
2502    fprintf(stderr, "**          --CUTransquantBypassFlagForce                                 **\n");
2503    fprintf(stderr, "****************************************************************************\n");
2504
2505    m_bUseHADME = false; // this has been disabled so that the lambda is calculated slightly differently for lossless modes (as a result of JCTVC-R0104).
2506  }
2507
2508  xConfirmPara (m_log2MaxTransformSkipBlockSize < 2, "Transform Skip Log2 Max Size must be at least 2 (4x4)");
2509
2510  if (m_log2MaxTransformSkipBlockSize!=2 && m_useTransformSkipFast)
2511  {
2512    fprintf(stderr, "***************************************************************************\n");
2513    fprintf(stderr, "** WARNING: Transform skip fast is enabled (which only tests NxN splits),**\n");
2514    fprintf(stderr, "**          but transform skip log2 max size is not 2 (4x4)              **\n");
2515    fprintf(stderr, "**          It may be better to disable transform skip fast mode         **\n");
2516    fprintf(stderr, "***************************************************************************\n");
2517  }
2518#if NH_MV
2519  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
2520  {
2521    xConfirmPara( m_iQP[layer] <  -6 * (m_internalBitDepth[CHANNEL_TYPE_LUMA] - 8) || m_iQP[layer] > 51,      "QP exceeds supported range (-QpBDOffsety to 51)" );
2522    xConfirmPara( m_DeblockingFilterMetric && (m_bLoopFilterDisable[layer] || m_loopFilterOffsetInPPS), "If DeblockingFilterMetric is true then both LoopFilterDisable and LoopFilterOffsetInPPS must be 0");
2523  }
2524#else
2525  xConfirmPara( m_iQP <  -6 * (m_internalBitDepth[CHANNEL_TYPE_LUMA] - 8) || m_iQP > 51,    "QP exceeds supported range (-QpBDOffsety to 51)" );
2526  xConfirmPara( m_DeblockingFilterMetric && (m_bLoopFilterDisable || m_loopFilterOffsetInPPS), "If DeblockingFilterMetric is true then both LoopFilterDisable and LoopFilterOffsetInPPS must be 0");
2527#endif
2528 
2529  xConfirmPara( m_loopFilterBetaOffsetDiv2 < -6 || m_loopFilterBetaOffsetDiv2 > 6,        "Loop Filter Beta Offset div. 2 exceeds supported range (-6 to 6)");
2530  xConfirmPara( m_loopFilterTcOffsetDiv2 < -6 || m_loopFilterTcOffsetDiv2 > 6,            "Loop Filter Tc Offset div. 2 exceeds supported range (-6 to 6)");
2531  xConfirmPara( m_iSearchRange < 0 ,                                                        "Search Range must be more than 0" );
2532  xConfirmPara( m_bipredSearchRange < 0 ,                                                   "Bi-prediction refinement search range must be more than 0" );
2533  xConfirmPara( m_minSearchWindow < 0,                                                      "Minimum motion search window size for the adaptive window ME must be greater than or equal to 0" );
2534#if NH_MV
2535  xConfirmPara( m_iVerticalDisparitySearchRange <= 0 ,                                      "Vertical Disparity Search Range must be more than 0" );
2536#endif
2537  xConfirmPara( m_iMaxDeltaQP > 7,                                                          "Absolute Delta QP exceeds supported range (0 to 7)" );
2538  xConfirmPara( m_iMaxCuDQPDepth > m_uiMaxCUDepth - 1,                                          "Absolute depth for a minimum CuDQP exceeds maximum coding unit depth" );
2539
2540  xConfirmPara( m_cbQpOffset < -12,   "Min. Chroma Cb QP Offset is -12" );
2541  xConfirmPara( m_cbQpOffset >  12,   "Max. Chroma Cb QP Offset is  12" );
2542  xConfirmPara( m_crQpOffset < -12,   "Min. Chroma Cr QP Offset is -12" );
2543  xConfirmPara( m_crQpOffset >  12,   "Max. Chroma Cr QP Offset is  12" );
2544
2545  xConfirmPara( m_iQPAdaptationRange <= 0,                                                  "QP Adaptation Range must be more than 0" );
2546  if (m_iDecodingRefreshType == 2)
2547  {
2548#if NH_MV
2549    for (Int i = 0; i < m_numberOfLayers; i++ )
2550    {
2551      xConfirmPara( m_iIntraPeriod[i] > 0 && m_iIntraPeriod[i] <= m_iGOPSize ,                      "Intra period must be larger than GOP size for periodic IDR pictures");
2552    }
2553#else
2554    xConfirmPara( m_iIntraPeriod > 0 && m_iIntraPeriod <= m_iGOPSize ,                      "Intra period must be larger than GOP size for periodic IDR pictures");
2555#endif
2556  }
2557  xConfirmPara( m_uiMaxCUDepth < 1,                                                         "MaxPartitionDepth must be greater than zero");
2558  xConfirmPara( (m_uiMaxCUWidth  >> m_uiMaxCUDepth) < 4,                                    "Minimum partition width size should be larger than or equal to 8");
2559  xConfirmPara( (m_uiMaxCUHeight >> m_uiMaxCUDepth) < 4,                                    "Minimum partition height size should be larger than or equal to 8");
2560  xConfirmPara( m_uiMaxCUWidth < 16,                                                        "Maximum partition width size should be larger than or equal to 16");
2561  xConfirmPara( m_uiMaxCUHeight < 16,                                                       "Maximum partition height size should be larger than or equal to 16");
2562  xConfirmPara( (m_iSourceWidth  % (m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame width must be a multiple of the minimum CU size");
2563  xConfirmPara( (m_iSourceHeight % (m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame height must be a multiple of the minimum CU size");
2564
2565  xConfirmPara( m_uiQuadtreeTULog2MinSize < 2,                                        "QuadtreeTULog2MinSize must be 2 or greater.");
2566  xConfirmPara( m_uiQuadtreeTULog2MaxSize > 5,                                        "QuadtreeTULog2MaxSize must be 5 or smaller.");
2567  xConfirmPara( m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize,                "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize.");
2568  xConfirmPara( (1<<m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth,                      "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
2569  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) >= ( m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than or equal to minimum CU size" );
2570  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) >= ( m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than or equal to minimum CU size" );
2571  xConfirmPara( m_uiQuadtreeTUMaxDepthInter < 1,                                                         "QuadtreeTUMaxDepthInter must be greater than or equal to 1" );
2572  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" );
2573  xConfirmPara( m_uiQuadtreeTUMaxDepthIntra < 1,                                                         "QuadtreeTUMaxDepthIntra must be greater than or equal to 1" );
2574  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" );
2575
2576  xConfirmPara(  m_maxNumMergeCand < 1,  "MaxNumMergeCand must be 1 or greater.");
2577  xConfirmPara(  m_maxNumMergeCand > 5,  "MaxNumMergeCand must be 5 or smaller.");
2578#if NH_3D
2579  xConfirmPara( m_log2SubPbSizeMinus3 < 0,                                        "Log2SubPbSizeMinus3 must be equal to 0 or greater.");
2580  xConfirmPara( m_log2SubPbSizeMinus3 > 3,                                        "Log2SubPbSizeMinus3 must be equal to 3 or smaller.");
2581  xConfirmPara( (1<< ( m_log2SubPbSizeMinus3 + 3) ) > m_uiMaxCUWidth,              "Log2SubPbSizeMinus3 must be  equal to log2(maxCUSize)-3 or smaller.");
2582 
2583  xConfirmPara( m_log2MpiSubPbSizeMinus3 < 0,                                        "Log2MpiSubPbSizeMinus3 must be equal to 0 or greater.");
2584  xConfirmPara( m_log2MpiSubPbSizeMinus3 > 3,                                        "Log2MpiSubPbSizeMinus3 must be equal to 3 or smaller.");
2585  xConfirmPara( (1<< (m_log2MpiSubPbSizeMinus3 + 3)) > m_uiMaxCUWidth,               "Log2MpiSubPbSizeMinus3 must be equal to log2(maxCUSize)-3 or smaller.");
2586#endif
2587#if ADAPTIVE_QP_SELECTION
2588#if NH_MV
2589  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
2590  {
2591    xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP[layer] < 0,                                     "AdaptiveQpSelection must be disabled when QP < 0.");
2592  }
2593#else
2594  xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP < 0,                                              "AdaptiveQpSelection must be disabled when QP < 0.");
2595#endif
2596  xConfirmPara( m_bUseAdaptQpSelect == true && (m_cbQpOffset !=0 || m_crQpOffset != 0 ),               "AdaptiveQpSelection must be disabled when ChromaQpOffset is not equal to 0.");
2597#endif
2598
2599  if( m_usePCM)
2600  {
2601    for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
2602    {
2603      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)");
2604    }
2605    xConfirmPara(  m_uiPCMLog2MinSize < 3,                                      "PCMLog2MinSize must be 3 or greater.");
2606    xConfirmPara(  m_uiPCMLog2MinSize > 5,                                      "PCMLog2MinSize must be 5 or smaller.");
2607    xConfirmPara(  m_pcmLog2MaxSize > 5,                                        "PCMLog2MaxSize must be 5 or smaller.");
2608    xConfirmPara(  m_pcmLog2MaxSize < m_uiPCMLog2MinSize,                       "PCMLog2MaxSize must be equal to or greater than m_uiPCMLog2MinSize.");
2609  }
2610
2611  if (m_sliceMode!=NO_SLICES)
2612  {
2613    xConfirmPara( m_sliceArgument < 1 ,         "SliceArgument should be larger than or equal to 1" );
2614  }
2615  if (m_sliceSegmentMode!=NO_SLICES)
2616  {
2617    xConfirmPara( m_sliceSegmentArgument < 1 ,         "SliceSegmentArgument should be larger than or equal to 1" );
2618  }
2619
2620  Bool tileFlag = (m_numTileColumnsMinus1 > 0 || m_numTileRowsMinus1 > 0 );
2621  if (m_profile!=Profile::HIGHTHROUGHPUTREXT)
2622  {
2623    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");
2624  }
2625
2626  xConfirmPara( m_iSourceWidth  % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Picture width must be an integer multiple of the specified chroma subsampling");
2627  xConfirmPara( m_iSourceHeight % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Picture height must be an integer multiple of the specified chroma subsampling");
2628
2629  xConfirmPara( m_aiPad[0] % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling");
2630  xConfirmPara( m_aiPad[1] % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling");
2631
2632  xConfirmPara( m_confWinLeft   % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Left conformance window offset must be an integer multiple of the specified chroma subsampling");
2633  xConfirmPara( m_confWinRight  % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Right conformance window offset must be an integer multiple of the specified chroma subsampling");
2634  xConfirmPara( m_confWinTop    % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Top conformance window offset must be an integer multiple of the specified chroma subsampling");
2635  xConfirmPara( m_confWinBottom % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling");
2636
2637  xConfirmPara( m_defaultDisplayWindowFlag && !m_vuiParametersPresentFlag, "VUI needs to be enabled for default display window");
2638
2639  if (m_defaultDisplayWindowFlag)
2640  {
2641    xConfirmPara( m_defDispWinLeftOffset   % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Left default display window offset must be an integer multiple of the specified chroma subsampling");
2642    xConfirmPara( m_defDispWinRightOffset  % TComSPS::getWinUnitX(m_chromaFormatIDC) != 0, "Right default display window offset must be an integer multiple of the specified chroma subsampling");
2643    xConfirmPara( m_defDispWinTopOffset    % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Top default display window offset must be an integer multiple of the specified chroma subsampling");
2644    xConfirmPara( m_defDispWinBottomOffset % TComSPS::getWinUnitY(m_chromaFormatIDC) != 0, "Bottom default display window offset must be an integer multiple of the specified chroma subsampling");
2645  }
2646
2647#if NH_3D
2648  xConfirmPara( m_pchCameraParameterFile    == 0                ,   "CameraParameterFile must be given");
2649  xConfirmPara( m_pchBaseViewCameraNumbers  == 0                ,   "BaseViewCameraNumbers must be given" );
2650  xConfirmPara( m_iNumberOfViews != m_cCameraData.getBaseViewNumbers().size() ,   "Number of Views in BaseViewCameraNumbers must be equal to NumberOfViews" );
2651  xConfirmPara    ( m_iCodedCamParPrecision < 0 || m_iCodedCamParPrecision > 5,       "CodedCamParsPrecision must be in range of 0..5" );
2652#if NH_3D_VSO
2653    if( m_bUseVSO )
2654    {
2655      xConfirmPara(   m_pchVSOConfig            == 0                             ,   "VSO Setup string must be given");
2656      xConfirmPara( m_uiVSOMode > 4 ,                                                "VSO Mode must be less than 5");
2657    }
2658#endif
2659#endif
2660  // max CU width and height should be power of 2
2661  UInt ui = m_uiMaxCUWidth;
2662  while(ui)
2663  {
2664    ui >>= 1;
2665    if( (ui & 1) == 1)
2666    {
2667      xConfirmPara( ui != 1 , "Width should be 2^n");
2668    }
2669  }
2670  ui = m_uiMaxCUHeight;
2671  while(ui)
2672  {
2673    ui >>= 1;
2674    if( (ui & 1) == 1)
2675    {
2676      xConfirmPara( ui != 1 , "Height should be 2^n");
2677    }
2678  }
2679
2680#if NH_MV
2681  // validate that POC of same frame is identical across multiple layers
2682  Bool bErrorMvePoc = false;
2683  if( m_numberOfLayers > 1 )
2684  {
2685    for( Int k = 1; k < m_numberOfLayers; k++ )
2686    {
2687      for( Int i = 0; i < MAX_GOP; i++ )
2688      {
2689        if( m_GOPListMvc[k][i].m_POC != m_GOPListMvc[0][i].m_POC )
2690        {
2691          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 );
2692          bErrorMvePoc = true;
2693        }
2694      }
2695    }
2696  }
2697  xConfirmPara( bErrorMvePoc,  "Invalid inter-layer POC structure given" );
2698
2699  // validate that baseview has no inter-view refs
2700  Bool bErrorIvpBase = false;
2701  for( Int i = 0; i < MAX_GOP; i++ )
2702  {
2703    if( m_GOPListMvc[0][i].m_numActiveRefLayerPics != 0 )
2704    {
2705      printf( "\nError: Frame%d inter_layer refs not available in layer 0\n", i );
2706      bErrorIvpBase = true;
2707    }
2708  }
2709  xConfirmPara( bErrorIvpBase, "Inter-layer refs not possible in base layer" );
2710
2711  // validate inter-view refs
2712  Bool bErrorIvpEnhV = false;
2713  if( m_numberOfLayers > 1 )
2714  {
2715    for( Int layer = 1; layer < m_numberOfLayers; layer++ )
2716    {
2717      for( Int i = 0; i < MAX_GOP+1; i++ )
2718      {
2719        GOPEntry gopEntry = m_GOPListMvc[layer][i]; 
2720        for( Int j = 0; j < gopEntry.m_numActiveRefLayerPics; j++ )
2721        {
2722          Int ilPredLayerIdc = gopEntry.m_interLayerPredLayerIdc[j];
2723          if( ilPredLayerIdc < 0 || ilPredLayerIdc >= m_directRefLayers[layer].size() )
2724          {
2725            printf( "\nError: inter-layer ref idc %d is not available for Frame%d_l%d\n", gopEntry.m_interLayerPredLayerIdc[j], i, layer );
2726            bErrorIvpEnhV = true;
2727          }
2728          if( gopEntry.m_interViewRefPosL[0][j] < -1 || gopEntry.m_interViewRefPosL[0][j] > gopEntry.m_numRefPicsActive )
2729          {
2730            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 );
2731            bErrorIvpEnhV = true;
2732          }
2733          if( gopEntry.m_interViewRefPosL[1][j] < -1  || gopEntry.m_interViewRefPosL[1][j] > gopEntry.m_numRefPicsActive )
2734          {
2735            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 );
2736            bErrorIvpEnhV = true;
2737          }
2738        }
2739        if( i == MAX_GOP ) // inter-view refs at I pic position in base view
2740        {
2741          if( gopEntry.m_sliceType != 'B' && gopEntry.m_sliceType != 'P' && gopEntry.m_sliceType != 'I' )
2742          {
2743            printf( "\nError: slice type of FrameI_l%d must be equal to B or P or I\n", layer );
2744            bErrorIvpEnhV = true;
2745          }
2746
2747          if( gopEntry.m_POC != 0 )
2748          {
2749            printf( "\nError: POC %d not possible for FrameI_l%d, must be 0\n", gopEntry.m_POC, layer );
2750            bErrorIvpEnhV = true;
2751          }
2752
2753          if( gopEntry.m_temporalId != 0 )
2754          {
2755            printf( "\nWarning: Temporal id of FrameI_l%d must be 0 (cp. I-frame in base layer)\n", layer );
2756            gopEntry.m_temporalId = 0;
2757          }
2758
2759          if( gopEntry.m_numRefPics != 0 )
2760          {
2761            printf( "\nWarning: temporal references not possible for FrameI_l%d\n", layer );
2762            for( Int j = 0; j < m_GOPListMvc[layer][MAX_GOP].m_numRefPics; j++ )
2763            {
2764              gopEntry.m_referencePics[j] = 0;
2765            }
2766            gopEntry.m_numRefPics = 0;
2767          }
2768
2769          if( gopEntry.m_interRPSPrediction )
2770          {
2771            printf( "\nError: inter RPS prediction not possible for FrameI_l%d, must be 0\n", layer );
2772            bErrorIvpEnhV = true;
2773          }
2774
2775          if( gopEntry.m_sliceType == 'I' && gopEntry.m_numActiveRefLayerPics != 0 )
2776          {
2777            printf( "\nError: inter-layer prediction not possible for FrameI_l%d with slice type I, #IL_ref_pics must be 0\n", layer );
2778            bErrorIvpEnhV = true;
2779          }
2780
2781          if( gopEntry.m_numRefPicsActive > gopEntry.m_numActiveRefLayerPics )
2782          {
2783            gopEntry.m_numRefPicsActive = gopEntry.m_numActiveRefLayerPics;
2784          }
2785
2786          if( gopEntry.m_sliceType == 'P' )
2787          {
2788            if( gopEntry.m_numActiveRefLayerPics < 1 )
2789            {
2790              printf( "\nError: #IL_ref_pics must be at least one for FrameI_l%d with slice type P\n", layer );
2791              bErrorIvpEnhV = true;
2792            }
2793            else
2794            {
2795              for( Int j = 0; j < gopEntry.m_numActiveRefLayerPics; j++ )
2796              {
2797                if( gopEntry.m_interViewRefPosL[1][j] != -1 )
2798                {
2799                  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 );
2800                  bErrorIvpEnhV = true;
2801                }
2802              }
2803            }
2804          }
2805
2806          if( gopEntry.m_sliceType == 'B' && gopEntry.m_numActiveRefLayerPics < 1 )
2807          {
2808            printf( "\nError: #IL_ref_pics must be at least one for FrameI_l%d with slice type B\n", layer );
2809            bErrorIvpEnhV = true;
2810          }
2811        }
2812      }
2813    }
2814  }
2815  xConfirmPara( bErrorIvpEnhV, "Invalid inter-layer coding structure for enhancement layers given" );
2816
2817  // validate temporal coding structure
2818  if( !bErrorMvePoc && !bErrorIvpBase && !bErrorIvpEnhV )
2819  {
2820    for( Int layer = 0; layer < m_numberOfLayers; layer++ )
2821    {
2822      GOPEntry* m_GOPList            = m_GOPListMvc           [layer]; // It is not a member, but this name helps avoiding code duplication !!!
2823      Int&      m_extraRPSs          = m_extraRPSsMvc         [layer]; // It is not a member, but this name helps avoiding code duplication !!!
2824      Int&      m_maxTempLayer       = m_maxTempLayerMvc      [layer]; // It is not a member, but this name helps avoiding code duplication !!!
2825      Int*      m_maxDecPicBuffering = m_maxDecPicBufferingMvc[layer]; // It is not a member, but this name helps avoiding code duplication !!!
2826      Int*      m_numReorderPics     = m_numReorderPicsMvc    [layer]; // It is not a member, but this name helps avoiding code duplication !!!
2827#endif
2828
2829  /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure
2830   * This permits the ability to omit a GOP structure specification */
2831#if NH_MV
2832  if (m_iIntraPeriod[layer] == 1 && m_GOPList[0].m_POC == -1)
2833#else
2834  if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1)
2835#endif
2836  {
2837    m_GOPList[0] = GOPEntry();
2838    m_GOPList[0].m_QPFactor = 1;
2839    m_GOPList[0].m_betaOffsetDiv2 = 0;
2840    m_GOPList[0].m_tcOffsetDiv2 = 0;
2841    m_GOPList[0].m_POC = 1;
2842    m_GOPList[0].m_numRefPicsActive = 4;
2843  }
2844  else
2845  {
2846    xConfirmPara( m_intraConstraintFlag, "IntraConstraintFlag cannot be 1 for inter sequences");
2847  }
2848
2849  Bool verifiedGOP=false;
2850  Bool errorGOP=false;
2851  Int checkGOP=1;
2852  Int numRefs = m_isField ? 2 : 1;
2853  Int refList[MAX_NUM_REF_PICS+1];
2854  refList[0]=0;
2855  if(m_isField)
2856  {
2857    refList[1] = 1;
2858  }
2859  Bool isOK[MAX_GOP];
2860  for(Int i=0; i<MAX_GOP; i++)
2861  {
2862    isOK[i]=false;
2863  }
2864  Int numOK=0;
2865#if NH_MV
2866  xConfirmPara( m_iIntraPeriod[layer] >=0&&(m_iIntraPeriod[layer]%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" ); 
2867#else
2868  xConfirmPara( m_iIntraPeriod >=0&&(m_iIntraPeriod%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" );
2869#endif
2870
2871  for(Int i=0; i<m_iGOPSize; i++)
2872  {
2873    if(m_GOPList[i].m_POC==m_iGOPSize)
2874    {
2875      xConfirmPara( m_GOPList[i].m_temporalId!=0 , "The last frame in each GOP must have temporal ID = 0 " );
2876    }
2877  }
2878
2879#if NH_MV
2880  if ( (m_iIntraPeriod[layer] != 1) && !m_loopFilterOffsetInPPS && (!m_bLoopFilterDisable[layer]) )
2881#else
2882  if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && (!m_bLoopFilterDisable) )
2883#endif
2884  {
2885    for(Int i=0; i<m_iGOPSize; i++)
2886    {
2887      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)" );
2888      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)" );
2889    }
2890  }
2891
2892  m_extraRPSs=0;
2893  //start looping through frames in coding order until we can verify that the GOP structure is correct.
2894  while(!verifiedGOP&&!errorGOP)
2895  {
2896    Int curGOP = (checkGOP-1)%m_iGOPSize;
2897    Int curPOC = ((checkGOP-1)/m_iGOPSize)*m_iGOPSize + m_GOPList[curGOP].m_POC;
2898    if(m_GOPList[curGOP].m_POC<0)
2899    {
2900#if NH_MV
2901      printf("\nError: found fewer Reference Picture Sets than GOPSize for layer %d\n", layer );
2902#else
2903      printf("\nError: found fewer Reference Picture Sets than GOPSize\n");
2904#endif
2905      errorGOP=true;
2906    }
2907    else
2908    {
2909      //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
2910      Bool beforeI = false;
2911      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
2912      {
2913        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
2914        if(absPOC < 0)
2915        {
2916          beforeI=true;
2917        }
2918        else
2919        {
2920          Bool found=false;
2921          for(Int j=0; j<numRefs; j++)
2922          {
2923            if(refList[j]==absPOC)
2924            {
2925              found=true;
2926              for(Int k=0; k<m_iGOPSize; k++)
2927              {
2928                if(absPOC%m_iGOPSize == m_GOPList[k].m_POC%m_iGOPSize)
2929                {
2930                  if(m_GOPList[k].m_temporalId==m_GOPList[curGOP].m_temporalId)
2931                  {
2932                    m_GOPList[k].m_refPic = true;
2933                  }
2934                  m_GOPList[curGOP].m_usedByCurrPic[i]=m_GOPList[k].m_temporalId<=m_GOPList[curGOP].m_temporalId;
2935                }
2936              }
2937            }
2938          }
2939          if(!found)
2940          {
2941#if NH_MV
2942            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);
2943#else
2944            printf("\nError: ref pic %d is not available for GOP frame %d\n",m_GOPList[curGOP].m_referencePics[i],curGOP+1);
2945#endif
2946            errorGOP=true;
2947          }
2948        }
2949      }
2950      if(!beforeI&&!errorGOP)
2951      {
2952        //all ref frames were present
2953        if(!isOK[curGOP])
2954        {
2955          numOK++;
2956          isOK[curGOP]=true;
2957          if(numOK==m_iGOPSize)
2958          {
2959            verifiedGOP=true;
2960          }
2961        }
2962      }
2963      else
2964      {
2965        //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
2966        m_GOPList[m_iGOPSize+m_extraRPSs]=m_GOPList[curGOP];
2967        Int newRefs=0;
2968        for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
2969        {
2970          Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
2971          if(absPOC>=0)
2972          {
2973            m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[newRefs]=m_GOPList[curGOP].m_referencePics[i];
2974            m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[newRefs]=m_GOPList[curGOP].m_usedByCurrPic[i];
2975            newRefs++;
2976          }
2977        }
2978        Int numPrefRefs = m_GOPList[curGOP].m_numRefPicsActive;
2979
2980        for(Int offset = -1; offset>-checkGOP; offset--)
2981        {
2982          //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
2983          Int offGOP = (checkGOP-1+offset)%m_iGOPSize;
2984          Int offPOC = ((checkGOP-1+offset)/m_iGOPSize)*m_iGOPSize + m_GOPList[offGOP].m_POC;
2985          if(offPOC>=0&&m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId)
2986          {
2987            Bool newRef=false;
2988            for(Int i=0; i<numRefs; i++)
2989            {
2990              if(refList[i]==offPOC)
2991              {
2992                newRef=true;
2993              }
2994            }
2995            for(Int i=0; i<newRefs; i++)
2996            {
2997              if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[i]==offPOC-curPOC)
2998              {
2999                newRef=false;
3000              }
3001            }
3002            if(newRef)
3003            {
3004              Int insertPoint=newRefs;
3005              //this picture can be added, find appropriate place in list and insert it.
3006              if(m_GOPList[offGOP].m_temporalId==m_GOPList[curGOP].m_temporalId)
3007              {
3008                m_GOPList[offGOP].m_refPic = true;
3009              }
3010              for(Int j=0; j<newRefs; j++)
3011              {
3012                if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]<offPOC-curPOC||m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]>0)
3013                {
3014                  insertPoint = j;
3015                  break;
3016                }
3017              }
3018              Int prev = offPOC-curPOC;
3019              Int prevUsed = m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId;
3020              for(Int j=insertPoint; j<newRefs+1; j++)
3021              {
3022                Int newPrev = m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j];
3023                Int newUsed = m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j];
3024                m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]=prev;
3025                m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j]=prevUsed;
3026                prevUsed=newUsed;
3027                prev=newPrev;
3028              }
3029              newRefs++;
3030            }
3031          }
3032          if(newRefs>=numPrefRefs)
3033          {
3034            break;
3035          }
3036        }
3037        m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics=newRefs;
3038        m_GOPList[m_iGOPSize+m_extraRPSs].m_POC = curPOC;
3039        if (m_extraRPSs == 0)
3040        {
3041          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 0;
3042          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = 0;
3043        }
3044        else
3045        {
3046          Int rIdx =  m_iGOPSize + m_extraRPSs - 1;
3047          Int refPOC = m_GOPList[rIdx].m_POC;
3048          Int refPics = m_GOPList[rIdx].m_numRefPics;
3049          Int newIdc=0;
3050          for(Int i = 0; i<= refPics; i++)
3051          {
3052            Int deltaPOC = ((i != refPics)? m_GOPList[rIdx].m_referencePics[i] : 0);  // check if the reference abs POC is >= 0
3053            Int absPOCref = refPOC+deltaPOC;
3054            Int refIdc = 0;
3055            for (Int j = 0; j < m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics; j++)
3056            {
3057              if ( (absPOCref - curPOC) == m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j])
3058              {
3059                if (m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j])
3060                {
3061                  refIdc = 1;
3062                }
3063                else
3064                {
3065                  refIdc = 2;
3066                }
3067              }
3068            }
3069            m_GOPList[m_iGOPSize+m_extraRPSs].m_refIdc[newIdc]=refIdc;
3070            newIdc++;
3071          }
3072          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 1;
3073          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = newIdc;
3074          m_GOPList[m_iGOPSize+m_extraRPSs].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize+m_extraRPSs].m_POC;
3075        }
3076        curGOP=m_iGOPSize+m_extraRPSs;
3077        m_extraRPSs++;
3078      }
3079      numRefs=0;
3080      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
3081      {
3082        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
3083        if(absPOC >= 0)
3084        {
3085          refList[numRefs]=absPOC;
3086          numRefs++;
3087        }
3088      }
3089      refList[numRefs]=curPOC;
3090      numRefs++;
3091    }
3092    checkGOP++;
3093  }
3094  xConfirmPara(errorGOP,"Invalid GOP structure given");
3095  m_maxTempLayer = 1;
3096  for(Int i=0; i<m_iGOPSize; i++)
3097  {
3098    if(m_GOPList[i].m_temporalId >= m_maxTempLayer)
3099    {
3100      m_maxTempLayer = m_GOPList[i].m_temporalId+1;
3101    }
3102    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");
3103  }
3104  for(Int i=0; i<MAX_TLAYER; i++)
3105  {
3106    m_numReorderPics[i] = 0;
3107    m_maxDecPicBuffering[i] = 1;
3108  }
3109  for(Int i=0; i<m_iGOPSize; i++)
3110  {
3111    if(m_GOPList[i].m_numRefPics+1 > m_maxDecPicBuffering[m_GOPList[i].m_temporalId])
3112    {
3113      m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics + 1;
3114    }
3115    Int highestDecodingNumberWithLowerPOC = 0;
3116    for(Int j=0; j<m_iGOPSize; j++)
3117    {
3118      if(m_GOPList[j].m_POC <= m_GOPList[i].m_POC)
3119      {
3120        highestDecodingNumberWithLowerPOC = j;
3121      }
3122    }
3123    Int numReorder = 0;
3124    for(Int j=0; j<highestDecodingNumberWithLowerPOC; j++)
3125    {
3126      if(m_GOPList[j].m_temporalId <= m_GOPList[i].m_temporalId &&
3127        m_GOPList[j].m_POC > m_GOPList[i].m_POC)
3128      {
3129        numReorder++;
3130      }
3131    }
3132    if(numReorder > m_numReorderPics[m_GOPList[i].m_temporalId])
3133    {
3134      m_numReorderPics[m_GOPList[i].m_temporalId] = numReorder;
3135    }
3136  }
3137  for(Int i=0; i<MAX_TLAYER-1; i++)
3138  {
3139    // a lower layer can not have higher value of m_numReorderPics than a higher layer
3140    if(m_numReorderPics[i+1] < m_numReorderPics[i])
3141    {
3142      m_numReorderPics[i+1] = m_numReorderPics[i];
3143    }
3144    // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] - 1, inclusive
3145    if(m_numReorderPics[i] > m_maxDecPicBuffering[i] - 1)
3146    {
3147      m_maxDecPicBuffering[i] = m_numReorderPics[i] + 1;
3148    }
3149    // a lower layer can not have higher value of m_uiMaxDecPicBuffering than a higher layer
3150    if(m_maxDecPicBuffering[i+1] < m_maxDecPicBuffering[i])
3151    {
3152      m_maxDecPicBuffering[i+1] = m_maxDecPicBuffering[i];
3153    }
3154  }
3155
3156  // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] -  1, inclusive
3157  if(m_numReorderPics[MAX_TLAYER-1] > m_maxDecPicBuffering[MAX_TLAYER-1] - 1)
3158  {
3159    m_maxDecPicBuffering[MAX_TLAYER-1] = m_numReorderPics[MAX_TLAYER-1] + 1;
3160  }
3161
3162  if(m_vuiParametersPresentFlag && m_bitstreamRestrictionFlag)
3163  {
3164    Int PicSizeInSamplesY =  m_iSourceWidth * m_iSourceHeight;
3165    if(tileFlag)
3166    {
3167      Int maxTileWidth = 0;
3168      Int maxTileHeight = 0;
3169      Int widthInCU = (m_iSourceWidth % m_uiMaxCUWidth) ? m_iSourceWidth/m_uiMaxCUWidth + 1: m_iSourceWidth/m_uiMaxCUWidth;
3170      Int heightInCU = (m_iSourceHeight % m_uiMaxCUHeight) ? m_iSourceHeight/m_uiMaxCUHeight + 1: m_iSourceHeight/m_uiMaxCUHeight;
3171      if(m_tileUniformSpacingFlag)
3172      {
3173        maxTileWidth = m_uiMaxCUWidth*((widthInCU+m_numTileColumnsMinus1)/(m_numTileColumnsMinus1+1));
3174        maxTileHeight = m_uiMaxCUHeight*((heightInCU+m_numTileRowsMinus1)/(m_numTileRowsMinus1+1));
3175        // if only the last tile-row is one treeblock higher than the others
3176        // the maxTileHeight becomes smaller if the last row of treeblocks has lower height than the others
3177        if(!((heightInCU-1)%(m_numTileRowsMinus1+1)))
3178        {
3179          maxTileHeight = maxTileHeight - m_uiMaxCUHeight + (m_iSourceHeight % m_uiMaxCUHeight);
3180        }
3181        // if only the last tile-column is one treeblock wider than the others
3182        // the maxTileWidth becomes smaller if the last column of treeblocks has lower width than the others
3183        if(!((widthInCU-1)%(m_numTileColumnsMinus1+1)))
3184        {
3185          maxTileWidth = maxTileWidth - m_uiMaxCUWidth + (m_iSourceWidth % m_uiMaxCUWidth);
3186        }
3187      }
3188      else // not uniform spacing
3189      {
3190        if(m_numTileColumnsMinus1<1)
3191        {
3192          maxTileWidth = m_iSourceWidth;
3193        }
3194        else
3195        {
3196          Int accColumnWidth = 0;
3197          for(Int col=0; col<(m_numTileColumnsMinus1); col++)
3198          {
3199            maxTileWidth = m_tileColumnWidth[col]>maxTileWidth ? m_tileColumnWidth[col]:maxTileWidth;
3200            accColumnWidth += m_tileColumnWidth[col];
3201          }
3202          maxTileWidth = (widthInCU-accColumnWidth)>maxTileWidth ? m_uiMaxCUWidth*(widthInCU-accColumnWidth):m_uiMaxCUWidth*maxTileWidth;
3203        }
3204        if(m_numTileRowsMinus1<1)
3205        {
3206          maxTileHeight = m_iSourceHeight;
3207        }
3208        else
3209        {
3210          Int accRowHeight = 0;
3211          for(Int row=0; row<(m_numTileRowsMinus1); row++)
3212          {
3213            maxTileHeight = m_tileRowHeight[row]>maxTileHeight ? m_tileRowHeight[row]:maxTileHeight;
3214            accRowHeight += m_tileRowHeight[row];
3215          }
3216          maxTileHeight = (heightInCU-accRowHeight)>maxTileHeight ? m_uiMaxCUHeight*(heightInCU-accRowHeight):m_uiMaxCUHeight*maxTileHeight;
3217        }
3218      }
3219      Int maxSizeInSamplesY = maxTileWidth*maxTileHeight;
3220      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/maxSizeInSamplesY-4;
3221    }
3222    else if(m_entropyCodingSyncEnabledFlag)
3223    {
3224      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/((2*m_iSourceHeight+m_iSourceWidth)*m_uiMaxCUHeight)-4;
3225    }
3226    else if(m_sliceMode == FIXED_NUMBER_OF_CTU)
3227    {
3228      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/(m_sliceArgument*m_uiMaxCUWidth*m_uiMaxCUHeight)-4;
3229    }
3230    else
3231    {
3232      m_minSpatialSegmentationIdc = 0;
3233    }
3234  }
3235
3236  if (m_toneMappingInfoSEIEnabled)
3237  {
3238    xConfirmPara( m_toneMapCodedDataBitDepth < 8 || m_toneMapCodedDataBitDepth > 14 , "SEIToneMapCodedDataBitDepth must be in rage 8 to 14");
3239    xConfirmPara( m_toneMapTargetBitDepth < 1 || (m_toneMapTargetBitDepth > 16 && m_toneMapTargetBitDepth < 255) , "SEIToneMapTargetBitDepth must be in rage 1 to 16 or equal to 255");
3240    xConfirmPara( m_toneMapModelId < 0 || m_toneMapModelId > 4 , "SEIToneMapModelId must be in rage 0 to 4");
3241    xConfirmPara( m_cameraIsoSpeedValue == 0, "SEIToneMapCameraIsoSpeedValue shall not be equal to 0");
3242    xConfirmPara( m_exposureIndexValue  == 0, "SEIToneMapExposureIndexValue shall not be equal to 0");
3243    xConfirmPara( m_extendedRangeWhiteLevel < 100, "SEIToneMapExtendedRangeWhiteLevel should be greater than or equal to 100");
3244    xConfirmPara( m_nominalBlackLevelLumaCodeValue >= m_nominalWhiteLevelLumaCodeValue, "SEIToneMapNominalWhiteLevelLumaCodeValue shall be greater than SEIToneMapNominalBlackLevelLumaCodeValue");
3245    xConfirmPara( m_extendedWhiteLevelLumaCodeValue < m_nominalWhiteLevelLumaCodeValue, "SEIToneMapExtendedWhiteLevelLumaCodeValue shall be greater than or equal to SEIToneMapNominalWhiteLevelLumaCodeValue");
3246  }
3247
3248  if (m_kneeSEIEnabled && !m_kneeSEICancelFlag)
3249  {
3250    xConfirmPara( m_kneeSEINumKneePointsMinus1 < 0 || m_kneeSEINumKneePointsMinus1 > 998, "SEIKneeFunctionNumKneePointsMinus1 must be in the range of 0 to 998");
3251    for ( UInt i=0; i<=m_kneeSEINumKneePointsMinus1; i++ )
3252    {
3253      xConfirmPara( m_kneeSEIInputKneePoint[i] < 1 || m_kneeSEIInputKneePoint[i] > 999, "SEIKneeFunctionInputKneePointValue must be in the range of 1 to 999");
3254      xConfirmPara( m_kneeSEIOutputKneePoint[i] < 0 || m_kneeSEIOutputKneePoint[i] > 1000, "SEIKneeFunctionInputKneePointValue must be in the range of 0 to 1000");
3255      if ( i > 0 )
3256      {
3257        xConfirmPara( m_kneeSEIInputKneePoint[i-1] >= m_kneeSEIInputKneePoint[i],  "The i-th SEIKneeFunctionInputKneePointValue must be greater than the (i-1)-th value");
3258        xConfirmPara( m_kneeSEIOutputKneePoint[i-1] > m_kneeSEIOutputKneePoint[i],  "The i-th SEIKneeFunctionOutputKneePointValue must be greater than or equal to the (i-1)-th value");
3259      }
3260    }
3261  }
3262
3263  if (m_chromaResamplingFilterSEIenabled)
3264  {
3265    xConfirmPara( (m_chromaFormatIDC == CHROMA_400 ), "chromaResamplingFilterSEI is not allowed to be present when ChromaFormatIDC is equal to zero (4:0:0)" );
3266    xConfirmPara(m_vuiParametersPresentFlag && m_chromaLocInfoPresentFlag && (m_chromaSampleLocTypeTopField != m_chromaSampleLocTypeBottomField ), "When chromaResamplingFilterSEI is enabled, ChromaSampleLocTypeTopField has to be equal to ChromaSampleLocTypeBottomField" );
3267  }
3268
3269  if ( m_RCEnableRateControl )
3270  {
3271    if ( m_RCForceIntraQP )
3272    {
3273      if ( m_RCInitialQP == 0 )
3274      {
3275        printf( "\nInitial QP for rate control is not specified. Reset not to use force intra QP!" );
3276        m_RCForceIntraQP = false;
3277      }
3278    }
3279    xConfirmPara( m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n" );
3280#if U0132_TARGET_BITS_SATURATION
3281#if NH_MV
3282    if ((m_RCCpbSaturationEnabled) && (m_level[0]!=Level::NONE) && (m_profile!=Profile::NONE))
3283    {
3284      UInt uiLevelIdx = (m_level[0] / 10) + (UInt)((m_level[0] % 10) / 3);    // (m_level / 30)*3 + ((m_level % 10) / 3);
3285      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");
3286      xConfirmPara(m_RCInitialCpbFullness > 1, "RCInitialCpbFullness should be smaller than or equal to 1");
3287    }
3288#else
3289    if ((m_RCCpbSaturationEnabled) && (m_level!=Level::NONE) && (m_profile!=Profile::NONE))
3290    {
3291      UInt uiLevelIdx = (m_level / 10) + (UInt)((m_level % 10) / 3);    // (m_level / 30)*3 + ((m_level % 10) / 3);
3292      xConfirmPara(m_RCCpbSize > g_uiMaxCpbSize[m_levelTier][uiLevelIdx], "RCCpbSize should be smaller than or equal to Max CPB size according to tier and level");
3293      xConfirmPara(m_RCInitialCpbFullness > 1, "RCInitialCpbFullness should be smaller than or equal to 1");
3294    }
3295#endif
3296#endif
3297  }
3298#if U0132_TARGET_BITS_SATURATION
3299  else
3300  {
3301    xConfirmPara( m_RCCpbSaturationEnabled != 0, "Target bits saturation cannot be processed without Rate control" );
3302  }
3303#endif
3304
3305#if NH_MV
3306  // VPS VUI
3307  for(Int i = 0; i < MAX_VPS_OP_SETS_PLUS1; i++ )
3308  { 
3309    for (Int j = 0; j < MAX_TLAYER; j++)
3310    {   
3311      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" );
3312      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" );
3313      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" );
3314      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" );
3315    }
3316  }
3317  // todo: replace value of 100 with requirement in spec
3318  for(Int i = 0; i < MAX_NUM_LAYERS; i++ )
3319  { 
3320    for (Int j = 0; j < MAX_NUM_LAYERS; j++)
3321    {   
3322      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" );
3323      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" );
3324    }
3325  }
3326#endif
3327
3328  xConfirmPara(!m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagForce, "CUTransquantBypassFlagForce cannot be 1 when TransquantBypassEnableFlag is 0");
3329
3330  xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2");
3331
3332  if (m_framePackingSEIEnabled)
3333  {
3334    xConfirmPara(m_framePackingSEIType < 3 || m_framePackingSEIType > 5 , "SEIFramePackingType must be in rage 3 to 5");
3335  }
3336#if NH_MV
3337  }
3338  }
3339#if !NH_MV_SEI
3340  // Check input parameters for Sub-bitstream property SEI message
3341  if( m_subBistreamPropSEIEnabled )
3342  {
3343    xConfirmPara( 
3344      (this->m_sbPropNumAdditionalSubStreams != m_sbPropAvgBitRate.size() )
3345      || (this->m_sbPropNumAdditionalSubStreams != m_sbPropHighestSublayerId.size() )
3346      || (this->m_sbPropNumAdditionalSubStreams != m_sbPropMaxBitRate.size() )
3347      || (this->m_sbPropNumAdditionalSubStreams != m_sbPropOutputLayerSetIdxToVps.size() )
3348      || (this->m_sbPropNumAdditionalSubStreams != m_sbPropSubBitstreamMode.size()), "Some parameters of some sub-bitstream not defined");
3349
3350    for( Int i = 0; i < m_sbPropNumAdditionalSubStreams; i++ )
3351    {
3352      xConfirmPara( m_sbPropSubBitstreamMode[i] < 0 || m_sbPropSubBitstreamMode[i] > 1, "Mode value should be 0 or 1" );
3353      xConfirmPara( m_sbPropHighestSublayerId[i] < 0 || m_sbPropHighestSublayerId[i] > MAX_TLAYER-1, "Maximum sub-layer ID out of range" );
3354      xConfirmPara( m_sbPropOutputLayerSetIdxToVps[i] < 0 || m_sbPropOutputLayerSetIdxToVps[i] >= MAX_VPS_OUTPUTLAYER_SETS, "OutputLayerSetIdxToVps should be within allowed range" );
3355    }
3356  }
3357#endif
3358#endif
3359
3360  if (m_segmentedRectFramePackingSEIEnabled)
3361  {
3362    xConfirmPara(m_framePackingSEIEnabled , "SEISegmentedRectFramePacking must be 0 when SEIFramePacking is 1");
3363  }
3364
3365  if((m_numTileColumnsMinus1 <= 0) && (m_numTileRowsMinus1 <= 0) && m_tmctsSEIEnabled)
3366  {
3367    printf("Warning: SEITempMotionConstrainedTileSets is set to false to disable temporal motion-constrained tile sets SEI message because there are no tiles enabled.\n");
3368    m_tmctsSEIEnabled = false;
3369  }
3370
3371  if(m_timeCodeSEIEnabled)
3372  {
3373    xConfirmPara(m_timeCodeSEINumTs > MAX_TIMECODE_SEI_SETS, "Number of time sets cannot exceed 3");
3374  }
3375
3376#undef xConfirmPara
3377  if (check_failed)
3378  {
3379    exit(EXIT_FAILURE);
3380  }
3381}
3382
3383const TChar *profileToString(const Profile::Name profile)
3384{
3385  static const UInt numberOfProfiles = sizeof(strToProfile)/sizeof(*strToProfile);
3386
3387  for (UInt profileIndex = 0; profileIndex < numberOfProfiles; profileIndex++)
3388  {
3389    if (strToProfile[profileIndex].value == profile)
3390    {
3391      return strToProfile[profileIndex].str;
3392    }
3393  }
3394
3395  //if we get here, we didn't find this profile in the list - so there is an error
3396  std::cerr << "ERROR: Unknown profile \"" << profile << "\" in profileToString" << std::endl;
3397  assert(false);
3398  exit(1);
3399  return "";
3400}
3401
3402Void TAppEncCfg::xPrintParameter()
3403{
3404  printf("\n");
3405#if NH_MV
3406  for( Int layer = 0; layer < m_numberOfLayers; layer++)
3407  {
3408    printf("Input File %i                     : %s\n", layer, m_pchInputFileList[layer]);
3409  }
3410#else
3411  printf("Input          File                    : %s\n", m_inputFileName.c_str()          );
3412#endif
3413  printf("Bitstream      File                    : %s\n", m_bitstreamFileName.c_str()      );
3414#if NH_MV
3415  for( Int layer = 0; layer < m_numberOfLayers; layer++)
3416  {
3417    printf("Reconstruction File %i            : %s\n", layer, m_pchReconFileList[layer]);
3418  }
3419#else
3420  printf("Reconstruction File                    : %s\n", m_reconFileName.c_str()          );
3421#endif
3422#if NH_MV
3423  xPrintParaVector( "NuhLayerId"     , m_layerIdInNuh ); 
3424  if ( m_targetEncLayerIdList.size() > 0)
3425  {
3426    xPrintParaVector( "TargetEncLayerIdList"     , m_targetEncLayerIdList ); 
3427  }
3428  xPrintParaVector( "ViewIdVal"     , m_viewId ); 
3429  xPrintParaVector( "ViewOrderIdx"  , m_viewOrderIndex ); 
3430  xPrintParaVector( "AuxId", m_auxId );
3431#endif
3432#if NH_3D
3433  xPrintParaVector( "DepthLayerFlag", m_depthFlag ); 
3434  printf("Coded Camera Param. Precision     : %d\n", m_iCodedCamParPrecision); 
3435#endif
3436#if NH_MV 
3437  xPrintParaVector( "QP"               , m_fQP                ); 
3438  xPrintParaVector( "LoopFilterDisable", m_bLoopFilterDisable ); 
3439  xPrintParaVector( "SAO"              , m_bUseSAO            ); 
3440#endif
3441
3442  printf("Real     Format                   : %dx%d %dHz\n", m_iSourceWidth - m_confWinLeft - m_confWinRight, m_iSourceHeight - m_confWinTop - m_confWinBottom, m_iFrameRate );
3443  printf("Internal Format                   : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate );
3444  printf("Sequence PSNR output              : %s\n", (m_printMSEBasedSequencePSNR ? "Linear average, MSE-based" : "Linear average only") );
3445  printf("Sequence MSE output               : %s\n", (m_printSequenceMSE ? "Enabled" : "Disabled") );
3446  printf("Frame MSE output                  : %s\n", (m_printFrameMSE    ? "Enabled" : "Disabled") );
3447  printf("Cabac-zero-word-padding           : %s\n", (m_cabacZeroWordPaddingEnabled? "Enabled" : "Disabled") );
3448  if (m_isField)
3449  {
3450    printf("Frame/Field                       : Field based coding\n");
3451    printf("Field index                       : %u - %d (%d fields)\n", m_FrameSkip, m_FrameSkip+m_framesToBeEncoded-1, m_framesToBeEncoded );
3452    printf("Field Order                       : %s field first\n", m_isTopFieldFirst?"Top":"Bottom");
3453
3454  }
3455  else
3456  {
3457    printf("Frame/Field                       : Frame based coding\n");
3458    printf("Frame index                       : %u - %d (%d frames)\n", m_FrameSkip, m_FrameSkip+m_framesToBeEncoded-1, m_framesToBeEncoded );
3459  }
3460#if NH_MV
3461  printf("Profile                           :");
3462  for (Int i = 0; i < m_profiles.size(); i++)
3463  {
3464    Profile::Name m_profile = m_profiles[i];
3465
3466#endif
3467    if (m_profile == Profile::MAINREXT)
3468    {
3469    ExtendedProfileName validProfileName;
3470    if (m_onePictureOnlyConstraintFlag)
3471    {
3472      validProfileName = m_bitDepthConstraint == 8 ? MAIN_444_STILL_PICTURE : (m_bitDepthConstraint == 16 ? MAIN_444_16_STILL_PICTURE : NONE);
3473    }
3474    else
3475    {
3476      const UInt intraIdx = m_intraConstraintFlag ? 1:0;
3477      const UInt bitDepthIdx = (m_bitDepthConstraint == 8 ? 0 : (m_bitDepthConstraint ==10 ? 1 : (m_bitDepthConstraint == 12 ? 2 : (m_bitDepthConstraint == 16 ? 3 : 4 ))));
3478      const UInt chromaFormatIdx = UInt(m_chromaFormatConstraint);
3479      validProfileName = (bitDepthIdx > 3 || chromaFormatIdx>3) ? NONE : validRExtProfileNames[intraIdx][bitDepthIdx][chromaFormatIdx];
3480    }
3481      std::string rextSubProfile;
3482      if (validProfileName!=NONE)
3483      {
3484        rextSubProfile=enumToString(strToExtendedProfile, sizeof(strToExtendedProfile)/sizeof(*strToExtendedProfile), validProfileName);
3485      }
3486      if (rextSubProfile == "main_444_16")
3487      {
3488        rextSubProfile="main_444_16 [NON STANDARD]";
3489      }
3490#if NH_MV
3491      printf(" %s (%s) ", profileToString(m_profile), (rextSubProfile.empty())?"INVALID REXT PROFILE":rextSubProfile.c_str() );
3492#else
3493      printf("Profile                           : %s (%s)\n", profileToString(m_profile), (rextSubProfile.empty())?"INVALID REXT PROFILE":rextSubProfile.c_str() );
3494#endif
3495    }
3496    else
3497    {
3498#if NH_MV
3499      printf(" %s ", profileToString(m_profile) );
3500#else
3501      printf("Profile                           : %s\n", profileToString(m_profile) );
3502#endif
3503    }
3504#if NH_MV   
3505  }
3506  printf("\n");
3507#endif
3508
3509  printf("CU size / depth / total-depth     : %d / %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth, m_uiMaxTotalCUDepth );
3510  printf("RQT trans. size (min / max)       : %d / %d\n", 1 << m_uiQuadtreeTULog2MinSize, 1 << m_uiQuadtreeTULog2MaxSize );
3511  printf("Max RQT depth inter               : %d\n", m_uiQuadtreeTUMaxDepthInter);
3512  printf("Max RQT depth intra               : %d\n", m_uiQuadtreeTUMaxDepthIntra);
3513  printf("Min PCM size                      : %d\n", 1 << m_uiPCMLog2MinSize);
3514  printf("Motion search range               : %d\n", m_iSearchRange );
3515#if NH_MV
3516  printf("Disp search range restriction     : %d\n", m_bUseDisparitySearchRangeRestriction );
3517  printf("Vertical disp search range        : %d\n", m_iVerticalDisparitySearchRange );
3518#endif
3519#if NH_MV
3520  xPrintParaVector( "Intra period", m_iIntraPeriod );
3521#else
3522  printf("Intra period                      : %d\n", m_iIntraPeriod );
3523#endif
3524  printf("Decoding refresh type             : %d\n", m_iDecodingRefreshType );
3525#if !NH_MV
3526  printf("QP                                : %5.2f\n", m_fQP );
3527#endif
3528  printf("Max dQP signaling depth           : %d\n", m_iMaxCuDQPDepth);
3529
3530  printf("Cb QP Offset                      : %d\n", m_cbQpOffset   );
3531  printf("Cr QP Offset                      : %d\n", m_crQpOffset);
3532  printf("QP adaptation                     : %d (range=%d)\n", m_bUseAdaptiveQP, (m_bUseAdaptiveQP ? m_iQPAdaptationRange : 0) );
3533  printf("GOP size                          : %d\n", m_iGOPSize );
3534  printf("Input bit depth                   : (Y:%d, C:%d)\n", m_inputBitDepth[CHANNEL_TYPE_LUMA], m_inputBitDepth[CHANNEL_TYPE_CHROMA] );
3535  printf("MSB-extended bit depth            : (Y:%d, C:%d)\n", m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA], m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] );
3536  printf("Internal bit depth                : (Y:%d, C:%d)\n", m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA] );
3537  printf("PCM sample bit depth              : (Y:%d, C:%d)\n", m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA] : m_internalBitDepth[CHANNEL_TYPE_LUMA],
3538                                                               m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] : m_internalBitDepth[CHANNEL_TYPE_CHROMA] );
3539  printf("Intra reference smoothing         : %s\n", (m_enableIntraReferenceSmoothing          ? "Enabled" : "Disabled") );
3540  printf("diff_cu_chroma_qp_offset_depth         : %d\n", m_diffCuChromaQpOffsetDepth);
3541  printf("extended_precision_processing_flag     : %s\n", (m_extendedPrecisionProcessingFlag         ? "Enabled" : "Disabled") );
3542  printf("implicit_rdpcm_enabled_flag            : %s\n", (m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT] ? "Enabled" : "Disabled") );
3543  printf("explicit_rdpcm_enabled_flag            : %s\n", (m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT] ? "Enabled" : "Disabled") );
3544  printf("transform_skip_rotation_enabled_flag   : %s\n", (m_transformSkipRotationEnabledFlag        ? "Enabled" : "Disabled") );
3545  printf("transform_skip_context_enabled_flag    : %s\n", (m_transformSkipContextEnabledFlag         ? "Enabled" : "Disabled") );
3546  printf("cross_component_prediction_enabled_flag: %s\n", (m_crossComponentPredictionEnabledFlag     ? (m_reconBasedCrossCPredictionEstimate ? "Enabled (reconstructed-residual-based estimate)" : "Enabled (encoder-side-residual-based estimate)") : "Disabled") );
3547  printf("high_precision_offsets_enabled_flag    : %s\n", (m_highPrecisionOffsetsEnabledFlag         ? "Enabled" : "Disabled") );
3548  printf("persistent_rice_adaptation_enabled_flag: %s\n", (m_persistentRiceAdaptationEnabledFlag     ? "Enabled" : "Disabled") );
3549  printf("cabac_bypass_alignment_enabled_flag    : %s\n", (m_cabacBypassAlignmentEnabledFlag         ? "Enabled" : "Disabled") );
3550#if NH_MV
3551  Bool anySAO = false; 
3552  IntAry1d saoOffBitShiftL;
3553  IntAry1d saoOffBitShiftC;
3554
3555  for (Int i = 0; i < m_numberOfLayers; i++)
3556  {
3557    if ( m_bUseSAO[i] )
3558    {
3559      anySAO = true; 
3560      saoOffBitShiftL.push_back( m_log2SaoOffsetScale[i][CHANNEL_TYPE_LUMA] );
3561      saoOffBitShiftC.push_back( m_log2SaoOffsetScale[i][CHANNEL_TYPE_CHROMA] );
3562    }
3563    else
3564    {
3565      saoOffBitShiftL.push_back( -1 );
3566      saoOffBitShiftC.push_back( -1 );
3567    }
3568  }
3569  if (anySAO)
3570  {
3571    xPrintParaVector( "Sao Luma Offset bit shifts"  , saoOffBitShiftL );
3572    xPrintParaVector( "Sao Chroma Offset bit shifts", saoOffBitShiftC );
3573  }
3574#else
3575  if (m_bUseSAO)
3576  {
3577    printf("log2_sao_offset_scale_luma             : %d\n", m_log2SaoOffsetScale[CHANNEL_TYPE_LUMA]);
3578    printf("log2_sao_offset_scale_chroma           : %d\n", m_log2SaoOffsetScale[CHANNEL_TYPE_CHROMA]);
3579  }
3580#endif
3581
3582  switch (m_costMode)
3583  {
3584    case COST_STANDARD_LOSSY:               printf("Cost function:                    : Lossy coding (default)\n"); break;
3585    case COST_SEQUENCE_LEVEL_LOSSLESS:      printf("Cost function:                    : Sequence_level_lossless coding\n"); break;
3586    case COST_LOSSLESS_CODING:              printf("Cost function:                    : Lossless coding with fixed QP of %d\n", LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP); break;
3587    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;
3588    default:                                printf("Cost function:                    : Unknown\n"); break;
3589  }
3590
3591  printf("RateControl                       : %d\n", m_RCEnableRateControl );
3592  printf("WPMethod                               : %d\n", Int(m_weightedPredictionMethod));
3593
3594  if(m_RCEnableRateControl)
3595  {
3596    printf("TargetBitrate                     : %d\n", m_RCTargetBitrate );
3597    printf("KeepHierarchicalBit               : %d\n", m_RCKeepHierarchicalBit );
3598    printf("LCULevelRC                        : %d\n", m_RCLCULevelRC );
3599    printf("UseLCUSeparateModel               : %d\n", m_RCUseLCUSeparateModel );
3600    printf("InitialQP                         : %d\n", m_RCInitialQP );
3601    printf("ForceIntraQP                      : %d\n", m_RCForceIntraQP );
3602
3603#if U0132_TARGET_BITS_SATURATION
3604    printf("CpbSaturation                          : %d\n", m_RCCpbSaturationEnabled );
3605    if (m_RCCpbSaturationEnabled)
3606    {
3607      printf("CpbSize                                : %d\n", m_RCCpbSize);
3608      printf("InitalCpbFullness                      : %.2f\n", m_RCInitialCpbFullness);
3609    }
3610#endif
3611
3612#if KWU_RC_MADPRED_E0227
3613    printf("Depth based MAD prediction   : %d\n", m_depthMADPred);
3614#endif
3615#if KWU_RC_VIEWRC_E0227
3616    printf("View-wise Rate control       : %d\n", m_viewWiseRateCtrl);
3617    if(m_viewWiseRateCtrl)
3618    {
3619
3620      printf("ViewWiseTargetBits           : ");
3621      for (Int i = 0 ; i < m_iNumberOfViews ; i++)
3622        printf("%d ", m_viewTargetBits[i]);
3623      printf("\n");
3624    }
3625    else
3626    {
3627      printf("TargetBitrate                : %d\n", m_RCTargetBitrate );
3628    }
3629#endif
3630
3631  }
3632
3633  printf("Max Num Merge Candidates          : %d\n", m_maxNumMergeCand);
3634#if NH_3D
3635  printf("BaseViewCameraNumbers             : %s\n", m_pchBaseViewCameraNumbers ); 
3636  printf("Coded Camera Param. Precision     : %d\n", m_iCodedCamParPrecision);
3637#if NH_3D_VSO
3638  printf("Force use of Lambda Scale         : %d\n", m_bForceLambdaScaleVSO );
3639
3640  if ( m_bUseVSO )
3641  {   
3642    printf("VSO Lambda Scale                  : %5.2f\n", m_dLambdaScaleVSO );
3643    printf("VSO Mode                          : %d\n",    m_uiVSOMode       );
3644    printf("VSO Config                        : %s\n",    m_pchVSOConfig    );
3645    printf("VSO Negative Distortion           : %d\n",    m_bAllowNegDist ? 1 : 0);
3646    printf("VSO LS Table                      : %d\n",    m_bVSOLSTable ? 1 : 0);
3647    printf("VSO Estimated VSD                 : %d\n",    m_bUseEstimatedVSD ? 1 : 0);
3648    printf("VSO Early Skip                    : %d\n",    m_bVSOEarlySkip ? 1 : 0);   
3649    if ( m_bUseWVSO )
3650    {
3651      printf("Dist. Weights (VSO/VSD/SAD)       : %d/%d/%d\n ", m_iVSOWeight, m_iVSDWeight, m_iDWeight );   
3652    }   
3653  }
3654#endif //HHI_VSO
3655#endif //NH_3D
3656  printf("\n");
3657#if NH_MV
3658  printf("TOOL CFG General: ");
3659#else
3660  printf("TOOL CFG: ");
3661#endif
3662  printf("IBD:%d ", ((m_internalBitDepth[CHANNEL_TYPE_LUMA] > m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA]) || (m_internalBitDepth[CHANNEL_TYPE_CHROMA] > m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA])));
3663  printf("HAD:%d ", m_bUseHADME           );
3664  printf("RDQ:%d ", m_useRDOQ            );
3665  printf("RDQTS:%d ", m_useRDOQTS        );
3666  printf("RDpenalty:%d ", m_rdPenalty  );
3667  printf("SQP:%d ", m_uiDeltaQpRD         );
3668  printf("ASR:%d ", m_bUseASR             );
3669  printf("MinSearchWindow:%d ", m_minSearchWindow        );
3670  printf("RestrictMESampling:%d ", m_bRestrictMESampling );
3671  printf("FEN:%d ", Int(m_fastInterSearchMode)           );
3672  printf("ECU:%d ", m_bUseEarlyCU         );
3673  printf("FDM:%d ", m_useFastDecisionForMerge );
3674  printf("CFM:%d ", m_bUseCbfFastMode         );
3675  printf("ESD:%d ", m_useEarlySkipDetection  );
3676  printf("RQT:%d ", 1     );
3677  printf("TransformSkip:%d ",     m_useTransformSkip              );
3678  printf("TransformSkipFast:%d ", m_useTransformSkipFast       );
3679  printf("TransformSkipLog2MaxSize:%d ", m_log2MaxTransformSkipBlockSize);
3680  printf("Slice: M=%d ", Int(m_sliceMode));
3681  if (m_sliceMode!=NO_SLICES)
3682  {
3683    printf("A=%d ", m_sliceArgument);
3684  }
3685  printf("SliceSegment: M=%d ",m_sliceSegmentMode);
3686  if (m_sliceSegmentMode!=NO_SLICES)
3687  {
3688    printf("A=%d ", m_sliceSegmentArgument);
3689  }
3690  printf("CIP:%d ", m_bUseConstrainedIntraPred);
3691#if !NH_MV
3692  printf("SAO:%d ", (m_bUseSAO)?(1):(0));
3693#endif
3694  printf("PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0);
3695
3696  if (m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagForce)
3697  {
3698    printf("TransQuantBypassEnabled: =1");
3699  }
3700  else
3701  {
3702    printf("TransQuantBypassEnabled:%d ", (m_TransquantBypassEnableFlag)? 1:0 );
3703  }
3704
3705  printf("WPP:%d ", (Int)m_useWeightedPred);
3706  printf("WPB:%d ", (Int)m_useWeightedBiPred);
3707  printf("PME:%d ", m_log2ParallelMergeLevel);
3708  const Int iWaveFrontSubstreams = m_entropyCodingSyncEnabledFlag ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1;
3709  printf(" WaveFrontSynchro:%d WaveFrontSubstreams:%d", m_entropyCodingSyncEnabledFlag?1:0, iWaveFrontSubstreams);
3710  printf(" ScalingList:%d ", m_useScalingListId );
3711  printf("TMVPMode:%d ", m_TMVPModeId     );
3712#if ADAPTIVE_QP_SELECTION
3713  printf("AQpS:%d", m_bUseAdaptQpSelect   );
3714#endif
3715
3716  printf(" SignBitHidingFlag:%d ", m_signHideFlag);
3717  printf("RecalQP:%d", m_recalculateQPAccordingToLambda ? 1 : 0 );
3718#if NH_3D_VSO
3719  printf(" VSO:%d ", m_bUseVSO   );
3720  printf("WVSO:%d ", m_bUseWVSO ); 
3721#endif
3722#if NH_3D
3723  printf( "QTL:%d "                  , m_bUseQTL);
3724  printf( "IlluCompEnable:%d "       , m_abUseIC);
3725  printf( "IlluCompLowLatencyEnc:%d ",  m_bUseLowLatencyICEnc);
3726  printf( "DLT:%d ", m_useDLT );
3727
3728
3729  printf( "IvMvPred:%d %d "            , m_ivMvPredFlag[0] ? 1 : 0, m_ivMvPredFlag[1]  ? 1 : 0);
3730  printf( "IvMvScaling:%d %d "         , m_ivMvScalingFlag[0] ? 1 : 0 , m_ivMvScalingFlag[1]  ? 1 : 0);
3731
3732  printf( "Log2SubPbSizeMinus3:%d "    , m_log2SubPbSizeMinus3            );
3733  printf( "IvResPred:%d "              , m_ivResPredFlag          ? 1 : 0 );
3734  printf( "DepthRefinement:%d "        , m_depthRefinementFlag    ? 1 : 0 );
3735  printf( "ViewSynthesisPred:%d "      , m_viewSynthesisPredFlag  ? 1 : 0 );
3736  printf( "DepthBasedBlkPart:%d "      , m_depthBasedBlkPartFlag  ? 1 : 0 );
3737  printf( "Mpi:%d "                    , m_mpiFlag                ? 1 : 0 );
3738  printf( "Log2MpiSubPbSizeMinus3:%d " , m_log2MpiSubPbSizeMinus3         );
3739  printf( "IntraContour:%d "           , m_intraContourFlag       ? 1 : 0 );
3740  printf( "IntraWedge:%d "             , m_intraWedgeFlag         ? 1 : 0 );
3741  printf( "IntraSdc:%d "               , m_intraSdcFlag           ? 1 : 0 );
3742  printf( "QtPred:%d "                 , m_qtPredFlag             ? 1 : 0 );
3743  printf( "InterSdc:%d "               , m_interSdcFlag           ? 1 : 0 );
3744  printf( "DepthIntraSkip:%d "         , m_depthIntraSkipFlag     ? 1 : 0 );
3745#endif
3746
3747  printf("\n\n");
3748
3749  fflush(stdout);
3750}
3751
3752Bool confirmPara(Bool bflag, const TChar* message)
3753{
3754  if (!bflag)
3755  {
3756    return false;
3757  }
3758
3759  printf("Error: %s\n",message);
3760  return true;
3761}
3762
3763//! \}
Note: See TracBrowser for help on using the repository browser.