source: 3DVCSoftware/branches/HTM-DEV-0.3-dev0/source/App/TAppEncoder/TAppEncCfg.cpp @ 492

Last change on this file since 492 was 492, checked in by tech, 11 years ago

Added encoder parameters related to output layers.

  • Property svn:eol-style set to native
File size: 108.0 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-2013, 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 <stdlib.h>
39#include <cassert>
40#include <cstring>
41#include <string>
42#include "TLibCommon/TComRom.h"
43#include "TAppEncCfg.h"
44
45static istream& operator>>(istream &, Level::Name &);
46static istream& operator>>(istream &, Level::Tier &);
47static istream& operator>>(istream &, Profile::Name &);
48
49#include "TAppCommon/program_options_lite.h"
50#include "TLibEncoder/TEncRateCtrl.h"
51#ifdef WIN32
52#define strdup _strdup
53#endif
54
55using namespace std;
56namespace po = df::program_options_lite;
57
58//! \ingroup TAppEncoder
59//! \{
60
61// ====================================================================================================================
62// Constructor / destructor / initialization / destroy
63// ====================================================================================================================
64
65TAppEncCfg::TAppEncCfg()
66#if H_MV
67: m_pchBitstreamFile()
68#else
69: m_pchInputFile()
70, m_pchBitstreamFile()
71, m_pchReconFile()
72#endif
73, m_pchdQPFile()
74, m_pColumnWidth()
75, m_pRowHeight()
76, m_scalingListFile()
77{
78#if !H_MV
79  m_aidQP = NULL;
80#endif
81#if J0149_TONE_MAPPING_SEI
82  m_startOfCodedInterval = NULL;
83  m_codedPivotValue = NULL;
84  m_targetPivotValue = NULL;
85#endif
86}
87
88TAppEncCfg::~TAppEncCfg()
89{
90#if H_MV
91  for( Int layer = 0; layer < m_aidQP.size(); layer++ )
92  {
93    if ( m_aidQP[layer] != NULL )
94    {
95      delete[] m_aidQP[layer];
96      m_aidQP[layer] = NULL;
97    }
98  }
99  for(Int i = 0; i< m_pchInputFileList.size(); i++ )
100  {
101    if ( m_pchInputFileList[i] != NULL )
102      free (m_pchInputFileList[i]);
103  }
104#else
105  if ( m_aidQP )
106  {
107    delete[] m_aidQP;
108  }
109#endif
110#if J0149_TONE_MAPPING_SEI
111  if ( m_startOfCodedInterval )
112  {
113    delete[] m_startOfCodedInterval;
114    m_startOfCodedInterval = NULL;
115  }
116   if ( m_codedPivotValue )
117  {
118    delete[] m_codedPivotValue;
119    m_codedPivotValue = NULL;
120  }
121  if ( m_targetPivotValue )
122  {
123    delete[] m_targetPivotValue;
124    m_targetPivotValue = NULL;
125  }
126#endif
127#if !H_MV
128  free(m_pchInputFile);
129#endif
130  free(m_pchBitstreamFile);
131#if H_MV
132  for(Int i = 0; i< m_pchReconFileList.size(); i++ )
133  {
134    if ( m_pchReconFileList[i] != NULL )
135      free (m_pchReconFileList[i]);
136  }
137#else
138  free(m_pchReconFile);
139#endif
140  free(m_pchdQPFile);
141  free(m_pColumnWidth);
142  free(m_pRowHeight);
143  free(m_scalingListFile);
144#if H_MV
145  for( Int i = 0; i < m_GOPListMvc.size(); i++ )
146  {
147    if( m_GOPListMvc[i] )
148    {
149      delete[] m_GOPListMvc[i];
150      m_GOPListMvc[i] = NULL;
151    }
152  }
153#endif
154#if H_3D
155#if H_3D_VSO
156  if (  m_pchVSOConfig != NULL)
157    free (  m_pchVSOConfig );
158#endif
159  if ( m_pchCameraParameterFile != NULL )
160    free ( m_pchCameraParameterFile ); 
161
162  if ( m_pchBaseViewCameraNumbers != NULL )
163    free ( m_pchBaseViewCameraNumbers ); 
164#endif
165}
166
167Void TAppEncCfg::create()
168{
169}
170
171Void TAppEncCfg::destroy()
172{
173}
174
175std::istringstream &operator>>(std::istringstream &in, GOPEntry &entry)     //input
176{
177  in>>entry.m_sliceType;
178  in>>entry.m_POC;
179  in>>entry.m_QPOffset;
180  in>>entry.m_QPFactor;
181  in>>entry.m_tcOffsetDiv2;
182  in>>entry.m_betaOffsetDiv2;
183  in>>entry.m_temporalId;
184  in>>entry.m_numRefPicsActive;
185  in>>entry.m_numRefPics;
186  for ( Int i = 0; i < entry.m_numRefPics; i++ )
187  {
188    in>>entry.m_referencePics[i];
189  }
190  in>>entry.m_interRPSPrediction;
191#if AUTO_INTER_RPS
192  if (entry.m_interRPSPrediction==1)
193  {
194    in>>entry.m_deltaRPS;
195    in>>entry.m_numRefIdc;
196    for ( Int i = 0; i < entry.m_numRefIdc; i++ )
197    {
198      in>>entry.m_refIdc[i];
199    }
200  }
201  else if (entry.m_interRPSPrediction==2)
202  {
203    in>>entry.m_deltaRPS;
204  }
205#else
206  if (entry.m_interRPSPrediction)
207  {
208    in>>entry.m_deltaRPS;
209    in>>entry.m_numRefIdc;
210    for ( Int i = 0; i < entry.m_numRefIdc; i++ )
211    {
212      in>>entry.m_refIdc[i];
213    }
214  }
215#endif
216#if H_MV
217  in>>entry.m_numInterViewRefPics;
218  for( Int i = 0; i < entry.m_numInterViewRefPics; i++ )
219  {
220    in>>entry.m_interViewRefs[i];
221  }
222  for( Int i = 0; i < entry.m_numInterViewRefPics; i++ )
223  {
224    in>>entry.m_interViewRefPosL[0][i];
225  }
226  for( Int i = 0; i < entry.m_numInterViewRefPics; i++ )
227  {
228    in>>entry.m_interViewRefPosL[1][i];
229  }
230#endif
231  return in;
232}
233
234static const struct MapStrToProfile {
235  const Char* str;
236  Profile::Name value;
237} strToProfile[] = {
238  {"none", Profile::NONE},
239  {"main", Profile::MAIN},
240  {"main10", Profile::MAIN10},
241  {"main-still-picture", Profile::MAINSTILLPICTURE},
242#if H_MV
243  {"main-stereo",    Profile::MAINSTEREO},
244  {"main-multiview", Profile::MAINMULTIVIEW},
245#if H_3D
246  {"main-3d"    , Profile::MAIN3D},
247#endif
248#endif
249};
250
251static const struct MapStrToTier {
252  const Char* str;
253  Level::Tier value;
254} strToTier[] = {
255  {"main", Level::MAIN},
256  {"high", Level::HIGH},
257};
258
259static const struct MapStrToLevel {
260  const Char* str;
261  Level::Name value;
262} strToLevel[] = {
263  {"none",Level::NONE},
264  {"1",   Level::LEVEL1},
265  {"2",   Level::LEVEL2},
266  {"2.1", Level::LEVEL2_1},
267  {"3",   Level::LEVEL3},
268  {"3.1", Level::LEVEL3_1},
269  {"4",   Level::LEVEL4},
270  {"4.1", Level::LEVEL4_1},
271  {"5",   Level::LEVEL5},
272  {"5.1", Level::LEVEL5_1},
273  {"5.2", Level::LEVEL5_2},
274  {"6",   Level::LEVEL6},
275  {"6.1", Level::LEVEL6_1},
276  {"6.2", Level::LEVEL6_2},
277};
278
279template<typename T, typename P>
280static istream& readStrToEnum(P map[], unsigned long mapLen, istream &in, T &val)
281{
282  string str;
283  in >> str;
284
285  for (Int i = 0; i < mapLen; i++)
286  {
287    if (str == map[i].str)
288    {
289      val = map[i].value;
290      goto found;
291    }
292  }
293  /* not found */
294  in.setstate(ios::failbit);
295found:
296  return in;
297}
298
299static istream& operator>>(istream &in, Profile::Name &profile)
300{
301  return readStrToEnum(strToProfile, sizeof(strToProfile)/sizeof(*strToProfile), in, profile);
302}
303
304static istream& operator>>(istream &in, Level::Tier &tier)
305{
306  return readStrToEnum(strToTier, sizeof(strToTier)/sizeof(*strToTier), in, tier);
307}
308
309static istream& operator>>(istream &in, Level::Name &level)
310{
311  return readStrToEnum(strToLevel, sizeof(strToLevel)/sizeof(*strToLevel), in, level);
312}
313
314#if SIGNAL_BITRATE_PICRATE_IN_VPS
315Void readBoolString(const string inpString, const Int numEntries, Bool* &memberArray, const char *elementName);
316Void readIntString(const string inpString, const Int numEntries, Int* &memberArray, const char *elementName);
317#endif
318// ====================================================================================================================
319// Public member functions
320// ====================================================================================================================
321
322/** \param  argc        number of arguments
323    \param  argv        array of arguments
324    \retval             true when success
325 */
326Bool TAppEncCfg::parseCfg( Int argc, Char* argv[] )
327{
328  Bool do_help = false;
329 
330#if !H_MV
331  string cfg_InputFile;
332#endif
333  string cfg_BitstreamFile;
334#if !H_MV
335  string cfg_ReconFile;
336#endif
337#if H_MV
338  vector<Int>   cfg_dimensionLength; 
339#if H_3D
340  cfg_dimensionLength.push_back( 2  );  // depth
341  cfg_dimensionLength.push_back( 32 );  // texture
342#else
343  cfg_dimensionLength.push_back( 64 ); 
344#endif
345#endif
346  string cfg_dQPFile;
347  string cfg_ColumnWidth;
348  string cfg_RowHeight;
349  string cfg_ScalingListFile;
350#if J0149_TONE_MAPPING_SEI
351  string cfg_startOfCodedInterval;
352  string cfg_codedPivotValue;
353  string cfg_targetPivotValue;
354#endif
355#if SIGNAL_BITRATE_PICRATE_IN_VPS
356  string cfg_bitRateInfoPresentFlag;
357  string cfg_picRateInfoPresentFlag;
358  string cfg_avgBitRate;
359  string cfg_maxBitRate;
360  string cfg_avgPicRate;
361  string cfg_constantPicRateIdc;
362#endif
363  po::Options opts;
364  opts.addOptions()
365  ("help", do_help, false, "this help text")
366  ("c", po::parseConfigFile, "configuration file name")
367 
368  // File, I/O and source parameters
369#if H_MV
370  ("InputFile_%d,i_%d",       m_pchInputFileList,       (char *) 0 , MAX_NUM_LAYER_IDS , "original Yuv input file name %d")
371#else
372  ("InputFile,i",           cfg_InputFile,     string(""), "Original YUV input file name")
373#endif
374  ("BitstreamFile,b",       cfg_BitstreamFile, string(""), "Bitstream output file name")
375#if H_MV
376  ("ReconFile_%d,o_%d",       m_pchReconFileList,       (char *) 0 , MAX_NUM_LAYER_IDS , "reconstructed Yuv output file name %d")
377#else
378  ("ReconFile,o",           cfg_ReconFile,     string(""), "Reconstructed YUV output file name")
379#endif
380#if H_MV
381  ("NumberOfLayers",        m_numberOfLayers     , 1,                     "Number of layers")
382#if !H_3D
383  ("ScalabilityMask",       m_scalabilityMask    , 1                    , "Scalability Mask")   
384#else
385  ("ScalabilityMask",       m_scalabilityMask    , 3                    , "Scalability Mask, 1: Texture 3: Texture + Depth ")   
386#endif 
387  ("DimensionIdLen",        m_dimensionIdLen     , cfg_dimensionLength  , "Number of bits used to store dimensions Id")
388  ("ViewId",                m_viewId             , std::vector<Int>(1,0), "View Id")
389#if H_3D
390  ("DepthFlag",             m_depthFlag          , std::vector<Int>(1,0), "Depth Flag")
391#endif
392  ("LayerIdInNuh",          m_layerIdInNuh       , std::vector<Int>(1,0), "LayerId in Nuh")
393  ("SplittingFlag",         m_splittingFlag      , false                , "Splitting Flag")   
394
395  // Layer Sets + Output Layer Sets + Profile Tier Level
396  ("VpsNumLayerSets",       m_vpsNumLayerSets    , 1                    , "Number of layer sets")   
397  ("LayerIdsInSet_%d",      m_layerIdsInSets     , std::vector<Int>(1,0), MAX_VPS_OP_SETS_PLUS1 ,"LayerIds of Layer set") 
398  ("DefaultOneTargetOutputLayerFlag", m_defaultOneTargetOutputLayerFlag,  false , "Output highest layer of layer sets by default")     
399  ("OutputLayerSetIdx",     m_outputLayerSetIdx  , std::vector<Int>(1,0), "Indices of layer sets used as additional output layer sets") 
400  ("LayerIdsInAddOutputLayerSet_%d", m_layerIdsInAddOutputLayerSet      , std::vector<Int>(1,0), MAX_VPS_ADD_OUTPUT_LAYER_SETS, "LayerIds of additional output layers") 
401  ("ProfileLevelTierIdx",   m_profileLevelTierIdx, std::vector<Int>(1,0), "Indices to profile level tier")
402#endif
403  ("SourceWidth,-wdt",      m_iSourceWidth,        0, "Source picture width")
404  ("SourceHeight,-hgt",     m_iSourceHeight,       0, "Source picture height")
405  ("InputBitDepth",         m_inputBitDepthY,    8, "Bit-depth of input file")
406  ("OutputBitDepth",        m_outputBitDepthY,   0, "Bit-depth of output file (default:InternalBitDepth)")
407  ("InternalBitDepth",      m_internalBitDepthY, 0, "Bit-depth the codec operates at. (default:InputBitDepth)"
408                                                       "If different to InputBitDepth, source data will be converted")
409  ("InputBitDepthC",        m_inputBitDepthC,    0, "As per InputBitDepth but for chroma component. (default:InputBitDepth)")
410  ("OutputBitDepthC",       m_outputBitDepthC,   0, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
411  ("InternalBitDepthC",     m_internalBitDepthC, 0, "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth)")
412  ("ConformanceMode",       m_conformanceMode,     0, "Window conformance mode (0: no window, 1:automatic padding, 2:padding, 3:conformance")
413  ("HorizontalPadding,-pdx",m_aiPad[0],            0, "Horizontal source padding for conformance window mode 2")
414  ("VerticalPadding,-pdy",  m_aiPad[1],            0, "Vertical source padding for conformance window mode 2")
415  ("ConfLeft",              m_confLeft,            0, "Left offset for window conformance mode 3")
416  ("ConfRight",             m_confRight,           0, "Right offset for window conformance mode 3")
417  ("ConfTop",               m_confTop,             0, "Top offset for window conformance mode 3")
418  ("ConfBottom",            m_confBottom,          0, "Bottom offset for window conformance mode 3")
419  ("FrameRate,-fr",         m_iFrameRate,          0, "Frame rate")
420  ("FrameSkip,-fs",         m_FrameSkip,          0u, "Number of frames to skip at start of input YUV")
421  ("FramesToBeEncoded,f",   m_framesToBeEncoded,   0, "Number of frames to be encoded (default=all)")
422
423  // Profile and level
424  ("Profile", m_profile,   Profile::NONE, "Profile to be used when encoding (Incomplete)")
425  ("Level",   m_level,     Level::NONE,   "Level limit to be used, eg 5.1 (Incomplete)")
426  ("Tier",    m_levelTier, Level::MAIN,   "Tier to use for interpretation of --Level")
427
428#if L0046_CONSTRAINT_FLAGS
429  ("ProgressiveSource", m_progressiveSourceFlag, false, "Indicate that source is progressive")
430  ("InterlacedSource",  m_interlacedSourceFlag,  false, "Indicate that source is interlaced")
431  ("NonPackedSource",   m_nonPackedConstraintFlag, false, "Indicate that source does not contain frame packing")
432  ("FrameOnly",         m_frameOnlyConstraintFlag, false, "Indicate that the bitstream contains only frames")
433#endif
434 
435  // Unit definition parameters
436  ("MaxCUWidth",              m_uiMaxCUWidth,             64u)
437  ("MaxCUHeight",             m_uiMaxCUHeight,            64u)
438  // todo: remove defaults from MaxCUSize
439  ("MaxCUSize,s",             m_uiMaxCUWidth,             64u, "Maximum CU size")
440  ("MaxCUSize,s",             m_uiMaxCUHeight,            64u, "Maximum CU size")
441  ("MaxPartitionDepth,h",     m_uiMaxCUDepth,              4u, "CU depth")
442 
443  ("QuadtreeTULog2MaxSize",   m_uiQuadtreeTULog2MaxSize,   6u, "Maximum TU size in logarithm base 2")
444  ("QuadtreeTULog2MinSize",   m_uiQuadtreeTULog2MinSize,   2u, "Minimum TU size in logarithm base 2")
445 
446  ("QuadtreeTUMaxDepthIntra", m_uiQuadtreeTUMaxDepthIntra, 1u, "Depth of TU tree for intra CUs")
447  ("QuadtreeTUMaxDepthInter", m_uiQuadtreeTUMaxDepthInter, 2u, "Depth of TU tree for inter CUs")
448 
449  // Coding structure paramters
450  ("IntraPeriod,-ip",         m_iIntraPeriod,              -1, "Intra period in frames, (-1: only first frame)")
451  ("DecodingRefreshType,-dr", m_iDecodingRefreshType,       0, "Intra refresh type (0:none 1:CRA 2:IDR)")
452  ("GOPSize,g",               m_iGOPSize,                   1, "GOP size of temporal structure")
453#if !L0034_COMBINED_LIST_CLEANUP
454  ("ListCombination,-lc",     m_bUseLComb,               true, "Combined reference list for uni-prediction estimation in B-slices")
455#endif
456  // motion options
457  ("FastSearch",              m_iFastSearch,                1, "0:Full search  1:Diamond  2:PMVFAST")
458  ("SearchRange,-sr",         m_iSearchRange,              96, "Motion search range")
459  ("BipredSearchRange",       m_bipredSearchRange,          4, "Motion search range for bipred refinement")
460  ("HadamardME",              m_bUseHADME,               true, "Hadamard ME for fractional-pel")
461  ("ASR",                     m_bUseASR,                false, "Adaptive motion search range")
462
463  // Mode decision parameters
464  ("LambdaModifier0,-LM0", m_adLambdaModifier[ 0 ], ( Double )1.0, "Lambda modifier for temporal layer 0")
465  ("LambdaModifier1,-LM1", m_adLambdaModifier[ 1 ], ( Double )1.0, "Lambda modifier for temporal layer 1")
466  ("LambdaModifier2,-LM2", m_adLambdaModifier[ 2 ], ( Double )1.0, "Lambda modifier for temporal layer 2")
467  ("LambdaModifier3,-LM3", m_adLambdaModifier[ 3 ], ( Double )1.0, "Lambda modifier for temporal layer 3")
468  ("LambdaModifier4,-LM4", m_adLambdaModifier[ 4 ], ( Double )1.0, "Lambda modifier for temporal layer 4")
469  ("LambdaModifier5,-LM5", m_adLambdaModifier[ 5 ], ( Double )1.0, "Lambda modifier for temporal layer 5")
470  ("LambdaModifier6,-LM6", m_adLambdaModifier[ 6 ], ( Double )1.0, "Lambda modifier for temporal layer 6")
471  ("LambdaModifier7,-LM7", m_adLambdaModifier[ 7 ], ( Double )1.0, "Lambda modifier for temporal layer 7")
472
473  /* Quantization parameters */
474#if H_MV
475  ("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")
476#else
477  ("QP,q",          m_fQP,             30.0, "Qp value, if value is float, QP is switched once during encoding")
478#endif
479  ("DeltaQpRD,-dqr",m_uiDeltaQpRD,       0u, "max dQp offset for slice")
480  ("MaxDeltaQP,d",  m_iMaxDeltaQP,        0, "max dQp offset for block")
481  ("MaxCuDQPDepth,-dqd",  m_iMaxCuDQPDepth,        0, "max depth for a minimum CuDQP")
482
483  ("CbQpOffset,-cbqpofs",  m_cbQpOffset,        0, "Chroma Cb QP Offset")
484  ("CrQpOffset,-crqpofs",  m_crQpOffset,        0, "Chroma Cr QP Offset")
485
486#if ADAPTIVE_QP_SELECTION
487  ("AdaptiveQpSelection,-aqps",   m_bUseAdaptQpSelect,           false, "AdaptiveQpSelection")
488#endif
489
490  ("AdaptiveQP,-aq",                m_bUseAdaptiveQP,           false, "QP adaptation based on a psycho-visual model")
491  ("MaxQPAdaptationRange,-aqr",     m_iQPAdaptationRange,           6, "QP adaptation range")
492  ("dQPFile,m",                     cfg_dQPFile,           string(""), "dQP file name")
493  ("RDOQ",                          m_useRDOQ,                  true )
494  ("RDOQTS",                        m_useRDOQTS,                true )
495#if L0232_RD_PENALTY
496  ("RDpenalty",                     m_rdPenalty,                0,  "RD-penalty for 32x32 TU for intra in non-intra slices. 0:disbaled  1:RD-penalty  2:maximum RD-penalty")
497#endif
498  // Entropy coding parameters
499  ("SBACRD",                         m_bUseSBACRD,                      true, "SBAC based RD estimation")
500 
501  // Deblocking filter parameters
502#if H_MV
503  ("LoopFilterDisable",              m_bLoopFilterDisable,             std::vector<Bool>(1,false), "Disable Loop Filter per Layer" )
504#else
505  ("LoopFilterDisable",              m_bLoopFilterDisable,             false )
506#endif
507  ("LoopFilterOffsetInPPS",          m_loopFilterOffsetInPPS,          false )
508  ("LoopFilterBetaOffset_div2",      m_loopFilterBetaOffsetDiv2,           0 )
509  ("LoopFilterTcOffset_div2",        m_loopFilterTcOffsetDiv2,             0 )
510  ("DeblockingFilterControlPresent", m_DeblockingFilterControlPresent, false )
511#if L0386_DB_METRIC
512  ("DeblockingFilterMetric",         m_DeblockingFilterMetric,         false )
513#endif
514
515  // Coding tools
516  ("AMP",                      m_enableAMP,                 true,  "Enable asymmetric motion partitions")
517  ("TransformSkip",            m_useTransformSkip,          false, "Intra transform skipping")
518  ("TransformSkipFast",        m_useTransformSkipFast,      false, "Fast intra transform skipping")
519#if H_MV
520  ("SAO",                      m_bUseSAO, std::vector<Bool>(1,true), "Enable Sample Adaptive Offset per Layer")
521#else
522  ("SAO",                      m_bUseSAO,                   true,  "Enable Sample Adaptive Offset")
523#endif
524  ("MaxNumOffsetsPerPic",      m_maxNumOffsetsPerPic,       2048,  "Max number of SAO offset per picture (Default: 2048)")   
525  ("SAOLcuBoundary",           m_saoLcuBoundary,            false, "0: right/bottom LCU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas")
526  ("SAOLcuBasedOptimization",  m_saoLcuBasedOptimization,   true,  "0: SAO picture-based optimization, 1: SAO LCU-based optimization ")
527  ("SliceMode",                m_sliceMode,                0,     "0: Disable all Recon slice limits, 1: Enforce max # of LCUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice")
528  ("SliceArgument",            m_sliceArgument,            0,     "Depending on SliceMode being:"
529                                                                   "\t1: max number of CTUs per slice"
530                                                                   "\t2: max number of bytes per slice"
531                                                                   "\t3: max number of tiles per slice")
532  ("SliceSegmentMode",         m_sliceSegmentMode,       0,     "0: Disable all slice segment limits, 1: Enforce max # of LCUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice")
533  ("SliceSegmentArgument",     m_sliceSegmentArgument,   0,     "Depending on SliceSegmentMode being:"
534                                                                   "\t1: max number of CTUs per slice segment"
535                                                                   "\t2: max number of bytes per slice segment"
536                                                                   "\t3: max number of tiles per slice segment")
537  ("LFCrossSliceBoundaryFlag", m_bLFCrossSliceBoundaryFlag, true)
538
539  ("ConstrainedIntraPred",     m_bUseConstrainedIntraPred,  false, "Constrained Intra Prediction")
540
541  ("PCMEnabledFlag",           m_usePCM,                    false)
542  ("PCMLog2MaxSize",           m_pcmLog2MaxSize,            5u)
543  ("PCMLog2MinSize",           m_uiPCMLog2MinSize,          3u)
544  ("PCMInputBitDepthFlag",     m_bPCMInputBitDepthFlag,     true)
545  ("PCMFilterDisableFlag",     m_bPCMFilterDisableFlag,    false)
546
547  ("LosslessCuEnabled",        m_useLossless, false)
548
549  ("WeightedPredP,-wpP",          m_useWeightedPred,               false,      "Use weighted prediction in P slices")
550  ("WeightedPredB,-wpB",          m_useWeightedBiPred,             false,      "Use weighted (bidirectional) prediction in B slices")
551  ("Log2ParallelMergeLevel",      m_log2ParallelMergeLevel,     2u,          "Parallel merge estimation region")
552  ("UniformSpacingIdc",           m_iUniformSpacingIdr,            0,          "Indicates if the column and row boundaries are distributed uniformly")
553  ("NumTileColumnsMinus1",        m_iNumColumnsMinus1,             0,          "Number of columns in a picture minus 1")
554  ("ColumnWidthArray",            cfg_ColumnWidth,                 string(""), "Array containing ColumnWidth values in units of LCU")
555  ("NumTileRowsMinus1",           m_iNumRowsMinus1,                0,          "Number of rows in a picture minus 1")
556  ("RowHeightArray",              cfg_RowHeight,                   string(""), "Array containing RowHeight values in units of LCU")
557  ("LFCrossTileBoundaryFlag",      m_bLFCrossTileBoundaryFlag,             true,          "1: cross-tile-boundary loop filtering. 0:non-cross-tile-boundary loop filtering")
558  ("WaveFrontSynchro",            m_iWaveFrontSynchro,             0,          "0: no synchro; 1 synchro with TR; 2 TRR etc")
559  ("ScalingList",                 m_useScalingListId,              0,          "0: no scaling list, 1: default scaling lists, 2: scaling lists specified in ScalingListFile")
560  ("ScalingListFile",             cfg_ScalingListFile,             string(""), "Scaling list file name")
561  ("SignHideFlag,-SBH",                m_signHideFlag, 1)
562  ("MaxNumMergeCand",             m_maxNumMergeCand,             5u,         "Maximum number of merge candidates")
563
564  /* Misc. */
565  ("SEIDecodedPictureHash",       m_decodedPictureHashSEIEnabled, 0, "Control generation of decode picture hash SEI messages\n"
566                                                                    "\t3: checksum\n"
567                                                                    "\t2: CRC\n"
568                                                                    "\t1: use MD5\n"
569                                                                    "\t0: disable")
570  ("SEIpictureDigest",            m_decodedPictureHashSEIEnabled, 0, "deprecated alias for SEIDecodedPictureHash")
571  ("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")
572  ("FEN", m_bUseFastEnc, false, "fast encoder setting")
573  ("ECU", m_bUseEarlyCU, false, "Early CU setting") 
574  ("FDM", m_useFastDecisionForMerge, true, "Fast decision for Merge RD Cost") 
575  ("CFM", m_bUseCbfFastMode, false, "Cbf fast mode setting")
576  ("ESD", m_useEarlySkipDetection, false, "Early SKIP detection setting")
577#if RATE_CONTROL_LAMBDA_DOMAIN
578  ( "RateControl",         m_RCEnableRateControl,   false, "Rate control: enable rate control" )
579  ( "TargetBitrate",       m_RCTargetBitrate,           0, "Rate control: target bitrate" )
580  ( "KeepHierarchicalBit", m_RCKeepHierarchicalBit, false, "Rate control: keep hierarchical bit allocation in rate control algorithm" )
581  ( "LCULevelRateControl", m_RCLCULevelRC,           true, "Rate control: true: LCU level RC; false: picture level RC" )
582  ( "RCLCUSeparateModel",  m_RCUseLCUSeparateModel,  true, "Rate control: use LCU level separate R-lambda model" )
583  ( "InitialQP",           m_RCInitialQP,               0, "Rate control: initial QP" )
584  ( "RCForceIntraQP",      m_RCForceIntraQP,        false, "Rate control: force intra QP to be equal to initial QP" )
585#else
586  ("RateCtrl,-rc", m_enableRateCtrl, false, "Rate control on/off")
587  ("TargetBitrate,-tbr", m_targetBitrate, 0, "Input target bitrate")
588  ("NumLCUInUnit,-nu", m_numLCUInUnit, 0, "Number of LCUs in an Unit")
589#endif
590
591  ("TransquantBypassEnableFlag", m_TransquantBypassEnableFlag, false, "transquant_bypass_enable_flag indicator in PPS")
592  ("CUTransquantBypassFlagValue", m_CUTransquantBypassFlagValue, false, "Fixed cu_transquant_bypass_flag value, when transquant_bypass_enable_flag is enabled")
593  ("RecalculateQPAccordingToLambda", m_recalculateQPAccordingToLambda, false, "Recalculate QP values according to lambda values. Do not suggest to be enabled in all intra case")
594  ("StrongIntraSmoothing,-sis",      m_useStrongIntraSmoothing,           true, "Enable strong intra smoothing for 32x32 blocks")
595  ("SEIActiveParameterSets",         m_activeParameterSetsSEIEnabled,          0, "Enable generation of active parameter sets SEI messages")
596  ("VuiParametersPresent,-vui",      m_vuiParametersPresentFlag,           false, "Enable generation of vui_parameters()")
597  ("AspectRatioInfoPresent",         m_aspectRatioInfoPresentFlag,         false, "Signals whether aspect_ratio_idc is present")
598  ("AspectRatioIdc",                 m_aspectRatioIdc,                         0, "aspect_ratio_idc")
599  ("SarWidth",                       m_sarWidth,                               0, "horizontal size of the sample aspect ratio")
600  ("SarHeight",                      m_sarHeight,                              0, "vertical size of the sample aspect ratio")
601  ("OverscanInfoPresent",            m_overscanInfoPresentFlag,            false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
602  ("OverscanAppropriate",            m_overscanAppropriateFlag,            false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
603  ("VideoSignalTypePresent",         m_videoSignalTypePresentFlag,         false, "Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present")
604  ("VideoFormat",                    m_videoFormat,                            5, "Indicates representation of pictures")
605  ("VideoFullRange",                 m_videoFullRangeFlag,                 false, "Indicates the black level and range of luma and chroma signals")
606  ("ColourDescriptionPresent",       m_colourDescriptionPresentFlag,       false, "Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present")
607  ("ColourPrimaries",                m_colourPrimaries,                        2, "Indicates chromaticity coordinates of the source primaries")
608  ("TransferCharateristics",         m_transferCharacteristics,                2, "Indicates the opto-electronic transfer characteristics of the source")
609  ("MatrixCoefficients",             m_matrixCoefficients,                     2, "Describes the matrix coefficients used in deriving luma and chroma from RGB primaries")
610  ("ChromaLocInfoPresent",           m_chromaLocInfoPresentFlag,           false, "Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present")
611  ("ChromaSampleLocTypeTopField",    m_chromaSampleLocTypeTopField,            0, "Specifies the location of chroma samples for top field")
612  ("ChromaSampleLocTypeBottomField", m_chromaSampleLocTypeBottomField,         0, "Specifies the location of chroma samples for bottom field")
613  ("NeutralChromaIndication",        m_neutralChromaIndicationFlag,        false, "Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1)")
614  ("DefaultDisplayWindowFlag",       m_defaultDisplayWindowFlag,           false, "Indicates the presence of the Default Window parameters")
615  ("DefDispWinLeftOffset",           m_defDispWinLeftOffset,                   0, "Specifies the left offset of the default display window from the conformance window")
616  ("DefDispWinRightOffset",          m_defDispWinRightOffset,                  0, "Specifies the right offset of the default display window from the conformance window")
617  ("DefDispWinTopOffset",            m_defDispWinTopOffset,                    0, "Specifies the top offset of the default display window from the conformance window")
618  ("DefDispWinBottomOffset",         m_defDispWinBottomOffset,                 0, "Specifies the bottom offset of the default display window from the conformance window")
619  ("FrameFieldInfoPresentFlag",      m_frameFieldInfoPresentFlag,               false, "Indicates that pic_struct and field coding related values are present in picture timing SEI messages")
620  ("PocProportionalToTimingFlag",   m_pocProportionalToTimingFlag,         false, "Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS")
621  ("NumTicksPocDiffOneMinus1",      m_numTicksPocDiffOneMinus1,                0, "Number of ticks minus 1 that for a POC difference of one")
622  ("BitstreamRestriction",           m_bitstreamRestrictionFlag,           false, "Signals whether bitstream restriction parameters are present")
623  ("TilesFixedStructure",            m_tilesFixedStructureFlag,            false, "Indicates that each active picture parameter set has the same values of the syntax elements related to tiles")
624  ("MotionVectorsOverPicBoundaries", m_motionVectorsOverPicBoundariesFlag, false, "Indicates that no samples outside the picture boundaries are used for inter prediction")
625  ("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")
626  ("MaxBitsPerMinCuDenom",           m_maxBitsPerMinCuDenom,                   1, "Indicates an upper bound for the number of bits of coding_unit() data")
627  ("Log2MaxMvLengthHorizontal",      m_log2MaxMvLengthHorizontal,             15, "Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units")
628  ("Log2MaxMvLengthVertical",        m_log2MaxMvLengthVertical,               15, "Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units")
629  ("SEIRecoveryPoint",               m_recoveryPointSEIEnabled,                0, "Control generation of recovery point SEI messages")
630  ("SEIBufferingPeriod",             m_bufferingPeriodSEIEnabled,              0, "Control generation of buffering period SEI messages")
631  ("SEIPictureTiming",               m_pictureTimingSEIEnabled,                0, "Control generation of picture timing SEI messages")
632#if J0149_TONE_MAPPING_SEI
633  ("SEIToneMappingInfo",                       m_toneMappingInfoSEIEnabled,    false, "Control generation of Tone Mapping SEI messages")
634  ("SEIToneMapId",                             m_toneMapId,                        0, "Specifies Id of Tone Mapping SEI message for a given session")
635  ("SEIToneMapCancelFlag",                     m_toneMapCancelFlag,            false, "Indicates that Tone Mapping SEI message cancels the persistance or follows")
636  ("SEIToneMapPersistenceFlag",                m_toneMapPersistenceFlag,        true, "Specifies the persistence of the Tone Mapping SEI message")
637  ("SEIToneMapCodedDataBitDepth",              m_toneMapCodedDataBitDepth,         8, "Specifies Coded Data BitDepth of Tone Mapping SEI messages")
638  ("SEIToneMapTargetBitDepth",                 m_toneMapTargetBitDepth,            8, "Specifies Output BitDepth of Tome mapping function")
639  ("SEIToneMapModelId",                        m_toneMapModelId,                   0, "Specifies Model utilized for mapping coded data into target_bit_depth range\n"
640                                                                                      "\t0:  linear mapping with clipping\n"
641                                                                                      "\t1:  sigmoidal mapping\n"
642                                                                                      "\t2:  user-defined table mapping\n"
643                                                                                      "\t3:  piece-wise linear mapping\n"
644                                                                                      "\t4:  luminance dynamic range information ")
645  ("SEIToneMapMinValue",                              m_toneMapMinValue,                          0, "Specifies the minimum value in mode 0")
646  ("SEIToneMapMaxValue",                              m_toneMapMaxValue,                       1023, "Specifies the maxmum value in mode 0")
647  ("SEIToneMapSigmoidMidpoint",                       m_sigmoidMidpoint,                        512, "Specifies the centre point in mode 1")
648  ("SEIToneMapSigmoidWidth",                          m_sigmoidWidth,                           960, "Specifies the distance between 5% and 95% values of the target_bit_depth in mode 1")
649  ("SEIToneMapStartOfCodedInterval",                  cfg_startOfCodedInterval,          string(""), "Array of user-defined mapping table")
650  ("SEIToneMapNumPivots",                             m_numPivots,                                0, "Specifies the number of pivot points in mode 3")
651  ("SEIToneMapCodedPivotValue",                       cfg_codedPivotValue,               string(""), "Array of pivot point")
652  ("SEIToneMapTargetPivotValue",                      cfg_targetPivotValue,              string(""), "Array of pivot point")
653  ("SEIToneMapCameraIsoSpeedIdc",                     m_cameraIsoSpeedIdc,                        0, "Indicates the camera ISO speed for daylight illumination")
654  ("SEIToneMapCameraIsoSpeedValue",                   m_cameraIsoSpeedValue,                    400, "Specifies the camera ISO speed for daylight illumination of Extended_ISO")
655  ("SEIToneMapExposureCompensationValueSignFlag",     m_exposureCompensationValueSignFlag,        0, "Specifies the sign of ExposureCompensationValue")
656  ("SEIToneMapExposureCompensationValueNumerator",    m_exposureCompensationValueNumerator,       0, "Specifies the numerator of ExposureCompensationValue")
657  ("SEIToneMapExposureCompensationValueDenomIdc",     m_exposureCompensationValueDenomIdc,        2, "Specifies the denominator of ExposureCompensationValue")
658  ("SEIToneMapRefScreenLuminanceWhite",               m_refScreenLuminanceWhite,                350, "Specifies reference screen brightness setting in units of candela per square metre")
659  ("SEIToneMapExtendedRangeWhiteLevel",               m_extendedRangeWhiteLevel,                800, "Indicates the luminance dynamic range")
660  ("SEIToneMapNominalBlackLevelLumaCodeValue",        m_nominalBlackLevelLumaCodeValue,          16, "Specifies luma sample value of the nominal black level assigned decoded pictures")
661  ("SEIToneMapNominalWhiteLevelLumaCodeValue",        m_nominalWhiteLevelLumaCodeValue,         235, "Specifies luma sample value of the nominal white level assigned decoded pictures")
662  ("SEIToneMapExtendedWhiteLevelLumaCodeValue",       m_extendedWhiteLevelLumaCodeValue,        300, "Specifies luma sample value of the extended dynamic range assigned decoded pictures")
663#endif
664  ("SEIFramePacking",                m_framePackingSEIEnabled,                 0, "Control generation of frame packing SEI messages")
665  ("SEIFramePackingType",            m_framePackingSEIType,                    0, "Define frame packing arrangement\n"
666                                                                                  "\t0: checkerboard - pixels alternatively represent either frames\n"
667                                                                                  "\t1: column alternation - frames are interlaced by column\n"
668                                                                                  "\t2: row alternation - frames are interlaced by row\n"
669                                                                                  "\t3: side by side - frames are displayed horizontally\n"
670                                                                                  "\t4: top bottom - frames are displayed vertically\n"
671                                                                                  "\t5: frame alternation - one frame is alternated with the other")
672  ("SEIFramePackingId",              m_framePackingSEIId,                      0, "Id of frame packing SEI message for a given session")
673  ("SEIFramePackingQuincunx",        m_framePackingSEIQuincunx,                0, "Indicate the presence of a Quincunx type video frame")
674  ("SEIFramePackingInterpretation",  m_framePackingSEIInterpretation,          0, "Indicate the interpretation of the frame pair\n"
675                                                                                  "\t0: unspecified\n"
676                                                                                  "\t1: stereo pair, frame0 represents left view\n"
677                                                                                  "\t2: stereo pair, frame0 represents right view")
678  ("SEIDisplayOrientation",          m_displayOrientationSEIAngle,             0, "Control generation of display orientation SEI messages\n"
679                                                              "\tN: 0 < N < (2^16 - 1) enable display orientation SEI message with anticlockwise_rotation = N and display_orientation_repetition_period = 1\n"
680                                                              "\t0: disable")
681  ("SEITemporalLevel0Index",         m_temporalLevel0IndexSEIEnabled,          0, "Control generation of temporal level 0 index SEI messages")
682  ("SEIGradualDecodingRefreshInfo",  m_gradualDecodingRefreshInfoEnabled,      0, "Control generation of gradual decoding refresh information SEI message")
683  ("SEIDecodingUnitInfo",             m_decodingUnitInfoSEIEnabled,                       0, "Control generation of decoding unit information SEI message.")
684#if L0208_SOP_DESCRIPTION_SEI
685  ("SEISOPDescription",              m_SOPDescriptionSEIEnabled,              0, "Control generation of SOP description SEI messages")
686#endif
687#if K0180_SCALABLE_NESTING_SEI
688  ("SEIScalableNesting",             m_scalableNestingSEIEnabled,              0, "Control generation of scalable nesting SEI messages")
689#endif
690#if SIGNAL_BITRATE_PICRATE_IN_VPS
691  ("BitRatePicRateMaxTLayers",   m_bitRatePicRateMaxTLayers,           0, "Maximum number of sub-layers signalled; can be inferred otherwise; here for easy parsing of config. file")
692  ("BitRateInfoPresent",         cfg_bitRateInfoPresentFlag,          string(""), "Control signalling of bit rate information of avg. bit rate and max. bit rate in VPS\n"
693                                                                          "\t0: Do not sent bit rate info\n"
694                                                                          "\tN (N > 0): Send bit rate info for N sub-layers. N should equal maxTempLayers.")                                                                     
695  ("PicRateInfoPresent",         cfg_picRateInfoPresentFlag,          string(""), "Control signalling of picture rate information of avg. bit rate and max. bit rate in VPS\n"
696                                                                          "\t0: Do not sent picture rate info\n"
697                                                                          "\tN (N > 0): Send picture rate info for N sub-layers. N should equal maxTempLayers.")                                                                     
698  ("AvgBitRate",                   cfg_avgBitRate,                    string(""), "List of avg. bit rates for the different sub-layers; include non-negative number even if corresponding flag is 0")
699  ("MaxBitRate",                   cfg_maxBitRate,                    string(""), "List of max. bit rates for the different sub-layers; include non-negative number even if corresponding flag is 0")
700  ("AvgPicRate",                   cfg_avgPicRate,                    string(""), "List of avg. picture rates for the different sub-layers; include non-negative number even if corresponding flag is 0")
701  ("ConstantPicRateIdc",           cfg_constantPicRateIdc,            string(""), "List of constant picture rate IDCs; include non-negative number even if corresponding flag is 0")
702#endif
703#if H_3D
704  ("CameraParameterFile,cpf", m_pchCameraParameterFile,    (Char *) 0, "Camera Parameter File Name")
705  ("BaseViewCameraNumbers" ,  m_pchBaseViewCameraNumbers,  (Char *) 0, "Numbers of base views")
706  ("CodedCamParsPrecision",   m_iCodedCamParPrecision,  STD_CAM_PARAMETERS_PRECISION, "precision for coding of camera parameters (in units of 2^(-x) luma samples)" )
707/* View Synthesis Optimization */
708
709#if H_3D_VSO
710  ("VSOConfig",                       m_pchVSOConfig            , (Char *) 0    , "VSO configuration")
711  ("VSO",                             m_bUseVSO                 , false         , "Use VSO" )   
712  ("VSOMode",                         m_uiVSOMode               , (UInt)   4    , "VSO Mode")
713  ("LambdaScaleVSO",                  m_dLambdaScaleVSO         , (Double) 1    , "Lambda Scaling for VSO")
714  ("VSOLSTable",                      m_bVSOLSTable             , true          , "Depth QP dependent video/depth rate allocation by Lagrange multiplier" )     
715  ("ForceLambdaScaleVSO",             m_bForceLambdaScaleVSO    , false         , "Force using Lambda Scale VSO also in non-VSO-Mode")
716  ("AllowNegDist",                    m_bAllowNegDist           , true          , "Allow negative Distortion in VSO")
717 
718  ("UseEstimatedVSD",                 m_bUseEstimatedVSD        , true          , "Model based VSD estimation instead of rendering based for some encoder decisions" )     
719  ("VSOEarlySkip",                    m_bVSOEarlySkip           , true          , "Early skip of VSO computation if synthesis error assumed to be zero" )     
720 
721  ("WVSO",                            m_bUseWVSO                , true          , "Use depth fidelity term for VSO" )
722  ("VSOWeight",                       m_iVSOWeight              , 10            , "Synthesized View Distortion Change weight" )
723  ("VSDWeight",                       m_iVSDWeight              , 1             , "View Synthesis Distortion estimate weight" )
724  ("DWeight",                         m_iDWeight                , 1             , "Depth Distortion weight" )
725
726#endif //HHI_VSO
727#endif //H_3D
728  ;
729 
730#if H_MV
731  // parse coding structure
732  for( Int k = 0; k < MAX_NUM_LAYERS; k++ )
733  {
734    m_GOPListMvc.push_back( new GOPEntry[MAX_GOP + 1] );
735    if( k == 0 )
736    {
737      for( Int i = 1; i < MAX_GOP + 1; i++ ) 
738      {
739        std::ostringstream cOSS;
740        cOSS<<"Frame"<<i;
741        opts.addOptions()( cOSS.str(), m_GOPListMvc[k][i-1], GOPEntry() );
742        if ( i != 1 )
743        {
744          opts.opt_list.back()->opt->opt_duplicate = true; 
745        }       
746      }
747    }
748    else
749    {
750      std::ostringstream cOSS1;
751      cOSS1<<"FrameI"<<"_l"<<k;
752
753      opts.addOptions()(cOSS1.str(), m_GOPListMvc[k][MAX_GOP], GOPEntry());
754      if ( k > 1 )
755      {
756        opts.opt_list.back()->opt->opt_duplicate = true; 
757      }       
758
759
760      for( Int i = 1; i < MAX_GOP + 1; i++ ) 
761      {
762        std::ostringstream cOSS2;
763        cOSS2<<"Frame"<<i<<"_l"<<k;
764        opts.addOptions()(cOSS2.str(), m_GOPListMvc[k][i-1], GOPEntry());
765        if ( i != 1 || k > 0 )
766        {
767          opts.opt_list.back()->opt->opt_duplicate = true; 
768        }       
769      }
770    }
771  }
772#else
773  for(Int i=1; i<MAX_GOP+1; i++) {
774    std::ostringstream cOSS;
775    cOSS<<"Frame"<<i;
776    opts.addOptions()(cOSS.str(), m_GOPList[i-1], GOPEntry());
777  }
778#endif
779  po::setDefaults(opts);
780  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
781
782  for (list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
783  {
784    fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
785  }
786 
787  if (argc == 1 || do_help)
788  {
789    /* argc == 1: no options have been specified */
790    po::doHelp(cout, opts);
791    return false;
792  }
793 
794  /*
795   * Set any derived parameters
796   */
797  /* convert std::string to c string for compatability */
798#if !H_MV
799  m_pchInputFile = cfg_InputFile.empty() ? NULL : strdup(cfg_InputFile.c_str());
800#endif
801  m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
802#if !H_MV
803  m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str());
804#endif
805  m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str());
806 
807  Char* pColumnWidth = cfg_ColumnWidth.empty() ? NULL: strdup(cfg_ColumnWidth.c_str());
808  Char* pRowHeight = cfg_RowHeight.empty() ? NULL : strdup(cfg_RowHeight.c_str());
809  if( m_iUniformSpacingIdr == 0 && m_iNumColumnsMinus1 > 0 )
810  {
811    char *columnWidth;
812    int  i=0;
813    m_pColumnWidth = new UInt[m_iNumColumnsMinus1];
814    columnWidth = strtok(pColumnWidth, " ,-");
815    while(columnWidth!=NULL)
816    {
817      if( i>=m_iNumColumnsMinus1 )
818      {
819        printf( "The number of columns whose width are defined is larger than the allowed number of columns.\n" );
820        exit( EXIT_FAILURE );
821      }
822      *( m_pColumnWidth + i ) = atoi( columnWidth );
823      columnWidth = strtok(NULL, " ,-");
824      i++;
825    }
826    if( i<m_iNumColumnsMinus1 )
827    {
828      printf( "The width of some columns is not defined.\n" );
829      exit( EXIT_FAILURE );
830    }
831  }
832  else
833  {
834    m_pColumnWidth = NULL;
835  }
836
837  if( m_iUniformSpacingIdr == 0 && m_iNumRowsMinus1 > 0 )
838  {
839    char *rowHeight;
840    int  i=0;
841    m_pRowHeight = new UInt[m_iNumRowsMinus1];
842    rowHeight = strtok(pRowHeight, " ,-");
843    while(rowHeight!=NULL)
844    {
845      if( i>=m_iNumRowsMinus1 )
846      {
847        printf( "The number of rows whose height are defined is larger than the allowed number of rows.\n" );
848        exit( EXIT_FAILURE );
849      }
850      *( m_pRowHeight + i ) = atoi( rowHeight );
851      rowHeight = strtok(NULL, " ,-");
852      i++;
853    }
854    if( i<m_iNumRowsMinus1 )
855    {
856      printf( "The height of some rows is not defined.\n" );
857      exit( EXIT_FAILURE );
858   }
859  }
860  else
861  {
862    m_pRowHeight = NULL;
863  }
864#if H_MV
865  free ( pColumnWidth );
866  free ( pRowHeight   ); 
867#endif
868#if SIGNAL_BITRATE_PICRATE_IN_VPS
869  readBoolString(cfg_bitRateInfoPresentFlag, m_bitRatePicRateMaxTLayers, m_bitRateInfoPresentFlag, "bit rate info. present flag" );
870  readIntString (cfg_avgBitRate,             m_bitRatePicRateMaxTLayers, m_avgBitRate,             "avg. bit rate"               );
871  readIntString (cfg_maxBitRate,             m_bitRatePicRateMaxTLayers, m_maxBitRate,             "max. bit rate"               );
872  readBoolString(cfg_picRateInfoPresentFlag, m_bitRatePicRateMaxTLayers, m_picRateInfoPresentFlag, "bit rate info. present flag" );
873  readIntString (cfg_avgPicRate,             m_bitRatePicRateMaxTLayers, m_avgPicRate,             "avg. pic rate"               );
874  readIntString (cfg_constantPicRateIdc,     m_bitRatePicRateMaxTLayers, m_constantPicRateIdc,     "constant pic rate Idc"       );
875#endif
876  m_scalingListFile = cfg_ScalingListFile.empty() ? NULL : strdup(cfg_ScalingListFile.c_str());
877 
878  /* rules for input, output and internal bitdepths as per help text */
879  if (!m_internalBitDepthY) { m_internalBitDepthY = m_inputBitDepthY; }
880  if (!m_internalBitDepthC) { m_internalBitDepthC = m_internalBitDepthY; }
881  if (!m_inputBitDepthC) { m_inputBitDepthC = m_inputBitDepthY; }
882  if (!m_outputBitDepthY) { m_outputBitDepthY = m_internalBitDepthY; }
883  if (!m_outputBitDepthC) { m_outputBitDepthC = m_internalBitDepthC; }
884
885  // TODO:ChromaFmt assumes 4:2:0 below
886  switch (m_conformanceMode)
887  {
888  case 0:
889    {
890      // no conformance or padding
891      m_confLeft = m_confRight = m_confTop = m_confBottom = 0;
892      m_aiPad[1] = m_aiPad[0] = 0;
893      break;
894    }
895  case 1:
896    {
897      // automatic padding to minimum CU size
898      Int minCuSize = m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1);
899      if (m_iSourceWidth % minCuSize)
900      {
901        m_aiPad[0] = m_confRight  = ((m_iSourceWidth / minCuSize) + 1) * minCuSize - m_iSourceWidth;
902        m_iSourceWidth  += m_confRight;
903      }
904      if (m_iSourceHeight % minCuSize)
905      {
906        m_aiPad[1] = m_confBottom = ((m_iSourceHeight / minCuSize) + 1) * minCuSize - m_iSourceHeight;
907        m_iSourceHeight += m_confBottom;
908      }
909      if (m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0)
910      {
911        fprintf(stderr, "Error: picture width is not an integer multiple of the specified chroma subsampling\n");
912        exit(EXIT_FAILURE);
913      }
914      if (m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0)
915      {
916        fprintf(stderr, "Error: picture height is not an integer multiple of the specified chroma subsampling\n");
917        exit(EXIT_FAILURE);
918      }
919      break;
920    }
921  case 2:
922    {
923      //padding
924      m_iSourceWidth  += m_aiPad[0];
925      m_iSourceHeight += m_aiPad[1];
926      m_confRight  = m_aiPad[0];
927      m_confBottom = m_aiPad[1];
928      break;
929    }
930  case 3:
931    {
932      // conformance
933      if ((m_confLeft == 0) && (m_confRight == 0) && (m_confTop == 0) && (m_confBottom == 0))
934      {
935        fprintf(stderr, "Warning: Conformance window enabled, but all conformance window parameters set to zero\n");
936      }
937      if ((m_aiPad[1] != 0) || (m_aiPad[0]!=0))
938      {
939        fprintf(stderr, "Warning: Conformance window enabled, padding parameters will be ignored\n");
940      }
941      m_aiPad[1] = m_aiPad[0] = 0;
942      break;
943    }
944  }
945 
946  // allocate slice-based dQP values
947#if H_MV
948  xResizeVector( m_viewId    ); 
949#if H_3D
950  xResizeVector( m_depthFlag ); 
951
952  std::vector<Int> uniqueViewIds; 
953  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
954  {   
955    Bool isIn = false; 
956    for ( Int i = 0 ; i < uniqueViewIds.size(); i++ )
957    {
958      isIn = isIn || ( m_viewId[ layer ] == uniqueViewIds[ i ] ); 
959    }
960    if ( !isIn ) 
961    {
962      uniqueViewIds.push_back( m_viewId[ layer ] ); 
963    } 
964  }
965  m_iNumberOfViews = (Int) uniqueViewIds.size(); 
966#endif
967
968  xResizeVector( m_fQP ); 
969
970  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
971  {
972    m_aidQP.push_back( new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ] );
973    ::memset( m_aidQP[layer], 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );
974
975    // handling of floating-point QP values
976    // if QP is not integer, sequence is split into two sections having QP and QP+1
977    m_iQP.push_back((Int)( m_fQP[layer] ));
978    if ( m_iQP[layer] < m_fQP[layer] )
979    {
980      Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP[layer] - m_iQP[layer])*m_framesToBeEncoded + 0.5 );
981
982      iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
983      for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
984      {
985        m_aidQP[layer][i] = 1;
986      }
987    }
988  }
989
990  xResizeVector( m_bLoopFilterDisable ); 
991  xResizeVector( m_bUseSAO );   
992
993#else
994  m_aidQP = new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ];
995  ::memset( m_aidQP, 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );
996 
997  // handling of floating-point QP values
998  // if QP is not integer, sequence is split into two sections having QP and QP+1
999  m_iQP = (Int)( m_fQP );
1000  if ( m_iQP < m_fQP )
1001  {
1002    Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP - m_iQP)*m_framesToBeEncoded + 0.5 );
1003   
1004    iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
1005    for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
1006    {
1007      m_aidQP[i] = 1;
1008    }
1009  }
1010#endif
1011 
1012  // reading external dQP description from file
1013  if ( m_pchdQPFile )
1014  {
1015    FILE* fpt=fopen( m_pchdQPFile, "r" );
1016    if ( fpt )
1017    {
1018#if H_MV
1019      for( Int layer = 0; layer < m_numberOfLayers; layer++ )
1020      {
1021#endif
1022      Int iValue;
1023      Int iPOC = 0;
1024      while ( iPOC < m_framesToBeEncoded )
1025      {
1026        if ( fscanf(fpt, "%d", &iValue ) == EOF ) break;
1027#if H_MV
1028        m_aidQP[layer][ iPOC ] = iValue;
1029        iPOC++;
1030      }
1031#else
1032        m_aidQP[ iPOC ] = iValue;
1033        iPOC++;
1034#endif
1035      }
1036      fclose(fpt);
1037    }
1038  }
1039  m_iWaveFrontSubstreams = m_iWaveFrontSynchro ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1;
1040
1041#if J0149_TONE_MAPPING_SEI
1042  if( m_toneMappingInfoSEIEnabled && !m_toneMapCancelFlag )
1043  {
1044    Char* pcStartOfCodedInterval = cfg_startOfCodedInterval.empty() ? NULL: strdup(cfg_startOfCodedInterval.c_str());
1045    Char* pcCodedPivotValue = cfg_codedPivotValue.empty() ? NULL: strdup(cfg_codedPivotValue.c_str());
1046    Char* pcTargetPivotValue = cfg_targetPivotValue.empty() ? NULL: strdup(cfg_targetPivotValue.c_str());
1047    if( m_toneMapModelId == 2 && pcStartOfCodedInterval )
1048    {
1049      char *startOfCodedInterval;
1050      UInt num = 1u<< m_toneMapTargetBitDepth;
1051      m_startOfCodedInterval = new Int[num];
1052      ::memset( m_startOfCodedInterval, 0, sizeof(Int)*num );
1053      startOfCodedInterval = strtok(pcStartOfCodedInterval, " .");
1054      int i = 0;
1055      while( startOfCodedInterval && ( i < num ) )
1056      {
1057        m_startOfCodedInterval[i] = atoi( startOfCodedInterval );
1058        startOfCodedInterval = strtok(NULL, " .");
1059        i++;
1060      }
1061    } 
1062    else
1063    {
1064      m_startOfCodedInterval = NULL;
1065    }
1066    if( ( m_toneMapModelId == 3 ) && ( m_numPivots > 0 ) )
1067    {
1068      if( pcCodedPivotValue && pcTargetPivotValue )
1069      {
1070        char *codedPivotValue;
1071        char *targetPivotValue;
1072        m_codedPivotValue = new Int[m_numPivots];
1073        m_targetPivotValue = new Int[m_numPivots];
1074        ::memset( m_codedPivotValue, 0, sizeof(Int)*( m_numPivots ) );
1075        ::memset( m_targetPivotValue, 0, sizeof(Int)*( m_numPivots ) );
1076        codedPivotValue = strtok(pcCodedPivotValue, " .");
1077        int i=0;
1078        while(codedPivotValue&&i<m_numPivots)
1079        {
1080          m_codedPivotValue[i] = atoi( codedPivotValue );
1081          codedPivotValue = strtok(NULL, " .");
1082          i++;
1083        }
1084        i=0;
1085        targetPivotValue = strtok(pcTargetPivotValue, " .");
1086        while(targetPivotValue&&i<m_numPivots)
1087        {
1088          m_targetPivotValue[i]= atoi( targetPivotValue );
1089          targetPivotValue = strtok(NULL, " .");
1090          i++;
1091        }
1092      }
1093    }
1094    else
1095    {
1096      m_codedPivotValue = NULL;
1097      m_targetPivotValue = NULL;
1098    }
1099  }
1100#endif
1101#if H_3D
1102  // set global varibles
1103  xSetGlobal();
1104#if H_3D_VSO
1105// Table base optimization
1106  // Q&D
1107  Double adLambdaScaleTable[] = 
1108  {  0.031250, 0.031639, 0.032029, 0.032418, 0.032808, 0.033197, 0.033586, 0.033976, 0.034365, 0.034755, 
1109     0.035144, 0.035533, 0.035923, 0.036312, 0.036702, 0.037091, 0.037480, 0.037870, 0.038259, 0.038648, 
1110     0.039038, 0.039427, 0.039817, 0.040206, 0.040595, 0.040985, 0.041374, 0.041764, 0.042153, 0.042542, 
1111     0.042932, 0.043321, 0.043711, 0.044100, 0.044194, 0.053033, 0.061872, 0.070711, 0.079550, 0.088388, 
1112     0.117851, 0.147314, 0.176777, 0.235702, 0.294628, 0.353553, 0.471405, 0.589256, 0.707107, 0.707100, 
1113     0.753550, 0.800000 
1114  }; 
1115  if ( m_bVSOLSTable )
1116  {
1117    Int firstDepthLayer = -1; 
1118    for (Int layer = 0; layer < m_numberOfLayers; layer++ )
1119    {
1120      if ( m_depthFlag[ layer ])
1121      {
1122        firstDepthLayer = layer;
1123        break; 
1124      }
1125    }
1126    AOT( firstDepthLayer == -1 );
1127    AOT( (m_iQP[firstDepthLayer] < 0) || (m_iQP[firstDepthLayer] > 51));
1128    m_dLambdaScaleVSO *= adLambdaScaleTable[m_iQP[firstDepthLayer]]; 
1129  }
1130#endif
1131#if H_3D_VSO
1132if ( m_bUseVSO && m_uiVSOMode == 4)
1133{
1134  m_cRenModStrParser.setString( m_iNumberOfViews, m_pchVSOConfig );
1135  m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
1136                                      g_bitDepthY,
1137                                (UInt)m_iCodedCamParPrecision,
1138                                      m_FrameSkip,
1139                                (UInt)m_framesToBeEncoded,
1140                                      m_pchCameraParameterFile,
1141                                      m_pchBaseViewCameraNumbers,
1142                                      NULL,
1143                                      m_cRenModStrParser.getSynthViews(),
1144                                      LOG2_DISP_PREC_LUT );
1145}
1146else if ( m_bUseVSO && m_uiVSOMode != 4 )
1147{
1148  m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
1149                                      g_bitDepthY,
1150                                (UInt)m_iCodedCamParPrecision,
1151                                      m_FrameSkip,
1152                                (UInt)m_framesToBeEncoded,
1153                                      m_pchCameraParameterFile,
1154                                      m_pchBaseViewCameraNumbers,
1155                                      m_pchVSOConfig,
1156                                      NULL,
1157                                      LOG2_DISP_PREC_LUT );
1158}
1159else
1160{
1161  m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
1162    g_bitDepthY,
1163    (UInt) m_iCodedCamParPrecision,
1164    m_FrameSkip,
1165    (UInt) m_framesToBeEncoded,
1166    m_pchCameraParameterFile,
1167    m_pchBaseViewCameraNumbers,
1168    NULL,
1169    NULL,
1170    LOG2_DISP_PREC_LUT );
1171}
1172#else
1173  m_cCameraData     .init     ( ((UInt) m_iNumberOfViews ), 
1174    g_bitDepthY,
1175    (UInt) m_iCodedCamParPrecision,
1176    m_FrameSkip,
1177    (UInt) m_framesToBeEncoded,
1178    m_pchCameraParameterFile,
1179    m_pchBaseViewCameraNumbers,
1180    NULL,
1181    NULL,
1182    LOG2_DISP_PREC_LUT );
1183#endif
1184  m_cCameraData.check( false, true );
1185#endif
1186  // check validity of input parameters
1187  xCheckParameter();
1188
1189#if !H_3D
1190  // set global varibles
1191  xSetGlobal();
1192#endif
1193 
1194  // print-out parameters
1195  xPrintParameter();
1196 
1197  return true;
1198}
1199#if SIGNAL_BITRATE_PICRATE_IN_VPS
1200Void readBoolString(const string inpString, const Int numEntries, Bool* &memberArray, const char *elementName)
1201{
1202  Char* inpArray = inpString.empty() ? NULL : strdup(inpString.c_str());
1203  Int i = 0;
1204  if(numEntries)
1205  {
1206    Char* tempArray = strtok(inpArray, " ,-");
1207    memberArray = new Bool[numEntries];
1208    while( tempArray != NULL )
1209    {
1210      if( i >= numEntries )
1211      {
1212        printf( "The number of %s defined is larger than the allowed number\n", elementName );
1213        exit( EXIT_FAILURE );
1214      }
1215      assert( (atoi(tempArray) == 0) || (atoi(tempArray) == 1) );
1216      *( memberArray + i ) = atoi(tempArray);
1217      tempArray = strtok(NULL, " ,-");
1218      i++;
1219    }
1220    if( i < numEntries )
1221    {
1222      printf( "Some %s are not defined\n", elementName );
1223      exit( EXIT_FAILURE );
1224    }
1225  }
1226  else
1227  {
1228    memberArray = NULL;
1229  }
1230}
1231
1232Void readIntString(const string inpString, const Int numEntries, Int* &memberArray, const char *elementName)
1233{
1234  Char* inpArray = inpString.empty() ? NULL : strdup(inpString.c_str());
1235  Int i = 0;
1236  if(numEntries)
1237  {
1238    Char* tempArray = strtok(inpArray, " ,-");
1239    memberArray = new Int[numEntries];
1240    while( tempArray != NULL )
1241    {
1242      if( i >= numEntries )
1243      {
1244        printf( "The number of %s defined is larger than the allowed number\n", elementName );
1245        exit( EXIT_FAILURE );
1246      }
1247      *( memberArray + i ) = atoi(tempArray);
1248      tempArray = strtok(NULL, " ,-");
1249      i++;
1250    }
1251    if( i < numEntries )
1252    {
1253      printf( "Some %s are not defined\n", elementName );
1254      exit( EXIT_FAILURE );
1255    }
1256  }
1257  else
1258  {
1259    memberArray = NULL;
1260  }
1261}
1262#endif
1263// ====================================================================================================================
1264// Private member functions
1265// ====================================================================================================================
1266
1267Bool confirmPara(Bool bflag, const Char* message);
1268
1269Void TAppEncCfg::xCheckParameter()
1270{
1271  if (!m_decodedPictureHashSEIEnabled)
1272  {
1273    fprintf(stderr, "******************************************************************\n");
1274    fprintf(stderr, "** WARNING: --SEIDecodedPictureHash is now disabled by default. **\n");
1275    fprintf(stderr, "**          Automatic verification of decoded pictures by a     **\n");
1276    fprintf(stderr, "**          decoder requires this option to be enabled.         **\n");
1277    fprintf(stderr, "******************************************************************\n");
1278  }
1279
1280  Bool check_failed = false; /* abort if there is a fatal configuration problem */
1281#define xConfirmPara(a,b) check_failed |= confirmPara(a,b)
1282  // check range of parameters
1283  xConfirmPara( m_inputBitDepthY < 8,                                                     "InputBitDepth must be at least 8" );
1284  xConfirmPara( m_inputBitDepthC < 8,                                                     "InputBitDepthC must be at least 8" );
1285  xConfirmPara( m_iFrameRate <= 0,                                                          "Frame rate must be more than 1" );
1286  xConfirmPara( m_framesToBeEncoded <= 0,                                                   "Total Number Of Frames encoded must be more than 0" );
1287#if H_MV
1288  xConfirmPara( m_numberOfLayers > MAX_NUM_LAYER_IDS ,                                      "NumberOfLayers must be less than or equal to MAX_NUM_LAYER_IDS");
1289
1290
1291  xConfirmPara( m_layerIdInNuh[0] != 0      , "LayerIdInNuh must be 0 for the first layer. ");
1292  xConfirmPara( (m_layerIdInNuh.size()!=1) && (m_layerIdInNuh.size() < m_numberOfLayers) , "LayerIdInNuh must be given for all layers. ");
1293
1294#if H_3D
1295  xConfirmPara( m_scalabilityMask != 1 && m_scalabilityMask != 3, "Scalability Mask must be equal to 1 or 3. ");
1296#else
1297  xConfirmPara( m_scalabilityMask != 1 , "Scalability Mask must be equal to 1. ");
1298#endif
1299
1300  m_dimIds.push_back( m_viewId ); 
1301  const Int viewDimPosition = 0; 
1302#if H_3D
1303  if ( m_scalabilityMask & ( 1 << DEPTH_ID ) )
1304    m_dimIds.push_back( m_depthFlag ); 
1305#endif
1306
1307  xConfirmPara(  m_dimensionIdLen.size() < m_dimIds.size(), "DimensionIdLen must be given for all dimensions. "   ); 
1308
1309  for( Int dim = 0; dim < m_dimIds.size(); dim++ )
1310  {
1311    xConfirmPara( m_dimIds[dim].size() < m_numberOfLayers,  "DimensionId must be given for all layers and all dimensions. ");   
1312    xConfirmPara( ( dim != viewDimPosition ) &&  (m_dimIds[dim][0] != 0), "DimensionId of layer 0 must be 0. " );
1313    xConfirmPara( m_dimensionIdLen[dim] < 1 || m_dimensionIdLen[dim] > 8, "DimensionIdLen must be greater than 0 and less than 9 in all dimensions. " ); 
1314    for( Int i = 1; i < m_numberOfLayers; i++ )
1315    {     
1316      xConfirmPara(  ( m_dimIds[dim][i] < 0 ) || ( m_dimIds[dim][i] > ( ( 1 << m_dimensionIdLen[dim] ) - 1 ) )   , "DimensionId shall be in the range of 0 to 2^DimensionIdLen - 1. " );
1317    }
1318  }
1319
1320  for( Int i = 0; i < m_numberOfLayers; i++ )
1321  {
1322    for( Int j = 0; j < i; j++ )
1323    {     
1324      Int numDiff  = 0; 
1325      Int lastDiff = -1; 
1326      for( Int dim = 0; dim < m_dimIds.size(); dim++ )
1327      {
1328        if ( m_dimIds[dim][i] != m_dimIds[dim][j] )
1329        {
1330          numDiff ++; 
1331          lastDiff = dim; 
1332        }
1333      }
1334
1335      Bool allEqual = ( numDiff == 0 ); 
1336
1337      if ( allEqual ) 
1338      {
1339        printf( "\nError: Positions of Layers %d and %d are identical in scalability space\n", i, j);
1340      }
1341
1342      xConfirmPara( allEqual , "Each layer shall have a different position in scalability space." );
1343
1344      if ( numDiff  == 1 ) 
1345      {
1346        Bool inc = m_dimIds[ lastDiff ][ i ] > m_dimIds[ lastDiff ][ j ]; 
1347        Bool shallBeButIsNotIncreasing = ( !inc && ( lastDiff != viewDimPosition ) ) ; 
1348        if ( shallBeButIsNotIncreasing )
1349        {       
1350          printf( "\nError: Positions of Layers %d and %d is not increasing in dimension %d \n", i, j, lastDiff);       
1351        }
1352        xConfirmPara( shallBeButIsNotIncreasing && ( lastDiff != viewDimPosition ),  "DimensionIds shall be increasing within one dimension. " );
1353      }
1354    }
1355  }
1356
1357  /// Layer sets
1358  xConfirmPara( m_vpsNumLayerSets < 0 || m_vpsNumLayerSets > 1024, "VpsNumLayerSets must be greater than 0 and less than 1025") ; 
1359  for( Int lsIdx = 0; lsIdx < m_vpsNumLayerSets; lsIdx++ )
1360  {
1361    if (lsIdx == 0)
1362    {
1363      xConfirmPara( m_layerIdsInSets[lsIdx].size() != 1 || m_layerIdsInSets[lsIdx][0] != 0 , "0-th layer shall only include layer 0. ");
1364    }
1365    for ( Int i = 0; i < m_layerIdsInSets[lsIdx].size(); i++ )
1366    {
1367      xConfirmPara( m_layerIdsInSets[lsIdx][i] < 0 || m_layerIdsInSets[lsIdx].size() >= MAX_NUM_LAYER_IDS, "LayerIdsInSet must be greater than and less than 64" ); 
1368    }
1369  }
1370
1371  // Output layer sets
1372  xConfirmPara( m_outputLayerSetIdx.size() < 0 || m_outputLayerSetIdx.size() > 1024, "The number of output layer set indices must be less than 1025") ;
1373  for (Int lsIdx = 0; lsIdx < m_outputLayerSetIdx.size(); lsIdx++)
1374  {   
1375    Int refLayerSetIdx = m_outputLayerSetIdx[ lsIdx ]; 
1376    xConfirmPara(  refLayerSetIdx < 0 || refLayerSetIdx >= m_vpsNumLayerSets, "Output layer set idx must be greater or equal to 0 and less than the VpsNumLayerSets" );
1377
1378    for (Int i = 0; i < m_layerIdsInAddOutputLayerSet[ lsIdx ].size(); i++)
1379    {
1380      Bool isAlsoInLayerSet = false; 
1381      for (Int j = 0; j < m_layerIdsInSets[ refLayerSetIdx ].size(); j++ )
1382      {
1383        if ( m_layerIdsInSets[ refLayerSetIdx ][ j ] == m_layerIdsInAddOutputLayerSet[ lsIdx ][ i ] )
1384        {
1385          isAlsoInLayerSet = true; 
1386          break; 
1387        }
1388        xConfirmPara( !isAlsoInLayerSet, "All output layers must of a output layer set be included in corresponding layer set");
1389      }
1390    }
1391  }
1392  xConfirmPara( m_profileLevelTierIdx.size() < m_vpsNumLayerSets + m_outputLayerSetIdx.size(), "The number of Profile Level Tier indices must be equal to the number of layer set plus the number of output layer set indices" );
1393#endif
1394  xConfirmPara( m_iGOPSize < 1 ,                                                            "GOP Size must be greater or equal to 1" );
1395  xConfirmPara( m_iGOPSize > 1 &&  m_iGOPSize % 2,                                          "GOP Size must be a multiple of 2, if GOP Size is greater than 1" );
1396  xConfirmPara( (m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, "Intra period must be more than GOP size, or -1 , not 0" );
1397  xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 2,                   "Decoding Refresh Type must be equal to 0, 1 or 2" );
1398#if H_MV
1399  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
1400  {
1401    xConfirmPara( m_iQP[layer] <  -6 * (m_internalBitDepthY - 8) || m_iQP[layer] > 51,      "QP exceeds supported range (-QpBDOffsety to 51)" );
1402  }
1403#else
1404  xConfirmPara( m_iQP <  -6 * (m_internalBitDepthY - 8) || m_iQP > 51,                    "QP exceeds supported range (-QpBDOffsety to 51)" );
1405#endif
1406  xConfirmPara( m_loopFilterBetaOffsetDiv2 < -13 || m_loopFilterBetaOffsetDiv2 > 13,          "Loop Filter Beta Offset div. 2 exceeds supported range (-13 to 13)");
1407  xConfirmPara( m_loopFilterTcOffsetDiv2 < -13 || m_loopFilterTcOffsetDiv2 > 13,              "Loop Filter Tc Offset div. 2 exceeds supported range (-13 to 13)");
1408  xConfirmPara( m_iFastSearch < 0 || m_iFastSearch > 2,                                     "Fast Search Mode is not supported value (0:Full search  1:Diamond  2:PMVFAST)" );
1409  xConfirmPara( m_iSearchRange < 0 ,                                                        "Search Range must be more than 0" );
1410  xConfirmPara( m_bipredSearchRange < 0 ,                                                   "Search Range must be more than 0" );
1411  xConfirmPara( m_iMaxDeltaQP > 7,                                                          "Absolute Delta QP exceeds supported range (0 to 7)" );
1412  xConfirmPara( m_iMaxCuDQPDepth > m_uiMaxCUDepth - 1,                                          "Absolute depth for a minimum CuDQP exceeds maximum coding unit depth" );
1413
1414  xConfirmPara( m_cbQpOffset < -12,   "Min. Chroma Cb QP Offset is -12" );
1415  xConfirmPara( m_cbQpOffset >  12,   "Max. Chroma Cb QP Offset is  12" );
1416  xConfirmPara( m_crQpOffset < -12,   "Min. Chroma Cr QP Offset is -12" );
1417  xConfirmPara( m_crQpOffset >  12,   "Max. Chroma Cr QP Offset is  12" );
1418
1419  xConfirmPara( m_iQPAdaptationRange <= 0,                                                  "QP Adaptation Range must be more than 0" );
1420  if (m_iDecodingRefreshType == 2)
1421  {
1422    xConfirmPara( m_iIntraPeriod > 0 && m_iIntraPeriod <= m_iGOPSize ,                      "Intra period must be larger than GOP size for periodic IDR pictures");
1423  }
1424  xConfirmPara( (m_uiMaxCUWidth  >> m_uiMaxCUDepth) < 4,                                    "Minimum partition width size should be larger than or equal to 8");
1425  xConfirmPara( (m_uiMaxCUHeight >> m_uiMaxCUDepth) < 4,                                    "Minimum partition height size should be larger than or equal to 8");
1426  xConfirmPara( m_uiMaxCUWidth < 16,                                                        "Maximum partition width size should be larger than or equal to 16");
1427  xConfirmPara( m_uiMaxCUHeight < 16,                                                       "Maximum partition height size should be larger than or equal to 16");
1428  xConfirmPara( (m_iSourceWidth  % (m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame width must be a multiple of the minimum CU size");
1429  xConfirmPara( (m_iSourceHeight % (m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame height must be a multiple of the minimum CU size");
1430 
1431  xConfirmPara( m_uiQuadtreeTULog2MinSize < 2,                                        "QuadtreeTULog2MinSize must be 2 or greater.");
1432  xConfirmPara( m_uiQuadtreeTULog2MaxSize > 5,                                        "QuadtreeTULog2MaxSize must be 5 or smaller.");
1433  xConfirmPara( (1<<m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth,                                        "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
1434 
1435  xConfirmPara( m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize,                "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize.");
1436  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUWidth >>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
1437  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUHeight>>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
1438  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUWidth  >> m_uiMaxCUDepth ), "Minimum CU width must be greater than minimum transform size." );
1439  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUHeight >> m_uiMaxCUDepth ), "Minimum CU height must be greater than minimum transform size." );
1440  xConfirmPara( m_uiQuadtreeTUMaxDepthInter < 1,                                                         "QuadtreeTUMaxDepthInter must be greater than or equal to 1" );
1441  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" );
1442  xConfirmPara( m_uiQuadtreeTUMaxDepthIntra < 1,                                                         "QuadtreeTUMaxDepthIntra must be greater than or equal to 1" );
1443  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" );
1444 
1445  xConfirmPara(  m_maxNumMergeCand < 1,  "MaxNumMergeCand must be 1 or greater.");
1446  xConfirmPara(  m_maxNumMergeCand > 5,  "MaxNumMergeCand must be 5 or smaller.");
1447
1448#if ADAPTIVE_QP_SELECTION
1449#if H_MV
1450  for( Int layer = 0; layer < m_numberOfLayers; layer++ )
1451  {
1452    xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP[layer] < 0,                                     "AdaptiveQpSelection must be disabled when QP < 0.");
1453  }
1454#else
1455  xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP < 0,                                              "AdaptiveQpSelection must be disabled when QP < 0.");
1456#endif
1457  xConfirmPara( m_bUseAdaptQpSelect == true && (m_cbQpOffset !=0 || m_crQpOffset != 0 ),               "AdaptiveQpSelection must be disabled when ChromaQpOffset is not equal to 0.");
1458#endif
1459
1460  if( m_usePCM)
1461  {
1462    xConfirmPara(  m_uiPCMLog2MinSize < 3,                                      "PCMLog2MinSize must be 3 or greater.");
1463    xConfirmPara(  m_uiPCMLog2MinSize > 5,                                      "PCMLog2MinSize must be 5 or smaller.");
1464    xConfirmPara(  m_pcmLog2MaxSize > 5,                                        "PCMLog2MaxSize must be 5 or smaller.");
1465    xConfirmPara(  m_pcmLog2MaxSize < m_uiPCMLog2MinSize,                       "PCMLog2MaxSize must be equal to or greater than m_uiPCMLog2MinSize.");
1466  }
1467
1468  xConfirmPara( m_sliceMode < 0 || m_sliceMode > 3, "SliceMode exceeds supported range (0 to 3)" );
1469  if (m_sliceMode!=0)
1470  {
1471    xConfirmPara( m_sliceArgument < 1 ,         "SliceArgument should be larger than or equal to 1" );
1472  }
1473  xConfirmPara( m_sliceSegmentMode < 0 || m_sliceSegmentMode > 3, "SliceSegmentMode exceeds supported range (0 to 3)" );
1474  if (m_sliceSegmentMode!=0)
1475  {
1476    xConfirmPara( m_sliceSegmentArgument < 1 ,         "SliceSegmentArgument should be larger than or equal to 1" );
1477  }
1478 
1479  Bool tileFlag = (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0 );
1480  xConfirmPara( tileFlag && m_iWaveFrontSynchro,            "Tile and Wavefront can not be applied together");
1481
1482  //TODO:ChromaFmt assumes 4:2:0 below
1483  xConfirmPara( m_iSourceWidth  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Picture width must be an integer multiple of the specified chroma subsampling");
1484  xConfirmPara( m_iSourceHeight % TComSPS::getWinUnitY(CHROMA_420) != 0, "Picture height must be an integer multiple of the specified chroma subsampling");
1485
1486  xConfirmPara( m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling");
1487  xConfirmPara( m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling");
1488
1489  xConfirmPara( m_confLeft   % TComSPS::getWinUnitX(CHROMA_420) != 0, "Left conformance window offset must be an integer multiple of the specified chroma subsampling");
1490  xConfirmPara( m_confRight  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Right conformance window offset must be an integer multiple of the specified chroma subsampling");
1491  xConfirmPara( m_confTop    % TComSPS::getWinUnitY(CHROMA_420) != 0, "Top conformance window offset must be an integer multiple of the specified chroma subsampling");
1492  xConfirmPara( m_confBottom % TComSPS::getWinUnitY(CHROMA_420) != 0, "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling");
1493
1494#if H_3D
1495  xConfirmPara( m_pchCameraParameterFile    == 0                ,   "CameraParameterFile must be given");
1496  xConfirmPara( m_pchBaseViewCameraNumbers  == 0                ,   "BaseViewCameraNumbers must be given" );
1497  xConfirmPara( ((UInt) m_numberOfLayers >> 1 ) != m_cCameraData.getBaseViewNumbers().size(),   "Number of Views in BaseViewCameraNumbers must be equal to NumberOfViews" );
1498  xConfirmPara    ( m_iCodedCamParPrecision < 0 || m_iCodedCamParPrecision > 5,       "CodedCamParsPrecision must be in range of 0..5" );
1499#if H_3D_VSO
1500    if( m_bUseVSO )
1501    {
1502      xConfirmPara(   m_pchVSOConfig            == 0                             ,   "VSO Setup string must be given");
1503      xConfirmPara( m_uiVSOMode > 4 ,                                                "VSO Mode must be less than 5");
1504    }
1505#endif
1506#endif
1507  // max CU width and height should be power of 2
1508  UInt ui = m_uiMaxCUWidth;
1509  while(ui)
1510  {
1511    ui >>= 1;
1512    if( (ui & 1) == 1)
1513      xConfirmPara( ui != 1 , "Width should be 2^n");
1514  }
1515  ui = m_uiMaxCUHeight;
1516  while(ui)
1517  {
1518    ui >>= 1;
1519    if( (ui & 1) == 1)
1520      xConfirmPara( ui != 1 , "Height should be 2^n");
1521  }
1522
1523#if H_MV
1524  // validate that POC of same frame is identical across multiple layers
1525  Bool bErrorMvePoc = false;
1526  if( m_numberOfLayers > 1 )
1527  {
1528    for( Int k = 1; k < m_numberOfLayers; k++ )
1529    {
1530      for( Int i = 0; i < MAX_GOP; i++ )
1531      {
1532        if( m_GOPListMvc[k][i].m_POC != m_GOPListMvc[0][i].m_POC )
1533        {
1534          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 );
1535          bErrorMvePoc = true;
1536        }
1537      }
1538    }
1539  }
1540  xConfirmPara( bErrorMvePoc,  "Invalid inter-layer POC structure given" );
1541
1542  // validate that baseview has no inter-view refs
1543  Bool bErrorIvpBase = false;
1544  for( Int i = 0; i < MAX_GOP; i++ )
1545  {
1546    if( m_GOPListMvc[0][i].m_numInterViewRefPics != 0 )
1547    {
1548      printf( "\nError: Frame%d inter_layer refs not available in layer 0\n", i );
1549      bErrorIvpBase = true;
1550    }
1551  }
1552  xConfirmPara( bErrorIvpBase, "Inter-layer refs not possible in base layer" );
1553
1554  // validate inter-view refs
1555  Bool bErrorIvpEnhV = false;
1556  if( m_numberOfLayers > 1 )
1557  {
1558    for( Int k = 1; k < m_numberOfLayers; k++ )
1559    {
1560      for( Int i = 0; i < MAX_GOP+1; i++ )
1561      {
1562        for( Int j = 0; j < m_GOPListMvc[k][i].m_numInterViewRefPics; j++ )
1563        {
1564          Int iAbsViewId = m_GOPListMvc[k][i].m_interViewRefs[j] + k;
1565          if( iAbsViewId < 0 || iAbsViewId >= k )
1566          {
1567            printf( "\nError: inter-layer ref pic %d is not available for Frame%d_l%d\n", m_GOPListMvc[k][i].m_interViewRefs[j], i, k );
1568            bErrorIvpEnhV = true;
1569          }
1570          if( m_GOPListMvc[k][i].m_interViewRefPosL[0][j] < -1 || m_GOPListMvc[k][i].m_interViewRefPosL[0][j] > m_GOPListMvc[k][i].m_numRefPicsActive )
1571          {
1572            printf( "\nError: inter-layer ref pos %d on L0 is not available for Frame%d_l%d\n", m_GOPListMvc[k][i].m_interViewRefPosL[0][j], i, k );
1573            bErrorIvpEnhV = true;
1574          }
1575          if( m_GOPListMvc[k][i].m_interViewRefPosL[1][j] < -1  || m_GOPListMvc[k][i].m_interViewRefPosL[1][j] > m_GOPListMvc[k][i].m_numRefPicsActive )
1576          {
1577            printf( "\nError: inter-layer ref pos %d on L1 is not available for Frame%d_l%d\n", m_GOPListMvc[k][i].m_interViewRefPosL[1][j], i, k );
1578            bErrorIvpEnhV = true;
1579          }
1580        }
1581        if( i == MAX_GOP ) // inter-view refs at I pic position in base view
1582        {
1583          if( m_GOPListMvc[k][MAX_GOP].m_sliceType != 'B' && m_GOPListMvc[k][MAX_GOP].m_sliceType != 'P' && m_GOPListMvc[k][MAX_GOP].m_sliceType != 'I' )
1584          {
1585            printf( "\nError: slice type of FrameI_l%d must be equal to B or P or I\n", k );
1586            bErrorIvpEnhV = true;
1587          }
1588
1589          if( m_GOPListMvc[k][MAX_GOP].m_POC != 0 )
1590          {
1591            printf( "\nError: POC %d not possible for FrameI_l%d, must be 0\n", m_GOPListMvc[k][MAX_GOP].m_POC, k );
1592            bErrorIvpEnhV = true;
1593          }
1594
1595          if( m_GOPListMvc[k][MAX_GOP].m_temporalId != 0 )
1596          {
1597            printf( "\nWarning: Temporal id of FrameI_l%d must be 0 (cp. I-frame in base layer)\n", k );
1598            m_GOPListMvc[k][MAX_GOP].m_temporalId = 0;
1599          }
1600
1601          if( m_GOPListMvc[k][MAX_GOP].m_numRefPics != 0 )
1602          {
1603            printf( "\nWarning: temporal references not possible for FrameI_l%d\n", k );
1604            for( Int j = 0; j < m_GOPListMvc[k][MAX_GOP].m_numRefPics; j++ )
1605            {
1606              m_GOPListMvc[k][MAX_GOP].m_referencePics[j] = 0;
1607            }
1608            m_GOPListMvc[k][MAX_GOP].m_numRefPics = 0;
1609          }
1610
1611          if( m_GOPListMvc[k][MAX_GOP].m_interRPSPrediction )
1612          {
1613            printf( "\nError: inter RPS prediction not possible for FrameI_l%d, must be 0\n", k );
1614            bErrorIvpEnhV = true;
1615          }
1616
1617          if( m_GOPListMvc[k][MAX_GOP].m_sliceType == 'I' && m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics != 0 )
1618          {
1619            printf( "\nError: inter-layer prediction not possible for FrameI_l%d with slice type I, #IL_ref_pics must be 0\n", k );
1620            bErrorIvpEnhV = true;
1621          }
1622
1623          if( m_GOPListMvc[k][MAX_GOP].m_numRefPicsActive > m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics )
1624          {
1625            m_GOPListMvc[k][MAX_GOP].m_numRefPicsActive = m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics;
1626          }
1627
1628          if( m_GOPListMvc[k][MAX_GOP].m_sliceType == 'P' )
1629          {
1630            if( m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics < 1 )
1631            {
1632              printf( "\nError: #IL_ref_pics must be at least one for FrameI_l%d with slice type P\n", k );
1633              bErrorIvpEnhV = true;
1634            }
1635            else
1636            {
1637              for( Int j = 0; j < m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics; j++ )
1638              {
1639                if( m_GOPListMvc[k][MAX_GOP].m_interViewRefPosL[1][j] != -1 )
1640                {
1641                  printf( "\nError: inter-layer ref pos %d on L1 not possible for FrameI_l%d with slice type P\n", m_GOPListMvc[k][MAX_GOP].m_interViewRefPosL[1][j], k );
1642                  bErrorIvpEnhV = true;
1643                }
1644              }
1645            }
1646          }
1647
1648          if( m_GOPListMvc[k][MAX_GOP].m_sliceType == 'B' && m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics < 1 )
1649          {
1650            printf( "\nError: #IL_ref_pics must be at least one for FrameI_l%d with slice type B\n", k );
1651            bErrorIvpEnhV = true;
1652          }
1653        }
1654      }
1655    }
1656  }
1657  xConfirmPara( bErrorIvpEnhV, "Invalid inter-layer coding structure for enhancement layers given" );
1658
1659  // validate temporal coding structure
1660  if( !bErrorMvePoc && !bErrorIvpBase && !bErrorIvpEnhV )
1661  {
1662    for( Int layer = 0; layer < m_numberOfLayers; layer++ )
1663    {
1664      GOPEntry* m_GOPList            = m_GOPListMvc           [layer]; // It is not a member, but this name helps avoiding code duplication !!!
1665      Int&      m_extraRPSs          = m_extraRPSsMvc         [layer]; // It is not a member, but this name helps avoiding code duplication !!!
1666      Int&      m_maxTempLayer       = m_maxTempLayerMvc      [layer]; // It is not a member, but this name helps avoiding code duplication !!!
1667      Int*      m_maxDecPicBuffering = m_maxDecPicBufferingMvc[layer]; // It is not a member, but this name helps avoiding code duplication !!!
1668      Int*      m_numReorderPics     = m_numReorderPicsMvc    [layer]; // It is not a member, but this name helps avoiding code duplication !!!
1669#endif
1670  /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure
1671   * This permits the ability to omit a GOP structure specification */
1672  if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1) {
1673    m_GOPList[0] = GOPEntry();
1674    m_GOPList[0].m_QPFactor = 1;
1675    m_GOPList[0].m_betaOffsetDiv2 = 0;
1676    m_GOPList[0].m_tcOffsetDiv2 = 0;
1677    m_GOPList[0].m_POC = 1;
1678    m_GOPList[0].m_numRefPicsActive = 4;
1679  }
1680 
1681  Bool verifiedGOP=false;
1682  Bool errorGOP=false;
1683  Int checkGOP=1;
1684  Int numRefs = 1;
1685  Int refList[MAX_NUM_REF_PICS+1];
1686  refList[0]=0;
1687  Bool isOK[MAX_GOP];
1688  for(Int i=0; i<MAX_GOP; i++) 
1689  {
1690    isOK[i]=false;
1691  }
1692  Int numOK=0;
1693  xConfirmPara( m_iIntraPeriod >=0&&(m_iIntraPeriod%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" );
1694
1695  for(Int i=0; i<m_iGOPSize; i++)
1696  {
1697    if(m_GOPList[i].m_POC==m_iGOPSize)
1698    {
1699      xConfirmPara( m_GOPList[i].m_temporalId!=0 , "The last frame in each GOP must have temporal ID = 0 " );
1700    }
1701  }
1702 
1703#if H_MV
1704  if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable[layer]) )
1705#else
1706  if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable) )
1707#endif
1708  {
1709    for(Int i=0; i<m_iGOPSize; i++)
1710    {
1711      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)" );
1712      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)" );
1713    }
1714  }
1715  m_extraRPSs=0;
1716  //start looping through frames in coding order until we can verify that the GOP structure is correct.
1717  while(!verifiedGOP&&!errorGOP) 
1718  {
1719    Int curGOP = (checkGOP-1)%m_iGOPSize;
1720    Int curPOC = ((checkGOP-1)/m_iGOPSize)*m_iGOPSize + m_GOPList[curGOP].m_POC;   
1721    if(m_GOPList[curGOP].m_POC<0) 
1722    {
1723#if H_MV
1724      printf("\nError: found fewer Reference Picture Sets than GOPSize for layer %d\n", layer );
1725#else
1726      printf("\nError: found fewer Reference Picture Sets than GOPSize\n");
1727#endif
1728      errorGOP=true;
1729    }
1730    else 
1731    {
1732      //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
1733      Bool beforeI = false;
1734      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
1735      {
1736        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
1737        if(absPOC < 0)
1738        {
1739          beforeI=true;
1740        }
1741        else 
1742        {
1743          Bool found=false;
1744          for(Int j=0; j<numRefs; j++) 
1745          {
1746            if(refList[j]==absPOC) 
1747            {
1748              found=true;
1749              for(Int k=0; k<m_iGOPSize; k++)
1750              {
1751                if(absPOC%m_iGOPSize == m_GOPList[k].m_POC%m_iGOPSize)
1752                {
1753                  if(m_GOPList[k].m_temporalId==m_GOPList[curGOP].m_temporalId)
1754                  {
1755                    m_GOPList[k].m_refPic = true;
1756                  }
1757                  m_GOPList[curGOP].m_usedByCurrPic[i]=m_GOPList[k].m_temporalId<=m_GOPList[curGOP].m_temporalId;
1758                }
1759              }
1760            }
1761          }
1762          if(!found)
1763          {
1764#if H_MV
1765            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);
1766#else
1767            printf("\nError: ref pic %d is not available for GOP frame %d\n",m_GOPList[curGOP].m_referencePics[i],curGOP+1);
1768#endif
1769            errorGOP=true;
1770          }
1771        }
1772      }
1773      if(!beforeI&&!errorGOP)
1774      {
1775        //all ref frames were present
1776        if(!isOK[curGOP]) 
1777        {
1778          numOK++;
1779          isOK[curGOP]=true;
1780          if(numOK==m_iGOPSize)
1781          {
1782            verifiedGOP=true;
1783          }
1784        }
1785      }
1786      else 
1787      {
1788        //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
1789        m_GOPList[m_iGOPSize+m_extraRPSs]=m_GOPList[curGOP];
1790        Int newRefs=0;
1791        for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
1792        {
1793          Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
1794          if(absPOC>=0)
1795          {
1796            m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[newRefs]=m_GOPList[curGOP].m_referencePics[i];
1797            m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[newRefs]=m_GOPList[curGOP].m_usedByCurrPic[i];
1798            newRefs++;
1799          }
1800        }
1801        Int numPrefRefs = m_GOPList[curGOP].m_numRefPicsActive;
1802       
1803        for(Int offset = -1; offset>-checkGOP; offset--)
1804        {
1805          //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
1806          Int offGOP = (checkGOP-1+offset)%m_iGOPSize;
1807          Int offPOC = ((checkGOP-1+offset)/m_iGOPSize)*m_iGOPSize + m_GOPList[offGOP].m_POC;
1808          if(offPOC>=0&&m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId)
1809          {
1810            Bool newRef=false;
1811            for(Int i=0; i<numRefs; i++)
1812            {
1813              if(refList[i]==offPOC)
1814              {
1815                newRef=true;
1816              }
1817            }
1818            for(Int i=0; i<newRefs; i++) 
1819            {
1820              if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[i]==offPOC-curPOC)
1821              {
1822                newRef=false;
1823              }
1824            }
1825            if(newRef) 
1826            {
1827              Int insertPoint=newRefs;
1828              //this picture can be added, find appropriate place in list and insert it.
1829              if(m_GOPList[offGOP].m_temporalId==m_GOPList[curGOP].m_temporalId)
1830              {
1831                m_GOPList[offGOP].m_refPic = true;
1832              }
1833              for(Int j=0; j<newRefs; j++)
1834              {
1835                if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]<offPOC-curPOC||m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]>0)
1836                {
1837                  insertPoint = j;
1838                  break;
1839                }
1840              }
1841              Int prev = offPOC-curPOC;
1842              Int prevUsed = m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId;
1843              for(Int j=insertPoint; j<newRefs+1; j++)
1844              {
1845                Int newPrev = m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j];
1846                Int newUsed = m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j];
1847                m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]=prev;
1848                m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j]=prevUsed;
1849                prevUsed=newUsed;
1850                prev=newPrev;
1851              }
1852              newRefs++;
1853            }
1854          }
1855          if(newRefs>=numPrefRefs)
1856          {
1857            break;
1858          }
1859        }
1860        m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics=newRefs;
1861        m_GOPList[m_iGOPSize+m_extraRPSs].m_POC = curPOC;
1862        if (m_extraRPSs == 0)
1863        {
1864          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 0;
1865          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = 0;
1866        }
1867        else
1868        {
1869          Int rIdx =  m_iGOPSize + m_extraRPSs - 1;
1870          Int refPOC = m_GOPList[rIdx].m_POC;
1871          Int refPics = m_GOPList[rIdx].m_numRefPics;
1872          Int newIdc=0;
1873          for(Int i = 0; i<= refPics; i++) 
1874          {
1875            Int deltaPOC = ((i != refPics)? m_GOPList[rIdx].m_referencePics[i] : 0);  // check if the reference abs POC is >= 0
1876            Int absPOCref = refPOC+deltaPOC;
1877            Int refIdc = 0;
1878            for (Int j = 0; j < m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics; j++)
1879            {
1880              if ( (absPOCref - curPOC) == m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j])
1881              {
1882                if (m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j])
1883                {
1884                  refIdc = 1;
1885                }
1886                else
1887                {
1888                  refIdc = 2;
1889                }
1890              }
1891            }
1892            m_GOPList[m_iGOPSize+m_extraRPSs].m_refIdc[newIdc]=refIdc;
1893            newIdc++;
1894          }
1895          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 1; 
1896          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = newIdc;
1897          m_GOPList[m_iGOPSize+m_extraRPSs].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize+m_extraRPSs].m_POC; 
1898        }
1899        curGOP=m_iGOPSize+m_extraRPSs;
1900        m_extraRPSs++;
1901      }
1902      numRefs=0;
1903      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
1904      {
1905        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
1906        if(absPOC >= 0) 
1907        {
1908          refList[numRefs]=absPOC;
1909          numRefs++;
1910        }
1911      }
1912      refList[numRefs]=curPOC;
1913      numRefs++;
1914    }
1915    checkGOP++;
1916  }
1917  xConfirmPara(errorGOP,"Invalid GOP structure given");
1918  m_maxTempLayer = 1;
1919  for(Int i=0; i<m_iGOPSize; i++) 
1920  {
1921    if(m_GOPList[i].m_temporalId >= m_maxTempLayer)
1922    {
1923      m_maxTempLayer = m_GOPList[i].m_temporalId+1;
1924    }
1925    xConfirmPara(m_GOPList[i].m_sliceType!='B'&&m_GOPList[i].m_sliceType!='P', "Slice type must be equal to B or P");
1926  }
1927  for(Int i=0; i<MAX_TLAYER; i++)
1928  {
1929    m_numReorderPics[i] = 0;
1930#if L0323_DPB
1931    m_maxDecPicBuffering[i] = 1;
1932#else
1933    m_maxDecPicBuffering[i] = 0;
1934#endif
1935  }
1936  for(Int i=0; i<m_iGOPSize; i++) 
1937  {
1938#if L0323_DPB
1939    if(m_GOPList[i].m_numRefPics+1 > m_maxDecPicBuffering[m_GOPList[i].m_temporalId])
1940#else
1941    if(m_GOPList[i].m_numRefPics > m_maxDecPicBuffering[m_GOPList[i].m_temporalId])
1942#endif
1943    {
1944#if L0323_DPB
1945      m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics + 1;
1946#else
1947      m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics;
1948#endif
1949    }
1950    Int highestDecodingNumberWithLowerPOC = 0; 
1951    for(Int j=0; j<m_iGOPSize; j++)
1952    {
1953      if(m_GOPList[j].m_POC <= m_GOPList[i].m_POC)
1954      {
1955        highestDecodingNumberWithLowerPOC = j;
1956      }
1957    }
1958    Int numReorder = 0;
1959    for(Int j=0; j<highestDecodingNumberWithLowerPOC; j++)
1960    {
1961      if(m_GOPList[j].m_temporalId <= m_GOPList[i].m_temporalId && 
1962        m_GOPList[j].m_POC > m_GOPList[i].m_POC)
1963      {
1964        numReorder++;
1965      }
1966    }   
1967    if(numReorder > m_numReorderPics[m_GOPList[i].m_temporalId])
1968    {
1969      m_numReorderPics[m_GOPList[i].m_temporalId] = numReorder;
1970    }
1971  }
1972  for(Int i=0; i<MAX_TLAYER-1; i++) 
1973  {
1974    // a lower layer can not have higher value of m_numReorderPics than a higher layer
1975    if(m_numReorderPics[i+1] < m_numReorderPics[i])
1976    {
1977      m_numReorderPics[i+1] = m_numReorderPics[i];
1978    }
1979#if L0323_DPB
1980    // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] - 1, inclusive
1981    if(m_numReorderPics[i] > m_maxDecPicBuffering[i] - 1)
1982    {
1983      m_maxDecPicBuffering[i] = m_numReorderPics[i] + 1;
1984    }
1985#else
1986    // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ], inclusive
1987    if(m_numReorderPics[i] > m_maxDecPicBuffering[i])
1988    {
1989      m_maxDecPicBuffering[i] = m_numReorderPics[i];
1990    }
1991#endif
1992    // a lower layer can not have higher value of m_uiMaxDecPicBuffering than a higher layer
1993    if(m_maxDecPicBuffering[i+1] < m_maxDecPicBuffering[i])
1994    {
1995      m_maxDecPicBuffering[i+1] = m_maxDecPicBuffering[i];
1996    }
1997  }
1998
1999
2000#if L0323_DPB
2001  // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] -  1, inclusive
2002  if(m_numReorderPics[MAX_TLAYER-1] > m_maxDecPicBuffering[MAX_TLAYER-1] - 1)
2003  {
2004    m_maxDecPicBuffering[MAX_TLAYER-1] = m_numReorderPics[MAX_TLAYER-1] + 1;
2005  }
2006#else
2007  // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ], inclusive
2008  if(m_numReorderPics[MAX_TLAYER-1] > m_maxDecPicBuffering[MAX_TLAYER-1])
2009  {
2010    m_maxDecPicBuffering[MAX_TLAYER-1] = m_numReorderPics[MAX_TLAYER-1];
2011  }
2012#endif
2013
2014  if(m_vuiParametersPresentFlag && m_bitstreamRestrictionFlag)
2015  { 
2016    Int PicSizeInSamplesY =  m_iSourceWidth * m_iSourceHeight;
2017    if(tileFlag)
2018    {
2019      Int maxTileWidth = 0;
2020      Int maxTileHeight = 0;
2021      Int widthInCU = (m_iSourceWidth % m_uiMaxCUWidth) ? m_iSourceWidth/m_uiMaxCUWidth + 1: m_iSourceWidth/m_uiMaxCUWidth;
2022      Int heightInCU = (m_iSourceHeight % m_uiMaxCUHeight) ? m_iSourceHeight/m_uiMaxCUHeight + 1: m_iSourceHeight/m_uiMaxCUHeight;
2023      if(m_iUniformSpacingIdr)
2024      {
2025        maxTileWidth = m_uiMaxCUWidth*((widthInCU+m_iNumColumnsMinus1)/(m_iNumColumnsMinus1+1));
2026        maxTileHeight = m_uiMaxCUHeight*((heightInCU+m_iNumRowsMinus1)/(m_iNumRowsMinus1+1));
2027        // if only the last tile-row is one treeblock higher than the others
2028        // the maxTileHeight becomes smaller if the last row of treeblocks has lower height than the others
2029        if(!((heightInCU-1)%(m_iNumRowsMinus1+1)))
2030        {
2031          maxTileHeight = maxTileHeight - m_uiMaxCUHeight + (m_iSourceHeight % m_uiMaxCUHeight);
2032        }     
2033        // if only the last tile-column is one treeblock wider than the others
2034        // the maxTileWidth becomes smaller if the last column of treeblocks has lower width than the others   
2035        if(!((widthInCU-1)%(m_iNumColumnsMinus1+1)))
2036        {
2037          maxTileWidth = maxTileWidth - m_uiMaxCUWidth + (m_iSourceWidth % m_uiMaxCUWidth);
2038        }
2039      }
2040      else // not uniform spacing
2041      {
2042        if(m_iNumColumnsMinus1<1)
2043        {
2044          maxTileWidth = m_iSourceWidth;
2045        }
2046        else
2047        {
2048          Int accColumnWidth = 0;
2049          for(Int col=0; col<(m_iNumColumnsMinus1); col++)
2050          {
2051            maxTileWidth = m_pColumnWidth[col]>maxTileWidth ? m_pColumnWidth[col]:maxTileWidth;
2052            accColumnWidth += m_pColumnWidth[col];
2053          }
2054          maxTileWidth = (widthInCU-accColumnWidth)>maxTileWidth ? m_uiMaxCUWidth*(widthInCU-accColumnWidth):m_uiMaxCUWidth*maxTileWidth;
2055        }
2056        if(m_iNumRowsMinus1<1)
2057        {
2058          maxTileHeight = m_iSourceHeight;
2059        }
2060        else
2061        {
2062          Int accRowHeight = 0;
2063          for(Int row=0; row<(m_iNumRowsMinus1); row++)
2064          {
2065            maxTileHeight = m_pRowHeight[row]>maxTileHeight ? m_pRowHeight[row]:maxTileHeight;
2066            accRowHeight += m_pRowHeight[row];
2067          }
2068          maxTileHeight = (heightInCU-accRowHeight)>maxTileHeight ? m_uiMaxCUHeight*(heightInCU-accRowHeight):m_uiMaxCUHeight*maxTileHeight;
2069        }
2070      }
2071      Int maxSizeInSamplesY = maxTileWidth*maxTileHeight;
2072      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/maxSizeInSamplesY-4;
2073    }
2074    else if(m_iWaveFrontSynchro)
2075    {
2076      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/((2*m_iSourceHeight+m_iSourceWidth)*m_uiMaxCUHeight)-4;
2077    }
2078    else if(m_sliceMode == 1)
2079    {
2080      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/(m_sliceArgument*m_uiMaxCUWidth*m_uiMaxCUHeight)-4;
2081    }
2082    else
2083    {
2084      m_minSpatialSegmentationIdc = 0;
2085    }
2086  }
2087#if !L0034_COMBINED_LIST_CLEANUP
2088  xConfirmPara( m_bUseLComb==false && m_numReorderPics[MAX_TLAYER-1]!=0, "ListCombination can only be 0 in low delay coding (more precisely when L0 and L1 are identical)" );  // Note however this is not the full necessary condition as ref_pic_list_combination_flag can only be 0 if L0 == L1.
2089#endif
2090  xConfirmPara( m_iWaveFrontSynchro < 0, "WaveFrontSynchro cannot be negative" );
2091  xConfirmPara( m_iWaveFrontSubstreams <= 0, "WaveFrontSubstreams must be positive" );
2092  xConfirmPara( m_iWaveFrontSubstreams > 1 && !m_iWaveFrontSynchro, "Must have WaveFrontSynchro > 0 in order to have WaveFrontSubstreams > 1" );
2093
2094  xConfirmPara( m_decodedPictureHashSEIEnabled<0 || m_decodedPictureHashSEIEnabled>3, "this hash type is not correct!\n");
2095
2096#if J0149_TONE_MAPPING_SEI
2097  if (m_toneMappingInfoSEIEnabled)
2098  {
2099    xConfirmPara( m_toneMapCodedDataBitDepth < 8 || m_toneMapCodedDataBitDepth > 14 , "SEIToneMapCodedDataBitDepth must be in rage 8 to 14");
2100    xConfirmPara( m_toneMapTargetBitDepth < 1 || (m_toneMapTargetBitDepth > 16 && m_toneMapTargetBitDepth < 255) , "SEIToneMapTargetBitDepth must be in rage 1 to 16 or equal to 255");
2101    xConfirmPara( m_toneMapModelId < 0 || m_toneMapModelId > 4 , "SEIToneMapModelId must be in rage 0 to 4");
2102    xConfirmPara( m_cameraIsoSpeedValue == 0, "SEIToneMapCameraIsoSpeedValue shall not be equal to 0");
2103    xConfirmPara( m_extendedRangeWhiteLevel < 100, "SEIToneMapExtendedRangeWhiteLevel should be greater than or equal to 100");
2104    xConfirmPara( m_nominalBlackLevelLumaCodeValue >= m_nominalWhiteLevelLumaCodeValue, "SEIToneMapNominalWhiteLevelLumaCodeValue shall be greater than SEIToneMapNominalBlackLevelLumaCodeValue");
2105    xConfirmPara( m_extendedWhiteLevelLumaCodeValue < m_nominalWhiteLevelLumaCodeValue, "SEIToneMapExtendedWhiteLevelLumaCodeValue shall be greater than or equal to SEIToneMapNominalWhiteLevelLumaCodeValue");
2106  }
2107#endif
2108
2109#if RATE_CONTROL_LAMBDA_DOMAIN
2110  if ( m_RCEnableRateControl )
2111  {
2112    if ( m_RCForceIntraQP )
2113    {
2114      if ( m_RCInitialQP == 0 )
2115      {
2116        printf( "\nInitial QP for rate control is not specified. Reset not to use force intra QP!" );
2117        m_RCForceIntraQP = false;
2118      }
2119    }
2120    xConfirmPara( m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n" );
2121  }
2122#else
2123  if(m_enableRateCtrl)
2124  {
2125    Int numLCUInWidth  = (m_iSourceWidth  / m_uiMaxCUWidth) + (( m_iSourceWidth  %  m_uiMaxCUWidth ) ? 1 : 0);
2126    Int numLCUInHeight = (m_iSourceHeight / m_uiMaxCUHeight)+ (( m_iSourceHeight %  m_uiMaxCUHeight) ? 1 : 0);
2127    Int numLCUInPic    =  numLCUInWidth * numLCUInHeight;
2128
2129    xConfirmPara( (numLCUInPic % m_numLCUInUnit) != 0, "total number of LCUs in a frame should be completely divided by NumLCUInUnit" );
2130
2131    m_iMaxDeltaQP       = MAX_DELTA_QP;
2132    m_iMaxCuDQPDepth    = MAX_CUDQP_DEPTH;
2133  }
2134#endif
2135
2136  xConfirmPara(!m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagValue, "CUTransquantBypassFlagValue cannot be 1 when TransquantBypassEnableFlag is 0");
2137
2138  xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2");
2139#if L0444_FPA_TYPE
2140  if (m_framePackingSEIEnabled)
2141  {
2142    xConfirmPara(m_framePackingSEIType < 3 || m_framePackingSEIType > 5 , "SEIFramePackingType must be in rage 3 to 5");
2143  }
2144#endif
2145#if H_MV
2146  }
2147  }
2148#endif
2149
2150#undef xConfirmPara
2151  if (check_failed)
2152  {
2153    exit(EXIT_FAILURE);
2154  }
2155}
2156
2157/** \todo use of global variables should be removed later
2158 */
2159Void TAppEncCfg::xSetGlobal()
2160{
2161  // set max CU width & height
2162  g_uiMaxCUWidth  = m_uiMaxCUWidth;
2163  g_uiMaxCUHeight = m_uiMaxCUHeight;
2164 
2165  // compute actual CU depth with respect to config depth and max transform size
2166  g_uiAddCUDepth  = 0;
2167  while( (m_uiMaxCUWidth>>m_uiMaxCUDepth) > ( 1 << ( m_uiQuadtreeTULog2MinSize + g_uiAddCUDepth )  ) ) g_uiAddCUDepth++;
2168 
2169  m_uiMaxCUDepth += g_uiAddCUDepth;
2170  g_uiAddCUDepth++;
2171  g_uiMaxCUDepth = m_uiMaxCUDepth;
2172 
2173  // set internal bit-depth and constants
2174  g_bitDepthY = m_internalBitDepthY;
2175  g_bitDepthC = m_internalBitDepthC;
2176 
2177  g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_inputBitDepthY : m_internalBitDepthY;
2178  g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_inputBitDepthC : m_internalBitDepthC;
2179}
2180
2181Void TAppEncCfg::xPrintParameter()
2182{
2183  printf("\n");
2184#if H_MV
2185  for( Int layer = 0; layer < m_numberOfLayers; layer++)
2186  {
2187    printf("Input File %i                 : %s\n", layer, m_pchInputFileList[layer]);
2188  }
2189#else
2190  printf("Input          File          : %s\n", m_pchInputFile          );
2191#endif
2192  printf("Bitstream      File          : %s\n", m_pchBitstreamFile      );
2193#if H_MV
2194  for( Int layer = 0; layer < m_numberOfLayers; layer++)
2195  {
2196    printf("Reconstruction File %i        : %s\n", layer, m_pchReconFileList[layer]);
2197  }
2198#else
2199  printf("Reconstruction File          : %s\n", m_pchReconFile          );
2200#endif
2201#if H_MV
2202  xPrintParaVector( "ViewId", m_viewId ); 
2203#endif
2204#if H_3D
2205  xPrintParaVector( "DepthFlag", m_depthFlag ); 
2206  printf("Coded Camera Param. Precision: %d\n", m_iCodedCamParPrecision);
2207#endif
2208#if H_MV 
2209  xPrintParaVector( "QP"               , m_fQP                ); 
2210  xPrintParaVector( "LoopFilterDisable", m_bLoopFilterDisable ); 
2211  xPrintParaVector( "SAO"              , m_bUseSAO            ); 
2212#endif
2213  printf("Real     Format              : %dx%d %dHz\n", m_iSourceWidth - m_confLeft - m_confRight, m_iSourceHeight - m_confTop - m_confBottom, m_iFrameRate );
2214  printf("Internal Format              : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate );
2215  printf("Frame index                  : %u - %d (%d frames)\n", m_FrameSkip, m_FrameSkip+m_framesToBeEncoded-1, m_framesToBeEncoded );
2216  printf("CU size / depth              : %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth );
2217  printf("RQT trans. size (min / max)  : %d / %d\n", 1 << m_uiQuadtreeTULog2MinSize, 1 << m_uiQuadtreeTULog2MaxSize );
2218  printf("Max RQT depth inter          : %d\n", m_uiQuadtreeTUMaxDepthInter);
2219  printf("Max RQT depth intra          : %d\n", m_uiQuadtreeTUMaxDepthIntra);
2220  printf("Min PCM size                 : %d\n", 1 << m_uiPCMLog2MinSize);
2221  printf("Motion search range          : %d\n", m_iSearchRange );
2222  printf("Intra period                 : %d\n", m_iIntraPeriod );
2223  printf("Decoding refresh type        : %d\n", m_iDecodingRefreshType );
2224#if !H_MV
2225  printf("QP                           : %5.2f\n", m_fQP );
2226#endif
2227  printf("Max dQP signaling depth      : %d\n", m_iMaxCuDQPDepth);
2228
2229  printf("Cb QP Offset                 : %d\n", m_cbQpOffset   );
2230  printf("Cr QP Offset                 : %d\n", m_crQpOffset);
2231
2232  printf("QP adaptation                : %d (range=%d)\n", m_bUseAdaptiveQP, (m_bUseAdaptiveQP ? m_iQPAdaptationRange : 0) );
2233  printf("GOP size                     : %d\n", m_iGOPSize );
2234  printf("Internal bit depth           : (Y:%d, C:%d)\n", m_internalBitDepthY, m_internalBitDepthC );
2235  printf("PCM sample bit depth         : (Y:%d, C:%d)\n", g_uiPCMBitDepthLuma, g_uiPCMBitDepthChroma );
2236#if RATE_CONTROL_LAMBDA_DOMAIN
2237  printf("RateControl                  : %d\n", m_RCEnableRateControl );
2238  if(m_RCEnableRateControl)
2239  {
2240    printf("TargetBitrate                : %d\n", m_RCTargetBitrate );
2241    printf("KeepHierarchicalBit          : %d\n", m_RCKeepHierarchicalBit );
2242    printf("LCULevelRC                   : %d\n", m_RCLCULevelRC );
2243    printf("UseLCUSeparateModel          : %d\n", m_RCUseLCUSeparateModel );
2244    printf("InitialQP                    : %d\n", m_RCInitialQP );
2245    printf("ForceIntraQP                 : %d\n", m_RCForceIntraQP );
2246  }
2247#else
2248  printf("RateControl                  : %d\n", m_enableRateCtrl);
2249  if(m_enableRateCtrl)
2250  {
2251    printf("TargetBitrate                : %d\n", m_targetBitrate);
2252    printf("NumLCUInUnit                 : %d\n", m_numLCUInUnit);
2253  }
2254#endif
2255  printf("Max Num Merge Candidates     : %d\n", m_maxNumMergeCand);
2256#if H_3D
2257  printf("BaseViewCameraNumbers        : %s\n", m_pchBaseViewCameraNumbers ); 
2258  printf("Coded Camera Param. Precision: %d\n", m_iCodedCamParPrecision);
2259#if H_3D_VSO
2260  printf("Force use of Lambda Scale    : %d\n", m_bForceLambdaScaleVSO );
2261
2262  if ( m_bUseVSO )
2263  {   
2264    printf("VSO Lambda Scale             : %5.2f\n", m_dLambdaScaleVSO );
2265    printf("VSO Mode                     : %d\n",    m_uiVSOMode       );
2266    printf("VSO Config                   : %s\n",    m_pchVSOConfig    );
2267    printf("VSO Negative Distortion      : %d\n",    m_bAllowNegDist ? 1 : 0);
2268    printf("VSO LS Table                 : %d\n",    m_bVSOLSTable ? 1 : 0);
2269    printf("VSO Estimated VSD            : %d\n",    m_bUseEstimatedVSD ? 1 : 0);
2270    printf("VSO Early Skip               : %d\n",    m_bVSOEarlySkip ? 1 : 0);   
2271    if ( m_bUseWVSO )
2272    printf("Dist. Weights (VSO/VSD/SAD)  : %d/%d/%d\n ", m_iVSOWeight, m_iVSDWeight, m_iDWeight );
2273  }
2274#endif //HHI_VSO
2275#endif //H_3D
2276  printf("\n");
2277#if H_MV
2278  printf("TOOL CFG General: ");
2279#else
2280  printf("TOOL CFG: ");
2281#endif
2282  printf("IBD:%d ", g_bitDepthY > m_inputBitDepthY || g_bitDepthC > m_inputBitDepthC);
2283  printf("HAD:%d ", m_bUseHADME           );
2284  printf("SRD:%d ", m_bUseSBACRD          );
2285  printf("RDQ:%d ", m_useRDOQ            );
2286  printf("RDQTS:%d ", m_useRDOQTS        );
2287#if L0232_RD_PENALTY
2288  printf("RDpenalty:%d ", m_rdPenalty  );
2289#endif
2290  printf("SQP:%d ", m_uiDeltaQpRD         );
2291  printf("ASR:%d ", m_bUseASR             );
2292#if !L0034_COMBINED_LIST_CLEANUP
2293  printf("LComb:%d ", m_bUseLComb         );
2294#endif
2295  printf("FEN:%d ", m_bUseFastEnc         );
2296  printf("ECU:%d ", m_bUseEarlyCU         );
2297  printf("FDM:%d ", m_useFastDecisionForMerge );
2298  printf("CFM:%d ", m_bUseCbfFastMode         );
2299  printf("ESD:%d ", m_useEarlySkipDetection  );
2300  printf("RQT:%d ", 1     );
2301  printf("TransformSkip:%d ",     m_useTransformSkip              );
2302  printf("TransformSkipFast:%d ", m_useTransformSkipFast       );
2303  printf("Slice: M=%d ", m_sliceMode);
2304  if (m_sliceMode!=0)
2305  {
2306    printf("A=%d ", m_sliceArgument);
2307  }
2308  printf("SliceSegment: M=%d ",m_sliceSegmentMode);
2309  if (m_sliceSegmentMode!=0)
2310  {
2311    printf("A=%d ", m_sliceSegmentArgument);
2312  }
2313  printf("CIP:%d ", m_bUseConstrainedIntraPred);
2314#if !H_MV
2315  printf("SAO:%d ", (m_bUseSAO)?(1):(0));
2316#endif
2317  printf("PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0);
2318  printf("SAOLcuBasedOptimization:%d ", (m_saoLcuBasedOptimization)?(1):(0));
2319
2320  printf("LosslessCuEnabled:%d ", (m_useLossless)? 1:0 );
2321  printf("WPP:%d ", (Int)m_useWeightedPred);
2322  printf("WPB:%d ", (Int)m_useWeightedBiPred);
2323  printf("PME:%d ", m_log2ParallelMergeLevel);
2324  printf(" WaveFrontSynchro:%d WaveFrontSubstreams:%d",
2325          m_iWaveFrontSynchro, m_iWaveFrontSubstreams);
2326  printf(" ScalingList:%d ", m_useScalingListId );
2327  printf("TMVPMode:%d ", m_TMVPModeId     );
2328#if ADAPTIVE_QP_SELECTION
2329  printf("AQpS:%d ", m_bUseAdaptQpSelect   );
2330#endif
2331
2332  printf(" SignBitHidingFlag:%d ", m_signHideFlag);
2333  printf("RecalQP:%d ", m_recalculateQPAccordingToLambda ? 1 : 0 );
2334#if H_3D_VSO
2335  printf("VSO:%d ", m_bUseVSO   );
2336  printf("WVSO:%d ", m_bUseWVSO ); 
2337#endif
2338  printf("\n\n"); 
2339
2340  fflush(stdout);
2341}
2342
2343Bool confirmPara(Bool bflag, const Char* message)
2344{
2345  if (!bflag)
2346    return false;
2347 
2348  printf("Error: %s\n",message);
2349  return true;
2350}
2351
2352//! \}
Note: See TracBrowser for help on using the repository browser.