source: SHVCSoftware/trunk/source/App/TAppEncoder/TAppEncCfg.cpp @ 588

Last change on this file since 588 was 588, checked in by seregin, 11 years ago

merge with SHM-5.0-dev

  • Property svn:eol-style set to native
File size: 119.8 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license. 
5 *
6 * Copyright (c) 2010-2013, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TAppEncCfg.cpp
35    \brief    Handle encoder configuration parameters
36*/
37
38#include <stdlib.h>
39#include <cassert>
40#include <cstring>
41#include <string>
42#include "TLibCommon/TComRom.h"
43#include "TAppEncCfg.h"
44
45static istream& operator>>(istream &, Level::Name &);
46static istream& operator>>(istream &, Level::Tier &);
47static istream& operator>>(istream &, Profile::Name &);
48
49#include "TAppCommon/program_options_lite.h"
50#include "TLibEncoder/TEncRateCtrl.h"
51#ifdef WIN32
52#define strdup _strdup
53#endif
54
55using namespace std;
56namespace po = df::program_options_lite;
57
58//! \ingroup TAppEncoder
59//! \{
60
61// ====================================================================================================================
62// Constructor / destructor / initialization / destroy
63// ====================================================================================================================
64
65#if SVC_EXTENSION
66TAppEncCfg::TAppEncCfg()
67: m_pBitstreamFile()
68#if AVC_BASE
69, m_avcBaseLayerFlag(0)
70#endif
71#if N0120_MAX_TID_REF_CFG
72, m_maxTidRefPresentFlag(1)
73#endif
74, m_pColumnWidth()
75, m_pRowHeight()
76, m_scalingListFile()
77, m_elRapSliceBEnabled(0)
78{
79  for(UInt layer=0; layer<MAX_LAYERS; layer++)
80  {
81    m_acLayerCfg[layer].setAppEncCfg(this);
82  }
83  memset( m_scalabilityMask, 0, sizeof(m_scalabilityMask) );
84}
85#else
86TAppEncCfg::TAppEncCfg()
87: m_pchInputFile()
88, m_pchBitstreamFile()
89, m_pchReconFile()
90, m_pchdQPFile()
91, m_pColumnWidth()
92, m_pRowHeight()
93, m_scalingListFile()
94{
95  m_aidQP = NULL;
96  m_startOfCodedInterval = NULL;
97  m_codedPivotValue = NULL;
98  m_targetPivotValue = NULL;
99}
100#endif
101
102TAppEncCfg::~TAppEncCfg()
103{
104#if SVC_EXTENSION
105  free(m_pBitstreamFile);
106#else
107  free(m_pchBitstreamFile);
108  if ( m_aidQP )
109  {
110    delete[] m_aidQP;
111  }
112  if ( m_startOfCodedInterval )
113  {
114    delete[] m_startOfCodedInterval;
115    m_startOfCodedInterval = NULL;
116  }
117   if ( m_codedPivotValue )
118  {
119    delete[] m_codedPivotValue;
120    m_codedPivotValue = NULL;
121  }
122  if ( m_targetPivotValue )
123  {
124    delete[] m_targetPivotValue;
125    m_targetPivotValue = NULL;
126  }
127  free(m_pchInputFile);
128#endif
129#if !SVC_EXTENSION 
130  free(m_pchReconFile);
131  free(m_pchdQPFile);
132#endif
133  free(m_pColumnWidth);
134  free(m_pRowHeight);
135  free(m_scalingListFile);
136}
137
138Void TAppEncCfg::create()
139{
140}
141
142Void TAppEncCfg::destroy()
143{
144#if VPS_EXTN_DIRECT_REF_LAYERS
145  for(Int layer = 0; layer < MAX_LAYERS; layer++)
146  {
147    if( m_acLayerCfg[layer].m_numSamplePredRefLayers > 0 )
148    {
149      delete [] m_acLayerCfg[layer].m_samplePredRefLayerIds;
150      m_acLayerCfg[layer].m_samplePredRefLayerIds = NULL;
151    }
152    if( m_acLayerCfg[layer].m_numMotionPredRefLayers > 0 )
153    {
154      delete [] m_acLayerCfg[layer].m_motionPredRefLayerIds;
155      m_acLayerCfg[layer].m_motionPredRefLayerIds = NULL;
156    }
157    if( m_acLayerCfg[layer].m_numActiveRefLayers > 0 )
158    {
159      delete [] m_acLayerCfg[layer].m_predLayerIds;
160      m_acLayerCfg[layer].m_predLayerIds = NULL;
161    }
162  }
163#endif
164}
165
166std::istringstream &operator>>(std::istringstream &in, GOPEntry &entry)     //input
167{
168  in>>entry.m_sliceType;
169  in>>entry.m_POC;
170  in>>entry.m_QPOffset;
171  in>>entry.m_QPFactor;
172  in>>entry.m_tcOffsetDiv2;
173  in>>entry.m_betaOffsetDiv2;
174  in>>entry.m_temporalId;
175  in>>entry.m_numRefPicsActive;
176  in>>entry.m_numRefPics;
177  for ( Int i = 0; i < entry.m_numRefPics; i++ )
178  {
179    in>>entry.m_referencePics[i];
180  }
181  in>>entry.m_interRPSPrediction;
182#if AUTO_INTER_RPS
183  if (entry.m_interRPSPrediction==1)
184  {
185    in>>entry.m_deltaRPS;
186    in>>entry.m_numRefIdc;
187    for ( Int i = 0; i < entry.m_numRefIdc; i++ )
188    {
189      in>>entry.m_refIdc[i];
190    }
191  }
192  else if (entry.m_interRPSPrediction==2)
193  {
194    in>>entry.m_deltaRPS;
195  }
196#else
197  if (entry.m_interRPSPrediction)
198  {
199    in>>entry.m_deltaRPS;
200    in>>entry.m_numRefIdc;
201    for ( Int i = 0; i < entry.m_numRefIdc; i++ )
202    {
203      in>>entry.m_refIdc[i];
204    }
205  }
206#endif
207  return in;
208}
209
210#if AUXILIARY_PICTURES
211static inline ChromaFormat numberToChromaFormat(const Int val)
212{
213  switch (val)
214  {
215    case 400: return CHROMA_400; break;
216    case 420: return CHROMA_420; break;
217    case 422: return CHROMA_422; break;
218    case 444: return CHROMA_444; break;
219    default:  return NUM_CHROMA_FORMAT;
220  }
221}
222#endif
223
224#if SVC_EXTENSION
225void TAppEncCfg::getDirFilename(string& filename, string& dir, const string path)
226{
227  size_t pos = path.find_last_of("\\");
228  if(pos != std::string::npos)
229  {
230    filename.assign(path.begin() + pos + 1, path.end());
231    dir.assign(path.begin(), path.begin() + pos + 1);
232  }
233  else
234  {
235    pos = path.find_last_of("/");
236    if(pos != std::string::npos)
237    {
238      filename.assign(path.begin() + pos + 1, path.end());
239      dir.assign(path.begin(), path.begin() + pos + 1);
240    }
241    else
242    {
243      filename = path;
244      dir.assign("");
245    }
246  }
247}
248#endif
249
250static const struct MapStrToProfile {
251  const Char* str;
252  Profile::Name value;
253} strToProfile[] = {
254  {"none", Profile::NONE},
255  {"main", Profile::MAIN},
256  {"main10", Profile::MAIN10},
257  {"main-still-picture", Profile::MAINSTILLPICTURE},
258};
259
260static const struct MapStrToTier {
261  const Char* str;
262  Level::Tier value;
263} strToTier[] = {
264  {"main", Level::MAIN},
265  {"high", Level::HIGH},
266};
267
268static const struct MapStrToLevel {
269  const Char* str;
270  Level::Name value;
271} strToLevel[] = {
272  {"none",Level::NONE},
273  {"1",   Level::LEVEL1},
274  {"2",   Level::LEVEL2},
275  {"2.1", Level::LEVEL2_1},
276  {"3",   Level::LEVEL3},
277  {"3.1", Level::LEVEL3_1},
278  {"4",   Level::LEVEL4},
279  {"4.1", Level::LEVEL4_1},
280  {"5",   Level::LEVEL5},
281  {"5.1", Level::LEVEL5_1},
282  {"5.2", Level::LEVEL5_2},
283  {"6",   Level::LEVEL6},
284  {"6.1", Level::LEVEL6_1},
285  {"6.2", Level::LEVEL6_2},
286};
287
288template<typename T, typename P>
289static istream& readStrToEnum(P map[], unsigned long mapLen, istream &in, T &val)
290{
291  string str;
292  in >> str;
293
294  for (Int i = 0; i < mapLen; i++)
295  {
296    if (str == map[i].str)
297    {
298      val = map[i].value;
299      goto found;
300    }
301  }
302  /* not found */
303  in.setstate(ios::failbit);
304found:
305  return in;
306}
307
308static istream& operator>>(istream &in, Profile::Name &profile)
309{
310  return readStrToEnum(strToProfile, sizeof(strToProfile)/sizeof(*strToProfile), in, profile);
311}
312
313static istream& operator>>(istream &in, Level::Tier &tier)
314{
315  return readStrToEnum(strToTier, sizeof(strToTier)/sizeof(*strToTier), in, tier);
316}
317
318static istream& operator>>(istream &in, Level::Name &level)
319{
320  return readStrToEnum(strToLevel, sizeof(strToLevel)/sizeof(*strToLevel), in, level);
321}
322
323// ====================================================================================================================
324// Public member functions
325// ====================================================================================================================
326
327/** \param  argc        number of arguments
328    \param  argv        array of arguments
329    \retval             true when success
330 */
331Bool TAppEncCfg::parseCfg( Int argc, Char* argv[] )
332{
333  Bool do_help = false;
334 
335#if SVC_EXTENSION
336  string  cfg_LayerCfgFile   [MAX_LAYERS];
337  string  cfg_BitstreamFile;
338  string* cfg_InputFile      [MAX_LAYERS];
339  string* cfg_ReconFile      [MAX_LAYERS];
340  Double* cfg_fQP            [MAX_LAYERS];
341
342#if REPN_FORMAT_IN_VPS
343  Int*    cfg_repFormatIdx  [MAX_LAYERS];
344#endif
345  Int*    cfg_SourceWidth   [MAX_LAYERS]; 
346  Int*    cfg_SourceHeight  [MAX_LAYERS];
347  Int*    cfg_FrameRate     [MAX_LAYERS];
348  Int*    cfg_IntraPeriod   [MAX_LAYERS];
349  Int*    cfg_conformanceMode  [MAX_LAYERS];
350#if LAYER_CTB
351  // coding unit (CU) definition
352  UInt*      cfg_uiMaxCUWidth[MAX_LAYERS];                                   ///< max. CU width in pixel
353  UInt*      cfg_uiMaxCUHeight[MAX_LAYERS];                                  ///< max. CU height in pixel
354  UInt*      cfg_uiMaxCUDepth[MAX_LAYERS];                                   ///< max. CU depth
355 
356  // transfom unit (TU) definition
357  UInt*      cfg_uiQuadtreeTULog2MaxSize[MAX_LAYERS];
358  UInt*      cfg_uiQuadtreeTULog2MinSize[MAX_LAYERS];
359 
360  UInt*      cfg_uiQuadtreeTUMaxDepthInter[MAX_LAYERS];
361  UInt*      cfg_uiQuadtreeTUMaxDepthIntra[MAX_LAYERS];
362#endif
363#if AUXILIARY_PICTURES
364  Int      cfg_tmpChromaFormatIDC  [MAX_LAYERS];
365  Int      cfg_tmpInputChromaFormat[MAX_LAYERS];
366  Int*     cfg_auxId               [MAX_LAYERS];
367#endif
368#if VPS_EXTN_DIRECT_REF_LAYERS
369  Int*    cfg_numSamplePredRefLayers  [MAX_LAYERS];
370  string  cfg_samplePredRefLayerIds   [MAX_LAYERS];
371  string* cfg_samplePredRefLayerIdsPtr[MAX_LAYERS];
372  Int*    cfg_numMotionPredRefLayers  [MAX_LAYERS];
373  string  cfg_motionPredRefLayerIds   [MAX_LAYERS];
374  string* cfg_motionPredRefLayerIdsPtr[MAX_LAYERS];
375  Int*    cfg_numActiveRefLayers [MAX_LAYERS];
376  string  cfg_predLayerIds       [MAX_LAYERS];
377  string* cfg_predLayerIdsPtr    [MAX_LAYERS];
378#endif
379#if O0098_SCALED_REF_LAYER_ID
380  string    cfg_scaledRefLayerId [MAX_LAYERS];
381#endif
382  string    cfg_scaledRefLayerLeftOffset [MAX_LAYERS];
383  string    cfg_scaledRefLayerTopOffset [MAX_LAYERS];
384  string    cfg_scaledRefLayerRightOffset [MAX_LAYERS];
385  string    cfg_scaledRefLayerBottomOffset [MAX_LAYERS];
386  Int*      cfg_numScaledRefLayerOffsets[MAX_LAYERS];
387
388#if O0098_SCALED_REF_LAYER_ID
389  string*    cfg_scaledRefLayerIdPtr           [MAX_LAYERS];
390#endif
391  string*    cfg_scaledRefLayerLeftOffsetPtr   [MAX_LAYERS];
392  string*    cfg_scaledRefLayerTopOffsetPtr    [MAX_LAYERS];
393  string*    cfg_scaledRefLayerRightOffsetPtr  [MAX_LAYERS];
394  string*    cfg_scaledRefLayerBottomOffsetPtr [MAX_LAYERS];
395#if RC_SHVC_HARMONIZATION
396  Bool*   cfg_RCEnableRateControl  [MAX_LAYERS];
397  Int*    cfg_RCTargetBitRate      [MAX_LAYERS];
398  Bool*   cfg_RCKeepHierarchicalBit[MAX_LAYERS];
399  Bool*   cfg_RCLCULevelRC         [MAX_LAYERS];
400  Bool*   cfg_RCUseLCUSeparateModel[MAX_LAYERS];
401  Int*    cfg_RCInitialQP          [MAX_LAYERS];
402  Bool*   cfg_RCForceIntraQP       [MAX_LAYERS];
403#endif
404#if O0194_DIFFERENT_BITDEPTH_EL_BL
405  Int*    cfg_InputBitDepthY    [MAX_LAYERS];
406  Int*    cfg_InternalBitDepthY [MAX_LAYERS];
407  Int*    cfg_InputBitDepthC    [MAX_LAYERS];
408  Int*    cfg_InternalBitDepthC [MAX_LAYERS];
409  Int*    cfg_OutputBitDepthY   [MAX_LAYERS];
410  Int*    cfg_OutputBitDepthC   [MAX_LAYERS];
411#endif
412#if N0120_MAX_TID_REF_CFG
413  Int*    cfg_maxTidIlRefPicsPlus1[MAX_LAYERS]; 
414#endif
415  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
416  {
417    cfg_InputFile[layer]    = &m_acLayerCfg[layer].m_cInputFile;
418    cfg_ReconFile[layer]    = &m_acLayerCfg[layer].m_cReconFile;
419    cfg_fQP[layer]          = &m_acLayerCfg[layer].m_fQP;
420#if REPN_FORMAT_IN_VPS
421    cfg_repFormatIdx[layer] = &m_acLayerCfg[layer].m_repFormatIdx;
422#endif
423    cfg_SourceWidth[layer]  = &m_acLayerCfg[layer].m_iSourceWidth;
424    cfg_SourceHeight[layer] = &m_acLayerCfg[layer].m_iSourceHeight;
425    cfg_FrameRate[layer]    = &m_acLayerCfg[layer].m_iFrameRate; 
426    cfg_IntraPeriod[layer]  = &m_acLayerCfg[layer].m_iIntraPeriod; 
427    cfg_conformanceMode[layer] = &m_acLayerCfg[layer].m_conformanceMode;
428#if LAYER_CTB
429    // coding unit (CU) definition
430    cfg_uiMaxCUWidth[layer]  = &m_acLayerCfg[layer].m_uiMaxCUWidth;
431    cfg_uiMaxCUHeight[layer] = &m_acLayerCfg[layer].m_uiMaxCUHeight;
432    cfg_uiMaxCUDepth[layer]  = &m_acLayerCfg[layer].m_uiMaxCUDepth;
433
434    // transfom unit (TU) definition.
435    cfg_uiQuadtreeTULog2MaxSize[layer] = &m_acLayerCfg[layer].m_uiQuadtreeTULog2MaxSize;
436    cfg_uiQuadtreeTULog2MinSize[layer] = &m_acLayerCfg[layer].m_uiQuadtreeTULog2MinSize;
437
438    cfg_uiQuadtreeTUMaxDepthInter[layer] = &m_acLayerCfg[layer].m_uiQuadtreeTUMaxDepthInter;
439    cfg_uiQuadtreeTUMaxDepthIntra[layer] = &m_acLayerCfg[layer].m_uiQuadtreeTUMaxDepthIntra;
440#endif
441#if VPS_EXTN_DIRECT_REF_LAYERS
442    cfg_numSamplePredRefLayers  [layer] = &m_acLayerCfg[layer].m_numSamplePredRefLayers;
443    cfg_samplePredRefLayerIdsPtr[layer] = &cfg_samplePredRefLayerIds[layer];
444    cfg_numMotionPredRefLayers  [layer] = &m_acLayerCfg[layer].m_numMotionPredRefLayers;
445    cfg_motionPredRefLayerIdsPtr[layer] = &cfg_motionPredRefLayerIds[layer];
446    cfg_numActiveRefLayers  [layer] = &m_acLayerCfg[layer].m_numActiveRefLayers;
447    cfg_predLayerIdsPtr     [layer]  = &cfg_predLayerIds[layer];
448#endif
449    cfg_numScaledRefLayerOffsets [layer] = &m_acLayerCfg[layer].m_numScaledRefLayerOffsets;
450    for(Int i = 0; i < MAX_LAYERS; i++)
451    {
452#if O0098_SCALED_REF_LAYER_ID
453      cfg_scaledRefLayerIdPtr          [layer] = &cfg_scaledRefLayerId[layer]          ;
454#endif
455      cfg_scaledRefLayerLeftOffsetPtr  [layer] = &cfg_scaledRefLayerLeftOffset[layer]  ;
456      cfg_scaledRefLayerTopOffsetPtr   [layer] = &cfg_scaledRefLayerTopOffset[layer]   ;
457      cfg_scaledRefLayerRightOffsetPtr [layer] = &cfg_scaledRefLayerRightOffset[layer] ;
458      cfg_scaledRefLayerBottomOffsetPtr[layer] = &cfg_scaledRefLayerBottomOffset[layer];
459    }
460#if RC_SHVC_HARMONIZATION
461    cfg_RCEnableRateControl[layer]   = &m_acLayerCfg[layer].m_RCEnableRateControl;
462    cfg_RCTargetBitRate[layer]       = &m_acLayerCfg[layer].m_RCTargetBitrate;
463    cfg_RCKeepHierarchicalBit[layer] = &m_acLayerCfg[layer].m_RCKeepHierarchicalBit;
464    cfg_RCLCULevelRC[layer]          = &m_acLayerCfg[layer].m_RCLCULevelRC;
465    cfg_RCUseLCUSeparateModel[layer] = &m_acLayerCfg[layer].m_RCUseLCUSeparateModel;
466    cfg_RCInitialQP[layer]           = &m_acLayerCfg[layer].m_RCInitialQP;
467    cfg_RCForceIntraQP[layer]        = &m_acLayerCfg[layer].m_RCForceIntraQP;
468#endif
469#if O0194_DIFFERENT_BITDEPTH_EL_BL
470  cfg_InputBitDepthY   [layer] = &m_acLayerCfg[layer].m_inputBitDepthY;
471  cfg_InternalBitDepthY[layer] = &m_acLayerCfg[layer].m_internalBitDepthY;
472  cfg_InputBitDepthC   [layer] = &m_acLayerCfg[layer].m_inputBitDepthC;
473  cfg_InternalBitDepthC[layer] = &m_acLayerCfg[layer].m_internalBitDepthC;
474  cfg_OutputBitDepthY  [layer] = &m_acLayerCfg[layer].m_outputBitDepthY;
475  cfg_OutputBitDepthC  [layer] = &m_acLayerCfg[layer].m_outputBitDepthC;
476#endif
477#if N0120_MAX_TID_REF_CFG
478    cfg_maxTidIlRefPicsPlus1[layer] = &m_acLayerCfg[layer].m_maxTidIlRefPicsPlus1; 
479#endif
480#if AUXILIARY_PICTURES
481    cfg_auxId[layer]                = &m_acLayerCfg[layer].m_auxId; 
482#endif
483  }
484#if AVC_BASE
485  string  cfg_BLInputFile;
486#endif
487#if AVC_SYNTAX
488  string  cfg_BLSyntaxFile;
489#endif
490#if N0383_IL_CONSTRAINED_TILE_SETS_SEI
491  string  cfg_tileSets;
492#endif
493#else //SVC_EXTENSION
494  string cfg_InputFile;
495  string cfg_BitstreamFile;
496  string cfg_ReconFile;
497  string cfg_dQPFile;
498#endif //SVC_EXTENSION
499  string cfg_ColumnWidth;
500  string cfg_RowHeight;
501  string cfg_ScalingListFile;
502  string cfg_startOfCodedInterval;
503  string cfg_codedPivotValue;
504  string cfg_targetPivotValue;
505  po::Options opts;
506  opts.addOptions()
507  ("help", do_help, false, "this help text")
508  ("c", po::parseConfigFile, "configuration file name")
509 
510  // File, I/O and source parameters
511#if SVC_EXTENSION
512  ("InputFile%d,-i%d",        cfg_InputFile,  string(""), MAX_LAYERS, "original YUV input file name for layer %d")
513  ("ReconFile%d,-o%d",        cfg_ReconFile,  string(""), MAX_LAYERS, "reconstruction YUV input file name for layer %d")
514  ("LayerConfig%d,-lc%d",     cfg_LayerCfgFile, string(""), MAX_LAYERS, "layer %d configuration file name")
515  ("SourceWidth%d,-wdt%d",    cfg_SourceWidth, 0, MAX_LAYERS, "Source picture width for layer %d")
516  ("SourceHeight%d,-hgt%d",   cfg_SourceHeight, 0, MAX_LAYERS, "Source picture height for layer %d")
517  ("FrameRate%d,-fr%d",       cfg_FrameRate,  0, MAX_LAYERS, "Frame rate for layer %d")
518  ("LambdaModifier%d,-LM%d",  m_adLambdaModifier, ( double )1.0, MAX_TLAYER, "Lambda modifier for temporal layer %d")
519#if O0215_PHASE_ALIGNMENT
520  ("PhaseAlignment",          m_phaseAlignFlag, false, "indicate the sample location alignment between layers (0: zero position aligned, 1: central position aligned)")
521#endif
522#if REPN_FORMAT_IN_VPS
523  ("RepFormatIdx%d",          cfg_repFormatIdx, -1, MAX_LAYERS, "Index to the representation format structure used from the VPS")
524#endif
525#if VPS_EXTN_DIRECT_REF_LAYERS
526  ("NumSamplePredRefLayers%d",cfg_numSamplePredRefLayers, -1, MAX_LAYERS, "Number of sample prediction reference layers")
527  ("SamplePredRefLayerIds%d", cfg_samplePredRefLayerIdsPtr, string(""), MAX_LAYERS, "sample pred reference layer IDs")
528  ("NumMotionPredRefLayers%d",cfg_numMotionPredRefLayers, -1, MAX_LAYERS, "Number of motion prediction reference layers")
529  ("MotionPredRefLayerIds%d", cfg_motionPredRefLayerIdsPtr, string(""), MAX_LAYERS, "motion pred reference layer IDs")
530  ("NumActiveRefLayers%d",    cfg_numActiveRefLayers, -1, MAX_LAYERS, "Number of active reference layers")
531  ("PredLayerIds%d",          cfg_predLayerIdsPtr, string(""), MAX_LAYERS, "inter-layer prediction layer IDs")
532#endif
533  ("NumLayers",               m_numLayers, 1, "Number of layers to code")
534#if AUXILIARY_PICTURES
535  ("InputChromaFormat%d",     cfg_tmpInputChromaFormat,  420, MAX_LAYERS, "InputChromaFormatIDC for layer %d")
536  ("ChromaFormatIDC%d,-cf",   cfg_tmpChromaFormatIDC,    420, MAX_LAYERS, "ChromaFormatIDC (400|420|422|444 or set 0 (default) for same as InputChromaFormat) for layer %d")
537  ("AuxId%d",                 cfg_auxId,                 0,   MAX_LAYERS, "Auxilary picture ID for layer %d (0: Not aux pic, 1: Alpha plane, 2: Depth picture, 3: Cb enh, 4: Cr enh")
538#endif
539  ("ConformanceMode%d",       cfg_conformanceMode,0, MAX_LAYERS, "Window conformance mode (0: no cropping, 1:automatic padding, 2: padding, 3:cropping")
540#if SCALABILITY_MASK_E0104
541  ("ScalabilityMask1",        m_scalabilityMask[1], 0, "scalability_mask[1] (multiview)")
542  ("ScalabilityMask2",        m_scalabilityMask[2], 1, "scalability_mask[2] (scalable)" )
543#if AUXILIARY_PICTURES
544  ("ScalabilityMask3",        m_scalabilityMask[3], 0, "scalability_mask[3] (auxiliary pictures)" )
545#endif
546#else
547  ("ScalabilityMask0",        m_scalabilityMask[0], 0, "scalability_mask[0] (multiview)")
548  ("ScalabilityMask1",        m_scalabilityMask[1], 1, "scalability_mask[1] (scalable)" )
549#endif
550  ("BitstreamFile,b",         cfg_BitstreamFile, string(""), "Bitstream output file name")
551#if !O0194_DIFFERENT_BITDEPTH_EL_BL
552  ("InputBitDepth",           m_inputBitDepthY,    8, "Bit-depth of input file")
553  ("OutputBitDepth",          m_outputBitDepthY,   0, "Bit-depth of output file (default:InternalBitDepth)")
554  ("InternalBitDepth",        m_internalBitDepthY, 0, "Bit-depth the codec operates at. (default:InputBitDepth)"
555                                                       "If different to InputBitDepth, source data will be converted")
556  ("InputBitDepthC",          m_inputBitDepthC,    0, "As per InputBitDepth but for chroma component. (default:InputBitDepth)")
557  ("OutputBitDepthC",         m_outputBitDepthC,   0, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
558  ("InternalBitDepthC",       m_internalBitDepthC, 0, "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth)")
559#endif
560  ("NumScaledRefLayerOffsets%d",    cfg_numScaledRefLayerOffsets,     0, MAX_LAYERS,  "Number of scaled offset layer sets ")
561#if O0098_SCALED_REF_LAYER_ID
562  ("ScaledRefLayerId%d",           cfg_scaledRefLayerIdPtr,          string(""), MAX_LAYERS, "Layer ID of scaled base layer picture")
563#endif
564  ("ScaledRefLayerLeftOffset%d",   cfg_scaledRefLayerLeftOffsetPtr,  string(""), MAX_LAYERS, "Horizontal offset of top-left luma sample of scaled base layer picture with respect to"
565                                                                 " top-left luma sample of the EL picture, in units of two luma samples")
566  ("ScaledRefLayerTopOffset%d",    cfg_scaledRefLayerTopOffsetPtr,   string(""), MAX_LAYERS,   "Vertical offset of top-left luma sample of scaled base layer picture with respect to"
567                                                                 " top-left luma sample of the EL picture, in units of two luma samples")
568  ("ScaledRefLayerRightOffset%d",  cfg_scaledRefLayerRightOffsetPtr, string(""), MAX_LAYERS, "Horizontal offset of bottom-right luma sample of scaled base layer picture with respect to"
569                                                                 " bottom-right luma sample of the EL picture, in units of two luma samples")
570  ("ScaledRefLayerBottomOffset%d", cfg_scaledRefLayerBottomOffsetPtr,string(""), MAX_LAYERS, "Vertical offset of bottom-right luma sample of scaled base layer picture with respect to"
571                                                                 " bottom-right luma sample of the EL picture, in units of two luma samples")
572#if O0194_DIFFERENT_BITDEPTH_EL_BL
573  ("InputBitDepth%d",       cfg_InputBitDepthY,    8, MAX_LAYERS, "Bit-depth of input file for layer %d")
574  ("InternalBitDepth%d",    cfg_InternalBitDepthY, 0, MAX_LAYERS, "Bit-depth the codec operates at. (default:InputBitDepth) for layer %d ")
575//                                                       "If different to InputBitDepth, source data will be converted")
576  ("InputBitDepthC%d",      cfg_InputBitDepthC,    0, MAX_LAYERS, "As per InputBitDepth but for chroma component. (default:InputBitDepth) for layer %d")
577  ("InternalBitDepthC%d",   cfg_InternalBitDepthC, 0, MAX_LAYERS, "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth) for layer %d")
578  ("OutputBitDepth%d",      cfg_OutputBitDepthY,   0, MAX_LAYERS, "Bit-depth of output file (default:InternalBitDepth)")
579  ("OutputBitDepthC%d",     cfg_OutputBitDepthC,   0, MAX_LAYERS, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
580#endif
581#if N0120_MAX_TID_REF_CFG
582  ("MaxTidRefPresentFlag", m_maxTidRefPresentFlag, true, "max_tid_ref_present_flag (0: not present, 1: present(default)) " )
583  ("MaxTidIlRefPicsPlus1%d", cfg_maxTidIlRefPicsPlus1, 1, MAX_LAYERS, "allowed maximum temporal_id for inter-layer prediction")
584#endif
585#if O0223_PICTURE_TYPES_ALIGN_FLAG
586  ("CrossLayerPictureTypeAlignFlag", m_crossLayerPictureTypeAlignFlag, true, "align picture type across layers" ) 
587#endif
588#if N0147_IRAP_ALIGN_FLAG
589  ("CrossLayerIrapAlignFlag", m_crossLayerIrapAlignFlag, true, "align IRAP across layers" ) 
590#endif
591#if O0194_WEIGHTED_PREDICTION_CGS
592  ("InterLayerWeightedPred", m_useInterLayerWeightedPred, false, "enable IL WP parameters estimation at encoder" ) 
593#endif
594#if AVC_BASE
595  ("AvcBase,-avc",            m_avcBaseLayerFlag,     0, "avc_base_layer_flag")
596  ("InputBLFile,-ibl",        cfg_BLInputFile,     string(""), "Base layer rec YUV input file name")
597#if AVC_SYNTAX
598  ("InputBLSyntaxFile,-ibs",  cfg_BLSyntaxFile,     string(""), "Base layer syntax input file name")
599#endif
600#endif
601  ("EnableElRapB,-use-rap-b",  m_elRapSliceBEnabled, 0, "Set ILP over base-layer I picture to B picture (default is P picture)")
602#else //SVC_EXTENSION
603  ("InputFile,i",           cfg_InputFile,     string(""), "Original YUV input file name")
604  ("BitstreamFile,b",       cfg_BitstreamFile, string(""), "Bitstream output file name")
605  ("ReconFile,o",           cfg_ReconFile,     string(""), "Reconstructed YUV output file name")
606  ("SourceWidth,-wdt",      m_iSourceWidth,        0, "Source picture width")
607  ("SourceHeight,-hgt",     m_iSourceHeight,       0, "Source picture height")
608  ("InputBitDepth",         m_inputBitDepthY,    8, "Bit-depth of input file")
609  ("OutputBitDepth",        m_outputBitDepthY,   0, "Bit-depth of output file (default:InternalBitDepth)")
610  ("InternalBitDepth",      m_internalBitDepthY, 0, "Bit-depth the codec operates at. (default:InputBitDepth)"
611                                                       "If different to InputBitDepth, source data will be converted")
612  ("InputBitDepthC",        m_inputBitDepthC,    0, "As per InputBitDepth but for chroma component. (default:InputBitDepth)")
613  ("OutputBitDepthC",       m_outputBitDepthC,   0, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
614  ("InternalBitDepthC",     m_internalBitDepthC, 0, "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth)")
615#if AUXILIARY_PICTURES
616  ("InputChromaFormat",     tmpInputChromaFormat,                       420, "InputChromaFormatIDC")
617  ("ChromaFormatIDC,-cf",   tmpChromaFormat,                             0, "ChromaFormatIDC (400|420|422|444 or set 0 (default) for same as InputChromaFormat)")
618#endif
619  ("ConformanceMode",       m_conformanceMode,     0, "Window conformance mode (0: no window, 1:automatic padding, 2:padding, 3:conformance")
620  ("HorizontalPadding,-pdx",m_aiPad[0],            0, "Horizontal source padding for conformance window mode 2")
621  ("VerticalPadding,-pdy",  m_aiPad[1],            0, "Vertical source padding for conformance window mode 2")
622  ("ConfLeft",              m_confLeft,            0, "Left offset for window conformance mode 3")
623  ("ConfRight",             m_confRight,           0, "Right offset for window conformance mode 3")
624  ("ConfTop",               m_confTop,             0, "Top offset for window conformance mode 3")
625  ("ConfBottom",            m_confBottom,          0, "Bottom offset for window conformance mode 3")
626  ("FrameRate,-fr",         m_iFrameRate,          0, "Frame rate")
627#endif //SVC_EXTENSION
628
629  //Field coding parameters
630  ("FieldCoding", m_isField, false, "Signals if it's a field based coding")
631  ("TopFieldFirst, Tff", m_isTopFieldFirst, false, "In case of field based coding, signals whether if it's a top field first or not")
632  ("FrameSkip,-fs",         m_FrameSkip,          0u, "Number of frames to skip at start of input YUV")
633  ("FramesToBeEncoded,f",   m_framesToBeEncoded,   0, "Number of frames to be encoded (default=all)")
634  // Profile and level
635  ("Profile", m_profile,   Profile::NONE, "Profile to be used when encoding (Incomplete)")
636  ("Level",   m_level,     Level::NONE,   "Level limit to be used, eg 5.1 (Incomplete)")
637  ("Tier",    m_levelTier, Level::MAIN,   "Tier to use for interpretation of --Level")
638
639  ("ProgressiveSource", m_progressiveSourceFlag, false, "Indicate that source is progressive")
640  ("InterlacedSource",  m_interlacedSourceFlag,  false, "Indicate that source is interlaced")
641  ("NonPackedSource",   m_nonPackedConstraintFlag, false, "Indicate that source does not contain frame packing")
642  ("FrameOnly",         m_frameOnlyConstraintFlag, false, "Indicate that the bitstream contains only frames")
643
644#if LAYER_CTB
645  // Unit definition parameters
646  ("MaxCUWidth%d",              cfg_uiMaxCUWidth,             64u, MAX_LAYERS, "Maximum CU width")
647  ("MaxCUHeight%d",             cfg_uiMaxCUHeight,            64u, MAX_LAYERS, "Maximum CU height")
648  // todo: remove defaults from MaxCUSize
649  ("MaxCUSize%d,s%d",           cfg_uiMaxCUWidth,             64u, MAX_LAYERS, "Maximum CU size")
650  ("MaxCUSize%d,s%d",           cfg_uiMaxCUHeight,            64u, MAX_LAYERS, "Maximum CU size")
651  ("MaxPartitionDepth%d,h%d",   cfg_uiMaxCUDepth,              4u, MAX_LAYERS, "CU depth")
652 
653  ("QuadtreeTULog2MaxSize%d",   cfg_uiQuadtreeTULog2MaxSize,   6u, MAX_LAYERS, "Maximum TU size in logarithm base 2")
654  ("QuadtreeTULog2MinSize%d",   cfg_uiQuadtreeTULog2MinSize,   2u, MAX_LAYERS, "Minimum TU size in logarithm base 2")
655 
656  ("QuadtreeTUMaxDepthIntra%d", cfg_uiQuadtreeTUMaxDepthIntra, 1u, MAX_LAYERS, "Depth of TU tree for intra CUs")
657  ("QuadtreeTUMaxDepthInter%d", cfg_uiQuadtreeTUMaxDepthInter, 2u, MAX_LAYERS, "Depth of TU tree for inter CUs")
658
659
660  // set the same CU realted settings across all the layers if config file parameters are not layer specific
661  ("MaxCUWidth",              cfg_uiMaxCUWidth,             64u, MAX_LAYERS, "Maximum CU width")
662  ("MaxCUHeight",             cfg_uiMaxCUHeight,            64u, MAX_LAYERS, "Maximum CU height")
663  // todo: remove defaults from MaxCUSize
664  ("MaxCUSize,s",             cfg_uiMaxCUWidth,             64u, MAX_LAYERS, "Maximum CU size")
665  ("MaxCUSize,s",             cfg_uiMaxCUHeight,            64u, MAX_LAYERS, "Maximum CU size")
666  ("MaxPartitionDepth,h",     cfg_uiMaxCUDepth,              4u, MAX_LAYERS, "CU depth")
667 
668  ("QuadtreeTULog2MaxSize",   cfg_uiQuadtreeTULog2MaxSize,   6u, MAX_LAYERS, "Maximum TU size in logarithm base 2")
669  ("QuadtreeTULog2MinSize",   cfg_uiQuadtreeTULog2MinSize,   2u, MAX_LAYERS, "Minimum TU size in logarithm base 2")
670 
671  ("QuadtreeTUMaxDepthIntra", cfg_uiQuadtreeTUMaxDepthIntra, 1u, MAX_LAYERS, "Depth of TU tree for intra CUs")
672  ("QuadtreeTUMaxDepthInter", cfg_uiQuadtreeTUMaxDepthInter, 2u, MAX_LAYERS, "Depth of TU tree for inter CUs")
673#else
674  // Unit definition parameters
675  ("MaxCUWidth",              m_uiMaxCUWidth,             64u)
676  ("MaxCUHeight",             m_uiMaxCUHeight,            64u)
677  // todo: remove defaults from MaxCUSize
678  ("MaxCUSize,s",             m_uiMaxCUWidth,             64u, "Maximum CU size")
679  ("MaxCUSize,s",             m_uiMaxCUHeight,            64u, "Maximum CU size")
680  ("MaxPartitionDepth,h",     m_uiMaxCUDepth,              4u, "CU depth")
681 
682  ("QuadtreeTULog2MaxSize",   m_uiQuadtreeTULog2MaxSize,   6u, "Maximum TU size in logarithm base 2")
683  ("QuadtreeTULog2MinSize",   m_uiQuadtreeTULog2MinSize,   2u, "Minimum TU size in logarithm base 2")
684 
685  ("QuadtreeTUMaxDepthIntra", m_uiQuadtreeTUMaxDepthIntra, 1u, "Depth of TU tree for intra CUs")
686  ("QuadtreeTUMaxDepthInter", m_uiQuadtreeTUMaxDepthInter, 2u, "Depth of TU tree for inter CUs")
687#endif
688 
689  // Coding structure paramters
690#if SVC_EXTENSION
691  ("IntraPeriod%d,-ip%d",  cfg_IntraPeriod, -1, MAX_LAYERS, "intra period in frames for layer %d, (-1: only first frame)")
692#else
693  ("IntraPeriod,-ip",         m_iIntraPeriod,              -1, "Intra period in frames, (-1: only first frame)")
694#endif
695  ("DecodingRefreshType,-dr", m_iDecodingRefreshType,       0, "Intra refresh type (0:none 1:CRA 2:IDR)")
696  ("GOPSize,g",               m_iGOPSize,                   1, "GOP size of temporal structure")
697  // motion options
698  ("FastSearch",              m_iFastSearch,                1, "0:Full search  1:Diamond  2:PMVFAST")
699  ("SearchRange,-sr",         m_iSearchRange,              96, "Motion search range")
700  ("BipredSearchRange",       m_bipredSearchRange,          4, "Motion search range for bipred refinement")
701  ("HadamardME",              m_bUseHADME,               true, "Hadamard ME for fractional-pel")
702  ("ASR",                     m_bUseASR,                false, "Adaptive motion search range")
703
704#if SVC_EXTENSION
705  ("LambdaModifier%d,-LM%d",  m_adLambdaModifier, ( double )1.0, MAX_TLAYER, "Lambda modifier for temporal layer %d")
706#else
707  // Mode decision parameters
708  ("LambdaModifier0,-LM0", m_adLambdaModifier[ 0 ], ( Double )1.0, "Lambda modifier for temporal layer 0")
709  ("LambdaModifier1,-LM1", m_adLambdaModifier[ 1 ], ( Double )1.0, "Lambda modifier for temporal layer 1")
710  ("LambdaModifier2,-LM2", m_adLambdaModifier[ 2 ], ( Double )1.0, "Lambda modifier for temporal layer 2")
711  ("LambdaModifier3,-LM3", m_adLambdaModifier[ 3 ], ( Double )1.0, "Lambda modifier for temporal layer 3")
712  ("LambdaModifier4,-LM4", m_adLambdaModifier[ 4 ], ( Double )1.0, "Lambda modifier for temporal layer 4")
713  ("LambdaModifier5,-LM5", m_adLambdaModifier[ 5 ], ( Double )1.0, "Lambda modifier for temporal layer 5")
714  ("LambdaModifier6,-LM6", m_adLambdaModifier[ 6 ], ( Double )1.0, "Lambda modifier for temporal layer 6")
715  ("LambdaModifier7,-LM7", m_adLambdaModifier[ 7 ], ( Double )1.0, "Lambda modifier for temporal layer 7")
716#endif
717
718  /* Quantization parameters */
719#if SVC_EXTENSION
720  ("QP%d,-q%d",     cfg_fQP,  30.0, MAX_LAYERS, "Qp value for layer %d, if value is float, QP is switched once during encoding")
721#else
722  ("QP,q",          m_fQP,             30.0, "Qp value, if value is float, QP is switched once during encoding")
723#endif
724  ("DeltaQpRD,-dqr",m_uiDeltaQpRD,       0u, "max dQp offset for slice")
725  ("MaxDeltaQP,d",  m_iMaxDeltaQP,        0, "max dQp offset for block")
726  ("MaxCuDQPDepth,-dqd",  m_iMaxCuDQPDepth,        0, "max depth for a minimum CuDQP")
727
728  ("CbQpOffset,-cbqpofs",  m_cbQpOffset,        0, "Chroma Cb QP Offset")
729  ("CrQpOffset,-crqpofs",  m_crQpOffset,        0, "Chroma Cr QP Offset")
730
731#if ADAPTIVE_QP_SELECTION
732  ("AdaptiveQpSelection,-aqps",   m_bUseAdaptQpSelect,           false, "AdaptiveQpSelection")
733#endif
734
735  ("AdaptiveQP,-aq",                m_bUseAdaptiveQP,           false, "QP adaptation based on a psycho-visual model")
736  ("MaxQPAdaptationRange,-aqr",     m_iQPAdaptationRange,           6, "QP adaptation range")
737#if !SVC_EXTENSION
738  ("dQPFile,m",                     cfg_dQPFile,           string(""), "dQP file name")
739#endif
740  ("RDOQ",                          m_useRDOQ,                  true )
741  ("RDOQTS",                        m_useRDOQTS,                true )
742  ("RDpenalty",                     m_rdPenalty,                0,  "RD-penalty for 32x32 TU for intra in non-intra slices. 0:disbaled  1:RD-penalty  2:maximum RD-penalty")
743  // Entropy coding parameters
744  ("SBACRD",                         m_bUseSBACRD,                      true, "SBAC based RD estimation")
745 
746  // Deblocking filter parameters
747  ("LoopFilterDisable",              m_bLoopFilterDisable,             false )
748  ("LoopFilterOffsetInPPS",          m_loopFilterOffsetInPPS,          false )
749  ("LoopFilterBetaOffset_div2",      m_loopFilterBetaOffsetDiv2,           0 )
750  ("LoopFilterTcOffset_div2",        m_loopFilterTcOffsetDiv2,             0 )
751  ("DeblockingFilterControlPresent", m_DeblockingFilterControlPresent, false )
752  ("DeblockingFilterMetric",         m_DeblockingFilterMetric,         false )
753
754  // Coding tools
755  ("AMP",                      m_enableAMP,                 true,  "Enable asymmetric motion partitions")
756  ("TransformSkip",            m_useTransformSkip,          false, "Intra transform skipping")
757  ("TransformSkipFast",        m_useTransformSkipFast,      false, "Fast intra transform skipping")
758  ("SAO",                      m_bUseSAO,                   true,  "Enable Sample Adaptive Offset")
759  ("MaxNumOffsetsPerPic",      m_maxNumOffsetsPerPic,       2048,  "Max number of SAO offset per picture (Default: 2048)")   
760  ("SAOLcuBoundary",           m_saoLcuBoundary,            false, "0: right/bottom LCU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas")
761#if !HM_CLEANUP_SAO
762  ("SAOLcuBasedOptimization",  m_saoLcuBasedOptimization,   true,  "0: SAO picture-based optimization, 1: SAO LCU-based optimization ")
763#endif 
764  ("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")
765  ("SliceArgument",            m_sliceArgument,            0,     "Depending on SliceMode being:"
766                                                                   "\t1: max number of CTUs per slice"
767                                                                   "\t2: max number of bytes per slice"
768                                                                   "\t3: max number of tiles per slice")
769  ("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")
770  ("SliceSegmentArgument",     m_sliceSegmentArgument,   0,     "Depending on SliceSegmentMode being:"
771                                                                   "\t1: max number of CTUs per slice segment"
772                                                                   "\t2: max number of bytes per slice segment"
773                                                                   "\t3: max number of tiles per slice segment")
774  ("LFCrossSliceBoundaryFlag", m_bLFCrossSliceBoundaryFlag, true)
775
776  ("ConstrainedIntraPred",     m_bUseConstrainedIntraPred,  false, "Constrained Intra Prediction")
777
778  ("PCMEnabledFlag",           m_usePCM,                    false)
779  ("PCMLog2MaxSize",           m_pcmLog2MaxSize,            5u)
780  ("PCMLog2MinSize",           m_uiPCMLog2MinSize,          3u)
781  ("PCMInputBitDepthFlag",     m_bPCMInputBitDepthFlag,     true)
782  ("PCMFilterDisableFlag",     m_bPCMFilterDisableFlag,    false)
783
784  ("LosslessCuEnabled",        m_useLossless, false)
785
786  ("WeightedPredP,-wpP",          m_useWeightedPred,               false,      "Use weighted prediction in P slices")
787  ("WeightedPredB,-wpB",          m_useWeightedBiPred,             false,      "Use weighted (bidirectional) prediction in B slices")
788  ("Log2ParallelMergeLevel",      m_log2ParallelMergeLevel,     2u,          "Parallel merge estimation region")
789  ("UniformSpacingIdc",           m_iUniformSpacingIdr,            0,          "Indicates if the column and row boundaries are distributed uniformly")
790  ("NumTileColumnsMinus1",        m_iNumColumnsMinus1,             0,          "Number of columns in a picture minus 1")
791  ("ColumnWidthArray",            cfg_ColumnWidth,                 string(""), "Array containing ColumnWidth values in units of LCU")
792  ("NumTileRowsMinus1",           m_iNumRowsMinus1,                0,          "Number of rows in a picture minus 1")
793  ("RowHeightArray",              cfg_RowHeight,                   string(""), "Array containing RowHeight values in units of LCU")
794  ("LFCrossTileBoundaryFlag",      m_bLFCrossTileBoundaryFlag,             true,          "1: cross-tile-boundary loop filtering. 0:non-cross-tile-boundary loop filtering")
795  ("WaveFrontSynchro",            m_iWaveFrontSynchro,             0,          "0: no synchro; 1 synchro with TR; 2 TRR etc")
796  ("ScalingList",                 m_useScalingListId,              0,          "0: no scaling list, 1: default scaling lists, 2: scaling lists specified in ScalingListFile")
797  ("ScalingListFile",             cfg_ScalingListFile,             string(""), "Scaling list file name")
798  ("SignHideFlag,-SBH",                m_signHideFlag, 1)
799  ("MaxNumMergeCand",             m_maxNumMergeCand,             5u,         "Maximum number of merge candidates")
800
801  /* Misc. */
802  ("SEIDecodedPictureHash",       m_decodedPictureHashSEIEnabled, 0, "Control generation of decode picture hash SEI messages\n"
803                                                                    "\t3: checksum\n"
804                                                                    "\t2: CRC\n"
805                                                                    "\t1: use MD5\n"
806                                                                    "\t0: disable")
807  ("SEIpictureDigest",            m_decodedPictureHashSEIEnabled, 0, "deprecated alias for SEIDecodedPictureHash")
808  ("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")
809  ("FEN", m_bUseFastEnc, false, "fast encoder setting")
810  ("ECU", m_bUseEarlyCU, false, "Early CU setting") 
811  ("FDM", m_useFastDecisionForMerge, true, "Fast decision for Merge RD Cost") 
812  ("CFM", m_bUseCbfFastMode, false, "Cbf fast mode setting")
813  ("ESD", m_useEarlySkipDetection, false, "Early SKIP detection setting")
814#if FAST_INTRA_SHVC
815  ("FIS", m_useFastIntraScalable, false, "Fast Intra Decision for Scalable HEVC")
816#endif
817#if RC_SHVC_HARMONIZATION
818  ("RateControl%d", cfg_RCEnableRateControl, false, MAX_LAYERS, "Rate control: enable rate control for layer %d")
819  ("TargetBitrate%d", cfg_RCTargetBitRate, 0, MAX_LAYERS, "Rate control: target bitrate for layer %d")
820  ("KeepHierarchicalBit%d", cfg_RCKeepHierarchicalBit, false, MAX_LAYERS, "Rate control: keep hierarchical bit allocation for layer %d")
821  ("LCULevelRateControl%d", cfg_RCLCULevelRC, true, MAX_LAYERS, "Rate control: LCU level RC")
822  ("RCLCUSeparateModel%d", cfg_RCUseLCUSeparateModel, true, MAX_LAYERS, "Rate control: Use LCU level separate R-lambda model")
823  ("InitialQP%d", cfg_RCInitialQP, 0, MAX_LAYERS, "Rate control: initial QP")
824  ("RCForceIntraQP%d", cfg_RCForceIntraQP, false, MAX_LAYERS, "Rate control: force intra QP to be equal to initial QP")
825#else
826  ( "RateControl",         m_RCEnableRateControl,   false, "Rate control: enable rate control" )
827  ( "TargetBitrate",       m_RCTargetBitrate,           0, "Rate control: target bitrate" )
828  ( "KeepHierarchicalBit", m_RCKeepHierarchicalBit,     0, "Rate control: 0: equal bit allocation; 1: fixed ratio bit allocation; 2: adaptive ratio bit allocation" )
829  ( "LCULevelRateControl", m_RCLCULevelRC,           true, "Rate control: true: LCU level RC; false: picture level RC" )
830  ( "RCLCUSeparateModel",  m_RCUseLCUSeparateModel,  true, "Rate control: use LCU level separate R-lambda model" )
831  ( "InitialQP",           m_RCInitialQP,               0, "Rate control: initial QP" )
832  ( "RCForceIntraQP",      m_RCForceIntraQP,        false, "Rate control: force intra QP to be equal to initial QP" )
833#endif
834
835  ("TransquantBypassEnableFlag", m_TransquantBypassEnableFlag, false, "transquant_bypass_enable_flag indicator in PPS")
836  ("CUTransquantBypassFlagValue", m_CUTransquantBypassFlagValue, false, "Fixed cu_transquant_bypass_flag value, when transquant_bypass_enable_flag is enabled")
837  ("RecalculateQPAccordingToLambda", m_recalculateQPAccordingToLambda, false, "Recalculate QP values according to lambda values. Do not suggest to be enabled in all intra case")
838  ("StrongIntraSmoothing,-sis",      m_useStrongIntraSmoothing,           true, "Enable strong intra smoothing for 32x32 blocks")
839  ("SEIActiveParameterSets",         m_activeParameterSetsSEIEnabled,          0, "Enable generation of active parameter sets SEI messages")
840  ("VuiParametersPresent,-vui",      m_vuiParametersPresentFlag,           false, "Enable generation of vui_parameters()")
841  ("AspectRatioInfoPresent",         m_aspectRatioInfoPresentFlag,         false, "Signals whether aspect_ratio_idc is present")
842  ("AspectRatioIdc",                 m_aspectRatioIdc,                         0, "aspect_ratio_idc")
843  ("SarWidth",                       m_sarWidth,                               0, "horizontal size of the sample aspect ratio")
844  ("SarHeight",                      m_sarHeight,                              0, "vertical size of the sample aspect ratio")
845  ("OverscanInfoPresent",            m_overscanInfoPresentFlag,            false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
846  ("OverscanAppropriate",            m_overscanAppropriateFlag,            false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
847  ("VideoSignalTypePresent",         m_videoSignalTypePresentFlag,         false, "Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present")
848  ("VideoFormat",                    m_videoFormat,                            5, "Indicates representation of pictures")
849  ("VideoFullRange",                 m_videoFullRangeFlag,                 false, "Indicates the black level and range of luma and chroma signals")
850  ("ColourDescriptionPresent",       m_colourDescriptionPresentFlag,       false, "Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present")
851  ("ColourPrimaries",                m_colourPrimaries,                        2, "Indicates chromaticity coordinates of the source primaries")
852  ("TransferCharateristics",         m_transferCharacteristics,                2, "Indicates the opto-electronic transfer characteristics of the source")
853  ("MatrixCoefficients",             m_matrixCoefficients,                     2, "Describes the matrix coefficients used in deriving luma and chroma from RGB primaries")
854  ("ChromaLocInfoPresent",           m_chromaLocInfoPresentFlag,           false, "Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present")
855  ("ChromaSampleLocTypeTopField",    m_chromaSampleLocTypeTopField,            0, "Specifies the location of chroma samples for top field")
856  ("ChromaSampleLocTypeBottomField", m_chromaSampleLocTypeBottomField,         0, "Specifies the location of chroma samples for bottom field")
857  ("NeutralChromaIndication",        m_neutralChromaIndicationFlag,        false, "Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1)")
858  ("DefaultDisplayWindowFlag",       m_defaultDisplayWindowFlag,           false, "Indicates the presence of the Default Window parameters")
859  ("DefDispWinLeftOffset",           m_defDispWinLeftOffset,                   0, "Specifies the left offset of the default display window from the conformance window")
860  ("DefDispWinRightOffset",          m_defDispWinRightOffset,                  0, "Specifies the right offset of the default display window from the conformance window")
861  ("DefDispWinTopOffset",            m_defDispWinTopOffset,                    0, "Specifies the top offset of the default display window from the conformance window")
862  ("DefDispWinBottomOffset",         m_defDispWinBottomOffset,                 0, "Specifies the bottom offset of the default display window from the conformance window")
863  ("FrameFieldInfoPresentFlag",      m_frameFieldInfoPresentFlag,               false, "Indicates that pic_struct and field coding related values are present in picture timing SEI messages")
864  ("PocProportionalToTimingFlag",   m_pocProportionalToTimingFlag,         false, "Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS")
865  ("NumTicksPocDiffOneMinus1",      m_numTicksPocDiffOneMinus1,                0, "Number of ticks minus 1 that for a POC difference of one")
866  ("BitstreamRestriction",           m_bitstreamRestrictionFlag,           false, "Signals whether bitstream restriction parameters are present")
867  ("TilesFixedStructure",            m_tilesFixedStructureFlag,            false, "Indicates that each active picture parameter set has the same values of the syntax elements related to tiles")
868  ("MotionVectorsOverPicBoundaries", m_motionVectorsOverPicBoundariesFlag, false, "Indicates that no samples outside the picture boundaries are used for inter prediction")
869  ("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")
870  ("MaxBitsPerMinCuDenom",           m_maxBitsPerMinCuDenom,                   1, "Indicates an upper bound for the number of bits of coding_unit() data")
871  ("Log2MaxMvLengthHorizontal",      m_log2MaxMvLengthHorizontal,             15, "Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units")
872  ("Log2MaxMvLengthVertical",        m_log2MaxMvLengthVertical,               15, "Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units")
873  ("SEIRecoveryPoint",               m_recoveryPointSEIEnabled,                0, "Control generation of recovery point SEI messages")
874  ("SEIBufferingPeriod",             m_bufferingPeriodSEIEnabled,              0, "Control generation of buffering period SEI messages")
875  ("SEIPictureTiming",               m_pictureTimingSEIEnabled,                0, "Control generation of picture timing SEI messages")
876  ("SEIToneMappingInfo",                       m_toneMappingInfoSEIEnabled,    false, "Control generation of Tone Mapping SEI messages")
877  ("SEIToneMapId",                             m_toneMapId,                        0, "Specifies Id of Tone Mapping SEI message for a given session")
878  ("SEIToneMapCancelFlag",                     m_toneMapCancelFlag,            false, "Indicates that Tone Mapping SEI message cancels the persistance or follows")
879  ("SEIToneMapPersistenceFlag",                m_toneMapPersistenceFlag,        true, "Specifies the persistence of the Tone Mapping SEI message")
880  ("SEIToneMapCodedDataBitDepth",              m_toneMapCodedDataBitDepth,         8, "Specifies Coded Data BitDepth of Tone Mapping SEI messages")
881  ("SEIToneMapTargetBitDepth",                 m_toneMapTargetBitDepth,            8, "Specifies Output BitDepth of Tome mapping function")
882  ("SEIToneMapModelId",                        m_toneMapModelId,                   0, "Specifies Model utilized for mapping coded data into target_bit_depth range\n"
883                                                                                      "\t0:  linear mapping with clipping\n"
884                                                                                      "\t1:  sigmoidal mapping\n"
885                                                                                      "\t2:  user-defined table mapping\n"
886                                                                                      "\t3:  piece-wise linear mapping\n"
887                                                                                      "\t4:  luminance dynamic range information ")
888  ("SEIToneMapMinValue",                              m_toneMapMinValue,                          0, "Specifies the minimum value in mode 0")
889  ("SEIToneMapMaxValue",                              m_toneMapMaxValue,                       1023, "Specifies the maxmum value in mode 0")
890  ("SEIToneMapSigmoidMidpoint",                       m_sigmoidMidpoint,                        512, "Specifies the centre point in mode 1")
891  ("SEIToneMapSigmoidWidth",                          m_sigmoidWidth,                           960, "Specifies the distance between 5% and 95% values of the target_bit_depth in mode 1")
892  ("SEIToneMapStartOfCodedInterval",                  cfg_startOfCodedInterval,          string(""), "Array of user-defined mapping table")
893  ("SEIToneMapNumPivots",                             m_numPivots,                                0, "Specifies the number of pivot points in mode 3")
894  ("SEIToneMapCodedPivotValue",                       cfg_codedPivotValue,               string(""), "Array of pivot point")
895  ("SEIToneMapTargetPivotValue",                      cfg_targetPivotValue,              string(""), "Array of pivot point")
896  ("SEIToneMapCameraIsoSpeedIdc",                     m_cameraIsoSpeedIdc,                        0, "Indicates the camera ISO speed for daylight illumination")
897  ("SEIToneMapCameraIsoSpeedValue",                   m_cameraIsoSpeedValue,                    400, "Specifies the camera ISO speed for daylight illumination of Extended_ISO")
898  ("SEIToneMapExposureCompensationValueSignFlag",     m_exposureCompensationValueSignFlag,        0, "Specifies the sign of ExposureCompensationValue")
899  ("SEIToneMapExposureCompensationValueNumerator",    m_exposureCompensationValueNumerator,       0, "Specifies the numerator of ExposureCompensationValue")
900  ("SEIToneMapExposureCompensationValueDenomIdc",     m_exposureCompensationValueDenomIdc,        2, "Specifies the denominator of ExposureCompensationValue")
901  ("SEIToneMapRefScreenLuminanceWhite",               m_refScreenLuminanceWhite,                350, "Specifies reference screen brightness setting in units of candela per square metre")
902  ("SEIToneMapExtendedRangeWhiteLevel",               m_extendedRangeWhiteLevel,                800, "Indicates the luminance dynamic range")
903  ("SEIToneMapNominalBlackLevelLumaCodeValue",        m_nominalBlackLevelLumaCodeValue,          16, "Specifies luma sample value of the nominal black level assigned decoded pictures")
904  ("SEIToneMapNominalWhiteLevelLumaCodeValue",        m_nominalWhiteLevelLumaCodeValue,         235, "Specifies luma sample value of the nominal white level assigned decoded pictures")
905  ("SEIToneMapExtendedWhiteLevelLumaCodeValue",       m_extendedWhiteLevelLumaCodeValue,        300, "Specifies luma sample value of the extended dynamic range assigned decoded pictures")
906  ("SEIFramePacking",                m_framePackingSEIEnabled,                 0, "Control generation of frame packing SEI messages")
907  ("SEIFramePackingType",            m_framePackingSEIType,                    0, "Define frame packing arrangement\n"
908                                                                                  "\t0: checkerboard - pixels alternatively represent either frames\n"
909                                                                                  "\t1: column alternation - frames are interlaced by column\n"
910                                                                                  "\t2: row alternation - frames are interlaced by row\n"
911                                                                                  "\t3: side by side - frames are displayed horizontally\n"
912                                                                                  "\t4: top bottom - frames are displayed vertically\n"
913                                                                                  "\t5: frame alternation - one frame is alternated with the other")
914  ("SEIFramePackingId",              m_framePackingSEIId,                      0, "Id of frame packing SEI message for a given session")
915  ("SEIFramePackingQuincunx",        m_framePackingSEIQuincunx,                0, "Indicate the presence of a Quincunx type video frame")
916  ("SEIFramePackingInterpretation",  m_framePackingSEIInterpretation,          0, "Indicate the interpretation of the frame pair\n"
917                                                                                  "\t0: unspecified\n"
918                                                                                  "\t1: stereo pair, frame0 represents left view\n"
919                                                                                  "\t2: stereo pair, frame0 represents right view")
920  ("SEIDisplayOrientation",          m_displayOrientationSEIAngle,             0, "Control generation of display orientation SEI messages\n"
921                                                              "\tN: 0 < N < (2^16 - 1) enable display orientation SEI message with anticlockwise_rotation = N and display_orientation_repetition_period = 1\n"
922                                                              "\t0: disable")
923  ("SEITemporalLevel0Index",         m_temporalLevel0IndexSEIEnabled,          0, "Control generation of temporal level 0 index SEI messages")
924  ("SEIGradualDecodingRefreshInfo",  m_gradualDecodingRefreshInfoEnabled,      0, "Control generation of gradual decoding refresh information SEI message")
925  ("SEIDecodingUnitInfo",             m_decodingUnitInfoSEIEnabled,                       0, "Control generation of decoding unit information SEI message.")
926#if LAYERS_NOT_PRESENT_SEI
927  ("SEILayersNotPresent",            m_layersNotPresentSEIEnabled,             0, "Control generation of layers not present SEI message")
928#endif
929  ("SEISOPDescription",              m_SOPDescriptionSEIEnabled,              0, "Control generation of SOP description SEI messages")
930  ("SEIScalableNesting",             m_scalableNestingSEIEnabled,              0, "Control generation of scalable nesting SEI messages")
931#if M0040_ADAPTIVE_RESOLUTION_CHANGE
932  ("AdaptiveResolutionChange",     m_adaptiveResolutionChange, 0, "Adaptive resolution change frame number. Should coincide with EL RAP picture. (0: disable)")
933#endif
934#if HIGHER_LAYER_IRAP_SKIP_FLAG
935  ("SkipPictureAtArcSwitch",     m_skipPictureAtArcSwitch, false, "Code the higher layer picture in ARC up-switching as a skip picture. (0: disable)")
936#endif
937#if N0383_IL_CONSTRAINED_TILE_SETS_SEI
938  ("SEIInterLayerConstrainedTileSets", m_interLayerConstrainedTileSetsSEIEnabled, false, "Control generation of inter layer constrained tile sets SEI message")
939  ("IlNumSetsInMessage",               m_ilNumSetsInMessage,                         0u, "Number of inter layer constrained tile sets")
940  ("TileSetsArray",                    cfg_tileSets,                         string(""), "Array containing tile sets params (TopLeftTileIndex, BottonRightTileIndex and ilcIdc for each set) ")
941#endif
942#if O0153_ALT_OUTPUT_LAYER_FLAG
943  ("AltOutputLayerFlag",               m_altOutputLayerFlag,                      false, "Specifies the value of alt_output_layer_flag in VPS extension")
944#endif
945#if O0149_CROSS_LAYER_BLA_FLAG
946  ("CrossLayerBLAFlag",                m_crossLayerBLAFlag,                       false, "Specifies the value of cross_layer_bla_flag in VPS")
947#endif
948  ;
949 
950  for(Int i=1; i<MAX_GOP+1; i++) {
951    std::ostringstream cOSS;
952    cOSS<<"Frame"<<i;
953    opts.addOptions()(cOSS.str(), m_GOPList[i-1], GOPEntry());
954  }
955  po::setDefaults(opts);
956  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
957
958  if(m_isField)
959  {
960#if SVC_EXTENSION
961    for(Int layer = 0; layer < MAX_LAYERS; layer++)
962    {
963      //Frame height
964      m_acLayerCfg[layer].m_iSourceHeightOrg = m_acLayerCfg[layer].m_iSourceHeight;
965      //Field height
966      m_acLayerCfg[layer].m_iSourceHeight = m_acLayerCfg[layer].m_iSourceHeight >> 1;
967    }
968#else
969    //Frame height
970    m_iSourceHeightOrg = m_iSourceHeight;
971    //Field height
972    m_iSourceHeight = m_iSourceHeight >> 1;
973#endif
974    //number of fields to encode
975    m_framesToBeEncoded *= 2;
976  }
977 
978  for (list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
979  {
980    fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
981  }
982 
983  if (argc == 1 || do_help)
984  {
985    /* argc == 1: no options have been specified */
986    po::doHelp(cout, opts);
987    return false;
988  }
989 
990  /*
991   * Set any derived parameters
992   */
993  /* convert std::string to c string for compatability */
994#if SVC_EXTENSION
995#if AVC_BASE
996  if( m_avcBaseLayerFlag )
997  {
998    *cfg_InputFile[0] = cfg_BLInputFile;
999  }
1000#endif
1001  m_pBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
1002#if AVC_SYNTAX
1003  m_BLSyntaxFile = cfg_BLSyntaxFile.empty() ? NULL : strdup(cfg_BLSyntaxFile.c_str());
1004#endif
1005#else //SVC_EXTENSION
1006  m_pchInputFile = cfg_InputFile.empty() ? NULL : strdup(cfg_InputFile.c_str());
1007  m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
1008  m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str());
1009  m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str());
1010#endif //SVC_EXTENSION
1011
1012  Char* pColumnWidth = cfg_ColumnWidth.empty() ? NULL: strdup(cfg_ColumnWidth.c_str());
1013  Char* pRowHeight = cfg_RowHeight.empty() ? NULL : strdup(cfg_RowHeight.c_str());
1014  if( m_iUniformSpacingIdr == 0 && m_iNumColumnsMinus1 > 0 )
1015  {
1016    char *columnWidth;
1017    int  i=0;
1018    m_pColumnWidth = new UInt[m_iNumColumnsMinus1];
1019    columnWidth = strtok(pColumnWidth, " ,-");
1020    while(columnWidth!=NULL)
1021    {
1022      if( i>=m_iNumColumnsMinus1 )
1023      {
1024        printf( "The number of columns whose width are defined is larger than the allowed number of columns.\n" );
1025        exit( EXIT_FAILURE );
1026      }
1027      *( m_pColumnWidth + i ) = atoi( columnWidth );
1028      columnWidth = strtok(NULL, " ,-");
1029      i++;
1030    }
1031    if( i<m_iNumColumnsMinus1 )
1032    {
1033      printf( "The width of some columns is not defined.\n" );
1034      exit( EXIT_FAILURE );
1035    }
1036  }
1037  else
1038  {
1039    m_pColumnWidth = NULL;
1040  }
1041
1042  if( m_iUniformSpacingIdr == 0 && m_iNumRowsMinus1 > 0 )
1043  {
1044    char *rowHeight;
1045    int  i=0;
1046    m_pRowHeight = new UInt[m_iNumRowsMinus1];
1047    rowHeight = strtok(pRowHeight, " ,-");
1048    while(rowHeight!=NULL)
1049    {
1050      if( i>=m_iNumRowsMinus1 )
1051      {
1052        printf( "The number of rows whose height are defined is larger than the allowed number of rows.\n" );
1053        exit( EXIT_FAILURE );
1054      }
1055      *( m_pRowHeight + i ) = atoi( rowHeight );
1056      rowHeight = strtok(NULL, " ,-");
1057      i++;
1058    }
1059    if( i<m_iNumRowsMinus1 )
1060    {
1061      printf( "The height of some rows is not defined.\n" );
1062      exit( EXIT_FAILURE );
1063   }
1064  }
1065  else
1066  {
1067    m_pRowHeight = NULL;
1068  }
1069#if SVC_EXTENSION
1070  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1071  {
1072    // If number of scaled ref. layer offsets is non-zero, at least one of the offsets should be specified
1073    if(m_acLayerCfg[layer].m_numScaledRefLayerOffsets)
1074    {
1075#if O0098_SCALED_REF_LAYER_ID
1076      assert( strcmp(cfg_scaledRefLayerId[layer].c_str(),  ""));
1077#endif
1078      assert( strcmp(cfg_scaledRefLayerLeftOffset[layer].c_str(),  "") ||
1079              strcmp(cfg_scaledRefLayerRightOffset[layer].c_str(), "") ||
1080              strcmp(cfg_scaledRefLayerTopOffset[layer].c_str(),   "") ||
1081              strcmp(cfg_scaledRefLayerBottomOffset[layer].c_str(),"")
1082            ); 
1083    }
1084
1085    Int *tempArray = NULL;   // Contain the value
1086
1087#if O0098_SCALED_REF_LAYER_ID
1088    // ID //
1089    if(strcmp(cfg_scaledRefLayerId[layer].c_str(),  ""))
1090    {
1091      cfgStringToArray( &tempArray, cfg_scaledRefLayerId[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "ScaledRefLayerId");
1092      if(tempArray)
1093      {
1094        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1095        {
1096          m_acLayerCfg[layer].m_scaledRefLayerId[i] = tempArray[i];
1097        }
1098        delete [] tempArray; tempArray = NULL;
1099      }
1100    }
1101#endif
1102
1103    // Left offset //
1104    if(strcmp(cfg_scaledRefLayerLeftOffset[layer].c_str(),  ""))
1105    {
1106      cfgStringToArray( &tempArray, cfg_scaledRefLayerLeftOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "LeftOffset");
1107      if(tempArray)
1108      {
1109        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1110        {
1111          m_acLayerCfg[layer].m_scaledRefLayerLeftOffset[i] = tempArray[i];
1112        }
1113        delete [] tempArray; tempArray = NULL;
1114      }
1115    }
1116
1117    // Top offset //
1118    if(strcmp(cfg_scaledRefLayerTopOffset[layer].c_str(),  ""))
1119    {
1120      cfgStringToArray( &tempArray, cfg_scaledRefLayerTopOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "TopOffset");
1121      if(tempArray)
1122      {
1123        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1124        {
1125          m_acLayerCfg[layer].m_scaledRefLayerTopOffset[i] = tempArray[i];
1126        }
1127        delete [] tempArray; tempArray = NULL;
1128      }
1129    }
1130
1131    // Right offset //
1132    if(strcmp(cfg_scaledRefLayerRightOffset[layer].c_str(),  ""))
1133    {
1134      cfgStringToArray( &tempArray, cfg_scaledRefLayerRightOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "RightOffset");
1135      if(tempArray)
1136      {
1137        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1138        {
1139          m_acLayerCfg[layer].m_scaledRefLayerRightOffset[i] = tempArray[i];
1140        }
1141        delete [] tempArray; tempArray = NULL;
1142      }
1143    }
1144
1145    // Bottom offset //
1146    if(strcmp(cfg_scaledRefLayerBottomOffset[layer].c_str(),  ""))
1147    {
1148      cfgStringToArray( &tempArray, cfg_scaledRefLayerBottomOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "BottomOffset");
1149      if(tempArray)
1150      {
1151        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1152        {
1153          m_acLayerCfg[layer].m_scaledRefLayerBottomOffset[i] = tempArray[i];
1154        }
1155        delete [] tempArray; tempArray = NULL;
1156      }
1157    }
1158  }
1159#if VPS_EXTN_DIRECT_REF_LAYERS
1160  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1161  {
1162    Char* pSamplePredRefLayerIds = cfg_samplePredRefLayerIds[layer].empty() ? NULL: strdup(cfg_samplePredRefLayerIds[layer].c_str());
1163    if( m_acLayerCfg[layer].m_numSamplePredRefLayers > 0 )
1164    {
1165      char *samplePredRefLayerId;
1166      int  i=0;
1167      m_acLayerCfg[layer].m_samplePredRefLayerIds = new Int[m_acLayerCfg[layer].m_numSamplePredRefLayers];
1168      samplePredRefLayerId = strtok(pSamplePredRefLayerIds, " ,-");
1169      while(samplePredRefLayerId != NULL)
1170      {
1171        if( i >= m_acLayerCfg[layer].m_numSamplePredRefLayers )
1172        {
1173          printf( "NumSamplePredRefLayers: The number of columns whose width are defined is larger than the allowed number of columns.\n" );
1174          exit( EXIT_FAILURE );
1175        }
1176        *( m_acLayerCfg[layer].m_samplePredRefLayerIds + i ) = atoi( samplePredRefLayerId );
1177        samplePredRefLayerId = strtok(NULL, " ,-");
1178        i++;
1179      }
1180      if( i < m_acLayerCfg[layer].m_numSamplePredRefLayers )
1181      {
1182        printf( "NumSamplePredRefLayers: The width of some columns is not defined.\n" );
1183        exit( EXIT_FAILURE );
1184      }
1185    }
1186    else
1187    {
1188      m_acLayerCfg[layer].m_samplePredRefLayerIds = NULL;
1189    }
1190  }
1191  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1192  {
1193    Char* pMotionPredRefLayerIds = cfg_motionPredRefLayerIds[layer].empty() ? NULL: strdup(cfg_motionPredRefLayerIds[layer].c_str());
1194    if( m_acLayerCfg[layer].m_numMotionPredRefLayers > 0 )
1195    {
1196      char *motionPredRefLayerId;
1197      int  i=0;
1198      m_acLayerCfg[layer].m_motionPredRefLayerIds = new Int[m_acLayerCfg[layer].m_numMotionPredRefLayers];
1199      motionPredRefLayerId = strtok(pMotionPredRefLayerIds, " ,-");
1200      while(motionPredRefLayerId != NULL)
1201      {
1202        if( i >= m_acLayerCfg[layer].m_numMotionPredRefLayers )
1203        {
1204          printf( "NumMotionPredRefLayers: The number of columns whose width are defined is larger than the allowed number of columns.\n" );
1205          exit( EXIT_FAILURE );
1206        }
1207        *( m_acLayerCfg[layer].m_motionPredRefLayerIds + i ) = atoi( motionPredRefLayerId );
1208        motionPredRefLayerId = strtok(NULL, " ,-");
1209        i++;
1210      }
1211      if( i < m_acLayerCfg[layer].m_numMotionPredRefLayers )
1212      {
1213        printf( "NumMotionPredRefLayers: The width of some columns is not defined.\n" );
1214        exit( EXIT_FAILURE );
1215      }
1216    }
1217    else
1218    {
1219      m_acLayerCfg[layer].m_motionPredRefLayerIds = NULL;
1220    }
1221  }
1222
1223#if AUXILIARY_PICTURES
1224  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
1225  {
1226    m_acLayerCfg[layer].m_InputChromaFormat =  numberToChromaFormat(cfg_tmpChromaFormatIDC[layer]);
1227    m_acLayerCfg[layer].m_chromaFormatIDC = ((cfg_tmpChromaFormatIDC[layer] == 0) ? (m_acLayerCfg[layer].m_InputChromaFormat ) : (numberToChromaFormat(cfg_tmpChromaFormatIDC[layer])));
1228  }
1229#endif
1230  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1231  {
1232    Char* pPredLayerIds = cfg_predLayerIds[layer].empty() ? NULL: strdup(cfg_predLayerIds[layer].c_str());
1233    if( m_acLayerCfg[layer].m_numActiveRefLayers > 0 )
1234    {
1235      char *refLayerId;
1236      int  i=0;
1237      m_acLayerCfg[layer].m_predLayerIds = new Int[m_acLayerCfg[layer].m_numActiveRefLayers];
1238      refLayerId = strtok(pPredLayerIds, " ,-");
1239      while(refLayerId != NULL)
1240      {
1241        if( i >= m_acLayerCfg[layer].m_numActiveRefLayers )
1242        {
1243          printf( "NumActiveRefLayers: The number of columns whose width are defined is larger than the allowed number of columns.\n" );
1244          exit( EXIT_FAILURE );
1245        }
1246        *( m_acLayerCfg[layer].m_predLayerIds + i ) = atoi( refLayerId );
1247        refLayerId = strtok(NULL, " ,-");
1248        i++;
1249      }
1250      if( i < m_acLayerCfg[layer].m_numActiveRefLayers )
1251      {
1252        printf( "NumActiveRefLayers: The width of some columns is not defined.\n" );
1253        exit( EXIT_FAILURE );
1254      }
1255    }
1256    else
1257    {
1258      m_acLayerCfg[layer].m_predLayerIds = NULL;
1259    }
1260  }
1261#endif
1262#endif //SVC_EXTENSION
1263  m_scalingListFile = cfg_ScalingListFile.empty() ? NULL : strdup(cfg_ScalingListFile.c_str());
1264
1265  /* rules for input, output and internal bitdepths as per help text */
1266#if O0194_DIFFERENT_BITDEPTH_EL_BL
1267  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1268  {
1269    if (!m_acLayerCfg[layer].m_internalBitDepthY) { m_acLayerCfg[layer].m_internalBitDepthY = m_acLayerCfg[layer].m_inputBitDepthY; }
1270    if (!m_acLayerCfg[layer].m_internalBitDepthC) { m_acLayerCfg[layer].m_internalBitDepthC = m_acLayerCfg[layer].m_internalBitDepthY; }
1271    if (!m_acLayerCfg[layer].m_inputBitDepthC) { m_acLayerCfg[layer].m_inputBitDepthC = m_acLayerCfg[layer].m_inputBitDepthY; }
1272    if (!m_acLayerCfg[layer].m_outputBitDepthY) { m_acLayerCfg[layer].m_outputBitDepthY = m_acLayerCfg[layer].m_internalBitDepthY; }
1273    if (!m_acLayerCfg[layer].m_outputBitDepthC) { m_acLayerCfg[layer].m_outputBitDepthC = m_acLayerCfg[layer].m_internalBitDepthC; }
1274  }
1275#else
1276  if (!m_internalBitDepthY) { m_internalBitDepthY = m_inputBitDepthY; }
1277  if (!m_internalBitDepthC) { m_internalBitDepthC = m_internalBitDepthY; }
1278  if (!m_inputBitDepthC) { m_inputBitDepthC = m_inputBitDepthY; }
1279  if (!m_outputBitDepthY) { m_outputBitDepthY = m_internalBitDepthY; }
1280  if (!m_outputBitDepthC) { m_outputBitDepthC = m_internalBitDepthC; }
1281#endif
1282
1283#if !SVC_EXTENSION
1284  // TODO:ChromaFmt assumes 4:2:0 below
1285  switch (m_conformanceMode)
1286  {
1287  case 0:
1288    {
1289      // no conformance or padding
1290      m_confLeft = m_confRight = m_confTop = m_confBottom = 0;
1291      m_aiPad[1] = m_aiPad[0] = 0;
1292      break;
1293    }
1294  case 1:
1295    {
1296      // automatic padding to minimum CU size
1297      Int minCuSize = m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1);
1298      if (m_iSourceWidth % minCuSize)
1299      {
1300        m_aiPad[0] = m_confRight  = ((m_iSourceWidth / minCuSize) + 1) * minCuSize - m_iSourceWidth;
1301        m_iSourceWidth  += m_confRight;
1302      }
1303      if (m_iSourceHeight % minCuSize)
1304      {
1305        m_aiPad[1] = m_confBottom = ((m_iSourceHeight / minCuSize) + 1) * minCuSize - m_iSourceHeight;
1306        m_iSourceHeight += m_confBottom;
1307        if ( m_isField )
1308        {
1309          m_iSourceHeightOrg += m_confBottom << 1;
1310          m_aiPad[1] = m_confBottom << 1;
1311        }
1312      }
1313      if (m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0)
1314      {
1315        fprintf(stderr, "Error: picture width is not an integer multiple of the specified chroma subsampling\n");
1316        exit(EXIT_FAILURE);
1317      }
1318      if (m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0)
1319      {
1320        fprintf(stderr, "Error: picture height is not an integer multiple of the specified chroma subsampling\n");
1321        exit(EXIT_FAILURE);
1322      }
1323      break;
1324    }
1325  case 2:
1326    {
1327      //padding
1328      m_iSourceWidth  += m_aiPad[0];
1329      m_iSourceHeight += m_aiPad[1];
1330      m_confRight  = m_aiPad[0];
1331      m_confBottom = m_aiPad[1];
1332      break;
1333    }
1334  case 3:
1335    {
1336      // conformance
1337      if ((m_confLeft == 0) && (m_confRight == 0) && (m_confTop == 0) && (m_confBottom == 0))
1338      {
1339        fprintf(stderr, "Warning: Conformance window enabled, but all conformance window parameters set to zero\n");
1340      }
1341      if ((m_aiPad[1] != 0) || (m_aiPad[0]!=0))
1342      {
1343        fprintf(stderr, "Warning: Conformance window enabled, padding parameters will be ignored\n");
1344      }
1345      m_aiPad[1] = m_aiPad[0] = 0;
1346      break;
1347    }
1348  }
1349 
1350  // allocate slice-based dQP values
1351  m_aidQP = new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ];
1352  ::memset( m_aidQP, 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );
1353 
1354  // handling of floating-point QP values
1355  // if QP is not integer, sequence is split into two sections having QP and QP+1
1356  m_iQP = (Int)( m_fQP );
1357  if ( m_iQP < m_fQP )
1358  {
1359    Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP - m_iQP)*m_framesToBeEncoded + 0.5 );
1360   
1361    iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
1362    for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
1363    {
1364      m_aidQP[i] = 1;
1365    }
1366  }
1367 
1368  // reading external dQP description from file
1369  if ( m_pchdQPFile )
1370  {
1371    FILE* fpt=fopen( m_pchdQPFile, "r" );
1372    if ( fpt )
1373    {
1374      Int iValue;
1375      Int iPOC = 0;
1376      while ( iPOC < m_framesToBeEncoded )
1377      {
1378        if ( fscanf(fpt, "%d", &iValue ) == EOF ) break;
1379        m_aidQP[ iPOC ] = iValue;
1380        iPOC++;
1381      }
1382      fclose(fpt);
1383    }
1384  }
1385  m_iWaveFrontSubstreams = m_iWaveFrontSynchro ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1;
1386#endif
1387  if( m_toneMappingInfoSEIEnabled && !m_toneMapCancelFlag )
1388  {
1389    Char* pcStartOfCodedInterval = cfg_startOfCodedInterval.empty() ? NULL: strdup(cfg_startOfCodedInterval.c_str());
1390    Char* pcCodedPivotValue = cfg_codedPivotValue.empty() ? NULL: strdup(cfg_codedPivotValue.c_str());
1391    Char* pcTargetPivotValue = cfg_targetPivotValue.empty() ? NULL: strdup(cfg_targetPivotValue.c_str());
1392    if( m_toneMapModelId == 2 && pcStartOfCodedInterval )
1393    {
1394      char *startOfCodedInterval;
1395      UInt num = 1u<< m_toneMapTargetBitDepth;
1396      m_startOfCodedInterval = new Int[num];
1397      ::memset( m_startOfCodedInterval, 0, sizeof(Int)*num );
1398      startOfCodedInterval = strtok(pcStartOfCodedInterval, " .");
1399      int i = 0;
1400      while( startOfCodedInterval && ( i < num ) )
1401      {
1402        m_startOfCodedInterval[i] = atoi( startOfCodedInterval );
1403        startOfCodedInterval = strtok(NULL, " .");
1404        i++;
1405      }
1406    } 
1407    else
1408    {
1409      m_startOfCodedInterval = NULL;
1410    }
1411    if( ( m_toneMapModelId == 3 ) && ( m_numPivots > 0 ) )
1412    {
1413      if( pcCodedPivotValue && pcTargetPivotValue )
1414      {
1415        char *codedPivotValue;
1416        char *targetPivotValue;
1417        m_codedPivotValue = new Int[m_numPivots];
1418        m_targetPivotValue = new Int[m_numPivots];
1419        ::memset( m_codedPivotValue, 0, sizeof(Int)*( m_numPivots ) );
1420        ::memset( m_targetPivotValue, 0, sizeof(Int)*( m_numPivots ) );
1421        codedPivotValue = strtok(pcCodedPivotValue, " .");
1422        int i=0;
1423        while(codedPivotValue&&i<m_numPivots)
1424        {
1425          m_codedPivotValue[i] = atoi( codedPivotValue );
1426          codedPivotValue = strtok(NULL, " .");
1427          i++;
1428        }
1429        i=0;
1430        targetPivotValue = strtok(pcTargetPivotValue, " .");
1431        while(targetPivotValue&&i<m_numPivots)
1432        {
1433          m_targetPivotValue[i]= atoi( targetPivotValue );
1434          targetPivotValue = strtok(NULL, " .");
1435          i++;
1436        }
1437      }
1438    }
1439    else
1440    {
1441      m_codedPivotValue = NULL;
1442      m_targetPivotValue = NULL;
1443    }
1444  }
1445#if N0383_IL_CONSTRAINED_TILE_SETS_SEI
1446  if (m_interLayerConstrainedTileSetsSEIEnabled)
1447  {
1448    if (m_iNumColumnsMinus1 == 0 && m_iNumRowsMinus1 == 0)
1449    {
1450      printf( "Tiles are not defined (needed for inter-layer comnstrained tile sets SEI).\n" );
1451      exit( EXIT_FAILURE );
1452    }
1453    Char* pTileSets = cfg_tileSets.empty() ? NULL : strdup(cfg_tileSets.c_str());
1454    int i = 0;
1455    char *topLeftTileIndex = strtok(pTileSets, " ,");
1456    while(topLeftTileIndex != NULL)
1457    {
1458      if( i >= m_ilNumSetsInMessage )
1459      {
1460        printf( "The number of tile sets is larger than defined by IlNumSetsInMessage.\n" );
1461        exit( EXIT_FAILURE );
1462      }
1463      *( m_topLeftTileIndex + i ) = atoi( topLeftTileIndex );
1464      char *bottonRightTileIndex = strtok(NULL, " ,");
1465      if( bottonRightTileIndex == NULL )
1466      {
1467        printf( "BottonRightTileIndex is missing in the tile sets.\n" );
1468        exit( EXIT_FAILURE );
1469      }
1470      *( m_bottomRightTileIndex + i ) = atoi( bottonRightTileIndex );
1471      char *ilcIdc = strtok(NULL, " ,");
1472      if( ilcIdc == NULL )
1473      {
1474        printf( "IlcIdc is missing in the tile sets.\n" );
1475        exit( EXIT_FAILURE );
1476      }
1477      *( m_ilcIdc + i ) = atoi( ilcIdc );
1478      topLeftTileIndex = strtok(NULL, " ,");
1479      i++;
1480    }
1481    if( i < m_ilNumSetsInMessage )
1482    {
1483      printf( "The number of tile sets is smaller than defined by IlNumSetsInMessage.\n" );
1484      exit( EXIT_FAILURE );
1485    }
1486    m_skippedTileSetPresentFlag = false;
1487  }
1488#endif
1489  // check validity of input parameters
1490  xCheckParameter();
1491 
1492  // set global varibles
1493#if LAYER_CTB
1494  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1495  {
1496    xSetGlobal(layer);
1497  }
1498#else
1499  xSetGlobal();
1500#endif
1501 
1502  // print-out parameters
1503  xPrintParameter();
1504 
1505  return true;
1506}
1507// ====================================================================================================================
1508// Private member functions
1509// ====================================================================================================================
1510
1511Bool confirmPara(Bool bflag, const Char* message);
1512
1513Void TAppEncCfg::xCheckParameter()
1514{
1515  if (!m_decodedPictureHashSEIEnabled)
1516  {
1517    fprintf(stderr, "******************************************************************\n");
1518    fprintf(stderr, "** WARNING: --SEIDecodedPictureHash is now disabled by default. **\n");
1519    fprintf(stderr, "**          Automatic verification of decoded pictures by a     **\n");
1520    fprintf(stderr, "**          decoder requires this option to be enabled.         **\n");
1521    fprintf(stderr, "******************************************************************\n");
1522  }
1523  if( m_profile==Profile::NONE )
1524  {
1525    fprintf(stderr, "***************************************************************************\n");
1526    fprintf(stderr, "** WARNING: For conforming bitstreams a valid Profile value must be set! **\n");
1527    fprintf(stderr, "***************************************************************************\n");
1528  }
1529  if( m_level==Level::NONE )
1530  {
1531    fprintf(stderr, "***************************************************************************\n");
1532    fprintf(stderr, "** WARNING: For conforming bitstreams a valid Level value must be set!   **\n");
1533    fprintf(stderr, "***************************************************************************\n");
1534  }
1535
1536  Bool check_failed = false; /* abort if there is a fatal configuration problem */
1537#define xConfirmPara(a,b) check_failed |= confirmPara(a,b)
1538  // check range of parameters
1539#if O0194_DIFFERENT_BITDEPTH_EL_BL
1540  for(UInt layer=0; layer<m_numLayers; layer++)
1541  {
1542    xConfirmPara( m_acLayerCfg[layer].m_inputBitDepthY < 8,                                                     "InputBitDepth must be at least 8" );
1543    xConfirmPara( m_acLayerCfg[layer].m_inputBitDepthC < 8,                                                     "InputBitDepthC must be at least 8" );
1544  }
1545#else
1546  xConfirmPara( m_inputBitDepthY < 8,                                                     "InputBitDepth must be at least 8" );
1547  xConfirmPara( m_inputBitDepthC < 8,                                                     "InputBitDepthC must be at least 8" );
1548#endif
1549#if !SVC_EXTENSION 
1550  xConfirmPara( m_iFrameRate <= 0,                                                          "Frame rate must be more than 1" );
1551#endif
1552  xConfirmPara( m_framesToBeEncoded <= 0,                                                   "Total Number Of Frames encoded must be more than 0" );
1553  xConfirmPara( m_iGOPSize < 1 ,                                                            "GOP Size must be greater or equal to 1" );
1554  xConfirmPara( m_iGOPSize > 1 &&  m_iGOPSize % 2,                                          "GOP Size must be a multiple of 2, if GOP Size is greater than 1" );
1555#if !SVC_EXTENSION
1556  xConfirmPara( (m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, "Intra period must be more than GOP size, or -1 , not 0" );
1557#endif
1558  xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 2,                   "Decoding Refresh Type must be equal to 0, 1 or 2" );
1559#if !SVC_EXTENSION
1560  xConfirmPara( m_iQP <  -6 * (m_internalBitDepthY - 8) || m_iQP > 51,                    "QP exceeds supported range (-QpBDOffsety to 51)" );
1561#endif
1562  xConfirmPara( m_loopFilterBetaOffsetDiv2 < -6 || m_loopFilterBetaOffsetDiv2 > 6,          "Loop Filter Beta Offset div. 2 exceeds supported range (-6 to 6)");
1563  xConfirmPara( m_loopFilterTcOffsetDiv2 < -6 || m_loopFilterTcOffsetDiv2 > 6,              "Loop Filter Tc Offset div. 2 exceeds supported range (-6 to 6)");
1564  xConfirmPara( m_iFastSearch < 0 || m_iFastSearch > 2,                                     "Fast Search Mode is not supported value (0:Full search  1:Diamond  2:PMVFAST)" );
1565  xConfirmPara( m_iSearchRange < 0 ,                                                        "Search Range must be more than 0" );
1566  xConfirmPara( m_bipredSearchRange < 0 ,                                                   "Search Range must be more than 0" );
1567  xConfirmPara( m_iMaxDeltaQP > 7,                                                          "Absolute Delta QP exceeds supported range (0 to 7)" );
1568#if LAYER_CTB
1569  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
1570  {
1571    xConfirmPara( m_iMaxCuDQPDepth > m_acLayerCfg[layer].m_uiMaxCUDepth - 1,                "Absolute depth for a minimum CuDQP exceeds maximum coding unit depth" );
1572  }
1573#else
1574  xConfirmPara( m_iMaxCuDQPDepth > m_uiMaxCUDepth - 1,                                          "Absolute depth for a minimum CuDQP exceeds maximum coding unit depth" );
1575#endif
1576
1577  xConfirmPara( m_cbQpOffset < -12,   "Min. Chroma Cb QP Offset is -12" );
1578  xConfirmPara( m_cbQpOffset >  12,   "Max. Chroma Cb QP Offset is  12" );
1579  xConfirmPara( m_crQpOffset < -12,   "Min. Chroma Cr QP Offset is -12" );
1580  xConfirmPara( m_crQpOffset >  12,   "Max. Chroma Cr QP Offset is  12" );
1581
1582  xConfirmPara( m_iQPAdaptationRange <= 0,                                                  "QP Adaptation Range must be more than 0" );
1583#if !SVC_EXTENSION
1584  if (m_iDecodingRefreshType == 2)
1585  {
1586    xConfirmPara( m_iIntraPeriod > 0 && m_iIntraPeriod <= m_iGOPSize ,                      "Intra period must be larger than GOP size for periodic IDR pictures");
1587  }
1588#endif
1589#if !LAYER_CTB
1590  xConfirmPara( (m_uiMaxCUWidth  >> m_uiMaxCUDepth) < 4,                                    "Minimum partition width size should be larger than or equal to 8");
1591  xConfirmPara( (m_uiMaxCUHeight >> m_uiMaxCUDepth) < 4,                                    "Minimum partition height size should be larger than or equal to 8");
1592  xConfirmPara( m_uiMaxCUWidth < 16,                                                        "Maximum partition width size should be larger than or equal to 16");
1593  xConfirmPara( m_uiMaxCUHeight < 16,                                                       "Maximum partition height size should be larger than or equal to 16");
1594#endif
1595#if !SVC_EXTENSION
1596  xConfirmPara( (m_iSourceWidth  % (m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame width must be a multiple of the minimum CU size");
1597  xConfirmPara( (m_iSourceHeight % (m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame height must be a multiple of the minimum CU size");
1598#endif
1599 
1600#if !LAYER_CTB
1601  xConfirmPara( m_uiQuadtreeTULog2MinSize < 2,                                        "QuadtreeTULog2MinSize must be 2 or greater.");
1602  xConfirmPara( m_uiQuadtreeTULog2MaxSize > 5,                                        "QuadtreeTULog2MaxSize must be 5 or smaller.");
1603  xConfirmPara( (1<<m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth,                                        "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
1604 
1605  xConfirmPara( m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize,                "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize.");
1606  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUWidth >>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
1607  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUHeight>>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
1608  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUWidth  >> m_uiMaxCUDepth ), "Minimum CU width must be greater than minimum transform size." );
1609  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUHeight >> m_uiMaxCUDepth ), "Minimum CU height must be greater than minimum transform size." );
1610  xConfirmPara( m_uiQuadtreeTUMaxDepthInter < 1,                                                         "QuadtreeTUMaxDepthInter must be greater than or equal to 1" );
1611  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" );
1612  xConfirmPara( m_uiQuadtreeTUMaxDepthIntra < 1,                                                         "QuadtreeTUMaxDepthIntra must be greater than or equal to 1" );
1613  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" );
1614#endif
1615 
1616  xConfirmPara(  m_maxNumMergeCand < 1,  "MaxNumMergeCand must be 1 or greater.");
1617  xConfirmPara(  m_maxNumMergeCand > 5,  "MaxNumMergeCand must be 5 or smaller.");
1618
1619#if !SVC_EXTENSION
1620#if ADAPTIVE_QP_SELECTION
1621  xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP < 0,                                              "AdaptiveQpSelection must be disabled when QP < 0.");
1622  xConfirmPara( m_bUseAdaptQpSelect == true && (m_cbQpOffset !=0 || m_crQpOffset != 0 ),               "AdaptiveQpSelection must be disabled when ChromaQpOffset is not equal to 0.");
1623#endif
1624#endif
1625
1626  if( m_usePCM)
1627  {
1628    xConfirmPara(  m_uiPCMLog2MinSize < 3,                                      "PCMLog2MinSize must be 3 or greater.");
1629    xConfirmPara(  m_uiPCMLog2MinSize > 5,                                      "PCMLog2MinSize must be 5 or smaller.");
1630    xConfirmPara(  m_pcmLog2MaxSize > 5,                                        "PCMLog2MaxSize must be 5 or smaller.");
1631    xConfirmPara(  m_pcmLog2MaxSize < m_uiPCMLog2MinSize,                       "PCMLog2MaxSize must be equal to or greater than m_uiPCMLog2MinSize.");
1632  }
1633
1634  xConfirmPara( m_sliceMode < 0 || m_sliceMode > 3, "SliceMode exceeds supported range (0 to 3)" );
1635  if (m_sliceMode!=0)
1636  {
1637    xConfirmPara( m_sliceArgument < 1 ,         "SliceArgument should be larger than or equal to 1" );
1638  }
1639  xConfirmPara( m_sliceSegmentMode < 0 || m_sliceSegmentMode > 3, "SliceSegmentMode exceeds supported range (0 to 3)" );
1640  if (m_sliceSegmentMode!=0)
1641  {
1642    xConfirmPara( m_sliceSegmentArgument < 1 ,         "SliceSegmentArgument should be larger than or equal to 1" );
1643  }
1644 
1645  Bool tileFlag = (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0 );
1646  xConfirmPara( tileFlag && m_iWaveFrontSynchro,            "Tile and Wavefront can not be applied together");
1647
1648  //TODO:ChromaFmt assumes 4:2:0 below
1649#if !SVC_EXTENSION
1650  xConfirmPara( m_iSourceWidth  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Picture width must be an integer multiple of the specified chroma subsampling");
1651  xConfirmPara( m_iSourceHeight % TComSPS::getWinUnitY(CHROMA_420) != 0, "Picture height must be an integer multiple of the specified chroma subsampling");
1652
1653  xConfirmPara( m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling");
1654  xConfirmPara( m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling");
1655
1656  xConfirmPara( m_confLeft   % TComSPS::getWinUnitX(CHROMA_420) != 0, "Left conformance window offset must be an integer multiple of the specified chroma subsampling");
1657  xConfirmPara( m_confRight  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Right conformance window offset must be an integer multiple of the specified chroma subsampling");
1658  xConfirmPara( m_confTop    % TComSPS::getWinUnitY(CHROMA_420) != 0, "Top conformance window offset must be an integer multiple of the specified chroma subsampling");
1659  xConfirmPara( m_confBottom % TComSPS::getWinUnitY(CHROMA_420) != 0, "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling");
1660#endif
1661
1662#if !LAYER_CTB
1663  // max CU width and height should be power of 2
1664  UInt ui = m_uiMaxCUWidth;
1665  while(ui)
1666  {
1667    ui >>= 1;
1668    if( (ui & 1) == 1)
1669      xConfirmPara( ui != 1 , "Width should be 2^n");
1670  }
1671  ui = m_uiMaxCUHeight;
1672  while(ui)
1673  {
1674    ui >>= 1;
1675    if( (ui & 1) == 1)
1676      xConfirmPara( ui != 1 , "Height should be 2^n");
1677  }
1678#endif
1679
1680  /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure
1681   * This permits the ability to omit a GOP structure specification */
1682#if SVC_EXTENSION
1683  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
1684  {
1685    Int m_iIntraPeriod = m_acLayerCfg[layer].m_iIntraPeriod;
1686#endif
1687  if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1) {
1688    m_GOPList[0] = GOPEntry();
1689    m_GOPList[0].m_QPFactor = 1;
1690    m_GOPList[0].m_betaOffsetDiv2 = 0;
1691    m_GOPList[0].m_tcOffsetDiv2 = 0;
1692    m_GOPList[0].m_POC = 1;
1693    m_GOPList[0].m_numRefPicsActive = 4;
1694  }
1695#if SVC_EXTENSION
1696  }
1697#endif
1698 
1699
1700  Bool verifiedGOP=false;
1701  Bool errorGOP=false;
1702  Int checkGOP=1;
1703  Int numRefs = m_isField ? 2 : 1;
1704  Int refList[MAX_NUM_REF_PICS+1];
1705  refList[0]=0;
1706  if(m_isField)
1707  {
1708    refList[1] = 1;
1709  }
1710  Bool isOK[MAX_GOP];
1711  for(Int i=0; i<MAX_GOP; i++) 
1712  {
1713    isOK[i]=false;
1714  }
1715  Int numOK=0;
1716#if !SVC_EXTENSION
1717  xConfirmPara( m_iIntraPeriod >=0&&(m_iIntraPeriod%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" );
1718#endif
1719
1720  for(Int i=0; i<m_iGOPSize; i++)
1721  {
1722    if(m_GOPList[i].m_POC==m_iGOPSize)
1723    {
1724      xConfirmPara( m_GOPList[i].m_temporalId!=0 , "The last frame in each GOP must have temporal ID = 0 " );
1725    }
1726  }
1727
1728#if SVC_EXTENSION
1729  xConfirmPara( m_numLayers > MAX_LAYERS , "Number of layers in config file is greater than MAX_LAYERS" );
1730  m_numLayers = m_numLayers > MAX_LAYERS ? MAX_LAYERS : m_numLayers;
1731
1732  // verify layer configuration parameters
1733  for(UInt layer=0; layer<m_numLayers; layer++)
1734  {
1735    if(m_acLayerCfg[layer].xCheckParameter(m_isField))
1736    {
1737      printf("\nError: invalid configuration parameter found in layer %d \n", layer);
1738      check_failed = true;
1739    }
1740  }
1741
1742  // verify layer configuration parameters
1743  for(UInt layer=0; layer<m_numLayers; layer++)
1744  {
1745    Int m_iIntraPeriod = m_acLayerCfg[layer].m_iIntraPeriod;
1746#endif
1747  if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable) )
1748  {
1749    for(Int i=0; i<m_iGOPSize; i++)
1750    {
1751      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)" );
1752      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)" );
1753    }
1754  }
1755#if SVC_EXTENSION
1756  }
1757#endif
1758
1759  m_extraRPSs=0;
1760  //start looping through frames in coding order until we can verify that the GOP structure is correct.
1761  while(!verifiedGOP&&!errorGOP) 
1762  {
1763    Int curGOP = (checkGOP-1)%m_iGOPSize;
1764    Int curPOC = ((checkGOP-1)/m_iGOPSize)*m_iGOPSize + m_GOPList[curGOP].m_POC;   
1765    if(m_GOPList[curGOP].m_POC<0) 
1766    {
1767      printf("\nError: found fewer Reference Picture Sets than GOPSize\n");
1768      errorGOP=true;
1769    }
1770    else 
1771    {
1772      //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
1773      Bool beforeI = false;
1774      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
1775      {
1776        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
1777        if(absPOC < 0)
1778        {
1779          beforeI=true;
1780        }
1781        else 
1782        {
1783          Bool found=false;
1784          for(Int j=0; j<numRefs; j++) 
1785          {
1786            if(refList[j]==absPOC) 
1787            {
1788              found=true;
1789              for(Int k=0; k<m_iGOPSize; k++)
1790              {
1791                if(absPOC%m_iGOPSize == m_GOPList[k].m_POC%m_iGOPSize)
1792                {
1793                  if(m_GOPList[k].m_temporalId==m_GOPList[curGOP].m_temporalId)
1794                  {
1795                    m_GOPList[k].m_refPic = true;
1796                  }
1797                  m_GOPList[curGOP].m_usedByCurrPic[i]=m_GOPList[k].m_temporalId<=m_GOPList[curGOP].m_temporalId;
1798                }
1799              }
1800            }
1801          }
1802          if(!found)
1803          {
1804            printf("\nError: ref pic %d is not available for GOP frame %d\n",m_GOPList[curGOP].m_referencePics[i],curGOP+1);
1805            errorGOP=true;
1806          }
1807        }
1808      }
1809      if(!beforeI&&!errorGOP)
1810      {
1811        //all ref frames were present
1812        if(!isOK[curGOP]) 
1813        {
1814          numOK++;
1815          isOK[curGOP]=true;
1816          if(numOK==m_iGOPSize)
1817          {
1818            verifiedGOP=true;
1819          }
1820        }
1821      }
1822      else 
1823      {
1824        //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
1825        m_GOPList[m_iGOPSize+m_extraRPSs]=m_GOPList[curGOP];
1826        Int newRefs=0;
1827        for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
1828        {
1829          Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
1830          if(absPOC>=0)
1831          {
1832            m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[newRefs]=m_GOPList[curGOP].m_referencePics[i];
1833            m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[newRefs]=m_GOPList[curGOP].m_usedByCurrPic[i];
1834            newRefs++;
1835          }
1836        }
1837        Int numPrefRefs = m_GOPList[curGOP].m_numRefPicsActive;
1838       
1839        for(Int offset = -1; offset>-checkGOP; offset--)
1840        {
1841          //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
1842          Int offGOP = (checkGOP-1+offset)%m_iGOPSize;
1843          Int offPOC = ((checkGOP-1+offset)/m_iGOPSize)*m_iGOPSize + m_GOPList[offGOP].m_POC;
1844          if(offPOC>=0&&m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId)
1845          {
1846            Bool newRef=false;
1847            for(Int i=0; i<numRefs; i++)
1848            {
1849              if(refList[i]==offPOC)
1850              {
1851                newRef=true;
1852              }
1853            }
1854            for(Int i=0; i<newRefs; i++) 
1855            {
1856              if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[i]==offPOC-curPOC)
1857              {
1858                newRef=false;
1859              }
1860            }
1861            if(newRef) 
1862            {
1863              Int insertPoint=newRefs;
1864              //this picture can be added, find appropriate place in list and insert it.
1865              if(m_GOPList[offGOP].m_temporalId==m_GOPList[curGOP].m_temporalId)
1866              {
1867                m_GOPList[offGOP].m_refPic = true;
1868              }
1869              for(Int j=0; j<newRefs; j++)
1870              {
1871                if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]<offPOC-curPOC||m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]>0)
1872                {
1873                  insertPoint = j;
1874                  break;
1875                }
1876              }
1877              Int prev = offPOC-curPOC;
1878              Int prevUsed = m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId;
1879              for(Int j=insertPoint; j<newRefs+1; j++)
1880              {
1881                Int newPrev = m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j];
1882                Int newUsed = m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j];
1883                m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]=prev;
1884                m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j]=prevUsed;
1885                prevUsed=newUsed;
1886                prev=newPrev;
1887              }
1888              newRefs++;
1889            }
1890          }
1891          if(newRefs>=numPrefRefs)
1892          {
1893            break;
1894          }
1895        }
1896        m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics=newRefs;
1897        m_GOPList[m_iGOPSize+m_extraRPSs].m_POC = curPOC;
1898        if (m_extraRPSs == 0)
1899        {
1900          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 0;
1901          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = 0;
1902        }
1903        else
1904        {
1905          Int rIdx =  m_iGOPSize + m_extraRPSs - 1;
1906          Int refPOC = m_GOPList[rIdx].m_POC;
1907          Int refPics = m_GOPList[rIdx].m_numRefPics;
1908          Int newIdc=0;
1909          for(Int i = 0; i<= refPics; i++) 
1910          {
1911            Int deltaPOC = ((i != refPics)? m_GOPList[rIdx].m_referencePics[i] : 0);  // check if the reference abs POC is >= 0
1912            Int absPOCref = refPOC+deltaPOC;
1913            Int refIdc = 0;
1914            for (Int j = 0; j < m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics; j++)
1915            {
1916              if ( (absPOCref - curPOC) == m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j])
1917              {
1918                if (m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j])
1919                {
1920                  refIdc = 1;
1921                }
1922                else
1923                {
1924                  refIdc = 2;
1925                }
1926              }
1927            }
1928            m_GOPList[m_iGOPSize+m_extraRPSs].m_refIdc[newIdc]=refIdc;
1929            newIdc++;
1930          }
1931          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 1; 
1932          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = newIdc;
1933          m_GOPList[m_iGOPSize+m_extraRPSs].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize+m_extraRPSs].m_POC; 
1934        }
1935        curGOP=m_iGOPSize+m_extraRPSs;
1936        m_extraRPSs++;
1937      }
1938      numRefs=0;
1939      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
1940      {
1941        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
1942        if(absPOC >= 0) 
1943        {
1944          refList[numRefs]=absPOC;
1945          numRefs++;
1946        }
1947      }
1948      refList[numRefs]=curPOC;
1949      numRefs++;
1950    }
1951    checkGOP++;
1952  }
1953  xConfirmPara(errorGOP,"Invalid GOP structure given");
1954
1955  m_maxTempLayer = 1;
1956  for(Int i=0; i<m_iGOPSize; i++) 
1957  {
1958    if(m_GOPList[i].m_temporalId >= m_maxTempLayer)
1959    {
1960      m_maxTempLayer = m_GOPList[i].m_temporalId+1;
1961    }
1962    xConfirmPara(m_GOPList[i].m_sliceType!='B'&&m_GOPList[i].m_sliceType!='P', "Slice type must be equal to B or P");
1963  }
1964  for(Int i=0; i<MAX_TLAYER; i++)
1965  {
1966    m_numReorderPics[i] = 0;
1967    m_maxDecPicBuffering[i] = 1;
1968  }
1969  for(Int i=0; i<m_iGOPSize; i++) 
1970  {
1971    if(m_GOPList[i].m_numRefPics+1 > m_maxDecPicBuffering[m_GOPList[i].m_temporalId])
1972    {
1973      m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics + 1;
1974    }
1975
1976    Int highestDecodingNumberWithLowerPOC = 0; 
1977    for(Int j=0; j<m_iGOPSize; j++)
1978    {
1979      if(m_GOPList[j].m_POC <= m_GOPList[i].m_POC)
1980      {
1981        highestDecodingNumberWithLowerPOC = j;
1982      }
1983    }
1984    Int numReorder = 0;
1985    for(Int j=0; j<highestDecodingNumberWithLowerPOC; j++)
1986    {
1987      if(m_GOPList[j].m_temporalId <= m_GOPList[i].m_temporalId && 
1988        m_GOPList[j].m_POC > m_GOPList[i].m_POC)
1989      {
1990        numReorder++;
1991      }
1992    }   
1993    if(numReorder > m_numReorderPics[m_GOPList[i].m_temporalId])
1994    {
1995      m_numReorderPics[m_GOPList[i].m_temporalId] = numReorder;
1996    }
1997  }
1998  for(Int i=0; i<MAX_TLAYER-1; i++) 
1999  {
2000    // a lower layer can not have higher value of m_numReorderPics than a higher layer
2001    if(m_numReorderPics[i+1] < m_numReorderPics[i])
2002    {
2003      m_numReorderPics[i+1] = m_numReorderPics[i];
2004    }
2005    // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] - 1, inclusive
2006    if(m_numReorderPics[i] > m_maxDecPicBuffering[i] - 1)
2007    {
2008      m_maxDecPicBuffering[i] = m_numReorderPics[i] + 1;
2009    }
2010    // a lower layer can not have higher value of m_uiMaxDecPicBuffering than a higher layer
2011    if(m_maxDecPicBuffering[i+1] < m_maxDecPicBuffering[i])
2012    {
2013      m_maxDecPicBuffering[i+1] = m_maxDecPicBuffering[i];
2014    }
2015  }
2016
2017
2018  // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] -  1, inclusive
2019  if(m_numReorderPics[MAX_TLAYER-1] > m_maxDecPicBuffering[MAX_TLAYER-1] - 1)
2020  {
2021    m_maxDecPicBuffering[MAX_TLAYER-1] = m_numReorderPics[MAX_TLAYER-1] + 1;
2022  }
2023
2024#if SVC_EXTENSION // ToDo: it should be checked for the case when parameters are different for the layers
2025  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
2026  {
2027    Int m_iSourceWidth = m_acLayerCfg[layer].m_iSourceWidth;
2028    Int m_iSourceHeight = m_acLayerCfg[layer].m_iSourceHeight;
2029#if LAYER_CTB
2030    Int m_uiMaxCUWidth = m_acLayerCfg[layer].m_uiMaxCUWidth;
2031    Int m_uiMaxCUHeight = m_acLayerCfg[layer].m_uiMaxCUHeight;
2032#endif
2033#endif
2034  if(m_vuiParametersPresentFlag && m_bitstreamRestrictionFlag)
2035  { 
2036    Int PicSizeInSamplesY =  m_iSourceWidth * m_iSourceHeight;
2037    if(tileFlag)
2038    {
2039      Int maxTileWidth = 0;
2040      Int maxTileHeight = 0;
2041      Int widthInCU = (m_iSourceWidth % m_uiMaxCUWidth) ? m_iSourceWidth/m_uiMaxCUWidth + 1: m_iSourceWidth/m_uiMaxCUWidth;
2042      Int heightInCU = (m_iSourceHeight % m_uiMaxCUHeight) ? m_iSourceHeight/m_uiMaxCUHeight + 1: m_iSourceHeight/m_uiMaxCUHeight;
2043      if(m_iUniformSpacingIdr)
2044      {
2045        maxTileWidth = m_uiMaxCUWidth*((widthInCU+m_iNumColumnsMinus1)/(m_iNumColumnsMinus1+1));
2046        maxTileHeight = m_uiMaxCUHeight*((heightInCU+m_iNumRowsMinus1)/(m_iNumRowsMinus1+1));
2047        // if only the last tile-row is one treeblock higher than the others
2048        // the maxTileHeight becomes smaller if the last row of treeblocks has lower height than the others
2049        if(!((heightInCU-1)%(m_iNumRowsMinus1+1)))
2050        {
2051          maxTileHeight = maxTileHeight - m_uiMaxCUHeight + (m_iSourceHeight % m_uiMaxCUHeight);
2052        }     
2053        // if only the last tile-column is one treeblock wider than the others
2054        // the maxTileWidth becomes smaller if the last column of treeblocks has lower width than the others   
2055        if(!((widthInCU-1)%(m_iNumColumnsMinus1+1)))
2056        {
2057          maxTileWidth = maxTileWidth - m_uiMaxCUWidth + (m_iSourceWidth % m_uiMaxCUWidth);
2058        }
2059      }
2060      else // not uniform spacing
2061      {
2062        if(m_iNumColumnsMinus1<1)
2063        {
2064          maxTileWidth = m_iSourceWidth;
2065        }
2066        else
2067        {
2068          Int accColumnWidth = 0;
2069          for(Int col=0; col<(m_iNumColumnsMinus1); col++)
2070          {
2071            maxTileWidth = m_pColumnWidth[col]>maxTileWidth ? m_pColumnWidth[col]:maxTileWidth;
2072            accColumnWidth += m_pColumnWidth[col];
2073          }
2074          maxTileWidth = (widthInCU-accColumnWidth)>maxTileWidth ? m_uiMaxCUWidth*(widthInCU-accColumnWidth):m_uiMaxCUWidth*maxTileWidth;
2075        }
2076        if(m_iNumRowsMinus1<1)
2077        {
2078          maxTileHeight = m_iSourceHeight;
2079        }
2080        else
2081        {
2082          Int accRowHeight = 0;
2083          for(Int row=0; row<(m_iNumRowsMinus1); row++)
2084          {
2085            maxTileHeight = m_pRowHeight[row]>maxTileHeight ? m_pRowHeight[row]:maxTileHeight;
2086            accRowHeight += m_pRowHeight[row];
2087          }
2088          maxTileHeight = (heightInCU-accRowHeight)>maxTileHeight ? m_uiMaxCUHeight*(heightInCU-accRowHeight):m_uiMaxCUHeight*maxTileHeight;
2089        }
2090      }
2091      Int maxSizeInSamplesY = maxTileWidth*maxTileHeight;
2092      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/maxSizeInSamplesY-4;
2093    }
2094    else if(m_iWaveFrontSynchro)
2095    {
2096      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/((2*m_iSourceHeight+m_iSourceWidth)*m_uiMaxCUHeight)-4;
2097    }
2098    else if(m_sliceMode == 1)
2099    {
2100      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/(m_sliceArgument*m_uiMaxCUWidth*m_uiMaxCUHeight)-4;
2101    }
2102    else
2103    {
2104      m_minSpatialSegmentationIdc = 0;
2105    }
2106  }
2107#if SVC_EXTENSION
2108  }
2109#endif
2110  xConfirmPara( m_iWaveFrontSynchro < 0, "WaveFrontSynchro cannot be negative" );
2111#if !SVC_EXTENSION
2112  xConfirmPara( m_iWaveFrontSubstreams <= 0, "WaveFrontSubstreams must be positive" );
2113  xConfirmPara( m_iWaveFrontSubstreams > 1 && !m_iWaveFrontSynchro, "Must have WaveFrontSynchro > 0 in order to have WaveFrontSubstreams > 1" );
2114#endif
2115
2116  xConfirmPara( m_decodedPictureHashSEIEnabled<0 || m_decodedPictureHashSEIEnabled>3, "this hash type is not correct!\n");
2117
2118  if (m_toneMappingInfoSEIEnabled)
2119  {
2120    xConfirmPara( m_toneMapCodedDataBitDepth < 8 || m_toneMapCodedDataBitDepth > 14 , "SEIToneMapCodedDataBitDepth must be in rage 8 to 14");
2121    xConfirmPara( m_toneMapTargetBitDepth < 1 || (m_toneMapTargetBitDepth > 16 && m_toneMapTargetBitDepth < 255) , "SEIToneMapTargetBitDepth must be in rage 1 to 16 or equal to 255");
2122    xConfirmPara( m_toneMapModelId < 0 || m_toneMapModelId > 4 , "SEIToneMapModelId must be in rage 0 to 4");
2123    xConfirmPara( m_cameraIsoSpeedValue == 0, "SEIToneMapCameraIsoSpeedValue shall not be equal to 0");
2124    xConfirmPara( m_extendedRangeWhiteLevel < 100, "SEIToneMapExtendedRangeWhiteLevel should be greater than or equal to 100");
2125    xConfirmPara( m_nominalBlackLevelLumaCodeValue >= m_nominalWhiteLevelLumaCodeValue, "SEIToneMapNominalWhiteLevelLumaCodeValue shall be greater than SEIToneMapNominalBlackLevelLumaCodeValue");
2126    xConfirmPara( m_extendedWhiteLevelLumaCodeValue < m_nominalWhiteLevelLumaCodeValue, "SEIToneMapExtendedWhiteLevelLumaCodeValue shall be greater than or equal to SEIToneMapNominalWhiteLevelLumaCodeValue");
2127  }
2128
2129#if RC_SHVC_HARMONIZATION
2130  for ( Int layer=0; layer<m_numLayers; layer++ )
2131  {
2132    if ( m_acLayerCfg[layer].m_RCEnableRateControl )
2133    {
2134      if ( m_acLayerCfg[layer].m_RCForceIntraQP )
2135      {
2136        if ( m_acLayerCfg[layer].m_RCInitialQP == 0 )
2137        {
2138          printf( "\nInitial QP for rate control is not specified. Reset not to use force intra QP!" );
2139          m_acLayerCfg[layer].m_RCForceIntraQP = false;
2140        }
2141      }
2142    }
2143    xConfirmPara( m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n" );
2144  }
2145#else
2146  if ( m_RCEnableRateControl )
2147  {
2148    if ( m_RCForceIntraQP )
2149    {
2150      if ( m_RCInitialQP == 0 )
2151      {
2152        printf( "\nInitial QP for rate control is not specified. Reset not to use force intra QP!" );
2153        m_RCForceIntraQP = false;
2154      }
2155    }
2156    xConfirmPara( m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n" );
2157  }
2158#endif
2159
2160  xConfirmPara(!m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagValue, "CUTransquantBypassFlagValue cannot be 1 when TransquantBypassEnableFlag is 0");
2161
2162  xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2");
2163  if (m_framePackingSEIEnabled)
2164  {
2165    xConfirmPara(m_framePackingSEIType < 3 || m_framePackingSEIType > 5 , "SEIFramePackingType must be in rage 3 to 5");
2166  }
2167#if VPS_EXTN_DIRECT_REF_LAYERS
2168  xConfirmPara( (m_acLayerCfg[0].m_numSamplePredRefLayers != 0) && (m_acLayerCfg[0].m_numSamplePredRefLayers != -1), "Layer 0 cannot have any reference layers" );
2169  // NOTE: m_numSamplePredRefLayers  (for any layer) could be -1 (not signalled in cfg), in which case only the "previous layer" would be taken for reference
2170  for(Int layer = 1; layer < MAX_LAYERS; layer++)
2171  {
2172    xConfirmPara(m_acLayerCfg[layer].m_numSamplePredRefLayers > layer, "Cannot reference more layers than before current layer");
2173    for(Int i = 0; i < m_acLayerCfg[layer].m_numSamplePredRefLayers; i++)
2174    {
2175      xConfirmPara(m_acLayerCfg[layer].m_samplePredRefLayerIds[i] > layer, "Cannot reference higher layers");
2176      xConfirmPara(m_acLayerCfg[layer].m_samplePredRefLayerIds[i] == layer, "Cannot reference the current layer itself");
2177    }
2178  }
2179  xConfirmPara( (m_acLayerCfg[0].m_numMotionPredRefLayers != 0) && (m_acLayerCfg[0].m_numMotionPredRefLayers != -1), "Layer 0 cannot have any reference layers" );
2180  // NOTE: m_numMotionPredRefLayers  (for any layer) could be -1 (not signalled in cfg), in which case only the "previous layer" would be taken for reference
2181  for(Int layer = 1; layer < MAX_LAYERS; layer++)
2182  {
2183    xConfirmPara(m_acLayerCfg[layer].m_numMotionPredRefLayers > layer, "Cannot reference more layers than before current layer");
2184    for(Int i = 0; i < m_acLayerCfg[layer].m_numMotionPredRefLayers; i++)
2185    {
2186      xConfirmPara(m_acLayerCfg[layer].m_motionPredRefLayerIds[i] > layer, "Cannot reference higher layers");
2187      xConfirmPara(m_acLayerCfg[layer].m_motionPredRefLayerIds[i] == layer, "Cannot reference the current layer itself");
2188    }
2189  }
2190
2191  xConfirmPara( (m_acLayerCfg[0].m_numActiveRefLayers != 0) && (m_acLayerCfg[0].m_numActiveRefLayers != -1), "Layer 0 cannot have any active reference layers" );
2192  // NOTE: m_numActiveRefLayers  (for any layer) could be -1 (not signalled in cfg), in which case only the "previous layer" would be taken for reference
2193  for(Int layer = 1; layer < MAX_LAYERS; layer++)
2194  {
2195    Bool predEnabledFlag[MAX_LAYERS];
2196    for (Int refLayer = 0; refLayer < layer; refLayer++)
2197    {
2198      predEnabledFlag[refLayer] = false;
2199    }
2200    for(Int i = 0; i < m_acLayerCfg[layer].m_numSamplePredRefLayers; i++)
2201    {
2202      predEnabledFlag[m_acLayerCfg[layer].m_samplePredRefLayerIds[i]] = true;
2203    }
2204    for(Int i = 0; i < m_acLayerCfg[layer].m_numMotionPredRefLayers; i++)
2205    {
2206      predEnabledFlag[m_acLayerCfg[layer].m_motionPredRefLayerIds[i]] = true;
2207    }
2208    Int numDirectRefLayers = 0;
2209    for (Int refLayer = 0; refLayer < layer; refLayer++)
2210    {
2211      if (predEnabledFlag[refLayer] == true) numDirectRefLayers++;
2212    }
2213    xConfirmPara(m_acLayerCfg[layer].m_numActiveRefLayers > numDirectRefLayers, "Cannot reference more layers than NumDirectRefLayers");
2214    for(Int i = 0; i < m_acLayerCfg[layer].m_numActiveRefLayers; i++)
2215    {
2216      xConfirmPara(m_acLayerCfg[layer].m_predLayerIds[i] >= numDirectRefLayers, "Cannot reference higher layers");
2217    }
2218  }
2219#endif //VPS_EXTN_DIRECT_REF_LAYERS
2220#if M0040_ADAPTIVE_RESOLUTION_CHANGE
2221  if (m_adaptiveResolutionChange > 0)
2222  {
2223    xConfirmPara(m_numLayers != 2, "Adaptive resolution change works with 2 layers only");
2224    xConfirmPara(m_acLayerCfg[1].m_iIntraPeriod == 0 || (m_adaptiveResolutionChange % m_acLayerCfg[1].m_iIntraPeriod) != 0, "Adaptive resolution change must happen at enhancement layer RAP picture");
2225  }
2226#endif
2227#if HIGHER_LAYER_IRAP_SKIP_FLAG
2228  if (m_adaptiveResolutionChange > 0)
2229  {
2230    xConfirmPara(m_crossLayerIrapAlignFlag != 0, "Cross layer IRAP alignment must be disabled when using adaptive resolution change.");
2231  }
2232  if (m_skipPictureAtArcSwitch)
2233  {
2234    xConfirmPara(m_adaptiveResolutionChange <= 0, "Skip picture at ARC switching only works when Adaptive Resolution Change is active (AdaptiveResolutionChange > 0)");
2235  }
2236#endif
2237#if N0120_MAX_TID_REF_CFG
2238  for (UInt layer=0; layer < MAX_LAYERS-1; layer++)
2239  {
2240    xConfirmPara(m_acLayerCfg[layer].m_maxTidIlRefPicsPlus1 < 0 || m_acLayerCfg[layer].m_maxTidIlRefPicsPlus1 > 7, "MaxTidIlRefPicsPlus1 must be in range 0 to 7");
2241  }
2242#endif
2243#if AUXILIARY_PICTURES
2244  for (UInt layer=0; layer < MAX_LAYERS-1; layer++)
2245  {
2246    xConfirmPara(m_acLayerCfg[layer].m_auxId < 0 || m_acLayerCfg[layer].m_auxId > 4, "AuxId must be in range 0 to 4");
2247    xConfirmPara(m_acLayerCfg[layer].m_auxId > 0 && m_acLayerCfg[layer].m_chromaFormatIDC != CHROMA_400, "Auxiliary picture must be monochrome picture");
2248  }
2249#endif
2250#undef xConfirmPara
2251  if (check_failed)
2252  {
2253    exit(EXIT_FAILURE);
2254  }
2255}
2256
2257/** \todo use of global variables should be removed later
2258 */
2259#if LAYER_CTB
2260Void TAppEncCfg::xSetGlobal(UInt layerId)
2261{
2262  // set max CU width & height
2263  g_auiLayerMaxCUWidth[layerId]  = m_acLayerCfg[layerId].m_uiMaxCUWidth;
2264  g_auiLayerMaxCUHeight[layerId] = m_acLayerCfg[layerId].m_uiMaxCUHeight;
2265 
2266  // compute actual CU depth with respect to config depth and max transform size
2267  g_auiLayerAddCUDepth[layerId]  = 0;
2268  while( (m_acLayerCfg[layerId].m_uiMaxCUWidth>>m_acLayerCfg[layerId].m_uiMaxCUDepth) > ( 1 << ( m_acLayerCfg[layerId].m_uiQuadtreeTULog2MinSize + g_auiLayerAddCUDepth[layerId] )  ) ) g_auiLayerAddCUDepth[layerId]++;
2269 
2270  m_acLayerCfg[layerId].m_uiMaxCUDepth += g_auiLayerAddCUDepth[layerId];
2271  g_auiLayerAddCUDepth[layerId]++;
2272  g_auiLayerMaxCUDepth[layerId] = m_acLayerCfg[layerId].m_uiMaxCUDepth;
2273 
2274#if O0194_DIFFERENT_BITDEPTH_EL_BL
2275  // set internal bit-depth to constant value to make sure to be updated later
2276  g_bitDepthY = -1;
2277  g_bitDepthC = -1;
2278 
2279  g_uiPCMBitDepthLuma = -1;
2280  g_uiPCMBitDepthChroma = -1;
2281#else
2282  // set internal bit-depth and constants
2283  g_bitDepthY = m_internalBitDepthY;
2284  g_bitDepthC = m_internalBitDepthC;
2285 
2286  g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_inputBitDepthY : m_internalBitDepthY;
2287  g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_inputBitDepthC : m_internalBitDepthC;
2288#endif
2289}
2290#else
2291Void TAppEncCfg::xSetGlobal()
2292{
2293  // set max CU width & height
2294  g_uiMaxCUWidth  = m_uiMaxCUWidth;
2295  g_uiMaxCUHeight = m_uiMaxCUHeight;
2296 
2297  // compute actual CU depth with respect to config depth and max transform size
2298  g_uiAddCUDepth  = 0;
2299  while( (m_uiMaxCUWidth>>m_uiMaxCUDepth) > ( 1 << ( m_uiQuadtreeTULog2MinSize + g_uiAddCUDepth )  ) ) g_uiAddCUDepth++;
2300 
2301  m_uiMaxCUDepth += g_uiAddCUDepth;
2302  g_uiAddCUDepth++;
2303  g_uiMaxCUDepth = m_uiMaxCUDepth;
2304 
2305#if O0194_DIFFERENT_BITDEPTH_EL_BL
2306  // set internal bit-depth to constant value to make sure to be updated later
2307  g_bitDepthY = -1;
2308  g_bitDepthC = -1;
2309 
2310  g_uiPCMBitDepthLuma = -1;
2311  g_uiPCMBitDepthChroma = -1;
2312#else
2313  g_bitDepthY = m_internalBitDepthY;
2314  g_bitDepthC = m_internalBitDepthC;
2315 
2316  g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_inputBitDepthY : m_internalBitDepthY;
2317  g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_inputBitDepthC : m_internalBitDepthC;
2318#endif
2319}
2320#endif
2321
2322Void TAppEncCfg::xPrintParameter()
2323{
2324  printf("\n");
2325#if SVC_EXTENSION 
2326  printf("Total number of layers        : %d\n", m_numLayers       );
2327#if SCALABILITY_MASK_E0104
2328  printf("Multiview                     : %d\n", m_scalabilityMask[1] );
2329  printf("Scalable                      : %d\n", m_scalabilityMask[2] );
2330#if AVC_BASE
2331  printf("Base layer                    : %s\n", m_avcBaseLayerFlag ? "AVC" : "HEVC");
2332#endif
2333#if AUXILIARY_PICTURES
2334  printf("Auxiliary pictures            : %d\n", m_scalabilityMask[3] );
2335#endif
2336#else
2337  printf("Multiview                     : %d\n", m_scalabilityMask[0] );
2338  printf("Scalable                      : %d\n", m_scalabilityMask[1] );
2339#endif
2340#if M0040_ADAPTIVE_RESOLUTION_CHANGE
2341  printf("Adaptive Resolution Change    : %d\n", m_adaptiveResolutionChange );
2342#endif
2343#if HIGHER_LAYER_IRAP_SKIP_FLAG
2344  printf("Skip picture at ARC switch    : %d\n", m_skipPictureAtArcSwitch );
2345#endif
2346#if O0223_PICTURE_TYPES_ALIGN_FLAG
2347  printf("Align picture type            : %d\n", m_crossLayerPictureTypeAlignFlag );
2348#endif
2349#if N0147_IRAP_ALIGN_FLAG
2350  printf("Cross layer IRAP alignment    : %d\n", m_crossLayerIrapAlignFlag );
2351#endif
2352#if O0194_WEIGHTED_PREDICTION_CGS
2353  printf("InterLayerWeightedPred        : %d\n", m_useInterLayerWeightedPred );
2354#endif
2355  for(UInt layer=0; layer<m_numLayers; layer++)
2356  {
2357    printf("=== Layer %d settings === \n", layer);
2358#if AVC_SYNTAX
2359    m_acLayerCfg[layer].xPrintParameter( layer );
2360#else
2361    m_acLayerCfg[layer].xPrintParameter();
2362#endif
2363    printf("\n");
2364  }
2365  printf("=== Common configuration settings === \n");
2366  printf("Bitstream      File          : %s\n", m_pBitstreamFile      );
2367#else
2368  printf("Input          File          : %s\n", m_pchInputFile          );
2369  printf("Bitstream      File          : %s\n", m_pchBitstreamFile      );
2370  printf("Reconstruction File          : %s\n", m_pchReconFile          );
2371  printf("Real     Format              : %dx%d %dHz\n", m_iSourceWidth - m_confLeft - m_confRight, m_iSourceHeight - m_confTop - m_confBottom, m_iFrameRate );
2372  printf("Internal Format              : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate );
2373#endif
2374  if (m_isField)
2375  {
2376    printf("Frame/Field          : Field based coding\n");
2377    printf("Field index          : %u - %d (%d fields)\n", m_FrameSkip, m_FrameSkip+m_framesToBeEncoded-1, m_framesToBeEncoded );
2378    if (m_isTopFieldFirst)
2379    {
2380      printf("Field Order            : Top field first\n");
2381    }
2382    else
2383    {
2384      printf("Field Order            : Bottom field first\n");
2385    }
2386  }
2387  else
2388  {
2389    printf("Frame/Field                  : Frame based coding\n");
2390    printf("Frame index                  : %u - %d (%d frames)\n", m_FrameSkip, m_FrameSkip+m_framesToBeEncoded-1, m_framesToBeEncoded );
2391  }
2392#if !LAYER_CTB
2393  printf("CU size / depth              : %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth );
2394  printf("RQT trans. size (min / max)  : %d / %d\n", 1 << m_uiQuadtreeTULog2MinSize, 1 << m_uiQuadtreeTULog2MaxSize );
2395  printf("Max RQT depth inter          : %d\n", m_uiQuadtreeTUMaxDepthInter);
2396  printf("Max RQT depth intra          : %d\n", m_uiQuadtreeTUMaxDepthIntra);
2397#endif
2398  printf("Min PCM size                 : %d\n", 1 << m_uiPCMLog2MinSize);
2399  printf("Motion search range          : %d\n", m_iSearchRange );
2400#if !SVC_EXTENSION
2401  printf("Intra period                 : %d\n", m_iIntraPeriod );
2402#endif
2403  printf("Decoding refresh type        : %d\n", m_iDecodingRefreshType );
2404#if !SVC_EXTENSION
2405  printf("QP                           : %5.2f\n", m_fQP );
2406#endif
2407  printf("Max dQP signaling depth      : %d\n", m_iMaxCuDQPDepth);
2408
2409  printf("Cb QP Offset                 : %d\n", m_cbQpOffset   );
2410  printf("Cr QP Offset                 : %d\n", m_crQpOffset);
2411
2412  printf("QP adaptation                : %d (range=%d)\n", m_bUseAdaptiveQP, (m_bUseAdaptiveQP ? m_iQPAdaptationRange : 0) );
2413  printf("GOP size                     : %d\n", m_iGOPSize );
2414#if !O0194_DIFFERENT_BITDEPTH_EL_BL
2415  printf("Internal bit depth           : (Y:%d, C:%d)\n", m_internalBitDepthY, m_internalBitDepthC );
2416  printf("PCM sample bit depth         : (Y:%d, C:%d)\n", g_uiPCMBitDepthLuma, g_uiPCMBitDepthChroma );
2417#endif
2418#if O0215_PHASE_ALIGNMENT
2419  printf("Cross-layer sample alignment : %d\n", m_phaseAlignFlag);
2420#endif
2421#if !RC_SHVC_HARMONIZATION
2422  printf("RateControl                  : %d\n", m_RCEnableRateControl );
2423  if(m_RCEnableRateControl)
2424  {
2425    printf("TargetBitrate                : %d\n", m_RCTargetBitrate );
2426    printf("KeepHierarchicalBit          : %d\n", m_RCKeepHierarchicalBit );
2427    printf("LCULevelRC                   : %d\n", m_RCLCULevelRC );
2428    printf("UseLCUSeparateModel          : %d\n", m_RCUseLCUSeparateModel );
2429    printf("InitialQP                    : %d\n", m_RCInitialQP );
2430    printf("ForceIntraQP                 : %d\n", m_RCForceIntraQP );
2431  }
2432#endif
2433
2434  printf("Max Num Merge Candidates     : %d\n", m_maxNumMergeCand);
2435  printf("\n");
2436 
2437  printf("TOOL CFG: ");
2438#if !O0194_DIFFERENT_BITDEPTH_EL_BL
2439  printf("IBD:%d ", g_bitDepthY > m_inputBitDepthY || g_bitDepthC > m_inputBitDepthC);
2440#endif
2441  printf("HAD:%d ", m_bUseHADME           );
2442  printf("SRD:%d ", m_bUseSBACRD          );
2443  printf("RDQ:%d ", m_useRDOQ            );
2444  printf("RDQTS:%d ", m_useRDOQTS        );
2445  printf("RDpenalty:%d ", m_rdPenalty  );
2446  printf("SQP:%d ", m_uiDeltaQpRD         );
2447  printf("ASR:%d ", m_bUseASR             );
2448  printf("FEN:%d ", m_bUseFastEnc         );
2449  printf("ECU:%d ", m_bUseEarlyCU         );
2450  printf("FDM:%d ", m_useFastDecisionForMerge );
2451  printf("CFM:%d ", m_bUseCbfFastMode         );
2452  printf("ESD:%d ", m_useEarlySkipDetection  );
2453#if FAST_INTRA_SHVC
2454  printf("FIS:%d ", m_useFastIntraScalable  );
2455#endif
2456  printf("RQT:%d ", 1     );
2457  printf("TransformSkip:%d ",     m_useTransformSkip              );
2458  printf("TransformSkipFast:%d ", m_useTransformSkipFast       );
2459  printf("Slice: M=%d ", m_sliceMode);
2460  if (m_sliceMode!=0)
2461  {
2462    printf("A=%d ", m_sliceArgument);
2463  }
2464  printf("SliceSegment: M=%d ",m_sliceSegmentMode);
2465  if (m_sliceSegmentMode!=0)
2466  {
2467    printf("A=%d ", m_sliceSegmentArgument);
2468  }
2469  printf("CIP:%d ", m_bUseConstrainedIntraPred);
2470  printf("SAO:%d ", (m_bUseSAO)?(1):(0));
2471#if !LAYER_CTB
2472  printf("PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0);
2473#endif
2474#if !HM_CLEANUP_SAO
2475  printf("SAOLcuBasedOptimization:%d ", (m_saoLcuBasedOptimization)?(1):(0));
2476#endif
2477  printf("LosslessCuEnabled:%d ", (m_useLossless)? 1:0 );
2478  printf("WPP:%d ", (Int)m_useWeightedPred);
2479  printf("WPB:%d ", (Int)m_useWeightedBiPred);
2480  printf("PME:%d ", m_log2ParallelMergeLevel);
2481#if !SVC_EXTENSION
2482  printf(" WaveFrontSynchro:%d WaveFrontSubstreams:%d",
2483          m_iWaveFrontSynchro, m_iWaveFrontSubstreams);
2484#endif
2485  printf(" ScalingList:%d ", m_useScalingListId );
2486  printf("TMVPMode:%d ", m_TMVPModeId     );
2487#if ADAPTIVE_QP_SELECTION
2488  printf("AQpS:%d", m_bUseAdaptQpSelect   );
2489#endif
2490
2491  printf(" SignBitHidingFlag:%d ", m_signHideFlag);
2492#if SVC_EXTENSION
2493  printf("RecalQP:%d ", m_recalculateQPAccordingToLambda ? 1 : 0 );
2494  printf("EL_RAP_SliceType: %d ", m_elRapSliceBEnabled);
2495  printf("REF_IDX_ME_ZEROMV: %d ", REF_IDX_ME_ZEROMV);
2496  printf("ENCODER_FAST_MODE: %d ", ENCODER_FAST_MODE);
2497  printf("REF_IDX_MFM: %d ", REF_IDX_MFM);
2498  printf("O0194_DIFFERENT_BITDEPTH_EL_BL: %d ", O0194_DIFFERENT_BITDEPTH_EL_BL);
2499  printf("O0194_JOINT_US_BITSHIFT: %d ", O0194_JOINT_US_BITSHIFT);
2500#else
2501  printf("RecalQP:%d", m_recalculateQPAccordingToLambda ? 1 : 0 );
2502#endif
2503  printf("\n\n");
2504 
2505  fflush(stdout);
2506}
2507
2508Bool confirmPara(Bool bflag, const Char* message)
2509{
2510  if (!bflag)
2511    return false;
2512 
2513  printf("Error: %s\n",message);
2514  return true;
2515}
2516
2517#if SVC_EXTENSION
2518Void TAppEncCfg::cfgStringToArray(Int **arr, string cfgString, Int numEntries, const char* logString)
2519{
2520  Char *tempChar = cfgString.empty() ? NULL : strdup(cfgString.c_str());
2521  if( numEntries > 0 )
2522  {
2523    Char *arrayEntry;
2524    Int i = 0;
2525    *arr = new Int[numEntries];
2526
2527    arrayEntry = strtok( tempChar, " ,");
2528    while(arrayEntry != NULL)
2529    {
2530      if( i >= numEntries )
2531      {
2532        printf( "%s: The number of entries specified is larger than the allowed number.\n", logString );
2533        exit( EXIT_FAILURE );
2534      }
2535      *( *arr + i ) = atoi( arrayEntry );
2536      arrayEntry = strtok(NULL, " ,");
2537      i++;
2538    }
2539    if( i < numEntries )
2540    {
2541      printf( "%s: Some entries are not specified.\n", logString );
2542      exit( EXIT_FAILURE );
2543    }
2544  }
2545  else
2546  {
2547    *arr = NULL;
2548  }
2549}
2550
2551#endif //SVC_EXTENSION
2552//! \}
Note: See TracBrowser for help on using the repository browser.