source: 3DVCSoftware/trunk/source/App/TAppEncoder/TAppEncCfg.cpp @ 42

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

Nokia (Flexible Coding Order)
Ericsson ( High Level Syntax )
changes

  • Property svn:eol-style set to native
File size: 44.9 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-2011, 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 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
35
36/** \file     TAppEncCfg.cpp
37    \brief    Handle encoder configuration parameters
38*/
39
40#include <stdlib.h>
41#include <math.h>
42#include <cassert>
43#include <cstring>
44#include <string>
45#include "TAppEncCfg.h"
46#include "../../App/TAppCommon/program_options_lite.h"
47
48
49using namespace std;
50namespace po = df::program_options_lite;
51
52/* configuration helper funcs */
53void doOldStyleCmdlineOn(po::Options& opts, const std::string& arg);
54void doOldStyleCmdlineOff(po::Options& opts, const std::string& arg);
55
56// ====================================================================================================================
57// Local constants
58// ====================================================================================================================
59
60/// max value of source padding size
61/** \todo replace it by command line option
62 */
63#define MAX_PAD_SIZE                16
64#define MAX_INPUT_VIEW_NUM          10
65#define MAX_ERREF_VIEW_NUM          15
66
67// ====================================================================================================================
68// Constructor / destructor / initialization / destroy
69// ====================================================================================================================
70
71TAppEncCfg::TAppEncCfg()
72{
73  m_aidQP = NULL;
74#if HHI_VSO
75  m_aaiERViewRefLutInd.resize( MAX_INPUT_VIEW_NUM );
76#endif
77}
78
79TAppEncCfg::~TAppEncCfg()
80{
81  if ( m_aidQP )
82  {
83    delete[] m_aidQP; m_aidQP = NULL;
84  }
85  for(Int i = 0; i< m_pchInputFileList.size(); i++ )
86  {
87    if ( m_pchInputFileList[i] != NULL )
88      free (m_pchInputFileList[i]);
89  }
90
91  for(Int i = 0; i< m_pchDepthInputFileList.size(); i++ )
92  {
93    if ( m_pchDepthInputFileList[i] != NULL )
94      free (m_pchDepthInputFileList[i]);
95  }
96
97  for(Int i = 0; i< m_pchReconFileList.size(); i++ )
98  {
99    if ( m_pchReconFileList[i] != NULL )
100      free (m_pchReconFileList[i]);
101  }
102
103  for(Int i = 0; i< m_pchERRefFileList.size(); i++ )
104  {
105    if ( m_pchERRefFileList[i] != NULL )
106      free (m_pchERRefFileList[i]);
107  }
108
109  if (m_pchBitstreamFile != NULL)
110    free (m_pchBitstreamFile) ;
111
112#if FLEX_CODING_ORDER
113  if (m_pchMVCJointCodingOrder != NULL)
114  {
115          free(m_pchMVCJointCodingOrder) ;
116  }
117#endif
118  for(Int i = 0; i< m_pchDepthReconFileList.size(); i++ )
119  {
120    if ( m_pchDepthReconFileList[i] != NULL )
121      free (m_pchDepthReconFileList[i]);
122  }
123
124  if (m_pchCameraParameterFile != NULL)
125    free (m_pchCameraParameterFile);
126
127  if (m_pchBaseViewCameraNumbers != NULL)
128    free (m_pchBaseViewCameraNumbers);
129
130#if HHI_VSO
131  if (  m_pchVSOConfig != NULL)
132    free (  m_pchVSOConfig );
133#endif
134
135}
136
137Void TAppEncCfg::create()
138{
139}
140
141Void TAppEncCfg::destroy()
142{
143}
144
145// ====================================================================================================================
146// Public member functions
147// ====================================================================================================================
148
149/** \param  argc        number of arguments
150    \param  argv        array of arguments
151    \retval             true when success
152 */
153Bool TAppEncCfg::parseCfg( Int argc, Char* argv[] )
154{
155  bool do_help = false;
156
157  string cfg_InputFile;
158  string cfg_BitstreamFile;
159  string cfg_ReconFile;
160  string cfg_dQPFile;
161
162#if FLEX_CODING_ORDER
163  string cfg_JointCodingOrdering;
164#endif
165
166  po::Options opts;
167  opts.addOptions()
168  ("help", do_help, false, "this help text")
169  ("c", po::parseConfigFile, "configuration file name")
170
171  /* File, I/O and source parameters */
172  ("InputFile_%d,i_%d",       m_pchInputFileList,       (char *) 0 , MAX_INPUT_VIEW_NUM , "original Yuv input file name %d")
173  ("DepthInputFile_%d,di_%d", m_pchDepthInputFileList,  (char *) 0 , MAX_INPUT_VIEW_NUM , "original Yuv depth input file name %d")
174  ("ReconFile_%d,o_%d",       m_pchReconFileList,       (char *) 0 , MAX_INPUT_VIEW_NUM , "reconstructed Yuv output file name %d")
175  ("DepthReconFile_%d,do_%d", m_pchDepthReconFileList,  (char *) 0 , MAX_INPUT_VIEW_NUM , "reconstructed Yuv depth output file name %d")
176  ("BitstreamFile,b", cfg_BitstreamFile, string(""), "bitstream output file name")
177
178  ("CodeDepthMaps",         m_bUsingDepthMaps, false, "Encode depth maps" )
179  ("CodedCamParsPrecision", m_iCodedCamParPrecision, STD_CAM_PARAMETERS_PRECISION, "precision for coding of camera parameters (in units of 2^(-x) luma samples)" )
180
181#ifdef WEIGHT_PRED
182  ("weighted_pred_flag,-wpP",     m_bUseWeightPred, false, "weighted prediction flag (P-Slices)")
183  ("weighted_bipred_idc,-wpBidc", m_uiBiPredIdc,    0u,    "weighted bipred idc (B-Slices)")
184#endif
185  ("SourceWidth,-wdt",      m_iSourceWidth,  0, "Source picture width")
186  ("SourceHeight,-hgt",     m_iSourceHeight, 0, "Source picture height")
187  ("InputBitDepth",         m_uiInputBitDepth, 8u, "bit-depth of input file")
188  ("BitDepth",              m_uiInputBitDepth, 8u, "deprecated alias of InputBitDepth")
189  ("OutputBitDepth",        m_uiOutputBitDepth, 0u, "bit-depth of output file")
190#if ENABLE_IBDI
191  ("BitIncrement",          m_uiBitIncrement, 0xffffffffu, "bit-depth increasement")
192#endif
193  ("InternalBitDepth",      m_uiInternalBitDepth, 0u, "Internal bit-depth (BitDepth+BitIncrement)")
194  ("HorizontalPadding,-pdx",m_aiPad[0],      0, "horizontal source padding size")
195  ("VerticalPadding,-pdy",  m_aiPad[1],      0, "vertical source padding size")
196  ("PAD",                   m_bUsePAD,   false, "automatic source padding of multiple of 16" )
197  ("FrameRate,-fr",         m_iFrameRate,        0, "Frame rate")
198  ("FrameSkip,-fs",         m_FrameSkip,         0u, "Number of frames to skip at start of input YUV")
199  ("FramesToBeEncoded,f",   m_iFrameToBeEncoded, 0, "number of frames to be encoded (default=all)")
200  ("FrameToBeEncoded",      m_iFrameToBeEncoded, 0, "depricated alias of FramesToBeEncoded")
201
202  ("NumberOfViews",         m_iNumberOfViews,    0, "Number of views")
203
204#if FLEX_CODING_ORDER
205  ("FCO",               m_b3DVFlexOrder,   false, "flexible coding order flag" )
206  ("CodingOrder",               cfg_JointCodingOrdering,  string(""), "The coding order for joint texture-depth coding")
207#endif
208
209  /* Unit definition parameters */
210  ("MaxCUWidth",          m_uiMaxCUWidth,  64u)
211  ("MaxCUHeight",         m_uiMaxCUHeight, 64u)
212  /* todo: remove defaults from MaxCUSize */
213  ("MaxCUSize,s",         m_uiMaxCUWidth,  64u, "max CU size")
214  ("MaxCUSize,s",         m_uiMaxCUHeight, 64u, "max CU size")
215  ("MaxPartitionDepth,h", m_uiMaxCUDepth,   4u, "CU depth")
216
217  ("QuadtreeTULog2MaxSize", m_uiQuadtreeTULog2MaxSize, 6u)
218  ("QuadtreeTULog2MinSize", m_uiQuadtreeTULog2MinSize, 2u)
219
220  ("QuadtreeTUMaxDepthIntra", m_uiQuadtreeTUMaxDepthIntra, 1u)
221  ("QuadtreeTUMaxDepthInter", m_uiQuadtreeTUMaxDepthInter, 2u)
222
223  /* Coding structure paramters */
224  ("CodedPictureStoreSize,cpss",  m_uiCodedPictureStoreSize, 16u, "Size of coded picture Buffer")
225#if DCM_DECODING_REFRESH
226  ("DecodingRefreshType,-dr",m_iDecodingRefreshType, 0, "intra refresh, (0:none 1:CDR 2:IDR)")
227#endif
228  ("GOPSize,g",      m_iGOPSize,      1, "GOP size of temporal structure")
229  ("RateGOPSize,-rg",m_iRateGOPSize, -1, "GOP size of hierarchical QP assignment (-1: implies inherit GOPSize value)")
230#if !HHI_NO_LowDelayCoding
231  ("LowDelayCoding",         m_bUseLDC,             false, "low-delay mode")
232#endif
233#if DCM_COMB_LIST
234  ("ListCombination, -lc", m_bUseLComb, true, "combined reference list for uni-prediction in B-slices")
235  ("LCModification", m_bLCMod, false, "enables signalling of combined reference list derivation")
236#endif
237
238  ("GOPFormatString,gfs", m_cInputFormatString,  string(""), "Group of pictures")
239
240  /* motion options */
241  ("FastSearch", m_iFastSearch, 1, "0:Full search  1:Diamond  2:PMVFAST")
242  ("SearchRange,-sr",m_iSearchRange, 96, "motion search range")
243  ("BipredSearchRange", m_bipredSearchRange, 4, "motion search range for bipred refinement")
244  ("HadamardME", m_bUseHADME, true, "hadamard ME for fractional-pel")
245  ("ASR", m_bUseASR, false, "adaptive motion search range")
246
247  /* Quantization parameters */
248  ("QP,q",          m_adQP,     std::vector<double>(1,32), "Qp value, if value is float, QP is switched once during encoding, if two values are given the second is used for depth")
249  ("DeltaQpRD,-dqr",m_uiDeltaQpRD,       0u, "max dQp offset for slice")
250  ("MaxDeltaQP,d",  m_iMaxDeltaQP,        0, "max dQp offset for block")
251  ("dQPFile,m",     m_pchdQPFile , (char*) 0, "dQP file name")
252  ("RDOQ",          m_abUseRDOQ, std::vector<Bool>(1,true), "Enable RDOQ")
253  ("TemporalLayerQPOffset_L0,-tq0", m_aiTLayerQPOffset[0], 0, "QP offset of temporal layer 0")
254  ("TemporalLayerQPOffset_L1,-tq1", m_aiTLayerQPOffset[1], 0, "QP offset of temporal layer 1")
255  ("TemporalLayerQPOffset_L2,-tq2", m_aiTLayerQPOffset[2], 0, "QP offset of temporal layer 2")
256  ("TemporalLayerQPOffset_L3,-tq3", m_aiTLayerQPOffset[3], 0, "QP offset of temporal layer 3")
257  ("TemporalLayerQPOffset_L4,-tq4", m_aiTLayerQPOffset[4], 0, "QP offset of temporal layer 3")
258  ("TemporalLayerQPOffset_L5,-tq5", m_aiTLayerQPOffset[5], 0, "QP offset of temporal layer 3")
259  ("TemporalLayerQPOffset_L6,-tq6", m_aiTLayerQPOffset[6], 0, "QP offset of temporal layer 3")
260  ("TemporalLayerQPOffset_L7,-tq7", m_aiTLayerQPOffset[7], 0, "QP offset of temporal layer 3")
261  ("TemporalLayerQPOffset_L8,-tq8", m_aiTLayerQPOffset[8], 0, "QP offset of temporal layer 3")
262  ("TemporalLayerQPOffset_L9,-tq9", m_aiTLayerQPOffset[9], 0, "QP offset of temporal layer 3")
263
264  /* Entropy coding parameters */
265  ("SymbolMode,-sym", m_iSymbolMode, 1, "symbol mode (0=VLC, 1=SBAC)")
266  ("SBACRD", m_bUseSBACRD, true, "SBAC based RD estimation")
267
268  /* Deblocking filter parameters */
269  ("LoopFilterDisable", m_abLoopFilterDisable, std::vector<Bool>(1,false), "Disables LoopFilter")
270  ("LoopFilterAlphaC0Offset", m_iLoopFilterAlphaC0Offset, 0)
271  ("LoopFilterBetaOffset", m_iLoopFilterBetaOffset, 0 )
272
273  /* Camera Paremetes */
274  ("CameraParameterFile,cpf", m_pchCameraParameterFile,    (Char *) 0, "Camera Parameter File Name")
275  ("BaseViewCameraNumbers" ,  m_pchBaseViewCameraNumbers,  (Char *) 0, "Numbers of base views")
276
277
278    /* View Synthesis Optimization */
279
280#if HHI_VSO
281  ("VSOConfig",                       m_pchVSOConfig            , (Char *) 0    , "VSO configuration")
282    ("VSO",                             m_bUseVSO                 , false         , "Use VSO" )
283    // GT: For development, will be removed later
284  ("VSOMode",                         m_uiVSOMode               , (UInt)   4    , "VSO Mode")
285#if HHI_VSO_LS_TABLE
286  ("LambdaScaleVSO",                  m_dLambdaScaleVSO         , (Double) 1  , "Lambda Scaling for VSO")
287#else
288  ("LambdaScaleVSO",                  m_dLambdaScaleVSO         , (Double) 0.5  , "Lambda Scaling for VSO")
289#endif
290    ("ForceLambdaScaleVSO",             m_bForceLambdaScaleVSO    , false         , "Force using Lambda Scale VSO also in non-VSO-Mode")
291#if HHI_VSO_DIST_INT
292  ("AllowNegDist",                    m_bAllowNegDist           , true         , "Allow negative Distortion in VSO")
293#endif
294
295    ("NumberOfExternalRefs",            m_iNumberOfExternalRefs   , 0             , "Number of virtual external reference views")
296    ("ERRefFile_%d,er_%d",              m_pchERRefFileList        , (char *) 0    , MAX_ERREF_VIEW_NUM , "virtual external reference view file name %d")
297    ("VSERViewReferences_%d,evr_%d"  ,  m_aaiERViewRefInd         , vector<Int>() , MAX_INPUT_VIEW_NUM, "Numbers of external virtual reference views to be used for this view")
298    ("VSBaseViewReferences_%d,bvr_%d",  m_aaiBaseViewRefInd       , vector<Int>() , MAX_INPUT_VIEW_NUM, "Numbers of external virtual reference views to be used for this view")
299#endif
300
301  /* Coding tools */
302  ("MRG", m_bUseMRG, true, "merging of motion partitions")
303
304#if LM_CHROMA
305  ("LMChroma", m_bUseLMChroma, true, "intra chroma prediction based on recontructed luma")
306#endif
307
308  ("ALF", m_abUseALF, std::vector<Bool>(1,true), "Enables ALF")
309#if MTK_SAO
310  ("SAO", m_abUseSAO, std::vector<Bool>(1, true), "SAO")
311#endif
312
313#if MQT_ALF_NPASS
314  ("ALFEncodePassReduction", m_iALFEncodePassReduction, 0, "0:Original 16-pass, 1: 1-pass, 2: 2-pass encoding")
315#endif
316#if HHI_RMP_SWITCH
317  ("RMP", m_bUseRMP ,true, "Rectangular motion partition" )
318#endif
319#ifdef ROUNDING_CONTROL_BIPRED
320  ("RoundingControlBipred", m_useRoundingControlBipred, false, "Rounding control for bi-prediction")
321#endif
322    ("SliceMode",            m_iSliceMode,           0, "0: Disable all Recon slice limits, 1: Enforce max # of LCUs, 2: Enforce max # of bytes")
323    ("SliceArgument",        m_iSliceArgument,       0, "if SliceMode==1 SliceArgument represents max # of LCUs. if SliceMode==2 SliceArgument represents max # of bytes.")
324    ("EntropySliceMode",     m_iEntropySliceMode,    0, "0: Disable all entropy slice limits, 1: Enforce max # of LCUs, 2: Enforce constraint based entropy slices")
325    ("EntropySliceArgument", m_iEntropySliceArgument,0, "if EntropySliceMode==1 SliceArgument represents max # of LCUs. if EntropySliceMode==2 EntropySliceArgument represents max # of bins.")
326#if MTK_NONCROSS_INLOOP_FILTER
327    ("LFCrossSliceBoundaryFlag", m_bLFCrossSliceBoundaryFlag, true)
328#endif
329#if CONSTRAINED_INTRA_PRED
330  ("ConstrainedIntraPred", m_bUseConstrainedIntraPred, false, "Constrained Intra Prediction")
331#endif
332  /* Misc. */
333  ("SEIpictureDigest", m_pictureDigestEnabled, false, "Control generation of picture_digest SEI messages\n"
334                                              "\t1: use MD5\n"
335                                              "\t0: disable")
336  ("FEN", m_bUseFastEnc, false, "fast encoder setting")
337
338#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
339  ("DMM", m_bUseDMM, false, "add depth modes intra")
340#endif
341#if HHI_MPI
342  ("MVI", m_bUseMVI, false, "use motion vector inheritance for depth map coding")
343#endif
344
345  /* Multiview tools */
346#if DEPTH_MAP_GENERATION
347  ("PredDepthMapGen",  m_uiPredDepthMapGeneration, (UInt)0, "generation of prediction depth maps for motion data prediction" )
348#endif
349#if HHI_INTER_VIEW_MOTION_PRED
350  ("MultiviewMvPred",  m_uiMultiviewMvPredMode,    (UInt)0, "usage of predicted depth maps" )
351  ("MultiviewMvRegMode",        m_uiMultiviewMvRegMode,         (UInt)0, "regularization mode for multiview motion vectors" )
352  ("MultiviewMvRegLambdaScale", m_dMultiviewMvRegLambdaScale, (Double)0, "lambda scale for multiview motion vector regularization" )
353#endif
354#if HHI_INTER_VIEW_RESIDUAL_PRED
355  ("MultiviewResPred", m_uiMultiviewResPredMode,   (UInt)0, "usage of inter-view residual prediction" )
356#endif
357
358  ("QpChangeFrame", m_iQpChangeFrame, PicOrderCnt(0), "start frame for QP change")
359  ("QpChangeOffsetVideo", m_iQpChangeOffsetVideo, 0, "QP change offset for video")
360  ("QpChangeOffsetDepth", m_iQpChangeOffsetDepth, 0, "QP change offset for depth")
361#if HHI_INTERVIEW_SKIP
362  ("InterViewSkip",  m_uiInterViewSkip,    (UInt)0, "usage of interview skip" )
363#if HHI_INTERVIEW_SKIP_LAMBDA_SCALE
364  ("InterViewSkipLambdaScale",  m_dInterViewSkipLambdaScale,    (Double)8, "lambda scale for interview skip" )
365#endif
366#endif
367
368  /* Compatability with old style -1 FOO or -0 FOO options. */
369  ("1", doOldStyleCmdlineOn, "turn option <name> on")
370  ("0", doOldStyleCmdlineOff, "turn option <name> off")
371  ;
372
373  po::setDefaults(opts);
374  const list<const char*>& argv_unhandled = po::scanArgv(opts, argc, (const char**) argv);
375
376  for (list<const char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
377  {
378    fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
379  }
380
381  if (argc == 1 || do_help)
382  {
383    /* argc == 1: no options have been specified */
384    po::doHelp(cout, opts);
385    xPrintUsage();
386    return false;
387  }
388
389  /*
390   * Set any derived parameters
391   */
392  /* convert std::string to c string for compatability */
393  m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
394  m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str());
395
396
397#if FLEX_CODING_ORDER
398  m_pchMVCJointCodingOrder      = cfg_JointCodingOrdering.empty()?NULL:strdup(cfg_JointCodingOrdering.c_str());
399  // If flexible order is enabled and if depth comes before the texture for a view, disable VSO
400
401#if HHI_VSO && DISABLE_FCO_FOR_VSO
402  Bool depthComesFirst = false;
403  if ( m_b3DVFlexOrder )
404  {
405    for(Int iViewIdx=0; iViewIdx<m_iNumberOfViews; iViewIdx++)
406    {
407      for ( Int ii=1; ii<12; ii+=2 )
408      {
409        Int iViewIdxCfg = (Int)(m_pchMVCJointCodingOrder[ii]-'0');
410        if ( iViewIdxCfg == iViewIdx )
411        {
412          if ( m_pchMVCJointCodingOrder[ii-1]=='D' ) // depth comes first for this view
413          {
414            depthComesFirst = true;
415            break;
416          }
417          else
418          {
419            assert(m_pchMVCJointCodingOrder[ii-1]=='T');
420          }
421        }
422      }
423    }
424  }
425  if (depthComesFirst)
426  {
427    m_bUseVSO = false;         
428  }
429#endif
430#endif
431
432// GT FIX
433  if ( m_bUsingDepthMaps )
434  {
435    for(Int i = 0; i < m_pchDepthReconFileList.size() ; i++)
436    {
437      if ((m_pchDepthInputFileList[i] != NULL) && (m_pchReconFileList[i] != NULL) && (i < m_iNumberOfViews) )
438      {
439        if (m_pchDepthReconFileList[i] == NULL )
440        {
441          xAppendToFileNameEnd( m_pchReconFileList[i], "_depth", m_pchDepthReconFileList[i] );
442        }
443      }
444      else
445      {
446        m_pchDepthReconFileList[i] = NULL;
447      }
448    };
449  }
450// GT FIX END
451
452  if (m_iRateGOPSize == -1)
453  {
454    /* if rateGOPSize has not been specified, the default value is GOPSize */
455    m_iRateGOPSize = m_iGOPSize;
456  }
457
458  // compute source padding size
459  if ( m_bUsePAD )
460  {
461    if ( m_iSourceWidth%MAX_PAD_SIZE )
462    {
463      m_aiPad[0] = (m_iSourceWidth/MAX_PAD_SIZE+1)*MAX_PAD_SIZE - m_iSourceWidth;
464    }
465
466    if ( m_iSourceHeight%MAX_PAD_SIZE )
467    {
468      m_aiPad[1] = (m_iSourceHeight/MAX_PAD_SIZE+1)*MAX_PAD_SIZE - m_iSourceHeight;
469    }
470  }
471  m_iSourceWidth  += m_aiPad[0];
472  m_iSourceHeight += m_aiPad[1];
473
474//GT QP Depth
475  if ( m_adQP.size() < 2 )
476  {
477    m_adQP.push_back( m_adQP[0] );
478  };
479  for (UInt uiK = 0; uiK < m_adQP.size(); uiK++)
480  {
481    m_aiQP.push_back( (Int)( m_adQP[uiK] ) );
482  }
483//GT QP Depth end
484
485#if HHI_VSO
486  m_bUseVSO = m_bUseVSO && m_bUsingDepthMaps && (m_uiVSOMode != 0);
487#endif
488
489  xCleanUpVectors();
490
491#if HHI_VSO
492  if ( m_abUseALF .size() < 2)
493    m_abUseALF .push_back( m_bUseVSO ? false : m_abUseALF[0]  );
494
495  if ( m_abUseRDOQ.size() < 2)
496    m_abUseRDOQ.push_back( m_bUseVSO ? true : m_abUseRDOQ[0] );
497
498  if ( m_abLoopFilterDisable.size() < 2)
499    m_abLoopFilterDisable.push_back( m_bUseVSO ? true : m_abLoopFilterDisable[0]  );
500
501  if (m_abUseSAO.size() < 2)
502    m_abUseSAO.push_back            ( m_bUseVSO ? false : m_abUseSAO[0] );
503#else
504  if ( m_abUseALF .size() < 2)
505    m_abUseALF .push_back( m_abUseALF[0]  );
506
507  if ( m_abUseRDOQ.size() < 2)
508    m_abUseRDOQ.push_back( m_abUseRDOQ[0] );
509
510  if ( m_abLoopFilterDisable.size() < 2)
511    m_abLoopFilterDisable.push_back( m_abLoopFilterDisable[0]  );
512
513  if (m_abUseSAO.size() < 2)
514    m_abUseSAO.push_back            ( m_abUseSAO[0] );
515#endif
516
517#if HHI_VSO
518  if ( m_bUseVSO )
519  {
520    if ( m_iNumberOfExternalRefs != 0 )
521    {
522      xCleanUpVector( m_aaiERViewRefInd,    vector<Int>() );
523      xCleanUpVector( m_aaiBaseViewRefInd,  vector<Int>() );
524    }
525    else
526    {
527      m_aaiERViewRefInd   .clear();
528      m_aaiERViewRefInd   .resize( m_iNumberOfViews );
529      m_aaiERViewRefLutInd.clear();
530      m_aaiERViewRefLutInd.resize( m_iNumberOfViews );
531      m_aaiBaseViewRefInd .clear();
532      m_aaiBaseViewRefInd .resize( m_iNumberOfViews );
533    }
534  }
535
536#if HHI_VSO_LS_TABLE
537  // Q&D
538  Double adLambdaScaleTable[] = 
539  {  0.031250, 0.031639, 0.032029, 0.032418, 0.032808, 0.033197, 0.033586, 0.033976, 0.034365, 0.034755, 
540     0.035144, 0.035533, 0.035923, 0.036312, 0.036702, 0.037091, 0.037480, 0.037870, 0.038259, 0.038648, 
541     0.039038, 0.039427, 0.039817, 0.040206, 0.040595, 0.040985, 0.041374, 0.041764, 0.042153, 0.042542, 
542     0.042932, 0.043321, 0.043711, 0.044100, 0.044194, 0.053033, 0.061872, 0.070711, 0.079550, 0.088388, 
543     0.117851, 0.147314, 0.176777, 0.235702, 0.294628, 0.353553, 0.471405, 0.589256, 0.707107, 0.707100, 
544     0.753550, 0.800000 
545  }; 
546  AOT( (m_aiQP[1] < 0) || (m_aiQP[1] > 51));
547  m_dLambdaScaleVSO *= adLambdaScaleTable[m_aiQP[1]]; 
548#endif
549#endif
550
551  // set global variables
552  xSetGlobal();
553
554  // read and check camera parameters
555#if HHI_VSO
556if ( m_bUseVSO && m_uiVSOMode == 4)
557{
558  m_cRenModStrParser.setString( m_iNumberOfViews, m_pchVSOConfig );
559  m_cCameraData     .init     ( (UInt)m_iNumberOfViews,
560                                      m_uiInputBitDepth,
561                                (UInt)m_iCodedCamParPrecision,
562                                      m_FrameSkip,
563                                (UInt)m_iFrameToBeEncoded,
564                                      m_pchCameraParameterFile,
565                                      m_pchBaseViewCameraNumbers,
566                                      NULL,
567                                      m_cRenModStrParser.getSynthViews(),
568                                      LOG2_DISP_PREC_LUT );
569}
570else if ( m_bUseVSO && m_uiVSOMode != 4 )
571{
572  m_cCameraData     .init     ( (UInt)m_iNumberOfViews,
573                                      m_uiInputBitDepth,
574                                (UInt)m_iCodedCamParPrecision,
575                                      m_FrameSkip,
576                                (UInt)m_iFrameToBeEncoded,
577                                      m_pchCameraParameterFile,
578                                      m_pchBaseViewCameraNumbers,
579                                      m_pchVSOConfig,
580                                      NULL,
581                                      LOG2_DISP_PREC_LUT );
582}
583else
584{
585  m_cCameraData     .init     ( (UInt)m_iNumberOfViews,
586    m_uiInputBitDepth,
587    (UInt)m_iCodedCamParPrecision,
588    m_FrameSkip,
589    (UInt)m_iFrameToBeEncoded,
590    m_pchCameraParameterFile,
591    m_pchBaseViewCameraNumbers,
592    NULL,
593    NULL,
594    LOG2_DISP_PREC_LUT );
595}
596#else
597  m_cCameraData     .init     ( (UInt)m_iNumberOfViews,
598    m_uiInputBitDepth,
599    (UInt)m_iCodedCamParPrecision,
600    m_FrameSkip,
601    (UInt)m_iFrameToBeEncoded,
602    m_pchCameraParameterFile,
603    m_pchBaseViewCameraNumbers,
604    NULL,
605    NULL,
606    LOG2_DISP_PREC_LUT );
607#endif
608
609
610  // check validity of input parameters
611  xCheckParameter();
612  m_cCameraData.check( false, true );
613
614  // print-out parameters
615  xPrintParameter();
616
617  return true;
618}
619
620// ====================================================================================================================
621// Private member functions
622// ====================================================================================================================
623
624Bool confirmPara(Bool bflag, const char* message);
625
626Void TAppEncCfg::xCheckParameter()
627{
628  bool check_failed = false; /* abort if there is a fatal configuration problem */
629#define xConfirmPara(a,b) check_failed |= confirmPara(a,b)
630  // check range of parameters
631#if ENABLE_IBDI
632  xConfirmPara( m_uiInternalBitDepth > 0 && (int)m_uiBitIncrement != -1,                    "InternalBitDepth and BitIncrement may not be specified simultaneously");
633#else
634  xConfirmPara( m_uiInputBitDepth < 8,                                                      "InputBitDepth must be at least 8" );
635#endif
636  xConfirmPara( m_iFrameRate <= 0,                                                          "Frame rate must be more than 1" );
637  xConfirmPara( m_iFrameToBeEncoded <= 0,                                                   "Total Number Of Frames encoded must be more than 1" );
638  xConfirmPara( m_iGOPSize < 1 ,                                                            "GOP Size must be more than 1" );
639#if DCM_DECODING_REFRESH
640  xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 2,                   "Decoding Refresh Type must be equal to 0, 1 or 2" );
641#endif
642//GT QP Depth
643  xConfirmPara( m_aiQP[0] < 0 || m_aiQP[0] > 51,                                             "QP exceeds supported range (0 to 51)" );
644  if ( m_aiQP.size() >= 2 )
645  {
646    xConfirmPara( m_aiQP[1] < 0 || m_aiQP[1] > 51,                                           "QP Depth exceeds supported range (0 to 51)" );
647  }
648//GT QP Depth End
649#if MQT_ALF_NPASS
650  xConfirmPara( m_iALFEncodePassReduction < 0 || m_iALFEncodePassReduction > 2,             "ALFEncodePassReduction must be equal to 0, 1 or 2");
651#endif
652  xConfirmPara( m_iLoopFilterAlphaC0Offset < -26 || m_iLoopFilterAlphaC0Offset > 26,        "Loop Filter Alpha Offset exceeds supported range (-26 to 26)" );
653  xConfirmPara( m_iLoopFilterBetaOffset < -26 || m_iLoopFilterBetaOffset > 26,              "Loop Filter Beta Offset exceeds supported range (-26 to 26)");
654  xConfirmPara( m_iFastSearch < 0 || m_iFastSearch > 2,                                     "Fast Search Mode is not supported value (0:Full search  1:Diamond  2:PMVFAST)" );
655  xConfirmPara( m_iSearchRange < 0 ,                                                        "Search Range must be more than 0" );
656  xConfirmPara( m_bipredSearchRange < 0 ,                                                   "Search Range must be more than 0" );
657  xConfirmPara( m_iMaxDeltaQP > 7,                                                          "Absolute Delta QP exceeds supported range (0 to 7)" );
658  xConfirmPara( (m_uiMaxCUWidth  >> m_uiMaxCUDepth) < 4,                                    "Minimum partition width size should be larger than or equal to 8");
659  xConfirmPara( (m_uiMaxCUHeight >> m_uiMaxCUDepth) < 4,                                    "Minimum partition height size should be larger than or equal to 8");
660  xConfirmPara( m_uiMaxCUWidth < 16,                                                        "Maximum partition width size should be larger than or equal to 16");
661  xConfirmPara( m_uiMaxCUHeight < 16,                                                       "Maximum partition height size should be larger than or equal to 16");
662  xConfirmPara( (m_iSourceWidth  % (m_uiMaxCUWidth  >> (m_uiMaxCUDepth-1)))!=0,             "Frame width should be multiple of minimum CU size");
663  xConfirmPara( (m_iSourceHeight % (m_uiMaxCUHeight >> (m_uiMaxCUDepth-1)))!=0,             "Frame height should be multiple of minimum CU size");
664
665  xConfirmPara( m_uiQuadtreeTULog2MinSize < 2,                                        "QuadtreeTULog2MinSize must be 2 or greater.");
666  xConfirmPara( m_uiQuadtreeTULog2MinSize > 5,                                        "QuadtreeTULog2MinSize must be 5 or smaller.");
667  xConfirmPara( m_uiQuadtreeTULog2MaxSize < 2,                                        "QuadtreeTULog2MaxSize must be 2 or greater.");
668  xConfirmPara( m_uiQuadtreeTULog2MaxSize > 5,                                        "QuadtreeTULog2MaxSize must be 5 or smaller.");
669  xConfirmPara( m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize,                "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize.");
670  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUWidth >>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
671  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUHeight>>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
672  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUWidth  >> m_uiMaxCUDepth ), "Minimum CU width must be greater than minimum transform size." );
673  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUHeight >> m_uiMaxCUDepth ), "Minimum CU height must be greater than minimum transform size." );
674  xConfirmPara( m_uiQuadtreeTUMaxDepthInter < 1,                                                         "QuadtreeTUMaxDepthInter must be greater than or equal to 1" );
675  xConfirmPara( m_uiQuadtreeTUMaxDepthInter > m_uiQuadtreeTULog2MaxSize - m_uiQuadtreeTULog2MinSize + 1, "QuadtreeTUMaxDepthInter must be less than or equal to the difference between QuadtreeTULog2MaxSize and QuadtreeTULog2MinSize plus 1" );
676  xConfirmPara( m_uiQuadtreeTUMaxDepthIntra < 1,                                                         "QuadtreeTUMaxDepthIntra must be greater than or equal to 1" );
677  xConfirmPara( m_uiQuadtreeTUMaxDepthIntra > m_uiQuadtreeTULog2MaxSize - m_uiQuadtreeTULog2MinSize + 1, "QuadtreeTUMaxDepthIntra must be less than or equal to the difference between QuadtreeTULog2MaxSize and QuadtreeTULog2MinSize plus 1" );
678
679  xConfirmPara( m_iSliceMode < 0 || m_iSliceMode > 2, "SliceMode exceeds supported range (0 to 2)" );
680  if (m_iSliceMode!=0)
681  {
682    xConfirmPara( m_iSliceArgument < 1 ,         "SliceArgument should be larger than or equal to 1" );
683  }
684  xConfirmPara( m_iEntropySliceMode < 0 || m_iEntropySliceMode > 2, "EntropySliceMode exceeds supported range (0 to 2)" );
685  if (m_iEntropySliceMode!=0)
686  {
687    xConfirmPara( m_iEntropySliceArgument < 1 ,         "EntropySliceArgument should be larger than or equal to 1" );
688  }
689
690  xConfirmPara( m_iSymbolMode < 0 || m_iSymbolMode > 1,                                     "SymbolMode must be equal to 0 or 1" );
691
692  // Check MultiView stuff
693  xConfirmPara    ( m_iNumberOfViews > MAX_INPUT_VIEW_NUM ,                           "NumberOfViews must be less than or equal to MAX_INPUT_VIEW_NUM");
694  xConfirmPara    ( Int( m_pchInputFileList.size() ) < m_iNumberOfViews,              "Number of InputFiles must be greater than or equal to NumberOfViews" );
695  xConfirmPara    ( Int( m_pchReconFileList.size() ) < m_iNumberOfViews,              "Number of ReconFiles must be greater than or equal to NumberOfViews" );
696
697  xConfirmPara    ( m_iCodedCamParPrecision < 0 || m_iCodedCamParPrecision > 5,       "CodedCamParsPrecision must be in range of 0..5" );
698#if DEPTH_MAP_GENERATION
699  xConfirmPara    ( m_uiPredDepthMapGeneration > 2,                                   "PredDepthMapGen must be less than or equal to 2" );
700  xConfirmPara    ( m_uiPredDepthMapGeneration >= 2 && !m_bUsingDepthMaps,            "PredDepthMapGen >= 2 requires CodeDepthMaps = 1" );
701#endif
702#if HHI_INTER_VIEW_MOTION_PRED
703  xConfirmPara    ( m_uiMultiviewMvPredMode > 7,                                      "MultiviewMvPred must be less than or equal to 7" );
704  xConfirmPara    ( m_uiMultiviewMvPredMode > 0 && m_uiPredDepthMapGeneration == 0 ,  "MultiviewMvPred > 0 requires PredDepthMapGen > 0" );
705  xConfirmPara    ( m_uiMultiviewMvRegMode       > 1,                                 "MultiviewMvRegMode must be less than or equal to 1" );
706  xConfirmPara    ( m_dMultiviewMvRegLambdaScale < 0.0,                               "MultiviewMvRegLambdaScale must not be negative" );
707  if( m_uiMultiviewMvRegMode )
708  {
709    xConfirmPara  ( Int( m_pchDepthInputFileList.size() ) < m_iNumberOfViews,         "MultiviewMvRegMode > 0 requires the presence of input depth maps" );
710  }
711#endif
712#if HHI_INTER_VIEW_RESIDUAL_PRED
713  xConfirmPara    ( m_uiMultiviewResPredMode > 1,                                     "MultiviewResPred must be less than or equal to 1" );
714  xConfirmPara    ( m_uiMultiviewResPredMode > 0 && m_uiPredDepthMapGeneration == 0 , "MultiviewResPred > 0 requires PredDepthMapGen > 0" );
715#endif
716
717#if HHI_INTERVIEW_SKIP
718  xConfirmPara    ( m_uiInterViewSkip > 1,                                        "RenderingSkipMode > 1 not supported" );
719  xConfirmPara    ( m_uiInterViewSkip > 0 && !m_bUsingDepthMaps,                  "RenderingSkipMode > 0 requires CodeDepthMaps = 1" );
720#endif
721  if( m_bUsingDepthMaps )
722  {
723    xConfirmPara  ( Int( m_pchDepthInputFileList.size() ) < m_iNumberOfViews,         "Number of DepthInputFiles must be greater than or equal to NumberOfViews" );
724    xConfirmPara  ( Int( m_pchDepthReconFileList.size() ) < m_iNumberOfViews,         "Number of DepthReconFiles must be greater than or equal to NumberOfViews" );
725
726#if HHI_VSO
727    if( m_bUseVSO )
728    {
729      xConfirmPara( m_pchCameraParameterFile    == 0                             ,   "CameraParameterFile must be given");
730      xConfirmPara(   m_pchVSOConfig            == 0                             ,   "VSO Setup string must be given");
731      xConfirmPara( m_pchBaseViewCameraNumbers  == 0                             ,   "BaseViewCameraNumbers must be given" );
732      xConfirmPara( m_iNumberOfViews != m_cCameraData.getBaseViewNumbers().size(),   "Number of Views in BaseViewCameraNumbers must be equal to NumberOfViews" );
733      xConfirmPara( m_uiVSOMode < 0 || m_uiVSOMode > 4 ,                             "VSO Mode must be greater than or equal to 0 and less than 5");
734      xConfirmPara( m_iNumberOfExternalRefs               > MAX_ERREF_VIEW_NUM,      "NumberOfExternalRefs must be less than of equal to TAppMVEncCfg::MAX_ERREF_VIEW_NUM" );
735      xConfirmPara( Int( m_pchERRefFileList .size() ) < m_iNumberOfExternalRefs,     "Number of ERRefFileFiles  must be greater than or equal to NumberOfExternalRefs" );
736    }
737#endif
738  }
739
740#if DCM_COMB_LIST
741#if !HHI_NO_LowDelayCoding
742  xConfirmPara( m_bUseLComb==false && m_bUseLDC==false,         "LComb can only be 0 if LowDelayCoding is 1" );
743#else
744  xConfirmPara( m_bUseLComb==false,                             "LComb can only be 0 if LowDelayCoding is 1" );
745#endif
746#endif
747
748  // max CU width and height should be power of 2
749  UInt ui = m_uiMaxCUWidth;
750  while(ui)
751  {
752    ui >>= 1;
753    if( (ui & 1) == 1)
754      xConfirmPara( ui != 1 , "Width should be 2^n");
755  }
756  ui = m_uiMaxCUHeight;
757  while(ui)
758  {
759    ui >>= 1;
760    if( (ui & 1) == 1)
761      xConfirmPara( ui != 1 , "Height should be 2^n");
762  }
763
764  // SBACRD is supported only for SBAC
765  if ( m_iSymbolMode == 0 )
766  {
767    m_bUseSBACRD = false;
768  }
769
770#undef xConfirmPara
771  if (check_failed)
772  {
773    exit(EXIT_FAILURE);
774  }
775}
776
777template <class T>
778Void
779TAppEncCfg::xCleanUpVector( std::vector<T>& rcVec, const T& rcInvalid )
780{
781  Int iFirstInv = (Int)rcVec.size();
782  for( Int iIdx = 0; iIdx < (Int)rcVec.size(); iIdx++ )
783  {
784    if( rcVec[ iIdx ] == rcInvalid )
785    {
786      iFirstInv = iIdx;
787      break;
788    }
789  }
790  while( (Int)rcVec.size() > iFirstInv )
791  {
792    rcVec.pop_back();
793  }
794}
795
796Void
797TAppEncCfg::xCleanUpVectors()
798{
799  xCleanUpVector( m_pchInputFileList,       (char*)0 );
800  xCleanUpVector( m_pchDepthInputFileList,  (char*)0 );
801  xCleanUpVector( m_pchReconFileList,       (char*)0 );
802  xCleanUpVector( m_pchDepthReconFileList,  (char*)0 );
803
804#if HHI_VSO
805  if ( m_bUseVSO)
806  {
807    xCleanUpVector( m_pchERRefFileList,       (char*)0 );
808  }
809#endif
810}
811
812/** \todo use of global variables should be removed later
813 */
814Void TAppEncCfg::xSetGlobal()
815{
816  // set max CU width & height
817  g_uiMaxCUWidth  = m_uiMaxCUWidth;
818  g_uiMaxCUHeight = m_uiMaxCUHeight;
819
820  // compute actual CU depth with respect to config depth and max transform size
821  g_uiAddCUDepth  = 0;
822  while( (m_uiMaxCUWidth>>m_uiMaxCUDepth) > ( 1 << ( m_uiQuadtreeTULog2MinSize + g_uiAddCUDepth )  ) ) g_uiAddCUDepth++;
823
824  m_uiMaxCUDepth += g_uiAddCUDepth;
825  g_uiAddCUDepth++;
826  g_uiMaxCUDepth = m_uiMaxCUDepth;
827
828  // set internal bit-depth and constants
829#if ENABLE_IBDI
830  if ((int)m_uiBitIncrement != -1)
831  {
832    g_uiBitDepth = m_uiInputBitDepth;
833    g_uiBitIncrement = m_uiBitIncrement;
834    m_uiInternalBitDepth = g_uiBitDepth + g_uiBitIncrement;
835  }
836  else
837  {
838    g_uiBitDepth = min(8u, m_uiInputBitDepth);
839    if (m_uiInternalBitDepth == 0) {
840      /* default increement = 2 */
841      m_uiInternalBitDepth = 2 + g_uiBitDepth;
842    }
843    g_uiBitIncrement = m_uiInternalBitDepth - g_uiBitDepth;
844  }
845#else
846#if FULL_NBIT
847  g_uiBitDepth = m_uiInternalBitDepth;
848  g_uiBitIncrement = 0;
849#else
850  g_uiBitDepth = 8;
851  g_uiBitIncrement = m_uiInternalBitDepth - g_uiBitDepth;
852#endif
853#endif
854#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
855  g_dDeltaDCsQuantOffset = Double(g_uiBitIncrement) -  2.0;
856#endif
857
858  g_uiBASE_MAX     = ((1<<(g_uiBitDepth))-1);
859
860#if IBDI_NOCLIP_RANGE
861  g_uiIBDI_MAX     = g_uiBASE_MAX << g_uiBitIncrement;
862#else
863  g_uiIBDI_MAX     = ((1<<(g_uiBitDepth+g_uiBitIncrement))-1);
864#endif
865
866  if (m_uiOutputBitDepth == 0)
867  {
868    m_uiOutputBitDepth = m_uiInternalBitDepth;
869  }
870}
871
872Void TAppEncCfg::xPrintParameter()
873{
874  printf("\n");
875  for( Int iCounter = 0; iCounter<m_iNumberOfViews; iCounter++)
876  {
877    printf("Input          File %i        : %s\n", iCounter, m_pchInputFileList[iCounter]);
878  }
879  for( Int iCounter = 0; iCounter < (Int)m_pchDepthInputFileList.size(); iCounter++)
880  {
881    printf("DepthInput     File %i        : %s\n", iCounter, m_pchDepthInputFileList[iCounter]);
882  }
883  printf("Bitstream      File          : %s\n", m_pchBitstreamFile      );
884  for( Int iCounter = 0; iCounter<m_iNumberOfViews; iCounter++)
885  {
886    printf("Reconstruction File %i        : %s\n", iCounter, m_pchReconFileList[iCounter]);
887  }
888
889  for( Int iCounter = 0; iCounter<(Int)m_pchDepthReconFileList.size(); iCounter++)
890  {
891    printf("Reconstruction Depth File %i  : %s\n", iCounter, m_pchDepthReconFileList[iCounter]);
892  }
893  printf("Real     Format              : %dx%d %dHz\n", m_iSourceWidth - m_aiPad[0], m_iSourceHeight-m_aiPad[1], m_iFrameRate );
894  printf("Internal Format              : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate );
895  printf("Frame index                  : %u - %d (%d frames)\n", m_FrameSkip, m_FrameSkip+m_iFrameToBeEncoded-1, m_iFrameToBeEncoded );
896  printf("CU size / depth              : %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth );
897  printf("RQT trans. size (min / max)  : %d / %d\n", 1 << m_uiQuadtreeTULog2MinSize, 1 << m_uiQuadtreeTULog2MaxSize );
898  printf("Max RQT depth inter          : %d\n", m_uiQuadtreeTUMaxDepthInter);
899  printf("Max RQT depth intra          : %d\n", m_uiQuadtreeTUMaxDepthIntra);
900  printf("Motion search range          : %d\n", m_iSearchRange );
901#if DCM_DECODING_REFRESH
902  printf("Decoding refresh type        : %d\n", m_iDecodingRefreshType );
903#endif
904  printf("QP                           : %5.2f\n", m_adQP[0] );
905  printf("QP Depth                     : %5.2f\n", m_adQP[ m_adQP.size()  < 2 ? 0 : 1] );
906  printf("Coded Picture Store Size     : %d\n", m_uiCodedPictureStoreSize);
907  printf("GOP size                     : %d\n", m_iGOPSize );
908  printf("Rate GOP size                : %d\n", m_iRateGOPSize );
909  printf("Internal bit depth           : %d\n", m_uiInternalBitDepth );
910
911  if ( m_iSymbolMode == 0 )
912  {
913    printf("Entropy coder                : VLC\n");
914  }
915  else if( m_iSymbolMode == 1 )
916  {
917    printf("Entropy coder                : CABAC\n");
918  }
919  else if( m_iSymbolMode == 2 )
920  {
921    printf("Entropy coder                : PIPE\n");
922  }
923  else
924  {
925    assert(0);
926  }
927
928  printf("GOP Format String            : %s\n", m_cInputFormatString.c_str() );
929  printf("Loop Filter Disabled         : %d %d\n", m_abLoopFilterDisable[0] ? 1 : 0,  m_abLoopFilterDisable[1] ? 1 : 0 );
930  printf("Coded Camera Param. Precision: %d\n", m_iCodedCamParPrecision);
931
932#if HHI_VSO
933  printf("Force use of Lambda Scale    : %d\n", m_bForceLambdaScaleVSO );
934
935  if ( m_bUseVSO )
936  {
937    printf("VSO Lambda Scale             : %5.2f\n", m_dLambdaScaleVSO );
938    printf("VSO Mode                     : %d\n",    m_uiVSOMode       );
939    printf("VSO Config                   : %s\n",    m_pchVSOConfig    );
940#if HHI_VSO_DIST_INT
941    printf("VSO Negative Distortion      : %d\n",    m_bAllowNegDist ? 1 : 0);
942#endif
943  }
944#endif
945
946
947  printf("\n");
948
949  printf("TOOL CFG GENERAL: ");
950  printf("IBD:%d ", !!g_uiBitIncrement);
951  printf("HAD:%d ", m_bUseHADME           );
952  printf("SRD:%d ", m_bUseSBACRD          );
953  printf("SQP:%d ", m_uiDeltaQpRD         );
954  printf("ASR:%d ", m_bUseASR             );
955  printf("PAD:%d ", m_bUsePAD             );
956  printf("LDC:%d ", m_bUseLDC             );
957#if DCM_COMB_LIST
958  printf("LComb:%d ", m_bUseLComb         );
959  printf("LCMod:%d ", m_bLCMod         );
960#endif
961  printf("FEN:%d ", m_bUseFastEnc         );
962  printf("RQT:%d ", 1     );
963  printf("MRG:%d ", m_bUseMRG             ); // SOPH: Merge Mode
964#if LM_CHROMA
965  printf("LMC:%d ", m_bUseLMChroma        );
966#endif
967#if HHI_RMP_SWITCH
968  printf("RMP:%d ", m_bUseRMP);
969#endif
970  printf("Slice:%d ",m_iSliceMode);
971  if (m_iSliceMode!=0)
972  {
973    printf("(%d) ", m_iSliceArgument);
974  }
975  printf("EntropySlice:%d ",m_iEntropySliceMode);
976  if (m_iEntropySliceMode!=0)
977  {
978    printf("(%d) ", m_iEntropySliceArgument);
979  }
980#if CONSTRAINED_INTRA_PRED
981  printf("CIP:%d ", m_bUseConstrainedIntraPred);
982#endif
983#if MTK_SAO
984#endif
985  printf("\n");
986  printf("TOOL CFG VIDEO  : ");
987  printf("ALF:%d ", (m_abUseALF [0] ? 1 : 0) );
988  printf("SAO:%d ", (m_abUseSAO [0] ? 1 : 0));
989  printf("RDQ:%d ", (m_abUseRDOQ[0] ? 1 : 0) );
990  printf("\n");
991
992  printf("TOOL CFG DEPTH  : ");
993  printf("ALF:%d ", (m_abUseALF [1] ? 1 : 0));
994  printf("SAO:%d ", (m_abUseSAO [1] ? 1 : 0));
995  printf("RDQ:%d ", (m_abUseRDOQ[1] ? 1 : 0));
996#if HHI_VSO
997  printf("VSO:%d ", m_bUseVSO             );
998#endif
999#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
1000  printf("DMM:%d ", m_bUseDMM );
1001#endif
1002#if HHI_MPI
1003  printf("MVI:%d ", m_bUseMVI ? 1 : 0 );
1004#endif
1005  printf("\n");
1006
1007  fflush(stdout);
1008}
1009
1010Void TAppEncCfg::xPrintUsage()
1011{
1012  printf( "          <name> = ALF - adaptive loop filter\n");
1013  printf( "                   IBD - bit-depth increasement\n");
1014  printf( "                   GPB - generalized B instead of P in low-delay mode\n");
1015  printf( "                   HAD - hadamard ME for fractional-pel\n");
1016  printf( "                   SRD - SBAC based RD estimation\n");
1017  printf( "                   RDQ - RDOQ\n");
1018  printf( "                   LDC - low-delay mode\n");
1019  printf( "                   NRF - non-reference frame marking in last layer\n");
1020  printf( "                   BQP - hier-P style QP assignment in low-delay mode\n");
1021  printf( "                   PAD - automatic source padding of multiple of 16\n");
1022  printf( "                   ASR - adaptive motion search range\n");
1023  printf( "                   FEN - fast encoder setting\n");
1024  printf( "                   MRG - merging of motion partitions\n"); // SOPH: Merge Mode
1025
1026#if LM_CHROMA
1027  printf( "                   LMC - intra chroma prediction based on luma\n");
1028#endif
1029
1030  printf( "\n" );
1031  printf( "  Example 1) TAppEncoder.exe -c test.cfg -q 32 -g 8 -f 9 -s 64 -h 4\n");
1032  printf("              -> QP 32, hierarchical-B GOP 8, 9 frames, 64x64-8x8 CU (~4x4 PU)\n\n");
1033  printf( "  Example 2) TAppEncoder.exe -c test.cfg -q 32 -g 4 -f 9 -s 64 -h 4 -1 LDC\n");
1034  printf("              -> QP 32, hierarchical-P GOP 4, 9 frames, 64x64-8x8 CU (~4x4 PU)\n\n");
1035}
1036
1037Bool confirmPara(Bool bflag, const char* message)
1038{
1039  if (!bflag)
1040    return false;
1041
1042  printf("Error: %s\n",message);
1043  return true;
1044}
1045
1046/* helper function */
1047/* for handling "-1/-0 FOO" */
1048void translateOldStyleCmdline(const char* value, po::Options& opts, const std::string& arg)
1049{
1050  const char* argv[] = {arg.c_str(), value};
1051  /* replace some short names with their long name varients */
1052  if (arg == "LDC")
1053  {
1054    argv[0] = "LowDelayCoding";
1055  }
1056  else if (arg == "RDQ")
1057  {
1058    argv[0] = "RDOQ";
1059  }
1060  else if (arg == "HAD")
1061  {
1062    argv[0] = "HadamardME";
1063  }
1064  else if (arg == "SRD")
1065  {
1066    argv[0] = "SBACRD";
1067  }
1068  else if (arg == "IBD")
1069  {
1070    argv[0] = "BitIncrement";
1071  }
1072  /* issue a warning for change in FEN behaviour */
1073  if (arg == "FEN")
1074  {
1075    /* xxx todo */
1076  }
1077  po::storePair(opts, argv[0], argv[1]);
1078}
1079
1080void doOldStyleCmdlineOn(po::Options& opts, const std::string& arg)
1081{
1082  if (arg == "IBD")
1083  {
1084    translateOldStyleCmdline("4", opts, arg);
1085    return;
1086  }
1087  translateOldStyleCmdline("1", opts, arg);
1088}
1089
1090void doOldStyleCmdlineOff(po::Options& opts, const std::string& arg)
1091{
1092  translateOldStyleCmdline("0", opts, arg);
1093}
1094
1095Void TAppEncCfg::xAppendToFileNameEnd( Char* pchInputFileName, const Char* pchStringToAppend, Char*& rpchOutputFileName)
1096{
1097  size_t iInLength     = strlen(pchInputFileName);
1098  size_t iAppendLength = strlen(pchStringToAppend);
1099
1100  rpchOutputFileName = (Char*) malloc(iInLength+iAppendLength+1);
1101  Char* pCDot = strrchr(pchInputFileName,'.');
1102  pCDot = pCDot ? pCDot : pchInputFileName + iInLength;
1103  size_t iCharsToDot = pCDot - pchInputFileName ;
1104  size_t iCharsToEnd = iInLength - iCharsToDot;
1105  strncpy(rpchOutputFileName                            ,  pchInputFileName            , iCharsToDot  );
1106  strncpy(rpchOutputFileName+ iCharsToDot               ,  pchStringToAppend           , iAppendLength);
1107  strncpy(rpchOutputFileName+ iCharsToDot+iAppendLength ,  pchInputFileName+iCharsToDot, iCharsToEnd  );
1108  rpchOutputFileName[iInLength+iAppendLength] = '\0';
1109}
Note: See TracBrowser for help on using the repository browser.