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

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

fix compilation issue

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