source: SHVCSoftware/branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.cpp @ 859

Last change on this file since 859 was 859, checked in by seregin, 10 years ago

fix CRI SEI file check, reported by Ramasubramonian, Adarsh Krishnan <aramasub@…>

  • Property svn:eol-style set to native
File size: 168.5 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license. 
5 *
6 * Copyright (c) 2010-2014, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TAppEncCfg.cpp
35    \brief    Handle encoder configuration parameters
36*/
37
38#include <stdlib.h>
39#include <cassert>
40#include <cstring>
41#include <string>
42#include "TLibCommon/TComRom.h"
43#include "TAppEncCfg.h"
44
45static istream& operator>>(istream &, Level::Name &);
46static istream& operator>>(istream &, Level::Tier &);
47static istream& operator>>(istream &, Profile::Name &);
48
49#include "TAppCommon/program_options_lite.h"
50#include "TLibEncoder/TEncRateCtrl.h"
51#ifdef WIN32
52#define strdup _strdup
53#endif
54
55using namespace std;
56namespace po = df::program_options_lite;
57
58//! \ingroup TAppEncoder
59//! \{
60
61// ====================================================================================================================
62// Constructor / destructor / initialization / destroy
63// ====================================================================================================================
64
65#if SVC_EXTENSION
66TAppEncCfg::TAppEncCfg()
67: m_pBitstreamFile()
68#if AVC_BASE
69, m_avcBaseLayerFlag(0)
70#endif
71, m_maxTidRefPresentFlag(1)
72, m_scalingListFile()
73, m_elRapSliceBEnabled(0)
74{
75  for(UInt layer=0; layer<MAX_LAYERS; layer++)
76  {
77    m_acLayerCfg[layer].setAppEncCfg(this);
78  }
79  memset( m_scalabilityMask, 0, sizeof(m_scalabilityMask) );
80}
81#else
82TAppEncCfg::TAppEncCfg()
83: m_pchInputFile()
84, m_pchBitstreamFile()
85, m_pchReconFile()
86, m_pchdQPFile()
87, m_scalingListFile()
88{
89  m_aidQP = NULL;
90  m_startOfCodedInterval = NULL;
91  m_codedPivotValue = NULL;
92  m_targetPivotValue = NULL;
93#if Q0074_COLOUR_REMAPPING_SEI
94  for( Int c=0 ; c<3 ; c++)
95  {
96    m_colourRemapSEIPreLutCodedValue[c]   = NULL;
97    m_colourRemapSEIPreLutTargetValue[c]  = NULL;
98    m_colourRemapSEIPostLutCodedValue[c]  = NULL;
99    m_colourRemapSEIPostLutTargetValue[c] = NULL;
100  }
101#endif
102}
103#endif
104
105TAppEncCfg::~TAppEncCfg()
106{
107#if SVC_EXTENSION
108  if( m_pBitstreamFile )
109  {
110    free(m_pBitstreamFile);
111    m_pBitstreamFile = NULL;
112  }
113#else 
114  if ( m_aidQP )
115  {
116    delete[] m_aidQP;
117  }
118  if ( m_startOfCodedInterval )
119  {
120    delete[] m_startOfCodedInterval;
121    m_startOfCodedInterval = NULL;
122  }
123   if ( m_codedPivotValue )
124  {
125    delete[] m_codedPivotValue;
126    m_codedPivotValue = NULL;
127  }
128  if ( m_targetPivotValue )
129  {
130    delete[] m_targetPivotValue;
131    m_targetPivotValue = NULL;
132  }
133  free(m_pchInputFile);
134  free(m_pchBitstreamFile);
135#endif
136#if !SVC_EXTENSION 
137  free(m_pchReconFile);
138  free(m_pchdQPFile);
139#if Q0074_COLOUR_REMAPPING_SEI
140  for( Int c=0 ; c<3 ; c++)
141  {
142    if ( m_colourRemapSEIPreLutCodedValue[c] )
143    {
144      delete[] m_colourRemapSEIPreLutCodedValue[c];
145    }
146    if ( m_colourRemapSEIPreLutTargetValue[c] )
147    {
148      delete[] m_colourRemapSEIPreLutTargetValue[c];
149    }
150    if ( m_colourRemapSEIPostLutCodedValue[c] )
151    {
152      delete[] m_colourRemapSEIPostLutCodedValue[c];
153    }
154    if ( m_colourRemapSEIPostLutTargetValue[c] )
155    {
156      delete[] m_colourRemapSEIPostLutTargetValue[c];
157    }
158  }
159#endif
160#endif
161  free(m_scalingListFile);
162}
163
164Void TAppEncCfg::create()
165{
166}
167
168Void TAppEncCfg::destroy()
169{
170#if VPS_EXTN_DIRECT_REF_LAYERS
171  for(Int layer = 0; layer < MAX_LAYERS; layer++)
172  {
173    if( m_acLayerCfg[layer].m_numSamplePredRefLayers > 0 )
174    {
175      delete [] m_acLayerCfg[layer].m_samplePredRefLayerIds;
176      m_acLayerCfg[layer].m_samplePredRefLayerIds = NULL;
177    }
178    if( m_acLayerCfg[layer].m_numMotionPredRefLayers > 0 )
179    {
180      delete [] m_acLayerCfg[layer].m_motionPredRefLayerIds;
181      m_acLayerCfg[layer].m_motionPredRefLayerIds = NULL;
182    }
183    if( m_acLayerCfg[layer].m_numActiveRefLayers > 0 )
184    {
185      delete [] m_acLayerCfg[layer].m_predLayerIds;
186      m_acLayerCfg[layer].m_predLayerIds = NULL;
187    }
188  }
189#endif
190}
191
192std::istringstream &operator>>(std::istringstream &in, GOPEntry &entry)     //input
193{
194  in>>entry.m_sliceType;
195  in>>entry.m_POC;
196  in>>entry.m_QPOffset;
197  in>>entry.m_QPFactor;
198  in>>entry.m_tcOffsetDiv2;
199  in>>entry.m_betaOffsetDiv2;
200  in>>entry.m_temporalId;
201  in>>entry.m_numRefPicsActive;
202  in>>entry.m_numRefPics;
203  for ( Int i = 0; i < entry.m_numRefPics; i++ )
204  {
205    in>>entry.m_referencePics[i];
206  }
207  in>>entry.m_interRPSPrediction;
208#if AUTO_INTER_RPS
209  if (entry.m_interRPSPrediction==1)
210  {
211    in>>entry.m_deltaRPS;
212    in>>entry.m_numRefIdc;
213    for ( Int i = 0; i < entry.m_numRefIdc; i++ )
214    {
215      in>>entry.m_refIdc[i];
216    }
217  }
218  else if (entry.m_interRPSPrediction==2)
219  {
220    in>>entry.m_deltaRPS;
221  }
222#else
223  if (entry.m_interRPSPrediction)
224  {
225    in>>entry.m_deltaRPS;
226    in>>entry.m_numRefIdc;
227    for ( Int i = 0; i < entry.m_numRefIdc; i++ )
228    {
229      in>>entry.m_refIdc[i];
230    }
231  }
232#endif
233  return in;
234}
235
236#if AUXILIARY_PICTURES
237static inline ChromaFormat numberToChromaFormat(const Int val)
238{
239  switch (val)
240  {
241    case 400: return CHROMA_400; break;
242    case 420: return CHROMA_420; break;
243    case 422: return CHROMA_422; break;
244    case 444: return CHROMA_444; break;
245    default:  return NUM_CHROMA_FORMAT;
246  }
247}
248#endif
249
250#if SVC_EXTENSION
251void TAppEncCfg::getDirFilename(string& filename, string& dir, const string path)
252{
253  size_t pos = path.find_last_of("\\");
254  if(pos != std::string::npos)
255  {
256    filename.assign(path.begin() + pos + 1, path.end());
257    dir.assign(path.begin(), path.begin() + pos + 1);
258  }
259  else
260  {
261    pos = path.find_last_of("/");
262    if(pos != std::string::npos)
263    {
264      filename.assign(path.begin() + pos + 1, path.end());
265      dir.assign(path.begin(), path.begin() + pos + 1);
266    }
267    else
268    {
269      filename = path;
270      dir.assign("");
271    }
272  }
273}
274#endif
275
276static const struct MapStrToProfile {
277  const Char* str;
278  Profile::Name value;
279} strToProfile[] = {
280  {"none", Profile::NONE},
281  {"main", Profile::MAIN},
282  {"main10", Profile::MAIN10},
283  {"main-still-picture", Profile::MAINSTILLPICTURE},
284};
285
286static const struct MapStrToTier {
287  const Char* str;
288  Level::Tier value;
289} strToTier[] = {
290  {"main", Level::MAIN},
291  {"high", Level::HIGH},
292};
293
294static const struct MapStrToLevel {
295  const Char* str;
296  Level::Name value;
297} strToLevel[] = {
298  {"none",Level::NONE},
299  {"1",   Level::LEVEL1},
300  {"2",   Level::LEVEL2},
301  {"2.1", Level::LEVEL2_1},
302  {"3",   Level::LEVEL3},
303  {"3.1", Level::LEVEL3_1},
304  {"4",   Level::LEVEL4},
305  {"4.1", Level::LEVEL4_1},
306  {"5",   Level::LEVEL5},
307  {"5.1", Level::LEVEL5_1},
308  {"5.2", Level::LEVEL5_2},
309  {"6",   Level::LEVEL6},
310  {"6.1", Level::LEVEL6_1},
311  {"6.2", Level::LEVEL6_2},
312};
313
314template<typename T, typename P>
315static istream& readStrToEnum(P map[], unsigned long mapLen, istream &in, T &val)
316{
317  string str;
318  in >> str;
319
320  for (Int i = 0; i < mapLen; i++)
321  {
322    if (str == map[i].str)
323    {
324      val = map[i].value;
325      goto found;
326    }
327  }
328  /* not found */
329  in.setstate(ios::failbit);
330found:
331  return in;
332}
333
334static istream& operator>>(istream &in, Profile::Name &profile)
335{
336  return readStrToEnum(strToProfile, sizeof(strToProfile)/sizeof(*strToProfile), in, profile);
337}
338
339static istream& operator>>(istream &in, Level::Tier &tier)
340{
341  return readStrToEnum(strToTier, sizeof(strToTier)/sizeof(*strToTier), in, tier);
342}
343
344static istream& operator>>(istream &in, Level::Name &level)
345{
346  return readStrToEnum(strToLevel, sizeof(strToLevel)/sizeof(*strToLevel), in, level);
347}
348
349// ====================================================================================================================
350// Public member functions
351// ====================================================================================================================
352
353/** \param  argc        number of arguments
354    \param  argv        array of arguments
355    \retval             true when success
356 */
357Bool TAppEncCfg::parseCfg( Int argc, Char* argv[] )
358{
359  Bool do_help = false;
360 
361#if SVC_EXTENSION
362  string  cfg_LayerCfgFile   [MAX_LAYERS];
363  string  cfg_BitstreamFile;
364  string* cfg_InputFile      [MAX_LAYERS];
365  string* cfg_ReconFile      [MAX_LAYERS];
366  Double* cfg_fQP            [MAX_LAYERS];
367#if REPN_FORMAT_IN_VPS
368  Int*    cfg_repFormatIdx  [MAX_LAYERS];
369#endif
370  Int*    cfg_SourceWidth   [MAX_LAYERS]; 
371  Int*    cfg_SourceHeight  [MAX_LAYERS];
372  Int*    cfg_FrameRate     [MAX_LAYERS];
373  Int*    cfg_IntraPeriod   [MAX_LAYERS];
374  Int*    cfg_conformanceMode  [MAX_LAYERS];
375#if LAYER_CTB
376  // coding unit (CU) definition
377  UInt*      cfg_uiMaxCUWidth[MAX_LAYERS];                                   ///< max. CU width in pixel
378  UInt*      cfg_uiMaxCUHeight[MAX_LAYERS];                                  ///< max. CU height in pixel
379  UInt*      cfg_uiMaxCUDepth[MAX_LAYERS];                                   ///< max. CU depth
380 
381  // transfom unit (TU) definition
382  UInt*      cfg_uiQuadtreeTULog2MaxSize[MAX_LAYERS];
383  UInt*      cfg_uiQuadtreeTULog2MinSize[MAX_LAYERS];
384 
385  UInt*      cfg_uiQuadtreeTUMaxDepthInter[MAX_LAYERS];
386  UInt*      cfg_uiQuadtreeTUMaxDepthIntra[MAX_LAYERS];
387#endif
388#if AUXILIARY_PICTURES
389  Int      cfg_tmpChromaFormatIDC  [MAX_LAYERS];
390  Int      cfg_tmpInputChromaFormat[MAX_LAYERS];
391  Int*     cfg_auxId               [MAX_LAYERS];
392#endif
393#if VPS_EXTN_DIRECT_REF_LAYERS
394  Int*    cfg_numSamplePredRefLayers  [MAX_LAYERS];
395  string  cfg_samplePredRefLayerIds   [MAX_LAYERS];
396  string* cfg_samplePredRefLayerIdsPtr[MAX_LAYERS];
397  Int*    cfg_numMotionPredRefLayers  [MAX_LAYERS];
398  string  cfg_motionPredRefLayerIds   [MAX_LAYERS];
399  string* cfg_motionPredRefLayerIdsPtr[MAX_LAYERS];
400  Int*    cfg_numActiveRefLayers [MAX_LAYERS];
401  string  cfg_predLayerIds       [MAX_LAYERS];
402  string* cfg_predLayerIdsPtr    [MAX_LAYERS];
403#endif
404#if O0098_SCALED_REF_LAYER_ID
405  string    cfg_scaledRefLayerId [MAX_LAYERS];
406#endif
407  string    cfg_scaledRefLayerLeftOffset [MAX_LAYERS];
408  string    cfg_scaledRefLayerTopOffset [MAX_LAYERS];
409  string    cfg_scaledRefLayerRightOffset [MAX_LAYERS];
410  string    cfg_scaledRefLayerBottomOffset [MAX_LAYERS];
411  Int*      cfg_numScaledRefLayerOffsets[MAX_LAYERS];
412#if REF_REGION_OFFSET
413  string    cfg_scaledRefLayerOffsetPresentFlag [MAX_LAYERS];
414  string    cfg_refRegionOffsetPresentFlag      [MAX_LAYERS];
415  string    cfg_refRegionLeftOffset   [MAX_LAYERS];
416  string    cfg_refRegionTopOffset    [MAX_LAYERS];
417  string    cfg_refRegionRightOffset  [MAX_LAYERS];
418  string    cfg_refRegionBottomOffset [MAX_LAYERS];
419#endif
420#if R0209_GENERIC_PHASE
421  string    cfg_resamplePhaseSetPresentFlag [MAX_LAYERS];
422  string    cfg_phaseHorLuma   [MAX_LAYERS];
423  string    cfg_phaseVerLuma   [MAX_LAYERS];
424  string    cfg_phaseHorChroma [MAX_LAYERS];
425  string    cfg_phaseVerChroma [MAX_LAYERS];
426#else
427#if P0312_VERT_PHASE_ADJ
428  string    cfg_vertPhasePositionEnableFlag[MAX_LAYERS];
429#endif
430#endif
431
432#if O0098_SCALED_REF_LAYER_ID
433  string*    cfg_scaledRefLayerIdPtr           [MAX_LAYERS];
434#endif
435  string*    cfg_scaledRefLayerLeftOffsetPtr   [MAX_LAYERS];
436  string*    cfg_scaledRefLayerTopOffsetPtr    [MAX_LAYERS];
437  string*    cfg_scaledRefLayerRightOffsetPtr  [MAX_LAYERS];
438  string*    cfg_scaledRefLayerBottomOffsetPtr [MAX_LAYERS];
439#if REF_REGION_OFFSET
440  string*    cfg_scaledRefLayerOffsetPresentFlagPtr [MAX_LAYERS];
441  string*    cfg_refRegionOffsetPresentFlagPtr      [MAX_LAYERS];
442  string*    cfg_refRegionLeftOffsetPtr   [MAX_LAYERS];
443  string*    cfg_refRegionTopOffsetPtr    [MAX_LAYERS];
444  string*    cfg_refRegionRightOffsetPtr  [MAX_LAYERS];
445  string*    cfg_refRegionBottomOffsetPtr [MAX_LAYERS];
446#endif
447#if R0209_GENERIC_PHASE
448  string*    cfg_resamplePhaseSetPresentFlagPtr [MAX_LAYERS];
449  string*    cfg_phaseHorLumaPtr   [MAX_LAYERS];
450  string*    cfg_phaseVerLumaPtr   [MAX_LAYERS];
451  string*    cfg_phaseHorChromaPtr [MAX_LAYERS];
452  string*    cfg_phaseVerChromaPtr [MAX_LAYERS];
453#endif
454#if P0312_VERT_PHASE_ADJ
455  string*    cfg_vertPhasePositionEnableFlagPtr[MAX_LAYERS];
456#endif
457
458#if RC_SHVC_HARMONIZATION
459  Bool*   cfg_RCEnableRateControl  [MAX_LAYERS];
460  Int*    cfg_RCTargetBitRate      [MAX_LAYERS];
461  Bool*   cfg_RCKeepHierarchicalBit[MAX_LAYERS];
462  Bool*   cfg_RCLCULevelRC         [MAX_LAYERS];
463  Bool*   cfg_RCUseLCUSeparateModel[MAX_LAYERS];
464  Int*    cfg_RCInitialQP          [MAX_LAYERS];
465  Bool*   cfg_RCForceIntraQP       [MAX_LAYERS];
466#endif
467#if O0194_DIFFERENT_BITDEPTH_EL_BL
468  Int*    cfg_InputBitDepthY    [MAX_LAYERS];
469  Int*    cfg_InternalBitDepthY [MAX_LAYERS];
470  Int*    cfg_InputBitDepthC    [MAX_LAYERS];
471  Int*    cfg_InternalBitDepthC [MAX_LAYERS];
472  Int*    cfg_OutputBitDepthY   [MAX_LAYERS];
473  Int*    cfg_OutputBitDepthC   [MAX_LAYERS];
474#endif
475  Int*    cfg_maxTidIlRefPicsPlus1[MAX_LAYERS]; 
476#if Q0074_COLOUR_REMAPPING_SEI
477  string* cfg_colourRemapSEIFile[MAX_LAYERS];
478#endif
479  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
480  {
481    cfg_InputFile[layer]    = &m_acLayerCfg[layer].m_cInputFile;
482    cfg_ReconFile[layer]    = &m_acLayerCfg[layer].m_cReconFile;
483    cfg_fQP[layer]          = &m_acLayerCfg[layer].m_fQP;
484#if Q0074_COLOUR_REMAPPING_SEI
485    cfg_colourRemapSEIFile[layer] = &m_acLayerCfg[layer].m_colourRemapSEIFile;
486#endif
487#if REPN_FORMAT_IN_VPS
488    cfg_repFormatIdx[layer] = &m_acLayerCfg[layer].m_repFormatIdx;
489#endif
490    cfg_SourceWidth[layer]  = &m_acLayerCfg[layer].m_iSourceWidth;
491    cfg_SourceHeight[layer] = &m_acLayerCfg[layer].m_iSourceHeight;
492    cfg_FrameRate[layer]    = &m_acLayerCfg[layer].m_iFrameRate; 
493    cfg_IntraPeriod[layer]  = &m_acLayerCfg[layer].m_iIntraPeriod; 
494    cfg_conformanceMode[layer] = &m_acLayerCfg[layer].m_conformanceMode;
495#if LAYER_CTB
496    // coding unit (CU) definition
497    cfg_uiMaxCUWidth[layer]  = &m_acLayerCfg[layer].m_uiMaxCUWidth;
498    cfg_uiMaxCUHeight[layer] = &m_acLayerCfg[layer].m_uiMaxCUHeight;
499    cfg_uiMaxCUDepth[layer]  = &m_acLayerCfg[layer].m_uiMaxCUDepth;
500
501    // transfom unit (TU) definition.
502    cfg_uiQuadtreeTULog2MaxSize[layer] = &m_acLayerCfg[layer].m_uiQuadtreeTULog2MaxSize;
503    cfg_uiQuadtreeTULog2MinSize[layer] = &m_acLayerCfg[layer].m_uiQuadtreeTULog2MinSize;
504
505    cfg_uiQuadtreeTUMaxDepthInter[layer] = &m_acLayerCfg[layer].m_uiQuadtreeTUMaxDepthInter;
506    cfg_uiQuadtreeTUMaxDepthIntra[layer] = &m_acLayerCfg[layer].m_uiQuadtreeTUMaxDepthIntra;
507#endif
508#if VPS_EXTN_DIRECT_REF_LAYERS
509    cfg_numSamplePredRefLayers  [layer] = &m_acLayerCfg[layer].m_numSamplePredRefLayers;
510    cfg_samplePredRefLayerIdsPtr[layer] = &cfg_samplePredRefLayerIds[layer];
511    cfg_numMotionPredRefLayers  [layer] = &m_acLayerCfg[layer].m_numMotionPredRefLayers;
512    cfg_motionPredRefLayerIdsPtr[layer] = &cfg_motionPredRefLayerIds[layer];
513    cfg_numActiveRefLayers  [layer] = &m_acLayerCfg[layer].m_numActiveRefLayers;
514    cfg_predLayerIdsPtr     [layer]  = &cfg_predLayerIds[layer];
515#endif
516    cfg_numScaledRefLayerOffsets [layer] = &m_acLayerCfg[layer].m_numScaledRefLayerOffsets;
517    for(Int i = 0; i < MAX_LAYERS; i++)
518    {
519#if O0098_SCALED_REF_LAYER_ID
520      cfg_scaledRefLayerIdPtr          [layer] = &cfg_scaledRefLayerId[layer];
521#endif
522      cfg_scaledRefLayerLeftOffsetPtr  [layer] = &cfg_scaledRefLayerLeftOffset[layer];
523      cfg_scaledRefLayerTopOffsetPtr   [layer] = &cfg_scaledRefLayerTopOffset[layer];
524      cfg_scaledRefLayerRightOffsetPtr [layer] = &cfg_scaledRefLayerRightOffset[layer];
525      cfg_scaledRefLayerBottomOffsetPtr[layer] = &cfg_scaledRefLayerBottomOffset[layer];
526#if P0312_VERT_PHASE_ADJ
527      cfg_vertPhasePositionEnableFlagPtr[layer] = &cfg_vertPhasePositionEnableFlag[layer];
528#endif
529#if REF_REGION_OFFSET
530      cfg_scaledRefLayerOffsetPresentFlagPtr [layer] = &cfg_scaledRefLayerOffsetPresentFlag [layer];
531      cfg_refRegionOffsetPresentFlagPtr      [layer] = &cfg_refRegionOffsetPresentFlag      [layer];
532      cfg_refRegionLeftOffsetPtr  [layer] = &cfg_refRegionLeftOffset  [layer];
533      cfg_refRegionTopOffsetPtr   [layer] = &cfg_refRegionTopOffset   [layer];
534      cfg_refRegionRightOffsetPtr [layer] = &cfg_refRegionRightOffset [layer];
535      cfg_refRegionBottomOffsetPtr[layer] = &cfg_refRegionBottomOffset[layer];
536#endif
537#if R0209_GENERIC_PHASE
538      cfg_resamplePhaseSetPresentFlagPtr [layer] = &cfg_resamplePhaseSetPresentFlag [layer];
539      cfg_phaseHorLumaPtr   [layer] = &cfg_phaseHorLuma   [layer];
540      cfg_phaseVerLumaPtr   [layer] = &cfg_phaseVerLuma   [layer];
541      cfg_phaseHorChromaPtr [layer] = &cfg_phaseHorChroma [layer];
542      cfg_phaseVerChromaPtr [layer] = &cfg_phaseVerChroma [layer];
543#endif
544    }
545#if RC_SHVC_HARMONIZATION
546    cfg_RCEnableRateControl[layer]   = &m_acLayerCfg[layer].m_RCEnableRateControl;
547    cfg_RCTargetBitRate[layer]       = &m_acLayerCfg[layer].m_RCTargetBitrate;
548    cfg_RCKeepHierarchicalBit[layer] = &m_acLayerCfg[layer].m_RCKeepHierarchicalBit;
549    cfg_RCLCULevelRC[layer]          = &m_acLayerCfg[layer].m_RCLCULevelRC;
550    cfg_RCUseLCUSeparateModel[layer] = &m_acLayerCfg[layer].m_RCUseLCUSeparateModel;
551    cfg_RCInitialQP[layer]           = &m_acLayerCfg[layer].m_RCInitialQP;
552    cfg_RCForceIntraQP[layer]        = &m_acLayerCfg[layer].m_RCForceIntraQP;
553#endif
554#if O0194_DIFFERENT_BITDEPTH_EL_BL
555  cfg_InputBitDepthY   [layer] = &m_acLayerCfg[layer].m_inputBitDepthY;
556  cfg_InternalBitDepthY[layer] = &m_acLayerCfg[layer].m_internalBitDepthY;
557  cfg_InputBitDepthC   [layer] = &m_acLayerCfg[layer].m_inputBitDepthC;
558  cfg_InternalBitDepthC[layer] = &m_acLayerCfg[layer].m_internalBitDepthC;
559  cfg_OutputBitDepthY  [layer] = &m_acLayerCfg[layer].m_outputBitDepthY;
560  cfg_OutputBitDepthC  [layer] = &m_acLayerCfg[layer].m_outputBitDepthC;
561#endif
562  cfg_maxTidIlRefPicsPlus1[layer] = &m_acLayerCfg[layer].m_maxTidIlRefPicsPlus1; 
563#if AUXILIARY_PICTURES
564    cfg_auxId[layer]                = &m_acLayerCfg[layer].m_auxId; 
565#endif
566  }
567#if Q0078_ADD_LAYER_SETS
568  Int* cfg_numLayerInIdList[MAX_VPS_LAYER_SETS_PLUS1];
569  string cfg_layerSetLayerIdList[MAX_VPS_LAYER_SETS_PLUS1];
570  string* cfg_layerSetLayerIdListPtr[MAX_VPS_LAYER_SETS_PLUS1];
571  Int* cfg_numHighestLayerIdx[MAX_VPS_LAYER_SETS_PLUS1];
572  string cfg_highestLayerIdx[MAX_VPS_LAYER_SETS_PLUS1];
573  string* cfg_highestLayerIdxPtr[MAX_VPS_LAYER_SETS_PLUS1];
574  for (UInt i = 0; i < MAX_VPS_LAYER_SETS_PLUS1; i++)
575  {
576    cfg_numLayerInIdList[i] = &m_numLayerInIdList[i];
577    cfg_layerSetLayerIdListPtr[i] = &cfg_layerSetLayerIdList[i];
578    cfg_highestLayerIdxPtr[i] = &cfg_highestLayerIdx[i];
579    cfg_numHighestLayerIdx[i] = &m_numHighestLayerIdx[i];
580  }
581#endif
582#if AVC_BASE
583  string  cfg_BLInputFile;
584#endif
585#if N0383_IL_CONSTRAINED_TILE_SETS_SEI
586  string  cfg_tileSets;
587#endif
588#else //SVC_EXTENSION
589  string cfg_InputFile;
590  string cfg_BitstreamFile;
591  string cfg_ReconFile;
592  string cfg_dQPFile;
593#if Q0074_COLOUR_REMAPPING_SEI
594  string cfg_colourRemapSEIFile;
595#endif
596#endif //SVC_EXTENSION
597  string cfgColumnWidth;
598  string cfgRowHeight;
599  string cfg_ScalingListFile;
600  string cfg_startOfCodedInterval;
601  string cfg_codedPivotValue;
602  string cfg_targetPivotValue;
603#if P0050_KNEE_FUNCTION_SEI
604  string cfg_kneeSEIInputKneePointValue;
605  string cfg_kneeSEIOutputKneePointValue;
606#endif
607
608  po::Options opts;
609  opts.addOptions()
610  ("help", do_help, false, "this help text")
611  ("c", po::parseConfigFile, "configuration file name")
612 
613  // File, I/O and source parameters
614#if SVC_EXTENSION
615  ("InputFile%d,-i%d",        cfg_InputFile,  string(""), MAX_LAYERS, "original YUV input file name for layer %d")
616  ("ReconFile%d,-o%d",        cfg_ReconFile,  string(""), MAX_LAYERS, "reconstruction YUV input file name for layer %d")
617  ("LayerConfig%d,-lc%d",     cfg_LayerCfgFile, string(""), MAX_LAYERS, "layer %d configuration file name")
618  ("SourceWidth%d,-wdt%d",    cfg_SourceWidth, 0, MAX_LAYERS, "Source picture width for layer %d")
619  ("SourceHeight%d,-hgt%d",   cfg_SourceHeight, 0, MAX_LAYERS, "Source picture height for layer %d")
620  ("FrameRate%d,-fr%d",       cfg_FrameRate,  0, MAX_LAYERS, "Frame rate for layer %d")
621  ("LambdaModifier%d,-LM%d",  m_adLambdaModifier, ( double )1.0, MAX_TLAYER, "Lambda modifier for temporal layer %d")
622#if O0215_PHASE_ALIGNMENT
623  ("PhaseAlignment",          m_phaseAlignFlag, false, "indicate the sample location alignment between layers (0: zero position aligned, 1: central position aligned)")
624#endif
625#if REPN_FORMAT_IN_VPS
626  ("RepFormatIdx%d",          cfg_repFormatIdx, -1, MAX_LAYERS, "Index to the representation format structure used from the VPS")
627#endif
628#if VPS_EXTN_DIRECT_REF_LAYERS
629  ("NumSamplePredRefLayers%d",cfg_numSamplePredRefLayers, -1, MAX_LAYERS, "Number of sample prediction reference layers")
630  ("SamplePredRefLayerIds%d", cfg_samplePredRefLayerIdsPtr, string(""), MAX_LAYERS, "sample pred reference layer IDs")
631  ("NumMotionPredRefLayers%d",cfg_numMotionPredRefLayers, -1, MAX_LAYERS, "Number of motion prediction reference layers")
632  ("MotionPredRefLayerIds%d", cfg_motionPredRefLayerIdsPtr, string(""), MAX_LAYERS, "motion pred reference layer IDs")
633  ("NumActiveRefLayers%d",    cfg_numActiveRefLayers, -1, MAX_LAYERS, "Number of active reference layers")
634  ("PredLayerIds%d",          cfg_predLayerIdsPtr, string(""), MAX_LAYERS, "inter-layer prediction layer IDs")
635#endif
636  ("NumLayers",               m_numLayers, 1, "Number of layers to code")
637#if Q0078_ADD_LAYER_SETS
638  ("NumLayerSets",            m_numLayerSets, 0, "Number of layer sets")
639  ("NumLayerInIdList%d",      cfg_numLayerInIdList, 0, MAX_VPS_LAYER_ID_PLUS1, "Number of layers in the set")
640  ("LayerSetLayerIdList%d",   cfg_layerSetLayerIdListPtr, string(""), MAX_VPS_LAYER_ID_PLUS1, "Layer IDs for the set")
641  ("NumAddLayerSets",         m_numAddLayerSets, 0, "Number of additional layer sets")
642  ("NumHighestLayerIdx%d",    cfg_numHighestLayerIdx, 0, MAX_VPS_LAYER_ID_PLUS1, "Number of highest layer idx")
643  ("HighestLayerIdx%d",       cfg_highestLayerIdxPtr, string(""), MAX_VPS_LAYER_ID_PLUS1, "Highest layer idx for an additional layer set")
644#endif
645#if AUXILIARY_PICTURES
646  ("InputChromaFormat%d",     cfg_tmpInputChromaFormat,  420, MAX_LAYERS, "InputChromaFormatIDC for layer %d")
647  ("ChromaFormatIDC%d,-cf",   cfg_tmpChromaFormatIDC,    420, MAX_LAYERS, "ChromaFormatIDC (400|420|422|444 or set 0 (default) for same as InputChromaFormat) for layer %d")
648  ("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")
649#endif
650  ("ConformanceMode%d",       cfg_conformanceMode,0, MAX_LAYERS, "Window conformance mode (0: no cropping, 1:automatic padding, 2: padding, 3:cropping")
651  ("ScalabilityMask1",        m_scalabilityMask[1], 0, "scalability_mask[1] (multiview)")
652  ("ScalabilityMask2",        m_scalabilityMask[2], 1, "scalability_mask[2] (scalable)" )
653#if AUXILIARY_PICTURES
654  ("ScalabilityMask3",        m_scalabilityMask[3], 0, "scalability_mask[3] (auxiliary pictures)" )
655#endif
656  ("BitstreamFile,b",         cfg_BitstreamFile, string(""), "Bitstream output file name")
657#if !O0194_DIFFERENT_BITDEPTH_EL_BL
658  ("InputBitDepth",           m_inputBitDepthY,    8, "Bit-depth of input file")
659  ("OutputBitDepth",          m_outputBitDepthY,   0, "Bit-depth of output file (default:InternalBitDepth)")
660  ("InternalBitDepth",        m_internalBitDepthY, 0, "Bit-depth the codec operates at. (default:InputBitDepth)"
661                                                       "If different to InputBitDepth, source data will be converted")
662  ("InputBitDepthC",          m_inputBitDepthC,    0, "As per InputBitDepth but for chroma component. (default:InputBitDepth)")
663  ("OutputBitDepthC",         m_outputBitDepthC,   0, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
664  ("InternalBitDepthC",       m_internalBitDepthC, 0, "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth)")
665#endif
666  ("NumScaledRefLayerOffsets%d",    cfg_numScaledRefLayerOffsets,     0, MAX_LAYERS,  "Number of scaled offset layer sets ")
667#if O0098_SCALED_REF_LAYER_ID
668  ("ScaledRefLayerId%d",           cfg_scaledRefLayerIdPtr,          string(""), MAX_LAYERS, "Layer ID of scaled base layer picture")
669#endif
670  ("ScaledRefLayerLeftOffset%d",   cfg_scaledRefLayerLeftOffsetPtr,  string(""), MAX_LAYERS, "Horizontal offset of top-left luma sample of scaled base layer picture with respect to"
671                                                                 " top-left luma sample of the EL picture, in units of two luma samples")
672  ("ScaledRefLayerTopOffset%d",    cfg_scaledRefLayerTopOffsetPtr,   string(""), MAX_LAYERS,   "Vertical offset of top-left luma sample of scaled base layer picture with respect to"
673                                                                 " top-left luma sample of the EL picture, in units of two luma samples")
674  ("ScaledRefLayerRightOffset%d",  cfg_scaledRefLayerRightOffsetPtr, string(""), MAX_LAYERS, "Horizontal offset of bottom-right luma sample of scaled base layer picture with respect to"
675                                                                 " bottom-right luma sample of the EL picture, in units of two luma samples")
676  ("ScaledRefLayerBottomOffset%d", cfg_scaledRefLayerBottomOffsetPtr,string(""), MAX_LAYERS, "Vertical offset of bottom-right luma sample of scaled base layer picture with respect to"
677  " bottom-right luma sample of the EL picture, in units of two luma samples")
678#if REF_REGION_OFFSET
679  ("ScaledRefLayerOffsetPresentFlag%d",      cfg_scaledRefLayerOffsetPresentFlagPtr,     string(""), MAX_LAYERS, "presense flag of scaled reference layer offsets")
680  ("RefRegionOffsetPresentFlag%d",           cfg_refRegionOffsetPresentFlagPtr,          string(""), MAX_LAYERS, "presense flag of reference region offsets")
681  ("RefRegionLeftOffset%d",   cfg_refRegionLeftOffsetPtr,  string(""), MAX_LAYERS, "Horizontal offset of top-left luma sample of ref region with respect to"
682                                                                 " top-left luma sample of the BL picture, in units of two luma samples")
683  ("RefRegionTopOffset%d",    cfg_refRegionTopOffsetPtr,   string(""), MAX_LAYERS,   "Vertical offset of top-left luma sample of ref region with respect to"
684                                                                 " top-left luma sample of the BL picture, in units of two luma samples")
685  ("RefRegionRightOffset%d",  cfg_refRegionRightOffsetPtr, string(""), MAX_LAYERS, "Horizontal offset of bottom-right luma sample of ref region with respect to"
686                                                                 " bottom-right luma sample of the BL picture, in units of two luma samples")
687  ("RefRegionBottomOffset%d", cfg_refRegionBottomOffsetPtr,string(""), MAX_LAYERS, "Vertical offset of bottom-right luma sample of ref region with respect to"
688                                                                 " bottom-right luma sample of the BL picture, in units of two luma samples")
689#endif
690#if R0209_GENERIC_PHASE
691  ("ResamplePhaseSetPresentFlag%d",  cfg_resamplePhaseSetPresentFlagPtr, string(""), MAX_LAYERS, "presense flag of resample phase set")
692  ("PhaseHorLuma%d",   cfg_phaseHorLumaPtr,   string(""), MAX_LAYERS, "luma shift in the horizontal direction used in resampling proces")
693  ("PhaseVerLuma%d",   cfg_phaseVerLumaPtr,   string(""), MAX_LAYERS, "luma shift in the vertical   direction used in resampling proces")
694  ("PhaseHorChroma%d", cfg_phaseHorChromaPtr, string(""), MAX_LAYERS, "chroma shift in the horizontal direction used in resampling proces")
695  ("PhaseVerChroma%d", cfg_phaseVerChromaPtr, string(""), MAX_LAYERS, "chroma shift in the vertical   direction used in resampling proces")
696#endif
697#if P0312_VERT_PHASE_ADJ
698  ("VertPhasePositionEnableFlag%d", cfg_vertPhasePositionEnableFlagPtr,string(""), MAX_LAYERS, "VertPhasePositionEnableFlag for layer %d")
699#endif
700#if Q0074_COLOUR_REMAPPING_SEI
701  ("SEIColourRemappingInfoFile%d", cfg_colourRemapSEIFile, string(""), MAX_LAYERS, "Colour Remapping Information SEI parameters file name for layer %d")
702#endif
703#if O0194_DIFFERENT_BITDEPTH_EL_BL
704  ("InputBitDepth%d",       cfg_InputBitDepthY,    8, MAX_LAYERS, "Bit-depth of input file for layer %d")
705  ("InternalBitDepth%d",    cfg_InternalBitDepthY, 0, MAX_LAYERS, "Bit-depth the codec operates at. (default:InputBitDepth) for layer %d ")
706//                                                       "If different to InputBitDepth, source data will be converted")
707  ("InputBitDepthC%d",      cfg_InputBitDepthC,    0, MAX_LAYERS, "As per InputBitDepth but for chroma component. (default:InputBitDepth) for layer %d")
708  ("InternalBitDepthC%d",   cfg_InternalBitDepthC, 0, MAX_LAYERS, "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth) for layer %d")
709  ("OutputBitDepth%d",      cfg_OutputBitDepthY,   0, MAX_LAYERS, "Bit-depth of output file (default:InternalBitDepth)")
710  ("OutputBitDepthC%d",     cfg_OutputBitDepthC,   0, MAX_LAYERS, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
711#endif
712  ("MaxTidRefPresentFlag", m_maxTidRefPresentFlag, true, "max_tid_ref_present_flag (0: not present, 1: present(default)) " )
713  ("MaxTidIlRefPicsPlus1%d", cfg_maxTidIlRefPicsPlus1, 1, MAX_LAYERS, "allowed maximum temporal_id for inter-layer prediction")
714#if O0223_PICTURE_TYPES_ALIGN_FLAG
715  ("CrossLayerPictureTypeAlignFlag", m_crossLayerPictureTypeAlignFlag, true, "align picture type across layers" ) 
716#endif
717  ("CrossLayerIrapAlignFlag", m_crossLayerIrapAlignFlag, true, "align IRAP across layers" ) 
718#if P0068_CROSS_LAYER_ALIGNED_IDR_ONLY_FOR_IRAP_FLAG
719  ("CrossLayerAlignedIdrOnlyFlag", m_crossLayerAlignedIdrOnlyFlag, true, "only idr for IRAP across layers" ) 
720#endif
721#if O0194_WEIGHTED_PREDICTION_CGS
722  ("InterLayerWeightedPred", m_useInterLayerWeightedPred, false, "enable IL WP parameters estimation at encoder" ) 
723#endif
724#if AVC_BASE
725  ("AvcBase,-avc",            m_avcBaseLayerFlag,     0, "avc_base_layer_flag")
726  ("InputBLFile,-ibl",        cfg_BLInputFile,     string(""), "Base layer rec YUV input file name")
727#endif
728  ("EnableElRapB,-use-rap-b",  m_elRapSliceBEnabled, 0, "Set ILP over base-layer I picture to B picture (default is P picture)")
729#else //SVC_EXTENSION
730  ("InputFile,i",           cfg_InputFile,     string(""), "Original YUV input file name")
731  ("BitstreamFile,b",       cfg_BitstreamFile, string(""), "Bitstream output file name")
732  ("ReconFile,o",           cfg_ReconFile,     string(""), "Reconstructed YUV output file name")
733  ("SourceWidth,-wdt",      m_iSourceWidth,        0, "Source picture width")
734  ("SourceHeight,-hgt",     m_iSourceHeight,       0, "Source picture height")
735  ("InputBitDepth",         m_inputBitDepthY,    8, "Bit-depth of input file")
736  ("OutputBitDepth",        m_outputBitDepthY,   0, "Bit-depth of output file (default:InternalBitDepth)")
737  ("InternalBitDepth",      m_internalBitDepthY, 0, "Bit-depth the codec operates at. (default:InputBitDepth)"
738                                                       "If different to InputBitDepth, source data will be converted")
739  ("InputBitDepthC",        m_inputBitDepthC,    0, "As per InputBitDepth but for chroma component. (default:InputBitDepth)")
740  ("OutputBitDepthC",       m_outputBitDepthC,   0, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
741  ("InternalBitDepthC",     m_internalBitDepthC, 0, "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth)")
742#if AUXILIARY_PICTURES
743  ("InputChromaFormat",     tmpInputChromaFormat,                       420, "InputChromaFormatIDC")
744  ("ChromaFormatIDC,-cf",   tmpChromaFormat,                             0, "ChromaFormatIDC (400|420|422|444 or set 0 (default) for same as InputChromaFormat)")
745#endif
746  ("ConformanceMode",       m_conformanceWindowMode,  0, "Deprecated alias of ConformanceWindowMode")
747  ("ConformanceWindowMode", m_conformanceWindowMode,  0, "Window conformance mode (0: no window, 1:automatic padding, 2:padding, 3:conformance")
748  ("HorizontalPadding,-pdx",m_aiPad[0],               0, "Horizontal source padding for conformance window mode 2")
749  ("VerticalPadding,-pdy",  m_aiPad[1],               0, "Vertical source padding for conformance window mode 2")
750  ("ConfLeft",              m_confWinLeft,            0, "Deprecated alias of ConfWinLeft")
751  ("ConfRight",             m_confWinRight,           0, "Deprecated alias of ConfWinRight")
752  ("ConfTop",               m_confWinTop,             0, "Deprecated alias of ConfWinTop")
753  ("ConfBottom",            m_confWinBottom,          0, "Deprecated alias of ConfWinBottom")
754  ("ConfWinLeft",           m_confWinLeft,            0, "Left offset for window conformance mode 3")
755  ("ConfWinRight",          m_confWinRight,           0, "Right offset for window conformance mode 3")
756  ("ConfWinTop",            m_confWinTop,             0, "Top offset for window conformance mode 3")
757  ("ConfWinBottom",         m_confWinBottom,          0, "Bottom offset for window conformance mode 3")
758  ("FrameRate,-fr",         m_iFrameRate,          0, "Frame rate")
759#if Q0074_COLOUR_REMAPPING_SEI
760  ("SEIColourRemappingInfoFile", cfg_colourRemapSEIFile, string(""), "Colour Remapping Information SEI parameters file name")
761#endif
762#endif //SVC_EXTENSION
763  ("FrameSkip,-fs",         m_FrameSkip,          0u, "Number of frames to skip at start of input YUV")
764  ("FramesToBeEncoded,f",   m_framesToBeEncoded,   0, "Number of frames to be encoded (default=all)")
765
766  //Field coding parameters
767  ("FieldCoding", m_isField, false, "Signals if it's a field based coding")
768  ("TopFieldFirst, Tff", m_isTopFieldFirst, false, "In case of field based coding, signals whether if it's a top field first or not")
769 
770  // Profile and level
771  ("Profile", m_profile,   Profile::NONE, "Profile to be used when encoding (Incomplete)")
772  ("Level",   m_level,     Level::NONE,   "Level limit to be used, eg 5.1 (Incomplete)")
773  ("Tier",    m_levelTier, Level::MAIN,   "Tier to use for interpretation of --Level")
774
775  ("ProgressiveSource", m_progressiveSourceFlag, false, "Indicate that source is progressive")
776  ("InterlacedSource",  m_interlacedSourceFlag,  false, "Indicate that source is interlaced")
777  ("NonPackedSource",   m_nonPackedConstraintFlag, false, "Indicate that source does not contain frame packing")
778  ("FrameOnly",         m_frameOnlyConstraintFlag, false, "Indicate that the bitstream contains only frames")
779
780#if LAYER_CTB
781  // Unit definition parameters
782  ("MaxCUWidth%d",              cfg_uiMaxCUWidth,             64u, MAX_LAYERS, "Maximum CU width")
783  ("MaxCUHeight%d",             cfg_uiMaxCUHeight,            64u, MAX_LAYERS, "Maximum CU height")
784  // todo: remove defaults from MaxCUSize
785  ("MaxCUSize%d,s%d",           cfg_uiMaxCUWidth,             64u, MAX_LAYERS, "Maximum CU size")
786  ("MaxCUSize%d,s%d",           cfg_uiMaxCUHeight,            64u, MAX_LAYERS, "Maximum CU size")
787  ("MaxPartitionDepth%d,h%d",   cfg_uiMaxCUDepth,              4u, MAX_LAYERS, "CU depth")
788 
789  ("QuadtreeTULog2MaxSize%d",   cfg_uiQuadtreeTULog2MaxSize,   6u, MAX_LAYERS, "Maximum TU size in logarithm base 2")
790  ("QuadtreeTULog2MinSize%d",   cfg_uiQuadtreeTULog2MinSize,   2u, MAX_LAYERS, "Minimum TU size in logarithm base 2")
791 
792  ("QuadtreeTUMaxDepthIntra%d", cfg_uiQuadtreeTUMaxDepthIntra, 1u, MAX_LAYERS, "Depth of TU tree for intra CUs")
793  ("QuadtreeTUMaxDepthInter%d", cfg_uiQuadtreeTUMaxDepthInter, 2u, MAX_LAYERS, "Depth of TU tree for inter CUs")
794
795
796  // set the same CU realted settings across all the layers if config file parameters are not layer specific
797  ("MaxCUWidth",              cfg_uiMaxCUWidth,             64u, MAX_LAYERS, "Maximum CU width")
798  ("MaxCUHeight",             cfg_uiMaxCUHeight,            64u, MAX_LAYERS, "Maximum CU height")
799  // todo: remove defaults from MaxCUSize
800  ("MaxCUSize,s",             cfg_uiMaxCUWidth,             64u, MAX_LAYERS, "Maximum CU size")
801  ("MaxCUSize,s",             cfg_uiMaxCUHeight,            64u, MAX_LAYERS, "Maximum CU size")
802  ("MaxPartitionDepth,h",     cfg_uiMaxCUDepth,              4u, MAX_LAYERS, "CU depth")
803 
804  ("QuadtreeTULog2MaxSize",   cfg_uiQuadtreeTULog2MaxSize,   6u, MAX_LAYERS, "Maximum TU size in logarithm base 2")
805  ("QuadtreeTULog2MinSize",   cfg_uiQuadtreeTULog2MinSize,   2u, MAX_LAYERS, "Minimum TU size in logarithm base 2")
806 
807  ("QuadtreeTUMaxDepthIntra", cfg_uiQuadtreeTUMaxDepthIntra, 1u, MAX_LAYERS, "Depth of TU tree for intra CUs")
808  ("QuadtreeTUMaxDepthInter", cfg_uiQuadtreeTUMaxDepthInter, 2u, MAX_LAYERS, "Depth of TU tree for inter CUs")
809#else
810  // Unit definition parameters
811  ("MaxCUWidth",              m_uiMaxCUWidth,             64u)
812  ("MaxCUHeight",             m_uiMaxCUHeight,            64u)
813  // todo: remove defaults from MaxCUSize
814  ("MaxCUSize,s",             m_uiMaxCUWidth,             64u, "Maximum CU size")
815  ("MaxCUSize,s",             m_uiMaxCUHeight,            64u, "Maximum CU size")
816  ("MaxPartitionDepth,h",     m_uiMaxCUDepth,              4u, "CU depth")
817 
818  ("QuadtreeTULog2MaxSize",   m_uiQuadtreeTULog2MaxSize,   6u, "Maximum TU size in logarithm base 2")
819  ("QuadtreeTULog2MinSize",   m_uiQuadtreeTULog2MinSize,   2u, "Minimum TU size in logarithm base 2")
820 
821  ("QuadtreeTUMaxDepthIntra", m_uiQuadtreeTUMaxDepthIntra, 1u, "Depth of TU tree for intra CUs")
822  ("QuadtreeTUMaxDepthInter", m_uiQuadtreeTUMaxDepthInter, 2u, "Depth of TU tree for inter CUs")
823#endif
824 
825  // Coding structure paramters
826#if SVC_EXTENSION
827  ("IntraPeriod%d,-ip%d",  cfg_IntraPeriod, -1, MAX_LAYERS, "intra period in frames for layer %d, (-1: only first frame)")
828#else
829  ("IntraPeriod,-ip",         m_iIntraPeriod,              -1, "Intra period in frames, (-1: only first frame)")
830#endif
831#if ALLOW_RECOVERY_POINT_AS_RAP
832  ("DecodingRefreshType,-dr", m_iDecodingRefreshType,       0, "Intra refresh type (0:none 1:CRA 2:IDR 3:RecPointSEI)")
833#else
834  ("DecodingRefreshType,-dr", m_iDecodingRefreshType,       0, "Intra refresh type (0:none 1:CRA 2:IDR)")
835#endif
836  ("GOPSize,g",               m_iGOPSize,                   1, "GOP size of temporal structure")
837  // motion options
838  ("FastSearch",              m_iFastSearch,                1, "0:Full search  1:Diamond  2:PMVFAST")
839  ("SearchRange,-sr",         m_iSearchRange,              96, "Motion search range")
840  ("BipredSearchRange",       m_bipredSearchRange,          4, "Motion search range for bipred refinement")
841  ("HadamardME",              m_bUseHADME,               true, "Hadamard ME for fractional-pel")
842  ("ASR",                     m_bUseASR,                false, "Adaptive motion search range")
843
844#if SVC_EXTENSION
845  ("LambdaModifier%d,-LM%d",  m_adLambdaModifier, ( double )1.0, MAX_TLAYER, "Lambda modifier for temporal layer %d")
846#else
847  // Mode decision parameters
848  ("LambdaModifier0,-LM0", m_adLambdaModifier[ 0 ], ( Double )1.0, "Lambda modifier for temporal layer 0")
849  ("LambdaModifier1,-LM1", m_adLambdaModifier[ 1 ], ( Double )1.0, "Lambda modifier for temporal layer 1")
850  ("LambdaModifier2,-LM2", m_adLambdaModifier[ 2 ], ( Double )1.0, "Lambda modifier for temporal layer 2")
851  ("LambdaModifier3,-LM3", m_adLambdaModifier[ 3 ], ( Double )1.0, "Lambda modifier for temporal layer 3")
852  ("LambdaModifier4,-LM4", m_adLambdaModifier[ 4 ], ( Double )1.0, "Lambda modifier for temporal layer 4")
853  ("LambdaModifier5,-LM5", m_adLambdaModifier[ 5 ], ( Double )1.0, "Lambda modifier for temporal layer 5")
854  ("LambdaModifier6,-LM6", m_adLambdaModifier[ 6 ], ( Double )1.0, "Lambda modifier for temporal layer 6")
855#endif
856
857  /* Quantization parameters */
858#if SVC_EXTENSION
859  ("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")
860#else
861  ("QP,q",          m_fQP,             30.0, "Qp value, if value is float, QP is switched once during encoding")
862#endif
863  ("DeltaQpRD,-dqr",m_uiDeltaQpRD,       0u, "max dQp offset for slice")
864  ("MaxDeltaQP,d",  m_iMaxDeltaQP,        0, "max dQp offset for block")
865  ("MaxCuDQPDepth,-dqd",  m_iMaxCuDQPDepth,        0, "max depth for a minimum CuDQP")
866
867  ("CbQpOffset,-cbqpofs",  m_cbQpOffset,        0, "Chroma Cb QP Offset")
868  ("CrQpOffset,-crqpofs",  m_crQpOffset,        0, "Chroma Cr QP Offset")
869
870#if ADAPTIVE_QP_SELECTION
871  ("AdaptiveQpSelection,-aqps",   m_bUseAdaptQpSelect,           false, "AdaptiveQpSelection")
872#endif
873
874  ("AdaptiveQP,-aq",                m_bUseAdaptiveQP,           false, "QP adaptation based on a psycho-visual model")
875  ("MaxQPAdaptationRange,-aqr",     m_iQPAdaptationRange,           6, "QP adaptation range")
876#if !SVC_EXTENSION
877  ("dQPFile,m",                     cfg_dQPFile,           string(""), "dQP file name")
878#endif
879  ("RDOQ",                          m_useRDOQ,                  true )
880  ("RDOQTS",                        m_useRDOQTS,                true )
881  ("RDpenalty",                     m_rdPenalty,                0,  "RD-penalty for 32x32 TU for intra in non-intra slices. 0:disbaled  1:RD-penalty  2:maximum RD-penalty")
882 
883  // Deblocking filter parameters
884  ("LoopFilterDisable",              m_bLoopFilterDisable,             false )
885  ("LoopFilterOffsetInPPS",          m_loopFilterOffsetInPPS,          false )
886  ("LoopFilterBetaOffset_div2",      m_loopFilterBetaOffsetDiv2,           0 )
887  ("LoopFilterTcOffset_div2",        m_loopFilterTcOffsetDiv2,             0 )
888  ("DeblockingFilterControlPresent", m_DeblockingFilterControlPresent, false )
889  ("DeblockingFilterMetric",         m_DeblockingFilterMetric,         false )
890
891  // Coding tools
892  ("AMP",                      m_enableAMP,                 true,  "Enable asymmetric motion partitions")
893  ("TransformSkip",            m_useTransformSkip,          false, "Intra transform skipping")
894  ("TransformSkipFast",        m_useTransformSkipFast,      false, "Fast intra transform skipping")
895  ("SAO",                      m_bUseSAO,                   true,  "Enable Sample Adaptive Offset")
896  ("MaxNumOffsetsPerPic",      m_maxNumOffsetsPerPic,       2048,  "Max number of SAO offset per picture (Default: 2048)")   
897  ("SAOLcuBoundary",           m_saoLcuBoundary,            false, "0: right/bottom LCU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas")
898  ("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")
899  ("SliceArgument",            m_sliceArgument,            0,     "Depending on SliceMode being:"
900                                                                   "\t1: max number of CTUs per slice"
901                                                                   "\t2: max number of bytes per slice"
902                                                                   "\t3: max number of tiles per slice")
903  ("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")
904  ("SliceSegmentArgument",     m_sliceSegmentArgument,   0,     "Depending on SliceSegmentMode being:"
905                                                                   "\t1: max number of CTUs per slice segment"
906                                                                   "\t2: max number of bytes per slice segment"
907                                                                   "\t3: max number of tiles per slice segment")
908  ("LFCrossSliceBoundaryFlag", m_bLFCrossSliceBoundaryFlag, true)
909
910  ("ConstrainedIntraPred",     m_bUseConstrainedIntraPred,  false, "Constrained Intra Prediction")
911
912  ("PCMEnabledFlag",           m_usePCM,                    false)
913  ("PCMLog2MaxSize",           m_pcmLog2MaxSize,            5u)
914  ("PCMLog2MinSize",           m_uiPCMLog2MinSize,          3u)
915  ("PCMInputBitDepthFlag",     m_bPCMInputBitDepthFlag,     true)
916  ("PCMFilterDisableFlag",     m_bPCMFilterDisableFlag,    false)
917
918  ("WeightedPredP,-wpP",          m_useWeightedPred,               false,      "Use weighted prediction in P slices")
919  ("WeightedPredB,-wpB",          m_useWeightedBiPred,             false,      "Use weighted (bidirectional) prediction in B slices")
920  ("Log2ParallelMergeLevel",      m_log2ParallelMergeLevel,     2u,          "Parallel merge estimation region")
921
922  //deprecated copies of renamed tile parameters
923  ("UniformSpacingIdc",           m_tileUniformSpacingFlag,        false,      "deprecated alias of TileUniformSpacing")
924  ("ColumnWidthArray",            cfgColumnWidth,                  string(""), "deprecated alias of TileColumnWidthArray")
925  ("RowHeightArray",              cfgRowHeight,                    string(""), "deprecated alias of TileRowHeightArray")
926
927  ("TileUniformSpacing",          m_tileUniformSpacingFlag,        false,      "Indicates that tile columns and rows are distributed uniformly")
928  ("NumTileColumnsMinus1",        m_numTileColumnsMinus1,          0,          "Number of tile columns in a picture minus 1")
929  ("NumTileRowsMinus1",           m_numTileRowsMinus1,             0,          "Number of rows in a picture minus 1")
930  ("TileColumnWidthArray",        cfgColumnWidth,                  string(""), "Array containing tile column width values in units of LCU")
931  ("TileRowHeightArray",          cfgRowHeight,                    string(""), "Array containing tile row height values in units of LCU")
932  ("LFCrossTileBoundaryFlag",      m_bLFCrossTileBoundaryFlag,             true,          "1: cross-tile-boundary loop filtering. 0:non-cross-tile-boundary loop filtering")
933  ("WaveFrontSynchro",            m_iWaveFrontSynchro,             0,          "0: no synchro; 1 synchro with TR; 2 TRR etc")
934  ("ScalingList",                 m_useScalingListId,              0,          "0: no scaling list, 1: default scaling lists, 2: scaling lists specified in ScalingListFile")
935  ("ScalingListFile",             cfg_ScalingListFile,             string(""), "Scaling list file name")
936  ("SignHideFlag,-SBH",                m_signHideFlag, 1)
937  ("MaxNumMergeCand",             m_maxNumMergeCand,             5u,         "Maximum number of merge candidates")
938
939  /* Misc. */
940  ("SEIDecodedPictureHash",       m_decodedPictureHashSEIEnabled, 0, "Control generation of decode picture hash SEI messages\n"
941                                                                    "\t3: checksum\n"
942                                                                    "\t2: CRC\n"
943                                                                    "\t1: use MD5\n"
944                                                                    "\t0: disable")
945  ("SEIpictureDigest",            m_decodedPictureHashSEIEnabled, 0, "deprecated alias for SEIDecodedPictureHash")
946  ("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")
947  ("FEN", m_bUseFastEnc, false, "fast encoder setting")
948  ("ECU", m_bUseEarlyCU, false, "Early CU setting") 
949  ("FDM", m_useFastDecisionForMerge, true, "Fast decision for Merge RD Cost") 
950  ("CFM", m_bUseCbfFastMode, false, "Cbf fast mode setting")
951  ("ESD", m_useEarlySkipDetection, false, "Early SKIP detection setting")
952#if FAST_INTRA_SHVC
953  ("FIS", m_useFastIntraScalable, false, "Fast Intra Decision for Scalable HEVC")
954#endif
955#if RC_SHVC_HARMONIZATION
956  ("RateControl%d", cfg_RCEnableRateControl, false, MAX_LAYERS, "Rate control: enable rate control for layer %d")
957  ("TargetBitrate%d", cfg_RCTargetBitRate, 0, MAX_LAYERS, "Rate control: target bitrate for layer %d")
958  ("KeepHierarchicalBit%d", cfg_RCKeepHierarchicalBit, false, MAX_LAYERS, "Rate control: keep hierarchical bit allocation for layer %d")
959  ("LCULevelRateControl%d", cfg_RCLCULevelRC, true, MAX_LAYERS, "Rate control: LCU level RC")
960  ("RCLCUSeparateModel%d", cfg_RCUseLCUSeparateModel, true, MAX_LAYERS, "Rate control: Use LCU level separate R-lambda model")
961  ("InitialQP%d", cfg_RCInitialQP, 0, MAX_LAYERS, "Rate control: initial QP")
962  ("RCForceIntraQP%d", cfg_RCForceIntraQP, false, MAX_LAYERS, "Rate control: force intra QP to be equal to initial QP")
963#else
964  ( "RateControl",         m_RCEnableRateControl,   false, "Rate control: enable rate control" )
965  ( "TargetBitrate",       m_RCTargetBitrate,           0, "Rate control: target bitrate" )
966  ( "KeepHierarchicalBit", m_RCKeepHierarchicalBit,     0, "Rate control: 0: equal bit allocation; 1: fixed ratio bit allocation; 2: adaptive ratio bit allocation" )
967  ( "LCULevelRateControl", m_RCLCULevelRC,           true, "Rate control: true: LCU level RC; false: picture level RC" )
968  ( "RCLCUSeparateModel",  m_RCUseLCUSeparateModel,  true, "Rate control: use LCU level separate R-lambda model" )
969  ( "InitialQP",           m_RCInitialQP,               0, "Rate control: initial QP" )
970  ( "RCForceIntraQP",      m_RCForceIntraQP,        false, "Rate control: force intra QP to be equal to initial QP" )
971#endif
972
973  ("TransquantBypassEnableFlag", m_TransquantBypassEnableFlag, false, "transquant_bypass_enable_flag indicator in PPS")
974  ("CUTransquantBypassFlagForce", m_CUTransquantBypassFlagForce, false, "Force transquant bypass mode, when transquant_bypass_enable_flag is enabled")
975  ("RecalculateQPAccordingToLambda", m_recalculateQPAccordingToLambda, false, "Recalculate QP values according to lambda values. Do not suggest to be enabled in all intra case")
976  ("StrongIntraSmoothing,-sis",      m_useStrongIntraSmoothing,           true, "Enable strong intra smoothing for 32x32 blocks")
977  ("SEIActiveParameterSets",         m_activeParameterSetsSEIEnabled,          0, "Enable generation of active parameter sets SEI messages")
978  ("VuiParametersPresent,-vui",      m_vuiParametersPresentFlag,           false, "Enable generation of vui_parameters()")
979  ("AspectRatioInfoPresent",         m_aspectRatioInfoPresentFlag,         false, "Signals whether aspect_ratio_idc is present")
980  ("AspectRatioIdc",                 m_aspectRatioIdc,                         0, "aspect_ratio_idc")
981  ("SarWidth",                       m_sarWidth,                               0, "horizontal size of the sample aspect ratio")
982  ("SarHeight",                      m_sarHeight,                              0, "vertical size of the sample aspect ratio")
983  ("OverscanInfoPresent",            m_overscanInfoPresentFlag,            false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
984  ("OverscanAppropriate",            m_overscanAppropriateFlag,            false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
985  ("VideoSignalTypePresent",         m_videoSignalTypePresentFlag,         false, "Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present")
986  ("VideoFormat",                    m_videoFormat,                            5, "Indicates representation of pictures")
987  ("VideoFullRange",                 m_videoFullRangeFlag,                 false, "Indicates the black level and range of luma and chroma signals")
988  ("ColourDescriptionPresent",       m_colourDescriptionPresentFlag,       false, "Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present")
989  ("ColourPrimaries",                m_colourPrimaries,                        2, "Indicates chromaticity coordinates of the source primaries")
990  ("TransferCharacteristics",        m_transferCharacteristics,                2, "Indicates the opto-electronic transfer characteristics of the source")
991  ("MatrixCoefficients",             m_matrixCoefficients,                     2, "Describes the matrix coefficients used in deriving luma and chroma from RGB primaries")
992  ("ChromaLocInfoPresent",           m_chromaLocInfoPresentFlag,           false, "Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present")
993  ("ChromaSampleLocTypeTopField",    m_chromaSampleLocTypeTopField,            0, "Specifies the location of chroma samples for top field")
994  ("ChromaSampleLocTypeBottomField", m_chromaSampleLocTypeBottomField,         0, "Specifies the location of chroma samples for bottom field")
995  ("NeutralChromaIndication",        m_neutralChromaIndicationFlag,        false, "Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1)")
996  ("DefaultDisplayWindowFlag",       m_defaultDisplayWindowFlag,           false, "Indicates the presence of the Default Window parameters")
997  ("DefDispWinLeftOffset",           m_defDispWinLeftOffset,                   0, "Specifies the left offset of the default display window from the conformance window")
998  ("DefDispWinRightOffset",          m_defDispWinRightOffset,                  0, "Specifies the right offset of the default display window from the conformance window")
999  ("DefDispWinTopOffset",            m_defDispWinTopOffset,                    0, "Specifies the top offset of the default display window from the conformance window")
1000  ("DefDispWinBottomOffset",         m_defDispWinBottomOffset,                 0, "Specifies the bottom offset of the default display window from the conformance window")
1001  ("FrameFieldInfoPresentFlag",      m_frameFieldInfoPresentFlag,               false, "Indicates that pic_struct and field coding related values are present in picture timing SEI messages")
1002  ("PocProportionalToTimingFlag",   m_pocProportionalToTimingFlag,         false, "Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS")
1003  ("NumTicksPocDiffOneMinus1",      m_numTicksPocDiffOneMinus1,                0, "Number of ticks minus 1 that for a POC difference of one")
1004  ("BitstreamRestriction",           m_bitstreamRestrictionFlag,           false, "Signals whether bitstream restriction parameters are present")
1005  ("TilesFixedStructure",            m_tilesFixedStructureFlag,            false, "Indicates that each active picture parameter set has the same values of the syntax elements related to tiles")
1006  ("MotionVectorsOverPicBoundaries", m_motionVectorsOverPicBoundariesFlag, false, "Indicates that no samples outside the picture boundaries are used for inter prediction")
1007  ("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")
1008  ("MaxBitsPerMinCuDenom",           m_maxBitsPerMinCuDenom,                   1, "Indicates an upper bound for the number of bits of coding_unit() data")
1009  ("Log2MaxMvLengthHorizontal",      m_log2MaxMvLengthHorizontal,             15, "Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units")
1010  ("Log2MaxMvLengthVertical",        m_log2MaxMvLengthVertical,               15, "Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units")
1011  ("SEIRecoveryPoint",               m_recoveryPointSEIEnabled,                0, "Control generation of recovery point SEI messages")
1012  ("SEIBufferingPeriod",             m_bufferingPeriodSEIEnabled,              0, "Control generation of buffering period SEI messages")
1013  ("SEIPictureTiming",               m_pictureTimingSEIEnabled,                0, "Control generation of picture timing SEI messages")
1014  ("SEIToneMappingInfo",                       m_toneMappingInfoSEIEnabled,    false, "Control generation of Tone Mapping SEI messages")
1015  ("SEIToneMapId",                             m_toneMapId,                        0, "Specifies Id of Tone Mapping SEI message for a given session")
1016  ("SEIToneMapCancelFlag",                     m_toneMapCancelFlag,            false, "Indicates that Tone Mapping SEI message cancels the persistance or follows")
1017  ("SEIToneMapPersistenceFlag",                m_toneMapPersistenceFlag,        true, "Specifies the persistence of the Tone Mapping SEI message")
1018  ("SEIToneMapCodedDataBitDepth",              m_toneMapCodedDataBitDepth,         8, "Specifies Coded Data BitDepth of Tone Mapping SEI messages")
1019  ("SEIToneMapTargetBitDepth",                 m_toneMapTargetBitDepth,            8, "Specifies Output BitDepth of Tome mapping function")
1020  ("SEIToneMapModelId",                        m_toneMapModelId,                   0, "Specifies Model utilized for mapping coded data into target_bit_depth range\n"
1021                                                                                      "\t0:  linear mapping with clipping\n"
1022                                                                                      "\t1:  sigmoidal mapping\n"
1023                                                                                      "\t2:  user-defined table mapping\n"
1024                                                                                      "\t3:  piece-wise linear mapping\n"
1025                                                                                      "\t4:  luminance dynamic range information ")
1026  ("SEIToneMapMinValue",                              m_toneMapMinValue,                          0, "Specifies the minimum value in mode 0")
1027  ("SEIToneMapMaxValue",                              m_toneMapMaxValue,                       1023, "Specifies the maxmum value in mode 0")
1028  ("SEIToneMapSigmoidMidpoint",                       m_sigmoidMidpoint,                        512, "Specifies the centre point in mode 1")
1029  ("SEIToneMapSigmoidWidth",                          m_sigmoidWidth,                           960, "Specifies the distance between 5% and 95% values of the target_bit_depth in mode 1")
1030  ("SEIToneMapStartOfCodedInterval",                  cfg_startOfCodedInterval,          string(""), "Array of user-defined mapping table")
1031  ("SEIToneMapNumPivots",                             m_numPivots,                                0, "Specifies the number of pivot points in mode 3")
1032  ("SEIToneMapCodedPivotValue",                       cfg_codedPivotValue,               string(""), "Array of pivot point")
1033  ("SEIToneMapTargetPivotValue",                      cfg_targetPivotValue,              string(""), "Array of pivot point")
1034  ("SEIToneMapCameraIsoSpeedIdc",                     m_cameraIsoSpeedIdc,                        0, "Indicates the camera ISO speed for daylight illumination")
1035  ("SEIToneMapCameraIsoSpeedValue",                   m_cameraIsoSpeedValue,                    400, "Specifies the camera ISO speed for daylight illumination of Extended_ISO")
1036  ("SEIToneMapExposureIndexIdc",                      m_exposureIndexIdc,                         0, "Indicates the exposure index setting of the camera")
1037  ("SEIToneMapExposureIndexValue",                    m_exposureIndexValue,                     400, "Specifies the exposure index setting of the cameran of Extended_ISO")
1038  ("SEIToneMapExposureCompensationValueSignFlag",     m_exposureCompensationValueSignFlag,        0, "Specifies the sign of ExposureCompensationValue")
1039  ("SEIToneMapExposureCompensationValueNumerator",    m_exposureCompensationValueNumerator,       0, "Specifies the numerator of ExposureCompensationValue")
1040  ("SEIToneMapExposureCompensationValueDenomIdc",     m_exposureCompensationValueDenomIdc,        2, "Specifies the denominator of ExposureCompensationValue")
1041  ("SEIToneMapRefScreenLuminanceWhite",               m_refScreenLuminanceWhite,                350, "Specifies reference screen brightness setting in units of candela per square metre")
1042  ("SEIToneMapExtendedRangeWhiteLevel",               m_extendedRangeWhiteLevel,                800, "Indicates the luminance dynamic range")
1043  ("SEIToneMapNominalBlackLevelLumaCodeValue",        m_nominalBlackLevelLumaCodeValue,          16, "Specifies luma sample value of the nominal black level assigned decoded pictures")
1044  ("SEIToneMapNominalWhiteLevelLumaCodeValue",        m_nominalWhiteLevelLumaCodeValue,         235, "Specifies luma sample value of the nominal white level assigned decoded pictures")
1045  ("SEIToneMapExtendedWhiteLevelLumaCodeValue",       m_extendedWhiteLevelLumaCodeValue,        300, "Specifies luma sample value of the extended dynamic range assigned decoded pictures")
1046  ("SEIFramePacking",                m_framePackingSEIEnabled,                 0, "Control generation of frame packing SEI messages")
1047  ("SEIFramePackingType",            m_framePackingSEIType,                    0, "Define frame packing arrangement\n"
1048                                                                                  "\t0: checkerboard - pixels alternatively represent either frames\n"
1049                                                                                  "\t1: column alternation - frames are interlaced by column\n"
1050                                                                                  "\t2: row alternation - frames are interlaced by row\n"
1051                                                                                  "\t3: side by side - frames are displayed horizontally\n"
1052                                                                                  "\t4: top bottom - frames are displayed vertically\n"
1053                                                                                  "\t5: frame alternation - one frame is alternated with the other")
1054  ("SEIFramePackingId",              m_framePackingSEIId,                      0, "Id of frame packing SEI message for a given session")
1055  ("SEIFramePackingQuincunx",        m_framePackingSEIQuincunx,                0, "Indicate the presence of a Quincunx type video frame")
1056  ("SEIFramePackingInterpretation",  m_framePackingSEIInterpretation,          0, "Indicate the interpretation of the frame pair\n"
1057                                                                                  "\t0: unspecified\n"
1058                                                                                  "\t1: stereo pair, frame0 represents left view\n"
1059                                                                                  "\t2: stereo pair, frame0 represents right view")
1060  ("SEIDisplayOrientation",          m_displayOrientationSEIAngle,             0, "Control generation of display orientation SEI messages\n"
1061                                                              "\tN: 0 < N < (2^16 - 1) enable display orientation SEI message with anticlockwise_rotation = N and display_orientation_repetition_period = 1\n"
1062                                                              "\t0: disable")
1063  ("SEITemporalLevel0Index",         m_temporalLevel0IndexSEIEnabled,          0, "Control generation of temporal level 0 index SEI messages")
1064  ("SEIGradualDecodingRefreshInfo",  m_gradualDecodingRefreshInfoEnabled,      0, "Control generation of gradual decoding refresh information SEI message")
1065  ("SEIDecodingUnitInfo",             m_decodingUnitInfoSEIEnabled,                       0, "Control generation of decoding unit information SEI message.")
1066#if LAYERS_NOT_PRESENT_SEI
1067  ("SEILayersNotPresent",            m_layersNotPresentSEIEnabled,             0, "Control generation of layers not present SEI message")
1068#endif
1069  ("SEISOPDescription",              m_SOPDescriptionSEIEnabled,              0, "Control generation of SOP description SEI messages")
1070  ("SEIScalableNesting",             m_scalableNestingSEIEnabled,              0, "Control generation of scalable nesting SEI messages")
1071#if P0050_KNEE_FUNCTION_SEI
1072  ("SEIKneeFunctionInfo",                 m_kneeSEIEnabled,               false, "Control generation of Knee function SEI messages")
1073  ("SEIKneeFunctionId",                   m_kneeSEIId,                        0, "Specifies Id of Knee function SEI message for a given session")
1074  ("SEIKneeFunctionCancelFlag",           m_kneeSEICancelFlag,            false, "Indicates that Knee function SEI message cancels the persistance or follows")
1075  ("SEIKneeFunctionPersistenceFlag",      m_kneeSEIPersistenceFlag,        true, "Specifies the persistence of the Knee function SEI message")
1076  ("SEIKneeFunctionMappingFlag",          m_kneeSEIMappingFlag,           false, "Specifies the mapping mode of the Knee function SEI message")
1077  ("SEIKneeFunctionInputDrange",          m_kneeSEIInputDrange,            1000, "Specifies the peak luminance level for the input picture of Knee function SEI messages")
1078  ("SEIKneeFunctionInputDispLuminance",   m_kneeSEIInputDispLuminance,      100, "Specifies the expected display brightness for the input picture of Knee function SEI messages")
1079  ("SEIKneeFunctionOutputDrange",         m_kneeSEIOutputDrange,           4000, "Specifies the peak luminance level for the output picture of Knee function SEI messages")
1080  ("SEIKneeFunctionOutputDispLuminance",  m_kneeSEIOutputDispLuminance,     800, "Specifies the expected display brightness for the output picture of Knee function SEI messages")
1081  ("SEIKneeFunctionNumKneePointsMinus1",  m_kneeSEINumKneePointsMinus1,       2, "Specifies the number of knee points - 1")
1082  ("SEIKneeFunctionInputKneePointValue",  cfg_kneeSEIInputKneePointValue,     string("600 800 900"), "Array of input knee point")
1083  ("SEIKneeFunctionOutputKneePointValue", cfg_kneeSEIOutputKneePointValue,    string("100 250 450"), "Array of output knee point")
1084#endif
1085#if Q0189_TMVP_CONSTRAINTS
1086  ("SEITemporalMotionVectorPredictionConstraints",             m_TMVPConstraintsSEIEnabled,              0, "Control generation of TMVP constrants SEI message")
1087#endif
1088#if M0040_ADAPTIVE_RESOLUTION_CHANGE
1089  ("AdaptiveResolutionChange",     m_adaptiveResolutionChange, 0, "Adaptive resolution change frame number. Should coincide with EL RAP picture. (0: disable)")
1090#endif
1091#if HIGHER_LAYER_IRAP_SKIP_FLAG
1092  ("SkipPictureAtArcSwitch",     m_skipPictureAtArcSwitch, false, "Code the higher layer picture in ARC up-switching as a skip picture. (0: disable)")
1093#endif
1094#if N0383_IL_CONSTRAINED_TILE_SETS_SEI
1095  ("SEIInterLayerConstrainedTileSets", m_interLayerConstrainedTileSetsSEIEnabled, false, "Control generation of inter layer constrained tile sets SEI message")
1096  ("IlNumSetsInMessage",               m_ilNumSetsInMessage,                         0u, "Number of inter layer constrained tile sets")
1097  ("TileSetsArray",                    cfg_tileSets,                         string(""), "Array containing tile sets params (TopLeftTileIndex, BottonRightTileIndex and ilcIdc for each set) ")
1098#endif
1099#if O0153_ALT_OUTPUT_LAYER_FLAG
1100  ("AltOutputLayerFlag",               m_altOutputLayerFlag,                      false, "Specifies the value of alt_output_layer_flag in VPS extension")
1101#endif
1102#if O0149_CROSS_LAYER_BLA_FLAG
1103  ("CrossLayerBLAFlag",                m_crossLayerBLAFlag,                       false, "Specifies the value of cross_layer_bla_flag in VPS")
1104#endif
1105#if Q0048_CGS_3D_ASYMLUT
1106  ("CGS",     m_nCGSFlag , 0, "whether CGS is enabled")
1107  ("CGSMaxOctantDepth", m_nCGSMaxOctantDepth , 1, "max octant depth")
1108  ("CGSMaxYPartNumLog",  m_nCGSMaxYPartNumLog2 , 2, "max Y part number ")
1109  ("CGSLUTBit",     m_nCGSLUTBit , 12, "bit depth of CGS LUT")
1110#if R0151_CGS_3D_ASYMLUT_IMPROVE
1111  ("CGSAdaptC",     m_nCGSAdaptiveChroma , 1, "adaptive chroma partition (only for the case of two chroma partitions)")
1112#endif
1113#endif
1114#if Q0108_TSA_STSA
1115  ("InheritCodingStruct%d",m_inheritCodingStruct, 0, MAX_LAYERS, "Predicts the GOP structure of one layer for another layer")
1116#endif
1117  ;
1118 
1119  for(Int i=1; i<MAX_GOP+1; i++) {
1120    std::ostringstream cOSS;
1121    cOSS<<"Frame"<<i;
1122    opts.addOptions()(cOSS.str(), m_GOPList[i-1], GOPEntry());
1123  }
1124
1125#if Q0108_TSA_STSA
1126  for (Int i=1; i<MAX_LAYERS; i++)
1127  {
1128    for(Int j=1; j<MAX_GOP+1; j++)
1129    { 
1130      std::ostringstream cOSS;
1131      cOSS<<"Layer"<<i<<"Frame"<<j;
1132      opts.addOptions()(cOSS.str(), m_EhGOPList[i][j-1], GOPEntry());
1133    }
1134  }
1135#endif
1136
1137  po::setDefaults(opts);
1138  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
1139
1140#if Q0108_TSA_STSA
1141  for (Int i=1; i<MAX_LAYERS; i++)
1142  {
1143    if(m_inheritCodingStruct[i] == 0)
1144    {
1145      for(Int j=1; j<MAX_GOP+1; j++)
1146      { 
1147        m_EhGOPList[i][j-1] = m_GOPList[j-1];
1148      }
1149    }
1150    else if( m_inheritCodingStruct[i] > 0)
1151    {
1152      for(Int j=1; j<MAX_GOP+1; j++)
1153      {
1154        m_EhGOPList[i][j-1] = m_EhGOPList[m_inheritCodingStruct[i]][j-1];
1155      }
1156    }
1157  }
1158#endif
1159
1160  if(m_isField)
1161  {
1162#if SVC_EXTENSION
1163    for(Int layer = 0; layer < MAX_LAYERS; layer++)
1164    {
1165      //Frame height
1166      m_acLayerCfg[layer].m_iSourceHeightOrg = m_acLayerCfg[layer].m_iSourceHeight;
1167      //Field height
1168      m_acLayerCfg[layer].m_iSourceHeight = m_acLayerCfg[layer].m_iSourceHeight >> 1;
1169    }
1170#else
1171    //Frame height
1172    m_iSourceHeightOrg = m_iSourceHeight;
1173    //Field height
1174    m_iSourceHeight = m_iSourceHeight >> 1;
1175#endif
1176    //number of fields to encode
1177    m_framesToBeEncoded *= 2;
1178  }
1179 
1180  for (list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
1181  {
1182    fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
1183  }
1184 
1185  if (argc == 1 || do_help)
1186  {
1187    /* argc == 1: no options have been specified */
1188    po::doHelp(cout, opts);
1189    return false;
1190  }
1191 
1192  /*
1193   * Set any derived parameters
1194   */
1195  /* convert std::string to c string for compatability */
1196#if SVC_EXTENSION
1197#if AVC_BASE
1198  if( m_avcBaseLayerFlag )
1199  {
1200    *cfg_InputFile[0] = cfg_BLInputFile;
1201  }
1202#endif
1203  m_pBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
1204#else //SVC_EXTENSION
1205  m_pchInputFile = cfg_InputFile.empty() ? NULL : strdup(cfg_InputFile.c_str());
1206  m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
1207  m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str());
1208  m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str());
1209#if Q0074_COLOUR_REMAPPING_SEI
1210  m_colourRemapSEIFile = cfg_colourRemapSEIFile.empty() ? NULL : strdup(cfg_colourRemapSEIFile.c_str());
1211#endif
1212#endif //SVC_EXTENSION
1213
1214
1215  Char* pColumnWidth = cfgColumnWidth.empty() ? NULL: strdup(cfgColumnWidth.c_str());
1216  Char* pRowHeight = cfgRowHeight.empty() ? NULL : strdup(cfgRowHeight.c_str());
1217
1218  if( !m_tileUniformSpacingFlag && m_numTileColumnsMinus1 > 0 )
1219  {
1220    char *str;
1221    int  i=0;
1222    m_tileColumnWidth.resize( m_numTileColumnsMinus1 );
1223    str = strtok(pColumnWidth, " ,-");
1224    while(str!=NULL)
1225    {
1226      if( i >= m_numTileColumnsMinus1 )
1227      {
1228        printf( "The number of columns whose width are defined is larger than the allowed number of columns.\n" );
1229        exit( EXIT_FAILURE );
1230      }
1231      m_tileColumnWidth[i] = atoi( str );
1232      str = strtok(NULL, " ,-");
1233      i++;
1234    }
1235    if( i < m_numTileColumnsMinus1 )
1236    {
1237      printf( "The width of some columns is not defined.\n" );
1238      exit( EXIT_FAILURE );
1239    }
1240  }
1241  else
1242  {
1243    m_tileColumnWidth.clear();
1244  }
1245
1246  if( !m_tileUniformSpacingFlag && m_numTileRowsMinus1 > 0 )
1247  {
1248    char *str;
1249    int  i=0;
1250    m_tileRowHeight.resize(m_numTileRowsMinus1);
1251    str = strtok(pRowHeight, " ,-");
1252    while(str!=NULL)
1253    {
1254      if( i>=m_numTileRowsMinus1 )
1255      {
1256        printf( "The number of rows whose height are defined is larger than the allowed number of rows.\n" );
1257        exit( EXIT_FAILURE );
1258      }
1259      m_tileRowHeight[i] = atoi( str );
1260      str = strtok(NULL, " ,-");
1261      i++;
1262    }
1263    if( i < m_numTileRowsMinus1 )
1264    {
1265      printf( "The height of some rows is not defined.\n" );
1266      exit( EXIT_FAILURE );
1267   }
1268  }
1269  else
1270  {
1271    m_tileRowHeight.clear();
1272  }
1273#if SVC_EXTENSION
1274  if( pColumnWidth )
1275  {
1276    free( pColumnWidth );
1277    pColumnWidth = NULL;
1278  }
1279
1280  if( pRowHeight )
1281  {
1282    free( pRowHeight );
1283    pRowHeight = NULL;
1284  }
1285
1286  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1287  {
1288    // If number of scaled ref. layer offsets is non-zero, at least one of the offsets should be specified
1289    if(m_acLayerCfg[layer].m_numScaledRefLayerOffsets)
1290    {
1291#if O0098_SCALED_REF_LAYER_ID
1292      assert( strcmp(cfg_scaledRefLayerId[layer].c_str(),  ""));
1293#endif
1294#if REF_REGION_OFFSET
1295      Bool srloFlag =
1296        strcmp(cfg_scaledRefLayerLeftOffset   [layer].c_str(), "") ||
1297        strcmp(cfg_scaledRefLayerRightOffset  [layer].c_str(), "") ||
1298        strcmp(cfg_scaledRefLayerTopOffset    [layer].c_str(), "") ||
1299        strcmp(cfg_scaledRefLayerBottomOffset [layer].c_str(), "");
1300      Bool rroFlag =
1301        strcmp(cfg_refRegionLeftOffset   [layer].c_str(), "") ||
1302        strcmp(cfg_refRegionRightOffset  [layer].c_str(), "") ||
1303        strcmp(cfg_refRegionTopOffset    [layer].c_str(), "") ||
1304        strcmp(cfg_refRegionBottomOffset [layer].c_str(), "");
1305#if R0209_GENERIC_PHASE
1306      Bool phaseSetFlag =
1307        strcmp(cfg_phaseHorLuma   [layer].c_str(), "") ||
1308        strcmp(cfg_phaseVerLuma  [layer].c_str(), "") ||
1309        strcmp(cfg_phaseHorChroma    [layer].c_str(), "") ||
1310        strcmp(cfg_phaseVerChroma [layer].c_str(), "");
1311      assert( srloFlag || rroFlag || phaseSetFlag);
1312#else
1313      assert( srloFlag || rroFlag );
1314#endif
1315#else
1316#if P0312_VERT_PHASE_ADJ
1317      assert( strcmp(cfg_scaledRefLayerLeftOffset[layer].c_str(),  "") ||
1318              strcmp(cfg_scaledRefLayerRightOffset[layer].c_str(), "") ||
1319              strcmp(cfg_scaledRefLayerTopOffset[layer].c_str(),   "") ||
1320              strcmp(cfg_scaledRefLayerBottomOffset[layer].c_str(),"") ||
1321              strcmp(cfg_vertPhasePositionEnableFlag[layer].c_str(),"") ); 
1322#else
1323      assert( strcmp(cfg_scaledRefLayerLeftOffset[layer].c_str(),  "") ||
1324              strcmp(cfg_scaledRefLayerRightOffset[layer].c_str(), "") ||
1325              strcmp(cfg_scaledRefLayerTopOffset[layer].c_str(),   "") ||
1326              strcmp(cfg_scaledRefLayerBottomOffset[layer].c_str(),"") ); 
1327#endif
1328#endif
1329    }
1330
1331    Int *tempArray = NULL;   // Contain the value
1332
1333#if O0098_SCALED_REF_LAYER_ID
1334    // ID //
1335    if(strcmp(cfg_scaledRefLayerId[layer].c_str(),  ""))
1336    {
1337      cfgStringToArray( &tempArray, cfg_scaledRefLayerId[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "ScaledRefLayerId");
1338      if(tempArray)
1339      {
1340        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1341        {
1342          m_acLayerCfg[layer].m_scaledRefLayerId[i] = tempArray[i];
1343        }
1344        delete [] tempArray; tempArray = NULL;
1345      }
1346    }
1347#endif
1348
1349#if REF_REGION_OFFSET
1350    // Presense Flag //
1351    if(strcmp(cfg_scaledRefLayerOffsetPresentFlag[layer].c_str(),  ""))
1352    {
1353      cfgStringToArray( &tempArray, cfg_scaledRefLayerOffsetPresentFlag[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "ScaledRefLayerOffsetPresentFlag");
1354      if(tempArray)
1355      {
1356        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1357        {
1358          m_acLayerCfg[layer].m_scaledRefLayerOffsetPresentFlag[i] = tempArray[i];
1359        }
1360        delete [] tempArray; tempArray = NULL;
1361      }
1362    }
1363#endif
1364
1365    // Left offset //
1366    if(strcmp(cfg_scaledRefLayerLeftOffset[layer].c_str(),  ""))
1367    {
1368      cfgStringToArray( &tempArray, cfg_scaledRefLayerLeftOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "LeftOffset");
1369      if(tempArray)
1370      {
1371        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1372        {
1373          m_acLayerCfg[layer].m_scaledRefLayerLeftOffset[i] = tempArray[i];
1374        }
1375        delete [] tempArray; tempArray = NULL;
1376      }
1377    }
1378
1379    // Top offset //
1380    if(strcmp(cfg_scaledRefLayerTopOffset[layer].c_str(),  ""))
1381    {
1382      cfgStringToArray( &tempArray, cfg_scaledRefLayerTopOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "TopOffset");
1383      if(tempArray)
1384      {
1385        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1386        {
1387          m_acLayerCfg[layer].m_scaledRefLayerTopOffset[i] = tempArray[i];
1388        }
1389        delete [] tempArray; tempArray = NULL;
1390      }
1391    }
1392
1393    // Right offset //
1394    if(strcmp(cfg_scaledRefLayerRightOffset[layer].c_str(),  ""))
1395    {
1396      cfgStringToArray( &tempArray, cfg_scaledRefLayerRightOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "RightOffset");
1397      if(tempArray)
1398      {
1399        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1400        {
1401          m_acLayerCfg[layer].m_scaledRefLayerRightOffset[i] = tempArray[i];
1402        }
1403        delete [] tempArray; tempArray = NULL;
1404      }
1405    }
1406
1407    // Bottom offset //
1408    if(strcmp(cfg_scaledRefLayerBottomOffset[layer].c_str(),  ""))
1409    {
1410      cfgStringToArray( &tempArray, cfg_scaledRefLayerBottomOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "BottomOffset");
1411      if(tempArray)
1412      {
1413        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1414        {
1415          m_acLayerCfg[layer].m_scaledRefLayerBottomOffset[i] = tempArray[i];
1416        }
1417        delete [] tempArray; tempArray = NULL;
1418      }
1419    }
1420#if P0312_VERT_PHASE_ADJ
1421   // VertPhasePositionEnableFlag //
1422    if(strcmp(cfg_vertPhasePositionEnableFlag[layer].c_str(),  ""))
1423    {
1424      cfgStringToArray( &tempArray, cfg_vertPhasePositionEnableFlag[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "VertPhasePositionEnableFlag");
1425      if(tempArray)
1426      {
1427        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1428        {
1429          m_acLayerCfg[layer].m_vertPhasePositionEnableFlag[i] = tempArray[i];
1430        }
1431        delete [] tempArray; tempArray = NULL;
1432      }
1433    }
1434#endif
1435#if REF_REGION_OFFSET
1436    // Presense Flag //
1437    if(strcmp(cfg_refRegionOffsetPresentFlag[layer].c_str(),  ""))
1438    {
1439      cfgStringToArray( &tempArray, cfg_refRegionOffsetPresentFlag[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "RefRegionOffsetPresentFlag");
1440      if(tempArray)
1441      {
1442        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1443        {
1444          m_acLayerCfg[layer].m_refRegionOffsetPresentFlag[i] = tempArray[i];
1445        }
1446        delete [] tempArray; tempArray = NULL;
1447      }
1448    }
1449
1450    // Left offset //
1451    if(strcmp(cfg_refRegionLeftOffset[layer].c_str(),  ""))
1452    {
1453      cfgStringToArray( &tempArray, cfg_refRegionLeftOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "RefRegionLeftOffset");
1454      if(tempArray)
1455      {
1456        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1457        {
1458          m_acLayerCfg[layer].m_refRegionLeftOffset[i] = tempArray[i];
1459        }
1460        delete [] tempArray; tempArray = NULL;
1461      }
1462    }
1463
1464    // Top offset //
1465    if(strcmp(cfg_refRegionTopOffset[layer].c_str(),  ""))
1466    {
1467      cfgStringToArray( &tempArray, cfg_refRegionTopOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "RefRegionTopOffset");
1468      if(tempArray)
1469      {
1470        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1471        {
1472          m_acLayerCfg[layer].m_refRegionTopOffset[i] = tempArray[i];
1473        }
1474        delete [] tempArray; tempArray = NULL;
1475      }
1476    }
1477
1478    // Right offset //
1479    if(strcmp(cfg_refRegionRightOffset[layer].c_str(),  ""))
1480    {
1481      cfgStringToArray( &tempArray, cfg_refRegionRightOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "RefRegionRightOffset");
1482      if(tempArray)
1483      {
1484        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1485        {
1486          m_acLayerCfg[layer].m_refRegionRightOffset[i] = tempArray[i];
1487        }
1488        delete [] tempArray; tempArray = NULL;
1489      }
1490    }
1491
1492    // Bottom offset //
1493    if(strcmp(cfg_refRegionBottomOffset[layer].c_str(),  ""))
1494    {
1495      cfgStringToArray( &tempArray, cfg_refRegionBottomOffset[layer], m_acLayerCfg[layer].m_numScaledRefLayerOffsets, "RefRegionBottomOffset");
1496      if(tempArray)
1497      {
1498        for(Int i = 0; i < m_acLayerCfg[layer].m_numScaledRefLayerOffsets; i++)
1499        {
1500          m_acLayerCfg[layer].m_refRegionBottomOffset[i] = tempArray[i];
1501        }
1502        delete [] tempArray; tempArray = NULL;
1503      }
1504    }
1505#endif
1506#if R0209_GENERIC_PHASE
1507    Int numPhaseSet = m_acLayerCfg[layer].m_numScaledRefLayerOffsets;
1508
1509    // Presense Flag //
1510    if(strcmp(cfg_resamplePhaseSetPresentFlag[layer].c_str(),  ""))
1511    {
1512      cfgStringToArray( &tempArray, cfg_resamplePhaseSetPresentFlag[layer], numPhaseSet, "resamplePhaseSetPresentFlag");
1513      if(tempArray)
1514      {
1515        for(Int i = 0; i < numPhaseSet; i++)
1516        {
1517          m_acLayerCfg[layer].m_resamplePhaseSetPresentFlag[i] = tempArray[i];
1518        }
1519        delete [] tempArray; tempArray = NULL;
1520      }
1521    }
1522
1523    // Luma horizontal phase //
1524    if(strcmp(cfg_phaseHorLuma[layer].c_str(),  ""))
1525    {
1526      cfgStringToArray( &tempArray, cfg_phaseHorLuma[layer], numPhaseSet, "phaseHorLuma");
1527      if(tempArray)
1528      {
1529        for(Int i = 0; i < numPhaseSet; i++)
1530        {
1531          m_acLayerCfg[layer].m_phaseHorLuma[i] = tempArray[i];
1532        }
1533        delete [] tempArray; tempArray = NULL;
1534      }
1535    }
1536
1537    // Luma vertical phase //
1538    if(strcmp(cfg_phaseVerLuma[layer].c_str(),  ""))
1539    {
1540      cfgStringToArray( &tempArray, cfg_phaseVerLuma[layer], numPhaseSet, "phaseVerLuma");
1541      if(tempArray)
1542      {
1543        for(Int i = 0; i < numPhaseSet; i++)
1544        {
1545          m_acLayerCfg[layer].m_phaseVerLuma[i] = tempArray[i];
1546        }
1547        delete [] tempArray; tempArray = NULL;
1548      }
1549    }
1550
1551    // Chroma horizontal phase //
1552    if(strcmp(cfg_phaseHorChroma[layer].c_str(),  ""))
1553    {
1554      cfgStringToArray( &tempArray, cfg_phaseHorChroma[layer], numPhaseSet, "phaseHorChroma");
1555      if(tempArray)
1556      {
1557        for(Int i = 0; i < numPhaseSet; i++)
1558        {
1559          m_acLayerCfg[layer].m_phaseHorChroma[i] = tempArray[i];
1560        }
1561        delete [] tempArray; tempArray = NULL;
1562      }
1563    }
1564
1565    // Chroma vertical phase //
1566    if(strcmp(cfg_phaseVerChroma[layer].c_str(),  ""))
1567    {
1568      cfgStringToArray( &tempArray, cfg_phaseVerChroma[layer], numPhaseSet, "phaseVerChroma");
1569      if(tempArray)
1570      {
1571        for(Int i = 0; i < numPhaseSet; i++)
1572        {
1573          m_acLayerCfg[layer].m_phaseVerChroma[i] = tempArray[i];
1574        }
1575        delete [] tempArray; tempArray = NULL;
1576      }
1577    }
1578#endif
1579  }
1580
1581#if VPS_EXTN_DIRECT_REF_LAYERS
1582  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1583  {
1584    Char* pSamplePredRefLayerIds = cfg_samplePredRefLayerIds[layer].empty() ? NULL: strdup(cfg_samplePredRefLayerIds[layer].c_str());
1585    if( m_acLayerCfg[layer].m_numSamplePredRefLayers > 0 )
1586    {
1587      char *samplePredRefLayerId;
1588      int  i=0;
1589      m_acLayerCfg[layer].m_samplePredRefLayerIds = new Int[m_acLayerCfg[layer].m_numSamplePredRefLayers];
1590      samplePredRefLayerId = strtok(pSamplePredRefLayerIds, " ,-");
1591      while(samplePredRefLayerId != NULL)
1592      {
1593        if( i >= m_acLayerCfg[layer].m_numSamplePredRefLayers )
1594        {
1595          printf( "NumSamplePredRefLayers%d: The number of columns whose width are defined is larger than the allowed number of columns.\n", layer );
1596          exit( EXIT_FAILURE );
1597        }
1598        *( m_acLayerCfg[layer].m_samplePredRefLayerIds + i ) = atoi( samplePredRefLayerId );
1599        samplePredRefLayerId = strtok(NULL, " ,-");
1600        i++;
1601      }
1602      if( i < m_acLayerCfg[layer].m_numSamplePredRefLayers )
1603      {
1604        printf( "NumSamplePredRefLayers%d: The width of some columns is not defined.\n", layer );
1605        exit( EXIT_FAILURE );
1606      }
1607    }
1608    else
1609    {
1610      m_acLayerCfg[layer].m_samplePredRefLayerIds = NULL;
1611    }
1612
1613    if( pSamplePredRefLayerIds )
1614    {
1615      free( pSamplePredRefLayerIds );
1616      pSamplePredRefLayerIds = NULL;
1617    }
1618  }
1619  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1620  {
1621    Char* pMotionPredRefLayerIds = cfg_motionPredRefLayerIds[layer].empty() ? NULL: strdup(cfg_motionPredRefLayerIds[layer].c_str());
1622    if( m_acLayerCfg[layer].m_numMotionPredRefLayers > 0 )
1623    {
1624      char *motionPredRefLayerId;
1625      int  i=0;
1626      m_acLayerCfg[layer].m_motionPredRefLayerIds = new Int[m_acLayerCfg[layer].m_numMotionPredRefLayers];
1627      motionPredRefLayerId = strtok(pMotionPredRefLayerIds, " ,-");
1628      while(motionPredRefLayerId != NULL)
1629      {
1630        if( i >= m_acLayerCfg[layer].m_numMotionPredRefLayers )
1631        {
1632          printf( "NumMotionPredRefLayers%d: The number of columns whose width are defined is larger than the allowed number of columns.\n", layer );
1633          exit( EXIT_FAILURE );
1634        }
1635        *( m_acLayerCfg[layer].m_motionPredRefLayerIds + i ) = atoi( motionPredRefLayerId );
1636        motionPredRefLayerId = strtok(NULL, " ,-");
1637        i++;
1638      }
1639      if( i < m_acLayerCfg[layer].m_numMotionPredRefLayers )
1640      {
1641        printf( "NumMotionPredRefLayers%d: The width of some columns is not defined.\n", layer );
1642        exit( EXIT_FAILURE );
1643      }
1644    }
1645    else
1646    {
1647      m_acLayerCfg[layer].m_motionPredRefLayerIds = NULL;
1648    }
1649
1650    if( pMotionPredRefLayerIds )
1651    {
1652      free( pMotionPredRefLayerIds );
1653      pMotionPredRefLayerIds = NULL;
1654    }
1655  }
1656
1657#if AUXILIARY_PICTURES
1658  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
1659  {
1660    m_acLayerCfg[layer].m_InputChromaFormat =  numberToChromaFormat(cfg_tmpChromaFormatIDC[layer]);
1661    m_acLayerCfg[layer].m_chromaFormatIDC = ((cfg_tmpChromaFormatIDC[layer] == 0) ? (m_acLayerCfg[layer].m_InputChromaFormat ) : (numberToChromaFormat(cfg_tmpChromaFormatIDC[layer])));
1662  }
1663#endif
1664  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1665  {
1666    Char* pPredLayerIds = cfg_predLayerIds[layer].empty() ? NULL: strdup(cfg_predLayerIds[layer].c_str());
1667    if( m_acLayerCfg[layer].m_numActiveRefLayers > 0 )
1668    {
1669      char *refLayerId;
1670      int  i=0;
1671      m_acLayerCfg[layer].m_predLayerIds = new Int[m_acLayerCfg[layer].m_numActiveRefLayers];
1672      refLayerId = strtok(pPredLayerIds, " ,-");
1673      while(refLayerId != NULL)
1674      {
1675        if( i >= m_acLayerCfg[layer].m_numActiveRefLayers )
1676        {
1677          printf( "NumActiveRefLayers%d: The number of columns whose width are defined is larger than the allowed number of columns.\n", layer );
1678          exit( EXIT_FAILURE );
1679        }
1680        *( m_acLayerCfg[layer].m_predLayerIds + i ) = atoi( refLayerId );
1681        refLayerId = strtok(NULL, " ,-");
1682        i++;
1683      }
1684      if( i < m_acLayerCfg[layer].m_numActiveRefLayers )
1685      {
1686        printf( "NumActiveRefLayers%d: The width of some columns is not defined.\n", layer );
1687        exit( EXIT_FAILURE );
1688      }
1689    }
1690    else
1691    {
1692      m_acLayerCfg[layer].m_predLayerIds = NULL;
1693    }
1694
1695    if( pPredLayerIds )
1696    {
1697      free( pPredLayerIds );
1698      pPredLayerIds = NULL;
1699    }
1700  }
1701#endif
1702#if Q0078_ADD_LAYER_SETS
1703  for (Int layerSet = 0; layerSet < m_numLayerSets; layerSet++)
1704  {
1705    if (m_numLayerInIdList[layerSet] > 0)
1706    {
1707      Char* layerSetLayerIdListDup = cfg_layerSetLayerIdList[layerSet].empty() ? NULL : strdup(cfg_layerSetLayerIdList[layerSet].c_str());
1708      Int  i = 0;
1709      char *layerId = strtok(layerSetLayerIdListDup, " ,-");
1710      while (layerId != NULL)
1711      {
1712        if (i >= m_numLayerInIdList[layerSet])
1713        {
1714          printf("NumLayerInIdList%d: The number of layers in the set is larger than the allowed number of layers.\n", layerSet);
1715          exit(EXIT_FAILURE);
1716        }
1717        m_layerSetLayerIdList[layerSet][i] = atoi(layerId);
1718        layerId = strtok(NULL, " ,-");
1719        i++;
1720      }
1721
1722      if( layerSetLayerIdListDup )
1723      {
1724        free( layerSetLayerIdListDup );
1725        layerSetLayerIdListDup = NULL;
1726      }
1727    }
1728  }
1729  for (Int addLayerSet = 0; addLayerSet < m_numAddLayerSets; addLayerSet++)
1730  {
1731    if (m_numHighestLayerIdx[addLayerSet] > 0)
1732    {
1733      Char* highestLayrIdxListDup = cfg_highestLayerIdx[addLayerSet].empty() ? NULL : strdup(cfg_highestLayerIdx[addLayerSet].c_str());
1734      Int  i = 0;
1735      char *layerIdx = strtok(highestLayrIdxListDup, " ,-");
1736      while (layerIdx != NULL)
1737      {
1738        if (i >= m_numLayerInIdList[addLayerSet])
1739        {
1740          printf("NumLayerInIdList%d: The number of layer idx's in the highest layer idx list is larger than the allowed number of idx's.\n", addLayerSet);
1741          exit(EXIT_FAILURE);
1742        }
1743        m_highestLayerIdx[addLayerSet][i] = atoi(layerIdx);
1744        layerIdx = strtok(NULL, " ,-");
1745        i++;
1746      }
1747
1748      if( highestLayrIdxListDup )
1749      {
1750        free( highestLayrIdxListDup );
1751        highestLayrIdxListDup = NULL;
1752      }
1753    }
1754  }
1755#endif
1756#endif //SVC_EXTENSION
1757  m_scalingListFile = cfg_ScalingListFile.empty() ? NULL : strdup(cfg_ScalingListFile.c_str());
1758
1759  /* rules for input, output and internal bitdepths as per help text */
1760#if O0194_DIFFERENT_BITDEPTH_EL_BL
1761  for(Int layer = 0; layer < MAX_LAYERS; layer++)
1762  {
1763    if (!m_acLayerCfg[layer].m_internalBitDepthY) { m_acLayerCfg[layer].m_internalBitDepthY = m_acLayerCfg[layer].m_inputBitDepthY; }
1764    if (!m_acLayerCfg[layer].m_internalBitDepthC) { m_acLayerCfg[layer].m_internalBitDepthC = m_acLayerCfg[layer].m_internalBitDepthY; }
1765    if (!m_acLayerCfg[layer].m_inputBitDepthC) { m_acLayerCfg[layer].m_inputBitDepthC = m_acLayerCfg[layer].m_inputBitDepthY; }
1766    if (!m_acLayerCfg[layer].m_outputBitDepthY) { m_acLayerCfg[layer].m_outputBitDepthY = m_acLayerCfg[layer].m_internalBitDepthY; }
1767    if (!m_acLayerCfg[layer].m_outputBitDepthC) { m_acLayerCfg[layer].m_outputBitDepthC = m_acLayerCfg[layer].m_internalBitDepthC; }
1768  }
1769#else
1770  if (!m_internalBitDepthY) { m_internalBitDepthY = m_inputBitDepthY; }
1771  if (!m_internalBitDepthC) { m_internalBitDepthC = m_internalBitDepthY; }
1772  if (!m_inputBitDepthC) { m_inputBitDepthC = m_inputBitDepthY; }
1773  if (!m_outputBitDepthY) { m_outputBitDepthY = m_internalBitDepthY; }
1774  if (!m_outputBitDepthC) { m_outputBitDepthC = m_internalBitDepthC; }
1775#endif
1776
1777#if !SVC_EXTENSION
1778  // TODO:ChromaFmt assumes 4:2:0 below
1779  switch (m_conformanceWindowMode)
1780  {
1781  case 0:
1782    {
1783      // no conformance or padding
1784      m_confWinLeft = m_confWinRight = m_confWinTop = m_confWinBottom = 0;
1785      m_aiPad[1] = m_aiPad[0] = 0;
1786      break;
1787    }
1788  case 1:
1789    {
1790      // automatic padding to minimum CU size
1791      Int minCuSize = m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1);
1792      if (m_iSourceWidth % minCuSize)
1793      {
1794        m_aiPad[0] = m_confWinRight  = ((m_iSourceWidth / minCuSize) + 1) * minCuSize - m_iSourceWidth;
1795        m_iSourceWidth  += m_confWinRight;
1796      }
1797      if (m_iSourceHeight % minCuSize)
1798      {
1799        m_aiPad[1] = m_confWinBottom = ((m_iSourceHeight / minCuSize) + 1) * minCuSize - m_iSourceHeight;
1800        m_iSourceHeight += m_confWinBottom;
1801        if ( m_isField )
1802        {
1803          m_iSourceHeightOrg += m_confWinBottom << 1;
1804          m_aiPad[1] = m_confWinBottom << 1;
1805        }
1806      }
1807      if (m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0)
1808      {
1809        fprintf(stderr, "Error: picture width is not an integer multiple of the specified chroma subsampling\n");
1810        exit(EXIT_FAILURE);
1811      }
1812      if (m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0)
1813      {
1814        fprintf(stderr, "Error: picture height is not an integer multiple of the specified chroma subsampling\n");
1815        exit(EXIT_FAILURE);
1816      }
1817      break;
1818    }
1819  case 2:
1820    {
1821      //padding
1822      m_iSourceWidth  += m_aiPad[0];
1823      m_iSourceHeight += m_aiPad[1];
1824      m_confWinRight  = m_aiPad[0];
1825      m_confWinBottom = m_aiPad[1];
1826      break;
1827    }
1828  case 3:
1829    {
1830      // conformance
1831      if ((m_confWinLeft == 0) && (m_confWinRight == 0) && (m_confWinTop == 0) && (m_confWinBottom == 0))
1832      {
1833        fprintf(stderr, "Warning: Conformance window enabled, but all conformance window parameters set to zero\n");
1834      }
1835      if ((m_aiPad[1] != 0) || (m_aiPad[0]!=0))
1836      {
1837        fprintf(stderr, "Warning: Conformance window enabled, padding parameters will be ignored\n");
1838      }
1839      m_aiPad[1] = m_aiPad[0] = 0;
1840      break;
1841    }
1842  }
1843 
1844  // allocate slice-based dQP values
1845  m_aidQP = new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ];
1846  ::memset( m_aidQP, 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );
1847 
1848  // handling of floating-point QP values
1849  // if QP is not integer, sequence is split into two sections having QP and QP+1
1850  m_iQP = (Int)( m_fQP );
1851  if ( m_iQP < m_fQP )
1852  {
1853    Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP - m_iQP)*m_framesToBeEncoded + 0.5 );
1854   
1855    iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
1856    for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
1857    {
1858      m_aidQP[i] = 1;
1859    }
1860  }
1861 
1862  // reading external dQP description from file
1863  if ( m_pchdQPFile )
1864  {
1865    FILE* fpt=fopen( m_pchdQPFile, "r" );
1866    if ( fpt )
1867    {
1868      Int iValue;
1869      Int iPOC = 0;
1870      while ( iPOC < m_framesToBeEncoded )
1871      {
1872        if ( fscanf(fpt, "%d", &iValue ) == EOF ) break;
1873        m_aidQP[ iPOC ] = iValue;
1874        iPOC++;
1875      }
1876      fclose(fpt);
1877    }
1878  }
1879  m_iWaveFrontSubstreams = m_iWaveFrontSynchro ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1;
1880#endif
1881  if( m_toneMappingInfoSEIEnabled && !m_toneMapCancelFlag )
1882  {
1883    Char* pcStartOfCodedInterval = cfg_startOfCodedInterval.empty() ? NULL: strdup(cfg_startOfCodedInterval.c_str());
1884    Char* pcCodedPivotValue = cfg_codedPivotValue.empty() ? NULL: strdup(cfg_codedPivotValue.c_str());
1885    Char* pcTargetPivotValue = cfg_targetPivotValue.empty() ? NULL: strdup(cfg_targetPivotValue.c_str());
1886    if( m_toneMapModelId == 2 && pcStartOfCodedInterval )
1887    {
1888      char *startOfCodedInterval;
1889      UInt num = 1u<< m_toneMapTargetBitDepth;
1890      m_startOfCodedInterval = new Int[num];
1891      ::memset( m_startOfCodedInterval, 0, sizeof(Int)*num );
1892      startOfCodedInterval = strtok(pcStartOfCodedInterval, " .");
1893      int i = 0;
1894      while( startOfCodedInterval && ( i < num ) )
1895      {
1896        m_startOfCodedInterval[i] = atoi( startOfCodedInterval );
1897        startOfCodedInterval = strtok(NULL, " .");
1898        i++;
1899      }
1900    } 
1901    else
1902    {
1903      m_startOfCodedInterval = NULL;
1904    }
1905    if( ( m_toneMapModelId == 3 ) && ( m_numPivots > 0 ) )
1906    {
1907      if( pcCodedPivotValue && pcTargetPivotValue )
1908      {
1909        char *codedPivotValue;
1910        char *targetPivotValue;
1911        m_codedPivotValue = new Int[m_numPivots];
1912        m_targetPivotValue = new Int[m_numPivots];
1913        ::memset( m_codedPivotValue, 0, sizeof(Int)*( m_numPivots ) );
1914        ::memset( m_targetPivotValue, 0, sizeof(Int)*( m_numPivots ) );
1915        codedPivotValue = strtok(pcCodedPivotValue, " .");
1916        int i=0;
1917        while(codedPivotValue&&i<m_numPivots)
1918        {
1919          m_codedPivotValue[i] = atoi( codedPivotValue );
1920          codedPivotValue = strtok(NULL, " .");
1921          i++;
1922        }
1923        i=0;
1924        targetPivotValue = strtok(pcTargetPivotValue, " .");
1925        while(targetPivotValue&&i<m_numPivots)
1926        {
1927          m_targetPivotValue[i]= atoi( targetPivotValue );
1928          targetPivotValue = strtok(NULL, " .");
1929          i++;
1930        }
1931      }
1932    }
1933    else
1934    {
1935      m_codedPivotValue = NULL;
1936      m_targetPivotValue = NULL;
1937    }
1938
1939    if( pcStartOfCodedInterval )
1940    {
1941      free( pcStartOfCodedInterval );
1942      pcStartOfCodedInterval = NULL;
1943    }
1944
1945    if( pcCodedPivotValue )
1946    {
1947      free( pcCodedPivotValue );
1948      pcCodedPivotValue = NULL;
1949    }
1950
1951    if( pcTargetPivotValue )
1952    {
1953      free( pcTargetPivotValue );
1954      pcTargetPivotValue = NULL;
1955    }
1956  }
1957#if P0050_KNEE_FUNCTION_SEI
1958  if( m_kneeSEIEnabled && !m_kneeSEICancelFlag )
1959  {
1960    Char* pcInputKneePointValue  = cfg_kneeSEIInputKneePointValue.empty()  ? NULL : strdup(cfg_kneeSEIInputKneePointValue.c_str());
1961    Char* pcOutputKneePointValue = cfg_kneeSEIOutputKneePointValue.empty() ? NULL : strdup(cfg_kneeSEIOutputKneePointValue.c_str());
1962    assert ( m_kneeSEINumKneePointsMinus1 >= 0 && m_kneeSEINumKneePointsMinus1 < 999 );
1963    m_kneeSEIInputKneePoint = new Int[m_kneeSEINumKneePointsMinus1+1];
1964    m_kneeSEIOutputKneePoint = new Int[m_kneeSEINumKneePointsMinus1+1];
1965    char *InputVal = strtok(pcInputKneePointValue, " .,");
1966    Int i=0;
1967    while( InputVal && i<(m_kneeSEINumKneePointsMinus1+1) )
1968    {
1969      m_kneeSEIInputKneePoint[i] = (UInt) atoi( InputVal );
1970      InputVal = strtok(NULL, " .,");
1971      i++;
1972    }
1973    char *OutputVal = strtok(pcOutputKneePointValue, " .,");
1974    i=0;
1975    while( OutputVal && i<(m_kneeSEINumKneePointsMinus1+1) )
1976    {
1977      m_kneeSEIOutputKneePoint[i] = (UInt) atoi( OutputVal );
1978      OutputVal = strtok(NULL, " .,");
1979      i++;
1980    }
1981
1982    if( pcInputKneePointValue )
1983    {
1984      free( pcInputKneePointValue );
1985      pcInputKneePointValue = NULL;
1986    }
1987
1988    if( pcOutputKneePointValue )
1989    {
1990      free( pcOutputKneePointValue );
1991      pcOutputKneePointValue = NULL;
1992    }
1993  }
1994#endif
1995#if Q0074_COLOUR_REMAPPING_SEI
1996#if !SVC_EXTENSION
1997  // reading external Colour Remapping Information SEI message parameters from file
1998  if( m_colourRemapSEIFile.length() )
1999  {
2000    FILE* fic;
2001    Int retval;
2002    if((fic = fopen(m_colourRemapSEIFile.c_str(),"r")) == (FILE*)NULL)
2003    {
2004      fprintf(stderr, "Can't open Colour Remapping Information SEI parameters file %s\n", m_colourRemapSEIFile.c_str());
2005      exit(EXIT_FAILURE);
2006    }
2007
2008    retval = fscanf( fic, "%d", &m_colourRemapSEIId );
2009    retval = fscanf( fic, "%d", &m_colourRemapSEICancelFlag );
2010    if( !m_colourRemapSEICancelFlag )
2011    {
2012      retval = fscanf( fic, "%d", &m_colourRemapSEIPersistenceFlag );
2013      retval = fscanf( fic, "%d", &m_colourRemapSEIVideoSignalTypePresentFlag);
2014      if( m_colourRemapSEIVideoSignalTypePresentFlag )
2015      {
2016        retval = fscanf( fic, "%d", &m_colourRemapSEIVideoFullRangeFlag  );
2017        retval = fscanf( fic, "%d", &m_colourRemapSEIPrimaries );
2018        retval = fscanf( fic, "%d", &m_colourRemapSEITransferCharacteristics );
2019        retval = fscanf( fic, "%d", &m_colourRemapSEIMatrixCoeffs );
2020      }
2021
2022      retval = fscanf( fic, "%d", &m_colourRemapSEICodedDataBitDepth );
2023      retval = fscanf( fic, "%d", &m_colourRemapSEITargetBitDepth );
2024 
2025      for( Int c=0 ; c<3 ; c++ )
2026      {
2027        retval = fscanf( fic, "%d", &m_colourRemapSEIPreLutNumValMinus1[c] );
2028        if( m_colourRemapSEIPreLutNumValMinus1[c]>0 )
2029        {
2030          m_colourRemapSEIPreLutCodedValue[c]  = new Int[m_colourRemapSEIPreLutNumValMinus1[c]+1];
2031          m_colourRemapSEIPreLutTargetValue[c] = new Int[m_colourRemapSEIPreLutNumValMinus1[c]+1];
2032          for( Int i=0 ; i<=m_colourRemapSEIPreLutNumValMinus1[c] ; i++ )
2033          {
2034            retval = fscanf( fic, "%d", &m_colourRemapSEIPreLutCodedValue[c][i] );
2035            retval = fscanf( fic, "%d", &m_colourRemapSEIPreLutTargetValue[c][i] );
2036          }
2037        }
2038      }
2039
2040      retval = fscanf( fic, "%d", &m_colourRemapSEIMatrixPresentFlag );
2041      if( m_colourRemapSEIMatrixPresentFlag )
2042      {
2043        retval = fscanf( fic, "%d", &m_colourRemapSEILog2MatrixDenom );
2044        for( Int c=0 ; c<3 ; c++ )
2045          for( Int i=0 ; i<3 ; i++ )
2046            retval = fscanf( fic, "%d", &m_colourRemapSEICoeffs[c][i] );
2047      }
2048
2049      for( Int c=0 ; c<3 ; c++ )
2050      {
2051        retval = fscanf( fic, "%d", &m_colourRemapSEIPostLutNumValMinus1[c] );
2052        if( m_colourRemapSEIPostLutNumValMinus1[c]>0 )
2053        {
2054          m_colourRemapSEIPostLutCodedValue[c]  = new Int[m_colourRemapSEIPostLutNumValMinus1[c]+1];
2055          m_colourRemapSEIPostLutTargetValue[c] = new Int[m_colourRemapSEIPostLutNumValMinus1[c]+1];
2056          for( Int i=0 ; i<=m_colourRemapSEIPostLutNumValMinus1[c] ; i++ )
2057          {
2058            retval = fscanf( fic, "%d", &m_colourRemapSEIPostLutCodedValue[c][i] );
2059            retval = fscanf( fic, "%d", &m_colourRemapSEIPostLutTargetValue[c][i] );
2060          }
2061        }
2062      }
2063    }
2064
2065    fclose( fic );
2066    if( retval != 1 )
2067    {
2068      fprintf(stderr, "Error while reading Colour Remapping Information SEI parameters file\n");
2069      exit(EXIT_FAILURE);
2070    }
2071  }
2072#else
2073   // Reading external Colour Remapping Information SEI message parameters from file
2074  // It seems that TAppEncLayerCfg::parseCfg is not used
2075  for(UInt layer = 0; layer < m_numLayers; layer++)
2076  {
2077    if( cfg_colourRemapSEIFile[layer]->length() )
2078    {
2079      FILE* fic;
2080      Int retval;
2081      if((fic = fopen(cfg_colourRemapSEIFile[layer]->c_str(),"r")) == (FILE*)NULL)
2082      {
2083        fprintf(stderr, "Can't open Colour Remapping Information SEI parameters file %s\n", cfg_colourRemapSEIFile[layer]->c_str());
2084        exit(EXIT_FAILURE);
2085      }
2086
2087      retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIId );
2088      retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEICancelFlag );
2089      if( !m_acLayerCfg[layer].m_colourRemapSEICancelFlag )
2090      {
2091        retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIPersistenceFlag );
2092        retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIVideoSignalTypePresentFlag);
2093        if( m_acLayerCfg[layer].m_colourRemapSEIVideoSignalTypePresentFlag )
2094        {
2095          retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIVideoFullRangeFlag  );
2096          retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIPrimaries );
2097          retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEITransferCharacteristics );
2098          retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIMatrixCoeffs );
2099        }
2100
2101        retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEICodedDataBitDepth );
2102        retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEITargetBitDepth );
2103 
2104        for( Int c=0 ; c<3 ; c++ )
2105        {
2106          retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIPreLutNumValMinus1[c] );
2107          if( m_acLayerCfg[layer].m_colourRemapSEIPreLutNumValMinus1[c]>0 )
2108          {
2109            m_acLayerCfg[layer].m_colourRemapSEIPreLutCodedValue[c]  = new Int[m_acLayerCfg[layer].m_colourRemapSEIPreLutNumValMinus1[c]+1];
2110            m_acLayerCfg[layer].m_colourRemapSEIPreLutTargetValue[c] = new Int[m_acLayerCfg[layer].m_colourRemapSEIPreLutNumValMinus1[c]+1];
2111            for( Int i=0 ; i<=m_acLayerCfg[layer].m_colourRemapSEIPreLutNumValMinus1[c] ; i++ )
2112            {
2113              retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIPreLutCodedValue[c][i] );
2114              retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIPreLutTargetValue[c][i] );
2115            }
2116          }
2117        }
2118
2119        retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIMatrixPresentFlag );
2120        if( m_acLayerCfg[layer].m_colourRemapSEIMatrixPresentFlag )
2121        {
2122          retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEILog2MatrixDenom );
2123          for( Int c=0 ; c<3 ; c++ )
2124            for( Int i=0 ; i<3 ; i++ )
2125              retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEICoeffs[c][i] );
2126        }
2127
2128        for( Int c=0 ; c<3 ; c++ )
2129        {
2130          retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIPostLutNumValMinus1[c] );
2131          if( m_acLayerCfg[layer].m_colourRemapSEIPostLutNumValMinus1[c]>0 )
2132          {
2133            m_acLayerCfg[layer].m_colourRemapSEIPostLutCodedValue[c]  = new Int[m_acLayerCfg[layer].m_colourRemapSEIPostLutNumValMinus1[c]+1];
2134            m_acLayerCfg[layer].m_colourRemapSEIPostLutTargetValue[c] = new Int[m_acLayerCfg[layer].m_colourRemapSEIPostLutNumValMinus1[c]+1];
2135            for( Int i=0 ; i<=m_acLayerCfg[layer].m_colourRemapSEIPostLutNumValMinus1[c] ; i++ )
2136            {
2137              retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIPostLutCodedValue[c][i] );
2138              retval = fscanf( fic, "%d", &m_acLayerCfg[layer].m_colourRemapSEIPostLutTargetValue[c][i] );
2139            }
2140          }
2141        }
2142      }
2143
2144      fclose( fic );
2145      if( retval != 1 )
2146      {
2147        fprintf(stderr, "Error while reading Colour Remapping Information SEI parameters file\n");
2148        exit(EXIT_FAILURE);
2149      }
2150    }
2151  }
2152#endif
2153#endif
2154#if N0383_IL_CONSTRAINED_TILE_SETS_SEI
2155  if (m_interLayerConstrainedTileSetsSEIEnabled)
2156  {
2157    if (m_numTileColumnsMinus1 == 0 && m_numTileRowsMinus1 == 0)
2158    {
2159      printf( "Tiles are not defined (needed for inter-layer comnstrained tile sets SEI).\n" );
2160      exit( EXIT_FAILURE );
2161    }
2162    Char* pTileSets = cfg_tileSets.empty() ? NULL : strdup(cfg_tileSets.c_str());
2163    int i = 0;
2164    char *topLeftTileIndex = strtok(pTileSets, " ,");
2165    while(topLeftTileIndex != NULL)
2166    {
2167      if( i >= m_ilNumSetsInMessage )
2168      {
2169        printf( "The number of tile sets is larger than defined by IlNumSetsInMessage.\n" );
2170        exit( EXIT_FAILURE );
2171      }
2172      *( m_topLeftTileIndex + i ) = atoi( topLeftTileIndex );
2173      char *bottonRightTileIndex = strtok(NULL, " ,");
2174      if( bottonRightTileIndex == NULL )
2175      {
2176        printf( "BottonRightTileIndex is missing in the tile sets.\n" );
2177        exit( EXIT_FAILURE );
2178      }
2179      *( m_bottomRightTileIndex + i ) = atoi( bottonRightTileIndex );
2180      char *ilcIdc = strtok(NULL, " ,");
2181      if( ilcIdc == NULL )
2182      {
2183        printf( "IlcIdc is missing in the tile sets.\n" );
2184        exit( EXIT_FAILURE );
2185      }
2186      *( m_ilcIdc + i ) = atoi( ilcIdc );
2187      topLeftTileIndex = strtok(NULL, " ,");
2188      i++;
2189    }
2190    if( i < m_ilNumSetsInMessage )
2191    {
2192      printf( "The number of tile sets is smaller than defined by IlNumSetsInMessage.\n" );
2193      exit( EXIT_FAILURE );
2194    }
2195    m_skippedTileSetPresentFlag = false;
2196
2197    if( pTileSets )
2198    {
2199      free( pTileSets );
2200      pTileSets = NULL;
2201    }
2202  }
2203#endif
2204  // check validity of input parameters
2205  xCheckParameter();
2206 
2207  // set global varibles
2208#if LAYER_CTB
2209  for(Int layer = 0; layer < MAX_LAYERS; layer++)
2210  {
2211    xSetGlobal(layer);
2212  }
2213#else
2214  xSetGlobal();
2215#endif
2216 
2217  // print-out parameters
2218  xPrintParameter();
2219 
2220  return true;
2221}
2222// ====================================================================================================================
2223// Private member functions
2224// ====================================================================================================================
2225
2226Bool confirmPara(Bool bflag, const Char* message);
2227
2228Void TAppEncCfg::xCheckParameter()
2229{
2230  if (!m_decodedPictureHashSEIEnabled)
2231  {
2232    fprintf(stderr, "******************************************************************\n");
2233    fprintf(stderr, "** WARNING: --SEIDecodedPictureHash is now disabled by default. **\n");
2234    fprintf(stderr, "**          Automatic verification of decoded pictures by a     **\n");
2235    fprintf(stderr, "**          decoder requires this option to be enabled.         **\n");
2236    fprintf(stderr, "******************************************************************\n");
2237  }
2238  if( m_profile==Profile::NONE )
2239  {
2240    fprintf(stderr, "***************************************************************************\n");
2241    fprintf(stderr, "** WARNING: For conforming bitstreams a valid Profile value must be set! **\n");
2242    fprintf(stderr, "***************************************************************************\n");
2243  }
2244  if( m_level==Level::NONE )
2245  {
2246    fprintf(stderr, "***************************************************************************\n");
2247    fprintf(stderr, "** WARNING: For conforming bitstreams a valid Level value must be set!   **\n");
2248    fprintf(stderr, "***************************************************************************\n");
2249  }
2250
2251  Bool check_failed = false; /* abort if there is a fatal configuration problem */
2252#define xConfirmPara(a,b) check_failed |= confirmPara(a,b)
2253  // check range of parameters
2254#if O0194_DIFFERENT_BITDEPTH_EL_BL
2255  for(UInt layer=0; layer<m_numLayers; layer++)
2256  {
2257    xConfirmPara( m_acLayerCfg[layer].m_inputBitDepthY < 8,                                                     "InputBitDepth must be at least 8" );
2258    xConfirmPara( m_acLayerCfg[layer].m_inputBitDepthC < 8,                                                     "InputBitDepthC must be at least 8" );
2259  }
2260#else
2261  xConfirmPara( m_inputBitDepthY < 8,                                                     "InputBitDepth must be at least 8" );
2262  xConfirmPara( m_inputBitDepthC < 8,                                                     "InputBitDepthC must be at least 8" );
2263#endif
2264#if !SVC_EXTENSION 
2265  xConfirmPara( m_iFrameRate <= 0,                                                          "Frame rate must be more than 1" );
2266#endif
2267  xConfirmPara( m_framesToBeEncoded <= 0,                                                   "Total Number Of Frames encoded must be more than 0" );
2268  xConfirmPara( m_iGOPSize < 1 ,                                                            "GOP Size must be greater or equal to 1" );
2269  xConfirmPara( m_iGOPSize > 1 &&  m_iGOPSize % 2,                                          "GOP Size must be a multiple of 2, if GOP Size is greater than 1" );
2270#if !SVC_EXTENSION
2271  xConfirmPara( (m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, "Intra period must be more than GOP size, or -1 , not 0" );
2272#endif
2273#if ALLOW_RECOVERY_POINT_AS_RAP
2274  xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 3,                   "Decoding Refresh Type must be comprised between 0 and 3 included" );
2275  if(m_iDecodingRefreshType == 3)
2276  {
2277    xConfirmPara( !m_recoveryPointSEIEnabled,                                               "When using RecoveryPointSEI messages as RA points, recoveryPointSEI must be enabled" );
2278  }
2279#else
2280  xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 2,                   "Decoding Refresh Type must be equal to 0, 1 or 2" );
2281#endif
2282#if !SVC_EXTENSION
2283  xConfirmPara( m_iQP <  -6 * (m_internalBitDepthY - 8) || m_iQP > 51,                    "QP exceeds supported range (-QpBDOffsety to 51)" );
2284#endif
2285  xConfirmPara( m_loopFilterBetaOffsetDiv2 < -6 || m_loopFilterBetaOffsetDiv2 > 6,          "Loop Filter Beta Offset div. 2 exceeds supported range (-6 to 6)");
2286  xConfirmPara( m_loopFilterTcOffsetDiv2 < -6 || m_loopFilterTcOffsetDiv2 > 6,              "Loop Filter Tc Offset div. 2 exceeds supported range (-6 to 6)");
2287  xConfirmPara( m_iFastSearch < 0 || m_iFastSearch > 2,                                     "Fast Search Mode is not supported value (0:Full search  1:Diamond  2:PMVFAST)" );
2288  xConfirmPara( m_iSearchRange < 0 ,                                                        "Search Range must be more than 0" );
2289  xConfirmPara( m_bipredSearchRange < 0 ,                                                   "Search Range must be more than 0" );
2290  xConfirmPara( m_iMaxDeltaQP > 7,                                                          "Absolute Delta QP exceeds supported range (0 to 7)" );
2291#if LAYER_CTB
2292  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
2293  {
2294    xConfirmPara( m_iMaxCuDQPDepth > m_acLayerCfg[layer].m_uiMaxCUDepth - 1,                "Absolute depth for a minimum CuDQP exceeds maximum coding unit depth" );
2295  }
2296#else
2297  xConfirmPara( m_iMaxCuDQPDepth > m_uiMaxCUDepth - 1,                                          "Absolute depth for a minimum CuDQP exceeds maximum coding unit depth" );
2298#endif
2299
2300  xConfirmPara( m_cbQpOffset < -12,   "Min. Chroma Cb QP Offset is -12" );
2301  xConfirmPara( m_cbQpOffset >  12,   "Max. Chroma Cb QP Offset is  12" );
2302  xConfirmPara( m_crQpOffset < -12,   "Min. Chroma Cr QP Offset is -12" );
2303  xConfirmPara( m_crQpOffset >  12,   "Max. Chroma Cr QP Offset is  12" );
2304
2305  xConfirmPara( m_iQPAdaptationRange <= 0,                                                  "QP Adaptation Range must be more than 0" );
2306#if !SVC_EXTENSION
2307  if (m_iDecodingRefreshType == 2)
2308  {
2309    xConfirmPara( m_iIntraPeriod > 0 && m_iIntraPeriod <= m_iGOPSize ,                      "Intra period must be larger than GOP size for periodic IDR pictures");
2310  }
2311#endif
2312#if !LAYER_CTB
2313  xConfirmPara( (m_uiMaxCUWidth  >> m_uiMaxCUDepth) < 4,                                    "Minimum partition width size should be larger than or equal to 8");
2314  xConfirmPara( (m_uiMaxCUHeight >> m_uiMaxCUDepth) < 4,                                    "Minimum partition height size should be larger than or equal to 8");
2315  xConfirmPara( m_uiMaxCUWidth < 16,                                                        "Maximum partition width size should be larger than or equal to 16");
2316  xConfirmPara( m_uiMaxCUHeight < 16,                                                       "Maximum partition height size should be larger than or equal to 16");
2317#endif
2318#if !SVC_EXTENSION
2319  xConfirmPara( (m_iSourceWidth  % (m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame width must be a multiple of the minimum CU size");
2320  xConfirmPara( (m_iSourceHeight % (m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame height must be a multiple of the minimum CU size");
2321#endif
2322 
2323#if !LAYER_CTB
2324  xConfirmPara( m_uiQuadtreeTULog2MinSize < 2,                                        "QuadtreeTULog2MinSize must be 2 or greater.");
2325  xConfirmPara( m_uiQuadtreeTULog2MaxSize > 5,                                        "QuadtreeTULog2MaxSize must be 5 or smaller.");
2326  xConfirmPara( (1<<m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth,                                        "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
2327 
2328  xConfirmPara( m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize,                "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize.");
2329  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUWidth >>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
2330  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUHeight>>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
2331  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUWidth  >> m_uiMaxCUDepth ), "Minimum CU width must be greater than minimum transform size." );
2332  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUHeight >> m_uiMaxCUDepth ), "Minimum CU height must be greater than minimum transform size." );
2333  xConfirmPara( m_uiQuadtreeTUMaxDepthInter < 1,                                                         "QuadtreeTUMaxDepthInter must be greater than or equal to 1" );
2334  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" );
2335  xConfirmPara( m_uiQuadtreeTUMaxDepthIntra < 1,                                                         "QuadtreeTUMaxDepthIntra must be greater than or equal to 1" );
2336  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" );
2337#endif
2338 
2339  xConfirmPara(  m_maxNumMergeCand < 1,  "MaxNumMergeCand must be 1 or greater.");
2340  xConfirmPara(  m_maxNumMergeCand > 5,  "MaxNumMergeCand must be 5 or smaller.");
2341
2342#if !SVC_EXTENSION
2343#if ADAPTIVE_QP_SELECTION
2344  xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP < 0,                                              "AdaptiveQpSelection must be disabled when QP < 0.");
2345  xConfirmPara( m_bUseAdaptQpSelect == true && (m_cbQpOffset !=0 || m_crQpOffset != 0 ),               "AdaptiveQpSelection must be disabled when ChromaQpOffset is not equal to 0.");
2346#endif
2347#endif
2348
2349  if( m_usePCM)
2350  {
2351    xConfirmPara(  m_uiPCMLog2MinSize < 3,                                      "PCMLog2MinSize must be 3 or greater.");
2352    xConfirmPara(  m_uiPCMLog2MinSize > 5,                                      "PCMLog2MinSize must be 5 or smaller.");
2353    xConfirmPara(  m_pcmLog2MaxSize > 5,                                        "PCMLog2MaxSize must be 5 or smaller.");
2354    xConfirmPara(  m_pcmLog2MaxSize < m_uiPCMLog2MinSize,                       "PCMLog2MaxSize must be equal to or greater than m_uiPCMLog2MinSize.");
2355  }
2356
2357  xConfirmPara( m_sliceMode < 0 || m_sliceMode > 3, "SliceMode exceeds supported range (0 to 3)" );
2358  if (m_sliceMode!=0)
2359  {
2360    xConfirmPara( m_sliceArgument < 1 ,         "SliceArgument should be larger than or equal to 1" );
2361  }
2362  xConfirmPara( m_sliceSegmentMode < 0 || m_sliceSegmentMode > 3, "SliceSegmentMode exceeds supported range (0 to 3)" );
2363  if (m_sliceSegmentMode!=0)
2364  {
2365    xConfirmPara( m_sliceSegmentArgument < 1 ,         "SliceSegmentArgument should be larger than or equal to 1" );
2366  }
2367 
2368  Bool tileFlag = (m_numTileColumnsMinus1 > 0 || m_numTileRowsMinus1 > 0 );
2369  xConfirmPara( tileFlag && m_iWaveFrontSynchro,            "Tile and Wavefront can not be applied together");
2370
2371  //TODO:ChromaFmt assumes 4:2:0 below
2372#if !SVC_EXTENSION
2373  xConfirmPara( m_iSourceWidth  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Picture width must be an integer multiple of the specified chroma subsampling");
2374  xConfirmPara( m_iSourceHeight % TComSPS::getWinUnitY(CHROMA_420) != 0, "Picture height must be an integer multiple of the specified chroma subsampling");
2375
2376  xConfirmPara( m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling");
2377  xConfirmPara( m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling");
2378
2379  xConfirmPara( m_confWinLeft   % TComSPS::getWinUnitX(CHROMA_420) != 0, "Left conformance window offset must be an integer multiple of the specified chroma subsampling");
2380  xConfirmPara( m_confWinRight  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Right conformance window offset must be an integer multiple of the specified chroma subsampling");
2381  xConfirmPara( m_confWinTop    % TComSPS::getWinUnitY(CHROMA_420) != 0, "Top conformance window offset must be an integer multiple of the specified chroma subsampling");
2382  xConfirmPara( m_confWinBottom % TComSPS::getWinUnitY(CHROMA_420) != 0, "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling");
2383
2384  xConfirmPara( m_defaultDisplayWindowFlag && !m_vuiParametersPresentFlag, "VUI needs to be enabled for default display window");
2385
2386  if (m_defaultDisplayWindowFlag)
2387  {
2388    xConfirmPara( m_defDispWinLeftOffset   % TComSPS::getWinUnitX(CHROMA_420) != 0, "Left default display window offset must be an integer multiple of the specified chroma subsampling");
2389    xConfirmPara( m_defDispWinRightOffset  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Right default display window offset must be an integer multiple of the specified chroma subsampling");
2390    xConfirmPara( m_defDispWinTopOffset    % TComSPS::getWinUnitY(CHROMA_420) != 0, "Top default display window offset must be an integer multiple of the specified chroma subsampling");
2391    xConfirmPara( m_defDispWinBottomOffset % TComSPS::getWinUnitY(CHROMA_420) != 0, "Bottom default display window offset must be an integer multiple of the specified chroma subsampling");
2392  }
2393#endif
2394
2395#if !LAYER_CTB
2396  // max CU width and height should be power of 2
2397  UInt ui = m_uiMaxCUWidth;
2398  while(ui)
2399  {
2400    ui >>= 1;
2401    if( (ui & 1) == 1)
2402      xConfirmPara( ui != 1 , "Width should be 2^n");
2403  }
2404  ui = m_uiMaxCUHeight;
2405  while(ui)
2406  {
2407    ui >>= 1;
2408    if( (ui & 1) == 1)
2409      xConfirmPara( ui != 1 , "Height should be 2^n");
2410  }
2411#endif
2412
2413  /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure
2414   * This permits the ability to omit a GOP structure specification */
2415#if SVC_EXTENSION
2416#if Q0108_TSA_STSA
2417  if( m_acLayerCfg[0].m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1 )
2418  {
2419    m_GOPList[0] = GOPEntry();
2420    m_GOPList[0].m_QPFactor = 1;
2421    m_GOPList[0].m_betaOffsetDiv2 = 0;
2422    m_GOPList[0].m_tcOffsetDiv2 = 0;
2423    m_GOPList[0].m_POC = 1;
2424    m_GOPList[0].m_numRefPicsActive = 4;
2425  }
2426
2427  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
2428  {
2429    if (m_acLayerCfg[layer].m_iIntraPeriod == 1 && m_EhGOPList[layer][0].m_POC == -1) {
2430      m_EhGOPList[layer][0] = GOPEntry();
2431      m_EhGOPList[layer][0].m_QPFactor = 1;
2432      m_EhGOPList[layer][0].m_betaOffsetDiv2 = 0;
2433      m_EhGOPList[layer][0].m_tcOffsetDiv2 = 0;
2434      m_EhGOPList[layer][0].m_POC = 1;
2435      m_EhGOPList[layer][0].m_numRefPicsActive = 4;
2436    }
2437  }
2438#else
2439  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
2440  {
2441    Int m_iIntraPeriod = m_acLayerCfg[layer].m_iIntraPeriod;
2442    if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1) {
2443      m_GOPList[0] = GOPEntry();
2444      m_GOPList[0].m_QPFactor = 1;
2445      m_GOPList[0].m_betaOffsetDiv2 = 0;
2446      m_GOPList[0].m_tcOffsetDiv2 = 0;
2447      m_GOPList[0].m_POC = 1;
2448      m_GOPList[0].m_numRefPicsActive = 4;
2449    }
2450  }
2451#endif
2452#else
2453  if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1) {
2454    m_GOPList[0] = GOPEntry();
2455    m_GOPList[0].m_QPFactor = 1;
2456    m_GOPList[0].m_betaOffsetDiv2 = 0;
2457    m_GOPList[0].m_tcOffsetDiv2 = 0;
2458    m_GOPList[0].m_POC = 1;
2459    m_GOPList[0].m_numRefPicsActive = 4;
2460  }
2461#endif
2462
2463  Bool verifiedGOP=false;
2464  Bool errorGOP=false;
2465  Int checkGOP=1;
2466  Int numRefs = m_isField ? 2 : 1;
2467  Int refList[MAX_NUM_REF_PICS+1];
2468  refList[0]=0;
2469  if(m_isField)
2470  {
2471    refList[1] = 1;
2472  }
2473  Bool isOK[MAX_GOP];
2474  for(Int i=0; i<MAX_GOP; i++) 
2475  {
2476    isOK[i]=false;
2477  }
2478  Int numOK=0;
2479#if !SVC_EXTENSION
2480  xConfirmPara( m_iIntraPeriod >=0&&(m_iIntraPeriod%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" );
2481#endif
2482
2483  for(Int i=0; i<m_iGOPSize; i++)
2484  {
2485    if(m_GOPList[i].m_POC==m_iGOPSize)
2486    {
2487      xConfirmPara( m_GOPList[i].m_temporalId!=0 , "The last frame in each GOP must have temporal ID = 0 " );
2488    }
2489  }
2490
2491#if SVC_EXTENSION
2492  xConfirmPara( m_numLayers > MAX_LAYERS , "Number of layers in config file is greater than MAX_LAYERS" );
2493  m_numLayers = m_numLayers > MAX_LAYERS ? MAX_LAYERS : m_numLayers;
2494 
2495  // it can be updated after AVC BL support will be added to the WD
2496  if( m_avcBaseLayerFlag )
2497  {
2498    m_crossLayerIrapAlignFlag = false;
2499    m_crossLayerPictureTypeAlignFlag = false;
2500    m_crossLayerAlignedIdrOnlyFlag = false;
2501  }
2502
2503  // verify layer configuration parameters
2504  for(UInt layer=0; layer<m_numLayers; layer++)
2505  {
2506    if(m_acLayerCfg[layer].xCheckParameter(m_isField))
2507    {
2508      printf("\nError: invalid configuration parameter found in layer %d \n", layer);
2509      check_failed = true;
2510    }
2511  }
2512
2513  // verify layer configuration parameters
2514  for(UInt layer=0; layer<m_numLayers; layer++)
2515  {
2516    Int m_iIntraPeriod = m_acLayerCfg[layer].m_iIntraPeriod;
2517#endif
2518  if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable) )
2519  {
2520    for(Int i=0; i<m_iGOPSize; i++)
2521    {
2522      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)" );
2523      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)" );
2524    }
2525  }
2526#if SVC_EXTENSION
2527  }
2528#endif
2529
2530#if !Q0108_TSA_STSA
2531   m_extraRPSs = 0;                                     
2532#else
2533  memset( m_extraRPSs, 0, sizeof( m_extraRPSs ) );
2534#endif
2535  //start looping through frames in coding order until we can verify that the GOP structure is correct.
2536  while(!verifiedGOP&&!errorGOP) 
2537  {
2538    Int curGOP = (checkGOP-1)%m_iGOPSize;
2539    Int curPOC = ((checkGOP-1)/m_iGOPSize)*m_iGOPSize + m_GOPList[curGOP].m_POC;   
2540    if(m_GOPList[curGOP].m_POC<0) 
2541    {
2542      printf("\nError: found fewer Reference Picture Sets than GOPSize\n");
2543      errorGOP=true;
2544    }
2545    else 
2546    {
2547      //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
2548      Bool beforeI = false;
2549      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
2550      {
2551        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
2552        if(absPOC < 0)
2553        {
2554          beforeI=true;
2555        }
2556        else 
2557        {
2558          Bool found=false;
2559          for(Int j=0; j<numRefs; j++) 
2560          {
2561            if(refList[j]==absPOC) 
2562            {
2563              found=true;
2564              for(Int k=0; k<m_iGOPSize; k++)
2565              {
2566                if(absPOC%m_iGOPSize == m_GOPList[k].m_POC%m_iGOPSize)
2567                {
2568                  if(m_GOPList[k].m_temporalId==m_GOPList[curGOP].m_temporalId)
2569                  {
2570                    m_GOPList[k].m_refPic = true;
2571                  }
2572                  m_GOPList[curGOP].m_usedByCurrPic[i]=m_GOPList[k].m_temporalId<=m_GOPList[curGOP].m_temporalId;
2573                }
2574              }
2575            }
2576          }
2577          if(!found)
2578          {
2579            printf("\nError: ref pic %d is not available for GOP frame %d\n",m_GOPList[curGOP].m_referencePics[i],curGOP+1);
2580            errorGOP=true;
2581          }
2582        }
2583      }
2584      if(!beforeI&&!errorGOP)
2585      {
2586        //all ref frames were present
2587        if(!isOK[curGOP]) 
2588        {
2589          numOK++;
2590          isOK[curGOP]=true;
2591          if(numOK==m_iGOPSize)
2592          {
2593            verifiedGOP=true;
2594          }
2595        }
2596      }
2597      else 
2598      {
2599        //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
2600#if !Q0108_TSA_STSA
2601        m_GOPList[m_iGOPSize+m_extraRPSs]=m_GOPList[curGOP];
2602#else
2603        m_GOPList[m_iGOPSize+m_extraRPSs[0]]=m_GOPList[curGOP];
2604#endif
2605        Int newRefs=0;
2606        for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
2607        {
2608          Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
2609          if(absPOC>=0)
2610          {
2611#if !Q0108_TSA_STSA
2612            m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[newRefs]=m_GOPList[curGOP].m_referencePics[i];
2613            m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[newRefs]=m_GOPList[curGOP].m_usedByCurrPic[i];
2614#else
2615            m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[newRefs]=m_GOPList[curGOP].m_referencePics[i];
2616            m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_usedByCurrPic[newRefs]=m_GOPList[curGOP].m_usedByCurrPic[i];
2617#endif
2618            newRefs++;
2619          }
2620        }
2621        Int numPrefRefs = m_GOPList[curGOP].m_numRefPicsActive;
2622       
2623        for(Int offset = -1; offset>-checkGOP; offset--)
2624        {
2625          //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
2626          Int offGOP = (checkGOP-1+offset)%m_iGOPSize;
2627          Int offPOC = ((checkGOP-1+offset)/m_iGOPSize)*m_iGOPSize + m_GOPList[offGOP].m_POC;
2628          if(offPOC>=0&&m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId)
2629          {
2630            Bool newRef=false;
2631            for(Int i=0; i<numRefs; i++)
2632            {
2633              if(refList[i]==offPOC)
2634              {
2635                newRef=true;
2636              }
2637            }
2638            for(Int i=0; i<newRefs; i++) 
2639            {
2640#if !Q0108_TSA_STSA
2641              if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[i]==offPOC-curPOC)
2642#else
2643              if(m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[i]==offPOC-curPOC)
2644#endif
2645              {
2646                newRef=false;
2647              }
2648            }
2649            if(newRef) 
2650            {
2651              Int insertPoint=newRefs;
2652              //this picture can be added, find appropriate place in list and insert it.
2653              if(m_GOPList[offGOP].m_temporalId==m_GOPList[curGOP].m_temporalId)
2654              {
2655                m_GOPList[offGOP].m_refPic = true;
2656              }
2657              for(Int j=0; j<newRefs; j++)
2658              {
2659#if !Q0108_TSA_STSA
2660                if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]<offPOC-curPOC||m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]>0)
2661#else
2662                if(m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[j]<offPOC-curPOC||m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[j]>0)
2663#endif
2664                {
2665                  insertPoint = j;
2666                  break;
2667                }
2668              }
2669              Int prev = offPOC-curPOC;
2670              Int prevUsed = m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId;
2671              for(Int j=insertPoint; j<newRefs+1; j++)
2672              {
2673#if !Q0108_TSA_STSA
2674                Int newPrev = m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j];
2675                Int newUsed = m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j];
2676                m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]=prev;
2677                m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j]=prevUsed;
2678#else
2679                Int newPrev = m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[j];
2680                Int newUsed = m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_usedByCurrPic[j];
2681                m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[j]=prev;
2682                m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_usedByCurrPic[j]=prevUsed;
2683#endif
2684
2685                prevUsed=newUsed;
2686                prev=newPrev;
2687              }
2688              newRefs++;
2689            }
2690          }
2691          if(newRefs>=numPrefRefs)
2692          {
2693            break;
2694          }
2695        }
2696#if !Q0108_TSA_STSA
2697        m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics=newRefs;
2698        m_GOPList[m_iGOPSize+m_extraRPSs].m_POC = curPOC;
2699#else
2700        m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_numRefPics=newRefs;
2701        m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_POC = curPOC;
2702#endif
2703#if !Q0108_TSA_STSA
2704        if (m_extraRPSs == 0)
2705#else
2706        if (m_extraRPSs[0] == 0)
2707#endif
2708        {
2709#if !Q0108_TSA_STSA
2710          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 0;
2711          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = 0;
2712#else
2713          m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_interRPSPrediction = 0;
2714          m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_numRefIdc = 0;
2715#endif
2716        }
2717        else
2718        {
2719#if !Q0108_TSA_STSA
2720          Int rIdx =  m_iGOPSize + m_extraRPSs - 1;
2721#else
2722          Int rIdx =  m_iGOPSize + m_extraRPSs[0] - 1;
2723#endif
2724          Int refPOC = m_GOPList[rIdx].m_POC;
2725          Int refPics = m_GOPList[rIdx].m_numRefPics;
2726          Int newIdc=0;
2727          for(Int i = 0; i<= refPics; i++) 
2728          {
2729            Int deltaPOC = ((i != refPics)? m_GOPList[rIdx].m_referencePics[i] : 0);  // check if the reference abs POC is >= 0
2730            Int absPOCref = refPOC+deltaPOC;
2731            Int refIdc = 0;
2732#if !Q0108_TSA_STSA
2733            for (Int j = 0; j < m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics; j++)
2734            {
2735              if ( (absPOCref - curPOC) == m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j])
2736              {
2737                if (m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j])
2738                {
2739                  refIdc = 1;
2740                }
2741                else
2742                {
2743                  refIdc = 2;
2744                }
2745              }
2746            }
2747            m_GOPList[m_iGOPSize+m_extraRPSs].m_refIdc[newIdc]=refIdc;
2748            newIdc++;
2749          }
2750          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 1; 
2751          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = newIdc;
2752          m_GOPList[m_iGOPSize+m_extraRPSs].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize+m_extraRPSs].m_POC; 
2753        }
2754        curGOP=m_iGOPSize+m_extraRPSs;
2755        m_extraRPSs++;
2756      }
2757#else
2758            for (Int j = 0; j < m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_numRefPics; j++)
2759            {
2760              if ( (absPOCref - curPOC) == m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_referencePics[j])
2761              {
2762                if (m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_usedByCurrPic[j])
2763                {
2764                  refIdc = 1;
2765                }
2766                else
2767                {
2768                  refIdc = 2;
2769                }
2770              }
2771            }
2772            m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_refIdc[newIdc]=refIdc;
2773            newIdc++;
2774          }
2775          m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_interRPSPrediction = 1; 
2776          m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_numRefIdc = newIdc;
2777          m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize+m_extraRPSs[0]].m_POC; 
2778        }
2779        curGOP=m_iGOPSize+m_extraRPSs[0];
2780        m_extraRPSs[0]++;
2781      }
2782#endif
2783
2784      numRefs=0;
2785      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
2786      {
2787        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
2788        if(absPOC >= 0) 
2789        {
2790          refList[numRefs]=absPOC;
2791          numRefs++;
2792        }
2793      }
2794      refList[numRefs]=curPOC;
2795      numRefs++;
2796    }
2797    checkGOP++;
2798  }
2799  xConfirmPara(errorGOP,"Invalid GOP structure given");
2800
2801#if SVC_EXTENSION && Q0108_TSA_STSA
2802  for ( Int layerId = 1; layerId < m_numLayers; layerId++ )
2803  {
2804    verifiedGOP=false;
2805    errorGOP=false;
2806    checkGOP=1;
2807    numRefs = m_isField ? 2 : 1;
2808    refList[0]=0;
2809
2810    if(m_isField)
2811    {
2812      refList[1] = 1;
2813    }
2814
2815    memset( isOK, 0, sizeof( isOK ) );
2816    numOK=0;
2817
2818    for(Int i=0; i<m_iGOPSize; i++)
2819    {
2820      if(m_EhGOPList[layerId][i].m_POC==m_iGOPSize)
2821      {
2822        xConfirmPara( m_EhGOPList[layerId][i].m_temporalId!=0 , "The last frame in each GOP must have temporal ID = 0 " );
2823      }
2824    }
2825
2826    xConfirmPara( m_numLayers > MAX_LAYERS , "Number of layers in config file is greater than MAX_LAYERS" );
2827    m_numLayers = m_numLayers > MAX_LAYERS ? MAX_LAYERS : m_numLayers;
2828
2829    // verify layer configuration parameters
2830    for(UInt layer=0; layer<m_numLayers; layer++)
2831    {
2832      Int m_iIntraPeriod = m_acLayerCfg[layer].m_iIntraPeriod;
2833      if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable) )
2834      {
2835        for(Int i=0; i<m_iGOPSize; i++)
2836        {
2837          xConfirmPara( (m_EhGOPList[layerId][i].m_betaOffsetDiv2 + m_loopFilterBetaOffsetDiv2) < -6 || (m_EhGOPList[layerId][i].m_betaOffsetDiv2 + m_loopFilterBetaOffsetDiv2) > 6, "Loop Filter Beta Offset div. 2 for one of the GOP entries exceeds supported range (-6 to 6)" );
2838          xConfirmPara( (m_EhGOPList[layerId][i].m_tcOffsetDiv2 + m_loopFilterTcOffsetDiv2) < -6 || (m_EhGOPList[layerId][i].m_tcOffsetDiv2 + m_loopFilterTcOffsetDiv2) > 6, "Loop Filter Tc Offset div. 2 for one of the GOP entries exceeds supported range (-6 to 6)" );
2839        }
2840      }
2841    }
2842
2843    //start looping through frames in coding order until we can verify that the GOP structure is correct.
2844    while(!verifiedGOP&&!errorGOP) 
2845    {
2846      Int curGOP = (checkGOP-1)%m_iGOPSize;
2847      Int curPOC = ((checkGOP-1)/m_iGOPSize)*m_iGOPSize + m_EhGOPList[layerId][curGOP].m_POC;   
2848      if(m_EhGOPList[layerId][curGOP].m_POC<0) 
2849      {
2850        printf("\nError: found fewer Reference Picture Sets than GOPSize\n");
2851        errorGOP=true;
2852      }
2853      else 
2854      {
2855        //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
2856        Bool beforeI = false;
2857        for(Int i = 0; i< m_EhGOPList[layerId][curGOP].m_numRefPics; i++) 
2858        {
2859          Int absPOC = curPOC+m_EhGOPList[layerId][curGOP].m_referencePics[i];
2860          if(absPOC < 0)
2861          {
2862            beforeI=true;
2863          }
2864          else 
2865          {
2866            Bool found=false;
2867            for(Int j=0; j<numRefs; j++) 
2868            {
2869              if(refList[j]==absPOC) 
2870              {
2871                found=true;
2872                for(Int k=0; k<m_iGOPSize; k++)
2873                {
2874                  if(absPOC%m_iGOPSize == m_EhGOPList[layerId][k].m_POC%m_iGOPSize)
2875                  {
2876                    if(m_EhGOPList[layerId][k].m_temporalId==m_EhGOPList[layerId][curGOP].m_temporalId)
2877                    {
2878                      m_EhGOPList[layerId][k].m_refPic = true;
2879                    }
2880                    m_EhGOPList[layerId][curGOP].m_usedByCurrPic[i]=m_EhGOPList[layerId][k].m_temporalId<=m_EhGOPList[layerId][curGOP].m_temporalId;
2881                  }
2882                }
2883              }
2884            }
2885            if(!found)
2886            {
2887              printf("\nError: ref pic %d is not available for GOP frame %d\n",m_EhGOPList[layerId][curGOP].m_referencePics[i],curGOP+1);
2888              errorGOP=true;
2889            }
2890          }
2891        }
2892        if(!beforeI&&!errorGOP)
2893        {
2894          //all ref frames were present
2895          if(!isOK[curGOP]) 
2896          {
2897            numOK++;
2898            isOK[curGOP]=true;
2899            if(numOK==m_iGOPSize)
2900            {
2901              verifiedGOP=true;
2902            }
2903          }
2904        }
2905        else 
2906        {
2907          //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
2908
2909          m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]]=m_EhGOPList[layerId][curGOP];
2910          Int newRefs=0;
2911          for(Int i = 0; i< m_EhGOPList[layerId][curGOP].m_numRefPics; i++) 
2912          {
2913            Int absPOC = curPOC+m_EhGOPList[layerId][curGOP].m_referencePics[i];
2914            if(absPOC>=0)
2915            {
2916              m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_referencePics[newRefs]=m_EhGOPList[layerId][curGOP].m_referencePics[i];
2917              m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_usedByCurrPic[newRefs]=m_EhGOPList[layerId][curGOP].m_usedByCurrPic[i];
2918              newRefs++;
2919            }
2920          }
2921          Int numPrefRefs = m_EhGOPList[layerId][curGOP].m_numRefPicsActive;
2922
2923          for(Int offset = -1; offset>-checkGOP; offset--)
2924          {
2925            //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
2926            Int offGOP = (checkGOP-1+offset)%m_iGOPSize;
2927            Int offPOC = ((checkGOP-1+offset)/m_iGOPSize)*m_iGOPSize + m_EhGOPList[layerId][offGOP].m_POC;
2928            if(offPOC>=0&&m_EhGOPList[layerId][offGOP].m_temporalId<=m_EhGOPList[layerId][curGOP].m_temporalId)
2929            {
2930              Bool newRef=false;
2931              for(Int i=0; i<numRefs; i++)
2932              {
2933                if(refList[i]==offPOC)
2934                {
2935                  newRef=true;
2936                }
2937              }
2938              for(Int i=0; i<newRefs; i++) 
2939              {
2940                if(m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_referencePics[i]==offPOC-curPOC)
2941                {
2942                  newRef=false;
2943                }
2944              }
2945              if(newRef) 
2946              {
2947                Int insertPoint=newRefs;
2948                //this picture can be added, find appropriate place in list and insert it.
2949                if(m_EhGOPList[layerId][offGOP].m_temporalId==m_EhGOPList[layerId][curGOP].m_temporalId)
2950                {
2951                  m_EhGOPList[layerId][offGOP].m_refPic = true;
2952                }
2953                for(Int j=0; j<newRefs; j++)
2954                {
2955                  if(m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_referencePics[j]<offPOC-curPOC||m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_referencePics[j]>0)
2956                  {
2957                    insertPoint = j;
2958                    break;
2959                  }
2960                }
2961                Int prev = offPOC-curPOC;
2962                Int prevUsed = m_EhGOPList[layerId][offGOP].m_temporalId<=m_EhGOPList[layerId][curGOP].m_temporalId;
2963                for(Int j=insertPoint; j<newRefs+1; j++)
2964                {
2965                  Int newPrev = m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_referencePics[j];
2966                  Int newUsed = m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_usedByCurrPic[j];
2967                  m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_referencePics[j]=prev;
2968                  m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_usedByCurrPic[j]=prevUsed;
2969                  prevUsed=newUsed;
2970                  prev=newPrev;
2971                }
2972                newRefs++;
2973              }
2974            }
2975            if(newRefs>=numPrefRefs)
2976            {
2977              break;
2978            }
2979          }
2980          m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_numRefPics=newRefs;
2981          m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_POC = curPOC;
2982          if (m_extraRPSs[layerId] == 0)
2983          {
2984            m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_interRPSPrediction = 0;
2985            m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_numRefIdc = 0;
2986          }
2987          else
2988          {
2989            Int rIdx =  m_iGOPSize + m_extraRPSs[layerId] - 1;
2990            Int refPOC = m_EhGOPList[layerId][rIdx].m_POC;
2991            Int refPics = m_EhGOPList[layerId][rIdx].m_numRefPics;
2992            Int newIdc=0;
2993            for(Int i = 0; i<= refPics; i++) 
2994            {
2995              Int deltaPOC = ((i != refPics)? m_EhGOPList[layerId][rIdx].m_referencePics[i] : 0);  // check if the reference abs POC is >= 0
2996              Int absPOCref = refPOC+deltaPOC;
2997              Int refIdc = 0;
2998              for (Int j = 0; j < m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_numRefPics; j++)
2999              {
3000                if ( (absPOCref - curPOC) == m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_referencePics[j])
3001                {
3002                  if (m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_usedByCurrPic[j])
3003                  {
3004                    refIdc = 1;
3005                  }
3006                  else
3007                  {
3008                    refIdc = 2;
3009                  }
3010                }
3011              }
3012              m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_refIdc[newIdc]=refIdc;
3013              newIdc++;
3014            }
3015            m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_interRPSPrediction = 1; 
3016            m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_numRefIdc = newIdc;
3017            m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_deltaRPS = refPOC - m_EhGOPList[layerId][m_iGOPSize+m_extraRPSs[layerId]].m_POC; 
3018          }
3019          curGOP=m_iGOPSize+m_extraRPSs[layerId];
3020          m_extraRPSs[layerId]++;
3021        }
3022        numRefs=0;
3023        for(Int i = 0; i< m_EhGOPList[layerId][curGOP].m_numRefPics; i++) 
3024        {
3025          Int absPOC = curPOC+m_EhGOPList[layerId][curGOP].m_referencePics[i];
3026          if(absPOC >= 0) 
3027          {
3028            refList[numRefs]=absPOC;
3029            numRefs++;
3030          }
3031        }
3032        refList[numRefs]=curPOC;
3033        numRefs++;
3034      }
3035      checkGOP++;
3036    }
3037    xConfirmPara(errorGOP,"Invalid GOP structure given");
3038  }
3039#endif
3040
3041  m_maxTempLayer = 1;
3042  for(Int i=0; i<m_iGOPSize; i++) 
3043  {
3044    if(m_GOPList[i].m_temporalId >= m_maxTempLayer)
3045    {
3046      m_maxTempLayer = m_GOPList[i].m_temporalId+1;
3047    }
3048    xConfirmPara(m_GOPList[i].m_sliceType!='B'&&m_GOPList[i].m_sliceType!='P'&&m_GOPList[i].m_sliceType!='I', "Slice type must be equal to B or P or I");
3049  }
3050
3051#if Q0108_TSA_STSA
3052  for ( Int layerId = 1; layerId < m_numLayers; layerId++)
3053  {
3054    m_EhMaxTempLayer[layerId] = 1;
3055    for(Int i=0; i<m_iGOPSize; i++) 
3056    {
3057      if(m_EhGOPList[layerId][i].m_temporalId >= m_EhMaxTempLayer[layerId] )
3058      {
3059        m_EhMaxTempLayer[layerId] = m_EhGOPList[layerId][i].m_temporalId;
3060      }
3061      xConfirmPara(m_GOPList[i].m_sliceType!='B'&&m_GOPList[i].m_sliceType!='P'&&m_GOPList[i].m_sliceType!='I', "Slice type must be equal to B or P or I");
3062    }
3063  }
3064#endif
3065
3066  for(Int i=0; i<MAX_TLAYER; i++)
3067  {
3068    m_numReorderPics[i] = 0;
3069    m_maxDecPicBuffering[i] = 1;
3070  }
3071  for(Int i=0; i<m_iGOPSize; i++) 
3072  {
3073    if(m_GOPList[i].m_numRefPics+1 > m_maxDecPicBuffering[m_GOPList[i].m_temporalId])
3074    {
3075      m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics + 1;
3076    }
3077    Int highestDecodingNumberWithLowerPOC = 0; 
3078    for(Int j=0; j<m_iGOPSize; j++)
3079    {
3080      if(m_GOPList[j].m_POC <= m_GOPList[i].m_POC)
3081      {
3082        highestDecodingNumberWithLowerPOC = j;
3083      }
3084    }
3085    Int numReorder = 0;
3086    for(Int j=0; j<highestDecodingNumberWithLowerPOC; j++)
3087    {
3088      if(m_GOPList[j].m_temporalId <= m_GOPList[i].m_temporalId && 
3089        m_GOPList[j].m_POC > m_GOPList[i].m_POC)
3090      {
3091        numReorder++;
3092      }
3093    }   
3094    if(numReorder > m_numReorderPics[m_GOPList[i].m_temporalId])
3095    {
3096      m_numReorderPics[m_GOPList[i].m_temporalId] = numReorder;
3097    }
3098  }
3099  for(Int i=0; i<MAX_TLAYER-1; i++) 
3100  {
3101    // a lower layer can not have higher value of m_numReorderPics than a higher layer
3102    if(m_numReorderPics[i+1] < m_numReorderPics[i])
3103    {
3104      m_numReorderPics[i+1] = m_numReorderPics[i];
3105    }
3106    // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] - 1, inclusive
3107    if(m_numReorderPics[i] > m_maxDecPicBuffering[i] - 1)
3108    {
3109      m_maxDecPicBuffering[i] = m_numReorderPics[i] + 1;
3110    }
3111    // a lower layer can not have higher value of m_uiMaxDecPicBuffering than a higher layer
3112    if(m_maxDecPicBuffering[i+1] < m_maxDecPicBuffering[i])
3113    {
3114      m_maxDecPicBuffering[i+1] = m_maxDecPicBuffering[i];
3115    }
3116  }
3117
3118
3119  // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] -  1, inclusive
3120  if(m_numReorderPics[MAX_TLAYER-1] > m_maxDecPicBuffering[MAX_TLAYER-1] - 1)
3121  {
3122    m_maxDecPicBuffering[MAX_TLAYER-1] = m_numReorderPics[MAX_TLAYER-1] + 1;
3123  }
3124
3125#if SVC_EXTENSION // ToDo: it should be checked for the case when parameters are different for the layers
3126  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
3127  {
3128    Int m_iSourceWidth = m_acLayerCfg[layer].m_iSourceWidth;
3129    Int m_iSourceHeight = m_acLayerCfg[layer].m_iSourceHeight;
3130#if LAYER_CTB
3131    Int m_uiMaxCUWidth = m_acLayerCfg[layer].m_uiMaxCUWidth;
3132    Int m_uiMaxCUHeight = m_acLayerCfg[layer].m_uiMaxCUHeight;
3133#endif
3134#endif
3135  if(m_vuiParametersPresentFlag && m_bitstreamRestrictionFlag)
3136  { 
3137    Int PicSizeInSamplesY =  m_iSourceWidth * m_iSourceHeight;
3138    if(tileFlag)
3139    {
3140      Int maxTileWidth = 0;
3141      Int maxTileHeight = 0;
3142      Int widthInCU = (m_iSourceWidth % m_uiMaxCUWidth) ? m_iSourceWidth/m_uiMaxCUWidth + 1: m_iSourceWidth/m_uiMaxCUWidth;
3143      Int heightInCU = (m_iSourceHeight % m_uiMaxCUHeight) ? m_iSourceHeight/m_uiMaxCUHeight + 1: m_iSourceHeight/m_uiMaxCUHeight;
3144      if(m_tileUniformSpacingFlag)
3145      {
3146        maxTileWidth = m_uiMaxCUWidth*((widthInCU+m_numTileColumnsMinus1)/(m_numTileColumnsMinus1+1));
3147        maxTileHeight = m_uiMaxCUHeight*((heightInCU+m_numTileRowsMinus1)/(m_numTileRowsMinus1+1));
3148        // if only the last tile-row is one treeblock higher than the others
3149        // the maxTileHeight becomes smaller if the last row of treeblocks has lower height than the others
3150        if(!((heightInCU-1)%(m_numTileRowsMinus1+1)))
3151        {
3152          maxTileHeight = maxTileHeight - m_uiMaxCUHeight + (m_iSourceHeight % m_uiMaxCUHeight);
3153        }     
3154        // if only the last tile-column is one treeblock wider than the others
3155        // the maxTileWidth becomes smaller if the last column of treeblocks has lower width than the others   
3156        if(!((widthInCU-1)%(m_numTileColumnsMinus1+1)))
3157        {
3158          maxTileWidth = maxTileWidth - m_uiMaxCUWidth + (m_iSourceWidth % m_uiMaxCUWidth);
3159        }
3160      }
3161      else // not uniform spacing
3162      {
3163        if(m_numTileColumnsMinus1<1)
3164        {
3165          maxTileWidth = m_iSourceWidth;
3166        }
3167        else
3168        {
3169          Int accColumnWidth = 0;
3170          for(Int col=0; col<(m_numTileColumnsMinus1); col++)
3171          {
3172            maxTileWidth = m_tileColumnWidth[col]>maxTileWidth ? m_tileColumnWidth[col]:maxTileWidth;
3173            accColumnWidth += m_tileColumnWidth[col];
3174          }
3175          maxTileWidth = (widthInCU-accColumnWidth)>maxTileWidth ? m_uiMaxCUWidth*(widthInCU-accColumnWidth):m_uiMaxCUWidth*maxTileWidth;
3176        }
3177        if(m_numTileRowsMinus1<1)
3178        {
3179          maxTileHeight = m_iSourceHeight;
3180        }
3181        else
3182        {
3183          Int accRowHeight = 0;
3184          for(Int row=0; row<(m_numTileRowsMinus1); row++)
3185          {
3186            maxTileHeight = m_tileRowHeight[row]>maxTileHeight ? m_tileRowHeight[row]:maxTileHeight;
3187            accRowHeight += m_tileRowHeight[row];
3188          }
3189          maxTileHeight = (heightInCU-accRowHeight)>maxTileHeight ? m_uiMaxCUHeight*(heightInCU-accRowHeight):m_uiMaxCUHeight*maxTileHeight;
3190        }
3191      }
3192      Int maxSizeInSamplesY = maxTileWidth*maxTileHeight;
3193      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/maxSizeInSamplesY-4;
3194    }
3195    else if(m_iWaveFrontSynchro)
3196    {
3197      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/((2*m_iSourceHeight+m_iSourceWidth)*m_uiMaxCUHeight)-4;
3198    }
3199    else if(m_sliceMode == 1)
3200    {
3201      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/(m_sliceArgument*m_uiMaxCUWidth*m_uiMaxCUHeight)-4;
3202    }
3203    else
3204    {
3205      m_minSpatialSegmentationIdc = 0;
3206    }
3207  }
3208#if SVC_EXTENSION
3209  }
3210#endif
3211  xConfirmPara( m_iWaveFrontSynchro < 0, "WaveFrontSynchro cannot be negative" );
3212#if !SVC_EXTENSION
3213  xConfirmPara( m_iWaveFrontSubstreams <= 0, "WaveFrontSubstreams must be positive" );
3214  xConfirmPara( m_iWaveFrontSubstreams > 1 && !m_iWaveFrontSynchro, "Must have WaveFrontSynchro > 0 in order to have WaveFrontSubstreams > 1" );
3215#endif
3216
3217  xConfirmPara( m_decodedPictureHashSEIEnabled<0 || m_decodedPictureHashSEIEnabled>3, "this hash type is not correct!\n");
3218
3219  if (m_toneMappingInfoSEIEnabled)
3220  {
3221    xConfirmPara( m_toneMapCodedDataBitDepth < 8 || m_toneMapCodedDataBitDepth > 14 , "SEIToneMapCodedDataBitDepth must be in rage 8 to 14");
3222    xConfirmPara( m_toneMapTargetBitDepth < 1 || (m_toneMapTargetBitDepth > 16 && m_toneMapTargetBitDepth < 255) , "SEIToneMapTargetBitDepth must be in rage 1 to 16 or equal to 255");
3223    xConfirmPara( m_toneMapModelId < 0 || m_toneMapModelId > 4 , "SEIToneMapModelId must be in rage 0 to 4");
3224    xConfirmPara( m_cameraIsoSpeedValue == 0, "SEIToneMapCameraIsoSpeedValue shall not be equal to 0");
3225    xConfirmPara( m_exposureIndexValue  == 0, "SEIToneMapExposureIndexValue shall not be equal to 0");
3226    xConfirmPara( m_extendedRangeWhiteLevel < 100, "SEIToneMapExtendedRangeWhiteLevel should be greater than or equal to 100");
3227    xConfirmPara( m_nominalBlackLevelLumaCodeValue >= m_nominalWhiteLevelLumaCodeValue, "SEIToneMapNominalWhiteLevelLumaCodeValue shall be greater than SEIToneMapNominalBlackLevelLumaCodeValue");
3228    xConfirmPara( m_extendedWhiteLevelLumaCodeValue < m_nominalWhiteLevelLumaCodeValue, "SEIToneMapExtendedWhiteLevelLumaCodeValue shall be greater than or equal to SEIToneMapNominalWhiteLevelLumaCodeValue");
3229  }
3230#if P0050_KNEE_FUNCTION_SEI
3231  if (m_kneeSEIEnabled && !m_kneeSEICancelFlag)
3232  {
3233    xConfirmPara( m_kneeSEINumKneePointsMinus1 < 0 || m_kneeSEINumKneePointsMinus1 > 998, "SEIKneeFunctionNumKneePointsMinus1 must be in the range of 0 to 998");
3234    for ( UInt i=0; i<=m_kneeSEINumKneePointsMinus1; i++ ){
3235      xConfirmPara( m_kneeSEIInputKneePoint[i] < 1 || m_kneeSEIInputKneePoint[i] > 999, "SEIKneeFunctionInputKneePointValue must be in the range of 1 to 999");
3236      xConfirmPara( m_kneeSEIOutputKneePoint[i] < 0 || m_kneeSEIOutputKneePoint[i] > 1000, "SEIKneeFunctionInputKneePointValue must be in the range of 0 to 1000");
3237      if ( i > 0 )
3238      {
3239        xConfirmPara( m_kneeSEIInputKneePoint[i-1] >= m_kneeSEIInputKneePoint[i],  "The i-th SEIKneeFunctionInputKneePointValue must be greather than the (i-1)-th value");
3240      }
3241    }
3242  }
3243#endif
3244#if Q0074_COLOUR_REMAPPING_SEI
3245#if !SVC_EXTENSION
3246  if ( m_colourRemapSEIFile.c_str() && !m_colourRemapSEICancelFlag )
3247  {
3248    xConfirmPara( m_colourRemapSEICodedDataBitDepth < 8 || m_colourRemapSEICodedDataBitDepth > 16 , "colour_remap_coded_data_bit_depth shall be in the range of 8 to 16, inclusive");
3249    xConfirmPara( m_colourRemapSEITargetBitDepth < 8 || (m_colourRemapSEITargetBitDepth > 16 && m_colourRemapSEITargetBitDepth < 255) , "colour_remap_target_bit_depth shall be in the range of 8 to 16, inclusive");
3250    for( Int c=0 ; c<3 ; c++)
3251    {
3252      xConfirmPara( m_colourRemapSEIPreLutNumValMinus1[c] < 0 || m_colourRemapSEIPreLutNumValMinus1[c] > 32, "pre_lut_num_val_minus1[c] shall be in the range of 0 to 32, inclusive");
3253      if( m_colourRemapSEIPreLutNumValMinus1[c]>0 )
3254        for( Int i=0 ; i<=m_colourRemapSEIPreLutNumValMinus1[c] ; i++)
3255        {
3256          xConfirmPara( m_colourRemapSEIPreLutCodedValue[c][i] < 0 || m_colourRemapSEIPreLutCodedValue[c][i] > ((1<<m_colourRemapSEICodedDataBitDepth)-1), "pre_lut_coded_value[c][i] shall be in the range of 0 to (1<<colour_remap_coded_data_bit_depth)-1, inclusive");
3257          xConfirmPara( m_colourRemapSEIPreLutTargetValue[c][i] < 0 || m_colourRemapSEIPreLutTargetValue[c][i] > ((1<<m_colourRemapSEITargetBitDepth)-1), "pre_lut_target_value[c][i] shall be in the range of 0 to (1<<colour_remap_target_bit_depth)-1, inclusive");
3258        }
3259      xConfirmPara( m_colourRemapSEIPostLutNumValMinus1[c] < 0 || m_colourRemapSEIPostLutNumValMinus1[c] > 32, "post_lut_num_val_minus1[c] shall be in the range of 0 to 32, inclusive");
3260      if( m_colourRemapSEIPostLutNumValMinus1[c]>0 )
3261        for( Int i=0 ; i<=m_colourRemapSEIPostLutNumValMinus1[c] ; i++)
3262        {
3263          xConfirmPara( m_colourRemapSEIPostLutCodedValue[c][i] < 0 || m_colourRemapSEIPostLutCodedValue[c][i] > ((1<<m_colourRemapSEITargetBitDepth)-1), "post_lut_coded_value[c][i] shall be in the range of 0 to (1<<colour_remap_target_bit_depth)-1, inclusive");
3264          xConfirmPara( m_colourRemapSEIPostLutTargetValue[c][i] < 0 || m_colourRemapSEIPostLutTargetValue[c][i] > ((1<<m_colourRemapSEITargetBitDepth)-1), "post_lut_target_value[c][i] shall be in the range of 0 to (1<<colour_remap_target_bit_depth)-1, inclusive");
3265        }
3266    }
3267    if ( m_colourRemapSEIMatrixPresentFlag )
3268    {
3269      xConfirmPara( m_colourRemapSEILog2MatrixDenom < 0 || m_colourRemapSEILog2MatrixDenom > 15, "log2_matrix_denom shall be in the range of 0 to 15, inclusive");
3270      for( Int c=0 ; c<3 ; c++)
3271        for( Int i=0 ; i<3 ; i++)
3272          xConfirmPara( m_colourRemapSEICoeffs[c][i] < -32768 || m_colourRemapSEICoeffs[c][i] > 32767, "colour_remap_coeffs[c][i] shall be in the range of -32768 and 32767, inclusive");
3273    }
3274  }
3275#endif
3276#endif
3277
3278#if RC_SHVC_HARMONIZATION
3279  for ( Int layer=0; layer<m_numLayers; layer++ )
3280  {
3281    if ( m_acLayerCfg[layer].m_RCEnableRateControl )
3282    {
3283      if ( m_acLayerCfg[layer].m_RCForceIntraQP )
3284      {
3285        if ( m_acLayerCfg[layer].m_RCInitialQP == 0 )
3286        {
3287          printf( "\nInitial QP for rate control is not specified. Reset not to use force intra QP!" );
3288          m_acLayerCfg[layer].m_RCForceIntraQP = false;
3289        }
3290      }
3291    }
3292    xConfirmPara( m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n" );
3293  }
3294#else
3295  if ( m_RCEnableRateControl )
3296  {
3297    if ( m_RCForceIntraQP )
3298    {
3299      if ( m_RCInitialQP == 0 )
3300      {
3301        printf( "\nInitial QP for rate control is not specified. Reset not to use force intra QP!" );
3302        m_RCForceIntraQP = false;
3303      }
3304    }
3305    xConfirmPara( m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n" );
3306  }
3307#endif
3308
3309  xConfirmPara(!m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagForce, "CUTransquantBypassFlagForce cannot be 1 when TransquantBypassEnableFlag is 0");
3310
3311  xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2");
3312  if (m_framePackingSEIEnabled)
3313  {
3314    xConfirmPara(m_framePackingSEIType < 3 || m_framePackingSEIType > 5 , "SEIFramePackingType must be in rage 3 to 5");
3315  }
3316
3317#if SVC_EXTENSION
3318#if VPS_EXTN_DIRECT_REF_LAYERS
3319  xConfirmPara( (m_acLayerCfg[0].m_numSamplePredRefLayers != 0) && (m_acLayerCfg[0].m_numSamplePredRefLayers != -1), "Layer 0 cannot have any reference layers" );
3320  // 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
3321  for(Int layer = 1; layer < MAX_LAYERS; layer++)
3322  {
3323    xConfirmPara(m_acLayerCfg[layer].m_numSamplePredRefLayers > layer, "Cannot reference more layers than before current layer");
3324    for(Int i = 0; i < m_acLayerCfg[layer].m_numSamplePredRefLayers; i++)
3325    {
3326      xConfirmPara(m_acLayerCfg[layer].m_samplePredRefLayerIds[i] > layer, "Cannot reference higher layers");
3327      xConfirmPara(m_acLayerCfg[layer].m_samplePredRefLayerIds[i] == layer, "Cannot reference the current layer itself");
3328    }
3329  }
3330  xConfirmPara( (m_acLayerCfg[0].m_numMotionPredRefLayers != 0) && (m_acLayerCfg[0].m_numMotionPredRefLayers != -1), "Layer 0 cannot have any reference layers" );
3331  // 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
3332  for(Int layer = 1; layer < MAX_LAYERS; layer++)
3333  {
3334    xConfirmPara(m_acLayerCfg[layer].m_numMotionPredRefLayers > layer, "Cannot reference more layers than before current layer");
3335    for(Int i = 0; i < m_acLayerCfg[layer].m_numMotionPredRefLayers; i++)
3336    {
3337      xConfirmPara(m_acLayerCfg[layer].m_motionPredRefLayerIds[i] > layer, "Cannot reference higher layers");
3338      xConfirmPara(m_acLayerCfg[layer].m_motionPredRefLayerIds[i] == layer, "Cannot reference the current layer itself");
3339    }
3340  }
3341
3342  xConfirmPara( (m_acLayerCfg[0].m_numActiveRefLayers != 0) && (m_acLayerCfg[0].m_numActiveRefLayers != -1), "Layer 0 cannot have any active reference layers" );
3343  // 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
3344  for(Int layer = 1; layer < MAX_LAYERS; layer++)
3345  {
3346    Bool predEnabledFlag[MAX_LAYERS];
3347    for (Int refLayer = 0; refLayer < layer; refLayer++)
3348    {
3349      predEnabledFlag[refLayer] = false;
3350    }
3351    for(Int i = 0; i < m_acLayerCfg[layer].m_numSamplePredRefLayers; i++)
3352    {
3353      predEnabledFlag[m_acLayerCfg[layer].m_samplePredRefLayerIds[i]] = true;
3354    }
3355    for(Int i = 0; i < m_acLayerCfg[layer].m_numMotionPredRefLayers; i++)
3356    {
3357      predEnabledFlag[m_acLayerCfg[layer].m_motionPredRefLayerIds[i]] = true;
3358    }
3359    Int numDirectRefLayers = 0;
3360    for (Int refLayer = 0; refLayer < layer; refLayer++)
3361    {
3362      if (predEnabledFlag[refLayer] == true) numDirectRefLayers++;
3363    }
3364    xConfirmPara(m_acLayerCfg[layer].m_numActiveRefLayers > numDirectRefLayers, "Cannot reference more layers than NumDirectRefLayers");
3365    for(Int i = 0; i < m_acLayerCfg[layer].m_numActiveRefLayers; i++)
3366    {
3367      xConfirmPara(m_acLayerCfg[layer].m_predLayerIds[i] >= numDirectRefLayers, "Cannot reference higher layers");
3368    }
3369  }
3370#endif //VPS_EXTN_DIRECT_REF_LAYERS
3371#if M0040_ADAPTIVE_RESOLUTION_CHANGE
3372  if (m_adaptiveResolutionChange > 0)
3373  {
3374    xConfirmPara(m_numLayers != 2, "Adaptive resolution change works with 2 layers only");
3375    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");
3376  }
3377#endif
3378#if HIGHER_LAYER_IRAP_SKIP_FLAG
3379  if (m_adaptiveResolutionChange > 0)
3380  {
3381    xConfirmPara(m_crossLayerIrapAlignFlag != 0, "Cross layer IRAP alignment must be disabled when using adaptive resolution change.");
3382  }
3383  if (m_skipPictureAtArcSwitch)
3384  {
3385    xConfirmPara(m_adaptiveResolutionChange <= 0, "Skip picture at ARC switching only works when Adaptive Resolution Change is active (AdaptiveResolutionChange > 0)");
3386  }
3387#endif
3388  for (UInt layer=0; layer < MAX_LAYERS-1; layer++)
3389  {
3390    xConfirmPara(m_acLayerCfg[layer].m_maxTidIlRefPicsPlus1 < 0 || m_acLayerCfg[layer].m_maxTidIlRefPicsPlus1 > 7, "MaxTidIlRefPicsPlus1 must be in range 0 to 7");
3391  }
3392#if AUXILIARY_PICTURES
3393  for (UInt layer=0; layer < MAX_LAYERS-1; layer++)
3394  {
3395    xConfirmPara(m_acLayerCfg[layer].m_auxId < 0 || m_acLayerCfg[layer].m_auxId > 4, "AuxId must be in range 0 to 4");
3396    xConfirmPara(m_acLayerCfg[layer].m_auxId > 0 && m_acLayerCfg[layer].m_chromaFormatIDC != CHROMA_400, "Auxiliary picture must be monochrome picture");
3397  }
3398#endif
3399#if Q0048_CGS_3D_ASYMLUT
3400  xConfirmPara( m_nCGSFlag < 0 || m_nCGSFlag > 1 , "0<=CGS<=1" );
3401#endif
3402#endif //SVC_EXTENSION
3403#undef xConfirmPara
3404  if (check_failed)
3405  {
3406    exit(EXIT_FAILURE);
3407  }
3408}
3409
3410/** \todo use of global variables should be removed later
3411 */
3412#if LAYER_CTB
3413Void TAppEncCfg::xSetGlobal(UInt layerId)
3414{
3415  // set max CU width & height
3416  g_auiLayerMaxCUWidth[layerId]  = m_acLayerCfg[layerId].m_uiMaxCUWidth;
3417  g_auiLayerMaxCUHeight[layerId] = m_acLayerCfg[layerId].m_uiMaxCUHeight;
3418 
3419  // compute actual CU depth with respect to config depth and max transform size
3420  g_auiLayerAddCUDepth[layerId]  = 0;
3421  while( (m_acLayerCfg[layerId].m_uiMaxCUWidth>>m_acLayerCfg[layerId].m_uiMaxCUDepth) > ( 1 << ( m_acLayerCfg[layerId].m_uiQuadtreeTULog2MinSize + g_auiLayerAddCUDepth[layerId] )  ) ) g_auiLayerAddCUDepth[layerId]++;
3422 
3423  m_acLayerCfg[layerId].m_uiMaxCUDepth += g_auiLayerAddCUDepth[layerId];
3424  g_auiLayerAddCUDepth[layerId]++;
3425  g_auiLayerMaxCUDepth[layerId] = m_acLayerCfg[layerId].m_uiMaxCUDepth;
3426 
3427#if O0194_DIFFERENT_BITDEPTH_EL_BL
3428  // set internal bit-depth to constant value to make sure to be updated later
3429  g_bitDepthY = -1;
3430  g_bitDepthC = -1;
3431 
3432  g_uiPCMBitDepthLuma = -1;
3433  g_uiPCMBitDepthChroma = -1;
3434#else
3435  // set internal bit-depth and constants
3436  g_bitDepthY = m_internalBitDepthY;
3437  g_bitDepthC = m_internalBitDepthC;
3438 
3439  g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_inputBitDepthY : m_internalBitDepthY;
3440  g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_inputBitDepthC : m_internalBitDepthC;
3441#endif
3442}
3443#else
3444Void TAppEncCfg::xSetGlobal()
3445{
3446  // set max CU width & height
3447  g_uiMaxCUWidth  = m_uiMaxCUWidth;
3448  g_uiMaxCUHeight = m_uiMaxCUHeight;
3449 
3450  // compute actual CU depth with respect to config depth and max transform size
3451  g_uiAddCUDepth  = 0;
3452  while( (m_uiMaxCUWidth>>m_uiMaxCUDepth) > ( 1 << ( m_uiQuadtreeTULog2MinSize + g_uiAddCUDepth )  ) ) g_uiAddCUDepth++;
3453 
3454  m_uiMaxCUDepth += g_uiAddCUDepth;
3455  g_uiAddCUDepth++;
3456  g_uiMaxCUDepth = m_uiMaxCUDepth;
3457 
3458#if O0194_DIFFERENT_BITDEPTH_EL_BL
3459  // set internal bit-depth to constant value to make sure to be updated later
3460  g_bitDepthY = -1;
3461  g_bitDepthC = -1;
3462 
3463  g_uiPCMBitDepthLuma = -1;
3464  g_uiPCMBitDepthChroma = -1;
3465#else
3466  g_bitDepthY = m_internalBitDepthY;
3467  g_bitDepthC = m_internalBitDepthC;
3468 
3469  g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_inputBitDepthY : m_internalBitDepthY;
3470  g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_inputBitDepthC : m_internalBitDepthC;
3471#endif
3472}
3473#endif
3474
3475Void TAppEncCfg::xPrintParameter()
3476{
3477  printf("\n");
3478#if SVC_EXTENSION 
3479  printf("Total number of layers        : %d\n", m_numLayers       );
3480  printf("Multiview                     : %d\n", m_scalabilityMask[VIEW_ORDER_INDEX] );
3481  printf("Scalable                      : %d\n", m_scalabilityMask[SCALABILITY_ID] );
3482#if AVC_BASE
3483  printf("Base layer                    : %s\n", m_avcBaseLayerFlag ? "AVC" : "HEVC");
3484#endif
3485#if AUXILIARY_PICTURES
3486  printf("Auxiliary pictures            : %d\n", m_scalabilityMask[AUX_ID] );
3487#endif
3488#if M0040_ADAPTIVE_RESOLUTION_CHANGE
3489  printf("Adaptive Resolution Change    : %d\n", m_adaptiveResolutionChange );
3490#endif
3491#if HIGHER_LAYER_IRAP_SKIP_FLAG
3492  printf("Skip picture at ARC switch    : %d\n", m_skipPictureAtArcSwitch );
3493#endif
3494#if O0223_PICTURE_TYPES_ALIGN_FLAG
3495  printf("Align picture type            : %d\n", m_crossLayerPictureTypeAlignFlag );
3496#endif
3497  printf("Cross layer IRAP alignment    : %d\n", m_crossLayerIrapAlignFlag );
3498#if P0068_CROSS_LAYER_ALIGNED_IDR_ONLY_FOR_IRAP_FLAG
3499  printf("IDR only for IRAP             : %d\n", m_crossLayerAlignedIdrOnlyFlag );
3500#endif
3501#if O0194_WEIGHTED_PREDICTION_CGS
3502  printf("InterLayerWeightedPred        : %d\n", m_useInterLayerWeightedPred );
3503#endif
3504  for(UInt layer=0; layer<m_numLayers; layer++)
3505  {
3506    printf("=== Layer %d settings === \n", layer);
3507    m_acLayerCfg[layer].xPrintParameter();
3508    printf("\n");
3509  }
3510  printf("=== Common configuration settings === \n");
3511  printf("Bitstream      File          : %s\n", m_pBitstreamFile      );
3512#else //SVC_EXTENSION
3513  printf("Input          File          : %s\n", m_pchInputFile          );
3514  printf("Bitstream      File          : %s\n", m_pchBitstreamFile      );
3515  printf("Reconstruction File          : %s\n", m_pchReconFile          );
3516  printf("Real     Format              : %dx%d %dHz\n", m_iSourceWidth - m_confWinLeft - m_confWinRight, m_iSourceHeight - m_confWinTop - m_confWinBottom, m_iFrameRate );
3517  printf("Internal Format              : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate );
3518#endif //SVC_EXTENSION
3519  if (m_isField)
3520  {
3521    printf("Frame/Field          : Field based coding\n");
3522    printf("Field index          : %u - %d (%d fields)\n", m_FrameSkip, m_FrameSkip+m_framesToBeEncoded-1, m_framesToBeEncoded );
3523    if (m_isTopFieldFirst)
3524    {
3525      printf("Field Order            : Top field first\n");
3526    }
3527    else
3528    {
3529      printf("Field Order            : Bottom field first\n");
3530    }
3531  }
3532  else
3533  {
3534    printf("Frame/Field                  : Frame based coding\n");
3535    printf("Frame index                  : %u - %d (%d frames)\n", m_FrameSkip, m_FrameSkip+m_framesToBeEncoded-1, m_framesToBeEncoded );
3536  }
3537#if !LAYER_CTB
3538  printf("CU size / depth              : %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth );
3539  printf("RQT trans. size (min / max)  : %d / %d\n", 1 << m_uiQuadtreeTULog2MinSize, 1 << m_uiQuadtreeTULog2MaxSize );
3540  printf("Max RQT depth inter          : %d\n", m_uiQuadtreeTUMaxDepthInter);
3541  printf("Max RQT depth intra          : %d\n", m_uiQuadtreeTUMaxDepthIntra);
3542#endif
3543  printf("Min PCM size                 : %d\n", 1 << m_uiPCMLog2MinSize);
3544  printf("Motion search range          : %d\n", m_iSearchRange );
3545#if !SVC_EXTENSION
3546  printf("Intra period                 : %d\n", m_iIntraPeriod );
3547#endif
3548  printf("Decoding refresh type        : %d\n", m_iDecodingRefreshType );
3549#if !SVC_EXTENSION
3550  printf("QP                           : %5.2f\n", m_fQP );
3551#endif
3552  printf("Max dQP signaling depth      : %d\n", m_iMaxCuDQPDepth);
3553
3554  printf("Cb QP Offset                 : %d\n", m_cbQpOffset   );
3555  printf("Cr QP Offset                 : %d\n", m_crQpOffset);
3556
3557  printf("QP adaptation                : %d (range=%d)\n", m_bUseAdaptiveQP, (m_bUseAdaptiveQP ? m_iQPAdaptationRange : 0) );
3558  printf("GOP size                     : %d\n", m_iGOPSize );
3559#if !O0194_DIFFERENT_BITDEPTH_EL_BL
3560  printf("Internal bit depth           : (Y:%d, C:%d)\n", m_internalBitDepthY, m_internalBitDepthC );
3561  printf("PCM sample bit depth         : (Y:%d, C:%d)\n", g_uiPCMBitDepthLuma, g_uiPCMBitDepthChroma );
3562#endif
3563#if O0215_PHASE_ALIGNMENT
3564  printf("Cross-layer sample alignment : %d\n", m_phaseAlignFlag);
3565#endif
3566#if !RC_SHVC_HARMONIZATION
3567  printf("RateControl                  : %d\n", m_RCEnableRateControl );
3568  if(m_RCEnableRateControl)
3569  {
3570    printf("TargetBitrate                : %d\n", m_RCTargetBitrate );
3571    printf("KeepHierarchicalBit          : %d\n", m_RCKeepHierarchicalBit );
3572    printf("LCULevelRC                   : %d\n", m_RCLCULevelRC );
3573    printf("UseLCUSeparateModel          : %d\n", m_RCUseLCUSeparateModel );
3574    printf("InitialQP                    : %d\n", m_RCInitialQP );
3575    printf("ForceIntraQP                 : %d\n", m_RCForceIntraQP );
3576  }
3577#endif
3578
3579  printf("Max Num Merge Candidates     : %d\n", m_maxNumMergeCand);
3580  printf("\n");
3581 
3582  printf("TOOL CFG: ");
3583#if !O0194_DIFFERENT_BITDEPTH_EL_BL
3584  printf("IBD:%d ", g_bitDepthY > m_inputBitDepthY || g_bitDepthC > m_inputBitDepthC);
3585#endif
3586  printf("HAD:%d ", m_bUseHADME           );
3587  printf("RDQ:%d ", m_useRDOQ            );
3588  printf("RDQTS:%d ", m_useRDOQTS        );
3589  printf("RDpenalty:%d ", m_rdPenalty  );
3590  printf("SQP:%d ", m_uiDeltaQpRD         );
3591  printf("ASR:%d ", m_bUseASR             );
3592  printf("FEN:%d ", m_bUseFastEnc         );
3593  printf("ECU:%d ", m_bUseEarlyCU         );
3594  printf("FDM:%d ", m_useFastDecisionForMerge );
3595  printf("CFM:%d ", m_bUseCbfFastMode         );
3596  printf("ESD:%d ", m_useEarlySkipDetection  );
3597#if FAST_INTRA_SHVC
3598  printf("FIS:%d ", m_useFastIntraScalable  );
3599#endif
3600  printf("RQT:%d ", 1     );
3601  printf("TransformSkip:%d ",     m_useTransformSkip              );
3602  printf("TransformSkipFast:%d ", m_useTransformSkipFast       );
3603  printf("Slice: M=%d ", m_sliceMode);
3604  if (m_sliceMode!=0)
3605  {
3606    printf("A=%d ", m_sliceArgument);
3607  }
3608  printf("SliceSegment: M=%d ",m_sliceSegmentMode);
3609  if (m_sliceSegmentMode!=0)
3610  {
3611    printf("A=%d ", m_sliceSegmentArgument);
3612  }
3613  printf("CIP:%d ", m_bUseConstrainedIntraPred);
3614  printf("SAO:%d ", (m_bUseSAO)?(1):(0));
3615#if !LAYER_CTB
3616  printf("PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0);
3617#endif
3618  if (m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagForce)
3619  {
3620    printf("TransQuantBypassEnabled: =1 ");
3621  }
3622  else
3623  {
3624    printf("TransQuantBypassEnabled:%d ", (m_TransquantBypassEnableFlag)? 1:0 );
3625  }
3626  printf("WPP:%d ", (Int)m_useWeightedPred);
3627  printf("WPB:%d ", (Int)m_useWeightedBiPred);
3628  printf("PME:%d ", m_log2ParallelMergeLevel);
3629#if !SVC_EXTENSION
3630  printf(" WaveFrontSynchro:%d WaveFrontSubstreams:%d",
3631          m_iWaveFrontSynchro, m_iWaveFrontSubstreams);
3632#endif
3633  printf(" ScalingList:%d ", m_useScalingListId );
3634  printf("TMVPMode:%d ", m_TMVPModeId     );
3635#if ADAPTIVE_QP_SELECTION
3636  printf("AQpS:%d", m_bUseAdaptQpSelect   );
3637#endif
3638
3639  printf(" SignBitHidingFlag:%d ", m_signHideFlag);
3640#if SVC_EXTENSION
3641  printf("RecalQP:%d ", m_recalculateQPAccordingToLambda ? 1 : 0 );
3642  printf("EL_RAP_SliceType: %d ", m_elRapSliceBEnabled);
3643  printf("REF_IDX_ME_ZEROMV: %d ", REF_IDX_ME_ZEROMV);
3644  printf("ENCODER_FAST_MODE: %d ", ENCODER_FAST_MODE);
3645  printf("REF_IDX_MFM: %d ", REF_IDX_MFM);
3646  printf("O0194_DIFFERENT_BITDEPTH_EL_BL: %d ", O0194_DIFFERENT_BITDEPTH_EL_BL);
3647  printf("O0194_JOINT_US_BITSHIFT: %d ", O0194_JOINT_US_BITSHIFT);
3648#else
3649  printf("RecalQP:%d", m_recalculateQPAccordingToLambda ? 1 : 0 );
3650#endif
3651#if Q0048_CGS_3D_ASYMLUT
3652  printf("CGS: %d CGSMaxOctantDepth: %d CGSMaxYPartNumLog2: %d CGSLUTBit:%d " , m_nCGSFlag , m_nCGSMaxOctantDepth , m_nCGSMaxYPartNumLog2 , m_nCGSLUTBit );
3653#endif
3654#if R0151_CGS_3D_ASYMLUT_IMPROVE
3655  printf("CGSAdaptC:%d " , m_nCGSAdaptiveChroma );
3656#endif
3657  printf("\n\n");
3658 
3659  fflush(stdout);
3660}
3661
3662Bool confirmPara(Bool bflag, const Char* message)
3663{
3664  if (!bflag)
3665    return false;
3666 
3667  printf("Error: %s\n",message);
3668  return true;
3669}
3670
3671#if SVC_EXTENSION
3672Void TAppEncCfg::cfgStringToArray(Int **arr, string cfgString, Int numEntries, const char* logString)
3673{
3674  Char *tempChar = cfgString.empty() ? NULL : strdup(cfgString.c_str());
3675  if( numEntries > 0 )
3676  {
3677    Char *arrayEntry;
3678    Int i = 0;
3679    *arr = new Int[numEntries];
3680
3681    arrayEntry = strtok( tempChar, " ,");
3682    while(arrayEntry != NULL)
3683    {
3684      if( i >= numEntries )
3685      {
3686        printf( "%s: The number of entries specified is larger than the allowed number.\n", logString );
3687        exit( EXIT_FAILURE );
3688      }
3689      *( *arr + i ) = atoi( arrayEntry );
3690      arrayEntry = strtok(NULL, " ,");
3691      i++;
3692    }
3693    if( i < numEntries )
3694    {
3695      printf( "%s: Some entries are not specified.\n", logString );
3696      exit( EXIT_FAILURE );
3697    }
3698  }
3699  else
3700  {
3701    *arr = NULL;
3702  }
3703
3704  if( tempChar )
3705  {
3706    free( tempChar );
3707    tempChar = NULL;
3708  }
3709}
3710
3711#endif //SVC_EXTENSION
3712//! \}
Note: See TracBrowser for help on using the repository browser.