source: 3DVCSoftware/branches/HTM-12.1-MV-draft-1/source/App/TAppEncoder/TAppEncCfg.cpp @ 1417

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

Removed 3D-HEVC related integrations.

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