source: 3DVCSoftware/branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/TAppEncCfg.cpp @ 330

Last change on this file since 330 was 324, checked in by tech, 12 years ago

Initial development version for update to latest HM version.
Includes MV-HEVC and basic extensions for 3D-HEVC.

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