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

Last change on this file since 1510 was 187, checked in by seregin, 12 years ago

enable zero number of direct references, fix for AVC base YUV input

File size: 94.1 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license. 
5 *
6 * Copyright (c) 2010-2013, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TAppEncCfg.cpp
35    \brief    Handle encoder configuration parameters
36*/
37
38#include <stdlib.h>
39#include <cassert>
40#include <cstring>
41#include <string>
42#include "TLibCommon/TComRom.h"
43#include "TAppEncCfg.h"
44
45static istream& operator>>(istream &, Level::Name &);
46static istream& operator>>(istream &, Level::Tier &);
47static istream& operator>>(istream &, Profile::Name &);
48
49#include "TAppCommon/program_options_lite.h"
50#include "TLibEncoder/TEncRateCtrl.h"
51#ifdef WIN32
52#define strdup _strdup
53#endif
54
55using namespace std;
56namespace po = df::program_options_lite;
57
58//! \ingroup TAppEncoder
59//! \{
60
61// ====================================================================================================================
62// Constructor / destructor / initialization / destroy
63// ====================================================================================================================
64
65#if SVC_EXTENSION
66TAppEncCfg::TAppEncCfg()
67: m_pBitstreamFile()
68#if AVC_BASE
69, m_avcBaseLayerFlag(0)
70#endif
71, m_pColumnWidth()
72, m_pRowHeight()
73, m_scalingListFile()
74#if REF_IDX_FRAMEWORK
75, m_elRapSliceBEnabled(0)
76#endif
77{
78  for(UInt layer=0; layer<MAX_LAYERS; layer++)
79  {
80    m_acLayerCfg[layer].setAppEncCfg(this);
81  }
82}
83#else
84TAppEncCfg::TAppEncCfg()
85: m_pchInputFile()
86, m_pchBitstreamFile()
87, m_pchReconFile()
88, m_pchdQPFile()
89, m_pColumnWidth()
90, m_pRowHeight()
91, m_scalingListFile()
92{
93  m_aidQP = NULL;
94#if J0149_TONE_MAPPING_SEI
95  m_startOfCodedInterval = NULL;
96  m_codedPivotValue = NULL;
97  m_targetPivotValue = NULL;
98#endif
99}
100#endif
101
102TAppEncCfg::~TAppEncCfg()
103{
104#if SVC_EXTENSION
105  free(m_pBitstreamFile);
106#else
107  free(m_pchBitstreamFile);
108  if ( m_aidQP )
109  {
110    delete[] m_aidQP;
111  }
112#if J0149_TONE_MAPPING_SEI
113  if ( m_startOfCodedInterval )
114  {
115    delete[] m_startOfCodedInterval;
116    m_startOfCodedInterval = NULL;
117  }
118   if ( m_codedPivotValue )
119  {
120    delete[] m_codedPivotValue;
121    m_codedPivotValue = NULL;
122  }
123  if ( m_targetPivotValue )
124  {
125    delete[] m_targetPivotValue;
126    m_targetPivotValue = NULL;
127  }
128#endif
129  free(m_pchInputFile);
130#endif
131#if !SVC_EXTENSION 
132  free(m_pchReconFile);
133  free(m_pchdQPFile);
134#endif
135  free(m_pColumnWidth);
136  free(m_pRowHeight);
137  free(m_scalingListFile);
138}
139
140Void TAppEncCfg::create()
141{
142}
143
144Void TAppEncCfg::destroy()
145{
146#if VPS_EXTN_DIRECT_REF_LAYERS
147  for(Int layer = 0; layer < MAX_LAYERS; layer++)
148  {
149    if( m_acLayerCfg[layer].m_numDirectRefLayers > 0 )
150    {
151      delete [] m_acLayerCfg[layer].m_refLayerIds;
152    }
153  }
154#endif
155}
156
157std::istringstream &operator>>(std::istringstream &in, GOPEntry &entry)     //input
158{
159  in>>entry.m_sliceType;
160  in>>entry.m_POC;
161  in>>entry.m_QPOffset;
162  in>>entry.m_QPFactor;
163  in>>entry.m_tcOffsetDiv2;
164  in>>entry.m_betaOffsetDiv2;
165  in>>entry.m_temporalId;
166  in>>entry.m_numRefPicsActive;
167  in>>entry.m_numRefPics;
168  for ( Int i = 0; i < entry.m_numRefPics; i++ )
169  {
170    in>>entry.m_referencePics[i];
171  }
172  in>>entry.m_interRPSPrediction;
173#if AUTO_INTER_RPS
174  if (entry.m_interRPSPrediction==1)
175  {
176    in>>entry.m_deltaRPS;
177    in>>entry.m_numRefIdc;
178    for ( Int i = 0; i < entry.m_numRefIdc; i++ )
179    {
180      in>>entry.m_refIdc[i];
181    }
182  }
183  else if (entry.m_interRPSPrediction==2)
184  {
185    in>>entry.m_deltaRPS;
186  }
187#else
188  if (entry.m_interRPSPrediction)
189  {
190    in>>entry.m_deltaRPS;
191    in>>entry.m_numRefIdc;
192    for ( Int i = 0; i < entry.m_numRefIdc; i++ )
193    {
194      in>>entry.m_refIdc[i];
195    }
196  }
197#endif
198  return in;
199}
200
201#if SVC_EXTENSION
202void TAppEncCfg::getDirFilename(string& filename, string& dir, const string path)
203{
204  size_t pos = path.find_last_of("\\");
205  if(pos != std::string::npos)
206  {
207    filename.assign(path.begin() + pos + 1, path.end());
208    dir.assign(path.begin(), path.begin() + pos + 1);
209  }
210  else
211  {
212    pos = path.find_last_of("/");
213    if(pos != std::string::npos)
214    {
215      filename.assign(path.begin() + pos + 1, path.end());
216      dir.assign(path.begin(), path.begin() + pos + 1);
217    }
218    else
219    {
220      filename = path;
221      dir.assign("");
222    }
223  }
224}
225#endif
226
227static const struct MapStrToProfile {
228  const Char* str;
229  Profile::Name value;
230} strToProfile[] = {
231  {"none", Profile::NONE},
232  {"main", Profile::MAIN},
233  {"main10", Profile::MAIN10},
234  {"main-still-picture", Profile::MAINSTILLPICTURE},
235};
236
237static const struct MapStrToTier {
238  const Char* str;
239  Level::Tier value;
240} strToTier[] = {
241  {"main", Level::MAIN},
242  {"high", Level::HIGH},
243};
244
245static const struct MapStrToLevel {
246  const Char* str;
247  Level::Name value;
248} strToLevel[] = {
249  {"none",Level::NONE},
250  {"1",   Level::LEVEL1},
251  {"2",   Level::LEVEL2},
252  {"2.1", Level::LEVEL2_1},
253  {"3",   Level::LEVEL3},
254  {"3.1", Level::LEVEL3_1},
255  {"4",   Level::LEVEL4},
256  {"4.1", Level::LEVEL4_1},
257  {"5",   Level::LEVEL5},
258  {"5.1", Level::LEVEL5_1},
259  {"5.2", Level::LEVEL5_2},
260  {"6",   Level::LEVEL6},
261  {"6.1", Level::LEVEL6_1},
262  {"6.2", Level::LEVEL6_2},
263};
264
265template<typename T, typename P>
266static istream& readStrToEnum(P map[], unsigned long mapLen, istream &in, T &val)
267{
268  string str;
269  in >> str;
270
271  for (Int i = 0; i < mapLen; i++)
272  {
273    if (str == map[i].str)
274    {
275      val = map[i].value;
276      goto found;
277    }
278  }
279  /* not found */
280  in.setstate(ios::failbit);
281found:
282  return in;
283}
284
285static istream& operator>>(istream &in, Profile::Name &profile)
286{
287  return readStrToEnum(strToProfile, sizeof(strToProfile)/sizeof(*strToProfile), in, profile);
288}
289
290static istream& operator>>(istream &in, Level::Tier &tier)
291{
292  return readStrToEnum(strToTier, sizeof(strToTier)/sizeof(*strToTier), in, tier);
293}
294
295static istream& operator>>(istream &in, Level::Name &level)
296{
297  return readStrToEnum(strToLevel, sizeof(strToLevel)/sizeof(*strToLevel), in, level);
298}
299
300#if SIGNAL_BITRATE_PICRATE_IN_VPS
301Void readBoolString(const string inpString, const Int numEntries, Bool* &memberArray, const char *elementName);
302Void readIntString(const string inpString, const Int numEntries, Int* &memberArray, const char *elementName);
303#endif
304// ====================================================================================================================
305// Public member functions
306// ====================================================================================================================
307
308/** \param  argc        number of arguments
309    \param  argv        array of arguments
310    \retval             true when success
311 */
312Bool TAppEncCfg::parseCfg( Int argc, Char* argv[] )
313{
314  Bool do_help = false;
315 
316#if SVC_EXTENSION
317  string  cfg_LayerCfgFile  [MAX_LAYERS];
318  string  cfg_BitstreamFile;
319  string* cfg_InputFile     [MAX_LAYERS];
320  string* cfg_ReconFile     [MAX_LAYERS];
321  Double* cfg_fQP           [MAX_LAYERS];
322
323  Int*    cfg_SourceWidth   [MAX_LAYERS]; 
324  Int*    cfg_SourceHeight  [MAX_LAYERS];
325  Int*    cfg_FrameRate     [MAX_LAYERS];
326  Int*    cfg_IntraPeriod   [MAX_LAYERS];
327  Int*    cfg_conformanceMode  [MAX_LAYERS];
328#if VPS_EXTN_DIRECT_REF_LAYERS
329  Int*    cfg_numDirectRefLayers [MAX_LAYERS];
330  string cfg_refLayerIds   [MAX_LAYERS];
331  string* cfg_refLayerIdsPtr   [MAX_LAYERS];
332#endif
333#if SCALED_REF_LAYER_OFFSETS
334  Int*    cfg_scaledRefLayerLeftOffset [MAX_LAYERS];
335  Int*    cfg_scaledRefLayerTopOffset [MAX_LAYERS];
336  Int*    cfg_scaledRefLayerRightOffset [MAX_LAYERS];
337  Int*    cfg_scaledRefLayerBottomOffset [MAX_LAYERS];
338#endif
339  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
340  {
341    cfg_InputFile[layer]    = &m_acLayerCfg[layer].m_cInputFile;
342    cfg_ReconFile[layer]    = &m_acLayerCfg[layer].m_cReconFile;
343    cfg_fQP[layer]          = &m_acLayerCfg[layer].m_fQP;
344    cfg_SourceWidth[layer]  = &m_acLayerCfg[layer].m_iSourceWidth;
345    cfg_SourceHeight[layer] = &m_acLayerCfg[layer].m_iSourceHeight;
346    cfg_FrameRate[layer]    = &m_acLayerCfg[layer].m_iFrameRate; 
347    cfg_IntraPeriod[layer]  = &m_acLayerCfg[layer].m_iIntraPeriod; 
348    cfg_conformanceMode[layer] = &m_acLayerCfg[layer].m_conformanceMode;
349#if VPS_EXTN_DIRECT_REF_LAYERS
350    cfg_numDirectRefLayers  [layer] = &m_acLayerCfg[layer].m_numDirectRefLayers;
351    cfg_refLayerIdsPtr      [layer]  = &cfg_refLayerIds[layer];
352#endif
353#if SCALED_REF_LAYER_OFFSETS
354    cfg_scaledRefLayerLeftOffset  [layer] = &m_acLayerCfg[layer].m_scaledRefLayerLeftOffset;
355    cfg_scaledRefLayerTopOffset   [layer] = &m_acLayerCfg[layer].m_scaledRefLayerTopOffset;
356    cfg_scaledRefLayerRightOffset [layer] = &m_acLayerCfg[layer].m_scaledRefLayerRightOffset;
357    cfg_scaledRefLayerBottomOffset[layer] = &m_acLayerCfg[layer].m_scaledRefLayerBottomOffset;
358#endif
359  }
360#if AVC_BASE
361  string  cfg_BLInputFile;
362#endif
363#if AVC_SYNTAX
364  string  cfg_BLSyntaxFile;
365#endif
366#else
367  string cfg_InputFile;
368  string cfg_BitstreamFile;
369  string cfg_ReconFile;
370  string cfg_dQPFile;
371#endif
372  string cfg_ColumnWidth;
373  string cfg_RowHeight;
374  string cfg_ScalingListFile;
375#if J0149_TONE_MAPPING_SEI
376  string cfg_startOfCodedInterval;
377  string cfg_codedPivotValue;
378  string cfg_targetPivotValue;
379#endif
380#if SIGNAL_BITRATE_PICRATE_IN_VPS
381  string cfg_bitRateInfoPresentFlag;
382  string cfg_picRateInfoPresentFlag;
383  string cfg_avgBitRate;
384  string cfg_maxBitRate;
385  string cfg_avgPicRate;
386  string cfg_constantPicRateIdc;
387#endif
388  po::Options opts;
389  opts.addOptions()
390  ("help", do_help, false, "this help text")
391  ("c", po::parseConfigFile, "configuration file name")
392 
393  // File, I/O and source parameters
394#if SVC_EXTENSION
395  ("InputFile%d,-i%d",        cfg_InputFile,  string(""), MAX_LAYERS, "original YUV input file name for layer %d")
396  ("ReconFile%d,-o%d",        cfg_ReconFile,  string(""), MAX_LAYERS, "reconstruction YUV input file name for layer %d")
397  ("LayerConfig%d,-lc%d",     cfg_LayerCfgFile, string(""), MAX_LAYERS, "layer %d configuration file name")
398  ("SourceWidth%d,-wdt%d",    cfg_SourceWidth, 0, MAX_LAYERS, "Source picture width for layer %d")
399  ("SourceHeight%d,-hgt%d",   cfg_SourceHeight, 0, MAX_LAYERS, "Source picture height for layer %d")
400  ("FrameRate%d,-fr%d",       cfg_FrameRate,  0, MAX_LAYERS, "Frame rate for layer %d")
401  ("LambdaModifier%d,-LM%d",  m_adLambdaModifier, ( double )1.0, MAX_TLAYER, "Lambda modifier for temporal layer %d")
402#if VPS_EXTN_DIRECT_REF_LAYERS
403  ("NumDirectRefLayers%d",    cfg_numDirectRefLayers, -1, MAX_LAYERS, "Number of direct reference layers")
404  ("RefLayerIds%d",           cfg_refLayerIdsPtr, string(""), MAX_LAYERS, "direct reference layer IDs")
405#endif
406  ("NumLayers",               m_numLayers, 1, "Number of layers to code")
407  ("ConformanceMode%d",       cfg_conformanceMode,0, MAX_LAYERS, "Window conformance mode (0: no cropping, 1:automatic padding, 2: padding, 3:cropping")
408
409  ("BitstreamFile,b",       cfg_BitstreamFile, string(""), "Bitstream output file name")
410  ("InputBitDepth",         m_inputBitDepthY,    8, "Bit-depth of input file")
411  ("OutputBitDepth",        m_outputBitDepthY,   0, "Bit-depth of output file (default:InternalBitDepth)")
412  ("InternalBitDepth",      m_internalBitDepthY, 0, "Bit-depth the codec operates at. (default:InputBitDepth)"
413                                                       "If different to InputBitDepth, source data will be converted")
414  ("InputBitDepthC",        m_inputBitDepthC,    0, "As per InputBitDepth but for chroma component. (default:InputBitDepth)")
415  ("OutputBitDepthC",       m_outputBitDepthC,   0, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
416  ("InternalBitDepthC",     m_internalBitDepthC, 0, "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth)")
417#if SCALED_REF_LAYER_OFFSETS
418  ("ScaledRefLayerLeftOffset%d",   cfg_scaledRefLayerLeftOffset,  0, MAX_LAYERS, "Horizontal offset of top-left luma sample of scaled base layer picture with respect to"
419                                                                 " top-left luma sample of the EL picture, in units of two luma samples")
420  ("ScaledRefLayerTopOffset%d",    cfg_scaledRefLayerTopOffset,   0, MAX_LAYERS,   "Vertical offset of top-left luma sample of scaled base layer picture with respect to"
421                                                                 " top-left luma sample of the EL picture, in units of two luma samples")
422  ("ScaledRefLayerRightOffset%d",  cfg_scaledRefLayerRightOffset, 0, MAX_LAYERS, "Horizontal offset of bottom-right luma sample of scaled base layer picture with respect to"
423                                                                 " bottom-right luma sample of the EL picture, in units of two luma samples")
424  ("ScaledRefLayerBottomOffset%d", cfg_scaledRefLayerBottomOffset,0, MAX_LAYERS, "Vertical offset of bottom-right luma sample of scaled base layer picture with respect to"
425                                                                 " bottom-right luma sample of the EL picture, in units of two luma samples")
426#endif
427#if AVC_BASE
428  ("AvcBase,-avc",            m_avcBaseLayerFlag,     0, "avc_base_layer_flag")
429  ("InputBLFile,-ibl",        cfg_BLInputFile,     string(""), "Base layer rec YUV input file name")
430#if AVC_SYNTAX
431  ("InputBLSyntaxFile,-ibs",  cfg_BLSyntaxFile,     string(""), "Base layer syntax input file name")
432#endif
433#endif
434#if REF_IDX_FRAMEWORK
435  ("EnableElRapB,-use-rap-b",  m_elRapSliceBEnabled, 0, "Set ILP over base-layer I picture to B picture (default is P picture)")
436#endif 
437#else 
438  ("InputFile,i",           cfg_InputFile,     string(""), "Original YUV input file name")
439  ("BitstreamFile,b",       cfg_BitstreamFile, string(""), "Bitstream output file name")
440  ("ReconFile,o",           cfg_ReconFile,     string(""), "Reconstructed YUV output file name")
441  ("SourceWidth,-wdt",      m_iSourceWidth,        0, "Source picture width")
442  ("SourceHeight,-hgt",     m_iSourceHeight,       0, "Source picture height")
443  ("InputBitDepth",         m_inputBitDepthY,    8, "Bit-depth of input file")
444  ("OutputBitDepth",        m_outputBitDepthY,   0, "Bit-depth of output file (default:InternalBitDepth)")
445  ("InternalBitDepth",      m_internalBitDepthY, 0, "Bit-depth the codec operates at. (default:InputBitDepth)"
446                                                       "If different to InputBitDepth, source data will be converted")
447  ("InputBitDepthC",        m_inputBitDepthC,    0, "As per InputBitDepth but for chroma component. (default:InputBitDepth)")
448  ("OutputBitDepthC",       m_outputBitDepthC,   0, "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)")
449  ("InternalBitDepthC",     m_internalBitDepthC, 0, "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth)")
450  ("ConformanceMode",       m_conformanceMode,     0, "Window conformance mode (0: no window, 1:automatic padding, 2:padding, 3:conformance")
451  ("HorizontalPadding,-pdx",m_aiPad[0],            0, "Horizontal source padding for conformance window mode 2")
452  ("VerticalPadding,-pdy",  m_aiPad[1],            0, "Vertical source padding for conformance window mode 2")
453  ("ConfLeft",              m_confLeft,            0, "Left offset for window conformance mode 3")
454  ("ConfRight",             m_confRight,           0, "Right offset for window conformance mode 3")
455  ("ConfTop",               m_confTop,             0, "Top offset for window conformance mode 3")
456  ("ConfBottom",            m_confBottom,          0, "Bottom offset for window conformance mode 3")
457  ("FrameRate,-fr",         m_iFrameRate,          0, "Frame rate")
458#endif
459  ("FrameSkip,-fs",         m_FrameSkip,          0u, "Number of frames to skip at start of input YUV")
460  ("FramesToBeEncoded,f",   m_framesToBeEncoded,   0, "Number of frames to be encoded (default=all)")
461 
462  // Profile and level
463  ("Profile", m_profile,   Profile::NONE, "Profile to be used when encoding (Incomplete)")
464  ("Level",   m_level,     Level::NONE,   "Level limit to be used, eg 5.1 (Incomplete)")
465  ("Tier",    m_levelTier, Level::MAIN,   "Tier to use for interpretation of --Level")
466
467#if L0046_CONSTRAINT_FLAGS
468  ("ProgressiveSource", m_progressiveSourceFlag, false, "Indicate that source is progressive")
469  ("InterlacedSource",  m_interlacedSourceFlag,  false, "Indicate that source is interlaced")
470  ("NonPackedSource",   m_nonPackedConstraintFlag, false, "Indicate that source does not contain frame packing")
471  ("FrameOnly",         m_frameOnlyConstraintFlag, false, "Indicate that the bitstream contains only frames")
472#endif
473
474  // Unit definition parameters
475  ("MaxCUWidth",              m_uiMaxCUWidth,             64u)
476  ("MaxCUHeight",             m_uiMaxCUHeight,            64u)
477  // todo: remove defaults from MaxCUSize
478  ("MaxCUSize,s",             m_uiMaxCUWidth,             64u, "Maximum CU size")
479  ("MaxCUSize,s",             m_uiMaxCUHeight,            64u, "Maximum CU size")
480  ("MaxPartitionDepth,h",     m_uiMaxCUDepth,              4u, "CU depth")
481 
482  ("QuadtreeTULog2MaxSize",   m_uiQuadtreeTULog2MaxSize,   6u, "Maximum TU size in logarithm base 2")
483  ("QuadtreeTULog2MinSize",   m_uiQuadtreeTULog2MinSize,   2u, "Minimum TU size in logarithm base 2")
484 
485  ("QuadtreeTUMaxDepthIntra", m_uiQuadtreeTUMaxDepthIntra, 1u, "Depth of TU tree for intra CUs")
486  ("QuadtreeTUMaxDepthInter", m_uiQuadtreeTUMaxDepthInter, 2u, "Depth of TU tree for inter CUs")
487 
488  // Coding structure paramters
489#if SVC_EXTENSION
490  ("IntraPeriod%d,-ip%d",  cfg_IntraPeriod, -1, MAX_LAYERS, "intra period in frames for layer %d, (-1: only first frame)")
491#else
492  ("IntraPeriod,-ip",         m_iIntraPeriod,              -1, "Intra period in frames, (-1: only first frame)")
493#endif
494  ("DecodingRefreshType,-dr", m_iDecodingRefreshType,       0, "Intra refresh type (0:none 1:CRA 2:IDR)")
495  ("GOPSize,g",               m_iGOPSize,                   1, "GOP size of temporal structure")
496#if !L0034_COMBINED_LIST_CLEANUP
497  ("ListCombination,-lc",     m_bUseLComb,               true, "Combined reference list for uni-prediction estimation in B-slices")
498#endif
499  // motion options
500  ("FastSearch",              m_iFastSearch,                1, "0:Full search  1:Diamond  2:PMVFAST")
501  ("SearchRange,-sr",         m_iSearchRange,              96, "Motion search range")
502  ("BipredSearchRange",       m_bipredSearchRange,          4, "Motion search range for bipred refinement")
503  ("HadamardME",              m_bUseHADME,               true, "Hadamard ME for fractional-pel")
504  ("ASR",                     m_bUseASR,                false, "Adaptive motion search range")
505
506#if SVC_EXTENSION
507  ("LambdaModifier%d,-LM%d",  m_adLambdaModifier, ( double )1.0, MAX_TLAYER, "Lambda modifier for temporal layer %d")
508#else
509  // Mode decision parameters
510  ("LambdaModifier0,-LM0", m_adLambdaModifier[ 0 ], ( Double )1.0, "Lambda modifier for temporal layer 0")
511  ("LambdaModifier1,-LM1", m_adLambdaModifier[ 1 ], ( Double )1.0, "Lambda modifier for temporal layer 1")
512  ("LambdaModifier2,-LM2", m_adLambdaModifier[ 2 ], ( Double )1.0, "Lambda modifier for temporal layer 2")
513  ("LambdaModifier3,-LM3", m_adLambdaModifier[ 3 ], ( Double )1.0, "Lambda modifier for temporal layer 3")
514  ("LambdaModifier4,-LM4", m_adLambdaModifier[ 4 ], ( Double )1.0, "Lambda modifier for temporal layer 4")
515  ("LambdaModifier5,-LM5", m_adLambdaModifier[ 5 ], ( Double )1.0, "Lambda modifier for temporal layer 5")
516  ("LambdaModifier6,-LM6", m_adLambdaModifier[ 6 ], ( Double )1.0, "Lambda modifier for temporal layer 6")
517  ("LambdaModifier7,-LM7", m_adLambdaModifier[ 7 ], ( Double )1.0, "Lambda modifier for temporal layer 7")
518#endif
519
520  /* Quantization parameters */
521#if SVC_EXTENSION
522  ("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")
523#else
524  ("QP,q",          m_fQP,             30.0, "Qp value, if value is float, QP is switched once during encoding")
525#endif
526  ("DeltaQpRD,-dqr",m_uiDeltaQpRD,       0u, "max dQp offset for slice")
527  ("MaxDeltaQP,d",  m_iMaxDeltaQP,        0, "max dQp offset for block")
528  ("MaxCuDQPDepth,-dqd",  m_iMaxCuDQPDepth,        0, "max depth for a minimum CuDQP")
529
530  ("CbQpOffset,-cbqpofs",  m_cbQpOffset,        0, "Chroma Cb QP Offset")
531  ("CrQpOffset,-crqpofs",  m_crQpOffset,        0, "Chroma Cr QP Offset")
532
533#if ADAPTIVE_QP_SELECTION
534  ("AdaptiveQpSelection,-aqps",   m_bUseAdaptQpSelect,           false, "AdaptiveQpSelection")
535#endif
536
537  ("AdaptiveQP,-aq",                m_bUseAdaptiveQP,           false, "QP adaptation based on a psycho-visual model")
538  ("MaxQPAdaptationRange,-aqr",     m_iQPAdaptationRange,           6, "QP adaptation range")
539#if !SVC_EXTENSION
540  ("dQPFile,m",                     cfg_dQPFile,           string(""), "dQP file name")
541#endif
542  ("RDOQ",                          m_useRDOQ,                  true )
543  ("RDOQTS",                        m_useRDOQTS,                true )
544#if L0232_RD_PENALTY
545  ("RDpenalty",                     m_rdPenalty,                0,  "RD-penalty for 32x32 TU for intra in non-intra slices. 0:disbaled  1:RD-penalty  2:maximum RD-penalty")
546#endif
547  // Entropy coding parameters
548  ("SBACRD",                         m_bUseSBACRD,                      true, "SBAC based RD estimation")
549 
550  // Deblocking filter parameters
551  ("LoopFilterDisable",              m_bLoopFilterDisable,             false )
552  ("LoopFilterOffsetInPPS",          m_loopFilterOffsetInPPS,          false )
553  ("LoopFilterBetaOffset_div2",      m_loopFilterBetaOffsetDiv2,           0 )
554  ("LoopFilterTcOffset_div2",        m_loopFilterTcOffsetDiv2,             0 )
555  ("DeblockingFilterControlPresent", m_DeblockingFilterControlPresent, false )
556#if L0386_DB_METRIC
557  ("DeblockingFilterMetric",         m_DeblockingFilterMetric,         false )
558#endif
559
560  // Coding tools
561  ("AMP",                      m_enableAMP,                 true,  "Enable asymmetric motion partitions")
562  ("TransformSkip",            m_useTransformSkip,          false, "Intra transform skipping")
563  ("TransformSkipFast",        m_useTransformSkipFast,      false, "Fast intra transform skipping")
564  ("SAO",                      m_bUseSAO,                   true,  "Enable Sample Adaptive Offset")
565  ("MaxNumOffsetsPerPic",      m_maxNumOffsetsPerPic,       2048,  "Max number of SAO offset per picture (Default: 2048)")   
566  ("SAOLcuBoundary",           m_saoLcuBoundary,            false, "0: right/bottom LCU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas")
567  ("SAOLcuBasedOptimization",  m_saoLcuBasedOptimization,   true,  "0: SAO picture-based optimization, 1: SAO LCU-based optimization ")
568  ("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")
569  ("SliceArgument",            m_sliceArgument,            0,     "Depending on SliceMode being:"
570                                                                   "\t1: max number of CTUs per slice"
571                                                                   "\t2: max number of bytes per slice"
572                                                                   "\t3: max number of tiles per slice")
573  ("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")
574  ("SliceSegmentArgument",     m_sliceSegmentArgument,   0,     "Depending on SliceSegmentMode being:"
575                                                                   "\t1: max number of CTUs per slice segment"
576                                                                   "\t2: max number of bytes per slice segment"
577                                                                   "\t3: max number of tiles per slice segment")
578  ("LFCrossSliceBoundaryFlag", m_bLFCrossSliceBoundaryFlag, true)
579
580  ("ConstrainedIntraPred",     m_bUseConstrainedIntraPred,  false, "Constrained Intra Prediction")
581
582  ("PCMEnabledFlag",           m_usePCM,                    false)
583  ("PCMLog2MaxSize",           m_pcmLog2MaxSize,            5u)
584  ("PCMLog2MinSize",           m_uiPCMLog2MinSize,          3u)
585  ("PCMInputBitDepthFlag",     m_bPCMInputBitDepthFlag,     true)
586  ("PCMFilterDisableFlag",     m_bPCMFilterDisableFlag,    false)
587
588  ("LosslessCuEnabled",        m_useLossless, false)
589
590  ("WeightedPredP,-wpP",          m_useWeightedPred,               false,      "Use weighted prediction in P slices")
591  ("WeightedPredB,-wpB",          m_useWeightedBiPred,             false,      "Use weighted (bidirectional) prediction in B slices")
592  ("Log2ParallelMergeLevel",      m_log2ParallelMergeLevel,     2u,          "Parallel merge estimation region")
593  ("UniformSpacingIdc",           m_iUniformSpacingIdr,            0,          "Indicates if the column and row boundaries are distributed uniformly")
594  ("NumTileColumnsMinus1",        m_iNumColumnsMinus1,             0,          "Number of columns in a picture minus 1")
595  ("ColumnWidthArray",            cfg_ColumnWidth,                 string(""), "Array containing ColumnWidth values in units of LCU")
596  ("NumTileRowsMinus1",           m_iNumRowsMinus1,                0,          "Number of rows in a picture minus 1")
597  ("RowHeightArray",              cfg_RowHeight,                   string(""), "Array containing RowHeight values in units of LCU")
598  ("LFCrossTileBoundaryFlag",      m_bLFCrossTileBoundaryFlag,             true,          "1: cross-tile-boundary loop filtering. 0:non-cross-tile-boundary loop filtering")
599  ("WaveFrontSynchro",            m_iWaveFrontSynchro,             0,          "0: no synchro; 1 synchro with TR; 2 TRR etc")
600  ("ScalingList",                 m_useScalingListId,              0,          "0: no scaling list, 1: default scaling lists, 2: scaling lists specified in ScalingListFile")
601  ("ScalingListFile",             cfg_ScalingListFile,             string(""), "Scaling list file name")
602  ("SignHideFlag,-SBH",                m_signHideFlag, 1)
603  ("MaxNumMergeCand",             m_maxNumMergeCand,             5u,         "Maximum number of merge candidates")
604
605  /* Misc. */
606  ("SEIDecodedPictureHash",       m_decodedPictureHashSEIEnabled, 0, "Control generation of decode picture hash SEI messages\n"
607                                                                    "\t3: checksum\n"
608                                                                    "\t2: CRC\n"
609                                                                    "\t1: use MD5\n"
610                                                                    "\t0: disable")
611  ("SEIpictureDigest",            m_decodedPictureHashSEIEnabled, 0, "deprecated alias for SEIDecodedPictureHash")
612  ("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")
613  ("FEN", m_bUseFastEnc, false, "fast encoder setting")
614  ("ECU", m_bUseEarlyCU, false, "Early CU setting") 
615  ("FDM", m_useFastDecisionForMerge, true, "Fast decision for Merge RD Cost") 
616  ("CFM", m_bUseCbfFastMode, false, "Cbf fast mode setting")
617  ("ESD", m_useEarlySkipDetection, false, "Early SKIP detection setting")
618#if RATE_CONTROL_LAMBDA_DOMAIN
619  ( "RateControl",         m_RCEnableRateControl,   false, "Rate control: enable rate control" )
620  ( "TargetBitrate",       m_RCTargetBitrate,           0, "Rate control: target bitrate" )
621  ( "KeepHierarchicalBit", m_RCKeepHierarchicalBit, false, "Rate control: keep hierarchical bit allocation in rate control algorithm" )
622  ( "LCULevelRateControl", m_RCLCULevelRC,           true, "Rate control: true: LCU level RC; false: picture level RC" )
623  ( "RCLCUSeparateModel",  m_RCUseLCUSeparateModel,  true, "Rate control: use LCU level separate R-lambda model" )
624  ( "InitialQP",           m_RCInitialQP,               0, "Rate control: initial QP" )
625  ( "RCForceIntraQP",      m_RCForceIntraQP,        false, "Rate control: force intra QP to be equal to initial QP" )
626#else
627  ("RateCtrl,-rc", m_enableRateCtrl, false, "Rate control on/off")
628  ("TargetBitrate,-tbr", m_targetBitrate, 0, "Input target bitrate")
629  ("NumLCUInUnit,-nu", m_numLCUInUnit, 0, "Number of LCUs in an Unit")
630#endif
631
632  ("TransquantBypassEnableFlag", m_TransquantBypassEnableFlag, false, "transquant_bypass_enable_flag indicator in PPS")
633  ("CUTransquantBypassFlagValue", m_CUTransquantBypassFlagValue, false, "Fixed cu_transquant_bypass_flag value, when transquant_bypass_enable_flag is enabled")
634  ("RecalculateQPAccordingToLambda", m_recalculateQPAccordingToLambda, false, "Recalculate QP values according to lambda values. Do not suggest to be enabled in all intra case")
635  ("StrongIntraSmoothing,-sis",      m_useStrongIntraSmoothing,           true, "Enable strong intra smoothing for 32x32 blocks")
636  ("SEIActiveParameterSets",         m_activeParameterSetsSEIEnabled,          0, "Enable generation of active parameter sets SEI messages")
637  ("VuiParametersPresent,-vui",      m_vuiParametersPresentFlag,           false, "Enable generation of vui_parameters()")
638  ("AspectRatioInfoPresent",         m_aspectRatioInfoPresentFlag,         false, "Signals whether aspect_ratio_idc is present")
639  ("AspectRatioIdc",                 m_aspectRatioIdc,                         0, "aspect_ratio_idc")
640  ("SarWidth",                       m_sarWidth,                               0, "horizontal size of the sample aspect ratio")
641  ("SarHeight",                      m_sarHeight,                              0, "vertical size of the sample aspect ratio")
642  ("OverscanInfoPresent",            m_overscanInfoPresentFlag,            false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
643  ("OverscanAppropriate",            m_overscanAppropriateFlag,            false, "Indicates whether conformant decoded pictures are suitable for display using overscan\n")
644  ("VideoSignalTypePresent",         m_videoSignalTypePresentFlag,         false, "Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present")
645  ("VideoFormat",                    m_videoFormat,                            5, "Indicates representation of pictures")
646  ("VideoFullRange",                 m_videoFullRangeFlag,                 false, "Indicates the black level and range of luma and chroma signals")
647  ("ColourDescriptionPresent",       m_colourDescriptionPresentFlag,       false, "Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present")
648  ("ColourPrimaries",                m_colourPrimaries,                        2, "Indicates chromaticity coordinates of the source primaries")
649  ("TransferCharateristics",         m_transferCharacteristics,                2, "Indicates the opto-electronic transfer characteristics of the source")
650  ("MatrixCoefficients",             m_matrixCoefficients,                     2, "Describes the matrix coefficients used in deriving luma and chroma from RGB primaries")
651  ("ChromaLocInfoPresent",           m_chromaLocInfoPresentFlag,           false, "Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present")
652  ("ChromaSampleLocTypeTopField",    m_chromaSampleLocTypeTopField,            0, "Specifies the location of chroma samples for top field")
653  ("ChromaSampleLocTypeBottomField", m_chromaSampleLocTypeBottomField,         0, "Specifies the location of chroma samples for bottom field")
654  ("NeutralChromaIndication",        m_neutralChromaIndicationFlag,        false, "Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1)")
655  ("DefaultDisplayWindowFlag",       m_defaultDisplayWindowFlag,           false, "Indicates the presence of the Default Window parameters")
656  ("DefDispWinLeftOffset",           m_defDispWinLeftOffset,                   0, "Specifies the left offset of the default display window from the conformance window")
657  ("DefDispWinRightOffset",          m_defDispWinRightOffset,                  0, "Specifies the right offset of the default display window from the conformance window")
658  ("DefDispWinTopOffset",            m_defDispWinTopOffset,                    0, "Specifies the top offset of the default display window from the conformance window")
659  ("DefDispWinBottomOffset",         m_defDispWinBottomOffset,                 0, "Specifies the bottom offset of the default display window from the conformance window")
660  ("FrameFieldInfoPresentFlag",      m_frameFieldInfoPresentFlag,               false, "Indicates that pic_struct and field coding related values are present in picture timing SEI messages")
661  ("PocProportionalToTimingFlag",   m_pocProportionalToTimingFlag,         false, "Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS")
662  ("NumTicksPocDiffOneMinus1",      m_numTicksPocDiffOneMinus1,                0, "Number of ticks minus 1 that for a POC difference of one")
663  ("BitstreamRestriction",           m_bitstreamRestrictionFlag,           false, "Signals whether bitstream restriction parameters are present")
664  ("TilesFixedStructure",            m_tilesFixedStructureFlag,            false, "Indicates that each active picture parameter set has the same values of the syntax elements related to tiles")
665  ("MotionVectorsOverPicBoundaries", m_motionVectorsOverPicBoundariesFlag, false, "Indicates that no samples outside the picture boundaries are used for inter prediction")
666  ("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")
667  ("MaxBitsPerMinCuDenom",           m_maxBitsPerMinCuDenom,                   1, "Indicates an upper bound for the number of bits of coding_unit() data")
668  ("Log2MaxMvLengthHorizontal",      m_log2MaxMvLengthHorizontal,             15, "Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units")
669  ("Log2MaxMvLengthVertical",        m_log2MaxMvLengthVertical,               15, "Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units")
670  ("SEIRecoveryPoint",               m_recoveryPointSEIEnabled,                0, "Control generation of recovery point SEI messages")
671  ("SEIBufferingPeriod",             m_bufferingPeriodSEIEnabled,              0, "Control generation of buffering period SEI messages")
672  ("SEIPictureTiming",               m_pictureTimingSEIEnabled,                0, "Control generation of picture timing SEI messages")
673#if J0149_TONE_MAPPING_SEI
674  ("SEIToneMappingInfo",                       m_toneMappingInfoSEIEnabled,    false, "Control generation of Tone Mapping SEI messages")
675  ("SEIToneMapId",                             m_toneMapId,                        0, "Specifies Id of Tone Mapping SEI message for a given session")
676  ("SEIToneMapCancelFlag",                     m_toneMapCancelFlag,            false, "Indicates that Tone Mapping SEI message cancels the persistance or follows")
677  ("SEIToneMapPersistenceFlag",                m_toneMapPersistenceFlag,        true, "Specifies the persistence of the Tone Mapping SEI message")
678  ("SEIToneMapCodedDataBitDepth",              m_toneMapCodedDataBitDepth,         8, "Specifies Coded Data BitDepth of Tone Mapping SEI messages")
679  ("SEIToneMapTargetBitDepth",                 m_toneMapTargetBitDepth,            8, "Specifies Output BitDepth of Tome mapping function")
680  ("SEIToneMapModelId",                        m_toneMapModelId,                   0, "Specifies Model utilized for mapping coded data into target_bit_depth range\n"
681                                                                                      "\t0:  linear mapping with clipping\n"
682                                                                                      "\t1:  sigmoidal mapping\n"
683                                                                                      "\t2:  user-defined table mapping\n"
684                                                                                      "\t3:  piece-wise linear mapping\n"
685                                                                                      "\t4:  luminance dynamic range information ")
686  ("SEIToneMapMinValue",                              m_toneMapMinValue,                          0, "Specifies the minimum value in mode 0")
687  ("SEIToneMapMaxValue",                              m_toneMapMaxValue,                       1023, "Specifies the maxmum value in mode 0")
688  ("SEIToneMapSigmoidMidpoint",                       m_sigmoidMidpoint,                        512, "Specifies the centre point in mode 1")
689  ("SEIToneMapSigmoidWidth",                          m_sigmoidWidth,                           960, "Specifies the distance between 5% and 95% values of the target_bit_depth in mode 1")
690  ("SEIToneMapStartOfCodedInterval",                  cfg_startOfCodedInterval,          string(""), "Array of user-defined mapping table")
691  ("SEIToneMapNumPivots",                             m_numPivots,                                0, "Specifies the number of pivot points in mode 3")
692  ("SEIToneMapCodedPivotValue",                       cfg_codedPivotValue,               string(""), "Array of pivot point")
693  ("SEIToneMapTargetPivotValue",                      cfg_targetPivotValue,              string(""), "Array of pivot point")
694  ("SEIToneMapCameraIsoSpeedIdc",                     m_cameraIsoSpeedIdc,                        0, "Indicates the camera ISO speed for daylight illumination")
695  ("SEIToneMapCameraIsoSpeedValue",                   m_cameraIsoSpeedValue,                    400, "Specifies the camera ISO speed for daylight illumination of Extended_ISO")
696  ("SEIToneMapExposureCompensationValueSignFlag",     m_exposureCompensationValueSignFlag,        0, "Specifies the sign of ExposureCompensationValue")
697  ("SEIToneMapExposureCompensationValueNumerator",    m_exposureCompensationValueNumerator,       0, "Specifies the numerator of ExposureCompensationValue")
698  ("SEIToneMapExposureCompensationValueDenomIdc",     m_exposureCompensationValueDenomIdc,        2, "Specifies the denominator of ExposureCompensationValue")
699  ("SEIToneMapRefScreenLuminanceWhite",               m_refScreenLuminanceWhite,                350, "Specifies reference screen brightness setting in units of candela per square metre")
700  ("SEIToneMapExtendedRangeWhiteLevel",               m_extendedRangeWhiteLevel,                800, "Indicates the luminance dynamic range")
701  ("SEIToneMapNominalBlackLevelLumaCodeValue",        m_nominalBlackLevelLumaCodeValue,          16, "Specifies luma sample value of the nominal black level assigned decoded pictures")
702  ("SEIToneMapNominalWhiteLevelLumaCodeValue",        m_nominalWhiteLevelLumaCodeValue,         235, "Specifies luma sample value of the nominal white level assigned decoded pictures")
703  ("SEIToneMapExtendedWhiteLevelLumaCodeValue",       m_extendedWhiteLevelLumaCodeValue,        300, "Specifies luma sample value of the extended dynamic range assigned decoded pictures")
704#endif
705  ("SEIFramePacking",                m_framePackingSEIEnabled,                 0, "Control generation of frame packing SEI messages")
706  ("SEIFramePackingType",            m_framePackingSEIType,                    0, "Define frame packing arrangement\n"
707                                                                                  "\t0: checkerboard - pixels alternatively represent either frames\n"
708                                                                                  "\t1: column alternation - frames are interlaced by column\n"
709                                                                                  "\t2: row alternation - frames are interlaced by row\n"
710                                                                                  "\t3: side by side - frames are displayed horizontally\n"
711                                                                                  "\t4: top bottom - frames are displayed vertically\n"
712                                                                                  "\t5: frame alternation - one frame is alternated with the other")
713  ("SEIFramePackingId",              m_framePackingSEIId,                      0, "Id of frame packing SEI message for a given session")
714  ("SEIFramePackingQuincunx",        m_framePackingSEIQuincunx,                0, "Indicate the presence of a Quincunx type video frame")
715  ("SEIFramePackingInterpretation",  m_framePackingSEIInterpretation,          0, "Indicate the interpretation of the frame pair\n"
716                                                                                  "\t0: unspecified\n"
717                                                                                  "\t1: stereo pair, frame0 represents left view\n"
718                                                                                  "\t2: stereo pair, frame0 represents right view")
719  ("SEIDisplayOrientation",          m_displayOrientationSEIAngle,             0, "Control generation of display orientation SEI messages\n"
720                                                              "\tN: 0 < N < (2^16 - 1) enable display orientation SEI message with anticlockwise_rotation = N and display_orientation_repetition_period = 1\n"
721                                                              "\t0: disable")
722  ("SEITemporalLevel0Index",         m_temporalLevel0IndexSEIEnabled,          0, "Control generation of temporal level 0 index SEI messages")
723  ("SEIGradualDecodingRefreshInfo",  m_gradualDecodingRefreshInfoEnabled,      0, "Control generation of gradual decoding refresh information SEI message")
724  ("SEIDecodingUnitInfo",             m_decodingUnitInfoSEIEnabled,                       0, "Control generation of decoding unit information SEI message.")
725#if L0208_SOP_DESCRIPTION_SEI
726  ("SEISOPDescription",              m_SOPDescriptionSEIEnabled,              0, "Control generation of SOP description SEI messages")
727#endif
728#if K0180_SCALABLE_NESTING_SEI
729  ("SEIScalableNesting",             m_scalableNestingSEIEnabled,              0, "Control generation of scalable nesting SEI messages")
730#endif
731#if SIGNAL_BITRATE_PICRATE_IN_VPS
732  ("BitRatePicRateMaxTLayers",   m_bitRatePicRateMaxTLayers,           0, "Maximum number of sub-layers signalled; can be inferred otherwise; here for easy parsing of config. file")
733  ("BitRateInfoPresent",         cfg_bitRateInfoPresentFlag,          string(""), "Control signalling of bit rate information of avg. bit rate and max. bit rate in VPS\n"
734                                                                          "\t0: Do not sent bit rate info\n"
735                                                                          "\tN (N > 0): Send bit rate info for N sub-layers. N should equal maxTempLayers.")                                                                     
736  ("PicRateInfoPresent",         cfg_picRateInfoPresentFlag,          string(""), "Control signalling of picture rate information of avg. bit rate and max. bit rate in VPS\n"
737                                                                          "\t0: Do not sent picture rate info\n"
738                                                                          "\tN (N > 0): Send picture rate info for N sub-layers. N should equal maxTempLayers.")                                                                     
739  ("AvgBitRate",                   cfg_avgBitRate,                    string(""), "List of avg. bit rates for the different sub-layers; include non-negative number even if corresponding flag is 0")
740  ("MaxBitRate",                   cfg_maxBitRate,                    string(""), "List of max. bit rates for the different sub-layers; include non-negative number even if corresponding flag is 0")
741  ("AvgPicRate",                   cfg_avgPicRate,                    string(""), "List of avg. picture rates for the different sub-layers; include non-negative number even if corresponding flag is 0")
742  ("ConstantPicRateIdc",           cfg_constantPicRateIdc,            string(""), "List of constant picture rate IDCs; include non-negative number even if corresponding flag is 0")
743#endif
744  ;
745 
746  for(Int i=1; i<MAX_GOP+1; i++) {
747    std::ostringstream cOSS;
748    cOSS<<"Frame"<<i;
749    opts.addOptions()(cOSS.str(), m_GOPList[i-1], GOPEntry());
750  }
751  po::setDefaults(opts);
752  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
753
754  for (list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
755  {
756    fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
757  }
758 
759  if (argc == 1 || do_help)
760  {
761    /* argc == 1: no options have been specified */
762    po::doHelp(cout, opts);
763    return false;
764  }
765 
766  /*
767   * Set any derived parameters
768   */
769  /* convert std::string to c string for compatability */
770#if SVC_EXTENSION
771#if AVC_BASE
772  if( m_avcBaseLayerFlag )
773  {
774    *cfg_InputFile[0] = cfg_BLInputFile;
775  }
776#endif
777  m_pBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
778#if AVC_SYNTAX
779  m_BLSyntaxFile = cfg_BLSyntaxFile.empty() ? NULL : strdup(cfg_BLSyntaxFile.c_str());
780#endif
781#else
782  m_pchInputFile = cfg_InputFile.empty() ? NULL : strdup(cfg_InputFile.c_str());
783  m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
784  m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str());
785  m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str());
786#endif 
787
788  Char* pColumnWidth = cfg_ColumnWidth.empty() ? NULL: strdup(cfg_ColumnWidth.c_str());
789  Char* pRowHeight = cfg_RowHeight.empty() ? NULL : strdup(cfg_RowHeight.c_str());
790  if( m_iUniformSpacingIdr == 0 && m_iNumColumnsMinus1 > 0 )
791  {
792    char *columnWidth;
793    int  i=0;
794    m_pColumnWidth = new UInt[m_iNumColumnsMinus1];
795    columnWidth = strtok(pColumnWidth, " ,-");
796    while(columnWidth!=NULL)
797    {
798      if( i>=m_iNumColumnsMinus1 )
799      {
800        printf( "The number of columns whose width are defined is larger than the allowed number of columns.\n" );
801        exit( EXIT_FAILURE );
802      }
803      *( m_pColumnWidth + i ) = atoi( columnWidth );
804      columnWidth = strtok(NULL, " ,-");
805      i++;
806    }
807    if( i<m_iNumColumnsMinus1 )
808    {
809      printf( "The width of some columns is not defined.\n" );
810      exit( EXIT_FAILURE );
811    }
812  }
813  else
814  {
815    m_pColumnWidth = NULL;
816  }
817
818  if( m_iUniformSpacingIdr == 0 && m_iNumRowsMinus1 > 0 )
819  {
820    char *rowHeight;
821    int  i=0;
822    m_pRowHeight = new UInt[m_iNumRowsMinus1];
823    rowHeight = strtok(pRowHeight, " ,-");
824    while(rowHeight!=NULL)
825    {
826      if( i>=m_iNumRowsMinus1 )
827      {
828        printf( "The number of rows whose height are defined is larger than the allowed number of rows.\n" );
829        exit( EXIT_FAILURE );
830      }
831      *( m_pRowHeight + i ) = atoi( rowHeight );
832      rowHeight = strtok(NULL, " ,-");
833      i++;
834    }
835    if( i<m_iNumRowsMinus1 )
836    {
837      printf( "The height of some rows is not defined.\n" );
838      exit( EXIT_FAILURE );
839   }
840  }
841  else
842  {
843    m_pRowHeight = NULL;
844  }
845#if VPS_EXTN_DIRECT_REF_LAYERS
846  for(Int layer = 0; layer < MAX_LAYERS; layer++)
847  {
848    Char* pRefLayerIds = cfg_refLayerIds[layer].empty() ? NULL: strdup(cfg_refLayerIds[layer].c_str());
849    if( m_acLayerCfg[layer].m_numDirectRefLayers > 0 )
850    {
851      char *refLayerId;
852      int  i=0;
853      m_acLayerCfg[layer].m_refLayerIds = new Int[m_acLayerCfg[layer].m_numDirectRefLayers];
854      refLayerId = strtok(pRefLayerIds, " ,-");
855      while(refLayerId != NULL)
856      {
857        if( i >= m_acLayerCfg[layer].m_numDirectRefLayers )
858        {
859          printf( "The number of columns whose width are defined is larger than the allowed number of columns.\n" );
860          exit( EXIT_FAILURE );
861        }
862        *( m_acLayerCfg[layer].m_refLayerIds + i ) = atoi( refLayerId );
863        refLayerId = strtok(NULL, " ,-");
864        i++;
865      }
866      if( i < m_acLayerCfg[layer].m_numDirectRefLayers )
867      {
868        printf( "The width of some columns is not defined.\n" );
869        exit( EXIT_FAILURE );
870      }
871    }
872    else
873    {
874      m_acLayerCfg[layer].m_refLayerIds = NULL;
875    }
876  }
877#endif
878#if SIGNAL_BITRATE_PICRATE_IN_VPS
879  readBoolString(cfg_bitRateInfoPresentFlag, m_bitRatePicRateMaxTLayers, m_bitRateInfoPresentFlag, "bit rate info. present flag" );
880  readIntString (cfg_avgBitRate,             m_bitRatePicRateMaxTLayers, m_avgBitRate,             "avg. bit rate"               );
881  readIntString (cfg_maxBitRate,             m_bitRatePicRateMaxTLayers, m_maxBitRate,             "max. bit rate"               );
882  readBoolString(cfg_picRateInfoPresentFlag, m_bitRatePicRateMaxTLayers, m_picRateInfoPresentFlag, "bit rate info. present flag" );
883  readIntString (cfg_avgPicRate,             m_bitRatePicRateMaxTLayers, m_avgPicRate,             "avg. pic rate"               );
884  readIntString (cfg_constantPicRateIdc,     m_bitRatePicRateMaxTLayers, m_constantPicRateIdc,     "constant pic rate Idc"       );
885#endif
886  m_scalingListFile = cfg_ScalingListFile.empty() ? NULL : strdup(cfg_ScalingListFile.c_str());
887 
888  /* rules for input, output and internal bitdepths as per help text */
889  if (!m_internalBitDepthY) { m_internalBitDepthY = m_inputBitDepthY; }
890  if (!m_internalBitDepthC) { m_internalBitDepthC = m_internalBitDepthY; }
891  if (!m_inputBitDepthC) { m_inputBitDepthC = m_inputBitDepthY; }
892  if (!m_outputBitDepthY) { m_outputBitDepthY = m_internalBitDepthY; }
893  if (!m_outputBitDepthC) { m_outputBitDepthC = m_internalBitDepthC; }
894
895#if !SVC_EXTENSION
896  // TODO:ChromaFmt assumes 4:2:0 below
897  switch (m_conformanceMode)
898  {
899  case 0:
900    {
901      // no conformance or padding
902      m_confLeft = m_confRight = m_confTop = m_confBottom = 0;
903      m_aiPad[1] = m_aiPad[0] = 0;
904      break;
905    }
906  case 1:
907    {
908      // automatic padding to minimum CU size
909      Int minCuSize = m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1);
910      if (m_iSourceWidth % minCuSize)
911      {
912        m_aiPad[0] = m_confRight  = ((m_iSourceWidth / minCuSize) + 1) * minCuSize - m_iSourceWidth;
913        m_iSourceWidth  += m_confRight;
914      }
915      if (m_iSourceHeight % minCuSize)
916      {
917        m_aiPad[1] = m_confBottom = ((m_iSourceHeight / minCuSize) + 1) * minCuSize - m_iSourceHeight;
918        m_iSourceHeight += m_confBottom;
919      }
920      if (m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0)
921      {
922        fprintf(stderr, "Error: picture width is not an integer multiple of the specified chroma subsampling\n");
923        exit(EXIT_FAILURE);
924      }
925      if (m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0)
926      {
927        fprintf(stderr, "Error: picture height is not an integer multiple of the specified chroma subsampling\n");
928        exit(EXIT_FAILURE);
929      }
930      break;
931    }
932  case 2:
933    {
934      //padding
935      m_iSourceWidth  += m_aiPad[0];
936      m_iSourceHeight += m_aiPad[1];
937      m_confRight  = m_aiPad[0];
938      m_confBottom = m_aiPad[1];
939      break;
940    }
941  case 3:
942    {
943      // conformance
944      if ((m_confLeft == 0) && (m_confRight == 0) && (m_confTop == 0) && (m_confBottom == 0))
945      {
946        fprintf(stderr, "Warning: Conformance window enabled, but all conformance window parameters set to zero\n");
947      }
948      if ((m_aiPad[1] != 0) || (m_aiPad[0]!=0))
949      {
950        fprintf(stderr, "Warning: Conformance window enabled, padding parameters will be ignored\n");
951      }
952      m_aiPad[1] = m_aiPad[0] = 0;
953      break;
954    }
955  }
956 
957  // allocate slice-based dQP values
958  m_aidQP = new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ];
959  ::memset( m_aidQP, 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );
960 
961  // handling of floating-point QP values
962  // if QP is not integer, sequence is split into two sections having QP and QP+1
963  m_iQP = (Int)( m_fQP );
964  if ( m_iQP < m_fQP )
965  {
966    Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP - m_iQP)*m_framesToBeEncoded + 0.5 );
967   
968    iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
969    for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
970    {
971      m_aidQP[i] = 1;
972    }
973  }
974 
975  // reading external dQP description from file
976  if ( m_pchdQPFile )
977  {
978    FILE* fpt=fopen( m_pchdQPFile, "r" );
979    if ( fpt )
980    {
981      Int iValue;
982      Int iPOC = 0;
983      while ( iPOC < m_framesToBeEncoded )
984      {
985        if ( fscanf(fpt, "%d", &iValue ) == EOF ) break;
986        m_aidQP[ iPOC ] = iValue;
987        iPOC++;
988      }
989      fclose(fpt);
990    }
991  }
992  m_iWaveFrontSubstreams = m_iWaveFrontSynchro ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1;
993#endif
994#if J0149_TONE_MAPPING_SEI
995  if( m_toneMappingInfoSEIEnabled && !m_toneMapCancelFlag )
996  {
997    Char* pcStartOfCodedInterval = cfg_startOfCodedInterval.empty() ? NULL: strdup(cfg_startOfCodedInterval.c_str());
998    Char* pcCodedPivotValue = cfg_codedPivotValue.empty() ? NULL: strdup(cfg_codedPivotValue.c_str());
999    Char* pcTargetPivotValue = cfg_targetPivotValue.empty() ? NULL: strdup(cfg_targetPivotValue.c_str());
1000    if( m_toneMapModelId == 2 && pcStartOfCodedInterval )
1001    {
1002      char *startOfCodedInterval;
1003      UInt num = 1u<< m_toneMapTargetBitDepth;
1004      m_startOfCodedInterval = new Int[num];
1005      ::memset( m_startOfCodedInterval, 0, sizeof(Int)*num );
1006      startOfCodedInterval = strtok(pcStartOfCodedInterval, " .");
1007      int i = 0;
1008      while( startOfCodedInterval && ( i < num ) )
1009      {
1010        m_startOfCodedInterval[i] = atoi( startOfCodedInterval );
1011        startOfCodedInterval = strtok(NULL, " .");
1012        i++;
1013      }
1014    } 
1015    else
1016    {
1017      m_startOfCodedInterval = NULL;
1018    }
1019    if( ( m_toneMapModelId == 3 ) && ( m_numPivots > 0 ) )
1020    {
1021      if( pcCodedPivotValue && pcTargetPivotValue )
1022      {
1023        char *codedPivotValue;
1024        char *targetPivotValue;
1025        m_codedPivotValue = new Int[m_numPivots];
1026        m_targetPivotValue = new Int[m_numPivots];
1027        ::memset( m_codedPivotValue, 0, sizeof(Int)*( m_numPivots ) );
1028        ::memset( m_targetPivotValue, 0, sizeof(Int)*( m_numPivots ) );
1029        codedPivotValue = strtok(pcCodedPivotValue, " .");
1030        int i=0;
1031        while(codedPivotValue&&i<m_numPivots)
1032        {
1033          m_codedPivotValue[i] = atoi( codedPivotValue );
1034          codedPivotValue = strtok(NULL, " .");
1035          i++;
1036        }
1037        i=0;
1038        targetPivotValue = strtok(pcTargetPivotValue, " .");
1039        while(targetPivotValue&&i<m_numPivots)
1040        {
1041          m_targetPivotValue[i]= atoi( targetPivotValue );
1042          targetPivotValue = strtok(NULL, " .");
1043          i++;
1044        }
1045      }
1046    }
1047    else
1048    {
1049      m_codedPivotValue = NULL;
1050      m_targetPivotValue = NULL;
1051    }
1052  }
1053#endif
1054  // check validity of input parameters
1055  xCheckParameter();
1056 
1057  // set global varibles
1058  xSetGlobal();
1059 
1060  // print-out parameters
1061  xPrintParameter();
1062 
1063  return true;
1064}
1065#if SIGNAL_BITRATE_PICRATE_IN_VPS
1066Void readBoolString(const string inpString, const Int numEntries, Bool* &memberArray, const char *elementName)
1067{
1068  Char* inpArray = inpString.empty() ? NULL : strdup(inpString.c_str());
1069  Int i = 0;
1070  if(numEntries)
1071  {
1072    Char* tempArray = strtok(inpArray, " ,-");
1073    memberArray = new Bool[numEntries];
1074    while( tempArray != NULL )
1075    {
1076      if( i >= numEntries )
1077      {
1078        printf( "The number of %s defined is larger than the allowed number\n", elementName );
1079        exit( EXIT_FAILURE );
1080      }
1081      assert( (atoi(tempArray) == 0) || (atoi(tempArray) == 1) );
1082      *( memberArray + i ) = atoi(tempArray);
1083      tempArray = strtok(NULL, " ,-");
1084      i++;
1085    }
1086    if( i < numEntries )
1087    {
1088      printf( "Some %s are not defined\n", elementName );
1089      exit( EXIT_FAILURE );
1090    }
1091  }
1092  else
1093  {
1094    memberArray = NULL;
1095  }
1096}
1097
1098Void readIntString(const string inpString, const Int numEntries, Int* &memberArray, const char *elementName)
1099{
1100  Char* inpArray = inpString.empty() ? NULL : strdup(inpString.c_str());
1101  Int i = 0;
1102  if(numEntries)
1103  {
1104    Char* tempArray = strtok(inpArray, " ,-");
1105    memberArray = new Int[numEntries];
1106    while( tempArray != NULL )
1107    {
1108      if( i >= numEntries )
1109      {
1110        printf( "The number of %s defined is larger than the allowed number\n", elementName );
1111        exit( EXIT_FAILURE );
1112      }
1113      *( memberArray + i ) = atoi(tempArray);
1114      tempArray = strtok(NULL, " ,-");
1115      i++;
1116    }
1117    if( i < numEntries )
1118    {
1119      printf( "Some %s are not defined\n", elementName );
1120      exit( EXIT_FAILURE );
1121    }
1122  }
1123  else
1124  {
1125    memberArray = NULL;
1126  }
1127}
1128#endif
1129// ====================================================================================================================
1130// Private member functions
1131// ====================================================================================================================
1132
1133Bool confirmPara(Bool bflag, const Char* message);
1134
1135Void TAppEncCfg::xCheckParameter()
1136{
1137  if (!m_decodedPictureHashSEIEnabled)
1138  {
1139    fprintf(stderr, "******************************************************************\n");
1140    fprintf(stderr, "** WARNING: --SEIDecodedPictureHash is now disabled by default. **\n");
1141    fprintf(stderr, "**          Automatic verification of decoded pictures by a     **\n");
1142    fprintf(stderr, "**          decoder requires this option to be enabled.         **\n");
1143    fprintf(stderr, "******************************************************************\n");
1144  }
1145
1146  Bool check_failed = false; /* abort if there is a fatal configuration problem */
1147#define xConfirmPara(a,b) check_failed |= confirmPara(a,b)
1148  // check range of parameters
1149  xConfirmPara( m_inputBitDepthY < 8,                                                     "InputBitDepth must be at least 8" );
1150  xConfirmPara( m_inputBitDepthC < 8,                                                     "InputBitDepthC must be at least 8" );
1151#if !SVC_EXTENSION 
1152  xConfirmPara( m_iFrameRate <= 0,                                                          "Frame rate must be more than 1" );
1153#endif
1154  xConfirmPara( m_framesToBeEncoded <= 0,                                                   "Total Number Of Frames encoded must be more than 0" );
1155  xConfirmPara( m_iGOPSize < 1 ,                                                            "GOP Size must be greater or equal to 1" );
1156  xConfirmPara( m_iGOPSize > 1 &&  m_iGOPSize % 2,                                          "GOP Size must be a multiple of 2, if GOP Size is greater than 1" );
1157#if !SVC_EXTENSION
1158  xConfirmPara( (m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, "Intra period must be more than GOP size, or -1 , not 0" );
1159#endif
1160  xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 2,                   "Decoding Refresh Type must be equal to 0, 1 or 2" );
1161#if !SVC_EXTENSION
1162  xConfirmPara( m_iQP <  -6 * (m_internalBitDepthY - 8) || m_iQP > 51,                    "QP exceeds supported range (-QpBDOffsety to 51)" );
1163#endif
1164  xConfirmPara( m_loopFilterBetaOffsetDiv2 < -13 || m_loopFilterBetaOffsetDiv2 > 13,          "Loop Filter Beta Offset div. 2 exceeds supported range (-13 to 13)");
1165  xConfirmPara( m_loopFilterTcOffsetDiv2 < -13 || m_loopFilterTcOffsetDiv2 > 13,              "Loop Filter Tc Offset div. 2 exceeds supported range (-13 to 13)");
1166  xConfirmPara( m_iFastSearch < 0 || m_iFastSearch > 2,                                     "Fast Search Mode is not supported value (0:Full search  1:Diamond  2:PMVFAST)" );
1167  xConfirmPara( m_iSearchRange < 0 ,                                                        "Search Range must be more than 0" );
1168  xConfirmPara( m_bipredSearchRange < 0 ,                                                   "Search Range must be more than 0" );
1169  xConfirmPara( m_iMaxDeltaQP > 7,                                                          "Absolute Delta QP exceeds supported range (0 to 7)" );
1170  xConfirmPara( m_iMaxCuDQPDepth > m_uiMaxCUDepth - 1,                                          "Absolute depth for a minimum CuDQP exceeds maximum coding unit depth" );
1171
1172  xConfirmPara( m_cbQpOffset < -12,   "Min. Chroma Cb QP Offset is -12" );
1173  xConfirmPara( m_cbQpOffset >  12,   "Max. Chroma Cb QP Offset is  12" );
1174  xConfirmPara( m_crQpOffset < -12,   "Min. Chroma Cr QP Offset is -12" );
1175  xConfirmPara( m_crQpOffset >  12,   "Max. Chroma Cr QP Offset is  12" );
1176
1177  xConfirmPara( m_iQPAdaptationRange <= 0,                                                  "QP Adaptation Range must be more than 0" );
1178#if !SVC_EXTENSION
1179  if (m_iDecodingRefreshType == 2)
1180  {
1181    xConfirmPara( m_iIntraPeriod > 0 && m_iIntraPeriod <= m_iGOPSize ,                      "Intra period must be larger than GOP size for periodic IDR pictures");
1182  }
1183#endif
1184  xConfirmPara( (m_uiMaxCUWidth  >> m_uiMaxCUDepth) < 4,                                    "Minimum partition width size should be larger than or equal to 8");
1185  xConfirmPara( (m_uiMaxCUHeight >> m_uiMaxCUDepth) < 4,                                    "Minimum partition height size should be larger than or equal to 8");
1186  xConfirmPara( m_uiMaxCUWidth < 16,                                                        "Maximum partition width size should be larger than or equal to 16");
1187  xConfirmPara( m_uiMaxCUHeight < 16,                                                       "Maximum partition height size should be larger than or equal to 16");
1188#if !SVC_EXTENSION
1189  xConfirmPara( (m_iSourceWidth  % (m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame width must be a multiple of the minimum CU size");
1190  xConfirmPara( (m_iSourceHeight % (m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)))!=0,             "Resulting coded frame height must be a multiple of the minimum CU size");
1191#endif
1192 
1193  xConfirmPara( m_uiQuadtreeTULog2MinSize < 2,                                        "QuadtreeTULog2MinSize must be 2 or greater.");
1194  xConfirmPara( m_uiQuadtreeTULog2MaxSize > 5,                                        "QuadtreeTULog2MaxSize must be 5 or smaller.");
1195  xConfirmPara( (1<<m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth,                                        "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
1196 
1197  xConfirmPara( m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize,                "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize.");
1198  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUWidth >>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
1199  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUHeight>>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
1200  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUWidth  >> m_uiMaxCUDepth ), "Minimum CU width must be greater than minimum transform size." );
1201  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUHeight >> m_uiMaxCUDepth ), "Minimum CU height must be greater than minimum transform size." );
1202  xConfirmPara( m_uiQuadtreeTUMaxDepthInter < 1,                                                         "QuadtreeTUMaxDepthInter must be greater than or equal to 1" );
1203  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" );
1204  xConfirmPara( m_uiQuadtreeTUMaxDepthIntra < 1,                                                         "QuadtreeTUMaxDepthIntra must be greater than or equal to 1" );
1205  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" );
1206 
1207  xConfirmPara(  m_maxNumMergeCand < 1,  "MaxNumMergeCand must be 1 or greater.");
1208  xConfirmPara(  m_maxNumMergeCand > 5,  "MaxNumMergeCand must be 5 or smaller.");
1209
1210#if !SVC_EXTENSION
1211#if ADAPTIVE_QP_SELECTION
1212  xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP < 0,                                              "AdaptiveQpSelection must be disabled when QP < 0.");
1213  xConfirmPara( m_bUseAdaptQpSelect == true && (m_cbQpOffset !=0 || m_crQpOffset != 0 ),               "AdaptiveQpSelection must be disabled when ChromaQpOffset is not equal to 0.");
1214#endif
1215#endif
1216
1217  if( m_usePCM)
1218  {
1219    xConfirmPara(  m_uiPCMLog2MinSize < 3,                                      "PCMLog2MinSize must be 3 or greater.");
1220    xConfirmPara(  m_uiPCMLog2MinSize > 5,                                      "PCMLog2MinSize must be 5 or smaller.");
1221    xConfirmPara(  m_pcmLog2MaxSize > 5,                                        "PCMLog2MaxSize must be 5 or smaller.");
1222    xConfirmPara(  m_pcmLog2MaxSize < m_uiPCMLog2MinSize,                       "PCMLog2MaxSize must be equal to or greater than m_uiPCMLog2MinSize.");
1223  }
1224
1225  xConfirmPara( m_sliceMode < 0 || m_sliceMode > 3, "SliceMode exceeds supported range (0 to 3)" );
1226  if (m_sliceMode!=0)
1227  {
1228    xConfirmPara( m_sliceArgument < 1 ,         "SliceArgument should be larger than or equal to 1" );
1229  }
1230  xConfirmPara( m_sliceSegmentMode < 0 || m_sliceSegmentMode > 3, "SliceSegmentMode exceeds supported range (0 to 3)" );
1231  if (m_sliceSegmentMode!=0)
1232  {
1233    xConfirmPara( m_sliceSegmentArgument < 1 ,         "SliceSegmentArgument should be larger than or equal to 1" );
1234  }
1235 
1236  Bool tileFlag = (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0 );
1237  xConfirmPara( tileFlag && m_iWaveFrontSynchro,            "Tile and Wavefront can not be applied together");
1238
1239  //TODO:ChromaFmt assumes 4:2:0 below
1240#if !SVC_EXTENSION
1241  xConfirmPara( m_iSourceWidth  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Picture width must be an integer multiple of the specified chroma subsampling");
1242  xConfirmPara( m_iSourceHeight % TComSPS::getWinUnitY(CHROMA_420) != 0, "Picture height must be an integer multiple of the specified chroma subsampling");
1243
1244  xConfirmPara( m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling");
1245  xConfirmPara( m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling");
1246
1247  xConfirmPara( m_confLeft   % TComSPS::getWinUnitX(CHROMA_420) != 0, "Left conformance window offset must be an integer multiple of the specified chroma subsampling");
1248  xConfirmPara( m_confRight  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Right conformance window offset must be an integer multiple of the specified chroma subsampling");
1249  xConfirmPara( m_confTop    % TComSPS::getWinUnitY(CHROMA_420) != 0, "Top conformance window offset must be an integer multiple of the specified chroma subsampling");
1250  xConfirmPara( m_confBottom % TComSPS::getWinUnitY(CHROMA_420) != 0, "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling");
1251#endif
1252
1253  // max CU width and height should be power of 2
1254  UInt ui = m_uiMaxCUWidth;
1255  while(ui)
1256  {
1257    ui >>= 1;
1258    if( (ui & 1) == 1)
1259      xConfirmPara( ui != 1 , "Width should be 2^n");
1260  }
1261  ui = m_uiMaxCUHeight;
1262  while(ui)
1263  {
1264    ui >>= 1;
1265    if( (ui & 1) == 1)
1266      xConfirmPara( ui != 1 , "Height should be 2^n");
1267  }
1268
1269
1270  /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure
1271   * This permits the ability to omit a GOP structure specification */
1272#if SVC_EXTENSION
1273  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
1274  {
1275    Int m_iIntraPeriod = m_acLayerCfg[layer].m_iIntraPeriod;
1276#endif
1277  if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1) {
1278    m_GOPList[0] = GOPEntry();
1279    m_GOPList[0].m_QPFactor = 1;
1280    m_GOPList[0].m_betaOffsetDiv2 = 0;
1281    m_GOPList[0].m_tcOffsetDiv2 = 0;
1282    m_GOPList[0].m_POC = 1;
1283    m_GOPList[0].m_numRefPicsActive = 4;
1284  }
1285#if SVC_EXTENSION
1286  }
1287#endif
1288 
1289  Bool verifiedGOP=false;
1290  Bool errorGOP=false;
1291  Int checkGOP=1;
1292  Int numRefs = 1;
1293  Int refList[MAX_NUM_REF_PICS+1];
1294  refList[0]=0;
1295  Bool isOK[MAX_GOP];
1296  for(Int i=0; i<MAX_GOP; i++) 
1297  {
1298    isOK[i]=false;
1299  }
1300  Int numOK=0;
1301#if !SVC_EXTENSION
1302  xConfirmPara( m_iIntraPeriod >=0&&(m_iIntraPeriod%m_iGOPSize!=0), "Intra period must be a multiple of GOPSize, or -1" );
1303#endif
1304
1305  for(Int i=0; i<m_iGOPSize; i++)
1306  {
1307    if(m_GOPList[i].m_POC==m_iGOPSize)
1308    {
1309      xConfirmPara( m_GOPList[i].m_temporalId!=0 , "The last frame in each GOP must have temporal ID = 0 " );
1310    }
1311  }
1312
1313#if SVC_EXTENSION
1314  xConfirmPara( m_numLayers > MAX_LAYERS , "Number of layers in config file is greater than MAX_LAYERS" );
1315  m_numLayers = m_numLayers > MAX_LAYERS ? MAX_LAYERS : m_numLayers;
1316
1317  // verify layer configuration parameters
1318  for(UInt layer=0; layer<m_numLayers; layer++)
1319  {
1320    if(m_acLayerCfg[layer].xCheckParameter())
1321    {
1322      printf("\nError: invalid configuration parameter found in layer %d \n", layer);
1323      check_failed = true;
1324    }
1325  }
1326#endif 
1327
1328#if SVC_EXTENSION
1329  // verify layer configuration parameters
1330  for(UInt layer=0; layer<m_numLayers; layer++)
1331  {
1332    Int m_iIntraPeriod = m_acLayerCfg[layer].m_iIntraPeriod;
1333#endif
1334  if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable) )
1335  {
1336    for(Int i=0; i<m_iGOPSize; i++)
1337    {
1338      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)" );
1339      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)" );
1340    }
1341  }
1342#if SVC_EXTENSION
1343  }
1344#endif
1345
1346  m_extraRPSs=0;
1347  //start looping through frames in coding order until we can verify that the GOP structure is correct.
1348  while(!verifiedGOP&&!errorGOP) 
1349  {
1350    Int curGOP = (checkGOP-1)%m_iGOPSize;
1351    Int curPOC = ((checkGOP-1)/m_iGOPSize)*m_iGOPSize + m_GOPList[curGOP].m_POC;   
1352    if(m_GOPList[curGOP].m_POC<0) 
1353    {
1354      printf("\nError: found fewer Reference Picture Sets than GOPSize\n");
1355      errorGOP=true;
1356    }
1357    else 
1358    {
1359      //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
1360      Bool beforeI = false;
1361      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
1362      {
1363        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
1364        if(absPOC < 0)
1365        {
1366          beforeI=true;
1367        }
1368        else 
1369        {
1370          Bool found=false;
1371          for(Int j=0; j<numRefs; j++) 
1372          {
1373            if(refList[j]==absPOC) 
1374            {
1375              found=true;
1376              for(Int k=0; k<m_iGOPSize; k++)
1377              {
1378                if(absPOC%m_iGOPSize == m_GOPList[k].m_POC%m_iGOPSize)
1379                {
1380                  if(m_GOPList[k].m_temporalId==m_GOPList[curGOP].m_temporalId)
1381                  {
1382                    m_GOPList[k].m_refPic = true;
1383                  }
1384                  m_GOPList[curGOP].m_usedByCurrPic[i]=m_GOPList[k].m_temporalId<=m_GOPList[curGOP].m_temporalId;
1385                }
1386              }
1387            }
1388          }
1389          if(!found)
1390          {
1391            printf("\nError: ref pic %d is not available for GOP frame %d\n",m_GOPList[curGOP].m_referencePics[i],curGOP+1);
1392            errorGOP=true;
1393          }
1394        }
1395      }
1396      if(!beforeI&&!errorGOP)
1397      {
1398        //all ref frames were present
1399        if(!isOK[curGOP]) 
1400        {
1401          numOK++;
1402          isOK[curGOP]=true;
1403          if(numOK==m_iGOPSize)
1404          {
1405            verifiedGOP=true;
1406          }
1407        }
1408      }
1409      else 
1410      {
1411        //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
1412        m_GOPList[m_iGOPSize+m_extraRPSs]=m_GOPList[curGOP];
1413        Int newRefs=0;
1414        for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
1415        {
1416          Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
1417          if(absPOC>=0)
1418          {
1419            m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[newRefs]=m_GOPList[curGOP].m_referencePics[i];
1420            m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[newRefs]=m_GOPList[curGOP].m_usedByCurrPic[i];
1421            newRefs++;
1422          }
1423        }
1424        Int numPrefRefs = m_GOPList[curGOP].m_numRefPicsActive;
1425       
1426        for(Int offset = -1; offset>-checkGOP; offset--)
1427        {
1428          //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
1429          Int offGOP = (checkGOP-1+offset)%m_iGOPSize;
1430          Int offPOC = ((checkGOP-1+offset)/m_iGOPSize)*m_iGOPSize + m_GOPList[offGOP].m_POC;
1431          if(offPOC>=0&&m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId)
1432          {
1433            Bool newRef=false;
1434            for(Int i=0; i<numRefs; i++)
1435            {
1436              if(refList[i]==offPOC)
1437              {
1438                newRef=true;
1439              }
1440            }
1441            for(Int i=0; i<newRefs; i++) 
1442            {
1443              if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[i]==offPOC-curPOC)
1444              {
1445                newRef=false;
1446              }
1447            }
1448            if(newRef) 
1449            {
1450              Int insertPoint=newRefs;
1451              //this picture can be added, find appropriate place in list and insert it.
1452              if(m_GOPList[offGOP].m_temporalId==m_GOPList[curGOP].m_temporalId)
1453              {
1454                m_GOPList[offGOP].m_refPic = true;
1455              }
1456              for(Int j=0; j<newRefs; j++)
1457              {
1458                if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]<offPOC-curPOC||m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]>0)
1459                {
1460                  insertPoint = j;
1461                  break;
1462                }
1463              }
1464              Int prev = offPOC-curPOC;
1465              Int prevUsed = m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId;
1466              for(Int j=insertPoint; j<newRefs+1; j++)
1467              {
1468                Int newPrev = m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j];
1469                Int newUsed = m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j];
1470                m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]=prev;
1471                m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j]=prevUsed;
1472                prevUsed=newUsed;
1473                prev=newPrev;
1474              }
1475              newRefs++;
1476            }
1477          }
1478          if(newRefs>=numPrefRefs)
1479          {
1480            break;
1481          }
1482        }
1483        m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics=newRefs;
1484        m_GOPList[m_iGOPSize+m_extraRPSs].m_POC = curPOC;
1485        if (m_extraRPSs == 0)
1486        {
1487          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 0;
1488          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = 0;
1489        }
1490        else
1491        {
1492          Int rIdx =  m_iGOPSize + m_extraRPSs - 1;
1493          Int refPOC = m_GOPList[rIdx].m_POC;
1494          Int refPics = m_GOPList[rIdx].m_numRefPics;
1495          Int newIdc=0;
1496          for(Int i = 0; i<= refPics; i++) 
1497          {
1498            Int deltaPOC = ((i != refPics)? m_GOPList[rIdx].m_referencePics[i] : 0);  // check if the reference abs POC is >= 0
1499            Int absPOCref = refPOC+deltaPOC;
1500            Int refIdc = 0;
1501            for (Int j = 0; j < m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics; j++)
1502            {
1503              if ( (absPOCref - curPOC) == m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j])
1504              {
1505                if (m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j])
1506                {
1507                  refIdc = 1;
1508                }
1509                else
1510                {
1511                  refIdc = 2;
1512                }
1513              }
1514            }
1515            m_GOPList[m_iGOPSize+m_extraRPSs].m_refIdc[newIdc]=refIdc;
1516            newIdc++;
1517          }
1518          m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 1; 
1519          m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = newIdc;
1520          m_GOPList[m_iGOPSize+m_extraRPSs].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize+m_extraRPSs].m_POC; 
1521        }
1522        curGOP=m_iGOPSize+m_extraRPSs;
1523        m_extraRPSs++;
1524      }
1525      numRefs=0;
1526      for(Int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++) 
1527      {
1528        Int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
1529        if(absPOC >= 0) 
1530        {
1531          refList[numRefs]=absPOC;
1532          numRefs++;
1533        }
1534      }
1535      refList[numRefs]=curPOC;
1536      numRefs++;
1537    }
1538    checkGOP++;
1539  }
1540  xConfirmPara(errorGOP,"Invalid GOP structure given");
1541  m_maxTempLayer = 1;
1542  for(Int i=0; i<m_iGOPSize; i++) 
1543  {
1544    if(m_GOPList[i].m_temporalId >= m_maxTempLayer)
1545    {
1546      m_maxTempLayer = m_GOPList[i].m_temporalId+1;
1547    }
1548    xConfirmPara(m_GOPList[i].m_sliceType!='B'&&m_GOPList[i].m_sliceType!='P', "Slice type must be equal to B or P");
1549  }
1550  for(Int i=0; i<MAX_TLAYER; i++)
1551  {
1552    m_numReorderPics[i] = 0;
1553#if L0323_DPB
1554    m_maxDecPicBuffering[i] = 1;
1555#else
1556    m_maxDecPicBuffering[i] = 0;
1557#endif
1558  }
1559  for(Int i=0; i<m_iGOPSize; i++) 
1560  {
1561#if L0323_DPB
1562    if(m_GOPList[i].m_numRefPics+1 > m_maxDecPicBuffering[m_GOPList[i].m_temporalId])
1563#else
1564    if(m_GOPList[i].m_numRefPics > m_maxDecPicBuffering[m_GOPList[i].m_temporalId])
1565#endif
1566    {
1567#if L0323_DPB
1568      m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics + 1;
1569#else
1570      m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics;
1571#endif
1572    }
1573    Int highestDecodingNumberWithLowerPOC = 0; 
1574    for(Int j=0; j<m_iGOPSize; j++)
1575    {
1576      if(m_GOPList[j].m_POC <= m_GOPList[i].m_POC)
1577      {
1578        highestDecodingNumberWithLowerPOC = j;
1579      }
1580    }
1581    Int numReorder = 0;
1582    for(Int j=0; j<highestDecodingNumberWithLowerPOC; j++)
1583    {
1584      if(m_GOPList[j].m_temporalId <= m_GOPList[i].m_temporalId && 
1585        m_GOPList[j].m_POC > m_GOPList[i].m_POC)
1586      {
1587        numReorder++;
1588      }
1589    }   
1590    if(numReorder > m_numReorderPics[m_GOPList[i].m_temporalId])
1591    {
1592      m_numReorderPics[m_GOPList[i].m_temporalId] = numReorder;
1593    }
1594  }
1595  for(Int i=0; i<MAX_TLAYER-1; i++) 
1596  {
1597    // a lower layer can not have higher value of m_numReorderPics than a higher layer
1598    if(m_numReorderPics[i+1] < m_numReorderPics[i])
1599    {
1600      m_numReorderPics[i+1] = m_numReorderPics[i];
1601    }
1602#if L0323_DPB
1603    // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] - 1, inclusive
1604    if(m_numReorderPics[i] > m_maxDecPicBuffering[i] - 1)
1605    {
1606      m_maxDecPicBuffering[i] = m_numReorderPics[i] + 1;
1607    }
1608#else
1609    // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ], inclusive
1610    if(m_numReorderPics[i] > m_maxDecPicBuffering[i])
1611    {
1612      m_maxDecPicBuffering[i] = m_numReorderPics[i];
1613    }
1614#endif
1615    // a lower layer can not have higher value of m_uiMaxDecPicBuffering than a higher layer
1616    if(m_maxDecPicBuffering[i+1] < m_maxDecPicBuffering[i])
1617    {
1618      m_maxDecPicBuffering[i+1] = m_maxDecPicBuffering[i];
1619    }
1620  }
1621
1622
1623#if L0323_DPB
1624  // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] -  1, inclusive
1625  if(m_numReorderPics[MAX_TLAYER-1] > m_maxDecPicBuffering[MAX_TLAYER-1] - 1)
1626  {
1627    m_maxDecPicBuffering[MAX_TLAYER-1] = m_numReorderPics[MAX_TLAYER-1] + 1;
1628  }
1629#else
1630  // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ], inclusive
1631  if(m_numReorderPics[MAX_TLAYER-1] > m_maxDecPicBuffering[MAX_TLAYER-1])
1632  {
1633    m_maxDecPicBuffering[MAX_TLAYER-1] = m_numReorderPics[MAX_TLAYER-1];
1634  }
1635#endif
1636
1637#if SVC_EXTENSION // ToDo: it should be checked for the case when parameters are different for the layers
1638  for(UInt layer = 0; layer < MAX_LAYERS; layer++)
1639  {
1640    Int m_iSourceWidth = m_acLayerCfg[layer].m_iSourceWidth;
1641    Int m_iSourceHeight = m_acLayerCfg[layer].m_iSourceHeight;
1642#endif
1643  if(m_vuiParametersPresentFlag && m_bitstreamRestrictionFlag)
1644  { 
1645    Int PicSizeInSamplesY =  m_iSourceWidth * m_iSourceHeight;
1646    if(tileFlag)
1647    {
1648      Int maxTileWidth = 0;
1649      Int maxTileHeight = 0;
1650      Int widthInCU = (m_iSourceWidth % m_uiMaxCUWidth) ? m_iSourceWidth/m_uiMaxCUWidth + 1: m_iSourceWidth/m_uiMaxCUWidth;
1651      Int heightInCU = (m_iSourceHeight % m_uiMaxCUHeight) ? m_iSourceHeight/m_uiMaxCUHeight + 1: m_iSourceHeight/m_uiMaxCUHeight;
1652      if(m_iUniformSpacingIdr)
1653      {
1654        maxTileWidth = m_uiMaxCUWidth*((widthInCU+m_iNumColumnsMinus1)/(m_iNumColumnsMinus1+1));
1655        maxTileHeight = m_uiMaxCUHeight*((heightInCU+m_iNumRowsMinus1)/(m_iNumRowsMinus1+1));
1656        // if only the last tile-row is one treeblock higher than the others
1657        // the maxTileHeight becomes smaller if the last row of treeblocks has lower height than the others
1658        if(!((heightInCU-1)%(m_iNumRowsMinus1+1)))
1659        {
1660          maxTileHeight = maxTileHeight - m_uiMaxCUHeight + (m_iSourceHeight % m_uiMaxCUHeight);
1661        }     
1662        // if only the last tile-column is one treeblock wider than the others
1663        // the maxTileWidth becomes smaller if the last column of treeblocks has lower width than the others   
1664        if(!((widthInCU-1)%(m_iNumColumnsMinus1+1)))
1665        {
1666          maxTileWidth = maxTileWidth - m_uiMaxCUWidth + (m_iSourceWidth % m_uiMaxCUWidth);
1667        }
1668      }
1669      else // not uniform spacing
1670      {
1671        if(m_iNumColumnsMinus1<1)
1672        {
1673          maxTileWidth = m_iSourceWidth;
1674        }
1675        else
1676        {
1677          Int accColumnWidth = 0;
1678          for(Int col=0; col<(m_iNumColumnsMinus1); col++)
1679          {
1680            maxTileWidth = m_pColumnWidth[col]>maxTileWidth ? m_pColumnWidth[col]:maxTileWidth;
1681            accColumnWidth += m_pColumnWidth[col];
1682          }
1683          maxTileWidth = (widthInCU-accColumnWidth)>maxTileWidth ? m_uiMaxCUWidth*(widthInCU-accColumnWidth):m_uiMaxCUWidth*maxTileWidth;
1684        }
1685        if(m_iNumRowsMinus1<1)
1686        {
1687          maxTileHeight = m_iSourceHeight;
1688        }
1689        else
1690        {
1691          Int accRowHeight = 0;
1692          for(Int row=0; row<(m_iNumRowsMinus1); row++)
1693          {
1694            maxTileHeight = m_pRowHeight[row]>maxTileHeight ? m_pRowHeight[row]:maxTileHeight;
1695            accRowHeight += m_pRowHeight[row];
1696          }
1697          maxTileHeight = (heightInCU-accRowHeight)>maxTileHeight ? m_uiMaxCUHeight*(heightInCU-accRowHeight):m_uiMaxCUHeight*maxTileHeight;
1698        }
1699      }
1700      Int maxSizeInSamplesY = maxTileWidth*maxTileHeight;
1701      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/maxSizeInSamplesY-4;
1702    }
1703    else if(m_iWaveFrontSynchro)
1704    {
1705      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/((2*m_iSourceHeight+m_iSourceWidth)*m_uiMaxCUHeight)-4;
1706    }
1707    else if(m_sliceMode == 1)
1708    {
1709      m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/(m_sliceArgument*m_uiMaxCUWidth*m_uiMaxCUHeight)-4;
1710    }
1711    else
1712    {
1713      m_minSpatialSegmentationIdc = 0;
1714    }
1715  }
1716#if SVC_EXTENSION
1717  }
1718#endif
1719#if !L0034_COMBINED_LIST_CLEANUP
1720  xConfirmPara( m_bUseLComb==false && m_numReorderPics[MAX_TLAYER-1]!=0, "ListCombination can only be 0 in low delay coding (more precisely when L0 and L1 are identical)" );  // Note however this is not the full necessary condition as ref_pic_list_combination_flag can only be 0 if L0 == L1.
1721#endif
1722  xConfirmPara( m_iWaveFrontSynchro < 0, "WaveFrontSynchro cannot be negative" );
1723#if !SVC_EXTENSION
1724  xConfirmPara( m_iWaveFrontSubstreams <= 0, "WaveFrontSubstreams must be positive" );
1725  xConfirmPara( m_iWaveFrontSubstreams > 1 && !m_iWaveFrontSynchro, "Must have WaveFrontSynchro > 0 in order to have WaveFrontSubstreams > 1" );
1726#endif
1727
1728  xConfirmPara( m_decodedPictureHashSEIEnabled<0 || m_decodedPictureHashSEIEnabled>3, "this hash type is not correct!\n");
1729
1730#if J0149_TONE_MAPPING_SEI
1731  if (m_toneMappingInfoSEIEnabled)
1732  {
1733    xConfirmPara( m_toneMapCodedDataBitDepth < 8 || m_toneMapCodedDataBitDepth > 14 , "SEIToneMapCodedDataBitDepth must be in rage 8 to 14");
1734    xConfirmPara( m_toneMapTargetBitDepth < 1 || (m_toneMapTargetBitDepth > 16 && m_toneMapTargetBitDepth < 255) , "SEIToneMapTargetBitDepth must be in rage 1 to 16 or equal to 255");
1735    xConfirmPara( m_toneMapModelId < 0 || m_toneMapModelId > 4 , "SEIToneMapModelId must be in rage 0 to 4");
1736    xConfirmPara( m_cameraIsoSpeedValue == 0, "SEIToneMapCameraIsoSpeedValue shall not be equal to 0");
1737    xConfirmPara( m_extendedRangeWhiteLevel < 100, "SEIToneMapExtendedRangeWhiteLevel should be greater than or equal to 100");
1738    xConfirmPara( m_nominalBlackLevelLumaCodeValue >= m_nominalWhiteLevelLumaCodeValue, "SEIToneMapNominalWhiteLevelLumaCodeValue shall be greater than SEIToneMapNominalBlackLevelLumaCodeValue");
1739    xConfirmPara( m_extendedWhiteLevelLumaCodeValue < m_nominalWhiteLevelLumaCodeValue, "SEIToneMapExtendedWhiteLevelLumaCodeValue shall be greater than or equal to SEIToneMapNominalWhiteLevelLumaCodeValue");
1740  }
1741#endif
1742
1743#if RATE_CONTROL_LAMBDA_DOMAIN
1744  if ( m_RCEnableRateControl )
1745  {
1746    if ( m_RCForceIntraQP )
1747    {
1748      if ( m_RCInitialQP == 0 )
1749      {
1750        printf( "\nInitial QP for rate control is not specified. Reset not to use force intra QP!" );
1751        m_RCForceIntraQP = false;
1752      }
1753    }
1754    xConfirmPara( m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n" );
1755  }
1756#else
1757  if(m_enableRateCtrl)
1758  {
1759    Int numLCUInWidth  = (m_iSourceWidth  / m_uiMaxCUWidth) + (( m_iSourceWidth  %  m_uiMaxCUWidth ) ? 1 : 0);
1760    Int numLCUInHeight = (m_iSourceHeight / m_uiMaxCUHeight)+ (( m_iSourceHeight %  m_uiMaxCUHeight) ? 1 : 0);
1761    Int numLCUInPic    =  numLCUInWidth * numLCUInHeight;
1762
1763    xConfirmPara( (numLCUInPic % m_numLCUInUnit) != 0, "total number of LCUs in a frame should be completely divided by NumLCUInUnit" );
1764
1765    m_iMaxDeltaQP       = MAX_DELTA_QP;
1766    m_iMaxCuDQPDepth    = MAX_CUDQP_DEPTH;
1767  }
1768#endif
1769
1770  xConfirmPara(!m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagValue, "CUTransquantBypassFlagValue cannot be 1 when TransquantBypassEnableFlag is 0");
1771
1772  xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2");
1773#if L0444_FPA_TYPE
1774  if (m_framePackingSEIEnabled)
1775  {
1776    xConfirmPara(m_framePackingSEIType < 3 || m_framePackingSEIType > 5 , "SEIFramePackingType must be in rage 3 to 5");
1777  }
1778#endif
1779#if VPS_EXTN_DIRECT_REF_LAYERS
1780  xConfirmPara( (m_acLayerCfg[0].m_numDirectRefLayers != 0) && (m_acLayerCfg[0].m_numDirectRefLayers != -1), "Layer 0 cannot have any reference layers" );
1781  // 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
1782  for(Int layer = 1; layer < MAX_LAYERS; layer++)
1783  {
1784    xConfirmPara(m_acLayerCfg[layer].m_numDirectRefLayers > layer, "Cannot reference more layers than before current layer");
1785    for(Int i = 0; i < m_acLayerCfg[layer].m_numDirectRefLayers; i++)
1786    {
1787      xConfirmPara(m_acLayerCfg[layer].m_refLayerIds[i] > layer, "Cannot reference higher layers");
1788      xConfirmPara(m_acLayerCfg[layer].m_refLayerIds[i] == layer, "Cannot reference the current layer itself");
1789    }
1790  }
1791#endif
1792#undef xConfirmPara
1793  if (check_failed)
1794  {
1795    exit(EXIT_FAILURE);
1796  }
1797}
1798
1799/** \todo use of global variables should be removed later
1800 */
1801Void TAppEncCfg::xSetGlobal()
1802{
1803  // set max CU width & height
1804  g_uiMaxCUWidth  = m_uiMaxCUWidth;
1805  g_uiMaxCUHeight = m_uiMaxCUHeight;
1806 
1807  // compute actual CU depth with respect to config depth and max transform size
1808  g_uiAddCUDepth  = 0;
1809  while( (m_uiMaxCUWidth>>m_uiMaxCUDepth) > ( 1 << ( m_uiQuadtreeTULog2MinSize + g_uiAddCUDepth )  ) ) g_uiAddCUDepth++;
1810 
1811  m_uiMaxCUDepth += g_uiAddCUDepth;
1812  g_uiAddCUDepth++;
1813  g_uiMaxCUDepth = m_uiMaxCUDepth;
1814 
1815  // set internal bit-depth and constants
1816  g_bitDepthY = m_internalBitDepthY;
1817  g_bitDepthC = m_internalBitDepthC;
1818 
1819  g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_inputBitDepthY : m_internalBitDepthY;
1820  g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_inputBitDepthC : m_internalBitDepthC;
1821}
1822
1823Void TAppEncCfg::xPrintParameter()
1824{
1825  printf("\n");
1826#if SVC_EXTENSION 
1827  printf("Total number of layers        : %d\n", m_numLayers            );
1828  for(UInt layer=0; layer<m_numLayers; layer++)
1829  {
1830    printf("=== Layer %d settings === \n", layer);
1831#if AVC_SYNTAX
1832    m_acLayerCfg[layer].xPrintParameter( layer );
1833#else
1834    m_acLayerCfg[layer].xPrintParameter();
1835#endif
1836    printf("\n");
1837  }
1838  printf("=== Common configuration settings === \n");
1839  printf("Bitstream      File          : %s\n", m_pBitstreamFile      );
1840#else
1841  printf("Input          File          : %s\n", m_pchInputFile          );
1842  printf("Bitstream      File          : %s\n", m_pchBitstreamFile      );
1843  printf("Reconstruction File          : %s\n", m_pchReconFile          );
1844  printf("Real     Format              : %dx%d %dHz\n", m_iSourceWidth - m_confLeft - m_confRight, m_iSourceHeight - m_confTop - m_confBottom, m_iFrameRate );
1845  printf("Internal Format              : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate );
1846#endif
1847  printf("Frame index                  : %u - %d (%d frames)\n", m_FrameSkip, m_FrameSkip+m_framesToBeEncoded-1, m_framesToBeEncoded );
1848  printf("CU size / depth              : %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth );
1849  printf("RQT trans. size (min / max)  : %d / %d\n", 1 << m_uiQuadtreeTULog2MinSize, 1 << m_uiQuadtreeTULog2MaxSize );
1850  printf("Max RQT depth inter          : %d\n", m_uiQuadtreeTUMaxDepthInter);
1851  printf("Max RQT depth intra          : %d\n", m_uiQuadtreeTUMaxDepthIntra);
1852  printf("Min PCM size                 : %d\n", 1 << m_uiPCMLog2MinSize);
1853  printf("Motion search range          : %d\n", m_iSearchRange );
1854#if !SVC_EXTENSION
1855  printf("Intra period                 : %d\n", m_iIntraPeriod );
1856#endif
1857  printf("Decoding refresh type        : %d\n", m_iDecodingRefreshType );
1858#if !SVC_EXTENSION
1859  printf("QP                           : %5.2f\n", m_fQP );
1860#endif
1861  printf("Max dQP signaling depth      : %d\n", m_iMaxCuDQPDepth);
1862
1863  printf("Cb QP Offset                 : %d\n", m_cbQpOffset   );
1864  printf("Cr QP Offset                 : %d\n", m_crQpOffset);
1865
1866  printf("QP adaptation                : %d (range=%d)\n", m_bUseAdaptiveQP, (m_bUseAdaptiveQP ? m_iQPAdaptationRange : 0) );
1867  printf("GOP size                     : %d\n", m_iGOPSize );
1868  printf("Internal bit depth           : (Y:%d, C:%d)\n", m_internalBitDepthY, m_internalBitDepthC );
1869  printf("PCM sample bit depth         : (Y:%d, C:%d)\n", g_uiPCMBitDepthLuma, g_uiPCMBitDepthChroma );
1870#if RATE_CONTROL_LAMBDA_DOMAIN
1871  printf("RateControl                  : %d\n", m_RCEnableRateControl );
1872  if(m_RCEnableRateControl)
1873  {
1874    printf("TargetBitrate                : %d\n", m_RCTargetBitrate );
1875    printf("KeepHierarchicalBit          : %d\n", m_RCKeepHierarchicalBit );
1876    printf("LCULevelRC                   : %d\n", m_RCLCULevelRC );
1877    printf("UseLCUSeparateModel          : %d\n", m_RCUseLCUSeparateModel );
1878    printf("InitialQP                    : %d\n", m_RCInitialQP );
1879    printf("ForceIntraQP                 : %d\n", m_RCForceIntraQP );
1880  }
1881#else
1882  printf("RateControl                  : %d\n", m_enableRateCtrl);
1883  if(m_enableRateCtrl)
1884  {
1885    printf("TargetBitrate                : %d\n", m_targetBitrate);
1886    printf("NumLCUInUnit                 : %d\n", m_numLCUInUnit);
1887  }
1888#endif
1889  printf("Max Num Merge Candidates     : %d\n", m_maxNumMergeCand);
1890  printf("\n");
1891 
1892  printf("TOOL CFG: ");
1893  printf("IBD:%d ", g_bitDepthY > m_inputBitDepthY || g_bitDepthC > m_inputBitDepthC);
1894  printf("HAD:%d ", m_bUseHADME           );
1895  printf("SRD:%d ", m_bUseSBACRD          );
1896  printf("RDQ:%d ", m_useRDOQ            );
1897  printf("RDQTS:%d ", m_useRDOQTS        );
1898#if L0232_RD_PENALTY
1899  printf("RDpenalty:%d ", m_rdPenalty  );
1900#endif
1901  printf("SQP:%d ", m_uiDeltaQpRD         );
1902  printf("ASR:%d ", m_bUseASR             );
1903#if !L0034_COMBINED_LIST_CLEANUP
1904  printf("LComb:%d ", m_bUseLComb         );
1905#endif
1906  printf("FEN:%d ", m_bUseFastEnc         );
1907  printf("ECU:%d ", m_bUseEarlyCU         );
1908  printf("FDM:%d ", m_useFastDecisionForMerge );
1909  printf("CFM:%d ", m_bUseCbfFastMode         );
1910  printf("ESD:%d ", m_useEarlySkipDetection  );
1911  printf("RQT:%d ", 1     );
1912  printf("TransformSkip:%d ",     m_useTransformSkip              );
1913  printf("TransformSkipFast:%d ", m_useTransformSkipFast       );
1914  printf("Slice: M=%d ", m_sliceMode);
1915  if (m_sliceMode!=0)
1916  {
1917    printf("A=%d ", m_sliceArgument);
1918  }
1919  printf("SliceSegment: M=%d ",m_sliceSegmentMode);
1920  if (m_sliceSegmentMode!=0)
1921  {
1922    printf("A=%d ", m_sliceSegmentArgument);
1923  }
1924  printf("CIP:%d ", m_bUseConstrainedIntraPred);
1925  printf("SAO:%d ", (m_bUseSAO)?(1):(0));
1926  printf("PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0);
1927  printf("SAOLcuBasedOptimization:%d ", (m_saoLcuBasedOptimization)?(1):(0));
1928
1929  printf("LosslessCuEnabled:%d ", (m_useLossless)? 1:0 );
1930  printf("WPP:%d ", (Int)m_useWeightedPred);
1931  printf("WPB:%d ", (Int)m_useWeightedBiPred);
1932  printf("PME:%d ", m_log2ParallelMergeLevel);
1933#if !SVC_EXTENSION
1934  printf(" WaveFrontSynchro:%d WaveFrontSubstreams:%d",
1935          m_iWaveFrontSynchro, m_iWaveFrontSubstreams);
1936#endif
1937  printf(" ScalingList:%d ", m_useScalingListId );
1938  printf("TMVPMode:%d ", m_TMVPModeId     );
1939#if ADAPTIVE_QP_SELECTION
1940  printf("AQpS:%d", m_bUseAdaptQpSelect   );
1941#endif
1942
1943  printf(" SignBitHidingFlag:%d ", m_signHideFlag);
1944#if SVC_EXTENSION
1945  printf("RecalQP:%d ", m_recalculateQPAccordingToLambda ? 1 : 0 );
1946#if AVC_BASE
1947  printf("AvcBase:%d ", m_avcBaseLayerFlag ? 1 : 0);
1948#else
1949  printf("AvcBase:%d ", 0);
1950#endif
1951#if REF_IDX_FRAMEWORK
1952  printf("REF_IDX_FRAMEWORK:%d ", REF_IDX_FRAMEWORK);
1953  printf("EL_RAP_SliceType: %d ", m_elRapSliceBEnabled);
1954  printf("REF_IDX_ME_ZEROMV: %d ", REF_IDX_ME_ZEROMV);
1955  printf("ENCODER_FAST_MODE: %d ", ENCODER_FAST_MODE);
1956  printf("REF_IDX_MFM: %d ", REF_IDX_MFM);
1957#elif INTRA_BL
1958  printf("INTRA_BL:%d ", INTRA_BL);
1959#if !AVC_BASE
1960  printf("SVC_MVP:%d ", SVC_MVP );
1961  printf("SVC_BL_CAND_INTRA:%d", SVC_BL_CAND_INTRA );
1962#endif
1963#endif
1964#else
1965  printf("RecalQP:%d", m_recalculateQPAccordingToLambda ? 1 : 0 );
1966#endif
1967  printf("\n\n");
1968 
1969  fflush(stdout);
1970}
1971
1972Bool confirmPara(Bool bflag, const Char* message)
1973{
1974  if (!bflag)
1975    return false;
1976 
1977  printf("Error: %s\n",message);
1978  return true;
1979}
1980
1981//! \}
Note: See TracBrowser for help on using the repository browser.