source: SHVCSoftware/branches/SHM-dev/source/App/TAppEncoder/TAppEncLayerCfg.cpp @ 1144

Last change on this file since 1144 was 1090, checked in by seregin, 9 years ago

cleanup macros: Q0120_PHASE_CALCULATION, P0312_VERT_PHASE_ADJ, Q0200_CONFORMANCE_BL_SIZE, R0220_REMOVE_EL_CLIP, MOVE_SCALED_OFFSET_TO_PPS, R0209_GENERIC_PHASE, REF_REGION_OFFSET, O0215_PHASE_ALIGNMENT_REMOVAL, O0215_PHASE_ALIGNMENT, RESAMPLING_FIX

  • Property svn:eol-style set to native
File size: 21.1 KB
RevLine 
[313]1/** \file     TAppEncLayerCfg.cpp
2\brief    Handle encoder configuration parameters
3*/
4
5#include <stdlib.h>
6#include <cassert>
7#include <cstring>
8#include <string>
9#include "TLibCommon/TComRom.h"
10#include "TAppEncCfg.h"
11#include "TAppEncLayerCfg.h"
12#include "TAppCommon/program_options_lite.h"
13
14#ifdef WIN32
15#define strdup _strdup
16#endif
17
18using namespace std;
19namespace po = df::program_options_lite;
20
21//! \ingroup TAppEncoder
22//! \{
23
24
[494]25#if AUXILIARY_PICTURES
26static inline ChromaFormat numberToChromaFormat(const Int val)
27{
28  switch (val)
29  {
30    case 400: return CHROMA_400; break;
31    case 420: return CHROMA_420; break;
32    case 422: return CHROMA_422; break;
33    case 444: return CHROMA_444; break;
34    default:  return NUM_CHROMA_FORMAT;
35  }
36}
37#endif
38
[313]39// ====================================================================================================================
40// Constructor / destructor / initialization / destroy
41// ====================================================================================================================
42#if SVC_EXTENSION
43TAppEncLayerCfg::TAppEncLayerCfg()
44  :m_cInputFile(string("")),
45  m_cReconFile(string("")),
46  m_conformanceMode( 0 ),
47  m_aidQP(NULL)
[442]48#if REPN_FORMAT_IN_VPS
49, m_repFormatIdx (-1)
50#endif
[856]51#if Q0074_COLOUR_REMAPPING_SEI
[1089]52,  m_colourRemapSEIFileRoot(string(""))
[856]53#endif
[313]54{
[856]55#if Q0074_COLOUR_REMAPPING_SEI
56  for( Int c=0 ; c<3 ; c++)
57  {
58    m_colourRemapSEIPreLutCodedValue[c]   = NULL;
59    m_colourRemapSEIPreLutTargetValue[c]  = NULL;
60    m_colourRemapSEIPostLutCodedValue[c]  = NULL;
61    m_colourRemapSEIPostLutTargetValue[c] = NULL;
62  }
63#endif
[823]64  m_confWinLeft = m_confWinRight = m_confWinTop = m_confWinBottom = 0;
[313]65  m_aiPad[1] = m_aiPad[0] = 0;
[1030]66  m_numRefLayerLocationOffsets = 0;
[540]67#if O0098_SCALED_REF_LAYER_ID
[1030]68  ::memset(m_refLocationOffsetLayerId,   0, sizeof(m_refLocationOffsetLayerId));
[540]69#endif
[313]70  ::memset(m_scaledRefLayerLeftOffset,   0, sizeof(m_scaledRefLayerLeftOffset));
71  ::memset(m_scaledRefLayerTopOffset,    0, sizeof(m_scaledRefLayerTopOffset));
72  ::memset(m_scaledRefLayerRightOffset,  0, sizeof(m_scaledRefLayerRightOffset));
73  ::memset(m_scaledRefLayerBottomOffset, 0, sizeof(m_scaledRefLayerBottomOffset));
[849]74  ::memset(m_scaledRefLayerOffsetPresentFlag, 0, sizeof(m_scaledRefLayerOffsetPresentFlag));
75  ::memset(m_refRegionOffsetPresentFlag, 0, sizeof(m_refRegionOffsetPresentFlag));
76  ::memset(m_refRegionLeftOffset,   0, sizeof(m_refRegionLeftOffset));
77  ::memset(m_refRegionTopOffset,    0, sizeof(m_refRegionTopOffset));
78  ::memset(m_refRegionRightOffset,  0, sizeof(m_refRegionRightOffset));
79  ::memset(m_refRegionBottomOffset, 0, sizeof(m_refRegionBottomOffset));
80  ::memset(m_resamplePhaseSetPresentFlag, 0, sizeof(m_resamplePhaseSetPresentFlag));
81  ::memset(m_phaseHorLuma,   0, sizeof(m_phaseHorLuma));
82  ::memset(m_phaseVerLuma,   0, sizeof(m_phaseVerLuma));
83  ::memset(m_phaseHorChroma, 0, sizeof(m_phaseHorChroma));
84  ::memset(m_phaseVerChroma, 0, sizeof(m_phaseVerChroma));
[313]85}
86
87TAppEncLayerCfg::~TAppEncLayerCfg()
88{
89  if ( m_aidQP )
90  {
91    delete[] m_aidQP;
92  }
[856]93#if Q0074_COLOUR_REMAPPING_SEI
94  for( Int c=0 ; c<3 ; c++)
95  {
96    if ( m_colourRemapSEIPreLutCodedValue[c] )
97    {
98      delete[] m_colourRemapSEIPreLutCodedValue[c];
99    }
100    if ( m_colourRemapSEIPreLutTargetValue[c] )
101    {
102      delete[] m_colourRemapSEIPreLutTargetValue[c];
103    }
104    if ( m_colourRemapSEIPostLutCodedValue[c] )
105    {
106      delete[] m_colourRemapSEIPostLutCodedValue[c];
107    }
108    if ( m_colourRemapSEIPostLutTargetValue[c] )
109    {
110      delete[] m_colourRemapSEIPostLutTargetValue[c];
111    }
112  }
113#endif
[313]114}
115
116Void TAppEncLayerCfg::create()
117{
118}
119
120Void TAppEncLayerCfg::destroy()
121{
122}
123
124
125// ====================================================================================================================
126// Public member functions
127// ====================================================================================================================
128
129/** \param  argc        number of arguments
130\param  argv        array of arguments
131\retval             true when success
132*/
133bool TAppEncLayerCfg::parseCfg( const string& cfgFileName  )
134{
135  string cfg_InputFile;
136  string cfg_ReconFile;
137  string cfg_dQPFile;
[494]138#if AUXILIARY_PICTURES
139  Int tmpInputChromaFormat;
140  Int tmpChromaFormat;
141#endif
[856]142#if Q0074_COLOUR_REMAPPING_SEI
[1089]143  string cfg_colourRemapSEIFileRoot;
[856]144#endif
[494]145
[313]146  po::Options opts;
147  opts.addOptions()
148    ("InputFile,i",           cfg_InputFile,  string(""), "original YUV input file name")
149#if AVC_BASE
150    ("InputBLFile,-ibl",      cfg_InputFile,  string(""), "original YUV input file name")
151#endif
152    ("ReconFile,o",           cfg_ReconFile,  string(""), "reconstructed YUV output file name")
153    ("SourceWidth,-wdt",      m_iSourceWidth,  0, "Source picture width")
154    ("SourceHeight,-hgt",     m_iSourceHeight, 0, "Source picture height")
155    ("CroppingMode",          m_conformanceMode,  0, "Cropping mode (0: no cropping, 1:automatic padding, 2: padding, 3:cropping")
[494]156#if AUXILIARY_PICTURES
157    ("InputChromaFormat",     tmpInputChromaFormat,  420, "InputChromaFormatIDC")
158    ("ChromaFormatIDC",       tmpChromaFormat,    420, "ChromaFormatIDC (400|420|422|444 or set 0 (default) for same as InputChromaFormat)")
159#endif
[823]160    ("ConfLeft",              m_confWinLeft,            0, "Deprecated alias of ConfWinLeft")
161    ("ConfRight",             m_confWinRight,           0, "Deprecated alias of ConfWinRight")
162    ("ConfTop",               m_confWinTop,             0, "Deprecated alias of ConfWinTop")
163    ("ConfBottom",            m_confWinBottom,          0, "Deprecated alias of ConfWinBottom")
164    ("ConfWinLeft",           m_confWinLeft,            0, "Left offset for window conformance mode 3")
165    ("ConfWinRight",          m_confWinRight,           0, "Right offset for window conformance mode 3")
166    ("ConfWinTop",            m_confWinTop,             0, "Top offset for window conformance mode 3")
167    ("ConfWinBottom",         m_confWinBottom,          0, "Bottom offset for window conformance mode 3")
[313]168    ("HorizontalPadding,-pdx",m_aiPad[0],      0, "horizontal source padding for cropping mode 2")
169    ("VerticalPadding,-pdy",  m_aiPad[1],      0, "vertical source padding for cropping mode 2")
170    ("IntraPeriod,-ip",       m_iIntraPeriod,  -1, "intra period in frames, (-1: only first frame)")
171    ("FrameRate,-fr",         m_iFrameRate,    0, "Frame rate")
172    ("dQPFile,m",             cfg_dQPFile, string(""), "dQP file name")
173    ("QP,q",                  m_fQP,          30.0, "Qp value, if value is float, QP is switched once during encoding")
[856]174#if Q0074_COLOUR_REMAPPING_SEI
[1089]175    ("SEIColourRemappingInfoFileRoot", cfg_colourRemapSEIFileRoot, string(""), "Colour Remapping Information SEI parameters file name")
[856]176#endif
177  ;
[313]178
179  po::setDefaults(opts);
180  po::parseConfigFile(opts, cfgFileName);
181
182  m_cInputFile = cfg_InputFile;
183  m_cReconFile = cfg_ReconFile;
184  m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str());
[494]185#if AUXILIARY_PICTURES
[1029]186  m_InputChromaFormatIDC = numberToChromaFormat(tmpInputChromaFormat);
187  m_chromaFormatIDC   = ((tmpChromaFormat == 0) ? (m_InputChromaFormatIDC) : (numberToChromaFormat(tmpChromaFormat)));
[494]188#endif
[856]189#if Q0074_COLOUR_REMAPPING_SEI
[1089]190  m_colourRemapSEIFileRoot = cfg_colourRemapSEIFileRoot.empty() ? NULL : strdup(cfg_colourRemapSEIFileRoot.c_str());
[856]191#endif
[313]192
193  // reading external dQP description from file
194  if ( m_pchdQPFile )
195  {
196    FILE* fpt=fopen( m_pchdQPFile, "r" );
197    if ( fpt )
198    {
199      Int iValue;
200      Int iPOC = 0;
201      while ( iPOC < m_cAppEncCfg->getNumFrameToBeEncoded() )
202      {
203        if ( fscanf(fpt, "%d", &iValue ) == EOF ) break;
204        m_aidQP[ iPOC ] = iValue;
205        iPOC++;
206      }
207      fclose(fpt);
208    }
209  }
[856]210
[313]211  return true;
212}
213
214Void TAppEncLayerCfg::xPrintParameter()
215{
[1029]216  printf("Input File                        : %s\n", m_cInputFile.c_str()  );
217  printf("Reconstruction File               : %s\n", m_cReconFile.c_str()  );
[713]218#if REPN_FORMAT_IN_VPS
[1029]219  printf("Real     Format                   : %dx%d %dHz\n", m_iSourceWidth - ( m_confWinLeft + m_confWinRight ) * TComSPS::getWinUnitX( m_chromaFormatIDC ), m_iSourceHeight - ( m_confWinTop + m_confWinBottom ) * TComSPS::getWinUnitY( m_chromaFormatIDC ), m_iFrameRate );
[713]220#else
[1029]221  printf("Real     Format                   : %dx%d %dHz\n", m_iSourceWidth - m_confWinLeft - m_confWinRight, m_iSourceHeight - m_confWinTop - m_confWinBottom, m_iFrameRate );
[713]222#endif
[1029]223  printf("Internal Format                   : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate );
224#if MULTIPLE_PTL_SUPPORT
225  printf("PTL index                         : %d\n", m_layerPTLIdx );
226#endif
[494]227#if O0194_DIFFERENT_BITDEPTH_EL_BL
[1029]228  printf("Input bit depth                   : (Y:%d, C:%d)\n", m_inputBitDepth[CHANNEL_TYPE_LUMA], m_inputBitDepth[CHANNEL_TYPE_CHROMA] );
229  printf("Internal bit depth                : (Y:%d, C:%d)\n", m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA] );
230  printf("PCM sample bit depth              : (Y:%d, C:%d)\n", m_cAppEncCfg->getPCMInputBitDepthFlag() ? m_inputBitDepth[CHANNEL_TYPE_LUMA] : m_internalBitDepth[CHANNEL_TYPE_LUMA], m_cAppEncCfg->getPCMInputBitDepthFlag() ? m_inputBitDepth[CHANNEL_TYPE_CHROMA] : m_internalBitDepth[CHANNEL_TYPE_CHROMA] );
[494]231#endif
[1029]232  std::cout << "Input ChromaFormatIDC             :";
233
234  switch (m_InputChromaFormatIDC)
235  {
236  case CHROMA_400:  std::cout << " 4:0:0"; break;
237  case CHROMA_420:  std::cout << " 4:2:0"; break;
238  case CHROMA_422:  std::cout << " 4:2:2"; break;
239  case CHROMA_444:  std::cout << " 4:4:4"; break;
240  default:
241    std::cerr << "Invalid";
242    exit(1);
243  }
244  std::cout << std::endl;
245
246  std::cout << "Output (internal) ChromaFormatIDC :";
247  switch (m_chromaFormatIDC)
248  {
249  case CHROMA_400:  std::cout << " 4:0:0"; break;
250  case CHROMA_420:  std::cout << " 4:2:0"; break;
251  case CHROMA_422:  std::cout << " 4:2:2"; break;
252  case CHROMA_444:  std::cout << " 4:4:4"; break;
253  default:
254    std::cerr << "Invalid";
255    exit(1);
256  }
257  printf("\n");
[494]258#if LAYER_CTB
[1029]259  printf("CU size / depth                   : %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth );
260  printf("RQT trans. size (min / max)       : %d / %d\n", 1 << m_uiQuadtreeTULog2MinSize, 1 << m_uiQuadtreeTULog2MaxSize );
261  printf("Max RQT depth inter               : %d\n", m_uiQuadtreeTUMaxDepthInter);
262  printf("Max RQT depth intra               : %d\n", m_uiQuadtreeTUMaxDepthIntra);
[494]263#endif
[1029]264  printf("QP                                : %5.2f\n", m_fQP );
265  printf("Intra period                      : %d\n", m_iIntraPeriod );
266#if RC_SHVC_HARMONIZATION                   
267  printf("RateControl                       : %d\n", m_RCEnableRateControl );
[313]268  if(m_RCEnableRateControl)
269  {
[1029]270    printf("TargetBitrate                     : %d\n", m_RCTargetBitrate );
271    printf("KeepHierarchicalBit               : %d\n", m_RCKeepHierarchicalBit );
272    printf("LCULevelRC                        : %d\n", m_RCLCULevelRC );
273    printf("UseLCUSeparateModel               : %d\n", m_RCUseLCUSeparateModel );
274    printf("InitialQP                         : %d\n", m_RCInitialQP );
275    printf("ForceIntraQP                      : %d\n", m_RCForceIntraQP );
[313]276  }
277#endif
[1029]278  printf("WaveFrontSynchro                  : %d\n", m_waveFrontSynchro);
279  printf("WaveFrontSubstreams               : %d\n", m_iWaveFrontSubstreams);
[494]280#if LAYER_CTB
[1029]281  printf("PCM                               : %d ", (m_cAppEncCfg->getUsePCM() && (1<<m_cAppEncCfg->getPCMLog2MinSize()) <= m_uiMaxCUWidth)? 1 : 0);
[494]282#endif
[313]283}
284
285Bool confirmPara(Bool bflag, const char* message);
286
[442]287Bool TAppEncLayerCfg::xCheckParameter( Bool isField )
[313]288{
289  switch (m_conformanceMode)
290  {
291  case 0:
292    {
293      // no cropping or padding
[823]294      m_confWinLeft = m_confWinRight = m_confWinTop = m_confWinBottom = 0;
[313]295      m_aiPad[1] = m_aiPad[0] = 0;
296      break;
297    }
298  case 1:
299    {
[925]300      // conformance
301      if ((m_confWinLeft != 0) || (m_confWinRight != 0) || (m_confWinTop != 0) || (m_confWinBottom != 0))
302      {
303        fprintf(stderr, "Warning: Automatic padding enabled, but cropping parameters are set. Undesired size possible.\n");
304      }
305      if ((m_aiPad[1] != 0) || (m_aiPad[0] != 0))
306      {
307        fprintf(stderr, "Warning: Automatic padding enabled, but padding parameters are also set\n");
308      }
[1029]309
[313]310      // automatic padding to minimum CU size
[494]311#if LAYER_CTB
312      Int minCuSize = m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1);
313#else
[313]314      Int minCuSize = m_cAppEncCfg->getMaxCUHeight() >> (m_cAppEncCfg->getMaxCUDepth() - 1);
[494]315#endif
[313]316      if (m_iSourceWidth % minCuSize)
317      {
[823]318        m_aiPad[0] = m_confWinRight  = ((m_iSourceWidth / minCuSize) + 1) * minCuSize - m_iSourceWidth;
319        m_iSourceWidth  += m_confWinRight;
[713]320#if REPN_FORMAT_IN_VPS
[823]321        m_confWinRight /= TComSPS::getWinUnitX( m_chromaFormatIDC );
[713]322#endif
[313]323      }
324      if (m_iSourceHeight % minCuSize)
325      {
[823]326        m_aiPad[1] = m_confWinBottom = ((m_iSourceHeight / minCuSize) + 1) * minCuSize - m_iSourceHeight;
327        m_iSourceHeight += m_confWinBottom;
[442]328        if ( isField )
329        {
[823]330          m_iSourceHeightOrg += m_confWinBottom << 1;
331          m_aiPad[1] = m_confWinBottom << 1;
[442]332        }
[713]333#if REPN_FORMAT_IN_VPS
[823]334        m_confWinBottom /= TComSPS::getWinUnitY( m_chromaFormatIDC );
[713]335#endif
[313]336      }
337      break;
338    }
339  case 2:
340    {
[925]341      // conformance
342      if ((m_confWinLeft != 0) || (m_confWinRight != 0) || (m_confWinTop != 0) || (m_confWinBottom != 0))
343      {
344        fprintf(stderr, "Warning: Automatic padding enabled, but cropping parameters are set. Undesired size possible.\n");
345      }
[1029]346
[313]347      //padding
348      m_iSourceWidth  += m_aiPad[0];
349      m_iSourceHeight += m_aiPad[1];
[823]350      m_confWinRight  = m_aiPad[0];
351      m_confWinBottom = m_aiPad[1];
[713]352#if REPN_FORMAT_IN_VPS
[823]353      m_confWinRight /= TComSPS::getWinUnitX( m_chromaFormatIDC );
354      m_confWinBottom /= TComSPS::getWinUnitY( m_chromaFormatIDC );
[713]355#endif
[313]356      break;
357    }
358  case 3:
359    {
360      // conformance
[823]361      if ((m_confWinLeft == 0) && (m_confWinRight == 0) && (m_confWinTop == 0) && (m_confWinBottom == 0))
[313]362      {
363        fprintf(stderr, "Warning: Cropping enabled, but all cropping parameters set to zero\n");
364      }
365      if ((m_aiPad[1] != 0) || (m_aiPad[0]!=0))
366      {
367        fprintf(stderr, "Warning: Cropping enabled, padding parameters will be ignored\n");
368      }
369      m_aiPad[1] = m_aiPad[0] = 0;
370      break;
371    }
372  }
373
374  // allocate slice-based dQP values
375  Int iFrameToBeEncoded = m_cAppEncCfg->getNumFrameToBeEncoded();
376  Int iGOPSize = m_cAppEncCfg->getGOPSize();
377  if( m_aidQP == NULL )
378    m_aidQP = new Int[iFrameToBeEncoded + iGOPSize + 1 ];
379  ::memset( m_aidQP, 0, sizeof(Int)*( iFrameToBeEncoded + iGOPSize + 1 ) );
380
381  // handling of floating-point QP values
382  // if QP is not integer, sequence is split into two sections having QP and QP+1
383  m_iQP = (Int)( m_fQP );
384  if ( m_iQP < m_fQP )
385  {
386    Int iSwitchPOC = (Int)( iFrameToBeEncoded - (m_fQP - m_iQP)*iFrameToBeEncoded + 0.5 );
387
388
389    iSwitchPOC = (Int)( (Double)iSwitchPOC / iGOPSize + 0.5 )*iGOPSize;
390    for ( Int i=iSwitchPOC; i<iFrameToBeEncoded + iGOPSize + 1; i++ )
391    {
392      m_aidQP[i] = 1;
393    }
394  }
395
[494]396#if LAYER_CTB
397  UInt maxCUWidth = m_uiMaxCUWidth;
398  UInt maxCUHeight = m_uiMaxCUHeight;
399  UInt maxCUDepth = m_uiMaxCUDepth;
400#else
[313]401  UInt maxCUWidth = m_cAppEncCfg->getMaxCUWidth();
402  UInt maxCUHeight = m_cAppEncCfg->getMaxCUHeight();
403  UInt maxCUDepth = m_cAppEncCfg->getMaxCUDepth();
[494]404#endif
[313]405  bool check_failed = false; /* abort if there is a fatal configuration problem */
406#define xConfirmPara(a,b) check_failed |= confirmPara(a,b)
407  // check range of parameters
408  xConfirmPara( m_iFrameRate <= 0,                                                          "Frame rate must be more than 1" );
409  xConfirmPara( (m_iSourceWidth  % (maxCUWidth  >> (maxCUDepth-1)))!=0,             "Resulting coded frame width must be a multiple of the minimum CU size");
410  xConfirmPara( (m_iSourceHeight % (maxCUHeight >> (maxCUDepth-1)))!=0,             "Resulting coded frame height must be a multiple of the minimum CU size");
411  xConfirmPara( (m_iIntraPeriod > 0 && m_iIntraPeriod < iGOPSize) || m_iIntraPeriod == 0, "Intra period must be more than GOP size, or -1 , not 0" );
412  if (m_cAppEncCfg->getDecodingRefreshType() == 2)
413  {
414    xConfirmPara( m_iIntraPeriod > 0 && m_iIntraPeriod <= iGOPSize ,                      "Intra period must be larger than GOP size for periodic IDR pictures");
415  }
416
[494]417#if O0194_DIFFERENT_BITDEPTH_EL_BL
[1029]418  xConfirmPara( m_iQP <  -6 * (m_internalBitDepth[CHANNEL_TYPE_LUMA] - 8) || m_iQP > 51,                "QP exceeds supported range (-QpBDOffsety to 51)" );
[494]419#else
[313]420  xConfirmPara( m_iQP <  -6 * ((Int)m_cAppEncCfg->getInternalBitDepthY() - 8) || m_iQP > 51,                "QP exceeds supported range (-QpBDOffsety to 51)" );
[494]421#endif
[313]422
[875]423  m_iWaveFrontSubstreams = m_waveFrontSynchro ? (m_iSourceHeight + maxCUHeight - 1) / maxCUHeight : 1;
424  xConfirmPara( m_waveFrontSynchro < 0, "WaveFrontSynchro cannot be negative" );
[313]425  xConfirmPara( m_iWaveFrontSubstreams <= 0, "WaveFrontSubstreams must be positive" );
[875]426  xConfirmPara( m_iWaveFrontSubstreams > 1 && !m_waveFrontSynchro, "Must have WaveFrontSynchro > 0 in order to have WaveFrontSubstreams > 1" );
[313]427
428  //chekc parameters
429  xConfirmPara( m_iSourceWidth  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Picture width must be an integer multiple of the specified chroma subsampling");
430  xConfirmPara( m_iSourceHeight % TComSPS::getWinUnitY(CHROMA_420) != 0, "Picture height must be an integer multiple of the specified chroma subsampling");
431
432  xConfirmPara( m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling");
433  xConfirmPara( m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling");
434
[713]435#if !REPN_FORMAT_IN_VPS
[313]436  xConfirmPara( m_confLeft   % TComSPS::getWinUnitX(CHROMA_420) != 0, "Left conformance window offset must be an integer multiple of the specified chroma subsampling");
437  xConfirmPara( m_confRight  % TComSPS::getWinUnitX(CHROMA_420) != 0, "Right conformance window offset must be an integer multiple of the specified chroma subsampling");
438  xConfirmPara( m_confTop    % TComSPS::getWinUnitY(CHROMA_420) != 0, "Top conformance window offset must be an integer multiple of the specified chroma subsampling");
439  xConfirmPara( m_confBottom % TComSPS::getWinUnitY(CHROMA_420) != 0, "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling");
[713]440#endif
[494]441
442#if LAYER_CTB 
443  xConfirmPara( (m_uiMaxCUWidth  >> m_uiMaxCUDepth) < 4,                                    "Minimum partition width size should be larger than or equal to 8");
444  xConfirmPara( (m_uiMaxCUHeight >> m_uiMaxCUDepth) < 4,                                    "Minimum partition height size should be larger than or equal to 8");
445  xConfirmPara( m_uiMaxCUWidth < 16,                                                        "Maximum partition width size should be larger than or equal to 16");
446  xConfirmPara( m_uiMaxCUHeight < 16,                                                       "Maximum partition height size should be larger than or equal to 16");
447  xConfirmPara( m_uiQuadtreeTULog2MinSize < 2,                                        "QuadtreeTULog2MinSize must be 2 or greater.");
448  xConfirmPara( m_uiQuadtreeTULog2MaxSize > 5,                                        "QuadtreeTULog2MaxSize must be 5 or smaller.");
449  xConfirmPara( (1<<m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth,                                        "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
450  xConfirmPara( m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize,                "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize.");
451  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUWidth >>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
452  xConfirmPara( (1<<m_uiQuadtreeTULog2MinSize)>(m_uiMaxCUHeight>>(m_uiMaxCUDepth-1)), "QuadtreeTULog2MinSize must not be greater than minimum CU size" ); // HS
453  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUWidth  >> m_uiMaxCUDepth ), "Minimum CU width must be greater than minimum transform size." );
454  xConfirmPara( ( 1 << m_uiQuadtreeTULog2MinSize ) > ( m_uiMaxCUHeight >> m_uiMaxCUDepth ), "Minimum CU height must be greater than minimum transform size." );
455  xConfirmPara( m_uiQuadtreeTUMaxDepthInter < 1,                                                         "QuadtreeTUMaxDepthInter must be greater than or equal to 1" );
456  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" );
457  xConfirmPara( m_uiQuadtreeTUMaxDepthIntra < 1,                                                         "QuadtreeTUMaxDepthIntra must be greater than or equal to 1" );
458  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" );
459
460  // max CU width and height should be power of 2
461  UInt ui = m_uiMaxCUWidth;
462  while(ui)
463  {
464    ui >>= 1;
465    if( (ui & 1) == 1)
466      xConfirmPara( ui != 1 , "Width should be 2^n");
467  }
468  ui = m_uiMaxCUHeight;
469  while(ui)
470  {
471    ui >>= 1;
472    if( (ui & 1) == 1)
473      xConfirmPara( ui != 1 , "Height should be 2^n");
474  }
475#endif
476
[313]477#undef xConfirmPara
478  return check_failed;
479}
480
[494]481#endif //SVC_EXTENSION
[313]482
483
484//! \}
Note: See TracBrowser for help on using the repository browser.